先週インストールして, 自分の所有でないファイルをいじると即死というバグを 見付けてゲンナリしていたが, せっかくソースがあるので直してみた. まじめに gdb を使ったのはこれが初めてだ.
いやー. 便利っすね. gdb. まじで. ちゃんとしたフリーソフトなら, たいがいのバグはこれで直せるぞ. gdb の使い方は info gdb で見てもらうとして, とりあえず つかうだけなら, こんな感じ.
gdb command
これで `command' のデバギングのはじまり. プロンプトが gdb になったら, run とやると, gdb がデバグするプログラムを 実際に実行し始める. 途中, 何か引っかかるところがあるたびに, 停止してどうするかきいて来る. とりあえず関係無いので飛ばすのであれば, 継続コマンド `c' を入力して続行する. とにかく, 「これをやると死ぬ」とかわかってる操作を, gdb で実行中のプログラムにやってみるのだ.
たいがいは SIGSEGV つまり, segmentation fault core dump という奴ですが, それが起こって死にます. 死んだら, バックトレースする. バックトレースは, gdb のプロンプトから `bt' というコマンドを入れればいい. 死ぬに至った関数呼出ステップを, 死んだ 瞬間から時間を遡って, 関数に与えられた引数とともに表示してくれる. 一体, どうやりゃこんなことが出来るのか知らんが, とにかく, これがスゲエ. どのソースコードの何行目でおかしくなったか, まで判るのだ. あとは, ChangeLog を参照したりしながら, 直すべき所を特定する. なんせ, どこがおかしいかわかっていれば, それを直すのは時間の問題だからな.
実際みんなに gdb を使って頂きたいところなのですが, 今回は, 直したソースを ここ に置いとくので, これと入れ換えてコンパイルしてください. これで, もうプロパティでは死にません. 本当はパッチにすればいいのだろうが, 作り方を調べるのがめんどくさい. つうか, マジで今回の debug は楽勝だった. 昔, デバッガとか知らなかった頃は, 関数を呼出したりループを回す毎に変数や ポインタの値を表示させるコードを挿入したりして, 気合いと根性だったが, マジでこれは楽です.
思うに, Linux てのは, 車を買ったら車の製造設備が全部オマケでついてくる というはちゃめちゃな流通形態なわけで, そりゃ bug fix は怒涛の勢いになる よな. だってオレですら, こんな超絶にめんどくせえプログラムが debug でき るんだぜ. 情報処理の課題を, 動かないまま(さすがにコンパイラは通ったけど) 提出したり, 多倍長計算の実装がヘボくて無理数を1500ケタ計算したのに 20桁くらいで循環 小数になったりとかして, でもどこがおかしいのかわかんないから, しょうがないからそのまま提出しちゃったりしてた, もう, 底無しにプログラミングがヘボなこの俺ですら debug可能であるという. つうか, だいたいわし, C 言語よく知らんのですけど.
だから, みんなも debug しろ. 「ああ, バグだ」とゲンナリしてないで, gdb 起動しろ. フリーソフトなんだから. それが JEDI への道だ.
ちなみに, もう一個バグがある. ちょっと手ごわかったので, こっちは fix できてない. mime が関連づけられてないファイルを開こうとすると, 死ぬというバグだ.
厳密に言うと, そのファイルを開くのに使うプログラムを指定しようとすると死 ぬのである. デフォルトのアクションが決まっていない場合, それを決めるダイ アログを出そうとするが, これを出そうとすると死ぬ.
gdb にはいろんな wrapper があるようで, グラフィカルな DDD というのがある そうな. 俺はそんなにdebug に気合いが入ってないので, とりあえず emacs か ら使っている. コマンドは, Mx gdb つまり, そのまんま.
今日でた. slashdot なんか見てると, 「出た」という記事があってミラーも紹介してあったので, 速攻で取りに行った. 目につく変更点は, コンパイル時に付ける enable-kanji が無くなり, 何もせん でも最初から国際化されるようになった. そのかわり, ~GNUStep/Defaults/ の wmglobal と WindowMaker の2つの設定ファイ ルに
yuji@aya:~/GNUstep/Defaults%grep Multi * WMGLOBAL: MultiByteText = YES; WindowMaker: MultiByteText = YES;というのを書かないと日本語が出ない. この設定はグラフィカルな設定ツール WPrefs では書けないので, 手で書かね ばならず, 注意が必要だ. WPrefs のほうが, この設定項目に間に合わなかったものと見える. フォントの設定の書き方は, 0.5x と変わらないので, 前の設定がそのまま使え る.
設定ツール WPrefs は, さらに良くなった. テクスチャその他を細かく設定で きるようになったし, メニューやタイトルバーの文字のアライメントや色も操作 でき, リアルタイムで変更が反映される. 致命的な虫は, いまのところ見当たらないかな. かなりアップグレード推奨.
抑圧可能であるとき, 人民は抑圧されている. このほど, 盗聴法が成立したんだかするんだか知らんけど, そういうことらしいので, いまさらながら, わしも PGP を導入した.
コンパイルは, ソースのディレクトリで
./configure && makeでおわり. わしは, ちょっと最適化オプションが弱いので, -O3 に書き換えて から configure した. あとは, 自分のキーを generate すればいい. キーを作るときに, 2.6.xとの互換性を考えて RSA暗号を選ぶのが間違いなさそ うだ. インストールだけすれば, あとは mew がよろしくやってくれるようだ. PGP の使い方は, mew の info に詳しい. mew から使う場合に若干注意することがある. keyを生成するときのユーザID を, setq mew-from で設定したメールアドレスと同じにしないと動かない.
インストールが終って, キーを生成するときに, 使用する暗号強度を設定するメ ニューがあり, これが, 3段階か 4段階くらいあって,
その後の調査で, mew と一緒に使うには, 2.6.3i の方が良いということが判 明. つうか, 5.0 は mew と一緒に使うと, 一見動きますが実はちゃんと動きま せん. ずぎゃ. というわけで, バージョンを 2.6.3 に戻す. こいつのコンパイルは, src で make linux とやる. バイナリをどこか path が通っている所に置き, マニュアルを手で cp してできあがり. fileio.c に mew の作者 山本和彦のパッチを当てないと日本語でちゃんと動か ないらしいので, あてといたが, 当ててないとどうなるのかは不明.
wav が鳴らないので困って, 入れた. でも, べつにクリックして音出したりとかは全くやってないんだけどね. なんとなく入れてみた. 録音できるし. コンパイルには, ksh が必要だが, zsh は ksh 互換なので, symlink を ksh -> zsh としてコンパイルした.
テキストベースの mp3 再生. 軽いんだけど, けっこう音が飛ぶ. まあ, mule とか使っているぶんには大丈夫 だし, 操作が全部キーボードなので, ものを書いているときには便利. nfs で共有しているファイルを再生すると, 若干へんてこなノイズが入 るのはなんでかのう. そこだけちょっと残念だ. リスト再生とかランダム再生, 曲飛ばし, 再生時刻表示, ボリュームコントロー ル, なんでもリアルタイムでできるので, 機能的には x11amp など, 他のグラフィ カルなものと変わらない. curse なので, ライブラリがないと make できない し, 高機能なターミナル(xtermとか)でないとちゃんと動かないけどね. でも, 最近の環境なら, 問題ないでしょ. 音は x11amp 0.7 よりも全然良い. もっとスレッドになってて音が飛ばなきゃな あ. テキスト人には, かなり推奨. 場所は, ここらへん のどこか Linux のディレクトリだった. 忘れた. じつは, こいつの最新は 2.3 らしいが, みつからなかったのだ. 本拠地のサーバには, 最近アクセスできないらしいので.
ずっとまえにインストールしてたんだけど, 忘れてた. あの, ハロウィンドキュメントの Eric Raymond さんが popclient を引き継い で開発した, pop で取って来たものを smtp に forward するというナイスなプログラム. つまり, 普通は smtp -> pop で終点なわけですよ. pop で取って来たもの を再配分するとなると, これは事実上不可能. ところが, コレなら pop がまた smtp に戻るのです. これは, ズバリ, unix で使う究極の pop クライアントでしょう. なんせ, 一度 POPで取って来たものが, また POP で配信できるんだからな. python で動く グラフィカルな設定, 操作ツールもおまけでついていて, 初心者にも具合が良い. それに, IMAP とかにも対応しているのだ. ssh などと一緒に使うとなおよし.
自分のマシンで MTA つまり 25番ポートを聞いてる奴が動いてないと, smtp forwarding はできないから, そのへんの機能を引き出すにはちょっとバッ クグラウンドが必要かもな. 俺は qmail で使っている. だいたいちゃんと動く のだけれど, qmail は何かとうるさいので, たまにちゃんと forward できないメッセージがある.
単語の途中で補完しようとしても効かないのでこれが便利悪いっす. ほんとうは, 単語の中でも補完するというオプションがあるのだが, それを有効にしてもなぜか俺の思うようには動いてくれない. そこでカーソルの後ろに一個スペースを挿入するというのを 作ってみた.
open-space (){ zle magic-space zle backward-char } zle -N open-space open-space bindkey '^O' open-spaceCtl-O でユーザが定義した open-sapce という名前の, zsh のラインエディタのコマンドが呼ばれるのだが, そいつはじつは open-space という shell function になっていて, その shell function の実体は, zsh のラインエディタのコマンド magic-space と backward-char を続けて実行するということなのだ. つまり, Crl-O で, 「一個普通にスペースを入力した後, 一文字戻る」 というのがつづけて実行されるのである. これで, カーソルの後ろにスペースが一個挿入されたように見える. そのまま補完操作できる.