Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ ふと思い出したので、幾つかのMLで使用しているメールアドレスを変更。
ついでにこの日記のどっかに書いてあるメールアドレスも変更。
別に旧来のメールアドレスが使えなくなったわけではありません。少なくとももうしばらくは。
_ それはそれとして、attなメールアドレスの方に直メールを送っても読まれない可能性があるのであしからず。
最近届く直メールはspamとウィルスばっかりなので、埋もれてしまって間違って削除しちゃう可能性が大なのです。
_ その他のメールアドレスは、仕事用以外は全てGCなメールアドレスに転送しています。
このGCなメールアドレスの方は、bsfilterさえすり抜けられれば間違いなく私に読まれています。ってそこをすり抜けるのが難しいんだったりして。
今のところ、本文が日本語で書かれたメールをspamと誤認したことはないのですが、本文が英語で書かれたメールは稀にspam扱いされているみたい。まあどっちにしろ英語は読まないけどな!(ぉぃ
_ そもそもどこの誰がnkf.soをrequireしてるのかわからないので、各テストを個別に実行してみた。
...
nkf.soでSEGVなんて発生しないよ! なんじゃこりゃ。
_ 代わりに、test/soap/calc/test_calc_cgi.rbでmd5.soでSEGVすることを発見。でも普通にmd5.soを使う分には問題なさそうなんだよなあ。むむむ。
ところで、誰がmd5.soなんてrequireしてるんだ? → soap/rpc/driver.rbの中でsoap/mapping.rbをrequireしてて、soap/mapping.rbの中でsoap/mapping/registry.rbをrequireしてて、soap/mapping/registry.rbの中でmd5.soをrequireしているようです。
_ 仕方ないのでこれをデバッグしてみるか。せっかくcoreもあることだし。
% ruby ../current/test/soap/calc/test_calc_cgi.rb
/usr/local/lib/ruby/1.9/i586-interix3/digest/md5.so: [BUG] Segmentation fault
ruby 1.9.0 (2004-01-31) [i586-interix3]
zsh: 197 abort (core dumped) ruby ../current/test/soap/calc/test_calc_cgi.rb
% gdb ruby core
GNU gdb 2002-11-11-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i586-pc-interix3"...
Core was generated by `ruby ../current/test/soap/calc/test_calc_cgi.rb'.
Reading symbols from /usr/local/lib/ruby/1.9/i586-interix3/digest/md5.so...
warning: "_RaiseException@16": indirect symbol does not have real one (-1)
done.
Loaded symbols for /usr/local/lib/ruby/1.9/i586-interix3/digest/md5.so
#0 0x7ffe0304 in ?? ()
(gdb) bt
#0 0x7ffe0304 in ?? ()
#1 0x77eaef75 in ?? ()
#2 0x77d815f2 in ?? ()
#3 0x1000d770 in ?? ()
#4 0x10060e20 in ?? ()
#5 <signal handler called>
#6 0x77e626ed in ?? ()
#7 0x77e62cee in ?? ()
#8 0x77e63022 in ?? ()
#9 0x71001b22 in ?? ()
#10 0x71001035 in ?? ()
#11 0x77e639be in ?? ()
#12 0x71001354 in ?? ()
#13 0x7100108f in ?? ()
#14 0x1000c2cc in ?? ()
#15 0x1001ab44 in ?? ()
#16 0x10023036 in ?? ()
#17 0x1001837e in ?? ()
#18 0x10018aea in ?? ()
#19 0x100144f6 in ?? ()
#20 0x1001a2d9 in ?? ()
#21 0x1001abb9 in ?? ()
#22 0x10023036 in ?? ()
#23 0x1001837e in ?? ()
#24 0x10018aea in ?? ()
#25 0x100144f6 in ?? ()
#26 0x1001a2d9 in ?? ()
#27 0x1001abb9 in ?? ()
#28 0x10023036 in ?? ()
---Type <return> to continue, or q <return> to quit---
#29 0x1001837e in ?? ()
#30 0x10018aea in ?? ()
#31 0x100144f6 in ?? ()
#32 0x1001a2d9 in ?? ()
#33 0x1001abb9 in ?? ()
#34 0x10023036 in ?? ()
#35 0x1001837e in ?? ()
#36 0x10018aea in ?? ()
#37 0x100144f6 in ?? ()
#38 0x10010e88 in ?? ()
#39 0x10010ece in ?? ()
#40 0x0040152d in main (argc=2, argv=0x1071c, envp=0x10728)
at ../current/main.c:50
(gdb)
... しくしく。-gはついてるのにー。
_ 気を取り直して追い直し。
... あれ、soap/mapping/registry.rbで落ちてるわけじゃないな。ごめん。
_ えーと、実際にはrequire 'webrick'で落ちてるのか。
でもこの1行だけ取り出すと、md5.soじゃなくてsha1.soで落ちるようになる。
これを辿っていくと、require 'webrick/httpauth/digestauth'で落ちているのだけれど、今度はnkf.soで落ちるようになる。
で、このlib/webrick/httpauth/digestauth.rbを単独で実行すると、require 'base64'のところでnkf.soがSEGVなのだけれど、require 'base64'だけではSEGVは発生しない、となるわけだ。ふーむ。
_ これをさらに分解して分解して分解して辿り着いた最小再現コード。
require 'socket' require 'fcntl' require 'etc' require 'digest/md5' require 'digest/sha1' require 'nkf'
最後のnkf.soのrequire中にSEGVする。ちなみに、このコードを適当に並べ替えても、最後のrequireで読み込まれる拡張ライブラリ内でSEGVするようだ。むー。
もちろん、「最小」というだけあって、1行でも削るとSEGVしなくなる。
require 'bigdecimal' require 'enumerator' require 'etc' require 'fcntl' require 'nkf' require 'sdbm' require 'socket'
これで最後のsocket.soのrequireでSEGV。ただし1行でも削るとSEGVしないし、requireの順序には影響しない。
というわけで、単に7個以上拡張ライブラリをrequireしようとすると、7個目でSEGVしている、ということらしい。上の最小再現コードは6行しかないけど、内部でdigest.soがロードされて結局7個の拡張ライブラリがロードされているので同じことだろうと思われる。
_ さらに厳密に調べると、どの7個の組み合わせでもSEGVするわけでもないようだ(つまり7個requireしても落ちない組み合わせがある)。
私の環境では、archdir直下には17個の拡張ライブラリが作成されている(この他に、digest/*.soとracc/cparse.soがある)。
で、どの組み合わせでSEGVするかを試すのがいいのだろうけど、その場合はいったい組み合わせは幾つになるんだろう。えーと、順番に意味があるとすると... 17! = 355687428096000 通りか。ちょっと試すには辛いなあ。
_ 力技はちょっとおいておいて、真面目に「なぜSEGVするのか」を考えてみると、どうせGCなんだろうなあ、いつもの通り。
拡張ライブラリのrequire中にGCすると落ちる、とかなんだろうか。むーん。
_ あ、私はまた週末くらいまでinterix遊びはできないと思われるので、誰か暇な人続きよろしく。
→ ebanさんがやっつけてくれました。わーい。
rubyのGCじゃなくて、Interixのdlopen(2)の問題だった模様。
_ 読んだ。AERA読むのも久し振りだなあ。
それにしても、例の記事、もうちょっと長さが欲しいよねえ。
まあ、そういう事情ではしかたないか。
_ ところで、私は新幹線に乗る用があったらニューズウィークを読むことにしてるので、AERAはともかくニューズウィークは時々読んでるわけですが、いつの間にか両者はそっくりになってますね(*1)。
厚さや構成もさることながら、なんというか、こう、各記事の匂いが、ね。
どっちがどっちに歩み寄ったんだろ。
_ ASCII配列(っていう名前でいいんだったっけ)では-と_が同じキーでShiftで押し分けになるからどーしよーもないのかもしれんけど、JIS配列では_は独立したキーなので、ちょちょいと設定をいじるだけでShiftなしで入力できるようになります。
と、いうことは、JIS配列の方が_をよく使う言語でのプログラミングには向いてるんじゃないのー?
... とかいうと宗教論争になりそうなのでマジレスしないでね。
_ で、私はJIS配列な人なんですが、だって最初に触ったキーボードがそうだったんだもーん。
ブレースに関しては悩んだことも困ったことも打ちにくいと思ったことないのでたぶん問題はないんでしょう。というかASCII配列の方がこの点に関して格別有利って配列になってたっけ?
_ 有利不利で言えば、ASCII配列の弱点は:と;の関係だと常々思っているのですが(JIS配列だと両方Shiftなし)、誰にも賛同されたことはないのでこれも所詮は慣れの範疇の話なんだろうなあ。
(*1) そっくりになってますね
どちらに対しても褒め言葉じゃないつもりですよ。
被捕捉アンテナ類
[\ay antenna (testing)]
[Ant]
[Antenna-Julia]
[LayserあんてなV2]
[nAntenna]
[nuance de Antenna]
[Rabbit's Antenna]
[Read List]
[Ruby hotlinks 五月雨版 (るるりん。)]
[してたま (私的アンテナ with たまてばこ)]
[ただのあんてな]
[ちゃらんぽらん]
[でこぽんリンク]
[なよろアンテナ]
[にっきトレーサー]
[偽善者あんてな - 2nd season -]
[湘南日記放送局(SDB)]
[はてなの各アンテナ]