SKKGate - SKK辞書処理の拡張手法
SKKFEP - Project SKKGate
- 力が欲しいか?
- ――力が欲しいのなら……くれてやる!
ダウンロード
概要
- SKKゲート構想とは――
SKKGateはSKKの辞書処理に対する新たな拡張手法である。
今回はSKK日本語入力FEP(以下SKKFEP)の辞書プロセスとして試作した。
SKKFEPのメインプログラム側には一切手を加えることなく完全に独立して動作し、変換動作に連動して
任意のスクリプト言語の動的実行機能を拡張(付属の例ではJavaScriptを使用)し、数値変換、日付変換、文脈学習をはじめとする実用的な追加機能を、小規模なスクリプト記述だけで高速に実行可能であることを、ここに実証するものである。
その実体はFEP(フロントエンド)と辞書プロセッサ(バックエンド)との中間に多層展開された通信ミドルウェア群である。単純な信号処理機構(ゲート)を組み合わせることで集積回路を構成し、複雑な自然言語処理を可能にするものである。(誇張表現JARO)
後に作者はこのような言葉を残している。
- 「二つで十分じゃね?」
SKKGateではSKK処理系としてはこれまでにないまったく新しい独自の辞書処理アーキテクチャを提唱する。従来SKKサーバが担っていた変換機能はゲートと呼ばれる単位でモジュール化される。個々のゲート間の通信データは多重にカプセル化され、操作しているユーザ(フロントエンド利用者)に対して変換時の詳細情報を隠蔽する。詳細情報は辞書の学習・削除時に再度SKKGateによって復元(デカプセル)され、ユーザ操作によって選択された変換結果ではなく、SKKGateが事前に用意しておいた別の内容を使うことができる。これにより自由度の高い辞書の処理を実現している。
とにかく何でもかんでも学習しまくってしまうSKKの特性によって、操作ミスによって確定されてしまった変な送りがなとか、外部の辞書サーバから取得したゴミ情報などの「学習して欲しくない」候補まで記録されてしまうという、SKKの使い手ならば誰もが薄々感づいてはいるものの気がつかないふりをして我慢していたんだろ
不完全燃焼なんだろそうなんだろ……てな感じの従来のSKKの設計上の欠陥を、まるっと一気に解決してしまおうという試みである。
要するに……
意図しないゴミが辞書に貯まる無様な動作を華麗に(超重要ッ!)回避できる
……ってことさ!
フロントエンド側の操作で任意の学習禁止候補を強制的に学習させることも可能。外部サーバからの変換結果をローカル側に学習させたい場合、註釈の再編集操作を行なってから確定するとその単語はフロントエンド側で見えているままの状態で学習される。
『……でも、インタプリタ実行なんて……お遅いんでしょう?』
大丈夫!SKKFEPだよ!にっくきGoogleのエンジンを搭載したNode.jsの
上っ面だけ真似してやったシンプルなシングルスレッド動作でパフォーマンスは安心!処理軽量化のために超短期キャッシュを装備したおかげで、実は検索回数はSKKFEP本来の動作時より遥かに減っていたりして、実はアーキテクチャ的にはちょっとだけ高速化(してる可能性が
量子レベルで存在)するのです!
『……でも、SKKといえば……おLispでしょう?』
大丈夫!SKKFEPです!
諦めろ!そもそもJavaScriptの原始実装がLispだったくらいですから、
気分だけならもう99.99%Lispで動いているようなもんですって。パターンマッチングベースの言語設計なんだし、違いなんてちょっとだけ!先っちょだけ!今や進化と魔改造の成れの果てで内部は別物になってしまった気がしないでもないけど、愛さえあれば関係ないよねっ!
とにかく今回は偶然、たまたま、そこに置いてあったので仕方なくJavaScriptを実装に使っただけなのです。べっ……べつにアンタのためにJavaScriptにしたわけじゃないんだからねっ!
もちろん組み込み用途などでは超軽量自作言語とか使って拡張する手口が使えるはず。
爆ぜろLisp!取り戻せFORTH!うおおおおおぉぉぉ――――っ!!!!
……と思ったらいつの間にかLispエミュレータを搭載していた。つまり……どういうことだってばよ?
機能の解説
こうして人類にもたらされた謎の技術SKKGateによって果たして一体何ができるようになるというのだろうか?
我々SKK取材班は神秘のヴェールに隠されたSKKGateの素顔について、匿名の情報提供者とのコンタクトについに成功したのであった。
送りがな誤入力時の学習抑制
キー入力ミスによる「言っった」のような間抜けな送りがなの入力(SKKを使っていると、まれによくわりと頻繁にしばしば発生する)により辞書が汚染されることを防止する。
ずっとこれがやりたかった!
日付変換
文字列「.today()」や「(skk-today)」を変換候補として学習させると二回目以降は日付に変換される。
学習順序の更新や候補の削除も自然に動作するので何度でもつけ外しが可能。
ちなみに末尾の括弧を忘れると動作しないどころか何やらとんでもない結果になるので注意。
というか内部でJavaSc……Lispっぽいナニカが発生していることがよく分かるので、一度わざと間違えてみるといいかもしれない。というわけでちょっとわかりやすく演出するためあえてこんな実装にしてみたり。
実際は下記の変換時スクリプト動的実行機能の一種として動いている。
数値変換
SKKの数値変換の簡易版が利用可能。
絶対にSKKなんかに負けはしない(キッ)―― → SKKには勝てなかったよ……
しかし、こうして機能を実装したとしても私の信念は揺らがない。数値変換などというものはあくまでも連文節変換機能の一種であり、これがSKKに必要な機能だなんて……ぜ、絶対に認めないんだからねっ!
あーでも慣れてきたら結構便利になりそうだなこれ。ワロス
てなわけで、これ以上の機能が必要な場合は各自で改良すべし!
文脈学習
予測変換機能を搭載。一度入力すれば「貴社の記者が汽車で帰社」くらいは一発で出せるようになる。たぶん、skk-studyとだいたい同じ……はず……。skk-studyのような学習上限を持たず、スクリプトエンジンの富豪パワーで力まかせに学習データをすべて利用する。あと時空間の判定とデフォルトパターンの学習みたいな小細工も入れてあるので、人によってはこっちの動作のほうが使いやすいんじゃなかろうか。……てな感じで「こんなこともできますよ」というコンセプト版。いろんな意味で諸刃の剣のお節介機能なので、無効化したい場合は後述のスクリプト実行機能を使って.contextプロパティを変更すべし。
あ、学習結果のセーブ機能は持ってないので各自で実装してね。
文字コード変換
/U+2A6A5変換や/u3004変換のように入力すると文字コード変換が可能。特殊な文字はアプリ側がきちんとUnicodeに対応してないとどうにもならないので注意な。
次世代SKKサーバ対応
辞書の学習状況に応じてCOMと連携したインタプリタが動かせる……つまりIPパケット吐き放題。いいのよ?
オンライン辞書検索
GoogleとかSocial IMEに接続して辞書を補助する。インストール直後の状態では、単語登録に入った直後にTABを押した時だけ手動検索となっている。もっと過激に自動検索させることも可能だが推奨はしない。設定方法についてはインストール方法のマニュアルを参照。
スクリプト直接実行
ピリオド・スラッシュ・クエスチョンマークで開始する英数の読みを変換すると、JavaScript命令とみなして直接実行する。また、括弧で括られた文字列の場合はLisp命令とみなしてJavaScriptに変換してから直接実行する。
相当強烈な機能なので取扱注意。
例えば、
- /?debug変換 とか /debugCTRL+A?変換
と操作すると、現在のデバッグ出力状況である「0」が変換結果として返る。
これは、入力した内容の先頭の
./?を取り除いてdebugとなり、その値(評価結果)が変換結果となっている。
要するにスクリプトエンジンのグローバル変数の値を見ることができる。もちろん変数名だけでなく、計算式そのものを与えることも可能。
なおこの時、
SPACE(変換)ではなく
ENTER(確定)を押すとフロントエンド側の確定操作となり、辞書プロセスまで制御が渡ってこないので注意すること。「必ず変換操作をしないといけない」と覚えておくこと。
また、スクリプトの実行結果は学習されないので変換結果を確定してもユーザ辞書は一切汚れない。安心して変換すべし。(基本的に、SKKGateでは「これ学習する必要なくね?常識的に考えて」というものは全て学習禁止で動作している)
さて、変換結果を確認したら
CTRL+
Gを押し、
- ?debug=1変換
と末尾に代入の数値を追加して変換を行なうと、代入の結果である「1」が変換結果として返る。
先頭の
./?の文字がなくても命令っぽければとことん認識する。辞書の英単語と変数名が混同しそうな時、先頭にこれらの文字をつけるとよい。
この特性により、普通に電卓的な使いかたが可能。ネタで作った機能だけど意外と便利!
- /pi=3.14変換
- /2*pi変換
のように操作する。
――あとはわかるな?
変換時スクリプト動的実行
.で開始する英数の文字列の変換候補を登録しておくと、変換時にJavaScript命令とみなして直接実行する。また、括弧で括られた文字列の場合はLisp命令とみなしてJavaScriptに変換してから直接実行する。
- 注意: 前述のスクリプト直接実行と異なり、JavaScript命令を実行する場合は必ずピリオドが先頭に必要です。
簡単に試せるように日付は.today()や(skk-today)で表示されるようになっている。以下のように単語登録すると、動作を確認できる。
- なう /.now()/ナウ/
あとは「なう」と変換するだけで今の時刻が出るようになる。学習順序は命令実行前の文字列で判定されるので、命令実行のありなしを意識せずに利用できる。
// 他にも「う゛」の読み換えによる変換範囲向上なども可能なはず
本当に何でもありで、他のCOM経由で外部と通信したりキー操作を生成したりIEを洗脳してコンソール化するとかできちゃうけど愛さえあれば関係ないよね。
使用上の注意をよく読み用量・用法を守って正しくお使いください。
インストール/アップデート方法
まずSKKFEPの最新版をインストールしておく。
現在の版では面倒なCOMのモジュールのインストールはすべてSKKFEP側が行うので何も気にする必要はない。
SKKGateのインストーラはスクリプトファイルをユーザ辞書フォルダにコピーし、自動実行の設定をやるだけの簡単なものとなっています。わかる人ならこの説明だけでもう十分だよね。
インストール
初回インストールまたはアップデートの場合は、まず通常権限で
setup.jsを実行する。
- エクスプローラでsetup.jsをダブルクリック (通常権限で動かすこと)
実行したら1と入力してエンターを押し、インストールを選択する。
アップデートの時はスクリプトを上書きするか確認メッセージが出るので、
ENTERを空押ししてスクリプトをアップデートすることを推奨。
あとは自動的にファイルをインストールし、スクリプトを起動してくれる。再起動などは一切不要だ。
スクリプトの起動 (開発者向け)
インストール時にスクリプトは自動起動されるので、特に操作は不要。
スクリプトの開発時は、手動でスクリプトの起動を行う場面があるかも。
インストーラが開いた設定フォルダの中にある
skkgate.jsをダブルクリックして起動。
なお、起動時にメッセージは一切出ないので注意。(もう一回実行すると停止確認のメッセージが出るので、正しく起動したかどうかを確認することが可能だ。)
スクリプトの開発時は、wscriptを使うよりもcscriptを使ったほうが便利。
cscript経由で実行する場合、コマンドプロンプトを開いて以下を実行すればOK。
- cscript /nologo skkgate.js
なお、SKKGateはフロントエンド側とは完全に独立して動作するため、SKKFEPのアップデートや設定変更を行なおうが何をしようが関係なし。好きなタイミングで起動・終了することが可能。
スクリプトの一時停止 (開発者向け)
skkgate.jsをもう一回ダブルクリックすると停止するかどうかの確認ダイアログが表示されるので「はい」を選ぶとスクリプトは停止する。当然、停止中は拡張機能が一切使えなくなるので、利用したくなったらスクリプトを再度起動すること。
cscriptで起動した場合は
CTRL+
Cですぐ停止できる。開発中はこちらが便利。
アンインストール
通常動作に戻す場合は通常権限で
setup.jsを実行してアンインストールを選択するだけでよい。
- エクスプローラでsetup.jsをダブルクリック (通常権限で動かすこと)
実行したら2と入力してエンターを押し、アンインストールを選択する。
このサンプルについて
- レベル0ゲートとして動作
- レベル1ゲートに接続して検索と学習処理を行う
- 検索失敗時のみレベル2ゲートに接続して検索処理を行う
SKKGateオブジェクトの命令一覧
SKKGateはCOMとして実装されています。インストール後は、WSH等のCOM拡張機能を持つスクリプト言語からオブジェクト名SKKGateで以下の命令の利用が可能となります。
命令 | 内容 | 返り値 |
Search(読み[, 属性[, ゲート番号]]) | 指定ゲート番号(0→1)で辞書変換 | 文字列: 変換結果 |
Abbrev(読み[, 属性[, ゲート番号]]) | 指定ゲート番号(0→1)で辞書補完 | 文字列: 補完結果 |
Update(読み, 候補[, 属性[, ゲート番号]]) | 指定ゲート番号(0→1)で辞書更新 | 文字列: 常に空 |
Delete(読み, 候補[, 属性[, ゲート番号]]) | 指定ゲート番号(0→1)で辞書削除 | 文字列: 常に空 |
Sync([ゲート番号[, ゲート番号]]) | 指定ゲート番号(0)から通信を待機しバッファを取得 | 整数: バッファ種別 |
Exec([ゲート番号]) | 指定ゲート(1)にバッファの内容を直接渡す | なし |
Get([種類 ]) | バッファの内容(0)を取得 0:読み 1:候補 2:属性 -1:隠し情報 | 文字列または整数 |
Put(候補[, 隠し情報]) | バッファに候補を追加 | なし |
Echo(文字) | デバッガに文字出力 | なし |
※括弧内の数値は値の表記を省略した場合のデフォルト値
Search, Abbrev, Update, Deleteでゲート番号の指定を省略した場合はフロントエンド側と同様の動作となり、複数のゲートから自動的に接続先を選択します。拡張スクリプトが動いていれば拡張スクリプト側(ゲート0)へ、動いていなければ辞書プロセス側(ゲート1)へ自動的に接続します。
SKKGate自体にはネットワークアクセスに関する命令は一切含まれていません。拡張モジュールをネットワーク関連処理から隔離することで、無意味でめんどくさいトラブルの発生を全力で回避しています。やれやれだぜ。
ネットワーク機能を利用する場合は
SKKNetを用いて任意のゲートを設置してください。レッツ人間電池ライフ!
辞書属性について
動作 | 内容 |
辞書属性を指定して変換する | 0:通常 1:メイン 2:ユーザ 3:厳密 4:予測 7:仮名 8:登録 9:手動 |
辞書属性を指定して補完する | 0:通常 1:メイン 2:ユーザ 4:全文 8:語尾 16:送り |
辞書属性を指定して確定する | 0:通常 1:後退 2:登録 3:偽装 (4:地図 5:画像 6:Web) |
辞書属性を指定して削除する | 0:通常 (1:除外) |
その他の仕様
配列は使用不可能。すべて文字列を利用する。セパレータ用の文字は以下で固定。
セパレータ | 内容 |
\1 | 送りがなの区切り(送りがなは省略可能) |
\2 | 註釈の区切り(注釈は省略可能) |
\3 | 候補の区切り |
このCOMモジュールはWSHや.NET Framework(JavaScript/VBScript/C#等)以外でも普通に使えるんで、吉里吉里とかHSPとか使った制御に挑戦してみるのも趣があって面白いかも!
最小構成
with (WScript.CreateObject("SKKGate")) while (Sync() >= 0) Exec()
変換時に利用するオブジェクト。
現在は二種類の命令が利用可能。
命令 | 内容 |
today() | 現在の日付を返す |
文字列 | 文字列をJavaScript命令とみなして実行する |
このクラスに自由にメソッドを追加して拡張してみよう!
てかeval強烈すぎワロタ『なんでもあり』ってレベルじゃねーぞ
おまけ情報
デバッグ情報を見てみよう
SKKGateはサービスプロセスと同様、独自のウィンドウもコンソールも持たないため、デバッグがけっこう面倒です。長期間動かしつづけて一瞬だけデバッグしたい、なんて無茶な要求にも答える必要があります。
そこで伝家の宝刀、printfデバッグの登場です。といってもコンソールでおなじみのprintfではなく、OutputDebugString APIによるデバッガインタフェースを利用します。
とりあえず説明するより使ってみたほうが分かりやすいので使いかたを書いておきます。
SysinternalsのDbgViewをダウンロードしてインストール。以上。
あとは、Echo(文字列)で文字がデバッガ側に表示されます。あら便利!
他にもwscriptを大量に動かしてて……どれがSKKGateかわからなくなってしまった!
タスクマネージャなどでcscript/wscriptのメモリ消費量をチェック。一番小さいやつがルパンだ!
確実に判別するなら、例によってまたSysinternalsのProcExpをダウンロードしてインストール。以上。
新連載「できる!SKKGate」
第一回 動け!サンプル!
最小構成で動作するSKKGate Proxyの記述サンプルです。
第二回 これがSKKGateの選択か――
最小構成で動作するSKKGate Proxyで検索・確定・削除の処理を個別に書き直したものです。
何か作る場合は、これをベースにすると楽です。
他の言語で同じ動作をさせる場合は以下を参考にしてください。
- Python
- Ruby
- VBScript
- C# 起動バッチ
打ち切り最終回 戦いはこれからだ!
世界最小・再軽量のJavaScript記述による学習つきSKK辞書プロセスのサンプルです。
スタンドアロンで(標準の辞書プロセスであるゲート1の支援すら不要で)動作し、検索・学習・削除を実行します。
これに辞書のセーブ・ロード機能をつければ、学習機能に対応した本格的なSKKサーバを高級言語だけで記述することができます。
SKKGateのスクリプト類はすべてライセンスフリーの改造推奨とします。電波の命ずるまま、己の信じた方向へ好きなように改造してしまいましょう。
付録
SKKGateにおけるEmacs Lisp命令のエミュレーション
まともなエミュレーションだと思った?残念、SKKGateちゃんでした。
L辞書に含まれているEmacs Lispだけが最低限動けばもう何も怖くない、というコンセプト。
以下のような文字列変換を行なって一気にJavaScript側で実行する、非常に単純な仕組みとなっている。
どのくらい単純かというと、なんと
実質一行だけというハッタリ実装。
つまり、こういうことだ。
変換前のEmacs Lisp命令 | | JavaScriptに変換したもの |
(skk-function-name "a" 1 nil) | → | skk_function_name("a",1,nil) |
- ……お分かりいただけただろうか?
現在の版の動作仕様は以下の通り。
- 文字列の先頭と末尾が括弧で囲まれていて英字が存在する場合のみ発動
- 関数名の後に括弧を移動
- 関数名のハイフンはアンダーバーに変換
- 引数の空白区切りはカンマ区切りに変換
- こんなこともあろうかと変数nilとtは予約済み
- 変数$Iに見出しの内容、配列$Nに数値変換の値が入っていて参照可能
- 一部の関数は変換を通さずに個別実行する(日付・時刻の簡易処理など)
- 未知の関数に遭遇した場合は当然の如く例外が発生する
- 例外発生時、変換は行なわれない(元の文字列パターンがそのまま使用される。JavaScript側と同じ)
たまに『(f'A`)』とか『(pwd)』のような顔文字(恐らく後者は、Unixの使い手が
カレントディレクトリを取得できずにムンクの叫びのような顔をしているところをドラマチックに表現しているものと思われる)まで変換しようとしてしまうが、この場合実行は失敗してきちんと元の顔文字が出力されるので安心だ。
間違ってもこんな風に
function pwd() { return "." }
などと関数を追加しようと企てるなんて、ダメ!ゼッタイ!
skkgate.ini側でfunction lisp()をオーバーライドしてもっとまともなエミュレータを実装することも可能なので、気合いがある人は挑戦すべし!
更新履歴
2012.11.25
いきなりクライマックス!
α0版初公開
2012.11.26
一行コメントアウトするだけでJScript Compiler(jsc)でコンパイルできるように改良。コンパイラは.NET Frameworkを導入していれば、以下のような場所にインストールされており誰でもjsファイルから実行形式ファイルを簡単に作ることができる。
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\jsc.exe
jsc対応のため、SKKInterfaceオブジェクトを廃止。eval系の仕様を大幅に変更。従来はskkインタフェース経由でのアクセスだったが、今回からは先頭のピリオドを削除した文字列がそのまま命令として評価される。日付変換の機能を使うぶんには違いはまったくない。eval, today以外の全てのグローバルオブジェクトをいきなり評価できるようになっている。
要するに、今まで.eval("Date()")とか記述しないと動かなかったところを、.Date()だけでアクセス可能となったということ。ここまでしないとjscでは動かすことができなかった。将来、実行効率を上げる必要が出た時に備えた苦渋の判断。SKKInterfaceは犠牲になったのだ……。
数値変換で#3の値が1桁の時の出力が空になるバグを修正。
ついでに京の桁まで出力できるように改良。SKK10と比較すると11000000000000000(一京一千兆)などの結果が微妙に違うが、そんなパターンを使うケースは非常に少ないであろうこと、こちらの手法(桁が多いときに最上位段以外をすべて「一千」と格式ばった言い回しにする)ほうが自然だという信念から、あえて完全互換路線から外れた実装とした。「一万千」まではSKK10に合わせてあるが、これを「一万一千」にしたい場合は、
- f2 |= f4 > 1 を
- f2 = 1 に変更すると良いかも。逆に常に「一千」を出したくない(少しだけSKK10風になる)場合は0にすればよい。
インストーラにスクリプトの自動実行設定機能を追加。これに関連してインストーラの挙動が変化しているので以下の二点に留意すること。
- 1. インストール時、ユーザ設定フォルダ(旧ユーザ辞書フォルダ)にファイルをコピーして自動起動の設定が行なわれる。ここ以外のフォルダにスクリプトを置きたい場合、たとえばホームディレクトリから即アクセスしたい、といった場合は、mklinkコンマンドでNTFSシンボリックリンクを張るなどして対処すること。
- 2. まだしばらくの期間、大幅な仕様変更などにより古いスクリプトが突然動かなくなるなどの事態が想定されるため、基本的にアップデートの時はユーザ設定フォルダのデフォルトスクリプト(skkgate.js)は基本的に上書きでの運用を推奨。なお、上書きの時は確認メッセージを出すようにしてある。
- ユーザ設定フォルダはSKKFEPのsetup.jsを起動して「ユーザ辞書」(ユーザ設定)ボタンを押すと開くことができる。
2012.11.27
外部サーバ接続に備えてアンチGキャッシュを搭載。外部サーバの情報収集能力低下を狙う。
デフォルト以外のゲートへの接続先指定を追加。
インストーラの操作性を改善。スクリプトフォルダを自動的に開くようにし、初回インストール時以外はSKKFEPのセットアップを不要とした。
2012.11.28
接続先設定がバグってたので修正。
2012.12.03
ゲートの終了指定処理がバグってたので修正。
ソース変更一切なしでjscでコンパイルできるように改良(20121126版では1行コメントアウトが必要だった)。
二重起動時に終了するかどうかをダイアログで選択できるように改良。今回、二重起動チェックの方法が変化していて古いモジュールの起動を検出できないことがあるので注意。従来版からのアップデート時は再起動するか、一度スクリプトを起動してから終了操作(二重起動)を2回以上行うこと。(多少かぶってもあんまり問題ないからそのままでもオッケーなはずなんだけど……念のため)
命令実行のたびにバッファ内容を作業領域に2回コピーしていて無駄が多かったので一切コピー動作なしで動作するよう改良。
通信不調(を装った攻撃)時に操作性の低下を防ぐ対抗処理を追加。
スクリプト内でオブジェクトが破壊されたりしてどうにもならなくなった時、自動的にプログラムを再起動する自己修復機能を搭載。
2012.12.04
20121203版で超短期キャッシュの残存時間が試験バージョンの3分のままになっていて使いづらかったので元の5秒に戻した。
辞書プロセスと同じゲートが二重起動判定されず、終了させることもできなくなるエンバグ(2012.12.03版で発生)を修正。
自己修復処理の内部でタイマーによるウェイトを使っていた部分を時間軸に依存せず動作するよう改良し高速化。
2012.12.22
ファッ!?日本語入力ソフトがなぜか電卓に?!
棋譜入力(#9)とカンマ位取り入力(#8)のサンプルを追加。
デバッグ中などに自己修復が働くと使いづらいため、/.debug=1などとしてデバッグ変数(debug)を0以外に設定した場合、エラー発生時にそのままエラーを表示するように改良。
先頭が数値の命令も受け付けるように改良したと思ったらいつの間にか電卓になってた。超スピードとかそんな感じだった。/.pi=3.14
変換 /.2*pi
変換と操作する。変換結果をそのまま入力できちゃうのが地味に便利かも。(20121222a)
応用次第では数値変換に計算処理を仕込んで単位計算させるなんてこともいけそうな予感……ッ!
もうなんか先頭のピリオドとか不要なんじゃないかなって気がしてきたので不要にしてみた。
- /pi=3.14変換 /2*pi変換 /today()変換
…のような形でも受け付けるようにした。従来通り先頭にピリオドを付けた入力スタイルも残してある。あと、変換時の命令記述はどうすべきか迷ったけど、こちらはピリオドを無くしてしまうと文字列を見ただけでは命令なのかどうか判断がつかない(可能性が将来出るかもしれない)ということで、こちらはピリオド必須のままとしている。
果たしてこの方向性で本当にいいのだろうか……面白いからいいや!(20121222b)
だめだった。数値変換と異様に相性が悪いしAbbrevモードの辞書登録まで1ステップ手間が増えてしまった。そこで以下の仕様を追加し共存を図る。(20121222c)
- 1. 数値単体の場合は数値変換を優先する
- 2. eval失敗時は変換失敗扱いとする
2012.12.23
数値変換に失敗した場合だけ処理したほうが簡単じゃね?以下の順に処理すべき。
- 通常変換→数値変換の結果を合成→(失敗時)→命令パターンならスクリプト評価→(失敗時)→単語登録
この流れが一番自然な気がするので順序を改良してみた。数値の判定が一箇所不要となり処理の単純化に成功。
2012.12.24
文字コード変換機能を追加。/U+3004のように変換可能。おらっしゃー!
2012.12.27
管理者権限を持たないアカウントに正常にインストールできるよう改良。
2013.01.10
辞書属性を追加。辞書属性APIに対応した最新版のフロントエンド/バックエンドで使うこと。
属性情報のパラメータ指定が増えたため、古いスクリプトは微妙に修正する必要があるので注意。
確定時と変換時の辞書属性に対応。これにより、通常の変換と予測変換との区別や、確定が偽装されたかどうか等の情報をゲート側で検出し適切な処置を施すことが可能となる。
確定属性4〜6を隠し動作で追加・・・?!
2013.01.12
VBScriptからの呼び出しに対応。
64ビット版のサイズを512バイト削減。
2013.01.18
拡張モジュールをSKKFEP側へ移動。
SKKGateは単にスクリプトファイルの設定に特化して簡略化。
圧縮フォルダから直接実行できるように改良。
2013.01.24
SKKFEP側の変換属性8〜9の実装に伴い、外部接続のデフォルト設定を変更。
デフォルト設定(extend=3)では、単語登録時と検索失敗時にゲート2へ接続する。1だと単語登録時のみ、2だと検索失敗時のみとなる。
ゲート2にはSKKggr(またはSKKNet)の接続を想定している。SKKggrと組み合わせることで、L辞書にない単語を入力しようとして辞書登録モードになった際、初期データとしてオンラインの辞書の情報を入力してくれる。利用者は
黙ってENTERを押すだけで単語登録が一瞬で完了する(もちろん注釈を適当に打ちこんでもよい)。つまり……
ただでさえお手軽なSKKの単語登録がさらに簡単に!
SKKggrの導入と具体的な利用方法については
インストール解説ページを参照。(いまから書く)
ゲートの導入時、書庫内に未使用のファイルが多すぎて初心者が混乱するのを防ぐため、今までSKKGate側に同梱していたSKKNetのソースコード一式を別の書庫に分離。
文脈予測はなんか使いづらくて我慢ならないのでデフォ無効化(context=0)とした。SKKにはこんな子供騙しはいらん。
内蔵の簡易キャッシュの名称を「アンチGキャッシュ」から「外部接続キャッシュ」に変更。見た目をまともそうに見せかけるためのカモフラーシュ。ゲート2にSKKggr以外の処理を接続するなどの用途で、キャッシュを無効化したい場合は保持時間を0にすればOK。
2013.01.25
さらばSKKggr、安らかに眠れ――
SKKggrは.NET Frameworkのコンパイルが必要なのでXPなどのマシンでは追加モジュールのインストールという超めんどい作業を要求する。もっともっと簡単に使ってもらえるように、開発環境のインストールを意識せずに使えるバッチファイルとか工夫して用意してみたけど、そもそもコンパイルが一段入るだけでもう利用者が遠のく気がする。ダメだダメだ。こんなんじゃダメだ。あー、うん?SKKNet?実験用プロトは別腹(キリッ
で、そのかわり
全機能を拡張スクリプト側に取り込んだ。これでどうよ!
ちなみに開発初期の構想ではコレを数値変換用にまるごと使う予定だった。面倒なことはぜんぶ「奴」任せって感じでお気楽実装にしたかったのだが……ごらんの有様だよ!
すべてのオンライン関連の処理はデフォ無効とした。初期設定ではインターネット側ではなく従来通りゲート2への拡張動作とした。これでSKKggrを持ってくればそのまま動くので互換性は保たれる。(20130125a)
初期設定ファイルskkgate.iniを追加。ここにextend=7と書き込んでおくことで、スクリプトが更新されてもオンライン設定を有効化することができる。おすすめ設定ファイルも入れてあるので、とにかくこのファイルをコピーするだけで有効化できる。「ファイルを」「エディタで開いて」「コメントを読んで」「書き換え場所を認識して」「どう書き換えたらいいか考えて」「編集して」「保存して」なんて面倒な作業は一切不要。(20130125a)
2013.01.27
アルファベットのみの候補を単語登録する時、外部辞書に問わせずに命令実行されてしまうバグを修正。
特定のキー操作(辞書属性つき変換)を行なった時だけオンライン辞書に接続するいぶし銀玄人向け設定(extnd=4)を追加。これを使う場合はフロントエンド側で辞書属性検索コマンド(!辞書)の行のコメントを外して適用すること。
2013.01.28
スクリプト実行変換の結果が空の文字列だった時に「変換候補なし」扱いになってしまうバグを修正。
「再実行しますか?」のダイアログで「はい」を選んだ時、一部の環境において二重起動が発生し、その後正常に変換処理が行なえなくなるバグを修正。「再実行しますか?」のダイアログが二回以上表示されるような状況がもし発生した場合は、想定外のゲート間衝突が内部で発生している可能性が高いので、「いいえ」を選んで古いゲートを確実に終了させてからやりなおすべし。よくわからない場合は、とにかくログオフまたは再起動すればよし!もしこの現象が2013.01.28版のスクリプトでも発生するようなら連絡ヨロ
jscでコンパイルしたJScript.NET(高速モード)版でもオンライン辞書に接続できるよう改良。とりあえず動くだけの実験レベル。
将来のAPI変更に備えて接続先ゲートの指定を明示。
2013.01.29
命令実行の判定基準を変更。先頭が半角文字なら何でも受け付けるようにした。これで「(today())」とか「"abc".slice(1)」のようなアルファベットや数字で開始しないパターンも命令と解釈できる。(電卓機能追加時と同様に命令変換側の仕様は変更なし。「なう /.today()/」のように、こちらは必ずピリオドをつけること。)
文字コード変換を禁止できないバグを修正。
単語登録時に正しくない補助結果を返す可能性があるバグを修正。
外部接続時、ゲート2から結果が返ってこなかった場合のみキャッシュしないように改良。
いぶし銀設定の感応範囲を4〜7ではなく1〜7に変更し、「お勧めiniファイル」をコピーしていない素の状態であってもフロントエンド側の設定変更だけで動作を制御できるように改良。
extend=7の全自動の接続設定は、初回導入時に操作の雰囲気を知るような場面では非常に良いが、慣れすぎてしまうことによって「意図せずネットに接続しても何とも思わなくなってしまう」という危険(?)がある。これは今の時代を生き抜くにはまったく悪いことではないのだが……。
……などという一般的ではない理由により、extend=1〜4の状態が秘匿性と利便性のバランスが取れる中間地点であるとの信念を貫く。この状態は、利用者が「接続を完全に自分が制御している」と感じられるというのが最大にして最強のメリットなのではなかろうか。
2013.01.30
拡張モジュールのAPI変更を受けてメソッド名をDebugからEchoに変更。べっ……別に泣いてないし!
アンチGキャッシュの残存時間を正確に管理するよう改良。
プロトタイプ版と同様、ゲート2への接続要求はキャッシュしないよう変更し、(何も繋いでいない)標準状態であれば、無駄なメモリ消費が一切発生しないように改良。
通常の検索と登録時の補助検索が別扱いで、検索→単語登録の順に操作すると2回サーバにアクセスしてしまう問題を修正。両者を同一レベルで管理し、一回でもアクセスしたらキャッシュを保持している限り二度とサーバ側から辞書の利用状況を観測できないよう改良。
オンライン辞書サービスからデータを取得した瞬間のデータは、注釈に「外部辞書から取得」と表示するようにしてみた。キャッシュ中のデータを使った場合は従来同様に「外部辞書」とだけ表示されるので、動作状況を判別可能。
2013.02.01
動的補完の時に外部接続キャッシュのタイムアウトチェックをしないようにして高速化。
外部接続キャッシュ回りでエラーが発生して(生命維持装置に頼って)しまうバグを修正。
2013.02.04
学習キャンセラーを実装。詳細はSKKFEP側の更新記録を参照。
日付オブジェクトの表示を分離。
2013.02.05
スクリプトの自動起動レジストリに起動プログラムを明示。常にWScriptを使って起動するように修正。
2013.02.11
圧縮フォルダからのインストール時に一時作業用ファイルを1つ消し忘れていたバグを修正。
2013.02.14
オンライン検索機能を増強。Googleの他にSocial IMEも選択可能とした。
実質的には20130204版からの更新となる。
設定用変数名を変更。拡張モジュール(ゲート2)用の設定を無理矢理オンライン辞書用に流用していて美しくなかったので分離した。
設定用変数名を追加。skkgate.iniを更新。コメント読んでわかる人専用
- extend(拡張モジュール関連)→そのまま
- extend(オンライン検索関連)→online
- extra
ねるぽ
2013.02.15
スクリプト実行判定の先頭のダミー文字として「.」以外に「/」「?」も指定可能とした。
今後は「
//数式」や「
/?数式」みたいな操作も受け付けるようになる。ちょっとした変数の内容確認などを気楽に操作できるようになるはずだ。
Dvorakキーボードで試してみたら
/.と入力しづらかったので何とかしたかった。
他にも、標準設定だとピリオドは予測変換の単語と一致している状態では入力できないので、行頭にダミー文字を追加してスクリプトとして動かしたい時、ちょっと不便だった。
例えば変数名「online」の値を表示したいような場合、先頭数文字を入れてから、代入ではなく表示だったことに気付いたけど、後から先頭にピリオドを入れられないのでキャンセルして先頭から入力しなおしという誰得操作になっていた。
- /onlCTRL+G/.onlineSPACE (14ステップ)
今回の改良により、後から先頭にクエスチョンマークなどを書き込めば式評価となるので
- /onlTABCTRL+A?SPACE (8ステップ)
となり格段に操作が楽になる……かもしれない。
2013.02.16
readmeをSKKFEP側と統一した。プログラムは一切変更なし。
2013.05.25
SKKFEP側の改良に合わせてインストーラを単純化。
2013.07.09
学習記録機能を追加。変数loggerを1にすることで、単語登録時・注釈変更時に時刻と内容を記録する。デフォルトでは機能オフ(値0)になっているので、有効化するためにはskkgate.iniを編集する必要あり。
2013.07.16
skkgate.jsの初期設定で、学習取消と外部表示機能はデフォルト設定では実行されないにもかかわらず、処理が有効化されていてメモリが若干無駄になっていたためデフォルトでは無効に設定を変更。
skkgate.iniの初期設定上書きでonline=7になっていたが、将来このファイルをデフォルトインストールで使うことを想定してskkgate.js側のデフォルト値であるonline=1に変更。併わせてドキュメントも……そのうち書き換えるッ!
2014.02.22
SKKプラスと連動し、送りがなで促音を余分に入力してしまうタイプの入力ミスを自動補正するよう改良。当然の如くこれをデフォ動作とした。
なお、okuri=2と設定すると、この機能を無効化して以前と同じ送りがな学習チェックだけの動作になる。
予約語を変更。number→num numeric→numberに置き換え。数値変換の関数numberを上書きしていた場合、名称をnumに変更する必要あり。
誰も使わない上に速度低下の要因となっていたデバッグ用のEcho文を削除。
使いどころが微妙だった
SKKNet関連ソース一式をアーカイブから分離。
どうせ誰も別の言語で自前スクリプトを作ったりしないだろうし、新機能も大したことなくて停滞してるっぽいから、もういっそこのまま圧縮かけて、サクっと本体に取り込んじまうか……。
というわけでスクリプトのインストール・アンインストールでスクリプトの再起動・停止機能を追加し、インストール時の手動操作の類をすべて排除した。
どうせ他の言語で動かしてる人なんていないだろうし、そういう人は対処法もわかってるだろうから、もうこれでいいや。統合したらスクリプトファイルはDLL同様バイナリ比較後上書き更新にする予定なので、機能拡張したい場合はskkgate.ini側で関数を上書きするなどして対処ってことでよろしく。
2014.02.27
ついにLispエミュレータのような何かを搭載!
命令実行変換のときに括弧で括った文字列を検出すると、このエミュレータが動作する。
バージョン番号がSKK10形式のままだったり、L辞書に含まれてない(skk-today)もサポートしてるのは生きる意思を持つ者の意地に他ならない。嗚呼、SKKGateが行く・・・・・・
なお、日付変換は全種類対応してないけど……
貴様らにそんな玩具は必要ない(棒読み)
正直、SKK10が対応してない命令ばかりで、わざわざ全機能をカバーする意義をまったく感じない。一応最低限はカバーしたつもりだけど。頑張って完全対応したところで、1回動かしたら飽きて忘れ去られるのがオチ。よって細かいところまで猿真似する必要はないと判断し現状公開とする。
従来通り、日付入力に関してはtoday()関数を上書きして自分好みにカスタマイズ可能にしておくことこそが利用者のニーズへの本質的な対応である、という信念は変わらない。
だが、「できないからやらない」ではなく「できるけどやらない」にしておくことは大事なので、基礎となる最低限の部分を実装した。個々の関数を作り込めば完全対応も可能だし、あらゆるLispに対応させたい場合には、function lisp()をskkgate.ini側でオーバーライドして本気のエミュレータを作り込むことだって理論的には可能だ。
その他、DDSKKに触発されて作ってはみたものの、二度と使うことがなかった相対日付計算サンプルを削除。
以前と同じ機能が欲しい人のために、今回の版でLispエミュレータ経由で同じことを実現するためのコードを残しておく。以下をskkgate.iniの末尾にコピペすればよい。
- // 相対日付の計算例
- function day(n, d) { return d = new Date(), d.setTime(d.getTime() + (n || 0) * 864e5), now(0, d) }
- function someday(n) { return day(n || 1) }
- function oneday(n) { return day(n ? -n : -1) }
- skk_tomorrow = tomorrow = someday // (skk-tomorrow) は (someday 1) と同じ
- skk_yesterday = yesterday = oneday // (skk-yesterday) は (oneday 1) と同じ
未定義の関数があと3つ残ってるが、L辞書の解釈に必要な枠組みは全て用意しておいたぞ……みたいな……。
L辞書の残りのLisp部分を駆動するために最低限必要な実装は以下の通り。
- // Lispエミュレータの未実装部分を強制的に動かす例
- function skk_gengo_to_ad(head, tail) { return [head, $I, $N[0], tail] }
- function skk_ad_to_gengo(gengo, pad, tail) { return [gengo, $I, $N[0], tail] }
- function skk_gadget_units_conversion(_from, _to) { return [$N[0], _from, _to] }
このコードで、L辞書内のコードのエミュレーションがSKKGateでも実現可能であることは実証できるが、同時に、実装がかなり大変そうだ、ということもよくわかると思う。
すなわち、これを実現しているオリジナル版や各種クローン版は、もの凄い努力の積み重ねの成果だということだ。
あと、今の実装形態はベストな形ではない。本気で効率を追求するなら……辞書をダウンロードした瞬間や、辞書プロセスがメモリにデータを展開した瞬間にLisp部分を除去し(過去のリミッターはこのタイミングで動作していた)、事前に対象の言語に翻訳しておくべきなのは明白。でも、正直そこまで効率を追求しても見返りがまったくない……。現状がSKKFEPのデザイン的なコードサイズと実行効率の妥協点だということで。
とにかく今回の実装はあくまで実験の一環。明日から本気出す。
2014.03.02
以下の元号変換系の関数を追加。
- (skk-gengo-to-ad head tail)
- (skk-ad-to-gengo gengo pad tail)
変換状況を保持する変数を$で開始するように変更。
命令変換時に小文字アルファベット1文字の変数はすべて利用可能にした。(従来はe,r,sあたりが使えなかったっぽい)
2014.03.03
オンライン変換が盛大に文字化けするエンバグ(20140302版で発生)を修正。
そのままの流れで、数値変換の辞書登録を可能に♺する改良を追加。(20140303a)
登録直後は「#0泊#0日」みたいに出力されるので、とりあえず物理アンドゥで再変換すべし。
L辞書の数値変換に#0(半角数値)のエントリが圧倒的に足りておらず、#1(全角数値)のエントリばかりで汚染されてしまっているという指摘には同意せざるを得ない。#0派の多くは(自分を含めて)この手の入力の場面では数字を直接打鍵してしまうことが多いため、問題が表面化していなかったのではないか、という可能性が無きにしも非ず。
とにかく、これは明らかに辞書のデザイン上の欠陥であり、辞書側を修正するのが筋であると考える。
そこで
L辞書のデザイン上の欠陥を補う、数値変換の追加辞書を自動生成するスクリプトを作成した。常識的に考えて変換を追加しておいたほうがよさそうだと思われるエントリのみ抽出して(どうでもいいものは徹底的に除外して)、追加辞書を生成する。
2014.03.05
以下の単位変換用の関数を追加。
- (skk-units from to)
元はskk-gadget-units-conversionとかいう長ったらしい関数で、いかにも内部処理用に作られたような面倒な引数指定が必要な代物だった。こんな名称や引数表現が、厳選されずにそのままL辞書に入ってしまっているという事態は、正直なところ自分には受け入れ難い。skk-current-date、お前もだ。
「適切で読みやすい関数名のどこが悪いの?」とか思って首を捻ってる人(そんな素人はいないと思うけど)向けに補足しておくと、その考えかたはあくまで『プログラムの内部名』のためのものであって、『SKKのL辞書に登録される単語』の一部としてのLispコードとしては
最低最悪だってことだ。
もともと、SKKのL辞書内のLispコードは、Lispが実行できなくて命令がそのまま露呈してしまったとしても、辞書の利用者に負担がかからないよう、短くシンプルな名称・引数が使われていた。こういった配慮は、各種SKKクローンや日本語検索、形態素解析など、Emacsの範囲を超えてL辞書を広く活用してもらい、辞書を、ひいてはSKKそのものを普及させるという重要な戦略を担うデザインの礎ともいえるものだったのではなかろうか。それなのに……何だよこれ。誰だよこんなの入れた奴は。
L辞書の惨劇から現実逃避すべく、せめてエミュレータ内だけでもシンプルに記述できるようにしたいという願いを込めて、SKKGateではあえて名称を変更した。当然、元の名前を使う場合と比べてコードサイズが短くなるよう配慮もしてある。君は、ユーザ辞書にこの関数を登録してもいいし、しなくてもいい。
j-dateにも反応するように改良。
これでSKK10時代以前のものを含む、L辞書内のLisp関数に全て対応した。
べっ……別にアンタのために用意したんじゃないんだからねっ!(赤面)
2014.05.11
Google CGI API for Japanese Inputの仕様変更でいきなりオンライン変換が動かなくなってたので速攻対応じゃゴルァ!
2014.06.06
SKKFEPβ0+8i(虚数バージョン8)以降の仕様変更により、候補絞り込み処理がゲート側に移動となった。虚数バージョン7以前と組み合わせても特に問題なく使えるはず。
なお、標準の動作は、従来とは明確に異なっており、日本語の口語で使われるような指定方式である「長い単語→短い単語」順で指定した場合であっても絞り込みが行なわれる。
変数narrowの値で絞り込みの動作を変更できる。
値 | 動作 |
0 | 絞り込み変換機能を利用しない。 |
1 | コロンの左側と右側の候補のうち、文字が少ないほうの候補を選択する。(デフォルト) 文字数が同じ場合は左側を選択する。 |
2 | コロンの左側の候補を常に選択する。 |
2014.09.17
SKKプラスと連動し、okuri=1の時は送りがなキャンセルのパターンが先頭候補以外に出現した場合は全て削除するように改良。これにより、候補選択で
SPACEを連打した時にいかにも制御文字っぽい候補が出現してしまう問題を回避できる。
インストーラの説明が間違っていたので訂正。
2015.01.06
絞り込みの結果を確定した時に学習するよう改良。
2015.01.11
学習キャンセラーを廃止し拡張スクリプトを1.1KB縮小。
function Web(URL)を
Webぽ呼び出しに変更。
Webぽ連携URLをUncyclopediaからWikipediaモバイル版に変更。
2015.07.08
CorvusSKK♺の最新版1.8.11で追加された「送りあり変換で送りなし候補も検索する」の機能を追加(元ネタはDDSKKの機能とのこと)。急いで1行追加しただけの簡易実装だけど、こうかは ばつぐんだ!
これは、SKKのL辞書に未熟な部分があることが根底にあり、建前としてはL辞書側に修正をかけていくべき問題であると考える(例えばL辞書には「説明する」はあっても「報告する」がない等、不完全な状態になっちゃってる)。でも、これを流行語・ネットスラング・造語などを考慮しながら状況に応じて完璧に対応していくというのは単語が多すぎ時間がかかりすぎメンテ困難すぎで、まるで現実的ではない(その挙句、利用者の使用感はほとんど変わらず報われない)。現状とり得る解決策としては、サ変のみ特別対応ってのはとても筋のよいやり方だ!と直感ビビビっときたので採用することにした。
てか、この機能は今後のSKK実装の前提ということにしちゃって、
サ変の重複候補は機械的にL辞書から全部取っぱらってスリム化して配布しても問題なくね?辞書のメンテが楽になってメモリ消費量も減ってウマウマじゃん?信じて送りだしたL辞書に「あへがおだぶるぴーすs」とか増やし続けてメンテするの大変っしょ?!
……と思ったんだけど……SKKだとサ変の判定を完璧にこなすのはかなり難しい。あくまで機械的な判定しか現状ではできないので、(「押す」「貸す」「挿す」みたいな明らかにサ変じゃなさそうな1文字の単語は弾いてるんだけど)「かもs」とか「しるs」みたいなサ行五段活用の単語の一部まで過剰反応してしまって、変換候補に日本語的じゃない
凄い発想のトンデモ候補が出てきてしまうなんてお茶目な一面も見られたりする。ここの部分については
SKKプラスを拡張して五段活用の判定を追加する、などの方向で考えていくことになりそうな予感。
というわけで、okuri=1(デフォルト)の時、サ行の2文字以上の送りあり変換の時に送りなし候補も検索するようにしといた。
2015.09.14
そんな餌でこの俺様が釣られクマ――
絞り込みの処理でU+10000以降のサロゲートペアを使った文字を正確に判定するよう改良。
実はこれまでは「だって使わないしぃ〜?」とかミサワ顔してたのでサロゲートペアを考慮せず、単純処理で16ビット幅固定の判定をしていたのだ。
例えばSKK-JISYO.JIS3_4を入れた状態で「こう:よぎ」で絞り込みをやってみるとU+27752がヒットするわけだが、これは上位D85D 下位DF52というデータで構成されている。これを例えば「かみしも」のU+27614(上位D85D 下位DE14)の上位サロゲートに対して判定すると、以前の版では釣られてパクッと反応しちゃってた。
このままではいかん!と心を入れ替えてサロゲートペアをきちんと考慮するようにした。試しにやってみたらスクリプトサイズ36バイト増加だけでイけた。
要するに、ちゃんと文字を見て16ビット/32ビット幅を合わせて検索するようになったのでもう大丈夫クマーってことだ。
現在、超速テスト中のSKKFEPβ0+9i(バージョン9)α版の辞書読み込みプラグインを使うとJIS3_4辞書などを直接扱えるようになる。つまり、もうすぐサロゲートペアを含む単語のヘンカン・セタクを多用する未来が到来する。備えよう。
2015.09.25
つ き ぬ け る 最 強
Windows10のEdgeやストアアプリ上でSKKGateが動作するようになった……かも?確認求む。
どうやらWindows10のEdgeでは
できが悪いセキュリティ回りが厳しすぎて、WSH(WScript.exeおよびCScript.exe)のプロセスを経由して生成されたゲートはアクセス不可扱いとなるらしい。IEやFlash Playerのサンドボックスすら貫いたこのSKKGateの最強の
プロセス間通信が通用しない……だと……。
そこでこのEdgeのどてっ腹に風穴を開けるべく恒例の
プロテクト外し新規モジュールを新たに開発。今回は気合いを入れて3キロバイトのバイナリにWSH互換のUTF-16/SJIS判定とかアイコンとか徹底的に詰め込んだ。実はコレ、XM6用に秘密裏に開発していた試作モジュールを急遽改装したものだったりするんだけど内緒な。世の中いつ何が役に立つかわからんもんだぜ……
これで、IME側はもとよりスクリプト本体にすら一切手を加えることなく、Windows 10のEdgeやストアアプリからIMEが複数のプロセスに対して同時に辞書検索のための通信を行うことが可能となった。
2015.09.26
ZIP圧縮フォルダから実行するとインストールに失敗するエンバグ(20150925版で発生)を修正。
起動時に設定ファイル(iniファイル)が読み込まれないエンバグ(20150925版で発生)を修正。
IME側を先にアンインストールしてしまった状況でもアンインストール操作だけはできるよう改良。
XPより後のOSであれば、アンインストール時に機能拡張DLLが存在しない状況でもプロセスを終了できるよう改良。
2015.09.27
スクリプトのサイズを縮小。
いつの間にかJScript.NETでコンパイルできなくなってたのでコンパイルできるよう微調整して実験用バッチファイルをおまけで追加。このバッチファイルで生成したexeファイルでも同じように使える……はずなんだけど、
どれほどJScript.NETが███だったか、どれだけWSHが天国だったかを嫌というほど思い知ることになるはず(いや、どっちも甲乙つけがたいレベルで
████じゃね?というツッコミはそれ以上いけない)。具体的には……
- eval系の挙動が違う (たとえばiniファイルで関数に関する操作が一切不可能で関数名を変数に代入することすらアウト、eval系で発生する例外の一部をtry catchで捕捉できない、など盛りだくさん)
- .NET Framework恒例の起動もっさりにメモリ大食い
JScript.NET版のバイナリに対して、このZIP書庫に添付しているiniファイルを読み込ませるとモロに上記の問題にブチ当たるので、実験してみたい人はiniファイルを削除するか、後半部分の関数名の箇所をコメントアウトするなどして対処すべし。そのうち飽きたらこのテスト版コンパイル用ツールは削除するのでよろしく。
IME側を先にアンインストールした状態では再起動後は何も実行しないよう改良。(前はエラーダイアログが出たりしてた)
2015.10.09
インストーラのサイズを縮小。
誰も使わないコンパイル実験用バッチファイルは廃止の方向で。
2015.10.10
セットアップ起動時に??SKKGateプロセスの起動状況を表示するよう改良。
それとサイズ縮小。
2015.10.20
SKKFEP側にスクリプトエンジンを移動したので、インストーラはSKKFEP側の新しいスクリプトエンジンを使用するよう変更した。
- 旧バージョンからの移行方法
- 1. SKKFEP最新α版をとにかくインストール
- 2. SKKGateのセットアップを実行し、1ENTERで「1 再起動」を選択
- 3. おわり
2015.10.21
……カエレ!
失敗作として削除されたはずの学習キャンセラーが帰ってきた!
単漢字の候補を
BS暗黙の確定で消した場合に、学習を抑制する地味子動作をデフォ機能に追加。
これ、単漢字とか適当に変換している最中に、少し時間が経ってから思わずBSで削除した時に「しまった、偽装確定しようと思ってたのに……くやしい……でも(ビクンビクン)」みたいな感じになるのを防止するために入れてみた。実際あんまり役に立たないというか、正直、あってもなくてもあんまり気にならない感じなんじゃないかなって雰囲気がそこはかとなく漂ってる感マジパネーションと思うんだけど、当人が満足ならいいことだアッカリーン
❤
なお、この機能はβ0+9i版専用。β0+8i系以前の版では機能しないので注意。
あと、backsp=2にするとBSで暗黙の確定を行なった場合は全て学習が行なわれなくなる。ここまでやるとかなりエクストリームSKKって感じになってしまうので、さすがにこれをデフォルトにはできなかった。妥協した。ボクは無力だ……
2016.02.13
改行を含む候補に対応するため、SKKGate/SKKNetの大幅な仕様変更を行なった。
古い拡張スクリプト(
skkgate.js)は、今後一切動作しなくなるので、速やかにスクリプトを最新のものに更新して使うことを推奨する。
ちなみに、古いスクリプトを無理矢理実行した場合、安全装置が作動して
何もせずに即時終了するのでそのまま放置していた場合でも特に問題は起きないはず。
今回の仕様変更の目的は大きく3つある。
- 1. 利用率の高いコントロールコード(\t \r \n等)を含んだ候補をSKKGateで正しく扱えるようにすること
- 2. タブや空白を含んだ状態の読み(見出し)をSKKNet経由でも正しく扱えるようにすること
- 3. 内部処理に合わせたコマンド番号の最適化を行い、将来のプログラムサイズをさらに縮めること
拡張スクリプトの主な変更点は以下の通り。
No. | 変更内容 | ソースの修正方法 |
1 | ActiveXオブジェクト名の変更 | SKKGate → SKKGate2 |
2 | 送りがなの区切り文字の変更 | \t → \1 |
4 | 注釈の区切り文字の変更 | \f → \2 |
3 | 候補の区切り文字の変更 | \r → \3 |
5 | 処理番号の変更 | 登録 1 → 2, 削除 2 → 3 |
従来のスクリプトを手動で変更するには、上記5点の変更を気合いで適用する必要がある。
まず大きいのはオブジェクト名称の変更。"
SKKGate2"という大仰な名前となった。これは仕様変更に対応していない旧式のスクリプトが残っている環境への防護策として避けては通れない道であった。これをやっておかないと旧式のスクリプトが動き続けてしまい愛と悲しみの連鎖が発生。相手は死ぬ。
次に、従来の区切り文字をパススルーするようにした。SCSU(Unicodeの標準圧縮形式)でパススルー扱いとなっている利用頻度の高い文字\t \r \nについてはSKKGate側では一切弄らないよう仕様を変更した。
これにより、変換前、変換後の文字列としてJavaScriptやC++などのソースリストをそのまま扱う、といった応用が可能となる。もちろん現状のままでは簡単には扱えないので、一工夫必要になるのだが、その前段階としての準備がこれで完了したことになる。
実を言うと、当初は区切り文字\rさえパススルーできればいいので、他の区切り文字(例えば\vあたり)を使ってお手軽かつ華麗に回避、みたいな方向を考えていたのだが……なんか
JScript互換モードでは\vがエスケープシーケンスとして動かない(他にも、
\bは文字列内では有効なのに正規表現内では使えない)みたいな旧世代の遺産みたいな仕様になっているせいで扱いを断念。
どうせ変えるんなら全部の区切り文字を変えてコントロールコード0〜3以外は全てSKKGateで扱えるようにしてしまえ!ってことで全部変えちゃった。一応、将来への拡張用ってことでコントロールコード4〜7は予約扱いにしておく。ちなみにコントロールコード4はSKKNet側(通信文)のみで使用しているけど、今のところSKKGate側内では問題なく扱える。
結局、SKKGateではコントロールコード0〜3以外の文字すべてをパススルーする(要するに、skkgate.js内の区切り文字を、全てコントロールコード0〜3で置き換える)という大改造を行う茨の道を選択することとなってしまった。
その結果、正直言ってコードの見た目は前回のものと比べてるとちょっとわかりづらい形になってしまったかもしれない。でもたとえ中身が人の形を保てなくなろうとも、表側のSKKフロントエンド部分に影響が出ないようにするのが最優先である。SKKGateの文字列処理は極力裏方に徹するべき、という基本方針は絶対に間違っていないはずだ。己を信じて突き進むのみ。
要するに、拡張スクリプトについては
とりあえず一旦全部書き直しレベルの更新が必要となってしまったが、ロスじゃ日常茶飯事だぜ!って感じで書き直しちゃったピョーンってこった。
ほかは(たぶん誰も使ってない)
SKKNetとかの話なので以下略。
2016.02.23
指定文字数以上の長いカタカナを
qで確定した時に自動的に学習する新機能kanalenを追加。
それとインストーラのサイズ縮小。
現在は、単に変換対象の文字数だけしか見ない単純な処理となっているが、スクリプトエンジンの真の力はこんなものではない。理論上は、文脈判断を追加したりすることも可能だ(例えば、一定時間内に2回以上同じ単語を確定した時だけ学習する、などの処理を追加することもできる)。
まずは最低限の実装だけを実施し、デフォ無効化で機能だけ入れた状態とした。
とにかく使ってみるには、
skkgate.iniをユーザ辞書フォルダにコピー・編集してkanalenの値を4〜8くらいの値にしてみるべし。
2016.02.27
SKKFEP側のドキュメントにも書いたが、あまりに便利すぎるので新機能kanalenはデフォ有効にすることにした。
デフォ設定の文字数は5。要するに、
5文字以上のカタカナをqで確定した時、自動的に辞書に登録する。
もし、どんな候補が登録されているのか不安な場合は、従来機能にあるloggerの値を1にすると、単語登録の記録がskklog.txtに記録されるので参考になるかもしれない。
自分がどんなネトゲで遊んでいたか丸わかりな程度には役に立つかもしれない。
さらに、少しでも学習の精度を上げるべく、誤入力のパターンを学習しないよう「カタカナ語っぽいもの」だけしか変換しないように改良したっぽいぽい。……ぽい?
これはキー操作ミスで子音入力が混入したようなパターン、例えば「pろぐらむ」みたいになってしまったものを学習しないようにするための工夫というわけだ。
実はカタカナ語変換は、
qによる確定の時以外にも、
CTRL+
Qでの確定の時にも判定が行なわれる仕様となっている。半角カナの単語は、さすがに自動で学習させるわけにはいかないんだが(文脈判断処理を入れるなどして拡張する方法は残されているけど、そこまで自分ではやらない)、既に辞書に半角カナの候補を登録さえしておけば、その候補が辞書の先頭に移動するようになっている。とにかく頻繁に使う単語は辞書登録して使えば短縮入力が必ず捗るようになるはずだ。
拡張スクリプトのサイズをさらに縮小。
20150708版で追加したサ変の変換補助が誤作動して破損データがユーザ辞書に蓄積されてしまうバグがSKKFEP側にあって、その修正を行なった。もしこれまでSKKGateを使っていた場合は修正用のスクリプトを使うべし。
詳しくはSKKFEPのドキュメントを参照。
インストーラを改良。初回インストール時に設定ファイル
skkgate.iniが存在しない場合は、自動的に生成するようにしておいた。
これは、ブラウザでダウンロードしたZIPは「ブロックされた状態」(要するに属性が汚染されてる)になっていて、OSの標準機能で解凍してしまうとその汚染属性が解凍後のファイルにもすべてこびり付いてしまうというWindowsの
クソ仕様をなんとかするための活動の一環である。圧縮フォルダ内の
setup.jsを直接起動した場合に限り、インストーラが地下500メルテからコピーしたファイルは青き清浄なファイルに戻るという、Windowsの
クソ仕様の裏を突きまくった生活の知恵なのであった。
2016.02.28
拡張スクリプトとセットアップのサイズを微妙に縮小。
2016.03.02
拡張スクリプトのサイズを100バイト程度縮小。
2016.06.06
学習状況の記録を有効化した際に出力されるログファイルが汎用IME辞書テキスト形式となるよう改良。
これは最新版の辞書プロセス改良に合わせたもので、註釈情報の保存にも対応している。
要するに
ログファイルを加工せずにそのままユーザ辞書、通常辞書として流用できるようになった。
長期間学習状況を貯めこんだログファイルには(順序情報以外の)ユーザ辞書とL辞書との差分情報が詰まっているので、ユーザ辞書の非常用バックアップ用途や辞書データの圧縮・差分抽出用途に活用できる可能性が微レ存かもしれない。
学習状況のログ出力機能はデフォ無効となっている。
ログ出力を有効化したい場合は、
ユーザ辞書フォルダ内のskkgate.iniを書き換えてからリフレッシュかboot()を実行するかOSを再起動するべし。
なお、出力される辞書データのうち、品詞情報の項目は常に「名詞」固定となる。辞書プロセスはこの部分を見ないで読み飛ばすので問題ない。
また、記録時刻の情報が何の加工もなくしれっと記述されているが、この部分も辞書プロセスではコメント扱いとなり、速攻で読み飛ばしてくれるので問題ない。
後で他のIMEにデータを持っていく場合には、これらの点に留意すること。
online=7の設定時、「function test」などのローマ字かな変換ではない文字列を物理アンドゥした時、外部辞書に問い合わせずに編集状態に移行するよう改良。
年号の判定範囲が狭くて「しょうわ64ねん」等の変換に失敗する問題を修正。
2016.06.22
kanalenの判定基準を変更。
従来はデフォルトで5文字以上のものを1回でも
qで確定したら即登録していたが、これを以下のように変更した。
- 3文字以上のカタカナ語を、30分以内に2回以上qで確定したら登録
学習の制御には3つの変数を設定する必要がある。
skkgate.iniに以下の3つの変数の定義を追記し、SKKGateのセットアップで1を選ぶか、SKKFEP側のセットアップでリフレッシュを選べば設定が反映される。
例によってSKKGateは入力プロセッサとは完全に独立して動いているのでOSの再起動は不要。
変数名 | デフォルト値 | 内容 |
kanalen | 3 | 指定した文字数以上のq確定が行われた場合に学習判定する |
kanact | 2 | 一定時間以内に指定した回数以上のq確定が行われた場合に学習する |
valid | 1800000 | 複数回出現の判定を行う間隔(ミリ秒単位) |
ちなみに前と同じ動作に戻したい場合は、kanalen=5,kanact=1とskkgate.iniに書けばよい。
よくわからない場合は弄らずにデフォルト設定のまま使えばそれなりに自動的に学習してくれるはず。
なお、skkgate.iniが古いとkanalenの値が5のままだったりするので注意。手動でskkgate.iniを編集するか、面倒ならいったんskkgate.iniを削除して、再度セットアップを実行すれば更新してくれる。
そもそもなんでここを変えようと思ったのか。
4ヶ月ほど以前の設定で使ってみて、確かに便利は便利なんだけどノイズが目立つようになってきたのだ。どげんかせんといかん!
具体的には以下のような誤った学習データを収集してしまっていた。
- 単語の最後の1〜2文字が足りない状態で確定してしまった
- これは、おそらくチャット中他の発言に追従するためだったり、他のウィンドウに文字入力を即座に反映したい場面で、入力途中の長いカタカナ語を確定しちゃった、などの理由が考えられる
- 1つ前のものと似たパターンだけど、戦闘中とかで急いで打ち込んだ時間違えていたっていうケース。あとから間違いに気付きにくいのが問題。
- 口語や擬音など、利用頻度が極端に低く特殊なカタカナのパターンまで学習してしまった
- ヘェーラロロォールノォーノナーァオオォーアノノアイノノォオオオォーヤ
で、これらをどうやったら防げるか。そう、
一発だけなら誤射かもしれない♺
という報道しない自由K.Y作戦で行けばいいんじゃないかと閃いた。
つまり一定期間内に2回やったら学習って動きにすればいい。
ちょっとだけ!先っちょだけ!なんて一発屋は認めんのだよ!(ブーメランが突き刺さる効果音)
これで、高い精度で単語を特定できるようになったので、文字数5文字以上という制限も必要なくなるはず。
ってことでまずは3文字にしてみた。
使用頻度が高いけど文字数が少なくて従来の設定では学習できなかった単語(
「ネトゲ」とか「ツイート」などのL辞書から自動抽出できない単語)が学習できるようになるはずだ。しばらくこれで様子を見てみるとしよう。
2017.03.12
SKKFEP側の仕様変更に伴い、COMオブジェクト名をSKKGate2からSKKGateに戻した。
2017.03.22
SKKSyncを使う場合、準備段階でユーザ辞書フォルダをリネームする必要があるが、従来の拡張スクリプトだとカレントディレクトリがユーザ辞書フォルダを指していたせいで、メンテでスクリプトを停止させるまで一切リネーム操作ができなくなっていた。
そこでカレンドディレクトリを起動時から変えない(システムディレクトリのままで動作する)ように直した。このおかげでユーザ辞書・設定フォルダをいつでもリネームできるようになった。
従来のカレントディレクトリのファイルを指定する時のために、関数 app() を新設。ユーザ辞書フォルダのパスを取得できるのでファイル名の先頭にくっつけて使うようにする。
2017.03.25
近距離攻撃装備用にゲート3を追加。元々SKKGateではオプション装備用としてゲート2が用意されていたが、このゲートは変換操作用のユニットを接続するためのものだった。今後は学習操作向けのゲートも必要となるため、急遽ゲート3を用意する運びとなった。ちなみにかつて、ゲート2には超遠距離攻撃装備のSKKggr.csが接続されていた。まさか、
近距離攻撃ユニットの正体とは一体……?
2017.04.10
インストーラのCOMオブジェクト名をSKKGate2からSKKGateに戻した。てか戻すの忘れてたナリ。
インストーラの終了間際にエラーが出ないよう修正。
2018.09.30
EmacsのInput-Methodに似た規則を用いて、長音記号マクロンつきのアルファベットを変換できるようにしてみた。
要するにAbbrevモードでこのように操作すると……
- /To-Kyo-SPACE → Tōkyō
と変換できるようになった。
この動作の有無はグローバル変数macronで制御可能。
変数$Mにskkgate.iniで連想配列を再定義することで、ウムラウトや発音記号など各種ラテン文字への変換を拡張できるので、いろんなテーブルを作って遊んでみよう!
2019.03.27
2019.04.01
改元の事前公表(どうやら憲政史上初らしい)を受け、新しい元号に対応。よかったよかった。
実は昨年の9月版の時点で改元対応のテーブル自体は仕込み済みで、文字を書き換えただけ。
ちなみにテーブル内容は「読み」「元号」「西暦との差分値」「年数(省略時は∞)」となっている。
そのうちL辞書に誰かが追加してくれるはずだけど、以下のエントリを追加しておくとよいだろう。
(メモ帳に以下の内容をコピペしてskk-reiwa.txtの名前で保存し、辞書フォルダにつっこんでセットアップの「辞書リロード」を選択するか再起動すればOK)
- ;元号「令和」を追加
- r# /令和#0年/
- れいわ /令和;年号(2019-)/
- れいわ#ねん /令和#0年/令和#1年/令和#2年/令和#3年/
- れいわ#ねんど /令和#0年度/
- れいわがんねん /令和元年/
- ;更新パッチ
- ;システム辞書が更新されるが、運用時はユーザー辞書側の注釈が優先されることに留意。
- ;Xを押して一度ユーザー辞書内の該当エントリを削除し、再度登録しなおすとよい。
- へいせい -/平成/
- へいせい /平成;年号(1989-2019)/
- ;なぜか平成に関する内容だけパターンが妙に多い。本当に「L辞書に」必要なのか?
- ;対称にならず偏るなら入れる必要なんてない。全部削るべき。
- ;s#.#.# /昭和#0年#0月#0日/
- ;h#.#.# /平成#0年#0月#0日/
- ;r#.#.# /令和#0年#0月#0日/
- ;しょう> /昭;(「昭和」の略)/
- ;へい> /平;(「平成」の略)/
- ;れい> /令;(「令和」の略)/
グローバル変数Wを削除してサイズ縮小。
終劇
co (Twitter♺)