後悔。
人は間違いを犯さずにはいられないものだけど、それでもこの手でできうる限りは避けたい。
明けましておめでとうございます。今年もよろしくお願いします。
今日は Haskell の RDF 関係のライブラリを評価していたけど、いまいちやる気がでなかった。……まあもともと土日は仕事をする予定ではなかったので、それでもいいけど。CheckRDF は RSS 用のアプリケーションにすぎなかったので、Swish を使おうかと思っている。先の FTP ライブラリ同様、GPL なんだけど交渉してくれればどうにかすると書いてあるのでインターフェースを作ってからバンドルしたものを GPL にしなくていいように交渉してみようと思う。……ダメだったらなにか代替ライブラリを作るしかないけど……それで心配なのはサーバーが落ちているみたいなので果たしてメールが届くかどうかということだったり。
[topic:C++、D、Python]
Python オプショナルな静的型に generic type を入れるの止めちゃったかー。まあ、分かる話ではある。generic type というのはかなりの曲者ので、暗黙のインスタンス化を許さないと書きにくいような関数もあるのに、許すと戻り型や
そんなわけで気持ちはわかるけど、こんな中途半端な形で静的型を入れるんならやっぱり Python は選択肢から除外。私的には。
[topic:Haskell、XML]
やっぱり HaXml を使うのがいいという結論に。Haskell XML Toolbox は色々と出来るように見えて XSLT 的にドキュメントを変換する方の関数ばかり備えていて使いにくいというか大ナタを振り回しているような印象がある。namespace や不正な XML/HTML への対応、RELAX NG への対応予定など魅力的な要素もあるけど……という感じ。HaXml の XSLT の代替ともいえる文書変換ツールとしての役割に刺激を受け、HXML のツリーを辿っていくものから発展させたけっかだろう。XSLT も使用可能にしようとしていることから分かるように、作者が文書間の変換にしか興味がないようでそっちの API ばかり充実させて HaXml にはあるような低レベルのもう少し広い用途に使える API がないので現状では XML の応用とかフォーマットとしての利用などをしづらい。一方、HaXml は Windows Native な GHCi 上で動作を一々確認できなくなるのが問題だったりする……いや、コンパイルして調べていくっていう方法もあるけど、なんかそれは面倒というかなかなか気が進まなかったので遠回りしたんだけど。
……ていうことを理解するのにずいぶん時間がかかった。論文と Haddock による記述だけできちんと文章化されきれてないせいだ。ドキュメントの自動生成は良いけど、そればかり当てにしてしまってきちんとした文章化を怠ることもあるという良い例。これが Haskell コミュニティに蔓延しているから困るんだけど……。
Ruby の会新年会のメーリングリストには伝えたし、今年の抱負を書いておこっと。
未踏プロジェクトを頑張ってやり遂げる
Haskell で論文書きたい
Haskell で本の原稿を書く(必ずしも出版はしなくていい)
そんなところ。
RHG 読書会準備会とその後の Ruby の会新年会に行ってきました。DSEL (言語内 DSL) を Ruby の人たちに薦めていったらどうなるかという反応が見たくて、On Lisp とか C++ Template Metaprogramming とか薦めてみたけど反応はいまいちだったような。まあ、訳者をつれて来れるならという意見があったので、かけあってどうにかこっちの方向にすすめられると良さそうなんだけど……。……いや、もちろん Haskell 98 翻訳会になるなら、それはそれで期待するところはありますよ。
そんなこんなで、RHG とはなんの略かという話になったり。Ruby Hacking Guide ではなく、Rubyist Haskell GHCHG なんだとか、色々。私的には RHG 読書会 Sound Stage (リリカル・マジカル…)のつもりで外伝的内容だと思っているので、名称にはこだわらないけど。
読書会準備会の会場で、未踏の公募結果のページから採択概要へのリンクがようやく出たのを確認する。CLI って本当に C# だったんだとか、そういう発見もあって興味深いですね。あ、そうそう、「共用著作物を利用したコンテンツ作成システムのためのフレームワーク」(私の未踏プロジェクト)について、そこと関連サイトからの情報で分からない部分があったら直接聞いてください。特にリアルで会う人で今まで私からプロジェクトの内容を聞いたことのない人とか。
私はツンデレならぬデレツンらしい。単にツンツンなのかもしれないけど。
[topic:Haskell、XML]
以前使いにくいと言っていた Haskell XML Toolbox だけど、HAIFA の以前のバージョンのソースを見てどうにか XML から情報を取り出す方法が分かったので使ってみることにしました。
loadLicense :: FilePath -> IO [(License, String)]
loadLicense = run' . loadLicense'
loadLicense' file = do
string <- io $ readFile file
x <- (setSystemParams
.>>
checkWellformedDoc -- parse the document
.>>
liftF canonicalizeAllNodes -- Remove Header and bits we aren't interested in
.>>
liftF propagateNamespaces -- Propogate namespace URIs down the tree
.>>
liftF (removeDocWhiteSpace)
) (head $ rootTag [] [mkXText string] emptyRoot) -- Create a top level tag with XML data
xmlVal <- liftF (multi (hasLocalPart "License")) (head x)
let ln = mapM (\x -> map tagToLicense (getChildren x)) xmlVal
return $ concat ln
tagToLicense :: XmlTree -> (License, String)
tagToLicense xml = (stringToLicense $ xmlTreesToString $ getAttrLP "license" xml, xmlTreesToString $ getChildren xml)
getAttrLP :: String -> XmlFilter
getAttrLP x = getAttrl .> hasLocalPart x .> getChildren
run' というのは、要するに、XmlState state の所属する Control.Monad.MonadStateIO.StateIO から IO へ値を移す monad transfer で、io はその逆です。mapM (\x -> map tagToLicense (getChildren x)) xmlVal の部分は xmlVal から素直に getChildren で値を取り出すと XMLTree ではなく XMLTrees となってしまってしまうので、そこをうまく解釈してもらうためのトリックです。
このあたりで、随分とお約束があるなと思われるかもしれませんが、こうした手間を要するのはデータを取り出すときだけではありません。保存時にもお約束があります。
saveLicense :: [(License, String)] -> String -> IO ()
saveLicense licenses file = do
h <- openFile file WriteMode
let x = head $ serializeLicense licenses emptyRoot
hPutStr h "<?xml version=\"1.0\"?>\n\n" -- Adhoc and nasty, but hey it works.
run' $ hPutXmlDoc h $ head $ indentDoc x
hClose h
where serializeLicense licenses = rootTag [] [stag "License" $ map serializeRights licenses]
serializeRights (license, place) = mkXTag "Rights" (sattr "license" (licenseToString license)) (txt place)
tag を生成する関数はすべて XMLFilter で XMLTree を要求するので、emptyRoot という空の XMLTree を与えなければなりません。(XML 文書でないところに注意) また、文書からデータを取り出すときもそうでしたが、空の rootTag が必要になります。あと、データを取り出すときなども「XMLTrees なので head を取り出してね」というお約束があるのも鬱陶しい。
……とまあ、内部構造が分かっていないと使いにくい(おそらく)世界一難しい XML API なんですが、readline パッケージを呼び出さないので 6.2.2 以降の Windows 版 GHCi 上で動かしながら試せる (openFile が引っかかったりするけど)のと不正な XML 文書のエラー報告と将来の RELAX NG サポートを当てにして採用してみました。Linux で開発している作者が何も考えずに http アクセスに posix と curl を使うという選択肢を用意しているので、Windows で使うためにこうしてあるけど。
module Text.XML.HXT.Parser.ProtocolHandlerHttpNativeOrCurl
( getHttpContentsNativeOrWithCurl
)
where
(.. snip ..)
{-
import Text.XML.HXT.Parser.ProtocolHandlerHttpCurl
( getHttpContentsWithCurl
)
-}
(.. snip ..)
getHttpContentsNativeOrWithCurl :: URI -> XmlStateFilter a
getHttpContentsNativeOrWithCurl uri n
= do
curl <- getSysParamInt a_use_curl 0
{- (if curl /= 0
then getHttpContentsWithCurl
else
-}
-- getHttpContentsWithHttp ) uri n
getHttpContentsWithHttp uri n
同様に Makefile や package.conf も今のままだと使えないので、そのうちパッチを書かないと……。
昨日献本してもらった(そして自分の能力不足を思い知らされた苦い思い出のある) ハッカーと画家 (Amazon) に引き続きしのぶさんの日記を編集した 魔法の笛と銀のすず (Amazon) が届いた。事前に知らされていたとはいえ私との対話とかそういう萌え系の部分が取り除かれているのが残念であるが、サイトを知る者にとっておまけとしてのみんなの寄せ書きの方が本命だったりするので、それはそれでいいと思う。この日記を読んでいてそれでしのぶさんを知らない貴方に是非この本を読んで、そこにある作品や日常に向けられた一つ一つの言葉が気に入ったらサイトの方も見に行って欲しいと思う。誰かに積極的に会いに行こうとした去年までに行動を起こすことを躊躇ってそこで距離をとってしまったことを、会えなくなった今となっては何とも言えない気持ちで振り返る。
その余韻を残したままサイトを巡ってたら、SNS についてこういっているのを見かけてそれである出会いの時の言葉を思い出す。「高度に発達した権力は魔法と区別が付かない」というものだけど。
今日は『計算機プログラムの構造と解釈第二版』を読む会II第二四回でしたが、間をぬって WOMeetiong にも顔を出す始末。……だって、初心者用セッションって魅力的だったんだもん。まあ、WebObjects については本を読んでだいたいイメージつかんだので、読み終わったら読書会のセッションに顔を出すだけでいいかもしれないけど。毎月第四土曜はブッキング。
Ruby OS ですか。みんな同じことを考えますね。今度の PTT でやる OS なしの生 Lisp とか、みんなが記憶のかなたに追いやってしまったみたいなのでこないだから何度も言っている Schemix とか。
IRC でセントレア市の話で盛り上がる。カタカナの名称に留まらずに、これからは各国の文字(クリンゴン語など架空の言語を含む)を日本で使用するんだとか、セントレア市立中学校とか高校(桃色だったり緑色だったりするようなありえない髪の色の女の子がいるようなギャルゲーやエロゲーの舞台にしか思えない)についてとか。
で、それで数日前の IRC に反応して書いておこうと思っていたことを思い出したんだけど、ソフトウェアの開発に関する話題で日本だと受注費用でなくて人月で見ているため高価な開発を大企業の人員をつぎ込めるところに回してしまうため、(おそらく Franz がやっているように)数人で数ヶ月で同じプロジェクトをすませてしまうというようなことができないんでスーパーハッカーを持て余しちゃうだろうなというような会話が SICP 読書会の後あったんだっけ。
[topic:Haskell、GUI]
wxHaskell の GUI を関数的に書くためのライブラリとして FunctionalForms とか wxFruit が考案されているわけですが、少々欠点があります。後者は(現段階では) Custom Contorl などを作ったときにそれに対応するようライブラリのコードを書き換えないといけないというモジュラリティの低さが問題になるのに対し、前者は
(entry' []) *| ((checkBox' []) *- (checkBox' [])) ...
のような形が延々と続く組み合わせを自動的に生成するような関数の存在が考慮されていないことが問題になります。
(String, (Bool, (Bool, ...)))
みたいに要求する型がネストしていくので性質が悪し、run_in_dialog のコードを dialog 以外でも使えるように書き直すように GUI を生成する部分を書き直してしまえばいいんでしょうけど少々めんどくさい。まあ、本来 row' とか colum' なで区切っていくように wxHaskell はできているのでそっちの方で対処できないこともないけど、なんのために *| や *- といった Utility 関数があるのかという意義を問われるところ。
今日は圏論勉強会でした。それでもってある人の誕生日だったみたい。……ああ。知っていれば。
昼過ぎに目がさめる。もしかして駅で待っていたりしないかなと思いながら確認してみて、そうでないことを知って安心する。……でも、それで安心してしまったのは失敗だったかな……。
生体認証ね。この技術の明らかな欠陥は1つしかないとなんらかの方法で機械を欺くことが可能であることと、またその必要なものが体から欠けている人間を無視して健常者しか相手にしていないことにある。だから、前々から言っているように複数のキーを持たせて、そのうちいくつかが合えば認証をパスするって仕組みにした方がいいと思うんだろうけど、そういう認識を持ってくれるのは遠いだろうなー。安心感とコストの方を気にするだろうから。
遅れは時に致命的に。
[topic:プログラミング]
WebObjects の入門書を読み終わった。WebObjects って結局 Java であることがマーケティングの都合に過ぎないんだね、ってことがようく分かった。Objective-C を使っていた時代には明確であったであろうコードが、Java を利用することによって副作用を多用する不明瞭なものになっている……。だけどフレームワークとしてよくできているのは確かで、ページ中に動的な要素をバインドさせたり、逆にインプットとかをコードにバインドさせたり(値を入れ込むところを指定するだけ)、といった部分が理にかなったやりかたでとてもうまくできている。流石は(方便だったとはいえ)コーディングなしの開発を目指しただけはある……もっともそれには IDE も深く関わっているし、他のフレームワークや PHP などを知らないので比べられないところもあるだろうけど。
なるほどねー。CGIKit とかでなぜ真似するのかよく分かった。でも Java だと無駄なコーディング量が多くてもったいない。