WiLiKiでChangeLogが続けられるのか挑戦。
SKK Advent Calendar16日目の記事です。
プログラミングねたを書いてみます。
プログラミング言語を学習する場合、
ネットワークプログラミングは避けて通れません。
手始めに書くのはおそらくechoサーバでしょうが、
その次はどれを書こうかな、とそんなときにskkservはいかがでしょうか。
- 簡単なプロトコル
- かな漢字変換エンジンが簡単
- 実際に動くと楽しい
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に入れ忘れたものです。
ごめんなさい。
http://patch-tag.com/ でdarcsのホスティングをやっているらしいので、
githubから移動中[移動先]。
darcsはメール経由でパッチ当てたりできて便利。
ユーザ間でレポジトリを共有するためにはレポジトリに直接書き込み権限を与えたりしないといけないので、
ホスティングするには結構難易度高いのじゃないだろうか。
patch-tag:tiの姉妹品でpatch-tag:jiというものを作ってみた。
これはxmppをfifoするためのもの。
tiと組み合わせて使ってるけど、こんな感じ。
twitter <=> ti <=> ji <=> ejabberd <=> bitlbee <=> emacs
結構間にはさまってるけど、きちんと投稿できてるみたい。
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前提だし、ここまでくるとモジュール作ったほうがいい。まねしちゃだめ。
誰もが通る道、twitterクライアントを書いてみた。
実行すると、
~/ti +
+ /in
+ /out
というファイルができて、in、outをfifoを通して書き込み、
読み出し出来るようになる。
いちおうtwitter以外のcloneにも対応してて、
identi.caだと、
$ ti -b https://identi.ca/api
ちゅいったーだと、
$ ti -b http://chuitter.jp/api
など、status.net系でも使える。
ソース覗きたいたいひとは
git clone git://github.com/iratqq/ti.git
でどぞ。