2016/12/08

NetBSD/i386でLinuxバイナリ版LibreOfficeの日本語変換に成功

ここしばらくNetBSD/i386のLinuxエミュレーション環境でLibreOfficeの日本語入力を可能にしようと試行錯誤を続けてきましたが、ようやく成功しました。これは大きな一歩です。このことでdynabook SS SX/15AのWindows VistaをNetBSD/i386+MATEの環境に移行できる見込みが高まりました。

まず日本語変換を出来るようにするための手順を紹介します。次に解決に至るまでの試行錯誤の一端を紹介します。
  1. NetBSD/i386のLinuxエミュレーション環境はOpenSuse 13.1のサブセットです。pkgsrcからLibreOffice5-binを入れた時にエミュレーション環境も同時にインストールされましたが、日本語変換に必要なファイルが足りなかったようです。
  2. OpenSuse 13.1用RPMを2つ追加する必要があります。適当なミラーサイトからRPMを入手し、/usr/pkg/sbin/rpm2pkgでインストールします。必要なRPMは次の2つです。
    • ibus-gtk-1.5.4-1.1.i586.rpm
    • gtk2-immodule-xim-2.24.22-2.1.i586.rpm
  3. 追加したモジュールを有効にするため、/usr/pkg/emul/linux/usr/bin/gtk-query-immodules-2.0を使って/emul/linux/usr/lib/gtk-2.0/2.10.0/immodules.cacheを更新します。
以上の処理をおこなうことで、LibreOfficeでiBus-Mozcが利用できることを確認しました。

この問題を解決するまで、試行錯誤を繰り返し、時には袋小路に入ったりしました。その全てを書いても仕方ないし、いろいろな可能性を考え、試したので、もう細かいところは覚えていません。

役にたったのは、本物のOpenSuse 13.1の環境を用意したことです。これはWindows10上のVirutualBoxを利用しました。本物のLinux上でLibreOfficeの日本語変換ができることを確認し、どの設定を変えると日本語変換が出来なくなるのかを探ろうとしました。

ここで次のような情報を見つけました。
  1. GTK+2のバージョンによってimmoduleの情報の内部記録の方法が変わったらしいこと。
  2. 環境変数GTK_IM_MODULE_FILEを使うと、このファイルの指す場所を変えられること。
NetBSD/i386を調べてみるとGTK+2のimmoduleの情報が、NetBSD/i386ネイティブ用とLinuxエミュレーション環境用の2つがあることがわかりました。
  • /usr/pkg/lib/gtk-2.0/2.10.0/immodules.cache
  • /emul/linux/usr/lib/gtk-2.0/2.10.0/immodules.cache
これらを比べてみると、Linuxエミュレーション環境用のファイルにはibusやximのエントリがありませんでした。NetBSD/i386ネイティブ用のファイルの方にはエントリが入っています。この段階で、どうやら日本語入力が出来ない原因はこれではないかと見当をつけました。

そこで環境変数GTK_IM_MODULE_FILE/usr/pkg/lib/gtk-2.0/2.10.0/immodules.cacheを指定してみたのですが、LibreOfficeが起動しなくなりました。正確には起動しようとして、落ちてしまいます。その時に、次のようなエラーが出てしまいます。
(soffice:3007): Gtk-WARNING **: /usr/lib/libelf.so.1: symbol __deregister_frame_info, version GCC_3.0 not defined in file libgcc_s.so.1 with link time reference

(soffice:3007): Gtk-WARNING **: Loading IM context type 'ibus' failed
Application Error
NetBSD/i386のLinuxエミュレーション環境というのは、なんでもかんでもLinux用の共有ライブラリを使う訳でもなくて、場合によってはNetBSD/i386ネイティブの共有ファイルもつかうようです。これを期待して環境変数を指定してみたのですが、エラーが出てしまったので、OpenSuse用のバイナリをエミュレーション環境に入れることにしたのです。それが上述した手順です。

また本物のOpenSuseでは、環境変数GTK_IM_MODULE_FILEを指定して、一時的に作成した空ファイルを指すようにしてみました。すると、Mozcが反応しなくなったのです。これはNetBSD/i386上のLinuxエミュレーション環境で動作するLibreOfficeの問題と同じです。このようにして問題となる現象が再現できた(気がした)とき、解決への確信も生まれました。

6 件のコメント:

  1. はじめまして。rpm2pkg の使用法に疎いのですが(man ページもよくわからず)、rpm パッケージを NetBSDホストにインストールする時の具体的なコマンドをお示し頂くことは可能でしょうか?

    返信削除
  2. ブログをご覧いただきましてありがとうございます。NetBSDの世界ではRPMを使うことは殆どないので、rpm2pkgのことは忘れていました。コメントを拝見してから改めて確かめてみたところ、記事に書いたことが再現できました。

    まず前提としてNetBSDにおけるLinuxエミュレーション環境は/usr/pkg/emul/linuxの下に作るのが想定されているようです。変更も可能のようですが、不慣れな環境で戸惑うのが嫌なのでデフォルトのままにしています。

    記事にあるgtk2-immodule-xim-2.24.22-2.1.i586.rpmをインストールすると、/usr/pkg/emul/linux/usr/lib/gtk-2.0/2.10.0/immodules/im-xim.soとim-ibus.soが入ると思います。

    この時のコマンドは次の通りです。

    rpm2pkg -d /usr/pkg -p emul/linux gtk2-immodule-xim-2.24.22-2.1.i586.rpm

    ご覧のようにLinuxエミュレーション環境の/usr/pkg/emul/linuxを別々のオプションに分けて指定しています。何故このような面倒な仕様なのかは分かりません。もしかすると汎用性を考えているのかもしれません。この方法はmanを見るとEXAMPLESのところに、それらしい方法が記載されています。でも、とても分かり難いですね。

    お役に立てば幸いです。

    返信削除
  3. 古澤様、見事にうまくいきました。よく試行錯誤でここまでたどり疲れ最多ね。ブログ拝見してますが、分析的に学習を進めておられ、高い志をお持ちだなあと感心しなら見ています。今後のブログ記事にも期待させて頂きます。どうも有難うございました。

    返信削除
  4. 申し上げるのを忘れましたが、私も NetBSD で生活環境を整えてつつあり、Libreoffice が一つの課題でした。これで問題なく日々過ごせそうです。Linux エミュレーションの仕様についても大変勉強になりました。Man ページ、良く見れば書いてありますね。お恥ずかしい限りです。

    返信削除
    返信
    1. ご丁寧にお返事を下さりありがとうございます。うまくいって良かったですね。NetBSDの環境を整えるのは他のOS(特にLinux系)に比べると難易度が高いと思いますが、苦労をしたかいもあるだろうと考えています。

      つまり問題を解決する過程の中で、例え解決できず代替策を採用することになったとしても、技術力が鍛えられるだろうと思うのです。

      このブログのタイトルはDECの誇る(?)OpenVMSのファイル名規約を真似てつけました。SYS$SCRATCHというのはUNIXで言えば/tmpのような位置づけです。駄文を公開していますが、お役に立てる情報もあれば、これは望外の喜びです。

      削除
  5. DECとは懐かしい。大学では VAX/VMSで演習してました。と書くと歳がバレますが。私も同じ気持ちで、技術力を高めるつもりでNetBSDを選んでいます。いつまで続くか分からないLinux ディストリビューションよりも、おそらく末長く続くであろうNetBSDはこの目的には適していると思っています。今後とも宜しくお願い致します。

    返信削除