星の贈り物

取り逃せば、二度と巡って来ないかもしれない
だから何度も自問せずにはいられないんだろな
――明らかな優劣のない 複数の望ましいチャンスが競合した場合には

2006年6月の日記

2006年6月2日

Preview Version of Kamiraiduki Released

[topic:Haskell、Creative Commons]

ようやく名前が決まった & sourceforge にファイルを置いておくスペースが確保できたので、 未踏で作っていたもの をリリースしました。

フィードバックをあまり受けておらず、しばらく別のことに取り組んでいたため、中身はあまり変わっていません。(もちろん、適当なファイル置き場が無かったので、保存場所として上記のところにあるファイルを差し替えていたというものありますが……。) 従って面倒な課題点が結構そのまま残っています。コードをきれいにするために GUI の記述を全面的に AutoForms と wxFruit を使って差し替えることができればと考えていますが、そうするためにはそれらの完成度を上げなければいけないので、実際にそうできるのはまだまだ先のことになりそうです。

あと、長らくその存在を仄めかしておきながらも適当な公開スペースがないために公開していなかった、 GLCanvas 等を有効にしてビルドした 上にいくつかの patch を適用済みの、GHC 6.4.2 用の Windows 版バイナリと GHC 6.4.1 用の Mac 版バイナリも上記スペースで公開しています。ちなみに patch 自体は以前に haskell-jp に投稿してある他、Kamiariduki の方に入っています。Pan on Yampa もとい wxFruit もこちらで公開するべきかしらん。


2006年6月3日

日本語の Haskell 入門書の次に読むべき本は、洋書の Haskell 入門書

[topic:Haskell]

レビューアーをやっていた関係で青木さんに献本を希望していた、ふつうの Haskell プログラミング ( Amazon ) ( ふつうの Haskell プログラミング のサポートサイト ) (以降、ふつける)が昨日届いたので、早速読んでみました。

ページ数の都合か、遅延パターンの記述が消えていますね。使用頻度が低いから説明しないというように書いてありますが、コードとか論文とか読んでいる中でこれが出ても、記憶やこの本の第7章を(意図されているように)リファレンスとして引いた時に引っかかるものがなくて、戸惑うかも。そんな風にレビュー時との違いやその中で話題になりながら結局書かれなかったなどを書くこともできると思いますが、まだ発売されたばかりで時期尚早ですし、 RHG 読書会 用のネタだとも思うので、今ここでの言及はやめておきます。

無難な話をするなら、 入門 Haskell と同じく今まで Web 上にしかなかった話を載せていることにより洋書のものに比べて現在の Haskell プログラミング事情に近い話をできている、という後発組の恩恵を受けている のが、この本の嬉しいところだと思います。ページ数の制約から定番の洋書の Haskell 入門書に比べて足りない部分もありますが。それと、著者が関数プログラマーではないというのが、入門書としての分かりやすさという点からするとメリットとなっている反面、この本をパズルを解いていくような重みというものが感じられない、関数プログラミングについて書いている本としての醍醐味を失っているような感じのするものにしてしまっているのがちょっと勿体ないかもしれません。……入門 Haskell のように急に学習曲線が高くなるのも困りものですが。

Dan さんが早々に書いたレビューの中で、入門 Haskell も手にして欲しいと言っている のには同意します。ライブラリ本のない現時点ではふつけると入門 Haskell がそれぞれの欠けているトピックを補う存在となっていますし、上述した欠点を補う意味もありますし。 Haskell でテキスト処理をやっている本が欲しい という 積年の想い を実現したものであるため、情熱が洗い流されているという意見には同意しかねますが。まあ、そう言ってしまうだけの Pugs に対する熱意は分かりますし、両方足しても語りきれていない Haskell の魅力を語るということで、Dan さんの書く記事を楽しみにしています。ライブラリやテクニックなどについて書いた本のない現時点では、 Haskell の入門書の次に読むべきものは論文ではなく、洋書の Haskell 入門書 だと言っても差し支えのない状況になっていますし。……ああ、やっぱり書かないと。こうした本への欲求はあっても、私以外に私の周りで自分で書こうっていう人を見かけませんし……。そのためにも、2冊目の本の企画を立ち上げられるよう、ふつけるが瞬間的にではなく順調に売れ続けてくれると良いのですが。

まあ、教科書を想定しているだけあって、定番の Haskell 入門書が本当に良くできているというものありますけどね。


2006年6月4日

Gauche Fest を通して Delimited Continuation について書いてある論文読み

[topic:Haskell、継続]

昨日は会場で、今日は家と外出先で GaucheFest:12th に参加しました。主に 先日の論文を読む というのをやっていましたが、家や会場にいると IRC のチャンネルに繋ぐためにマシンを起動してしまうせいでついついそちらに流れてしまうので、早めに出かけて淡々と読んでいて、それだけで時間がきてしまったので会場には向かわずに Real-Time Rendering 読書会に行ったという次第です。

内容の説明はあっちにちょっと書いておきましたが、本人にコメントできるようなことはすぐには思い浮かびませんね。住井さんの An implementation of transparent migration on standard Scheme. など、参照されている論文でも調べてみようかな?

あっ、ちなみに現在の Haskell Hierarchical Libraries の Control.Monad.Cont や monadLib にある継続モナド の callcc の型だと効率が悪いというのは、もともと継続をうまく型付けするために Cont r a の r のようなリージョンを導入していて、


> callcc :: ((a -> CC b) -> CC a) -> CC a
> callcc f = withCont $ \k ->
>              pushSubCont k $
>              f (\v -> abort (pushSubCont k (return v)))

の abort にあたる部分がリージョンのトップレベルの型を参照しているため、


> loop :: Int -> CC Int
> loop 0 = return 0
> loop n = callcc (\k -> do { r <- loop (n - 1); k r })

このように loop を定義した時に、それぞれがすぐに廃棄されるため決して使われることのない現在のスタックを持ってしまい、stack-space leak を引き起こすという話です。


> callcc :: ((CC a -> CC b) -> CC a) -> CC a
> callcc f = withCont $ \k ->
>              pushSubCont k $
>              f (\c -> abort (pushSubCont k c))

なら、


> loop :: Int -> CC Int
> loop 0 = return 0
> loop n = callcc (\k -> k (loop (n - 1)))

のように末尾再帰の形にできるので、末尾呼び出しになってその問題を回避できます。

ちなみに、このことについて書いてあった A Monadic Framework for Delimited Continuations という Technical Report の、前に紹介した URL のもの は古いので、 Amr Sabry のページにある最新のものか提出されたものを見た方が良いとのこと。確かに、Simon Peyton Jones のページにあるものには TODO が書かれていますね。彼のページで Revised されたバージョンと書かれていたので、勘違いしていました。Conclusion で Pugs や Zipper などの実装について言及してあったので、気に入っていたのですが……。


2006年6月10日

読書会をやっているReal-Time Rendering Second Edition ( Amazon ) ( Real-Time Rendering Second Edition のサポートサイト )の翻訳本の リアルタイムレンダリング 第2版 ( Amazon ) が出たので、買ってきました。相変わらずハードカバーだと2倍の値段になるのが困ったところですが、一応担当を決めての輪講方式ですし、Ruby Kaigi とその懇親会を我慢すれば買えないこともないかなと思って購入。……後であがってくるログ次第では後悔するかもしれません。


2006年6月16日

第1回クリエイティブ・コモンズ・セミナー に行ってきました。1回目なので基礎的な話でしたが、取り零していたようなところもあったのでシステムを作る上で参考になりました。

質問してみたところ、 あるページ内のクリエイティブ・コモンズ (Creative Commons) のライセンスから除外するコンテンツをどうやって機械にも分かる形で提示するか という問題については、本家でもまだまだ議論をしている最中のようです。ファイルに情報を埋め込むべきという意見もあるようですが、検索ツールがファイルフォーマットを理解しなければならないというのは敷居が高そうなのでいまいちです。講演者の言っていた適用するライセンスごとにページを変えるべきという意見については、どのみちクリエイティブ・コモンズでないライセンスを示すようなメタデータがないと Kamiariduki のようなディレクトリごとにデフォルトのライセンスを基準を作っておくようなロジックを使っているとうまく扱うことができない可能性があるし、そもそもそういう規範に従っては作りづらいページもあるでしょうからあんまり良い解決策ではなさそうです。

かといって owl:complementOf を導入すると OWL Lite の範囲を超えてしまいますし……何かうまい解決方法はありませんかね。 神崎さん に相談してみるべきかなぁ?


2006年6月17日

今日は RHG 読書会 に行ってきました。……と、だけ書いておいても構わないのですが、 日下部さんが何の捕捉もなく D-Clean (Distributed Clean) のサイトを紹介している のでそのことについてちょっとだけ。

D-Clean は分散コンピューティング(distributed computation)を目的として、並列プログラミングと分散プログラミング(distributed programming)の掛け橋となるよう作られた言語+環境です。例によって CEFP 2005 で習った言語の1つですが、導入や使用するのに手間がかかるので使い方はいまいち覚えていません。最近言語の色々なバリエーション(変種)の調査をしていて、公開されているのにたまだま気づいただけですし。CEFP 2005 のサイトに Distributed Pattern Design in D-Clean という論文が挙がっているので、それを見て GUI を色々弄繰り回し、説明どおりにコマンドラインを叩けば使えるとは思いますが。 講義のスライドサンプルコード も挙がっています。D-Clean では map などの高階関数が分散コンピューティングのためのデータ型になるだけなので、文法そのものは難しくないと思います。


2006年6月18日

先日話題にした Real-Time Rendering 読書会 に行ってきました。

あと、最近 oleg さんが USENIX 06 のレポートを送ってきていて、面白かったので「内容を紹介しても良いですか?」と尋ねたところ、自分のところで公開してくれたのでリンクを張っておきます 。ありがとうございました。

とりあえず ようやく時間が取れた ので、ちょっとした雑感を書いておきます。

最後の方にありますが、Pixar and Software Development が一番面白かったためか、(一番最初に単体で送ってくれた)これに関するレポートが一番の力作になっています。何が物事のボトルネックとなっているかを良く考えさせられる話です。Pixar はソフトウェア開発会社ではなくストーリーを作る会社なので、ストーリーの最終的なその場面に相応しい絵を作るまでレンダリングとそれに必要なソフトウェア開発が繰り返されることになります。で、ちゃんと望む絵を作れるようにするために(メモリ管理などの)デバッグ用のコードを入れてレンダリングの速度を低下させたり、速度の向上のためにマルチスレッド化したり、とかそういう苦闘の話が色々と書いてあります。oleg さんは最後に、彼らには OCaml や Haskell のようなより良いグルー言語 (glue language) が必要だと言う風に述べていますが、まさにその通りだと思います。デバッグ用のコードで速度の低下したプログラムを使って何度もレンダリングするよりは関数型言語を使うことを選んだ方が遥かにましでしょうし、 STM が活用できるよう SMP Support の入っている GHC 6.5 以降 であればパフォーマンス向上のためのマルチスレッドプログラミングにも使えますし。あとは、oleg さん自身が示唆しているようにメタプログラミングに OCaml や Haskell を活用するというのもありです。 現在の highest-performance computing はコード生成/メタプログラミングが全てだ そうですし。

上の [Haskell-cafe] Functional programming for processing of large raster images というスレッドで、oleg さんの紹介しているメタプログラミングやそのコード以外の話で興味深かったのは、 GHC 6.5 に入ってきている Bang patterns ですね。マッチする値は使われる前に正格評価されることになるので、効率のために正格評価させたいような値を持つプログラムを書くのが楽になります。

USENIX 06 の話に戻りますが、oleg さんは色んな人に関数型言語を使わないかという提案をしていたようですね。最後のレポートでは、講演の後に Python のコード生成器として MetaOCaml を使うメリットについて説明した、と書いてありますし。一連のメールが届く前に Haskell リストに投稿されたメールでは、Andrew Tanenbaum と「どうすれば OS の開発者達の間に、Ocaml や Haskell のような言語がより注目されるようになるか?」ということについて話をした そうですし。ちなみに、そこで紹介されている MINIX3 のいくつかのサービスを OCaml で書き直している学生のプロジェクトというのは、これ なようです。スレッドに投稿されている本人のメールによると、Haskell を使って書くことにも興味があるとか。


声なき言葉へ