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.

2007年12月

風邪引いてます。今日は馴染みのバーとかの最後の挨拶に行こうと思ってたのに・・・しくしく。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

rev 7をテストしてみた。・・・っていうほどの事はしてないんだけど、とりあえずsvn update、make、make installして、昨日のテストを走らせてみた。結果、問題なし!DELETEもちゃんとうごいたよ!これをどう使うかはこれからの研究課題
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

ほえ?なんで?

http://blog.hide-k.net/archives/2007/12/catalystnext.php
使う側としては継承順に呼ばれることを期待しているのに、思ったとおりに動かない。
つまり、使う側がプラグインの中身の挙動まで気を使わなければいけない。
これはClass::C3になっても同じ。

「正しい」継承順にメソッド呼ぶのはClass::C3の特徴だからメソッドの呼び出し順に変化はないでしょう。NEXTの場合は親クラスが小クラスより先に呼ばれる事もあるから気持ち悪いけど。

そもそもメソッドの中で親クラスのメソッドを呼ぶタイミングがその他のロジックの前か後かはこのエントリに書いてある継承順云々とはまた違う気がする。書いてあるコードを見ても、それは普通のOOってそういうもんなんじゃないの、としか言いようがないんだが。

なんか気持ち悪いというからには他の理由があるんじゃないだろうか。


追記

http://b.hatena.ne.jp/miyagawa/#bookmark-6914324
継承とは関係なくて、フックポイントの順序をプラグイン側できめるというCatalystの仕様に問題があるとおもう
ああ、つまり$c->NEXT::execute()とかが走るタイミングほげほげという事かな。それなら分かるかも。本来ならメソッドディスパッチ内で行う事は普通の継承範囲内で行って、Pluginは$c->run_hookみたいな形で一気に動かせばええんだろうな。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

id:kazuhoさんが作っているQ4M を早速試してみました。入手はsvnから。結論から言うとちょっと動かなかったのだけれども、もうすでにコミットされてない部分もありそうだし、とりあえず報告とかもかねて。

まずmysql-5.1.xサポートなので、mysql-5.1.22-rcをDL、./configure --prefix=/usr/local/mysql-5.1という設定だけでインストール。

次にq4mディレクトリで
glibtoolize --copy (glibtoolizeなのはとりあえずmacだから) aclocal -I . autoheader automake --add-missing -coy autoconf
してから、configure。
configure --with-mysql=/path/to/mysql-5.1.22-rc --lib-dir=/usr/local/mysql-5.1/lib make make install
mysqlはmysqld_safeで立ち上げて、横で
mysqladmin -u root create mq mysql -u root mq
テーブルスキーマはとりあえずなんでもよさそうだったのでこんな感じで
CREATE TABLE mq ( id TEXT NOT NULL, data BLOB, inserted_on TIMESTAMP NOT NULL ) ENGINE=queue;
この状態で以下のようなperlスクリプトを実行:
use strict; use Time::HiRes qw(time); use Digest::MD5 qw(md5_hex); use DBI; my $dbh = DBI->connect('dbi:mysql:dbname=mq', 'root', undef, {AutoCommit => 1, RaiseError => 1}); my $sth = $dbh->prepare("INSERT INTO mq (id, data) VALUES (?, ?)"); foreach my $i (1..20) { $sth->execute(md5_hex(time(), {}, $$, rand()), $i); } $dbh->disconnect;
まず一発目。perl insert.plをすると"ERROR 2013 (HY000): Lost connection to MySQL server during query"。おっと、裏のプロセスが落ちた・・・データを見ると一応インサートそれてるっぽいので、取り急ぎ削除してやりなおそうと思うと
mysql> delete from mq;ERROR 2013 (HY000): Lost connection to MySQL server during query mysql> delete from mq; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 2 Current database: mq ERROR 2013 (HY000): Lost connection to MySQL server during query mysql>
ぐへ。削除できない・・・。

ここが今の状態。結構良い時間になったので今日はここまでかな。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

Swarmage 0.01000_02 うpした!。BerkeleyDBもちゃんと動いた(けど、なんかまだロックとかを何もしてないからヤバい気もする)

結局BerkeleyDBの詳細な機能を使うにはデータベース毎に別のディレクトリが必要なんだな。前回の問題はそういう事でした。あとCDBは今は使わない事にした。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

BerkeleyDB::Env のコンストラクタに DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOLってやるとInvalid argmentってでてくる・・・orz どうやったらCDBを初期化できるんですかあ!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

SQLiteがdatabase is lockedで落ちてしまう問題でswarmageが停止。よく読んだら、sqliteそのものには問題がないものの、DBD::SQLiteには並列処理に関して少々問題があるようだ。うう〜む。大分悩んで、BDBとかも見たんだけど、とりあえずBerkeleyDBで書いてみた。もうちょい頭よくできそうな気もするな。

色々コミットしたけど、とりあえずまだ悩む予定。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

071222_1931~02_Ed.JPGここ数年、毎年クリスマス時期にはローストチキンを作ってる。今年も作りましたよ。日程の都合でクリスマス当日とかではなく、22日に作った。

日本で作り始めて3年目、ようやく日本のオーブンの規格が分かってきたので今年は大分うまくできた予感。低温度で2時間ちょい焼きつつ、オリーブオイル、ワイン、塩、胡椒等のソースを15分おきくらいに鶏肉の上にかけつづけて作った。鶏肉の下にはジャガイモ、タマネギ、エリンギ。肉汁を吸ってうまい!ちなみに中身にはピラフのような感じで鶏のモツ類と一緒に炒め/炊いたご飯。これも肉汁を吸ってうまいっ。

やっぱり肉類は大きめの塊で調理したほうがうまいなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

Perl 5.10がPerl 20歳の誕生日にリリース。さっそくDL+インストール。
./Configure -d make make test sudo make install

コンパイルは速かったが、テストは意外とまだ時間かかるな。Test::Harnessで並列テストできるんじゃなかったのか。
daisuke@beefcake ~$ sudo perl -eshell -MCPAN CPAN: File::HomeDir loaded ok (v0.67) Can't locate Mac/Files.pm in @INC (@INC contains: /usr/local/lib/perl5/5.10.0/darwin-2level /usr/local/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/darwin-2level /usr/local/lib/perl5/site_perl/5.10.0 /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /Users/daisuke) at /usr/local/lib/perl5/site_perl/5.8.8/File/HomeDir/Darwin.pm line 54.
daisuke@beefcake ~$

いきなりエラー!げぇ。

よく見るとエラー起こしてるのは5.8.8のFile::HomeDirだ。ということは5.8.8系のモジュールを読み込んでこけている可能性が高い。./Configureのこの部分をやりなおし
In order to ease the process of upgrading, this version of perl can be configured to use modules built and installed with earlier versions of perl that were installed under /usr/local. Specify here the list of earlier versions that this version of perl should check. If Configure detected no earlier versions of perl installed under /usr/local, then the list will be empty. Answer 'none' to tell perl to not search earlier versions. The default should almost always be sensible, so if you're not sure, just accept the default. List of earlier versions to include in @INC? [5.8.8] none


これでさっきのCPANも動いた。よっしゃ。Bundle::CPANをインストール。CPAN.pmのインストール時に聞かれてた質問がデフォルトで設定できるように。お、これは速いかも。Mac::Carbonをインストールしようとするものの、AppleEventでエラー。でもどうせほとんど使わないし、force install。

その後Cache::MemcachedとかCatalystとかインストール。おお、なんか速いぞ!

前のバージョンのPerlが見えなくなってしまったのでSVN::Coreも見えなくなってしまい、まぁちょうどいいからSVKも再インストール。SVN::Coreをインストール後、SVKを再インストールしようと試みたが、エラー。

SVKは最初SVN::Coreが無い状態でCPANインストールしようとしたので、.cpan/buildディレクトリ以下にすでに展開されていた。この状態ではCPANだかCPANPLUSがうまく認識してくれない。しょうがないのでこちらは手で。と思ったらModule::InstallがCPANPLUSとうまくうごいていないのか、依存関係をインストールしてくれない。あれぇ。しょうがない、片方でperl -eshell -MCPANで依存関係をインストールしつつ、片方でSVKのperl Makefile.PLを動かして依存関係を確認。やっとmakeまで通った。

あああっと。SVN::Coreがperl 5.10.0にどうも対応していない・・・
t/07smerge-anchor..................Name "swig_runtime_data::type_pointer2" used only once: possible typo at /usr/local/lib/perl5/5.10.0/darwin-2level/DynaLoader.pm line 230. Attempt to free unreferenced scalar: SV 0xc7bfc0 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/XD.pm line 856. Attempt to free unreferenced scalar: SV 0xc7bd70 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/XD.pm line 856. Attempt to free unreferenced scalar: SV 0xc96b30 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/XD.pm line 1371. Attempt to free unreferenced scalar: SV 0xc9c8f0 at /usr/local/lib/perl5/site_perl/5.10.0/darwin-2level/SVN/Core.pm line 417. Attempt to free unreferenced scalar: SV 0xc96d30 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/Command/Commit.pm line 555. Attempt to free unreferenced scalar: SV 0xc96ae0 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/XD.pm line 856. Attempt to free unreferenced scalar: SV 0xcbce90 at /Users/daisuke/.cpan/build/SVK-v2.0.2-KO48hW/blib/lib/SVK/Inspector/Root.pm line 82.

これはひどい。しょうがない。5.10.0は使いたいしなぁ、ってことで、5.8.8にこっそりもどした。今は/usr/local/bin/perl5.8.8、/usr/local/bin/perl5.10.0がインストールしてあって、/usr/local/bin/perlはperl5.8.8へのsymlinkになっている。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

Swarmage 2.0を作り始めて、取り急ぎタスクが走り出すところまでかけた。今度の形はもっとタイトに、完全にPOEで作った。最初にMQで作った時はPOEでやるかどうかとか、そういうことをあまり考えずに作ってしまったのでビジーウェイトがあったけど、今度は全て非同期。Workerも非同期。一応これを使う予定のプロジェクトはデータの保全がまず大切なので、今回はまずDBIベースで作ったぞい。でもDBIベースで非同期にしようとするとデータベースへの接続数分だけフォークしないといけないから面倒よなぁ。できればここはもっと簡単なプロトコールで間に合わせたいところだ。

っていうわけでTracはこのへん:http://trac.endeworks.jp/trac/perl/browser/Swarmage/branches/2.0-redo
SVNはこのへん:http://svn.endeworks.jp/svn/Swarmage/branches/2.0-redo
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

Job Queueはプロセスを別につくりゃーシンプルでいいじゃん、と思ってSwarmageを作ったんだけれども、ちゃんとしたシステムじゃないとパフォーマンスがでないな、と思ってきたので、POEベースでまた全部書き直しはじめた。

もう本当に全て変わる予定です。もうちょい動くようになったらコミットする。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

ここ2年くらいまで意識したことがなかったんだが、俺はどうやらそうとう寒がりらしい。朝、目は覚めているのに全く布団から出られない。寒い。抜け出たところで手がかじかんで何も出来ない。それこそガクガク震えるくらいだ。でも同じ日に他の人にそういう話をしても全然寒くないって言うんだよな。おかしい・・・

夏生まれだし南国育ちだし、やっぱり寒いのは駄目なのか。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

今日はひさしぶりにあんこを作成。小豆をたっぷり買ってきて、調理開始。というか、小豆って一晩水につけるんじゃなかったっけ。袋にはいきなり沸騰したお湯で初めていいって書いてあるから、そのままやったんだけど。最終的には問題なかったからいいんだけどね。

味付けは普通の砂糖の他に黒糖とハチミツ。うまくできました。ほとんど全て冷凍して、年末年始できっと買うであろう餅があまった時に使う予定。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

071215_1050~01.JPG世田谷ぼろ市に初めて行ってみた。ひとことで言うと混雑しすぎ。ほとんど見てる余裕がなかったよ。皆思いっきり体当たりしてくるしさぁ。でも開催場所の上町あたりはなかなか楽しそうなのでまた行ってこようかな、と。

あと途中で豪徳寺にも寄って、有名な大量の招き猫をチェック。なかなか不気味だ。ちなみに絵馬があったのでなんの気無しに見てたらすごいおもしろいのを発見してしまった。すごい晒したかったのだが、さすがにかわいそうな気がしたのでメモってこなかった。しかし皆絵馬に具体的な願い事書くんだなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

最新tritonnで

SELECT MATCH(col1, col2, col3) AGAINST('W.... query' IN BOOLEAN MODE) AS score Where MATCH(col1, col2, col3) AGAINST('W.... query' IN BOOLEAN MODE) ORDER BY score DESC;

が異常に遅いのはなんでなんでしょう。vmstatみてるとこのクエリが発生すると、10回に1回くらいすげぇ量のI/O (特にINのほう)が発生してるんですが・・・

一回このクエリが実行し終わって、再度同じクエリを投げるとそうとう速くなるのだけど、これはクエリキャッシュっぽい。SQL_NO_CACHEすると同じ事が起きる。いったいどこの何をつかってソートしてるんだ??

追記:間違い。SQL_NO_CACHEしてても、2回目はそれなりに速い。
追記2: ちゃんとLIMIT も使ってる。



追記。結局何を直しても最終的にFilesortになってしまうのが問題だと結論にいたったので、それならORDER BYをやめることにした。Tritonnはどんな理由か知らんがデフォルトでスコア順にソートしてくれないので、442行目あたりに勘だけをたよりに  sen_records_sort()を突っ込んでsennaレベルで先にソートすることに。んで、後はソート無し。グッド。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

クリアして、138問全て解いた。一個だけズルした。おもしろかった!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

前のエントリの続き。

普通の文字列''と、s/foo/bar/、もしくは1 != 0の結果のようなbooleanを返した結果の違いを見る、ってことだが

use B; sub SV_isPV { my $x = shift; my $flags = B::svref_2object(\$x)->FLAGS;; return (! ( $flags & 0x00010000 ) ) && ( $flags & 0x00040000 ); }
これを通すと、区別が付く。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

うん知ってるけど、でも別にそういうことしたかったわけじゃないんだ・・・orz。ただSvTRUEの仕様通りにPerlで書きたかっただけなんだ・・・。どうせならこっちをどううまく書くのか教えてください!


#codereposでPerlキチンと正と負を切り分ける、って話が気になった。SvTRUEってマクロあるのは知ってる訳だが、具体的にどういう実装なのかわからん。というか、SvTRUEをPurePerlでかけばいいんじゃね?ってことでsv.hの中のマクロ、SvTRUEをPurePerlにしてみた

sub SvTRUE { my $x = shift; if (! defined $x) { return (); } if (!ref $x && $x =~ /\D/) { return length($x) > 1 || substr($x, 0, 1) ne '0'; } else { return $x; } }
CのソースコードからぱくってきたからPerl的でないかもしれんけどね。簡単なテストしかしてませんが。

テストしたのは以下の値:

0 1 "0E0" "0" '' {} undef Hoge->new(0) Hoge->new(1)

最後のHogeは、与えられた値が正だったら負、負だったら正を返す適当なオブジェクト

package Hoge; use overload bool => \&hoge_bool, '""' => \&hoge_string, fallback => 1 ; sub new { bless { val => $_[1] }, $_[0] } sub hoge_bool { ! shift->{val} } # opposite sub hoge_string { "Hoge(val=$_[0]->{val})" }

で、実行結果

my @list = ( 0, 1, "0E0", "0", '', {}, undef, Hoge->new(0), Hoge->new(1) ); foreach my $v (@list) { print defined $v ? $v : 'undef', " is ", SvTRUE($v) ? "true" : "false", "\n"; } 0 is false 1 is true 0E0 is true 0 is false is false HASH(0x800168) is true undef is false Hoge(val=0) is true Hoge(val=1) is false
わかってると思うけど、これ圧倒的に遅いっすよ。proof of concept。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

会社でサーバーを買ったので、設定しまくっている。ハードはDELLの1Uラック型のヤツ。OSは冒険野郎なFreeBSD 7 BETA3。

で、ローカルドメインとかも作って、社内のDNS環境をバリバリ設定しよー!と思って設定してました。で、毎回DNSの設定でつまづくので今回はDJB先生のdjbdnsで設定を試みてみましたよ。案の定またはまりました。

インストールは概ね簡単。普通にDJBスタイルのコンパイルして、tinydns-confとdnscache-confで適当なディレクトリ(/var/dnscacheとか/var/tinydnsとか)にいれて、最終的にはdaemontoolsから見れるように/serviceにのっけるだけ。後の細かい設定は割とストレート

一番重要な事は、1台のマシンで内部IPと外部IPの解決を済ます予定ならば、IPアドレスを二つつける事。これをわからなかったばっかりになんでdnscacheがまったく反応しないのか全くわからず。悶々としていた。しかもその間DNSが解決できないわけじゃなくて、PPPoEルーター経由でSERVFAilの後なんとか解決自体はできてしまうので余計わけがわからなくなってしまってた。

最終的にはifconfig bge0 192.168.0.X netmask 255.255.255.255 aliasってして同じNICにエイリアスつけて、dnscacheのenv/IPの内容をそっちに変えただけ。これで全部が動きだした。

いやぁ、毎回思うが普段何気なく使っているDNSって偉大だよなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

中世以前まで遡って月の緯度や太陽の緯度を計算していた皆さん(誰だよ、と是非突っ込んでいただきたい)、DateTime::Util::Astro::Commonのephemeris_correction()という計算が間違っていました。なおして、なおかつこのephemeris_correctionの値をメモリにキャッシュするようにしたので少々速くなったりもしてるはず。CPANにさきほどうpしたので「なんでDateTime::Calendar::Chineseが中世まで遡ると動かないんだよ!」とか思ってる人達はアップグレードしてください。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ