2007年5 月7日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - Image::Magickで透明度を設定

Image::Magickで半透明な画像を乗せたくて、探してみるものの日本語Docsが中々見つからず。
結局公式Docsを参照して以下のやり方をみつけた。

use Image::Magick;

my $image = Image::Magick->new;
$image->Read('upopo.jpg');

my $image_base = Image::Magick->new;
$image_base->Read('image_base.jpg');

$image->Composite(image=>$image, compose=>'Dissolve', x=>0, y=>0,opacity=>'60%');

$image_base->Write('output_sample.jpg');

Compositeのオプションを追っていくと他にもいろいろありそうだ。

compose=>'Dissolve'とopacity=>'**%'の組み合わせにたどり着くのが長かった。
↓の画像のように透明な感じに乗せることができます。

output_sample.jpg

2007年5 月7日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - Sledge::Plugin::Stash

Catalystみたいに stash に変数を突っ込める、Sledge::Plugin::Stashですが、自分とこのサーバではうまい事動かなかったので同ソースをちょっと修正。

/usr/local/lib/perl5/site_perl/5.8.8/Sledge/Plugin/Stash.pm

BEFORE_OUTPUT —> AFTER_DISPATCH に変更。


$pkg->add_trigger(
AFTER_DISPATCH => sub {
#BEFORE_OUTPUT => sub {
my $self = shift;
$self->tmpl->param( %{ $self->stash } );
}
);

ちなみにSledge::Plugin::BeforeOutputこちらからcoできるみたいです

↓Class::TriggerとSledge::Plugin::BegforeOutputの組み合わせに注意
Sledge-Plugin-BeforeOutput で嵌る

2007年5 月7日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - DBICのsearch_literal

search_literal
http://d.hatena.ne.jp/nekokak/20070118/1169108107

search_literal いいね。

$rs->search({id => { '>' => 5}},)

$rs->search_literal('id >= ?', 5)

非常にシンプル

2007年5 月12日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - Sledge::Plugin::Validator

Sledge::Plugin::Validatorです。

テンプレ側で function(NOT_NULL)とかを指定しなくても
現在Validチェックで引っかかっている何かしらのエラーの文言を返すメソッドがほしかった。

[% valid.error_message(valid_param) %]

とテンプレで書いておけば、適当なValidメッセージがかえってくるような。

で、Sledge::Plugin::Validator に以下のメソッドを追加。

sub error_message {
my $self = shift;
my $param = shift || return;
my @valid_key = %{ $self->{ERROR}->{$param} };
$self->get_error_message($param,uc($valid_key[0]));
}

あと Sledge::Plugin::Validator::range とかも作ってみたので
あとから書く予定。

2007年5 月13日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - DBIx::Class::ResultSetManager

DBIx::Classをいじっているわけですが、
Class::DBIみたいに、パッケージに自分を生成するクラスメソッドを作りたかったんですよ。

こんな感じにしたい

$schema->resultset('Sample')->recent_entries;

DBIx::Class::ResultSetManagerでResultSetにメソッドを追加 の素晴らしい事例を見て納得、なるほど。

こんなのがテーブルにマッピングしたモジュールにあって、呼び出したらイテレータなどが返ってくるという感じ。↓

package Schema::Sample;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/
ResultSetManager
Core
/);
__PACKAGE__->table(’sample');
__PACKAGE__->add_columns(qw/id title body timestamp/);
__PACKAGE__->set_primary_key('id');

sub recent_entries : ResultSet {
my $class = shift;
return $class->search( undef, { order_by => [ qw/timestamp/ ] } );
}

で、resultsetから直接 recent_entries を実行できました。

2007年5 月13日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - Sledge::Plugin::Validator::range

大変役に立つ Sledge::Plugin::Validator ですが、

例えば数値などの入力で良くあるケースが

 ・都道府県(1~47とか)をプルダウンで入力させたい
 ・ラジオボタンなどで value が 0、1、2 のいずれかを選択させたい

などだと思います。

S::P::Validatorでマッチするようなのが見つけられなかったので
追加してみました、こんな感じですかね。

Sledge::Plugin::Validator::range

package Sledge::Plugin::Validator::range;

use strict;
use vars qw($VERSION);
$VERSION = '0.01';

sub load {
my $self = shift;
$self->set_function(
RANGE => &is_RANGE,
);
}

sub is_RANGE {
my $value = shift;
my $min = shift;
my $max = shift || $min;
if($value >= $min && $value <= $max) { return 1; }
return 0;
}

1;

で、Validator でこれを利用できるようにしておいて(Sledge/Plugin/Validator.pm の40行目辺り)

# チェック定義
#
$self->{valid} = Sledge::Plugin::Validator->new(
#LOAD_FUNCTION => [qw(default japanese)],
LOAD_FUNCTION => [qw(default japanese range)],
MESSAGE_FILE => eval {$self->create_config->validator_message_file},
);

で、Pagesクラスで以下のような書き方で。

sub valid_index {
my $self = shift;
$self->valid->check(
'pref_id' => [qw(NOT_NULL UINT), ['RANGE',1,47], ],
);

2007年5 月13日  |  Written by matsumoto  |  under 未分類 Yahoo!ブックマークに登録    はてなブックマーク - DBIx::Class とMemcached

DBIx::Classでちょっと困った。

当然といえば当然なのだが、あるレコード結果をmemcachedなどのキャッシュに保存した場合、
belongs_toで定義したカラムが含まれ、それを参照するとエラーになる。

TTで

[% article.category.name %]

とかしたくても、articleとcategoryがbelongs_toの関係の場合
Memcache化(キャッシュを参照するとエラーる)できないので、もう少し調査してみる。

※belongs_toを使わないで、別schemaのresultsetを参照できればそれでもいいんだが。

2007年5 月15日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - TTで途中で文章をカットするモジュール

TTのFilterで
Template::Plugin::Filter::VisualTruncateというのがリリースされた。 
長い文章などを途中で切ってくれるモジュール。

早速つかってみる。

[%- USE Filter.VisualTruncate 'euc-jp' -%]

としておいて、

[% body = '1234567890123456' %]
[% body | visual_truncate(10,'') | html %]

で、実行結果は当然

1234567890

全角文字だと

[% body = '0123456789' %]
[% body | visual_truncate(10,'') | html %]

で、実行結果は

01234

ん?バイト数で計算してる?

もうちょっと調べてみる。

2007年5 月29日  |  Written by matsumoto  |  under 未分類 Yahoo!ブックマークに登録    はてなブックマーク - CDBIでDBIをTrace

とりあえずSELECT時のSQLっぷりをみたいだけなので、

use base qw(Class::DBI);
.
.
.
__PACKAGE__->add_trigger(
select => sub {
my $self = shift;
$self->db_Main->trace(1);
},
);

これで DBI->traceな感じで。

2007年5 月31日  |  Written by matsumoto  |  under 未分類 Yahoo!ブックマークに登録    はてなブックマーク - ミリ秒単位でsleep

perlfuncに書いてあるとおり確かに

You can effect a sleep of 250 milliseconds this way:

select(undef, undef, undef, 0.25);

で、0.25秒のsleepになるそうです。

私はチーム・マイナス6%です