cpanモジュール DBIx::ActiveRecordを作りました。

perlのO/Rマッパーっていうと、DBIx::Classとか、DBIx::Skinnyとかあるけど、
DBIx::Classはデカすぎて使うには躊躇しちゃうし、
DBIx::Skinnyは小さいけど、(個人的には)そんなに使えない。


rails3のActiveRecord的なやつであんまり依存関係がないやつがいいんだよ。


ということで、それを作った。
DBIx::ActiveRecord - rails3 ActiveRecord like O/R Mapper - metacpan.org

レポジトリは
GitHub - toshi-saito/perl-dbix-activerecord: Rails3 ActiveRecord like O/R Mapper library for perl

依存はDBIのみ。
本家と同じく、scopeベースになってる。
必要最低限の機能のみ実装してある。
複合キーも(たぶん)使える!
mysqlでしかテストしてない。(ほかでも多分動く!)


モデルの定義はこんな感じ。

package MyApp::Model::User;
use base 'DBIx::ActiveRecord::Model';
__PACKAGE__->table('users'); # テーブル名
__PACKAGE__->columns(qw/id name created_at updated_at/); # カラム一覧
__PACKAGE__->primary_keys(qw/id/); # プライマリキー。(複合キーOK!)

# scope
__PACKAGE__->default_scope(sub{ shift->eq(deleted => 0) });
__PACKAGE__->scope(adult => sub{ shift->le(age => 20) });
__PACKAGE__->scope(latest => sub{ shift->desc('created_at') });

# association
__PACKAGE__->belongs_to(group => 'MyApp::Model::Group');
__PACKAGE__->has_many(posts => 'MyApp::Model::Post');

rails3やった事ある人なら、これで分かってくれるんじゃないかと。
カラム一覧とプライマリキーはユーザに定義させなくても良かったんだけども、
モデル作るときとかにいちいちどんなカラムあったっけ?ってなってmysqlで確認するはめになるので、
定義しておいた方がいいって結論。
しっかり、スコープ使えるし、アソシエーションも使える。
includes(アソシエーションの事前読み込み)とjoinsも使えるので、機能としては十分かなと。

よかったら使ってみてね!
できたらフィードバックも欲しいっす!!

2012!

あけましておめでとうございます。
なんか今年は明けた感じが全くしないのは僕だけなんですかね。


あっというまの2011でした。
おととしにつづき去年も仕事は順調で、これまたいい人たちにめぐり合うことができました。
ありがたいことです。
日々勉強の毎日です。

ことしは自社でのサービスリリース予定です。
うまくいくといいなー

ということで、今年もよろしくお願いします。

iMac&macbook proのメモリ増設してみた。

仕事ではmacbookproを使ってるんですが、
以前eeepcを使ってたせいもあり、環境を再度作るのが面倒なのもありで
VMWare FusionWindowsXP(eeepcをそのままイメージ化)を動かしてその上で仕事をしてます。

macbookproはメモリ4Gがデフォですが、VM動かしちゃうとちょっと不足感。
いままでは何となく我慢してましたが、
こないだネットで調べたらメモリが激安!
4Gx2が7000円程度で買えちゃう。
これは買い。


ということで、今日秋葉に行って買って来ました。
買ったのはこれ


手に入れるなら、秋葉か、ネットで買うかのほぼ2択です。たぶん
すでに、PC3-10600が主流なのが原因な気がします。
秋葉でも売ってるところは限定的なようで、ツクモとあと1店舗くらいでしか売ってませんでした。(売り切れは結構あった。)


ちなみに、僕が買ったところはクレバリー。6990円で相性保証+200円でした。
macbookiMac用に2セットかって14000ちょっと。やすい!


macは相性問題が出やすいので、相性保証は必須です。
間違ってもPC3-10600は買わない事。動かない確率大です。


幸い、僕のmacbookpro(13-inch, Mid 2010),imac(Late 2009)は動作OKでした。
メモリテストもall green。



ぱっと見た限りPC3-10600が主力商品になってきてて、かなり品薄感があったのと
これから値が下がってもあと1000円くらいだと思うので、
早めに買っておいた方がいいかも。

続・GearmanをPHPから使ってみた。

前のエントリの続き。


今回も、いろいろテスト。

workerを複数にしたいよ。

当然ですね。 前回なんでテストしなかったんだろう。
結論から言うと、

php worker.php

を2つ立てとけば勝手にそのworkerたちが動いてくれます。

テストのスクリプトは↓


10個タスクをぶち込むクライアント
client.php

<?php
$client = new GearmanClient();
$client->addServer();
for ($i = 1; $i <= 10; $i++) {
    print "add $i\n";
    $client->doBackground("test", $i);
}


1タスク5秒かかる。
worker.php

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('test', 'my_test');
while ($worker->work());

function my_test($job) {

        print "[begin]".$job->workload()."\n";
        sleep(5);
        print "[ end ]".$job->workload()."\n";
}

client.phpを実行すると...

$ php client.php
add 1
add 2
add 3
add 4
add 5
add 6
add 7
add 8
add 9
add 10


worker.phpを1個しか立ち上げてなければ、

$ php worker.php 
[begin]1
[ end ]1
[begin]2
[ end ]2
[begin]3
[ end ]3
[begin]4
[ end ]4
[begin]5
[ end ]5
[begin]6
[ end ]6
[begin]7
[ end ]7
[begin]8
[ end ]8
[begin]9
[ end ]9
[begin]10
[ end ]10

となります。


worker.phpを2個立ち上げておけば
ぞれぞれ

$ php worker.php 
[begin]1
[ end ]1
[begin]3
[ end ]3
[begin]5
[ end ]5
[begin]7
[ end ]7
[begin]9
[ end ]9
$ php worker.php 
[begin]2
[ end ]2
[begin]4
[ end ]4
[begin]6
[ end ]6
[begin]8
[ end ]8
[begin]10
[ end ]10

となります。
なので、同時実行させたい分workerを事前に起動させておけばOKです。
本当は、タスクの増減でworkerプロセスも勝手に増減してほしいですが、
gearmanでは無理っぽいので、ここはmaxプロセス立ち上げておくしかなさそうです。
もしくは、キューの溜まり具合を監視してうまいことやるか。

workerが処理中に死んだらどうなるの?

もちろん大丈夫です。当然ですが。

$ php worker.php
[begin]1
[ end ]1
[begin]2
[ end ]2
[begin]3 <- ここでCtrl+D

3番のジョブを実行中に死にました。
再度、workerを起動します。

$ php worker.php
[begin]4
[ end ]4
[begin]5
[ end ]5
[begin]6
[ end ]6
[begin]7
[ end ]7
[begin]8
[ end ]8
[begin]9
[ end ]9
[begin]10
[ end ]10
[begin]3
[ end ]3

失敗したジョブは自動で再度キューにぶち込まれるようです。