Hatena::Groupsubtech

ういはるかぜの化学

Friday, December 16, 2011

[]JavaScript エンジン Chakra を無理矢理使う。 15:01 JavaScript エンジン Chakra を無理矢理使う。 - ういはるかぜの化学 を含むブックマーク はてなブックマーク - JavaScript エンジン Chakra を無理矢理使う。 - ういはるかぜの化学

こんにちは。JavaScript Advent Calendar 2011 オレ標準コース16日目です。

Internet Explorer 9で新たに導入されたJavaScript エンジン、Chakraを非公開な方法で使うという誰得な話です。

はじめに

WindowsにはJavaScriptMicrosoft実装であるJScriptVBScriptなどスクリプト言語(サードパーティー製でPerlとかRubyとかもある)をいい感じにあつかうActiveScriptという枠組みがあり、それを使ってスクリプトを実行するWSH(Windows Scripting Host)というのがあります。

Cscript.exeとかWscript.exeといったものがそれです。Windowsでなんとか.jsという名前で保存してダブルクリックすると起動するのはWscript.exeです。ActiveScriptはスクリプトエンジン、WSHはそれをホストして機能を提供するものと覚えておけばよいでしょう。

JScriptのバージョン

そんなJScriptにはバージョンがあります。大体IEとセットでバージョンアップしていくのでIE7で5.7、IE8で5.8となっています。詳しくはJScript のバージョン情報に書いてあります。

7(.NET 1.x)と8(.NET 2.0)と10(.NET 4)は.NETJScriptで、IE9Chakraは位置づけ的にはJScriptエンジンではなくJavaScriptエンジンとしてるようですが 9となっています。たぶんIE10は10でかぶりそうですが.NET版は忘れましょう。

WSHChakra

IE9の話に戻りますがChakraIE9をインストールすると勝手に入ります。それならばと思ってWSHJavaScriptを実行すると残念なことにJScript 5.8で動作します。

試しにIE9の入っている環境で以下のプログラムを実行してみます。

WScript.Echo(ScriptEngine() + '/' + [ScriptEngineMajorVersion(), ScriptEngineMinorVersion(), ScriptEngineBuildVersion()].join('.'));

するとJScript 5.8 (つまりIE8JavaScriptエンジンと同等)として動作します。

C:\Users\Tomoyo\Desktop>cscript //NoLogo test.js
JScript/5.8.16982

なぜ5.8で動作しているのかというとChakraは今までのエンジンの実体が別になったためです。今まではJScript.dllというライブラリでしたがChakraは別にJScript9.dllという別なライブラリに分かれています。

じゃあJScript9.dllの方を呼び出せれば解決しそうです。JScript9.dllもActiveScriptエンジンとして登録されているのでWSHにそれを使うように指示すればよさそうです。

幸いWSHの実行ファイルWScript.exe/CScript.exeにはスクリプトエンジンを指定するコマンドラインオプション(//E)があるのでそれが使えます。例えば//E:JScriptとか//E:VBScriptとかという感じです。

JScript9のような名前は登録されていないのですが、若干裏技で呼び出せます。というわけで呼び出してみます。

C:\Users\Tomoyo\Desktop>cscript //NoLogo //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} test.js
JScript/9.0.16440

なかなかクールな名前ですね。それは置いておいてスクリプトエンジンのバージョンが9になりました。つまりChakraです。

しかしChakraが本当に使われているかわかりませんね。というわけで以下のようななんとなく時間のかかりそうな処理スクリプト( JavaScript でフィボナッチ数列を高速に求める - IT戦記からコピペしました)を実行してみます。

WScript.Echo(ScriptEngine() + '/' + [ScriptEngineMajorVersion(), ScriptEngineMinorVersion(), ScriptEngineBuildVersion()].join('.'));
function fib(i) {
  if(i == 0 || i == 1) return i;
  return fib(i-1) + fib(i-2);
}
var startAt = new Date();
fib(30);
WScript.Echo(new Date() - startAt + "ms");
C:\Users\Tomoyo\Desktop>cscript //NoLogo //E:JScript test.js
JScript/5.8.16982
3531ms

C:\Users\Tomoyo\Desktop>cscript //NoLogo //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} test.js
JScript/9.0.16440
1114ms

ちゃんと実行速度がはやくなりました。よかったよかった。

と思いきや一つ残念なお知らせがあります。5.8の時と同様にegtraさんが書いているように5.7互換モードで動作しています。

Chakraで動いても5.7互換モードなのでJSONやES5の素敵機能を使えません。単にWSHを高速に実行できるだけで、互換モードから5.8以降に変えることはできません。激しく残念。

Chakraをホストする

WSHではどうやっても5.7互換でしか動きませんでした。これはChakraに限らず5.8の時でも同様です。その部分はegtraさんが書かれていますが、自分でエンジンをホストする場合にはオプションを指定すれば5.8モードに変更できます。

とするともしかしてChakraもモードを指定すれば変わるのでは?と思いますよね。指定できるモードの説明IActiveScriptProperty::SetProperty | Microsoft Docs を読むと2 (SCRIPTLANGUAGEVERSION_5_8)とか書いてあるのでもしかして3かも?と思って3を指定したら見事に動作しました。

// WSHの時と同様にChakraエンジンを呼び出す
_engine = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("16D51579-A30B-4C8B-A276-0FF4DC41E755"))) as IActiveScript;

var prop = _engine as IActiveScriptProperty;
Object invokeVer;
invokeVer = 3; // JScript9
hr = prop.SetProperty(/*SCRIPTPROP_INVOKEVERSIONING*/0x00004000, IntPtr.Zero, ref invokeVer);

JScript 9モードで動作するとJSONECMAScript 5thっぽい機能が使えるようになるのでホストする場合には幸せになれそうですね。

おまけ: Classic ASPChakra

ところでWindows ServerにはASPというActiveScriptを使ったサーバーサイドのWeb技術があります。

先ほどのChakraというかJScript9.dllのGUIDにちゃんと名前をつけてあげるとClassic ASPのlanguageで指定できるようになってASPで動くようになります。

無駄に高速なClassic ASPになりますがなぜか一度しかリクエストを処理できないので何の役に立ちません。

おしまい

明日は@polygon_planetさんです。

Saturday, April 23, 2011

[]X-UA-Compatibleが有効にならないことがあるケース 19:27 X-UA-Compatibleが有効にならないことがあるケース - ういはるかぜの化学 を含むブックマーク はてなブックマーク - X-UA-Compatibleが有効にならないことがあるケース - ういはるかぜの化学

Internet Explorerは8以降、HTTPのレスポンスヘッダ(かmeta要素)にX-UA-Compatibleというフィールドをセットすることでどのバージョン(7,8,9)と同じように判定・レンダリングするか指定できる仕組みがあります。(ドキュメント互換性の定義)

そんなスイッチですが場合によってはHTMLに間違いなく書いてあるのになぜかうまく動かないことがあります。

まずはEmulateIE7を指定してちゃんと動作するケースです。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>はうはう</title>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.min.js"></script>
</head>
<body>
<p>document.documentMode: <script>document.write(document.documentMode)</script></p>
</body>
</html>

IE8/9などで表示するとdocument.documentMode: 7と表示され、F12 開発者ツールを表示していると「ドキュメントモード: IE7 標準」とIE7モードになっていることがわかります。F12 開発者ツールを起動したままページを開くとコンソールに以下のメッセージが表示されます。

HTML1113: ドキュメント モードを IE9 標準 から IE7 標準 に変更して再起動

そしてEmulateIE7を指定しても無視されて有効にならないケースです。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>はうはう</title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.min.js"></script>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
</head>
<body>
<p>document.documentMode: <script>document.write(document.documentMode)</script></p>
</body>
</html>

IE9で表示するとEmulateIE7を指定しているにもかかわらずdocument.documentMode: 9と表示され、「ドキュメントモード: IE9 標準」とIE9モードになってしまいます。このケースの場合、F12 開発者ツールを起動したままページを開くとコンソールに以下のメッセージが表示されます。

HTML1115: X-UA-Compatible META タグ ('IE=EmulateIE7') は、ドキュメント モードが既に最終処理されたため、無視されます。

ソースはほとんど同じですがなぜ後者ではダメなのでしょうか。

そもそもInternet ExplorerHTMLドキュメントを解析しX-UA-Compatibleを見つけるとレンダリングエンジンを最初にあるメッセージ通り「再起動」することで別なバージョンのレンダリングエンジンで処理できるようにします。

ところがX-UA-Compatibleを見つける前に外部リソースへのアクセス、このサンプルコードでは外部スクリプトですが、ほかにもlink要素でスタイルシートを参照しているなど外部リソースへのアクセスがあるとその時点で処理をせざるを得なくなるためドキュメント モードは確定となります。

それが「ドキュメント モードが既に最終処理されたため、無視されます」の意味で、ドキュメント モードが変わらない理由です。

処理せざるを得なくなるという意味では外部リソースへのアクセスでなくともstyle要素やscript要素が先に見つかった場合にも同様にその時点でドキュメント モードは確定します。

ということでX-UA-Compatibleを書く場合には適当に書いておくのではなくすべての外部リソースへのアクセスやscript/style要素より先に、たとえばhead要素の頭かmeta charsetの次ぐらいに書くのをオススメします。

参考: Removing the IE9 Compatibility Button, and HTML1115 warning – Out Of The Box

Friday, April 15, 2011

[]Dean Hachamovitch氏のTシャツ 12:26 Dean Hachamovitch氏のTシャツ - ういはるかぜの化学 を含むブックマーク はてなブックマーク - Dean Hachamovitch氏のTシャツ - ういはるかぜの化学

Internet Explorerを担当しているDean Hachamovitch氏はMIXなどのイベントで講演するたびInternet Explorerのロゴ、"e" の入った単語をプリントしたTシャツを着ています。つい先日行われたMIX11ではIE10についての内容があったのでそのTシャツにプリントされていたのは"ten"でした。

そこで今までどんなものがあったのかをまとめてみました。100ぶくま狙いましょうとそそのかされましたしね!

2005/06: Longhorn RSS (Gnomedex)

時はさかのぼること2005年、GnomedexというイベントでRSSについて講演したときのTシャツが "LonghornRSS" でした。まあIEロゴではないのですがこの頃から謎のこだわりがあったようです。

Dean Hachamovitch talking about RSS Dean Hachamovitch's RSS shoe

なぜか靴にまで。

2006/03: seven (MIX06)

次は2006年に行われたMIX06でのとき、Tシャツには "seven"でした。Internet Explorer 7のセッションだったようです。

Mix06-42

2008/03: eight (MIX08)

2007年は見当たらなくて、次は2008年のMIX08です。今度は "eight" でInternet Explorer 8 Beta 1の公開だったようです。

Dean Hachamovitch, Microsoft

2009/03: Ready! (MIX09)

次は2009年のMIX09で、"Ready!"。KeynoteInternet Explorer 8の正式リリース版を発表したときです。

Dean Hachamovitch at MIX09 keynote

2010/03: nine (MIX10)

そして2010年、MIX10のKeynoteで "nine" です。Internet Explorer 9の発表自体はPDC09という時にやっていて、中間発表という感じですね。なのでこの服がネタバレだったということではないですね。

Dean Hachamovitch at MIX10

2010/09: βeauty (Beauty of the web)

次はMIX10から半年後の9月に行われたBeauty of the webというInternet Explorer 9 Beta ラウンチイベントで "βeauty" でした。eだけでなくBもβにかけてますね。

20110415115148

ちなみに私はBeauty of the webに参加していました

2010/10: developers (PDC10)

次は一ヶ月後のPDC10のKeynoteで "developers"。このときはInternet Explorer Platform Preview 6の発表だったみたいです。

Dean Hachamovitch keynotes at PDC10

2011/01: private (D@CES)

そして2011年はじめのCESで行われたイベント、D@CESのときに "private"。プライバシー関係のお話だったようです。

20110415120909

2011/03: SxSWest (SXSW)

2ヶ月後の2011年3月、SXSWで開かれたInternet Explorer 9のパーティーで"SxSWest"。このときInternet Explorer 9のRTW(正式版)が発表になりました。

Internet Explorer 9 RTW Keynote at SXSW

2011/04: ten (MIX11)

Internet Explorer 9 RTWから1ヶ月後、MIX11が開かれそのKeynoteに着てきたのが "ten"。Internet Explorer 10の発表とPlatform Preview 1の公開ですが、登壇した時点でTシャツがいきなりネタバレだったという。

MIX 2011 Keynote - Dean Hachamovitch

ちなみに文字が大きいので昔のロゴから今のロゴに変わっていることがよくわかります。

というわけで

検索で見つかる範囲をまとめてみましたがもしかしたらまだ知らない何かがあるかもしれませんので情報お待ちしています。

Dean先生の次回作にご期待ください。

トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20110415

Thursday, March 24, 2011

[]IE9Chakraとstrict modeの予感 02:25 IE9のChakraとstrict modeの予感 - ういはるかぜの化学 を含むブックマーク はてなブックマーク - IE9のChakraとstrict modeの予感 - ういはるかぜの化学

Internet Explorer 9Chakra(JavaScriptエンジン)の実体であるところのjscript9.dllのリソース 文字列テーブルをのぞいてみると以下のような文字列がみつかります。

f:id:mayuki:20110325021758p:image

  • 'with' statements are not allowed in strict mode
  • Duplicate formal parameter names not allowed in strict mode
  • Octal numeric literals and escape characters not allowed in strict mode
  • Invalid usage of 'eval' in strict mode
  • Invalid usage of 'arguments' in strict mode
  • Calling delete on expression not allowed in strict mode
  • Multiple definitions of a property not allowed in strict mode

今回のIE9のリリースには strict mode の実装は入らなかった(か無効かされているか)のようですが、一応実装はすすめられてそうな雰囲気がしますね。

トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20110324

Thursday, February 10, 2011

[]Internet Explorer 9 RCの変更点 02:45 Internet Explorer 9 RCの変更点 - ういはるかぜの化学 を含むブックマーク はてなブックマーク - Internet Explorer 9 RCの変更点 - ういはるかぜの化学

RCもでたし折角なので簡単に変更点をまとめてみます。

大きな機能はまあ誰かやメディアなどで解説があると思うので細かいところとか。

Geolocation対応

テストしようがないのでよくわからないけど、Windows Phone 7への準備だと思いたいですね!

Wi-Fiを使ったりしてるみたい。Windows 7のSensors APIGPSがあれば動くんですかねー?

従来のようにタブを下の段に表示できるようになりました

タイマーの分解能が上がって、バッテリ駆動時とAC電源時で異なるように

AC電源で動作しているときには4ms程度になりますが、バッテリ駆動に切り替わるとシステムデフォルトの15ms程度になります(ただし「パフォーマンス優先」設定の場合には変わりません)。

そのためAC電源の時は従来よりも早い割り込みを期待できるようになります。

http://www.misuzilla.org/~mayuki/misc/20110211/timer にアクセスして、電源の設定を省電力にして線をひっこぬいてみましょう。

:visitedのスタイルを変更できなくなります

これはChromeSafariFirefoxでも行われている変更で、スタイルを監視することで履歴を取得されてしまうことから保護するためのアレです。これはIE9IE8などのモードを問わず発動します。

これに該当するものがある場合コンソールに以下の一文が表示されます。

SEC7115: :visited and :link styles can only differ by color. Some styles were not applied to :visited.

SEC7115: :visited:link スタイルは、色のみを変更できます。一部のスタイルは :visited に適用されませんでした。

Tracking Protection

トラッキングをアレソレするアレです。

Active X Filtering

Active Xコントロールを無効にしてブラウズする機能です。FlashとかSilverlightとかQuickTimeとかですね。

ActiveX Filtering

documentの再定義ができなくなります

documentを再定義しようとすると他のブラウザと同様にスクリプトエラーとなります。これはIE9標準モードに影響します。

一部のサイトではIEでのパフォーマンス向上のために以下のようなコードを記述している場合がありますがこれはエラーとなります。

/*@cc_on var doc = document; eval('var document = doc'); @*/
  • const 'document' が再定義されています。
  • "Redeclaration of const 'document'

window.msPerformanceがプレフィックス無しのwindow.performanceになりました

固定サイト

イメージをドラッグして固定する機能が増えました

画像をドラッグしてサイトをピン留めする (Windows)

初回アクセスかどうかを取得するメソッドが増えました

msIsSiteModeFirstRun method (Internet Explorer)

Canvas 2DのglobalCompositeOperationに対応しました

メディア要素に代替コーデックを使えるようになりました(WebM)

Ctrl+Shift+LでクリップボードのテキストをURLとして開いて移動ができるようになりました

「新しいタブ」をティアオフできる(引っぺがせる)ようになりました

トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20110210