海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
さっき今週号の PLUTO を立ち読みした。 最後のシーンは、原作の『鉄腕アトム』だとあの場面ですね。 *1
原作はコミカルに描かれていたし、当時年齢的には飛雄に近かった僕は、 どうして博士がアトムを追い出しちゃったのか全然わからなかった。 でも、子供を持つ親になった今読む浦沢直樹版のあのシーンは、 どうしようもない程悲しい。 あれで正気を保てというほうがどうかしている。
*1 「ほら、お父さん、ぼく大きくなったよ(びょーん)」「で、でていけー!!」ってやつ。
山形浩生さんのをみて、 思い出したように、おみくじをひいた。 ところで、山形さんの「最近の噂」って、permalink 風の "id" ってのが ついているんだが、間違ってるなぁ、これ(本日 14:00 時点)。手書きなのか。
【吉】 (No.49305) モナー神社 願事:思い通りとなる しかし気をゆるしては破れる 待人:訪れなし来る 失物:出るとも遅い 旅立:止める方がよい 商売:買い入る方に吉 学問:危うし全力を尽くせ 争事:人に頼るは宜しからず 転居:十分ならず 見合わせよ 病気:少々悪し 信心せよ 縁談:多くて戸惑う恐れあり 静かに心を定めよ
ずっと気になっていた、tDiary 2.0.4 への更新をしました。 ついでに、こちょこちょとそれ以外もさわる。
背景の色をかえた(慣れ親しんでいた「わら半紙色」に戻した) 以外には、 トップページに、プロフィールと称して出身大学やら、 勤務先やらを書いていたのをやめた。 自分が何者なのかを、きちんと明らかにしておきたいと思って 書いていたのだが、やっぱりどうにも気持ちが悪くて。
同姓同名の人と区別するのに足りる情報だけ 書いておけばいいかな。
こないだ歩きながら、なんで "A Happy New Year!" なのかと考えていた。 "We wish you a merry christmas and a happy new year" という歌詞があるくらいだから ("wish you a ..." の "you" が聞こえにくいよね *1)、 "a happy new year" といういい方自体は存在するみたいだが、 なぜ不定冠詞かというと、私の過ごす new year とあなたの過ごすであろう new year は別物だという感覚なんだろうか *2、 「今年」になってしまえば明けましておめでたいのは the happy new year なのかな、とか思って、思ったまま。
だがしかし、挨拶フレーズとして単独で "A happy new year!" というのはオカシイんだそうな。
そうだったのか!
(Playnote News Clip! 経由)
最初の方はよゆーでへろへろ読んでいたのですが、 途中でぎくっとさせられた。
これがウチの子に限った話かというと、そうでもない。 他の子も? いいえ、大きくなってもだいたいコレですよ。 大人でも、知っていること(掛け算九九)から、適切な推論手順(筆算)を組み立てて結論 (掛け算の答え)を導き出すことは苦手です。 知ってることは即答するけど、知らないこと/わからないことは、 憶測や印象や反射でテキトーに答える。
憶測や印象や反射でテキトーに答えるというのを、 そうとは自覚せずにやってしまっていることが多いように思う。
仕事に関する話であれば、言ってしまったあとに「あ、さっきのはやっぱり違いました」とか 言って訂正できることもあるのだが、そもそも、テキトーに反応しすぎだ。
「『いや、これは即答できない問題だぜ』トラップ」をインプリしなければ。
CD 買いにいかなあかん → こおた。聞くのがたのしみ。
『オブジェクト指向スクリプト言語 Ruby』をみながら、 拡張ライブラリを書いてみた。
Ruby は拡張ライブラリを書きやすい(そのために実行速度が犠牲になっている面すらある) と聞いた(読んだ)ことはあったのだが、実際に書いたことはなかった。 書いてみたら、いや、本当に書きやすい。
/* extlibsample.c To create ExtLibSample.so: ruby -r mkmf -e 'create_makefile("ExtLibSample")' and make */ #include "ruby.h" #include <math.h> /* First example: def euclid_norm_2d(x, y) # x, y: Float. sqrt(x*x + y*y) end */ static VALUE euclid_norm_2d(self, vx, vy) VALUE self, vx, vy; { double x, y; Check_Type(vx, T_FLOAT); Check_Type(vy, T_FLOAT); x = RFLOAT(vx)->value; y = RFLOAT(vy)->value; return rb_float_new(sqrt(x * x + y * y)); } /* Second example: def euclid_norm(a) # a: Array. sum = 0 a.each {|v| v = v.float; sum += v*v} sqrt(sum) end */ static VALUE euclid_norm(self, a) VALUE self, a; { int i, size; double v, sum = 0.0; VALUE t; Check_Type(a, T_ARRAY); size = FIX2INT(rb_funcall(a, rb_intern("size"), 0)); for(i = 0; i < size; i++){ t = rb_funcall(a, rb_intern("[]"), 1, INT2FIX(i)); t = rb_funcall(t, rb_intern("to_f"), 0); v = RFLOAT(t)->value; sum += v * v; } return rb_float_new(sqrt(sum)); } Init_ExtLibSample() { VALUE mExtLibSample = rb_define_module("ExtLibSample"); rb_define_module_function(mExtLibSample, "euclid_norm_2d", euclid_norm_2d, 2); rb_define_module_function(mExtLibSample, "euclid_norm", euclid_norm, 1); }
呪文をいっぱい唱える必要がなくて、ありがたい。
書いてみたのは、まったく実用的でない、練習のための例ですが、 以下のことがらを含んでいます。
Ruby オブジェクトの型チェック | Check_Type(obj, T_FLOAT) |
Ruby Float → C double | RFLOAT(obj)->value |
C double → Ruby Float | rb_float_new((double) x) |
Ruby Fixnum → C int | FIX2INT(obj) |
C int → Ruby Fixnum | INT2FIX(1) |
Ruby オブジェクトのメソッド呼び出し | rb_funcall(obj, rb_intern("[]"), 1, INT2FIX(i)) |
モジュール関数の追加 | (略) |
動かしてみるには、次のようにします:
% ruby -r mkmf -e 'create_makefile("ExtLibSample")' % gmake % irb irb(main):001:0> require 'ExtLibSample' => true irb(main):002:0> include ExtLibSample => Object irb(main):003:0> euclid_norm_2d(2.0, 3.0) => 3.60555127546399 irb(main):004:0> euclid_norm([1.0, 2.0, 3.0]) => 3.74165738677394
『オブジェクト指向スクリプト言語 Ruby』の8章に書かれている内容を まったく知らないとつらいかな。
ところで、 ワード境界にアラインされた C オブジェクトのポインタ値が偶数になるというのは 言語仕様の一部ではないような気がするのだが(未確認)、 それが奇数になるようなアーキテクチャを思いつかない。 ワード長が9バイトとか?
なにを隠そう、つい最近、いけないと思いつつグローバル変数でかいちゃいました。 これ読んで反省します。
わろた。わかる。 (ja.reddit経由)
とってもエネルギーの低い安定状態に陥ってしまったら、 結婚なんかできないんじゃないかと思う。
ひとごとだけど。
http://www.namikilab.tuat.ac.jp/~sasada/diary/200501.html#d28
ちょっと気にかかるやりとりがあるのだが、 不明点いろいろなので、とりあえずここにメモ。 あとで調べて書くかも。
ぼくには、コメント欄にある、tas (test-and-set) は「バスを占有」するが、 cas (compare-and-swap) はしないという話が飲み込めない。
事実だったとしたら、それはキャッシュの更新方式 (write-through か write-back かというやつ) に依存しているのであって、tas か cas かという話ではないと思う。
いずれにしても、cas(たぶん tas も)を実行するには、そのキャッシュブロックを占有する 必要があるので、ロックが欲しい人全員がいきなり cas でポーリングしてたら輻輳しまくるのである。 *1
なので、最初は atomic じゃない普通の load 命令でロック変数をポーリングしておいて (これなら、ロック変数が更新されるまでは、各キャッシュ上のコピーが参照されるので、 輻輳は抑えられる)、 いけそうだという段階になって、初めて cas に切り替える。
(はっきりとそう書いてありますね。ちゃんと読んでないのばればれ)
という話なら有名なので知っている。 *2
test and test and set という語は初めてみたのですが、上のような話なんじゃないかと思った ……けど、未調査なので、断定できない。
ちなみに,こんなことを考えている人は何人くらい居るんだろう.ruby といい,やっぱりマイナーなことしかしてないな,俺は.
100近い数のコメントがついているのですが、 これだけ長いスレッドが荒れずに、むしろ途中から面白くなっていくなんて。 結構すごいことなのではないでしょうか。
同様の話題できくちさん達 vs 弾さんのやりとりはとっても不毛に終わってしまったのですが (こことかを参照)、 それにくらべれば kikulog に参戦したキタヤマさんという方 ((57), (63)など) はスバラシかったと思う。
ちなみに、「柘植(つげ)」という漢字が読めなかったのは僕もです。 学生のときに買った将棋の駒は柘植でできているのを知ってて買ったというのに……。
あ、小林泰三さんがいる。
18 小林泰三 November 24, 2006 @ 08:13pm
科学法則に裏付けられた「絶対的に正しい価値観」があると安心する人たちが多いのでしょうね。 僕は「絶対的に正しい価値観」がないからこそ、躾をきっちりとしなければならないと思っています。 なぜなら、躾をしなければ自分の子供たちが「社会生活に適応しない価値観」を獲得してしまう可能性があるからです。
同じ自然法則の下でも、「一族」 *1 と人類の価値観はかなり違いますしね。
子育て初心者なので、子供の躾については迷うことが多いのですが、 ちょっと気持ちが整理できたような気がします。
*1 「ΑΩ」ちょーおもしろかったです。しかも、由緒正しく、デビュー作「玩具修理者」から入る(私はそうした)のが大吉。「ΑΩ」はちょっと分厚いこともありますしぃ、デビュー作→短篇集をいくつか→「ΑΩ」という経路をたどるのがおすすめ。まずは、だまされたとおもって「たぶん駄文」 ( http://web.kyoto-inet.or.jp/people/kbys_ysm/dabun.html ) あたりから、いかがっすか?(←誰相手に営業しているのやら
ja.reddit で見つけただけ。まだ読んでいない。予想外の利点って何だろう? コード例が Scheme で書かれているので、「あとで読む」化、これぞ遅延… (以下略。
たまたま辿りついた Gauche のへや at Lingr の書庫より。
濃ゆ!
GC に特化した命令を追加する機会があったとして、それって、どんなのが嬉しいのかなぁ。 ほとんどが memory operation のコストのような気がするので、 専用命令で儲かるシナリオが想像できない(←想像力がないだけ)んですけど。
自分で GC を書いてみないと、わかりっこないのかも。
ほとんどが memory operation のコストのような気がする
これは、きっと外してますね。
GC と「それ以外」の計算プロセス(SICP 用語(笑))は並列プロセスなので、両者の同期というか排他処理というかがネック。
その重たい排他処理をなんとかできまへんか、という線ならいろいろ考えられそうだ。
ソフト的に排他処理しちゃうと、コストのほとんどが memory operation のそれになるので、現状認識として間違っているわけではありませんが。
仮想メモリはあれほど手厚くハードアシストしているのに、GC はまったくソフトまかせじゃん…って、だれかそのまんまのこと言ってたな。
Ruby を SEGV させまくるようになったら、そろそろ脱初心者でしょうか。 あ、どうでもいいですね。
GC.disable にすると逃げられたりするので、GC safe じゃないんだなぁとか思って いろいろ見直したり (「RubyExtensionProgrammingGuide」(青木峰郎さん)とか参照)。
しかぁし!僕の場合は、もっとヘボいバグでした。 (volatile 問題もいっこだけあった。)
前者は、gc_mark_children がたまたま int 値がポインタにみえたのを参照しにいって SEGV。
後者は、後者は……。 初心者臭すぎて恥ずかしいのを承知で書いておくと、問題の自作拡張ライブラリ関数を呼ぶまえに puts (こちらは Rubyの) をいれると OK, とると SEGV というように見えていました。 わかってから現象をふりかえると、たしかにどうみても未初期化ポインタです *1。 ありがとうございました。
普段 gdb つかえない子なんですが、ちょっとだけ使っちゃいました。
% ruby hogehoge.rb ; ... SEGV から core を吐く... % gdb -c core /usr/local/bin/ruby (gdb) bt
ってな感じで、シグナル受ける直前どこにいたのかがわかります。 (「RubyがSEGVしたら」(おなじく、青木峰郎さん)参照)
あとは、printf デバッグ。え? gdb つかえないんだって。
Binary Hacks よんでべんきょーしなくちゃ*2。 (そのまえに gdb のマニュアル読まないとね)
# うんの [「volatile 問題」といえば、日本人同士で話すときに "volatile" をなんと発音するべきかという問題も..]
# かめい [明けましておめでとうございます。今年もゆるゆると宜しくお願いします。記事とは関係ないのですが年明けなので、明るくルー..]
# うんの [こちらこそ、よろしくお願いします。 おお、聞いたことはあったのですが>ルー語変換 元の文体によっては、あまりパッとし..]