more-functional
https://quasiquote.org/log2
More functional ChangeLog page
2010-12-22T17:40:47+00:00
- uim/Programming/Scheme/2010/12/23/skkserv
https://quasiquote.org/log2/uim/Programming/Scheme/2010/12/23/skkserv
2010-12-22T17:40:47+00:00
<p><a href='http://atnd.org/events/10855' title='SKK Advent Calendar' rel='nofollow'>SKK Advent Calendar<img src='images/extlink-16x16.gif'/></a>16日目の記事です。
プログラミングねたを書いてみます。
</p><p>プログラミング言語を学習する場合、
ネットワークプログラミングは避けて通れません。
手始めに書くのはおそらくechoサーバでしょうが、
その次はどれを書こうかな、とそんなときにskkservはいかがでしょうか。
</p><ol><li>簡単なプロトコル
</li><li>かな漢字変換エンジンが簡単
</li><li>実際に動くと楽しい
</li></ol><p>skkのプロトコルは単純です。
skkserv.cの先頭部分のコメントに入りきるくらい単純なものです。
それでいて、なにがあってもクライアントと接続を維持しつづけないといけない、
というあたりがなかなか微妙な感じで、
学ぼうとしてる言語の癖が掴めてよろしいのではないでしょうか。
</p><p>また、かな漢字変換の仕掛けが簡単で、
ここではまることがまずありません。
モチベーションの維持によいです。
</p><h3 id='H-cen1pn'>書いてみる
</h3><p>せっかくですので<a href='log2/uim' title='[uim] Last modified: 2008/12/14 05:56:45 JST'>uim</a>で書いてみました。
</p><p>uimも1.5.xまではそれぞれのimが各クライアント付属のライブラリを使って通信していたのですが、
いまではソケットまわりの低レベルな操作より上のレベルでは、
schemeで書かれた各モジュールが各プロトコルでサーバと対話するようになっています。
</p><p>ネットワークの基本的な部分は汎用の部品が用意されているわけです。
</p><p>さて、肝心の漢字変換ですが、
uimにはlookというモジュールがありまして、
これはlook(1)をそのままライブラリとして使えるようにしたものです。
正確にマッチするようにすると普通の変換、
先頭にマッチするすべてのエントリを列挙すると予測変換ということになります。
辞書はソートされている必要があるのですが、
便利なのでuimのいろいろなところで使われています。
</p><p>というわけで、部品は揃ったので、
これらをうまくつないでやれば結構簡単に書けます。
コードはこんな具合です。
</p><ul><li><a rel='nofollow' href='http://gist.github.com/751706' title='InterWikiName [gist:751706]'>gist:751706</a>
</li></ul><p>サーバの機能よりも辞書のパースの方がコードが長いくらいですね。
</p><pre> uim-sh /path/uim-skkserv
</pre><p>でport 1178で起動します。
辞書は~/.uim.d/dict/SKK-JISYOを使います。
</p><p>ipv6も使えますし、予測入力も対応しています。
</p><p>lookは単純に二分検索するだけですが、
手元の辞書500900エントリでも一瞬で出ます。
</p><p>string-concatenate-reverseはuim-1.6.0に入れ忘れたものです。
ごめんなさい。
</p>
SKK Advent Calendar 16日目の記事です。
プログラミングねたを書いてみます。
プログラミング言語を学習する場合、
ネットワークプログラミングは避けて通れません。
手始めに書くのはおそらくechoサーバでしょうが、
その次はどれを書こうかな、とそんなときにskkservはいかがでしょうか。
# 簡単なプロトコル
# かな漢字変換エンジンが簡単
# 実際に動くと楽しい
skk...
- Programming/2009/11/03/patch-tag
https://quasiquote.org/log2/Programming/2009/11/03/patch-tag
2009-11-03T06:34:19+00:00
<p><a href='http://patch-tag.com/'>http://patch-tag.com/</a> でdarcsのホスティングをやっているらしいので、
githubから移動中[<a href='http://patch-tag.com/viewprofile?username=iratqq' title='移動先' rel='nofollow'>移動先<img src='images/extlink-16x16.gif'/></a>]。
</p><p>darcsはメール経由でパッチ当てたりできて便利。
</p><p>ユーザ間でレポジトリを共有するためにはレポジトリに直接書き込み権限を与えたりしないといけないので、
ホスティングするには結構難易度高いのじゃないだろうか。
</p>
http : //patch-tag.com / でdarcsのホスティングをやっているらしいので、
githubから移動中 [ 移動先 ]。
darcsはメール経由でパッチ当てたりできて便利。
ユーザ間でレポジトリを共有するためにはレポジトリに直接書き込み権限を与えたりしないといけないので、
ホスティングするには結構難易度高いのじゃないだろうか。
- Programming/2009/11/03/ji
https://quasiquote.org/log2/Programming/2009/11/03/ji
2009-11-03T06:29:51+00:00
<p><a rel='nofollow' href='http://patch-tag.com/r/iratqq/ti' title='InterWikiName [patch-tag:ti]'>patch-tag:ti</a>の姉妹品で<a rel='nofollow' href='http://patch-tag.com/r/iratqq/ji' title='InterWikiName [patch-tag:ji]'>patch-tag:ji</a>というものを作ってみた。
これはxmppをfifoするためのもの。
</p><p>tiと組み合わせて使ってるけど、こんな感じ。
</p><pre class='prettyprint'> twitter <=> ti <=> ji <=> ejabberd <=> bitlbee <=> emacs
</pre><p>結構間にはさまってるけど、きちんと投稿できてるみたい。
</p>
patch-tag:ti の姉妹品で patch-tag:ji というものを作ってみた。
これはxmppをfifoするためのもの。
tiと組み合わせて使ってるけど、こんな感じ。
{{{
twitter <=> ti <=> ji <=> ejabberd <=> bitlbee <=> emacs
}}}
結構間にはさまってるけど、きちんと投稿できてるみたい。
- InterWikiName
https://quasiquote.org/log2/InterWikiName
2009-11-03T06:20:30+00:00
<dl><dt>WiLiKi
</dt><dd><p>practical-scheme.net/wiliki/wiliki2.cgi?
</p></dd><dt>CLiki
</dt><dd><p>www.cliki.net/
</p></dd><dt>CSW
</dt><dd><p>community.schemewiki.org/?
</p></dd><dt>HaWiki
</dt><dd><p>haskell.org/hawiki/
</p></dd><dt>eggs
</dt><dd><p>www.call-with-current-continuation.org/eggs/
</p></dd><dt>ねるWiki
</dt><dd><p>www.soraneko.com/~nel/wiliki.cgi?
</p></dd><dt>itazura
</dt><dd><p>www.akatsukinishisu.net/wiki.cgi?
</p></dd><dt>EmacsWiki
</dt><dd><p>www.emacswiki.org/cgi-bin/wiki/
</p></dd><dt>OpenBSD-man
</dt><dd><p>www.openbsd.org/cgi-bin/man.cgi?format=html&arch=i386&manpath=OpenBSD-current&query=
</p></dd><dt>OpenBSD-cvs
</dt><dd><p>www.openbsd.org/cgi-bin/cvsweb/
</p></dd><dt>undeadly
</dt><dd><p>undeadly.org/cgi?action=article&sid=
</p></dd><dt>marc
</dt><dd><p>marc.theaimsgroup.com/?t=
</p></dd><dt>marc-openbsd-cvs
</dt><dd><p>marc.theaimsgroup.com/?l=openbsd-cvs&m=
</p></dd><dt>marc-openbsd-tech
</dt><dd><p>marc.theaimsgroup.com/?l=openbsd-tech&m=
</p></dd><dt>marc-openbsd-ports
</dt><dd><p>marc.theaimsgroup.com/?l=openbsd-ports&m=
</p></dd><dt>marc-openbsd-misc
</dt><dd><p>marc.theaimsgroup.com/?l=openbsd-misc&m=
</p></dd><dt>FreeBSD-cvs
</dt><dd><p>www.freebsd.org/cgi/cvsweb.cgi/
</p></dd><dt>NetBSD-cvs
</dt><dd><p>cvsweb.netbsd.org/bsdweb.cgi/
</p></dd><dt>sf
</dt><dd><p>www.sf.net/projects/
</p></dd><dt>Wikipedia
</dt><dd><p>www.wikipedia.org/wiki/
</p></dd><dt>Wikipedia-ja
</dt><dd><p>ja.wikipedia.org/wiki/
</p></dd><dt>Google
</dt><dd><p>www.google.com/search?hl=ja&ie=utf-8&oe=utf-8&lr=lang_ja&q=
</p></dd><dt>HSPWiki
</dt><dd><p>quasiquote.org/hspwiki/
</p></dd><dt>webarchive
</dt><dd><p>web.archive.org/web/
</p></dd><dt>Landscape
</dt><dd><p>sonic64.com/
</p></dd><dt>g.o.o.cvs
</dt><dd><p>permalink.gmane.org/gmane.os.openbsd.cvs/
</p></dd><dt>uim-en
</dt><dd><p>groups.google.com/group/uim-en/browse_thread/thread/
</p></dd><dt>gist
</dt><dd><p>gist.github.com/
</p></dd><dt>patch-tag
</dt><dd><p>patch-tag.com/r/iratqq/
</p></dd><dt>log
</dt><dd><p>quasiquote.org/log/
</p></dd><dt>files
</dt><dd><p>quasiquote.org/files/
</p></dd></dl>
:WiLiKi:practical-scheme.net/wiliki/wiliki2.cgi?
:CLiki:www.cliki.net/
:CSW:community.schemewiki.org/?
:HaWiki:haskell.org/hawiki/
:eggs:www.call-with-current-continuation.org/eggs/
:ねるWiki:www.sorane...
- uim/2009/10/13/ffi
https://quasiquote.org/log2/uim/2009/10/13/ffi
2009-10-12T15:46:48+00:00
<p>uimのschemeから共有ライブラリにアクセスするには、
モジュールを作って(module-load)する、という方法が用意されているのだけど、
そもそも共有ライブラリを作成できる言語処理系でないとモジュールを作成できないし、ちょっとライブラリを試したいだけなのにファイルを作るのはめんどう。
</p><p>ということで、uim-trunkにlibffiにアクセスするモジュールを投入した。
</p><p><a href='http://sources.redhat.com/libffi/' title='libffi' rel='nofollow'>libffi<img src='images/extlink-16x16.gif'/></a>をインストール後、
--with-ffiでconfigureしたuimをインストールすれば、
uim-shから、
</p><pre class='prettyprint'>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
</pre><p>とかできる。
</p><p>もちろん引数の数や型を間違えると即死するので注意が必要。
</p><ul><li>無茶な例: <a rel='nofollow' href='http://gist.github.com/207980' title='InterWikiName [gist:207980]'>gist:207980</a> リトルエンディアンの32bitCPU前提だし、ここまでくるとモジュール作ったほうがいい。まねしちゃだめ。
</li></ul>
uimのschemeから共有ライブラリにアクセスするには、
モジュールを作って(module-load)する、という方法が用意されているのだけど、
そもそも共有ライブラリを作成できる言語処理系でないとモジュールを作成できないし、ちょっとライブラリを試したいだけなのにファイルを作るのはめんどう。
ということで、uim-trunkにlibffiにアクセスするモジュールを投入した。
libffi ...
- Programming/2009/10/11/ti
https://quasiquote.org/log2/Programming/2009/10/11/ti
2009-10-10T15:59:37+00:00
<p>誰もが通る道、twitterクライアントを書いてみた。
</p><ul><li><a rel='nofollow' href='http://quasiquote.org/files/ti-0.1.tar.gz' title='InterWikiName [files:ti-0.1.tar.gz]'>files:ti-0.1.tar.gz</a>
</li></ul><p>実行すると、
</p><pre class='prettyprint'>~/ti +
+ /in
+ /out
</pre><p>というファイルができて、in、outをfifoを通して書き込み、
読み出し出来るようになる。
</p><p>いちおうtwitter以外のcloneにも対応してて、
identi.caだと、
</p><pre> $ ti -b <a href='https://identi.ca/api'>https://identi.ca/api</a>
</pre><p>ちゅいったーだと、
</p><pre> $ ti -b <a href='http://chuitter.jp/api'>http://chuitter.jp/api</a>
</pre><p>など、status.net系でも使える。
</p><p>ソース覗きたいたいひとは
</p><pre> git clone git://github.com/iratqq/ti.git
</pre><p>でどぞ。
</p>
誰もが通る道、twitterクライアントを書いてみた。
- files:ti-0.1.tar.gz
実行すると、
{{{
~/ti +
+ /in
+ /out
}}}
というファイルができて、in、outをfifoを通して書き込み、
読み出し出来るようになる。
いちおうtwitter以外のcloneにも対応してて、
identi.caだと、
$ ti -b ht...
- uim/2009/08/09/prediction
https://quasiquote.org/log2/uim/2009/08/09/prediction
2009-08-09T15:05:37+00:00
<p>Canna/SJ3/Wnnで予測入力できないのは悲しいので書いた。
</p><ul><li><a rel='nofollow' href='http://quasiquote.org/files/uim-predict.diff.gz' title='InterWikiName [files:uim-predict.diff.gz]'>files:uim-predict.diff.gz</a>
</li></ul><p>せっかくだから日本語以外のimでも使えるように。
</p><p>これをcommitしたら、look-imは廃止することになるんだろうなあ。
</p><p>sqlite3は動作が重いかもしれない。
というかこういう用途は想定してないだろうし。
</p><p>wlos初めて使ってみたけど、tinyclosと勝手が違って涙目。
</p>
Canna/SJ3/Wnnで予測入力できないのは悲しいので書いた。
- files:uim-predict.diff.gz
せっかくだから日本語以外のimでも使えるように。
これをcommitしたら、look-imは廃止することになるんだろうなあ。
sqlite3は動作が重いかもしれない。
というかこういう用途は想定してないだろうし。
wlos初めて使ってみたけど、tinyclosと...
- uim/2009/03/03/uim-help
https://quasiquote.org/log2/uim/2009/03/03/uim-help
2009-03-03T12:06:52+00:00
<p>uim-toolbarの浮き輪ボタンを押しても反応がないのはあまりにむなしいので、
uim-helpを適当にでっちあげた。
</p><ul><li><a rel='nofollow' href='http://quasiquote.org/files/uim-help.diff.gz' title='InterWikiName [files:uim-help.diff.gz]'>files:uim-help.diff.gz</a>
</li></ul><p>とても手抜きだけど、機能はこれから追加するということで。
</p>
uim-toolbarの浮き輪ボタンを押しても反応がないのはあまりにむなしいので、
uim-helpを適当にでっちあげた。
- files:uim-help.diff.gz
とても手抜きだけど、機能はこれから追加するということで。
- uim/2009/02/26/social-ime
https://quasiquote.org/log2/uim/2009/02/26/social-ime
2009-02-25T15:53:36+00:00
<p>uim-trunkにて、uim-social-imeで予測入力できるようになった。
ekatoさん、patchありがとうございます!
</p><ul><li><a href='http://ekato.wordpress.com/2009/02/25/macuim-060-14/'>http://ekato.wordpress.com/2009/02/25/macuim-060-14/</a>
</li></ul><p>しかし重い。重すぎる…
いまのuim-social-imeは<a href='log2/uim/2008/11/07/social-ime' title='[uim/2008/11/07/social-ime] Last modified: 2008/11/07 21:49:35 JST'>uim/2008/11/07/social-ime</a>のころと違って、
uim-curlではなくuim-socketを使うように変更したので、
これが効いてるかも知れないし、そうだとしたら残念過ぎる。
</p><p>あ、uim-pref-gtkでuim-social-ime周りを変更したあと、
"適用"ボタンを押すと、
</p><pre> Error: in scm_symbol_value: unbound variable: social-ime-configure-widgets
</pre><p>なるエラーが出る模様。どうなってるのだろうか。
</p>
uim-trunkにて、uim-social-imeで予測入力できるようになった。
ekatoさん、patchありがとうございます!
- http : //ekato.wordpress.com /2009/02/25/macuim-060-14/
しかし重い。重すぎる…
いまのuim-social-imeは uim/2008/11/07/social-ime のころと違って、
uim-...
- uim/2009/02/16/statusd_uim-1.1
https://quasiquote.org/log2/uim/2009/02/16/statusd_uim-1.1
2009-02-16T03:32:32+00:00
<p>アップロードするのを長らく放置してたので改めて。
</p><ul><li><a href='log2/uim/statusd_uim' title='[uim/statusd_uim] Last modified: 2009/02/16 12:28:33 JST'>uim/statusd_uim</a>
</li></ul><p>変更点はメモリリークを塞いだ点と、poll(2)をデフォルトにしたこと。
iconv(3)は恐ろしいですね。
</p>
アップロードするのを長らく放置してたので改めて。
- uim/statusd_uim
変更点はメモリリークを塞いだ点と、poll(2)をデフォルトにしたこと。
iconv(3)は恐ろしいですね。
- uim/statusd_uim
https://quasiquote.org/log2/uim/statusd_uim
2009-02-16T03:28:33+00:00
<p>[[$$toc]]
</p><h2 id='H-loe56k'>About
</h2><p>statesd_uim is <a href='http://uim.freedesktop.org/' title='uim' rel='nofollow'>uim<img src='images/extlink-16x16.gif'/></a> indicator for <a href='http://modeemi.cs.tut.fi/~tuomov/ion/' title='ion3' rel='nofollow'>ion3<img src='images/extlink-16x16.gif'/></a>.
</p><h2 id='H-4t106x'>Screenshot
</h2><table class='inbody' border='1' cellspacing='0'><tr class='inbody'><td class='inbody'><img src='http://quasiquote.org/images/statusd_uim-skk-direct.png' alt='[image]'/>
</td></tr><tr class='inbody'><td class='inbody'>SKK - Direct Mode
</td></tr><tr class='inbody'><td class='inbody'><img src='http://quasiquote.org/images/statusd_uim-skk-hankana.png' alt='[image]'/>
</td><td class='inbody'><img src='http://quasiquote.org/images/statusd_uim-skk-hiragana.png' alt='[image]'/>
</td></tr><tr class='inbody'><td class='inbody'>SKK - Hankaku Katakana Mode
</td><td class='inbody'>SKK - Hiragana Mode
</td></tr><tr class='inbody'><td class='inbody'><img src='http://quasiquote.org/images/statusd_uim-look.png' alt='[image]'/>
</td></tr><tr class='inbody'><td class='inbody'>Look - Look Mode
</td></tr></table><h2 id='H-vv45j6'>Install
</h2><ol><li>Edit Makefile
</li><li>`make && make install',
</li><li>Copy <em>cfg_statusbar.lua</em> from installed directory of ion3 to ~/.ion3 and edit it.
</li><li>Restart ion3
</li></ol><h2 id='H-n25pws'>Setup
</h2><p>You must open file <em>~/.ion3/cfg_statusbar.lua</em>,
append im status values to line of template="..." and
add entry of statesd_uim to mod_statusbar.launch_statusd.
</p><p>For example,
</p><pre class='prettyprint'>-- Create a statusbar
mod_statusbar.create {
-- snip
template="[ %date || load:% %>load || mail:% %>mail_new/%>mail_total || im:% %<uim_im_name %<uim_im_mode ] %filler%systray",
}
-- Launch ion-statusd. This must be done after creating any statusbars
-- for necessary statusd modules to be parsed from the templates.
mod_statusbar.launch_statusd {
-- snip
uim = {
interval=100,
},
}
</pre><h3 id='H-10628kr'>Variables
</h3><ul><li>uim_im_name: name of input method
</li><li>uim_im_mode: input mode
</li></ul><h2 id='H-1wufizn'>Download
</h2><ul><li><a rel='nofollow' href='http://quasiquote.org/files/statusd_uim-1.1.tar.gz' title='InterWikiName [files:statusd_uim-1.1.tar.gz]'>files:statusd_uim-1.1.tar.gz</a>
</li><li><a rel='nofollow' href='http://quasiquote.org/files/statusd_uim-1.0.tar.gz' title='InterWikiName [files:statusd_uim-1.0.tar.gz]'>files:statusd_uim-1.0.tar.gz</a>
</li></ul>
$$toc
* About
statesd_uim is uim indicator for ion3 .
* Screenshot
|| $$img http://quasiquote.org/images/statusd_uim-skk-direct.png ||
||SKK - Direct Mode||
|| $$img http://quasiquote.org/imag...
- sj3/2009/02/10/いろいろ
https://quasiquote.org/log2/sj3/2009/02/10/%e3%81%84%e3%82%8d%e3%81%84%e3%82%8d
2009-02-10T12:23:39+00:00
<h2 id='H-x7ahva'>sj3のインストール
</h2><ul><li><a href='http://www.lins.jp/~obata/diary/200902051.html#200902051'>http://www.lins.jp/~obata/diary/200902051.html#200902051</a>
</li></ul><p>うーむ。
</p><blockquote><p>sj3 の新しめの奴を pkgsrc 化して build してみた。現状の分け方 (lib, server, dict) が、最新版の configure オプションで効く分け方と異なるから,名前をオプション名と同じ client, server, dict に変えようとしたが、 dict するには、server の中 sj3mkdic コマンドが必要で,今の server + dict = server-bin というのは、無駄な気がして,一緒にしてやれ!と思って続いて client 試したら server と同じ header ファイルをインストールしてしまうし。
</p></blockquote><p>sj3mkdicがsj3servとおなじくlibsj3core(元kanakan)に依存してるので、
ややこしい構成にしたような記憶があります。
いっそのこと全部ビルドして、
インストールするときに振り分けたほうがいいのかしら。
</p><p>sj3lib.hはクライアントのヘッダファイルですけど、
それ以外のヘッダファイルは入れない設定のはずだけど間違ってるかもしれない。
</p><p>環境変数SJ3SERVに""を設定するとkinput2もunix domain socketでつなぐはず。
</p><h2 id='H-8b0gv9'>scim-uim & uim-scim
</h2><ul><li><a href='http://www.hi-matic.org/diary/index.cgi?20090210#10-1'>http://www.hi-matic.org/diary/index.cgi?20090210#10-1</a>
</li></ul><p>いまのuim-scimはこわr
</p>
* sj3のインストール
- http : //www.lins.jp /~obata/diary/200902051.html#200902051
うーむ。
<<<
sj3 の新しめの奴を pkgsrc 化して build してみた。現状の分け方 (lib, server, dict) が、最新版の configure オプションで効く分け方と異なるから,名前をオプション名と同じ c...
- Chicken/Scheme/2008/12/15/loudmouth.egg
https://quasiquote.org/log2/Chicken/Scheme/2008/12/15/loudmouth.egg
2008-12-15T08:07:04+00:00
<p>XMPPクライアントをまっさらのschemeで書くのに挫折したので、
かわりに<a href='http://www.loudmouth-project.org/' title='loudmouth' rel='nofollow'>loudmouth<img src='images/extlink-16x16.gif'/></a>をchickenから呼べるようにした。
</p><ul><li><a rel='nofollow' href='http://quasiquote.org/files/egg/loudmouth.egg' title='InterWikiName [files:egg/loudmouth.egg]'>files:egg/loudmouth.egg</a>
</li></ul><p>マニュアルはないけど、<a href='http://www.loudmouth-project.org/docs/api/loudmouth/ch01.html' title='C API' rel='nofollow'>C API<img src='images/extlink-16x16.gif'/></a>を移しかえただけなので、
サンプルのloudmouthのコードそのまま持ってくれば動く。
</p><p>オウムがえしするだけならこんな感じ。
</p><ul><li><a rel='nofollow' href='http://gist.github.com/11760' title='InterWikiName [gist:11760]'>gist:11760</a>
</li></ul><p>コールバックの形式だけは普通にforeign-lambdaできないので、
ヘルパーマクロを使って、
</p><pre class='prettyprint'>(lm:define-message-handler
presence-cb
(conn mes data)
(begin ここにコールバックの内容))
(lm:call-with-message-handler
presence-cb #f #f
(lambda (handler)
(lm:connection-register-message-handler
conn handler
*LM-MESSAGE-TYPE-PRESENCE*
*LM-HANDLER-PRIORITY-LAST*)))
</pre><p>みたいに書く。
</p><p>コールバックの第一引数がvoid*なものだから、
データの移送はかなり面倒なことに。
これをscheme-objectにすると、gcされちゃう。
</p><p>これを使ったtwitter->xmppボットは安定動作しているようなので、
モジュール部分だけ公開してみる。
</p><p>CLだとcl-xmppなんてのがあって、
asdf-installで簡単インストールできたりしてちょっと羨ましかったり。
</p><ul><li><a rel='nofollow' href='http://gist.github.com/10812' title='InterWikiName [gist:10812]'>gist:10812</a>: cl-xmppの例
</li></ul>
XMPPクライアントをまっさらのschemeで書くのに挫折したので、
かわりに loudmouth をchickenから呼べるようにした。
- files:egg/loudmouth.egg
マニュアルはないけど、 C API を移しかえただけなので、
サンプルのloudmouthのコードそのまま持ってくれば動く。
オウムがえしするだけならこんな感じ。
- gist:11760
...
- Topics
https://quasiquote.org/log2/Topics
2008-12-13T20:57:17+00:00
<ul><li><a href='http://quasiquote.org/log2/' title='Top' rel='nofollow'>Top<img src='images/extlink-16x16.gif'/></a>
</li></ul><hr/><ul><li>Category
<ul><li><a href='log2/Audio' title='[Audio] Last modified: 2006/03/29 04:49:04 JST'>Audio</a>
</li><li><a href='log2/Emacs' title='[Emacs] Last modified: 2008/12/14 05:44:13 JST'>Emacs</a>
</li><li><a href='log2/Erlang' title='[Erlang] Last modified: 2006/03/29 04:48:10 JST'>Erlang</a>
</li><li><a href='log2/FreeBSD' title='[FreeBSD] Last modified: 2008/01/05 16:04:06 JST'>FreeBSD</a>
</li><li><a href='log2/Haskell' title='[Haskell] Last modified: 2006/03/29 04:50:40 JST'>Haskell</a>
</li><li><a href='log2/Lisp/Scheme' title='[Lisp/Scheme] Last modified: 2006/05/04 10:20:47 JST'>Lisp/Scheme</a>
</li><li><a href='log2/Memo' title='[Memo] Last modified: 2006/03/29 04:53:51 JST'>Memo</a>
</li><li>NetBSD<a href='log2?p=NetBSD&c=e'>?</a>
</li><li><a href='log2/OpenBSD' title='[OpenBSD] Last modified: 2006/03/29 04:54:51 JST'>OpenBSD</a>
</li><li><a href='log2/Programming' title='[Programming] Last modified: 2006/03/29 04:55:41 JST'>Programming</a>
</li><li><a href='log2/Security' title='[Security] Last modified: 2006/03/29 04:56:51 JST'>Security</a>
</li><li><a href='log2/SJ3' title='[SJ3] Last modified: 2008/02/26 06:15:19 JST'>SJ3</a>
</li><li><a href='log2/uim' title='[uim] Last modified: 2008/12/14 05:56:45 JST'>uim</a>
</li><li><a rel='nofollow' href='http://practical-scheme.net/wiliki/wiliki2.cgi?%e3%81%84%e3%82%8f%e3%81%9f' title='InterWikiName [WiLiKi:いわた]'>WiLiKi:いわた</a>
</li><li><a href='log2/CategoryIcons' title='[CategoryIcons] Last modified: 2008/12/14 05:43:16 JST'>CategoryIcons</a>
</li></ul></li></ul><hr/><ul><li>Archives
<ul><li><a href='log2/archives/2007' title='[archives/2007]'>archives/2007</a>
</li><li><a href='log2/archives/2006' title='[archives/2006]'>archives/2006</a>
</li><li><a href='log2/archives/2005' title='[archives/2005]'>archives/2005</a>
</li></ul></li></ul><hr/><ul><li>Planet
<ul><li><a href='http://planet.lisp.org/' title='Lisp' rel='nofollow'>Lisp<img src='images/extlink-16x16.gif'/></a>
</li><li><a href='http://www.scheme.dk/planet/' title='Scheme' rel='nofollow'>Scheme<img src='images/extlink-16x16.gif'/></a>
</li><li><a href='http://www.planeterlang.org/' title='Erlang' rel='nofollow'>Erlang<img src='images/extlink-16x16.gif'/></a>
</li></ul></li></ul><hr/><ul><li>Info
<ul><li><a href='http://quasiquote.org/log2/?c=rss' title='RSS' rel='nofollow'>RSS<img src='images/extlink-16x16.gif'/></a><img src='http://quasiquote.org/images/feed-icon-12x12.png' alt='[image]'/>
</li><li><a href='log2/InterWikiName' title='[InterWikiName] Last modified: 2009/11/03 15:20:30 JST'>InterWikiName</a>
</li></ul></li></ul>
- Top
----
- Category
-- Audio
-- Emacs
-- Erlang
-- FreeBSD
-- Haskell
-- Lisp/Scheme
-- Memo
-- NetBSD
-- OpenBSD
-- Programming
-- Security
-- SJ3
-- uim
-- WiLiKi:いわた ...
- uim
https://quasiquote.org/log2/uim
2008-12-13T20:56:45+00:00
<p>日本語入力ねた。おいらコミッタ。
</p><h3 id='H-bnvd3z'>つくったもの
</h3><ul><li>look input method: 英語でも予測入力
</li><li>sj3 input method: いにしえの日本語変換サーバsj3を使って日本語変換
</li><li>wnn input method: こちらはwnnを使って日本語変換
</li><li>social-ime input method: webベースの日本語変換サービス<a href='http://www.social-ime.com/' title='Social IME' rel='nofollow'>Social IME<img src='images/extlink-16x16.gif'/></a>を使って日本語変換
</li><li>ajax-ime input method: webベースの日本語変換サービスajax-imeを使って日本語変換
</li><li>yahoo-jp input method: yahooの<a href='http://developer.yahoo.co.jp/jlp/JIMService/V1/conversion.html' title='かな漢字変換サービス' rel='nofollow'>かな漢字変換サービス<img src='images/extlink-16x16.gif'/></a>を使って日本語変換
</li><li><a href='log2/uim/statusd_uim' title='[uim/statusd_uim] Last modified: 2009/02/16 12:28:33 JST'>uim/statusd_uim</a>: ion3のステータスバーにuimの状態表示
</li></ul><h3 id='H-gnq4nx'>Link
</h3><ul><li><a href='http://code.google.com/p/uim/'>http://code.google.com/p/uim/</a> : project page
</li><li><a href='http://code.google.com/p/uim-doc-ja/'>http://code.google.com/p/uim-doc-ja/</a> : wiki
</li></ul><p><div class='entry'><h2><a href='log2/uim/Programming/Scheme/2010/12/23/skkserv'>uim/Programming/Scheme/skkserv</a></h2><div class='category-icons'><a href='log2/uim'><img src='http://quasiquote.org/images/category-uim' alt='Category of uim'/><br/></a><a href='log2/Programming'><img src='http://quasiquote.org/images/category-programming' alt='Category of Programming'/><br/></a><a href='log2/Scheme'><img src='http://quasiquote.org/images/category-scheme' alt='Category of Scheme'/><br/></a></div><p><p><a href='http://atnd.org/events/10855' title='SKK Advent Calendar' rel='nofollow'>SKK Advent Calendar<img src='images/extlink-16x16.gif'/></a>16日目の記事です。
プログラミングねたを書いてみます。
</p><p>プログラミング言語を学習する場合、
ネットワークプログラミングは避けて通れません。
手始めに書くのはおそらくechoサーバでしょうが、
その次はどれを書こうかな、とそんなときにskkservはいかがでしょうか。
</p><ol><li>簡単なプロトコル
</li><li>かな漢字変換エンジンが簡単
</li><li>実際に動くと楽しい
</li></ol><p>skkのプロトコルは単純です。
skkserv.cの先頭部分のコメントに入りきるくらい単純なものです。
それでいて、なにがあってもクライアントと接続を維持しつづけないといけない、
というあたりがなかなか微妙な感じで、
学ぼうとしてる言語の癖が掴めてよろしいのではないでしょうか。
</p><p>また、かな漢字変換の仕掛けが簡単で、
ここではまることがまずありません。
モチベーションの維持によいです。
</p><h3 id='H-cen1pn'>書いてみる
</h3><p>せっかくですので<a href='log2/uim' title='[uim] Last modified: 2008/12/14 05:56:45 JST'>uim</a>で書いてみました。
</p><p>uimも1.5.xまではそれぞれのimが各クライアント付属のライブラリを使って通信していたのですが、
いまではソケットまわりの低レベルな操作より上のレベルでは、
schemeで書かれた各モジュールが各プロトコルでサーバと対話するようになっています。
</p><p>ネットワークの基本的な部分は汎用の部品が用意されているわけです。
</p><p>さて、肝心の漢字変換ですが、
uimにはlookというモジュールがありまして、
これはlook(1)をそのままライブラリとして使えるようにしたものです。
正確にマッチするようにすると普通の変換、
先頭にマッチするすべてのエントリを列挙すると予測変換ということになります。
辞書はソートされている必要があるのですが、
便利なのでuimのいろいろなところで使われています。
</p><p>というわけで、部品は揃ったので、
これらをうまくつないでやれば結構簡単に書けます。
コードはこんな具合です。
</p><ul><li><a rel='nofollow' href='http://gist.github.com/751706' title='InterWikiName [gist:751706]'>gist:751706</a>
</li></ul><p>サーバの機能よりも辞書のパースの方がコードが長いくらいですね。
</p><pre> uim-sh /path/uim-skkserv
</pre><p>でport 1178で起動します。
辞書は~/.uim.d/dict/SKK-JISYOを使います。
</p><p>ipv6も使えますし、予測入力も対応しています。
</p><p>lookは単純に二分検索するだけですが、
手元の辞書500900エントリでも一瞬で出ます。
</p><p>string-concatenate-reverseはuim-1.6.0に入れ忘れたものです。
ごめんなさい。
</p></p></div><div class='entry'><h2><a href='log2/uim/2009/10/13/ffi'>uim/ffi</a></h2><div class='category-icons'><a href='log2/uim'><img src='http://quasiquote.org/images/category-uim' alt='Category of uim'/><br/></a></div><p><p>uimのschemeから共有ライブラリにアクセスするには、
モジュールを作って(module-load)する、という方法が用意されているのだけど、
そもそも共有ライブラリを作成できる言語処理系でないとモジュールを作成できないし、ちょっとライブラリを試したいだけなのにファイルを作るのはめんどう。
</p><p>ということで、uim-trunkにlibffiにアクセスするモジュールを投入した。
</p><p><a href='http://sources.redhat.com/libffi/' title='libffi' rel='nofollow'>libffi<img src='images/extlink-16x16.gif'/></a>をインストール後、
--with-ffiでconfigureしたuimをインストールすれば、
uim-shから、
</p><pre class='prettyprint'>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
</pre><p>とかできる。
</p><p>もちろん引数の数や型を間違えると即死するので注意が必要。
</p><ul><li>無茶な例: <a rel='nofollow' href='http://gist.github.com/207980' title='InterWikiName [gist:207980]'>gist:207980</a> リトルエンディアンの32bitCPU前提だし、ここまでくるとモジュール作ったほうがいい。まねしちゃだめ。
</li></ul></p></div><div class='entry'><h2><a href='log2/uim/2009/08/09/prediction'>uim/prediction</a></h2><div class='category-icons'><a href='log2/uim'><img src='http://quasiquote.org/images/category-uim' alt='Category of uim'/><br/></a></div><p><p>Canna/SJ3/Wnnで予測入力できないのは悲しいので書いた。
</p><ul><li><a rel='nofollow' href='http://quasiquote.org/files/uim-predict.diff.gz' title='InterWikiName [files:uim-predict.diff.gz]'>files:uim-predict.diff.gz</a>
</li></ul><p>せっかくだから日本語以外のimでも使えるように。
</p><p>これをcommitしたら、look-imは廃止することになるんだろうなあ。
</p><p>sqlite3は動作が重いかもしれない。
というかこういう用途は想定してないだろうし。
</p><p>wlos初めて使ってみたけど、tinyclosと勝手が違って涙目。
</p></p></div>
</p><p><a href='log2/uim%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%85%a8%e3%81%a6%e3%81%ae%e3%82%a8%e3%83%b3%e3%83%88%e3%83%aa' title='[uimに関する全てのエントリ] Last modified: 2007/12/25 13:23:14 JST'>uimに関する全てのエントリ</a>
</p>
日本語入力ねた。おいらコミッタ。
** つくったもの
- look input method: 英語でも予測入力
- sj3 input method: いにしえの日本語変換サーバsj3を使って日本語変換
- wnn input method: こちらはwnnを使って日本語変換
- social-ime input method: webベースの日本語変換サービス Social IME を使っ...