火星に到着したスピリッツの探索機が密かに仕組まれたバックドアのおかげで息を吹き返したオハナシ

素敵だ・・・

火星着陸時の衝撃で地上探索機搭載のコンピュータのフラッシュメモリファイルシステムが壊れたのでOS再起動の永遠の繰り返しになってしまった。起動するとフラッシュメモリのエラー検知をして再起動・・・。地球からのコマンド送信しての通常の初期化起動も無効になるし万が一のための最低限モードによる起動指示もきかない。対策のために何日も全スタッフは24時間苦しんだんだって。ところで起動ってエネルギー食べちゃうんだよね。起動直後にそれまでの活動履歴を地球に送信する仕組みなんだけど電波出し始めて履歴がはいっているフラッシュメモリの中身を検索すると落ちる。これの繰り返し。クソデータにみちた電波のたれながしが繰り返されてエネルギーが減っていく・・・そうこうしているうちに太陽光による発電とバッテリーとのつりあいがとれなくなってエネルギーの完全な不足になり瀕死状態に。極寒の夜がくれば耐えられないかもしれない。

でも開発担当者のたったひとりだけが誰にも知らせずに仕込んでおいたバックドアがあって助かったんだって。「ポンコツの起動」コマンドがあってフラッシュメモリを見に行かない優れもの。送信したらとりあえず起動成功!
その後も苦労はあったみたいだけれど。探索機の大活躍の結果はみなさんもご存知のとおり。

バックドアが地球の科学の進歩にこんなに貢献した例はたぶんないでしょうね。

というわけで、開発者は必要かどうかわからなくても設計要件以上のマージンを確保しておきましょう。そして内緒にしておきましょう(嘘)

IEのJavaScriptの笑っちゃう挙動

IEEUC-JPで動くはずなのにShift_JISで狂った挙動を

おまえ、さっきまでEUC-JPのつもりだっただろ?なんでいまさらShift_JISのつもりになってるんだ。というIEのだめだめな例。ネタ。

以下を書いているうちにぶつかった事例です。

http://d.hatena.ne.jp/hoshikuzu/20071011#p1

※というわけで長谷川さんがどうしても信じてくれないので書くことにしました。

まずまともに動く例を

以下はJavaScriptの文法的に合法なので、当然、FirefoxでもOperaでもIEでもきちんと動き、99がalertされます。
Shift_JISなので気楽にWindows付属のメモ帳(notepad)で作っちゃう。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( 十 ) ;

</script>

//このへん省略

補足しておきますが、\u5341 は、Unicode で「十」です。charset=Shift_JIS なので、alert()するときに、「十」がvar で宣言済みなのでエラーにならないです。99がアラートされます。ま、オッケーですね。

次にIEで笑っちゃう例を

charsetを、notepad で EUC-JP に変えてみます。
alert( 十 )の部分は変えません。あ、十の両隣には十分な空白をかいておいてくださいね。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( 十 ) ;

</script>

//このへん省略

IEでは、99がalertされます。FirefoxOperaでは、当然ながらエラーになります。まともなブラウザならば、上で、99 が alert しちゃぁ駄目です。 

notepadでいいので、以下のように書き換えます。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( スス ) ;

</script>

//このへん省略

ええと、「スス」の部分はですね、[0xBDBD]なのです。これ、EUC-JPにおける「十」であります。ねんのために、FirefoxOperaでソース表示すれば納得できます、はい。というわけで FirefoxOperaは当然のごとく、99がalertします。そして・・・IEでは、あれ?99がalertします。

IEよ、お前は、「alert ( スス ) 」でも、「alert ( 十 ) 」でも気にしないんだね?どっちも受け入れるんだね?よーく考えてごらん? 2番目の例であんたが読んだのは、[0x8F5C]だろ?これ、Shift_JISでのみ、「十」なんだよ?EUC-JPでは、別もんだよ?宣言されていないのに当然のごとくalertしていいのかね?その「99」ってドコカラ盗んできましたか?いつからそんなワルイコになったの?あたしゃ悲しいよ・・・シクシクシク。

IEJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい

EUC-JPモードで処理中なのにときどき、Shift_JISで処理したがるワルーイ癖がIEにはあるんですよねぇ・・ということの傍証になるのではと思いました。ほかにも寺田さんのサイト(今はないけど)に書いてあった傍証がありますです、はい。
こんなんでAjaxとかXMLとかでデータの交換をしてて大丈夫なのかねぇ(いや、UTF-8でやろうよというこなのですかぁ、はい。でもね、「十」ごときを処理できなくていいのかねぇ、というオハナシなの。)

追記:JavaScriptの処理系の内部コードはご存知のとおりUnicodeですよと決まっています。なので、EUC-JPのもと、メモ帳で書いたalert(十)が動いちゃうのは、JavaScriptのエンジンが悪いのか、それともIEJavaScriptのエンジンに外部データをエンコードして引き渡す際になんらかの事故が起きているのか、どちらかふたつのわけです。たぶん後者です。外形的に「IEJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい」なのですが、JavaScriptエンジンの責任ではないと言えるかもしれません。正しくは「IEの変なHTMLのパースのおかげでJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい」なのですね。最初からこれを言いたかったのですが、見出しの書き方に不備がありました。すでにブックマークされちゃっているのであえて見出しの変更は行いません。

ええと、検証は IE6 on WindowsXP with SP2 で行いました。

という小さなネタでした。以上、長谷川さんへ。