SVX日記
2007-12-19(Wed) Emacs + IIIMECF + ATOK X3 = ちょっとシアワセ
で、先日の「Args out of range: 0, 9」を、どうにかしたい今日この頃なのであるが、Emacsは何をどう間違えたか、内部骨格がLISPである。設定ファイルもそうだし、今回のIIIMECFモジュールもそう。そして、問題のエラーを吐いているのもそうであろう。
オイラはLISPに対して、少なくない嫌悪感を抱いている。それは、1984年4月号のOh!mz掲載、祝一平氏としての初原稿「皿までどーぞ」(※LISPをボコボコに叩いている内容)を読んだ際の先入観にまで遡るのであるが、例え先入観なしであっても、カッコの多さだけでゲンナリな言語であることに間違いはない。
この問題解決のためには、多少なりともLISPを理解する必要がありそうだが、これから先の人生もLISPとは「決してお近づきになりたくない」と考えているので、間違っても基礎知識や文法を学ばず「コードの見た目」だけからどうにか回避方法を編み出すことにする。
まず、IIIMECFが起動しているかどうか確かめる……IIIMECFをいったん削除してから、Emacsを起動するというベタな方法で……おっと、挙動が変わった。どうも、IIIMECFは起動しているらしい。この調子でまったりと追い込んでいったところ、そもそもTCP/IPによるiiimdへの接続ができていないっぽいことが判明した。つーことは、アレか。.emacsの……
(setq iiimcf-server-control-hostlist '("localhost:9010"))
……が、効いていないということか。更に膨大な試行錯誤を繰り返すと、iiimcf-server-control-parse-hostnameという関数でコケているらしい。件の関数は、引数である"localhost:9010"から、tcp, localhost, 9010を切り出す処理をしているっぽいが、うまくいってないっぽい。正規表現が問題っぽいが、IIIMECFのバグなのかどうかも、よくわからないっぽいので、ちょっとやそっとイジっても直らないっぽい。なにしろ万事が「……っぽい」という状態なのでサクッとあきらめて、ズバッと10数行の関数を削除し、設定をジカ書きしてムリムリに回避である。
wbel4-co:/root/atok_install/iiimecf # vi lisp/iiimcf-sc.el
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf-sc.el.org lisp/iiimcf-sc.el
*** lisp/iiimcf-sc.el.org 2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf-sc.el 2007-12-23 03:08:42.000000000 +0900
***************
*** 222,242 ****
;;;
(defun iiimcf-server-control-parse-hostname (hostname)
! (let (proto host port)
! (if (string-match
! (concat "^\\(?:\\(tcp:\\)?\\([a-zA-Z0-9\.-]+\\)\\(:[0-9]+\\)\\)\\|"
! "\\(?:\\(unix:\\)?\\([a-zA-Z0-9\./:-]+\\)\\)$") hostname)
! (progn
! (if (match-string 2)
! (setq proto "tcp"
! host (match-string 2 hostname)
! port (match-string 3 hostname)
! port (if (null port) iiimcf-server-control-default-port
! (string-to-number (substring port 1))))
! (setq proto "unix"
! host (match-string 5 hostname)))
! (list proto host port))
! (error "server name %s is not valid!" hostname))))
(defun iiimcf-server-control-setup-event-flow-mode (mes)
(setq iiimcf-server-control-dynamic-event-flow-p t))
--- 222,228 ----
;;;
(defun iiimcf-server-control-parse-hostname (hostname)
! (list "tcp" "localhost" 9010))
(defun iiimcf-server-control-setup-event-flow-mode (mes)
(setq iiimcf-server-control-dynamic-event-flow-p t))
wbel4-co:/root/atok_install/iiimecf # emacs -q --no-site-file -batch -l iiimcf-comp.el; cp lisp/* /usr/share/emacs/site-lisp/iiimecf
|[でも、]_へんかんしようとすると、じじょがねぇって、おこられるんすよ、あにき_|
-あ連R漢 (wbel4-co)EE-:**-F1 test.txt (Text Fill)--L1--C74--Top----
:: :辞書ファイルが設定されていません
と、またもやトラブルである。これにはまいった。X上で正しく動いているiiimdの「/proc/pid/maps」を見ると、確かにATOKの辞書にアクセスしている。しかし、フツーに自前で上げたデーモンのiiimdは、ATOKの辞書にアクセスしていない。確かに、辞書ファイルが見つからない状態にあるらしい。
iiimdはGPLなので、ATOKのパッケージ内にソースが含まれている。しかし、ATOKの辞書にアクセスするような設定を行っている部分がどうしても見あたらない。設定ファイルやソースに対し手当たり次第に「grep -ri atok *」するが全然出てこない。すると、クローズドソースのATOKライブラリに対する設定が必要なのか? もしそうだとしたら、手が出ないじゃん……と、絶望的な気分になったが、鼻血が出るほど考えてたら、straceで調査できる可能性があることに気づいた。
wbel4-co:/root/atok_install/iiimecf # strace -o iiimd.trace -f -p `pgrep iiimd`
Process 1927 attached with 3 threads - interrupt to quit
Process 1932 attached
Process 1933 attached
Process 1932 detached
Process 1070 detached
wbel4-co:/root/atok_install/iiimecf # pkill -9 strace
wbel4-co:/root/atok_install/iiimecf # view iiimd.trace
1932 stat64("/var/lib/iiim/le/atokx3/users/", 0xb7efea9c) = -1 ENOENT (No such file or directory)
1932 mkdir("/var/lib/iiim/le/atokx3/users/", 0755) = -1 ENOENT (No such file or directory)
1932 mkdir("/var/lib/iiim/le/atokx3/users/root/", 0700) = -1 ENOENT (No such file or directory)
wbel4-co:/root/atok_install/iiimecf # mkdir -p /var/lib/iiim/le/atokx3
wbel4-co:/root/atok_install/iiimecf # pkill iiimd
wbel4-co:/root/atok_install/iiimecf # iiimd
wbel4-co:/root # emacs test.txt