2011/11/30
■
ここ数年は何か思いついたらとりあえずrubyで書いてアイデアの感覚をつかむのがパターンで仕事だと主にlinuxを中心とした何入ってるかわからない色んなマシンで動かさないといけないという暗黙的な制約があり、そういうとき自分の場合は今までだったらPerlで書いてたんだけどPerlにそれほど馴染のない人に勧めるの酷なかんじするので色んなとこで動かすことになりそうだけど簡単なツールはlinux標準で入っててコードの見た目が綺麗なpythonで書こうとしていて、実際にいくつか書いてる。
python絡みで、前から気になってたSphinx + blockdiag/seqdiag使って仕事のドキュメント書いてみてるけど、普通にblockdiagの書き方でOmniGraffleで描いた図のような見た目になるのがいい感じ。
reStructuredTextの存在自体は知ってたけど書いたことがあまりなくてその理由を考えたんだけどpythonに絡まないところで目にする機会が少なかったからだろうか。markdownはgithub以前から目にする機会が多かったように思う。個人的な各種メモ、まとめはemacsのorg-modeで書いてる。さっきメモファイル置き場で ls | grep .org$ | wc -l したら151個ファイルがあった。orgにはとりあえず気になるトピック単位(vlad, q4m, beat_detection, kinect_openNI, chuckとか)でファイルにメモしていて、メモファイル置き場にある一番古いorgのタイムスタンプによるとorgで書き始めたのが2009年秋頃だった。この日記の更新頻度の低下に影響してるように見える。
そういうこと考えながらそういえば日記更新してないなーと思ってはてなダイアリーみたら最終更新が一年前の先月で今更新するとよさそうだったので更新してみました。更新って言葉がなつかしい感じする。
2010/10/02
■ruck
ruckはChucKの軽量スレッド周りの処理をrubyに移植したもので、RubyKaigi2010でもプレゼンがあった。タイトルだけ見るとゲームの話かと思うけどゲームに関しては少しだけ触れられていてほとんどはruckとChucKの話だった。ChucKは今までにも何度かおもしろそうだなーと思ったことがあったのでruckのコードを読んでみた。ChucKの論文眺めてたのもその為です。
ruckはclock, event_clock, shred, shredulerから構成されている。shredulerに対してshredを登録するとそのshredはshredulerが持つclockに登録される。shreduler実行ループでは以下のような処理が行われている。
- clockから現時刻のshred取り出し
- clock時刻進める
- 取り出したshred実行
clockがshred管理、スケジューリング、時間制御を担当し、shredulerはそのラッパーという感じ。実際に使うときはshredulerインスタンスのmake_convinientというメソッドを実行するとmodule_evalやincludeで便利なメソッドがいくつか追加され、clockを直接触らなくて済むようになってる。以下はreadmeからmake_convinient使ってるコードの抜粋
@shreduler = Ruck::Shreduler.new @shreduler.make_convenient spork do %w{ A B C D E }.each do |letter| puts "#{letter}" Ruck::Shred.yield(1) end end spork do %w{ 1 2 3 4 5 }.each do |number| puts "#{number}" Ruck::Shred.yield(1) end end @shreduler.run
shredの実装はruby 1.8系はcallcc, 1.9系はFiberを使ったものになっていてshreduler/clockから制御するときに実際の実装を意識しない。
Ruck::Shred.yieldメソッドはshredからshredulerに制御を戻すためのメソッドで、yieldに渡した時間とshred自身をshredulerのclockに対して再スケジュールするよう指示してshredを停止する。shred停止はfiber実装だと単にFiber.yieldするようになっていてこのあたりは面白かった。
event_clockはclockと似たようなインタフェースを持つが時間でなくイベントに対するshredスケジューリングを行う。clockが時間でソートされた配列なのに対してevent_clockはイベントをキーとした辞書といった感じ。
RubyKaigi2010でのプレゼンではstrong timing, virtual timeまわりの説明に重点が置かれている。通常のthreadとの比較、fast_forwardによるvirtual timeの制御等。threadとの比較で出てくる、初期化を先にやって各スレッドの時間経過は同時だからタイミングがずれないというような説明図の意味もコードを読んでからは理解できた。

関連:
