Log::Dispatch::Config
Log::Dispatch
は大好きなモジュールのひとつなんだけど、これだけだとイマイチ微妙。
Log::Dispatch::Config
を使うことですげーー便利になる。必須。
miyagawa さんは 5 年以上も前にこれ作ったんだなぁ。
Catalyst で Log::Dispatch を使うの法
同僚から聞かれたので、僕のやり方を書いておく。
すでにCPANに Catalyst::Plugin::Log::Dispatch
というのがあるのだけど、なんかいけてないのでそれは使わず、以下のようにしている。
まず MyApp::Logger
とかいうのをかく
package MyApp::Logger;
use strict;
use warnings;
use Log::Dispatch::Config;
use Log::Dispatch::Configurator::YAML;
use Catalyst::Utils;
use NEXT;
{
package MyApp::Logger::Backend;
use base qw/Log::Dispatch::Config/;
}
sub setup {
my $c = shift;
my $class = ref $c || $c;
$c->log->_flush if $c->log->can('_flush');
my $config = $c->config->{log}{config}
|| $c->path_to( Catalyst::Utils::appprefix($class) . '_log.yml' );
MyApp::Logger::Backend->configure_and_watch(
Log::Dispatch::Configurator::YAML->new($config) );
$class->log( MyApp::Logger::Backend->instance );
$c->NEXT::setup(@_);
}
1;
んでこれをプラグインとしてロード。
use Catalyst qw/+MyApp::Logger/;
ログの設定ファイルを書く(デフォルトmyapp_log.yml)
---
dispatchers:
- file
- screen
file:
class: Log::Dispatch::File
min_level: debug
filename: /path/to/log
mode: append
format: '[%d] [%p] %m at %F line %L%n'
screen:
class: Log::Dispatch::Screen
min_level: debug
stderr: 1
format: '[%p] %m%n'
以上。
MyApp::Logger::Backend
とかしてるのは mod_perl 対策。まーつかわんのだけど。
これ、さっきヘルパーにした。
これ使えば
./script/myapp_create.pl Log::Dispatch
すると Logger クラスとサンプルの yml ファイルを生成してくれる。
Catalyst + 外部認証API
今作ってるサービス。
use Catalyst qw/
...
Authentication
Authentication::Credential::Password
Authentication::Credential::OpenID
Authentication::Credential::TypeKey
Authentication::Credential::Hatena
Authentication::Credential::JugemKey
+MyApp::UserStore
...
/;
MyApp::UserStore
は A::Store::DBIC
のちょっとしたサブクラスで、Cred::Password
のときは auto_create_user
しないようにしただけのもの。
最近の Store::DBIC
の auto_create_user
機能つかうと外部認証使うサービス簡単に作れる。
Cred::Password
使わないなら (独自ユーザーを使わないなら) 、Store::DBIC
そのまま使えばいける。
すばらしいなー。
リリースしたらちゃんとした記事を書きたい。
YAPC の IRC の機械翻訳を lingr に投げ続けるスクリプト
YAPC 今年もきましたね! 楽しんでますか!
IRCあるけど英語わからんとか、日本語チャンネルあるけど日本語わからんとかいうひと用にIRCの機械翻訳をリアルタイムにlingrに流すスクリプトを作りました!
ソースはこんな感じ
http://svn.unknownplace.org/public/scratch/yapc_irc2lingr/irc2lingr.pl
Config::Any--
パースエラーっても何も出さねーの。
my $config;
eval {
$config = $loader->load( $filename );
};
next if $EVAL_ERROR;
ふぁっく。
yamlパースエラーってるの気づかずにはまったわー。
しかもなんかデバッグ用と思われる warn がいっぱいコメントアウトされていてきもいw
Encode.as
おきた。
早く出社する人が増えてきて、9時ごろになるとうっさくて寝られなくなるなぁ。ねむい。
package {
import flash.utils.ByteArray;
public class Encode {
public static function encode(encoding:String, string:String):ByteArray {
var octets:ByteArray = new ByteArray();
octets.writeMultiByte(string, encoding);
return octets;
}
public static function decode(encoding:String, octets:ByteArray):String {
return octets.readMultiByte(octets.bytesAvailable, encoding);
}
}
}
こんなんでどうか。
このコードは、perlのunicodeフラグを分かってない人に対するEncode.pmの説明にも使えそうな気がする。
perler気質
やっぱ、blosxomユーザー(だった)な人ってすごい人ばっかりだなとか、今更ながらしみじみ思ったりしました。
blogはまとまった文章書くのが苦手で休止してますが、blosxom魂はわすれてません!
しかし、blosxomをいじるためにperlをはじめたんだけど、いまや職業になっちゃった。
今だったらplaggerかな。かっこいいよねぇ。
blosxomやplaggerをかっこいいと思う人はperler気質だと思う。うまくいえませんが。
XMLSocket - POE
AS3からSocketクラスができたけど、それでも依然としてテキストベースの通信ではXMLSocketのほうが楽なのでAS3ベースでもXMLSocket使ってる。
でも通信の区切りがNULL文字だったりとか、癖があるんで、なんこかPoCoサーバー作ってみて、うまくラッピングするモジュール作るべきだなと考えてる。
たとえば以下のような。
POE::Filter::XMLSocket
NULL文字で区切る入出力フィルタ。
POE::Component::Server::TCP::XMLSocket
AS3からサポートされているTCP通信でのcrossdomain.xmlの返答機能を組み込んだComponent::Server::TCPのサブクラス。
などなど。
今の仕事が終わったらちゃんと考えよう。
Jemplate多言語化用ラッパ
つくった。
http://svn.unknownplace.org/public/scripts/jemplate-maketext.pl
Jemplate のテンプレート内に {{Hello}}
とか _("Hello")
とかかいておいて jemplate -c
のかわりに
jemplate-maketext.pl --path lib/MyApp/I18N --locale ja templates/jemplates/*.tt > jemplate_ja.js
みたいにすると {{Hello}}
とかの部分がその言語になったファイルができるというやつ。jemplate -c の簡単なラッパ。
--path には .po や .mo のあるディレクトリを指定する。
"Hello %1!"
みたいなのには対応できないんだけど、まぁとりあえずこれで。