Wnnは日本語を入力する際に、仮名漢字変換を行なってくれるサーバです。 Mule などから利用します。
Wnn (jserver)はネットワークを使用して動作するので、 たとえネットワークに接続してないマシンでもカーネルでループバックを 有効にしておく必要があります。 このとき socket を /tmp に作成するので /tmp に書き込めるように しておく必要もあります。
また uum は pty を利用するのでこれも必要です。 X が動作している環境ならどちらも有効になっています。
まず、Wnn 4.2 にはいくつかバグがあります。また 4.4BSD に なった際の仕様変更などにより、いくつか問題が発生します。
なお、これらを修正するには、このページの記述をおこなっていくのも いいですが、FreeBSD の ports に含まれているパッチをあてるのが はっきりいって便利です。
新しい X (XFree86 3.1.2D 以降。X11R6.1になった)では、 imake の記述ルールが変わった関係から、Wnn4.2付属の Project.tmpl では正常にコンパイルできなくなっています。 Wnnの配布に付属する Project.tmpl から Wnn に関連した部分を抜き出して来て X11R6.1 の Project.tmpl に追加し、それをWnn4.2の Project.tmpl として使用することで問題なくコンパイル可能です。
具体的には、このファイルを、 X11R6.1 の Project.tmpl の末尾に追加して、その新しい Project.tmpl を Xsi/config/Project.tmpl と差し替えます。 このファイルは、Xsi/config/Project.tmpl の 1084 行目 以降を切り出して、その中の "$$imakeprefix" となっている部分(4箇所) を"$(IMAKEPREFIX)"と置き換えたものです。
以下は差し替えの例です。
% cd Xsi/config % cat /usr/X11R6/lib/X11/config/Project.tmpl \ $(SRCDIR)/Project.tmpl.wnn > Project.tmpl
さらにさらに、どのバージョンからかなのは調べてないのですが、 (すくなくとも正規の X11R6.3はそうなっている。XFree86 では不明)、 Imake の X関連のテンプレートファイルの名称が Prpoject.tmpl から X11.tmpl に変更になっています。 このため、コンパイルをしようとしても、Wnn の設定が全く反映されない という現象がおこります。これの修正は単純で、Project.tmpl の名前を X11.tmpl に変更するのみです。
% cd Xsi/config % cat /usr/X11R6/lib/X11/config/X11.tmpl \ $(SRCDIR)/Project.tmpl.wnn > X11.tmpl
wnn はデフォルトの設定では以下の場所にインストールされます。
/usr/local/bin/Wnn4 コマンドなど /usr/local/lib/wnn 辞書、設定ファイル $(LIBDIR) ライブラリ $(INCDIR)/wnn ヘッダファイル $(MANDIR) マニュアル
wnn は 普通ユーザー wnn で動作させます。 あらかじめこのユーザーをつくっておきます。
% su # vipw wnn:*:9000:7::0:0:Jserver:: などを加える
ユーザ ID などは適宜設定して下さい。 グループは、/etc/group に "wnn" をつくってそれを利用してもいいし、 bin(7番) を使っても問題ないようです。
まずパッケージを入手し、適当な場所に展開します。 ソースは以下の場所などにあります。
ftp://ftp.tut.ac.jp/UNIX/wnn/Wnn4.2.tar.gz
ソースを展開します。
% cd $(TOPDIR) % tar zxvf $(SRCDIR)/wnn42.tar.gz
Wnn4.2 には、中国語を入力するための cWnn(cserver)や 韓国語を入力するための kWnn(kserver)、また X での日本語入力のための Xwnmo などが含まれますが、この文書では日本語のための Wnn(jserver) のみ インストールします。
X11R6 がインストールされている環境でのインストールを示します。 インストールする前に、いくつか修正しておきます。
INSTINCFLAGS = InstIncFlags -c INSTDATFLAGS = InstDatFlags -c INSTBINFLAGS = InstBinFlags -cを適当な位置に加えます。INSTAPPFLAGS の設定(416行)の上あたりでいいでしょう。 標準の設定では、インストールの際に -c オプションを つけないようになっていて、インストールする時に元のファイルを 消してしまい、正常にインストールできません。 そこで、常に -c オプションをつけるように設定します。
XFree86(NetBSD) の標準の設定ではマニュアルを Imakefile で InstallManPage を使ってインストールした場合 nroff で処理してテキストの形式にしてから、 $(MANPATH)/cat$(MANSUFFIX) に格納しています。nroff コマンドを 日本語対応のものに置き換えておけば、 きちんと日本語で処理されたテキスト形式のマニュアルができます。 これを行なうには、
NROFF = /usr/local/bin/jgnroff -Tnippon NEQN = /usr/local/bin/jgneqn -Tnippon COL = /bin/cat MANPATH = /usr/local/jmanを Project.tmpl の先頭に付け加えておきます。 jman の設定にあわせてマニュアルの格納ディレクトリを 変更していることに注意してください。 なおあらかじめ日本語対応の groff をつくっておく必要があります。
テキスト化をせずに、そのままの形でインストールして、 jman コマンドの実行の際に整形させるようにしたければ、 Project.tmpl の先頭に以下のように付け加えます。 jman の設定にあわせてマニュアルの格納ディレクトリを 変更していることに注意してください。
MANDIR = /usr/local/jman/man$(MANSUFFIX) #ifdef InstallManPageLong #undef InstallManPageLong #endif #define InstallManPageLong(file,destdir,dest) @@\ InstallNamedTarget(install.man,file.man,$(INSTMANFLAGS),destdir,dest.$(MANSUFFIX))
#ifndef BuildWnn #define BuildWnn YES #endif #ifndef BuildCWnn #define BuildCWnn NO #endif #ifndef BuildKWnn #define BuildKWnn NO #endif #ifndef BuildXwnmo #define BuildXwnmo NO #endifとします。これで jserver のみの作成になります。
#ifndef BuildJlibV3 #define BuildJlibV3 YES #endifも設定します。この場合には、次の修正も必要になります。
SRC1= jlv3.c OBJ1= jlv3.o SRC2= $(WNNETCSRC)/gethinsi.c OBJ2= gethinsi.o SRC3= $(WNNETCSRC)/sstrings.c OBJ3= sstrings.o SRCS= $(SRC1) $(SRC2) $(SRC3) OBJS= $(OBJ1) $(OBJ2) $(OBJ3) 略 InstallNonExecFile($(WNNINCLUDESRC)/jlib.h,$(JWNNINCDIR)) 略 WnnSpecialObjectRule($(OBJ2),$(SRC2),$(WNNETCSRC),) WnnSpecialObjectRule($(OBJ3),$(SRC3),$(WNNETCSRC),)これらを次のように直します。
SRC1= jlv3.c OBJ1= jlv3.o SRC2= $(WNNETCSRC)/gethinsi.c OBJ2= gethinsi.o SRC3= $(WNNETCSRC)/sstrings.c OBJ3= sstrings.o SRC4= $(WNNETCSRC)/xutoj.c OBJ4= xutoj.o SRCS= $(SRC1) $(SRC2) $(SRC3) $(SRC4) OBJS= $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) 略 InstallNonExecFile(jlib.h,$(JWNNINCDIR)) 略 WnnSpecialObjectRule($(OBJ2),$(SRC2),$(WNNETCSRC),) WnnSpecialObjectRule($(OBJ3),$(SRC3),$(WNNETCSRC),) WnnSpecialObjectRule($(OBJ4),$(SRC4),$(WNNETCSRC),)
Wnn(Jserver)の端末用のフロントエンドとして uum が提供されています。 しかし、これは正常に動作しません。
変換などの動作自体は正常です。uum の基本的な原理は、 仮想端末を開いてその上でシェルを開き直し、標準入力 からの入力に手を加えるようにというものです。
この仮想端末を開く際に、utmp にその情報を書き込んでいます。 ところが、終了時にこの情報を復帰させることができません。 これによる弊害は w コマンドの表示が変になる。login の情報がおかしくなる などがあります。
これを修正するには大がかりな変更が必要ですが、めんどうなので、 utmp に書き込みを行なわないことにします。( login, rlogin, telnet 以外 では、特に utmp に書き込みを行なう必要はありません )
SRC1= .... OBJ1= ....の部分から、setutmp.c と setutmp.o を削除します。
utmp 関連の関数呼び出しをすべて無効にします。 呼び出されているのは saveutmp(), setutmp(), resetutmp() です。 265 - 269行
#if defined(BSD42) && !defined(DGUX) if (saveutmp() < 0) { puts("Can't save utmp\n"); } #endif /* BSD42 */1143-1146 行
if (setutmp(ttypfd) == ERROR) { puts("Can't set utmp."); }1565-1567 行
if (resetutmp(ttypfd) == ERROR) { printf("Can't reset utmp."); }
これらを削除またはコメントアウトします。
この他にも、インストール場所の変更なども可能です。 標準ではライブラリやヘッダが X のディレクトリに入ります。 なんとなく気持ち悪いので、私は次のようにしてます。
WNNINCDIR = $(INCROOT) WNNLIBDIR = $(USRLIBDIR)次のように変更
WNNINCDIR = /usr/local/include WNNLIBDIR = /usr/local/lib詳細は、$(TOPDIR)/Xsi/Wnn/READ.ME.j を参照してください。
InstallMultiple($(FZKDATA),$(JWNNPUBDICDIR)) InstallMultiple($(FZK_SRC),$(JWNNFZKSRCDIR))の部分に、以下のように追加します。
InstallMultiple($(FZKDATA),$(JWNNPUBDICDIR)) install:: @for i in $(FZKDATA);\ do $(WNNTOUCH) $(DESTDIR)$(JWNNPUBDICDIR)/$$i; done InstallMultiple($(FZK_SRC),$(JWNNFZKSRCDIR))
Wnn では、辞書のアクセスの高速化のために、辞書自身の inode 番号を ヘッダに保持して、それでアクセスします。そのため、コピーを行なった 際には wnntouch コマンドでこの inode 番号をきちんと合わせる必要 があります。ところが、このパッケージでは、附属語ファイルを インストールする際に、これをするのを忘れています。 ちゃんと wnntouch するように直します。
make install のあとで、 # cd /usr/local/lib/wnn/ja_JP/dic/pubdic # /usr/lcoal/bin/Wnn4/wnntouch *.fzk
これ以降の修正点は FreeBSD ports-current のパッチを参考 にさせてもらいました。
BSD4.4 にともなう UNIX DOMAIN の変更に対処 221行
if (connect(sd,(caddr_t)&saddr,strlen(saddr.sun_path)+sizeof(saddr.sun_family)) == ERROR) {を
if (connect(sd,(caddr_t)&saddr,SUN_LEN(&saddr)) == ERROR) {に変更
jserver のいたるところで、stderr にデータを出力してしまってる バグにたいする ad hoc な修正 66行め
#includeに
#includeと追加 266行目#include
if(!noisy){ fclose(stderr); }に
if(!noisy){ int fd; fclose(stderr); if ((fd = open("/dev/null", O_WRONLY)) < 0) { xerror("Cannot open /dev/null\n"); } dup2(fd, 2); close(fd); }と追加
初期化わすれ 425行
jt2 = (struct JT *)malloc(sizeof(struct JT)); *jt2 = *jt1;に
jt2 = (struct JT *)malloc(sizeof(struct JT)); *jt2 = *jt1; jt2->node = 0;を追加
エンディアン問題
100行目
/** For each tuple in ri1[0] create b_nodes */ for (i=0; iをmaxri1[0]; i++){ serial = (jt->ri1[0]+i)->pter; yomi = KANJI_str(jt->ri2[serial].kanjipter + jt->kanji, 0); b_index_add(jt, yomi, serial); }
/** For each tuple in ri1[0] create b_nodes */ for (i=0; imaxri1[0]; i++){ serial = (jt->ri1[0]+i)->pter; yomi = KANJI_str(ntohs(jt->ri2[serial].kanjipter) + jt->kanji, 0); b_index_add(jt, yomi, serial); }
133行目
int serial; { w_char *yomi; yomi = KANJI_str(jt->ri2[serial].kanjipter + jt->kanji, 0); delete_b_node(jt, yomi, 0, 0 ); }を
int serial; { w_char *yomi; yomi = KANJI_str(ntohs(jt->ri2[serial].kanjipter) + jt->kanji, 0); delete_b_node(jt, yomi, 0, 0 ); }に変更
162行
yo_kanji = KANJI_str( jt->ri2[jt->bind[tmp_node].pter].kanjipter+jt->kanji, 0) ;を
yo_kanji = KANJI_str( ntohs(jt->ri2[jt->bind[tmp_node].pter].kanjipter)+jt->kanji, 0) ;に変更
yo_kanji = KANJI_str( jt->ri2[jt->bind[tmp_node].pter].kanjipter+jt->kanji, 0) ;を
yo_kanji = KANJI_str( ntohs(jt->ri2[jt->bind[tmp_node].pter].kanjipter)+jt->kanji, 0) ;に変更
$(TOPDIR)/Xsi で
% make World -f Makefile.inst % su # make install ( # make install.man マニュアルもいれる場合 )
これでインストールは完了しますが、このままだと、ユーザー辞書を作る際に ディレクトリに書き込みできないとおこられます。あらかじめユーザー辞書の領域を 作成しておきます。
# cd /usr/local/lib/wnn/ja_JP/dic # mkdir usr # chown wnn usr以上で完了です。
コマンド jserver で起動します。
jserver をマシンの起動時に起動させたい場合は、 /etc/rc.local に以下のように追加します。
if [ -f /usr/local/bin/Wnn4/jserver ]; then /usr/local/bin/Wnn4/jserver echo 'jserver started.' fi
jserver の終了には、wnnkill コマンドを使用します。
各種コマンドは、標準の jserver のホスト名を環境変数 JSERVER から取得します。 .login や .cshrc などで以下のように設定しておくといいでしょう。
setenv JSERVER ホスト名
コマンドラインから
% uumで起動します。
なお kterm の場合、キーバインドを変更しようとして warning が大量に でてしまいます。これを防ぐには/usr/local/lib/wnn/ja_JP/uumrc の 中の、kterm のエントリをコメントアウトすればいいでしょう。
オプション -D server jserverを指定 -j -u -s 表示コード指定 -J -U -S 入力コード指定 デフォルトはマニュアルと違いますが、-jJ のようです。 基本キー操作 日本語モード CTRL - \ 変換キー CTRL - w 一覧表示 CTRL - w (2回目) 単文節変換 CTRL - z (辞書に無い場合カタカナ変換) 確定 CTRL - l, RETURN 次候補 CTRL - n (一覧表示中はページ単位) 前候補 CTRL - p (同上) 文節伸ばし CTRL - o 文節縮め CTRL - i 次文節 CTRL - f 前文節 CTRL - b 先頭文節 CTRL - a 末尾文節 CTRL - e 無変換モード q 全角アスキー Q モード戻し CTRL - g 辞書登録 CTRL - t