僕ト云フ事

僕ト云フ事

たろマークはてなブックマーク

2009年06月17日

[cgm night]CGM Night 行ってダニーさんに会ってきた

ダニーさんは、秋葉原とかの otaku 文化を海外に紹介してる人でダンストルーパーをやってる人だ。

ひょんなきっかけでそのダニーさんとアンドリューさんが主催してる CGM Night に誘われたので、人見知りがえいやっと参加してまいりました。

2009_06_15_0846

なんというか着いた当初は凄い緊張してました。
ちょっと暑かったのもあって汗かいてたけど冷や汗かと思ったw

目を合わすとみんな凄い笑顔を向けてくるのが印象的だった。ちょっと困ってたのがやっぱり伝わってしまったのだろうかw
そして大体、目を合わすと話しかけられるので助かったり。ありがとう。

2009_06_15_0869

外国の人が多かったけど、僕が話した人はみんな日本語がそのまま通じてた。と言うか、自分の日本語が変だった。
日本語話せる外国人に意味不明な英語で話しかけるというマンガで読んだ光景をやらかしたりもしたw

2009_06_15_0848

彼は「英語とかの問題じゃないよ、コミュニケーションだよ」と教えてくれた。Oren さん。ありがとう。

2009_06_15_0876

この人は外悟空人さん。話口調が凄く丁寧なひとだったw

2009_06_15_0877

フォトグラファーの人と音楽の技術者の人。

あと写真撮れてないけど、常にイノベーションをと言ってた人の話とかは目つきが凄く良かった。
「必ず next google, next amazon があるはずだ。」

2009_06_15_0883

そしてダニーさん。この写真だとよくわからないけど、なんかスターウォーズ系のコスチュームを着てた。結構背丈が大きかった。blog みてても思うけど笑顔がいいですね。

なんかもう色々余裕無くて挙動不審な人になってたけど楽しかったですw

2009年06月15日

[catalyst][perl]最近の Catalyst の構成

最近 Catalyst のエントリをよく見かけるので自分の構成をさらしてみます。コードは CodeRepos にあります。

share - Revision 30441: /lang/perl/Chaostr/trunk

元々は、作ろうとしたアプリがあったんですが、去年の Catalyst confernce 以降、MyApp 的実験場になってます。仕事で作ったものはさらせないので、構成だけ表に出す感じ。ちなみに今のところ Catalyst 5.7 系でしか使ってないです。

あと、Controller クラスのベースで Resources を使ってるけど、自分のやり方は推奨されない使い方をしてます。新規投稿や編集画面用の URL を作るために一度自前 Base クラスを噛ませてたんですが、new, edit はデフォールトであります。Resources の使い方とかはこっちに書きました。

クラス構成

現在の構成をざっと図にするとこんな感じです。

chaostr.png

Config, Log, DB, Validator を Catalyst から切り離して Service(Logic) クラスでも直接扱えるようにしてます。

PseudoRequest については後述。

Chaostr::Class / Chaostr::Role

このあたりは、Angelos インスパイアです。と言うか最初はまるパクリだったw
Angelos::Class は Mouse ですが、Chaostr::Class は Any::Moose で、呼び出し元が Moose だったら、Moose、そうでなければ Mouse になります。Cat 5.8 系で Moose になってもいいようにと。test やコマンドラインからは Mouse がいいなぁと言う感じで。

Chaostr::Class::* は Service クラスで mixin して使用するクラスです。
config, log, db, validator とかも mixin されてます。mixin はこんなやり方でいいのかがちょっとわからない。

Chaostr::Config

tomyhero さんが書いてる CatalystとConfig - perl-mongers.org を見てもらうとわかると思います。

Config::Multi を singleton 化して、どこでも使えるようにしてるよ!
すこし違うのは __path_to()__ とか __uri()__ とかで Path::Class や URI オブジェクトになる点くらい。

Chaostr::Log

Log::Dispatch::Config 使ってます。
extlib に Log::Dispatch::Configurator::Hash というのをこさえてあって、hash から Log::Dispatch::Config::Configurator オブジェクトを作れるようにしてます。

開発中は Log::Dispatch::Colorful を使ってます。Log::Coloful は、Log::Dispatch のメソッドいじったりしてるので、Dumper が必要ない人は yappo さん作の Log::Dispatch::Color 使うといいよ。

$Log::Dispatch::Config::CallerDepth で呼び出し元からの深さを指定してるんだけど、Service から呼んだときと、Catalyst から呼んだときでエラー元の表示が変わってしまってるのが少し悩み。

Validator

FormValidator::LazyWay 使ってます。validator は Catalyst にあればいいかと思ってたんですが、Service クラスに Request を渡しているので Service クラスで validate できても良いなぁと思って切り離してます。

どっちでもできるようにしておいて、なるべく Service 側でできるようにという感じ。

DB

DBIx::Class です。これも Catalyst::Model::Schema::DBIC とかは使わずに自前 Singleton 化して Service クラスでも呼び出せるようにしてます。

Model

Catalyst::Model::MultiAdaptor を使用して、Service クラスが読み込まれる用にしています。
MultiAdaptor は、いくつかの LifeCycle をサポートしてますが、LifeCycle::Singleton に手を入れた LifeCycle::SingletonPerRequest っていうのを作って使ってます。

これは起動時に指定したクラスを require して instance 化するまでは同じですが、その instance 内でリクエスト毎に $c->request と $c->session が Service クラス側のアクセッサに渡ってくるようになってます。

sub install {
    my $self = shift;
    my $instance = $self->create_instance( $self->adapted_class, $self->config );
    Sub::Install::install_sub(
	{   code => sub {
		my ( $component, $context ) = @_;
		$instance->request($context->req);
		$instance->session($context->session);
 
		return $instance;
            },
            into => $self->model_class_name,
            as   => 'ACCEPT_CONTEXT',
	}
    );
}

もうね、Model として切り分けたときに request とか session をいちいち渡すのが面倒になって、「自動で全部渡してしまえ」と思った末の結果です。あとは、メソッド側で使いたいのだけ使えよと。

引数として必要な分だけ渡すと言う作りもできるよ。

後は、FormValidator::LazyWay を validator として使ってます。
validate は Catalyst 側でやればいいと思うんですが、作ってて Service 側でもやりたくなったら使おうくらいの考えで搭載しました。

CLI と test

Model のところ読んで、結局 Catalyst 依存してるじゃんかと思われるかもしれませんが、hash を渡すと request オブジェクトに変えてくれる PseudoRequest というクラスをこさえて、CLI や test も Service クラスを使えるようにしてます。

PseudoRequest にファイルの場所とか教えると $self->request->upload 的なこともできるので、ファイルアップロードのテストまで書けるようにはしたつもり。

参考

参考にしたというか、大元は avmaster さんのAV女優ブログ検索のソースで、この一年ぐらいちまちま育ててた感じです。

2009年04月05日

[apache][ec2]mod_ext_filter でコンテンツを書き換える

EC2 はサーバがアメリカ東海岸(とヨーロッパ)にあるため、画像などふんだんに使用していると体感的にも遅く感じます。特に css や javascript ファイルが早くダウンロードできないとその差が大きく出ます。なので、静的なファイルは S3 に置いて CloudFront を使用して配信します。

EC2 を使う場合、大抵は動的なコンテンツだと思うので、ココまでは問題ないと思うのですが、弊社は試しに EC2 を使おうと言うことで http://plucore.jp を置いているのでほぼ全部静的なファイルのため html の書き換えをどうしようかといった問題が発生しました。

そこで apache の mod_ext_filter モジュールを使用して、コンテンツの書き換えを行いました。

ExtFilterDefine static2cdn mode=output intype=text/html \
  cmd="/usr/local/bin/img2cdn.pl"

filter を用意して、Location ディレクティブ内で使用します。

  <Location />
    SetOutputFilter static2cdn
  </Location>

/usr/local/bin/img2cdn.pl はこんな感じ。cdn.plucore.jp は CloudFront へ CNAME で割り当てたサブドメインです。

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
 
my $cdn_host = 'http://cdn.plucore.jp';
 
while (<STDIN>) {
    # src="http://plucore.jp/common/image/common/sidebar/webservice.png"
    # -> src="/common/image/common/sidebar/webservice.png"
    s{src="(http://plucore.jp)(.+)(png|jpg|gif|js)"}{src="$2$3"}xmsgi;
 
    # src="/common/image/common/sidebar/webservice.png"
    # -> src="http://cdn.plucore.jp/common/image/common/sidebar/webservice.png"
    s{src="([^:]+)(png|jpg|gif|js)"}{src="$cdn_host$1$2"}xmsgi;
 
    # href="/common/css/import.css"
    # -> href="http://cdn.plucore.jp/common/css/import.css"
    s{href="(.+)(css)"}{href="$cdn_host$1$2"}xmsgi;
 
    print $_;
}
 
1;

これで非 SSL 領域の画像、CSS、Javascript ファイルへのアクセスは CloudFront へ向くようになりました。

後残る問題は CloudFront がカバーしていない SSL 領域です。
CloudFront を使えばいいと思っている方で SSL を使用しようと考えている方は注意が必要です。

そこで、SSL 領域に関しては browser にキャッシュしてもらう方向で考えました。
該当する virtual host 内で Expires を設定することにしました。

  ExpiresActive On
  ExpiresDefault "access plus 4 weeks"
  Header onsuccess append Cache-Control public

なお、Firefox は SSL 領域だと全くキャッシュしないのですが、Header onsuccess append Cache-Control public と設定することで Firefox にもキャッシュしてもらえるようになります。

Expires の設定が間違えたのかと少しハマりましたがこれで解決です。

最初のアクセス時こそ少し重く感じますが、一度アクセスするとキャッシュが効くので体感レベルでは問題がないように思えます。

https://plucore.jp/contact/us.fcgi

ちなみに、plucore.jp は表向き静的なファイルばかりで EC2 的に無駄なようですが、社内向けなものをいくつか立ち上げたりしててあまり無駄になってません。(というかそれがあって、引っ越し先を探してたのもあったり)

追記(2009/04/08 10:33:29)

plucore.jp を全面的に更新するとのことで、一時的に mod_ext_filter を外してます。
cloudfront は1日キャッシュされるので明日まで解除しているかと。

追記(2009/04/09 23:57:41)

cloudfront 戻した。

2009年04月02日

[amazon][aws][ec2][javascript]EC2 のコストを計算するのを Javascript で書いた

EC2 でかかる費用を計算するのはこれとかあるんだけど、そんなに詳細じゃなくて良いので、自分が調べたい範囲だけ調べられればいいなぁということで書きました。

EC2 コスト計算

small インスタンスを使う前提で、Elastic IP address, S3 の使用容量、月間転送量 (out)、 CloudFront の月間転送量、EBS のボリュームを指定すると、最初の月にかかる費用、その後毎月かかる費用、予約先払い分を含めた on demand, 1year, 3years の比較などがその場で確認できます。

各項目の単価設定が間違えてたりするかもしれないので、くれぐれも注意してください!
このスクリプトを使用して何らかの損害が出ても責任は負いかねます!
reserved instance を間違えて 11 個買っちゃっても自己責任です!(コマンドで買うの怖い >_<)

ちなみに github に置いてます。

vkgtaro's ec2-caluclator at master - GitHub

Javascript だし、ソースを読んでもらえれば幸いです。読みづらいかもしれませんが。

最近少し jQuery 使ってみてますがいいですね。楽だ。
hash が object なのが Javascript は面白いなぁ。

id で要素指定して、text 書き換えてるあたりをもう少し上手く切り離して、メソッドを細かくすると EC2 オブジェクトがテストできそうな雰囲気だけどどうだろう。

追記

emuty さんに Elastic IP アドレスは instance に attach してる間は無料との助言を頂きました。確かに利用料確認したら含まれてなかったす!

ということでスクリプトも修正しました。
Elastic IP 以外はもう安すぎるのでこのスクリプトあまり意味がないかもw

thanks emuty san!

2009年03月17日

[amazon][aws][ec2]Amazon EC2 の Reserved Instances で安く使える!

Pricing - Amazon Elastic Compute Cloud (Amazon EC2)

これは良いですね! cool!
Web サーバ的な使い方して、立ち上げっぱなしにしておくなら reserved instances にしておいて間違いなさそうです。

先に(1|3)年の予約をしておくと running cost が $0.1/hour → $0.03/hour になるそうです。

$325 固定になるんじゃなくて、$325 払った上で running cost が安くなるという話っぽい。
転送料は今まで通り変わらずですね。

On-Demand Instances (今までと同じ)で1年使った場合は

0.1 * 24 * 365 = $876

Reserved Instance で1年使った場合は

( 0.03 * 24 * 365 ) + 325 = $587.8

なので、年間 2/3 くらいになりますね。

3年先払いだと3年間で

( 0.03 * 24 * 365 ) * 3 + 500 = $1288.4

On-Demand だと3年で $2628 だから約半分ですね。

EC2 は今東海岸とヨーロッパにしかサーバがないんですが、日本を含めたアジア地域でも早期に直接提供する意向を示していて凄く期待してます!

ちなみに使ってみた感覚だと画像や CSS, JS ファイルなど static なデータを CloudFront で配信すると体感的には大して遅く感じないかなと思います。
最初のキャッシュされるときが遅いのと SSL 領域は適用できないくて遅いのはあるけど、他のメリットと比べれば今でも十分実用的に思えます。

日本に来て SSH がさくさく使えるようになると最高だなぁ。

2009年02月23日

[boardgame][plucore]ACQUIRE やった

先日買った ACQUIRE を先週金曜日に業務が終わった後でやった。(ちなみに plucore でのボードゲームはこれで2回目。1月の新年会でカタンもやった。

2009_02_20_0289

なにげに正月にやって面白かったからと思って買ったけど、1回しかやったことないのよね。ルール説明するのにしどろもどろだったw

2回戦やって、4時間くらい?
1回戦目は一つのホテルチェーンが 41 tiles over で、2回戦目が 11 tiles over なホテルチェーンが残って終わった。

最初にあまり平たく株を買いすぎると後でいかんともしがたくなるねぇ。

2009年02月15日

モダン Perl 入門とか Acquire とか買った

モダン Perl 入門、やっと受け取れたー。

買ったもの届いた

発送が遅れた上に金曜土曜と出かけてたのでなかなか受けとれんかった。
個人的に読みたいのは Moose のところと、テストあたり。Angelos が Mouse ベースで読んでて何となくわかるけど何となくレベルなんだよねぇ。

一緒にプログラミング言語 Ruby も買った。Web+DB Press の各言語のモダンな実装みたいな特集で、gems が github からインストールできるだとか、そういうの読んでたら興味が出てきたので。

あと、こりもせずに谷川さんの詩集を3冊買ってしまった。どれを買ったら全部読めるのかがわからない。毎度見かけるたびに買ってる気がするw

あとは、お正月に杉山君ちでやったボードゲームの中で特に面白かった Acquire ってゲーム買ったw

アクワイア 新版 日本語ルール付き
AVALON HILL
売り上げランキング: 10574

ホントは英 amazon が安いということで amazon.co.uk で買おうと試みたんですが、実際商品の価格は半額くらいだったんだけど、posting & packaging が商品の価格を上回ってしまい日本で買っても同じくらいの金額になったのでやめましたw
Acquire: Amazon.co.uk: Toys & Games / £18.95(2,500円くらい)でした。日本だと5,250円。)

日本版の見るとわかるんだけど component が杉山君ちでやったのとちょっと違うのが少し残念なところ。調べてみると、いろんな version があるっぽいですね。
まー、内容が同じなら良いかという感じですかね。