JSDBを触ってみた[2]2007年05月02日 01時02分55秒

このエントリの内容に誤りが見つかったので、別エントリを立てました。以下の内容は無視してください。訂正内容はこちらをご覧ください。(2007/05/05 23:05)
さらに追加情報をこちらに書きました。(2007/05/07 13:40)

あれれ、Streamでhttpが...

前回のエントリでローカルディスクからのprototype.jsの読み込みを行ったが、なんとなくhttp経由もやりたくなったのでちょっと試してみた。

js>var stream = new Stream("http://localhost/prototype.js")
js>stream.readText()
あれれ、ハマったまま帰ってこないよ。

気を取り直してもう一度

んじゃ、1行づつ読んでみるか。

js>var stream = new Stream("http://localhost/prototype.js")
js>while( ! stream.eof ) { writeln( stream.readln() ); }
/*  Prototype JavaScript framework, version 1.4.0
 *  (c) 2005 Sam Stephenson 
  :
  :
      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }

あれれれれ、最後の「}」を出力しないでハマってるよ。

もしかして...

prototype.jsのソース(1.4.0ね)を確認したところ、Safari対応の条件判断のifブロックを閉じた後に改行なしでEOFになっていた。

もしや、と思ってその後に改行を1つ入れたところ、2番目のコードで最後まで読み込んで制御が戻ってきた。

...って、! stream.eof が真にならないの!?

さらに

改行追加版のソースにしても、最初の stream.readText() はやはり制御を返さないし。

あと、テキスト操作のせいかわからんが、posやpositionプロパティは常に0のまま。どういうこっちゃ。

ここまでの暫定結論

http読み出しはXHRを使うしかないな。と思ったら、XMLHttpRequestの実装、ないのか。

ってことは、ActiveX使えってか?うむ、JSDBはもう少し様子見かな...

prototype.js 1.5.1に対応してみる2007年05月02日 03時01分10秒

気が付いたら

prototype.jsが1.5.1になっていた。

なんとなく、prototype.jsを使えるようにで試した感じで1.5.1を読み込ませてみたら山ほどエラーがでるでる。

UAの判別を事前に行って、メソッドの組み立てそのものも最適化しているのか、読み込み時に実行されるコードが増えていたみたい。

なんとか対応してみました

try & error で何とか以下のコードに落ち着いたし。

// prototype.jsのためのダミー宣言(v1.5.0/1.5.1対応版)
var window = {
	Element : null,
	ActiveXObject : ActiveXObject
};

document = window.document = {
	getElementById : function() {},
	getElementsByName : function() {},
	getElementsByTagName : function() {},
	createElement : function() {
		return {
			"__proto__" : {},
			appendChild : function() {}
		};
	},
	createTextNode : function() {},
	documentElement : null,
	body : null
};

navigator = window.navigator = {
	appVersion : "",
	userAgent : ""
};

HTMLElement = window.HTMLElement = { prototype : {} };
HTMLFormElement = window.HTMLFormElement = { prototype : {} };
HTMLInputElement = window.HTMLInputElement = { prototype : {} };
HTMLTextAreaElement = window.HTMLTextAreaElement = { prototype : {} };
HTMLSelectElement = window.SelectElement = { prototype : {} };
考えてみると、こうまでして新しいverに対応しなくてもよかった気が...

String.split???2007年05月03日 02時56分10秒

バグっすか!?

IEやWSH(すなわちJScriptですな)で

"a|b/c".split( /(\||\/)/g );
を実行した結果が
a,b,c
になることに何の疑問ももっていなかったが、同じコードをFirefoxやOperaで実行すると以下のようになる。
a,|,b,/c
あれれ?

ためしにUnder Translation of ECMA-262 3rd Editionの15.5.4.14に掲載されているサンプルコード

"A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/)
を実行してみても、やはりIE/WSHだけ結果が違う。

つか、確信犯かよ

マイクロソフトのリファレンス(Script56.chm)で確認したら、

split メソッドの結果は、stingObj が separator の位置で分割されてできた文字列の配列です。separator は、配列要素の一部としては返されません。.
とか書いてある。思いっきり仕様と違うじゃん。

いやはや...

もともとはコンソールベースでWSH使ってるときに、よく読みこんだ外部ファイルを改行でsplitしたりしてたんだけど、似たようなことをJSDBでやったら改行のみの要素がぞろぞろ出てくるので、ありゃ?と思ったのが事の発端。よもやいくらMSでも、あからさまに仕様と違うことを堂々としていたとは...これって常識なんだろうか。

と思ったら、やはり同じようにハマった人がいたよ。

おまけ

ECMA262-3rdの仕様と違うといえば、これまたJScript固有で、名前付き無名関数(禅問答みたいだな..)の名前で外部から参照できるなんてステキ動作も。

var f = function myFunc(a) { return a; };

myFunc; // IE以外は未定義になる(ハズ)、IE/WSHでは「function myFunc~」
なんだかなぁ。

ゲームボーイ筐体でPC2007年05月03日 04時29分46秒

EPIA PX + 初代ゲームボーイ筐体でウェアラブル・モバイルPC(via: Engadjet japanese)

以前のエントリでdara-jが萌えた、Pico-ITXマザーを初代ゲームボーイの筐体に押し込めた(!)驚異のPCの紹介記事。液晶モニタそのまま残して且つ埋め込みの十字キー+ABボタンでマウス操作できるとかだともっと萌えるのに。

ITmediaに何者かが不正侵入2007年05月03日 04時41分58秒

「ITmedia」に何者かが不正侵入、ページを書き換えて不正コード設置(via: GIGAZINE)

「ITmedia Biz.ID」トップページ、「TechTargetジャパン」Webキャストページ、「ITmediaメールマガジン」ご案内ページの3つが2007年4月27日18時から5月1日13時までの期間中に不正コードの入ったページを表示した可能性があるとのこと。 Windowsアップデートを最新状態にしていれば無害だったようですが、上記期間中にアクセスした記憶がある人は念のため、アンチウイルスソフトなどでスキャンしておきましょう。「EXPL_EXECOD.A」「JS/Exploit-BO.gen」「Exploit.HTML.IframeBof」というように検出されるらしい。
「GIGAZINE」より引用
とのこと。

普段IEを使用していて、上記ページに心当たりがある方はウィルスチェックをされたほうがよさそうですね。