おい!Gem君(Gemini)、お前もか!むしろ、Gさん(chatGPT)より悪質やぞ(笑)
前回、GeminiにIMEのボイラープレート(決まり切ったコード)を提供してもらったところ、「すんなり動作して嬉しい!」で終わったのですが、もちろん現実はそんなに甘くありませんでした。
あれ?有効にならんぞ?
IMEをの登録は全く問題なく動きました。
今までの苦労はなんだったんだ、というくらいあっけなくカンタンに。
もちろん、この時点では、IME(かな漢字変換処理)としての処理は何も入っていませんから、使ってみても、いつも通り文字入力できるだけです。本当に動いているかどうかはわかりません。
でも、動作を見るために、いくつかログ(動作中であることがわかるように特定の処理を通過したら、メッセージを出すこと)を仕込んでみたのですが、全くログがでてきません。
本来なら、DLL(かな漢字変換プログラム本体)がロードされたときに出るはずの一番最初のメッセージすら出てきません。
「いや、いくらなんでもこれはおかしい」
違和感はここから始まります。
うん?レジストリ登録されてないのでは?
Windowsには、様々な内部設定を保管する場所があり、これをレジストリと呼びます。
当然、筆者が作ったIMEの情報もここに保管されているはずです。
で、レジストリを見てみると、確かに一部は登録されているものの絶対に存在するはずの情報が見当たりません。
IMEに限らず、レジストリではアプリや情報を、GUIDという非常に長い番号で識別しています。
今回のIMEなら、こんな番号が使われています。
{86B8A5A1-9B5A-4B6E-A77E-6A2F2B1F7B12}
さんざん、探しても、この番号で登録されているべき情報はやはり、見つけられません。
でも、存在しないってのもまた、おかしな話なのです。ホントに存在しなければ、IMEの登録リストに出てくるはずがないのですよ。
というわけで、レジストリ内をうろうろしていると、妙なGUIDがあるのに気付きました。
{00000000-0000-0000-0000-000000000000}
これ、明らかにおかしな番号なんです。こんな番号は考えられません。
で、この情報の内容を見ると、筆者が作ろうとしたIMEの情報で間違いありません。
考えられるのは、Gem君(Gemini)に作ってもらったボイラープレートのバグによって、正しいIDが使われていない、というのが一番ありそうな話です。
おい!テキトーなコードを書くなよ!
改めてコードを確認すると、妙な定義を見つけました。
const GUID CLSID_HItomoji;
これはGUIDの定義なのですが、値が全く書かれていません。
こちらが期待している定義は例えば、次のようなものです。
const GUID CLSID_HItomoji = {
0x86b8a5a1, 0x9b5a, 0x4b6e, { 0xa7, 0x7e, 0x6a, 0x2f, 0x2b, 0x1f, 0x7b, 0x12 };
”=”の後が全て欠けています。これは、定義はしているものの、中味が未定義ということになり、結果的にゼロ扱いとなります。
そう、この空っぽの定義によって、上述の全てゼロのデータが作られてしまったんですね。
この定数の多重定義によるバグって、複数メンバで開発していると、たまに起きる事故なんです。
これってコンパイル(プログラムを実行可能な形式に変換)でもエラーにならず、見落とす場合も多いんですよ。
で、というわけで、疑問は一つ解消したのですが、フシギな点が残っています。一部のGUIDはレジストリ内で正しく定義されているんですよ。
この定義なら、必ずゼロになるはずなのに。
おい!これはアカンやろ!
不思議に思いながら、チェックを進めると、もう笑うしかないようなヒドいコードを発見。
std::wstring keyPath =
L"Software\Classes\CLSID\{86B8A5A1-9B5A-4B6E-A77E-6A2F2B1F7B12}";
プログラマなら、これ見たら吹き出すはず。
ジョークの解説するのってバカバカしいんだけど、要は、同じGUIDの定義を複数の箇所で、表記方法を変えてやっちゃってるってこと。
プログラマが絶対にやっちゃいけないことの筆頭にくるやつ。
なんでダメなのか?
同じ定義を複数箇所でやると、何らかの理由で値を変更したくなった時に、ものすごく高い確率で修正洩れが発生するから。
ましてや、上の例みたいに、GUID という単語すら出てこない定義だったら、もう絶対に気付かない。
というわけで、chatGPTが信用できない、でもGeminiだったらもうちょっと信頼してもいいかも、と考えた筆者のアサハカな考えは見事につぶされたのでした。
それでも、前に進んだのはGem君のおかげ
あんまりGem君を悪者にするのも悪いので、最後にちょっとヨイショしておく。
そうはいっても、生成してくれたコードはボイラープレート(決まりきった約束事の文言)としては非常に優秀で、複数のマシンでちゃんと登録ができるという当初の目的はキチンと達成できた。(GUIDの問題はさておき)
今回は、chatGPTとGeminiでそれぞれ得意な点があるんだね、ということを知ったのは収獲だった。
(おしまい)
続きはこちら。
ようやっと、安定して動作するようになってきた、自作の日本語IME。
相変わらずの、でこぼこ珍道中ですが、変なことやってるな、これは面白い、と思う方は是非「スキ」「フォロー」をください。
この開発ストーリーの詳細は、以下のマガジンをごらんください。



コメント