自己流SKK辞書環境2

作りたいSKK辞書環境

  • uim-skkを使う
  • Dropbox経由で全マシンで辞書の同期を行う

問題となるのは、uim-skkが複数辞書をサポートしない点と、自分が作成したユーザ辞書しか書き込みしようとしない点である。

複数辞書をサポートしない問題は、skkサーバを使って解決が可能である。skkサーバは別に何でも良い訳だが、今回はUbuntuでapt-getできるskksearchを使う。

ユーザ辞書の問題は、別ファイルに書き出して、そのファイルを同期に掛ければ解決する。この書き出したファイルは、skkサーバが読み込む為にも用いる。

skksearchの設定

以下のパッケージをインストール。毎度の事ながらUbuntu限定かもしれない。

  • skksearch
  • skkdic-cdb
  • skkdic-extra(必要に応じて)
  • openbsd-inetd(自動でインストールされるとは思うが念の為)

設定ファイルは/etc/skksearch.confにある。設定方法は読めば分かる筈。extraをインストールしてあれば、コメントアウトを外すだけで、ポイポイ辞書を追加できる。

補足 ーlogについてー

1つでも辞書の名前間違ったりすると、それだけでskksearchは起動しなかったりする。しかもsyslogでは原因がイマイチ分からない。

もしきちんとしたlogを取りたい場合は、inetdの起動設定で、skksearchに引数-fでlogファイルを指定すると良い。logファイルの位置に合わせてユーザを変更することも忘れないように。私は自分を実行権限にしてホームディレクトリにlogを置いた。

uim-skkの辞書をマージする

ホームディレクトリにある.skk-jisyoと、.skk-uim-jisyoの2つが、uimが使用する辞書である。(設定如何では変化するが)

従ってこの2つをマージしてDropboxに置く。私はこんな感じのスクリプトを書いてる。

temp=TEMP
dic_home=$HOME/Dropbox/dic
dic_l=/usr/share/skk/SKK-JISYO.L
dic_del=$dic_home/DELETE

skkdic-expr2 $HOME/.skk-jisyo + $HOME/.skk-uim-jisyo + $dic_home/${HOSTNAME} - $dic_l $dic_del > $temp
mv $temp $dic_home/${HOSTNAME}

このスクリプトをcronで1日1回実行している。

辞書同期の解説

まず、統合する辞書はHOSTNAMEにしている。全てのマシンで単一のファイルを編集するのも手だが、Dropboxだとコンフリクトが発生しやすいので、別々に分けるべきである。後述するが、それでもコンフリクトが発生するので、その対処は行う。

このHOSTNAMEの辞書を先程のskksearch.confに追加する。

dic_delという辞書は、辞書の単語を削除する為に使う。削除したい単語はここに含める。こうしないと他のマシンで削除した単語が、次回同期で復活するという事態が発生するからである。こちらは手動で行うことを前提としていて、特にシステムは組んでいない。

マシン毎の辞書を統合する

さて、ここまでできたら、必要に応じて辞書統合を行う。

私の場合、skkimeの辞書も統合する必要があり、手間が加速度的に増える。前述したが、コイツはUTF-16だからである。ただ、skkimeは辞書の処理が柔軟なので、辞書サーバは特に必要なく、HOSTNAMEのファイルを.dic付けて処理すればいい。

これら全てのファイルを統合するシェルスクリプトを書いてみた。大分前から保守している奴であるが、一応載せておく。

dic_home=$HOME/Dropbox/dic
dic_l=/usr/share/skk/SKK-JISYO.L
dic_del=$dic_home/DELETE
linux_dic=( $dic_home/DieuPater $dic_home/andromeda
    $dic_home/Nereid $dic_home/Uranus $dic_home/Mars
    $dic_home/Eros )
win_dic=( $dic_home/Jupiter.dic $dic_home/Neptune.dic
    $dic_home/Saturn.dic )
temp=$HOME/TEMP
temp2=$HOME/TEMP2
backup_dir=$dic_home/back

# 辞書を結合
touch $temp
for f in ${linux_dic[@]}
do
    f=${f}*
    cat $f >> $temp
    echo $temp + $f
done
for f in ${win_dic[@]}
do
    iconv -f UTF-16 -t EUC-JP $f > $temp2
    cat $temp2 >> $temp
    echo $temp + $f
done

# L辞書の内容を削除
skkdic-expr2 $temp - $dic_l - $dic_del > $temp2
echo $temp - $dic_l - $dic_del to $temp2

# tempにtemp2のUTF-16版をコピー
iconv -f EUC-JP -t UTF-16 $temp2 > $temp

# 統合した辞書をバックアップ
cp $temp2 $backup_dir/`date '+%j'`
echo copy from $temp2 to $backup_dir/`date '+%j'`

# 結合した辞書で上書き
for f in ${linux_dic[@]}
do
    cp $temp2 $f
done
for f in ${win_dic[@]}
do
    cp $temp $f
done

# Finalize
rm -rf $temp $temp2
rm ${dic_home}/*.lock ${dic_home}/*conflicted*

…まあそんなに汚なくない(と本人は思っている)ので、読めないことは無い…と思いたい。