(Rootの方は不完全ながら成功)Rootで使えるMozc、あるいはMozc-UTをビルドするまでの長く険しい道のり
Mozcの辞書を強化する事を目的としたMozc UT2 Dictionary(元はMozc UT Dictionary)というものがある。
http://www.geocities.jp/ep3797/mozc-ut2.html
しかし、これはArch Linuxを想定しているため、他のディストリビューションには敷居が高い。
これをDebianやUbuntuで使えるdebパッケージを生成できるように改造して公開してくれている方がいる。
Ubuntu 16.10でibus-mozcを使用する - Sickly Life Blog
16.04なのでこちらも参考にした。
ほぼ同じ内容。
Ubuntu 16.04 LTS に Mozc UT Dictionary をインストールしてみた - 旧ID:itiriのブログ
XenialPupやXenialDogで動くMozcが欲しかったこともあり、ちょっと、ビルドに挑戦してみることにした。
必要なパッケージをインストールする。
sudo apt-get install -y clang libdbus-1-dev libglib2.0-dev libgtk2.0-dev subversion tegaki-zinnia-japanese debhelper libibus-1.0-dev build-essential libssl-dev libxcb-xfixes0-dev python-dev gyp protobuf-compiler libqt4-dev libuim-dev libzinnia-dev fcitx-libs-dev devscripts ninja-build
この時、以下のようなエラーが出た。
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移 動されていないことが考えられます。 以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
libgtk2.0-dev : 依存: libpango1.0-dev (>= 1.20) しかし、インストールされようとしていません
依存: libcairo2-dev (>= 1.6.4-6.1) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
そこで
sudo apt-get install libcairo2-dev
してみたところ
以下のパッケージには満たせない依存関係があります:
libcairo2-dev : 依存: libcairo2 (= 1.14.6-1) しかし、1.15.2-0intel1 はインストールされようとしています
依存: libcairo-gobject2 (= 1.14.6-1) しかし、1.15.2-0intel1 はインストールされようとしています
本来、調べたいエラーとは違いますがこれが出てきました。
Cannot Install Intel Proprietary Graphics Driver - elementary OS Stack Exchange
どうやらIntel HD Graphics DriverをプロプライエタリやPPAでアップデートしているのが原因のようです。
apt-getで特定のバージョンをインストールする - Qiita
上のページを参考にバージョンを指定してインストールする必要があるかも知れない。
ただこれだと現在のグラフィック環境で不整合が起きるだろう。
Chrootでビルド環境を別に作る必要があるかも知れない。
Hachulog: debianやubuntuでmikutterビルド環境を作る
ちょっと古い記事なのでそこを考えながら
sudo apt-get install debootstrap
でdebootstrapをインストール。
sudo -s
してroot環境に固定して
mkdir /var/root
cd /var/root
debootstrap xenial ./xenial http://jp.archive.ubuntu.com/ubuntu
でUbuntu 16.04のコアな環境を構築する。
http://ftp.jaist.ac.jp/pub/Linux/ubuntu でも良いと思う。
何も指定しないとhttp://archive.ubuntu.com/ubuntu/ になると思う。
apt-getが速いのが良いなら、jaistにすると良いかも。
cp -r mozc-2.18.2598.102+dfsg-1~ut2-20170529 /var/root/xenial/usr/src
などとしてMozc-UTのソースファイルが入ったディレクトリを適当なところにコピーする。
chroot /var/root/xenial /bin/bash
でルートディレクトリを変更。
apt-get update
して、データベースを更新して
ビルドに必要ないのではないかと思うが、日本語環境にする設定もしてみた。
apt-get install language-pack-ja-base language-pack-ja
パッケージ名の補完がないので手打ちかコピー&ペーストで行う。
echo "Asia/Tokyo" > /etc/timezone
cp /usr/share/zoneinfo/Japan /etc/localtime
locale-gen ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale
timedatectlコマンドを使って設定する方法はsystemd-containerを入れるなどしないと駄目らしい。
上の方法が16.04でも有効なのかわからない。
下のものはエラーが出た時に一度、現在のルートディレクトリからexitして、適宜マウントする。
mount -t proc proc ./xenial/proc
mount -o bind /dev ./xenial/dev
mount -t devpts devpts ./xenial/dev/pts
mount -t sysfs sysfs ./xenial/sys
最初から入れたところ、「apt-get update」でエラーが出た。
これで改めて以下のパッケージのインストールを試みた。
apt-get install -y clang libdbus-1-dev libglib2.0-dev libgtk2.0-dev subversion tegaki-zinnia-japanese debhelper libibus-1.0-dev build-essential libssl-dev libxcb-xfixes0-dev python-dev gyp protobuf-compiler libqt4-dev libuim-dev libzinnia-dev fcitx-libs-dev devscripts ninja-build
すると以下のエラー。
パッケージ ninja-build は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
E: パッケージ clang が見つかりません
E: パッケージ gyp が見つかりません
E: パッケージ libuim-dev が見つかりません
E: パッケージ 'ninja-build' はインストール候補ではありません
/etc/apt/source.listを見たら
deb http://jp.archive.ubuntu.com/ubuntu xenial main
しか無かったので、試しに一度exitして、ホストのsource.listをコピーしてみた。
改めてchrootし、「apt-get update」したあとで、もういちど上記のコマンドを実行したところ成功。
ppa以外のリポジトリ、xenial-updatesやxenial-backports、xenial-securityが入ったのでどれが有効だったか分からないが、もしかしたら
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu/ xenial main restricted universe
deb-src http://ftp.jaist.ac.jp/pub/Linux/ubuntu/ xenial main multiverse restricted universe
とするだけでも良かったかも知れない。
ppaのリポジトリやプロプライエタリのリポジトリが入ると、ホストの環境と同じになってしまって冒頭のエラーが出て意味がなくなるので入れてはいけない。
updatesやbackportなども有効にしてしまったので、余計なもののアップデートもされてしまう。
かなり時間がかかるので気長に待つ。
Mozcをroot権限で動かすには、ダウンロードしたソースのうち
/mut/src/base/run_level.cc
の
geteuid() == 0
または
getuid() == 0
を調べている箇所で
RunLevel::DENY
となっているのを
RunLevel::NORMAL
に書き直すか、判定している部分全体を削除すると良いようだ。
ここまできたら、いよいよビルドである。
/usr/srcにMozcソースが入ったディレクトリをコピーしたのでそこへ移動する。
そして
./build_mozc_plus_utdict
を実行。
すると大量のエラーが。
後ろの方だけ書き出すと
debian/rules:33: ターゲット 'override_dh_auto_configure' のレシピで失敗しました
make[1]: *** [override_dh_auto_configure] エラー 1
make[1]: ディレクトリ '/usr/src/mozc-2.18.2598.102+dfsg-1~ut2-20170529/mut' から出ます
debian/rules:30: ターゲット 'build' のレシピで失敗しました
make: *** [build] エラー 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2
debuild: fatal error at line 1376:
dpkg-buildpackage -rfakeroot -d -us -uc -b failed
/usr/src/mozc-2.18.2598.102+dfsg-1~ut2-20170529
終了
こんな感じ。
/usr/src/以下のmozcを入れたフォルダを見てみたらなんと/mutディレクトリ以下全部が消えていた…。
build_mozc_plus_utdictを見てみたら、ビルドに成功しようと失敗しようとmutディレクトリ以下を消してしまうコマンドが。
なんで・・・。
#rm -rf ./mut/
当該箇所をコメントアウトする。
改めてやってみたら消えなくなったが、当たり前だがエラーはそのまま。
足りないパッケージがあるのかと思い確認。
libprotobuf-devが無いようだったのでインストール。
そのときapt-getに「保留: 78 個」とあったので
apt-get dist-upgrade
を実行してこれらをアップデート。
それでも駄目なのでもう少しエラーを良く見たら
File "/usr/lib/python2.7/multiprocessing/synchronize.py", line 75, in __init__
sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
LOSError: [Errno 38] Function not implemented
/dev/shmのマウントが必要らしい。
/devディレクトリ全ての方が良いのか/dev/shm限定の方が良いのかどちらだろう。
とりあえずexitで出て、/dev/shm限定にしてみた。
mount -o bind /dev/shm ./xenial/dev/shm
として再度、build_mozc_plus_utdictを実行。
今度は先へ進んだ。
しかし、
make[1]: desktop-file-install: コマンドが見つかりませんでした
でエラー。
command line - Eclipse installation question - .desktop file - Ask Ubuntu
apt-get install desktop-file-utils
を実行して、再び挑戦。
見事に成功!
emacs-mozc-bin_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
emacs-mozc_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
fcitx-mozc_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
ibus-mozc_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
mozc-data_2.18.2598.102+dfsg-1~ut2-20170529_all.deb
mozc-server_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
mozc-utils-gui_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
uim-mozc_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
ができた。
通常のUbuntu 16.04ではfcitxを使っているはずなので
fcitx-mozc_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
mozc-data_2.18.2598.102+dfsg-1~ut2-20170529_all.deb
mozc-server_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
mozc-utils-gui_2.18.2598.102+dfsg-1~ut2-20170529_amd64.deb
のインストールだけで良いはずである。
できたdebファイルはどこか適当なところにコピーして保存しておくと良いのではないかと思う。
exit
でchrootから抜け出す。
umount ./xenial/dev/shm
でアンマウントする。
sudo -s
でroot権限になっているのでもう一度
exit
する。
一応、インストール前に
sudo apt-get remove mozc-data mozc-server mozc-utils-gui fcitx-mozc
しておいた方が良いと思う。
…と、ここで端末で変なエラーが出てしまったうえ、もう一度、端末を開き直したら
$の表示が出ず、何も入力できなくなった。
その上、メニューの「ログアウト」もタスクバーの電源マークのアイコンも効かなくなってしまった。
Ctrl + Alt + F1
でコンソール画面を開いても駄目だった。
これまでの試行錯誤でちょっとおかしくなってしまったようだ。
仕方がないので強制的に再起動する。
UbuntuTips/Others/MagicSysRq - Ubuntu Japanese Wiki
Alt+PrintScreen+R+S+E+I+U+B
で再起動できるはずだ。
キー入力も効かなくなってしまったら、仕方がないので電源ボタン長押しで電源を落とすしかない。
本当はやらないに越したことはない。
再起動したところで
上のコマンドでmozc-dataなどを削除。
mozc-dataを消すと辞書データが消えるのでバックアップが必要な場合はしておいた方が良いかと思ったが、どうやら~/.mozc以下のファイルは消えないようだ。
sudo dpkg -i mozc*.deb fcitx*.deb
をして、作ったパッケージをインストールする。
うちの環境ではそれまでのUbuntu公式(だと思う)のMozcのバージョンは「2.17.2116.102」だが、インストール後は、「2.18.2598.102」になった。
どうやら成功したようだ。
長い道のりだった。
Ubuntu(Lubuntu)ではこれで使えるようになったが、手を加えたのでroot環境のXenialDogでも使えるはずである。
後で試してみることにする。
ビルド環境を作るだけでも苦労するのに、元のMozcを作る人、変換辞書を作る人、各ディストリビューション向けに改造する人もすごいと思う。
XenialDogで試してみたがやっぱり動かないようだ…。
きちんと設定したはずなのだが。
もう一度、ソースを見直してみる。
ibus-mozcがnot rootだとできる問題を解決する - インターネットのリソースを無駄遣いして検索におけるUXを下げてごめんなさい
この人は成功しているのだが…。
バージョンが古い場合にしか当てはまらないのかとも思ったがこの記事の人は「2.18.2595.102」だから新しい。
RunLevel::DENYをRunLevel::NORMALに直しているのだが何故かRoot環境で動くようにならない…。
ユーザー名Puppyでログインすると使えるのでパッケージ自体はできあがっているようだ。
なぜ動かないのか分からない。
該当個所以外にもRunLevel::DENYの部分はあるが、これはWindows用の設定だから関係ないはずだ。
該当個所の判定部分を削除した方が良いんだろうか…。
でも、同じだと思うのだが。
誰かどこを変えれば良いか教えてほしい…。
コメントをもらったのでもう一度、試してみたがやっぱり使えない。
rootだとmozc_serverが起動されていないのだ。
端末を起動して/usr/lib/mozc/mozc_serverを実行することはできる。
エラーは出ないから端末内での起動はできているようだ。
でもuimからの呼び出しで起動されていないと意味が無い。
原因が分からない。
匿名さんのコメントを参考にInput Methodをuimからfcitxに変更した。
自動的に起動せず、スタートメニューからfcitxを選択して起動しないといけなかったので、PulseAudioのときと同じようにStartupディレクトリにシェルスクリプトを書いてXの起動時にスタートアップ起動されるようにした。
Startupにスクリプトを置くとstartxのたびにmozc_serverが起動される可能性があるのと、端末でenvを調べてみたらuimを消して、fcitxをインストールしたところ
CLUTTER_IM_MODULE=xim
QT_IM_MODULE=xim
QT4_IM_MODULE=xim
GTK_IM_MODULE=xim
XMODIFIERS=@im=uim
となっていた。
本当は大元を変更したいのだが、どこに設定があるのかわからなかったので、/root/.profileファイルに
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export QT4_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
とし、ついでに
fcitx -d
も追加して、Startupにスクリプトを置くのをやめた。
「Fcitxの設定」の「アドオンに」に「Fcitx XIM Frontend」というものがあるので、各IM_MODULEはximのままでも良いのかも知れないが。
CLUTTER_IM_MODULEはそのままにしておいた。
また、古い記事でibusに関するものではあるが
個人的Linux: 新ibusになって日本語入力が困ったことに
ブラウザに書き込みができず、GTK_IM_MODULEとQT_IM_MODULEをximにしたらうまくいったというのがあるので、変えないほうが良いのかも知れない。
ちなみに、「Fcitx XIM Frontend」の設定で「XIMで On The Spot スタイルを使う(起動中は変更できません)」という項目にチェックを入れないと入力途中の文字がテキスト入力欄に書き込まれず、ポップアップに表示され、変換決定後にテキスト入力欄に書かれることになる。
追記
実は/etc/X11/xinit/xinput.dディレクトリにfcitxファイルやja_JPというファイルがあり
XIM=fcitx
XIM_PROGRAM=/usr/bin/fcitx
XIM_ARGS=""
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
DEPENDS="fcitx"
と書かれている。
しかし、効いてないらしい。
また、/etc/X11/xinitディレクトリにxinputrcというファイルがあり、ここに
run_im uim
と書かれていた。
これを
run_im fcitx
とすれば、~/.profileに
fcitx -d
と書かなくても、自動的にFcitxが起動するかも知れない。
試して見たところ正解だった。
これで、.profileに書かなくて良くなった。
追記終わり
JWMではfcitxが起動されてもアイコンが出ない。
ただスペースはできるが、何も表示されず、右クリックなどでメニューも出ない。
アイコンがないのか何なのかよくわからない。
Openboxでは出るようだ。
それでもスタートメニューの「Fcitx設定」でMozcを一番上にしてもうまくいかないので、他の設定をいじってみることに。
「Fcitx設定」の「アドオン」にある「Classic」の設定を変えてみた。
「状態パネルを隠すモード」という項目を「表示」にするとWindowsなどでMS-IMEやATOKなどでも出てくるツールバーが出てくる。
これでタスクバーにアイコンがなくても入力メソッドの設定を変えられるようになる。
右クリックで「入力メソッド」を選んで「Mozc」を何回か選択していたら、いつの間にか使えるようになった。
ペンギンマークをクリックしても切り替わる。
起動し直して確認してみないことにはなんとも言えないが、多分、再起動するとまた最初のうちは使えないのではないかと思う。
ちょっとすっきりしないところはあるが、まあ、Mozcをrootで使うことには成功した。
このくらいで満足しようと思う。
アドバイスをしてくれた匿名さんには感謝したい。
その後、途中に追記した/etc/X11/xinit/xinputrcや~/.profileの設定がうまくいったのか、自動でMozcが起動するようになった。
しかも、Puppy Linux日本語フォーラムにあるscim-mozcをインストールしたときよりもメモリ消費量は小さい。
mozcを有効にしたあとでも250MB以下である。
かなり快適になったと思う。
Anthyを使っている場合は200MBよりも小さいメモリ消費量なので、そちらを使うのもなかなか魅力的だ。
辞書を強化するとかなり使える。
どちらを使うか悩ましくなってしまった。
うれしい悩みではある。
匿名さんから再びコメントをもらった。
/etc/apt/preferences
/var/lib/synaptic/preferences
にある
Package: jwm
Pin: version 2.1.0+svn579-2ubuntu1
Pin-Priority: 1001
というところのPin-Priorityを変えて、apt-getかSynapticパッケージマネージャでJWMをアップデートすると良いそうだ。
この値を100に変えて、
apt-get update
apt-get upgrade
でJWMがアップデートされる。
このPinとPin-Priorityの仕組みは、特定のバージョンのアプリを使い続けたい場合に指定するものだ。
XenialDogやPuppy Linuxは軽量化のためにウィンドウマネージャにJWMを使い、さらにアプリやフォントを必要最低限のもの以外を削るなど、最適化している。
JWMをアップデートすることでこの最適化した設定が変わったり、設定との齟齬が出てきて動かなくなると困るのでアップデートされないようにしているのだろう。
実際、JWMをアップデートすると/etc/jwm/system.jwmrcを書き換えるかどうかという質問がある。
バックアップを残して書き換えてみた。
メニューのフォント設定、色設定やメニューに表示するアプリの設定などが変わってしまう。
ただ、個人設定は~/.jwmrcに書かれてあり、こちらでいろいろな設定が上書きされているので影響は小さいかも知れない。
不具合が出たら元のファイルに戻そう。
タスクバーにfcitxのアイコンが表示されるのを確認したら、念のためそれ以上アップデートされないように再び
/etc/apt/preferences
/var/lib/synaptic/preferences
を書き換える。
アップデートされたJWMのバージョンは2.3.5-2なので
Package: jwm
Pin: version 2.3.5-2
Pin-Priority: 1001
にしておいた。
アップデートする際は使うツール、APTかSynapticパッケージマネージャの側のpreferencesだけを書き換えれば良かったが、この変更はどちらのpreferencesも書き換えないと、片方のツールを使ってアップグレードを実行した場合に、前のバージョンにダウングレードされてしまうだろう。
ちなみにpreferencesにはJWMの他にカーネルのPin情報がある。
これもXenialDogでapt-getやSynapticパッケージマネージャでアップグレードを行った場合に更新されないようにするためだ。
XenialDogやPuppy Linux(TahrPupやXenialPupなど)は通常のUbuntuとは構造やファイル群の読み込み方法が違うため、そのままアップグレードするとXenialDogが動かなくなる。
Puppy Linuxではカーネルアップグレードはほとんど行われないが、XenialDog(DebianDog)はカーネルアップグレードが頻繁に行われるのが利点だ。
APTやSynapticパッケージマネージャで行うのではなく、メニューの「Upgrade-Kernel(frugal install only)」で行う。
軽量Linuxは作ったときのアプリやカーネルのバージョンで最適化されているので、軽々しくアップデートされないように、こういうところにも気が使われているのだなと思った。
変更後のデスクトップ画面はこんな感じ。
右下のタスクバー、スピーカーアイコンの左側にキーボードアイコンが出ている。
タスクバーにこのfcitxのアイコンが出てきたので、デスクトップ右下、タスクバーの上にある「状態パネル」と呼ばれる変換エンジンのツールバーは必要なくなったのだが、とりあえずこのまま表示させておくことにした。
匿名さんには重ね重ねお礼を申し上げたい。