Just another Ruby porter,

〜2001年1月中旬〜


<Older(,) | Newer(.)> | Recent(/)>> | RDF

2001-01-11 (Thu)

-mno-win32

Cygwin MLで-mno-win32をデフォルトにすべきかという議論が始まっている。

_ -mオプション:

gccの-mオプションは実際はcc1, cc1plusに渡すオプションで、 specsで勝手に増やすことはできないことは 三日前に書いたが、じゃあ、これはどこに定義されているのか?
% cd gcc-2.95.2-6/gcc/config/i386
% grep '"no-win32"' *.[ch]
cygwin.h:{ "no-win32",            -MASK_WIN32, "Don't set Windows defines" }, \
cygwin.hにあるSUBTARGET_SWITCHESというマクロだ。

_ -mwin32:

じゃ-mno-win32がデフォルトになったら今までの挙動はどうやって指定するのか? どうも-mwin32オプションを新設するらしい。

_ Ruby:

では実際-mno-win32だとmakeは通るのか? やってみたところWin32APIを除いて全部通った。 やはりCygwinのUNIX機能しか使ってないらしい。 でも-mno-win32がデフォルトになった暁にはどうやって判断しよう。 すべてに-mwin32をつけるのが簡単だが、 過渡期には-mwin32が使えない古い環境も考える必要がある。 configure.inに入れるのがいいかな。

_ ふたたびac_cv_foo:

configureを見てると
if test "$cross_compiling" = yes; then
ac_cv_sizeof_int=4
のような記述が気になる。intは4だからこのあたりはいいが
if test "$cross_compiling" = yes; then
ac_cv_sizeof_long_long=0
これはちょっといやな感じだ。 gccだから当然long longも使える。 でも使えないものとして扱われてしまう。 やっぱこういうところを手で最適化していかないとだめなんだなあ。
#if sizeof(long long) == 8
と書けないところが辛い。 その他 あたりも注意が必要だろう。

2001-01-12 (Fri)

CVS

ファイアウォールに阻まれてpserverにアクセスできない人ってどのくらいい るのだろう?

_ HTTP tunnel:

日経Linuxでsshの解説が前中後編と続いている。 ~/.ssh/configでProxyCommandを設定するというお話。 Perlで簡単なスクリプトを書いてProxyCommandとしているのだが、 その中にHTTP proxyに対して
CONNECT host:port HTTP/1.0
を送るという処理があった。 ふーむ。そうかこれがHTTP tunnelってやつか、なるほど。 このあとに
/^HTTP\/.+[\d.]+ 200/
にマッチするような文字が返ってくるのを待ち、 リレーするような感じのスクリプトだった。

_ telnet でテスト:

じゃ実験だ。 うちの会社のproxy serverはCONNECTメソッドを理解するのか?
% telnet http-proxy-host 8080
Connected to proxy.
Escape character is '^]'.
CONNECT xxx.rim.or.jp:22 HTTP/1.0

HTTP/1.0 200 OK

SSH-1.5-1.2.27
quit
Protocol mismatch.
Connection closed by foreign host.
おお、いけてる。

_ port forwarding:

rimnetは申請すればsshでログインできるホストを提供してくれる。 telnetもokなんだけど、sshが使えるならふつうsshを使うでしょ。 sshはOpenSSHの1.2が出るかどうかあたりのやつを使って、 SOCKS5をむりやりリンクするという方法で対応してたんだけど、 OpenSSHが新しくなってからなぜかsshではログインできるのに port forwardingができなくなってしまった。 これができないとrimnet上でCVSの作業しなきゃいけなくてちょっと不便だ *1。ちなみにport forwardingできてたときのsshのオプションはこんな感じ。
ssh -L 2401:cvs.netlab.co.jp:2401 -f xxx.rim.or.jp exec sleep 600
これでlocalhostのポート2401がcvs.netlab.co.jpのポート2401に転送される。 つまりpserverの指定でcvs.netlab.co.jpの代わりに localhostを指定すればいいわけだ。 ああ、今ならもちろんcvs.ruby-lang.orgだ。

_ ProxyCommand:

ここで~/.ssh/configのProxyCommandだ。これは
ProxyCommand  foo %h %p
のように書けば%h,%pは実際に接続するホストとポート番号が展開されて fooが実行される。fooは標準入出力でやりとりをするように書く。 つまりinetdから起動されるコマンドのように。 日経Linuxの2000.12号にPerlのスクリプトが載っているが、やってることは remoteからlocalへ、localからremoteへデータを単に転送するだけ。 あとは最初にCONNECTを送るとか、その応答を待つとかいう処理をすればいい。 selectを使っているけど、RubyならThreadだよね。 100行もあれば書けてしまうだろうと思ったら、 すでにCで書かれたものがあった。 connect.cをありがたく使わせてもらう。 ソースを見るとSOCKS5にも対応してる。 至れり尽くせりだ。
ProxyCommand  /usr/local/bin/connect -S socks5-proxy-host %h %p
が現在の設定。

_ sshなしでCVS:

HTTP tunnelでポート番号も指定できるならなんでもありじゃんって気がするんだけど、 じゃあ、たとえば/usr/local/bin/connectをinetd経由で動かすのはどうだろう? 2401番で
/usr/local/bin/connect -S socks5-proxy-host cvs.ruby-lang.org 2401
が動くようにすれば転送されるはずだ。 やってみると見事に動く。なるほどねえ。

_ CVSだけで:

ここまでくるとCVSにパッチをあててCONNECTメソッドの処理を入れたくなった。 てゆうか誰かがやってるに違いない。 cvs-1.11.http.diffに対処したものを置いとく。
:pserver;proxy=http-proxy-host;proxyport=8080:anonymous@cvs.ruby-lang.org:/ruby
とこんな感じでリポジトリを指定できる。

*1: とぼやいてたらwww.ruby-lang.orgのアカウントくれた。ありがとー。

2001-01-13 (Sat)

xdeltaをWin32で動かそう

xdeltaはバイナリ差分を取るプログラムだ。 Ruby Binariesにxdeltaで作った差分はあるけどcygwin版のxdelta.exeしか置いてない。 じゃmingwへ移植しよう。 xdeltaを作るにはglibとzlibが必要だ。 まずはそっちの移植から。 あ、今回はcross *1じゃなくてnativeだ。
*1: 以前失敗したらしい。

glib 1.2.8

ここらあたりからglib-1.2.8.tar.gzを取得。 win32版を使えばいいと思ったけど、 DLLにしたくないのでオリジナルを使うことにしよう。 *2

_ configure:

思考錯誤した結果configure時の環境変数、オプションはこんな感じ。
% CC='gcc -specs=specs.msvcrt -Zbmingw' \
  CFLAGS='-Os -DNATIVE_WIN32' \
  ./configure \
  --target=i386-mingw32 \
  --disable-threads \
  --with-threads=none \
  --prefix=/usr/local/mingw

_ make:

まずは一個目のエラー。
gmessages.c:55: conflicting types for `write'
で、該当の個所はここだ。
#undef write

static inline int
write (FILE       *fd,
       const char *buf,
       int         len)
{
  fwrite (buf, len, 1, fd);

  return len;
}
なんかとても変なことをしてる。 なんの意味があるのかわからないけど、とりあえず
#define write static_write
して逃げた。
二個目のエラー。testglibを作るときに_imp__hogehogeがundefinedに。 とすればどこかに__declspec(dllimport)があるはずだ。 glib.hにあったのでコメントアウトした。make cleanしてやりなおし。
またエラー。testgthread でgettimeofdayがundefined(gmain.c)。
#ifndef _MSC_VER
になっていたので
#if !defined _MSC_VER && !defined _WIN32
と変更。やっと最後まで通った。

_ make check:

できあがったからには一応make checkしたいよね。 やってみるとどうもstring-testで無限ループしてるようだ。 tests/string-test.cを見ると
#if !(defined (_MSC_VER) || defined (__LCC__))
というのがありこれが怪しそう。defined __MINGW32__を追加したら通った。
PASS: array-test
PASS: dirname-test
PASS: hash-test
PASS: list-test
PASS: node-test
PASS: relation-test
PASS: slist-test
PASS: string-test
PASS: strfunc-test
PASS: tree-test
PASS: type-test
===================
All 11 tests passed
===================

_ make install:

インストールしておしまい。

*2: へたにDLLにするとバイナリ互換がなくなったときが面倒。

zlib

ここからzlib-1.1.3.tar.gzを取ってきた。たぶん。一年前のことなので覚えてない。

_ configure:

autoconfを使っていないのでprefixは環境変数で与える。
% CC='gcc -specs=specs.msvcrt -Zbmingw' \
  prefix=/usr/local/mingw \
  ./configure
nt/Makefile.gcc を使うほうがいい気もする。

_ make:

エラーもなく通る。

_ make install:

これもok。何も修正しなくていいのは気持ちいい。

xdelta

準備が整ったのでxdeltaだ。

_ configure:

% PATH=/usr/local/mingw/bin:$PATH \
  CC='gcc -specs=specs.msvcrt -Zbmingw' \
  CFLAGS=-Os \ 
  ./configure \          
  --target=i386-mingw32 \  
  --prefix=/usr/local/mingw
glib-configはmingwのものを使うためにPATHに/usr/local/mingw/binを追加。
checking for zlib.h... no
configure: error: ZLIB headers not found
あれ、zlib.hが見つからない。 なるほど/usr/local/mingw/includeがspecs.msvcrtから抜けてる。 それに/usr/local/mingw/libもない。追加しないと。 -lzは見つかっているがcygwinのlibz.aがlinkされて成功してしまったんだろう。

_ make:

edsio.c:296: storage size of `tv' isn't known
と来たか。
#if HAVE_GETTIMEOFDAY
  省略
#else

  struct timeval tv;
  time_t t = time (NULL);

  if (t < 0)
    {
      edsio_generate_errno_event (EC_EdsioTimeFailure);
      goto bail;
    }

  if (setme)
    {
      setme->nanos = 0;
      setme->seconds = tv.tv_sec;
    }

#endif
これはあきらかにバグだ。tvはいらない。何のための
time_t t = time (NULL);
だ。これでできた。
% ./xdelta
xdelta.exe: usage: xdelta.exe COMMAND [OPTIONS] [ARG1 ...]
xdelta.exe: use --help for more help
.exeがつくのがちょっとやだな。というわけでquick hack。

_ Z_BEST_COMPRESSION:

試してみるとなんか妙だ。
% ls -l ruby* | awk '{print $5,$9}'
672800 ruby-1.6.2-20010110-i386-cygwin.tar.gz
114200 ruby-1.6.2-20010110-i386-cygwin.xdelta
665323 ruby-1.6.2-i386-cygwin.tar.gz
% mv ruby-1.6.2-20010110-i386-cygwin.tar.gz o
% ./xdelta patch ruby-1.6.2-20010110-i386-cygwin.xdelta
% ls -l ruby-1.6.2-20010110-i386-cygwin.tar.gz | awk '{print $5,$9}'
675808 ruby-1.6.2-20010110-i386-cygwin.tar.gz
% gzip -t ruby-1.6.2-20010110-i386-cygwin.tar.gz
復元したらちょっと大きくなった。 gzip的には正しいってことは圧縮率だけの問題か? 確かにこのパッケージはgzip -9で圧縮してるし、 xdeltaが-9相当で圧縮してるとは限らない。
% cmp =(gzip -dc o) =(gzip -dc ruby-1.6.2-20010110-i386-cygwin.tar.gz)
cmpが何も文句を言わない。どうやらそういうことらしい。
xdmain.cを見るとZ_DEFAULT_COMPRESSIONになってた。 よしZ_BEST_COMPRESSIONに変更しよう。ごそごそ。 make完了。 また同じことを試す。すると今度は僅かに小さくなった。
% ls -l o ruby-1.6.2-20010110-i386-cygwin.tar.gz | awk '{print $5,$9}'
672800 o
672515 ruby-1.6.2-20010110-i386-cygwin.tar.gz
うーむ。まいっか。

_ gzipしない:

これってつまりgzipで圧縮されてるかどうかを調べて 伸長してから差分を取ってるってことだな。 だから圧縮率に依らない。 じゃ、gzipで圧縮しないものとのxdeltaはどうなるのか?
% gzip -dc o > o.orig
% ./xdelta delta o.orig o o.xdelta
% ls -l o* 
-rw-r--r--   1 watanabe ruby       672800 Jan 13 21:21 o
-rw-r--r--   1 watanabe ruby      2150400 Jan 13 23:24 o.orig
-rw-r--r--   1 watanabe ruby          136 Jan 13 23:24 o.xdelta
なるほど、そういうことか。
strip して upx したら意外と小さくなった。
% ls -l xdelta.exe
-rwxr-xr-x   1 watanabe ruby        70656 Jan 13 23:32 xdelta.exe

_ djgpp:

djgppにも移植するかな。それにはglibの移植が面倒か。

2001-01-14 (Sun)

Win98へssh

CygwinにはinetdだのOpenSSHだのデフォルトでインストールされる。 Win98から他のUnix系OSへsshするのはよくあるのかもしれないが、 じゃ、その逆はどう?

_ inetd:

NT/2000ならinetdをサービスとして自動で実行できるから楽。 95/98/MEならスタートアップかMS-DOSプロンプトからinetdを起動する。 /etc/inetd.confはsetup.exeが面倒見てくれる。 あ、ひょっとしたら自分でiu-configを実行したのかも。

_ rsh:

ためしにLinuxからrsh jarh *1してみるとあっけなく成功する。 昔の苦労が嘘のようだ。
% rsh jarh 
Fanfare!!!
You are successfully logged in to this server!!!
が、~/.rhostsもなしでloginできちゃうのはあれだな。

_ telnet:

もちろんtelnetもOKだ。
% telnet jarh
Trying 192.168.10.3...
Connected to jarh.localdomain.
Escape character is '^]'.

CYGWIN_98-4.10 1.1.7(0.31/3/2) (jarh) (tty0)

login: watanabe
Fanfare!!!
You are successfully logged in to this server!!!
パスワードを聞いてこない。 rshが成功したのは認証が全部省かれてるということか。 Win98だからこんなもんなんだろう。 あ、/etc/passwdに書かれてるユーザかどうかのチェックは入るようだ。
% rsh jarh -l hoge
Password:
Login incorrect

_ ssh:

本題のsshだ。identity.pubをauthorized_keysに登録して実行。 が、いくら待ってもloginできない。
% ssh -v jarh
SSH Version OpenSSH_2.3.0p1, protocol versions 1.5/2.0.
Compiled with SSL (0x0090600f).
debug: Reading configuration data /home/watanabe/.ssh/config
debug: Applying options for *
debug: Reading configuration data /usr/local/etc/ssh_config
debug: Seeding random number generator
debug: ssh_connect: getuid 1116 geteuid 0 anon 0
debug: Connecting to jarh [192.168.10.3] port 22.
debug: Seeding random number generator
debug: Allocated local port 963.
debug: Connection established.
とここで止まってしまう。inetd -d で起動し直してメッセージを見ると
someone wants sshd
accept, ctrl 3
+ Closig from 22
249303 execl /usr/sin/in.sshd
となっているのでsshdは起動されてるようなんだけど? 一応/usr/sbin/in.sshdが存在するかどうか確認する。
% ls /usr/sbin
in.ftpd.exe     in.rshd.exe     in.tftpd.exe  makewhatis       syslogd.exe
in.rexecd.exe   in.talkd.exe    in.uucpd.exe  sftp-server.exe
in.rlogind.exe  in.telnetd.exe  inetd.exe     sshd.exe
がーん。ないじゃん。てゆうかsshd.exeだ。 これは/etc/inetd.confのバグかな。
% diff -u1 /etc/inetd.conf{.bak,}
--- /etc/inetd.conf.bak	Sun Dec 17 15:19:58 2000
+++ /etc/inetd.conf	Sun Jan 14 17:29:28 2001
@@ -51,2 +51,2 @@
 # tftp  dgram   udp     wait    nobody  /usr/sbin/in.tftpd in.tftpd
-sshd stream tcp nowait root /usr/sbin/in.sshd sshd -i
+sshd stream tcp nowait root /usr/sbin/sshd sshd -i
% ps
      PID    PPID    PGID     WINPID TTY  UID    STIME COMMAND
I  319631       1  319631 4294647665  -1  500 15:11:44 /usr/bin/BASH
   133359       1  133359 4294833937  -1  500 17:29:35 /USR/SBIN/INETD
   260579  133359  260579 4294732729  -1  500 17:29:48 /USR/SBIN/IN.RLOGIND
   233087  260579  233087 4294652585   0  500 17:29:49 /USR/LOCAL/BIN/ZSH
   187199  233087  187199 4294659929   0  500 17:29:51 /usr/bin/PS
% kill -HUP 133359
すると最後に
REDO: sshd proto=tcp, wait=0, user=root builtin=0 server=/usr/sbin/sshd
と出た。これでokだ。

_ Win98とLinux:

実はokじゃなかった。 今はWin98が立ち上がっているが、 Linuxもインストールされていて、 ホスト名は同じjarhのため ~/.ssh/known_hostsの内容が食い違ってしまうのだ。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
Please contact your system administrator.
Add correct host key in /home/watanabe/.ssh/known_hosts to get rid of this message.
RSA host key for jarh has changed and you have requested strict checking.
debug: Calling cleanup 0x805fc20(0x0)
違う名前にしとけばよかったか。 /etc/ssh_host_*を同じものにしてやればいいのかもしれないが、 なんか面倒なのでknown_hostsを分けた。~/.ssh/configに
Host wjarh
   HostName jarh
   UserKnownHostsFile /home/watanabe/.ssh/wjarh
を追加して、やっとssh wjarhでloginできた。

_ /etc/inetd.confとin.sshd:

今回は/etc/inetd.confを書き換えたが、 次のバージョンアップを考えると、
% cd /usr/sbin
% ln -s sshd.exe in.sshd.exe
のほうがいいかも。やっぱそうした。

*1: jarhがWin98のホスト名

2001-01-15 (Mon)

JARP

たしかに nsmmを使ってます。awkで書かれてます。 なんでこれを使っているんだろう? 「日記システム名称未定」という名前が妙に気に入ったからか、 awkでここまでできるのかというのが逆に新鮮だったからか、 動的な hnsに移行も簡単というのに魅かれたのか、 自分でもよくわからないけど。 といいつつnsmm cloneをrubyで書けたらいいなあなどと思ったりもする。

Cygwin

ruby-talk MLで最近Cygwin特有の機能ではまる人というか文句を言う人が増えてる。

_ Cygwin is Cygwin:

実は Cygwin MLでも同じような質問というか文句がよく出るんだけど、 今Cygwin Projectを管理してるChristopher Faylorという人は、 ばりばりなWindowsユーザには

Welcome to POSIX. Cygwin is not DOSISH.

と言い、もともとUnixを使ってた人には

Welcome to Windows. Hope you enjoy the ride.

とか言う。要するに

CygwinはWindowsでもUnixでもない。CygwinはCygwinだ。

ってことだな。

_ ^Z:

ちなみに(ちなんでどうする)、Cygwin上では^ZはEOFではない。
% stty -a | head -3
speed 9600 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
を見ればわかるとおり^Zはふつうsuspendでしょ、やっぱ。 だからcommand.comから起動したrubyで^Zなんてしてはいけない。 command.comはsuspendなんて知らないんだから。 え?しちゃったの?だめだよ。 そういうときはもう一個立ち上げてpsしてみる。
% ps | grep -i ruby
S  360939       1  360939 4294606357  -1  500 01:28:38 /USR/LOCAL/BIN/RUBY
Sが立ってるのがsuspendしてるプログラムだ。 Iはたぶんinteractiveという意味。 bashが入力待ちのときなんかがそうだ。
% kill -CONT 360939
% ps | grep -i ruby 
I  360939       1  360939 4294606357  -1  500 01:28:38 /USR/LOCAL/BIN/RUBY
Iに変わった。 これでrubyを起動したwindowで^Dすればいいはずなんだけど、 どうもどこかでbusy waitしてるようで終わらない。
% kill 360939
するしかない。だったら最初から-KILLか。

_ 昔のCygwin:

いや、killで止まるんだから、まだましだ。 昔はbash上で^Cしただけでハングしちゃったんだから。

_ command.com/cmd.exe:

あとやたらとcommand.com/cmd.exeの内部コマンドを使いたがるのはなぜだ? もう、command.comには安らかに眠ってもらおうよ。

_ ふたたび^Z:

Cygwin情報 Snapshot NEWSによるとやはりSIGCONTがバグってたようだ。 cygwin1-20010113.dll.bz2で試したらちゃんと^Dで終了した。

2001-01-16 (Tue)

DJGPP版xdeltaを作ろう

MinGW版をcrossで作ろうとして諦めた。 そう今回はnativeじゃなくてcrossだ。

glib

まずはglib。

_ とりあえずconfigure:

% CC=i586-pc-msdosdjgpp-gcc \
  CFLAGS='-Os' \
  ./configure \
  --target=i386-msdosdjgpp \
  --host=i586-pc-msdosdjgpp \
  --build=i586-pc-linux-gnu \
  --disable-threads \
  --with-threads=none \
  --prefix=/usr/local/i586-pc-msdosdjgpp
<途中略>
checking for extra flags to get ANSI library prototypes... configure: \
  error: can not run test program while cross compiling
やっぱりそこだよね。 ここはconfigure.inでAC_TRY_RUNというマクロが使われているんだけど、 クロスコンパイル時の引数が指定されてない。 だからac_cv_fooの環境変数技が使えないのだ。 MinGWのときは面倒だからとnativeへ逃げたが今回は逃げない。 つまりconfigure.inを書き換える。

_ autoconf:

AC_TRY_RUNは最後の引数を省略するとautoconfをかけたときにwarningになる。

warning: AC_TRY_RUN called without default to allow cross compiling

つまり一度autoconfを実行してみればどれだけ直さなきゃいけないかわかる。

% autoconf |& grep 'warning: AC_TRY_RUN' | wc
     22     220    1892
なぬ?22個所もあるの?

_ AC_TRY_RUN:

info autoconfしてAC_TRY_RUNマクロを探す。

- Macro: AC_TRY_RUN (PROGRAM, [ACTION-IF-TRUE [, ACTION-IF-FALSE [, ACTION-IF-CROSS-COMPILING]]])

PROGRAMを実行し、成功したらACTION-IF-TRUE、失敗したらACTION-IF-FALSEが 実行される。クロスコンパイル時にはPROGRAMは実行せずに、 いきなりACTION-IF-CROSS-COMPILINGが実行される。 glibはこれを省略してるわけだ。
対応はそれほど難しいものではなく、TRUEかFALSEのどちらかを選べばいい。 そう。最後の引数はそのどちらかをコピーして書けばいい。 わからなかったらFALSEを選んでおけば無難。 また、ACTION-IF-CROSS-COMPILINGをつけとけばac_cv_fooで対処可能なので、 それほど深く悩む必要はない。 autoconfするとconfigureが更新される。

_ configure:

% CC=i586-pc-msdosdjgpp-gcc \
  CFLAGS='-Os' \
  AR=i586-pc-msdosdjgpp-ar \
  RANLIB=i586-pc-msdosdjgpp-ranlib \
  NM=i586-pc-msdosdjgpp-nm \
  LD=i586-pc-msdosdjgpp-ld \
  ac_cv_c_bigendian=no \
  ./configure \
  --target=i386-msdosdjgpp \
  --disable-threads \
  --with-threads=none \
  --prefix=/usr/local/i586-pc-msdosdjgpp \
  --host=i586-pc-msdosdjgpp \
  --build=i586-pc-linux-gnu
かなりすごいことになってる。 ar, ranlib, nm, ldもクロスのものが使われるように設定。 make して sudo make install したら完了。

zlib

configureしてもいいんだけど、今回は素直にmsdos/Makefile.dj2を使う。 例によってCC, AR, RANLIBを指定する。ARは引数も含んでいるので注意。

_ make:

% make -f msdos/Makefile.dj2 \
  CC=i586-pc-msdosdjgpp-gcc \
  AR='i586-pc-msdosdjgpp-ar rcs' \
  RANLIB=i586-pc-msdosdjgpp-ranlib
% sudo make -f msdos/Makefile.dj2 \
  install \
  CP=cp \
  INCLUDE_PATH=/usr/local/i586-pc-msdosdjgpp/include \
  LIBRARY_PATH=/usr/local/i586-pc-msdosdjgpp/lib
多少文句言われるが気にしない。 準備完了。

xdelta

ここもAR等のbinutils軍団を指定する。

_ configure:

% CC='i586-pc-msdosdjgpp-gcc' \
  CFLAGS=-Os \
  AR=i586-pc-msdosdjgpp-ar \
  RANLIB=i586-pc-msdosdjgpp-ranlib \
  NM=i586-pc-msdosdjgpp-nm \
  LD=i586-pc-msdosdjgpp-ld \
  ./configure \
  --target=i386-msdosdjgpp \
  --host=i586-pc-msdosdjgpp \
  --build=i586-pc-linux-gnu \
  --prefix=/usr/local/i586-pc-msdosdjgpp \
  --with-glib-prefix=/usr/local/i586-pc-msdosdjgpp
MinGWのときはPATHでglib-configの位置を教えたけど、 --with-glib-prefixを使うのがまっとうなやりかただろう。

_ make:

binary modeにするとか、そのあたりの対応は_WIN32を参考に。 makeしてi586-pc-msdosdjgpp-stripしてupxしてできあがり。
% ls -l xdelta.exe
-rwxr-xr-x   1 watanabe ruby       108232 Jan 16 02:10 xdelta.exe
DJGPPは全部staticにlinkされるのでちょっと大きくなる。

2001-01-17 (Wed)

ruby binaries

最近だとほとんどのhttp serverはApacheだと思うんだけど、 www.ruby-lang.orgはApache 1.3.9みたいだ。

_ FancyIndexing:

で、index.htmlとかを置かないとFancyIndexingがonになってるので、 ディレクトリの内容が表示される。 この機能ってなかなかナイスというか昔から好きなんでそのうち ruby binariesで使おうと実は思ってた。

_ rimnet:

ところが rimnetのマシンのrenewalとか言ってOSがSunOS4からNetBSDになり、 NFSが不調とかなんとか言ってFreeBSDになった。一年ちょっと前の話。

_ IndexOptions:

別にOSはなんでもかまわないんだけど、 そのついでにApacheの設定がなんか厳しいほうへ移行したらしく、 IndexOptionsがうまいこと設定できない。 いや面倒なんで深く追及してないだけなんだけど…。あ、 こういうことか。

_ てんこもり:

とかなんとか言ってるうちに Cygwin,DJGPP,MinGW版てんこもりパッケージを始めたもんだから、 ディスク容量が10MBじゃ足りなくなってしまった。

_ livedoor:

で、最近流行りの 無料プロバイダに加入した。 50MBまで使える代わりに上部にバナーがつく。 http://jarh.hoops.livedoor.com/のようなURLになるので結構いい。 あ、どうせならjarhじゃなくてRuby-Binariesというアカウントにしとけばよかったか。 だれか取ったら、よろしく。

_ tarball:

ruby binariesというか ruby binariesにはtarballしか置いてない。 これは現在全部クロスで作ってるからというのが大きいんだけど、 中身が簡単に取り出せない形式にはしたくない。 InstallSieldのことなんだけど。Linux上で中身を取り出せるの? むりだろうなあ。

_ 素材:

Cygwinに関してはそのうちsymlinkも含めたくなるだろうからという理由はある。 DJGPPとMinGWはその言い訳は通用しないだろう。せめてzipにしとくか? ま、素材ということで。

ロケット・ボーイ

番組の最後に体調不良で一ヶ月休むとか言われちゃった。 今日買ったTVBrosを見ると確かに未定になっている。 いや、大して面白いわけでもないんだけど。 踊る大走査線?

2001-01-18 (Thu)

ruby-* ML

なんか最近23時過ぎあたりから配送の順番が狂う。 一時間以上遅れてるのもあるし。

Perl 5.7.0

いつのまにかPerl 5.7.0って出てたんだね。

_ microperl:

README.micro, Makefile.microというのが増えていてmicroperlが作れるよう になっている。
% ls -l miniperl microperl 
-rwxr-xr-x   1 watanabe ruby       834088 Jan 17 23:24 microperl
-rwxr-xr-x   1 watanabe ruby       650824 Jan 17 23:15 miniperl
名前はmicroだけどちっとも小さくない。
% chmod +w uconfig.h
% make -f Makefile.micro
でできあがるからConfigureしなくてもokってことらしい。

_ configure.gnu:

それはそれとして
% ./configure.gnu -Dprefx=/usr/local -Dcc=gcc
zsh: permission denied: ./configure.gnu
% ls -l configure.gnu
-r--r--r--   1 watanabe ruby         2550 Aug 14 03:33 configure.gnu
って、なぜ?
% sh ./configure.gnu -Dprefx=/usr/local -Dcc=gcc
sh Configure -ds -e -Dprefx=/usr/local -Dcc=gcc
First let's make sure your kit is complete.  Checking...
*** WHOA THERE!!! ***

    This is an UNSTABLE DEVELOPMENT release.
    The version of this perl5 distribution is 7, that is, odd,
    (as opposed to even) and that signifies a development release.
    If you want a maintenance release, you want an even-numbered version.

    Do ***NOT*** install this into production use.
    Data corruption and crashes are possible.

    It is most seriously suggested that you do not continue any further
    unless you want to help in developing and debugging Perl.

Do you really want to continue? [n]  
Okay, bye.
終わっちゃった。あ、なるほど。たしかにConfigureに
*) case "$xversion" in
   *[13579])
とある。つまりPerlもminorが奇数なら開発バージョンになった。 だから簡単に実行できないようにconfigure.gnuも0444なわけだ。

tinyruby

名前としてはtinyrubyがいいかな。って作るのか?

_ inits.c:

Rubyの場合組み込みクラスが結構ある。 このうち疎な関係になってるクラスは簡単に外せる。 たとえばMashalは元々ext/の下にあった拡張ライブラリだった。 だからこれは安全に外せる。という感じでどれだけ外せるか? inits.cで初期化関数を呼ぶようになっているので Init_Foo();と呼んでるところを消し、 同じようにMakefileのOBJSから消せば試すことができる。 ちょっとした実験では の5個は他のファイルを変更することなしに外せる。 40KBほど小さくなる。

_ Process:

試しにProcessを外してみよう。 してmake minirubyする。

eval.o(.text+0x10df0): undefined reference to `rb_last_status' eval.o(.text+0x110ca): undefined reference to `rb_last_status' io.o(.text+0x1c92): undefined reference to `rb_syswait' io.o(.text+0x27fd): undefined reference to `rb_proc_exec'

とこんな感じでその機能自体を削る必要がある。 さらに10KB弱縮小。

_ Thread Local:

あ、ってことはスレッドローカルな外部変数を拡張ライブラリでは作れないのか。

_ coreruby:

Processを外しちゃうとext/extmk.rbですごく困ったことになるので、 これ外しちゃだめだよ。そうするとcorerubyって何を実装してればいい? autoloadを使えばかなりぎりぎりまでいけそうな気はするんだけど。 E-Lispみたいなautoloadがあるとpack.cなんかも対応できていいかな。

2000-01-18

% cvs ci -m 2000-01-18 version.h
してしまった。30分後ぐらいに気づいて
% cvs ci -m 2001-01-18 -f version.h
しなおした。-f が肝だ。未だに20世紀気分が抜けないらしい。
% alias civ='cvs ci -m `date +"%Y-%m-%d"` version.h'
しとくか。

2001-01-19 (Fri)

GNUmakefile

CygwinはGNU makeが標準だからばりばり依存してやるぜってな具合に cygwin/GNUmakefile.inを作ってしまったが、 クロスでコンパイルできる今、ちょっとまずかったかなと反省。 でもgmakeという名前できっとインストールされてるよね?

MinGW Repository

MinGWのProject Infoに置いてあるzipファイルの中の構造はDJGPPと全く同じだ。 PREFIXを除いた相対でアーカイブされている。参考にしたか? とすればMinGW版、DJGPP版共にこの形式にするのが望ましいかも。 そういえば 海賊版もそんな構造でLHaでアーカイブされてた気も。 てゆうかいつのまにか海賊課に。えっ、課なの?

拡張ライブラリ

本体だけ更新していてすっかり忘れてたけど、 拡張ライブラリを作らないとね。今週末にでも。

make CFLAGS=

ふと気になって
% make CFLAGS=
してみたら、拡張ライブラリを作るときにこけた。 extmk.rbでCFLAGSにいろいろ入れてるからだ。 -O2 -gぐらいに留めといたほうがようさそう。

specs.msvcrt

ライブラリのサーチパスがCygwinのままのため、 Cygwin用のライブラリが見つかってしまう。 cursesがまずい。 specsで対応してる限りサーチパスの削除はできないから、
% cd /usr/mingw/lib
% ar rcu libcurses.a
とでもしといてお茶を濁すか? あ、PDCursesを入れればいいんだね。なっとく。 でも、CygwinにはあってMinGWにはないライブラリに関しては 空のライブラリで対処しといたほうがいいだろう。

GNU httptunnel

ってそのままの名前で存在するとは。 これはhtsの仲介が必要だから外で動かせるホストが必要。

2001-01-20 (Sat)

拡張ライブラリをクロスでmake

Rubyでは拡張ライブラリは
% ruby extconf.rb
% make
% sudo make install
といった手順で作る。

_ fake_TARGET.rb:

クロスの場合に問題なるのは$:とかRUBY_PLATFORMなので、 これを書き換えるライブラリを用意しrequireすることにする。 これはその一例。 実はこのままでは使えなくて、symlinkなどで自分自身の名前を変えて使う。 --target=i386-cygwinで作ったらならTARGETはfake_i386-cygwin.rbという具合に。

_ make:

% ruby -r fake_i386-cygwin extconf.rb
% make
% make install
で~/dist/i386-cygwin/usr/localがPREFIXに設定されてインストールできる(はずだ)。 簡単なものなら。
あ、あらかじめrubyは
% make install DESTDIR=$HOME/dist
でインストールしてある。

また雪

来週も降るらしい。

WWWOFFLE

どうもanchor-cached-endが入らないことがあるようだ。 ってこの日記なんだけど。全体が緑になるのは非常に読みにくいので
anchor-cached-begin     = <font color="#00B000">
anchor-cached-end       = </font>
anchor-requested-begin  = <font color="#B0B000">
anchor-requested-end    = </font>
anchor-not-cached-begin = <font color="#B00000">
anchor-not-cached-end   = </font>
をコメントアウトした。そんな違いは知る必要もないし。
原因は

次の日記 &gt;

のようなので<>≫にしよう。 &gt;で誤動作するのはなんとなくわからないでもないが、 他にもあるんだけどねえ。

zsh

% ls
mirai.sh     track02.mp3  track04.mp3  track06.mp3  track08.mp3  track10.mp3
track01.mp3  track03.mp3  track05.mp3  track07.mp3  track09.mp3  track11.mp3
% echo *
mirai.sh track03.mp3 track06.mp3 track09.mp3 track01.mp3 track04.mp3 \
track07.mp3 track08.mp3 track05.mp3 track02.mp3 track10.mp3 track11.mp3
ソートされない。なぜだ?
% xmms *.mp3 &
とすると自然とシャッフルされた結果になるが、 毎回同じ結果だからシャッフルでもなんでもない。 てゆうかxmmsにもシャッフルはあるし、そもそもそんな結果は望んでない。 Cygwin版zshではちゃんとソートされる。 Src/glob.cを見るとnotstrcmpでstrcollを呼んでるがこれが怪しい。
% setenv LC_COLLATE C
してみるとちゃんとソートされるようになった。 うーむ。そろそろglibc 2.2.1にしようかな。 とりあえず~/.zshenvに追加しとこう。あ、
% setenv() { export $1=$2 }
してるんで、そこんとこよろしく。

<Older(,) | Newer(.)> | Recent(/)>> | RDF


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

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