2008年3月30日の日記の1番目の記事へのコメント

uimでWnn7を使ってみる

いわたさんに nudge(笑) されたので,Wnn7サーバを立てて動かしてみました.

で,結果ですが,とりあえずちゃんと動いてくれて,漢字変換までできました.すごいですね.Wnn7 Personal を 500円で譲ってくれた某ガルシア氏に感謝です.

さすがに古いソフトなので,イマドキ風の環境だと色々厳しいかもってことで,一応導入までの手順を載せときます.

Wnn7SDKのビルド

まず,Wnn7のSDKをインストールします.ここからソースを落とせます.

 tar zxvf /home/archive/wnn7sdk/Wnn7SDK.tgz
 mv src wnn7sdk
 cd wnn7sdk

Makefile.ini の以下の行を自分の環境に合わせて適宜変更 
 CONFIGSRC = /usr/X11R6/lib/X11/config

config/X11.tmpl の 9行目を自分の環境に合わせて適宜変更
 #include "/usr/X11R6/lib/X11/config/X11.tmpl"

Wnn/jlib/js.c の以下の部分をコメントアウト (162行目,202行目)
 extern  char    *malloc();
 char *malloc();

Wnn/etc/bdic.c に以下の変更を適用
@@ -177,6 +177,8 @@
 #define max(a, b) ((a < b)? b:a)
 #endif

+static int change_file_uniq1(FILE *ofpter, int file_type, char *file_passwd, struct wnn_file_uniq *file_uniq);
+
 /*:::DOC_START
  *
  *    Function Name: dic_fopen

Wnn/jlib/jl.c に以下の変更を適用
@@ -326,6 +326,8 @@
 /* 逆引き辞書設定保存用構造体 */
 struct st_rev_env *rev_env = NULL;

+static void jl_disconnect_if_server_dead_body_by_jsid(register WNN_JSERVER_ID *jsid);
+
 static void
 initialize_envs()
 {

makeしてみる.山のように警告が出る・・・.
 make World -f Makefile.ini

適当にインストール
 sudo cp -d Wnn/jlib/libwnn.* /usr/local/lib/

 sudo mkdir -p /usr/local/include/wnn7
 sudo cp Wnn/include/*.h /usr/local/include/wnn7

/usr/local/include/wnn7/jllib.h の後ろの方の予測入力関係の関数定義を外しておく
 @@ -448,6 +448,7 @@
  extern int jl_set_ikeiji_dai();

  /* for Nyuuryoku Yosoku (Jul. 18, 2000) */
 +/*
  extern int jl_yosoku_init(struct wnn_buf *buf);
  extern int jl_yosoku_free(struct wnn_buf *buf);
  extern int jl_yosoku_yosoku(struct wnn_buf *buf, char *str);
 @@ -466,5 +467,6 @@
  extern int jl_yosoku_set_param(struct wnn_buf *, int, int, int);
  extern int jl_zenassoc_dai();
  extern int jl_rensou_unuse_hinsi_set();
 +*/

  #endif /* _JLLIB_H_ */

これで uim をビルドする際に,Wnn サポートを有効にできます.Wnn7 のヘッダを深いところに入れているので,configure のオプションには --with-wnn-includes=/usr/local/include/wnn7 とかつけます.

辞書のインストール

Wnn7 PersonalのCDに入ってるパッケージから辞書を入れます.

RPMを開く
 mkdir wnn7-maindic
 cd wnn7-maindic
 rpm2cpio /mnt/cdrom/linux/wnn7-maindic-1.00-1.i386.rpm | cpio -id

辞書ファイルっぽいものをコピー
 sudo mkdir -p /var/lib/wnn7/dic/
 sudo cp -r var/lib/wnn7/dic/{bushu,system,yosoku} /var/lib/wnn7/dic/

jserverのインストール

かな漢字変換サーバをインストールします.jserverはなぜかデフォルトで u+s されてるっぽいですが,しない方がいいかと・・・.

RPMを開く
 mkdir wnn7-server
 cd wnn7-server
 rpm2cpio /mnt/cdrom/linux/wnn7-server-1.00-1.i386.rpm | cpio -id

(多分) 必要なファイルをコピー
 sudo cp usr/sbin/{jserver,wnnaccess,wnnds} /usr/sbin/
 sudo mkdir -p /usr/lib/wnn7/ja_JP/
 sudo cp usr/lib/wnn7/ja_JP/{hinsi.data,jserverrc} /usr/lib/wnn7/ja_JP/

一応掘ってみる
 sudo mkdir -p /etc/wnn7/ja_JP/

起動させてみる
 sudo /usr/sbin/jserver

常用する場合,/etc/init.d/wnn7 とかを作って,起動時にjserverが上がるようにします.環境によっては etc/rc.d/init.d/wnn7 をそのまま使えるかもしれませんが,よくわかりません.追加辞書を入れたい場合は,wnn7-optiondic-1.00-1.i386.rpm を同じように展開して必要そうなものをコピーすればいいかと思います.

ライセンスサーバのインストール

dpkeyというライセンスサーバを入れるんですが,ここが一番はまるかもしれません.自分の環境だと,glibcが新しすぎる(glibc-2.4)ようで,以下のメッセージが出て上がりませんでした.

dpkeyserv: dynamic-link.h:57: elf_get_dynamic_info: 
Assertion `! "bad dynamic tag"' が失敗しました.

いわたさん曰く古いlibcを入れてchroot(8)するとのこと.Wnn7 Personal は Vine-2.1.5 サポートらしいので,これを入れてやってみたところ,無事上がりました.

適当にディレクトリを掘る
 sudo mkdir /var/lib/wnn7/dpkey
 cd /var/lib/wnn7/dpkey

まず Vineのglibcを展開
 rpm2cpio /tmp/glibc-2.1.3-22vl1.i386.rpm | sudo cpio -id
 sudo find . -type d -exec chmod go+rx '{}' ';'

次にライセンスサーバを展開
 rpm2cpio /mnt/cdrom/linux/dpkey7-1.00-1.i386.rpm | sudo cpio -id

ライセンスファイルをコピー
 sudo cp /mnt/cdrom/passwd/dpkeylist etc/dpkey/dpkeylist

後は以下のようにchrootすればサーバが起動する
 sudo chroot /var/lib/wnn7/dpkey /usr/sbin/dpkeyserv

jserver同様,常用するには /etc/init.d/dpkey7 を作って,その中で chroot して上がるようにすればいいかと.etc/rc.d/init.d/dpkey7 の中身が参考になるかもしれません.

wnnenvrcの用意

とりあえず uim-wnn ではこれが要るようです.wnn7-xclients-1.00-1.i386.rpm から取り出して,適当な場所に置いて,uim-pref-gtk などの「Wnn(高度)」で「Wnn設定ファイル」で場所を指定しときましょう.

RPMを開く
 mkdir wnn7-xclients
 cd wnn7-xclients
 rpm2cpio /mnt/cdrom/linux/wnn7-xclients-1.00-1.i386.rpm | cpio -id

適当にコピー
 sudo cp usr/lib/wnn7/ja_JP/wnnenvrc /usr/lib/wnn7/ja_JP/

だいたいこんな感じです.ただ,現状,uim.el で色々やってると変な挙動を示す (Emacsでバッファを2個開いて,両方で uim-wnn を使うようにして,片方で入力→変換中に,もう片方のバッファにマウスか何かで移動して,入力→変換とやった状態で,両方のバッファ間をマウスクリックで移動したりすると uim.el のコンテキストがぶっ壊れたりする) こともあったりして,常用にはなかなか厳しい感じです.って,もしかしてuim.el が悪いのか? まー,そもそもWnn7 Personal にはライセンスが2個しかついてないので,非常に使い勝手が悪いというか,uim みたいな使い方だと全然使えないんじゃないかという気がするんですが,その辺どうなんでしょうね・・・.

[コメントを書く]

いわた 2008/03/31(月) 13:07:11
Wnn7のテストおつかれさまです。

wnnenvrcはkinput2でも必須のはずです。
というか、ここはkinput2のコードからくすねて来たものなので同じ挙動になるはず。
wnnenvrcが無かったときはどうしようか迷い中。
wnn.scmの元になったcanna.scm自体が変換途中の致命的エラーを想定してないので、
ちょっとコードを水増ししないといけないっぽいです。

uim.elのコンテキストぶっ壊れ問題はちょっとよくわからんです。
sj3の再接続ルーチンをwnnに持ってくると、
wnn.scm内のforeign pointerが不思議な踊りを踊る現象は確認しておりますゆえ、
wnn.scmかSigschemeの問題かも知れません。

ライセンス問題はリクエストを直列化するデーモンを用意すればいいんでしょうかね。
単にS式をevalするだけのインタプリタで充分な気がします。
接続毎にgetpeername(2)すれば複数人での使用は出来なくなるので、
ライセンス違反にはならないでしょう。たぶん。

てか、私自身wnn.scmは使ってないので、そこまで深入りしたくないのですけどね:)
nosuke 2008/04/01(火) 09:00:02
とりあえず原因がどこにあるのかよくわかんないので,FreeWnnも入れて
そっちでテストしてみようかとー.

> ライセンス問題はリクエストを直列化するデーモンを用意すれば

いまいちよくわかってないんですが,そもそも3個目のコンテキストを
作る時点で失敗しているみたい (3個Emacsを上げて,それぞれをuim-wnnに
切り替えて,1個目から順番に ひらがな入力 → 変換 → 確定 とやって
まわっても,3個目のEmacsのuim-wnnは 変換 の段階でエラーが出る)
なので,これだと,リクエストを直列にしてもダメなんじゃ・・・.

確定したらコンテキスト捨てるとか・・・毎回変換の度によっこらしょ
ってなって遅いかw

いわた 2008/04/03(木) 22:19:08
そりゃあ、wnn.scmはコンテキストを生成するたびにソケット作ってるから、
当然アウトになりますです。
そうじゃなくて、起動直後にjserverに接続後jl_open_langを実行して、
あとはクライアントからのリクエストをじっと待つproxyを作ってやればどうかなあ、と。
nosuke 2008/04/05(土) 03:00:11
あー,えーと,それって,uimの中でWnn的コンテキストを1個だけ作って,
複数のブリッジとかで共有するってことになるんですよね・・・?
プロトコルがステートフル(?)な感じだったりするとうまくいかないんじゃ
ないかという気がするんですが,その辺大丈夫なんでしょうか・・・
いわた 2008/04/05(土) 04:55:20
どうなるんでしょ。
同じようなことをするsj3proxyがすでに手元にあるので、
こいつをいじってみて駄目だったらあきらめます。

お名前:  メールアドレス(省略可):
メールアドレスも表示されます
ここに名前その他を書いてはいけません: ここにメールアドレスその他を書いてはいけません:

2008年3月30日の日記の1番目の記事へのコメント

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2008年3月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ