気を散らすノート

色々と散った気をまとめておくところ.論文読んだり自分で遊んだりする.たぶん.

Fedora 44 で fcitx5-mozc と mozc-utを利用する

  • 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 の辞書の構造

パッケージとしては 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 をいじる系統のパッケージで,多分 fedpkgmock で入る.

辞書ファイルの生成

以下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 とかパッケージングとかのことが分かってないと戸惑う部分が多く,独力ではたどりにくそうだが,それぞれのステップ自体はあまり大きくないように思う.どなたかの参考になれば幸いです.

tag: - mozc, fcitx