SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|

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

  改めてコンパイルし直し、netstatを確認してiiimdと接続できていることを確認する。よし、ATOKオンッ!!

|[でも、]_へんかんしようとすると、じじょがねぇって、おこられるんすよ、あにき_|
 
-あ連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で調査できる可能性があることに気づいた。

  iiimdに対して、straceを噛ませながら、Emacs側で変換モードに入り、トレースログを取る。

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

  なぜだか、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

  画像の説明

  上記は最短の道のりのみをまとめてあるが、実はかなり地獄を這いずり回った成果である。とりあえず、今日はここまで。あー、しんどかった……。