2012年やったこと - Mozc 編

いままで仕事で書いたコード (Chromium とか Mozc とか) については基本的に言及しないようにしていたんですが,ソースコードが公開されている内容についてはまあいいかということでまとめてみます (もちろんソースコードが公開されていないことについても色々やってますが).とりあえず Mozc 編*1.順序は概ね時系列.

Visual C++ 2010 対応

ちまちまとコンパイルエラーに対処.ビルドスクリプトを vcbuild に加えて msbuild にも対応させたぐらい.あとは gyp にも問題を見つけたので一件パッチを upstream.

1.3.975.10x にてリリース.

SHOW_INFOLIST_IMMEDIATELY compatibility flag

Windows 環境でのバグ.
Meadow 3.0 や NTEmacs 22 で Mozc を利用していると,用例ウィンドウが表示されないというバグ.Mozc 開発チーム内で発見されて回ってきたもの.
これの原因がなんというか脱力系.もともと用例ウィンドウは「最後の UI 更新から 500 ミリ秒経って何のアクションも起きていなければ表示する」というロジックで動いていた.ところが,Meadow 3.0 や NTEmacs 22 はポーリングを行っていて,より短い間隔で IME の UI 更新通知を送ってくる (実際には更新する必要がないケースでも).これをトリガーとして候補ウィンドウの再レイアウトが行われるため,永遠に「最後の UI 更新から 500 ミリ秒経過」という条件が成立しない.
これらのアプリケーションではディレイなしに用例ウィンドウを表示するようにして対処.

1.3.975.102 にてリリース.

「半角空白を入力」が動作しないバグの修正

たまには変換エンジン側のバグも直してみようキャンペーン第一弾.
カスタムキーマップにて「半角空白を入力」「全角空白を入力」というコマンドが選択可能であるにも関わらず,特定条件でうまく動作しないという問題,の修正.

1.4.1003.10x にてリリース.

キャンセル後 IME を無効化

たまには変換エンジン側のバグも直してみようキャンペーン第二弾.
ATOK と MS-IME のデフォルト設定の違いのひとつに,IME をオフにしたときに未確定の入力文字列を確定させるかそれともキャンセルさせるか,というものがある (MS-IME では確定,ATOK の ATOK キーマップではキャンセルさせるのがデフォルト).
これまでのバージョンの Mozc では MS-IME にあわせて確定させていたのだけど,やっぱり ATOK スタイルが良いという人もいる.そういう人のためにカスタマイズの幅を増やしてみたという変更.
といっても,これ以上コンフィグオプションを増やしたくはないよねということで,「キャンセル後 IME を無効化」というキーコマンド側を追加することで対処してみた.この方法だと,ATOK キー設定に自然に対応させられるのもよし.

ATOK (キーマップ) 派の人向けに実装しただけのつもりが,なぜか vim 方面の人に受けるという不思議な経験もした.

バージョン 1.4.1003.10x にてリリース.

サロゲートペア対応

クライアント側と変換エンジン側両方の修正.
Windows クライアントに関しては,実際サロゲートペア対応をサボっていたのでその対応を粛々と.再変換とか確定取り消し周りが地味にめんどくさかった.
変換エンジン側は,UTF-8 を UCS2 に変換して処理している箇所がいくつか残っていたのでその残党狩り.
この変更のおかげで,後の Unicode 絵文字対応がそこそこ楽になる.
バージョン 1.4.1003.10x にてリリース.

Mozc Issue 14

uim-mozc の開発者の人からのレポートで,Protocol Buffers のライブラリと動的リンクしていると,起動時にエラーになるので静的リンクに変更して欲しい,というもの.レポートから 1 年半以上放置されていたので見かねて修正.
ちなみに Debian/Ubuntu/Fedora/Vineはこの辺まるっと無視して今も動的リンクしていたはず.ほんと静的リンク嫌いますよね……

1.4.1003.10x にてリリース.

GCC 4.7 環境での warning つぶし

Linux 向け修正.
タイトル通り.
1.4.1003.10x にてリリース.

ibus_engine_delete_surrounding_text 対応

Linux の IBus 環境向け変更.IBus の比較的新しい API である ibus_engine_delete_surrounding_text を使用して,確定取り消し・再変換を実装するというもの.これ以前は Windows のようにバックスペースキーイベントを送っていた.
ちょうど Firefox 側に関連バグが登録されていたのだけど,Mozc 側の問題ということで対処できた感じになる.

1.4.1003.10x にてリリース.

gtest なしでのビルドのサポート

openSUSE のパッケージで,Mozc が gtest に依存するのを独自パッチをあててまで回避しているっぽかったので,そういうことをしなくて良いように上流側で対処してみた,というもの.
1.4.1033.10x にてリリース.

compiler_specific.h 導入

コンパイラ依存コードの便利マクロ集.Chromium の同名のファイルにインスパイアされたもの.この頃から Clang 対応を考え始める.

1.5.1053.10x にてリリース

cURL 依存の排除

Linux 向け変更.
OSS Mozc ではネットワーク機能を一切有効にしていないにもかかわらず,ビルドに cURL が必要という状態だったので,cURL なしでビルドできるようにしたというもの.
1.5.1053.10x にてリリース

QTBUG-25536 対策

Qt QString::toUcs4() がサロゲートペア領域の文字に対してうまく動かない,という問題に対する Mozc 側のワークアラウンド.

const uint kData[] = { 0x10000 };
QString test = QString::fromUcs4(kData, 1);
const QVector<uint> ucs4s = test.toUcs4();
if (ucs4s.size() == 1) {
    qDebug() << "correct";
} else {
    qDebug() << "wrong";
}

このコード,最新の Qt 5.0.0 でも正しく動かない.ので,Mozc から QString::toUcs4() の呼び出しを削除する方向で対処.

1.5.1053.10x にてリリース

X11 Selection monitor

Linux 向け.
ibus-mozc が GtkTextView でしか再変換ができなかったのを,もうちょっと対応環境を増やした,という変更.
諸悪の根源は,Gtk IM Module の get_surrounding_text がしょぼいことである.この API,カーソル周辺文字列 + カーソル位置しか取得できない.アンカー位置が取得できないため,現在選択されているテキストというのが分からない状態で再変換を実装しなければならない.
今回とった workaround は,xcb-xfixes を利用して,X11 のセレクションイベントをモニターするというもの.セレクションイベント経由で現在選択されているテキストを記録しておいて,get_surrounding_text で取得された周辺文字列 + カーソル位置と比較し,矛盾がないように選択領域を再構築する.
xcb とかはじめて使ったのでなかなかにおもしろかった.

あと,このコードを書いているときに Linux 版 Firefox にサロゲートペア絡みのバグを見つけたので,Bugzilla に報告したところ,Mozilla Japan の中野さんに直して頂けました.感謝.

1.6.1187.102 にてリリース.

Mac OS X Lion でのビルド対応

対応したつもりになって 1 年近く放置してしまったバグの対処.

1.6.1187.102 にてリリース.

scim-mozc is removed

予告通り scim-mozc をリポジトリから削除.
直接の原因は内部のメンテナの不在.
まあ今更 SCIM もないでしょう.(Tizen を除く)

1.6.1187.102 にてリリース.

Debian-specific files are removed

Mozc のリポジトリに存在する Debian パッケージ定義ファイルがメンテナンスされていないので削除した,というもの.
ちょうど Debian 本家でメンテナンスされているパッケージ定義ファイルとの乖離が激しくなってきたところだったというのも理由のひとつ.

1.6.1187.102 にてリリース.

IBus 1.4.1 未満のサポート停止

IBUS_CHECK_VERSION マクロがあちこちに散らばっていたので,一カ所にまとめた上,旧バージョンのサポートと停止.だいぶコードが綺麗になる.

1.6.1187.102 にてリリース.

Clang 対応開始

Clang revision 159409 を使用して発生する warning を全て解消 (または suppress).
1.6.1187.102 にてリリース.

Visual C++ 2012 対応

ちなちまとコンパイルエラーに対処.
1.6.1187.102 にてリリース.

#include <Windows.h> 撲滅運動

実に多くのヘッダファイルが不必要に #include <Windows.h> していることに気付きあちこち改良した,というもの.logging.h が <Windows.h> に依存するとかどうかと思う.

これでビルドがちょっとは速くなってくれるといいなぁと思いつつやったものの,目立っては高速化しなかった.残念.
1.6.1187.102 にてリリース.

Ack-less IPC

Windows の IPC レイヤの改善.いままでの IPC クライアントは,
1. メッセージ送信
2. 応答受信
3. Ack 送信
という手順を踏んでいたのを,3. でいきなり名前付きパイプを切断するように変更.切断イベントはどちらにしろサーバ側で検知可能なので,これを Ack イベントの代用とする.
実際これでレイテンシが数パーセント減ったのだから儲けものである.

1.6.1187.102 にてリリース.

StringPiece の移植

Mozc の portable library に StringPiece がないのが気になっていたので,えいやっと用意した一品.StringPiece については hamaji さんの解説記事 とか参照のこと.

1.6.1187.102 にてリリース.

テンキーにあるコンマに対応

Apple 日本語キーボードのテンキーには,ピリオドキーだけでなくコンマキーもあるのですが,これに対応できていなかったという問題の修正.
Mac では kVK_JIS_KeypadComma を使えば良いのですが,困ったのが Windows.
なんと Brazilian キーボードにはテンキーにコンマがあるらしく,その仮想キーコードは VK_ABNT_C2 (0xC2) とのこと.実際,Apple 日本語キーボードを Windows 7 につなげてテンキーのコンマを押してもこの仮想キーコードが返ってきました.互換性への執念恐るべし.
https://code.google.com/p/mozc/source/browse/trunk/src/win32/ime/ime_keyevent_handler.cc?r=124#253

  // The numpad comma on the Apple Japanese 109 keyboard is somehow mapped into
  // VK_ABNT_C2, which is only defined in kbd.h.
  // See also http://blogs.msdn.com/b/michkap/archive/2006/10/07/799605.aspx
  // See also b/6639635.
  KeyEvent::COMMA,                // 0xC2: VK_ABNT_C2

1.6.1187.102 にてリリース.


2012年他にやったこと - Mozc 編 - NyaRuRuが地球にいたころに続く.


Chromium に関しては 2012年やったこと - Chromium 編 - NyaRuRuが地球にいたころ に続く.

*1:ここでは OSS Mozc に限らず,いわゆる code-name Mozc についての活動