見出し画像

変換中表示ができた!

この数日、時間をみつけては、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など)

ロードマップは今後も更新します。

続きはこちら

変なことやってるな、でも、ちょっと気になるな、って方は、是非スキ、フォローをお願いします。



いいなと思ったら応援しよう!

ピックアップされています

私は“文字”を選びたい──風というIMEを語る」

  • 29本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
変換中表示ができた!|えがおIT研究所
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1