未だそこに到達することはない未熟さゆえに
昨日今日と Haskell Marathon に参加しました。はまりまくりで自分の分はあんまり進められませんでしたが、コードをレビューし合ってより美しく書くにはどうすればいいかという議論にその場で触れることができて非常に有意義な二日間でした。
……経験値が足りない。Haskell はずっとつきあっていきたい言語なのでもっときちんと身につけておかなくては。
Opera 7.5.X を入れて IRC を利用できるようになったので、久しぶりに IRC に接続してみるものの #kahua と #SICP-reading:*.jp 以外にはどこに参加するべきだろう。上記二つは誰も喋っていないのでそれに関連する話題じゃないと話せそうにないし……。
[topic:プログラミング、Haskell、SDL]
どうやら Haskell で SDL ライブラリを作っている人が二人いるようですね。一つはHaskell 本家のメーリングリストにアナウンスを流した方で、幅広く取り組んでいるようです。もう一つは精力的に日々 Haskell の日本語リソースを生み出している方で、SDL 上で Haskell で OpenGL を使う方法を書かれているのでどうせなら二人で協力してくれないかなぁ、と思います。
思っているだけでは何も変わらないので、その方の掲示板に情報を伝えておきました。
[topic:プログラミング、wxHaskell]
wxHaskell で filer プログラムを作成しようとしているのですが、なんかうまくいきません。アドバイスしてもらって示されたプログラム
-- 赤の値を最大化した絵が表示される。
onPaint vbitmap dc viewArea
= do mbBitmap <- varGet vbitmap
case mbBitmap of
Nothing -> dcClear dc
-- Just bm -> drawBitmap dc bm pointZero False []
Just bm ->
do sz <- get bm size
im <- imageCreateFromBitmap bm
pb <- imageGetPixelBuffer im
fillPixelBuffer pb sz
bm' <- bitmapCreateFromImage im (-1)
drawBitmap dc bm' pointZero True []
bitmapDelete bm'
imageDelete im
where
fillPixelBuffer pb bound
= mapM_ redshift [Point x y | x <- [0..sizeW bound-1]
, y <- [0..sizeH bound-1]]
where
redshift pt
= do c <- pixelBufferGetPixel pb pt
let newcolor = rgb 255 (colorGreen c) (colorBlue c)
pixelBufferSetPixel pb pt newcolor
に従って書き換えてみたんですが、どうにもうまくいきません。
-- この関数はまともに働かずプログラムが停止する。
onPaint vbitmap dc viewArea
= do mbBitmap <- varGet vbitmap
case mbBitmap of
Nothing -> dcClear dc
-- Just bm -> drawBitmap dc bm pointZero False []
Just bm ->
do
sz <- get bm size
im <- imageCreateFromBitmap bm
pb <- imageGetPixelBuffer im
fillpixelBuffer pb sz
bm' <- bitmapCreateFromImage im (-1)
drawBitmap dc bm' pointZero True []
bitmapDelete bm'
imageDelete im
where
fillpixelBuffer pb bound =
mapM_ drawLowpassFilter [Point x y | x <- [0..sizeW bound-1]
, y <- [0..sizeH bound-1]]
where
drawLowpassFilter (Point szx szy) = do
lowpass <- (lowpassFilter (Point szx szy) bound)
pixelBufferSetPixel pb (Point szx szy) lowpass
pixelColorInt (Point ptx pty) (Size szx szy)
| ptx < 0 = pixelColorInt (Point 0 pty) (Size szx szy)
| pty < 0 = pixelColorInt (Point ptx 0) (Size szx szy)
| ptx > szx = pixelColorInt (Point (ptx-1) pty) (Size szx szy)
| pty > szy = pixelColorInt (Point ptx (pty-1)) (Size szx szy)
| otherwise = do
pixel <- pixelBufferGetPixel pb (Point ptx pty)
return (intFromColor pixel)
lowpassFilter (Point szx szy) bound = do
-- pixelsInt <- foldM (+) (pixelColorInt [Point x y | x <- [szx-n..szx+n], y <- [szy-n..szy+n]])
pix1 <- pixelColorInt (Point (szx-1) (szy-1)) bound
pix2 <- pixelColorInt (Point (szx-1) (szy)) bound
pix3 <- pixelColorInt (Point (szx-1) (szy+1)) bound
pix4 <- pixelColorInt (Point (szx) (szy-1)) bound
pix5 <- pixelColorInt (Point (szx) (szy)) bound
pix6 <- pixelColorInt (Point (szx) (szy+1)) bound
pix7 <- pixelColorInt (Point (szx+1) (szy-1)) bound
pix8 <- pixelColorInt (Point (szx+1) (szy)) bound
pix9 <- pixelColorInt (Point (szx+1) (szy+1)) bound
let pixes = (pix1 + pix2 + pix3 + pix4 + pix5 + pix6 + pix7 + pix8 + pix9) `div` 9
return (colorFromInt pixes) -- (colorFromInt $ (pixelsInt / 9))
どこを勘違いしているのか、誰か教えてくれないかな?
得尊さんの誘いで参加した IRC で思わぬ人に会っていることに気がつく。人の縁とは不思議なものですね。そこに行った時に最初に目に入った話題より、タイプ別性格診断の結果INTP型:問題を解決したがるだそうです。
頭の中でじっくり考える( I 型)なので、N型の想像力がいろいろな可能性を思いつく。
客観的(T型)なので、その新しいデータを分析し、際限なく融通がきく(P型)ので、どんなデータもさっそく取り入れてしまう。
論文、図面、計画、企画、提案、理論などなんであろうと、こまごました情報を一つにまとめた完成図を作りあげようとするが、たえず新しいデータを発見するので、その完成図がどんどん膨らんでしまう。
その結果、考えや構想や計画がどんなに最終的なものに見えても、土壇場になって「新しいデータ」が手に入ると変えてしまうのである。
他はともかく、これは間違いなく合ってますね。
その後、朝起きて LL Weekend に参加して xyzzy wiki の佐野さんと出会う。人の縁とはやっぱり不思議なものですね。Haskell Refactoring Mode の移植に関しては難しくて答えられないような質問だったとか、Emacs の関数が使いたい人は大体 Meadow に言っちゃうので移植する人がなかなか出てこないとかそういう話になりました。
飲み会ではいつもの通り Haskell の話で盛り上がる。Gauche の Windows 版に期待している人も予想通りいたので義務感が募る。
[topic:プログラミング、wxHaskell]
[haskell-jp:440] Re: インデックスを使うデータ型でも書いている通りその後解決法が見つかったのですが、物凄く遅くて使い物になりません。
メーリングリストでこの話をした直後ぐらいに本家の方のメーリングリストが image writing library の話題で盛り上がったのも印象に残りました。wxHaskell でやるのはやっぱり用途的に重いとのこと。
昨日書き忘れましたが、Haskell で仕事をやっている池上さんがうらやましい。
今日も Gauche Windows 版を楽しみにしてます、という声を聞きました。とはいえ、ただ、まだ一発でパッケージングまでいきません。gauche-installを動かすために、いくつかのシステム関数をエミュレートしなくちゃならないんで。
と shiro さんが言っているように、現状ではまだ Windows 版はリリースできません。このあたりよく分からないので shiro さんのモチベーション次第だと思います。代りに WindowsAPI のサポートのため試行錯誤していますが。
[topic:プログラミング、Haskell]
とりあえず意図が伝わっていれば十分かなと思ったのですが、akr さんに不評だったりなにが得なのかをさっさと喋ったほうがいいのかも
というコメントを貰ったりしていてそううまくはいかなかった模様。
一番のメリットは始めの方に話した通り手続き的に Observer が監視したり変数をつついたりするように書かなくても Reaction を書くだけで十分なことで、この辺りはちょん切れてしまった switch 系の関数の解説を喋れたら伝わったかもしれないので、残り一分間の感覚と言うものを知るために経験を積む必要あり。デモの凄さばかり印象に残っていてそんなに LL3 の内容って覚えていないものなんだなとも思った。あと、飲み会の後の喫茶店で Lightweight Language Magazine がどうして不評なのかという話でも言ったように長くするべきところは長くして短くするべきところは短くするメリハリも重要だということも忘れてはいけないだろう。
一応念のために switch 系の関数について説明しておくと、特定の値が来るまである処理を行い、その値がくると切り替えた処理を行うという reaction をおこす関数です。
……とここまで書いたところで、記述量の少なさは関数型にとっては魅力だけどそうでないものにとっては全然魅力を感じられないかも、と思う。だとしたら、最初に言ったように Robot、GUI、Animation の共通特長を括り出しているので、フレームワークを作りやすくするためのフレームワークであることをもっと強調した方が良かったかもしれませんね。
うっかり体質をどうにかしないと。そのうち大変なことになるかもしれない。
昨日犬を散歩に連れて行こうとしたときに紐を持っていなかったよその犬に噛まれていた事をすっかり忘れていて、注意されました。そのときはパッと見平気そうでしたが、血が出ていて病院に連れて行くことになりました。お姉さんの「ごめんなさいっ、ごめんなさいっ。」っていう声が印象に残っていたにも関わらずなんで忘れるかなぁ?
ちなみにいつも通りもう少し連れて行くのを待てばそういうことはなかったはずで、偶然というものの力を思い知らされる。
今更何日か前に書かれていたメッセージを誤読していたことに気がつく。まあ、いいか。私の実力がないように思われるだけで実害はないし。
make のデフォルトでは表示されないメッセージが jam ではきちんと表示されたりして、こういう部分も Boost.Build の人たちが Jam ラッパーにしようとした一因でしょうね。
coLinux がまともに動かない。他のサイトで使うことになっている colinux-console-nt と daemon との接続を確立できないし、かといって解説されていない Cooperative Linux console の使い方は分からない。うちの環境が悪いのだろうけど、原因が特定できないから報告するわけにもいかないだろうし……Kahua とか WASH とかを Windows 環境上で利用したいだけなのに……。ノート PC がないのは不便だから Mac を入手しろということなのだろうか?
見えているはずのものが見えていなかったり、そのせいで過ちを犯していることに気づかなかったり。まぬけです。
今日はコミケで人と会うはずだったんですが、電車乗り間違いまくって大幅に遅れるし、それでも15時に発つと言っていたのもあったから間にあうかもしれないと思って一時間以上待っていたのが間違った場所だったり……当然会えるはずもなく…………。さて、どうやって弁解しようか。
と、それだけじゃどうしようもないので折角だから Arrowised Functional Reactive Programming のサンプルを見てみる。これ自体をインストールしにくいという欠陥はあるものの、そこを抜ければモナド地獄ではないエレガントなプログラミングができる。モナドなコードもモナドを使っていないコードも集約させて使えるのが嬉しい。……問題はいつものことながら文書の整備されていないこと。論文にすら出てきてないような関数も多数。
WiLiKi で shiro さんっぽいコメントをしていた人が shiro さんではなかったことが判明。道理で……
Gauche で Windows API を直接的にサポートさせようとすると、C のメモリ関係のディープな部分について知らなければいけないことが判明。それを避けるために C++ を学習していたのですが、メモリ関係やアセンブラ関係のコードを生成するようなプログラムを書くのは誰かが先にやってない限り自分でやらないといけないので、今のところ避けられそうにない問題。C++ は何かと罠が多くて複雑な部分ばかりが問題視される言語ですが、そういうのを低レベルに押し込めて煩わされないようにしてしまえば良いところもあるので、コンパイラの実装者からの拒絶をくらったりなど委員会で揉めて無駄に複雑になっている部分をどうにかしてきれいに直していって貰いたいところ。……って、これは前にも言ったことがあるような気がしますが。
GCC プログラミング工房の書籍版が出てないうちから C のディープな世界に挑むことになるのか、それとも良いラッパーを見繕ってその上で Windows API から出てくる機能をなるべく低レベルでサポートしたライブラリを作るのか……そのバランスで悩んでいるのですが……やっぱり、両方ともやることになりそうな気がします。
wxHaskell とのバインドの勉強のつもりでしたが、そっちの方がよっぽど簡単そうな予感。
メーカーの新製品モニターを募集する母体にしたり、製品のフィードバックを集める情報源にし、いくらかのマージンを得るといったモデルを想定する。
という uume のモデルは、メーカーが自サイトを運営するときにそうやってコミュニティを作っていくべきだと主張し Amazon のレビューによるコミュニティの構築を誉めていたゴンゾー・マーケティング (Amazon) の話を思い出させる。また、そうやってユーザーテストをできる母体が確実に提供される状態を作れるというのは願ってもないことだろう。……ユーザーテストの利用仕方を間違えたら意味ありませんが。
今日はいつも通り RHG 読書会に参加しました。評価器周りは分かったような分からないような……。
スウェーデンの人ですが、Haskell の最近の事情について日記で書いている人を発見。こうして Haskell についての日本語の情報が増えていくのを見るのは嬉しい。
[topic:プログラミング、Haskell、圏論]
LL Weekend の懇親会に引き続き、今日の読書会でも圏論勉強会をやろうという話がでました。近々 haskell-jp でアナウンスが出ると思うので、興味のある方はそちらの方をチェックしていただければと思います。
ええと、圏論とは数学の集合論の特殊な分野(ホモロジー代数などでも使われることを考えればもはや特殊なと言うことはできませんが……)で、これを勉強しようというのは、稲葉さんのページで"圏論とプログラム"関係の本と挙げられているようにプログラミングにおいて圏論の知識があると役に立つ部分があるからです。また、Haskell 本家のメーリングリストを見ていれば分かる通り、Haskell は数学をそのままとは行かないまでも、それに近いような定義をほぼ直接的にコードで表すことが出来るという高い記述力を持っているため、圏論を理論的枠組みとした書かれたプログラミング関係の論文に Haskell のコードが現れる、つまり Haskell の論文の中には圏論の知識を前提としているものがあるのでそれを読むために圏論の知識が欲しいというもあります。
まあ、Monad や Functor からして実は圏論の応用だというのは有名な話ですね。
日本語の圏論を扱った本がことごとく絶版になっていて、代りにホモロジー代数などの本を使わなければならないかなという不安はありますが、それでも楽しみです。
また GHC をコンパイルするのが遅いと言われていますね。GHC のコンパイルが遅いのは、GHC 自体をブートストラップの GHC でコンパイルしているのと、GHC が抱え込んでいる非常に巨大なライブラリ群を中間(カーネル)ファイルとライブラリファイルにコンパイルしているからです。lazy な pure functional 言語であるおかげで同様に Clean を使ってコンパイルする Clean も C で書かれていた時代よりプログラムのコンパイルが遅くなったことから考えると、それだけコンパイルしなければならない GHC が遅いのは当然というわけで……。あとは Generic と存在論型の二つに絞り込んで機能を取り入れた Clean と違い、きちんと GHC で使えるソースの出ている研究成果を片っ端から取り入れて肥大化した処理系であることも一因だと考えられます。(まだ取り入れられていないものもありますが。)こういう知識を外に出すためにも、オープンソースカンファレンスでその言語を用いて自分自身の処理系を作っている処理系について喋らせてもらおうかな?
稲葉さんに反応して後期ヴィトゲンシュタインについてトピックを設けて言及してみようと思いましたが、読んでいない状況でそれをやるのはよろしくないと思ったので止め。そんな状態で思うのは認知意味論 (Amazon) をこそ読むべきではないかということ。この本を読んでいるとますます後期ヴィトゲンシュタインの存在の大きさを思い知らされますが、それでもヴィトゲンシュタインの考えたことを提示しそしてその内容を改良してより良くした理論についてふんだんに解説してあることを考えると、これこそ読むべき本なんじゃないだろうかと思います。セマンティックウェブの基本技術に使われている RDF についても、これの知識を通して見るのと見ないのとでは結構見え方が違いますし。両方読んだという方のつっこみ求む。
ML と Haskell について冷静な分析が行えるとおもったのですが、うまくいきませんでした。
[topic:プログラミング、Haskell、ML]
笹川さんが Haskell は難しいと言っていたのや、mixi で向井さんが ML 系言語と Haskell の内ゲバがあるようなないようなということを話題にしていたのがちょうど重なったので、ML と Haskell について思うことをちょっと書いてみます。
先月の RHG 読書会で向井さんや LL Weekend 後の飲み会で福盛さんと話した時になぜ Haskell が好きなのと聞かれていた時に答えたのが、(両者に共通の型推論と)遅延評価と型クラスだったと思います。遅延評価がいいというのは誰でもすぐに納得してもらえることで、遅延評価ゆえの記述力の高さをうらやましいという言葉はよく聞きます。型クラスについては ML 系の言語で散々悩んでいる名前の衝突をエレガントに解決しているだけに、OCaml の Objective な部分や G'Caml では微妙に方向性を間違っているしということでとりあえずの支持は受けるものの、その代わりに ML 系言語でモジュールをうまく外に示している structure を持てないことで、あちらを立てればこちらが立たずというような感じで受け止められています。
ところで私は OCaml から Haskell に流れて結局そこに落ち着くことにしたのですが、どうしてそうしたかというと説明しづらいものがあります。上記の二つが良かったというのは確かですが、Monad を理解するときの苦労を考えると、どうして Uniqueness Type を使っている Clean ではなく Haskell に落ち着いたのか自分でも不思議に思います。GHC や Hugs の拡張を使ってパズル的にやれるところにはまったのかな? C++ でも STL と Boost 以降全然違うパズル的な言語になってしまったところにはまっているのですし。……違いますね。そんなのじゃなくて Clean と Haskell で微妙に文法が違うその部分で Haskell の方が気に入ったのですね。とすると、OCaml で再帰にするときに rec をつけないといけなかったりする微妙な文法の違いも Haskell を選ばせた原因でしょうか? そのあたりは SML では大丈夫なのですが、やっぱりなんとなく文法的に Haskell が好き。上記の二つの利点を補えばいいというものでもないけれども、文法の気に入らないところを見ていくとそれらが理由になっている部分も大きい。一つを変えればなし崩し的に他も変えなければいけない可能性も高い。だけどそれを加味しないとしても曖昧な好き嫌いでしか終わらない部分も多く残る。せめて"SML の Optional の型は良いと思う。Maybe で代用しなければならない Haskell より素直に書けるから"と論理的に言える部分がもっとあれば……それに、SML と OCaml は全然別物なので一括して語ることができないのが苦しいですね。SML や OCaml の本の読書会とかあれば参加してみたいとは思うけれども、積極的に使おうというほどではない、この隔たりは(上記の二つ以外には)どこにあるのか?
さて、Haskell が難しいと言っている方がどこが難しいといっているのかも気になる。Monad なら同意するけれども、SML や OCaml を習得している方々であればやさしくない「やさしい Haskell 入門」でやっていけると思うのだけど、どこでつまずくのだろう? やっぱり他の言語に比べて記号の利用率が高くてそれが他の言語と違う部分で用いられているところだろうか? でもそれなら ML 系言語の使用者にはさほど影響はないはず。
ML 系の言語を良く言う方が pure でないことと遅延処理を全てに適用しないことによるパフォーマンスのことを問題とするならともかく、そうでない部分を問題にしていくとどちらがどうなのかという問題には決着がつけれそうにない。少なくとも今の私には手にあまる問題だ。それでもどうにか落しどころがないかと考えながら書いてきたが、どうもうまくいきませんでした。ここには載ってない文法の問題についても色々と分析してはみたものの、大抵は感覚の問題で退けられてしまいます。
今日は『計算機プログラムの構造と解釈第二版』を読む会II第十九回でした。近頃ヘアドライヤーとくるくるドリルとリボンなどについてカミングアウトできる IRC のチャンネルに入り浸って寝不足になっていたのと、問題でやけにつまずいていたので、問題回答中にせっかくの読書会なのにうとうとしてしまったのが心残り。来月からはようやくノート PC の環境を復帰できるので、それで取り返したいところ。
帰りの電車の中で Scheme は許容範囲という言葉を使ってしまったことが気になっているけど、ようするに Common Lisp には気に入らないところがあるということです。動的な言語では Scheme 最高!
睡眠不足だったようです。今日一日何度も寝ていました。
院試に備えて読まなければいけない本を読み終わった(本当はもう一冊あったんですが、不要でした。)し、噂に聞いていたザ・ゴール (Amazon) 等 TOC (制約条件の理論) の本も最新作以外読み終わったので、あとは見直しと興味を持った本を読んでおくぐらいにしておいて、英語力強化の為にプログラミングや数学関係の文書を読んでいくということでいいかな? 来月着くはずだったのに今月中に送られてきたときはどうしようかと思ったけど、結果的にいい方向に働いている感じ。ザ・ゴールはボトルネックに注力し、ボトルネックが解消したら別のボトルネックに取り組むやり方だと聞いていたのですが、理論上は確かにそうなんですが聞くのと実際の活用し方というものを小説形式で読んでいくのは大違いなので、聞き伝えで知っているつもりになっている人ほど読んだ方がいい本だと思います。それにしても、良いアイデアというものはたいてい既に出現しているのだけど、それを実際に普及させるためには次官が買ってそのためにより良い方法の上でなら消えるはずの偏見が残っているということを改めて思い知らされますね。
本当は先生方の本も読んでおいた方が院試対策になるんでしょうけど、読む速度があまり速くないので悪あがきをするよりはきちんと英語力の底上げをした方が良さそうかなという判断。もちろん、図書館で見かけたら借りて読んでみるつもりですが。英語の問題は要約をしろとか訳せというものなので多読が鍵になりそうな感じ。