tdiarysearch にバグが二つ来てるんだけど、 これがまた全部プラグインがらみなんだよな。 もうウンザリだよプラグイン。 やっぱ tdiarygrep の仕様のほうが気楽でよかった……。
(03:45)
TMail かあ。 別にメールに興味がなくなったわけじゃないんだが、 いまは相対的にウェブ方面のほうに魅かれる。
……というのは、まあよーするに、興味が薄れてるのかな。 ちょっと考えてみても BitChannel とか Ripper をメンテする 時間を削ってまで TMail をいじることはありえない。 ということは時間があればそれは全部 BitChannel とか Ripper に行くわけで、 TMail は放置されるのが必然だ。
(04:18)
このところ突然日記を書かなくなったのは、 コンビニバイトなんぞをやっていたからです。 週に 1・2 回にしてください〜と頼んでおいたはずが 「今週だけ」とかいう口実で先週が 3 日、今週が 4 日入ってて、 原稿の日程も重なって、 ついでに大学のテストも重なって、 もう何やってんだかわからなくなってきました。
いいかげんコンビニにはうんざりしてるんだけど、 それでも歯ブラシの柄を磨くよりは百倍マシだ。 あのバイトは、なんつーか、活力を根こそぎ吸い取られる。 それに対してコンビニはただ疲れるだけで済むしな。 賞味期限切れになったやつを食べられるのも得だ。
……と書くといかにも誤解されそうなので念のために追記しておくと、 賞味期限切れなのが嬉しいわけではないからね!
(05:43)
やっぱ行動の波というのはあると思うんです。 「いまは情報を吸収する時期」とか「いまはネタを放出する時期」みたいな。 プログラミングでも原稿でもそうじゃないでしょうか。 ちなみにわたしはいま「情報を吸収する時期」のような気がしてます。
だから原稿が進まないんですよ! そうなんですよ! (必死だな)
(05:48)
そういえば勉強に関してもやはり波はあるらしく、 大学浪人中は 「6 月はひたすら数学」「8 月はひたすら世界史」 とかいう恐しい勉強方法をしてました。 ただ英語の単語だけは継続的にやってたので微妙に半端な気がしないでもない。
(05:53)
そうそう、今日っていうか昨日は RHG 読書会でした。 が、おもいきり寝過ごして飲み会だけになってしまいました。 なにやら待っててくださったみたいで、申し訳ない。
それにしても今日はえらいたくさん人がいましたね。 もはや読書会っていうより月例 Ruby 飲み会の様相を呈してきました。 ま、面白けりゃなんでもありでしょ!
ログはいつものとこにあります。
(06:44)
■ すぎむし [たのもしい えんぐんが あらわれた!]
[ruby-talk:119406] Re: [RDOC] Documenting accessor methods as methods
def a=(v) で作ったメソッドは attribute のとこに出るべきだ、 いやその逆に、attr_reader で作ったメソッドもメソッドとして出るべきだ、 という意見。
俺もこれはずっと気になってたんだよ。 「属性」なんて区分はなくすべきだろ。 属性かメソッド (関数) か、なんてのは実装の領分であって、 ドキュメントに書くべきことではない。 少なくとも Ruby ではその区別がないのだから区別するべきではない。 『オブジェクト指向入門』p.131「統一的参照の原則」も参照のこと。
流れによっては参戦しよう……そんな時間あるのか?
(06:25)
ふーむ、るびまって編集中から Hiki 上でやってるんだなあ。 Wiki 上で (ウェブ上で) 長い文章を書くのは大変じゃないだろうか。 俺はツールをいろいろ使わないともう文章は書けなくなくなってしまった。 最低でも分量表示付き目次とソースコード展開と用語チェッカ、 あとできれば内容の依存関係をチェックするツールも使いたいな。
分量表示付き目次ってのはこういうのね
~/c/linuxintro % list aamine@harmony 1. 22 intro.rd ........ Linuxプログラミングを始めよう 2. 42 abstract.rd ..... Linuxのすがた 3. 22 stream_sys.rd ... ストリーム(1)システムコール編 4. 24 stream_stdio.rd . ストリーム(2)stdio編 5. 19 practice1.rd .... 実習(1)headを作る 6. 30 practice2.rd .... 実習(2)grepを作る 7. 15 hier.rd ......... Linuxのディレクトリ構造 8. 21 fs.rd ........... ファイルシステム 9. 23 process.rd ...... プロセス 10. 10 signal.rd ....... シグナル 11. 16 etc.rd .......... プロセスの環境 12. 18 network.rd ...... ネットワークプログラミングの基礎 13. 32 httpd.rd ........ 実習(3)HTTPサーバを作る・基本編 14. 27 httpd2.rd ....... 実習(4)HTTPサーバを作る・発展編 15. 30 advanced.rd ..... 本書を終えた後は Total 342 Kbytes ~/c/linuxintro % ind intro.rd aamine@harmony 1 Linuxプログラミングを始めよう intro.rd 509 1 本書の対象読者 19 2 本書で話すこと 10 3 対象とする環境 10 4 必要な環境 16 5 開発環境の導入 31 1 Fedora Coreの場合 6 2 Debian GNU/Linuxの場合 21 6 gccを使ったビルド(1) 87 1 うまくコンパイルできないとき 22 7 開発環境の話 43 1 C言語以外の言語 10 2 統合開発環境について 13 3 どのエディタを使うか 8 4 C言語の規格 10 8 情報の集めかた 46 1 man 35 2 info 6 3 検索エンジン 3 9 gccを使ったビルド(2)gccのオプション 108 1 デバッグ 17 2 デバッガ 55 3 gcc -Wall 9 4 最適化 8 10 コマンドライン引数 134 1 argcとargv 42 2 args.c 27 3 実験 65
ソースコード展開というのは以下の #@mapfile みたいなやつ。
エディタは何でも構わないので以下のプログラムを打ち込んでください。 //list[hello_c][hello.c]{ #@mapfile(src/hello.c) #include <stdio.h> int main(int argc, char **argv) { puts("Hello, Linux!"); return 0; } #@end //}
この原稿をプリプロセッサにかけると #@mapfile 〜 #@end の部分に ./src/hello.c が展開される。 単なる include 機能では原稿を書くのには不足である。
最後の依存チェッカは今回の Linux 本で初めて使ってるんだけど、 キーワードの provide/require を宣言しておくと 内容の依存関係をチェックしてくれるツールだ。 以下の #@require と #@provide がそれ。
このあたりの事情も「Linuxはカーネルだけ」と言われる所以です。 #@provide(libc) #@require(ライブラリ) 続いて/libを眺めてみると、他にもlibmだとかlibdlだとかlibnssなんたら というファイルがありますね。実はこれも標準Cライブラリの一部です。 libmならば数学関係の関数、例えばsin()やcos()が入っています。 一つのライブラリなのに複数のファイルに分かれている事情はそれぞれです。 例えばlibmは歴史的な理由ですが、libdlには必然性があります。
読者が知っていると仮定してよいかどうかあやふやなものも とりあえず require しておけばよい。 本全体の前提条件にしたいキーワードは別途専用ファイルで宣言できる。
原稿書きツールに関する全体的な注意としては、 人間がいじる部分とツールがいじる部分を明確に分けておくこと。 例えば用語チェックをするなら怪しい個所を報告するだけに留め、 勝手に修正したりはしない。 長い文章では適用外にしたいところが必ず出てくるからだ。
そうは言っても自動変更するツールもやはり必要になる。 例えばソースコード展開プリプロセッサがそうだ。 このようなツールを使う場合はツール適用前に必ずコミットしておいて、 適用後は cvs diff で (目で) 変更点をチェックしてから再度コミットする。 ちなみにバージョン管理システムを使わないなんてのは問題外である。
最後に、内容をチェックするときは紙に印刷して読んだほうがよい。 なんでかわからないが、画面で読むだけでは絶対にチェック漏れが出る。
(06:27)
http://namazu.org/~satoru/pub/mito2004i/
以前も触れた高林さんの検索エンジン。 いい感じだー!
「Ruby コードの解析には flex ではなく ripper が使えないかな?」 とあるなあ。 これが「当然 ripper を使う」になるまではもっていきたいねえ。
(17:47)
どこかから「パッチ公開キボンヌ」という声が聞こえてきたので、 この日記で使ってる tDiary のコメント SPAM 避けチェックボックスの パッチを置いておきます。 このパッチを当てるとツッコミ書き込みボタンの横にチェックボックスが付き、 それにチェックを入れないと書き込めなくなります。
(05:58)
■ halchan [リファラではなくてコメントですよね?]
■
青木 [うわ。ありがとうございます。
修正しました。]
■
yuco [どうもありがとうございます。
skel/diary.rhtml ですが、
<input type="check" name="ishuman">
ではなくて、
<input type="checkbox" name="ishuman">
ですよね。]
■
青木 [あ、そうですね。なんでcheckになってるのか謎です。
(しかも HEAD ではちゃんと checkbox になっている)]
■
fumihiro [今patch使ってみたのですが,
<%%= comment_spamwarn() %%>
最後の%が一個多いみたいです.
そのままコンパイルエラーになりました.]
■
飴谷 [初めまして。パッチを使ってみたのですが、「spamwarn.html」を別途用意する必要があるのですね。
index.rbと同じ位置にspamwarn.htmlを置くのかと思いましたが、以下のようなエラーがでました。どこに置くのでしょうか?
TDiary::ForceRedirect (TDiary::ForceRedirect) /サーバにおいたパス名/tdiary/index.rb:35]
■ 飴谷 [ちなみに、tdiaryは2.0.2を使っています。]
> ついでに欲張るなら、いろんなアーキテクチャで実行するひとがいるといいと > 思います。そうすれば、自分の使っているマシン以外で発生する問題を知るこ > とができ、また、リリース前にいろんなアーキテクチャでテストを行う時に、 > メールで頼まなくてもしばらく待つだけでテスト結果が得られるようになりま > す。
daily build は俺もやりたかったんだー。 でも電気代の財源を確保してから、と思ってたら akr さんに先を越されてしまった。 AlphaServer を 24h 運用すると高くつくからなあ……。
あ、そういえば AIX 入れなきゃ。
(22:06)
今日 (13 日の土曜日) はお仕事の日にした。
うわー、こりゃだめだ、見直すとどんどん量が増えていく。 HTTP サーバを完全ソースコード付きで解説するのはあきらめるしかない。 ポイントを絞って「このシステムコールがここで使えるぞ!」と紹介する方針でいこう。 その代わり、別のアプリケーションの構造を解説してもいいな。 何か面白いアプリケーションを探そう。
(05:27)
「さまざまなプロセス間通信機構」 という節でついうっかり
=== 分散オブジェクトシステム
なんて項を作ってしまって、えらいことになった。 なんでわたしは ORPC なんて単語を書いてますか? これが Linux の C 言語の入門書かっつーの。
ざっくり削除。
てか 9:00 からバイトなんですけど。 徹夜後に 8 時間バイト……生きて帰ってこられるだろうか。
(08:18)
http://jp.rubyist.net/magazine/?0003
出ましたね。 今号はちょっとだけ編集に参加しました。 個人的におもしろかったのは Java (Library Report) と Win32OLE でしょうか。 あと tk も記事を読んでから 256 倍界道編を読み直しましたよ。
(22:18)
長らく放置していた RS/6000 に AIX をインストールしよう。
実はこのマシンはマイクロチャネルアーキテクチャ (MCA) だ。 そんなわけで最新の AIX は動かない。 MCA で動作するのは AIX 5.1L が最後である。 この程度のマシンでは AIX 5 は辛いという噂もあるが、 Ruby をコンパイルするためにはソフトウェア環境の 鮮度が重要なのであえて 5.1 を選んだ。
さて、通常、鍵付き RS/6000 では次の手順を踏んで起動する (らしい)。
だがインストール時はブートの手順がちがう。
あとはメニューに従っていけばよい。
最初、ここでまちがって 1 を選んでしまった。 中古マシンだと何事もなく進むから困る。
「システムの構成」で 2 を選ぶと System Settings、Primary Language、Advanced Option の三つが設定できる。
System Settings では新規インストールかマージインストールかを選択。
Primary Language はロケールの選択。 日本語は Japanese (PC) と Japanese (EUC) がある。 Japanese (PC) がデフォルトっぽいが、今回は EUC を選んでみた。 UTF-8 の場合はインストール後に設定しなければならない。
Advanced Option ではインストールするパッケージの選択と、 Trusted なんとかを入れるかどうかが選べる。 PCI システムだとデスクトップ環境が選べたり、 64bit システムだとカーネルの種類が選べたりする。
あとはひたすら待つ。 途中でキーを NORMAL (OK) にしておくよう言われるので、まわしておく。 これをやっておくと作業終了後にリブートしてくれるらしい。
……まだだった。 AIX CD-ROM vol.5 を入れて Enter。 たぶん日本語環境だろうな。
よーし終わったぜ!
リブートしたぜ!
ログインプロンプト出たぜ!
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
来ました。お約束のトラブルが。 何度入力しても入力しても戻ってきてしまう。 しかもこれは端末がらみか……。すごい嫌なんですけど。
Google した結果、以下のことがわかった。
解決策はいろいろあるらしいので全部書いておく。
で、今回はシリアルコネクタ変換アダプタが原因だった。 Sun で動作実績がある別のコネクタを持っていたので これに変えてみたら、運よく動いてくれた。
もう、頼むよ本当に……。 シリアル関係はこれまでも何度かはまったんだよな。 安い変換アダプタとかはダメです。本当に。
あぁ、やっとログインできた。 とりあえずお約束の uname を打っとく。
# uname -a AIX localhost 1 5 000******00
……謎の文字列 (一部は伏せる) が返ってきた。
# pwd / # ls .sh_history etc lpp sbin unix audit home mnt tftpboot usr bin lib opt tmp var dev lost+found proc u
普通? いや、「u」って見たことないな。
# ls -l 合計 91 -rw------- 1 root system 98 Nov 20 08:39 .sh_history drwxr-x--- 2 root audit 512 Apr 10 2003 audit lrwxrwxrwx 1 bin bin 8 Nov 20 07:13 bin -> /usr/bin drwxrwxr-x 5 root system 2048 Nov 20 07:57 dev drwxr-xr-x 19 root system 2560 Nov 20 07:57 etc drwxr-xr-x 4 bin bin 512 Nov 20 07:33 home lrwxrwxrwx 1 bin bin 8 Nov 20 07:13 lib -> /usr/lib drwx------ 2 root system 512 Nov 20 07:13 lost+found drwxr-xr-x 34 bin bin 1024 Nov 20 07:51 lpp drwxr-xr-x 2 bin bin 512 Apr 10 2003 mnt drwxr-xr-x 6 root system 512 Nov 20 07:19 opt dr-xr-xr-x 1 root system 0 Nov 20 08:39 proc drwxr-xr-x 3 bin bin 512 Nov 20 07:15 sbin drwxrwxr-x 2 root system 512 Nov 20 07:24 tftpboot drwxrwxrwt 3 bin bin 1024 Nov 20 07:58 tmp lrwxrwxrwx 1 bin bin 5 Nov 20 07:13 u -> /home lrwxrwxrwx 1 root system 21 Nov 20 07:47 unix -> /usr/lib/boot/unix_up drwxr-xr-x 30 bin bin 1024 Nov 20 07:55 usr drwxr-xr-x 19 bin bin 512 Nov 20 07:33 var
/u は /home なのか。user の u かな。
ちょっと思ったんだが、シンボリックリンク一つでも OS ごとに ずいぶん違うもんだな。たしか Solaris は bin -> ./usr/bin になっていた。 Tru64UNIX は bin -> usr/bin だった。で AIX は /usr/bin と。 ちなみに俺は Tru64 スタイルが好き。
# w 08:44AM 稼働時間 47 分, 1 ユーザ, 負荷平均: 0.01, 0.03, 0.05 User tty login@ idle JCPU PCPU what root tty0 08:28AM 0 0 0 w # ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 07:56:36 - 0:00 /etc/init root 2450 1 0 07:57:08 - 0:00 /usr/sbin/syncd 60 root 3142 4160 0 07:57:30 - 0:00 /usr/sbin/inetd root 3490 4160 0 07:57:36 - 0:00 /usr/sbin/dpid2 root 3710 1 0 07:57:08 - 0:00 /usr/lib/errdemon root 3940 4160 0 07:57:20 - 0:00 /usr/sbin/syslogd root 4160 1 0 07:57:15 - 0:00 /usr/sbin/srcmstr root 4686 4160 0 07:57:27 - 0:00 /usr/sbin/portmap root 4964 4160 0 07:57:33 - 0:00 /usr/sbin/snmpd root 5192 4160 0 07:57:24 - 0:00 sendmail: accepting connections root 5940 4160 0 07:57:39 - 0:00 /usr/sbin/hostmibd root 6716 4160 0 07:57:46 - 0:00 /usr/sbin/rpc.lockd root 6970 4160 0 07:57:43 - 0:00 /usr/sbin/biod 6 root 7230 1 0 07:57:47 - 0:00 /usr/sbin/cron root 7532 1 0 08:20:41 0 0:00 -ksh root 7750 1 0 07:57:56 - 0:00 /usr/sbin/uprintfd root 8054 4160 0 07:57:52 - 0:00 /usr/sbin/qdaemon root 8268 4160 0 07:57:56 - 0:00 /usr/sbin/writesrv root 9042 4160 0 07:57:59 - 0:00 /usr/sbin/rsct/bin/ctcasd root 9292 1 0 07:57:56 lft0 0:00 /usr/sbin/getty /dev/lft0 imnadm 9546 1 0 07:57:56 - 0:00 /usr/IMNSearch/httpdlite/httpdl root 9806 1 0 07:57:56 - 0:00 /usr/lpp/diagnostics/bin/diagd root 10064 4160 0 07:57:59 - 0:00 /usr/sbin/rsct/bin/rmcd -r root 10356 7532 5 08:44:04 0 0:00 ps -ef root 11612 4160 0 07:58:04 - 0:02 /usr/sbin/rsct/bin/IBM.ERrmd root 12128 4160 0 07:58:04 - 0:00 /usr/sbin/rsct/bin/IBM.CSMAgent root 12386 4160 0 07:58:13 - 0:01 /usr/sbin/rsct/bin/IBM.AuditRMd
システムを入れるたびに sendmail を止めてまわらないといけないんだよなー、めんどいなー。
ああそれから、BackSpace が効かないのが Linux の宿命だ。 そういうときは
# stty erace '^?'
で黙らせる。
ネットワークも見ておこう。
# ifconfig -a lo0: flags=e08084b<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1/0 tcp_sendspace 65536 tcp_recvspace 65536 # netstat -a -f inet Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 *.daytime *.* LISTEN tcp 0 0 *.ftp *.* LISTEN tcp 0 0 *.telnet *.* LISTEN tcp4 0 0 *.smtp *.* LISTEN tcp4 0 0 *.time *.* LISTEN tcp4 0 0 *.sunrpc *.* LISTEN tcp4 0 0 *.smux *.* LISTEN tcp 0 0 *.exec *.* LISTEN tcp 0 0 *.login *.* LISTEN tcp 0 0 *.shell *.* LISTEN tcp4 0 0 *.klogin *.* LISTEN tcp4 0 0 *.kshell *.* LISTEN tcp4 0 0 *.rmc *.* LISTEN tcp4 0 0 *.writesrv *.* LISTEN tcp4 0 0 loopback.49213 *.* LISTEN tcp4 0 0 *.32770 *.* LISTEN tcp4 0 0 *.32771 *.* LISTEN tcp4 0 0 *.wsmserve *.* LISTEN tcp4 0 0 loopback.smux loopback.32769 ESTABLISHED tcp4 0 0 loopback.32769 loopback.smux ESTABLISHED tcp4 0 0 loopback.32770 loopback.32772 ESTABLISHED tcp4 0 0 loopback.32772 loopback.32770 ESTABLISHED udp4 0 0 *.daytime *.* udp4 0 0 *.time *.* udp4 0 0 *.sunrpc *.* udp4 0 0 *.snmp *.* udp4 0 0 *.syslog *.* udp4 0 0 *.ntalk *.* udp4 0 0 *.32770 *.* udp4 0 0 *.32773 *.*
へー、tcp/tcp6 じゃなくて tcp4/tcp なんだ。 そりゃまた大胆な。
基本的な構成は install_assist がやってくれる。
# install_assist 端末タイプの設定 端末が正しく初期化されていません。端末タイプを入力して ENTER を 押してください。英語以外の言語をサポートしていない端末タイプも あります。 ibm3101 tvi912 vt330 ibm3151 tvi920 vt340 ibm3161 tvi925 wyse30 ibm3162 tvi950 wyse50 ibm3163 vs100 wyse60 ibm3164 vt100 wyse100 ibmpc vt320 wyse350 lft sun +---------------------メッセージ------------------------ | 次画面が読み取り不可能な場合、Break (Ctrl-c) キーを 88 ヘルプ ? | 押して、この画面に戻ってください。 99 終了 | | >>> 選択 []:
うわ、嫌なかんじ。vt100 で日和っとくか……。
だめだ。ファンクションキーが全部きかない。
そんなことはなかった。 ESC + 数字キーで同じ結果になるようだ。
うーん、ライセンス入力から先に進まない。 何やってんだろう。
SEGV しやがった orz
回線を切断してもう一回やりなおす。
やっとコツがわかってきた。 Ctrl-H で消去、Enter で実行、左上に OK と出てたら ESC-3 で戻る、 を繰り返せばいいようだ。 なんて出来の悪いソフトウェアだ。 このへんは Tru64 が一番優秀だったなあ。
で、なんとかがんばってネットワークを動かす。 このマシンはイーサネットが二つあって、 しかも表に出てるやつは二つめの en1 のほうだった。 実にまぎらわしい。
# ifconfig -a en1: flags=e080863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 192.168.1.43 netmask 0xffffff00 broadcast 192.168.1.255 lo0: flags=e08084b<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1/0 tcp_sendspace 65536 tcp_recvspace 65536
またデフォルトでは telnet が IPv6 でしか動いていなかったので、 inetd.conf をいじって tcp6 → tcp に変更した。 その後は refresh -s inetd でリロードできるらしい。
これでどうだっ。
~ % telnet rs7012 Trying 192.168.1.43... Connected to rs7012. Escape character is '^]'. telnet (rs7012) AIX Version 5 (C) Copyrights by IBM and by others 1982, 2000. login:
よし、telnet がつながった。 これで勝ったも同然だ。
あとはいつも通り。 sudo, zsh, ssh, cvs, gcc, bison, まで入れれば Ruby がビルドできる。はず。 続きはまた明日〜。
(02:26)
(すでにパッチを出したあとだけど記録のため残しておく)
gets("") が gets(nil) と同じになっているっぽい。
~/c/ruby % (echo a; echo; echo b; echo) | ruby-1.8.1 -e 'p STDIN.gets("")' "a\n\n" ~/c/ruby % (echo a; echo; echo b; echo) | ./ruby -e 'p STDIN.gets("")' "a\n\nb\n\n"
報告しようと思ったが、[ruby-core:03771] と同じみたいなので様子を見ることにする。
ちょっとだけ追ってはみたんだけど、 rb_io_getline() の次のとこをちゃんと抜けていないらしい、てとこで脱落。
while ((c = appendline(fptr, newline, &str)) != EOF && (c != newline || RSTRING(str)->len < rslen || (rspara || rscheck(rsptr,rslen,rs)) || memcmp(RSTRING(str)->ptr+RSTRING(str)->len-rslen,rsptr,rslen)));
……と言いつつも追ってしまうやつ。
この条件をわかりやすく書きなおすとこうなる。
for (;;) { c = appendline(fptr, newline, &str); if (c == EOF) break; if (c == newline) { if (RSTRING(str)->len >= rslen) { if (rspara && rscheck(rsptr, rslen, rs)) { if (memcmp(RSTRING(str)->ptr + RSTRING(str)->len - rslen, rsptr, rslen)) break; } } } }
なるほど。rscheck のとこが間違ってるな。 ここが if (rspara || rscheck(rsptr, rslen, rs)) にならないといけない。 意図を考えるとたぶんこうだろう。
while ((c = appendline(fptr, newline, &str)) != EOF) { if (c == newline) { if (RSTRING(str)->len < rslen) continue; if (!rspara) rscheck(rsptr, rslen, rs); if (memcmp(RSTRING(str)->ptr + RSTRING(str)->len - rslen, rsptr, rslen) == 0) break; } }
newline (= rs の最後の文字) が読み込めるまで読んで、 str の末尾が rs に等しいか memcmp でチェックする。 ただし str.length < rs.length のときは読み込みを続行し (continue)、 rs が変化したときは例外にする (rscheck)。
make test, make test-all は通るみたいだな。
# ちなみになんでこのバグに気付いたかと言うと tdiarygrep が動かなかったからで、 tdiarygrep を使ったのは RS/6000 の起動方法を検索するためだった。
(02:31)
AIX 入れたりパッチ書いたり、 Linux 本の原稿はどーしたんだと思われるかもしれませんがいいんです、 今日はたくさん書いたんです。
いやそれは嘘で文章はあんまり書いてはいないけど、たくさん作業したんです。 タグも付けたし全部文法チェックしたしプログラムのテストも書いたし文章も読み直したし。 だから大丈夫です! ええ! きっと今年中には出るよ! いや出ないけど! どっちだよ!
ねる。
(02:42)
http://int.mydns.to/blog/archives/2004/11/winny.html
47 氏自身が Winny の技術を書いた本が出るらしい。 これは買いでしょー。
(20:12)
Mozilla でも textarea をエディタで編集できるんだなあ。 以下のページを参考にインストールした。
しかし UTF-8 対応のエディタを入れるのは面倒なので、 間にシェルスクリプトをはさみ、EUC-JP に変換しておく。
#!/bin/sh # $Id: edit-textarea.sh,v 1.3 2004/11/26 19:15:17 aamine Exp $ file=`eval "echo $1"` encoding=eucJP tmpfile=/tmp/edit.iconv.tmp iconv -f UTF-8 -t $encoding $file > $tmpfile mv $tmpfile $file /usr/bin/emacsclient $file 2>/dev/null status=$? iconv -f $encoding -t UTF-8 $file > $tmpfile mv $tmpfile $file exit $status
この日記は空行が自動的に全角空白に変わるのでコピペするときは要注意。
ところで、上記 URL のページ通りに設定するとファイル名が ダブルクオートでくくられたまま渡されるため、 わざわざ eval で外している。 シェルスクリプトの前に Ruby でも書いたんだけど、 やっぱり同じところではまった。 はまるなら最初っから付けなければいいんじゃないかとも思ったが、 まんがいちパスに空白が入っていると嫌なのでつけておくことにする。
制御端末がないプログラムを print デバッグしたいときはこんなのを使うと便利。
require 'pp' def ppp(obj) File.open('/dev/pts/2', 'w') {|f| PP.pp obj, f } end
(04:32)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ n某 [爆睡中でつか?]
■ 青木 [うっす。やっと起きました。
いちおう行ってみよっと……]