- Fedota 44 で mozc-ut 辞書を使いたい…というのを,色々 generative AI にも尋ねたりしながらやってどうやらうまく動作しているので,そのメモ.
- Mozc UT dictionaries は,mozc に組み込む追加辞書で,arch wiki で Use of the UT dictionary is optional but highly recommended. と言及されている.
- 一旦公開が停止された後 (cf: Mozcdic-UT (Mozc-UT)が終わった話と、代替品を開発してる話),各種辞書をバンドルするツール merge-ut-dictionaries の形を取って,それを各自が実行する前提での配布に切り替わって継続されているようだ.ありがたいかぎりである.みなさんありがたいとおもったら Star つけましょうね
- 上記記事をかいた方は reasonset/mozcdict-ext として「 現在はMozc-UTとは異なるアプローチによって、より快適な変換環境を構築することを目指している」とのことで,ウェブサイト上にも関連記事がアップされているが,今回はとりあえず UT を使ってみることにする.
merge-ut-dictionariesの README を読む限りは,git cloneしてsrc/merge/make.shを編集して使いたい辞書を決め,sh make.shでビルドした結果物を,mozc-master/src/data/dictionary_oss/dictionary00.txtに append して mozc をビルドすればいい…という感じ.- しかし,fcitx と一緒に動かすときに設定要るのか…?みたいなのを含め,なるべく RPM の仕組みに乗っかる方向になった.
- 方針は,Fedora の
fcitx5-mozcのパッケージのソースを取ってきて,ビルド時に上記のmerge-ut-dictionariesを追記する処理を足して,新たなバージョンとして RPM パッケージを作り,これをインストールしたうえで,dnfでバージョンを固定するというもの.これがベストかはわからないが,やっていることはまあまあわかりやすい.
前座
mozc の辞書の構造
- mozc/src/data/dictionarry_oss の README あたりにちょっと仕組みが載っているが,ドキュメントが乏しい
- …ような気がするんだけど,関連文献を読むと要するに,ビルド時に組み込まれる(「システム辞書」の用例が多そう)のと,ユーザ辞書として登録できるのが,あって,前者はコストとかを与えることができるっぽい.
- ので,今回「mozc-ut を使いたい」というのは,要するに「UT辞書を含めて mozc を再ビルドして,そいつを fcitx で使いたい」となる
- fcitx5 との食い合わせのことを考えるのがむずかしそう,というのと,LLM がそちらの方向をガイドしやすそうだったので,「Fedora でパッケージングされた mozc に追加してビルド」というルートを取ることになった.
パッケージとしては fcitx5-mozc があれば mozc は不要
- Fedora の fcitx5-mozc は自称
mozcの wrapper ではあるが,じつは mozcには別に依存していない fcitx5,fcitx5-data,fcitx5-libs,glibc,hicolor-icon-theme,libgcc,libstdc++,qt5-qtbase,qt5-qtbase-guiが依存- なので,システム辞書を追加したい場合は,
mozcを無視してfcitx5-mozcをいじることでなんとかなりそうだ - 実際,
/usr/libexec/fcitx5-mozc/mozc_serverはこいつ由来で,普通に mozc が動いているときに稼働しているのもこいつだ ($ ps aux | grep mozc).
工程
普段使わない必要パッケージは, fedora で rpm をいじる系統のパッケージで,多分 fedpkg と mock で入る.
辞書ファイルの生成
以下2つのディレクトリで主に作業をする
export UT_DIR=~/src/mozc-ut/merge-ut-dictionaries export MOZC_DIR=~/src/rpms/fcitx5-mozc
UT 辞書の準備はほぼ READMEにある下記の説明通り.https://github.com/utuhiro78/merge-ut-dictionaries を clone して上記の場所に置いて,
cd src/merge/ sh make.sh # 必要なら編集して有効化したい辞書を選ぶ # これは別のステップでやる # cat mozcdic-ut.txt >> ../../../mozc-master/src/data/dictionary_oss/dictionary00.txt
mozcdic-ut.txt が生成されるのを確認して,mozc 側の準備に移る.
mozc のビルドの準備
rpm のパッケージとしての fcitx5-mozc のソースは https://src.fedoraproject.org/rpms/fcitx5-mozc.git からclone でき, git checkout f44 で Fedora 44 のブランチになる.
今回は改変するので,ut/f44 みたいなブランチを切っておくとよいと思われる.
これで clone されるのはこんなディレクトリだ.このあとの作業は全部ここでやる
$ tree $MOZC_DIR
/home/me/src/rpms/fcitx5-mozc/
├── 0001-use-system-absl.patch
├── changelog
├── fcitx5-mozc.spec
├── mozc-abseil-cpp-20240116-includes.patch
├── mozc-build-new-abseil.patch
├── mozc-build-verbosely.patch
├── README.md
└── sources
大事なのは fcitx5-mozc.spec で,例えば以下のような行がある
# main source Source0: %{forgesource0} Source1: %{forgesource1} %if %{with bundle_protobuf} # protobuf Source2: %{forgesource2} %endif # 中略... # Public Domain Source5: http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip Source6: http://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip # add -v to ninja command, to make verbose output during building Patch0: mozc-build-verbosely.patch # only applied if the bundle_abslcpp bcond is false Patch1: 0001-use-system-absl.patch BuildRequires: python3-devel BuildRequires: gettext BuildRequires: gtk2-devel # ...
以下が %prep というソースの準備を司るところの抜粋で,辞書への追記がこんな感じで行われていそうと読める
%prep %setup -q -n %{archivename0} -a 5 -a 6 rm -rf src/third_party/* # (...) (cd src/data/dictionary_oss; PYTHONPATH="${PYTHONPATH}:../../" python3 ../../dictionary/gen_zip_code_seed.py \ --zip_code=../../../KEN_ALL.CSV --jigyosyo=../../../JIGYOSYO.CSV >> dictionary09.txt; )
というわけで,以下のように編集をする.
1. 辞書ファイルのコピーと,それを source として追加
さっき作った mozcdic-ut.txt を,.spec のあるディレクトリにコピーして,fcitx5-mozc.spec に Source として追記する.Source6の記載のあるところの下に
# fcitx5-mozc.spec Source7: mozcdic-ut.txt
なお,このあたりのファイル(git status していらなさそうなやつ)は .git/info/exclude に追記しながらやると後々楽です.
2. それを dictionary_oss/dictionary00.txt に追記する処理を追記
上で dictionary09.txt に追記しているのの前後くらい, %prep の中に
# mozc-ut
cat %{SOURCE7} >> src/data/dictionary_oss/dictionary00.txt
3. 管理のためバージョン番号を変更
Release: %autorelease という行があるが,これに extravarというフィールドを足して ut1 という文字がバージョンに追記されるようにする(後述).
Release: %autorelease -e ut1
sudo dnf5 install \ git bzip2 unzip python3 python-unversioned-command \ fedpkg mock mock-core-configs sudo usermod --append --groups mock "$USER"
差分のイメージ
diff --git a/fcitx5-mozc.spec b/fcitx5-mozc.spec index f5796b1..c0be128 100644 --- a/fcitx5-mozc.spec +++ b/fcitx5-mozc.spec @@ -74,7 +74,7 @@ Name: fcitx5-mozc # git snapshot should have snapshot date will be taken care # of by forgemeta after importing to dist-git Version: %{forgeversion} -Release: %autorelease +Release: %autorelease -e ut1 Summary: A wrapper of mozc for fcitx5 License: BSD and UCD and Public Domain and mecab-ipadic and LGPLv2+ and MS-PL%{?with_bundle_abslcpp: and ASL-2.0} URL: %{forgeurl} @@ -102,6 +102,10 @@ Source4: %{forgesource4} Source5: http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip Source6: http://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip +# mozc-ut, built locally and copied +Source7: mozcdic-ut.txt + + # add -v to ninja command, to make verbose output during building Patch0: mozc-build-verbosely.patch # only applied if the bundle_abslcpp bcond is false @@ -183,6 +187,9 @@ mv %{archivename4} src/third_party/abseil-cpp %patch 1 -p1 %endif +# ut dictionary +cat %{SOURCE7} >> src/data/dictionary_oss/dictionary00.txt + (cd src/data/dictionary_oss; PYTHONPATH="${PYTHONPATH}:../../" python3 ../../dictionary/gen_zip_code_seed.py \ --zip_code=../../../KEN_ALL.CSV --jigyosyo=../../../JIGYOSYO.CSV >> dictionary09.txt;
fcitx5-mozcのビルド
- まず
fedpkg --release f44 prepを試す(--release f44の F は Fedora, prep より前で指定).辞書をダウンロードし,追記し,までやってくれるはず.find . -name 'dictionary00.txt'とかで確認してみよう..git/info/excludeに入れると安心.
- うまく行っていれば,
ut/f44ブランチで commit しとくといいかも. - なお,
id.defの互換性については末尾を参照
source rpm を作る
引き続き fcitx5-mozc のディレクトリでk
fedpkg --release f44 srpm
いい感じのバージョン名になってるか,我々の UT辞書が同梱されてるかを確認
rpm -qp --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' ./*.src.rpm rpm -qpl ./*.src.rpm | grep mozcdic-ut
出力は例えば
fcitx5-mozc-2.30.5618.102^20250124gitc0ed34e-7.ut1.fc44.x86_64 mozcdic-ut.txt
さっき ut1 としたのはこのバージョンに UT 入れた(そして入れ方の version 1)というのを入れ込むためでした.
ビルドして RPM にする
ここで mock という,多分綺麗な Fedora 環境を仮想的に作ってその中で依存先だけでパッケージをビルドする,をやってくれる的なものを使う.
使用時には mock というグループへの所属が必要 (doc).
リンク先の指示に従って追加して,ログイン・ログアウトして $ id -nG とかで確認.たんに mock と打ってみても良い.
準備ができたら,同じディレクトリで引き続き
fedpkg --release f44 mockbuild
find -name 'fcitx5-mozc*.rpm' でいい感じのファイルができているはずだ.*x86_64.rpm が我々の目的.
軽くチェックするならこういう感じで出力を確認していくといいらしい
PKG="$( find results_fcitx5-mozc -type f \ -name 'fcitx5-mozc-[0-9]*.x86_64.rpm' \ -print -quit )" printf '%s\n' "$PKG" rpm -K "$PKG" rpm -qp --qf \ 'Name: %{NAME}\nVersion: %{VERSION}\nRelease: %{RELEASE}\nArchitecture: %{ARCH}\nInstalled size: %{SIZE} bytes\n' \ "$PKG" rpm -qpl "$PKG"
インストール
上の $PKG を使って
sudo dnf install "$PKG"
想定通り fcitx5-mozc が入れ替わることを確認して進めよう.
Warning: skipped OpenPGP checks for 1 package from repository: @commandline と言われたりするが,まあこれは,それはそう.
再起動すれば我々のビルドした fcitx5-mozc が走って,UT辞書を含む変換候補が表示されているはず!!
バージョンロック
せっかくビルドした我々の fcitx5-mozc を,Fedora側のアップデートがいちいち上書きしないようにしたい.
sudo dnf versionlock add fcitx5-mozc
いつでも dnf versionlock list で確認できる
Package name: fcitx5-mozc evr = 2.30.5618.102^20250124gitc0ed34e-7.ut1.fc44
これで全部行けているはず.お疲れ様でした.
アップデートについて
多分,上記の rpm の操作をしたディレクトリで,時々 fetch したり rebase あるいは cherry-pick していく感じになるのだと思う.
id.def の互換性
詳細確認していないが,一応使ったLLMは以下のチェックを推している(Fedora の fcitx5-mozc が想定する id.def のバージョンと, merge-ut-dictionaries の使ってるバージョンの合致を確認するため).
prep までしたあとで,(名詞,一般)のIDを比較している
FEDORA_ID="$( find "$MOZC_DIR" -type f \ -path '*/src/data/dictionary_oss/id.def' \ ! -path '*/src/data/test/*' \ -print -quit )" MOZC_ZIP="$( find "$UT_DIR/src/merge" -maxdepth 1 -type f -name 'mozc-*.zip' \ -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d' ' -f2- )" diff -u \ <(grep -F ' 名詞,一般,' "$FEDORA_ID") \ <(unzip -p "$MOZC_ZIP" \ mozc-master/src/data/dictionary_oss/id.def | grep -F ' 名詞,一般,')
差分がなければスルーで.
というわけで,上記でより快適な日本語入力が可能になった. rpm とかパッケージングとかのことが分かってないと戸惑う部分が多く,独力ではたどりにくそうだが,それぞれのステップ自体はあまり大きくないように思う.どなたかの参考になれば幸いです.