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年3月30日の日記の1番目の記事へのコメント
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は使ってないので、そこまで深入りしたくないのですけどね:)
そっちでテストしてみようかとー.
> ライセンス問題はリクエストを直列化するデーモンを用意すれば
いまいちよくわかってないんですが,そもそも3個目のコンテキストを
作る時点で失敗しているみたい (3個Emacsを上げて,それぞれをuim-wnnに
切り替えて,1個目から順番に ひらがな入力 → 変換 → 確定 とやって
まわっても,3個目のEmacsのuim-wnnは 変換 の段階でエラーが出る)
なので,これだと,リクエストを直列にしてもダメなんじゃ・・・.
確定したらコンテキスト捨てるとか・・・毎回変換の度によっこらしょ
ってなって遅いかw
当然アウトになりますです。
そうじゃなくて、起動直後にjserverに接続後jl_open_langを実行して、
あとはクライアントからのリクエストをじっと待つproxyを作ってやればどうかなあ、と。
複数のブリッジとかで共有するってことになるんですよね・・・?
プロトコルがステートフル(?)な感じだったりするとうまくいかないんじゃ
ないかという気がするんですが,その辺大丈夫なんでしょうか・・・
同じようなことをするsj3proxyがすでに手元にあるので、
こいつをいじってみて駄目だったらあきらめます。