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|12|
2017|01|02|03|04|

2007-12-15(Sat) Emacs + IIIMECF + ATOK X3 = シアワセ?

  ボーナスが出た。

  基本的には一時金の際に踊るような暮らしはしていないが、ウチはボーナス時に小遣いに反映するシステムを採っているので、それなりのモノを買うチャンスである。

  しかし、これといって買いたいと思うものがない。PC環境を充実しようにも、愛用のノートPCにはほとんど不満がないし、自宅のサーバは元気だし、バックアップ用のUSB接続のHDDは購入してしまっている。非常に面白そうではあるがPC Engines ALIXは、エンクロージャの発売が遅延している。気に入っているブラウザであるOperaはタダになってしまったし、最新ではないものの、電子辞書、電子地図も揃っている。

  知識を得ようと、本を買おうと思っても、Linuxも電子工作も、本で得られる知識などタカがしれているから、買う気にならない。唯一、使用頻度の割に不満があるのはメーラであるが、先日から自作を始めてしまっており、金で解決できない……で、結局、時間を買えればなぁ、という考えに落ち着いてしまうのだ。

  と、そこでふと思いついた。日本語入力環境を改善してはどうか。ATOKを購入するのである。

  画像の説明 画像の説明

  昔、オイラはMac(PowerBook550c)で3DCGをやっていた時期があったが、その頃は「トラブルが出たら、相談する前にATOKとRAM Doublerを外せ」という対処が「常識」になるくらい品質が悪かった(当然、買ってない)。しかし、最近はそのような悪い噂は聞かない。むしろ、変換精度には定評があるくらいだ。それなら、少し金をかけるにも悪くない選択肢である。

  早速、ジャストシステムのサイトに行ってみる。買うなら、Linux版だな……あった、ATOK X3 for Linux。と、いうか、新バージョンが出たばかりのようだ。

  画像の説明

  値段は、ダウンロードでAAA優待版というのなら5,000円を切っているが、AAA優待版というものがよくわからない。既存ユーザ向けのアップグレードパッケージのようにも見えるが、インストール時には制限がないようなことも書いてあるし、そもそもLinux環境では制限の掛けようもないような気がする。しかし、金を出した挙げ句に使えなかったらバカバカしいので、通常版を購入した。7,350円。

  ファイル形式はいたって普通。160MBのatokx3.tar.gzというファイル。展開するとrpm、debとtar形式でパッケージ化されている。なんだよ、ダウンロード容量の半分は無駄かよ。

  Emacs上で使うのがゴールだが、とりあえず普通にインストールしてみる。職場ではRHEL5のGnome環境もそこそこ使えるようにはしているが、ぜんぜん煮詰めた環境ではない。フツーに使えるようになったが、ちっともうれしい気分にならない。さっさとオレ環境の構築に入ろう。

  相手は、coLinuxのWhiteBoxEnterpriseLinux4上のEmacs。今日はここまで。


2007-12-17(Mon) Emacs + IIIMECF + ATOK X3 = シアワセ!?

  つーわけで、coLinuxのWhiteBoxEnterpriseLinux4上のEmacsから、ATOK X3 for Linuxを使う方法である。

  まずは、ATOKのインストール。

wbel4-co:/root/atok_install # tar xvfz atokx3.tar.gz
 
wbel4-co:/root/atok_install/ATOKX3 # ./setupatok.sh
This software is furnished under an end user agreement and may be used
or copied only in accordance with the terms of such license.
If you accept the terms of the license agreement,Please select "Yes".
If you do not accept the terms of the license agreement,Please select "No".
? (yes/no)yes
Preparing...                ########################################### [100%]
   1:iiimf-client-lib       ########################################### [100%]
Preparing...                ########################################### [100%]
   1:iiimf-gtk              ########################################### [100%]
Preparing...                ########################################### [100%]
   1:iiimf-protocol-lib     ########################################### [100%]
Preparing...                ########################################### [100%]
   1:iiimf-server           ########################################### [100%]
Preparing...                ########################################### [100%]
   1:iiimf-x                ########################################### [100%]
"/etc/gtk-2.0/i386-redhat-linux-gnu/gtk.immodules" will be changed.
Preparing...                ########################################### [100%]
   1:atokx                  ########################################### [100%]
Installation has been completed.

  状況によっては、既にインストールされているIIIMF関連パッケージが削除されるが、そのまま削除させておく。

  次はIIIMFの設定。ここは大いにハマった。というか、まずLinuxにおける、日本語入力システムの仕組みがサッパリわかってなかった。一応、オイラはLinuxで飯を食ってはいるが、ウチは主にサーバ用途として売っているから、X上の日本語入力に関する知識はゼロなのだ。

  いろいろ苦労して調べたところによるとEmacsとATOKの関係は「Emacs(エディタ)」 → (インクルード) → 「IIIMECF(Lispモジュール)」 → (TCP/IP) → 「IIIMF(入力メソッドデーモン)」 → (ダイナミックリンク) → 「ATOK(漢字変換システムライブラリ)」ということになっているらしい。Xで使う場合のことはよくわからんが、よく聞くSCIM-Anthyというのが、IIIMF-ATOKと同じ次元の概念ということになるな。

  IIIMECFは、UnixドメインかTCP/IPのどちらかでIIIMFと通信を行う……のだが、まず、IIIMFをどう起動していいものやらわからない。いろいろ試したところ、単にコマンドラインから「# iiimd」とやれば、デーモンとして起動するみたいだ。

  なお、通信はTCP/IPを選択した。というのも、TCP/IPであれば外部からのアクセスも可能であるから、複数のマシンでひとつの変換エンジンを共有できて便利だろう、という目論見からである。

  iiimdの設定は、以下のようにした。

wbel4-co:/etc/iiim # vi iiimd.xml.conf
 
wbel4-co:/etc/iiim # diff -c iiimd.xml.conf.org iiimd.xml.conf
*** iiimd.xml.conf.org  2007-11-17 12:00:00.000000000 +0900
--- iiimd.xml.conf      2007-12-23 01:27:26.000000000 +0900
***************
*** 7,17 ****
                       type ... tcp : child directives: <hostname>, <port>
                                unix: child directives: <file>
        -->
-       <!--
        <listen type="tcp">
!           <hostname>localhost</hostname>
            <port>9010</port>
        </listen>
        <listen type="unix">
            <file>/var/run/iiim/.iiimp-unix/9010</file>
        </listen>
--- 7,17 ----
                       type ... tcp : child directives: <hostname>, <port>
                                unix: child directives: <file>
        -->
        <listen type="tcp">
!           <hostname>0.0.0.0</hostname>
            <port>9010</port>
        </listen>
+       <!--
        <listen type="unix">
            <file>/var/run/iiim/.iiimp-unix/9010</file>
        </listen>
***************
*** 38,43 ****
--- 38,46 ----
            <acl type="permit">
                <hostname>127.0.0.1</hostname>
            </acl>
+           <acl type="permit">
+               <hostname>192.168.1.123</hostname>
+           </acl>
        </acls>
        <!--
            <auth> directive:

  とりあえず、以下のコマンドで起動して……

wbel4-co:/etc/iiim # iiimd

  ……ちゃんとポートが開いているか確認する。

wbel4-co:/etc/iiim # netstat -an | grep 9010
tcp        0      0 0.0.0.0:9010                0.0.0.0:*                   LISTEN

  次は、Emacsのインストール。ちょっと古いバージョンだが、ディスク上に置いてあったパッケージをそのまま使った。emacs-elをインストールするのは、IIIMFの動作に必要なMule-UCSモジュールが含まれているからである。

wbel4-co:/root # rpm -Uvh /mnt/bin2/WhiteBox/RPMS/emacs-21.3-19.EL.1.i386.rpm /mnt/bin2/WhiteBox/RPMS/emacs-common-21.3-19.EL.1.i386.rpm /mnt/bin4/WhiteBox/RPMS/emacs-el-21.3-19.EL.1.i386.rpm
警告: /mnt/bin2/WhiteBox/RPMS/emacs-21.3-19.EL.1.i386.rpm: V3 DSA signature: NOKEY, key ID 73307de6
Preparing...                ########################################### [100%]
   1:emacs-common           ########################################### [ 33%]
   2:emacs                  ########################################### [ 67%]
   3:emacs-el               ########################################### [100%]

  一応、Emacsが起動することだけは確認しておく。

wbel4-co:/root # emacs test.txt

  画像の説明

  やはり、Red HatのRPMパッケージは、限られた環境用に動作確認し「商品として」提供しているだけあって、何も考えずに利用でき、非常に安心して利用できる。

  次はIIIMECFのインストール。パッケージに添付のREADMEにしたがって、バイトコンパイル、インストールする。

wbel4-co:/root/atok_install # tar xvfz IIIMECF-0.73.tar.gz
 
wbel4-co:/root/atok_install/iiimecf # emacs -q --no-site-file -batch -l iiimcf-comp.el
Remove old byte-compiled files-----
Compiling 1st stage-----
While compiling the end of the data in file /root/atok_install/iiimecf/lisp/iiimp.el:
  ** The following functions are not known to be defined:
    find-coding-system, iiimp-coding-system-or-name-p,
    make-network-process, char-to-ucs, ucs-to-char
Wrote /root/atok_install/iiimecf/lisp/iiimp.elc
While compiling the end of the data in file /root/atok_install/iiimecf/lisp/iiimcf.el:
  ** The following functions are not known to be defined:
    event-to-character, character-to-event, event-key,
    dispatch-event, next-event,
    iiimcf-server-control-get-hotkeys-by-label
Wrote /root/atok_install/iiimecf/lisp/iiimcf.elc
While compiling iiimcf-UI-insert-preedit in file /root/atok_install/iiimecf/lisp/iiimcf-UI.el:
  ** reference to free variable jit-lock-first-unfontify-pos
  ** assignment to free variable jit-lock-first-unfontify-pos
Wrote /root/atok_install/iiimecf/lisp/iiimcf-UI.elc
While compiling the end of the data in file /root/atok_install/iiimecf/lisp/EIMIL.el:
  ** The following functions are not known to be defined:
    compiled-function-arglist, compiled-function-instructions,
    compiled-function-constants, compiled-function-stack-depth
Wrote /root/atok_install/iiimecf/lisp/EIMIL.elc
Wrote /root/atok_install/iiimecf/lisp/PCE.elc
While compiling the end of the data in file /root/atok_install/iiimecf/lisp/iiimcf-sc.el:
  ** The following functions are not known to be defined:
    line-number-at-pos, maker-position, mark-position
Wrote /root/atok_install/iiimecf/lisp/iiimcf-sc.elc
 
wbel4-co:/root/atok_install/iiimecf # mkdir -p /usr/share/emacs/site-lisp/iiimecf
 
wbel4-co:/root/atok_install/iiimecf # cp lisp/* /usr/share/emacs/site-lisp/iiimecf

  バイトコンパイルされたファイルがインストールされていることを確認する。

wbel4-co:/root/atok_install/iiimecf # ls /usr/share/emacs/site-lisp/iiimecf
合計 624
-rw-r--r--  1 root  root    44312 12月  9 08:54 iiimcf.el
-rw-r--r--  1 root  root    26937 12月  9 08:54 iiimcf-sc.el
-rw-r--r--  1 root  root    21739 12月  9 08:54 iiimcf-UI.el
-rw-r--r--  1 root  root    48519 12月  9 08:54 PCE.el
-rw-r--r--  1 root  root    28738 12月  9 08:54 EIMIL.el
-rw-r--r--  1 root  root    60143 12月  9 08:54 ChangeLog
-rw-r--r--  1 root  root    83174 12月  9 11:11 iiimp.el
-rw-r--r--  1 root  root   151532 12月 18 01:41 iiimp.elc
-rw-r--r--  1 root  root    33606 12月 18 01:41 iiimcf.elc
-rw-r--r--  1 root  root    17628 12月 18 01:41 iiimcf-UI.elc
-rw-r--r--  1 root  root    24439 12月 18 01:41 EIMIL.elc
-rw-r--r--  1 root  root    22077 12月 18 01:41 iiimcf-sc.elc
-rw-r--r--  1 root  root    37349 12月 18 01:41 PCE.elc

  IIIMECFがインストールできたところで、Emacsから呼び出す設定を行う。とりあえず、最初は試しにrootユーザに設定しよう。これも、IIIMECFに添付のREADMEの記述を参考に設定する。

wbel4-co:/root # vi .emacs
;; .emacs
 
;;; uncomment this line to disable loading of "default.el" at startup
;; (setq inhibit-default-init t)
 
;; turn on font-lock mode
(when (fboundp 'global-font-lock-mode)
  (global-font-lock-mode t))
 
;; enable visual feedback on selections
;(setq transient-mark-mode t)
 
;; default to better frame titles
(setq frame-title-format
      (concat  "%b - emacs@" system-name))
 
(global-set-key "\C-h" 'delete-backward-char)
(global-set-key "\C-z" 'scroll-down)
(global-set-key "\C-u" 'undo)
(global-set-key "\C-]" 'call-last-kbd-macro)
 
(menu-bar-mode nil)
(column-number-mode t)
(setq blink-matching-paren nil)
 
(setq default-tab-width 4)
(setq default-fill-column 64)
(setq text-mode-hook 'turn-on-auto-fill)
 
(setq make-backup-files nil)
(setq auto-save-default nil)
 
;; ATOK X3 for Linux
(setq iiimcf-server-control-hostlist '("localhost:9010"))
(require 'iiimcf-sc)
(setq iiimcf-server-control-default-language "ja")
(setq iiimcf-server-control-default-input-method "atokx3")
(setq default-input-method 'iiim-server-control)
(define-key global-map "\C-q" 'toggle-input-method)

  冒頭は、WBELのEmacsパッケージのデフォルト設定。その後ろがオレ用設定。末尾の7行がIIIMECF用の設定なのだが、この設定を付加し、Emacsを起動、Ctrl+qでATOKを起動しようとすると……

Args out of range: 0, 9

  ……なんじゃ、このエラーは!? 今日はここまで。


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

  画像の説明

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


2007-12-20(Thu) Emacs + IIIMECF + ATOK X3 = 結構シアワセ

  さて、無事coLinux上のEmacsからATOKが利用できるようになったワケだが、それでも「全然使えねぇ」状態である。

  と、いうのも、オイラはブラインドタッチを習得すると同時に、カーソルキーやファンクションキー等の特殊キーとは訣別しているからである。思えば、ブラインドタッチを習得したのは、オイラが某務員だった頃、職場で一太郎V4をイヤイヤ使っていた頃だ。つまり、何が言いたいかというと、文節の調整、ひらがなカタカナ変換等、すべてコントロールキーによる操作でなければ、思考の流れが中断されてしまい、ATOKによる少々の変換効率の向上などは、全くの無価値になってしまうほど、生産性が落ちてしまうのである。

  IIIMECFではデフォルトでこれらのキーが使えない。しかし、チョイチョイとイジればどうにかなりそうな気配を感じさせつつ、そこはそれLISPの文法を知らないオイラには、その小改造が非常に高い壁となってそびえるのである。

wbel4-co:/root/atok_install/iiimecf # vi lisp/iiimcf.el
 
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf.el.org lisp/iiimcf.el
*** lisp/iiimcf.el.org  2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el      2007-12-23 03:33:55.000000000 +0900
***************
*** 284,289 ****
--- 284,302 ----
 
  (defvar iiimcf-keycode-spec-alist
    `((13 10 0)
+
+     (11 37 65535)     ; Ctrl + k
+     (12 39 65535)     ; Ctrl + l
+     (14 40 65535)     ; Ctrl + n
+
+     (21 117 65535)    ; Ctrl + u
+     (9 118 65535)     ; Ctrl + i
+     (15 119 65535)    ; Ctrl + o
+     (16 120 65535)    ; Ctrl + p
+
+     (2 38 65535)      ; Ctrl + b
+     (7 27 65535)      ; Ctrl + g
+
      (32 32)
      ,@(mapcar #'(lambda (x) (list x x 0))
              (iiimcf-numseq 1 31))
 
wbel4-co:/root/atok_install/iiimecf # emacs -q --no-site-file -batch -l iiimcf-comp.el; cp lisp/* /usr/share/emacs/site-lisp/iiimecf

  結局、これも書いてみれば、なんということはない修正だが、これまたかなり地獄を這いずり回った成果である。本当はCtrl+nは文節確定ではなく、次文節にしたいところだし、Ctrl+gでなくESCで変換状態解除→IME解除という動作、つまりはイヤイヤながら体に染みついてしまったMS-IMEと同じ動作をさせたいところであるが、とりあえず、LISPを読めないオイラには上記の改造が限度である。

  だが、上記の設定が成功したトコロで、別の致命的な問題に突き当たってしまった。それは、IMEがオンの状態だと、半角スペースが入力できないという問題である。ここはShift+SpaceでIMEをスルーして半角スペースを入力できなければならない。特に、仕事で書くメールは等幅フォントでの読みやすさに配慮して、基本的に英単語の前後には半角スペースを置くことが慣例となっている。これまた、改善できないようだと、イチイチIMEを上げ下げする必要が生じ、やっぱり使い物にならない。

  だが、この問題には心底疲弊させられた。何をやってもウンともスンともいわない。結局、あまりにも地獄から抜け出せないので、心を少々閻魔様に売り渡してしまった。LISP自体について、少々学び始めてしまったのである。オー、マイガー。

  しかし、LISPを学んで、如何にコードを読めど、解決できない。Spaceキーは検知するのだが、どうしてもShiftキーと同時に押しているというコトを検知してくれない。せっかく、信念を曲げてまでLISPを学び始めたのに、この問題が解決できないとなれば、LISPの文法をストアしてしまった左脳の一部はどうすればいいんだ。無駄だ。無駄すぎる。歯磨きのCMで覚えてしまった、グリチルリチン酸ジカリウムという物質を覚えている以上に無駄だ。北京原人の本名であるシナントロプスペキネンシスという学名と一緒に単に捨ててしまいたい記憶に成り下がってしまうのか……。

  ……と、そこでフト気づいた。オイラはTERATERM上から作業をしているが、実際にどんなキーが飛んでいるのか? Shiftを併用しているのだから、大文字のSpace……が飛ぶワケはないッ!! そこで、わざわざssh接続をtelnet接続に切り替えて、tcpdumpを取ってモニタしてみた……変わってねぇ!! そもそも、端末からShiftが飛んでねぇんじゃん!!

  こりゃ、まずはTERATERMをどうにかする必要があるってコトだ。TERATERMのマニュアルを読むと、イニシエのVT100互換の動作をさせるためなのか、特殊キーはすべてカスタマイズ可能になっているようだ。TERATERMはWindows上のどのようなキーの組み合わせも(Fnほか一部のキーは無理だが)、変換テーブルを経由して、接続相手に渡すことができる。それならばShift+Spaceを、いったん使用頻度の低い無関係のキーに割り振って、Emacs側でそれを検知すればいいんじゃねぇか?

SUZAKU:/cygdrive/c/Program Files/TTERMPRO $ diff KEYBOARD.CNF.org KEYBOARD.CNF
78,81c78,81
< ;F11 key
< F11=87
< ;F12 key
< F12=88
---
> ;F11 key (Ctrl + Henkan)
> F11=1145
> ;F12 key (Shift + Space)
> F12=569

  ついでに、Ctrlキー+変換キーについても定義してみた。先まで、IMEのオンオフに便宜的にCtrl+qを割り当てていたが、やっぱりコレには変換キーを使いたい。んが、MS-IMEとは独立して利用したいので、Ctrl修飾を入れるのだ。これは、Ctrl+XF1でASKをオンオフするX68000とも少し似ているが、当然ながら、それは偶然ではない。なお、使用頻度の低いキーとしては、F11とF12を選択した。パンピーの中には、Shift+←/→で文節変換をしたい人も多いだろうが、これと同じ方法で可能だろう。

  で、IIIMECF側の設定はこうだ。

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:33:00.000000000 +0900
***************
*** 148,153 ****
--- 148,154 ----
      (define-key map "\C-c\C-\\\C-i" 'iiimcf-server-control-change-input-method)
      (define-key map "\C-c\C-\\\C-s" 'iiimcf-server-control-switch-le)
      (define-key map "\C-c\C-\\\C-k" 'iiimcf-server-control-switch-keyboard)
+     (define-key map `[f12] 'iiimcf-server-control-keyforward)
      map))
 
  ;; keymap for preedit state
 
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf.el.org lisp/iiimcf.el
*** lisp/iiimcf.el.org  2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el      2007-12-23 03:37:06.000000000 +0900
***************
*** 548,553 ****
--- 561,567 ----
              kmod  (logior kmod
                            (or (nth 3 slot) 0))))
      (if (and (null kcode) (numberp kchar)) (setq kcode 0))
+     (if (eq kcode 123) (setq kcode 32 kmod 1))
      (if (numberp kcode)
        (list (cons 0 kcode)
              (cons 0 kchar)

  本当は、キーの変換テーブルの部分を書き換えることでどうにかできそうな雰囲気もあるが、にわかLISPerのおいらには無理な話だ。これ以上、LISPにはこっちに寄ってきてほしくないので、これで勘弁。問題なく動き、正月は迎えられる。いいじゃん、コレで。な、な。

  つーわけで、やや、気になる部分は残るものの、95%は違和感なく操作できるような環境になったのであるが、どーも、ノリノリな気分にならない。いまひとつ、レスポンスがニブいからか? また、MS-IMEを使い慣れてしまったせいか、文節ごとに変換キーを叩くクセが抜けないからか? とりあえず、今日はここまで。


2007-12-30(Sun) たぶんドルアーガのゴーストが持ってるアレを作る

  正月だ。まとまった休みだ。ここんとこ忙しくて、サッパリ工作をしていない。ハンダゴテにクモの巣がかかる前に、オイラに搭載されているDRAMの記憶が揮発する前に、なんか作ろう。そうしよう。

  画像の説明 画像の説明

  というわけで、まずはリハビリ。以前に先行して入手していた「共立のキャンドルIC」と「秋月の傾斜・振動センサ」「100円ショップのランプ(ガワ)」を使って、ちょっとしたランプを作るのである。

  まずは「LEDを盛り付け」る。炎をイメージして、下部から、白、黄色、オレンジ色を配置。「白」と「黄色、オレンジ色」は個別に点灯できるようにする。

  画像の説明 画像の説明

  画像の説明

  あまり考えなしに作っていたら、カソードコモンなブツになっていた。こうなると、NPNでなく、PNPで引っ張る必要がある。2SC1815は大量に在庫しているが……と、どうにか、2SA1015が見つかった。よっしゃ。

  次はランプの中の容積を考えながら、基板サイズを決定。容積は極めて限定されている。いつものことだが、かなり無理矢理に集積する。でも実は、オイラ的には、この配線パターンのデザインこそ一番楽しくコダわるところかもしれない。詰め将棋とかコードゴルフみたいでオモシロいんだよね。よし。どうにか詰め込んだ。

  画像の説明

  最後にコード。ひさびさのPICアセンブラだったが、それなりにコード事例が蓄積されているので、さほどの苦労もなく完成。

  画像の説明 画像の説明

  このランプの機能は、振動を感知すると、LEDを炎のようにユラユラとした光で点灯。数十秒後に白LEDが消灯して減光、そのまま振動を与えないと、さらに数十秒後に全LEDを消灯する。

  最近はやや収まったものの、オイラの息子のイッペイは、非常にコロコロと寝床を縦横無尽に転がるので、オイラが寝るときに、踏んだり蹴ったりしないよう、コレを持って寝床に向かうのである。で、枕元に置けば勝手に消える。おぉ、便利。

  画像の説明

  しかし、ちょっと光が弱かったかな。また、振動センサの玉が微妙なところに位置するからか、時々、LEDが消えない時がある。まぁ、そのうち改善することにしよう。

  とりあえず、ファイル一式を置いておく。