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.

2008年07月

前日の夜中に思い立って、レンタカー借りて真鶴→柿田川→御殿場アウトレット行ってきた。今年は河津にいけるかどうか微妙だなぁ。

御殿場は初めて行ったが、よくあるアメリカのアウトレットだった。っていうか資本がいつものPremium Outletsだから当たり前。でもちょっと懐かしかったな。思ってたより楽しかった。
    このエントリーをはてなブックマークに追加 mixiチェック

Data::Feed という、フィードを読み込んで処理するためのもの33rpmとを作った。

本当はXML::Feedをパッチするつもりだったんだけど、ソースコード読んだら絶対新規に作ったほうが早い、と思って33rpmと正味2時間半で作った。とりあえずきれいにenclosureとかをサポートしたい、という欲求から始まったんだけど なんか色々と拡張する余地があるものになったと思う。使ってみてー。
    このエントリーをはてなブックマークに追加 mixiチェック

Google::Chartを奪い取りもらいました。で、Google::Chart 0.005000_01をアップしましたよ。

中味は全部Moose。とにかくきれいに、全ての機能を実装するのが目標です。

まだイマイチどういうふうにデータを渡すかって部分が自分の中で統一取れてなくて、どうしようかなぁ、とか思ってるところなんですが、もし良かったら意見くださーい。
    このエントリーをはてなブックマークに追加 mixiチェック

Data::Valve 0.00004をリリースしました。ついでにベンチマークもとってみました。Voila!
daisuke@beefcake Data-Valve$ perl -Mblib benchmark.pl Rate throttler valve throttler 18.8/s -- -99% valve 1951/s 10283% -- daisuke@beefcake
うひゃうひゃ。ちなみにセットアップ的には、Data::ThrottlerはローカルのDB_Fileにデータをためており、Data::Valveはどうホストで走っているKeyedMutexとmemcachedに対してアクセスしております。

なぜこれをいままで自分でかかなかったのか?

面倒くさかったからです。

ちょっとまだちゃんと考えてないけど、kazuhoさんに言われたq4mをストレージにしたData::Valve::Q4Mも作るかも。
    このエントリーをはてなブックマークに追加 mixiチェック

下記ですが、Moose 0.65で直ってますよ!


MooseでRoleを作ります
package Role; use Moose::Role; requires 'foo'; no Moose;
で、このRoleをChildで実装しますが、こいつに親クラスParentがあると仮定します。こんな感じ。
# Parent package Parent; use Moose; has 'foo' => ( is => 'rw', isa => 'Int' ); no Moose; # Child package Child; use Moose; extends 'Parent'; with 'Role'; no Moose;
で、foo()ってattributeがついているんだから、当然Roleのrequiresも満たしてると思いますよね? 満たしてません。

実はMoose::Roleのrequiresによって作成される制限はMoose自身のhasをrequiresの条件を満たす物として認識できないようです。これは既知。なので、以下のようにoverrideしてやる必要があります:
package Child; use Moose; extends 'Parent'; override 'foo' => sub { super() }; with 'Role'; no Moose;
ちなみにnew()で色々と魔法を追加したい場合はaroundを使うといいわけですが、ここにも落とし穴があります。先ほどのParentでaround newをしてみます
package Parent; use Moose; has 'foo' => ( is => 'rw', isa => 'Int' ); around 'new' => sub { my ($next, $class, @args) = @_; # なんかごにょごにょ・・・ return $next->($class, @args); }; no Moose;
ChildはParentから継承しているんだから、Parent::new()およびそのaroundで指定された無名関数が呼ばれると思いますよね?ところがこのままではこのnew()は呼ばれません。

呼ばれるのはnew()から*明示的に*指定されたメソッドと、BUILDだけです。なので、このChildのnew()が呼ばれた時にParentのnew()を呼び出すには、こちらもまたoverrideを使う必要があります
package Child; use Moose; extends 'Parent'; override 'foo' => sub { super() }; override 'new' => sub { super() }; with 'Role'; no Moose;
というわけで皆さん気をつけてくださいね
    このエントリーをはてなブックマークに追加 mixiチェック

友人が書いてたブログを教えてもらったので、過去ログを読んでいたら、その中の登場人物に対してドス黒い感情が芽生えてきた。許すまじ。
    このエントリーをはてなブックマークに追加 mixiチェック

誕生日祝いで代々木上原のJEETENに行ってきました。いやー、本当、うまい。いつのまにか2時間制になっているのが微妙だが・・・しかしうまい。機会があれば予約をした上で是非どうぞ。


ここの鴨の燻製の揚げ物が俺は本当に好きです。
    このエントリーをはてなブックマークに追加 mixiチェック

おお、ピンポイントだぜ。

今日渋谷のモンベルで靴を買おうと思ったんですよ。男性店員に声をかけたらやるきなさそ〜〜〜〜に「は・・・い」。まぁいいよ、それはよくある。サイズある?って聞いたら「は・・・い」

帰ってきたら、なんか足のサイズ計るとか言い出す。え?靴は?

サイズ計りました。靴下持ってます?登山用?持ってるよ!え?ここではけ?ああ、はい・・・

待つこと10分「すみません、ありませんでした」。え?えーと。あれ?それだけ?それで行っちゃうの?え、残された俺は?え?他の客の応対するの?あ、これでおわり?他に薦めるとか、フォローいれるとか、そういうんないんだ?あ、そういう店だったんだ、モンベルって!

今まで懇意にしてましたけど二度と行きませんよ。

誰に聞かれてもモンベルはひどいって言うよ。元々高めの値段設定なんだから、接客くらいちゃんとやってくれてもいいんじゃない?

これからは多少遠くても素直にIBS行きます。みんな、IBS行きましょう。モンベルにリンクなんて絶対はってやらない。
    このエントリーをはてなブックマークに追加 mixiチェック

JCBホールでPUFFY見てきた。PUFFYファンは女の子ばっかりだと思ってたら思っていた以上におじさん男性が多くてちょっぴりDNBK。曲は半分以上知らなかったけど、とても楽しかった。

今日拾ってきたキーワード:× 乙女座 ○ 水瓶座のA型、 スイカ泥棒、ドラマーは元ユニコーン、右が亜美、左が由美。
    このエントリーをはてなブックマークに追加 mixiチェック

昨日から思い立ってData::Valveというものを書いてみました。XS混じりのスロットリング用モジュールです。

Data::Throttlerでも同じような事ができるわけですが、こっちは内部が非常にごつい。しかも拡張しにくい事この上ない。アクセッサーとか全くないんだぜ?

ってことでData::Throttlerとほぼ同等のAPIを持って、内部構成を完全に書き直しました。

Data::Valveは内部の基本スロットリングロジックはものすごく簡単なCで書いてます。単純にスロットリング判定が行われた時間を保存したリンクドリストを格納しておいて、その数と現在時刻からのインターバルを持って計算するだけです。

ただ、キモはこの計算を行うデータ構造体をシリアライズ・デシリアライズすることによって、外部媒体にこのデータを保存して、複数プロセスどころか複数ホスト間で共有できるようにしたところです。なので当然のごとくData::Valve::BucketStore::Memcachedというものを使ってMemcachedにデータを保存できるようになっています。
use Data::Valve; my $valve = Data::Valve->new( interval => 10, max_items => 5, bucket_store => { module => "Memcached", args => { memcached => { module => "libmemcached", args => { servers => [ '127.0.0.1:11211', '127.0.0.1:11212' ], namespace => "blah blah" } } } } );
これもData::Throttler::Memcachedで僕は一度やってますが、Data::Throttlerの子クラスとかだと内部データが異様に重いのでシリアライズするのが実は意外とボトルネックだったのと、ロッキングどうすればいいんじゃーと思って放っておいたりしたので、今回はその辺りもちゃんとやりました。

ロッキングにはKeyedMutexを使ってます。KeyedMutexはkeyedmutexdをどこかのサーバーに立ち上げておけば、そいつを使って複数クライアントがロックを共有できるという優れものです。CPANからKeyedMutexをインストールするとkeyedmutexdももれなく一緒についてきます。Data::Valveはデフォルトではローカルホストのkeyedmutexdに接続を試みますが、もちろん別ホストも指定できます。

Data::Valve->new( bucket_store => { module => "Memcached", args => { mutex => { sock => "hostname:port" }, .... );
ちなみに複数ホスト・複数プロセス間でスロットリングを共有する場合は、その設定をちゃんとシンクロさせるのは人間の責任です。

是非使ってみてください!
    このエントリーをはてなブックマークに追加 mixiチェック

Mvalveをリリースして、色々機能改善をする前にベンチマークを書こうと思いました。なのでまずQueue::Q4Mにてベンチマークですよ。

Queue::Q4M 0.00007のmiscディレクトリ内にベンチマークがあります。ってことで、以下の条件でベンチマーク走らせてみました

  1. ストレートに1000件入力してから1000件全部conditional無しで抽出する
  2. 1000件+その約50倍のダミーデータの中から、conditionalにマッチする1000件を全部抽出する
という2パターンで実験した結果が以下の通り

>> executing default + Start Tue Jul 8 01:54:44 2008 + End Tue Jul 8 01:54:53 2008 + Processed 1000 messages in 8.18263006210327 secs, average 0.00818263006210327 mess/sec >> executing conditional + Start Tue Jul 8 01:54:53 2008 + End Tue Jul 8 01:55:00 2008 + Created 1000 items and 49824 dummies (dummy rate = 0.98) + Processed 1000 messages in 7.57972812652588 secs, average 0.00757972812652588 mess/sec
おお、遜色ない!SUGEEE。

その後id:kazuhoさんと話した結果、こういう使い方をするとあとでデータ圧縮が走るときに大分時間かかるかも、だそうです。それはそれでまた考えて使わないといけないですな。

ちなみにコンパクションが走るタイミングは.q4mファイルが16MB以上、かつそのファイル内の空き容量が75%以上ある時だそうです。いつこれが起こるかはアプリケーション依存ですな。でも必ず起こるそうです。
    このエントリーをはてなブックマークに追加 mixiチェック

今朝めざましテレビを見ていたら洞爺湖サミットでプレス用に配っているプレスキットについて紹介していたんだが、これがひどい。なにがひどいって、プレスキットが入っている袋である。

「北海道」「洞爺湖」「サミット」と横書きの文字列が3行に渡って書いてあるのだが、どうみても普通のMS明朝のようなフォントでぼこっとプリントしただけに見える。日本の威信をかけてもう少しまともなデザイナーに頼めなかったのでしょうか・・・(うちとか)

しかしフォントが気になるようになったというのも、あからさまにこの仕事を始めてからの門前の小僧状態のおかげだなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック

Mvalveという物をリリースしてみました。読み方は・・・「ムバルブ」かな。要はMessage Valveです。多分初めて?の半分以上共作なCPANモジュールです。

MvalveはQ4Mをベースにしたスロットリング機能付きメッセージパイプです。主な機能としては (1) スロットリングの影響を全く受けない「緊急キュー」 (2) 普通メッセージのスロットリング (3) スロットリングされたメッセージのリキュー を簡単なインターフェースで実現します。

まだドキュメントとかなんもないので色々コメントいただけるとありがたいです。ソースコードはcodereposに置いてあります
    このエントリーをはてなブックマークに追加 mixiチェック

弁当を作っているとどうしても白米があまるので、それを定期的に消費しております。先週末はそんな日。

土曜日はまず中華風に。細切りにした豚肉、貝柱、タマネギ、ニンニクを炒める。エリンギもちょっとだけ残ってたので入れちゃう。味付けはなんだったかな。塩胡椒、醤油、酒、豆鼓醤。とろみを溶き片栗粉で加えて、最後にごま油で風味付けしておしまい。ご飯は基本の炒飯って感じで、塩胡椒とごま油。ピーマンの残ってたのがそろそろやばかったのでそれも一緒にいためる。ピーマンは火を入れすぎるとえぐくなるから、最後にさくっと炒めるといいよ!で、ご飯を盛って、その上にあんをかけて、あんかけ炒飯のできあがり。本当は貝柱の変わりにエビをいれてなかったんだけど、エビがたかかったんだよねぇ。

さて、日曜日。土曜日で全部ご飯を使い尽くしたと思ったらまだまるまる一食分残っていやがった。ちっ。ならば今回は洋風です。トマトをサイコロ状に切って、タマネギと、これまたサイコロ状に切った鶏もも肉と一緒に炒めます。味付けはオレガノ、コンソメをひとつと、ワインと、塩胡椒で調節。

DSCN0055s.jpg
さて、それを弱火でぐつぐつ言わしている間にご飯。まずみじん切りにしたタマネギとニンニクをオリーブオイルで炒めて、いい加減になってきた解凍してきたご飯を一緒に炒めます。油はあんまり入れすぎるとくどいので注意。そこにローズマリーとコリアンダーの香辛料をお好きなだけ。塩胡椒は軽めに。ちょっと味が分かるくらい。ご飯がばらけて、香りがたってきたらできあがり。

トマトと鶏肉のほうにもどって、水加減を調整。あんまり水が多すぎても少なすぎても駄目。カレー粉を小さじ山盛り一杯分くらい加えて、ちょっぴりスパイシーにします。適当にまぜて、味の調節ができたらおしまい。

今回はカレーっぽい盛り方にしてみました。トマトがうまい!

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

先日ひょんなことから珍しくAVなんぞ鑑賞したんですね。もとい、自分では滅多に見ない系のAVを鑑賞する機会があったんですね。AVってAdult Videoですよ、Array Valueじゃないからね☆

さて。見たのは「ATHLETE 全裸空手」というものです。

びびりました。調べてみたら企画自体はもう大分前から在るシリーズらしいのですが、そのビデオ、最初から空手の組み手とかを女性がやってる。もちろん胴着は着てます。しかし、その次は下着です。その次は下着(接写)、全裸、全裸(接写)、その後組み手を上半身だけ裸で、とか。拳を突き出したり、けりを出す度に胸が揺れるのをずっと見てるわけです。

・・・正直おもしろかった!笑いが止まらないw

結局最後まで見てないので絡みとかがあるかどうかさえ不明なんですが、もうただただ企画があほらしく、それと同時に女優さんの仏頂面というか、半分切れてる顔がなんとも言えず。久しぶりにこんなん見入ってしまった。抜けもしないのに。

一回見たらおなかいっぱいですが、シュールな感じで結構楽しめると思います。しかし、これを本気ではぁはぁ言いながら見るヤツいるのかなぁ。
    このエントリーをはてなブックマークに追加 mixiチェック

IKEAに行ってきました。港北にあるほう。

千葉のIKEAは実はオープン当日に行ってたりします。今回港北のほうに行こうと思ったのはただ単純に近いからなわけだが、今回調べて初めて東急東横線田園調布駅からシャトルバスなんて出ているということを発見した。面倒だなぁ、と思ってたんだが、これが結構便利。時間を合わせなくてはいけないのが面倒かもしれんが、それ以外はそもそも近いし無料だしバスは快適だし、良いことずくめだわ。

ちなみに今回は208円分の買い物しました。つまり冷やかしですね。てへ☆
    このエントリーをはてなブックマークに追加 mixiチェック

http://dann.g.hatena.ne.jp/dann/20080702/p4

MooseX::Getoptを紹介するならMooseX::ConfigFromFileも是非どうぞ。
package MyApp; use Moose; with 'MooseX::Getopt'; with 'MooseX::ConfigFromFile'; # 引数の設定・・・ no Moose; sub get_config_from_file { my ($self, $file) = @_; # ファイルから読み込む・・・ return \%config; }

これだけでコマンドラインからも、設定ファイルからも引数を渡せるよ!
ちなみにget_config_from_fileの部分は、Config::Anyを使いたいので、以下のようにしている
sub get_config_from_file my( $class, $file ) = @_; if (! $file || ! -f $file) { return {}; } my $cfg = Config::Any->load_files({ files => [ $file ], use_ext => 1, driver_args => { General => { -LowerCaseNames => 1 } } }); return $cfg->[0]->{$file} or die "Could not load $file"; }
あと、一つのプロジェクトでこういうスクリプトがたくさんある場合は、これ全体をRoleにしてしまうと便利。
package MyApp; use Moose; with 'MyApp::WithConfigFile'; no Moose;
簡単ですね!これがふと目を離した隙に(?)いつのまにやらスタッフにコミットされてて、使ってみたらすげぇ重宝してる。
    このエントリーをはてなブックマークに追加 mixiチェック

開発環境の話をよく振られます。

「牧さん何使ってるの?」って言われて、なんかすごい装備を使ってるんじゃないかという期待の目を見てしまうとちょっと申し訳なくなってしまい、ちょっと言葉が出なくなってしまうのですが、「え・・・vim」としか言えません。

理由はシンプルです。大学時代はずっとラボにあったSPARC II状でXEmacs使ってました。で、その後某NetAppに入社したとき、XEmacsがインストールされてなかったんですね。っていうか、それ以前にあちこちのマシンでvi/vimはあるけどemacsはねぇ、的なマシンがあったりして、いちいちそのたびに新しいやり方を覚えなくてはいけなくなって、もういやになったのです。

結論としては「特定の環境に依存するようだと面倒くさい」という結果に落ち着きました。UNIXに依存はちょっとどうやってもはずせなかったけど、せめてエディタくらいは必要最低限のAPIだけ自分が動けるようにしたかったわけです。

それだけ決めたら、あとは「どこに行ってもviだけはあるだろうから、せめてvimで落ち着こう」「プラグインとかはなるたけ最小限に抑えよう」という2つのポリシーの元、vimをほぼインストール時の機能のまんま使っております。

僕のvimrcはほぼこれだけです。
syntax on hi Comment ctermfg=yellow cterm=none hi Constant ctermfg=green cterm=none set noautoindent set nosmartindent set nocompatible set nohlsearch set showmatch set backspace=indent,eol,start set tabstop=4 set shiftwidth=4 set binary noeol set t_kb=^? set vb fixdel set expandtab au BufNewFile,BufRead *.t set ft=perl au BufNewFile,BufRead *.cgi set ft=perl set enc=utf-8

特にすごい機能は何も使ってません。あ、設定の半分くらい意味わかってません。コピペしたら自分の思い通りの機能だったから使ってる、っての結構あります。なんか必要になったら:!perl -eとかしちゃって適当にいじくってます。マクロ定義とかもすればいいんだろうけど、別にいらねぇや、とか思ってなんもしてません。screenも使ってません。:eで事足りてます。

なので、おいらはvimさえあればだいたいどこででも開発できるよ!って話でした。
    このエントリーをはてなブックマークに追加 mixiチェック
カテゴリー
記事検索
メッセージ

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

このページのトップヘ