D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2008年01月

Cache::Memcached::LibMemcached 0.00002をリリースしました。このリリースではget_multi(), decr(), incr(), delete()をサポートしてます。よりCache::Memcachedとの互換性が進んでおりますよ。

CPANにインデックスされたらこの辺りに出てきます。
    このエントリーをはてなブックマークに追加 mixiチェック

これを今朝読んだのでCache::Memcached::LibMemcachedを作ったよ!
なんか用途が広そうなのでcodereposに入れました。

使い方はSYNOPSISの通り。Cache::Memcachedとほぼ一緒。まだまだ足りないメソッドがあるのでその辺はコミットしちゃってくださいw

use Cache::Memcached::LibMemcached; my $memd = Cache::Memcached::LibMemcached->new({ serves => [ "10.0.0.15:11211", "10.0.0.15:11212", "/var/sock/memcached" ], compress_threshold => 10_000 }); $memd->set("my_key", "Some value"); $memd->set("object_key", { 'complex' => [ "object", 2, 4 ]}); $val = $memd->get("my_key"); $val = $memd->get("object_key"); if ($val) { print $val->{complex}->[2] }
    このエントリーをはてなブックマークに追加 mixiチェック

ちょっとリリースそのものでバタバタしてしまいましたが、Text::MeCabを使って、mecabのカスタム辞書に語句を比較的容易に追加できるようにしました。例はText::MeCab 0.20004に同梱されているeg/add_custom.plを参照してください。

自分の場合はちょっと人名をがばっと追加したかったのでAcme::Actor::JA(codereposのみ -- CPANにはアップしてません)とText::MeCab::Dictを使って3000人程の人名を追加してやりました。これをすると何がいいかというと、これまでだとものすごく有名な人の名前で検索する場合とかに「姓」「名」に名前が分けられてしまっていたところがその名前全体をひとつの語句として認識してくれるようになります。

# 追加前 shell > 堂本光一 堂本 名詞,固有名詞,人名,姓,*,*,堂本,ドウモト,ドーモト 光一 名詞,固有名詞,人名,名,*,*,光一,コウイチ,コーイチ # 追加後 shell > mecab 堂本光一 堂本光一 名詞,固有名詞,人名,*,*,*,堂本光一,どうもとこういち,*


ちなみに二つ目の読みがひらがななのはただ面倒くさかったからです。
ちゃんとやればカタカナに変換も容易でしょう。
    このエントリーをはてなブックマークに追加 mixiチェック

うちのHITACHI製NW-D8EX、昨日の夜ご臨終なされました。F3というエラーが出て、ぴーぴー鳴るだけでそれ以上動かない。ネットを見ると温度を感知する部品が云々書いてあったけど、そんなん言われてもそもそもその部品はどこやねん、って感じだったので今朝方HITACHIのカスタマーセンターに電話してみた。

電話対応してもらったお姉さんはもう一言目から謝りっぱなし。いや、壊したの俺だし・・・でも特になんの問題もなく修理に来てもらえるらしい。お金はもちろん取られるんだろうけどね。
    このエントリーをはてなブックマークに追加 mixiチェック

mecabで辞書に単語を追加するのを簡単にするためにText::MeCab::Dictを作って、codereposに入れました。・・・が!まだ一回も走らせてません(笑)人柱になっていただくか、もう少々お待ちくださいまし。
    このエントリーをはてなブックマークに追加 mixiチェック

Acme::Actors::JAというWikipediaから日本語で俳優/女優リストをスクレープするモジュール作った。codereposに入れておいたよ。
    このエントリーをはてなブックマークに追加 mixiチェック

最近ちょろちょろと動かしているQ4M、Perlラッパーを作っちゃいました。
使い方はこんな感じ(SYNOPSISそのまんまだけど)

use Queue::Q4M; my $q = Queue::Q4M->connect( connect_info => [ 'dbi:mysql:dbname=mydb', $username, $password ], table => 'q4m' ); for (1..10) { $q->insert(\%fieldvals); } while ($q->next) { my ($col1, $col2, $col3) = $q->fetch(\@fields); print "col1 = $col1, col2 = $col2, col3 = $col3\n"; } while ($q->next) { my $cols = $q->fetch_arrayref(\@fields); print "col1 = $cols->[0], col2 = $cols->[1], col3 = $cols->[2]\n"; } while ($q->next) { my $cols = $q->fetch_hashref(\@fields); print "col1 = $cols->{col1}, col2 = $cols->{col2}, col3 = $cols->{col3}\n"; } $q->disconnect;
よかったら使ってくださいまし!
    このエントリーをはてなブックマークに追加 mixiチェック

http://d.hatena.ne.jp/kazuhooku/20080108/1199756006

ちょっと反応が遅くなってしまいましたが、とりあえずお返事。

でも dmaki さんの速度はさすがに遅すぎな気もする (自分のとこだと倍くらい)
  • ディスクがいっぱいいっぱいなのかなw
60%満タン状態です。なんか自分の環境ではいくらやってもid:kazuhoさんのパフォーマンスがでないなぁ。なんでだろ。

もう一件のWHEREを使える云々はid:kazuhoさんの言った通り。具体的な条件はまたちょっと違うのですが、とにかく受け取り先のテーブルという以外の条件で次のアイテムを取り出したいのです。それができるとすごく嬉しい!
    このエントリーをはてなブックマークに追加 mixiチェック

rev40のq4mを使ってベンチマーク。といっても単純にSELECTとINSERTのベンチのみ。
use strict; use warnings; use DBI; use Time::HiRes qw(time); my $TEST_ROWS = $ENV{TEST_ROWS} || 1024; my $dbh = DBI->connect( $ENV{DBI} || 'dbi:mysql:database=test;host=localhost', $ENV{DBI_USER} || 'root', $ENV{DBI_PASSWORD} || '', ) or die 'connection failed:'; $dbh->do('drop table if exists q4m_t'); $dbh->do('create table q4m_t (v int not null) engine=queue'); my $insert_time = 0; my $select_time = 0; my $insert = $dbh->prepare("insert into q4m_t (v) values (?)"); for (my $i = 0; $i < $TEST_ROWS; $i++) { my $start = time(); $insert->execute($i); $insert_time += time() - $start; } my $sth = $dbh->prepare("select queue_wait('test.q4m_t')"); for(0..$TEST_ROWS - 1) { my $start = time(); if ($sth->execute()) { my $h = $sth->fetchrow_hashref(); } else { last; } $select_time += time() - $start; } $dbh->do('select queue_end()'); print STDERR "$TEST_ROWS items used\n"; print STDERR " avg insert time: ", $insert_time / $TEST_ROWS, "\n"; print STDERR " avg select time: ", $select_time / $TEST_ROWS, "\n";


このスクリプトに対して、128、256、512アイテムでテスト
daisuke@beefcake q4m$ env TEST_ROWS=128 perl queue.pl 128 items used avg insert time: 0.0969786122441292 avg select time: 0.0974297747015953 daisuke@beefcake q4m$ env TEST_ROWS=256 perl queue.pl 256 items used avg insert time: 0.107754170894623 avg select time: 0.115405934862792 daisuke@beefcake q4m$ env TEST_ROWS=512 perl queue.pl 512 items used avg insert time: 0.0976005531847477 avg select time: 0.0964000821113586

俺のMac 10.5で他のブラウザとか動かしながらでこんな感じ。

うーん、queue_wait()にWHERE使えると嬉しいなぁ・・・
    このエントリーをはてなブックマークに追加 mixiチェック

Gunghoで今度行うプロジェクトはDBから次に取得するURLをガンガン引っ張ってくるというよりは、スクレイパー的な用途として使う事が多いようだ。そういうわけで、今度はリクエスト→レスポンスのサイクルを定義するほうが重要になってきそうだ。

なので今考えているのはGSL (Gungho-DSL)。ウマく作ればWeb::Scraperと融合もできそうな気がする。さて、以下に今考えている案を書いてみる。興味ある人いるかな?
use GunghoX::GSL; config( engine => { module => 'POE' } ); process { # Simple request. This is equivalent of saying # request { # url => 'http://search.cpan.org' # } # or # request_build { # my $req = Gungho::Request->new(GET => 'http://search.cpan.org'); # return $req; # }; request 'http://search.cpan.org'; # Handle the previous response response { my $response = shift; # do something with $response } }; process { request { name => 'BEGIN', url => 'http://search.cpan.org', }; response_for 'BEGIN', { my $response = shift; my @links = ...; # follow links foreach my $link (@links) { request { name => 'follow', url => $link } } }; response_for 'follow' { my $response = shift; # do something with $response } };

取り急ぎ"process"に代わる名前が欲しいところだな。
    このエントリーをはてなブックマークに追加 mixiチェック

前もって告知した通り、Text::MeCabをcodereposに移動した。基本書き直しなんでまだちょっとAPI的に足りてない感じなので、コミットしてくださる方がいたら幸い。
    このエントリーをはてなブックマークに追加 mixiチェック

1/8 追記:id:miyagawaによると同梱はされてないらしい。でもどちらにしろ・・・なぁ。



ちょっ。馬鹿じゃねーの。

twitterとか見てるとtokuhirmとかとなんかあったらしいから、別にpluginとか好きに出せばいいんだけどさ、問題はなんでこれらのディストリビューションにHTTP::MobileAgentが同梱されてんのじゃ!cpan シェルからinstall HTTP::MobileAgentした時にめんどうくせえじゃんか。

仲違いは勝手にしてくれ。CPANは汚染すな。
    このエントリーをはてなブックマークに追加 mixiチェック

ながらくアップデートのなかったSennaのPerlバインディングですが、今codereposで作業中。ただやっぱり時間切れになりそうな予感なので、もし今回の休みの間に終わらなかったらdev リリースとして出そうと思います。後はcodereposにあるので他の人もハックしてくれるとありがたかったり。Senna-Storageはてがつけられん!

あとはText-MeCabもcodereposに移そうかと思ってたり。
    このエントリーをはてなブックマークに追加 mixiチェック

あけましておめでとうございます。

さて、2008年は風邪で・・・はじまりませんでした。初期状態のだった30日、31日とほぼ寝倒したので多分完治。さすがにちょっと酒は控えよう。と、思ったが、昼頃に実家に帰って飯食ってたらスパークリングワインがあるっていうんで俺と妹は酒をちびちびやりながら飯。

夜はなぜかカレー。なんも正月らしくねぇなw

妹に「勇者のくせになまいきだ」を取られたのでテレビを見ようと思ったらこの家ではチャンネル権は俺になかったので、プログラムを書いて夜が更けて行ったのだった。
    このエントリーをはてなブックマークに追加 mixiチェック

このページのトップヘ