可能性フィルタ

かえでさんのブクマコメを受けて。
先に打鍵のtomo2のプラグイン系の動きについて、はてなのおえかき機能を使って簡単に説明。汚くてすいません。

プラグイン関係の動作説明


入力が来てからの処理はこんな感じになっています。①のキー入力は実際にキーボードを押した場合と、エミュレート系のソフトが入力イベントを生成した場合に呼ばれます。

②入力情報はまずフィルタープラグインに通されます。ここで、複数のフィルター(例えば、ソフト入力フィルター以外にも特定のページを開いているときブラウザへの打鍵を無視するなど)がある場合は順にフィルターを通るため、一つでも条件に引っかかるものがあるとその入力情報は次の処理へ渡りません。

ちなみに、このフィルタは打鍵のtomo2内部の話で、④など外部への影響はありません。

③フィルタを通った後の入力情報は次にすべての記録系プラグイン(α3で実装されたプラグイン)で処理されます。

このとき、エミュレートソフトによる入力も記録系に渡ってしまうと、実際の打鍵以上の打鍵数を記録し、詳細ログにも両方の入力情報が記録されてしまうため、これをフィルタープラグインで前処理しようということです。

ソフト入力のフィルタリング方法について

で、実装に関してかえでさんのコメントへ。

同時打鍵判定ロジックをプラグイン実装する「フィルタープラグイン」の話。em1keyのようにロジックを簡易言語で記述する……という方式なのかなぁ。たとえば、標準化されて「IMでも解析ツールでも使える」と面白そう。

em1keyを知らなかったので少し調べてみましたがかなり細かいことが調整できるようですね。僕が考えていたのはもっとシンプルなもので、以下のような順不同同時打鍵、順序つき同時打鍵、連続打鍵を考慮できればいいかなと思っていました。

# 以下かなタイプソフト向けにエミュレートしたときの話
H | J       = 3 # 姫踊子草かな配列で「あ」を出すとき
無変換 |> D = 3 # 飛鳥290で「あ」を出すとき
D > F       = 3 # 月配列で「あ」を出すとき

「|」はどちらが先であるという順番を気にせずに打鍵したときに右側のキーがエミュレートソフトから出力されるという記述です。順番を気にしない同時打鍵って案外珍しいような。

「|>」が順番付きの同時打鍵で、左親指シフトである無変換キーを先に押した状態でDも押すと「あ」が出力されますという記述です。普通のローマ字入力などで使うシフトキーの処理はこういう感じですね。

「>」は前のキーが押されたままか、そうでないかを気にせずに押される順番がこの通りになっているときに「あ」が出力されるという記述です。AZIKなどの拡張もこれに該当するはずです。

エミュレート系のソフト側で多くの場合、どこまでを同時打鍵として認めるかという許容範囲の設定ができるので、こちらでもその設定はできるようにするつもりです。

入力の判定に関しては僕の知っている限りではこの三つで大体カバーできるのではないかと思っていますが、これ以外にも変わった入力方式があると思うので知っている方教えてください。

フィルタリングの問題点について

そして、この方式関する問題点もコメントでいただいたとおりです。

打ったストロークから選択されうる文字列をピックアップして、そのうちどちらの文字がエミュレータから吐かれたのかをみて確定する……とか?
(この方法では、キーコードが来るタイミングと組み合わせによっては判別ミスする恐れがあるので、打鍵ストロークをある程度記録してから「矛盾しない組み合わせを探索する」必要がある上に、それでも切り分け仕切れない場合も出そう……そういう場合はあり得る候補をログに併記してしまうしかないのかも?)

うちへのコメントと書かれていませんが、勝手にそうだろうと思って使わせていただきます。まさに打ったストロークから選択されうる文字列をピックアップしてどの文字がエミュレータから吐かれたのかを見て確定する、という不確実な方法です。

ですが、この方法の実用性に大きな影響を与えるほどの不確実性ではないだろうとも考えています。問題はエミュレータが出力する「A」という打鍵と実際にキーボードの「A」を押すという操作がほぼ同時だったときで、このときどちらが本当の打鍵なのかを確実に判定することはできません。

大きな影響はないだろうと思う根拠がこのほぼ同時に同じ入力情報が発生する確率が低いだろうということです。その前提にまずエミュレータ系ソフトがキー情報を受け取ってから出力するまでの間がほぼ10ミリ秒以下であることがあげられます。(これは他のPCでも調査が必要)
このとき以下の二つの条件がそろわないと不確実な状態は発生しないのではないかと考えています。

  • 実際の打鍵も10ミリ秒以下の間隔で発生させられること
  • エミュレータが発生させたキーと実際の打鍵内容が重複すること

脳内思考がまだ不十分なのでこれが本当なのかどうかが「確実」ではないんですけど、いけそうな気がしたのでフィルタープラグインの実装に入ったわけです。

もっと不確実になる場合がたくさんあるじゃないか、というのがありましたら教えていただけるとありがたいです。

@追記
トラックバックしていただいたかえでさんのページでより詳しい説明を書いていただきました。ありがとうございます。
tomoemonさんによる「打鍵のtomo2」プラグイン関連コメント。 - 雑記/えもじならべあそび