某プロジェクトが動き出したので、結構な勢いでGunghoとSwarmageの更新していきます!手始めに今週末はGungho のリリース2つ、Swarmage のリリースを3つリリースしますた。結構色んなもんに手を付けられてる!グッドグッド。
2007年09月
秋刀魚の炊き込みご飯
週末の朝、起き抜け。冷蔵庫をあけると秋刀魚が1尾、エリンギ(大)が一本。腹が減った。さて、どうしますか。
実は先週「秋刀魚の炊き込みご飯」なるものの存在を聞いたので、それをやってみる事に決定。まず秋刀魚を普通にやきます。エリンギは小さめに切ります。お米を鍋に炊く準備をして、エリンギを敷き詰める。秋刀魚は一応内蔵だけ軽く取って、三つにぶつ切りして敷く。味はつゆの素を使って味付け。それだけ。あとはいつも通り炊いたらできあがり♪炊きあがったら秋刀魚をほぐして混ぜる。
たいして期待してなかったんだけど、これがすげえうまい。ついついばくばくと食ってしまった。
実は先週「秋刀魚の炊き込みご飯」なるものの存在を聞いたので、それをやってみる事に決定。まず秋刀魚を普通にやきます。エリンギは小さめに切ります。お米を鍋に炊く準備をして、エリンギを敷き詰める。秋刀魚は一応内蔵だけ軽く取って、三つにぶつ切りして敷く。味はつゆの素を使って味付け。それだけ。あとはいつも通り炊いたらできあがり♪炊きあがったら秋刀魚をほぐして混ぜる。
たいして期待してなかったんだけど、これがすげえうまい。ついついばくばくと食ってしまった。
六義園
今日は本当は青梅のほうまで行って今夏最後の「川縁を歩こう」企画を敢行しようとしたのだが、あいにくと天気予報は山のほうにいけば行く程雨模様。なので予定変更。家にいようかと思ったけど、体がうずうずするので六義園に行ってきた。
以前から何回もその横は通ってるのだが、一回も入った事なかった六義園。入ってみたら愛しの清澄庭園よりもかなり大きめだしいい感じ。ただ、餌やりを楽しめる要素がないのが俺的にはちとポイントが低い。
そういえばフレーベル出版が六義園の真横にあった。ショップはアンパンマンだらけだった。
帰りは東京駅に寄って、ちと買い物。
以前から何回もその横は通ってるのだが、一回も入った事なかった六義園。入ってみたら愛しの清澄庭園よりもかなり大きめだしいい感じ。ただ、餌やりを楽しめる要素がないのが俺的にはちとポイントが低い。
そういえばフレーベル出版が六義園の真横にあった。ショップはアンパンマンだらけだった。
帰りは東京駅に寄って、ちと買い物。
Shibuya.pm
http://shibuya.pm.org/blosxom/techtalks/200710.html
Shibuya.pmで話させてもらいますよ。今回はたまたま最近色々アップしてるモジュール群がそのままひとつの大きめな作業をするのにぴたっとはまるので、その辺りを駆け足で(10分しかないから)話すつもりです。
Shibuya.pmで話させてもらいますよ。今回はたまたま最近色々アップしてるモジュール群がそのままひとつの大きめな作業をするのにぴたっとはまるので、その辺りを駆け足で(10分しかないから)話すつもりです。
隠れファン
実は某人材会社の営業さん(♀)の隠れファンでした。月2回くらい、ポストに名刺とかにメッセージを書いて投函してくれる、という実に(俺には)効果的な営業をしていてくれたのですが、これまた本人がキレイな方でして。今日営業に来てくれたんですが、異動になってしまったということで。
今度から新橋/品川エリアだそうです。仕事をあげられる余裕もないんだが、それでもファンだったのですげぇ残念。残念。残念。
今度から新橋/品川エリアだそうです。仕事をあげられる余裕もないんだが、それでもファンだったのですげぇ残念。残念。残念。
おい、こら!(皇国の守護者漫画版連載終了のお知らせ)
なんか老けたぞ。
最近急に年をとったと思うのです。とにかく「若者」が気になる。もうとにかく「お前、それは違うよ」って言いたい事が多すぎる。なんなんだ。30になると突然老けるのか?
まぁ要は眠れないのでこんな事考えて書いているのだ。くそぅ。
えーと、今日の晩飯はレンコンのキンピラ、白菜の漬け物、それにカボチャの煮物でした。カボチャが1個130くらいだったんだよ!安かった。鍋に大量につくっちゃった。ふと気づいてみたら動物性タンパク質を全く取ってない。珍しいなー
まぁ要は眠れないのでこんな事考えて書いているのだ。くそぅ。
えーと、今日の晩飯はレンコンのキンピラ、白菜の漬け物、それにカボチャの煮物でした。カボチャが1個130くらいだったんだよ!安かった。鍋に大量につくっちゃった。ふと気づいてみたら動物性タンパク質を全く取ってない。珍しいなー
酔いどれ時に本領を発揮するタイプです。
オーヘントッシャンとボウモアをちびちびやってます。「草野キッド」見てます。プレゼン書いてます。
・・・あ、プレゼン書けた。いつもは1週間くらい悩むのに。おっけー、おっけー。今回は全部俺俺ネタだったからカンタンだったのかも
・・・あ、プレゼン書けた。いつもは1週間くらい悩むのに。おっけー、おっけー。今回は全部俺俺ネタだったからカンタンだったのかも
Catalyst::Plugin::Apoptosis
また新モジュール。Catalyst::Plugin::Apoptosis。でも眠いから今は寝る。
30秒で分かるパルプフィクション
また清澄
ほぼ定例となりつつある清澄庭園訪問。そろそろ年間パスでも買うか(あるのかどうか知らんが)今日は2時間弱。岩場にあがってきた亀に枝の先につけた餌(お麩)をあげるのだが、その時にいい具合に餌を少しずつ亀の後方へとそらしてあげると首がのびきるところを見れるので非常に興味深い。やりすぎると後ろにすってんころりんと転がって行くので注意(しかも同じ亀が何回でも同じ事をする)。今日は残暑もいいとこで正直暑かった。
帰りに目黒に寄ったけど、秋刀魚は食えず、しかも屋台の飯はまずかったので悲しい気分のまま帰宅。夜はカボチャを炊いた。それとこの間もらったお土産の鶏の炭火焼。
帰りに目黒に寄ったけど、秋刀魚は食えず、しかも屋台の飯はまずかったので悲しい気分のまま帰宅。夜はカボチャを炊いた。それとこの間もらったお土産の鶏の炭火焼。
ヘキサゴンはどこまでガチなんだろう?
昨日やってたクイズヘキサゴン2はすごかった。あの番組って一体どこまで本当でどこからがやらせなんだろう。56個のマンゴーを出演者18人でわけて、残った分を司会の紳介さんにあげると一人何個ずつもらえますか、って問題なんだけど、その答えが6人中5人ががわからなかったばかりか紳介さんが説明していると(以下記憶から再構築)
紳介「56個のマンゴーが来ました」
回答者「はい」
紳介「18人いるからまず一個ずつ渡すやろ、何個残る?」
回答者「はい」「38個!」
紳介「38個は18人より多いからまたもう一周できるやろ?」
回答者「はい」「ああ、20個だ!」
紳介「20個も18人より多いからまたもう一周できるやろ?」
回答者「はい!」
紳介「で、結局一人何個や?」
すると回答者が声を揃えて「2個!!!」
これは笑った。これってなんてゆとり教育?
紳介「56個のマンゴーが来ました」
回答者「はい」
紳介「18人いるからまず一個ずつ渡すやろ、何個残る?」
回答者「はい」「38個!」
紳介「38個は18人より多いからまたもう一周できるやろ?」
回答者「はい」「ああ、20個だ!」
紳介「20個も18人より多いからまたもう一周できるやろ?」
回答者「はい!」
紳介「で、結局一人何個や?」
すると回答者が声を揃えて「2個!!!」
これは笑った。これってなんてゆとり教育?
POE::Component::MDBA - Send your queries asynchronously
[9/12 追記] DBICも動くようにした。あとドキュメントをもう少々書いてみた。CPANには0.01001を先ほどアップロード。
以前書いた非同期でSQLを流すヤツ、ちゃんとモジュールにしてみた。まだシンプルなDBIしか使えないけど、DBICからも使えるようにしたい。
まだCPANにアップされるには時間がかかると思うけど、一応こちらにアップされる予定→http://search.cpan.org/~dmaki/POE-Component-MDBA/
もしくはtracからどうぞ
以前書いた非同期でSQLを流すヤツ、ちゃんとモジュールにしてみた。まだシンプルなDBIしか使えないけど、DBICからも使えるようにしたい。
まだCPANにアップされるには時間がかかると思うけど、一応こちらにアップされる予定→http://search.cpan.org/~dmaki/POE-Component-MDBA/
もしくはtracからどうぞ
9.11
6年たちましたな。アメリカの反対側にいたのにあの日の事はいまでもはっきり覚えてる。
白布温泉旅行
10年ぶりくらいに家族旅行してきた。運転係だったのでつかれたー
前回実家に帰った時に突然「前も行った旅館から特別プランの案内が来てるんだけど、みんなでいく?」と言われたので急に行く事に。親子4人全員でどこかに泊まりの旅行をしたのなんてもう10年ぐらい前に一時帰国でバンクーバーに寄った時以来だ。
まぁそんなわけで車で白布温泉まで行ってきた。出発は台風9号日本縦断中の日。関東地方はもう小雨になって小康状態になってきた頃合いだったが、台風は依然北上中。我々は台風の後を応用に東北道を北上だ。途中ラジオとか聞いていてもあちこちで通行止めだなんだと言っている中のんびりと移動。もうすぐ目的地、というところでとうとう台風にほぼ追いついて大雨。まぁそれでも一瞬だったのでちょっと緊張した以外は特に問題無し。午後5時頃に到着。
宿では正直風呂に入る事とご飯を楽しんだだけだった。ご飯はひじょうにうまかった。文句無し。特にお米を生かすおかずが満載だったので、夜はさすがにお米は食べなかったが朝は普通にご飯3杯も食べてしまった。いかんいかん。
日中は米沢市内をぶらぶら。個人的には東光酒造に行って、あれこれ試飲しまくった。無料と有料の試飲があるんだけど、有料の試飲が25mlで50円ってすげぇよ。東京とかじゃありえねぇ。嬉しいねぇ。ってことで一人で多分全種類+ちょいとおかわり。粕漬けの試食もおいてあったのでそれをつまみにごくごく飲んでしまったら大分よっぱらったので、この時ばかりは親に運転交代。
微妙にオフシーズンだった事もあって宿にはほとんど誰もいなくて、温泉にとてもリラックスした感じでつかれた。湯につかって、ちょっとストレッチしてまた湯につかって・・・ぼーっとしまくり。
帰りは軽く宇都宮に寄って、帰宅。
しかし写真がうまく撮れんかったなぁ。
前回実家に帰った時に突然「前も行った旅館から特別プランの案内が来てるんだけど、みんなでいく?」と言われたので急に行く事に。親子4人全員でどこかに泊まりの旅行をしたのなんてもう10年ぐらい前に一時帰国でバンクーバーに寄った時以来だ。
まぁそんなわけで車で白布温泉まで行ってきた。出発は台風9号日本縦断中の日。関東地方はもう小雨になって小康状態になってきた頃合いだったが、台風は依然北上中。我々は台風の後を応用に東北道を北上だ。途中ラジオとか聞いていてもあちこちで通行止めだなんだと言っている中のんびりと移動。もうすぐ目的地、というところでとうとう台風にほぼ追いついて大雨。まぁそれでも一瞬だったのでちょっと緊張した以外は特に問題無し。午後5時頃に到着。
宿では正直風呂に入る事とご飯を楽しんだだけだった。ご飯はひじょうにうまかった。文句無し。特にお米を生かすおかずが満載だったので、夜はさすがにお米は食べなかったが朝は普通にご飯3杯も食べてしまった。いかんいかん。
日中は米沢市内をぶらぶら。個人的には東光酒造に行って、あれこれ試飲しまくった。無料と有料の試飲があるんだけど、有料の試飲が25mlで50円ってすげぇよ。東京とかじゃありえねぇ。嬉しいねぇ。ってことで一人で多分全種類+ちょいとおかわり。粕漬けの試食もおいてあったのでそれをつまみにごくごく飲んでしまったら大分よっぱらったので、この時ばかりは親に運転交代。
微妙にオフシーズンだった事もあって宿にはほとんど誰もいなくて、温泉にとてもリラックスした感じでつかれた。湯につかって、ちょっとストレッチしてまた湯につかって・・・ぼーっとしまくり。
帰りは軽く宇都宮に寄って、帰宅。
しかし写真がうまく撮れんかったなぁ。
塊魂は国境を超える。
Catalyst のFastCGIスクリプトを走らせるshスクリプト
daemontoolsでfastcgiプロセスを管理しようと思ってとりあえず書いてみた。
#!/bin/sh
#
# Copyright (c) 2007 Daisuke Maki <[email protected]>
# All rights reserved.
#
# fastcgi.sh
# Runs catalyst based application's fastcgi script via daemontools'
# softlimit script. You should call this script from a specific 'run'
# script like so
#
# #!/bin/sh
# /path/to/fastcgi.sh -s myapp.mydomain.com
#
args=`getopt s:d:m:n:g: $*`
if [ $? -ne 0 ]; then
echo <<EOM
Usage: fastcgi-run.sh [options]
-s: service name.
-d: data directory
-m: max memory size as passed to softlimit(3)
-n: number of processes to spawn
-g: group name to run script as
EOM
exit 2
fi
set -- $args
for i
do
case "$i"
in
--) shift; break;;
-s)
SERVICE="$2"; shift; shift;;
-d)
DATADIR="$2"; shift; shift;;
-m)
MAXMEMORY="$2"; shift; shift;;
-n)
NUMPROCS="$2"; shift; shift;;
-g)
GROUP="$2"; shift; shift;;
esac
done
if [ -z $SERVICE ]; then
echo "No service defined."
exit 1;
fi
if [ -z $DATADIR ]; then
DATADIR="/var/tmp/$SERVICE"
fi
if [ -z $MAXMEMORY ]; then
MAXMEMORY=150000000
fi
if [ -z $NUMPROCS ]; then
NUMPROCS=10
fi
if [ -z $GROUP ]; then
GROUP=www
fi
SOCKET="$DATADIR/fastcgi.socket"
if [ ! -d $DATADIR ]; then
echo "$DATADIR does not exist. Creating..."
mkdir $DATADIR
if [ $? -ne 0 ]; then
echo "Failed to create $DATADIR"
exit 1;
fi
chmod a+rwx $DATADIR
fi
cd /www/$SERVICE
if [ -z $SCRIPT ]; then
SCRIPT=`find script -name '*_fastcgi.pl'`
fi
if [ -z $SCRIPT ]; then
echo "No suitable script found"
exit 1;
fi
exec 2>&1 \
setuidgid $GROUP \
softlimit -m $MAXMEMORY \
$SCRIPT -e -l $SOCKET -n $NUMPROCS
hacked it in perl
英語が読めてなおかつ欧米な文化を理解できる事がいい、と思うのはこういう漫画やThe Far Sideが理解できる事かな。とは言え、↑この漫画はさらにプログラマーであるという素養が必要だが。
非同期で流したクエリをほげほげするPoCo
少しずつ条件が違うクエリを複数非同期で投げて、集約するモジュールを書いてみたんだけど、名前とかがイマイチ決まらない。なんかいいアイデアありますかねぇ。それともこれって使う条件が特殊すぎてモジュールにするにはアレかな。一応これをベースにして、PoCo::Server::TCPみたいなのとつなげて検索サーバーにしたてあげようと思ってるんだけど。
使い方はこんな感じ
# initialize...
POE::Component::MultiDB::DBIC->spawn(
Alias => $alias,
ConnectInfo => [ .... ],
SchemaClass => 'MyApp::Schema'
);
# some where else...
$_[KERNEL]->post( $alias, 'search_multi', {
args => [
{ where => $where1, attrs => $attrs1 },
{ where => $where1, attrs => $attrs1 },
{ where => $where1, attrs => $attrs1 },
],
aggregator => $_[SESSION]->postback('aggregate'),
finalizer => $_[SESSION]->postback('finalize'),
});
ソースコードはこんな感じ。
package POE::Component::MultiDB::DBIC;
use strict;
use warnings;
use POE qw(Component::Generic);
use Digest::MD5();
use Data::Dumper();
use constant DEBUG => 0;
sub spawn
{
my $class = shift;
my $args = { @_ };
my $alias = delete $args->{Alias};
Carp::croak "$class->spawn() requires an even number of arguments" if (@_ & 1);
my @db;
for my $id (1..10) {
push @db, POE::Component::Generic->spawn(
debug => DEBUG,
package => 'POE::Component::MultiDB::DBIC::db',
object_options => [ schema_class => $args->{SchemaClass}, connect_info => $args->{ConnectInfo} ],
packages => {
'POE::Component::MultiDB::DBIC::db' => {
postbacks => [
'search',
]
}
}
);
}
POE::Session->create(
heap => { db => \@db },
inline_states => {
_start => sub { $_[KERNEL]->alias_set($alias) },
_stop => \&_stop,
search => \&_search,
search_multi => \&_search_multi,
aggregate => \&_aggregate,
}
);
}
sub _stop
{
my ($kernel, $heap) = @_[KERNEL, HEAP];
my $dblist = delete $heap->{db};
foreach my $db (@$dblist) {
$kernel->post($db->session_id, 'shutdown');
}
$kernel->alias_remove( $kernel->alias_list );
}
sub _signature
{
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Sortkeys = 1;
Digest::MD5::md5_hex( Data::Dumper::Dumper(\@_) );
}
sub _search_multi
{
my($kernel, $session, $heap, $args) = @_[KERNEL, SESSION, HEAP, ARG0];
my $aggregator = $args->{aggregator};
my $finalizer = $args->{finalizer};
my $search_args = $args->{args};
my $query_id = _signature('search', $args, $$, {}, time());
my %meta = (
aggregator => $aggregator,
finalizer => $finalizer,
queries => {}
);
$heap->{active_queries} ||= {};
$heap->{active_queries}->{$query_id} = \%meta;
my $dblist = $heap->{db};
my $count = 0;
foreach my $sa (@$search_args) {
my $db_idx = $count % scalar(@$dblist);
my $db = $dblist->[$db_idx];
my $where = $sa->{where};
my $attrs = $sa->{attrs};
my $id = join('.', $query_id, ++$count);
$meta{queries}{ $id } = 1;
if (DEBUG) {
print STDERR " ---- Sending query $id ----\n";
}
$db->search(
{
session => $session->ID,
event => 'aggregate',
query_id => $query_id,
id => $id,
},
$where,
$attrs
);
}
}
sub _search
{
my($kernel, $session, $heap, $args) = @_[KERNEL, SESSION, HEAP, ARG0];
my $sa = { where => delete $args->{where}, attrs => delete $args->{attrs} };
$heap->{args} = [ ($sa) x scalar (@{$heap->{db}}) ];
_search_multi(@_);
}
sub _aggregate
{
my ($kernel, $ref, $result, $heap) = @_[KERNEL, ARG0, ARG1, HEAP];
my $meta = $heap->{active_queries}->{$ref->{query_id}};
my $map = $meta->{queries};
delete $map->{ $ref->{id} };
if (my $aggregator = $meta->{aggregator}) {
$aggregator->($result, $ref);
}
if (keys %$map == 0 && $meta->{finalizer}) {
$meta->{finalizer}->();
}
}
package POE::Component::MultiDB::DBIC::db;
use strict;
use warnings;
use UNIVERSAL::require;
sub new
{
my $class = shift;
my %args = @_;
my $schema_class = $args{schema_class};
$schema_class->require or die;
my $schema = $schema_class->connect(@{ $args{connect_info} });
bless { schema => $schema }, $class;
}
sub search
{
my ($self, $where, $attrs) = @_;
my $ret = [ $self->{schema}->resultset('Movie')->search(
ref $where eq 'HASH' ? $where : undef,
ref $attrs eq 'HASH' ? $attrs : { rows => 1 }
) ];
return $ret;
}
1;
自分のところにgunghoが来てびっくり。
Pathtraqを自分のブラウザにいれてる。そんな状態で開発版サーバーを色々動かしてみて、うまく動かないので色々やっていたらそのうち妙なアクセスが来る事に気づいた。あれ?
XXX.XXX.XXX.XXX - - [04/Sep/2007:05:16:19 +0000] "GET / HTTP/1.0" 200 669 "-" "Gungho/0.08004 (http://code.google.com/p/gungho-crawler/wiki/Index)" "-" ""
あれれ?俺自分のサイトクロールするようなもん作ったっけ・・・って、ああああああ、たしかめてないけど、これ絶対Pathtraqじゃん!
自分の書いたツールが自分のサイトにクロールに来るとは夢にも思わず。不思議な気分。