zenith: 2005年9月アーカイブ

表現

| | コメント(5)

全身にまとった発光ダイオードをネオンのように点滅させるスパコンの数々。
ここは地下のコンピュータールーム。
突如、コンソールから穿孔テープがけたたましく打ち出される。
オペレータはそれを手に取り一目見るや否や人を呼ぶ。
「これを見てください!」
そうテープを見せられた責任者もまた血相を変えていく。
「大変な事になるぞこれは…」

もう、これ以上「大変な事態の前触れ」を感じさせる表現はないと思う。コンピュータという訳の分からない物と、未知の「予測可能な」出来事の絶妙なミスマッチだ。訳の分かってしまう物と予測可能な出来事を組み合わせてしまうと、同じような効果は受けられない。トイレのペーパーホルダーのカバーを持ち上げて「大変な事になるぞこれは…」ではダメなのだ。

古典的な表現はなぜ使い古され常套手段になったのか?
一笑に付す前に一度考えてみると、新しい表現に繋がるのかも知れない。

JavaScript を使っていると、必然的にブラウザ毎の実装の違いを吸収した関数を用意する。 例えば指定した ID で HTML 要素(レイヤー) を取得する場合、いつも以下のように書いていた。この関数は呼び出される毎にブラウザの特徴を嗅ぎ分けて、それにふさわしい処理を行おうとしている。

/**
 * 指定した ID を持つ HTML 要素を取得する
 *
 * @param 	string	ID
 * @return	object	HTML 要素
 */
function getLayer(id)
{
	var element = null;

	if (document.getElementById)
	{
		element = document.getElementById(id);
	}
	else if (document.all)
	{
		element = document.all(id);
	}
	else if (document.layers)
	{
		element = document.layers[id];
	}
	
	return element;
}

ここで気になるのが、関数を呼び出す度にブラウザを嗅ぎ分けて、それにふさわしい処理を行おうとしている点だ。嗅ぎ分けた結果を変数に入れてしまえば、分岐に掛かる時間はちょっとだけ減る。だがいまいちパッとしない。という事で書いたのが次のコードだ。

/**
 * 指定した ID を持つ HTML 要素を取得する
 *
 * @param 	string	ID
 * @return	object	HTML 要素
 */
getLayer =
	  (document.getElementById)
	? function (id) { return document.getElementById(id); }
	: (document.all)
	? function (id) { return document.all(id); }
	: (document.layers)
	? function (id) { return document.layers[id]; }
	: function (id) { return null;}

ごちゃごちゃとしていて見辛いが、やってる事は getLayer というよく判らない変数へ、ブラウザにふさわしい無名関数を入れてやっている。これできちんと期待通りに動いてくれる。この getLayer というグローバル変数も、最初の関数 getLayer も、window オブジェクトのプロパティであるのを利用している。次に例を書こう。

function XXX() { hogehoge; }

というコードは、

XXX = function () { hogehoge; }

と等価である。もう少し書こう。

function neko()
{
	alert("∧∧");
}

neko();         // alert("∧∧")
window.neko();  // alert("∧∧")


neko = function ()
{
	alert("にゃー");
}

neko();         // alert("にゃー")
window.neko();  // alert("にゃー")


var neko = "猫";

neko();			// エラー。neko is not function
window.neko();	// エラー。neko is not function

関数を定義するという事は、オブジェクトのプロパティに無名関数を登録している、と考えるといいかも知れない。

こうやって実行時に関数を定義してしまえば、余計なブラウザの嗅ぎ沸けを省く事が出来る。それによってCPUはちょっぴり(本当に、本当に少し)消費電力を少なくする。実に経済的だ。郊外のショッピングセンターで近所のスーパーより1円安いレタスを見付けたら、リッター130円のガソリンを使って車を走らせる事をためらってはならない。

陳列

| | コメント(4)

近所のレンタル店では入り口で○○特集!と、新作とその関連したジャンルの作品が並べられている。その日は香港国際警察がリリースされたばかりで、ジャッキーチェンを特集していた。過去の作品はどれも熱いのだが、その中でも一番面白いと思う酔拳2が置いてあったのでつい借りてしまった。

酔拳が放送された次の日に学校へ行くと、みんなジャッキーチェンになっていた。弁当をめぐってフク・マンケイごっこや、牛乳を無理矢理飲ませて勘当シーンを再現したりといろいろ楽しかった。それだけ影響を与える素晴らしい作品だとつくづく思う。

家に帰り、ケースを開けるとそこに入っていたのはおじゃ魔女ドレミのDVD。なぜ酔拳とおじゃ魔女が入れ替わるのだろうか…。子供連れのお父さんが借りて入れ間違えたのかも知れない。ただ私に分かるのは、おじゃ魔女も悪くない、という事だけだ。

ソーメンのつゆを、麦茶と間違えて飲む事はよくある。麦茶を飲みたい時は大体喉が渇いており、ゴクゴク飲んでしまうので被害を拡大させてしまう。過去何千回と繰り返されて来たこの行為を、WHOはいまだに勧告もしなければ警告もしない。人がこの問題を克服する事は出来ないのか?その問いに、シュレーディンガーの猫を使ってみる事にした。

猫を麦茶のポットに置き換えてみよう。麦茶のポットと、そのポットの中に茶色の液体を入れておく。観測者は直接飲んでみないとそれが麦茶なのか、ソーメンのつゆなのかは特定出来ない。さらにこれを箱に入れて、味の観測をできないようにしてしまう。

麦茶のポットの中身は麦茶なのか?ソーメンのつゆなのか?
コペンハーゲン的な解釈をすると、飲む瞬間まで「麦茶とつゆが量子的に重なり合った状態」であり、観測者が実際に飲んだ瞬間に「麦茶」、もしくは「ソーメンのつゆ」に収束する。口に含んだ瞬間に決定される、という事らしい。
一方エヴェレット的な解釈はこうだ。液体は「麦茶とつゆが量子的に重なり合った状態」である事は変わらないが、観測者もまた「麦茶を飲む観測者」と「ソーメンのつゆを飲む観測者」の両方が量子的に重なり合ってしまう。これはそれぞれの結果を迎えた平行世界が同時に存在する事を示す。まるでタイムパラドックスのような話だ。

これを私の実験結果に当てはめてみた。
コペンハーゲン的な解釈をすれば、ポットの中にはあらかじめソーメンのつゆが入れられており、私は知らずに飲んでひっくり返ってしまった。
エヴェレット的な解釈をすれば、ポットの中にはソーメンのつゆが入れられており、私は知らずに飲んでひっくり返ってしまった。だが、もう一つの世界では麦茶が入れられており、何事もなかった私が居るはずだ。

どちらにしても、飲んでみるまで判らない。この問題についてはまた違うアプローチで考えてみる必要がありそうだ。