なんとなくLDRでtwitterのPerlに関する発言を検索した結果を購読してたんだけど、面倒くさくなってきたので、@perlismに投稿するボットを作った。単純にPerl関連の発言を持ってくるボットです。とりあえず日本語限定。よかったらフォローどうぞ。
2009年12月
クリスマスディナー
アメリカにいた頃はターキーとか、日本に帰ってきてから去年まで3年間ぐらい毎年チキンを焼いてたんだけど、ことしはラムにしました。ラム!ラム!ラム!でっかいラム!
ラムはもちろんThe Meat Guyで購入。ラムリブラック8本!アドレナリンー!冷凍で来るので、二晩前から冷蔵庫で自然解凍させ、約4時間前くらいに外に出しておいて塩こしょう、それに脂身のほうに串で穴を開けてその穴にローズマリーを詰めておくという作業を施しておいて寝かしておいた。これでしばらく放置。
その間にミートソースを作成。といっても肉はあるので肉はあくまで出汁用。ハナマサで買ってきたでっかいタマネギ3個を盛大にみじん切りにして炒めて、チョップドトマトと肉と合わせてブイヨン、塩こしょう。コクを出したいので炒めるのとは別に少しオリーブオイル追加。あとは適当にハーブ(といってもオレガノくらい)。
客人が来てから肉は料理開始。まず熱くしたフライパンで一気に焼き目をつける。もうこの時点でうまそう。うひー。脂身側を若干念入りに焼き付けて、200度のオーブンへ。あとは待つだけ。20分焼いて、その後様子を見ながら10分前後調整。
もちろんこの間にパスタもゆでておく。今回はショートパスタにした。
で、できあがったのがこれ。ラム肉久しぶり。ジンギスカンはうまいけど、あれじゃあ薄切り肉じゃん?これだとレアな塊肉にありつける。この瞬間のために朝から絶食しててよかった。うますぎて泣けた。
ラム肉は癖があるけど、旨味という意味では同じ赤身でも普段食べてる牛肉とかは凌駕すると思う。もしお肉が好きなら是非どうぞ!Meat Guyならいつでもこの塊を買えるよ!
make bundle_local_lib
最近、miyagawaさんが書いたこちらののツールを多少改変したものを使ってlocal::lib環境にCatalystアプリの全依存関係を突っ込んでからデプロイ、ということをしていました。
が、このツール自体をコピペするのに疲れました。なのでApp::BundleDepsとModule::Install::Bundle::LocalLibというものを作りましたよ!M::I::Bundle::LocalLibのほうはMakefile.PLに1行だけ記述を入れておくとmake bundle_local_libと書くだけで./extlibにlocal::lib環境を作ってくれるというものです。
俺的には超便利!
これを使うとCatalystアプリのバージョン違いなんかのデプロイを比較的気軽に行う事ができるようになるので、是非さわってみて感想なんかを教えていただけると幸いです。
あと、自分ではそんなに使わないんだけど折角Platypus対応コードをmiyagawaさんが書いてたので、それも同様にあげといたです
追記: Platypusのほうは make platypusってできるように0.00002で変更しておきました
本日の歩き
CGI.pmで作ったCGIをコマンドラインから実行する
某所での会話:
13:14 <#perl6> t****: y'know, one thing that got me into Ruby was that the CGI library would
auto-detect that I was testing it in a browser and take arguments as if I
was working in a browser. Made troubleshooting a breeze...
13:14 <#perl6> t****: I mean, testing from the command line...
13:15 <#perl6> t****: I always wished the perl CGI module would do that...
13:16 <#perl6> P*******: eh?
13:17 <#perl6> t****: When you write a ruby cgi program, and run it from the command line, it detects
that you are in a command line and allows you to input stuff that it would normally
get from the URL string.
13:17 <#perl6> t****: Maybe there is a way to do this with the perl cgi module,
but I never learned how.
13:17 <#perl6> P*******: perl's CGI module has always done that.
13:18 <#perl6> P*******: you simply pass name=val on the command line
13:18 <#perl6> P*******: (or you could set some environment variables)
13:18 <#perl6> t****: hm... Wish I had known that then...
ええええええええええ。この機能ってすごい有名だと思ってた。
普通にCGI.pmのスクリプトはコマンドラインから実行できるお>< デバッグとかにはとても便利です!
#!/usr/bin/perl
use strict;
use CGI;
my $q = CGI->new();
print $q->header(-content_type => 'text/plain', -charset => 'utf-8'),
"Hello, ", $q->param('name') || "NoName", "!\n"
こんなスクリプトを、以下のように実行すると、"Hello, lestrrat!"と本文に表示されます
% perl test.cgi name=lestrrat
Content-Type: text/plain; charset=utf-8
Hello, lestrrat!
簡単!・・・まぁ、最近は生CGIでなんか書くってのもなくなってきたけどね
COPPELION
いつも行く本屋でいつもなんとなく気になってはいたものの、購入まで至ってなかったCOPPELION。
パンチラの描き方にカサハラテツロー氏と同じ匂いを感じるので「きっとこの人はパンチラが描きたいんだろうなぁ」と思いつつ4巻まで一気に読んだ。
今のところ、力押しなキャラ設定だけど、話の流れが結構良い。この後(あおりに能力がどうのこうの書いてあったから、スタンド的な意味で)ジョジョみたいにならないといいなぁ。荒廃した東京のサバイバルをもう少し読みたい気がする。
百鬼夜行抄
相方がなんか突然買ってきた。妖怪物なので好き嫌いは分かれるとは思うが、これは自分はアレルギーは出ず、結構楽しめた。
難を言えば、これと言ったオススメポイントもないところか・・・。 話はきちんとできてるし、キャラもたってるんだが、強烈に記憶に残る部分はない感じかな。
まだ2巻までしか読んでないので、今後残りを手に入れた時に期待。
Script::Sub::Importが大変いただけない件
スクリプトからサブルーチンだけをインポートする
Script::Sub::Importというモジュールを作成しました
http://d.hatena.ne.jp/perlcodesample/20091130/1258979624
命題はスクリプト内で使っている関数のテストをしたい、なんだよね。
なら、いくつかこんなひどいハックじゃないやり方がある。
まず第一の、そして一番まともな方法としては「モジュール化」を考えるべき。元のスクリプトがこんな感じだとする:
#!/usr/bin/perl
use strict;
main();
sub main {
# pseudocode...
foo(@ARGV);
bar();
}
sub foo { ... }
sub bar { ... }
だったら、こんなlib/MyApp.pmを作って、そこにこんなコードを書いておけばいい:
package MyApp;
use strict;
sub foo { ... }
sub bar { ... }
で、以下のようにスクリプト内で呼び出せばいい。
#!/usr/bin/perl
use strict;
use MyApp;
main();
sub main {
MyApp::foo(@ARGV);
MyApp::bar();
}
これならテストはそれこそ普通のモジュールのテストを書くときのようにすればいい。
でもモジュール化したくない時というのもわかる。例えばlibディレクトリを使わずにスクリプト単体で完結させたい、なんて状況も考えられる。なのでそれは理解できるのだが、それなら以下のように caller()を確認すればメイン関数は走らないので、スクリプトの実行はせずに関数群をrequireできるようになる。
#!/usr/bin/perl
use strict;
main() unless caller(); # perl script.plで呼び出された時は空配列が返るのでmain()実行
# テストスクリプトやその他の場所から呼び出された場合は
# なんらかの値が返るので、実行されない
sub main { ... }
sub foo { ... }
sub bar { ... }
これなら、普通にテストスクリプトでrequireなりなんなりして、スクリプト内の関数をぼこっと使える:
# テストファイル
require 'script.pl';
ok( foo( ... ) );
is( bar(...) );
caller()の手法の代わりに$ENV{TEST}みたいなフラグを使うのもありだろう。
追記:そういえば書こうとして忘れてた。
@tokuhirom: .pl にはほとんど何も書かないのが最近のトレンドなんだけどな。
そうそう。ということで、こういうのでもいいわけです:
package App::MyApp;
use Moose; # or Mouse, or Class::Accessor::Fast, whatever
sub run {
my $self = shift;
$self->foo(@args);
$self->bar();
}
sub foo { ... }
sub bar { ... }
# in script.pl
use strict;
use App::MyApp;
App::MyApp->new()->run(@ARGV); # MooseX::Getoptならもっと簡単
追記終了。
いずれにせよ、いきなりCPANに登録する前に#shibya.pmで聞くとか、ブログでまずつぶやくとかしてみて、一旦回りの評価を聞いてからやってもよかったのではないか。
初心者に道を示すなら特にその辺りには気を遣って欲しいと思う。個人的にはCPANからも削除したほうがいいと思うな。
目黒駅の回転寿司三崎港の自家製しめ鯖のクオリティが半端ない件
目黒駅まで歩いて、飯でも食おうか、となって、特に考えもなく駅前の三崎港へ。
俺は回転寿司だろうがお高い寿司だろうが大好きなのだが、その中でも光り物が大好きだ。一流店の素晴らしい技術の光り物はもちろんうまいのだが、回転寿司の寿司がきついしめ鯖やコハダも大好物だ。
で、この日もしめ鯖を食べようと思い、注文票に「しめ鯖」と書いてお姉さんに渡したわけです。そしたらそれを受け取った後「あ、すみません、うちには普通のしめ鯖と自家製のしめ鯖があるんですがどっちがいいですか?」って聞かれたのです。三崎港はチェーン店なので当然のごとくいつものメニューしかなく、そんなしめ鯖はメニューに載っていない。何も考えずに「良い方で!」と答えた。
そしてでてきたしめ鯖。
たかだか回転寿司のしめ鯖ですよ。はっはっは。ひょい、ぱくっ。
・・・
・・・
・・・
う、うめぇえええええ!
なんだ、このしめ鯖。普通に並の店なんか目じゃないくらいうまい!ちょうどいい〆加減!中身がとろける!うまえぇえええ。
結局おかわりをしてしまう結果に。今から考えても回転寿司で食った寿司の中では抜群にうまかった。メニューに載ってないのは卑怯だよなぁ。それだけのために通ってしまいそうだ。
本日の歩き
Guard vs Scope::Guard
perl 5.8.8 で GuardとScope::Guardを比較してみた。関数が終了したタイミングでコールバックが走るようにした状態で比較。Guardはスコープ終了時に走るscope_guard()とダイナミックガードであるguard()両方で試してみた。
use strict;
use Benchmark qw(cmpthese);
use Scope::Guard;
use Guard;
cmpthese(500_000, {
scope_guard => sub {
my $guard = Scope::Guard->new(sub { 1 });
},
guard_dynamic => sub {
my $guard = guard { 1 };
},
guard => sub {
scope_guard { 1 };
}
});
結果はGuard.pmの*圧勝*
Rate scope_guard guard_dynamic guard
scope_guard 204918/s -- -61% -71%
guard_dynamic 531915/s 160% -- -24%
guard 704225/s 244% 32% --
mlehman恐るべし。
DBIx::Classもこれ使えばいいのに。 Scope::Guard使ってなかった><