〜2002年1月中旬〜
そろそろリリース?
なんと今日発送しましたのメールが。明日には届くかな。
multi-platformがどーのこーのとか書いてあるわりには、lib/rpkg/rpkg.rbに
`cp -a doc/* #{$dirs.doc}/#{@name}`
とかあったりで、全然ポータブルじゃない。
QUICKSTART quickstart/
でとどめ。
rpkgで使われているので、あらかじめパッケージを作っとこう。
% mkdir ~/dist/i386-cygwin/usr/local/lib/ruby/site_ruby/1.6/Lapidary % cp -a*.rb UI ~/dist/i386-cygwin/usr/local/lib/ruby/site_ruby/1.6/Lapidary % cat >../lapidary.contents DOC=ChangeLog LICENSE README examples *.html CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/Lapidary % make -f ../Makefile.pack PACKAGE=lapidary VERSION=0.2.1 \ TARGET=i386-cygwin % make -f ../Makefile.pack PACKAGE=lapidary VERSION=0.2.1 \ TARGET=i386-mingw32 symlink % make -f ../Makefile.pack PACKAGE=lapidary VERSION=0.2.1 \ TARGET=i386-msdosdjgpp symlink
very niceらしいが、w3mだと何も表示されない。 vしてHTMLソースを見てみると、
<script> if ( navigator.appName == "Netscape" ) { location.replace("http://lafor.eresmas.com/raf/raf.html.gz"); } else { location.replace("http://lafor.eresmas.com/raf/raf_nc.html"); } </script> <script src=http://www.eresmas.com/js/fly.js></script>
ともう笑うしかない。 Netscapeじゃないほう に行ってみるとやはりJavaScriptで、結局のところ笑うしかないのであった。
早速makeだ。 とその前に xmms-ja のほうも調べてみると、やはりすでにあった。 xmms-1.2.6j_20020109 source を使うことにした *1 。
% CFLAGS=-Os ./configure --enable-kanji --prefix=/usr/local % make % make install
で、問題なし。iconvが使われるから--enable-kanjiは関係ないが、 以前のままのオプションでやってみた。 起動してみるとPLAYLIST EDITORで日本語が全く表示されない。 README.jpを読むと自分で設定しろってことになってるようだ。 [Option]-[Preferences]-[Audio I/O Plugins]-[Input Plugins]- [MPEG Layer 1/2/3 Player]-[Configure]-[Title]に
□ Convert Input SJIS -> EUC-JP □ Convert Output EUC -> SJIS
というのがある。これって1.2.5のころにはあったっけ? まあいいや。 ここをチェックしてiconv的に有効な文字列を入れろということなんだろう。 で、見事に表示されたのであった。
ほんとに多いよね。今日も来てるし。"TAKIMOTO Nobukazu"。
これに従うspamが本当にあったら面白いんだが。2月1日を楽しみに待とう。 てゆか、うちには日本のspamはほとんど来ないんだった。
出たようなので更新してみる。
更新。
Cygwinにはmlockとかないのでやめとく。 と思ったが適当に#ifdefしたらtestsが通ったのでパッケージを作った。
なかださんはinterpreterだったのか。
いつruby-talkがruby-listを抜くか一目ではわかりにくくなったので、 ここ1ヶ月は注意しよう。あと2349通。
まだ読んでないけど、例の仕掛けは確認した。すごすぎる。 15年ぐらい前に発行された文庫本なので、 かなり大きな本屋じゃないと置いてないんだろうなあ。
make cleanはもったいないから基本的にしないし。ってなんという理由だ。
たとえばbuild directoryを別に用意した場合、
% cvs co ruby % mkdir build; cd build % autoconf ../ruby/configure.in >configure; chmod +x configure % ./configure --srcdir=../ruby % make cd ../ruby && autoconf ...
てな感じで、Makefile自体srcdirにconfigureがあることを前提にしてるので、 強制してるというか。個人的にはこのtargetが大嫌いなんだけど。
config.status: $(srcdir)/configure $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in cd $(srcdir) && $(AUTOCONF)
おお、これは早速試さないと。と思ったが、
linux-2.4.17.tar.bz2 patch-2.4.18-pre3.bz2 preempt-kernel-rml-2.4.18-pre3-ingo-1.patch
という組み合わせではrejectしてまう。 .rejを見ても周りは全然存在しないコードだし。どうなってんだろう? カーネルのソースを取ってくるにも20MB以上じゃちょっとねえ。
あ、そうじゃなくてO(1) schedulerパッチもあてないといけないのか。 結局 これ をpre3にむりやりあてたらいけたようだ。
とりあえず無事に立ち上がった。今日一日使ってみよう。
海外からBadtrans.Bは初めてかも。 なぜかvirusは日本から、spamは海外からよく来る。
前回は詳しく書いてなかったので、そのあたりを。 以前、 簡単にクロスでmakeできなくなった と書いたが、 src/以下は普通の拡張ライブラリなので直接ここで作業すればいい。
% cd src; mkdir cygwin mingw % cd cygwin % i386-cygwin-ruby ../extconf.rb \ --with-db-prefix=/usr/local/cygwin-local/BerkeleyDB.3.3 \ --enable-test % make % upx *.so % make site-install % ../cd mingw % i386-mingw32-ruby ../extconf.rb \ --with-db-prefix=/usr/local/mingw/BerkeleyDB.3.3 \ --enable-test % make % upx *.so % make site-install
--enable-testをつけると-ldb4,-ldb3,-ldb2のテストをしなくなる。 単なる時間の節約にすぎないのでなくてもいい。 って、これは論理が逆だねえ。
defaultは--enable-testで、--disable-testで-ldbのみにするなら
--- src/extconf.rb.orig Sun Dec 9 01:08:43 2001 +++ src/extconf.rb Mon Jan 14 19:52:38 2002 @@ -11 +11 @@ -unless (!test && (have_library("db4", "db_version") || +unless (test != false && (have_library("db4", "db_version") ||
という手が考えられる。testがnilかtrueのときにはテストする。
PACKAGEとかVERSIONとか書くのが面倒になってきたので、 って一年も経っているのに今頃かよ、 P,V,Tでもいけるようにした。
ifneq ($(P),) PACKAGE=$(P) endif ifneq ($(V),) VERSION=$(V) endif ifneq ($(T),) TARGET=$(T) endif
これでこんな感じで短く書ける。
% cat ../bdb.contents DOC=Changes README.en bdb.html bdb.rd docs examples tests tests.diff % make -f ../Makefile.pack P=bdb V=0.2.8 T=i386-cygwin % make -f ../Makefile.pack P=bdb V=0.2.8 T=i386-mingw32
間違えてmake installしてしまわないように、 ターゲットを書き換えてしまうことにした。 どこで書き換えるのがいいかなと考えたが、 どうせi386-{cygwin,mingw32}-rubyを必ず使うので、 スクリプトがextconf.rbだったらMakefileをいじることにした。
case "$script" in *extconf.rb) ruby -pi~ -e 'sub /^(install:)/,"system-\\1"' Makefile;; esac
を追加した。
install: site-install
もMakefileに追加すればもっといいかもしれないが、 間違いに気づくだけで十分だ。
作ってみた。
% ruby -rdevel/which -e 'p which_library "gtk"' "/usr/local/lib/ruby/site_ruby/1.6/i386-linux/gtk.so"
どこにインストールしたっけなあってのを確認するために、 whereis_libraryなんてのもあるといいかも。
まだalpha versionではあるけど試してみた。 実際にドキュメントを埋め込んでなくても、 なかなか見事なClass browserとして使える。
net/smtp.rbを試したら無限ループしてるようだ。
install.rbを見ると
# 'Markup' will eventually be a separate package, but # for now we'll install it automatically Dir.chdir("markup") && system("ruby install.rb")
とあるが、markupが別になったらDir.chdirは例外になるからあまり意味はない。
それはそれとして、パッケージとしてまとめとこう。
という形式のメールが来た。自作fromがエラーになる。 sample/from.rbをちょっといじって使っているんだけど、
y = m = d = 0 y, m, d = parsedate(date) if date
でy, m, dのいずれもnilになっているらしい。 そのメールを見ると
DATE: 14 Ene 02 07:28:43 a.m.
となってて、こりゃparseできないだろうなと一目でわかる。 sample/from.rbを見るといつのまにか
y, m, d = parsedate(date) if date y ||= 0; m ||= 0; d ||= 0
となっていた。くー。
てゆか、spamなんだから、どうでもいいんだが。
7年ぐらい前にベータテスターをしていたのだった。懐しい。 それはそれとして fdsh ってのはなかなか興味深い存在だ。
%Rubyでyu-yanさんにちらっと仕組を教えてもらったが、よくわからなかった。 単にLoadLibraryということだけど、これの引数はファイル名。 ということは一時ファイルとしてWin32API.soをどこかに作るんだろうか? ソースが公開されるのを待とう。
あ、requireを静的な拡張ライブラリにするのはどう?という提案をしてみたけど、 本当にうまくいくかなあ。
もうめちゃくちゃだ。 0.26-1のCygwin版は このパッチ をあてたまま-DNATIVE_WIN32したgtk.soだった。 これじゃ全く意味がない。 Mark Slagellさんに指摘されるまで気づかなかった。 やはりクロスでやってると確認が甘くなるな。
MinGW版のほうはWindows 98で
-e:1:in 'require': 1157: One of the library files needed to run this application cannot be found. - C:/SITE/RUBYM/USR/LOCAL/lib/ruby/site_ruby/1.6/i386-mingw32/gtk.so (LoadError)
となるらしい。Windows 2000では正常という話で、単に長さの問題? メッセージの通りDLLが1個足りないという気もしないでもないが。
それとまだ中身は0.25じゃないかと問われてしまった。 前回は明かにタイムスタンプが8月だったので、 0.25に違いないと思ったけど、今回は間違いないはず。 なにしろちゃんとSEGVするんだから *1。
どうすればバージョンがわかるのか
% grep -i version **/*.[ch]
してみた。するとsrc/rbgtkconst.cには
#define RBGTK_MAJOR_VERSION 0 #define RBGTK_MINOR_VERSION 2 #define RBGTK_MICRO_VERSION 5
とある。え?俺のせいじゃないよ、こりゃ。
% LD_LIBRARY_PATH=. ruby -v -rgtk -e 'p Gtk::BINDING_VERSION' ruby 1.6.6 (2001-12-26) [i386-linux] [0, 2, 5]
Copyright問題と似たようなもんか。
#define RBGTK_MICRO_VERSION 6
に変更して0.26-2を出そう。
とかなんとかやってると、最新のRuby 1.6.6では上記のエラーになったりで、 こういうときは速いマシンが欲しくなるな。
あれ?ruby-devにこの件でメール出したのに届いてない? 7時頃返ってきた。8時間もかかってる。
whereis_libraryが入った。ありがとうgotokenさん。
新しいインストーラはVC++に決まったようだが、 それに入れて欲しいパッケージがあったら ここ へ行こう。
とりあえず、その結果を尊重してこっちも作ろう。
今日からtouch & goなのだ。定期入れの真ん中にしまいこんだ。
eval %qPprint eval %-eval %:'Just another Ruby hacker,' :-P
が1.6.6ではエラーになる。
* parse.y (yylex): disallow alpha-numeric and mbchar for terminator of %string.
最後の:-Pが肝なので別解を考えよう。
まずはhtml-parserだ。
結構サイズが大きいんだなあ。
XML関連が多いね。まずは簡単なこの3つのパッケージを作成。
1.0.0になったね。
リニューアルしたはいいがSubjectがなんか変じゃない? たとえば[rubyist:1015]はこんな感じになってる。
Subject: [rubyist:1015] Re: $B<!4|%j%j!<%9$K8~$1$F:#8e(B
FreeMLのシステムの問題だと思うけど、これはdecodeすると
Subject: [rubyist:1015] R e: 次期リリースに向けて今後
となる(nkf -mの結果)。なぜにRとe:に分割する? しかもe:の後に無意味な^Mがあるし。 というか要らんとこまでencodeしてるし。 このencodeのしかたはOutlookよりひどいな。
どうもFreeMLは好きになれない。
[rubyist:1023]がRe:だけになってしまったのも、これが原因か?
net/smtp.rbもちゃんとparseできるようになった。
Alpha-8 is necessary because of a serious bug in -7 which caused looping when parsing some method parameter lists.
今日も一日rimのメールは遅れ気味だった。今度はなにが原因?
オージス総研から「!広告!」メールが来た。 会社のメールアドレス宛てだったから、ObjectDay2001かな。
cygwin ML で検索すると、 objdump -pの出力結果をフィルタリングしたシェルスクリプトが見つかった。 やってることは再帰的に
% objdump -p foo.exe | grep 'DLL Name'
してDLLを見つけ、whichするようなもんかな。
Linuxでは、というかglibc 2.2.3からlddはシェルスクリプトになってる模様。
% sh -x ldd =ruby
してみると最終的には
% LD_TRACE_LOADED_OBJECTS=1 \ LD_WARN= \ LD_BIND_NOW= \ LD_LIBRARY_VERSION=6 \ LD_VERBOSE= \ /usr/local/bin/ruby
を実行しているだけのように見える。 いや実際にこの通り環境変数を設定してruby自体を実行すると、 lddでお馴染の結果が得られるわけだが、 こんな仕組みになっていたなんて全然知らなかった。
% LD_TRACE_LOADED_OBJECTS=1 ruby libruby.so.1.6.6 => /usr/local/lib/libruby.so.1.6.6 (0x4001a000) libdl.so.2 => /lib/libdl.so.2 (0x400c2000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x400c5000) libm.so.6 => /lib/libm.so.6 (0x400f2000) libc.so.6 => /lib/libc.so.6 (0x40115000) libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x4022c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
更新。Changes:
* stupid bug with free() * added -R for Solaris 2 (Thanks Amos Gouaux <amos+ruby@utdallas.edu>)
HomepageもDownloadも
e-mail me with request
なんだけど、提供する場所を持ってないということなんだろうか? そういえばいきなりバイナリをruby-talkへ投げたやつが以前いたな。 同一人物だよ 。
パッケージは作らないほうがよさそうだ。メールを出すのも面倒だし。
3日も経ってからってちょっと報告が遅いんじゃない?
やっと来た。結構時間がかかったな。こんなに分厚いとは思わなかった。 600ページほど。
RubyでBEGINとENDが使えるようになって随分経つが、
BEGIN do ... end END do ... end
はいつの間にかエラーになってる。 採用された当初はできたと思うんだけど夢だったんだろうか? でもこうして並べてみるとBEGINとEndとendは確かになんか変だ。
do end派としては残念だ。
mkmf.rbが
{$(srcdir)}.c.#{$OBJEXT}: $(CC) $(CFLAGS) -I$(<D) $(CPPFLAGS) -c $(<:/=\\)
こうなってるので、win32ole.cは必要ない。助田さんに頼むのがいいのかな。
win32ole.o : $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h
でいいんだよね。
荒技としてはmkmf.rbでMakefileにコピーする際削除してしまうとか。
line.gsub!(/[^\s]+\.(cc|cpp|cxx|c|C)\s*/, '')
をwhile loopの最初に入れる。うーむ。
というか律義にdependを作らなくてもいい気もする。
どうせ毎日見てるのでsubscribeしてみた。
・ voting is open until end of the day Friday, and then I'm going to start adding them up.
ということなので日本時間では今日締め切られる予定。 03:00 JST現在これだけ。*はすでにRuby Binariesでパッケージング済みのもの。 PostgreSQL/RubyはRuby/PostgreSQLの間違いと思われるので消した。
ActiveScriptRuby, ArunaDB, AspectR, *BDB, *eruby, FXRuby, *html-parser, IOWA, irb-tools, *Lapidary, *Log4r, mysql-ruby, *NArray, *NQXML, *OptionParser, Pickaxe Book, RbWrap, *RDoc, *REXML, *ri, Rubicon, RubyCOM, Ruby DBI, *Ruby/GDLib, RubyGL, *Ruby/GTK, Ruby-MCrypt, RubyMock, Ruby/ODBC, Ruby/PostgreSQL, *Ruby/Tk, *RubyUnit, *ruby-zlib, rudl, SOAP4R, *vruby/swin, *WEBrick, *Win32OLE, *XMLParser, xmlrpc4r
こうして見ると、XML, HTML, Database, GUI, UnitTestが目につく。
とりあえずなんだかわからんRubyMockあたりを RAA で調べておくか。 これもRubyUnitがらみらしい。
といいつつも、次はSOAP4Rにしよう。
更新。ChangeLog:
* runit/testfailure.rb: correct not to occure warning message with ruby -w. (Thanks to David Alan Black)
Cygwinは/etc/hostsを見ません。そこはWindowsと同じ。 BINDでも入れて-lresolvすればUnixと同じだけど、 そんなことする人はもういないだろうなあ。
kernel.orgが今トラブってるらしいが、 その前に2.4.18-pre4はダウンロードしておいた。 makeしてinstallしてみると。
find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia if [ -r System.map ]; then /sbin/depmod -ae -F System.map \ 2.4.18-pre4; fi depmod: *** Unresolved symbols in \ /lib/modules/2.4.18-pre4/kernel/fs/minix/minix.o depmod: waitfor_one_page
てな感じだ。 grep waitfor_one_page **/*.[ch]してみるとなくなったわけではない。 patchをgrepしたらわかった。
-EXPORT_SYMBOL(waitfor_one_page);
が原因だ。exportするのをやめたらしい。 これじゃminixとかext2をモジュールにできない。 よくわからんが、こいつを元に戻して、例によってO(1)+preemptもあてて、 勝手にEXTRAVERSIONを書き換えて更新。
% uname -r 2.4.18-pre4-sched-O1-H6-preempt
setup.exeでwarningになると%Rubyに話題になってる模様。 IRCはlogをダイアルアップ時に取ってきてたまに見るだけなので、 ここに書いておこう。
grep warning: *.ccしてみると、どうも
usr/local/doc/ruby/log4r-1.0.0/doc/rdoc/classes/Log4r/FileOutputter usr/local/doc/ruby/log4r-1.0.0/doc/rdoc/classes/Log4r/FileOutputter.src
の存在がいけない感じ。 FileOutputterをCreateDirectoryした後にFileOutputter.srcをCreateDirectoryすると、 なぜかERROR_ALREADY_EXISTSになってしまう。 でもここだけ抜き出してテストプログラムを書くとちゃんとうまくいくし。 うーむ。setup.exeのバグとしか思えないんだけどよくわからない。
早速SOAP4R 1.4.2をダウンロードしてみたわけだが、 uriがredistにあるんだよね。 つい先日1.6にuriはaddされたわけで、どうしよう? 1.6.7が出てからにしようかな。 てゆか1.6.7はどうなったんだ?
In version 1.0.4, you'll be able to use symlinks in the parameter list to a win32 program.
ってどうやって実現するんだろう?
今頃になって4.0.4にした。
zshってpartial completionも使えるのか。
% ls /u/l/l/r/1.6/<TAB>
とすれば
% ls /usr/local/lib/ruby/1.6/
となる。
i386-cygwin-rubyとかi386-mingw32-rubyとかこの日記にはたびたび出てくるけど、 その実体は現在こうなっている。
/usr/local/bin/fake-ruby:
#!/bin/sh RUBY_PLATFORM=$(expr $0 : '.*/\(i386-[^-/]*\)') \ exec /usr/local/bin/ruby -rfake "$@"
/usr/local/lib/ruby/site_ruby/fake.rb:
class Object platform = ENV['RUBY_PLATFORM'] or raise 'Set RUBY_PLATFORM' version = ENV['RUBY_VERSION'] || RUBY_VERSION dist = ENV['RUBY_DIST'] destdir = File.join((dist || File.expand_path('~/dist')), platform) $:.collect! do |x| x.sub! /^\/usr/, destdir+'/usr' x.sub! Regexp.quote(RUBY_PLATFORM), platform x.sub! /\d+\.\d+/, version[/\d+\.\d+/] x end remove_const :RUBY_PLATFORM RUBY_PLATFORM = platform if defined? PLATFORM remove_const :PLATFORM PLATFORM = platform end remove_const :RUBY_VERSION RUBY_VERSION = version if defined? VERSION remove_const :VERSION VERSION = version end CROSS_COMPILING = true ENV['PATH'] = File.join(destdir, 'usr/local/bin') + ':' + ENV['PATH'] END { if /\bextconf\.rb\b/ =~ $0 and File.exist?('Makefile') ARGV.replace ['Makefile'] $-i = '~' while line = gets print line.sub(/^(install:)/, 'system-\1') end print "\nexport PATH:=#{ENV['PATH']}\n" end } end
fake_TARGET.rb では-sでグローバル変数を介して情報を渡していたが、 全部環境変数に変更した。仕上げに
% ln -s /usr/local/bin/fake-ruby /usr/local/bin/i386-cygwin-ruby % ln -s /usr/local/bin/fake-ruby /usr/local/bin/i386-mingw32-ruby % ln -s /usr/local/bin/fake-ruby /usr/local/bin/i386-msdosdjgpp-ruby
としてある。fake.rbのPATHは
% ln -s /usr/local/bin/fake-ruby ~/dist/i386-cygwin/usr/local/bin/ruby % ln -s /usr/local/bin/fake-ruby ~/dist/i386-mingw32/usr/local/bin/ruby % ln -s /usr/local/bin/fake-ruby ~/dist/i386-msdosdjgpp/usr/local/bin/ruby
のため。 fake-rubyの
RUBY_PLATFORM=$(expr $0 : '.*/\(i386-[^-/]*\)') \
が肝だ。 ディレクトリやコマンド名にそのままプラットフォームを含めているのはそのため。
本当はexprを使わずにi386-*を抜き出したいところではある。 ~/distを考えなければ
name=${0##*/} RUBY_PLATFORM=${name%-ruby}
でいいんだけど。exprと逆に取り除く方向なので難しい。
x=${0%/usr/local/bin/ruby} target=${x##*/} RUBY_PLATFORM=${target%-ruby}
という手はあるなあ。Rubyで書くとこれだけの話ではあるが。
#!/usr/local/bin/ruby ENV['RUBY_PLATFORM'] = $0[/i386-[^-\/]+/] exec '/usr/local/bin/ruby', '-rfake', *ARGV
GNU makeはMakefileに
export PATH:=/some/where/bin:$(PATH)
と書ける。位置はどこでもいい。 $-i = '~'を使っているため最初に入れるのが面倒だから最後に入っている。
print "\nexport PATH:=#{ENV['PATH']}\n"
の最初の"\n"はWin32OLEのため。なぜかdependに改行がなかった。 でも0.3.3-01でうまい具合にdependは更新されて改行がついたので、 もう"\n"はなくてもいいかも。 これでMakefileに直接rubyと書いてあっても、 ~/dist以下のrubyが起動されるため、 いちいちMakefileを書き換えたりRUBY=とかmakeの引数で渡す必要がなくなる。
ついでにbashだけでbasename, dirnameを書くとこうなる。
$ a=/usr/local/bin/ruby $ echo ${a##*/} ruby $ echo ${a%/*} /usr/local/bin
bashに限らず最近のshなら使えると思うけど。zshとかkshとかashとか。
Cygwinのwgetがなかなか1.8に上がらないのは、 1.8だと:portをそのままファイル名にしてしまうかららしい。
freshmeat newsletterでCygwin 1.3.7が出たことを知る。 明日試そう。
なんとなく
% ruby -<TAB>
してみるとちゃんと出てくる。
--copyright -- copyright notice --debug -- debug mode --help -- print help message --verbose -- verbose mode --version -- print version --yydebug -- compiler debug mode <以下省略>
早速/usr/local/share/zsh/4.0.4/functions/_rubyを見てみると最後に libraryがどうのこうのとある。ってことは
% ruby -r<TAG>
で出るのか?出るね。 CWDにいっぱいファイルがあるとそれも出てくるから.rbと.soに限定したいところだ。 _perl_modulesぐらいのことはしないと駄目かな。
ついでにdiet libcでashをmakeしてみた。 ソースはcygwinのものを使用。 パッチ 。
% patch -p1 </some/where/ash-20011018-1-diet.diff % ./configure % make CFLAGS='-D__DIET_LIBC__ -D_BSD_SOURCE -Os' \ CC='diet gcc' CC_BUILD='diet gcc' % sudo cp sh-new /bin/ash