コードも日記も
同じように、未来の自分に向けて書いている。おれはおれのためにしか日記やコードを書いていない。
同じように、未来の自分に向けて書いている。おれはおれのためにしか日記やコードを書いていない。
面白法人カヤック に来ています。
なんか一昨日までちゃんと「文乃さん やばい」で一位だったのに、今日みたら三位だった。ありえん(笑)
今日は55枚とった
irc ライブラリをかく -> chokan の設計みなおす
Linger の IRC gateway を Ruby でかきました。
だけです。
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 にするとよさそうかもしれない。あんまソース綺麗じゃないしなぁ (てきとうに書いたわりにそこそこ安定してる)
なんかうんこみたいなバグがいっぱいあったのでたくさんなおしました。日記書くとバグがみつかる
セッションは同じアカウントでも完全別々にはれる。lig.rb で接続しっぱで Web から見てもきられないし、occupant_id も違う。でも完全に別人として扱われるわけではなく、chatters では重複しないようになってる (よくわからない。occupant_id で判断しているんじゃないのか)
あ、user_id ってのが別にあった。occupant_id は anonymous でも絶対にあるけど、user_id はない。
Y コンビネータが今の僕には理解できない。
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 があるので名前に困ってつけてないだけです (この二つは全然ちがうものです)。