Catalyst::Plugin::XSendFile
lightyのX-SendfileをCatalystから使うプラグインをつくった。
$c->res->sendfile("/path/to/file");
って感じで使えます。同じインタフェースでCatalystテストサーバーの時でも動くようになってます。
miyagawaさんの話だとperlbalでも同じようなことが出来るとのこと(もっと高機能)。でさらにそれにmogilefsを組み合わせるとかなりスケーラビリティが高そうな感じ。
ちょっと見てみるべきかなぁ。
端末の文字コードを得たい
perlで端末の文字コードを知るにはどうやるのがいいんだろうと思って、LC_ALL
とかでgrepした結果、
use Locale::Maketext::Lexicon { _encoding => 'locale' };
my $encoding = Locale::Maketext::Lexicon::encoding();
とかでました。いちおうこれでできるけど超微妙。
このencoding関数だけ外だしにしたようなモジュールないのかなぁ。
overload
これは普通に文字列参照のoverloadでいいんじゃない?
use strict;
use warnings;
{
package NDOString;
use overload (
q{""} => sub { shift->stringify },
);
sub new {
my ($class, $str) = @_;
bless { string => $str }, $class;
}
sub stringify {
shift->{string};
}
}
my $str = NDOString->new('blah blah');
$str =~ s/a/u/g;
print $str;
こんな感じで。
Action attribute
Catalyst 5.70 の dev リリースでサポートされた Action attribute 良いね。
http://search.cpan.org/~mramberg/Catalyst-Action-RenderView-0.01/lib/Catalyst/Action/RenderView.pm
こんなんとか簡単に作れる。cool。
sub foo : Action('+Foo::Bar')
は
sub foo : MyAction('Foo::Bar')
と等価。
Weak references are not implemented in the version of perl
なにげなく aptitude upgrade
したら CRON からメールがきまくって
Weak references are not implemented in the version of perl at /usr/local/share/perl/5.8.4/DBIx/Class/Schema.pm line 7
とかで Scalar::Util::weaken 使ってるスクリプトが全滅。
おいおいなんだよこれ。
weaken は Catalyst でも DBIC でも使ってるのでこのままだと fastcgi プロセス再起したらこの鯖で動いてる Web アプリ全部死亡する危機w
なんでだろーとおもってとりあえず Scalar::Util 再インストールしたら直った。
謎過ぎる。。同じバージョンだったのに。
NEXT, Class::C3 のいいとこ
redefineが楽チン。
てかダメダメいってたけど最近はそうでもなくなってきた。
マルチ language なアプリを作る練習もかねて、ちょっとしたサイトつくりはじめたんだけど、
msgid "Logged in as %1"
msgstr "%1 としてログインしています"
こういうのが化ける。%1
とかはいってないのはいける。Unicodeフラグっぽい化けかたなので、MyApp.pm に
sub localize {
my $c = shift;
my $text = shift;
my $args = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
for my $arg (@$args) {
utf8::decode($arg);# unless utf8::is_utf8($arg);
}
$c->NEXT::localize( $text, $args );
}
とか書いてみたら直ったよ。しかし、is_utf8
のところコメント外すとうごかねーよ、なにこれ。
$args
には is_utf8
は真だけど、perl utf8 じゃないのがはいってる?何かが悪さをしておる。
Unicode プラグインと併用してるのがまずいのかもしれん。