D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2009年12月

なんとなくLDRでtwitterのPerlに関する発言を検索した結果を購読してたんだけど、面倒くさくなってきたので、@perlismに投稿するボットを作った。単純にPerl関連の発言を持ってくるボットです。とりあえず日本語限定。よかったらフォローどうぞ。
    このエントリーをはてなブックマークに追加 mixiチェック

アメリカにいた頃はターキーとか、日本に帰ってきてから去年まで3年間ぐらい毎年チキンを焼いてたんだけど、ことしはラムにしました。ラム!ラム!ラム!でっかいラム!

ラムはもちろんThe Meat Guyで購入。ラムリブラック8本!アドレナリンー!冷凍で来るので、二晩前から冷蔵庫で自然解凍させ、約4時間前くらいに外に出しておいて塩こしょう、それに脂身のほうに串で穴を開けてその穴にローズマリーを詰めておくという作業を施しておいて寝かしておいた。これでしばらく放置。

その間にミートソースを作成。といっても肉はあるので肉はあくまで出汁用。ハナマサで買ってきたでっかいタマネギ3個を盛大にみじん切りにして炒めて、チョップドトマトと肉と合わせてブイヨン、塩こしょう。コクを出したいので炒めるのとは別に少しオリーブオイル追加。あとは適当にハーブ(といってもオレガノくらい)。

客人が来てから肉は料理開始。まず熱くしたフライパンで一気に焼き目をつける。もうこの時点でうまそう。うひー。脂身側を若干念入りに焼き付けて、200度のオーブンへ。あとは待つだけ。20分焼いて、その後様子を見ながら10分前後調整。

もちろんこの間にパスタもゆでておく。今回はショートパスタにした。

091226_1823~01.JPG
で、できあがったのがこれ。ラム肉久しぶり。ジンギスカンはうまいけど、あれじゃあ薄切り肉じゃん?これだとレアな塊肉にありつける。この瞬間のために朝から絶食しててよかった。うますぎて泣けた。

ラム肉は癖があるけど、旨味という意味では同じ赤身でも普段食べてる牛肉とかは凌駕すると思う。もしお肉が好きなら是非どうぞ!Meat Guyならいつでもこの塊を買えるよ!

    このエントリーをはてなブックマークに追加 mixiチェック

最近、miyagawaさんが書いたこちらののツールを多少改変したものを使ってlocal::lib環境にCatalystアプリの全依存関係を突っ込んでからデプロイ、ということをしていました。

が、このツール自体をコピペするのに疲れました。なのでApp::BundleDepsModule::Install::Bundle::LocalLibというものを作りましたよ!M::I::Bundle::LocalLibのほうはMakefile.PLに1行だけ記述を入れておくとmake bundle_local_libと書くだけで./extlibにlocal::lib環境を作ってくれるというものです。

俺的には超便利!

想定している使い方はApp::BundleDepsのPOD(cpan github)を見てもらうのが一番よいかもしれません。

これを使うとCatalystアプリのバージョン違いなんかのデプロイを比較的気軽に行う事ができるようになるので、是非さわってみて感想なんかを教えていただけると幸いです。

あと、自分ではそんなに使わないんだけど折角Platypus対応コードをmiyagawaさんが書いてたので、それも同様にあげといたです

追記: Platypusのほうは make platypusってできるように0.00002で変更しておきました
    このエントリーをはてなブックマークに追加 mixiチェック

九段下→旧吉良邸とか→西大島→砂町銀座→南砂町
    このエントリーをはてなブックマークに追加 mixiチェック

某所での会話:
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でなんか書くってのもなくなってきたけどね
    このエントリーをはてなブックマークに追加 mixiチェック

いつも行く本屋でいつもなんとなく気になってはいたものの、購入まで至ってなかったCOPPELION。

パンチラの描き方にカサハラテツロー氏と同じ匂いを感じるので「きっとこの人はパンチラが描きたいんだろうなぁ」と思いつつ4巻まで一気に読んだ。

今のところ、力押しなキャラ設定だけど、話の流れが結構良い。この後(あおりに能力がどうのこうの書いてあったから、スタンド的な意味で)ジョジョみたいにならないといいなぁ。荒廃した東京のサバイバルをもう少し読みたい気がする。
    このエントリーをはてなブックマークに追加 mixiチェック

相方がなんか突然買ってきた。妖怪物なので好き嫌いは分かれるとは思うが、これは自分はアレルギーは出ず、結構楽しめた。

難を言えば、これと言ったオススメポイントもないところか・・・。 話はきちんとできてるし、キャラもたってるんだが、強烈に記憶に残る部分はない感じかな。

まだ2巻までしか読んでないので、今後残りを手に入れた時に期待。
    このエントリーをはてなブックマークに追加 mixiチェック

スクリプトからサブルーチンだけをインポートする
Script::Sub::Importというモジュールを作成しました
http://d.hatena.ne.jp/perlcodesample/20091130/1258979624

これは大変いただけない。perlcodesampleというIDがさらに初心者に信用させがちだからさらにいただけない。なので苦言を呈させてもらう。

命題はスクリプト内で使っている関数のテストをしたい、なんだよね。
なら、いくつかこんなひどいハックじゃないやり方がある。

まず第一の、そして一番まともな方法としては「モジュール化」を考えるべき。元のスクリプトがこんな感じだとする:
#!/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からも削除したほうがいいと思うな。
    このエントリーをはてなブックマークに追加 mixiチェック

目黒駅まで歩いて、飯でも食おうか、となって、特に考えもなく駅前の三崎港へ。

俺は回転寿司だろうがお高い寿司だろうが大好きなのだが、その中でも光り物が大好きだ。一流店の素晴らしい技術の光り物はもちろんうまいのだが、回転寿司の寿司がきついしめ鯖やコハダも大好物だ。

で、この日もしめ鯖を食べようと思い、注文票に「しめ鯖」と書いてお姉さんに渡したわけです。そしたらそれを受け取った後「あ、すみません、うちには普通のしめ鯖と自家製のしめ鯖があるんですがどっちがいいですか?」って聞かれたのです。三崎港はチェーン店なので当然のごとくいつものメニューしかなく、そんなしめ鯖はメニューに載っていない。何も考えずに「良い方で!」と答えた。

そしてでてきたしめ鯖。

たかだか回転寿司のしめ鯖ですよ。はっはっは。ひょい、ぱくっ。

・・・

・・・

・・・

う、うめぇえええええ!

なんだ、このしめ鯖。普通に並の店なんか目じゃないくらいうまい!ちょうどいい〆加減!中身がとろける!うまえぇえええ。

結局おかわりをしてしまう結果に。今から考えても回転寿司で食った寿司の中では抜群にうまかった。メニューに載ってないのは卑怯だよなぁ。それだけのために通ってしまいそうだ。


    このエントリーをはてなブックマークに追加 mixiチェック

三軒茶屋→下馬→学芸大学→西小山→武蔵小山→不動前→目黒

10kmあったかなぁ。多分9kmくらいかな。もう少し歩きたいところだが、今日はこんなもんで。天気よかったなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック

perl 5.8.8 で GuardScope::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使ってなかった><
    このエントリーをはてなブックマークに追加 mixiチェック
カテゴリー
記事検索
メッセージ

名前
メール
本文
アーカイブ

このページのトップヘ