……寝すぎた。 何時間寝てたのか恐くて数えられん。
先週の土曜日は RHG 読書会 2-6 でした。 記録はいつもどおり RWiki に書いてあります。 読書会のはだいたいメモってたんですが、 宴会の話を思い出せないので誰か書いてください。
一周目は 7 回で終わったのに二周目はいまだ GC ですよ。 先は長いね。
ところで読書会中に話が出たんですが、 どうやら拡張ライブラリリファレンスマニュアルを誰も知らなかったようです。
つかってね!
ユーザマニュアルとかも含めてもうちょい体裁を整えたいところだけど……。 来年度の課題かな。
(06:22)
言語の文法の好き嫌いをいろいろ言うのって楽しいんだけど すぐにフレームになるから不便だね。 それに論理的に長短が議論できるような論点であっても 慣れるとどっちでもよくなったりするので困る。 個人的には end と {} の違いくらいはどうでもいいかな。 もし明日から突然 Ruby が {} になってもあんまり困らないし逆も同様。
でも強いて好き嫌いを挙げるなら、 標準的な記法で書いたときに grep しやすい文法は好きだ。 ただしコマンドラインシェルとエディタで書く場合ね。 Ruby の def はその点で便利なんで好きだな。 C 系の言語は嫌い。
(07:08)
いちおう全部の項目が揃ったみたいです。 これからびしばしテストするよ! 鬼のように!
ちなみにクックブックは Ruby 1.8.1 がターゲットです。 新しいメソッドもライブラリも使いまくり。
(07:27)
CSS 対応ブラウザではメニューが縦に出るようにしてみた。 さらに CSS2 対応なら常時右上表示だ。
でも本文に重なっちゃうのがいまいちなのですぐやめるかも。
こないだ勝手にコマンドの使用頻度を予想してみたんだけど、 httpd のログを見れば実際の数がわかるじゃないかーと気付いた。 BitChannel 公開以来のを全部足すとこうなった。
recent 612 history 437 edit 422 annotate 356 list 282 diff 272
えーっ。Diff が一番少ないのか。 ちょっと信じがたい。
それともあれか、 History を Diff のつもりで使ってる人がいるとか、 Annotate は珍しいから押してみてるとか、そういうことかねえ。 History の半分を Diff に移動すると納得できる値になるもんな。
メニューの順番を変えたところだし、 結論を出すのはもうちょっと試してからにしよう。
(13:58)
「最後の一人はいただく」云々は「拡張モジュール」の話かな。 無道編 p.156 にのってる。素直に言ったほうがわかりやすいのに、 とか言われても、256 倍だから素直に書くわけにはいかないじゃん。
でも、RHG でさんざん「拡張ライブラリ」って書いたら もうどっちでもよくなった。ありがちだ。
高橋さんのところにも出てますが、 初校 (?) が印刷されてきました。 出版時期ですが、春が売れ時なのでその前には出版されるでしょう。 というか、しないとまずいです。
お役立ち度。 既に tdiarygrep とか BitChannel を書くときに使いまくってるというか、 使ったのを端から載せたというか……。 少なくとも自分で使ってみて便利だったということは、 なにかしら役に立つでしょう。
あと、文字列処理の章 (担当青木) が特にそうなんですが、 容赦なく Ruby 1.8 (1.8.1) 仕様です。 1.8 の機能が使えるときは全て 1.8 仕様。
では 1.6 ではどうするか。 最後の章に「古いRubyでも新しいRubyの機能を使う」とか 「互換性を保ったままメソッド名を変更する」みたいな項目が一揃い書いてあるので、 それを使ってどうにかしろというスタンスです。卑劣だね。
それにしても、RHG のときは Linux と Windows くらいしか持ってなかったので 動作確認にかなり苦労しましたが、今回は執筆陣だけで 重要プラットフォームをほとんどカバーできるので楽です。めちゃ楽。 やっぱり実際の動作をその場ですぐ確かめられるのはいいね。
あ、そういえば AlphaNT 入手したって言ったっけ?
(15:02)
家のメインマシンには test-all-ruby というコマンドがある。 読んで字の如く、ruby 1.4.6 から ruby 1.8.1 + CVS HEAD までの 全バージョンでコマンドを実行するという力技ツールだ。 こんな具合に使う。
~/c/cookbook % test-all-ruby -e 'p File.basename("a.rb", ".*")' ruby-1.4.6: "a" ruby-1.6.0: "a" ruby-1.6.1: "a" ruby-1.6.2: "a" ruby-1.6.3: "a" ruby-1.6.4: "a" ruby-1.6.5: "a" ruby-1.6.6: "a" ruby-1.6.7: "a" ruby-1.6.8: "a" ruby-1.8.0: "a" ruby-1.8.1: "a" ruby: "a" ~/c/cookbook % test-all-ruby -e 'p File.extname("a.rb")' ruby-1.4.6: /tmp/rbNqlet2:1: undefined method `extname' for File:Class (NameError) ruby-1.6.0: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.1: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.2: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.3: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.4: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.5: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.6: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.7: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.6.8: -e:1: undefined method `extname' for File:Class (NameError) ruby-1.8.0: ".rb" ruby-1.8.1: ".rb" ruby: ".rb"
中身
~/c/cookbook % cat =test-all-ruby #!/bin/sh for r in ruby-1.4.6 \ ruby-1.6.0 \ ruby-1.6.1 \ ruby-1.6.2 \ ruby-1.6.3 \ ruby-1.6.4 \ ruby-1.6.5 \ ruby-1.6.6 \ ruby-1.6.7 \ ruby-1.6.8 \ ruby-1.8.0 \ ruby-1.8.1 \ ruby do echo "$r: " $r "$@" done
(21:43)
ちなみに最近は stow を使ってる。 新しくコンパイルしたものから順番に stow 化してるので、 いまんとこはこの程度。
~/c/cookbook % ls /usr/pkg autoconf-2.59 firebird-0.7 libpcap-0.8.1 ruby-1.6.7 automake-1.8 gawk-3.1.1 lua-5.0 ruby-1.6.8 blackbox-0.61.1 gd-2.0.15 man-1.5k ruby-1.8.0 cdrtools-2.00.3 ghc-5.04.1 rcs-5.7 ruby-1.8.1 cdrtools-2.01alpha ghc-5.04.3 ruby-1.4.6 squid-2.5.4 curl-7.10.8 ghc-6.0.1 ruby-1.6.0 subversion-0.33.1 cvsup-16.1f graphviz-1.8.5 ruby-1.6.1 subversion-0.34.0 darcs-0.9.15 groff-1.18.0 ruby-1.6.2 sudo-1.6.7p5 electricfence-2.0.5 gs-5.10 ruby-1.6.3 tcpdump-3.8.1 ethtool-1.8 j2sdk1.4.0_01 ruby-1.6.4 tex-7.2 expat-1.95.7 j2sdk1.4.1_01 ruby-1.6.5 ezpm3-1.0 lavaps-2.4 ruby-1.6.6
/usr/pkg という名前は NetBSD から持ってきたのだが、意味は違う。
ちなみに /usr/local はこんなことになってる。
~/c/cookbook % ls -ld /usr/local lrwxrwxrwx 1 root root 1 Jan 18 17:46 /usr/local -> .
(21:57)
% for i (**/CVS/Root) { echo http://cvs.loveruby.net:/src >! $i }
の一行で書き換えられるんだから別にいいじゃん。
(18:50)
http://d.hatena.ne.jp/moleskin/20040210#p9
RE_OPTION_POSIXLINE があるということは ripper 0.0.5 なんでしょうか。 であれば、それは古すぎるんで CVS から取ってください。
% cvs -d :pserver:anonymous@rubyforge.org:/var/cvs/ripper co ripper
あ、でも 0.0.x とは互換性がないや。
それはそれとして、Ripper は FreeRIDE の人達にあげちゃったので、 あんまり積極的に関わる気はありません。 けど、全然進捗がないし、しばらくたっても進まなかったら やっぱりぼくがやるしかないでしょうねえ……。鬱。
というか、今メンテしてるパッケージはいくつあるんだろう。
う……。
なんとか削ろう。
すると残りはこれだけか。
これを、メンテしたい順 (興味ある順) に並べるとこうなる。
嫌いなほうから順番に一言。
Ripperね、Ripperはめちゃくちゃ大変なんすよ。メンテが。 もうめんどくさいったらありゃしない。 根本的にイベント数が多すぎなのだ。
TMail かあ。メールも嫌いじゃないんだが……いや嘘だった、MIME は大嫌いだ。 文句なしに嫌いだ。頭の先から爪の先まで嫌いだ。なんなんだよあのクソ仕様。 考えたやつらはサドだね。間違いない。
それはそれとして、何気に TMail は惜しいのだな。 ちょっと追加すればかなり使い勝手がよくなるはずなんで 「ちょっと」を追加したいんだけど、 どうも萌えなくてさ (それが理由かっ!)。 手を入れるだけの情熱がたまってない。
ReFe は……特に嫌いじゃないんだけど、 さすがにいじるところがなくなってきてたりする。 これ以上はソースのほう (リファレンスマニュアル) をどうにかしないと進化できないんじゃないだろうか。
最近はなぜか HTTP 萌え、なので net/http は 急速にメンテ意欲が湧き中。
BitChannel は文句なしに楽しい。実に楽しい。 やっぱり俺はなんだかんだ言って実利中心野郎なのだった。
結論: アプリケーションさいこう。
(23:10)
「BitChannelを書籍に収録したいのだけどパッケージはないだろうか」 という問い合わせをもらったので、 ここぞとばかりにパッケージを作った。 こういうときだけは無闇やたらと仕事が早い。
(00:01)
[ruby-list:39145] からの COM の話なんだけど、 ようするにこれって mark & sweep (Ruby) と reference count (COM) の連結問題だよね。
と、考えると気分がスッキリするかもしれないし逆に鬱になるかもしれない。
あと、メールの返信を書いてる途中に rb_hash_* のリファレンスマニュアルがないことに気付いたので ついでに書いておいた。
(22:42)
ずいぶん前に書いて忘れてたのを Wiki に置きました。
Ruby の拡張ライブラリを書くときには GC の知識が致命的なまでに重要なのですが、 README.EXT では GC が軽視されすぎです。 拡張ライブラリを書こうとするならば、 まず「メモリ管理はインタプリタが適当にやってくれる」 という認識を捨てるところからスタートするべきです。
(追記) 一気に書き殴っただけあって穴が多かった。 読み直しが必要だな。
(23:09)
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%B5%A1%C7%BD%CA%CC%BA%F7%B0%FA
こんなものがあるなんて知らなかった……。
(18:54)
Ruby の jcode.rb は既存のメソッドを置き換えるけど、 新しい名前でメソッドを追加したほうが便利じゃないだろうか。 んで jcode.rb はそれを require して、 メソッドを置き換えるコードだけにすればいい。
(22:04)
一日かけてやっと文字列の章が読み終わった。 なんで自分の担当なのにこんなに時間がかかるんだ。 自分の担当だからかかるのかな。 そもそも文字列処理の章は長すぎるのだ。 なんでこれだけで 130 ページもあるんだよ。 実に全体の 1/4 ですか。恐るべし文字列処理。
明日やることを忘れないようにメモ: setup.rb と tdiarysearch.rb をアレする。 FileUtils::Dryrun モジュールを作る。
(01:59)
ああっ! そういえば RHG 公開しなきゃ。 クックブックが終わったらやるか……とか言ってると絶対やらないよな……。 おもいきって明日やろうかな。fileutils をのばして。
そもそも何が問題かと言うと、 一部に生 LaTeX が入ってんのねアレ。 だからそこを手で変換しないといけないんだけど、 そこがめんどくさくて。はあ。
(03:47)
tdiarysearch を tDiary の contrib レポジトリに移動しました。 今後はこっちだけ更新する予定です。
% cvs -d :pserver:anonymous@cvs.tdiary.sf.net:/cvsroot/tdiary co contrib/util/tdiarysearch
(23:56)
CVS HEAD で FileUtils::DryRun を追加。 働きは名前のとおり。表示だけして実際には何もしないというモジュール。
つか、FileUtils::NoWriteって使いようがないよね、と、 クックブックの原稿読んでるときにゆうぞうさんに言われたのがきっかけ。
(04:58)
ウェブのワーキングコピーを整理してたらこんなのが出てきた。
ruby-list でよく見られる対話、その 1 だれか「こーであーでそーいうメソッドが欲しいんですぅ」 まつもとさん「機能は問題ありません。よい名前があれば採用しましょう」 ruby-list でよく見られる対話、その 2 だれか「これこれこういうライブラリがあればカッコいいっすよ!」 まつもとさん「適切な名前が決まったら標準添付してもよいですよ」 ruby-list でよく見られる対話、その 3 だれか「あとメソッド一個あればいいんだけどなあ……」 ある Rubyist「でもその名前じゃまつもとさん説得できないでしょ」 ruby-list でよく見られる発言、その 4 だれか「あー、これは超便利だぁー。でもこの名前はよくないなあ……」
名前じゅーよー。
でも今は ruby-list じゃなくて ruby-dev かもしんない。
(09:41)
めちゃくちゃ久しぶりに TMail をアップデートした。
(10:03)
なるほどねえ。 書籍版を持っていても電車の中で読むという需要があるんですね。 そうならそれで、もうちょっと品質を上げたいところだな。 ぼちぼち直していこう。
あと、ょゎさんリクエストの name タグですが、 どう実装したらいいものか悩んでます。 連番だと途中に項目を追加するだけでずれてしまうし、 かと言っていちいち名前を指定するのもうざったい。
スクリプトで連番を振って、 後から追加するときは手動でタグを入れればいいかなあ。
(10:07)
この土日は目一杯 Ruby クックブックの読み合わせをやってました。 13:00 から 23:00 までかかったよ。 文字列の章はやたらと長いし、 CGI の章ではやたらと横道にそれまくるし。
ちなみに本の題名はレシピブックとかなんとかいうらしい。
なんでいまさら cmd.exe の仕様を調べねばならんのだ……。
公式仕様がみつかりません。
(05:25)
追記
そもそもなぜこんなことを調べているかというと、クックブックがきっかけです。 「Rubyスクリプトを名前だけで実行可能にする」という項目があって、 そこに mswin32 版 ruby が使ってる方法を書いてたんです。 そうしたら、ゆうぞうさんに「%0 ってないの?」とつっこまれて、 調べてるうちに深みにはまった。
調べた結果は次の通り。 cmd.exe にも %0 は存在して、実際最初は「"%0"」だった ([ruby-dev:18895] instruby.rb 1.32)。 しかし Ruby が複数インストールされている環境を考慮して絶対パスになった。 ([ruby-dev:19370] instruby.rb 1.40)。
(06:08)
UNIX プログラマ向けに Windows 世界の概要を説明してくれる本ってないですかねえ。 内容はこんな感じだといいなあ。
もちろん全部概要でいいんですけど。 入門よりもしっかりしていて、 ちゃんとプログラミングするんでもない、 その中間くらいが欲しい。
……というか、これはほとんど「俺が知りたいことリスト」 みたいなもんだな。
(06:40)
instruby.rb の変更ってこれですか。 タイムリーだなあ。
--- instruby.rb 23 Feb 2004 00:09:48 -0000 1.61 +++ instruby.rb 25 Feb 2004 12:16:14 -0000 1.62 @@ -74,6 +74,7 @@ end def with_destdir(dir) + return dir if $destdir.empty? dir = dir.sub(/\A\w:/, '') if File::PATH_SEPARATOR == ';' $destdir + dir end @@ -157,11 +158,11 @@ open(with_destdir(batfile), "w") { |b| b.print <<EOH, shebang, body, <<EOF @echo off -if "%OS%" == "Windows_NT" goto WinNT +if not "%~d0" == "~d0" goto WinNT #{ruby_bin_dosish} -x "#{batfile}" %1 %2 %3 %4 %5 %6 %7 %8 %9 goto endofruby :WinNT -#{ruby_bin_dosish} -x "#{batfile}" %* +"%~dp0#{ruby_install_name}" -x "%~f0" %* goto endofruby EOH __END__
なるほど。cmd.exe の変態記法をチェックして分岐するんですね。 まあ記法の変態さ加減では sh も負けてないか……。
えーと、%~f0 が %0 のフルパスで、%~dp0 が %0 の drive + dirname か。 利点は、prefix 以外にインストールされても rdoc が動く……でいいのかな。
(10:15)
うーむ……
$SAFE = 1 path = 'danger'.taint puts File.expand_path(path) # 通る
print str.taint は通ってしまうのか。 通さないと不便だが、通すのも嬉しくないような気がするな。 puts File.expand_path('~') なんてのが通ると CGI を実行してるユーザと そのホームディレクトリも推測できてしまう。
この場合はむしろ expand_path が例外をあげるべきかなあ。 微妙だ。
(04:22)
IPv6 ready なはずの NetBSD 上で getaddrinfo しても v6 なアドレスが返ってこない。 なんでかと思ったら --with-lookup-order-hack のせいだった。 自業自得じゃん。
でもこれを付けとかないと drb のテストが通らないんだよなあ。 困った。
(12:09)
日曜で CVS に手を入れるのも終わりってことで、徹夜。 昨日起きたのが夕方の 5 時だけどな。
あ、やっとコンパイルが終わった。
aamine@asv800 % ruby --version ruby 1.9.0 (2004-02-28) [alpha-netbsd] aamine@asv800 % ruby -rsocket -rpp -e 'pp Socket.getaddrinfo(nil, 8080, Socket::PF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_PASSIVE | Socket::AI_NUMERICHOST)' [["AF_INET6", 8080, "::", "::", 24, 1, 6], ["AF_INET", 8080, "0.0.0.0", "0.0.0.0", 2, 1, 6]]
これでやっとテストができる……。
(12:16)
■ MoonWolf [そろそろRipperに手をつけて欲しいなぁ。なんて^_^;]
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ まちゅ [僕は[Recent]→[Diff]です。最終更新に色が付くようになれば[Diff]の代わりに[Annotate]を使うと思います。[History]はほとんど使わないですねぇ。]
■ sugi [Diff を使うのは、通りすがりの一見さんよりも常連さんというか、
そのページに深く関わっている人なのではないでしょうか?
一見さんは、直前との Diff よりも History の方を見るような気がします。]
■ あおき [言われてみれば確かに、前の状態を
知らなければ Diff は使わないですもんね。
自分ではあまり使ってなかったのですが、
色が付いてみると Annotate も便利。納得。
(w3m で無意味なのが気になると言えば気になる)]