トップ 最新 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2005-10-06 [長年日記]

% [まんが] アワーズ増刊ヘルシング特集号を買ってきた

こにゃにゃちわ、精神的に死んでるじじぃでございます。 もういろいろだめぽムード満点なので、まんが買ってきましたよ(謎

んで、OVA 版のプロモーションムービー見ましたよ。 ……ちょっと期待してしまいそうかも。 テレビ版は正直、ただ銃撃つだけのくせに「拘束制御術式解放」とか言ってて萎えた覚えがありますが。 「わかってねぇー」感満点と言うか、おまえ「拘束制御術式」言いたかっただけちゃうんか、と言うか。

リップヴァーンウィンクルの魔弾の軌跡とか、かなりステキな感じ。 つーか、あれはどんな効果音が付くのか気になりすぎるが。

% [game] ガンスタースーパーヒーローズ

爆弾を投げ返せないガンスタなんてガンスタじゃない。

……といった感じの心の叫びを置いておけば、わりとお手軽なガンスタっつー感じ。 少なくとも、この前のアドバンスガーヒーよりはおもしろい。 でも、ハードモードでやらないと、ストーリーの核心に迫る部分がわからないようになってるのはいただけないなあ。 いや、まんまと乗せられて一生懸命ハードでやってるわけだがね(苦笑

どうも4つのクリスタルは、過去のトレジャー作品の登場キャラが精神体となって、それぞれの世界(亜地球)から現れたものという設定らしい。 クリスタルをゲットした時に、元いた世界のことを話してくれるんだが、それを聞けばわかる人にはわかるという寸法。 今のところ…

  • 青→レイディアントシルバーガン(もしくは斑鳩)のラスボス
  • 橙→クリアできてないんで不明
  • 緑→エイリアンソルジャーの主人公
  • 赤→シルエットミラージュの主人公

こんな感じっぽい。 橙の予想としては、ガーヒーの英雄魂とかかね。 あるいは穴的にダイナマイトヘッディーとか(笑

まあ、それはそれとしてだ……GBA でアクションゲームやらせんでくれよ。 指おかしくなるからさあ……などとぶつくさ文句を言いつつ、ちまちまやり続ける負けムードなわし。 グラフィックこのままで良いから、プレステとかで出してくれないものか。

レッドの顔グラが妙に女の子っぽかったり、セリフも微妙になよなよしてたりして、実は女の子?って気もした。 ブルーがそんな予感をさせるセリフを吐いてたりもするし。 まあ、それがストーリーに大きく関係するとも思えないから、どうでも良いっちゃあどうでも良いんだが。

% [game] ガンスタ続き

橙じゃなく黄だった。 アドバンスガーヒーのお姫様っぽい。

それにしても、本物のガンスタがやりたくてしかたがない(今回のは偽物扱いですか)。 メガドラ出すのはめんどくさいが……うーむ。


2005-10-07 [長年日記]

% [game] ガンスターヒーローズ

結局誘惑に抗えず、メガドライブを引っぱりだしてやってしまったよ。 やっぱおもしろいなあ。 これをやるためにメガドラを買った…なんつー人もいるくらいの、まさにキラーソフトなだけはある。

さあ、せっかくメガドラ出したし、次はエイリアンソルジャーでもやるか。 たぶんクリアできないけど。 ……メガドラのそばに置いてあった MegaCD や Super32X が「僕も出して〜」って訴えかけてきたけど、コンセントの差し込み口が足りないから泣く泣く断念したのは内緒。


2005-10-08 [長年日記]

% [game] ダイナマイトヘッディーに明け暮れる

Funny Angry がなかなかクリアできなくてハマったが、なんとか最後まで終わらす事ができた。 個人的にはガンスタよりも好きな作品である。

このゲームって、ある意味トレジャーのアクションゲームにおける完成形じゃないかと思ったりする。 基本的にトレジャーのゲームってのは、特にボス敵なんかに関して『明快な攻略法』があるのが特徴なわけ。 逆に言うと、凡百のゲームにおいてよくあるような『適当に弾を撃っておけば勝てるボス』なんてのはほとんどいない。 つまるところ『ごり押しがきかない』のだね。 頭を使わないと勝てない。 この辺は、3D ゼルダなんかにも相通ずるものがある。 要するにわしは、こういうのが好きなんだな。

それでもまあ、ガンスターヒーローズなんかだとごり押しがきいちゃう場面もままあったりするんだが、ダイナマイトヘッディーにはそれが無い。 しかも、ボスのときだけじゃなく、その他の全ての場面でそれが徹底されてる。 常に頭を使って仕掛けを見切っていかないと進めないわけだ。 そのせいで、人によっては非常に難しいゲームだと評価してるんだが、わしとしてはちょうど良い難易度だと思う。 むしろアクションというくくりでいけば、簡単なゲームじゃないかなあ。 やる事さえわかってれば、その通りに操作するのはそれほど難しいことじゃない。 んで、その『やる事』を見極める作業が楽しいわけだ。 でも最近は、ゼルダがあんまり良い評価を受けてなかったり、こういうゲームは売れない時代なのかなあ…とか思うとちと切ないなあ。

ちなみにエイリアンソルジャーは、きっちりこの流れを汲んでいるゲームだと思うが、いかんせんあれは『やる事がわかってても、その通り操作するのが難しい』類のゲームである。 あれをスーパーハードでクリアできる人は鬼だと思う。(一応解説すると、レベル設定にはスーパーイージーとスーパーハードしか無くて、スーパーイージーですら鬼のような難易度である。わしは一応イージーの方ではクリアしたことあり。)


2005-10-09 [長年日記]

% [雑談] 年々酒に弱くなる

最近は 350ml のビール2本も飲めば、良い塩梅にほろ酔い気分。なんと経済的なことか。 以前は2本なんて水飲むのと変わらん量だったがなあ。

つーか、わしのアルコール許容量のピークは 18 歳前後の頃だろうなあ。 それ以降は弱くなる一方だ。 やっぱ、未成年のうちに酒飲むとダメですよ。 特に小学生のうちから飲むなんてもっての他です。 きっとこの年々弱くなる現象は、その頃のツケが回ってきてるのです。

お酒は 20 歳になってから。 末永くお酒を楽しみたいなら、絶対守りましょう。 わしはあと 10 年後くらいに肝臓の病気で死にます。(いや、最近は酒はひかえてるんで、実際には死にません。たぶん)


2005-10-10 [長年日記]

% [PC] フォトレポート:ベールを脱いだ「100ドルPC」(CNET Japan)

欲しいなこれ。 モニタ部は、カラーとモノクロの切り替えができる新型の液晶になるとかって、どっかで読んだ。 手巻き充電がイカス。

つーか、コンセプト的にどうしても eMate を思い出してしまって、妙なノスタルジーを感じたり。 欲しかったけど、買えなかったんだよな。(やれることのわりには)高くて。


2005-10-12 [長年日記]

% [雑談] 風邪気味ちゃん

うぅ……精神的には持ち直してきたが、今度は逆に肉体的にダメな風味で泣ける。だるい。 どうも眠りが浅くて、額面ほどには睡眠がうまくとれてないのが原因じゃなかろうか。 なんか知らんけど、ものすごくたくさん夢を見るんだよね。 厳密に言えば、夢はいつもたくさん見てるんだろうけど、起きた時に憶えてるのがたくさんあるのは、眠りが浅い証拠じゃないかと。

ラブクラフトみたいに、見た夢をネタにして小説とか書ければ良いんだけどなあ。


2005-10-13 [長年日記]

% [Mac][PC] 青歯マイティマウスまだー?

出たら買おうと思ってんだけどなあ。 やっぱ電池入れるスペースが無いんだろうか。

どっちにしても、ワイヤレスマウスは定期的に電池入れ替えないといかんのが面倒だよね。 いっそのことこういうのを専用マウスパッドにしちゃって、マウス部分は電池要らず(と言うか充電池式)にしちゃうってのはどうか。

ひも付きマウスは、ひもが気になって仕方ないのでダメです。 トラックボールなら本体を動かすわけじゃないから気にならないけどねえ。 つーか、普通に電池入れる方式で良いから、早く出せと言いたい。

% [Ruby] Selector Namespace

[ruby-dev:27417] での提案。 ほぼ想像どおりのものみたい。 ただ、メソッド探索のルールを読む限りでは、using での名前空間指定が重複できるような感じなのがちょっと意外かも。

ちなみにわしが RBM に導入しようと思ってる region は、単一使用しかできないようにするつもりでいた(念のため書いとくと、名前空間を一つしか作れないということではない)。 要するに特定の名前空間か、デフォルトの名前空間(今のところ central と呼んでる)か、どちらかしかないので、メソッド検索はその時点の名前空間にメソッドが存在するか調べて、無ければ central を調べるっていう単純な構造。 あと region では変数も同じように扱う。 実は Io とか JavaScript(ECMAScript) の仕様を参考にしてる部分が多々ある気がする(どっちも実際に使ってはいないんだけど)。

って言うか、RBM は頭の中でばっかり拡がって、ちっとも実装が進まないなあ...orz

% [OCaml] 複数種のパターンに同じ処理を

なんかしばらく前にどっかで、できない、って言ってるのを見かけてオヤ?と思いつつツッコミ損ねてたんだが、できるよねえ(わしが問題点を勘違いしてる可能性はあるが)。 ともあれ、できないと言ってたのがどこの人だったか思い出せないんで、ここに書いとく。

        Objective Caml version 3.08.4

# let f x =
  match x with
    0
  | 1 -> print_endline "OK"
  | 2
  | 3 -> print_endline "NG"
  | _ -> print_endline "ABONE";;
val f : int -> unit = <fun>

# f 0;;
OK
- : unit = ()

# f 1;;
OK
- : unit = ()

# f 2;;
NG
- : unit = ()

# f 3;;
NG
- : unit = ()

# f 4;;
ABONE
- : unit = ()
# let f e =
    try
      raise e
    with
      Not_found
    | End_of_file -> print_endline "OK"
    | _ -> print_endline "NG";;
val f : exn -> unit = <fun>

# f Not_found;;
OK
- : unit = ()

# f End_of_file;;
OK
- : unit = ()

# f Division_by_zero;;
NG
- : unit = ()

% [Mac][PC] iTunes6

角っこの処理が少し丁寧になった? 他との不統一感が無くなったわけじゃないけど、5 のときよりはマシかな。


2005-10-14 [長年日記]

% [雑談] 読解いやな法則: 横着をするための労力を惜しんではいけない(いやなブログ)

うああ、耳が痛い……

% [OCaml] パターンマッチの変な使い方

わしがるびまでインタビューされることは無いと思われるので、インタビューされるまでもなく自分で言うと、Ruby の好きなところは case 文の when 節に正規表現が使えることである。 初めてそれに気付いたときは、心の中で「elsif よ、さようなら」と思ったとか思わなかったとか。

んで、最初に OCaml のパターンマッチを見たとき、Ruby の case 文みたいなものかと思ったんだが、ちょっと違う風味なのに気付いて、じゃあ case 文で正規表現を使うときみたいな使い方をしたいときってどうしたら良いんだろう?とか思ったり。

てことで、実際には使ったこと無いんだけど、そんなシチュエーションが訪れたときのために考えてみた。

# #load "str.cma";;
# let case arg =
    let is_match str = Str.string_match (Str.regexp str) arg 0 in
    match arg with                                               
    | _ when is_match "hoge" -> print_endline "matched hoge"     
    | _ when is_match "fuga" -> print_endline "matched fuga"     
    | _ -> print_endline "no match";;                            
val case : string -> unit = <fun>

# case "hogehoge";;
matched hoge
- : unit = ()

# case "fugafuga";;
matched fuga
- : unit = ()

# case "foobar";;
no match
- : unit = ()

すごく変(笑

% [OCaml] Stream モジュールの秘密

向井さんのツッコミで紹介されてた Regexp/OCaml に触発されて、(なぜか)camlp4 の使い方を憶えたい欲が膨らんできたので、チュートリアルを眺めてたんである。 そしたらなんか聞き捨てならない記述が。

The streams are lazy values. You can create infinite streams,

な、なんだってぇ!? …と、慌ててリファレンス見ながら試してみる。

# let sq = Stream.from (fun x -> Some (x * x));;
val sq : int Stream.t = <abstr>

# Stream.npeek 5 sq;;
- : int list = [0; 1; 4; 9; 16]

ぐはっ!! 向井さんの LazyList ほど機能は豊富じゃないが、遊ぶには十分じゃん。 よく考えれば、ストリームって要するに『いつ終わるかわからないリスト』みたいなもんだもんなあ。 盲点だった……(わしがヌルいだけですか?)

% [Mac][PC] Windows 版 iTunes5 の角っこ

今見てみたら、すごくまともだ。 つーことは、Mac 版の 5 だけがあり得ないほど適当な作りだったってことかよ。 ……それこそあり得ない...orz

おいおい、Apple は大丈夫なのか? いや、Apple と言うより MacOS は大丈夫なのか?

本日のツッコミ(全2件) [ツッコミを入れる]

% 向井 [Regexp/OCaml http://www.yl.is.s.u-tokyo.ac.jp/~oiwa/caml/ ..]

% jijixi [Regexp/OCaml は初めて知りました。これはいい感じですね。 Micmatch はどっかで見かけたことあった..]


2005-10-15 [長年日記]

% [雑談] 実践いやな法則: にわかな奴、一蹴される(いやなブログ)

異能者がいっぱい。 言及先の…

「お願いします!!Makeでqsortだって書きますから!!内定くださいッ」

とかおもしろすぎ。

% [雑談] ギゥドン

今日から『なか卯』で牛丼完全復活ということで、さっそく行ってきた。 「特盛り無いの?」と聞いたら「ありません」とつれないお言葉だったので、仕方なく大盛りで。

……肉少なっ!!

いやまあ、予想の範囲内ではあったけどもね。だからこそ特盛りを頼みたかったわけで。 とは言え、まあ念願の牛丼でありますからして、ありがたくいただいてまいりました。 ちなみに肉不足をごまかすためか、しいたけが入っております。 あと、肉はオージービーフだそうで。

大盛り 490 円 + こだわり卵 60 円で、計 550 円でございました。ごちそうさま。

% [game] 3年B組金八先生 伝説の教壇に立て!完全版

金八っつぁんに思い入れは無いんだが、サウンドノベル好きなんで気にはしていて、でもいろいろタイミングが合わなくてプレイしないでいたら、シナリオ追加して廉価版が出ちゃったんで、今度こそゲットだぜ……みたいな感じ。

サウンドノベルとしては、ちょっとシステムがややこしすぎる感じがするんだが、まあともかくまったりやってみる予定。

% [game] 金八日記、あ、こら、まだ話が途中…編

タイトル画面で、金八っつぁんが得意の「人という字を…」なお説教を始めるんだが、話の途中でメニューを選択したりすると怒ったり、文句を言ったりする。 無駄に芸が細かいな(笑

% [game] 金八日記、サウンドノベル云々て宣伝文句を入れるのは反則だ編

なんつーか、インタラクティブアニメーションという感じ。 正直すごく微妙。 一応セリフの履歴は見れるけど、通常時は字幕も無くただ喋るだけで、しかもどんどん自動的に進んでいくから、片手間でやるのがつらい。

結局わしが『映画より小説』『アニメよりマンガ』が好きだっていう嗜好を持ってるのは、そういう理由もあるんだよな。 要するに、他人のペースを強要されるのが苦手なんだわ。

なんかすでにやる気減少中。あーー、いろんな意味で微妙。

% [game] 金八日記、そろそろ起きなわ編

なんだかんだ言いつつ、ダラダラやってる。 修学旅行は沖縄だそうですよ。 今どきの中学生は生意気だなあ。

って言うか、修学旅行で沖縄と言えばやっぱりあずまんが大王なわけで、あの回は歴史に残るハイテンションっぷりだったなあ…とか、「ヤママヤー!!」とか、そういうのが頭に浮かんだのです。

……なんか、これからあずまんが大王読書大会が始まりそうな予感。

% [game] 金八日記、お約束編

うーん、題材が題材なだけに仕方ないのかも知れないが、いちいち話が典型的すぎてツマラン。 まあ、サウンドノベルの血を受け継いでるんであれば、むしろ二周目以降が本番なんだろうから、それまでのガマンかなあ。

どうでも良いけど、一日の最初にその日の授業風景がさらっと流れるんだが、「武士道と云うは、死ぬ事と見つけたり」とか言っててずっこける。 学校の(しかも中学生の)授業で葉隠?

% [game] 金八日記、だからお前、歌はさあ編

歌を歌う役なのに、どうして歌下手な声優をキャスティングしちゃうのかなあ…と悩まざるを得ませんね。 それならそれで、歌の時に実際には声が入らない演出をすれば良いのに、ちゃっかり歌うし。 そして案の定、下手だし。 どないやねん。

かつてルナ・シルバースターがサターンに移植されてルナ・シルバースターストーリーになった時の悪夢を思い出しましたよ。 アルテナの女神が歌が上手だと言う設定は、無かった事にされたんだと思いました。

つーかさあ、歌がすごくうまいって設定だからって、ほんとにすごくうまい人を使えとは言わないよ。 でも、まともな神経をしてれば、せめて『そこそこうまい』人を使うでしょ。 なのに、どうしてわざわざ『下手な人』を選んじゃうのか説明してくれ、ほんとにもう。 まさか、あの声優が『そこそこうまい』人だと思われてるわけじゃないよな?

……まあ、ルナのときの理想と現実のギャップのおかげで、声優とかにわりと無頓着なわしも、あの声優の名前は(歌が下手…っつータグ付きで)強烈に憶えてるわけなんだが。

% [game] 金八日記、いきなりトンデモになった編

相沢先生凄すぎ。って言うか無茶すぎ。 百歩譲って、成層圏を突破できるロケットを作れたとしても、大気圏突入軌道に入ってるシャトルにぶつけるとか無理ありすぎでしょ。 しかもミサイルみたいにぶち当てるんじゃなくて、なんかえらくハイテクチックに接触してるし。

こんなん、あやめちゃんが実は幽霊でした…とかって話の方が、よっぽど納得いくぞ(苦笑


2005-10-16 [長年日記]

% [game] 金八日記、電波増量中編

なんかロケットの話以来、無茶な話ばかり続いてる気がするんですが。 パッケージに書いてある『購入者の 96% が感動!!』って話は、いったいどうなってるんでしょうか?

つーか、もう題材が金八先生である意味が無くなってきてる気がする。 これ、金八先生のファンがプレイすると、どう思うんだろうか……

% [game] 金八日記、二周目突入編

あー……どこが金八?つか、ほんと金八っつぁん関係無さすぎ。 二周目どころか、一周目の終盤からしてもうタイトルに偽りありの状態。

……まあ、ある意味サウンドノベルの王道(苦笑

% [game] 金八日記、泣くのは精神安定に良いのだとエシディシ様も言っておる編

二周目第四話『鉄っちゃんの恋』はわりと泣けた。 若いって良いなあ(とか、おっさんくさいことを言ってみる)。

それはそれとして、説明書に載ってるザッピングシステムはどうなってるのかさっぱりわからず。 もっとわかりやすくしてください。


2005-10-17 [長年日記]

% [Mac] 【ランチャ】FinderPop【OS X 版、遂に登場 !!!】(2ch)

まーたくだらねえツリしやがって、どれどれどんなオチ付けるのか見てやるか…………ツリじゃなかった(驚

なんかマジで懐かしくて泣きそう。 2ch なんか見に行くのイヤだって人はここから直接どぞ。 一番好きな機能だった、長押しでコンテクストメニューが出る機能が無いのが寂しいけど、一応…

It doesn't have everything in the original, but it's got the bits I use most, and Control-Free-Popup and some other features will be added soon.

ってことで、実装する予定はあるみたいだし、今後に期待しつつインストールするぞ。 ビールを送るのは長押しが実装されたらな。

% [OCaml] Stream を使うか LazyList を使うか…

…の判断材料になると思われる文章を向井さんが書いてくれた。 なるほど。

破壊的だっていうのも、ストリームとしての役割であればたしかに納得のいく仕様ではあるんだろうけど、せっかく関数型でプログラムしてるのに…とか思えば、やっぱり嫌になるのも道理ですなあ。


2005-10-18 [長年日記]

% [PC] 修行が足りない……の?

まあ、わしも偉そうなことを言えた義理じゃないんだけど、この話ってちょっとした視点の違いと言うか、勘違いと言うか、そんな話のような気もする。

こんなところに括弧を書いてもいいなんて知らなかった。

と書いてるけど、ほんとかなあ…と。 実は同じような例を知ってるにも関わらず、違うものと勘違いして、この例が特別なものに見えてるだけじゃないかなあとか。 C の勉強してれば、おそらくこういうの見るでしょ。

/* int へのポインタを返す関数 */
int *func(void);

/* int を返す関数へのポインタ(を保持する変数) */
int (*func_p)(void);

ね、宣言時の変数名を括弧で囲むのって、別にめずらしくない。

あと、bar の型があーなってるのは、一応正しいんじゃないかと思いますな。 引数として関数を渡す場合、渡すのは関数へのポインタでしかあり得ないので。 まあ、あーゆー変な宣言は、下手に気を利かせて補完をしてくれるよりも、適当にエラーにしてくれた方が良いような気はするけど。

……こういうときトラックバックすれば良いんだろうなあ…とは思うんだけど、やっぱり恥ずかしがりなんで黙っておく。 ここはチラシの裏ですよー(ある種のエチケットペーパー)。

% [PC] 例外は…

最初に触った(と言うか、ちゃんと勉強した)例外機構を持った言語は Ruby だったんで、わしは例外は『上げる』もんだと思ってたなあ。 厳密に言うと、何かの本(だったか Web ページだったか)で読んだ書き方が気に入って『挙げる』を使ってるけど、意味的に正しいのかどうかは知らん。

なんかイメージ的に『例外があがる』(あるいは『例外をあげる』)ってのが『手を挙げる』に似てる気がしてるんで、自分的にはしっくり来てるんだけど。

% [雑談] FRISK LIQUIDS

てのを、サンクスで見かけて買ってみた。 FRISK Japan のサイトには製品情報が無いんで、気になる人は US のサイト辺りでチェックしてちょうだい。(フラッシュだから直リンできない)

まあなんつーか、一言で言って……『いくら』(NOT "How much?")

わりとクセになる食感だが、コストパフォーマンスに問題がある(すぐ無くなる)ので常用はできない。

% [Ruby] Selector Namespace の話

ruby-dev での selector namespace の話は期待したほど盛り上がってなくて残念なんだが、かと言って自ら燃料を投下するほどの度胸も無いのでこの辺(チラシ)にとりとめもなく書いておこうと思った。

わしが selector namespace 導入にあたって期待しているのは、通常の名前空間(まあぶっちゃけ Module や Class)と直交する概念であって欲しいってこと。 と言うか、そうでなかったら敢えて追加する意味なんてあるの?とも思う。

例が適切かどうかわからんけど、一応書いてみよう。 状態 a のときには x メソッドを、状態 b のときには y メソッドを呼ぶ…みたいな処理。

# 現在
class Hoge
   def x
      p "A"
   end
   def y
      p "B"
   end
end

hoge = Hoge.new

case fuga   # fuga はどっかでいろいろされてるなんかの状態だと思いねえ
when a
   obj.x
when b
   obj.y
else
   raise
end
# selector namespace があれば
class Hoge
   def x$f
      p "A"
   end
   def y$f
      p "B"
   end
end

hoge = Hoge.new

case fuga
when a
   using x
when b
   using y
else
   raise
end
hoge.f

……あれ?なんか大して変わらんみたいな風味になっちゃったな。 いや、だからね?えーと……あれだ、ここではメソッド呼び出しが一回しか無いから違いが出ないけど、各状態におけるメソッド呼び出しがそれはもうたくさんあるシチュエーションだと、selector namespace がある場合とそうでない場合で、バグの入り込む確率が随分違ってくると思わない? え、想像できないですか?

なんつーのかなあ、要するに selector namespace があると、今までとは違う方向でもって処理をまとめることができるようになる……と思うんだけど。 こういうのはあれかな、アスペクト指向とか言うのかな。よくわかんないけど。 なんか結局うまく説明できてないけど、上手に実装されれば、きっと夢が広がりんぐな機能だと思うんで、わりと期待してるのですよ、ええ。ああ、なんかいろいろダメ...orz

% [Ruby] Selector Namespace の話その2

バータリーをこよなく愛するドロナーワプログラマであるわしとしては、selector namespace は selector(メソッド探索)だけじゃなく変数にも影響して欲しいとか思ったりする。 ぶっちゃけて言うと、namespace ごとにグローバル変数(それとは別に "namespace 変数" みたいのを新設しても良いけど)を持てるようにして欲しいってことね。 わしが RBM に region て名前で実装しようとしてるのが、まさにそういう感じのものなんだが。

これができるとどうなるかと言うと、例えば一つのオブジェクトの一つのメソッドを、どの namespace 上で呼ぶかという事柄だけで挙動を変化させることができるようになる(内部で同じ変数を参照していても、呼ばれた namespace によって中身が違うから)。 namespace をひとまとめの『状態』とか『プロパティ』として使う感じ。 こういうことができるようになると、結構楽できそうな気がするんだけど。

話は変わるが、この問答でグローバルな名前空間を汚染してしまう云々て質問に、Selector Namespace で解決できるかも…って言ってるのは、どうかと思った。 つーか、既存のモジュール機構をいじって、Java の package みたいに一意な prefix を付ける形にすることって難しいのかねえ。 中身を知らない身としては、それが一番近道な気がするんだけど。 ともあれ、わしの感覚としては Selector Namespace って、ここで求められている名前空間とは直交する概念なので、これで解決ってのはちょっとしっくり来ないって話。

Java の package って結構秀逸だと思うけど、結局実装がどうのこうのと言うよりも『一意な名前を付けるために、既存のどこにでもある一意性を持った名前(ドメイン名)を利用する』ってアイデアが肝なわけで、単純に真似しちゃえば良いのにと思うことはよくあるなあ(ちなみに MacOSX の設定ファイルの名前なんかは、この Java 方式だったりするね)。 それが嫌なら、モジュールごとに ID を割り振る機関とか作って管理? ちょっと気持ち悪い気がするなあ。 超漢字にはアプリケーション ID てのがあって、パーソナルメディアが申請に応じて割り当てることになってるけど、こういうのって申請する方もされる方も面倒だよ。 Java 方式は、みんなが約束を守ってさえいれば、何も面倒な事無くすごせる。 まあ、ドメインを持ってない個人開発者が困るって問題はあるから、Ruby には微妙に合わないって感じもしなくはないけど。

なんか脱線しまくったけど、なんとなくまとまらないままこの辺で終わり。


2005-10-19 [長年日記]

% [PC] まあわしも修行は足りないんで

昨日の話にこっそり返事が来てたようなんで、せっかくだからツッコミ(ハテナだからコメントか)入れてこようと思ったんだけど、一言で終わりそうにないからやっぱりここにこっそり書いとこう(笑

なんつーか、鍋谷さんとわしとで問題の認識に微妙なずれがあったのは確かみたいですな。 わしの場合は、『文法上必須のもの以外の括弧は単に演算子の優先順位を指定するためのものでしかない』てなことをどっかで読んで、実際そう思ってたので、int( b ); みたいな書き方を見ても単に余計な括弧が付いてるだけと認識したわけで。 その辺の認識の違いかなと。 ぶっちゃけ、何が悪いって C の文法が変なのが悪いじゃないかと(苦笑

列挙されてる宣言の正誤はわしもよくわかんないです。 と言うか、コンパイラの(厳密にはパーサの…かな)作りによって微妙に違ってきそうな気がする。 まあ、わしとしては、こんな変な書き方が読み書きできなくたって別にへっちゃらだと思うんですが、いかがなもんでしょな。

% [PC] ついでに例外の話にもツッコミが入ってたみたいなんで、思いついたこと書いてみる

C++ の throw して catch する…てのはライブラリを書く側の視点で、Ruby の raise されて rescue する…てのはライブラリを使う側の視点なのかな…と思った。

ちなみに Ruby の raise は Smalltalk から来てるような話をどっかで聞いたことある気がするけど、Smalltalk で例外を捕捉する場合は handle: というメッセージを使うみたい。 handle って言葉からは、なんとなく非同期シグナルとか割り込み処理とかが思い浮かぶ。

ワンチップマイコンなんかのプログラムを書くと、ハードウェア割り込みに対するハンドラとかってわりと普通に使うものなんだけど、多分そういう『自分が制御できないところから飛んでくるシグナル』みたいなのが例外とイメージがかぶるんで、わしとしては raise の方がしっくり来るのかも知れない。 どっかの誰かが投げるんじゃなくて、どっからともなく報告があがってくるような感じ? あるいは……

  • 自分は教師で授業をしている。
  • 途中で「先生わかりませ〜ん」と手が挙がる(例外)。
  • 仕方ないので授業を中断して質問に答える(捕捉)。

…とか。 なんかだんだんグダグダになってくから、この辺で止めよう...orz

ああ、それと raise の正しい訳は、たぶん『発生』辺りなんでしょうなあ。 ただ口で喋るときに「例外が発生したときに…」とか言うと堅苦しいから「例外があがったときに…」とか言った方がいい気がする。 つーか、Ruby のわりと偉い人なんかも「あげる」「あがる」と書いてたりするはずなんで、raise は「あがる」で良いんです、たぶん。 でも、書籍なんかだと発生って書いてるが。あとリファレンスマニュアルなんかでもそうか。

% [PC][雑談] UCS16 って何でしょう?

前橋さんとこの crowbar のページを眺めてたら(『読んでた』わけじゃないのがダメっぽい)、"UCS16" って言葉が出てきてびっくり。

何そのキメラ?と思って、単なる誤植かとも思いつつグルる。 386 件……微妙。 とりあえず検索結果から拾ったこのページには、

UCS16 is the same as UTF16, except its fixed width and has a smaller range than UTF16.

と書いてあった。 よくわかんない。つーかこの説明って UCS-2 のことを言ってるようにも見えるんだけど……

結局 UCS-2 もしくは UTF-16 と、UCS16 とは何がどう違うのかは判明せず。 ちなみに、rfc search で検索した限りでは RFC は存在しないようだ。

% [PC][雑談] UCS-16 の続き

rfc search では検索したけど google の方で "UCS-16"(ハイフン入り)を検索すんの忘れてた。 うりゃ……541 件。 やっぱ微妙。

さっきのページの記述から想像すると、『サロゲートペア機構がない UTF-16』とか『BOM 付きの UCS-2』とかそんな感じなのかなあ。 どっちにしても、検索結果から考えてあんまり一般的なものじゃないみたいだけど。

% [雑談] 北海道人の特権

危うく忘れるところだったが、今日は水曜どうでしょうの新作放映日だよ。 念のため、今からテレビ付けっぱなしにしとこう。(まだ 19:30 です)

% [雑談] 7でFA

わしもそう思った(笑

何の話か知りたいなら→こちら(ニャー速VIPブログ)。

% [雑談] 今日の水どう

○し追い祭りキター!! 「なんでオレがうしに追われなきゃいけないんだよ。」

もういろいろとどうしたもんだか。 ヤマピカリャー!!

ごめんなさい、なんかテンションがおかしかったです。 あと on ちゃんの動きは、あいかわらず素晴らしかったです。


2005-10-20 [長年日記]

% [雑談] 僕のオナラ事情(ワラタ2ッキ)

「どう見ても○○です。本当にありがとうございました。」に通ずるものがあるな「以上、報告させていただきました。」

なんかもういたるところがシュールでお腹痛い。

% [game] あ〜か〜ど〜こ〜

また発売日勘違いして、来週発売だとばっかり思ってたが、たまたま店に行ったら売ってたので買ってきたよ、あかどこ。 まったりやる。

% [game] なんとなく思ったんだが…

古いゲームのうまいプレイをビデオキャプチャかなんかで録って、Podcast とかで配信したら流行らないかな。

つーか、誰かエイリアンソルジャーのスーパーハードをクリアする映像とか配信してくれないか。 わしはダイナマイトヘッディーを完全クリアする(シークレットボーナス全取得)映像なら、がんばれば作れそうな気がする。 いや、キャプチャ機器とか無いから無理だけど。

% [game] あかどこにおまけで付いてきた『愛のおすそわけ CD』を聴く

やべえな、これ(笑

ハードゲイの人を見てるときのような、妙なこっぱずかしさがある(謎

% [game] あかどこ日記、今回はムズイ編

前作きみしねはマニアックまでクリアして、コンプリートしたわしなんだが、今作あかどこは全体的に難易度がアップしてる風味でウガーだのアガーだの叫びながらプレイしとります。

しかし、相変わらず無駄にエロいですよ、いろいろと。 かまいたちの夜なんかの頃からずっと思ってるけど、はっきり描かれてるより、こういう影絵みたいなのとかの方がずっとエッチぃよなあ、とか。 想像の余地がある分、よりエロさが増すと言うかね。 え、つーことは見る人のエロさが影響するってことですか? えぇ?わし別にエッチくないですよ。いやほんと、ほんとだって。

わしは単に『見えそうで見えない』フェチなだけですから。 見えちゃったらおしまいなのよ。 かと言って、あからさまに見えないのはダメで。 なんか見えそうなんだけど、どうしても見えない。それがイイ。

……なんで変態嗜好のカミングアウトしてるんでしょうか(爆


2005-10-21 [長年日記]

% [お知らせ] メンテナンス情報

鯖管から通知があったので一応メモ。(わし自身が忘れて慌てそうなので)

10/31 02:00〜05:00の間、回線設備入れ替えの為断続的にサーバまでの経路が断絶します

いじょ。

% [雑談] 本日の体調

腰が痛いです。

あと腰が重いです。

いや、それはいつもの事でした。

ともかくストレッチ強化期間を設けねばツライ……

% [game] あかどこ日記、続きはきみしねでお楽しみください編

とりあえずストーリーモードクリア。 愛を手にした主人公は、今度は愛を広めるためにラブラビッツとなって活躍するのでしたマル。 …という話だったらしい。

さて次はアナザーストーリーに挑戦。 どうやら幼馴染みが主人公ロボを作って、自分に奉仕させる話の模様。 ゲーム的には、自分がロボで彼女が幼馴染みに変わっただけの風味だが。


2005-10-22 [長年日記]

% [game] ゴルトモ

ううむ……どうかな。 SNS やブログと連携してるってのは、ちょっとおもしろそう。

% [雑談] せつないねえ……

今、PSP が(現実に)埃をかぶってるのに気付いて、掃除してやるついでに久々に電源を入れてみた……ら、案の定バッテリーが切れていた。 いつから放置してるんだろ。

PS2 の新バージョンは、互換性に問題があるそうで。 ウォークマンといい、これといい、ソニーは迷走しまくりですな。 どうすんだろ、ほんとに。

% [game] 今日の戦果

メガドラを引っぱり出して以来、一週間に一回くらいの割合でエイリアンソルジャーをプレイしてる。 スーパーイージーでだけど。

んで、今日は三回目。 一回目は感触を取り戻すのにひと苦労で、何度も死にまくって XI タイガーにようやくたどり着いたところで、力尽きて終了。 二回目は幾分調子を取り戻したものの、イプシロンファーストにどうしても勝てなくて倒れる。 今回は、イプシロンファーストを体力 1 ドット残して何とか下し、その後は順調に進んだものの、やっぱりセブンフォース楓が立ちはだかって力尽きた。 一応第五形態までは行けたんだが、倒し方を思い出す前に死亡。 そこで集中力が切れておしまい。

やっぱ楓ちゃんが一番の難関だ。 って言うか、ここで力尽きることが多いから、その後の展開が全然記憶に無い。 つーか、何がつらいって長丁場なのがつらい。 第五形態まで行ってから死ぬと、精神力が大きく消耗するよ。 こいつに比べれば、ラスボスの方がよっぽど楽だ。 ……どんなやつか憶えてないけど。

ちなみに楓ちゃんから始めるパスワードは 2878 だ。 パスワードはゲームオーバーになった時に表示されるので、それこそ数えきれないほど何度も何度もこのパスワードを見たものだ。 これをキャッシュカードとかの暗証番号にすれば、絶対忘れないよなーとか考えた事もあったっけ。


2005-10-24 [長年日記]

% [FreeBSD][vim] いまさら PR ports/74537 にフォローが付いてるよ……

ほんと今さらだなあ。

(適当訳) Vim 6.4 が出てるけど、それで直ってないかどうか見てくんね? んで、もし直ってなかったら bugs@vim.org にバグリポートしたらどうだろね? 俺っち、マルチバイトはさっぱりでさあ、たくさんの人が検証した変更以外はしたくないんだよね。

って感じか。だる……

ちなみに、今ちょっとまともに使ってる FreeBSD が無くて、すぐには試せないんだが、vim の cvs を覗いた限りではこの問題に関係するような修正はされてないっぽいんで、きっと今も同じ問題があるはず。 あ、FreeBSD の mblen() が修正されてれば別だけど。

ともかく、なんか今さらだし、めんどくさいから関わりたくないんですが(苦笑。 とりあえず、何人かから肯定的なレビューがあれば、修正するつもりがあるようにも読めるんで、この修正で助かってる人(それなりにいると思うんだけど)は、少し突っついてみたらどうですか? ……と責任放棄してみるモード。

% [game] みんごる4日記、逆境こそ燃える編

久しぶりに熱が戻ってきて、一生懸命やっているところ。 すごく気持ちの良い勝ち方をしたので、記録を残しておこう。

上級者モード、バックティ、コース7(ワンダーランド C.C.)。 優勝ラインはイーブンパーか -1 というところ。

3H までは順調にパー。 ところが迎えた 4H で痛恨の O.B.をやらかしトリプルボギー。激しくヘコむ。

以前のわしなら、ここでリセットかけるところだが、今のわしはこれくらいじゃへこたれない。 気を取り直して続行。 5H パー、6H バーディで「よーし、この調子で盛り返すぞぉ」と気合いを入れた直後の 7H ショートホールで今度は池ポチャしてダブルボギー(このホールの池は強制的に打ち直しなんで、O.B.と変わらんのだ)。 ショックを引きずったまま 8H ロングホールは 1 打目をバンカーに突っ込んでボギー。 結局前半を +5 で終了し、完全にだめぽムード。

後半戦。 10H, 11H をパーでしのぎ、迎えた 12H で 7m という微妙な距離のバーディパットを沈め、いよいよ反撃の狼煙が上がる。 13〜17H で計3つのバーディを取り、スコアは +1。

最終 18H ロング。慎重に行けば比較的バーディは取りやすいホールである。 ところが優勝が見えてきたプレッシャーからか、1 打目でインパクトを失敗してラフに突っ込む。 ドッグレッグで内側は水路という厳しいホールなので、通常 2 打目はショートカットするところを、我慢して短く刻む……つもりが、またもやインパクトをしくじりボールは水路に向かって一直線。 「ギャー!!」と叫んだところ、ギリギリ水路を越えて運良くフェアウェイに落ちてくれた。 泣きそう。

本来であれば 80y ほどのアプローチになるところ、2 打目を刻んだせいで残り 140y ほど。ピンの位置はグリーンの特別狭まったところで、バーディが狙える位置に落とすのは結構厳しい。 そのプレッシャーに負けて、インパクト時に×ボタンで距離の微調整をすべきなのに、それをせずに打ってしまい、グリーンをオーバー。パーオンキープできず。 誰もが「終わった」と思ったと言う。 つーか、誰も見てないから、そう思ったのはわしだけだが。

ところがここでラフからの 7y ショットを、会心のチップイン。 これでバーディで、最終スコアはイーブンパー。 同スコア多数だが、ポイント差で見事優勝。 ああ、4H の時点でやめなくて良かった。前半 +5 で終えたときもやめようか迷ったけど、やめなくて良かった。 みんなありがとう、応援ありがとう。 まあ、誰も応援なんてしてないけど、一応脳内観客にアピール。

せっかくだから、スコアの記念写真も撮っといた。 個人成績スコアボード。 終盤の追い上げっぷりが、我ながら格好良すぎる。


2005-10-25 [長年日記]

% [PC][雑談] 手応えの意味

(注:この文章は、真・窓と林檎の物語にインスパイヤされている可能性があります。)

どこぞの偉い人は言ったものである。「フィードバック重要。」と。

ここで言う『フィードバック』とは、つまるところ『操作に対する手応え』のことであろう。 古来、ある道具に対してある操作をした場合、そこには必ず何らかの手応えがあるものであった。 ところが、コンピュータの世界では必ずしもそうではない。 と言うより、『あえてそのように作らない限りコンピュータの世界に操作に対する手応えというものは存在しない』のである。 もちろん、操作の結果をもって手応えと認識することも可能だが、日々手応えのある世界で暮らしている我々人間にとって、それはどうしても不自然な状態になるのである。 いわば触覚を奪われた状態で、何か作業をするようなものだ。

そういったわけで、コンピュータのユーザインターフェイス(特に GUI)に『手応え』の表現は非常に重要なはずであり、実際 MacOS ではきちんとそれが考えられていて、例えばメニューを選択すると選択した項目が点滅して『操作に成功したことを示してくれる』のだ。 ところが MacOS を表面的に模倣した(厳密には当時『MacOS』という言葉は無かったので、『Macintosh の OS』というべきか)Windows にはこれが無い。 だからメニューをちゃんと選択できたのか、それとも失敗したのか、すぐにはわからない。 メニューを選択したにも関わらず期待した動作が起こらない場合に、操作を失敗したのか、それとも処理が重いせいで時間がかかっているだけなのかを判断できないのだ。 結果、せっかちな人は何度も同じ操作を(必要ないのに)繰り返してしまったり、のんびりな人は長々と待ったあとで実は操作に失敗していたことに気付いてやり直したり、という不毛な事態が起こる。 手応えの有無というのは、見た目上はほんのささいな違いである。 さらに言えば、みんな Windows に慣れてしまっていて、手応えが無いことに不満を抱かない。 だが、道具としてそれは確実に間違っているぞ、とわしは言いたいのである。 やっぱり Windows なんてキライだ(何か嫌なことがあったらしい)。

ところで今現在、非常に不満を持っている UI の手応え問題は、iPod nano に関してである。 ちなみに Windows については諦めてるので、たまにちょっと愚痴っちゃう程度で済むのだ。

それで nano のことである。 初代 iPod のホイールは物理的に稼動するものであり、当然操作に手応えがあった。 その後、もろもろの問題で(おそらくメンテナンス性やら、ユニットの厚みやらの問題だろう)タッチホイールに変わった。 そして現在はその発展系であるクリックホイールである。 こいつらは要するにトラックパッドなわけだが、稼動部分が無いために物理的な手応えは存在しない。 その代わりに、操作に対して音が鳴るようになっている。これは良い。さすが Apple わかってらっしゃる。 だがね、nano になって妙に操作感が繊細になっちゃったにも関わらず、ホイール操作に対する音の鳴る割り合いが少なすぎるのが納得いかないのだ。 曲を聴いているときにホイール操作をすると音量の調節になるわけだが、操作音はかなり大きくホイールを動かさないと鳴らない。 そして操作音が鳴るほど動かすと、現実的なボリューム調整にはならないのだ。 ミュートの代わりか、耳を破壊する自殺行為かのどちらかである。 するとどうなるかと言うと、Windows のメニュー操作と同じ運命が待っている。 きちんと操作できているか、直感的にわからない。 特に無音状態のときにはどうしようもない。 結局、画面を見て判断するしかないのである。 これは非常にストレスになる。

音楽の途中で操作音が鳴ると邪魔だと思ってるのかも知れないが、余計なお世話である。 ぜひとも、ちょっとホイールに触るだけでポリポリ音が鳴るようにしてもらいたい。 なんと言っても「フィードバックじゅーよー」であるからして。

% [雑談] ちなみに…

オチは思いつかなかったので、締めの部分は単に窓林檎っぽく真似しただけであり、深い意味は無いことをお断りしておきたい所存。

% [雑談] ダルシムの新しい必殺技を考えようぜ(ニャー速VIPブログ)

> ただし、ヨガってつけるの禁止な
> ただし、ヨガってつけるの禁止な
> ただし、ヨガってつけるの禁止な

みんなでヨガフレイムすればガスとかいらないし

が、妙にツボ(笑

% [まんが] 尾玉なみえ祭り

アフタヌーンを買いに行ったついでに単行本のコーナーを覗いたら、なんと尾玉センセイの単行本が 2 冊同時に発売されていた。 帯には『尾玉なみえ祭り』の文字。 そして裏表紙側の注意書き『これを機に尾玉マンガ本をそろえて下さい。大変、そろえやすい冊数となっております。』が涙を誘う(笑

と言うことで Amazon のリンク貼っときますから、みなさん買ったげてください。


2005-10-26 [長年日記]

% [雑談] 今日の水どう

すでに企画が崩壊してました。 しかし、あんな地味な映像なのに、どうしてああもおもしろいのか(笑


2005-10-27 [長年日記]

% [game] これこれ買ってきた

とりあえずスペハリのアーケード版だけやってみた。 どうも音源の再現度がイマイチっぽくて、音色が変な部分があるようだが、それでもあの悪夢のようなスペハリもどきに比べればちゃんと本物だから安心だ。 と言うか、今回はアーケード版なんておまけだからな(笑

さあ、今日は寝れないぞ。

% [game] スペハリ mk3 版

再現度はかなり高いと思われる。 でも、ひさしぶりすぎて、11 回コンティニュー(ゲームオーバーの音楽が鳴ってる間に←→←→↓↑↓↑)を駆使しても HAYA-OH まで辿り着けず。無念。

まあ、あせらずとも、これからはいくらでもプレイできるわけだから安心じゃわい。 あと、プレステのコントローラーだと、親指がゼビウス病でツライ。

% [game] SDI

ExpertMouse(デカ玉トラックボール)繋いでやってみたよ。泣けた。 もう死んでも良いと思った。死なないけど。

やっぱ 3 面くらいしかクリアできなかったんで、リプレイモードでスーパープレイを鑑賞。 ……ぶっちゃけありえない。 ほんとにこれ、人間が操作してんのか?っつー感じ。 だって、ディフェンシブハーフが一回も無いんですよ? 要するに、全ステージパーフェクトなの。 照準がまるで自動ロックオン機能でも付いてるみたいなの。 ほんま、ありえない。 SDI に少しでも思い入れのある人は、この映像を見るためだけに買っても損しない。

おかげで初めてエンディング見れたけど、mk3 版とほとんど同じだな。 mk3 版は一応クリアしたことあるんですのよ、オホホ。

% [game] カルテット&ダブルターゲット

カルテットは、やっぱ一人でやってもつまんねえ。 ガントレットを一人でやってもつまんないのと一緒。……か?

ダブルターゲットは、隠し要素とか全然忘れててダメダメ。 まあ、このゲームは必要なネタさえ思い出せれば、まったり稼ぎながらプレイすれば今でも十分クリアできると思うんだが……スペハリ 3D の方は無理だなあ。ダークユーライア見てえよぅ。


2005-10-28 [長年日記]

% [PC] soopy の randy さんが本を出す模様

本人の Blog で宣伝されてるんで、Amazon で買う人はどうせならここからクリックしてあげましょう。 わしも心情的には無条件で買ってあげたいところだが、貧乏なので中身を見てから判断したい所存。


2005-10-29 [長年日記]

% [OCaml] Event モジュール攻略戦

2ch の ML スレでちょっと話題になった Thread 関係の話(898-905 あたり)に触発されて、Event モジュールの使い方をおべんきょ。

ちなみに、スレッドを外から殺せないのはまあ仕方ないと思う。 >>903 も書いてるが Java は Thread#destroy() ってメソッドがあるみたいだけど、1.4.2 だと

Destroys this thread, without any cleanup. Any monitors it has locked remain locked. (This method is not implemented.)

[Thread (Java 2 Platform SE v1.4.2)より引用]

だし、1.5.0 だと Deprecated で、実質何も意味が無い。 OCaml の場合、vmthread には Thread.kill が実装されているように見える(試してないけど)が、これは名前の通り VM の機能に依存してるようで、バイトコード版でしか使えない。 ネイティブコード版でも使える通常の Thread モジュールは pthread を使ってるので、未来永劫 Thread.kill が実装される事は無いような気がする。 だって、そもそも pthread ってものが、外部からキレイにスレッドを殺したりできないもんでしょ。

さて、そんでまあ、外部からスレッドを殺したいときは、なにがしかのメッセージを送って内部から自分自身を終了させるのが真っ当な方法になるかと思うが、スレッド間のメッセージ通信に使えるのが、どうやら Event っていうモジュールらしいので、リファレンスマニュアル見てみた。 ……さっぱりわからん。 仕方ないからソース見たり、いろいろ試しながら試行錯誤して何となくわかってきた感じのことを、ここにメモ。

とりあえず、基本的な使い方はこんな感じみたい。

% ocaml unix.cma -I +threads threads.cma
        Objective Caml version 3.08.4

# let ch = Event.new_channel ();;
val ch : '_a Event.channel = <abstr>

# let _ = Thread.create (fun () ->
     let ev = Event.receive ch in
     print_endline (Event.sync ev);
     print_endline "thread exited") ();;
- : Thread.t = <abstr>

ch はイベントを送受信するための経路(実体はキュー)。 この時点で "thread exited" は表示されない。 なぜかと言うと、Event.sync のところで(ch に何もイベントが溜まっていないので)イベント待ちでブロック(スレッドが停止)してるから。 Event.receive ch で ch を通してイベントを受けるためのオブジェクト(オブジェクトと呼ぶのはいまいち正しくないが、とりあえず)が取得できる。

# let sev = Event.send ch "hoge";;
val sev : unit Event.event = <abstr>

# Event.sync sev;;
- : unit = ()
# hoge
thread exited
Interrupted.

Event.send ch "hoge" で "hoge" という値を持ったイベントを ch を通して送信するためのオブジェクトが取得できる。 あくまで『送信するため』のもので、この時点では実際に送信されない。 んで、このオブジェクトに対して sync することで実際にイベントが送信され、さっき作ったスレッド内のイベント待ちしていた sync が動き出す。 "hoge" という値を持ったイベントなのでそれが表示され、スレッドの実行が継続されて "thread exited" が表示されて終了。 送信側イベントが sync された時点でスレッドコンテキストが移動してるからなのか、プロンプトに戻ってこなくなるんで、Ctrl+C で割り込み入れて復帰(Interrupted.と表示されてるのがその部分)。

さて、Event.sync を使う場合は送信側、受信側それぞれが sync しないと先に待ちに入った側がブロックするんだが、当然そうじゃない方がありがたいときもあるだろう(と言うか、その方が多い気がするが)。 そんなときは sync の代わりに poll を使う。

# let _ = Thread.create (fun () ->
     let ev = Event.receive ch in
     print_endline (match Event.poll ev with
        | None -> "none"
        | Some s -> s);
     print_endline "thread exited") ();;
- : Thread.t = <abstr>
# none
thread exited

この場合、poll の時点でブロックせずに、ch にイベントが溜まっているいないに関わらず、その時点で結果を表示する。 今は何も送信していなかったので、イベントキューは空だから "none" と表示されて終了している。

これくらいが基本的なところ。ひとまずまとめ。

  • new_channel
    • イベントを送受信するための経路を生成する。
  • send
    • 指定した channel を通して、指定した値を持つイベントを送信するためのオブジェクトを生成する。
  • receive
    • 指定した channel を通して、イベントを受け取るためのオブジェクトを生成する。

send, receive はイベントコンストラクタとでも言うもの。 他に always と choose があり、always が生成するイベントは使い道がよくわからない。 choose はイベントのリストで、sync や poll するときに中身がランダムに一つ実行されるようになっているようだ。

  • sync
    • 指定されたイベントを実際に実行する。send で作ったイベントの場合、receive で作ったイベントが sync(あるいは poll)されるまでブロックする。逆に receive で作ったイベントの場合は、send イベントが sync されるまでブロックする。いわゆる待ち合わせのために使えそう。
  • poll
    • sync と違い、イベントキュー(channel)が空でもブロックしない。そのため常に有効な値が返るとは限らないので、返り値は option 型になっている。

sync は同期、poll は非同期のイベント通信に使う……んだと思う。 他に select というのもあるが、これはマニュアルにもあるとおり sync (choose event_list) と同じもの。

あと、二次的なイベントコンストラクタとして、wrap や wrap_abort てのがある。 それと guard ってのもあるが、これも always と同じくいまいち使い道がわからない。 たぶん、単体で使うと言うよりも、イベントのリストに混ぜておいて何かをするって感じなのかな(always なんかも)。 とりあえず wrap と wrap_abort のサンプルを書いとく。

# let _ = Thread.create (fun () ->
     let wev = Event.wrap (Event.receive ch) (fun s -> print_endline s) in
     Event.sync wev;
     print_endline "thread exited") ();;
- : Thread.t = <abstr>

# Event.sync (Event.send ch "hoge");;
- : unit = ()
# hoge
thread exited
# let _ =
     let ev1 = Event.wrap_abort (Event.always "ev1")
        (fun () -> print_endline "ev1 not selected") in
     let ev2 = Event.wrap_abort (Event.always "ev2")
        (fun () -> print_endline "ev2 not selected") in
     let evl = Event.choose [ev1; ev2] in
     print_endline ("event is ... " ^ (Event.sync evl));;
ev2 not selected
event is ... ev1
- : unit = ()

wrap_abort の例がいまいちわかりづらいかも知れないが、wrap はイベントハンドラを登録するようなもので、wrap_abort はイベントが複数ある場合に実際に使われたイベント以外のイベントに対してのハンドラを登録するもの。 まあ、wrap はともかく wrap_abort の使い道はわしのごときぬるま湯脳では、いまいちピンと来ないんだが(苦笑

だいたいこんなとこでしょう。 さて、いつかこの知識が活用されるときが来るでしょうか。 ……微妙だな。


トップ 最新 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com