とりあえずwikiを移動させて、プレゼンをアップしておきました
2008年11月
スズキをさばくの巻
60cm超えのスズキをBar 30の沼田さんからいただいたので、早速持って帰ってさばいた。
まず鱗を取る。俺は鱗取りはもってない。が、もう数年前から鱗を取るのに鱗取りを使ったことがない。こういうスパチュラを、半身から背骨をはがすときのように少し立てながらしっぽ側から鱗に食い込ませるとあらよあらよという間に鱗が取れる。鱗取りより気持ちよいので是非やってみるとよいと思う。
続いて内臓をばらす。こういうでかい魚をさばくのは初めてなのでエラの取り方がよくわからなかったのだが、エラまわりを触ってみて、切らなければ取れないと思われるあたりにあたりをつけてざくざくと。その後は定石通りに尻のほうから開いて内臓、浮き袋、エラをとりわける。
きれいに血を洗ってから今度は頭を落とすのだが、これも一瞬どこから落とすのか迷った。でも絶対に首を折るように曲げられるところからでなければ包丁がそもそも通らないはずなので、首を上方向に持ち上げて曲がる関節の部分から推測して2方向から包丁を入れたら簡単にとれた。切り身の形から判断してもいつも見るあれとほぼ一緒なので、間違っていないはず。
その後は普通に3枚におろした。刺身で食うのもありかとは思ったんだが、使い勝手を考えるとざく切りのほうがよろしそうだったので、大きめのざく切りにして塩をふってしばらく置いておく事にする。しっぽのほうの部分は間に昆布を挟んでおいた。明日くらいにはまた水がでてるだろうから一回水を切って、明後日くらいから食べ始めるかなー。
ちなみにアラは沼田さんがさばいた分も一個もらってきたのでスズキ2本分で本日はアラの煮付けとする予定。楽しみだ。むふふ。
*****
追記:ムニエルにして食べました。すげぇうまいうまいうまい。
Chinese Democracy
曲が流出しちゃったりなんだりでもうあちこちから音源を手に入れられる状態だったGN'Rの14億円の都市伝説アルバム「Chinese Democracy」がとうとうリリースですよ。おいらは昨日音源を手に入れてはいたけど、我慢して解凍せず、今朝お店が開く時間までタリーズで原稿書いてから買ってきた。一緒にポスターついてた。いらない。もういらないよ!せめて俺がまだ20代の頃にくれ><
ともあれ、今最初の三曲を聴き終えたところで、割と良い感じ。俺はやっぱり歌詞が好きだ。Axlの歌詞は俺にはとても刺さる。ボーカルは・・・そりゃ全盛期じゃねぇよ・・・全盛期じゃないけど、Axl Roseが新しい曲歌ってるよ。うう、おいらの青春・・・。
しかしGN'Rはこれ以降アルバムを出すことはあるのだろうか。なんかこのアルバムはそれまでの負債の精算としてどうしても出さなければいけない感じがしたけど、これ以降Axlにお金を出してくれるところなんてあるんかいな。一応今後どうなるから気になるから、是非もう1,2作は出していただきたいものだ。
JPAに仮決定
長らくTPFJ(仮)として各種ミーティングをやってきましたが、もう時間もないし、なんとなく字面もいいので"Japan Perl Association"、略してjperlかJPeAで仮決定とします。すみません、面白くなくて。でも真面目な団体だからさ・・・
とはいえ、これでもまだ仮決定ですので、変更の余地はあります。取り急ぎ名称変更を望むのであれば締め切りは12/1ですよ。まぁ名義なんて後でいつでも変えられるけどね。意見等ありましたら、Wassr/twitter/IRCでlestrratに話しかけてください。
TPFJプリミーティング#4
TPFJ(仮)プリミーティング#4やってきました。
わくわくしながら待っていたのに残念ながらdankogai氏とoyama氏が現れませんでしたw どちらにしろお話はさせていただきますので、また次回ミーティング(未定。下記参照)か法人設立後にでも。
なお、席が空いたので奇遇ですねnite #1の面々も一緒になりましたよ。
今回は割と印象的なフレーズが出てきた会でした。
- Perlはライフハックツールである!
- 第二言語としてのPerl(Perl as a Second Language)
- Perlを熱く語るのは恥ずかしくない(おもに我々Perlユーザー向け)
- KDDI Web Communicationsさんからサーバーを貸していただけるかも!そしたらVPSで検証とか色々できるんじゃなかろうか。
- あと、そのレン鯖での動作保証とか検証する
こちらは自分的にやったらいいんじゃないか的メモ
- CGI::Wizard (コアモジュールのみで)
- ワンライナーや細かいツールのレポジトリ、および逆引きサイト
- ビギナーパック(必要なモジュールとか全部入ってる)
なんかだんだん話が具体的になってきましたね。まだまだ賛同企業募集中ですので、「うちもPerl技術者の底上げがしたい」「Perl技術者をもっと採用しやすくしたい」と思っている方やPerl業界の今後になんらかの形で手助けをしていただける可能性のある方は是非こちらに企業名・担当者名を書いておいていただけるとたすかります。
この活動はPerlコミュニティのポテンシャルが高すぎて面白すぎる反面、あまりにもエントロピーが高くて拡散してしまいそうなのをどうひとつの方向にまとめるのが一番のポイントだなーと痛感しはじめてきました。
ちなみに#5は今のところやる予定はありませんが、もし「一度ちゃんと話を聞きたい!」という方がいる場合はwikiのほうにページを作ってみてください。人数が集まるようでしたら、企画いたします。
富士そば
今朝は朝ご飯が家になく、あまりにも腹が減ったので会社に出てくる前に富士そばに寄ってきた。天玉そばうます。富士そばに限らず、こういう手軽な蕎麦屋全般、大好き。安いし早いし、俺の大好きな蕎麦だし。
で、食べながらやっぱり富士そばは関西店は出汁が違うのかなぁ?とか考えていて、さっき調べてみたら関西圏には富士そばは一件もなかった。なんだ、比較にならん。全国チェーンの蕎麦屋とかないのかね。そういう場合はやっぱり味を変えるのかなぁ。吉牛とかもちがったりするのかね。
九州出身の相方と一回行ったときに「汁が黒い・・・」としみじみとされたのでなんとなく思った次第であります。
Speed is NOT Power, Power is not success
さて、昨日からなんか熱が入っているWAFベンチ大会なんですが、あのベンチ結果は基本的にはただのHello, Worldなので、どれだけ高速にHTTPリクエストを受け取ってから、クライアントにHello, Worldの文字列を送り返すか、というそれだけのベンチです。
そして、この部分を速くするために、新興フレームワークのそれぞれはものすごいマイクロオプティミゼーションを行っているので、そこに普通の感覚でコードを重ねていけば当然スピードは一気に劣化するでしょうし、そこからどれだけコードを追加するのかはもうケースバイケースです。
逆に、Catalyst等のフレームワークは、追加する必要のあるコードがかなり少な目に抑えられますが、シンプルなアプリケーションには明らかに重すぎるわけですね。
掲示板を書くならMENTA/Yacafi/NanoA等でよいでしょう。もっと巨大で複雑なシステムを書くのにそれらを使うと多分書くコードの量がはるかに多くなり、人的コストがかかるでしょうから、Catalystのほうが全然楽でしょう。
かといって、全てにCatalystが対応できるわけじゃなし・・・。そういうわけで、TPOを知りましょう。
(TODO: TPF-J(仮)的には、MENTA/Yacafi/NanoAのうちのどれかを「PHPの代わり」として押したい)
App::Benchmark::WAF
tokuhirom/yappo/kazuho/hidekさんあたりが軽量なWAFの開発をなんか熱病に浮かされたかのようにしはじめたので、こりゃ負けてられないとApp::Benchmark::WAFを書きましたよ。
Apache::Testを使って、apacheから実際にHTTPリクエストサイクルを通って、CGIモードとmodperl(メモリに一度載せたらそれを再利用)する状態でベンチを取れるようにした。"make test"とすれば全てのフレームワークに対してab -c 100 -n 1000して計測する。
現在実装している中で、俺のMacBook上での計測値は以下の通り:
[11/13 12:00]
# [cgi-app (cgi)]: 22.49 [#/sec] (mean)
# [cgi-object (cgi)]: 28.05 [#/sec] (mean)
# [cgi (cgi)]: 156.49 [#/sec] (mean)
# [http-engine (cgi)]: 2.39 [#/sec] (mean)
# [menta-nocompile (cgi)]: 103.25 [#/sec] (mean)
# [menta (cgi)]: 123.22 [#/sec] (mean)
# [nanoa (cgi)]: 84.84 [#/sec] (mean)
# [yacafi-packed (cgi)]: 117.12 [#/sec] (mean)
# [yacafi (cgi)]: 110.72 [#/sec] (mean)
# [catalyst (modperl)]: 182.26 [#/sec] (mean)
# [cgi-app (modperl)]: 809.98 [#/sec] (mean)
# [cgi-object (modperl)]: 1194.43 [#/sec] (mean)
# [cgi (modperl)]: 1571.60 [#/sec] (mean)
# [http-engine (modperl)]: 766.97 [#/sec] (mean)
# [nanoa (modperl)]: 857.54 [#/sec] (mean)
まぁ生のCGIとかは正直開発のコストパフォーマンスを考えるといくら速くてもありえないんだけど、ある程度の指標にはなるね。
ちなみにCatalyst/Mojoはまだちゃんと作ってない。明日には多分新しい数値がでてると思う。
これより下は、過去の計測結果。
[11/13 11:00]
# [cgi-app (cgi)]: 26.04 [#/sec] (mean)
# [cgi-object (cgi)]: 34.93 [#/sec] (mean)
# [cgi (cgi)]: 170.54 [#/sec] (mean)
# [http-engine (cgi)]: 3.04 [#/sec] (mean)
# [menta-nocompile (cgi)]: 118.41 [#/sec] (mean)
# [menta (cgi)]: 136.35 [#/sec] (mean)
# [nanoa (cgi)]: 108.99 [#/sec] (mean)
# [yacafi-packed (cgi)]: 142.30 [#/sec] (mean)
# [yacafi (cgi)]: 137.94 [#/sec] (mean)
# [catalyst (modperl)]: 223.71 [#/sec] (mean)
# [cgi-app (modperl)]: 889.85 [#/sec] (mean)
# [cgi-object (modperl)]: 1260.74 [#/sec] (mean)
# [cgi (modperl)]: 1754.09 [#/sec] (mean)
# [http-engine (modperl)]: 776.04 [#/sec] (mean)
# [nanoa (modperl)]: 988.89 [#/sec] (mean)
[11/13 03:00]
# [cgi-app (cgi)]: 28.01 [#/sec] (mean)
# [cgi-object (cgi)]: 34.92 [#/sec] (mean)
# [cgi (cgi)]: 167.27 [#/sec] (mean)
# [http-engine (cgi)]: 2.83 [#/sec] (mean)
# [menta (cgi)]: 51.60 [#/sec] (mean)
# [menta (cgi)]: 60.31 [#/sec] (mean)
# [nanoa (cgi)]: 99.48 [#/sec] (mean)
# [yacafi (cgi)]: 125.62 [#/sec] (mean)
# [catalyst (modperl)]: 148.17 [#/sec] (mean)
# [cgi-app (modperl)]: 635.42 [#/sec] (mean)
# [cgi-object (modperl)]: 1060.14 [#/sec] (mean)
# [cgi (modperl)]: 1406.93 [#/sec] (mean)
# [nanoa (modperl)]: 522.71 [#/sec] (mean)
# [http-engine (modperl)]: 610.42 [#/sec] (mean)
Data::Visitor::Encode 0.10002
charsbarさんに指摘されて、色々と問題点が発覚したのでテストコードをリファクタリングして、新しいバージョンをさきほどアップしました!
TPFJプリミーティング#3
TPFJプリミーティング#3やってきました。
今回はキャンセル3名、急遽参加が6名という、ひじょうにわさわさした回でしたが、なんかすごいまともに話した、という気がした会でした。話の内容ももう3回目だし、ここで色々とりあげてるので、ざっくり話してあとは意見交換や、これまでの会ででてきた話を1時間ちょいくらい、あとは楽しい呑みでした。
特に急遽参加組のDeNAの能登さんからは賛同に関して前向きな発言をしていただけたので、俄然やる気がでました。ありがとうございまありがとうございますありがとうございます。
本当はもう少し議事録的な事を書きたいのですが、今日はメモをしていた携帯を忘れてしまったのであとは雑感等をかきます:
- 経費項目を求人に、というのは(僕は前回話をされるまで知らなかったですが)どうやら結構ツボをついた話のよう。ikebe++
- オブザーバー兼注文係の方達は大歓迎でしたが、次回から炭水化物控えめでお願いいたします。
- ちなみに最後にバーで話した内容は大変参考になってますので、めげずに熱く語ってください。hidekさん、社会貢献事業という名目で社外活動しようよー
- 途中からは弊社社員が女性参加者にひどいセクハラをしていました。本当に申し訳ありません。
- 該当社員から今朝このブログを書いている時に「牧さんがセクハラしてましたよ」と言ってましたが、俺のほうが先にエントリを書いたのでセクハラをしたのはあっちです。あ、hirose31さんもセクハラに参加してました。
- tomyheroさん、やっと個体認識できました。すみませんすみません
参加していただけた皆さん、そして参加はしてもらえなかったけれども、Perl業界を活性化させたい!Perl技術者の底上げをしたい!という趣旨に賛同していただけるかもしれない企業とかにツテがあるようでしたら、是非Wikiのほうに書き込んでください。12月以降に資料を持ってもれなく企業詣でにはせ参じます。
TPFJプリミーティング#4もやる方向になってきました。11/13あたりを考えているのですが、良かったら是非どうぞ!次回は多分比較的少人数になる予定なので、もしこれまでの会に参加していただいた方の中で新しいアイデアのある方や、まだ話足りないぜ!的な方がいる場合は参加者数がそんなに多くなければ、是非また参加表明してください。10名前後で定員です。
ともあれ、最後松岡修造 hidekさんたちともう少し突っ込んで話すつもりが、途中で俺がニコチンにやられて顔面蒼白になるという自体になってしまったのでちょっと中途半端なところでお開きになってしまったのであります。すみません>< 正直、あのあと1時間くらいで普通の状態に戻って、まだ飲み足りないとか思ってました。ちきしょう。
あ、あと不肖私と呑みたいと言っていただいた方達は、渋谷近辺であれば週2,3回は呑んでますので、適当に声をかけてくださいね!
XML::LibXML::XPathExpression
XML::LibXML 1.67から、使用頻度の高いXPathを適用するさいに前もってコンパイルできる方法が追加された(1.67は使えないので、1.68)。それがXML::LibXML::XPathExpression。同じXPathをコンパイルした場合、しなかった場合、それぞれの比較のベンチマーク結果は以下の通り:
Rate compiled regular
compiled 27322/s -- -11%
regular 30675/s 12% --
約一割か・・・微妙・・・。コードは以下の通り:
use strict;
use Benchmark qw(cmpthese);
use XML::LibXML 1.68;
my $xml = XML::LibXML->new->parse_string(<<EOXML
<foo>
<bar>1</bar>
<bar>2</bar>
</foo>
EOXML
my $xpath = '/foo/bar';
my $compiled_xpath = XML::LibXML::XPathExpression->new($xpath);
cmpthese(100_000, {
compiled => sub {
$xml->findnodes($xpath);
},
regular => sub {
$xml->findnodes($compiled_xpath);
}
});
XML::LibXML 1.67はちょっと駄目駄目ちゃん
XPathExpressionがサポートされてやった!と思っていたら、Mac OSX 10.5.5についてくるlibxml2 2.6.16だとコンパイル通らない。xmlTextReaderErrorFuncでsyntax errorとか、なんじゃこりゃ?という感じ。
を追加。これでとりあえずコンパイルは通る。が、t/30xpathcontext.tが落ちる。ちょっと理由は不明。
一応修正を試みてみた。まず、なんかしらんけどSchema系のところでこけるので、とりあえずSchemaを無理矢理黙らす。多分、xmlSchemaSAXPlugPtrという型が2.6.16と2.6.21とかあたりの間で足されただけだとは思うんだけど、そもそもどこで使われてるか探し出すのが面倒なので、とりあえず、Schema全体をオフするために、63行目に
#undef LIBXML_SCHEMAS_ENABLED
を追加。次に、Reader系のところも黙らすために114行目から、118行目をifdefでさくっとくくる
#ifdef LIBXML_READER_SUPPORT
/* error handling */
xmlTextReaderErrorFunc errorFunc; /* callback function */
void *errorFuncArg; /* callback function user argument */
#endif
あと、もうひとつただのifdefの構文エラーがあるので、そいつを修正2262行目で、
int well_formed;
を追加。これでとりあえずコンパイルは通る。が、t/30xpathcontext.tが落ちる。ちょっと理由は不明。
とりあえず、このバージョンはちょっと使えなさそう〜。ちなみにRTで報告しようと思ったのだが、まだRTに1.67がなかった><
あとで報告する。
PerlからDBを触るとき、どんな手段を使う?
Perl使いがもっとも使うDB処理ツールってなんなんだろうと思い立って、ちょっとアンケートを作ってみました。
実際にみんなどんなふうにコードを書いているのか知りたいので、初心者から上級者まで、いろんな人に書き込んでもらえるとうれしいです
TPF-J 進捗
TPF-J用の仮Wikiを作った!というのは前も書いたけど、賛同企業のあたりを夢も込めて色々かいてみたりした。あとは活動内容等々。疑問点的な事もがんがん連絡してくれれば、解消できるようがんばります!
あと飲み会#3は明日開催です。soozy.orgが若干食あたり気味調子が悪そうなので、TPF-J Wikiの中にも避難場所を作っておきました。
週末の歩き
11/1、ありえないくらいの秋晴れの中、太子堂〜池尻、そこから豪徳寺まで歩いた。緑道は本当、その自治体の経済力を如実に現しておもしろい。帰って、ラザニア作った。今回はトマトソースを煮つめて、さらに小麦粉を少し加えてとろみを増したら、ラザニアにうまく絡まるようになって、えらい美味い。具は鶏肉のトマトソース、ほうれん草、ホワイトソース、家にあったヤールズバーグチーズと、普通のとろけるチーズ。あともちろんラザニア。多分いままで作った中でいちばん美味かった。
翌11/2は呑川緑道を歩いてきた。コースは桜新町から、都立大学を通って緑が丘、そして最終的に自由が丘。だいたい12キロくらいかな。
呑川緑道はすごくすごくよかった。桜がいっぱい。駅の距離とかを考えなければ、正直会社をここに置きたい、って感じ。もちろん、高そうだけどな。いまだに普通に億ションが売りにでておりましたよ。
緑が丘からは呑川緑道ではなく、九品仏緑道。自由が丘までは一瞬だった。自由が丘でお茶して、二子玉川に寄って、帰宅。世田谷エリアはだいたい歩いたかなぁ。井の頭線沿線はまだ歩いてない。
夜は蕎麦を茹でて、鰯の梅煮を作った。うまし。
Bread::Boardコミッターになりました
さっそく全部のクラスをimmutableにしてみて、差を計測してみた
# With Immutable Classes
timethis 10000: 32 wallclock secs (30.82 usr + 0.26 sys = 31.08 CPU) @ 321.75/s (n=10000)
# Without Immutable Classes
daisuke@beefcake-7 trunk$ perl benchmark.pl
timethis 10000: 75 wallclock secs (73.32 usr + 0.51 sys = 73.83 CPU) @ 135.45/s (n=10000)
わお!immutableしただけでこれかよ!
コードはこれだけだよ
use strict;
use Benchmark qw(timethis);
use Bread::Board;
timethis(10_000, sub {
my $c = container 'MyApp' => as {
service 'log_file_name' => "logfile.log";
service 'logger' => (
class => 'FileLogger',
lifecycle => 'Singleton',
dependencies => [
depends_on('log_file_name'),
]
);
container 'Database' => as {
service 'dsn' => "dbi:sqlite:dbname=my-app.db";
service 'username' => "user234";
service 'password' => "****";
service 'dbh' => (
block => sub {
my $s = shift;
DBI->connect(
$s->param('dsn'),
$s->param('username'),
$s->param('password'),
) || die "Could not connect";
},
dependencies => wire_names(qw[dsn username password])
);
};
service 'application' => (
class => 'MyApplication',
dependencies => {
logger => depends_on('logger'),
dbh => depends_on('Database/dbh'),
}
);
};
});
TPF-Jプリミーティング#2
順不同メモ。
- ほ。ライブドア社長も賛同してくれているらしい!
- おりをみて各社も是非賛同表明してくれるとうれしい。賛同者数が多ければ多いほど会費を減らせるですよ。
- もうぐっとくるね。Perlコミュニティの人たちは本当懐が深いよ。
- ともあれ、このサブテカ会から特にちゃちゃが入らなかったと言うことはTPF-Jはいける、という感触
- 会費を狙い、広報部門をねらうのもいいが、人事部の採用費用として売り込むのもいい。
- 例えばリクルートに広告を出すのを一回我慢すると、TPF-Jの会費になるよ!とか
- 具体的な名前はでなかったけど、ikebeさんは理事に加えたいと思った。
- 駄目だ、今はこれ以上無理。後で追記する
- とりあえずメモ。鳥取はいい。島根は微妙だ。