Just another Ruby porter,

〜2003年1月上旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2003-01-01 (Wed)

12月のspam

391通。このあたりで落ち着いたか?韓国から85通。

[Linux] OpenSSL 0.9.7

今年の年越しmakeはOpenSSLだった。 OpenSSLは

% objdump -p /usr/local/ssl/lib/libssl.so.0.9.6|grep SONAME
  SONAME      libssl.so.0.9.6

なので、0.9.7を使いたければリンクしなおす必要あり。

OpenSSHをmakeしなおしてみよう。ちなみにOpenSSHの場合は同じ0.9.6でも

OpenSSL version mismatch. Built against 90607f, you have 906080

のようにコンパイル時に埋め込んでしまうため、 共有ライブラリの名前が変わらないようなupdateのときは注意が必要。

[Ruby] Ruby 1.6

とりあえずみんないじり始めたので、残務をかたづけよう。


2003-01-02 (Thu)

[Ruby] LIBRUBY_SO(1)

makeなら知ってるからmakeでLIBRBUY_SOを展開させるわけやね。 うまいな。でも./config.status --recheckがちょっといやだな。

config.h: config.status
        ./config.status --recheck

だとconfigure直後のmakeで必ずrecheckがかかるから。 たぶん要らない気がする。

それとconfigureしなおすとconfig.hは初期状態に戻るので、 必ず更新される。 その後makeすればconfig.hに追加された状態に戻るが、 config.hは更新されているので全部リコンパイルとなる。 これは痛い。 ccacheを使ってればそれほど痛くないかもしれないけど。

というわけでLIBRUBY_SOをconfig.hで定義するのはちょっと無理な感じがする。 LIBRUBY_SOを参照しているのはruby.cだけなので、 libruby_so.hという別のファイルを作るのはどうだろう?

ruby.o: libruby_so.h

てな感じでWindows系はruby.cでこれをincludeする。 これならruby.cだけが依存するからまずまずかな。

[Ruby] LIBRUBY_SO(2)

要するにLIBRUBY_SOをどう伝えるかということなので、 だったら*.rcにでも埋め込んでしまうのはどうだろう? Windows系だけの話だし。リソースはよくわからないんだけど、

STRINGTABLE
BEGIN
  0 "#{$libruby_so}"
END

としてresource.rbを実行するとことろで

-libruby_so=$(LIBRUBY_SO) \

を追加する。あとはruby.cを

LoadString(0, 0, libpath, sizeof libpath);
GetModuleFileName(GetModuleHandle(libpath), libpath, sizeof libpath);

とでもすればいけそう。やってみる。あ、 いけた。

これは-DLIBRUBY_SO=が-libruby_so=になっただけとも言える。 でも、依存するものが少ないし、変更点も少ないし、 新たにファイルを作るわけでもないので、 いいかもしれない。


2003-01-03 (Fri)

[Ruby] SWin 030101

更新。

[Ruby] VRuby 030101

更新。インストーラがクロスの環境じゃ動かなくなってしまったので、

% mkdir lib
% mv vr lib
% i386-cygwin-ruby -rmkmf -e 'create_makefile("vr")'
% make site-install

とした。結構 役に立ってるようだ。

[Ruby] --enable-shared

/etc/ld.so.confを確認してldconfigしないとだめです。 LD_RUN_PATHという手もありますが。


2003-01-04 (Sat)

[Vim] syntax=rubyでのコメント行で"o"コマンド

Vim6のruby modeはdefaultでコメント行でoすると勝手に"# "が頭につく。 自分の行動パターン的にはそこにはスクリプトを書くことが多いというより、 空行を入れるかもといったところだ。いずれにしても余計なお世話だ。 調べてみると$VIMRUNTIME/ftplugin/ruby.vimに

" Set 'formatoptions' to break comment lines but not other lines, and insert
" the comment leader when hitting <CR> or using "o".
setlocal fo-=t fo+=croql

とあった。これが怪しい。:help 'fo'してみるとdefaultはtcqらしい。 tは引かれてcroqlが足されるから最終的にはcroqlか? CTRL-^してfo-tableを見ると

o       Automatically insert the current comment leader after hitting 'o' or
        'O' in Normal mode.

とあった。これだな。setlocal fo-=oでやめさせればいいわけだ。 どうせなら~/.vim/ftplugin/ruby.vimを作ってここで設定しよう。 あ、これを作ると$VIMRUNTIMEのほうはloadされなくなるのか。 setlocal sw=2も入れとこう。

[Ruby] libsafe

libsafeをインストールして

% LD_PRELOAD=libsafe.so.2.0.16 make test

で実行してみる。1.6も1.8も問題ないなあ。

% LD_PRELOAD=libsafe.so.2.0.16 ldd ./miniruby
        libsafe.so.2.0.16 => /lib/libsafe.so.2.0.16 (0x4001b000)
        libdl.so.2 => /lib/libdl.so.2 (0x40021000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40024000)
        libm.so.6 => /lib/libm.so.6 (0x40050000)
        libc.so.6 => /lib/libc.so.6 (0x40072000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

だからちゃんとpreloadもされてるよなあ。 glibc 2.3.1ってことは必然的にgcc 3.2以上だから、 うちとほとんど同じ環境のはずなんだけど。

[Ruby] oldname

human68kも動いてなかったし、winceも考えなくてもいいでしょう。 ぎゃっと叫ぶ人が出てきたときに考えれば。


2003-01-05 (Sun)

朝刊

02:23AM。なにか物音がするので玄関に行ってみると、新聞が来てた。はえー。

[Ruby] ext/extmk.rb; $mflags

GNU makeは

% make -n DESTDIR=/tmp install

とするとMAKEFLAGSに"-n -- DESTDIR=/tmp"とセットする。

% make -n DESTDIR=/tmp no-install

とすると、--make-flagsで

"$(MFLAGS)$(MAKEFLAGS) -n DESTDIR=$(DESTDIR)"

を渡しているから、各拡張ライブラリへのmakeへは

"-nn -- DESTDIR=/tmp -n DESTDIR=/tmp"

が最終的に渡る。 このままでは"--"があるため"-n"はターゲットになってしまう。 というわけで"--"を削除する。 ついでに同じものがいくつも出てくるのもなんだからuniqする。 で、順番も気になるのでオプションが前に来るようにしよう。

[Ruby] ext/extmk.rb; Enumerable#partition

$mflagsは最終的には

["INSTALL_PROG=install -c -m 0755",
 "INSTALL_DATA=install -c -m 0644",
 "MAKEDIRS=mkdir -p",
 "-nn",
 "DESTDIR=/tmp",
 "-n",
 "install"]

となっている。これは単純にsortはできないので、 Enumerable#partitionを使ってみよう。1.8だしね。

$mflags = $mflags.partition{|x| x[0] == ?-}.flatten!

で、オプションを前方に集められる。

["-nn",
 "-n",
 "INSTALL_PROG=install -c -m 0755",
 "INSTALL_DATA=install -c -m 0644",
 "MAKEDIRS=mkdir -p",
 "DESTDIR=/tmp",
 "install"]

[Ruby][Cygwin] $0

ext/extmk.rbで$0を設定するようになったが、Cygwinはなんか変だな。

% irb hoge.rb
hoge.rb(main):001:0> $0
=> "hoge"
hoge.rb(main):002:0> $0 = "foobar"
=> "foobar"
hoge.rb(main):003:0> $0
=> "foob"

と4文字で切れてしまう。あれ?最初から4文字か。と思ったら、irb/init.rbで

$0 = opt

と設定していた。代入すると4文字で切られちゃう感じだな。でもmakeすると

../ruby/ext/extmk.rb:74:in `load': No such file to load -- /home/wata (LoadError)

となるから、もっと設定されるときもあるようだ。うーむ。 set_arg0()をじっくり読もう。


2003-01-06 (Mon)

[Ruby] instruby.rb

include FileUtils::Verboseしてしまうと、cmpもverboseになるのが気になるなあ。

include FileUtils::NoWrite if $dryrun
module FileUtils
  @fileutils_output = STDOUT
  @fileutils_label = ''
end

Object.module_eval do
  [:ln_sf, :makedirs, :install].each do |method|
    define_method(method) do |*args|
      args.push :verbose
      FileUtils.send method, *args
    end
  end
end

としてmakelinkはln_sfにしちゃうとか。

[Ruby] @fileutils_label

@fileutils_labelの初期値が'fileutils.'だと、 one-linerでそれを表示したくないときに困る。 具体的にはlib/mkmf.rbのconfiguration()で使われてるftools.rbをfileutils.rbに単純に置き換えたとき。

INSTALL_PROG = $(RUBY) -rfileutils -e 'FileUtils.install ARGV[0], ARGV[1], 0755, :verbose'

これだと、

fileutils.install -c -m 0755 x y

という表示になってしまう。かといって

INSTALL_PROG = $(RUBY) -rfileutils -e 'include FileUtils;@fileutils_label="";install ARGV[0], ARGV[1], 0755, :verbose'

というのも苦しい。 実際はこの行が表示されるわけじゃないからいいのかもしれないが、 単純にfileutils.rb側を変えたほうがよさそうな気もする。

[Ruby] un.rb

長くなるとか、@のような文字は危ないかもしれないので、 runという名前のライブラリを考えてみた。 -runで実行できるようにわざとun.rbという名前で作る。

% ruby -run -e install -- -m 0755 x y
% ruby -run -e rm -- -f *.o
% ruby -run -e cp -- -p x y

のように普通のコマンドと同じように使える。 メタ文字も出てこないのでquoteする必要もない。

RM = $(RUBY) -run -e rm -- -vf
MAKEDIRS = $(RUBY) -run -e mkdir -- -vp
INSTALL_PROG = $(RUBY) -run -e install -- -vm 0755
INSTALL_DATA = $(RUBY) -run -e install -- -vm 0644

と定義できる。 [ruby-list:13912]の焼き直しにすぎないんだけど。


2003-01-07 (Tue)

[Ruby] 16KB制限

ruby-talkは16KB制限が入った。12月と1月のruby-talkを見てみたけど、 16KBに収まらないようなメールはやっぱ何か間違ってる。 ruby-devは差分が流れるから別だけど。

[Ruby] zip

% ruby -v -e 'p [1,2,3].zip([4,5,6]).map{|x,y| x+y}'
ruby 1.8.0 (2003-01-07) [i386-linux]
[5, 7, 9]

2003-01-08 (Wed)

[Ruby] Win32API.rb

なんだかんだで、 Win32API.rbを用意することになったが、 とりあえずgetch.rbとpoint.rbはそれなりに動くようになった。 が、肝心のregistry.rbは

% cat reg.rb
require 'registry'

Win32::Registry::HKEY_LOCAL_MACHINE.open(
  'SOFTWARE\Cygnus Solutions\Cygwin\Program Options') do |reg|
  p reg['c:\cygwin\usr\sbin\inetd.exe']
end
% ruby -I. reg.rb
./Win32API.rb:19:in `call': bignum too big to convert into `int' (RangeError)
        from ./Win32API.rb:29:in `call'
        from ./registry.rb:417:in `OpenKey'
        from ./registry.rb:525:in `open'
        from ./registry.rb:605:in `open'
        from reg.rb:4

となってしまう。本来なら

% ruby reg.rb 
"binmode tty ntsec"

と表示されるはずなんだけど。sym.cを見てみる。あ、NUM2LONGだからか。

  case 'L':
    ANY2L(args[i]) = DLNUM2LONG(argv[i]);
    PUSH_L(ftype);
    break;

NUM2ULONGにしてみる。先に進んだ。でも

./Win32API.rb:19:in `call': undefined method `to_ptr' for 0:Fixnum (NoMethodError)
        from ./Win32API.rb:19:in `call'
        from ./registry.rb:447:in `QueryValue'
        from ./registry.rb:665:in `read'
        from ./registry.rb:688:in `[]'
        from reg.rb:5
        from reg.rb:3:in `open'
        from ./registry.rb:605:in `open'
        from reg.rb:4

と次の関門が待っているのであった。今日はここまで。

Win32API wrapperは無謀だったか?


2003-01-09 (Thu)

[Web] .htaccess

Ruby Binariesの.htaccessにこれを加えてみた。

IndexOptions DescriptionWidth=* TrackModified
IndexOrderDefault Descending Date

defaultは新しい順のほうがよさそう。

Descriptionが古いままだなあ。list.rhtmlのほうを使うようにしないと。 名前も調べなおさないといけないのか。


2003-01-10 (Fri)

[Linux] WineとOpenwallパッチ

久し振りにwineを起動してみるとこけてしまった。

% wine -- ruby -v
err:virtual:map_image Standard load address for a Win32 program (0x00400000) not available - security-patched kernel ?
wine: could not load 'R:\ruby\mingw\ruby.exe' as Win32 binary

なるほど。 Openwallパッチが原因か。そういえば動的にon/offってできないんだ。

[Linux] Wineの速度

実際のところWineはどのくらいの実力があるのか計ってみた。 例によって違いがわかりやすい遅いP5 133MHzのLinux 2.4.20上で実行。

% TIMEFMT='%E real  %U user  %S sys  %P cpu'
% time wine --debugmsg err-all -- ./ruby -v
ruby 1.8.0 (2003-01-09) [i386-cygwin]
3.38s real  1.74s user  0.41s sys  63% cpu
% time ruby -v
ruby 1.8.0 (2003-01-09) [i386-linux]
0.49s real  0.46s user  0.05s sys  103% cpu

起動時間は3秒ぐらいだな。

% time wine --debugmsg err-all -- ./ruby ../ruby/sample/sieve.rb 1000000 >/dev/null
64.20s real  61.92s user  0.86s sys  97% cpu
% time ruby ../ruby/sample/sieve.rb 1000000 >/dev/null 
71.91s real  71.74s user  0.25s sys  100% cpu

うーむ。逆転してしまった。まじ?同じgcc 3.2なのに。 てゆか間にCygwinもあるんだよね。なにか間違ってる…。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!