Class-DBI-Loader 0.29アップロード。おもにClass::DBI::Pgの正しいバージョンを使わせるため。
2006年01月
起き抜けサムライ
昨日はまた遅くまで起きてて(といっても3時くらい)、今朝朝起きてメールを見たらテレカンの招集メールが来ていて時間をみたらちょうどそのテレカンが始まる時間でやんの。っていうか、招集かけるの遅いよ・・・その後ちょこっと話してからデータファイルをちょこちょこっと作成。
ふっと一息ついた所で何故かサムライソウルの耳コピを始めたり。基本はD/A/G。ちょっとおもしろい音が時たま入ってる感じ。さて、お遊びはおしまいで仕事しますよー。
東横インの謝罪
東横インの反省が深すぎて、謝罪アプレット登場。
http://www.toyoko-inn.com/index2.html
実は東横インは大好きでよく使っていたのだけど・・・もう少しやりかたを考えろよ>Web担当。だいたいJavaアプレットなんかおくなっつーのw
Senna-0.11
Senna.pmの0.11書いた。rev73以降のlibsennaを使う場合、こっちを使わないと
my $cursor = $index->search(...);
while (my $r = $cursor->next) {
....
}
が無限ループになっちゃうから気をつけようぜ。
ペストリー@イエンセン
一昨日は同窓会の後、Oの家に泊まり、昨日はそのままGのうちにお泊まりしてしまって今朝(わりと)早く徒歩で家路についたら、普段通る事のない道を通っているうちにデニッシュで有名なJENSEN(イエンセン)発見!デンマーク大使館御用達との噂には聞いていたが、店が開いている時間にここを通るのは初めて。
事務所で腹をすかせてぴーぴーいってるであろう相棒君のために多めに買って来たのだが、でてきてみたら風邪でお休みのため、とりあえずひとつはおいらがぱくぱく。
う、うめ~~~~~!うめええよう。この生地はうまい・・・!あーあ、これを食べれないなんてもったいない。
Clas::DBIをプロファイリング
http://d.hatena.ne.jp/nekokak/20060127/1138335790
Class::DBI v3.0.14で上記URLにあったシンプルなRetrieveをDevel::DProfでプロファイリングしてみた。
/usr/local/bin/perl
-MNikkiSite::Data::Loader -d:DProf -e '
for(1..10000) {
my $it = NikkiSite::Data::Users->search({ uid => "daisuke" });
while (my $rec = $it->next) { print $rec->uid, "\n"}
}'
最初、1..100くらいでやってみたのだけど、これがロードタイムのほうが遥かに大きくて、base::importとかBEGINブロックとか、そういうのばっかりがカウントされるので、10000回まで大きくしてみた。
で、これをdprofppでみてみる:
daisuke$ dprofpp -f 'YAML|Params::Validate|DateTime|NikkiSite' -O 20
<snip>
Total Elapsed Time = 18.86988 Seconds
User+System Time = 7.494887 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
8.47 0.635 0.635 162584 0.0000 0.0000 Class::Accessor::Fast::__ANON__
5.42 0.406 0.996 10000 0.0000 0.0001 Class::DBI::SQL::Transformer::_do_
transformation
4.95 0.371 2.363 10000 0.0000 0.0002 Class::DBI::sth_to_objects
4.92 0.369 0.376 100802 0.0000 0.0000 Class::Data::Inheritable::__ANON__
4.58 0.343 0.839 10185 0.0000 0.0001 DBIx::ContextualFetch::st::_untain
t_execute
4.54 0.340 1.699 10000 0.0000 0.0002 Class::DBI::transform_sql
4.31 0.323 0.323 10186 0.0000 0.0000 DBI::st::execute
4.06 0.304 0.789 130776 0.0000 0.0000 Class::DBI::Column::name_lc
4.00 0.300 0.300 10106 0.0000 0.0000 DBD::Pg::db::_ping
3.63 0.272 1.064 130096 0.0000 0.0000 Class::DBI::Column::__ANON__
3.31 0.248 0.248 71077 0.0000 0.0000 DBI::common::FETCH
3.23 0.242 0.241 20010 0.0000 0.0000 Class::DBI::_require_class
3.03 0.227 0.328 20000 0.0000 0.0000 DBIx::ContextualFetch::st::fetch
2.98 0.223 1.382 20000 0.0000 0.0001 Class::DBI::Iterator::next
2.92 0.219 0.785 10000 0.0000 0.0001 Class::DBI::Search::Basic::_search
_for
2.82 0.211 1.039 20000 0.0000 0.0001 Class::DBI::Search::Basic::_qual_b
ind
2.39 0.179 0.179 40142 0.0000 0.0000 Class::DBI::ColumnGrouper::group_c
ols
2.19 0.164 0.277 10000 0.0000 0.0000 Class::DBI::_fresh_init
2.13 0.160 0.254 10000 0.0000 0.0000 DBD::_::db::prepare_cached
2.13 0.160 0.340 10000 0.0000 0.0000 Class::DBI::_my_iterator
ふーん、結構色々やってるなぁ。name_lc()とかはキャッシュするだけでカットできる(Class::DBI::Column::__ANON__も同じname_lcを使ってるからその分だけはやくできる)。あとのはもう、コールスタックを減らすくらいしか最適化の場所がないような・・・
というわけで、時間もないので一番簡単にわかるところで2行ハックして再度プロファイリング。
# Class/DBI/Column.pm
use strict;
use base 'Class::Accessor::Fast';
use Carp;
__PACKAGE__->mk_accessors(
qw/name name_lc accessor mutator placeholder is_constrained/
);
<snip>
sub new {
my $class = shift;
my $name = shift or croak "Column needs a name";
my $opt = shift || {};
return $class->SUPER::new(
{
name => $name
name_lc => lc $name,
accessor => $name,
mutator => $name,
_groups => {},
placeholder => '?',
%$opt,
}
);
}
さー、これで10000回走らせてプロファイリング
daisuke$ dprofpp -f 'YAML|Params::Validate|DateTime|NikkiSite' -O 20
Total Elapsed Time = 16.16692 Seconds
User+System Time = 7.034115 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
8.15 0.573 0.573 162584 0.0000 0.0000 Class::Accessor::Fast::__ANON__
6.38 0.449 2.011 10000 0.0000 0.0002 Class::DBI::sth_to_objects
5.60 0.394 0.394 10186 0.0000 0.0000 DBI::st::execute
5.13 0.361 0.368 100802 0.0000 0.0000 Class::Data::Inheritable::__ANON__
4.49 0.316 0.316 10106 0.0000 0.0000 DBD::Pg::db::_ping
3.67 0.258 0.887 10000 0.0000 0.0001 Class::DBI::SQL::Transformer::_do_
transformation
3.67 0.258 0.383 20006 0.0000 0.0000 Class::DBI::ColumnGrouper::find_co
lumn
3.54 0.249 0.777 10185 0.0000 0.0001 DBIx::ContextualFetch::st::_untain
t_execute
3.43 0.241 0.651 130096 0.0000 0.0000 Class::DBI::Column::__ANON__
3.11 0.219 0.226 20010 0.0000 0.0000 Class::DBI::_require_class
3.06 0.215 1.535 10000 0.0000 0.0002 Class::DBI::transform_sql
2.94 0.207 0.566 10000 0.0000 0.0001 Class::DBI::_live_object_key
2.83 0.199 1.421 20000 0.0000 0.0001 Class::DBI::Iterator::next
2.66 0.187 0.953 20000 0.0000 0.0000 Class::DBI::Search::Basic::_qual_b
ind
2.66 0.187 0.316 10000 0.0000 0.0000 Class::DBI::_fresh_init
2.66 0.187 0.308 30064 0.0000 0.0000 Class::DBI::ColumnGrouper::primary
2.45 0.172 0.738 10000 0.0000 0.0001 Class::DBI::Search::Basic::_search
_for
2.32 0.163 0.163 40142 0.0000 0.0000 Class::DBI::ColumnGrouper::group_c
ols
2.00 0.141 0.230 10000 0.0000 0.0000 Class::DBI::Search::Basic::new
2.00 0.141 0.285 30000 0.0000 0.0000 Class::DBI::_attrs
ほい、name_lcは消えた。2行で10%違ったらたいしたもんだと思います。ふーん、なんかまだ色々できそうな予感。怪しいものとしてはColumnGrouperかな。
ばたばた
週末はバタバタしてて、あんまり返事とかちゃんとできなかったなぁ。みなさんごめんね。
prototype.js → Template
http://d.hatena.ne.jp/amachang/20060128/1138479278
ヤバす。これって、JSONと組み合わせると最強かも。イメージだけど、こんな感じ。
function handleAjaxResponse(request) {
var data = eval(request.responseText);
var template = new Template("...");
$(target).innerHTML = template.evaluate(data);
}
あ、というかテンプレートそのものをJSONに埋め込む事もできるじゃん。
function handleAjaxResponse(request) {
var data = eval(request.responseText);
var template = new Template(data['template']);
$(target).innerHTML = template.evaluate(data);
}
ヤバす。←しつこい
ぷち同窓会雑感
- 16年ぶりくらいなのに皆顔かわらねぇ。
- 意外とお互いよく覚えてる。
- 知られたくなかった事ほど知られてる。
- 意外なほど変な接点がある。
- 今回会った人達が「一般」だとすると、俺の知り合いはやっぱり濃い。つーか、本当に。
結構片付いた。
足の踏み場は完全にできたぞー。トイレも掃除したし、風呂も掃除したし、洗濯もガンガン。なんていうか、今までは人間の住む所じゃなかったのが今はただかなり汚いだけの部屋になったぞ!(笑)
今日はこれから最後のゴミ出しに行ってからぷち同窓会。
カンカチート
羊の蒸し焼き?みたいなもんらしい。ググってもでてこなかった。塩胡椒、香辛料、唐辛子を塗り込んで蒸し焼き。
んー、んー。今日片付いたら、来週あたりなんかがーんと作るか!でも、片付かないに30000ギル。
ゴミを半分くらい出して、色々とお掃除用品買ってきた。
Class::DBI::Loader 0.28 / Class::DBI::Plugin::DateTime
MANIFESTがアップデートされてなかったアルよ。もう一回アップロード。
Class::DBI::Plugin::DateTimeはただいま修正中。has_interval()が全然動いてなかったよ。
なんでこんなに散らかっているんだ。
片付け中。すげぇ。なんでこんなに散らかっているんだ?ありえん。洗濯機回して、クリーニングに出して、本は本棚へ。大量にあるペットボトルを処理して、すでにゴミ袋5杯満杯。で、ただいま掃除から逃避中。うわー、クイックルワイパーとゴミ袋がない。買ってこなきゃ。
王様のブランチの部屋探しで六本木の物件やってる。あそこ知ってるー。知り合いが住んでたですよ。
おめでとう。
誕生日おめでとう
Class::DBI::Loader
昨日の0.26 に続いて0.27 を先ほどアップロードしますた。
焼き鳥@中目黒
中目黒で駅にもほどちかくていい感じの焼き鳥屋を教えてもらった。焼き鳥屋に入るのに並ぶくらい混んでるってのがネックだが、味とかはいい感じ。でっかいネタとわかりやすい味。別にどうってことはないといえばないのだが、気持ちは落ち着く。
その後向かいの通りのバーでスコッチをすこっち飲んだ。
さびしー。
ベトナム料理を食べに行ってきた。本当、あいかわらずうまい。この店はたまらんなー。かえり、もう一件寄りたかったのだけど行ってみたら満席。しょうがないので帰宅。でも飲み足りなくて飲み足りなくて、寂しくて寂しくて、メールしまくり。
誰も捕まらないのでしょうがなく駅でラーメン食って、帰ろうかなと思ったらタクシーおらん。終電直後だからか。しょうがないので歩く。てくてく。30分くらいかな。ひさしぶりに駅からバスとかではなく歩いたわ。
飲み足りないけどラーメンくっちゃったしなぁ。
Class::DBI::Loader + Class::DBI::Pg
Sebastianからメール来た!メンテナーになりました。パチパチパチパチ。とりあえず予定パッチは全部Pg系統:
- Class::DBI::PgのPostgreSQL8.x系統への対応
- Loaderでテーブル定義したあとのdisconnect
でもまだどこにレポジトリがあるか教えてもらってないや・・・orz
サムライソウル
最近こんな時間に起きてる事が多くて、フジテレビで時間稼ぎにやってる歌番組?でウルフルズの「サムライソウル」が毎晩かかっているのを見ているわけだが。なんかいい感じに聞こえてきた。これはちと歌いたい。っていうか、そのうち購入決定ですね。歌いたいですし。
あ、「めざにゅ~」始まった。
Xango, Class::DBI::Loader, Class::DBI::Pg
新バージョン、全部出した。Xangoのバグが一番馬鹿だった。