UIM-1.1.x の非互換?
UIM が Ver.1.1.0 以降をインストールすると、UIMを使ったアプリが動かなくなるという現象が発生
X-Windowの日本語入力環境としては UIM, Anthy をインストールしてあるのだけど、最近 UIM Ver.1.1.x系にアップデートしてみたら、UIMを使ったアプリ(ワタシの場合は mlterm)が以下のようなスクリプトエラーを出した揚げ句に異常終了して全く動かなくなってしまった。
ERROR: unbound variable (errobj setugid?)
*backtrace*
>>(setugid?)
>>(if (setugid?) (list (string-append (sys-pkglibdir) "/plugin"))
(filter string? (append (list (getenv "LIBUIM_PLUGIN_LIB_DIR")
(string-append (getenv "HOME") "/.uim.d/plugin")
(string-append (sys-pkglibdir) "/plugin"))
(if (getenv "LD_LIBRARY_PATH") (string-split (getenv "LD_LIBRARY_PATH") ":") ()))))
>>(define uim-plugin-lib-load-path (if (setugid?)
(list (string-append (sys-pkglibdir) "/plugin"))
(filter string? (append (list (getenv "LIBUIM_PLUGIN_LIB_DIR")
(string-append (getenv "HOME") "/.uim.d/plugin") (string-append (sys-pkglibdir) "/plugin"))
(if (getenv "LD_LIBRARY_PATH") (string-split (getenv "LD_LIBRARY_PATH") ":") ())))))
>>(require "plugin.scm")
>>(require "init.scm")
>>(*catch (quote errobj) (require "init.scm"))
>>(eq? (quote *init.scm-loaded*) (*catch (quote errobj) (require "init.scm")))
ERROR: unbound variable (errobj uim-get-default-im-name)
*backtrace*
>>(uim-get-default-im-name "ja_JP.eucJP")
ERROR: unbound variable (errobj create-context)
*backtrace*
>>(create-context 0 (quote ()) (quote ()))
>>()
>>Segmentation fault
|
UIMの現在の最新版は Ver.1.1.1 なのだが、これでも同様の症状が発生し、全く直る気配はない。
見たところ UIMの初期化スクリプト内でエラーが発生しているようなのだが、UIM のスクリプトは LISP に似た独自のもので、何が書かれているのかチンプンカンプンだ。分からないなりにも、スクリプトとエラーメッセージを眺めて、どうやら "setugid" という手続きが存在しないかエラーを返していると言った事象が引金になっているのではなかろうか?とアタリをつけた。
その観点で UIM の変更履歴(ChangeLog) を見てみたら、
* uim/uim-util.c
- (is_setugidp, setugidp): Rename is_setugidp to setugidp
- (uim_init_util_subrs):
* Follow the function renaming
* Rename Scheme procedure name is-set-ugid? to setugid?
|
なんて記述があった。以前は "is-set-ugid" だった手続き名を "setugid" に変えたので、それに伴って UIMスクリプトから呼び出すときの名前も "is-set-ugid" →"setugid" に変わったようだ。
と言うことは、古い UIMを内包しているアプリ(mlterm)が持っている手続きは以前の名前 "is-set-ugid" だが、最新版 UIM をインストールすると各種スクリプトも最新版のものに置き換えられ、それら最新スクリプトからの呼び出し名は "setugid" になっているのではあるまいか?つまり UIM が Ver.1.0.1 から Ver.1.1.0 になる段階で「非互換」を起したのではなかろうか?と言うことだ。
この仮定に基づいて考えると、UIM最新版 Ver.1.1.1 をインストールした後に、UIMを内包しているアプリ(mlterm) もビルド、再インストールすれば問題が解消されるはずだ。
試してみたら、これが大正解。UIM Ver.1.1.1 のもとでもエラーになる事無く mlterm が動くようになった。他にも Gimp等 UIM内包アプリがあるなら、同様の対処をすれば突破できるというわけだ。しかし・・・
通常、このような非互換を止むを得ず組み込む場合には、互換性保証のため古い機能を残しつつ新しい機能も入れる(今回の場合、新しい手続き名"setugid" が無い場合には、旧手続き名 "is-set-ugid" で呼び出してみるとか)のが常道だ。またはメジャーバージョン番号を上げて Ver.2系という別系統で機能追加などの開発を継続し、Ver.1系はバグ修正のみという形にするものだ。しかし、今回 UIMは Ver.1系のマイナーアップデートの中で非互換を作り込み、かつ旧機能は綺麗サッパリ消してしまったようだ。
まぁ、オープンソースだからこんな事しても許されるんですが、ワタシの仕事で万が一にもこんな事したら、それこそエライ騒ぎだよ。最悪、幹部社員が顧客に謝りに回り、まぁ数週間から数ヶ月くらい後始末に追われるようなことになるカモよ(^^;)。某M$ とかはどうか知らんけど、プロが作るプログラムという物はそれくらい厳しいものなのだ。
|