DBIC::UTF8Columns
書いた。
Template::Stash::ForceUTF8 インスパイア。
CPANPLUS
Hatena::Diary::Neko::kak 500 Internal Server Error - Plaggerはいらない!
CPANPLUS.pmで入れようとしたら設定がまずいのか
タイムアウトしたりなんだかんだで入らない!!
これ多分設定悪いんじゃねーかなぁ。一番最初に試したときになんかそうなってぜんぜんうまくうごかねーCPANPLUSうんこ!とかなった記憶。
とりあえず最近新しいPCにCPANPLUS入れたのでそのときの作業を思い出しつつ書いておいて見る。
$ sudo cpan
cpan> install Bundle::CPANPLUS
- ここではてけとうに設定
- cpan シェル終了
$ chown -R typester:typester ~/.cpanplus
$ export PERL5_CPANPLUS_CONFIG=$HOME/.cpanplus/config
とrcスクリプトにそれ追加$ cpanp
CPAN Terminal> s reconfigure
で再設定。ここでちゃんと設定する
設定時の注意は設定ファイルを ~/.cpanplus/config
になるようにするのとインストール時に sudo を使うようにするくらい。
あと Storeble を有効にすると環境によってはすげー遅くなる場合があるかもしれないのでその場合は切る。
Plagger::Plugin::Store::DBIC
作ってみたけどびみょーー。Schema をこっちの指定通りに作ってないとだめなんだよな。せっかく外部におけるのに。
package Plagger::Plugin::Store::DBIC;
use strict;
use warnings;
use base qw/Plagger::Plugin Class::Accessor::Fast/;
use UNIVERSAL::require;
our $VERSION = '0.01';
__PACKAGE__->mk_accessors(qw/schema/);
sub register {
my ( $self, $c ) = @_;
unless ( $self->conf->{schema_class} and $self->conf->{connect_info} ) {
$c->error('schema_class and connect_info are required');
}
$self->conf->{schema_class}->require
or $c->error(
qq/Can't load schema class "@{[ $self->conf->{schema_class} ]}", $!/);
$self->schema( $self->conf->{schema_class}
->connect( @{ $self->conf->{connect_info} } ) );
$c->register_hook( $self, 'publish.feed' => \&store, );
}
sub store {
my ( $self, $c, $args ) = @_;
# feed
my $feed = $self->schema->resultset('Feed')
->find_or_new(
{ link => $args->{feed}->link, type => $args->{feed}->type } );
$feed->$_( $args->{feed}->$_ )
for (qw/url image description language author updated/);
$feed->insert_or_update;
# feed meta
$feed->meta->delete_all;
for my $k ( keys %{ $args->{feed}->meta } ) {
$feed->add_to_meta( { key => $k, value => $args->{feed}->meta->{$k}, } );
}
# entry
for my $feed_entry ( @{ $args->{feed}->entries } ) {
my $entry = $self->schema->resultset('Entry')->find_or_new(
{ feed => $feed->id,
link => $feed_entry->link,
}
);
$entry->$_( $feed_entry->$_ )
for qw/title author date summary body rate icon/;
$entry->insert_or_update;
# meta
$entry->meta->delete_all;
for my $k ( keys %{ $feed_entry->meta } ) {
$entry->add_to_meta( { key => $k, value => $feed_entry->meta->{$k}, } );
}
# tag
$entry->tag_mappings->delete_all;
for my $entry_tag ( @{ $feed_entry->tags } ) {
my $tag = $self->schema->resultset('Tag')
->find_or_create( { name => $entry_tag } );
$entry->add_to_tag_mappings(
{ entry => $entry->id, tag => $tag->id } );
}
}
}
1;
config.yaml は
- module: Store::DBIC
config:
schema_class: 'Plaggerer::Schema'
connect_info: [ 'dbi:SQLite:/home/murase/plaggerer/db/plaggerer.db' ]
Schema ファイルを置く場所もまた問題。
この場合はPlugin指定のSchemaしか扱えないから普通にこのプラグイン以下に置けばいいのかも知れんけどなぁ。
MySQL の DATETIME 型
って、タイムゾーン情報ないから、deflate するとき set_time_zone してタイムゾーンそろえたほうがいいと思った。
あと、inflate 時も floating timezone で帰ってくるから、保存時のタイムゾーンをセットしてあげたほうが良い。
inflate => sub {
DateTime::Format::MySQL->parse_datetime(shift)
->set_time_zone('local');
},
deflate => sub {
DateTime::Format::MySQL->format_datetime(
shift->set_time_zone('local') );
},
と思うんだけどどーなんだろ。
決めうちでしかつかわないならいいんかな。
lighttpd+fastcgi時のメモリ共有
このサーバーで動いてるアプリはほとんど lighty+fastcgi で動いているけど、アクセス数的に余裕まくりなのですべて1プロセスで動かしていていままで意識していなかったのだけど、仕事で使うことになったので調べてみた。
まず、Catalyst 製アプリケーション MyApp をlighttpd.conf で以下のように設定。
fastcgi.server = (
"" => (
"myapp" => (
"socket" => "/tmp/myapp.socket",
"check-local" => "disable",
"bin-path" => "/path/to/script/myapp_fastcgi.pl",
"max-procs" => 5,
),
),
)
これは割りと一般的な方法。これでMyAppプロセスが5つ立ち上がる。うちもこんなようなのの max-procs を 1 にしたのを使っている。
でも lighttpd.conf で bin-path を指定すると lighty がプロセスを5つ立ち上げてる感じになり、メモリは共有されてないっぽい。pstree はこんな感じ。
|-lighttpd---5*[myapp_fastcgi.pl]
なんかテストしてるPCだとCatalystアプリを立ち上げるときにFile::Slurpのwarningがでまくりなんだけど、上記設定でlighttpd立ち上げるとプロセス数分warningが出ることからもuseまくってんだなぁということがわかる(適当だなオイ
これじゃー微妙なので、もう一つの方法を試す。
Catalyst の fastcgi.pl は FCGI::ProcManager での動作もサポートしていて、
./script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5
とすれば MyApp が FCGI::ProcManager 経由で fastcgi プロセスが 5 つ立ち上がる。これだと
|-myapp_fastcgi.pl---5*[myapp_fastcgi.pl]
こんな感じで賢い風味。File::Slurp の warning も1回しか出ない!(そこで判断かよ
これを lighty から使うにはさっきの設定から bin-path をはずせば OK。
fastcgi.server = (
"" => (
"myapp" => (
"socket" => "/tmp/myapp.socket",
"check-local" => "disable",
),
),
)
こんなんで。
で、結論としては複数プロセス立ち上げるときは FCGI::ProcManager 使わないと損ということですかね。
時間があるときに追試はしてみたい。
盗聴
Term::ReadPasswordてのもある
盗聴
Term::ReadKey
password とか入力するときに Linux のコマンドラインっぽく画面の出力を隠して入力文字列をとりたいときにいいモジュール
refactored
sub fuzzyfind { my ( $self, $id ) = @_;
$id and $id =~ /\D/
? ( $self->find( { uuid => $id } ), 1 )
: $self->find($id);
}
こうか。
fuzzyfind
sub fuzzyfind { my ( $self, $id ) = @_;
my ( $exist, $uuid );
$exist = $self->find( { uuid => $id } ) and $uuid++
if $id and $id =~ /\w/;
defined $exist ? ( $exist, $uuid ) : $self->find($id);
}
namingsence by 2ndlife.
* 16:46 コード修正
Plugin::FillInForm
の finalize
sub finalize {
my $c = shift;
if ( $c->isa('Catalyst::Plugin::FormValidator') ) {
$c->fillform
if $c->form->has_missing
|| $c->form->has_invalid
|| $c->stash->{error};
}
return $c->NEXT::finalize(@_);
}
$c->stash->{error}
があると問答無用で fillform る。あー何この余計なお世話機能。
小一時間はまったよ。。