るびま本のかねあいもあるので、気合いで今月号に書くことにする。 いっつもいっつも「添削記事を読み切れなかった」という声を耳にするので、 今回は読み切れそうな工夫をすることにした。
(22:01)
最近るりまのことを日記に書いてないけど、 わりと進んでたりする。 というか、ぶっちゃけ俺以外の人がものすごい勢いで進めてくれているという話である。 すげー。
あまりになんもしないのもあれなのでウェブまわりを少しいじった。
http://doc.loveruby.net/refm/api/view/class/Net=SMTP
本当に少しだな!
次は、そろそろクラスリファレンス以外の部分をどうにかしてみようと思う。
(22:19)
思い出した。
るびま本添削記事へのプログラム投稿ありがとうございました。 いまのところ 4 本応募をいただいています。 せっかくもらったので、いまのところ全部使ってみようかと思っています。
(22:35)
想定していたことではあるが、 やっぱ「るびま」「るりま」と並べて書くと激しくまぎらわしいな。 「るびま」…… Rubyist Magazine、「るりま」…… Ruby リファレンスマニュアルね。
んで、るりまだが、次は C API リファレンス (のシステム) をやってしまうのもいいかもしれない。あれは楽そうだし。
(22:38)
11/10 は「いいバイナリの日」らしい。 イチゼロでバイナリか。なるほどね。
……しかし、バイナリのくせに十進法に甘んじるのはどーなんだ。 0b10 == 2、0b1110 == 14 であるからして、 2/14 を「とってもいいバイナリの日」でオーバーライドすべきではないだろうか。
(01:12)
今日はるびまの日 (るびまの原稿を書く日)。
今回こそは量を減らそうと誓ったにも関わらず、 1/3 書いた時点で 20KB 越えってどういうことだ。 この分だと最終的な分量は前回 Tropy の 40KB すら遥かに越えることになるわけかー。
うーん、3 本立ての予定だったけど、1 本に絞ろうかなあ。
(21:17)
PowerShell (元 Monad) がリリースされたのでインストールしてみた。
http://support.microsoft.com/kb/926140
おお、ls がある。でも出力は dir だな。ただし拡張子は別ではない。 dir もあるのかな。あるなあ。
勘で help ls と打つと当たりだった。 help の別名で man もあるらしい。 また help -detailed ls と打つとコマンドラインオプションが見られる。 オプションなしで help と打つとコマンド一覧が出て便利。
ls -name で UNIX の ls みたいになる。 オプションは省略できるらしく、-nam -na -n と短くしても大丈夫だった。
ファイル名はタブで補完できる。 コマンド名は補完できないようだ。
cp がある。mv もある。more はあるが less はない。 file もない。which もないが where がある、が、UNIX の where とは違うような感じがするな。 まあ、コマンドがファイルとしてあるわけじゃないだろうから、ないのが当然かも。
コマンドプロンプトと比較して一番便利な点は、 ウィンドウを 80 桁より広げられることかもしれない、と思った。
clear, cls がある。
diff は diff なのかなあ (意味不明)? Compare-Object の別名ってあるから、diff なんだろうな。 つーことは patch もあるんだろうか。なかった。
touch がないので echo a > a とかしてファイルを作り、 diff で比較してみる……が、diff a b の出力がよくわからない。 違うってことだけしか教えてくれないのかな。cmp 相当? でも cmp はないと。
rm a b と書いたら怒られた。rm a,b と書かなければいけないようだ。 まあ、それはそれでわからんこともない。
(20:15)
いま話題の Binary Hacks 買ってきた。 帰り道の本屋では最後の一冊だった。
うーむ、目次を眺めてるだけでも面白いなあ。 特に C++ まわりはほとんど知らないのでおもしろそうだ。
……いかん、添削原稿を終わらせないと。
(20:47)
[100]「文献案内」で Alpha のセクションを発見!
Alpha についてはインストラクション以外に PALcode も知ってないと OS 以下の層は全然わかんなかったりする。 んで Alpha Architecture Handbook のほうには PALcode は載ってないので、 下のほうも知りたい人は Alpha Architecture Reference Manual が必要。
(21:00)
なんだかんだ言いつつ、ぜんぜん短かくならなかった。 どうも最近、文章を書くとことごとく長くなってしまう。
最近、とか言ってるが、原稿の分量がオーバーしなかったのは無道編くらいである。 おれが文章を書くと長くなるのは昔からなのだ。官僚向きですな。
(18:35)
http://jp.rubyist.net/magazine/?0017
るびま 17 号でました。
今号はなにげにわたしのインタビューが出てます。 添削とダブルだとすさまじいボリュームだ。
添削は結局三本立てです。 以前この日記で募集したときに応募していただいたプログラム 3 本を 全部まとめてやりました。 プログラムの量が増えたぶん、書き換え量は少なめ。 ていうか、指摘のみ。おかげで今月は量のわりに楽だった……。 毎回あんなにきつかったのは全部リライトしてたからだったんだな。
言語探訪の Erlang はおもしろそうだなあ。 とりあえずインストールしてみよかな。
ライブラリ紹介。 ERB の trim_mode の仕様がようやくわかった。 おれはいつも 2 にしてたんだけど、 なんで 2 にしはじめたのかすでに忘れてたもんな。
やーまに。このへんはなんとなく知っていた。 ていうか、以前ささださんに教えてもらった。
(21:33)
Symbol#to_proc のとこだけど、間違えた……。 関数合成じゃなくて高階関数だよ。 やっぱリリース直前に何も考えずに文を追加したのがよくなかった。
高階関数の一部の場合 (渡す関数が一個) を特殊な文法で表現できるようにしたのが Ruby のブロックであるわけだが、 それのさらに特殊なケースを短縮するのが Symbol#to_proc でしょ。 でもあの方向性を求めるならむしろフツーの高階関数に戻ればいいんで、 Ruby のブロックにさらに「工夫」を積み増しするのは違うだろ。 ってことが言いたかったの。
しかも Symbol ってとこがまた気に食わないんだよな。 Symbol < String の件といい、 どうも Rails 方面のやつらと俺とではシンボルの解釈に相当の開きがあるような気 がする。
ちなみに「名前から実体を作る」の話は 「(シンボルという) 名前から (Proc オブジェクトという) 実体を作る」 ってことね。
そういえば、Eiffel では変数名に .create って呼ぶとオブジェクトができるけど、 あれは「名前からモノを存在させる」典型的な例だと思う。 Ruby ではああいうのはないでしょ。
(03:50)
■ elim [インタビューイントロの写真はやっぱり「長寿と繁栄を」なんでしょうか :p]
■
青木 [いえ、実は全然関係ない元ネタです。
あれがバルカンサインというものだってのは
あとで知りました。
元ネタはひみつー]
■
まつもと [EiffelはVer.3以降はオブジェクト生成は違う文法になりました。
以前はVoid, Createとあとひとつなんだかわすれちゃったのと3つが「名前に対する操作」だったんですが、そういうのはなくなっちゃったみたいです。]
■
青木 [なんと、そうだったんですか。
ありがとうございます。勉強になります。
いま見たら、create と void と forget ですね。
しかし、なくなったということは、やはり名前に対して
操作するのはいかんということだな (と勝手に結論)。]
ここんとこ、YARV の make test-all だか make yarv-test-all だかが止まらなくなってる。 かたまってるんじゃなくて、無限ループ。ps ax で見るとこんな感じ。
1119 ? R 1716:44 runner.rb test_exit_action(TestSignal)
しかも端末から実行するとちゃんと終わるのが解せない。 スレッド作りまくりなのが問題なのかと思って コメントアウトしてみたけど変化なし。 うーん?
つか、だいたい、test_exit_action は assert false なのに、 なんでここで止まるんだろう。
(14:23)
なーんかわかってきた。テストが終わらないんじゃなくて、 テストプログラムから fork したプロセスがずっと動いてるんだ。
class TestSignal < Test::Unit::TestCase def have_fork? begin Process.fork {} return true rescue NotImplementedError return false end end
このあたりに罠が潜んでるような気がする。
もしかして、fork したプロセスにも at_exit が登録されているから無限再帰になる? いやでも、ずっと動かしといてもプロセス ID は変化していないな。 ということは、無限に fork が呼ばれているわけではないはずだ。
うーん、だいたい YARV では test_exit_action は 無条件に assert(false) してるのに、なんで動くんだ。 assert の位置を変えてみよう。
tukumo:/var/www/autobuild-yarv/obj % make test-all aamine@tukumo ./miniruby /var/www/autobuild-yarv/src/runruby.rb --extout=.ext -- -C "/var/www/autobuild-yarv/src/test" runner.rb --runner=console "./ruby -C /var/www/autobuild-yarv/src/test runner.rb --runner=console" Loaded suite . Started ................................................................................ 中略 0000 (0x2aaaaf11f010): 00000004 0001 (0x2aaaaf11f018): 00000001 0002 (0x2aaaaf11f020): 2aaab17904d8 0003 (0x2aaaaf11f028): 0242b659 0004 (0x2aaaaf11f030): 2aaaab3ea550 0005 (0x2aaaaf11f038): 00000004 0006 (0x2aaaaf11f040): 00000001 0007 (0x2aaaaf11f048): 00000004 0008 (0x2aaaaf11f050): 00000001 <- lfp <- dfp -- control frame ---------- c:0005 p:---- s:0009 b:0009 l:000008 d:000008 CFUNC :(null) c:0004 p:---- s:0007 b:0007 l:000006 d:000006 CFUNC :now c:0003 p:0013 s:0004 b:0004 l:0x1958 d:000003 PROC /var/www/autobuild-ya:125 c:0002 p:---- s:0002 b:0002 l:000001 d:000001 FINISH c:0001 p:---- s:0000 b:-001 l:000000 d:000000 ------ --------------------------- DBG> : "/var/www/autobuild-yarv/src/lib/webrick/utils.rb:125:in `now'" DBG> : "/var/www/autobuild-yarv/src/lib/webrick/utils.rb:125:in `block in initialize'" [BUG] Segmentation fault ruby 1.9.0 (2006-11-06) [x86_64-linux]
おい!
(21:09)
とりあえずスタックトレース
#0 0x00002aaaab0c4dd0 in raise () from /lib/libc.so.6 #1 0x00002aaaab0c6280 in abort () from /lib/libc.so.6 #2 0x00000000004a7897 in rb_bug (fmt=0x4d4a89 "Segmentation fault") at /var/www/autobuild-yarv/src/error.c:172 #3 0x000000000046de99 in sigsegv (sig=16613) at /var/www/autobuild-yarv/src/signal.c:471 #4 <signal handler called> #5 mark_source_filename (f=0xe8106 <Address 0xe8106 out of bounds>) at /var/www/autobuild-yarv/src/gc.c:633 #6 0x000000000041b4b5 in gc_mark_children (ptr=55787088, lev=1) at /var/www/autobuild-yarv/src/gc.c:838 #7 0x000000000041ba5e in mark_entry (key=950534, value=950534, lev=1) at /var/www/autobuild-yarv/src/gc.c:732 #8 0x00000000004720c2 in st_foreach (table=0x228e340, func=0x41ba50 <mark_entry>, arg=2) at /var/www/autobuild-yarv/src/st.c:460 #9 0x000000000041b71f in gc_mark_children (ptr=46912545231680, lev=2) at /var/www/autobuild-yarv/src/gc.c:977 #10 0x000000000041b76d in gc_mark_children (ptr=46912533961640, lev=1) at /var/www/autobuild-yarv/src/gc.c:864 #11 0x0000000000488bcc in iseq_mark (ptr=0x13b92d0) at /var/www/autobuild-yarv/src/iseq.c:74 #12 0x000000000041b4f3 in gc_mark_children (ptr=1, lev=1) at /var/www/autobuild-yarv/src/gc.c:991 #13 0x0000000000488bf5 in iseq_mark (ptr=0x13a8d20) at /var/www/autobuild-yarv/src/iseq.c:71 #14 0x000000000041b4f3 in gc_mark_children (ptr=1, lev=1) at /var/www/autobuild-yarv/src/gc.c:991 #15 0x0000000000488bf5 in iseq_mark (ptr=0x12183a0) at /var/www/autobuild-yarv/src/iseq.c:71 #16 0x000000000041ba5e in mark_entry (key=950534, value=950534, lev=1) at /var/www/autobuild-yarv/src/gc.c:732 #17 0x00000000004720c2 in st_foreach (table=0x182b0b0, func=0x41ba50 <mark_entry>, arg=3) at /var/www/autobuild-yarv/src/st.c:460 #18 0x000000000041b71f in gc_mark_children (ptr=46912533953480, lev=3) at /var/www/autobuild-yarv/src/gc.c:977 #19 0x000000000041ba5e in mark_entry (key=950534, value=950534, lev=1) at /var/www/autobuild-yarv/src/gc.c:732 #20 0x00000000004720c2 in st_foreach (table=0x62eb00, func=0x41ba50 <mark_entry>, arg=2) at /var/www/autobuild-yarv/src/st.c:460 #21 0x000000000041b72b in gc_mark_children (ptr=46912506128840, lev=2) at /var/www/autobuild-yarv/src/gc.c:978 #22 0x000000000041b76d in gc_mark_children (ptr=46912552532720, lev=1) at /var/www/autobuild-yarv/src/gc.c:864 #23 0x0000000000488bcc in iseq_mark (ptr=0x226dec0) at /var/www/autobuild-yarv/src/iseq.c:74 #24 0x000000000041b4f3 in gc_mark_children (ptr=1, lev=1) at /var/www/autobuild-yarv/src/gc.c:991 #25 0x0000000000488bf5 in iseq_mark (ptr=0x1de72c0) at /var/www/autobuild-yarv/src/iseq.c:71 #26 0x000000000041ba5e in mark_entry (key=950534, value=950534, lev=1) at /var/www/autobuild-yarv/src/gc.c:732 #27 0x00000000004720c2 in st_foreach (table=0x637ee0, func=0x41ba50 <mark_entry>, arg=3) at /var/www/autobuild-yarv/src/st.c:460 #28 0x000000000041b71f in gc_mark_children (ptr=46912506071960, lev=3) at /var/www/autobuild-yarv/src/gc.c:977 以下略
struct RClass * 46912545231680 の m_tbl の中身 (NODE) のうちどれかの nd_file が壊れてるもよう。
m_tbl の中身は一個だけ (46912545227000) であった。
(gdb) p $4->bins[10]->record $19 = 46912545227000 (gdb) p (struct RNode*)$19 $20 = (struct RNode *) 0x2aaaad9800f8 (gdb) p *$20 $21 = {flags = 33087, nd_file = 0xa66e31 "(eval)", u1 = {node = 0x0, id = 0, value = 0, cfunc = 0, tbl = 0x0}, u2 = {node = 0x2aaaad980148, id = 46912545227080, argc = 46912545227080, value = 46912545227080}, u3 = { node = 0x0, id = 0, state = 0, entry = 0x0, cnt = 0, value = 0}}
壊れてない。 えーと、flags=33087 は NODE_FBODY で、u2.value = nd_body か。 NODE_FBODY の nd_body って何が入ってるんだっけ。NODE_METHOD?
(gdb) p $26->u2.value $28 = 46912545227080 (gdb) p (struct RNode*)$28 $29 = (struct RNode *) 0x2aaaad980148 (gdb) p *$29 $30 = {flags = 32831, nd_file = 0xa66e31 "(eval)", u1 = { node = 0x2aaaad981340, id = 46912545231680, value = 46912545231680, cfunc = 0x2aaaad981340, tbl = 0x2aaaad981340}, u2 = { node = 0x2aaaad980170, id = 46912545227120, argc = 46912545227120, value = 46912545227120}, u3 = {node = 0x0, id = 0, state = 0, entry = 0x0, cnt = 0, value = 0}}
flags=32831 は T_NODE の NODE_METHOD。
NODE_METHOD.nd_clss は struct RClass *。 NODE_METHOD.nd_body は NODE_BMETHOD。
なぬー。もうこの先は NODE ないじゃん。どこで落ちてんだよ。
(23:25)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ hyuki [カタカナは? 「ルリマ」]
■ 青木 [うーむ、カタカナはちょっと違和感が……。
一部だけにすればいいのだろうか。
「り」だけカタカナで「るリま」とか?
「マ」だけカタカナで「るりマ!」とか?]