メッセージキュー、何を使えばいいのかわからないお……
Q4M って DBI 使うとブロックしちゃうけど、非同期にするにはどうしたらいいんだろう。AnyEvent::Worker|AnyEvent::DBI (=fork) 使うのがいいのかな。スタンダードな方法がわからない
LDR Streaming API では自力で MQ 作ったというのを見たけど、これ使っとけ的なのはないのかなあ……
Memo
HTTP ベースで pub/sub なメッセージキュー
かなりざっくり書くと以下のような感じになる気がするけど、こういう HTTP ベースの内部用途の pub/sub サーバって既に良いのはあるのかな……
package Buspub;
use strict;
use warnings;
sub route ($$);
use Router::Simple;
use Tie::IxHash;
use AnyEvent::HTTP;
use HTTP::Request::Common;
use JSON::XS;
use POSIX ();
use MongoDB;
my $connection = MongoDB::Connection->new(host => 'localhost', port => 27017);
my $subscriptions = $connection->get_database('pubsub')->subscriptions;
$subscriptions->ensure_index(Tie::IxHash->new( key => 1, created => -1 ), { background => 1 });
route '/sub' => {
action => sub {
my ($r) = @_;
my $key = $r->req->param('key') or return $r->json({ error => "key required"});;
my $callback = $r->req->param('callback') or return $r->json({ error => "callback required"});;
my $id = $subscriptions->insert({
key => $key,
messages => [],
callback => $callback,
max => 25,
created => scalar time(),
});
LOG("SUB:: %s with callback: %s", $key, $callback);
$r->json({ id => "$id" });
}
};
route '/pub' => {
action => sub {
my ($r) = @_;
my $key = $r->req->param('key') or return $r->json({ error => "key required"});;
my $message = decode_json $r->req->param('message');
my $cursor = $subscriptions->query({ key => $key });
my %count;
while (my $obj = $cursor->next) {
$count{all}++;
my $id = $obj->{_id} . "";
my $uri = $obj->{callback};
my $messages = [ @{$obj->{messages}}, $message ];
my $req = POST $uri, [ id => $id, messages => encode_json($messages) ];
LOG("PUB:: => %s => %s with %d messages", $key, $req->uri, scalar @$messages);
http_request $req->method => $req->uri,
body => $req->content,
headers => {
map { $_ => $req->header($_), } $req->headers->header_field_names
},
timeout => 20,
sub {
my ($body, $headers) = @_;
LOG("PUB:: <= %s <= %s with status:%d", $key, $req->uri, $headers->{Status});
if ($headers->{Status} =~ /^2/) {
$subscriptions->update({ _id => $obj->{_id} }, { '$pullAll' => { messages => $obj->{messages} } });
} elsif ($headers->{Status} =~ /^4/) {
$subscriptions->remove({ _id => $obj->{_id} });
} elsif ($headers->{Status} =~ /^5/) {
if (@$messages > $obj->{max}) {
$subscriptions->remove({ _id => $obj->{_id} });
} else {
$subscriptions->update({ _id => $obj->{_id} }, { '$push' => { messages => $message } });
}
}
}
;
}
$r->json({ key => $key, delivered => \%count });
}
};
route '/test/callback' => {
action => sub {
my ($r) = @_;
use Data::Dumper;
warn Dumper $r->req->param('id') ;
warn Dumper decode_json $r->req->param('messages') ;
$r->res->status($r->req->param('code') || 404);
$r->res->content_type('application/json; charset=utf8');
$r->res->content('{}');
$r->res->finalize;
}
};
BEGIN {
my $router = Router::Simple->new;
sub route ($$) { $router->connect(@_) };
sub run {
my ($env) = @_;
if ( my $handler = $router->match($env) ) {
my $c = Buspub::Context->new($env);
$handler->{action}->($c);
} else {
[ 404, [ 'Content-Type' => 'text/html' ], ['Not Found'] ];
}
}
sub LOG {
my ($message, @args) = @_;
print sprintf("[%s] $message", POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime), @args), "\n";
}
};
package Buspub::Request;
use parent qw(Plack::Request);
package Buspub::Response;
use parent qw(Plack::Response);
package Buspub::Context;
use JSON::XS;
sub new {
my ($class, $env) = @_;
bless {
req => Buspub::Request->new($env),
res => Buspub::Response->new(200),
}, $class;
}
sub req { $_[0]->{req} }
sub res { $_[0]->{res} }
sub json {
my ($self, $vars) = @_;
my $body = JSON::XS->new->ascii(1)->encode($vars);
$self->res->content_type('application/json; charset=utf8');
$self->res->content($body);
$self->res->finalize;
}
\&Buspub::run;
✖
JSDeferred を Jetpack (Add-on SDK) で使う
binding を書いた (まだブランチに入れてある)
setTimeout/clearTimeout がないので nsITimer で実装 (これでいいのか?)- Deferred.postie という utility を追加
Deferred.postie(constructor, options) を使って widget/panel をつくるとメソッドが増えます。
- post(args..., function) //=> Deferred
- function をレシーバの content context 内で args と共に呼び、結果を取得
- bind(selector, event, function) //=> Deferred
- content 内の selector でマッチする要素全てで、 event が発火時 function (chrome context) を呼びだす
以下のように書けます。post に渡す関数は文字列化されて content に渡されるので、スコープを外部と共有していない。args も JSON で表現できるものしか渡せない。この点わかりにくいのでイマイチかもしれない。
完全に message のやりとりを置き換えられるわけではないけど、ちょっとしたイベント処理とかは直列で簡単に書けるようになるので、便利な場合は便利かもしれない。
const Deferred = require("jsdeferred").Deferred;
Deferred.define(this); //define 使う場合必ず引数に this を渡す必用あり
widget = Deferred.postie(widgets.Widget, {
label : "Foo",
contentURL : 'http://example.com/',
width : 32,
onClick : function () {
var self = this;
next(function () {
return self.
post(1, 2, function (a, b) { // content context
return a + b;
}).
next(function (res) { // chrome context
console.log(res);
});
}).
next(function () {
return wait(1);
}).
next(function () {
return self.
post(function (a, b) {
throw "foo";
}).
next(function (res) {
console.log(res);
}).
error(function (e) {
console.log(e);
});
});
},
onMessage : function (message) {
console.log(message);
},
contentScript : 'setTimeout(function () { postMessage("custom message") }, 1000)',
});
widget.post(function () {
var d = new Deferred();
setTimeout(function () {
d.call(1);
}, 1000);
return d;
}).
next(function (a) {
console.log("Hello! " + a);
}).
error(function (e) {
console.log(e);
});
widget.bind("body", "click", function (e) {
console.log("body clicked" + e);
}).
error(function (e) {
console.log(e);
});
✖
✖
今日は朝からずっとイライラしてしまった。低気圧のせい(他人のせい)にしておきたいと考える。
ある種の、ちょっと変わった程度のろくでもない属性 (例えばある学校とか、ある世代とか、ある地域とか) を自分にラベリングすることで、何らかの個性を出そうという気持ちがすけてみえている感じ、ただそれだけなら、まだ求個性没個性なだけで気持ち悪くとも害はない (無意味で、無個性な誇りだ) けれど、その大して価値のないちょっと変わった程度のろくでもない属性を守るために、他人に対して攻撃的だったり、排斥しようという感じになってくると、一体なんなんだろうという感じに見える。
こういうこと、他人に対し、内側から強い気持ち悪さを感じるときは、大抵自分の中に何かしらそういうものがあるときだ。じゃあ、どんな類に対して自分がそういった馬鹿げたことを思うかと考えてみると「○○な人はクソであって欲しくない」みたいに言葉にするとき解りやすく表に出てくるのかもしれないと気付いた。「プログラマは」「日本人は」「Perl が好きな人は」「あるアーティストが好きな人は」とあてはめてみると、自分の中からわさわさと出てくる。結局これでは人のことが言えない。
他人に対するイライラは、日記にまとめているうちに、自分の普段の行いによって相殺されるか、自分にふりかかる。日記に書いて落としこむ時点で、自分のクズさに要約される。
何かしら書いてしまえば一貫性を求められる。破れば糾弾されるから、矛盾には先に自分で気付かなければならない。日記は読みかえされないといけない。でも考えかたが変わったら変わったと書けば良いだけだ。強い口調は、他人の機嫌を損ねるというより、自分の逃げ道をなくすから良くない。
関連エントリー
- ✖ まともな人は集めず独立させ、ろくでもない人は集める、ということをすると、パレートの法則のよりろくでもない人の2割はまともになっていくので、最...
- ✖ 他人に対してイライラすることが多々あるけど、いい大人に何か言っても意味がないので、単に必要な手段を講じるのが良いと思う。一番よくないのは、納...
- ✖ ここ最近は、くだらないことでイライラはしても (結局のところうまくできない自分へのイライラに集約されている)、他人に対して強い憤りみたいなも...
- ✖ ほんとにイライラすることばかりが起きる。なんでこんなめにあうのか。本当の意味がわからない。 いくら自分から面白いことを探そうとしても、ひたす...
- ✖ 自分が加害者にならないという自信がある発言をよくあって、それが不思議。その発言自体が加害的なのに、法律的には罪にはないから、マウントが成立す...
✖
高校・大学と人間が心底嫌いになるばかりにコミュニケーション能力を得る機会の多くを失なって、いろいろと困ることになったということも、それによって他人のコミュニケーションの仕方を冷静に観察できるようになったのであれば別にいいような気がするけれど、自分で考えて造れる良いものが、殆どの他人の望むものとは違うという話であるなら、全くなんのこともなくて、自分が価値 (他人が必要とするもの) を生み出せないことにほかならない。
そういう気概で一体どうして何か造れようかと思う。
こういったこと、他人ではどうしようもないので、仕方なく、未来の自分である他人が楽しければいいと考えるしかなくなる。
関連エントリー
- ✖ 自分にコミュニケーション能力がないことによって、かえってコミュニケーションの重要性について実感できるのは良い。伝えるべきこともあるし、伝える...
- ✖ 自分は自分のルールで生きており、つまりこのルールは道徳ないし宗教なので、他人にどうこう言われるようなものではない。ただ生きてるわけでもなく、...
- ✖ 人間とのコミュニケーションは「貴重だ!」と思える程度の頻度でいい、それ以上は過剰
- ✖ 知らない人とのコミュニケーションの仕方についてはよく考えるけど、知ってる人とのコミュニケーションの深め方みたいなのは全然考えていないなと思っ...
- なぜ今僕がモールスを学習するのか 僕はベースとしてコミュニケーションに興味がある、というのがまずあって、そのためウェブサービスでも CGM 的なサービスが好きだったりするわけ...
✖
何かしら日記に書いていると、明日誰かに責めたてられる気がしてならない。クソだクソだと誰かが言っている声が聞こえてくる。おれがどんなにそういう人達に重さを感じないように努めても、不意うちでも何でも、視界に入ったら終わりなのだから、いよいよ、書くことで損することは認めないといけない。当たり前すぎるけど、インターネットは全然安全ではない。
関連エントリー
- バンドごとの印象 CW 以外殆ど聞いてない。アパマンハムはやはり厳しいなあという感じ。聞こえてこないぶん、卑屈になる。 7MHz 深夜以外はだいたい聞こえる。...
- ✖ 地域性や、学校や、リアルな繋りというの、インターネットでようやくそれらを取っ払って、マトモな他者を探せるようになったのに、昨今全く逆行してい...
- ✖ 京都は住むのに心地良いところだったなあと思う。長く住んだらそうではないのかもしれないが、圧倒的に神社が充実していたし、気が滅入ったときに明確...
- ✖ 今日は朝からずっとイライラしてしまった。低気圧のせい(他人のせい)にしておきたいと考える。 ある種の、ちょっと変わった程度のろくでもない属性...
- 家で酒を飲むのが最高 やっぱり飲み会とか好きじゃない。独りでアニメを見ながら「ひふみん可愛いデォユフフwww」とか言いながら酒を飲むのが最高であって、意識高い話を...
jetpack は node.js と同じように、exports.foo = 以外にも this.foo = でもいけるようになっていて欲しかった……
http://twitter.com/piro_or/status/37337771559489536:twitter:detail
http://twitter.com/cho45/status/37354831702134785:twitter:detail
http://twitter.com/piro_or/status/37355297706221569:twitter:detail
http://twitter.com/cho45/status/37355553843838976:twitter:detail
http://twitter.com/piro_or/status/37357301442682880:twitter:detail
http://twitter.com/cho45/status/37357988255633408:twitter:detail
var exports = { foo : ... }; と書けという話らしいです?
✖
Twitter でマジメな話ができないので、変な議論を呼びそうだなーとか、フローに流しても仕方ないこととか、ここに書いていこうという気持ちだけど、それに対して Twitter で返信されたらどうしたらいいのだろうなあ。追記するだけだと相手が気付かないし……






