2005-10-10 (Mon) [長年日記]
_ DocDiffとパイプとzshの<()
SVKの作業ディレクトリでDocDiffを次のように実行したらエラーになってしまった。
$ docdiff --tty <(svk cat foo.txt) foo.txt | lv -c /usr/bin/docdiff:297: /proc/self/fd/18 is not a file. (RuntimeError)
とりあえず、297行目の以下の2行をコメントアウトしたらうまく動いた。
raise "#{ARGV[0]} is not a file." unless FileTest.file?(ARGV[0]) raise "#{ARGV[1]} is not a file." unless FileTest.file?(ARGV[1])
それはそれとして、zshの<()記法って/proc/self/fd以下のファイルを渡してた のね。なるほど。
Linux以外のシステムではどうやるんだろ、と思ってmanを見ると、
If the system supports the /dev/fd mechanism, the command argument is the name of the device file corresponding to a file descriptor; otherwise, if the system supports named pipes (FIFOs), the command argument will be a named pipe.
[zshexpn(1)より引用]
ふむふむ、/dev/fd*1というものがあるのか。 なかったら名前付きパイプを使うんだね、なるほど。
*1 Linuxでは/proc/self/fdへのsymlinkみたい。/dev/fdって何かフロッピーディスクと間違えそうだな。
2005-10-12 (Wed) [長年日記]
_ Rubyist Hotlinks 【第 10 回】 わたなべひろふみさん
ささだ 今まで読んだコードの中で最も美しいソースコードはなんですか?
eban んーとね、美しいっていうか好きなのはね、前田さん*10が書くコード。
[Rubyist Magazine - Rubyist Hotlinks 【第 10 回】 わたなべひろふみさんより引用]
おお、なんて光栄な。
しかし、mailclientって自分のマシンにも見あたらないんですが...。 たぶん、とくに見るべきところはないと思うので、期待しないように。 > all
2005-10-13 (Thu) [長年日記]
_ Agile Web Development with Railsの翻訳
オーム社さんから来年の2月ごろに出る予定です。 まだ公式なアナウンスはありませんので、書店などへのお問い合わせは今しばらくお待ちを。
実は軽い気持ちで監訳を引き受けてしまったのですが、なかなか大変です。 Dave Thomasの英語はわかりやすい方だと思うので、おもに自分の問題なのですが...。
2005-10-14 (Fri) [長年日記]
_ RubyConf 2005
行って来た。
各セッションについてはコメントできるほど内容を理解できなかったので とくに何も書かないことに。 (後でmputさんの日記見て、「へー、そんな話だったんだ」とか思ったり...だめじゃん。) まつもとさんはアドリブでぺらぺら英語を話していてやっぱりすごいですね。 キーノートの質問タイムなんか、みんなマイクを待たずに言いたい放題で聖徳太子 状態だったのに、的確に受け答えをしていたり。 (いや、ほんとに的確だったのかどうかは自分にはよくわかんなかったんだけど。)
直接話をしてくれた人たちについて。
- David Heinemeier Hansson
- Rails本の監訳をするのでよろしく的な挨拶をして、おみやげを渡すと、とても 喜んでくれた(少なくともそのように振る舞ってくれた)。 勝手に思っていたのよりもずっと若くて(RubyConf中に26才になったとか)驚いたが、 なかなかのナイスガイである。
- Dave Thomas
- 監訳する旨の挨拶をしておみやげを渡すと、DHHと同様とても喜んでくれた。 当初は簡単な質問をしようと思っていたが、あまり時間もなかったので、後でメール で質問するかもしれないけどよろしくと言う話にとどめておいた (ほんとは回答を聞き取れる自信がなかったのもあるけど)。 ちょっとこわい印象だったけど、話をするととても気さくな人であった。
- Patrick May
- まつもとさんから「cgi.rbの代替を作ってる人で、mod_rubyのサポートについて 話があるらしい」と紹介を受けて、聞いてみるとどうもNarfの人らしい。 今はruby-webというアプリケーションを作っていて、mod_rubyを配布物に含めていいかどうかという話だった。 もちろん何の問題もないので、ぜひ作ってくれという話をした(つもり)。
- Geoffrey Grosenbach
- Railsのpodcastの人。 友達に、名古屋に6年くらい住んでいた人がいるらしい。 実家が愛知なので何かコメントしようと思ったが、名古屋ではないので 説明が面倒でやめておいた。 だいたい、日本人にもわかってくれない(愛知=名古屋と思っている)人が いるくらいだし。
- Jim Freeze
- 夕食のテーブルで一緒になって、まつもとさんと->について話をするのを 聞いていた。^もどうかと思うけどなあ。しかし、->は実に評判が悪かったですね。 年を聞かれて、自分の年を答えたら、聞かれていたのは子供の年ですごく 恥ずかしかった。
- John Labovitz
- Net::IMAPを使ってくれている人で、IMAPサーバ上のメールの振り分けを するアプリケーションを作っているらしい。 Net::IMAPについて前にメールしたんだけど、と言われて、返事をしてなかった メールがあったのを思い出し、あわてて誤ったのだが、どうも人違いだったらしい。 ximapdに興味を持ってくれたので、デモをしようとしたのだが、「ruby rails」 とかで検索したら15000通ものメールがヒットしてしまって、ひどい有り様だった。 デモ用のムービーとか作っとくといいんだろうなあ。Linuxだと何使うんだろ。
- Austin Ziegler
- PDF::Writerの作者で、ruby-profを作ってくれてありがとう、みたいな お礼を言われてうれしかった。 あとで聞いたら、RubyGemの熱烈な信奉者で、ruby-devでも話題になっていた 人だったらしい。 森脇さんと議論していた時にも、ちょっと話に入ってみたけど、結局何が問題 なのかよくわからず。
他にもちょっとした会話をした人はいると思うけど、相手がだれだかちゃんと 認識してある程度話せたのはこのくらいかなあ。 またこういう機会があるかどうかはわかんないけど、もっと英語を勉強しなきゃね。
結局、一番の収穫は、ライブラリがuntaintする際の指針について、akrさんと 合意に至ったことかもしれない。 私の案でいいから、ちゃんとマニュアルにポリシーを書いとけ、 ということですが。 落ち着いたらちゃんとまとめます...。
2005-10-28 (Fri) [長年日記]
_ 関西オープンソース発表
Rastの枠でximapdの発表をすることになりました。 もう明日ですね。
ぜんぜん準備できてないけどだいじょうぶかなあ。 とりあえず、スライドのタイトルはこんな感じで行くことに。
2005-10-29 (Sat) [長年日記]
_ 非決定性計算
今回いちばん面白かったのが、Haskell同好会のセッション。
吉田さんのプレゼンで非決定性計算の話が出て来たのだが、 Wikiでも紹介されていたようだ。
「他の言語じゃこんなことできないでしょ」という話だったが、 実はRubyConf2005のChad FowlerとJim Weirichのチュートリアルでも同じようなデモをやっていた。 それを使って書くと、
require "amb" A = Amb.new baker = A.choose(1, 2, 3, 4, 5) cooper = A.choose(1, 2, 3, 4, 5) fletcher = A.choose(1, 2, 3, 4, 5) miller = A.choose(1, 2, 3, 4, 5) smith = A.choose(1, 2, 3, 4, 5) A.assert([baker, cooper, fletcher, miller, smith].uniq.length == 5) A.assert(baker != 5) A.assert(cooper != 1) A.assert(fletcher != 1 && fletcher != 5) A.assert(miller > cooper) A.assert((smith - fletcher).abs != 1) A.assert((fletcher - cooper).abs != 1) p [baker, cooper, fletcher, miller, smith]
こんな感じ。 (Haskell版は全部の解が得られるけど、Ruby版は最初の解しか得られないところ がちょっと違う。)
どうやっているかというと、A.assertの呼びだしで継続を使ってバックトラック しているのだが、Rubyもなかなか面白いでしょ? ちなみに、amb.rbはこんな内容。
class Amb class ExhaustedError < RuntimeError; end def initialize @fail = proc { fail ExhaustedError, "amb tree exhausted" } end def choose(*choices) prev_fail = @fail callcc { |sk| choices.each { |choice| callcc { |fk| @fail = proc { @fail = prev_fail fk.call(:fail) } if choice.respond_to? :call sk.call(choice.call) else sk.call(choice) end } } @fail.call } end def failure choose end def assert(cond) failure unless cond end end
あとで、池上くんや山下さんとちょっと話したのだが、Haskell版はlazy なのがポイントらしい。 だからRubyでは無理でしょと言われて、その時はブロック使えばいいじゃん と話したのだが、継続版だとブロックも使わずにすっきり書けますね。
元ネタはSICPらしいけど、どんな解なんだろうな。 会社に行ったら調べてみよう。
追記:
リンク元のWikiページ を見ると、継続使うのはやっぱりSchemeからの借用っぽいですね。 そらそうだよなあ。
_ hisashim [ご指摘ありがとうございます。件の箇所は、引数がreadableかどうかとdirかどうかをチェックするように直しておこ..]
_ shugo [ちゃんと報告しなくてすみません、よろしくお願いします。 =()ならだいじょうぶそうですね。]