Archive for April, 2007

SML#の型安全性

Posted by on Wednesday, 18 April, 2007

こういうのを見るとついイジワルをしてみたくなるのが性というやつで……(好きなコをいじめちゃう子供の心理か?(笑))、

% smlsharp SML# 0.20 (2007-03-30 10:47:08 JST) # val libc = DynamicLink.dlopen </usr/lib/libSystem.dylib>; val libc = 0x00b00270 : unit ptr # val puts = DynamicLink.dlsym (libc, <puts>) : _import _stdcall int -> int; val puts = fn : int -> int # puts 0; (null) val it = 10 : int # puts 1; zsh: 642 bus error smlsharp

うむ、まあ、予想通りだな。

ヘッダファイルを読んで型を見てくれればよいのだけれど、それにかかるコストを嫌ったか、void* みたいな「ふつうキャストして使う」ような用途はそれじゃムリと判断したか、Cのプロトタイプ宣言を読んでも限界があると見切ったか……。いずれにせよ、 FFI なんだからそりゃまあ仕方ねえだろうというアレですね。

ちなみに Haskell でも foreign 宣言を解釈する処理系なら同じくらい気軽に書けるし、 C-&amp;gt;Haskell (c2hs) を使えば c-wrapper くらいには楽に書けるのだけれど、ただし問題があって、対話環境にいきなり追加させたりできないし、型の相互受け渡しが面倒くさいのだ。 Int くらいは可能だけど、リスト→配列は(そういう関数があるわりには)自動的にやってくれないし、Haskell文字列(文字リスト)→C文字列の変換は、それはそれで厄介である。 SML# はその辺が異様に楽なようですごいなあと素直に感心する。

ところで、 SML# のソースコードに sample というのがあって、いろいろなサンプルがあって GLUT の例なんかなかなかスゴいと思うが、個人的にびっくりしたのは qsort。「なんだクイックソートかよ」と思ったらさにあらず、 libc にある qsort を使って SML の配列をソートする例なのだった。そんなのありか。

って qsort の型が多相的であることに今頃気付いてちょっと驚いている今のわたし。 _sizeof ってスゲエなー。何の話かというのはこちらに情報がありますね。


風邪ひいてブッ倒れてた

Posted by on Wednesday, 18 April, 2007

ひさびさに風邪引いて寝込んでました。こう見えてもわりと健康なので、38度を越したのも久し振りな気がするよ(ああでも昨年のSFセミナーで風邪になってたような気が)。

月曜夜から昨日まる一日くらい寝込み、今日も半覚醒な感じでぐたーっとしていたら、わりと元気になったような気がしたが、腹がへったと思って急にモノを食ったらまた気分が悪くなってきた。うえっぷ。


「細切れにしてeval」じゃないよ

Posted by on Monday, 16 April, 2007

http://b.hatena.ne.jp/entry/http://www.jmuk.org/diary/2007/04/15/2 うーん、この日記よりほかにブックマークするところがあると思うんだけど、まあそれはいいや。

でね、反応を見ていると「細切れにしてevalする」という不思議な表現が流布しているようなのだが、それは誤解です。ぜんぜん違う。 JavaScript の関数は toString メソッドで文字列化できる(組み込みのものはのぞく)のはそうで、それを使っているらしいのだけれど、実際にはそうして得られた文字列をパースし、コンパイルして、その結果の関数を呼ぶようにしている。

何が違うかって?

だいたい文字列ベースで分断して eval するくらいでそんなことができたら苦労はないわけ。たとえば try … catch したり break したりといったことを考えると(現在は未対応らしいんだが)、そんなことではとうてい対処できないでしょ。そういった難しいことをきちんと考えていくとけっきょく、プログラムを解析し、どう書き換えるかといった方針を立てなきゃいけないってことがわかるはずだ(だいいち毎回evalなんかしてられないでしょう、常識的に考えて)。

だから、いってみればアレは「JavaScript で JavaScript のコンパイラを書きました」っていう話として理解した方がいい。で、ふつうのコンパイラというのは高級言語からVMなり機械語なりに変換するのだが、そうではなく JavaScript から JavaScript へのコンパイラとなっている(ので、こういうのをふつうはコード変換とかいいます)。コンパイル(コード変換)するときに、ふつうのプログラムを食わせると CPS な関数が返されると考えるといい(CPSが何か、くらいはまさか知らないということはないよね?)。

ちなみにコンパイル部分のコードは Rhino をベースにしたらしいですよ。

ふだんはねえ、はてなブックマークにはいちいち反応しないんですけど、わたしの書き方が曖昧なせいでこの誤解が広まるのは嬉しくないので。確かにわたしの書き方も親切さが足りないのだけれど……。

ああひょっとすると「細切れにして eval」という表現が↑を意味してたのかもしれないが、そうならわたしの理解が足りていなかったってことでごめんね。でもそれはいっそう誤解を生む表現だと思うな。


JavaScript でプリエンプティブなスレッドを

Posted by on Sunday, 15 April, 2007

先日の RHG 読書会で、牧さんがやっているという http://sourceforge.net/projects/jsthread/ の紹介があった。 JavaScript でプリエンプティブなスレッドをライブラリレベルで実装した、という話。

JavaScript というのは、ユーザレベルからはスレッドが一本しかなくて、処理の切り替えというのができない。だから、タイムアウト呼出や処理の終了のイベントを待って終了処理をする、ってなことを書かないとまともなプログラムを書けない。でもこれは大変だ。

この Concurrent.Thread を使って関数を渡すと、そのプログラムが呼び出し元と並列に走る。ように見える。なのであまり気にせずループみたいなものを回す関数を使ってもブラウザが停止したりしない。

まだドキュメントとかはないのだけれど、昨日ちらっと見たサンプルコードから、いいかげんにデッチ上げてみたら、それっぽく動くようだ→http://www.city5.org/fib.html これはフィボナッチ数を順番に表示するというプログラムだけど、メイン部分は while(true) で回している。 Concurrent.Thread を使わないと、 JavaScript が暴走してエライことになる。

ついでに arton さんのライフゲームのやつも同じ調子で書き直してみた→http://www.city5.org/life.html

なんとなーくわかったけど、まだよくわからんところもあっていいかげんです。ドキュメント欲しい(笑)。

ところで、これはいったいどうやっているのか、というと、関数が Thread.create に渡されると、それを文字列化してパースし、かたまって動くものを細切れに動くようにコード変換するらしい。オーバヘッドが気になるのだけど、正直なところそれほどの問題はなさそうに見える。ちなみにコード変換はまだ完璧ではないらしく、一部の構文がまだ動かないと昨日は言っていたのだけど、このフィボナッチ数でもちょっとハマった。 n1 や n2 はスレッドのスコープにあるのが見てわかると思うけれど、これを main のスコープにすると動かなくなるのだ。って書くと、そういえばそんなことを言っていたような記憶も……。ふうーむ。

いやでも、これは面白いなあ。


美少女戦麗舞パンシャーヌ

Posted by on Sunday, 15 April, 2007

そういえばこっちには感想を書いていなかった気がする(笑)。

あの浦沢義雄が帰ってきた! しかもなぜか平日6時台に!

というだけでわかる人はわかるアレな番組、それがパンシャーヌ。わからない人に、ちょっと簡単な解説をしましょう。

浦沢義雄というのは脚本家の名前。東映が日曜の朝にやっていた「不思議コメディー」という一連の作品群を書いてきたのだった。ロボット八ちゃんとかが源流だったんだけれども、だんだんと浦沢の「怪作」ぶりが発揮されるようになっていき、おそらくもっとも有名なのが「美少女仮面ポワトリン」は一世を風靡しました。……いや、わたしは見てないんですが。当時はナマイキなガキだったから、ああいうのは駄作だと思っていたし許せなかったんだなぁ、きっと……(遠い目)。

この「パンシャーヌ」はその直接の続編というわけじゃないのだけれど、おおかたの「精神」はあの辺から受け継いでいる。御町内のヒロインとなっていた美少女戦士も、あるときやめてしまい、今は幸せな家庭を築いている。そこに唐突に神様(猫ひろし)がやってきて、美少女戦麗舞(せれぶ)パンシャーヌに任命する!「……まあ美少女って年じゃないけどな」

でまあ、第一話は神様を追いつめる怪人を秘技シロガネーゼ・アタックで退治したのだが、あとで改心した怪人と腹をわって話しあったところ、その怪人は宇宙人の女性で、夫婦で宇宙を旅していたところ「最近太ったんじゃない?」と言われてショックを受けて地球でダイエットをしようとしたところ、神様がやってたインチキダイエット商法にひっかかって宇宙に帰るすべも失なって神様からお金を取り戻そうとしていたことが発覚し、後半ではパンシャーヌと怪人がふたりして神様をやっつけたところに、ダンナと子供が宇宙船で迎えに来て、帰りましたとさ、おしまい、みたいな。えーとついてきてますか?

ちなみに、パンシャーヌは「アンシャンレジーム・トリコロール!」のキーワードで変身し、「花も嵐も踏み越えて、戦う愛のエレガント、美少女戦麗舞パンシャーヌ」が決め台詞で、なぜかそれから小倉百人一首から一首を詠む。「教養のあるところをお見せしたくって」 それと、わざとやってるんだろうけど特撮がしょぼい。ちょっと21世紀にこれはないんじゃないかっていうか同人映画?みたいなレベルのヤバさ。コスチュームもしょぼいのだが、なにせ第一話で「じゃあコスパで作ろう」といって作ったものだからしょぼくても仕方ない。通りがかりの警官に「怪しいやつめ!」と言われるしまつである。

ほかにもいかにも浦沢なところがいっぱいあって、いちいちオレは大喜びなのだが、こんなものを夕方六時にやっていいのか? っていうか誰が喜ぶんだ? というのが目下の疑問。たぶん子供じゃなくて、当時のポワトリンとかの視聴者層の女性(20-30代くらい?)がメインターゲットなんじゃないかと推測するのだけど。

いやあ、すごいですよ。心に余裕のある皆様におかれましては、いちど見てみるとよいのではないかと思います。


はてなの haskell グループを「関数的なアンテナ」から外そうかと考えています

Posted by on Sunday, 15 April, 2007

理由はスパムが多すぎるから。とにかく死んでいる(更新のない)ユーザが多く、更新を検出してもスパム書き込みであることが多すぎる。

そこで、グループ全体の更新履歴を外し、「これは生きている」とオレが判断したところを個別にチェックするという方向に転換したいと思います。その判断はオレの独断ということになりますが「ここは生きてるから」というアドヴァイスがあれば、あらかじめコメントをしていただけると助かります(いちおう一通りチェックする手間が省けるので)。

独断といっても、最後の日付を見てそれほど古すぎないもの、っていう基準だと思いますけれど。


schemeで矢印let

Posted by on Sunday, 15 April, 2007

ふと LispUser.net のむかしの記事を見ていたところ、S式の限界と題して、 let と cond の記法拡張の話があった。端的に言うと、矢印が使えるようになるというもの。

で、最初に見たときは「あーまあそうだよね」という感じであり、まあサンプルとしては良いな、と思っていたわけだ。でまあそれだけだったんだけど、なんというか、わりと最近になってようやく自分でも define-syntax / syntax-rules で書くのに抵抗がなくなったというか、「こうすればできるじゃん」のイメージが掴めるようになったので、例題がてらにちょっとやってみた。

いい機会なので、 pyvnc2swf で撮影したムービーも公開します。というか、ムービー作成をちょっとやってみたかった、というのもある(笑)。

>
  • 矢印let >
  • 矢印cond
  • 裏をあかすと矢印letの方はやってみたらすぐ出来てしまい、それは撮影していませんでした。でもまあそれはそれとして、ということで lets を作ろうとしてから、ああ lets-sub にした方がいいね……とやっているのは、当初の行動を最初はちょっとトレースするためにわざとしたこと。でもそれ以外は素であり、脇に正解があるのを見ながらとか、そういうことはしていません。矢印 cond にいたってはぶっつけ本番であり、おかげさまで途中にどう考えてもしょーもないミスがあるのにオレがなかなか気付かないという、本物のハッカーな人にとってはある意味ハラハラドキドキの作品に仕上がってしまいました。ま、興味がありましたらどうぞということで。

    さて、なんとなくやってみたのですが、このように並べると Common Lisp の伝統的なマクロと Scheme の健全なマクロでは、同じことをするのにどのように書くか、という違いがわかりやすくなる……のかもしれませんね。伝統的なマクロというのは、まさに Lisp の構文木を S 式として受け取り、 S 式を返す関数を書いてやるようなものなわけです。したがって、ふつうのリスト操作関数やシンボル系の関数を駆使して、ふつうの Lisp のプログラムのように書く。ところが健全なマクロではそういうことは実はできないために、いわばパターンマッチを繰り返して木の構造を少しずつ変化させていくという書き方をする。今回のような、任意長のボディを少しずつ見ながらその結果を溜めていくなケースでは、下請けのマクロを定義してやって、少しずつ変換させながら溜めていくというアプローチを取るのが一般的なようです(わたしは cut の定義をみてこれを学んだ、と思う)。まあ、できることはいっしょ(らしい)のだけれどやりかたは少し違いますね、という感じで、比べるのも申し訳ない気がするけれど Common Lisp の書き方と比べてもらえると幸い。ただまあ、「マクロも通常のプログラムもまったく同じように書ける」という Common Lisp と比べて、なんだかわけのわからない Scheme のマクロの書き方ってどうなの?という話はありますが。パターンマッチはオレには自然なので、これはこれでいいといえばいいんですが(とはいえ … のマジックっぷりには頭が下がる。超メンドくさそう)。


    塚谷裕一『ドリアン 果実の王』

    Posted by on Friday, 13 April, 2007

    カラー版 ドリアン―果物の王』は、なかなか強烈なタイトル&表紙だ。

    また、新書にしてはちょっと高めだけど、カラー写真がふんだんである。まあ、写真はたいがいドリアンや熱帯の果実をふたつに割ったような絵面か、山と積まれたドリアンの写真だったりするのだが。

    「臭い」ということで知られるドリアンだけれども、そんなことはないと著者はいう。それは「外れ」を引かされただけだと。でまあくだくだとドリアンについて、味、香り、食べかたや売られかたはむろん、発芽から生育の過程までが書かれ、著者の巧みな書き方のために、読んでいるとドリアンを食べたくなる。

    けれども個人的には白眉は4章「ドリアンの果実史」だね。ここの章だけ、ドリアンの話は(多少は出てくるけれども)メインじゃない。まず、よくある「むかしバナナは高級品だった」という言説があるけれども、あれは嘘だと著者は一蹴する。大正〜昭和初期の日本では、むしろ今のようにふつうに一般庶民が食べるものだった。戦後の貧困期の記憶が「バナナ=高級食材」という図式を生み出している……というわけで、いわゆるトロピカルフルーツが昭和初期にどのように受容されていたかということを、当時の文学や記録から読み起こす。そしてまた、戦後の復興にかけて果実がどのように受容され、その過程で熱帯のフルーツがどうして受容されてこなかったか、も。


    さいきんスパムが増えたな

    Posted by on Wednesday, 11 April, 2007

    印象だけど。

    けっこうしばらくずっと Rgrey のみで過ごしてきたのだけれど、だんだん看過できなくなってきたかも。っていってもほんと日に10件かそこらですが、スパムメール。まさしく、導入前にくらべればなきに等しい。

    さて、これくらいの分量だと気が向いたときには届いたスパムをざっと眺めることも可能なのだが、 Rgrey をすり抜けるタイプのスパムはどういうのが多いかというと、以前のように同じものが何通もたくさん届くので結果的に無効化されるというケースは減ったみたい。なんとなく、別の逆引きできるホストを経由した、送信元の怪しいスパムが多い気がする。平たく言うと、リレーホストを踏み台にしているケースね。

    こういうのは、どうしようもないからなぁ。やっぱり、いずれベイジアンフィルタと併用することになるんだろうな。

    ところで「最近、増えた」のはべつにスパム業者の活性度とはいっさい関係なく、単にオレのメールアドレスがどっかに流れたんだろうね。海外の知らない ccTLD からのメールが多いので。 md ってどこですかという感じ(モルドバ共和国らしい)。


    Twitter の日本語入力

    Posted by on Monday, 9 April, 2007

    Twitterで日本語を入力する方法というのがある。

    確かに今日ちょっと遊んでみた感じでは、ときどき書き込みがロストする。先頭に「.」などの文字を入れるといいという説もあるらしい。

    つまり、なんだ、 isprint な範囲の文字が含まれていないと蹴られるとか、そういう条件でもあるわけ? ……と思って試してみたんだけど、そんなことはないんだよなあ。ぜんぶ日本語の文字でも、ふつうに通ることがあるよ? 半角を含んでいても駄目なときもあるし。

    どーも不思議。まだ理由がよくわからない。

    で、これ、面白いかどうかというと微妙。メッセンジャとの組み合わせが面白いといえば面白いけれど、そのうち飽きて誰も続けなさそうな気もするし。まだ「面白い使い方」が何かないか模索段階なんだろーな。