Just another Ruby porter,

〜2002年12月上旬〜


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

2002-12-01 (Sun)

11月のspam

ちょうど400通。そのうち112通が韓国から。

[Linux] __ctype_b

reiserfsをモジュールにしようと思い

% PATH=/usr/bin:$PATH make menuconfig

したら、__ctype_bがundefinedになってしまう。 なぜかlibncurses.aをリンクしにいこうとする。 libncurses.soもちゃんと存在するのに。 gcc 2.95.3だとこうなってしまうのかあ。うーむ。 ncursesをglibc 2.3.1の環境でmakeしてみるかな。

[Linux] ncurses 5.3

いろいろ考えた結果

% mkdir linux; cd linux
% CFLAGS=-Os ../configure --prefix=/usr \
  --with-shared --without-debug --without-cxx

でいくことにした。なぜか--enable-sharedではないので注意。 元々のlibncurses.so{,.5*}は/libにあったのでこれを消去。 libncurses.so.3*のsymlinkは/usr/libへ移動。 これでgcc 2.95.3でもok。

[Linux] w3m 0.3.2.1

w3mでgoogleを見ると画像を表示するところで固まってしまうようになってしまった。 w3mimgdisplayが返ってこない。

どうせmakeし直すならと、-m17nパッチもあてることにする。 ついでにgdk-pixbufもインストールしてアニメーションGIFも表示できるようにしよう。 ftp://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/からgdk-pixbuf-0.21.0を取ってきて適当にインストール。 w3mは出たばかりの0.3.2.1を使い、w3m-m17nは 坂本さんのページからw3m-0.3.2.1-m17n-20021127.patch.gzとlibwc-latest.tar.gzを入手。 後は

% tar xfvz w3m-0.3.2.1.tar.gz
% cd w3m-0.3.2.1
% gzip -dc ../w3m-0.3.2.1-m17n-20021127.patch.gz | patch -p1
% tar xfvz ../libwc-latest.tar.gz
% ./configure
% make

てな感じでいいかと思ったら、-lgpmでまた__ctype_bがundefinedに。 失敗したなあ。gpmなんか使わないからインストールするんじゃなかった。 面倒なので

% sudo removepkg gpm

してしまう。もう一度configureし直してmakeしたらok。

これでutf-8なページも見ることができる。 アニメーションGIFはlとかhを連打する。

[Linux] ext3

何も考えずにext3をモジュールにしたんだけど、 initrdにもしてないのになぜパニックを起こさないのか不思議に思う。 dmesgを見ると

EXT2-fs warning (device ide1(22,2)): ext2_read_super: mounting ext3 filesystem a
s ext2

VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 212k freed
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
Journalled Block Device driver loaded
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide1(22,1), internal journal
EXT3-fs: mounted filesystem with ordered data mode.

とあった。なるほど。とりあえずext2としてread-onlyでmountされたわけだ。 で、実際に/etc/fstabに従ってmountするときは、 /lib以下は見えているのでext3モジュールは見つかる。 なかなか興味深い。

[Linux] diet libc, icc, uClibc

旧環境からそのまま/optと/usr/i386-linux-uclibcをコピー。 これで揃ったかな。

[Linux] xmms 1.2.7j-20021012

このような変な技は使えなくなったので、日本語対応版をインストールする。 あれでSJISになるほうが不思議ではあるが。

[Ruby] Cipher book for ruby

結局のところ、初心者にとっては記号は暗号にしか見えないらしい。 でも、この人の最近の投稿を見てると、 ドキュメントがあろうがなかろうが全く理解する気がないようではあるが。 というか脊髄反射でリプライしすぎ。

[Ruby] BZ2 0.1.3

更新。

[Linux] /bin/ash

ところどころ

#! /bin/ash

と書いたスクリプトがあることが判明。 いや自分で書いたんだけど、なんでわざわざ/bin/ashと指定してるのか謎だ。 それはそれとして、また diet libc版ashをインストールしとく。今回はmakeの引数で対応してみよう。 使ったのは例によってCygwinのash-20020731-1-src.tar.bz2。

% CC='diet gcc' CC_BUILD='diet gcc' ./configure
% make CFLAGS='-Os -D_BSD_SOURCE -Dquad_t=long -Du_quad_t="unsigned long" -D__S_ISVTX=S_ISVTX'

てな感じだ。

gcc 3.2.1でコンパイルしたら以前より小さくなってる。

% ls -l /plamo-old/bin/ash /bin/ash
-rwxr-xr-x    1 root     root        70952 Dec  1 21:48 /bin/ash
-rwxr-xr-x    1 root     root        78808 Jan 20  2002 /plamo-old/bin/ash


2002-12-02 (Mon)

[Linux] BusyBox 0.60.5

やっぱdiet libcでコンパイルしたいねってことで、

% make DOSTATIC=true CC='diet gcc' \
  CFLAGS_EXTRA='-D__uid_t=uid_t -D__gid_t=gid_t' LIBRARIES=-lcompat

としてみたが、結構あちこちでひっかかる。 主に__GLIBC__がらみなんだけど、とりあえず こうしてみる。ついでにviも活かそう。Config.hのBB_VIをuncomment out。 まずはdateを試す。

% ./busybox date
zsh: segmentation fault  ./busybox date

いきなりかよ。他のコマンドは問題ないようだ。 ってことはdateだけだな。うーむ。

[Linux] dietlibc 0.21

結局tznameがちゃんと初期化されなくて、 それを参照しているstrftimeで0番地にアクセスしてる模様。 /etc/localtimeの中を見てるようだけど、 これってglibcが作るもんだしなあ。ちゃんと読めるのか? またしても quick hackでごまかす。

[Linux] BusyBoxふたたび

timezoneは表示されなくてもどうでもいいかと、 とりあえず思うことにする。

% ./busybox date; date -u
Sun Dec  1 16:11:53  2002
Sun Dec  1 16:11:53 UTC 2002

ってUTCじゃん。意味なし。--helpを見ると

Options:
        -R              Outputs RFC-822 compliant date string
        -d STRING       display time described by STRING, not `now'
        -s              Sets time described by STRING
        -u              Prints or sets Coordinated Universal Time

のように-uを指定しなきゃlocaltimeのようにも思えるのだが。

サイズはこのくらい。

% ls -l busybox
-rwxr-xr-x    1 watanabe ruby       235924 Dec  2 01:04 busybox

/binへコピーしとこう。非常時にはこれだけで復旧できるはず。

[Linux] xmms 1.2.7

ふと思い立って

% sudo localedef -i ja_JP -c -f SJIS ja_JP.SJIS

としてSJISのlocale環境を作ってみる。

character map `SHIFT_JIS' is not ASCII compatible, locale not ISO C compliant

と文句を言われるが一応完了する。で、xmmsを1.2.7のオリジナルに戻して

% LC_ALL=ja_JP.SJIS xmms

のように起動すると、ちゃんとSJISなID3タグが表示された。 が、例によってメニューは化け化けなので、LANGUAGE指定は必要。

% LC_ALL=ja_JP.SJIS LANGUAGE=C xmms

ということは 以前はjapaneseでSJISな環境になっていたってことか。 それはそれでかなり不可解ではあるが。

[JR東日本] 埼京線

遅れるほど混むとは。明日は湘南新宿ラインにしてみよう。


2002-12-03 (Tue)

[Linux] murasaki

boot時とshutdown時になんかエラーメッセージが出てる。

sh: /proc/sys/kernel/hotplug: No such file or directory

どうも/etc/rc.d/rc.murasakiが出してるようだ。 SoftwareDesignの11月号を見るとmurasakiはUSB関係のツールらしい。 とするとこのマシンには関係ない。x permissionだけ落としとこう。

% sudo chmod -x /etc/rc.d/rc.murasaki

rc.0でも呼んでるようなので、

for i in /etc/rc.d/init.d/*; do
  if [ -x $i ]; then
    $i stop
  fi
done

に変更。

[Cygwin] CygTermとirb

全く問題ないんだけど、何がどうなるんでしょう?


2002-12-04 (Wed)

[Ruby] RubyMail 0.9

インストーラはついてないようだ。とりあえず

% ruby tests/runtests.rb

してみたが、

./tests/testmboxreader.rb:11:in `require': No such file to load -- \
  rmail/mailbox/mboxreader (LoadError)

となる。たしかにmboxreader.rbは存在しない。 バックアップファイルが残ってるのも気になる。

[MinGW] ImageMagick

RMagick 0.9.2をmakeするにはまずImageMagickの移植が必要だ。

% PATH=/usr/local/mingw/bin:$PATH \
  ac_cv_lib_bz2_BZ2_bzCompress=yes \
  ac_cv_lib_bz2_BZ2_bzDecompress=yes \
  ac_cv_jpeg_version_ok=yes \
  CFLAGS=-Os CXXFLAGS=-Os \
  CC='i686-pc-cygwin-gcc -mno-cygwin' \
  ../configure \
  --target=i386-mingw32 --host=i686-pc-cygwin --build=i586-pc-linux-gnu \
  --without-magick-plus-plus --without-perl \
  --prefix=/usr/local/mingw --enable-shared --without-x \
  --without-threads --without-tiff --cache=config.cache

でやってみた。freetype2がまずいようだ。更新が必要かも。 tiffなしってのも寂しいから、tiffもなんとかすべきか。


2002-12-05 (Thu)

[Mail] nullmailer

メールを出していた気になっていたが、nullmailerが動いてなかった。 何か変だと思ってたんだけど、queueに溜っていただけとは。

[Ruby] mod_ruby

CFLAGSを削除した責任を取ってパッチを書く。 erubyも同じか。

[Ruby] irb

プロンプトを変えても文句は言われるわけだ。

[Linux] Linux kernel patch from the Openwall Project

セキュリティを強化するパッチを試す。make oldconfigで全部yに設定。

* Security options
*
Non-executable user stack area (CONFIG_HARDEN_STACK) [N/y/?] (NEW) y
  Autodetect and emulate GCC trampolines (CONFIG_HARDEN_STACK_SMART) [N/y/?] (NEW) y
Restricted links in /tmp (CONFIG_HARDEN_LINK) [N/y/?] (NEW) y
Restricted FIFOs in /tmp (CONFIG_HARDEN_FIFO) [N/y/?] (NEW) y
Restricted /proc (CONFIG_HARDEN_PROC) [N/y/?] (NEW) y
Enforce RLIMIT_NPROC on execve(2) (CONFIG_HARDEN_RLIMIT_NPROC) [N/y/?] (NEW) y
Destroy shared memory segments not in use (CONFIG_HARDEN_SHM) [N/y/?] (NEW) y

テストは明日。


2002-12-06 (Fri)

[Linux] Linux kernel patch from the Openwall Project

昨日makeしたkernelを試す。optional/stacktest.cをコンパイルして実行。

% ./a.out -e
Attempting to simulate a buffer overflow exploit...
zsh: segmentation fault  ./a.out -e

ちゃんとSEGVになる。Openwallパッチをあてる前は

% ./a.out -e
Attempting to simulate a buffer overflow exploit...
Succeeded.

とexploitが成功してしまう。機能してるようだ。

でも、PPxPが動かなくなってしまった。 全部yにしたうちのどれかが原因のはずだが、 とりあえず明日はCONFIG_HARDEN_STACKだけをyにしてみよう。

[Ruby] irbはnkfを使ってるか?

ちょっと面倒なのでここに書いてしまいますが、 irb/locale.rbでkconvを使ってます。

[Ruby] ruby-talk

てゆか、ruby-talk爆発気味じゃない?

[BB] Yahoo! BB

駅前のキャンペーンで2ヶ月無料で試せるというので、 Yohoo! BBのADSLモデムを持って帰った。 NTTの設定は2週間後ぐらいという話だが、 そんなに早くできるようになったのか。

あ、TVでSo-netが3ヶ月無料と歌ってる…。


2002-12-07 (Sat)

[Ruby] bigfloat 1.2.1

更新。

[Ruby] eruby 1.0.0

更新。

[Linux] Openwallパッチ

CONFIG_HARDEN_STACKだけをyにしたkernelでもppxpは動かず。 ここが原因なのか。一番欲しい機能だっただけに残念だ。 なにしろ何のメッセージもなくプロンプトに戻ってきてしまうから原因がわからない。

ltraceしてみたら、なんと動いてしまった。うーむ。 あ、Plamo 3.0はちゃとstraceが動くね。 straceしてみると、サブプロセスがSEGVしてるようだ。

read(3, 0x123000, 4096)                 = ? ERESTARTSYS (To be restarted)
--- SIGCHLD (Child exited) ---
read(3, "", 4096)                       = 0
close(3)                                = 0
wait4(106, [WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV], 0, NULL) = 106

と思ったらltraceでも動かないときもある。タイミングなのか? このサブプロセスはppxpdだな。これを単独で起動すると確かにSEGVになる。

% /usr/local/sbin/ppxpd
interface: tun0
zsh: segmentation fault  /usr/local/sbin/ppxpd

そのわりには残っていたりするのが不思議なんだけど。

% ps x |grep '[p]pxpd'
  229 ?        S      0:00 /usr/local/sbin/ppxpd

この状態でppxpを起動するとちゃんと動く。

% ppxp
PPxP version 2001080415
interface: tun0
ppxp> 

dialもできる。うーむ。

-debugを試すと問題なし。とするとdaemon化のしかたがまずいと言える。 ソースを見るとsrc/main.cにDaemon()という名前の関数が見つかる。 ここで

  if ((child = fork()) == -1) return;
  if (child) {
      static void QuitParent(int sig) {
          exit(0);
      }
      signal(SIGTERM, QuitParent);
      pause();
  }

という記述があった。 GCCのnested functionを使ってsignalのハンドラ関数を定義してるわけか。 なるほど。nested functionはこういう時に便利だな、って、 その関数はどこに作られるんだ? 親の関数から抜ければ用済みだから、スタック上に作られる可能性は高い。 だとしたら原因はこれか?試しに以下のテストプログラムで検証。

% cat foo.c
main()
{
    void foo(){}
    foo();
}
% gcc foo.c
% ./a.out

あれ?問題ない。-Sをつけてfoo.sを見ても静的に作られたfoo()を直接呼んでいる。 とすると、関数ポインタを渡すところか?

% cat foo.c
bar(void (*func)())
{
    func();
}
main()
{
    void foo(){}
    bar(foo);
}
% gcc foo.c
% ./a.out
zsh: segmentation fault  ./a.out

これだな。foo.sを見ると確かにコードをわざわざスタックにコピーしてる。 foo()をmain()の外へ出せばもちろん何の問題もない。 というわけで無事解決。いやでもスタックにコピーする理由がよくわからない。 スコープ的に親の関数から抜けたら無効だということを意味させたかったんだろうか? info gccを見るとどうもそういうことらしい。

   If you try to call the nested function through its address after the
containing function has exited, all hell will break loose.  If you try
to call it after a containing scope level has exited, and if it refers
to some of the variables that are no longer in scope, you may be lucky,
but it's not wise to take the risk.  If, however, the nested function
does not refer to anything that has gone out of scope, you should be
safe.

続きを読んでみる。

   GCC implements taking the address of a nested function using a
technique called "trampolines".  A paper describing them is available as

`http://people.debian.org/~aaronl/Usenix88-lexic.pdf'.

trampolinesってどこかで見たよ。configしたときだ。

Autodetect and emulate GCC trampolines (CONFIG_HARDEN_STACK_SMART)

これだ。ということはautodetectがうまく働いてないのか? Openwallパッチのoptional/stacktest.cを見ると、 -tはまさにさっきのテストプログラムそのものだった。ぐはぁ。

それはそれとしてnested functionにする必要もないので、 外に出すことにしよう。


2002-12-08 (Sun)

[Linux] w3m-0.3.2.2-stable-m17n-20021207

すでにパッチがあたったものをインストール。 前回configureした結果はconfig.paramに残っているのでこれをコピーしてからconfigureする。 あとは

% ./configure --nonstop

でいける。

[Linux] GRUB 0.93

0.93がリリースされたということなので、 CVSでupdateしてるソースを使って更新。

% mkdir objs; cd objs
% CFLAGS=-Os ../grub-current/configure --prefix=/usr
% make
% sudo make install
% sudo grub-install '(hd0)'

[Linux] Openwallパッチ

全部yにしたカーネルに戻すとtrampolineテストプログラムはちゃんと成功する。 ということはsignalだと駄目なのか?

% cat signal.c
#include <stdio.h>
#include <signal.h>

main()
{
    void term(int sig)
    {
	printf("%d\n", sig);
    }
    signal(SIGTERM, term);
    raise(SIGTERM);
}
% gcc signal.c
% ./a.out
zsh: segmentation fault  ./a.out

どうもそういうことらしい。自動では検出できないようだ。

[Ruby] case

これは知らなかった。省略するとそういう意味になるのか。 リファレンスマニュアルにも そう書いてある。

[Linux] BitKeeper

いままでbkの使い方を間違えていたようだ。

% cd /usr/src
% bk clone -l /path/to/repo/for/linux-2.4 linux-2.4
% cd linux-2.4
% bk -r edit
% cp ../linux-2.4.config .config
% make oldconfig
...

という手順でカーネルをmakeしていた。 常に最新をmakeしていたときはこれでなんの疑問も持たなかったんだけど、 linux 2.4.20 vanillaを取り出すにはどうすればいいのかさっぱりわからなくなる。 bk help topicsでいろいろ見てみるとbk exportでいいと気づく。というわけで

% bk export -w -rv2.4.20 /path/to/repo/for/linux-2.4 linux-2.4.20

てな感じで使ってみる。 でもexportしたファイルを更新することはできないんだよね。

[Linux] fileutils 4.1

Plamo 3.0のfileutilsは3.16と古いので4.1に上げる。 diet libcだと 面倒なのでuClibcを使う。

% CC='/usr/i386-linux-uclibc/usr/bin/gcc -static' \
  CFLAGS=-Os am_cv_lib_error_at_line=no \
  ../configure --prefix=/usr --libexecdir=/bin --bindir=/bin \
  --disable-nls --cache=config.cache

uClibcのerror()関数の表示が微妙に違うのでlib/error.cを使うように

am_cv_lib_error_at_line=no

とした。こうしないとmake checkでひっかかる。

% make
% make check
% sudo make install

JARH

print case when true then "Just another Ruby hacker," end

2002-12-09 (Mon)

初雪

寒いっす。

駅までの道、なぜか逆流する人が多い。そういえば踏切の警報機が全然鳴ってない。 この時間なら5分に1本は来るはず。 駅に着くと案の定電車が走ってなかった。 駅員に対して現状を説明しろと叫ぶ会社員。ま、聞いても無駄だろう。 階段までごったがえしていてホームへたどり着くのに15分かかる。 でも電車は来ない。

「ただいまとりはねを出ました」

とアナウンス。どこだよ?そんな駅名は聞いたこともない。 諦めて外へ出るにしてもまた15分かかるだろうし、どうするか悩む。 雪道を15分ほど歩いてバス停に行くのもいやだし、待つことにする。 その後はまったくアナウンスなし。20分ぐらいしてやっと来た。 が、まったく乗れる隙はない。降りる人もやっと出られてほっとしてる様子。 その時曇ったガラスになぜか忍者ハットリ君を書く女子高生。 殺伐とした空気が一瞬和む。3本見送った。結局電車に乗れるまでに1時間かかる。 少年ジャンプはとっくに読み終わっていた。大宮駅に着いたら

「降雪のため列車が乱れたことをお詫び致します」

と2回繰り返された。乱れたのはダイヤだろと小声でツッコむ。

暑いっす。

[Ruby] ++, elsif, concat, ...

文句ばっか。いい加減うざい。

[Linux] GNU parted

Software-suspend-mini-HOWTOを見てたら、 2.6章に

You must have a swap partition on your disk. This swap partition should be at
least 30% larger than your RAM

と書いてあった。その後に128Mだったら160Mのswapを用意しろとある。 現在は

% fdisk -l /dev/hdc

Disk /dev/hdc: 255 heads, 63 sectors, 4865 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1             1        13    104391   83  Linux
/dev/hdc2   *        14      4850  38853202+  83  Linux
/dev/hdc3          4851      4865    120487+  82  Linux swap

と足りない。というわけで、partedでresizeに挑戦だ。 hdc2を小さくしてhdc3を大きくするので、手順としては

hdc3を削除
hdc2を小さくする
hdc3を作る

となる。rootパーティションを変更することになるので、 partboot, partrootをフロッピーに書き込んで起動する。 イメージは ftp://ftp.gnu.org/gnu/parted/bootdisk/から入手可能。フロッピーでブートしてparted /dev/hdcで起動。

(parted) p                                                                
Disk geometry for /dev/hdc: 0.000-38166.679 megabytes
Disk label type: msdos
Minor    Start       End     Type      Filesystem  Flags
1          0.031    101.975  primary   ext3        
2        101.975  38044.556  primary   ext3        boot
3      37044.556  38162.219  primary   linux-swap  
(parted) rm 3
(parted) resize 2 101.975 38000
(parted) p
Disk geometry for /dev/hdc: 0.000-38166.679 megabytes
Disk label type: msdos
Minor    Start       End     Type      Filesystem  Flags
1          0.031    101.975  primary   ext3        
2        101.975  37997.490  primary   ext3        boot
(parted) mkpartfs primary linux-swap 37997.491 38162.219
(parted) p
Disk geometry for /dev/hdc: 0.000-38166.679 megabytes
Disk label type: msdos
Minor    Start       End     Type      Filesystem  Flags
1          0.031    101.975  primary   ext3        
2        101.975  37997.490  primary   ext3        boot
3      37997.490  38162.219  primary   linux-swap  
(parted) quit
# fdisk -l /dev/hdc

Disk /dev/hdc: 255 heads, 63 sectors, 4865 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1             1        13    104391   83  Linux
/dev/hdc2   *        14      4844  38805007+  83  Linux
/dev/hdc3          4845      4865    168682+  82  Linux swap

よさげだ。再起動もokだ。


2002-12-10 (Tue)

[Ruby] RHG

届きました。

[Linux] leafnode+

すっかり忘れていた。もう要らないかなあ。

[Linux] lynx 2.8.4

肝は--with-screen=ncursesらしい。にしてもdefaultの色使いがひどいよね。

[Ruby] -lruby-static

--disable-sharedで拡張ライブラリを作るときに-lruby-staticをリンクしちゃうのはまずいね。 have_funcのときだけにしないと。 拡張ライブラリが無駄に太るだけなので、それが原因とも思えないんだけど。

「とりはね」の正体

あ、豊春か。すっきりした。って「と」と「は」しか合ってねー。


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