Catalyst 5.33 いれたら CPANPLUS とかいれられちゃったのでこの際移行してみる。
ちょっとつかってみて CPAN よりいいところ
- アンインストールコマンドがある
- ユーザー権限でモジュールをインストールできる (内部でsudo使用らしい)
- p コマンドで履歴というかログをページャで開ける (ファイルに保存も可)
2 が地味にいいなー。
下書き
package DBIx::Class::Loader::Pluggable; use strict;
use base qw/DBIx::Class::Loader/;
require Module::Pluggable::Fast;
sub new {
my $class = shift;
my %attr = @_;
my $self = $class->SUPER::new(@_);
Module::Pluggable::Fast->import(
name => '_components',
require => 1,
search => [ $attr{namespace} ],
);
__PACKAGE__->_components;
$self;
}
1;
DBD::SQLite のバグ?
DBIC::Loader の blblack さんが綺麗なサンプルを返信してくれたのでそれを書くと、
my $test_ite = DBIC::Test->search;
while ( my $test = $test_ite->next ) { # Fails
###foreach my $test ($test_ite->all) { # Works
$test->text( $test->text . ' updated' );
$test->update;
}
とかで、イテレータでまわそうとするとupdate時に死ぬ。(searchで複数の行が帰ってくる場合)
配列で全部とってきてまわしたときは普通に動く。
ちなみに、DBIC::Test->search->all というのは CDBI でいうリストコンテキストでの search と同じことです。もちろん CDBI と同じように
my @tests = DBIC::Test->search;
ともかけるす。というか僕は最初そやって投稿したので、上の例が帰ってきたときにネイティブDBIC使いとの違いを知らしめられたという感じです。
daap_proxy.pl その後
POE の Cookbook にのってる TCP Forward サンプルを元に、とりあえず動くのをつくってコミット。
これで家の iTunes を会社の iTunes 共有に追加できたりする。
GET daap://address:3689/server-info HTTP/1.1
とかって通信してるはずなのに、それをそのまま中継して動く不思議。
ちゃんとDAAPしゃべって中継したい! 共有名変えたり、認証かけたり。
現状は daap_proxy.pl というよりは daap_fwd.pl か。
DBIC の Trigger
よくわかんないんだが、CDBIのtriggerぽいことをするには
sub insert {
my $self = shift;
$self->created_date( DateTime->now ) unless $self->created_date;
$self->SUPER::insert(@_);
}
みたいな感じでいいんかなぁ。
Static::Simple と StackTrace のロード
はこんな感じでどう。
__PACKAGE__->setup(
do {
my @plugins;
push @plugins, 'StackTrace' if $ENV{CATALYST_DEBUG};
push @plugins, 'Static::Simple' if $ENV{CATALYST_ENGINE} =~ /^HTTP/;
@plugins;
}
);
CPANRecentアップデート
namespaceフィルタに加えてauthorフィルタも追加した。
とかで特定の人のログを追えるように。手抜きなので namespace フィルタと併用は出来ない。キーはCPAN IDです。
miyagawa+naoya+tokuhirom とかすれば複数人を対象にできるます。
昨日の DAAP Proxy は POE::Component::Proxy::TCP はなんかLinuxでしかうまく動かんので、適当に実装してる。
sekimura さんので iTunes の共有に表示出すのは簡単にできて、そっから DAAP の server-info content-codes login まではいくんだけど、そのあと updates で固まる。
土日マター。
daap-proxy.pl
sekimura さんが Net::Rendezvous::Publish::Backend::BonjourWin32 とかいうアツイモジュールを作っているのを見てこんなの思いついた。
実行できる環境にないので適当に書いてみただけで多分動きませんが、
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use FindBin;
use lib "$FindBin::Bin/../lib";
use POE qw/Component::Proxy::TCP/;
use Net::Rendezvous::Publish;
use Net::Rendezvous::Publish::Backend::BonjourWin32;
my $server_name = 'daap proxy';
my $server_port = 9999;
my $remote_server = 'localhost';
my $remote_port = 3689;
GetOptions(
'n|server-name=s' => \$server_name,
'p|port=i' => \$server_port,
'r|remote-port=i' => \$remote_port,
's|remote-server=s' => \$remote_server,
);
POE::Component::Proxy::TCP->new(
Alias => "ProxyServerSessionAlias",
Port => $server_port,
OrigPort => $remote_port,
OrigAddress => $remote_server,
);
my $service = Net::Rendezvous::Publish->new->publish(
name => $server_name,
type => '_daap._tcp',
port => $server_port,
);
$poe_kernel->run;
目的はLANの外にあるDAAP ServerをiTunesの共有で聞きたい、てのがしたいということ。
家にも会社にも音楽ファイル置いててめんどいのでこゆのほしかった。
これで動くといいけどなぁ。詳しくは明日。