Orfoスイッチャーの歴史

こんにちは、habrozhitel様!



むかしむかし、2006年8月、学生として、キーボードのカーソルキー(矢印)を使い慣れた場所から直接アルファベットキーボードに転送するプログラムを書くというアイデアを得ました。 修正のアイデアは、FYVA-OLDJの通常の位置から手を離さずにプログラミングしたエディターをナビゲートすることでした。 Caps-Lockを保持し、キーI、J、K、Lをカーソルキーに変えるだけで十分でした。 すごかった! キーボードからのメッセージを傍受および偽造する機能を備えたWindowsフックに対処する必要がありました。また、ナビゲーションの単純化という考えが自分にとらわれないという事実(新しいキーを使用するよう強制することは困難でした)にもかかわらず、私は仕事ができて満足しました私は自分のキーボードスイッチを作成するために必要なすべてをすでに持っていました。これは、(当時のように)バカなPunto Switcherを置き換えるものです。



同じ頃、私はDプログラミング言語に精通し C ++で記述し、同時に自動ガベージコレクション、インターフェース、クロージャ、その他のファッショナブルな機能を楽しむことができることでDプログラミング言語に興味を持ちました。 すごかった! キーボードインターセプターをDに書き換えて、言語の切り替えを忘れて、入力を開始するとキーボードレイアウトが切り替わるように補完することにしました。 単に切り替えただけでなく、すでに入力していた修正したテキストを挿入した意味不明な文章を消去しました。 さて、あなたは皆、Puntoがそれをどのように行うか知っています。



そしてしばらくすると、すべての準備が整いました。 改行文字を介して文字の組み合わせがリストされたファイルがあり、それに会うと、プログラムは自動的にレイアウトを切り替えました。 ラジオでセルゲイ・モスカレフ(Puntoの著者)を聞いた後、正しい切り替えの成功の秘theは、言語の「不可能」にあると判断しました。 まあ、あなたはすべてこの物語を知っています。



Puntoディストリビューションから不可能ディクショナリを見つけようとしましたが、うまくいきませんでした。 ps.datファイル形式がわからず、文字の不可能な組み合わせの統計を収集し、大量のテキストを処理することは、常に最高の努力をするが、決して到達しない未完成の方法のように思えました。 そして、私は他の方法で行くことを決めました-プログラムの言語のすべての単語を絶対に含めること。 それはすべての問題の解決策のように思えました! その時点で、すべての単語が正しい形式で既に含まれている限り、プログラムはまだスペルチェックを行うことにしました。



いくつかのサイトからすべての可能な語尾と接頭辞を持つすべてのロシア語の単語のリストをダウンロードしたところ、私はそれらが私が予想したよりもはるかに多いことに気付きました-約800,000語! ロシア語のファイルの重量は約15メガバイトで、検索には数十ミリ秒かかりました! 同様の単語を見つけるには、100回以上の検索操作を行う必要があり、これらのミリ秒が秒に変わるため、正しい単語のバリエーションを含むメニューが表示されるまで1秒間待つ必要がないため、これは良くありませんでした。 失敗に近かった。



少し後に、私は幸運であることを発見しました。ロシア語の単語のほとんどは、他の既存の単語の続きだからです。 それは素晴らしいニュースでした!



ルートノードが単語の始まりのアルファベットの文字である特別なツリーの形ですべての単語を配置する場合、単語の2番目の位置にある文字の2番目のレベルのノードなど、最長の単語の最後の文字まで辞書ファイルのサイズを数倍減らしますが、各ノードにはブランチ全体のサイズが含まれているため、検索の理想的な条件も作成します。ノードの文字が検索ワードと一致しない場合、必要なくブランチ全体をステップオーバーできます eboraそのすべての内容。 だから私はやった。 すばらしい辞書になりました! 検索の繰り返しには0ミリ秒の時間がかかり、私の手はついに完全に解かれました。 ロシア語辞書のサイズはわずか5 mb、英語の1.4 mbでした。 アーカイブでは、両方の辞書と実行可能ファイルorfoswitcher.exeが1.1メガバイトしか占めていませんでした。 そのようなプログラムに最適なサイズ。 私は仕事にとても満足していました!



これにより、レイアウト切り替えアルゴリズムを思い付くことが非常に簡単であることが判明しました。 ダイヤルされた組み合わせが1つの辞書に存在するかどうか、また別の辞書に存在するかどうかを確認するだけで十分でした。 これが当てはまり、レイアウトが見つかった単語と一致しない場合、切り替えが実行されます。 これは正常に機能し、新しい単語を辞書に追加することで、すべての誤った切り替えが解決されました。 たとえば、すぐに「schA」という単語が英語の「of」に切り替わることが明らかになり、80万語の辞書にもかかわらず、このようなさまざまな人気のある単語で手動で補足する必要がありました。



次の好奇心の強いタスクは、どのアプリケーションでも機能するメニューを作成することでした。 このメニューには、単語の正しいスペルのバリエーション、およびおそらく他の何かが表示されるはずでした。 Windowsフックを使用して実行中のアプリケーションに統合する方法はすでに知っていましたが、メニューに問題がありました。 最初の試みは失敗しました。 アクティブなアプリケーションのスペースから標準のWindowsメニューを作成することは常に機能しませんでした-一部のアプリケーションは、各アプリケーションに独自の動作原理があり、メニューが正しく処理され、そのメッセージがプログラムメッセージループに正常に収まるという保証がないため、予期せずハングして動作しました。 orfoswitcherプロセスからメニューを作成すると、現在のアプリケーションのフォーカスが失われ、これも見苦しくなりました。 結局、アクティブなアプリケーションにメニューを表示した後でもフォーカスを戻しますが、アプリケーションがフォーカスを削除または設定するための作業を行わないという保証はありません。 どのソリューションも不安定であるか、どこでも機能しませんでした。



もう一度、私は幸運でした。 オンスクリーンキーボードアプリケーション(osk.exe)の動作をSpy ++で確認したところ、Windowsの作成者がWS_EX_NOACTIVATEという特別なウィンドウスタイルを提供していることがわかりました。これにより、作成したウィンドウは、クリックしてもアクティブになりません。 このウィンドウに基づいて、入力カーソルが現在のアプリケーションに残ったまま、マウスとキーボードの両方で歩くことができるメニューを作成できたので、素晴らしいです。 このメニューは、スペルをチェックするときに正しい単語を表示するのに理想的でしたが、他の便利な用途があるかもしれないことに気付きました。



最初に思いついたアプリケーションは、コピーされたすべての履歴を保存し、メニュー項目の形式で表示することです。 クリップボードに到達した各テキストフラグメントごとに1ポイント。 そのため、クリップボードの履歴がプログラムに登場しました。 特にログインをコピーし、次にどこかからパスワードをコピーして、入力フィールドに貼り付ける必要がある場合は、テキストの最後のフラグメントを常に手元に置いておくと便利であることがわかりました。 コンピューターをオフにしても、すべてが履歴に保存されるため、新しいコピーされたテキストでクリップボードが消去されることを心配する必要はありませんでした。 友人は、クリップボードの履歴が、プログラムをアンインストールする前にクリップボードを停止するオルソスイッチャーの唯一の機能だと教えてくれました。 私はいつも彼の率直さに感謝していました。



その後、プログラム、自動置換機能、アプリケーションで動作するためのあらゆる種類の例外にメモが表示され、orphoswicherは徐々に表示されるようになりました。 これが物語です。 誰かがこのプログラムを手伝ってくれたことを願っています。



プログラムのウェブサイト: virtassist.eu



All Articles