〜2002年1月上旬〜
大晦日のテレビ朝日の特番を見て、早速amazonで注文だと思った人が多いようだ。 って俺もそうなんだけど。いきなりベストセラーになってる。
RUBY_VERSIONを書き換えるのを忘れてた。 このままだとrbconfig.rbのバージョンがまずい。 たとえばLinux上では1.6.6のrubyを使っている場合、 cygwin版ruby 1.7.2を作るとrbconfig.rbは1.6.6になってしまう。 fake.rbで1.7.2にしないとmake installでバージョンが合わないのでエラーになる。 じゃなかった。 拡張ライブラリを作るときにmkmf.rbをrequireしたときにエラーになるんだ。 昨日も書いたけどmkmf.rbはrbconfig.rbをrequireしてるから。 というより、1.7.2をインストールしてるのに1.6.6になってしまうのはだめだめだ。
% grep -w PLATFORM **/*.rb
してもext/tk/lib/tk.rbしか出てこないので、 もうちょっとあっさりさせてもよさそうだな。
あれ?dir_configを追加したはずなのになあ。 ChangeLogにも残ってるし、1.6にだってちゃんとある。 実は1.7のほうはいじってなかったのか?
ということは
if [].method(:select).arity == 0 class Array def select(*x, &block) if block super *x, &block else indexes *x end end end end
で1.7互換になるかな。 superのほうは*xは入らないけど、 引数とブロックをいっしょに指定されたときの例外をEnumerable#selectに任せた。 最初
method(block ? :super : :indexes).call(*x, &block)
としてみたが、やはり:superには無理があった。
中国で人間が一個一個手でむいているという話は聞いたことあるが、 一個むくのに3秒かからないとは。
ruby-talkを見てるとどうもidiom化しつつあるchomp.splitであるが、 空白が区切りなら
% ruby -e 'p "a b c\n".split' ["a", "b", "c"]
とchompはなくてもいい。つまり最後の空のフィールドは無視される。 splitのdefaultの区切りは' 'で、' 'はisspaceとみなされる。 split /s+/と同じ。これはawkからの伝統だ。
/etc/passwdのように:が区切りなら
% ruby -e 'p "a:b:c\n".split /[:\n]/' ["a", "b", "c"]
とも書ける。無視されたくないときは
% ruby -e 'p "a:b:c\n".split /[:\n]/, -1' ["a", "b", "c", ""]
のように2番目の引数に-1を指定する。
Subjectについてるからこそ、あれだけ盛り上がるんだという気もする。 ま、どうでもいい話題だからやはり外したほうがいいか。
作ってみた。で、mkmf.rbのバグを見つけた。.defとdependがsrcdir対応してない。 -I.もないとまずいな。
forkが関係するのはWEBrick::Daemonだけなので、mingw32もsymlink張っとく。
手で張るから間違えるわけで、 Makefile.pack にちゃんとターゲットを用意した。
% make -f ../Makefile.pack \ PACKAGE=webrick VERSION=1.1.3 TARGET=i386-mingw32 symlink
77通(ML宛は除く)。過去最高。
今のところLinuxがTOP。やはりUnix系が多い。
ruby-talk MLを見てるとCygwin版rubyはCygwinの評判を落とすだけの存在のように思える。 てゆか君達使い方間違ってるよ。何だってdirだのxcopyだのしたがる?
なんか立て続けにcommitしてしまった。すまん。 version.hも2002年になった。
更新しようと思ってから、すっかり年を越してる。 srcdir対応もされてるから、mkdirしてから作業開始だ。 CygwinとMinGWはやることは同じ。
% mkdir cygwin mingw djgpp % cd cygwin % i386-cygwin-ruby ../setup.rb config --ruby-path=/usr/local/bin/ruby % i386-cygwin-ruby ../setup.rb setup % upx **/*.so % i386-cygwin-ruby ../setup.rb install % cd ../mingw % i386-mingw32-ruby ../setup.rb config --ruby-path=/usr/local/bin/ruby % i386-mingw32-ruby ../setup.rb setup % upx **/*.so % i386-mingw32-ruby ../setup.rb install
djgppはraccrtとstrscanをwithoutで指定する。
% cd ../djgpp % i386-msdosdjgpp-ruby ../setup.rb config --without=raccrt,strscan \ --ruby-path=/usr/local/bin/ruby % i386-msdosdjgpp-ruby ../setup.rb setup % i386-msdosdjgpp-ruby ../setup.rb install
キャッシュとか出てくるということは、どうもみんな
% ruby-1.7.2 -e 'h=Hash.new{1};p h[0];p h' 1 {}
じゃなくて
% ruby-1.7.2 -e 'h=Hash.new{1};p h[0];p h' 1 {0=>1}
を望んでいるような気がする。 毎回blockが評価されちゃキャッシュにはならないし。
Index: hash.c =================================================================== RCS file: /home/ruby/cvs/ruby/hash.c,v retrieving revision 1.59 diff -u -1 -r1.59 hash.c --- hash.c 11 Dec 2001 03:48:08 -0000 1.59 +++ hash.c 4 Jan 2002 19:26:46 -0000 @@ -296,3 +296,4 @@ if (!st_lookup(RHASH(hash)->tbl, key, &val)) { - return rb_funcall(hash, id_default, 1, key); + val = rb_funcall(hash, id_default, 1, key); + rb_hash_aset(hash, key, val); }
と、変更は簡単だけどこれは受け入れられる挙動なのかというあたりが問題なんだろうなあ。
--without=raccrtするとracc/parser.rbがインストールされない。 mv pacakges/racc{rt,}/lib/racc/parser.rbすべき? とりあえずdjgpp版は-1をつけてrepackだ。
ruby-zlibへのpatchもついてる。 ついでに [ruby-ext:02041] もあてて、ruby-zlib-0.4.0-1として更新しとこう。
% ruby -e 'p "0.4.0" < "0.4.0-1"' true
だから[prev], [curr]は保たれると思ってsetup.ini.rbを実行してみると逆になる。 ちょっと考えて
% ruby -e 'p "0.4.0-i" < "0.4.0-1"' false
だからだと気づく。というわけで、-i386-cygwin.tar.gzを削除してからsortしよう。 mtimeでもいいと思うけど。
クロスコンパイルしてみる。
% mkdir build_cygwin; cd build_cygwin % db_cv_gcc_2_96_forloop_bug=no \ db_cv_alignp_t='unsigned int' \ db_cv_mutex=x86/gcc-assembly \ db_cv_fcntl_f_setfd=yes \ db_cv_sprintf_count=yes \ CC=i686-pc-cygwin-gcc \ CFLAGS=-Os \ ../dist/configure \ --prefix=/usr/local/cygwin-local/BerkeleyDB.3.3 \ --target=i686-pc-cygwin \ --host=i686-pc-cygwin \ --build=i586-pc-linux-gnu \ --cache=config.cache % make % make install
UTIL_PROGSをインストールするとこでエラー。 .exeがついてないからだが、これをインストールしてもあまり意味がないので、 install_utilitiesを外すのが簡単。でも、
UTIL_PROGS=\ db_archive db_checkpoint db_deadlock \ db_dump db_load db_printlog db_recover db_stat db_upgrade db_verify
に.exeを足す方法も考えてみよう。 例によってGNU make限定だが、$(addsuffix SUFFIX,NAMES...)がある。
UTIL_PROGS=$(addsuffix .exe,\ db_archive db_checkpoint db_deadlock \ db_dump db_load db_printlog db_recover db_stat db_upgrade db_verify)
でokだ。てゆかちゃんとEXEEXTを使ってよ。
% mkdir build_mingw; cd build_mingw % ac_cv_c_bigendian=no \ db_cv_gcc_2_96_forloop_bug=no \ db_cv_alignp_t='unsigned int' \ db_cv_uint8='unsigned char' \ db_cv_uint16='unsigned short' \ db_cv_uint8='unsigned char' \ db_cv_int16=short \ db_cv_uint32='unsigned int' \ db_cv_int32=int db_cv_ssize_t=int \ db_cv_mutex=x86/gcc-assembly \ db_cv_fcntl_f_setfd=no \ db_cv_sprintf_count=yes \ CC='i686-pc-cygwin-gcc -mno-cygwin' \ CFLAGS=-Os \ ../dist/configure \ --prefix=/usr/local/mingw/BerkeleyDB.3.3 \ --target=i386-mingw32 \ --host=i686-pc-cygwin \ --build=i586-pc-linux-gnu \ --cache=config.cache
autoconf 2.5xはcacheを作らないのがdefault。 いろいろ試すときはcacheを作ったほうがいい。
このままだとos_sleep.cがコンパイルできない。 os_win32/os_sleep.cを使うようにMakefileを書き換える。 ついでにutilitiesは外す。 あと、build_win32/db_config.hを参考にdb_config.hの最後に
#include <windows.h> #define fsync(fd) _commit(fd)
を追加。
やっぱだめだなあ。build_win32/db_config.hをそのまま使うべきか。
BerkeleyDB 3.3.11ができたはいいが、testが通らない。 assertがtrueを要求するようになったからそのあたりは適当に直せばいいだけだが、
tests/btree.rb:17:in `unlink'(TestBtree): Permission denied - \ "tmp/aa" (Errno::EACCES)
と、どうもopenしたままunlinkできないWin32の制限にはまった模様。 tests/btree.rbは こう するとCygwin, MinGW版ともに通った。 パッケージにまとめて差分を入れとこう。
$stdout.sync = true $stderr.sync = true
はsshでloginしたCygwin上のzshからMinGW版rubyを実行したときため。 tty?がfalseになるためバッファリングされてしまう。
% ruby -ve 'p [$stdout.tty?,$stderr.tty?]' ruby 1.6.6 (2002-01-05) [i386-cygwin] [true, true] % /c/usr/local/bin/ruby -ve 'p [$stdout.tty?,$stderr.tty?]' ruby 1.6.6 (2002-01-05) [i386-mingw32] [false, false]
でもほとんど自分一人の都合にすぎないのでflush.rbを用意して-rflushすることにした。
makeしたのに全然使ってなかった。 なんでかなと考えたら...がうっとしいからlftpgetし勝ちだったからだと気づいた。 1.8.1は
100%[====================================>] 71,017 1.99M/s ETA 00:00
という感じでなかなかいいねえ。
というわけでprogressbarだ。
% ruby test.rb test(inc): 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:09 test(set): 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:10 test(inc(x)): 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:11 test(total=0): 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:00
とりあえず本屋で探すか。
誠に申し訳ございませんがご注文いただいた以下の商品がまだ確保 できておりません。 泡坂 妻夫(著) "しあわせの書—迷探偵ヨギガンジーの心霊術" 商品の発送が4~6週間ほど遅れます。
年が明けてもvirusか。
CygwinもMinGWもtestが通ったのでパッケージとしてまとめた。
Digest::MD5問題があるので近々出る模様。
遂に外されたわけだが、今度は[ruby-talk]ぐらいはつけてくれとか言い出すし、わがまま放題だ。 Re: "" tag is removedというSubjectの人は自前でフィルタリングしてたんだろうなあ。
setup.exeでインストールしてみたはいいが、何度やってもKeepになってくれない。 どうも-i386-cygwinがついてるのが余計らしい。 しかたないので削ることにした。 でもそのままだと元々のソースのtarballと同じファイル名になってしまって極めて都合が悪そう。 またまたしかたなく、Cygwinのパッケージらしく-1をつけることにした。 例によってsymlinkで用意しただけ。.htaccessのIndexIgnoreに
*-1.tar.gz
を追加したので、見た目は変わらない。 いつか自分ではまりそうな設定ではある。
test_check "copyright" tesk_ok("-"+RUBY_RELEASE_DATE[0,4] == `./miniruby --copyright`[/-\d{4}/])
をこっそりsample/test.rbに入れとくってのはどうだろう? いや、堂々と入れればいいんだが。
あ、まだ2000年のままだったか。
@niftyの「お気にいり」のホストがいつの間にかiw.nifty.comからenter.nifty.comに変更されてるようだ。
10%OFFだからというわけでもないんだけど注文した。
更新。
Ruby-GTK maintainerのNeil Conwayさんから 「mingw版があるじゃん。やるねえ」(意訳) 的なメールをもらう。「で、0.26はどうなってるの?」と書いてあったわけだが、
gtk-0.25-i386-mingw32.tar.gz ruby-gtk-0.26-i386-mingw32.tar.gz
だと、 わかりにくいよね 、やっぱ。 でも名前を変えたのもNeilさん本人のわけだし。
今日は2通。
switch-to-bufferってあまり使わないなあ。
(define-key ctl-x-map "\C-b" 'electric-buffer-list)
としてC-xC-bを多用してるからか。
preemtp patchがなぜか出ないな。
Would it be a good idea to delete the old package?とやはり言われてしまった。 消したよん。
今度はMark Slagellさんから。こういうことは重なるらしい。 「
C:\local\gtk>\local\cyg166\usr\local\bin\ruby -e 'require "gtk"' -e:1:in `require': dlopen: Win32 error 1114 - /cygdrive/c/LOCAL/CYG166/USR/LOCAL /lib/ruby/site_ruby/1.6/i386-cygwin/gtk.so (LoadError) from -e:1
となるが、どうしたらいい? 今本を書いてるんだけど、あと2,3日でデッドラインなのだよ」(意訳) この人も締切間際にならないと仕事しないタイプか? ここ にあるよと教える。すぐに返事が来た。
Okay, we're getting closer. It does seem that the ruby/gtk 0.26 is really 0.25 though - it identifies itself as [0,2,5] in BINDING_VERSION, and it seems to lack Gtk::Text#set_position, which was implemented in 0.26 and is used in one of the book's examples. Is is possible that the wrong tarball is labelled as 0.26? Or did I mess up my download somehow...
がーん。うそ?確認してみると確かに0.25と0.26のgtk.soは同じものだった。 おかしいなあ。make installしたはずなのに。はっ!それだ。 make site-installじゃなきゃまずい。ということは
ruby-1.6.6-200*-i386-{cygwin,mingw32}.tar.gz
に入っているわけだ。まいった。
というわけで0.26-1としてrsyncする。
setup.exeを実行してみるとgtk-dllsが出てくる。 何も考えずに全部インストールしてるからこれもインストールされる。 でも、usr/local/bin/に置いてないから/に展開されてる。がーん。 というわけで -2 を用意した。
で、setup.exeでインストールして驚いたんだけど、/*.dllがちゃんと消えてる。 そうか、/etc/setup/*.lst.gzはそういう意味だったんだ。 前回インストールしたものを消してからインストールするわけだ。 だから中身が空のパッケージを作ればアンインストールになる。
これは既に1.6へ取り込まれているので、空のパッケージを作っとこう。 MinGW, DJGPPはそういうわけにもいかないので
/usr/local/lib/ruby/site_ruby/1.6/forwardable.rb
がもしあったら消すように。 現在はraiseとKernel::raiseの違いぐらいなので、それほど緊急でもないけど。
% tar cfvz forwardable-1.1-2.tar.gz tar: Cowardly refusing to create an empty archive Try `tar --help' for more information.
空は受け付けない。したかない。
% mkdir tmp; cd tmp % tar cfvz forwardable-1.1-2.tar.gz . --owner=ruby --group=ruby
としとこう。
1/15で定期券が切れる。新規の場合は7日前から買えるので今日Suicaを買った。 今までは会社が支給していたが、Suica対応が面倒になったのか経費削減か知らないが、 今年から自分で買えってことになった。 先月の給料がなんかいつもり多く感じたのは気のせいではなかったらしい。 てゆか明細にちゃんと書いてあるじゃん。
6ヶ月で9万円弱なのでSuicaじゃないとやっぱこわい。
一週間前に出ていたようだ。 前回は-lzをリンクするためにconfigureした後でMakefileを書き換えたが、
% make ZLIBOBJ= LIBS='-lz -lresolv'
としてみた。
更新。