Just another Ruby porter,

〜2001年2月下旬〜


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

2001-02-21 (Wed)

RCR

Ruby Change Requestの略らしい。

gcc-2.95.2-7

とうとう削除されてしまった。 -mno-win32がデフォルトってのはちょっと無理があるのかも。

JARH

raise 'Just another Ruby hacker,' rescue print $!

2001-02-22 (Thu)

JARHとはなにか?

Just another Ruby hacker,
と表示するスクリプトをいう。 最後に改行は入らないのが望ましい。 自分の美意識の範囲内で短めのスクリプトとする。 mailのsignatureの前あたりにさりげなく置いたりする。 と勝手に定義してみたがどう?

printいろいろ

JARHで思い出したが、Rubyには標準出力へ表示する方法がどれだけあるんだろう? print, printf, writeとか、明示的に$stdout, STDOUT, $>とか、<<もある。 displayもあるね。各々sendもあるか。__send__は…、やめとこう。
思いつくままに並べてみる。
print 'Just another Ruby hacker,'
printf 'Just another Ruby hacker,'
$stdout.print 'Just another Ruby hacker,'
$stdout.send :print, 'Just another Ruby hacker,'
$stdout.printf 'Just another Ruby hacker,'
$stdout.send :printf, 'Just another Ruby hacker,'
$stdout.write 'Just another Ruby hacker,'
$stdout.send :write, 'Just another Ruby hacker,'
$stdout << 'Just another Ruby hacker,'
$stdout.send :<<, 'Just another Ruby hacker,'
STDOUT.print 'Just another Ruby hacker,'
STDOUT.send :print, 'Just another Ruby hacker,'
STDOUT.printf 'Just another Ruby hacker,'
STDOUT.send :printf, 'Just another Ruby hacker,'
STDOUT.write 'Just another Ruby hacker,'
STDOUT.send :write, 'Just another Ruby hacker,'
STDOUT << 'Just another Ruby hacker,'
STDOUT.send :<<, 'Just another Ruby hacker,'
$>.print 'Just another Ruby hacker,'
$>.send :print, 'Just another Ruby hacker,'
$>.printf 'Just another Ruby hacker,'
$>.send :printf, 'Just another Ruby hacker,'
$>.write 'Just another Ruby hacker,'
$>.send :write, 'Just another Ruby hacker,'
$> << 'Just another Ruby hacker,'
$>.send :<<, 'Just another Ruby hacker,'
'Just another Ruby hacker,'.display
'Just another Ruby hacker,'.send :display
あ、syswriteもあるな。それと$>の別名の$defoutとか。 printfに関しては第1引数にIOを指定することもできる。 もちろんちゃんと%sを使うのもありだ。
printf $stdout, '%s', 'Just another Ruby hacker,'
sendをsendをsendをsendをsendしてもいい。
$stdout.send :send, :send, :send, :send, :print, 'Just another Ruby hacker,'
要するに切りがない。

JARH

print File.basename '~/Just another Ruby hacker,.rb','.*'

2001-02-23 (Fri)

Cygwinのsymlink

Cygwinで
% ln -s ../../i686-pc-cygwin/2.95.2-7/cc1 .
すると
% c:/usr/local/bin/ruby -ve 'p $<.read' cc1
ruby 1.6.3 (2001-02-20) [i386-mingw32]
"!<symlink>../../i686-pc-cygwin/2.95.2-7/cc1\000"
という内容のファイルを作る。 中を見なくてもsymlinkかどうかを速く判断できるようにシステム属性もつける。 この実行例を見てもわかるように、 Cygwin以外のアプリケーションにとっては システム属性のついた普通のファイルにすぎない。 さすがにそれじゃ使い辛いとやっと思ったのか、 Windowsのショートカットを利用することになったらしい *1。というかCVSではもうすでにそうなってる。 試してみるとなかなか面白い。 ソースを見ると実装も簡単そうな気もするし、 bmingwはCygwinのそういうとこ *2をサポートするのもよさそうだな。
*1: U/WINは元々そうなってるそうだ。
*2: つまりmountとsymlink。

JARH

proc{|x|x['Just another Ruby hacker,']}[proc{|x|print x}]

2001-02-24 (Sat)

myrename

Cygwinのをほとんどそのままパクってきたのだが、 syscall_printfはstrace用だから残しちゃだめだよ。

Message-Id

SugHimsiさんへのリプライメールのスレッドがつながらない。 ちと調べてみると
Message-Id: <20010223062911.061E.MAILI31S@clio.ne.jp >
というように>の前に空白が入っている。ってRFC的にはこれってあり? とりあえずcmail-thread.elの
"<[^\033 >]+>"
"<[^\033>]+>"
にしてつなげてみた。

ほんパラ!関口堂書店

今週のベストセラーを紹介するコーナーがどうも昔見たCX深夜の 「マーケティング天国」とダブる。 声の調子まで似てる。似てるはずだ。城ケ崎祐子本人だし。 あ、フリーになったのか。

JARH

method(:print)['Just another Ruby hacker,']

2001-02-25 (Sun)

SameGame

RAAにRubySameGameが登録された。作者は日本人じゃないけどやっぱあれか? やってみればわかるか。
% ruby same.rb
same.rb:9:in `require': No such file to load -- gtk (LoadError)
        from same.rb:9
がーん。 mingwだcygwinだと作ったが、 おいらはLinux上にインストールしたことがなかったのか。 そういえば一年程前にディスククラッシュして、 Linux自体を再インストールしてからRuby/GTKを入れてないかも。 あ、そうじゃなくて1.6にしてからは入れてないのか。
% ruby-1.5.4 same.rb
same.rb:414:in `makePixmap': uninitialized constant Game::GdkImlib (NameError)
<後略>
今度はimlibか。やっぱgnome-ruby 0.24をインストールしよう。 ってことはmingw版もimlibをなんとかしといたほうがいいのかな。
で、gnome-rubyをインストールしてもう一度実行してみると
% ruby same.rb
same.rb:414:in `makePixmap': uninitialized constant Game::GdkImlib (NameError)
何も変わってない。そういえばimlibって独立したんだよね。

require 'gtk'

の変わりに

require 'gdk_imlib'

にしてみた。 これで一応初期画面が拝めたわけだが、 なんかすごいbusy waitでクリックしてもどーにもならない。 さめがめだということはわかったからよしとしよう。

rename

あれはCygwinからパクってきたと 昨日書いたが、ってことはerrnoが正しくないのはCygwinも同じじゃん。 まいったね。rb_file_s_rename()に入れるしかないか。 とりあえずそれでcommitして、rename()の件はcygwin-jpn MLに報告した。

Cマガプログラミング期末試験

答えられそうなC,Perl,Rubyをやってみたが、Rubyが一番難しかったと思う。 それぞれ83点,98点,94点だった。Perlが一番得意らしい。

_ Perl:

Perlの問25はどっちも同じ意味である。 とあるjperlユーザが2年程前においらに質問してきて調べたから覚えているのさ。 てゆうか解答はどっちも(2)になっていてこれじゃ正解がわからんと思うのだが。

_ Ruby:

Rubyの問17と問22はどう考えても解答のほうが間違ってる。 いや実行してみれば一目瞭然ではある。 結構高得点なのはJARHを作るのに頻繁にリファレンスマニュアルを見てるせいか?

JARH

print ''.replace 'Just another Ruby hacker,'

2001-02-26 (Mon)

ri

これは便利だ。早速インストールしよう。
--- install.rb.orig	Sun Feb 25 15:13:47 2001
+++ install.rb	Mon Feb 26 00:50:06 2001
@@ -45,3 +45,3 @@
 opfile = "ri"
-opfile = "ri.rb" if CONFIG["target_os"] =~ /win/
+opfile = "ri.rb" if CONFIG["target_os"] =~ /win|mingw|djgpp/
 File::install("ri", File.join($bindir, opfile), 0755, true)
ri.rbにしといたほうがよさそう。というよりri.contentsの都合上こうしとく。
% i386-cygwin-ruby install.rb
% cat >../ri.contents
DOC=COPYING ChangeLog README
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/ri \
usr/local/bin/ri.rb
% make -f ../Makefile.pack PACKAGE=ri VERSION=0.2 TARGET=i386-cygwin
% i386-mingw32-ruby install.rb
% make -f ../Makefile.pack PACKAGE=ri VERSION=0.2 TARGET=i386-mingw32
% i386-msdosdjgpp-ruby install.rb
% make -f ../Makefile.pack PACKAGE=ri VERSION=0.2 TARGET=i386-msdosdjgpp
と思ったがターゲットに依存するものはないのでsymlinkにしよう。 あ、ri.rbの#!は/usr/local/bin/rubyに変更。

gcc for WinCE

SH3用もMIPS用もある。

JARH

とりあえず2年前に作ったものを置いとこう。 先頭に;がついてるものが発表したもの、その他が未発表のもの(たぶん)。 今だとmarshalはまずいし、filterもcollect!にしないとね。 あ、以前は正式名称がrubyだったので最初のほうはRubyじゃなくてrubyになってる。

2001-02-27 (Tue)

kakasi 2.3.3

というわけでkakasiだ。まずはi386-mingw32で。 てゆうかkakasi-2.3.3.zipがあるんだから、 わざわざクロスでmakeすることもないんだが。

_ i386-mingw32:

% CC='i686-pc-cygwin-gcc -bmingw' \
  CFLAGS=-Os \
  AR=i686-pc-cygwin-ar \
  NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \
  RANLIB=i686-pc-cygwin-ranlib \
  ./configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/mingw
% make
<途中略>
if test -f kakasidict; then \
    ITAIJIDICT="itaijidict" src/mkkanwa.exe kanwadict kakasidict; \
fi
/bin/sh: src/mkkanwa.exe: cannot execute binary file
そっか。 Linux版もあるわけだからそっちで実行してもいいけどwineにやらせてみよう。
% ITAIJIDICT="itaijidict" wine -- src/mkkanwa.exe kanwadict kakasidict
これだとkanwadicが/usr/local/mingw/share/kakasi/kanwadicになってしまうので、
% make datadir=/usr/local/share
しなおした。
% sudo make datadir=/usr/local/share install

_ binfmt_misc:

どうせなら自動的にwineを起動してしまう設定にしてみよう。 例は/usr/src/linux/Documentation/binfmt_misc.txtにある。
% su
Password: 
# insmod binfmt_misc
Using /lib/modules/2.2.18/fs/binfmt_misc.o
# echo ':DOSWin:M::MZ::/usr/local/bin/wine:' >/proc/sys/fs/binfmt_misc/register
この設定でmakeしなおしてみる。見事に最後まで通る。面白い。 rebootしたら当然のことながらまた設定が必要なので、 常に使いたいときは/etc/rc*あたりに書いとくのがいいだろう。

_ i386-cygwin:

% CC=i686-pc-cygwin-gcc \
  CFLAGS=-Os \
  AR=i686-pc-cygwin-ar \
  NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \
  RANLIB=i686-pc-cygwin-ranlib \
  ./configure \
  --target=i686-pccygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/cygwin-local
% make datadir=/usr/local/share
% sudo make datadir=/usr/local/share install

kakasi 000124

準備OK。

_ i386-mingw32:

% mkdir mingw cygwin
% cd mingw
% i386-mingw32-ruby ../extconf.rb
うーむ。ちょっと具合が悪い。軽く修正。
--- extconf.rb.orig	Wed Jul 28 15:46:02 1999
+++ extconf.rb	Tue Feb 27 01:11:24 2001
@@ -2,4 +2,7 @@
 
-$CFLAGS += " -I /usr/local/include "
-$LOCAL_LIBS += " -L /usr/local/lib -lkakasi "
-create_makefile("kakasi")
+#$CFLAGS += " -I /usr/local/include "
+#$LOCAL_LIBS += " -L /usr/local/lib -lkakasi "
+dir_config("kakasi")
+if have_library("kakasi", nil)
+  create_makefile("kakasi")
+end
あとはいつもと同じ。
% i386-mingw32-ruby ../extconf.rb
% make
% upx kakasi.so
% make site-install

_ i386-cygwin:

% cd ../cygwin
% i386-cygwin-ruby ../extconf.rb
% make
% upx kakasi.so
% make site-install

_ package:

% cd ..
% cat >../kakasi.contents
DOC=ChangeLog MANIFEST README* test.rb wdcnt*
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/$(TARGET)/kakasi.so \
usr/local/share/kakasi/kanwadict \
usr/local/share/kakasi/itaijidict
% make -f ../Makefile.pack PACKAGE=kakasi VERSION=000124 TARGET=i386-mingw32
% make -f ../Makefile.pack PACKAGE=kakasi VERSION=000124 TARGET=i386-cygwin

EINVAL

困ったことにCygwin版で
Invalid argument - "connect(2)" (Errno::EINVAL)
というエラーが多発してるようなんだけど、なぜに? なんかWindows 2000という場合が多いようだけど、 会社の新しいVAIOのWindows 2000でも再現しない。

ri 0.3

インストールされる場所が変更になった。ri.contentsを更新。
% cat ../ri.contents
DOC=COPYING ChangeLog README
CONTENTS=usr/local/lib/ruby/site_ruby/ri \
usr/local/bin/ri.rb

jarh.rb

aliasでcollect!にしてみたが、 rescueのとこは1.6以上じゃないとparse errorになるからあまり意味ないね。 というわけで、1.6以上必須にしよう。
% ruby jarh.rb|tr , '\n'|wc
    109     436    2725
お、いつのまにか100を越えてるのか。

予告JARH

今日はinstance_evalを使ったので明日はmodule_evalに違いない。

JARH

instance_eval do print 'Just another Ruby hacker,' end

2001-02-28 (Wed)

リファレンスマニュアル

% gzip -dc ruby162-refm.rd.gz | rd2 -r rd/rd2man-lib -o rubyrefm
% mv rubyrefm.1 ~/man/man1
% man rubyrefm
して気づいたんだけど、 なぜかコマンドラインオプションの次にThreadがいきなり出てくる。 これは--debugの説明でThreadクラスの話が出てくるから mapがそうなっちゃうのか。

freecom

新しすぎが原因かと思ったが、そういう問題じゃないようだ。 なにしろprimaryのDNSが反応しないし。逆引きできないとつらい。

_stat()

Win98とLinux sambaで実験してみた。msvcrt.dll使用。
#include <stdio.h>
#include <sys/stat.h>

s(char *path)
{
    struct _stat buf;
    printf("%s: %d\n", path, _stat(path, &buf));
}

main()
{
    s("//ruby/pub");
    s("//ruby/pub/");
    s("//ruby/pub\\");
    s("//ruby/pub/ruby");
    s("//ruby/pub/ruby/");
    s("//ruby/pub/ruby\\");

    s("\\\\ruby\\pub");
    s("\\\\ruby\\pub\\");
    s("\\\\ruby\\pub\\");
    s("\\\\ruby\\pub\\ruby");
    s("\\\\ruby\\pub\\ruby\\");
    s("\\\\ruby\\pub\\ruby\\");
}
結果はこうなる。
//ruby/pub: -1
//ruby/pub/: -1
//ruby/pub\: -1
//ruby/pub/ruby: 0
//ruby/pub/ruby/: -1
//ruby/pub/ruby\: -1
\\ruby\pub: -1
\\ruby\pub\: 0
\\ruby\pub\: 0
\\ruby\pub\ruby: 0
\\ruby\pub\ruby\: -1
\\ruby\pub\ruby\: -1
うーむ。また困った結果だ。 明日会社のWinNT/2kでもう一度確認してみよう。

JARH

Kernel.module_eval do print 'Just another Ruby hacker,' end

<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!