変換中表示ができた!
この数日、時間をみつけては、Gさん(chatGPT)、Gem君(Gemini)、Claudeさんの協力を得ながら、単漢字変換エンジン「ひともじ」の最低限のコードを作り続けてました。
で、さっき、ようやく、ホントにようやく、変換中表示ができるようになった!
おめでとう!ワタシ!
だれに聞いても一発で正解は出てこない
このプロジェクトを始めてから、さんざん煮え湯を飲まされ続けてわかったことがあるんです。
生成AIは実に博識で、知識を山ほどため込んでますよね。
それでも、公開情報が極端に少ない分野、発信量が少ない分野では、生成AIといえど、踏み外しや間違い(仕様書のウソ、あいまいさなどに騙されるのも含む)がめちゃくちゃ多いってこと。
だから、IME(いわゆる、かな漢字変換処理)を作ろう、なんて無謀な試みでは、生成AIはもちろんn強力な助っ人。でも、聞けば一発正解、なんてことには絶対にならない。
生成AIと二人で「あーでもない、こーでもない」とウンウンとうなりながら、ホントにわずかづつ前に進む、雪山をラッセル(ゆきかき)しつつ登ってるような感じ。
何回か前にも書いたけど、Gem君に書いてもらった起動するだけのボイラープレート(おまじない的な決まり切ったコードのこと)はすんなり動いた。でも、そこにね、
・IMEのON/OFFを入れ、
・入力した文字を表示する処理を入れ、
・変換中や確定といったステータス管理の処理を入れ、
・変換中は下線を出して、
みたいな処理を組み始めると、とにかく動かない。
調べたら、関数からエラーが帰ってくるんだけど、その原因が何か?をつきとめるのに、めっちゃ時間がかかるのね。
Gem君のコードはGさんよりかなりマシ
私はchatGPTは結構愛用していて、日常的な壁打ち(自作の資料のレビューや改善、考え方の整理など)には、毎日のように愛用してるんだけど、どうにもコードを書かせると、一貫性に乏しいものを提示したり、数回前に指摘した間違い(バグ付きのコード)を、臆面もなく繰り返すことが多い。公式マニュアルを無視したコードを吐いてくることもちょいちょいある。
その点、Gem君の方がコード品質はマシかな。もちろんそれでも踏み外し(バグ)はあるけどね。
今回、一番時間を食ったのは、変換中の下線が出てこないというバグだったんだけど、これについては、Claudeさんに手伝ってもらって、解決した。その調査過程が、なかなか適切で「ヤルな」という印象だった。
やっぱり面倒だったInsertTextAtSelection
前回(半年ほどまえ)に、Gさんとナンギして実装したInsertTextAtSelectionという関数には、今回もてこずった。復帰値は正常なクセに、期待した値がなかなかかえってこず、いろんなパラメタを順列組合せみたいにして、試行錯誤して、ようやく「ああ、この組み合わせなら動くのね」みたいな進め方だった。
今回はStartCompositionでもハマった
さらに今回は、StartCompositionという関数でホンマに苦労させられた。この関数って、変換モードに入る時に呼ばないといけないんだけど、これがやってもやっても、エラーばっかり帰ってきて、変換中状態に入ってくれなくて大変だった。
これもInsertTextAtSelectionと同様に、パラメタをいろいろと入れ替えながら試行錯誤したんだけど、これに気づいてくれたのもClaudeさんだった。
公式マニュアルには、3つ目のパラメタはNULL(ゼロ)でいいよ、と書いてあるんだけど、どうやら、ここをNULLにしているとちゃんと動かないようで、ある特定の値(this)を与えてやると、ようやく正常に変換モードに入ってくれるようになった。
下線が出ない、何をしても出ない
普通にWindowsを使ってるとよみの入力中は、文字の下に波線が出るよね。
あれが、出てくれないとどの文字が読みとして有効なのかわからないので、すごく困る。
なので、なんとかして下線を出したいんだけど、これもまた出ない出ない。
最初は、Gem君もClaudeさんも「この値を指定すればデフォルトの表示形式で出るはず。だから下線がでるんだ!」と主張していたんだけど、やってもやっても出ない。
結局、こちらも標準的なデフォルトを信じず、自前ですべての属性を指定する方法、つまり「表示する時は波線だよ。フォントはそのままでいいからね。太文字とかも使わないよ。色も変えなくていい」みたいな条件をこまごまと指定するように組み込んだら、ようやく動いてくれた。
ま、ラクすることばっかりかんがえたらアカンよね、ってことらしい。
念願のv0.1が完成
この変換中表示ができる、下線がちゃんと見える、というところまできたらv0.1の完成ということにしようと思ってたので、ようやく安定して落ちないv0.1が完成した。
今後の計画
まず、v0.1系で、漢字以外、つまり、ひらがな、かたかな、英字(半角、全角)への変換を実装しようと思ってる。
v0.1 ゴール定義
目的:IMEとしての最小動作確認。入力イベントと Composition の骨格を作る段階。
IMEのON/OFFができること(Ctrl + Space)
KeyEventSink の最小限の動作
OnTestKeyDown
OnKeyDown
OnSetFocus
ひらがな変換・カタカナ変換は しない
変換キーは 存在しない
Composition の実装
インライン変換中表示の実装
確定キー(Return)による処理
変換中文字列を確定
Composition を破棄
v0.1.1 ゴール定義
目的:ローマ字→ひらがなの最低限の流し込み。
ひらがな変換マップの作成
変換中 Composition に、
アルファベット → ひらがな変換結果を与える
ひらがな確定キーの実装
カタカナ確定キーの実装
変換キーは 存在しない
v0.1.2 ゴール定義
目的:英字入力系の分離と整理。
(半角)英文字確定キーの実装
実入力されたアルファベットの内部記録が必要
そのため v0.1.1 では除外
全角英文字変換キーの実装
v0.1.3 ゴール定義
目的:カナ入力、英字入力の精密な定義
大文字と小文字の識別(CapsLockも含めて)
カナ変換時のウ゛の扱い、UNICODE定義されているカナの扱い
ワ行のい、えの扱い
てぃ、でぃ、じぇ、などの扱い
複数の記述方法のある文字の扱い
v0.1.4 ゴール定義
目的:編集機能の実装
ESCによるキャンセル処理
INSによる挿入モード(不要かも)
矢印キーによる挿入ポイント移動
マウスクリックによる挿入ポイント移動
SHIFT+矢印キーによる文節定義機能(不要かも)
TABキー、マウスクリックによるフォーカス移動
v0.1.5 ゴール定義
目的:環境ファイルへの情報保管
ファイル形式(iniかXMLかJSONかYAMLか)
ローマ字、かな変換ルールの見える化(ファイル保管)
カナ変換キー、英字変換キー、無変換キーの定義
フラグ類(今は未定)の定義
環境設定画面は実装しない
参考:v0.1.6 ゴール定義
目的:アイコンの登録
「ひともじ」アイコンの作成「ひ」
IME ON/OFFによるアイコン変更「A」、「漢」など。(ひともじアイコンとは別にする。MS-IMEと同様のIF)
変換モード変更によるアイコン変更(変換モードの変更が不要かも)
アイコン上での右クリック対応(設定ファイルのOpenなど)
ロードマップは今後も更新します。
続きはこちら
変なことやってるな、でも、ちょっと気になるな、って方は、是非スキ、フォローをお願いします。



コメント