2008年 01月 25日

lig.rb

Linger の IRC gateway を Ruby でかきました。

  • 部屋に入れる (パスワードつきの部屋にも入れる)
  • 発言できる

だけです。

  • チャンネル名は URL の末尾のやつ (チャンネルの名前ではない)
  • leave しないで放置して繋ぎなおすと、いっぱいメッセージが流れるかもしれないですが処理していません。
  • 部屋の nick がそのまま IRC の nick として流れます。なのでクライアントが u8 の nick を処理できないと死にます。

Ruby のライブラリが一応公開されていたのでそれつかっています。http://svn.lingr.com/api/toolkits/ruby/infoteria/api_client.rb

chokan の rice/irc が必要です。

$ mkdir lig
$ cd lig
$ svn export http://svn.coderepos.org/share/lang/ruby/chokan/trunk/rice/
$ wget http://svn.lingr.com/api/toolkits/ruby/infoteria/api_client.rb
$ wget http://svn.coderepos.org/share/lang/ruby/misc/lig.rb

今は net-irc gem の一部になっています。HEAD をかなり頻繁に更新しているので

$ svn co http://svn.coderepos.org/share/lang/ruby/net-irc/trunk/ net-irc
$ ruby examples/lig.rb --help

してください


tiarra の設定例

lingr {
	host: localhost
	port: 16669
	name: username@example.com
	password: password on lingr
	in-encoding: utf8
	out-encoding: utf8
}

haskell_hackathon_2008 を IRC から見たかったのでつくりました。最初は http://search.cpan.org/src/MIYAGAWA/POE-Component-Client-Lingr-0.04/eg/lingr-ircd.pl を使おう/いじってみようとおもったのですが、せっかくなので Lingr の API をさわってみた感じです。

rice をもとにして IRC サーバをもっと簡単にかくライブラリを書いて gem にするとよさそうかもしれない。あんまソース綺麗じゃないしなぁ (てきとうに書いたわりにそこそこ安定してる)

なんかうんこみたいなバグがいっぱいあったのでたくさんなおしました。日記書くとバグがみつかる

Lingr めも

セッションは同じアカウントでも完全別々にはれる。lig.rb で接続しっぱで Web から見てもきられないし、occupant_id も違う。でも完全に別人として扱われるわけではなく、chatters では重複しないようになってる (よくわからない。occupant_id で判断しているんじゃないのか)

あ、user_id ってのが別にあった。occupant_id は anonymous でも絶対にあるけど、user_id はない。

Y

Y コンビネータが今の僕には理解できない。

JSDeferred の parallel が直接繋げられない理由

http://void.heteml.jp/blog/archives/2008/01/asdeferred.html ASDeferred !

parallel に直接つなげられない理由をとりあえず書いておきます。(ASDeferred での回避法はちゃんと読んでない><)

まずそもそも

next(function ..).
wait(1).
next(function ..);

みたいなときの wait(1) は

next(function ..).
next(function () {
    return wait(1);
}).
next(function ..);

を簡単に書くためだけにあります。でもこの二つには決定的な違いがあって、それは wait(..) の引数の評価タイミングです。wait みたいに引数がいつ評価してもかわらないようなのならいいのですが、parallel みたいなのだと困ります。(wait でも、変数を書いて、非同期にその値を書きかえる、っていう場合は同じように問題でてきます)

next(function () {
	alert(0);
	return wait(3).next(function () {
		alert(1);
	});
}).
next(function () {
	return parallel({
		foo: wait(1).next(function () { alert(2) }),
		bar: wait(2).next(function () { alert(3) })
	});
}).
next(function (results) {
	alert(4);
});

これは正しく 0, 1, 2, 3, 4 と表示されますが、

Deferred.register("parallel", parallel);

next(function () {
	alert(0);
	return wait(3).next(function () {
		alert(1);
	});
}).
parallel({
	foo: wait(1).next(function () { alert(2) }),
	bar: wait(2).next(function () { alert(3) })
}).
next(function (results) {
	alert(4);
});

これは parallel の引数の wait(1) と wait(2) が、最初の next() とかと同時に評価されるので、順がくずれ 0, 2, 3, 1 になります。(4 もよばれないけど、あとから継続をセットしてもよばないせい。変えようか迷ってるけど変えてない)


でもって、あんまり深く考えず、next().wait().next() みたいに書くのはあくまで速記法だから parallel はなくてイイヤーってのが今の状態です><

ちなみに call() の速記版がないのは、もともと prototype.call があるので名前に困ってつけてないだけです (この二つは全然ちがうものです)。