Google日本語入力チームでは、割と初期に関わって細々としたことを色々やってきたのだけど、今回はそのうちの機能の一つの思い出を思い出したので書いておこうと思う。

2009年くらいのことだったかと思うが、今はなきGoogle Labsの一部だったか何かで「ブラウザの中でGoogle日本語入力を使って入力する」という機能を作って出したということがあった。変換エンジン自体はサーバサイドで動いていてひらがな列から変換候補を返すというようなAPIを作り、ブラウザ側ではキー入力に応じてローマ字かな変換をした上でこのAPIを叩いて日本語入力・変換UIを作るというようなものだった。このアーキテクチャはMozc / Google日本語入力の基本的なアーキテクチャとは根本的に異なるが(Google日本語入力では、変換エンジンはキーイベントを受け取ってローマ字変換も含めたロジックを全てプラットフォーム共通の変換エンジン側に持つ)、ブラウザ内での動作ということなどからして、少なくとも当時としてはこの方が当然というような構成だったと言えるだろう。変換API自体も外部から叩けるようにしていたと記憶している。

ちなみに、この機能自体は細々と存在しているし、実はGoogle製品、例えばGmailやGoogle Docsといった製品でもブラウザ内で日本語を含む様々な言語での変換・入力を行うという機能が組み込まれている。私が関わったのはだいぶ昔のことなので現代の構成にどれぐらいの痕跡が残されているかは定かではないというか多分もう全然違う何かではないかと思うけれど、少なくともその源流となる何かを作ったのは私である(もちろん私だけじゃないです、一応念のため)。海外旅行中とかみたいな、日本語入力環境のないパソコンで日本語入力をどうしてもやりたいみたいな時はこの機能を使うと最低限の入力ができるので今度機会があったら使ってみてください。

さて話は変わるけれど、Mozc / Google日本語入力には特定の入力パターンに対して動作する特殊なロジック・変換というものが存在している。内部的には rewriter と呼ばれている。例えば「ばーじょん」と入力して変換すると、その時のMozc / Google日本語入力の変換エンジンのソフトウェアバージョンが変換候補として出てくるようになっている。この機能はGoogle日本語入力が外部に公開されるより前からあった機能だったはず。というのも、社内で誤変換や微妙な変換候補をフィードバックとして募りたいわけだけど、どのバージョンで起きた問題かがわからないとフィードバックとしてもあまり意味がない。でもソフトウェアのバージョンを探してコピペするというのは面倒なものだし、どうやって探すかみたいなドキュメントを整備するのも大変だ。でもこの機能があれば、フィードバックの時に「バージョンと入力してその結果を書いてください」としておけばそれで済む。

他にも例えば、算用数字から漢数字への変換を行う数値変換rewriterとか、数値+年から年号を変換する(「1467年」から「応仁元年」を変換できるなど)みたいな年号rewriterとか、「今日」「明日」「昨日」みたいなものから具体的な日付を変換候補に出したり、「今」などから現在時刻を変換候補に出せる日付・時刻rewriterとか、そういうものが色々用意されている。私も数値変換とかの最初のバージョンを作ったりした。

ここからが本題。「ブラウザ内日本語入力」を外部に公開してやれやれと肩の荷を下ろした気分でいたある日、ふとこのrewriterのことを思い出した。で「今」をブラウザ内で変換してみると……時刻が表示される(当たり前だが)。でもそれは変換エンジンが動作しているサーバでの現在時刻であって、日本時間の時刻じゃない。つまり全然間違った変な時刻が表示されている!

困った。ここには3つの問題があった。第一に、日本語入力というものを行う人はほとんど日本からのアクセスだと思うけれど、間違った時刻が表示されてしまうという問題である。これは普通に誤変換の一種でなんとかした方がいい。第二に、サーバ内のソフトウェアがどんなタイムゾーンで動作しているか、という本来は公開されていない情報がうっかり公開されてしまっているという問題である。これは別に大問題ということはないだろうけど、しなくていいものは公開されない方がいい。第三に、変換候補はキャッシュされたりしうるので、へんな時刻がどこかで覚えられるとその時刻のまま更新されなくなってしまうという問題である。

どうしたもんだろうか?(ちなみに当時のブラウザJSにはタイムゾーン関係のAPIとか全然なかったように思うので、タイムゾーン情報を送ってサーバ側で適切に処理する、みたいなことは不可能であったはず)例えば、変換結果には特殊な結果(例えば @now とかみたいな)を入れておき、それを現在時刻に変換するロジックをJSでかく、みたいなことが考えられなくもない。このアプローチは(サーバとクライアントに分かれているわけではないが)SKKという入力エンジンではそういうようなことが実現されている。でもこれすると副次的に「通常の変換結果として偶然にそのパターンが出てきたらどうするか」みたいな問題も考えないといけないし、既存のrewriterの実装もサーバ用に書き直さないといけないし、JSを書き直すのも一苦労である。

私はもっと単純な方法を取ることにした。単純に日付など時と場合によって変換結果が変わるようなrewriterは機能を省くことにしたのである。ifdefか何かを足して、APIサーバとして動作する時には使われないようにした。もちろん数値変換とかみたいに便利な機能はキープしたいけれど、時刻とかみたいな別になくてもいい機能については選択的に省くことにした。

今、オープンソースとして公開されている Mozc の rewriter.cc をみても、 MOZC_DATE_REWRITER が変な場所に定義されていてオフしやすそうになっている。これは多分当時の名残で、内部的には条件的にオフできるようになっていたりするからなんじゃないだろうか。すぐ近くに出てくる「FORTUNE_REWRITER」も「おみくじ」で今日の運勢(大吉とか)が出てくるという隠し機能で、同じような理由でAPIサーバからは省いたのだと思う。

そういうわけで「うっかりサーバが動作しているタイムゾーンが外部からわかるようになってしまっていた」という話でした。