かなり頻繁にUPDATE/INSERT/DELETEがあるデータベースに対して1時間に一回VACUUMDBをかけるようにしてるのだが、これがうまくいかない。20分から30分くらいデータベースにロックがかかってしまう。いったいどれだけの頻度でvacuumかければいいんだ。というわけで今試行錯誤中。
# とりあえずvacuum20分に1回で、処理が5分止まる感じ。
かなり頻繁にUPDATE/INSERT/DELETEがあるデータベースに対して1時間に一回VACUUMDBをかけるようにしてるのだが、これがうまくいかない。20分から30分くらいデータベースにロックがかかってしまう。いったいどれだけの頻度でvacuumかければいいんだ。というわけで今試行錯誤中。
# とりあえずvacuum20分に1回で、処理が5分止まる感じ。
http://subtech.g.hatena.ne.jp/yappo/20060613/1150209686
実は某案件で色んなサイトから住所を抽出するスクリプトってのを書きました。80%強くらいの精度で日本の住所は抽出できるようにしてみたのだけれども、これって公開しちゃいけないのかもしれないのでコードだせません。(^^;
ただ、俺の取ったアプローチは存在する住所をを正規表現でRegexp::Assembleするのではなく、もっと包括的な正規表現で番地までを取ってくるもの。パターンをだいたい認識できればそれほど難しくないのだけれども、一部どーーーーーしても文字のエンコーディングのせいでうまく当たらない文字列があるので要注意。
http://qootas.org/blog/archives/2006/06/perl_regex_perf.html
をブクマしてるid:naoyaさんのコメント
[perl] あらま、意外。 o つけたら変わるかなとおもったけど同じでした。
/hoge/oは、正規表現に変数が入ってる場合のみに違いがでてくるはず。例えば
my $re = "hoge";
$str =~ /$re/ for (1..100)
よりかは
my $re = "hoge";
$str =~ /$re/o for (1..100)
のほうが早い。以下ベンチマーク:
use strict;
use Benchmark qw(cmpthese);
my $str = "foobarbaz" x 100;
my $re = "bar";
sub with_o
{
$str =~ /$re/og;
}
sub without_o
{
$str =~ /$re/g;
}
cmpthese(1_000_000, {
with_o => \&with_o,
without_o => \&without_o
});
daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate without_o with_o
without_o 1369863/s -- -15%
with_o 1612903/s 18% --
daisuke@beefcake daisuke$
ちなみに/$re/gを/bar/gにすると
daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate with_o without_o
with_o 1612903/s -- -16%
without_o 1923077/s 19% --
daisuke@beefcake daisuke$ vi benchmark/regexp_o.pl
あっさり逆転。ちなみにネタもとの|に関しては、|があるとバックトラックをしなくちゃいけないのでその分だけ処理が増えるので遅いのは当然。
朝11時のミーティングが入るも、バグ取りが間に合わず20分遅刻・・・と思ったら俺以外まだ誰も来てなかった。そのままミーティング。
知り合いから宇多田ヒカルの「ULTRA BLUE」を入手。シングルが半分以上入ってて、正直「これまだアルバムででてなかったの?」って感じ。でもやっぱり宇多田ヒカル好きだ。ミーハーで悪かったな。
なんか久しぶり事務所。もう4時過ぎに眠くて眠くて昼寝。20分くらいで起きたら汗だく。だらだらだらだら。つくづく子供体温。金の話とか、仕事の話とか。
Aと軽く飯食って帰宅。
今の時点で今日は色んなプロジェクトに対してコミット件数ゼロw。フォームとか作ったりしたくらい。いかんいかん。
今日はこれからワールドカップ三昧。ブラジル戦は見れるかどうか微妙だな。
いやー、おもしろかったけど、ブラジルは手抜き試合だったなぁ・・・。
そそのかされたので次どこに旅行に行きたいか決まった。ずばり、伊勢神宮。今度の旅行はお伊勢参りにするわ。また来月とかかなぁ。あとは宿が取れれば。
ドキュメントを読んでるとこういうのがでてくるわけだが
my $grtable = $c->model('UserData::Greetings');
my $record = $grtable->find_or_create(user => $c->user->id);
このfind_or_createをいくらsearchに置き換えてもうまくいきゃあしねぇ。よーーーくgrtableがなんのか見ると、これはSchemaオブジェクトっぽいから、多分resultset使うのか?と思ってやってみると
my $table = $c->mode('hoge');
$table->resultset('hoge')->search( .... );
これで動く。っていうか、本当にこれドキュメント最悪だよ。自分達が使いたいだけのおもちゃなら「これがデファクトスタンダードだ!」みたいな豪語をせんでいただきたい。そうじゃないならちゃんとサポートしやがれ、この野郎。DBIx::Classにしたってどのメソッドがどこに入ってるのか全然わかんねーしよおおおおおお。全くもってイライラする。
そういえばこれも買った。今更だけど、SQL勉強したことねぇや、俺、ってことで。
村上春樹はもらいもの。あとのはどどーんと買ってみた。町、食、酒。本に限らずだけど、この辺がどうも俺の好きなテーマなのかな。
どうも完成度がイマイチ(っていうか、まだどこまで使えるかわからん)なのでリリースするかどうか怪しいモジュール。この間読んだこれ、
http://blog.zuzara.com/2006/06/06/84/
もう少し親divとかにかぶらないようにできないかなぁ、と思ってちょっとほげほげしてみたのが以下のモジュール:
package HTML::ContentScraper;
use strict;
use HTML::TreeBuilder;
sub new
{
my $class = shift;
my $self = bless {
threshold_length => 200,
threshold_tag_rate => 0.05
}, $class;
return $self;
}
sub _elem
{
my $self = shift;
my $field = shift;
my $ret = $self->{$field};
if (@_) {
$self->{$field} = shift;
}
return $ret;
}
sub threshold_length { shift->_elem('threshold_length', @_) }
sub threshold_tag_rate { shift->_elem('threshold_tag_rate', @_) }
sub scrape_uri
{
my $self = shift;
my $uri = shift;
require LWP::Simple;
$self->scrape_content(LWP::Simple::get($uri));
}
sub scrape_content
{
my $self = shift;
my $html = HTML::TreeBuilder->new_from_content($_[0]);
my @elems;
# Look for sections that are either contained in a TD or DIV
foreach my $candidate ($html->look_down(_tag => qr{^(?:td|div)$})) {
# in each section, look for the number of tags
my @tags = $candidate->look_down(_tag => qr(.));
my $text = $candidate->as_text;
my $len = length($text);
if ($len >= $self->{threshold_length}) {
if (scalar(@tags) / $len < $self->{threshold_tag_rate}) {
# make sure that this new element is not inside a previous
# container. if this happens, then we should pick the
# new element and toss the old one
my @l = $candidate->lineage;
my $f = 0;
for (my $i = 0; $i < @elems; $i++) {
foreach my $l (@l) {
if ($l->idf eq $elems[$i]->idf) {
splice(@elems, $i, 1);
$f = 1;
last;
}
}
last if $f;
}
push @elems, $candidate;
}
}
}
my @ret;
foreach my $e (@elems) { push @ret, $e->clone }
$html->delete;
return wantarray ? @ret : \@ret;
}
1;
で、テストスクリプト
#!/usr/bin/perl
use strict;
use lib("lib");
use HTML::ContentScraper;
my $scraper = HTML::ContentScraper->new;
foreach my $uri (@ARGV) {
my @elems = $scraper->scrape_uri($uri);
print "HTML contents: ", scalar(@elems), "\n";
foreach my $e (@elems) {
print "=== START ===\n", $e->as_text, "=== END ===\n";
}
}
で、問題はこれをどう使うかだなぁ。いいアプリケーションあるかしらん。ちなみにMeCabをこれにかますのもどうかなぁ、とか思ってたり。
なんか最近また床にねとる。この間またベッドに戻れたと思ったのだが、まだ床に逆戻り。でも最近ちょっと背中が痛い。
一人酒は外だと大丈夫なのに、家だとやっぱり落ち込むなぁ。もう見るもの聞くもの全部あかん。
他人っていやだなぁ。
この日記、ほんと時々知り合いに読まれてるのが嫌だなぁ。昔はなんでも書けたのに。読んでる人が悪い訳でもなんでもないんだけど、時々そういう気持ちにかられる。
結果的には裏日記書くしかねーのかとも思う訳ですが。
そういえば今日ものすごく久しぶりに実家で親の作った飯を食った。多分半年ぶりくらい?ちょこちょこ実家には帰ってるのだが、どうもイマイチ親の飯って食った事がない。疲れてるとかあるんだろうが、まぁ・・・
まあ今日はオヤジも一時帰国で帰ってきてるので手を抜くわけにもいかなかったのだろうw。こうしてみるとオヤジが好きなのねー>母親。子供と自分だけの時って結構手抜きなのにw
ともあれ、久しぶりに親が作った唐揚げとか食べた。うま。
さて、ワールドカップが始まってしまいました。4年前もボスにはっきりと「今月は俺午前中に仕事できません」と言い放ってワールドカップ見てました(折角日本でやってるのにアメリカだったから昼夜逆転だったんだよ!だよ!だよ!)
とりあえずブラジルの試合だけは何があってもはずすわけにはいかない。午前4時だろーがなんだろうが、俺は見る!昨日はバーで午前2時くらいまで見てました。その前は麻雀しながら。
ってことで午前中は俺を探さないでください。あとウチで真夜中にサッカー観戦したい方、いるならそれはそれで歓迎w飯くらいつくりますw
うちで麻雀大会。もう男気あふれるプレイで俺が振込続けるもんだから9時間?の熱闘後に俺に残った物は -92ptとか。くくく・・・。勝負したい年頃なんだよ。
すげー楽しかったのでまたやりましょう。
月一のお楽しみ。今回はアードベッグとグレンモールの1978年もの。あとは飲み放題2000円。今回は本とか持っていって、ゆっくりぐびぐび。7時過ぎから2時くらいまでずっと居座ってた。サッカーの試合も観戦。一緒にいた人をタクシーで送って、帰宅。
麻雀やったその日にようやるわ、俺。
http://d.hatena.ne.jp/t-akihito/20060609/1149860878
use strict;
use Text::MeCab;
my $mecab = Text::MeCab->new();
for(my $node = $mecab->parse($text);
$node;
$node = $node->nexst
) {
my $yomi = (split(/,/, $node->feature))[7];
next if $yomi eq '*';
print $yomi;
}
これはFAQみたいなもん必要かなぁ。