昨日アマゾンから届いたのだが最初の数行で時間を食う。~職人達の技法~(Ozy/やねうらお)どうやって足してるのか不思議だったが、足された結果と考えるってことか。頭を切り換えられないところがおれの弱いところ。それにつけてもえらく面白い。そこを越えると、とりあえずルール解説なのでするする読めるし書き方もいい感じ。gccなんだろうと思ってたら、cl(VC6)でもやれるのは良かった。いうかルール知らなかったし。2章まで読んだところで他のやんなきゃならないことをやるので中断。最初の加算の問題がやたらと難しかった(というか、おれの悪い習慣で、見たとおりの処理ではない何か悪しき魔術が使われているに決まっているという思い込みで眺めるから、素直にありのままの値を取り出していると考え付かないんだろうな)のを除くと、あとはとても素直に話が進むので、おお、そういうことだったのか、と感心した。いうか、これこそCの自習書じゃん。Cの書き方しか知らなければとまどいは大きいかもところで、書影を貼るために読み返して(最初、携帯から適当に更新したのだった)思ったのだが、おれはばか→ここに書いてあること(=書いた人含む)は並、という受け取り方ができるな。それに対して同じことを、このおれさまですらお手上げ→ここに書いてあること(=書いた人含む)スゲー、ということもできる。すれば、いたずらに卑下(ちなみに、ここでは別に卑下してんじゃなくて、実際に書いてないこと読んで時間を無駄にしたのはおれが悪いわけだが)するのは世の中の役に立たんだろうなぁ。このすげぇおれさまよりももっとすげぇあなたさま、ってほうが、この並以下なおれと違って並なお前、じゃつまらな過ぎる。むむできるかな?ユースケースがあると、考える気になる。OSXが変なのはともかく、基本的にメインスレッドは待ち状態のほうがOKの3つ。なんでも3つにまとめるとわかりやすいらしい。本当はもっとあるかも。いうか3があるから1は不要。すれば、いくつかの規約重要を導入すれば良いはず。invokeLaterに与えるRunnableは当然Rubyで書く。Runnableはイベントディスパッチスレッドで実行されることになる。いうか、invokeLaterを呼んでいるため、待ち状態にする必要がある。最初に、イベントディスパッチスレッドでの処理を考えてみる。問題はGCの実行や、Rubyのスレッドコンテキストの復元によって生じる。すると、イベントディスパッチスレッドで呼び出されるRubyのスクリプトレットについて言えば、Mutex#synchronizeで挟み込んでスレッドコンテキストの復元などを防御し、かつGCも止めてやれば良い。するとGCされない問題が起きる。それが、invokeLaterを呼び出したメインスレッド側の処理となる。同様に、こちらではループで待ち状態に入るわけだが、このループ内でGCを起動すれば良い。イベント処理のスクリプトレットは入口と出口でThread.criticalを設定/解除するので、スレッド切り替えは起きないし、起きた場合、つまりメインスレッドが実行できるのは、イベント処理スクリプトレットから抜けた後になる。イベントディスパッチスレッドのスタックは巻き戻されているため、GCでマークする必要はない。メインではどうやって待てば良いのか、それが次の問題となる。実は大したことはない。Thread)は、SwingUtilities.invokeLaterを呼んだらそれでおしまいだからだ。おしまいの代わりに、上で書いた、Mutex#synchronizeによって防御した中でのGC呼び出しと、sleepかなにかによるワーカスレッドへの処理委譲を繰り返す。いずれも、CレベルのサポートがなくてもRubyだけで書けるはず。思って試してみたら、Mutex.synchronizeでSystemStackErrorになる。違うスレッドのスタックでコンテキストを作ろうとするからか。うまく行かないもんだな。いうようなことは、考えてみたら、1.9では解消するわけか。現代の日本人に欠けているものいくつかの同時代の他の国家が教育のカリキュラムに取り入れているにもかかわらず、という観点からなら、体系的に人を殺す技術は欠けているだろう。銃器の扱い、毒物の知識、効果的な人体の破壊法なども。問題はその欠損が現代の日本人にとって弱点なのか、ということ。無駄な教育ならば、コストをかけなくて済んで良かったね、と言えるわけだ。逆に皆がその知識を自在に駆使できるとしたら、どのようなゲインがあり得るだろうか。