SKKPower - スクリプトエンジン強化装置
SKKFEP - Project SKKPower
概要
- SKKPowerとは――
これはSKK日本語入力FEPの拡張スクリプトの実行部分(以下、スクリプトエンジンと記述)の機能を強化するプログラムです。
本プログラムを導入することにより、以下の機能が追加されます。
- SKK日本語入力FEPのスクリプトエンジンにES6相当のブロックスコープ表記(let, const)を追加します。
- さらに、SKK日本語入力FEPの辞書プラグインと接続することで、ソースの記述に様々な文字コード(BOMなしUTF-8やSCSU等)が利用できるようにします。
一見、何やら凄い便利そうに見えますが、美しい薔薇の花には棘があるというものです。
それでは早速、このプログラムによる制限を見てみるとしましょう。
- 文字コード拡張が有効なのはコマンドラインから指定する第一引数のみ。ADODB.StreamなどのI/O回りには一切手が入ってないので、iniファイルの記述は今まで通りの文字コードしか使えない。(4KB程度の小型バイナリで介入できるレベルじゃねぇ)
- 文法および文字コード拡張の代償としてWSHとの互換性を失い、デバッグが困難に……
(∩゚д゚)アーアーきこえなーい
一応、SKKFEPの拡張スクリプトの動作には支障を来たさないレベル……らしい……という程度の確認はした。
スクリプトエンジンを差し替えたまま放置しても特に問題はないはず。
……はずなんだけど……限りなく一発芸に近い何かであることは間違いない。コムギコカ ナニカダ
導入手順
まずはとにかく最新版のSKKFEPをインストールしておきます。
エクスプローラで本プログラムの配布ZIPをダブルクリックして開き、圧縮フォルダを開きます。
圧縮フォルダ内の
SETUP.jsを直接実行するとセットアップ画面が開くので、
1ENTERと入力してインストールを選択すれば設定完了です。
インストール後、本プログラムはSKKFEPのセットアップ上で「謎のスクリプトエンジン」として扱われるようになり、スクリプトエンジン自体のアップデートが発生するまではセットアップから上書きされることはなくなります。
(なるべく最新版のSKKFEPのセットアップを使用してください)
あとは、テキストエディタや
Unicodeテキストファイル圧縮変換ツールucなどを使ってskkgate.jsの文字コードを変えてみたり、varのかわりにletやconstを使ってみるなど、悪の限りを尽くしてみるとよいかと思います。
応用例
SKKFEPのスクリプトエンジンは日本語入力に特化したものではなく、汎用のスクリプトエンジンとして独立したプロセスで動作します。
つまりWSHやNode.jsのような、簡易JavaScript処理系として利用することもできます。
方法は簡単。
C:\Windows\IME\SKK0\skkx.exe にファイル名を引数につけて実行するだけ。
ただし、WSH内蔵のWScriptオブジェクトは存在せず、Node.jsのような豊富なライブラリ類は(コンソール入出力すら)一切ありません。
えっ?それじゃ何もできないじゃないかって?何をおっしゃいますお客様。
SKKGateのように自力でCOMを追加して気合いでActiveXするだけ。
理論上はあらゆるネイティブコードを自由に追加できる素敵な世界が待っているんです。……何か問題でも?
なお、WSHにはない機能として、Node.jsのようにソースコードをBOMなしUTF-8で記述してもちゃんと認識します。
SKKFEPの辞書プラグインが認識できる文字コードで書かれていれば何でもOK!
要するに、
SCSUやBOCU-1で圧縮されたソースを直接実行できる世界初のJavaScript処理系が爆誕してしまったということなのダ!
まぁ……そんな文字コードで書くような奴は誰もいないんだけどさ……
技術情報
SKKFEPのスクリプトエンジンの実行ファイルって中身がほとんど0で埋まってるだけの空っぽのバイナリだし、なんでこれでJavaScriptのサブセットが動いてるの?!って不思議に思う人もいるかもしれないので、ちょいとここらで種明かし。
WindowsではOSの主要な処理をCOM(Compornent Object Model)と呼ばれる形式でモジュール化しています。
COMのモジュール同士を組み合わせたり、OS動作中に部分的にアップデートできるような作りになっています。
そんなこんなで、Windowsでは一般的なスクリプト言語の処理もCOM化されてます。WSH(Windows Scripting Host)の処理モジュールにも、VBScript(BASIC)やJScript(JavaScript)などがあります。
そして、Windowsではブラウザ(Internet Explorer)のJavaScript実行エンジンにJScript処理系(開発コードネームChakra、jscript9.dll)を使っています。
ちなみに、古いIEだとこのファイルがなくて古いWSHと同じモジュール(jscript.dll)を使っている場合もあります。
SKKFEPはWindows XPのIE6以降なら動くように作られているので、このあたりの自動調整が必要だったりします。
というわけでやっと話がつながりました。
要するにSKKFEPのスクリプトエンジンは、このWSHやIEが使っているOS標準のJavaScript言語のCOMモジュール(jscript9.dll)を実行するだけの小型ツールだったのです。
OS標準のコンポーネントを呼び出すだけなので本体は小さくできるというわけです。
その拡張モジュールとなるSKKGateも、同じ技術で作って登録するだけなので完全に独立したモジュール化が実現できるというわけです。ね?簡単でしょう?……いやいやいや難解すぎんでしょ。実際のところ、ここに辿りつくまで何度も死線を彷徨ったんですけど?
あ、あとIEといえばHTMLポップアップ表示ツールの
Webぽみたいなものもあるんだけどそれはまた別のお話。
さて、まだ疑問が残っています。IEとWSHではJavaScriptのバージョンというか規格がそもそもいろいろ違うはずです。例えばIEならES6互換のブロックスコープ表記ができるのに、WSHで同じエンジンを指定してもブロックスコープが使えない。同じエンジンを使っているはずなのに違いが出るのは何故なのか?
これはActiveScriptの初期化の部分に鍵がありました。スクリプトエンジンを初期化する時に言語仕様としてどこまでサポートするのか、を指定できるようになっていて、IEとWSHでは初期化のパターンが違っているということのようです。
解析の結果、
IActiveScriptProperty::SetProperty♺のSCRIPTPROP_INVOKEVERSIONINGで5〜15の値を指定することでIE互換の言語仕様になることがわかりました。WSHにもこのオプションをつけてくださいお願いします何でもしますから「ん?今何でもするって……」
解除方法
さて、いろいろ試して飽きてきたところで四月馬鹿もそろそろ終焉のお時間です。
ソースを弄りすぎてWSHでデバッグできなくなると、流石にどうにもならないので、遊び終わったら元に戻しておきましょう。
特に、SKKGateの拡張スクリプトを書き換えすぎて元に戻せなくなってしまい、起動しなくなっちゃった!なんて時は、SKKGateのセットアップを起動してスクリプトを上書きして元に戻しておくとよいでしょう。
まず、導入時と同じ手順で、セットアップを起動します。
そして
2ENTERと入力してアンインストールを選択してください。
この段階ではまだプログラムは書き変わりませんが、SKKFEPのセットアップ上では「謎のスクリプトエンジン」としての効力を失い、ファイルが上書きできるようになります。
あとは、SKKFEPのセットアップを起動し、通常のアップデート操作を行うことでスクリプトエンジンが標準の処理に戻ります。
そう。君は何も見なかったし、何があったかも覚えていない。いいね?
更新履歴
2019.03.27
見せてやんよ、jscript9.dllの本当の実力を……!
2019.03.28
セットアップ処理を改良
co (Twitter♺)