[ノート][編集履歴][一覧][最近の更新][->English]

more-functional

WiLiKiでChangeLogが続けられるのか挑戦。

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に入れ忘れたものです。 ごめんなさい。

Programming/patch-tag

Category of Programming

http://patch-tag.com/ でdarcsのホスティングをやっているらしいので、 githubから移動中[移動先]。

darcsはメール経由でパッチ当てたりできて便利。

ユーザ間でレポジトリを共有するためにはレポジトリに直接書き込み権限を与えたりしないといけないので、 ホスティングするには結構難易度高いのじゃないだろうか。

Programming/ji

Category of Programming

patch-tag:tiの姉妹品でpatch-tag:jiというものを作ってみた。 これはxmppをfifoするためのもの。

tiと組み合わせて使ってるけど、こんな感じ。

 twitter <=> ti <=> ji <=> ejabberd <=> bitlbee <=> emacs

結構間にはさまってるけど、きちんと投稿できてるみたい。

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前提だし、ここまでくるとモジュール作ったほうがいい。まねしちゃだめ。

Programming/ti

Category of Programming

誰もが通る道、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

でどぞ。