[Top Page][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

uim

Category of uim

日本語入力ねた。おいらコミッタ。

つくったもの

Link

uim/Programming/Scheme/skkserv

Category of uim
Category of Programming
Category of Scheme

SKK Advent Calendar16日目の記事です。 プログラミングねたを書いてみます。

プログラミング言語を学習する場合、 ネットワークプログラミングは避けて通れません。 手始めに書くのはおそらくechoサーバでしょうが、 その次はどれを書こうかな、とそんなときにskkservはいかがでしょうか。

  1. 簡単なプロトコル
  2. かな漢字変換エンジンが簡単
  3. 実際に動くと楽しい

skkのプロトコルは単純です。 skkserv.cの先頭部分のコメントに入りきるくらい単純なものです。 それでいて、なにがあってもクライアントと接続を維持しつづけないといけない、 というあたりがなかなか微妙な感じで、 学ぼうとしてる言語の癖が掴めてよろしいのではないでしょうか。

また、かな漢字変換の仕掛けが簡単で、 ここではまることがまずありません。 モチベーションの維持によいです。

書いてみる

せっかくですのでuimで書いてみました。

uimも1.5.xまではそれぞれのimが各クライアント付属のライブラリを使って通信していたのですが、 いまではソケットまわりの低レベルな操作より上のレベルでは、 schemeで書かれた各モジュールが各プロトコルでサーバと対話するようになっています。

ネットワークの基本的な部分は汎用の部品が用意されているわけです。

さて、肝心の漢字変換ですが、 uimにはlookというモジュールがありまして、 これはlook(1)をそのままライブラリとして使えるようにしたものです。 正確にマッチするようにすると普通の変換、 先頭にマッチするすべてのエントリを列挙すると予測変換ということになります。 辞書はソートされている必要があるのですが、 便利なのでuimのいろいろなところで使われています。

というわけで、部品は揃ったので、 これらをうまくつないでやれば結構簡単に書けます。 コードはこんな具合です。

サーバの機能よりも辞書のパースの方がコードが長いくらいですね。

 uim-sh /path/uim-skkserv

でport 1178で起動します。 辞書は~/.uim.d/dict/SKK-JISYOを使います。

ipv6も使えますし、予測入力も対応しています。

lookは単純に二分検索するだけですが、 手元の辞書500900エントリでも一瞬で出ます。

string-concatenate-reverseはuim-1.6.0に入れ忘れたものです。 ごめんなさい。

uim/ffi

Category of uim

uimのschemeから共有ライブラリにアクセスするには、 モジュールを作って(module-load)する、という方法が用意されているのだけど、 そもそも共有ライブラリを作成できる言語処理系でないとモジュールを作成できないし、ちょっとライブラリを試したいだけなのにファイルを作るのはめんどう。

ということで、uim-trunkにlibffiにアクセスするモジュールを投入した。

libffiをインストール後、 --with-ffiでconfigureしたuimをインストールすれば、 uim-shから、

uim> (module-load "ffi")
#t
(define libm
       (dlopen "libm.so" (assq-cdr '$RTLD_LAZY (dlopen-mode))))
libm
uim> (ffi-function libm 'double "atan" '((double . "1.0")))
"0.785398"
uim> (dlclose libm)
#t

とかできる。

もちろん引数の数や型を間違えると即死するので注意が必要。

  • 無茶な例: gist:207980 リトルエンディアンの32bitCPU前提だし、ここまでくるとモジュール作ったほうがいい。まねしちゃだめ。

uim/prediction

Category of uim

Canna/SJ3/Wnnで予測入力できないのは悲しいので書いた。

せっかくだから日本語以外のimでも使えるように。

これをcommitしたら、look-imは廃止することになるんだろうなあ。

sqlite3は動作が重いかもしれない。 というかこういう用途は想定してないだろうし。

wlos初めて使ってみたけど、tinyclosと勝手が違って涙目。

uimに関する全てのエントリ