保科です。調べてみました。長いです。しかもしょ〜もない(泣) On Mon, Feb 22, 1999 at 01:50:29PM +0900, Shugo Maeda <shugo / netlab.co.jp> wrote: > うーん、それはまずいですね。 まずいんです(笑) > 以下のようなスクリプトでrskkserv以前にお使いだったSKKサーバ > の仕様を調べていただけないでしょうか。 ということですので、調べました。 > studly[ruby]$ ruby skktest.rb > "3.9.4 " > "4eee " こうなります。'\n' は付いてきません。ですが、現実に skkinput 2.01 は ちゃんと動いてしまうわけですから、実に不思議ですよね。で、"1eee " を 使わず、skkinput で実際に変換する際の鯖とのやりとりを tcpdump で見て みました。 ▽ぐr というデータでやってみました。CAPS したまま ぐらふぃっく と 書いちゃったイメージです(笑) データとしては a4 b0 72 です。すると… skkserv 9.6 + skkinput 2.01 では 23:45:05.462644 localhost.1158 > localhost.skkserv: 4500 003a c865 4000 4006 7456 7f00 0001 7f00 0001 0486 049a 1651 ebef 15dc 8506 8018 7960 cd80 0000 0101 080a 0008 d2ca 0008 b68c 31a4 b072 200a 23:45:05.462936 localhost.skkserv > localhost.1158: 4500 0035 c866 4000 4006 745a 7f00 0001 7f00 0001 049a 0486 15dc 8506 1651 ebf5 8018 7960 7f62 0000 0101 080a 0008 d2ca 0008 d2ca 34 23:45:05.480209 localhost.1158 > localhost.skkserv: 4500 0034 c867 4000 4006 745a 7f00 0001 7f00 0001 0486 049a 1651 ebf5 15dc 8507 8010 7960 b368 0000 0101 080a 0008 d2cc 0008 d2ca 23:45:05.480319 localhost.skkserv > localhost.1158: 4500 0039 c868 4000 4006 7454 7f00 0001 7f00 0001 049a 0486 15dc 8507 1651 ebf5 8018 7960 9288 0000 0101 080a 0008 d2cc 0008 d2cc a4b0 7220 0a と、こんな具合です。1つ目の、31a4 b072 200a ("1ぐr \n"です) がキモです。 なんと、skkinput って '\n' をわざわざ付けて request してるのです(笑) で、skkserv ってきっと、ヒットしなかったときは '4' に続けて request された 文字列を*そのまんま手を付けず*返す、という仕様なのでわ…? rskkserv 2.0 + skkinput 2.01 では 23:50:10.553966 localhost.1160 > localhost.skkserv: 4500 003a cd7f 4000 4006 6f3c 7f00 0001 7f00 0001 0488 049a 2cd4 235a 2c39 e680 8018 7960 0673 0000 0101 080a 0009 49f7 0009 40a5 31a4 b072 200a 23:50:10.558280 localhost.skkserv > localhost.1160: 4500 0039 cd80 4000 4006 6f3c 7f00 0001 7f00 0001 049a 0488 2c39 e680 2cd4 2360 8018 795a fa2b 0000 0101 080a 0009 49f7 0009 49f7 34a4 b072 20 という具合に、'\n' を付けて返しません。思うに gets(" ") で request 文字列を socket から読んでいるので、そこで '\n' を捨てちゃうのですね。 で、ふ〜ん、と思った私は kana = s.gets(" ") + "\n" if kanji = @dictionary.search(kana) ret = "1" + kanji else ret = "4" + kana end printf("send: %s\n", ret) if $OPT_d s.write(ret) などとして、"\n" をムリヤリ付けてみました。でもダメでした。skkinput は 確かによくなるのですが、今度は jed が(大笑い) やはり、skkinput の作者さんにお話して、ユーザが入力した覚えもない '\n' を 勝手にくっつけて request しないでくれ(汗)とお願いするのが筋なのでしょう。 でも skkinput の1次配布元(のはず)の URL が今はなぜか開かずのリンクに… skkinput では skksoc.c というファイルの中で、'\n' が出てくるまでぐるぐる ループさせるという処理をしているのですが、実際にはこの処理が意味不明で、 '\n' が出てくるまで単に読み捨ててるだけなのです。 だもんで、そこをバッサリ捨ててみました。request して、SKK鯖から '4' が 返ってきたら、もう変換失敗ということで、とっとと呼出し元に返るように しちゃったのです。これで様子を見ていますが、いまのところ不都合ないです。 skkserv.rb は前田さんオリジナルのままです。お騒がせしました。 # 全然オブジェクト指向ぢゃなくてすまん! -- ちなんでどうする気だ? 保科 徹(hoshina / best.com) http://www.best.com/~hoshina PGP fingerprint : 95 73 1C 26 C6 9E 28 86 BA 32 34 CA FC 9B DC 6D