Debian lenny (以降) で Wnn7 を使う

ハードディスクが飛んでしまい、これを機会に Debian の新しいバージョンをすっかりはじめからインストールした。随分楽になったものだ。さてここでシステムの locale を最近の流行りにしたがって ja_JP.UTF-8 にしたのだが、これが後で問題となった。 sid (unstable) に入れ替えつつ、さらに必要なものを少しづつインストールして、クラッシュ直前の使い勝手に近づいてきたのだが、常用していた debian 外の日本語入力システム Wnn7 はライブラリの依存の問題でインストールすることができなかった ((ハードディスクが壊れる直前はその時点でほぼ最新の sid だったのだが、ずっと以前にインストールした Wnn7 に依存される形で古いライブラリが残っていて、 Wnn7 は正常に動いていた。)) 。商用ソフトでしかも2001年発表というものなので、しかたないかもしれない。Wnn8 ならインストールできるかもしれないが、これですら2005年発表なので今さら買う気にもなれない。 1ヵ月ほど Anthy を使ってみたものの、20年近くも Wnn を使い続けてきた感覚のためか、どうにもストレスを感じて仕方がない。特に Wnn7 の「異体字変換」機能に相当するものを Anthy に見つけることができなかったところで、とうとう我慢ができなくなった。 というわけで、Wnn7 を2009年1月現在の debian sid にインストールしてみることにした。アップデートセンター から(当時の debian に対応した) deb パッケージが手にはいる。

dpkey7

そのままではインストールはできるが libc6 のバージョンが合わず起動しない。ここでは強引な方法で解決した。上記のアップデートセンターの「ライセンスサーバー」の項を見ると「glibc2.3 対応版」が出ていることがわかる(ただし rpm のみ)。この中から実行ファイルのみ(2つ)を取り出して、これに差し換えた deb を作り直してインストールすることにした。 ネットで検索すると、chroot 環境に古い libc6 (libc6_2.3.2.ds1-22_i386.deb) を飼うという解決法が見つかる。さらに将来を考えるとこのほうがいいのかもしれない。

wnn7-utils、辞書

wnn7-utils, maindic, optiondic は特に問題なくインストールできる。

wnn7-server

# dpkg-deb -x wnn7-server_1.01-1_i386.deb wnn7-server
# dpkg-deb -e wnn7-server_1.01-1_i386.deb wnn7-server/DEBIAN
で開梱し、DEBIAN/control の Depends の行にある古いライブラリを現在のものに書き換える。 libglib1.2 は libglib1.2ldbl に、またxlib6g はなくなってしまったので、個々のライブラリにする。したがって depand の行は
 Depends: libc6 (>= 2.1.2), libglib1.2 (>= 1.2.0)|libglib1.2ldbl, libgtk1.2 (>= 1.2.7-1), libXi6, libxext6, libx11-6, libxau6, libxcb-xlib0, libxcb1, libxdmcp6
とした。libgtk1.2 は辛うじて現在の debian にも残っているのでよかった。 開梱したものを
# dpkg-deb -b  wnn7-server wnn7-server_1.01-1p1_i386.deb
のようにして再びパッケージ化して、インストールした。

wnn7-elisp

Depends に Emacs のバージョンが固定的に書かれているので、新しいEmacs でも大丈夫なように、先ほどと同様に、emacsen と書き加える。 また、usr/lib/emacsen-common/packages/*/wnn7-elisp の中の case 文にもバージョンが固定的に書かれているので、ここに新しいバージョンを加える。 ここまでで、dpkeystat で ライセンスサーバが起動していることを確認でき、wnnstat で変換サーバが起動していることを確認できる。そして Emacs をクライアントとして正しく日本語入力と変換ができることを確認できる。

wnn7-xclients

最後に、xwnmo の含まれるこのパッケージも、同様に Depends の行を書き換える。
 Depends: debhelper, debconf, libc6 (>= 2.2.4-4), libglib1.2 (>= 1.2.0)|libglib1.2ldbl, libgtk1.2 (>= 1.2.10-4), libXi6, libxext6, libx11-6, libxau6, libxcb-xlib0, libxcb1, libxdmcp6, libXmu6, libXt6, libsm6, libice6
とした。

設定

はじめに書いたようにシステムの locale を UTF-8 にしたのだが、これが原因で xwnmo が機能しなかった。ユーザーの .bash_profile で、LANG=ja_JP.eucJP と設定することにした。他のアプリケーションでそのうち困ることが出てくるかもしれないが。 そのほかの環境変数は、Wnn7 をインストールするより前に Anthy を入れた関係で im-switch もインストールしていたので、この際その流儀に合わせることにした。/etc/X11/xinit/xinput.d/ の default-xim を xim-wnn7 という名前でコピーして
XIM=_XWNMO
XIM_PROGRAM="/usr/bin/xwnmo"
XIM_ARGS="-map -g 1x1-0-0"

GTK_IM_MODULE=xim
QT_IM_MODULE=xim
とした(XIM_ARGSはご自由に)。あとは im-switch -s xim-wnn7 で切り替えておく。

PostgreSQL を 8.3 に

バックエンドに PostgreSQL を使っているのは、自前のデータベースのほかに Trac と MediaWiki だ。バージョン 8.3 が出てから1ヵ月以上経つし、MediaWiki の 1.12.0rc1 で PostgreSQL 8.3 対応の文字が見えてきたのでそろそろ大丈夫だろうとバージョンアップしてみた。

debian の場合 pg_upgradecluster で簡単にデータの移行ができる……はずだったのだが一筋縄ではいかなかったのだった。きっと数ヵ月後には根本的に解決されていて役に立たない情報になるだろうが、記録しておく。

自前のデータベース

PostgreSQL の contrib に含まれている isn.sql ((書籍コードの ISBN をひとつの変数型として扱うためのもの。))を利用している。この isn.sql も 8.2 と 8.3 で若干違っているようで、pg_dump したものを読み込ませてもうまくいかなかった。

しかたがないので、pg_dump したものを isn.sql 関連の定義前の部分、isn.sql による部分、その後の部分の3つに分け、前の部分を読み込ませた後、contrib の isn.sql を読み込ませ、それから後の部分を読み込ませることで、ようやくデータの移行ができた。

自前で書いていたフロントエンドは特に問題なしと思ったら、

互換性のない変更点
文字でない型 (日付型など) を自動的に text 型に変換しないようにしました。
今までは text 型入力を受けとる演算子や関数に文字でない値が渡されると、自動的に text 型にキャストしていました。 これからは text 型でないデータを渡したい場合には text 型への明示的なキャストが必要になります。
に引っかかるところが数ヵ所見つかった。演算子 ~ はテキスト型にしか使えないとのこと。暗黙のルールは使わないようにしているつもりでもうっかり使っているのものだなと思った。

Trac

データの移行はすんなりとできた。が、使ってみるとエラーが出る。上と同様、キャストに関わる問題のようだ。検索して、64166512の変更を加えて、うまく動くようになった。

MediaWiki

MediaWiki で使っている tsearch2 は PostgreSQL 8.2 では contrib だったのが 8.3 では本体に組み込まれた。と言っても関数名等の互換性を取るために 8.3 でも contrib の tsearch2.sql を読み込ませる必要がある。上述したのと同じように dump を分割してデータを移行した。

これで大丈夫と思ったら、記事を書き換えようとした際にエラーが出た。ts2_page_text() で tsvectorの引数の ‘default’ は存在しないというもの(すみません、メッセージを正確に記録していませんでした)。

maintenance/postgres/tables.sql の 当該関数の定義箇所を見てみると

-- Tsearch2 2 stuff. Will fail if we don't have proper access to the tsearch2 tables
-- Note: if version 8.3 or higher, we remove the 'default' arg
とのコメントがある。1.12.0rc1 ではまだ対応されていないのだった。新しい版を見るとコメントがつけ加えられていて、patch-tsearch2funcs.sqlの存在を教えてくれた。これを適用して、問題なく動くようになった。

kernel 2.6.24

随分長いこと間があいてしまった。この間いろいろなことがあったのだが、今日はとにかくどこかにメモしておくべきことをメモしておく。 カーネルをバージョンアップ。Debian なのでそれ自体はいたって簡単。いつのまにか -k7 パッケージはなくなっていて、-686 に統合されたらしい。 メモしておくべきなのは、独自にいれているモジュールなど。nvidia は module-assistant のおかげでいまや特筆すべきことはない。shfs は前もひどく苦労したのだが今回もうまくいかず、と思ったらパッケージそのものが Debian から消えつつある。というわけで sshfs に乗り換えることにした。こちらはあっさり入れることができた。 そして VMWare (VMware-server-1.0.4-56528)でも一苦労。検索して Running VMWare Workstation on Ubuntu Hardy Herronという情報にたどり着き、ようやく動いた。カーネル 2.6.22 では any-any パッチすら不要だったので、じきにすんなりはいるようになるとは思うが。

gdm でのシャットダウンの禁止

特に設定しないと gdm のグリーティング画面で、「アクション」から誰でもシャットダウンや再起動ができてしまう。これではコンソールの前を通りかかった人は誰でも実行できてしまうので困ったものだと思うのだが、GNOME の考え方なのだろう、以前からこれがデフォルトだ。

また、いったんログインすれば、メインメニュー「シャットダウン」の項目があり、一般ユーザーがシャットダウンできてしまう。意図的でなくてもメニューで「ログアウト」と隣合っているので、うっかり間違えてシャットダウンしてしまうことがある。別のユーザーがリモートからそのマシンを使っていると困ったことになる。

シャットダウンを禁止するには、GNOME 2.18 では、gdm の設定ファイル /etc/gdm/gdm.conf ((gdm のマニュアルを見ると /etc/gdm/custom.conf という名前のようだが、Debian では古い名前 /etc/gdm/gdm.conf が使われ続けているようだ。)) の [deamon] セクションに

[daemon]
HaltCommand=
RebootCommand=
と書き加えればよかった。シャットダウンと再起動用のコマンドに空を指定することで、自動的にグリーティング画面の「アクション」メニューから「シャットダウン」「再起動」の項目が消え、ログインした一般ユーザーのメインメニューからも「シャットダウン」が消えていた。

ところが、gdm 2.20 になると、グリーティング画面の「アクション」からは消えるが一般ユーザーのメインメニューには「シャットダウン」が出るようになってしまった ((ロックダウン・エディタ pessulus を使うことも考えたが、これで「ログアウトを無効にする」と「シャットダウン」も「ログアウト」も一緒にできなくなってしまう。これらを別々に設定することはできない。))。

gdm の設定の [daemon] セクションを見ると、 AllowLogoutActions という項目が 2.20 から増えていた。これに空の値を指定する、つまり先ほどの2行に加えて

AllowLogoutActions=
と書くことで、一般ユーザーのメインメニューから「シャットダウン」を消すことができた。

【2011年6月29日追記】 GNOME でのシャットダウンの禁止—最近の流儀 を書きました。

emacs22 と wnn7-elisp パッケージ

Debian sid に emacs22 (とその GTK版emacs22-gtk) が降りてきた。さっそく入れようと思ったがいくつかのパッケージが対応していない。特に wnn7-elisp は Debian 公式のものではなく、商用(しかも5,6年も前)なので対応パッケージが出るとも思われない。自分で修正することとした。
--- wnn7-elisp.orig/DEBIAN/control	2002-05-22 18:42:05.000000000 +0900
+++ wnn7-elisp/DEBIAN/control	2007-07-09 15:02:36.000000000 +0900
@@ -1,13 +1,13 @@
 Priority: extra
 Architecture: all
-Depends: emacs20 | emacs20-dl | xemacs21-mule | xemacs21-mule-canna-wnn
+Depends: emacs22 | emacs-snapshot | emacs21 | emacs20 | emacs20-dl | xemacs21-mule | xemacs21-mule-canna-wnn
 Installed-Size: 587
 Maintainer: OMRON SOFTWARE Co.,Ltd. <wnn-info@omronsoft.co.jp>
 Description: A package of Japanese input method 'Wnn7' elisp client.
diff -u -r wnn7-elisp.orig/usr/lib/emacsen-common/packages/install/wnn7-elisp wnn7-elisp/usr/lib/emacsen-common/packages/install/wnn7-elisp
--- wnn7-elisp.orig/usr/lib/emacsen-common/packages/install/wnn7-elisp	2002-05-22 18:41:59.000000000 +0900
+++ wnn7-elisp/usr/lib/emacsen-common/packages/install/wnn7-elisp	2007-07-10 21:50:47.818091867 +0900
@@ -37,7 +37,7 @@
     emacs)
     ;;
 
-    emacs20|xemacs21)
+    emacs22|emacs-snapshot|emacs21|emacs20|xemacs21)
     install -m 755 -d ${ELCDIR}
     (cd ${ELDIR}
 
diff -u -r wnn7-elisp.orig/usr/lib/emacsen-common/packages/remove/wnn7-elisp wnn7-elisp/usr/lib/emacsen-common/packages/remove/wnn7-elisp
--- wnn7-elisp.orig/usr/lib/emacsen-common/packages/remove/wnn7-elisp	2002-05-22 18:41:59.000000000 +0900
+++ wnn7-elisp/usr/lib/emacsen-common/packages/remove/wnn7-elisp	2007-07-10 21:51:17.472192301 +0900
@@ -10,7 +10,7 @@
 case "${FLAVOR}" in
     emacs)
     ;;
-    emacs20|xemacs21)
+    emacs22|emacs-snapshot|emacs21|emacs20|xemacs21)
     echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
     rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
     rm -f ${STARTDIR}/50${STARTFILE}*;
wnn7-elisp の他にも auctex, gnus も同様に修正すればいますぐ使える。これらは公式パッケージなのでしばらく待てば emacs22 対応版が出るだろう。

NICとインターフェイス名

以前、[[//pasero.net/~mako/blog/s/34#intel_pro_1000gt|「で、使わないオンボードLANとieee1394をBIOSで殺しても、新しいNICは eth0 にはな らず eth2 としてしか認識してくれない。」]]と書いたのだが、その答が[[http://lists.debian.or.jp/debian-users/200702/msg00039.html|Debian JP Users ML]] に流れてきた。これか!と思って自分のところの/etc/udev/rules.d/z25_persistent-net.rules を見てみたら、確かにここで当該NICをeth2にするという設定になっていた。

NICとkernel 2.6.18

Intel PRO/1000GT

オンボードのLANチップがどうにも調子が悪く、新たにIntel PRO/1000GTを差した。で、使わないオンボードLANとieee1394をBIOSで殺しても、新しいNICは eth0 にはならず eth2 としてしか認識してくれない。

dmesg を見ると、

...
e1000: 0000:00:0d.0: e1000_probe: (PCI:33MHz:32-bit) 00:0e:0c:xx:xx:xx
e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
...

なのに、/etc/network/interfacesには eth0やeth1と書いてもだめで、

auto eth2
iface eth2 inet static
...

としないと設定できない。どうしてだろう。

kernel 2.6.18

さて上記に伴って、まずvmplayerでネットが使えなくなってしまい、vmware-config.pl もカーネルとヘッダの情報が云々…でできないという状態だったので、思いきって sid の linux-image-2.6.18-1 に入れ換えてからやることにした。

vmplayerもすっかり入れ換えて、これは動くようになった。

別に入れているモジュールも入れ直し。nvidia-kernel-sourceは特に問題なし。shfs-sourceはコンパイルできず。バグ情報を見つけて、shfs-0.35-6-2.6.18.diffのパッチを当ててようやくできた。

e1000モジュールはカーネル同梱のもので動いているのでそのまま。というか新しいものを持ってきてコンパイルしようとしたが、まずバージョン情報を取得できず、これは2.6.18では UTS_RELEASE が include/linux/version.h と別になって include/linux/utsrelease.h になっているからのようだ。で、Makefileを書き換えてみたのだが、今度は

error: 'struct skb_shared_info' has no member named 'tso_size'

のエラーが出て失敗。e1000_main.cの’tso_size’を’gso_size’に書き換えればいいというのを見つけて、これでコンパイルできた。