blog
最近はてながけっこう重いので
http://blog.nekokak.org/
こっちをベースにしようかなと思ったり思わなかったり。
まぁここのサーバもVPSで重かったりするんですけど。
DBIx::Skinny::Cache
というのをつくりました。
http://github.com/nekokak/p5-dbix-skinny-cache
package Mock::Basic; use DBIx::Skinny setup => +{ dsn => 'dbi:SQLite:', username => '', password => '', connect_options => { AutoCommit => 1 }, }; use DBIx::Skinny::Mixin modules => ['Cache::Memory']; # in your script: use Mock::Basic; # set data Mock::Basic->memory_cache->param(foo => 'bar'); # get data Mock::Basic->memory_cache->param('foo'); # get bar # delete data Mock::Basic->memory_cache->delete('foo'); # get_callback Mock::Basic->memory_cache->get_callback( foo => sub { # some process..... 'return data for cache'; } );
こんな感じで使います。
Skinnyはnewしてインスタンスを生成しなくても
直接クラスからメソッド呼び出しできるので、
インスタンスからのメソッド呼び出しなのか
クラスからのメソッド呼び出しなのかを
意識することなくデータをmemoryにキャッシュさせることがこれでできるようになります。
Cache::MemoryとしているのはCache::Memcachedとかを作ってもいいかなと思ったからですね。
作りたい人いませんかね?
Re:DBIx::Skinnyのrowオブジェクトをnfeezeしようとすると死ぬ
http://d.hatena.ne.jp/hirafoo/20100418/1271572008
こちらに
DBIx::Skinnyのrowオブジェクトをnfeezeしようとすると死ぬ
という項目があるんですが。まぁ死にます。
死ぬ理由はnfreezeするオブジェクト内にcoderefがあるからです。
STORABLE_freezeとかを使ってfreezeすると気にHookして云々とかはできるんですが
(DBICではそういうcomponentがあります)
そもそもStorable使うときってキャッシュするときかなと思い、
キャッシュするデータは必要最低限にするべきかなと思っています。
なのでhttp://d.hatena.ne.jp/nekokak/20090918/1253257691
ここでやってるようにrowのデータだけキャッシュするのがよいかと思っています。
まぁMixinでSTORABLE_freezeするやつをつくって云々はありだとは思います。
use Lint
psgiなアプリをかいてて今まで動いていたのに
Shotgunを使い始めたらエラーが出てしまった。
もともとのアプリは大体こんなの
use Proj::Container qw/api/; use Plack::Builder; builder { mount '/banner/' => sub { my $env = shift; my $rid = $env->{PATH_INFO} || ''; $rid =~ s!/!!; return [ '200', [ 'Content-Type' => 'image/gif', 'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid, ], ]; }; };
バナー画像をreproxy urlをつかって配信してたの。
なんかShotgunでエラーがでるーとか騒いだら
tokuhiromさんとmiyagawaさんから色々教えていただきました。
http://advent.plackperl.org/2009/12/day-21-lint-your-application-and-middleware.html
そもそもPSGIの仕様から外れたレスポンスを返してるんですね。
アホですね。
use Proj::Container qw/api/; use Plack::Builder; builder { mount '/banner/' => sub { my $env = shift; my $rid = $env->{PATH_INFO} || ''; $rid =~ s!/!!; return [ '200', [ 'Content-Type' => 'image/gif', 'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid, ], [] ]; }; };
なのでこうするだけ。
で、そもそもPSGIの仕様にそってるかどうかをミドルウエアでチェックできると教えてもらったので
enable 'Lint'するとよいでしょう。
use Proj::Container qw/api/; use Plack::Builder; builder { enable 'Lint'; mount '/banner/' => sub { my $env = shift; my $rid = $env->{PATH_INFO} || ''; $rid =~ s!/!!; return [ '200', [ 'Content-Type' => 'image/gif', 'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid, ], [] ]; }; };
これで、PSGIの仕様に外れているとdieしてくれました。
しかしShotgun素晴らしすぎるのでみんな使うといいと思います。
http://d.hatena.ne.jp/sugyan/20100404/1270320069