#詳しい解説ありがとうございます。何か環境依存の問題があったりするのかと思い、指定するのを躊躇してました。早速、-fomit-frame-pointerを渡すように書き直したspecを、SourceJuicerに突っ込んできます。
#あー逆です。specではOPTFLAGSをいじるのをばっさり削除してください。
#configureの方でOPTFLAGSに-fomit-frame-pointerだとか他のオプションだとかが指定されます。
#specの方でOPTFLAGSをオーバライドすると、他の最適化オプションが消えちゃいます。
#あ、本当ですね。-DUSE_I686_PREFETCHとかも指定される場合があるのかー。実は、RPMではなくて、SolarisのpkgbuildっていうRPMライクなspecを扱うツールの話なんですが、標準で-fno-omit-frame-pointerが指定されていまして。ちょっと他の方法を考えてみます。
#昨日と同じ現象が起きました
#自宅→会社の移動です
##それが空で返っているのに(項目をクリックしてもレスポンスヘッダが出ない)、リトライしないみたいですね
#それ以降はseqへのリクエストだけが飛んでます
#あーでも空で返ってるわけじゃないのかも
#ちょっとわかりませんが
#9997にクエリ文字列なしでリクエストが飛ぶと、HTML(Document)が返るみたいなんですが(リロード後のやつはそうなってる)、レジューム後にこのURLにアクセスしても、少なくともHTMLは返ってないっぽい
#ちなみにコンソールには何も出ません
#ふむ。"Connection Lost"が出るということは、空で返ったリクエストはjavascript側で認識していて、リトライルーチンに飛んでいるってことだと思います。
#a,
#まてよ。クエリ文字列無しで読んでるってことは、既にその先に行ってる?
#Connection Lostはサスペンド直前に接続が切れた瞬間出ているという可能性もありますね。
#そんで、RetryのXHRはパラメータつきで呼ぶはずなので、レジューム直後にパラメータ無しが飛んでるということはwatchdog timerの方かもな。絶対時間で見てるなら充分時間経過してるはずだから。
#とりあえずcometサーバのログの方には、'/'にアクセスに来ておかしな返事を返した、という記録は出てないです。
#サスペンド/レジュームの問題ならうちのx60でも再現できるかも。後でやってみます。
#今朝common-lisp 部屋の発言が一部表示されていなかったけど、リロードでなおった、ということがありました。
#(び)さんの発言から、NANRIさんの引用まで。
#これもレジュームしたから、truncationに気づかれなかったのかな。
#怪しいのはレジュームまわりですか。
#あと、truncationについては今はプロトコル的にも欠陥があって、ほんとはtruncateが起きたということを別のパラメータで伝えないとなりません (ファイルのgenerationとか導入しようかな、と思っていますが)
#レジュームしている間に前日のposより当日のfile sizeがおおきくなっちゃうと、そうなるかなと。
#ですね。
#てすと
#(use gauche.parameter)
(use rfc.http)
(define-class <chaton-config> ()
((host :init-keyword :host
:accessor host-of :init-value #f)
(url :init-keyword :url
:accessor url-of :init-value #f)))
(define *chaton-config*
(make-parameter
(make <chaton-config> :host "practical-scheme.net:9997"
:url "http://practical-scheme.net/chaton/gauche/")))
(define (get-cid config)
(receive (code head body)
(http-get (host-of config) "/")
(let1 match (#/initViewFrame\((\d+)\)/ body)
(and match (match 1)))))
(define pos 0)
(define seq 0)
(define (test config)
(let1 cid (get-cid config)
(receive (code head body)
(http-get (host-of config) #`"/?t=,|seq|&p=,|pos|&c=,|cid|")
body)))
#pre内のurlはアンカーにするのやめようか。少なくともunderlineは出さないほうが読みやすそうだな。
#つーかみんな気が速い。
#(define (test config seq pos cid)
(let1 cid (get-cid config)
(receive (code head body)
(http-get (host-of config) #`"/?t=,|seq|&p=,(x->string pos)&c=,|cid|")
body)))
#gosh> (define cid (get-cid (*chaton-config*)))
cid
gosh> (define res1 (test (*chaton-config*) "0" "0" cid))
res1
gosh> (string-length res1)
123730
gosh> (define res2 (test (*chaton-config*) "1" (string-length res1) cid))
res2
gosh> (string-length res2)
123731
gosh> cid
"155274092"
#posってなんだろ
#posっていうのは「ここまで既読」というのを示す一種のポインタです。
#上の例で(string-length res1)をposとして渡しても、res2にはまた最初から返ってきます
#数値自体はサーバ内部で使う値なので、クライアントは値をopaqueなものとして扱ってください。
#そういえば?t=のパラメータは未使用な気がしますが、用途は何かありますか
#ただし数値0は常に「現在アクティブなログの先頭」をさします
#あ、そうか、res1をパーズしてその中の値を使うのか
#tパラメータはキャッシュ避けです。
#var pos = 0;
var seq = 0;
var need_scroll = false;
function fetchContent(cid) {
seq = (seq+1)%100;
var ts = ((new Date).getTime()).toString(36) + seq.toString(36);
new Ajax.Request('/?t=' + ts + '&p=' + pos + '&c=' + cid,
{
method: 'get',
evalJSON: 'force',
// When Comet server disconnects, Firefox calls onSuccess with
// emtpy content, while IE7 calls onFailure.
onSuccess: function(t) {
var json = t.responseJSON;
if (!(json && json.ver && typeof(json.cid) == 'number')) {
fetchRetry(cid);
} else {
insertContent(json, cid);
}
},
onFailure: function(t) {
fetchRetry(cid);
}
});
startWatchDog(cid);
}
#これをみたのですが
#あーなるほど。
#chaton_client.rbはreudyというボットをchatonで動かしたかったので、先走ってしまいました
#Lingrでも動いてたやつですか?
#ロイでぃ
#そうです
#gosh> (substring res1 0 100)
"{\"pos\":36015,\"nc\":18,\"ver\":\"kjkohq\",\"cid\":69014566,\"text\":\"<div class=\\\"entry-header\\\"><span class=\\"
#次回のposとcidはこの中のものを使うのかな?
#json中に入ってるpos (36015) とcid (69014566)
#なのでjsonをパーズしてもらわないとなりませんが、もうだいたいS式の方ができつつあるのです
#りょうかいです>S式
#ほんとは参照実装も作ってから公開しようかとおもったけど、せっかくだからここでインタラクティブにやっちゃいましょうか。
#リクエストに&sつければs式で貰えたような
#そうか
#ふふ。読まれてましたか > saki
#cometサーバ再起動します。えいっ.
#よっしゃ。
#えーっとですね、APIでアクセスしたい人は、まず $room-url/apilogin というcgiにPOSTアクセスをかけてください。
##POSTで渡すパラメータはひとつ。'who' という名前で、そちらのクライアントプログラムの名前とかバージョンとか簡単に。
#どういったプログラムがアクセスしてるか知りたいだけなので。
#てすと
#このcgiは返事にS式のalistを返します。
#ふむふむ
#((post-uri . <post-uri>) (comet-uri . <comet-uri>) (cid . <cid>) (pos . <pos>))
#順番は不動。後で項目が追加されるかも。
#post-uriはpostするためのcgiのurl。comet-uriはlong pollするためのurl
#cidはこのあとcomet-uriにGETするときに渡す値。
#posは現在のログの最新位置で、現在の最新位置以降を取りたい場合はこの値をpの値として使ってください。最初のcometアクセスでアクティブログを全部取りたい場合はこの数値を無視してp=0を渡してください。
#おおー。大分楽になります
#curl でもできました。
#で、cometサーバの方は&sをつければS式で発言が帰るはずですがそこはまだテストしてません。
#cometサーバが再起動した場合、現在はリプライの中に新しいcidを入れて返してますが、もしかすると将来は古いcidに対して拒否のリプライを返すようになるかも。そしたら再びapiloginからの手順を繰り返してもらうことになります。
#GaucheはPOSTアクセスやるにはmimeを自分で組み立てないとならないんで今はちょいと面倒
#(define (make-mime alist)
(let1 boundary (format "boundary-~a"
(number->string (* (random-integer (expt 2 64))
(sys-time) (sys-getpid))
36))
(values (tree->string
`(,(map (lambda (k&v)
`("\r\n--",boundary"\r\n"
"Content-disposition: form-data; name=\"",(car k&v)"\"\r\n\r\n"
,(x->string (cdr k&v))))
alist)
"\r\n--",boundary"--\r\n"))
boundary)))
#(define (POST room-url uri params)
(receive (host path) (host&path uri)
(receive (body boundary) (make-mime params)
(receive (status hdrs body)
(http-post host path body
:mime-version "1.0"
:content-type #`"multipart/form-data; boundary=,boundary")
(unless (equal? status "200")
(cerrf room-url "POST to ~a failed with ~a" uri status))
(safe-parse room-url body)))))
(define (host&path uri)
(receive (scheme specific) (uri-scheme&specific uri)
(receive (host path q f) (uri-decompose-hierarchical specific)
(values host path))))
#(define (safe-parse room-url text)
(guard (e [(<read-error> e)
(cerrf room-url "invalid reply from server: ~s" reply)])
(print text)
(read-from-string text)))
(define (cerrf room-url fmt . args)
(apply errorf <chaton-error> :room-url room-url fmt args))
#(define-condition-type <chaton-error> <error>
(room-url #f))
#あっそれから、apiloginでcidを得たらすぐcomet serverにつないでください。わりと短時間でタイムアウトします。
#それ引っかかりました。client-sweep!で初回接続のタイムアウトバンバン切られました
#あーすみません。10秒は短いかな。
#インタラクティブにいじろうとするとタイムアウトしちゃいますね。
#いえいえ。インタラクティブでダメで、スクリプトだと動くことがあったので、何でかなと思っただけでした
#helloiamtorubot
#ポストは簡単ですね。
#いずれpostの方にもcidつけてもらうと思います。
#あ、わたしの上の方の発言ですが、「順番は不動]
#じゃ意味が逆だ。「順不同」と言いたかったのでした。
#他の言語でアクセスする時にはS式はちょっと面倒かな?
#(use rfc.uri)(use srfi-27)か
#あとrfc.http
#text.tree
#POSTの引数room-urlは"http://practical-scheme.net/chaton/gauche"で、uriは"apilogin"でよいですか? #gosh> (POST "http://practical-scheme.net/chaton/gauche" "apilogin" '(("who" "TestChatonClient")))
*** ERROR: bad type of argument for server: must be an <http-connection> object or a string of the server's name, but got: #f
Stack Trace:
_______________________________________
0 (error "bad type of argument for server: must be an <http-connecti ...
At line 197 of "c:\\Program Files\\Gauchebox\\Gauche\\share\\gauche\\0.8.14\\lib/rfc/http.scm"
1 (ensure-connection server auth-handler auth-user auth-password ext ...
At line 173 of "c:\\Program Files\\Gauchebox\\Gauche\\share\\gauche\\0.8.14\\lib/rfc/http.scm"
2 (http-post host path body :mime-version "1.0" :content-type (strin ...
At line 149 of "(stdin)"
#uriの方もフルで指定してください。
#りょうかいしました
#room-urlの方は単にエラーメッセージに出す識別子として使ってるだけです。
#gosh> (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient"))) (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient")))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 254944168) (pos . 47957))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 254944168) (pos . 47957))
#2つ返ったぞ。
#だって2つ投げてるじゃん
#?
#コピペミス
#プロンプトに (POST ...) (POST ...) ってなってるように見えるけど
#つぎはlong-polか
#poll
#あれ、えんどうさんのそのログ妙だな。同じcidが返ってるってことはアクセスは一回だ
#こっちのログにも一回しか出てない。
#あ、キャッシュかも。
#apilogin返す時にnocacheつけたほうがいいな。
#コピペミスの功名<違
#cache-control: no-cacheつけてみた。
#よっしゃ。
#gosh> gosh> (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient"))) (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient")))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 254944168) (pos . 47957))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 254944168) (pos . 47957))
#あれれ、変わらない? うちからだとcid変わるんだけど。
#早かった?
#もう一回やってみて
#あ、というか
#その前の結果がキャッシュされちゃってるよ。
#とりあえず今はダミーパラメータつけてもらうしかないかな。apiloginのあとに
#?<適当な文字列>
#とか
#gosh> (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient"))) (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient")))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 18500673) (pos . 51183))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 18500673) (pos . 51183))
gosh> *** CHATON-ERROR: POST to http://practical-scheme.net/chaton/gauche/apilogin failed with 500
Stack Trace:
_______________________________________
0 (cerrf room-url "POST to ~a failed with ~a" uri status)
At line 153 of "(stdin)"
#はてー?
#こっちのログでは成功してるっぽいのだが…
#ちょっと出なくちゃならないのでまたあとで。
#りょかいしました
#ちなみにMeadowのschemeシェルで実行
#gosh> (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient")))
*** CHATON-ERROR: POST to http://practical-scheme.net/chaton/gauche/apilogin failed with 500
Stack Trace:
_______________________________________
0 (cerrf room-url "POST to ~a failed with ~a" uri status)
At line 153 of "(stdin)"
gosh> (POST "http://practical-scheme.net/chaton/gauche" "http://practical-scheme.net/chaton/gauche/apilogin" '(("who" "TestChatonClient")))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 204115670) (pos . 52706))
((post-uri . "http://practical-scheme.net/chaton/gauche/chaton-poster-gauche") (comet-uri . "http://practical-scheme.net:9997/") (cid . 204115670) (pos . 52706))
gosh>
#謎的
##これを読もう>long-poll
#function longPoll() {
new Ajax.Request(
"/chat/poll",
{
method: 'get',
onSuccess: function(req) {
new Insertion.Top('list', '<li id="message">'
+ decodeURIComponent(req.responseText.replace(/\+/g, ' '))
+ '</li>');
longPoll();
},
onException: function(req, e) {
new Insertion.Top('list', '<li id="error">recv failed: '
+ e + '</li>');
}
});
}
#末尾再帰?
#外出します
#2つ返ってくるというか片っ方はsafe-parse内の(print text)で表示されてるだけですよー
#MacBook の Firefox だと、スリープから起きたとき後も正常に動いてます。ただし、マシンそのものの場所は移動してません。未読数がすごい数に。
#それは再帰じゃないですよー。
#コールバック?
#イベントハンドラを登録しているように見える
#あっそうか。safe-parse書いたの自分なのに忘れてた。
#いま未読数は表示されなくなってるんだっけ?
#いや、そんなことないよ
#ポインタがiframe内にあると出ないんだったっけ火
#s/火/か/
#どうだっけな
#firefoxのタブのところに出ていた未読数がでなくなってるような気がする。
#APIに関する話とか、そのためのコード貼り付けとかやってるとごちゃごちゃするので、Chatonシステムに主に関する話は部屋をわけようかな。
#一時的なものだとしたらまあ今の運用でもいいんだけれど。
#chatonが安定するまではその方がいいかもしれないですね
#というか、後でまとめがしやすい
#(誰がするんだという話はあるにせよ)
#Gauche以外の言語でAPI叩いてる話とかはGauche部屋ではやりにくいかもしれないし。
#あれやっぱり出ないなぁ。なんか設定いじったかなぁ。> firefox
#後あれかも、Lingrにもあったけど、API実験用の部屋があるといいのかも
#しばらくまっていたらでるんじゃないですかね。
#議論と混じっちゃうと、気が引けて実験がしづらい人もいると思うし
#それはありますね。
#どのくらいだろう? > しばらく
#んー、30秒くらい?
#その部屋のログは、場合によってはローテート後にcronで消しちゃってもいいと思うし
#ポーリングしているそうなので、リアルタイムではないです。
#あと、ぼくの環境だと、マウスカーソルを動かさなければ数字は消えないでふえつづけます。
#とりあえず、API実験場兼Chatonに関するChat、ということでつくりました。
##API実験が一緒でうまくなさそうならまた考えます。
#Chatonのアイコンだれか作れる人いないかな。
#がんばれ >yasuyuki
#わたしの参戦は、道志村から帰って来てからだな
#chaton には模造宝石という意味もあるそうですね。
#今はPowerPointと格闘中(泣)
#うちの Safari でも未読数が出なくなってる気がします 3.2.1 on MacOSX 10.5.6
#ちゃんと追っ掛けてないですが
#はて、今私のFirefox on Ubuntuでは出ている。
#他のadd-onのせいかもしれない
#というのはchaton部屋のほうがいいかな。
#Safari 3.2.3 on Mac OS X 10.5.7は出てる >未読
#他のタブ見てる時にはちゃんとタブのtitleが更新されている
#あれ、ウィンドウのタイトルは更新されてました。アップデートしてからまた確認してみます
#いま [1] Chaton Chaton になっている。
#いま [3]になった
#タブをクリックするだけで、消えるかもしれんなぁ。やっみる
#さて2部屋ウォッチするのもみんな大変だと思うので、こちらの部屋はGaucheおよびScheme一般の話題限定ということにしまっす。
#相互参照したくなたらpermalink活用してください。
#LOLゲラ来た
#宿へ持っていくか
#けっこう待ち時間あるしな
#Geiser, a new Emacs-Scheme interaction mode だって
##む
#あっさり再接続
#タイミング依存だなこれは
#2つ開けてても、OKな時は常に両方OK、ダメな時は両方NGだな
#とりあえずエラー処理してないバージョンのmac用raderできた
#時々util.matchで落ちるけど
##ここに貼っておきました
#test
#huh?
#foo
#てすとです
#(use gauche.parseopt)
(define (show-help progname)
(print #`",|progname| [-c conf]"))
(define (main args)
(let-args (cdr args)
((c "c|conf" => (cut print <>))
(h "h|help" => (cut show-help (car args))))))
#$ gosh argtest.scm -c test
*** ERROR: wrong number of arguments for #<closure (main #<identifier gauche.parseopt#cb1>)> (required 1, got 0)
Stack Trace:
_______________________________________
0 x
1 x
2 optargs
3 (build-option-parser (list (list "c|conf" (lambda x (set! c (apply ...
[unknown location]
#(cut print <>)には何も渡らないように見える。なぜだ?
#-cに引数取りたいなら "c|conf=s" としてください
#おお
#毎回聞いているような気がする
#まあエラーメッセージはもうちょっと頑張ればもっと親切に出来るような気はする。