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も使えるので、機能としては十分かなと。
よかったら使ってみてね!
できたらフィードバックも欲しいっす!!
ルールを知る
という話を書こうと思ったんだけど面倒なんでやめます。
近況というか
このブログはあんまり見てない&書かないのでついったみてちょ。
あと、CleanCoder買った&読んだ。良書でした。
2012!
あけましておめでとうございます。
なんか今年は明けた感じが全くしないのは僕だけなんですかね。
あっというまの2011でした。
おととしにつづき去年も仕事は順調で、これまたいい人たちにめぐり合うことができました。
ありがたいことです。
日々勉強の毎日です。
ことしは自社でのサービスリリース予定です。
うまくいくといいなー
ということで、今年もよろしくお願いします。
iMac&macbook proのメモリ増設してみた。
仕事ではmacbookproを使ってるんですが、
以前eeepcを使ってたせいもあり、環境を再度作るのが面倒なのもありで
VMWare FusionでWindowsXP(eeepcをそのままイメージ化)を動かしてその上で仕事をしてます。
macbookproはメモリ4Gがデフォですが、VM動かしちゃうとちょっと不足感。
いままでは何となく我慢してましたが、
こないだネットで調べたらメモリが激安!
4Gx2が7000円程度で買えちゃう。
これは買い。
ということで、今日秋葉に行って買って来ました。
買ったのはこれ
手に入れるなら、秋葉か、ネットで買うかのほぼ2択です。たぶん
すでに、PC3-10600が主流なのが原因な気がします。
秋葉でも売ってるところは限定的なようで、ツクモとあと1店舗くらいでしか売ってませんでした。(売り切れは結構あった。)
ちなみに、僕が買ったところはクレバリー。6990円で相性保証+200円でした。
macbookとiMac用に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
失敗したジョブは自動で再度キューにぶち込まれるようです。