f

アーカイブ

2015-08-28

Google日本語入力(Mozc)のIME設定をWindows・Linux・Androidで同期

Google日本語入力(LinuxはMozc。以下ではmozcと表記)でWindowsとLinuxでIMEの設定を同期する。

mozcのIME設定ファイル

複数のPC・OSを使っていてIMEの設定(特にユーザー辞書)を共有したかった。ユーザー辞書には例えば、以下のような単語を登録をしている。

  • 「よろ」→「よろしくお願いいたします。」
  • 「2」→「²」

これが使えれば日常での文章作成が早くなる。

mozcには標準でユーザー辞書をインポート・エクスポートする機能がある。今まではこの機能で辞書ごとにテキストファイルに出力して更新のたびに各端末の辞書を手動で更新していた。しかし,わずかな変更に対しても全端末のユーザー辞書を手動で更新するのはかなり面倒だった。これを回避するには,IMEの設定をまるごと自動で同期する必要があった。

mozcはOSごとに1のディレクトリに設定ファイルが格納されている。この設定ディレクトリをまるごとDropboxなどで共有して,元の場所にシンボリックリンクを貼ることで複数端末でIMEの設定を共有できる。

mozcの設定ファイルの格納ディレクトリ
OS 場所
Linux $HOME/.mozc/
Windows %USERPROFILE%\AppData\LocalLow\Google\Google Japanese Input\
Android /data/data/com.google.android.inputmethod.japanese/.mozc/

mozcの設定ファイルの格納ディレクトリには2に示す設定ファイルが存在する。これらのファイルを同期すれば項目を絞って同期することも可能となる。ユーザー辞書が格納されているuser_dictionary.dbは特に重要度が高い。

mozcの設定ファイル
ファイル名 説明
boundary.db
cform.db
config1.db [Mozc Tool]の[Configuration Tool]で設定できるキーマップや記号類の既定の変換などの基本設定。
segment.db
user_dictionary.db ユーザー辞書。

設定ファイルの格納ディレクトリにquery_of_death.logという12 MBほどのファイルがあったが,このファイルは削除しても大丈夫だった。上記の設定ファイル群についてはGoogleのフォーラムで以下の言及があり判明した。

  • boundary.db
  • cform.db
  • config1.db
  • segment.db
  • user_dictionary.db


の各ファイルをコピーすれば,学習結果,ユーザ辞書,半角・全角の学習結果は移行されます。ただし,変換エンジンが動作してる時に,コピーす ることを想定していないので,コピーする前に変換エンジンのプロセス (GoogleJaIMEConverter.exe) を終了しておく必要があります。(タスクマネージャからプロセスを終了してください)

Google日本語入力のオフィシャルな移行について - Google プロダクト フォーラム

mozcのIME設定の同期手順

上記コメントにもあるようにIMEの設定の共有は以下の手順で行う。

  1. 共有化したい大元とする端末で作業を開始。
  2. Mozc(Google日本語入力)のプロセスを終了。
    • Linuxの場合,fcitxmozc_serverを終了させる。
      killall fcitx mozc_server
    • Windowsの場合,GoogleIMEJa*を終了させる。
      taskkill /f /im GoogleIMEJa*
  3. mozcの設定ファイルの格納ディレクトリをDropboxなどに移動。
  4. 元あった場所に3.で移動させたディレクトリへのシンボリックリンクを貼る(Windowsではディレクトリではなく,その下の階層ファ イルに直接リンクを貼る。後述)。
  5. mozcを起動する。

    Linuxの場合,fcitxコマンドで起動できる。Windowsでは変換キーなどでIMEを使おうとすると自動で起動する模様。

  6. 同期させたい全端末で1-5まで実行(3.は移動させる代わりに削除でOK)。

なお,Google日本語入力(Windows,Android)とMozc(Linux)は共通の設定ファイルが使えるとのことなので,上記の手順によりWindows,Android,Linuxの複数OSでIMEの設定を共有できるようだ。Androidに関しては未確認なのでいずれ試してみたい。

参考:

やっぱり同期の通信が気になるので,必要な以下2ファイルだけを個別にシンボリックリンクで同期する。

  • user_dictionary.db
  • config1.db

Windowsでのエラー「変換エンジンプログラムの起動に失敗しました。」

前述の手順でLinuxの.mozcを共有して,WindowsのGoogle日本語入力の設定ディレクトリである%USERPROFILE%\AppData\LocalLow\Google\Google Japanese Inputに.mozcへのシンボリックリンクを作成した。Google日本語入力を起動すると日本語に切り替えるときに以下のエラーが出てしまった。

Google日本語入力エラー
変換エンジンプログラムの起動に失敗しました。新しいGoogle日本語入力を利用するためにコンピュータを再起動してください。

この現象は例えば以下の記事でも報告されている。

共有しようとしている,user_dictionary.dbconfig1.dbが Google日本語入力とmozcとで互換性がないのかもしれないと思ったが問題なかった。試行錯誤の末,以下の結論にたどり着いた。

Google日本語入力は設定ディレクトリがシンボリックリンクだと正常に動作しない。

したがって,Google日本語入力については,ディレクトリをシンボリックリンクでまるごと共有するのではなく,中の個別の設定ファイルに直接シンボリックリンクを貼ることで設定を共有する。Windowsだけ手順を変える必要があるのでやっかいだがこれで解決する。

設定ファイルの同期スクリプト

以下2016-04-17追記

以前からわかっていたが,記事に追記していなかった事項があったので記載する。

上記ツイートで言及しているように,設定ファイルに個別にリンクを貼っても,IMEの設定を更新したら強制的に単一ファイルで上書きされてしまい,リンクが解除されてしまう。この現象はWindowsでも,Linuxで発生した。したがって,同期を継続するにはIME設定を更新した環境(OS)では,設定ファイルを共有ディレクトリにもコピーしてリンクを貼り直す必要がある。

手作業でやってもいいが,面倒くさいのでスクリプトを作った。

Windows版:

REM \file      relink_mozc.bat
REM \author    SENOO, Ken
REM \copyright CC0
REM \date      first created date: 2016-04-17T12:58+09:00
REM \date      last  updated date: 2016-04-17T14:46+09:00
REM \brief     Google日本語入力のIME設定を更新後,共有ディレクトリに更新された設定ファイルをコピーしてリンクを貼り直す。
REM 使い方
REM 共有したいファイルを FILE 変数に空白区切りで記入する。
REM Dropboxなどで共有しているディレクトリにこのバッチファイルを配置して実行する。
REM 共有ディレクトリと同じ場所にこのバッチファイルを配置したくなければ,SHARE_DIR 変数に共有ディレクトリの場所を指定する。
REM 管理者権限が不要で済むように,シンボリックではなくハードリンクを使っている。

SETLOCAL
SET FILE=config1.db user_dictionary.db
SET OS_DIR=%USERPROFILE%\AppData\LocalLow\Google\Google Japanese Input
SET SHARE_DIR=.

FOR %%F IN (%FILE%) DO (
  ROBOCOPY /xo "%OS_DIR%" "%SHARE_DIR%" "%%F"
  DEL "%OS_DIR%\%%F"
  MKLINK /H "%OS_DIR%\%%F" "%SHARE_DIR%\%%F"
)
ENDLOCAL

Linux版:

#!/bin/bash
# \file      relink_mozc.sh
# \author    SENOO, Ken
# \copyright CC0
# \date      first created date: 2016-04-17T14:35+09:00
# \date      last  updated date: 2016-04-17T16:13+09:00
# \brief     mozcのIME設定を更新後,共有ディレクトリに更新された設定ファイルをコピーしてリンクを貼り直す。
# 共有したいファイルを FILE 変数に空白区切りで記入する。
# Dropboxなどで共有しているディレクトリにこのスクリプトを配置して実行する。
# 共有ディレクトリと同じ場所にこのスクリプトを配置したくなければ,SHARE_DIR 変数に共有ディレクトリの場所を指定する
# CygwinなどWindowsでの動作も考慮して,管理者権限が不要なハードリンクを使用。

FILE="config1.db user_dictionary.db"
OS_DIR=~/.mozc
SHARE_DIR=.

for f in ${FILE};
do
  rsync -a --include "$f" --exclude "*" "${OS_DIR}/" "${SHARE_DIR}/"
  rm "${OS_DIR}/$f"
  ln -f "${SHARE_DIR}/$f" "${OS_DIR}/"
done

OSに応じて,上記のスクリプト(relink_IME.{sh,bat})をIMEの設定を同期させている共有ディレクトリに配置して,実行すればよい。同じディレクトリに配置するのが嫌であれば,SHARE_DIR変数に共有ディレクトリのパスを記入して実行する。rsyncrobocopyコマンドで更新されたファイルだけをコピーしてリンクを貼り直すようにしている。既定ではconfig1.dbuser_dictionary.dbのみ同期するようにしている。FILE変数の値を変更して,必要に応じて変更してほしい。

Linux版だけであれば,ディレクトリごと共有することで問題は解決する。しかし,Windows版とも共有することを考えるとこうせざるを得ない…。

ただ,やはり毎回更新するのは面倒なので何かいい方法があれば教えてほしい。

反響

@traji222さんの以下のツイートをきっかけにして,追記しないといけないなと思って追記した。

以前にも,この記事に対してツイートしてくれた人がいた。2回目なのでそれなりに需要のあるテーマなのだろうと思い,せっかくなので上書きして再リンクするスクリプトも作った。

@traji222さんのブログでは画像付きで設定の共有方法が書かれており,わかりやすいので参考にしてもいいかもしれない。

プチつぶやき なんだかなぁ : Google日本語入力 ユーザー辞書とかDropboxで同期できた!

2 件のコメント:

  1. おかげ様で、Google日本語入力のWindows版で、同期ができるようになり、
    とてもスッキリしました。
    リンク貼り直しのBatも、さっそくDropboxに配置し実行してみました。
    これで、毎回の更新が楽にできます。
    本当にありがとうございました。

    返信削除
    返信
    1. コメントありがとうございます。
      お役に立てたようで,頑張ってスクリプト書いたかいがありました。

      また何かあればコメントお願いします。

      削除