トップ «前の日記(2007-08-12) 最新 次の日記(2007-08-14)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-08-13

_ 加算の方法

昨日アマゾンから届いたのだが最初の数行で時間を食う。

Short Coding ~職人達の技法~(Ozy/やねうらお)

どうやって足してるのか不思議だったが、足された結果と考えるってことか。と頭を切り換えられないところがおれの弱いところ。

それにつけてもえらく面白い。

そこを越えると、とりあえずルール解説なのでするする読めるし書き方もいい感じ。どうせgccなんだろうと思ってたら、cl(VC6)でもやれるのは良かった。というかルール知らなかったし。

でも2章まで読んだところで他のやんなきゃならないことをやるので中断。

最初の加算の問題がやたらと難しかった(というか、おれの悪い習慣で、見たとおりの処理ではない何か悪しき魔術が使われているに決まっているという思い込みで眺めるから、素直にありのままの値を取り出していると考え付かないんだろうな)のを除くと、あとはとても素直に話が進むので、おお、そういうことだったのか、と感心した。っていうか、これこそCの自習書じゃん。

#とは言え、最初からANSI Cの書き方しか知らなければとまどいは大きいかも

ところで、書影を貼るために読み返して(最初、携帯から適当に更新したのだった)思ったのだが、おれはばか→ここに書いてあること(=書いた人含む)は並、という受け取り方ができるな。それに対して同じことを、このおれさまですらお手上げ→ここに書いてあること(=書いた人含む)スゲー、ということもできる。しょせん相対的な問題だし。

とすれば、いたずらに卑下(ちなみに、ここでは別に卑下してんじゃなくて、実際に書いてないこと読んで時間を無駄にしたのはおれが悪いわけだが)するのは世の中の役に立たんだろうなぁ。このすげぇおれさまよりももっとすげぇあなたさま、ってほうが、この並以下なおれと違って並なお前、じゃつまらな過ぎる。

_ むむ

できるかな?ユースケースがあると、考える気になる。

主な問題点は、イベントハンドラだけなんだから、というと不正確で、

1. OSXの変な仕様

2. イベントハンドラはワーカスレッドでインボーク

3. OSXが変なのはともかく、基本的にメインスレッドは待ち状態のほうがOK

の3つ。なんでも3つにまとめるとわかりやすいらしい。だから本当はもっとあるかも。というか3があるから1は不要。

とすれば、いくつかの規約重要を導入すれば良いはず。

1. オブジェクトはメインスレッドで作成

2. SwingUtilities.invokeLater 必須。

3. invokeLaterに与えるRunnableは当然Rubyで書く。

4. しかし、Runnableはイベントディスパッチスレッドで実行されることになる。

5. イベントは当然、イベントディスパッチスレッドで実行される

6. というか、invokeLaterを呼んでいるため、待ち状態にする必要がある。

最初に、イベントディスパッチスレッドでの処理を考えてみる。問題はGCの実行や、Rubyのスレッドコンテキストの復元によって生じる。

すると、イベントディスパッチスレッドで呼び出されるRubyのスクリプトレットについて言えば、Mutex#synchronizeで挟み込んでスレッドコンテキストの復元などを防御し、かつGCも止めてやれば良い。

でも、そうするとGCされない問題が起きる。

それが、invokeLaterを呼び出したメインスレッド側の処理となる。同様に、こちらではループで待ち状態に入るわけだが、このループ内でGCを起動すれば良い。イベント処理のスクリプトレットは入口と出口でThread.criticalを設定/解除するので、スレッド切り替えは起きないし、起きた場合、つまりメインスレッドが実行できるのは、イベント処理スクリプトレットから抜けた後になる。つまり、イベントディスパッチスレッドのスタックは巻き戻されているため、GCでマークする必要はない。

では、メインではどうやって待てば良いのか、それが次の問題となる。

でも、実は大したことはない。ふつうにSWingアプリケーションを作れば、メインスレッド(Swing用語だとInitial Thread)は、SwingUtilities.invokeLaterを呼んだらそれでおしまいだからだ。おしまいの代わりに、上で書いた、Mutex#synchronizeによって防御した中でのGC呼び出しと、sleepかなにかによるワーカスレッドへの処理委譲を繰り返す。

いずれも、CレベルのサポートがなくてもRubyだけで書けるはず。

と、思って試してみたら、Mutex.synchronizeでSystemStackErrorになる。違うスレッドのスタックでコンテキストを作ろうとするからか。うまく行かないもんだな。

というようなことは、考えてみたら、1.9では解消するわけか。

_ 現代の日本人に欠けているもの

いくつかの同時代の他の国家が教育のカリキュラムに取り入れているにもかかわらず、という観点からなら、体系的に人を殺す技術は欠けているだろう。つまりは軍事教練。銃器の扱い、毒物の知識、効果的な人体の破壊法なども。

で、問題はその欠損が現代の日本人にとって弱点なのか、ということ。

無駄な教育ならば、コストをかけなくて済んで良かったね、と言えるわけだ。

逆に皆がその知識を自在に駆使できるとしたら、どのようなゲインがあり得るだろうか。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|

ジェズイットを見習え