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するやつをつくって云々はありだとは思います。

Perlbal::Plugin::UrlGroupリリース

数年前に必要にかられて作って以来ずっとつかってきた
Perlbal::Plugin::UrlGroupを先程CPANにupしました。

そもそもPoundのurl_groupの機能をPerlbalで使いたいところから始まって、
リクエスuriをみてどのバックエンドにreverse_proxyするかを
設定でかけるようになっています。

まぁ最近だとnginxとかが流行ってるので、
今更Perlbalを使う人って少ないんでしょうね。

個人的には
nginxがreproxy-cacheを扱ってくれればPerlbalを使わない選択肢が出てくる気がしています。

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