土曜から秩父でゼミ合宿でした。帰ってきたのは月曜ですけど。 まわりに何もないので、勉強するか温泉につかるか 飲むかしかないという実に教育的な合宿でした。
俺は流行りものにはブームが終わりかけてから乗るのだ! 影響を受けた 5 冊を書いてみる。
俺が道を誤った原因その 1 (Linux とフリーソフトウェア編)。
俺が道を誤った原因その 2 (言語処理系編)。
(いまで言う) LL に開眼した一冊。 実は俺、これを読むまでは C 以外使う気なかったんだけど、 この本を読んで Perl 信者になりかけたのね。 なんでそれが Ruby になってしまったかと言うと、 それはそれでいろいろあったわけだ。
今度は雑誌かよ。Linux 256 倍を読んでえらく感動している俺がその足で 池袋の BIC に行ったら発見したのが創刊されたばっかの Linux Japan 3 号。 この号には Slackware 3.2 が付属しており、それが初めて使った Linux でもある。 さらに 6 号には Ruby を知ったきっかけである前田さんの記事が載っている。
誤った道を自発的・致命的に拡大再生産し、 ついに後戻りできないことが確定された一冊。 書いている途中に受けた影響にしても、その後の影響の広がりにしても、 これ以上の影響を受ける本は当分なさそうだ。
(17:37)
金子勇 『Winny の技術』 ASCII, 2005
http://www.amazon.co.jp/exec/obidos/ASIN/4756145485
ついに出たねってーか、実はもう一週間くらい前にもらってました。 合宿がなければ発売前にレビューを出せたんだけどな。惜しかった。
で、内容。
とりあえず、付録 C に Winny プロトコルがモロに載ってる。 Winny についてはあんまり調べてないのでよくわからんのだが、 これはたぶんかなり価値があるものだ。
もちろん本体もいい。 P2P によるファイル交換システムの歴史・概論から始まって、 Winny の特徴 (回線速度による上流・下流分割とクラスタリング)、 そして実装へと非常にきれいに構成されているので、 俺みたいな Winny 素人でも一冊読めば P2P について知ったかぶれる。
ちなみに、個人的に Winny の仕組みで一番気になってたのは ネットワークに参加するときの最初の一発をどこで知るかってことなんだけど、 「掲示板で教えてもらう」というとんでもない解答が書いてあって、有楽町線内で悶絶した。 いや確かに、言われてみればそれが一番簡単だよな……。これには本当に参った。
その他にも意外な情報がいろいろあった。 「実際に〜〜を試してみたがうまくいかなかった」 という話が率直に書いてあって説得力がある。 かと思えば、回線数などのパラメータはシミュレーションで 妥当性を検証しているという話もあった。 このシミュレーション結果 (画像) は巻末に少し載っている。
あと全体的に、Winny (あるいは P2P システム) は つくづく社会科学的なシステムなんだなあと感じた。 この点はつきつめればネットワークに関係するプログラムには すべて当てはまるはずだが、P2P の場合は特に際立っているように思える。 そのへんは攻撃に対する防御のところを見ていくとよくわかるだろう。
ちなみに、Winny の防御システムの中にはエンドユーザが Winny のコードを いじらないことを前提としているところが一部にあるので、 本書の出版以後は現状の Winny ネットワークの質は落ちる可能性がある (もしかしたらそんなことはとっくに知られていてすでに影響が出ているかもしれない)。 具体的には対上流コネクションの本数や、F5 連打対策のコードなど。 これに対抗するには、例えば身勝手なアクションを起こしたやつを Winny ネットワーク全体で検出してペナルティを与えるような仕組みを 使えばよさそうだけど、作るのは難しいだろうなあ。
(20:06)
Winny の仕組みが公開されると云々のところは最後まで読めば ちゃんと書いてあるなあ (p.157「なぜ Winny はオープンシステムではなかったのか」)。
ま、そのあたりも含めて、失敗したところを ちゃんと書いてあるところがすばらしい、ということで。
(20:57)
http://japan.cnet.com/news/tech/story/0,2000047674,20087858,00.htm
え、なにこれ、普通のノートパソコンよりカッコいいよ。 これは欲しいなあ。
(17:34)
http://jp.rubyist.net/magazine/?0010
るびま 10 号出ました。何気に初寄稿。 Open Source Conference 2005/Fall でやった セミナーの内容を 15 割増しくらいで収録しました。
こんなのを 20 分でしゃべるつもりだったとは、 おれ、見積もり甘いなあ……。
(22:01)
RubyConf から帰ってきました。
とりあえず、メシがまずかった。迷子になりかけた。風呂がつまった。 カンファレンスの中身に関しては現地にいた人間よりも mput さんの日記を見たほうがよくわかるのでそっちを見てください。
と言いつつもなんか書く。
まずは、あれだ。 DHH のプレゼン。 荻野さんと高橋さんは「二回目だとあんまり凄くない」とか言ってたが 初めてみるわたくしといたしましてはかなりカッコよかったと言っておきたい。 めちゃめちゃ煽ってた。
で、DHH のプレゼンが一番として、 二番目に面白かったのが Polishing Ruby の人。 どちらも Mac OS X の Keynote というプレゼンソフトを使っているらしい。 この人はいかにも笹田さんが文句をつけそうな妙なことをいろいろやっていたが 俺も Ripper がらみで文句をつけたい感じである。つけなかったけど。
Mac で思い出したけど、会場の Mac 率高すぎですよ。 前から見ると半分以上 Mac の白いフタで埋まってんのはどういうことだ。
そうだ、笹田さんのプレゼンについて。 パチモンはウケていたがネギま!はうけなかった。 るびま!ネタもヒットしていた。
最後に、夜の怪しい会合のときに作成された YARV の新インストラクション (blt) bitblt について。 その名前にたがわない動作をする。
続き (サンディエゴの生活編) は明日
(00:14)
もしエヴァが仏教に基いていたら
http://nya.livedoor.biz/archives/50144165.html
海鮮紀エビャゲリオン
http://www.rpgwatcher.com/archives/000319.html
笑い死ぬかと思た。
(19:58)
ローカルの BitChannel が落ちまくり。 どうして俺が新しいことをしようとすると必ず ruby が落ちるんだろう。
/home/aamine/public_html/bc/lib/bitchannel/syntax.rb:436: [BUG] Segmentation fault ruby 1.9.0 (2005-10-06) [x86_64-linux] /home/aamine/public_html/bc/lib/bitchannel/filesystem.rb:50: [BUG] Segmentation fault ruby 1.9.0 (2005-10-22) [x86_64-linux] /home/aamine/public_html/bc/lib/bitchannel/lineinput.rb:52: [BUG] Segmentation fault ruby 1.9.0 (2005-10-22) [x86_64-linux] /home/aamine/public_html/bc/lib/bitchannel/syntax.rb:398: [BUG] Segmentation fault ruby 1.9.0 (2005-10-22) [x86_64-linux]
コードを追加するだけで落ちる場所が移動するので、いかにも GC 関係くさい。 まだ Apache 経由でしか落とせてないおかげで core がとれてない。 なんで端末から実行すると落ちないんだ! ウガー!
GC.start を入れまくったら落ちた。やったー
(gdb) bt #0 0x0000002a956b945f in gc_mark (ptr=180388626432, lev=1) at ../../src/ruby/gc.c:697 #1 0x0000002a956b988a in gc_mark_children (ptr=182916056536, lev=1) at ../../src/ruby/gc.c:902 #2 0x0000002a956b9502 in gc_mark (ptr=182916056576, lev=0) at ../../src/ruby/gc.c:713 #3 0x0000002a956b92db in mark_locations_array (x=0x7fbffdfcc8, n=16128) at ../../src/ruby/gc.c:624 #4 0x0000002a956b9317 in rb_gc_mark_locations (start=0x7fbffde140, end=0x7fbffff4d0) at ../../src/ruby/gc.c:636 #5 0x0000002a956ba798 in garbage_collect () at ../../src/ruby/gc.c:1313 #6 0x0000002a956ba84f in rb_gc () at ../../src/ruby/gc.c:1385 #7 0x0000002a956ba85f in rb_gc_start () at ../../src/ruby/gc.c:1402 #8 0x0000002a956b37c4 in call_cfunc (func=0x2a956ba856 <rb_gc_start>, recv=182903891032, len=5796064, argc=0, argv=0x1) at /home/aamine/src/ruby/eval.c:5409 #9 0x0000002a956a6087 in rb_call0 (klass=182903890992, recv=182903891032, id=5129, oid=5129, argc=0, argv=0x0, body=0x2a95ebe408, flags=0) at /home/aamine/src/ruby/eval.c:5617 #10 0x0000002a956a6399 in rb_call (klass=182903890992, recv=182903891032, mid=5129, argc=0, argv=0x0, scope=0) at /home/aamine/src/ruby/eval.c:5790 #11 0x0000002a956a0376 in rb_eval (self=182907303728, n=0x1) at ruby.h:659 #12 0x0000002a956a5ba3 in rb_call0 (klass=182907916248, recv=182907303728, id=18049, oid=18049, argc=1, argv=0x7fbffdf2e0, body=0x2a95f0d0b0, flags=8) at /home/aamine/src/ruby/eval.c:5698 #13 0x0000002a956a6399 in rb_call (klass=182907916248, recv=182907303728, mid=18049, argc=1, argv=0x7fbffdf2e0, scope=1) at /home/aamine/src/ruby/eval.c:5790 #14 0x0000002a956a0376 in rb_eval (self=182907303728, n=0x1) at ruby.h:659 #15 0x0000002a956a0437 in rb_eval (self=182907303728, n=0x1) at ruby.h:683 #16 0x0000002a956a5ba3 in rb_call0 (klass=182907916248, recv=182907303728, id=7385, oid=7385, argc=1, argv=0x7fbffe0dc8, body=0x2a95f0b440, flags=0) at /home/aamine/src/ruby/eval.c:5698 #17 0x0000002a956a6399 in rb_call (klass=182907916248, recv=182907303728, mid=7385, argc=1, argv=0x7fbffe0dc8, scope=0) at /home/aamine/src/ruby/eval.c:5790 #18 0x0000002a956a65b2 in send_funcall (argc=1, argv=0x7fbffe0dc8, recv=182907303728, scope=0) at ruby.h:659 #19 0x0000002a956b37bb in call_cfunc (func=0x2a956a6640 <rb_f_send>, recv=182907303728, len=5796064, argc=0, argv=0x1) at /home/aamine/src/ruby/eval.c:5406 #20 0x0000002a956a6087 in rb_call0 (klass=182904027432, recv=182907303728, id=4089, oid=4089, argc=2, argv=0x7fbffe0dc0, body=0x2a95edba80, flags=0) at /home/aamine/src/ruby/eval.c:5617 #21 0x0000002a956a6399 in rb_call (klass=182904027432, recv=182907303728, mid=4089, argc=2, argv=0x7fbffe0dc0, scope=0) at /home/aamine/src/ruby/eval.c:5790 #22 0x0000002a956a0376 in rb_eval (self=182907303648, n=0x1) at ruby.h:659 #23 0x0000002a956ac06b in rb_block_pass (func=0x2a956ac130 <call_block>, arg=548681947760, proc=4) at /home/aamine/src/ruby/eval.c:8519 #24 0x0000002a956ac16c in block_pass (self=180388626432, node=0x1) at /home/aamine/src/ruby/eval.c:8589 #25 0x0000002a956a0fd8 in rb_eval (self=182907303648, n=0x1) at /home/aamine/src/ruby/eval.c:2949 以下略
マシンスタックをマーク中に落ちているようだ。 壊れてるオブジェクトは 10 要素の配列の 8 番目で、 配列はこんな感じ。
[59, 6, 15, 23, 10, 2005, 0, 296, (C の 0x2a << 32), "UTC"]
これはどう見ても時刻だよなあ。 296 が 10 月 23 日の yday だから、 たぶん Time#to_a の返り値だろう。
え、ということは 0x2a<<32 は isdst か。 真偽値がなんでこんな値に化けてるんだろう。
とりあえず今日はここまで。
(19:28)
うげ、AMD64 だと cvsup のバイナリがないのか。 というか、コンパイルすらできなかったら泣くので。
いや、IA-32 エミュレーション内で動かせばいいのかな。 やってみよう。
(20:12)
http://www.lostway.org/~tko/cgi-bin/bakagaiku.rb?bakaid=20051029
> む。Cでのメソッドの定義として、引数をRubyの配列で受け取るのはあるけど、 > 呼び出しではRubyの配列を渡せるものはないのか。つまり:
つ rb_apply
というのはいいとして。どうやったら 「配列を引数に渡して呼び出す rb_funcall」 という機能から rb_apply に辿りつけるかを考えてみたい。
うーん、結局ソースコードを読まないとだめそうな気がするな。 具体的にはこんなふうに見る。
~ % list-function ~/src/ruby/eval.c | grep -v '^static ' | less : : VALUE rb_with_disable_interrupt(VALUE (*proc) (/* ??? */), VALUE data) VALUE rb_apply(VALUE recv, ID mid, VALUE args) VALUE rb_funcall(VALUE recv, ID mid, int n, ...) VALUE rb_funcall2(VALUE recv, ID mid, int argc, const VALUE *argv) VALUE rb_funcall3(VALUE recv, ID mid, int argc, const VALUE *argv) VALUE rb_call_super(int argc, const VALUE *argv) void rb_backtrace(void) : :
と、さりげなく list-function などという独自コマンドを使ったりして。
そのうえで ReFe で調べる。
~ % refe -e rb apply : VALUE rb_apply(VALUE recv, ID mid, VALUE args) オブジェクト recv のメソッド mid を 引数 args とともに呼び出します。
リファレンスマニュアルを見て調べるっても、 eval.c にありそうだ、くらいはわかってないとだめだしなあ。 もうちょっとエントリの分類とか検索について考えるべきだろうか……。
あとはあれか。以前書いた拡張ライブラリ作成マニュアル。 いま読むとけっこうアラがあるのう。
(19:50)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ same problem? [Looks similar.
/usr/local/lib/ruby/1.8/net/protocol.rb:197: [BUG] Segmentation fault
ruby 1.8.2 (2004-12-25) [x86_64-linux]
Aborted (core dumped)
(gdb) bt
#0 0x00000032f812e4cd in raise () from /lib64/tls/libc.so.6
#1 0x0000002a9a12401d in MagickSignalHandler (signal_number=6)
at magick/magick.c:834
#2 <signal handler called>
#3 0x00000032f812e4cd in raise () from /lib64/tls/libc.so.6
#4 0x00000032f812fc1e in abort () from /lib64/tls/libc.so.6
#5 0x00000000004880e2 in rb_bug (fmt=0x4a4708 "Segmentation fault")
at error.c:214
#6 0x00000000004693d0 in sigsegv (sig=16997) at signal.c:446
#7 <signal handler called>
#8 gc_mark (ptr=545460846592, lev=1) at gc.c:713
#9 0x0000000000429db6 in gc_mark_children (ptr=2, lev=1) at gc.c:923
#10 0x0000000000429f8f in mark_locations_array (x=0xd934e8, n=12668)
at gc.c:624
#11 0x0000000000411f32 in thread_mark (th=0x1102d00) at eval.c:9726
#12 0x0000000000429ba6 in gc_mark_children (ptr=4294967295, lev=1) at gc.c:974
#13 0x0000000000411d5f in thread_mark (th=0x5f4000) at eval.c:9713
#14 0x0000000000429ba6 in gc_mark_children (ptr=0, lev=1) at gc.c:974
#15 0x0000000000411d5f in thread_mark (th=0x1049a30) at eval.c:9713
#16 0x0000000000429f8f in mark_locations_array (x=0x7fbffe4790, n=13881)
at gc.c:624
#17 0x000000000042a2b4 in garbage_collect () at gc.c:1354
#18 0x000000000042ac17 in ruby_xmalloc (size=1025) at gc.c:119
#19 0x000000000046bc67 in str_new (klass=545460846592, ptr=0x0, len=1024)
at string.c:92
#20 0x0000000000431bea in rb_io_sysread (argc=0, argv=0x1, io=182920194280)
at io.c:2178
#21 0x0000000000417acd in rb_call0 (klass=182894404728, recv=182920194280,
id=7497, oid=18446744073709551615, argc=1, argv=0x7fbffe6b10,
body=0x2a955b1cf8, nosuper=0) at eval.c:5386
#22 0x0000000000418428 in rb_call (klass=182894404728, recv=182920194280,
mid=7497, argc=1, argv=0x7fbffe6b10, scope=0) at eval.c:5743
#23 0x0000000000415fc9 in rb_eval (self=182920194880, n=0x1) at ruby.h:631
#24 0x0000000000413b01 in rb_eval (self=182920194880,...]