あれこれ備忘録@はてなブログ

勉強したことやニュースや出来事を備忘録として書いていきます

このブログには広告が含まれます

(Rootの方は不完全ながら成功)Rootで使えるMozc、あるいはMozc-UTをビルドするまでの長く険しい道のり

Mozcの辞書を強化する事を目的としたMozc UT2 Dictionary(元はMozc UT Dictionary)というものがある。

http://www.geocities.jp/ep3797/mozc-ut2.html

しかし、これはArch Linuxを想定しているため、他のディストリビューションには敷居が高い。

これをDebianUbuntuで使える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なども有効にしてしまったので、余計なもののアップデートもされてしまう。

かなり時間がかかるので気長に待つ。


Taku Kudo on Twitter: "rootでmozcを動かしたい人もいるのか.. 以下のあたりを片っ端に NORMAL にすれば動くと思う。Linux/Macはカジュアルなチェックしかしていません。 https://t.co/b9QBhUMctG"

0x432B2B00: rootでmozcを動かす

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

python - Django Celery implementation - OSError : [Errno 38] Function not implemented - Stack Overflow

/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以下のファイルは消えないようだ。

そして、debファイルのあるディレクトリに移って

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」の設定を変えてみた。

f:id:t_massann:20170923011647j:plain

「状態パネルを隠すモード」という項目を「表示」にするとWindowsなどでMS-IMEATOKなどでも出てくるツールバーが出てくる。

f:id:t_massann:20170923012030j:plain

これでタスクバーにアイコンがなくても入力メソッドの設定を変えられるようになる。

f:id:t_massann:20170923012639j:plain

右クリックで「入力メソッド」を選んで「Mozc」を何回か選択していたら、いつの間にか使えるようになった。

ペンギンマークをクリックしても切り替わる。

起動し直して確認してみないことにはなんとも言えないが、多分、再起動するとまた最初のうちは使えないのではないかと思う。

ちょっとすっきりしないところはあるが、まあ、Mozcをrootで使うことには成功した。

このくらいで満足しようと思う。

アドバイスをしてくれた匿名さんには感謝したい。


その後、途中に追記した/etc/X11/xinit/xinputrcや~/.profileの設定がうまくいったのか、自動でMozcが起動するようになった。

しかも、Puppy Linux日本語フォーラムにあるscim-mozcをインストールしたときよりもメモリ消費量は小さい。

mozcを有効にしたあとでも250MB以下である。

かなり快適になったと思う。

Anthyを使っている場合は200MBよりも小さいメモリ消費量なので、そちらを使うのもなかなか魅力的だ。

辞書を強化するとかなり使える。

arekorebibouroku.hateblo.jp

どちらを使うか悩ましくなってしまった。

うれしい悩みではある。


匿名さんから再びコメントをもらった。

/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は作ったときのアプリやカーネルのバージョンで最適化されているので、軽々しくアップデートされないように、こういうところにも気が使われているのだなと思った。

変更後のデスクトップ画面はこんな感じ。

f:id:t_massann:20170923221644j:plain

右下のタスクバー、スピーカーアイコンの左側にキーボードアイコンが出ている。

タスクバーにこのfcitxのアイコンが出てきたので、デスクトップ右下、タスクバーの上にある「状態パネル」と呼ばれる変換エンジンのツールバーは必要なくなったのだが、とりあえずこのまま表示させておくことにした。

匿名さんには重ね重ねお礼を申し上げたい。