<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://vkgtaro.jp/">
<title>僕ト云フ事</title>
<link>http://vkgtaro.jp/</link>
<description>geek というよりは nerd な海賊たろがたらたら綴るよ。</description>
<image rdf:resource="http://vkgtaro.jp/bnr_img/taro_sky.gif" />
<dc:language>ja</dc:language>
<dc:creator>海賊たろ</dc:creator>
<dc:date>2009-06-17T00:38:47+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.32-ja" />


<items>
<rdf:Seq><rdf:li rdf:resource="http://vkgtaro.jp/2009/06/17/cgm_night" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/06/15/catalyst" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/04/05/mod_ext_filter" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/04/02/ec2_cost_caluclator" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/03/17/amazon_ec2_reserved_instance" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/02/23/acquire" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/02/15/purchase" />
<rdf:li rdf:resource="http://vkgtaro.jp/2009/01/05/boardgame" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/12/07/karumeya_gallary" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/11/19/log_dispatch_colorful" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/11/10/amazon_ec2_centos5" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/10/28/catalyst_controller_resources_and_request_token" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/09/27/000643" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/09/24/000642" />
<rdf:li rdf:resource="http://vkgtaro.jp/2008/09/17/000641" />
</rdf:Seq>
</items>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/viking" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly></channel>

<image rdf:about="http://vkgtaro.jp/bnr_img/taro_sky.gif">
  <title>僕ト云フ事</title>
  <link>http://vkgtaro.jp/</link>
  <url>http://vkgtaro.jp/bnr_img/taro_sky.gif</url>
</image>

<item rdf:about="http://vkgtaro.jp/2009/06/17/cgm_night">
<title>[cgm night]CGM Night 行ってダニーさんに会ってきた</title>
<link>http://vkgtaro.jp/2009/06/17/cgm_night</link>
<description>ダニーさんは、秋葉原とかの otaku 文化を海外に紹介してる人でダンストルーパーをやってる人だ。



ひょんなきっかけでそのダニーさんとアンドリューさんが主催してる CGM Night に誘われたので、人見知りがえいやっと参加してまいりました。



なんというか着いた当初は凄い緊張してました。
ちょっと暑かったのもあって汗かいてたけど冷や汗かと思ったw

目を合わすとみんな凄い笑顔を向けてくるのが印象的だった。ちょっと困ってたのがやっぱり伝わってしまったのだろうかw
そして大体、目を合わすと話しかけられるので助かったり。ありがとう。



外国の人が多かったけど、僕が話した人はみんな日本語がそのまま通じてた。と言うか、自分の日本語が変だった。
日本語話せる外国人に意味不明な英語で話しかけるというマンガで読んだ光景をやらかしたりもしたw



彼は「英語とかの問題じゃないよ、コミュニケーションだよ」と教えてくれた。Oren さん。ありがとう。



この人は外悟空人さん。話口調が凄く丁寧なひとだったw



フォトグラファーの人と音楽の技術者の人。

あと写真撮れてないけど、常にイノベーションをと言ってた人の話とかは目つきが凄く良かった。
「必ず next google, next amazon があるはずだ。」



そしてダニーさん。この写真だとよくわからないけど、なんかスターウォーズ系のコスチュームを着てた。結構背丈が大きかった。blog みてても思うけど笑顔がいいですね。

なんかもう色々余裕無くて挙動不審な人になってたけど楽しかったですw</description>
<content:encoded><![CDATA[<p><a href="http://www.dannychoo.com/">ダニーさん</a>は、秋葉原とかの otaku 文化を海外に紹介してる人でダンストルーパーをやってる人だ。</p>

<p><object width="560" height="340"><param name="movie" value="http://www.youtube-nocookie.com/v/13xO12Up2UQ&hl=ja&fs=1&color1=0x5d1719&color2=0xcd311b"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/13xO12Up2UQ&hl=ja&fs=1&color1=0x5d1719&color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>

<p>ひょんなきっかけでそのダニーさんとアンドリューさんが主催してる <a href="http://www.dannychoo.com/cgm/jpn/">CGM Night</a> に誘われたので、人見知りがえいやっと参加してまいりました。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3631846417/" title="2009_06_15_0846 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3376/3631846417_549176dab8.jpg" width="500" height="333" alt="2009_06_15_0846" /></a></p>

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

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

<p><a href="http://www.flickr.com/photos/vkgtaro/3632672158/" title="2009_06_15_0869 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3551/3632672158_57f2b491cd.jpg" width="500" height="333" alt="2009_06_15_0869" /></a></p>

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

<p><a href="http://www.flickr.com/photos/vkgtaro/3631849241/" title="2009_06_15_0848 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3412/3631849241_cc5e677b05.jpg" width="500" height="333" alt="2009_06_15_0848" /></a></p>

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

<p><a href="http://www.flickr.com/photos/vkgtaro/3632675752/" title="2009_06_15_0876 by vkgtaro, on Flickr"><img src="http://farm3.static.flickr.com/2459/3632675752_43407c9cb6.jpg" width="500" height="333" alt="2009_06_15_0876" /></a></p>

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

<p><a href="http://www.flickr.com/photos/vkgtaro/3632677338/" title="2009_06_15_0877 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3630/3632677338_68f7830ff8.jpg" width="500" height="333" alt="2009_06_15_0877" /></a></p>

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

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

<p><a href="http://www.flickr.com/photos/vkgtaro/3631868305/" title="2009_06_15_0883 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3628/3631868305_867beaaae1.jpg" width="500" height="333" alt="2009_06_15_0883" /></a></p>

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

<p>なんかもう色々余裕無くて挙動不審な人になってたけど楽しかったですw</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/cgm%20night" rel="TAG" title="TAG:cgm night">cgm night</a>]<p>]]>
</content:encoded>
<dc:subject>日常</dc:subject><dc:subject>cgm night</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-06-17T00:38:47+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/06/15/catalyst">
<title>[catalyst][perl]最近の Catalyst の構成</title>
<link>http://vkgtaro.jp/2009/06/15/catalyst</link>
<description>最近 Catalyst のエントリをよく見かけるので自分の構成をさらしてみます。コードは CodeRepos にあります。

share - Revision 30441: /lang/perl/Chaostr/trunk

元々は、作ろうとしたアプリがあったんですが、去年の Catalyst confernce 以降、MyApp 的実験場になってます。仕事で作ったものはさらせないので、構成だけ表に出す感じ。ちなみに今のところ Catalyst 5.7 系でしか使ってないです。

あと、Controller クラスのベースで Resources を使ってるけど、自分のやり方は推奨されない使い方をしてます。新規投稿や編集画面用の URL を作るために一度自前 Base クラスを噛ませてたんですが、new, edit はデフォールトであります。Resources の使い方とかはこっちに書きました。

クラス構成

現在の構成をざっと図にするとこんな感じです。



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-&gt;request と $c-&gt;session が Service クラス側のアクセッサに渡ってくるようになってます。


sub install {
    my $self = shift;
    my $instance = $self-&gt;create_instance( $self-&gt;adapted_class, $self-&gt;config );
    Sub::Install::install_sub(
	{   code =&gt; sub {
		my ( $component, $context ) = @_;
		$instance-&gt;request($context-&gt;req);
		$instance-&gt;session($context-&gt;session);
 
		return $instance;
            },
            into =&gt; $self-&gt;model_class_name,
            as   =&gt; 'ACCEPT_CONTEXT',
	}
    );
}


もうね、Model として切り分けたときに request とか session をいちいち渡すのが面倒になって、「自動で全部渡してしまえ」と思った末の結果です。あとは、メソッド側で使いたいのだけ使えよと。

引数として必要な分だけ渡すと言う作りもできるよ。

後は、FormValidator::LazyWay を validator として使ってます。
validate は Catalyst 側でやればいいと思うんですが、作ってて Service 側でもやりたくなったら使おうくらいの考えで搭載しました。

CLI と test

Model のところ読んで、結局 Catalyst 依存してるじゃんかと思われるかもしれませんが、hash を渡すと request オブジェクトに変えてくれる PseudoRequest というクラスをこさえて、CLI や test も Service クラスを使えるようにしてます。

PseudoRequest にファイルの場所とか教えると $self-&gt;request-&gt;upload 的なこともできるので、ファイルアップロードのテストまで書けるようにはしたつもり。

参考

参考にしたというか、大元は avmaster さんのAV女優ブログ検索のソースで、この一年ぐらいちまちま育ててた感じです。


  AV女優ブログ検索サービスのソースを公開します。 - perl-mongers.org
  Catalystからモデルを切り離せ

</description>
<content:encoded><![CDATA[<p>最近 Catalyst のエントリをよく見かけるので自分の構成をさらしてみます。コードは CodeRepos にあります。</p>

<p><a href="http://svn.coderepos.org/share/lang/perl/Chaostr/trunk/">share - Revision 30441: /lang/perl/Chaostr/trunk</a></p>

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

<p>あと、Controller クラスのベースで Resources を使ってるけど、<a href="http://vkgtaro.jp/2008/04/19/000633">自分のやり方</a>は推奨されない使い方をしてます。新規投稿や編集画面用の URL を作るために一度自前 Base クラスを噛ませてたんですが、new, edit はデフォールトであります。Resources の使い方とかは<a href="http://perl-mongers.org/2009/06/catalyst-controller-resources.html">こっちに書きました。</a></p>

<h4>クラス構成</h4>

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

<p><a href="http://vkgtaro.jp/img/chaostr.png"><img alt="chaostr.png" src="http://vkgtaro.jp/img/chaostr-thumb.png" width="400" height="300" /></a></p>

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

<p>PseudoRequest については後述。</p>

<h4>Chaostr::Class / Chaostr::Role</h4>

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

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

<h4>Chaostr::Config</h4>

<p>tomyhero さんが書いてる <a href="http://perl-mongers.org/2008/08/catalystconfig.html">CatalystとConfig - perl-mongers.org</a> を見てもらうとわかると思います。</p>

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

<h4>Chaostr::Log</h4>

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

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

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

<h4>Validator</h4>

<p><a href="http://search.cpan.org/~taro/FormValidator-LazyWay-0.05/">FormValidator::LazyWay</a> 使ってます。validator は Catalyst にあればいいかと思ってたんですが、Service クラスに Request を渡しているので Service クラスで validate できても良いなぁと思って切り離してます。</p>

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

<h4>DB</h4>

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

<h4>Model</h4>

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

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

<pre class="prettyprint">
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',
	}
    );
}
</pre>

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

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

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

<h4>CLI と test</h4>

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

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

<h4>参考</h4>

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

<ul>
  <li><a href="http://perl-mongers.org/2008/06/av.html">AV女優ブログ検索サービスのソースを公開します。 - perl-mongers.org</a></li>
  <li><a href="http://www.slideshare.net/techmemo/catalyst-367905">Catalystからモデルを切り離せ</a></li>
</ul>
]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/catalyst" rel="TAG" title="TAG:catalyst">catalyst</a>][<a href="http://vkgtaro.jp/tag/perl" rel="TAG" title="TAG:perl">perl</a>]<p>]]>
</content:encoded>
<dc:subject>perl</dc:subject><dc:subject>catalyst</dc:subject><dc:subject>perl</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-06-15T01:08:35+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/04/05/mod_ext_filter">
<title>[apache][ec2]mod_ext_filter でコンテンツを書き換える</title>
<link>http://vkgtaro.jp/2009/04/05/mod_ext_filter</link>
<description><![CDATA[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 ディレクティブ内で使用します。


  &lt;Location /&gt;
    SetOutputFilter static2cdn
  &lt;/Location&gt;


/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 (&lt;STDIN&gt;) {
    # src="http://plucore.jp/common/image/common/sidebar/webservice.png"
    # -&gt; 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"
    # -&gt; 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"
    # -&gt; 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 戻した。]]></description>
<content:encoded><![CDATA[<p>EC2 はサーバがアメリカ東海岸（とヨーロッパ）にあるため、画像などふんだんに使用していると体感的にも遅く感じます。特に css や javascript ファイルが早くダウンロードできないとその差が大きく出ます。なので、静的なファイルは S3 に置いて CloudFront を使用して配信します。</p>

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

<p>そこで apache の <a href="http://httpd.apache.org/docs/2.2/ja/mod/mod_ext_filter.html">mod_ext_filter モジュール</a>を使用して、コンテンツの書き換えを行いました。</p>

<pre class="prettyprint">
ExtFilterDefine static2cdn mode=output intype=text/html \
  cmd="/usr/local/bin/img2cdn.pl"
</pre>

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

<pre class="prettyprint">
  &lt;Location /&gt;
    SetOutputFilter static2cdn
  &lt;/Location&gt;
</pre>

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

<pre class="prettyprint">
#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
 
my $cdn_host = 'http://cdn.plucore.jp';
 
while (&lt;STDIN&gt;) {
    # src="http://plucore.jp/common/image/common/sidebar/webservice.png"
    # -&gt; 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"
    # -&gt; 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"
    # -&gt; href="http://cdn.plucore.jp/common/css/import.css"
    s{href="(.+)(css)"}{href="$cdn_host$1$2"}xmsgi;
 
    print $_;
}
 
1;
</pre>

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

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

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

<pre class="prettyprint">
  ExpiresActive On
  ExpiresDefault "access plus 4 weeks"
  Header onsuccess append Cache-Control public
</pre>

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

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

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

<p><a href="https://plucore.jp/contact/us.fcgi">https://plucore.jp/contact/us.fcgi</a></p>

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

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

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

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

<p>cloudfront 戻した。</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/apache" rel="TAG" title="TAG:apache">apache</a>][<a href="http://vkgtaro.jp/tag/ec2" rel="TAG" title="TAG:ec2">ec2</a>]<p>]]>
</content:encoded>
<dc:subject>サーバ</dc:subject><dc:subject>apache</dc:subject><dc:subject>ec2</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-04-05T23:34:40+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/04/02/ec2_cost_caluclator">
<title>[amazon][aws][ec2][javascript]EC2 のコストを計算するのを Javascript で書いた</title>
<link>http://vkgtaro.jp/2009/04/02/ec2_cost_caluclator</link>
<description>EC2 でかかる費用を計算するのはこれとかあるんだけど、そんなに詳細じゃなくて良いので、自分が調べたい範囲だけ調べられればいいなぁということで書きました。

EC2 コスト計算

small インスタンスを使う前提で、Elastic IP address, S3 の使用容量、月間転送量 (out)、 CloudFront の月間転送量、EBS のボリュームを指定すると、最初の月にかかる費用、その後毎月かかる費用、予約先払い分を含めた on demand, 1year, 3years の比較などがその場で確認できます。

各項目の単価設定が間違えてたりするかもしれないので、くれぐれも注意してください！
このスクリプトを使用して何らかの損害が出ても責任は負いかねます！
reserved instance を間違えて 11 個買っちゃっても自己責任です！（コマンドで買うの怖い &gt;_

ちなみに 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!
</description>
<content:encoded><![CDATA[<p>EC2 でかかる費用を計算するのは<a href="http://calculator.s3.amazonaws.com/calc5.html">これ</a>とかあるんだけど、そんなに詳細じゃなくて良いので、自分が調べたい範囲だけ調べられればいいなぁということで書きました。</p>

<p><a href="http://vkgtaro.jp/scripts/ec2-caluclator/aws_calc.html">EC2 コスト計算</a></p>

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

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

<p>ちなみに github に置いてます。</p>

<p><a href="http://github.com/vkgtaro/ec2-caluclator/tree/master">vkgtaro's ec2-caluclator at master - GitHub</a></p>

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

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

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

<h4>追記</h4>

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

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

<p>thanks emuty san!<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/amazon" rel="TAG" title="TAG:amazon">amazon</a>][<a href="http://vkgtaro.jp/tag/aws" rel="TAG" title="TAG:aws">aws</a>][<a href="http://vkgtaro.jp/tag/ec2" rel="TAG" title="TAG:ec2">ec2</a>][<a href="http://vkgtaro.jp/tag/javascript" rel="TAG" title="TAG:javascript">javascript</a>]<p>]]>
</content:encoded>
<dc:subject>Javascript</dc:subject><dc:subject>amazon</dc:subject><dc:subject>aws</dc:subject><dc:subject>ec2</dc:subject><dc:subject>javascript</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-04-02T02:29:50+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/03/17/amazon_ec2_reserved_instance">
<title>[amazon][aws][ec2]Amazon EC2 の Reserved Instances で安く使える！</title>
<link>http://vkgtaro.jp/2009/03/17/amazon_ec2_reserved_instance</link>
<description>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 がさくさく使えるようになると最高だなぁ。
</description>
<content:encoded><![CDATA[<p><a href="http://aws.amazon.com/ec2/#pricing">Pricing - Amazon Elastic Compute Cloud (Amazon EC2)</a></p>

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

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

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

<p>On-Demand Instances （今までと同じ）で1年使った場合は</p>

<pre>
0.1 * 24 * 365 = $876
</pre>

<p>Reserved Instance で1年使った場合は</p>

<pre>
( 0.03 * 24 * 365 ) + 325 = $587.8
</pre>

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

<p>3年先払いだと3年間で</p>

<pre>
( 0.03 * 24 * 365 ) * 3 + 500 = $1288.4
</pre>

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

<p>EC2 は今東海岸とヨーロッパにしかサーバがないんですが、<a href="http://itpro.nikkeibp.co.jp/article/NEWS/20090224/325375/">日本を含めたアジア地域でも早期に直接提供する意向</a>を示していて凄く期待してます！</p>

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

<p>日本に来て SSH がさくさく使えるようになると最高だなぁ。<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/amazon" rel="TAG" title="TAG:amazon">amazon</a>][<a href="http://vkgtaro.jp/tag/aws" rel="TAG" title="TAG:aws">aws</a>][<a href="http://vkgtaro.jp/tag/ec2" rel="TAG" title="TAG:ec2">ec2</a>]<p>]]>
</content:encoded>
<dc:subject>サーバ</dc:subject><dc:subject>amazon</dc:subject><dc:subject>aws</dc:subject><dc:subject>ec2</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-03-17T00:24:25+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/02/23/acquire">
<title>[boardgame][plucore]ACQUIRE やった</title>
<link>http://vkgtaro.jp/2009/02/23/acquire</link>
<description>先日買った ACQUIRE を先週金曜日に業務が終わった後でやった。（ちなみに plucore でのボードゲームはこれで2回目。1月の新年会でカタンもやった。）



なにげに正月にやって面白かったからと思って買ったけど、1回しかやったことないのよね。ルール説明するのにしどろもどろだったw

2回戦やって、4時間くらい？
1回戦目は一つのホテルチェーンが 41 tiles over で、2回戦目が 11 tiles over なホテルチェーンが残って終わった。

最初にあまり平たく株を買いすぎると後でいかんともしがたくなるねぇ。
</description>
<content:encoded><![CDATA[<p><a href="http://vkgtaro.jp/2009/02/15/purchase">先日買った ACQUIRE を</a>先週金曜日に業務が終わった後でやった。（ちなみに plucore でのボードゲームはこれで2回目。<a href="http://www.flickr.com/photos/vkgtaro/sets/72157612719522002/">1月の新年会でカタンもやった。</a>）</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3299959232/" title="2009_02_20_0289 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3308/3299959232_3df2a41a6d.jpg" width="500" height="333" alt="2009_02_20_0289" /></a></p>

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

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

<p>最初にあまり平たく株を買いすぎると後でいかんともしがたくなるねぇ。<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/boardgame" rel="TAG" title="TAG:boardgame">boardgame</a>][<a href="http://vkgtaro.jp/tag/plucore" rel="TAG" title="TAG:plucore">plucore</a>]<p>]]>
</content:encoded>
<dc:subject>boardgame</dc:subject><dc:subject>boardgame</dc:subject><dc:subject>plucore</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-02-23T00:20:26+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/02/15/purchase">
<title>モダン Perl 入門とか Acquire とか買った</title>
<link>http://vkgtaro.jp/2009/02/15/purchase</link>
<description>モダン Perl 入門、やっと受け取れたー。



発送が遅れた上に金曜土曜と出かけてたのでなかなか受けとれんかった。
個人的に読みたいのは Moose のところと、テストあたり。Angelos が Mouse ベースで読んでて何となくわかるけど何となくレベルなんだよねぇ。

一緒にプログラミング言語 Ruby も買った。Web+DB Press の各言語のモダンな実装みたいな特集で、gems が github からインストールできるだとか、そういうの読んでたら興味が出てきたので。

あと、こりもせずに谷川さんの詩集を3冊買ってしまった。どれを買ったら全部読めるのかがわからない。毎度見かけるたびに買ってる気がするw

あとは、お正月に杉山君ちでやったボードゲームの中で特に面白かった Acquire ってゲーム買ったw

アクワイア 新版 日本語ルール付きposted with amazlet at 09.02.15AVALON HILL 売り上げランキング: 10574Amazon.co.jp で詳細を見る

ホントは英 amazon が安いということで amazon.co.uk で買おうと試みたんですが、実際商品の価格は半額くらいだったんだけど、posting &amp; packaging が商品の価格を上回ってしまい日本で買っても同じくらいの金額になったのでやめましたw
（Acquire: Amazon.co.uk: Toys &amp; Games /  £18.95（2,500円くらい）でした。日本だと5,250円。）

日本版の見るとわかるんだけど component が杉山君ちでやったのとちょっと違うのが少し残念なところ。調べてみると、いろんな version があるっぽいですね。
まー、内容が同じなら良いかという感じですかね。
</description>
<content:encoded><![CDATA[<p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798119172/taroweb-22/ref=nosim/">モダン Perl 入門</a>、やっと受け取れたー。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3280627649/" title="買ったもの届いた by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3290/3280627649_114939fe1d.jpg" width="500" height="333" alt="買ったもの届いた" /></a></p>

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

<p>一緒に<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113946/taroweb-22/ref=nosim/">プログラミング言語 Ruby</a> も買った。Web+DB Press の各言語のモダンな実装みたいな特集で、gems が github からインストールできるだとか、そういうの読んでたら興味が出てきたので。</p>

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

<p>あとは、<a href="http://vkgtaro.jp/2009/01/05/boardgame">お正月に杉山君ちでやった</a>ボードゲームの中で特に面白かった <a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001AQNW2G/taroweb-22/ref=nosim/">Acquire</a> ってゲーム買ったw</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001AQNW2G/taroweb-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/61uaYhjY1OL._SL160_.jpg" alt="アクワイア 新版 日本語ルール付き" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001AQNW2G/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">アクワイア 新版 日本語ルール付き</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B001AQNW2G/taroweb-22/ref=nosim/" title="アクワイア 新版 日本語ルール付き" target="_blank">amazlet</a> at 09.02.15</div></div><div class="amazlet-detail">AVALON HILL <br />売り上げランキング: 10574<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001AQNW2G/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>

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

<p>日本版の見るとわかるんだけど component が杉山君ちでやったのとちょっと違うのが少し残念なところ。調べてみると、いろんな version があるっぽいですね。<br />
まー、内容が同じなら良いかという感じですかね。<br />
</p>]]>
<![CDATA[<p><p>]]>
</content:encoded>
<dc:subject>本</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-02-15T22:14:00+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2009/01/05/boardgame">
<title>[boardgame]ボードゲームしてきた</title>
<link>http://vkgtaro.jp/2009/01/05/boardgame</link>
<description>今年はいきなり風邪を引いたりした vkgtaro です。
あけましておめでとうございます。

三日から四日まで杉山君のウチに行ってなんかたくさんゲームしてきたので、その写真を。
You-Key さんとは 2005/05/05 以来、杉山君とユリちゃんとは 2006/04/23 以来です（多分）。お久しぶりでした。調べてみると結構経ってるなぁ。

しかし全然ノリが変わってないのが凄いw
Perfume の話をしているのを聞いていたら、何かを思い出したよw



You-Key さん合流までは3人でゲームを楽しんでおりました。これは同じ色のカードを集めるゲーム。



ドミノって倒すものじゃないそうですよ！



同じ色のタイルに隣接させるように置いて、置いた所から連続した色のタイル分点数になるゲーム。色ごとに点数を付けていってすべての色の点数で一番低い点数を競うので、一つだけ得点稼いでもダメというあたりがミソ。テンサーイ！



島ごとに決められた数まで塔を積んでくゲーム。一応初めてなりに先の展開を考えながらやってみるんだけど、上に積まれたりして「あー」とかなるw



テトリスっぽいブロックを積み上げつつ、全部積んだ時点で上から見て多くブロックが見える人の勝ちなゲーム。嫌がらせプレイで勝った！w



魔女のスープ作るゲーム。鍋の色と裏返ってるキノコの色が合っているかどうかを当てたりする。あなたの小さな魔女を見せておくれ！



ホテルを建てて株件買って、合併吸収させながら所持金増やすゲーム。吸収してほしい方のホテルが合併前に大きくされたりしてやべーやべーとか心の中で思ったw

だからそのブロック置かないでおいたのにーとか。



この日一番ルールの飲み込みができていなかったと思われるゲームw すません&gt;_
高いビルと一つの都市にたくさん置いてる人がボーナスポイントもらえて、後は置いてる数だけ点数になるゲーム。ビルのてっぺんに積んだ人だけね。



画商になって絵画をオークションにかけて儲けるゲーム。売ることより、人気が出る画家を推測して買い集める方に重点を置かないと勝てない。
ミスタードリラーは壁が倒れるので支えに使ってます。磁石ではさめるの。

全体的にルール把握までに時間がかかっていた印象です。仕様が上手く把握できないダメプログラマですね。おまえ説明したんだからゲームの最中にルール聴き直すなよー。
やる前はどうなんだろと思ったけど、やってみると面白いですねー。ホテルの株券のと絵画オークションが個人的に好きかも。

長いつきあいだけど、杉山君ちに行ったのは初めてだった。
カメラ持って行って良かったと思うような家でしたw
（なんか被写体がたくさんある。自重せずにもっと撮れば良かった。）

よく書けてると思ったら☆をください！
本年もよろしくお願いいたします。
</description>
<content:encoded><![CDATA[<p>今年はいきなり風邪を引いたりした vkgtaro です。<br />
あけましておめでとうございます。</p>

<p>三日から四日まで杉山君のウチに行ってなんかたくさんゲームしてきたので、その写真を。<br />
You-Key さんとは 2005/05/05 以来、杉山君とユリちゃんとは 2006/04/23 以来です（多分）。お久しぶりでした。調べてみると結構経ってるなぁ。</p>

<p>しかし全然ノリが変わってないのが凄いw<br />
Perfume の話をしているのを聞いていたら、何かを思い出したよw</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3166172207/" title="20090104_007 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3258/3166172207_7e5697600e.jpg" width="500" height="333" alt="20090104_007" /></a></p>

<p>You-Key さん合流までは3人でゲームを楽しんでおりました。これは同じ色のカードを集めるゲーム。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3167003774/" title="20090104_010 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3262/3167003774_0757fee780.jpg" width="500" height="333" alt="20090104_010" /></a></p>

<p>ドミノって倒すものじゃないそうですよ！</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3166172441/" title="20090104_008 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3103/3166172441_c85d1fc1a4.jpg" width="500" height="333" alt="20090104_008" /></a></p>

<p>同じ色のタイルに隣接させるように置いて、置いた所から連続した色のタイル分点数になるゲーム。色ごとに点数を付けていってすべての色の点数で一番低い点数を競うので、一つだけ得点稼いでもダメというあたりがミソ。テンサーイ！</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3167003000/" title="20090104_019 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3104/3167003000_c89a3a40da.jpg" width="500" height="333" alt="20090104_019" /></a></p>

<p>島ごとに決められた数まで塔を積んでくゲーム。一応初めてなりに先の展開を考えながらやってみるんだけど、上に積まれたりして「あー」とかなるw</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3166171715/" title="20090104_024 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3128/3166171715_ef2812d7cd.jpg" width="500" height="333" alt="20090104_024" /></a></p>

<p>テトリスっぽいブロックを積み上げつつ、全部積んだ時点で上から見て多くブロックが見える人の勝ちなゲーム。嫌がらせプレイで勝った！w</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3166171467/" title="20090104_026 by vkgtaro, on Flickr"><img src="http://farm2.static.flickr.com/1135/3166171467_109dca4b21.jpg" width="500" height="333" alt="20090104_026" /></a></p>

<p>魔女のスープ作るゲーム。鍋の色と裏返ってるキノコの色が合っているかどうかを当てたりする。あなたの小さな魔女を見せておくれ！</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3167002314/" title="20090104_021 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3256/3167002314_9018194191.jpg" width="500" height="333" alt="20090104_021" /></a></p>

<p>ホテルを建てて株件買って、合併吸収させながら所持金増やすゲーム。吸収してほしい方のホテルが合併前に大きくされたりしてやべーやべーとか心の中で思ったw</p>

<p>だからそのブロック置かないでおいたのにーとか。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3167002128/" title="20090104_035 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3121/3167002128_22574fe311.jpg" width="500" height="333" alt="20090104_035" /></a></p>

<p>この日一番ルールの飲み込みができていなかったと思われるゲームw すません>_<<br />
高いビルと一つの都市にたくさん置いてる人がボーナスポイントもらえて、後は置いてる数だけ点数になるゲーム。ビルのてっぺんに積んだ人だけね。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3167001978/" title="20090104_040 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3092/3167001978_9cd03f2097.jpg" width="500" height="333" alt="20090104_040" /></a></p>

<p>画商になって絵画をオークションにかけて儲けるゲーム。売ることより、人気が出る画家を推測して買い集める方に重点を置かないと勝てない。<br />
ミスタードリラーは壁が倒れるので支えに使ってます。磁石ではさめるの。</p>

<p>全体的にルール把握までに時間がかかっていた印象です。仕様が上手く把握できないダメプログラマですね。おまえ説明したんだからゲームの最中にルール聴き直すなよー。<br />
やる前はどうなんだろと思ったけど、やってみると面白いですねー。ホテルの株券のと絵画オークションが個人的に好きかも。</p>

<p>長いつきあいだけど、杉山君ちに行ったのは初めてだった。<br />
カメラ持って行って良かったと思うような家でしたw<br />
（なんか被写体がたくさんある。自重せずにもっと撮れば良かった。）</p>

<p>よく書けてると思ったら<a href="http://ugomemo.hatena.ne.jp/ch/11538537271544156629">☆をください！</a><br />
本年もよろしくお願いいたします。<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/boardgame" rel="TAG" title="TAG:boardgame">boardgame</a>]<p>]]>
</content:encoded>
<dc:subject>日常</dc:subject><dc:subject>boardgame</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2009-01-05T22:28:45+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/12/07/karumeya_gallary">
<title>[かるめ屋]かるめ屋ギャラリー行ってきた</title>
<link>http://vkgtaro.jp/2008/12/07/karumeya_gallary</link>
<description>かるめ屋で今までの公演に使った小道具や衣装を展示してると聞いて行ってきました。

ギャラリィトウキョウジョウ :: かるめ屋ギャラリー

立ち上げてからもう4年だそうで。演劇だと1年に公演できる回数もそんなに多くないので、年月の過ぎるのが早く感じるね。
しかし今までのチラシが貼られてるの見て、ずいぶんとやってるなぁと感じました。

今回はギャラリーと言うことでしたが、ちょっとした小芝居が始まったりして楽しかったです。「すきとおったほんとうの食べ物」のサルたちの部分だけとか、遠藤さんが即興で描いた絵に対して批評したり、紙芝居があったり。夕方からバラシまでずっとおじゃましてました。









そのほかの写真

この季節になると毎週のように誰かしら公演やってたりするわけですが、最近は引きこもり発動してて行けなくてごめんなさい。今日、二等辺の殺陣がすごかったと聞いた時は行かなかったの後悔したorz

もう今年もあとわずかだなぁ。
</description>
<content:encoded><![CDATA[<p>かるめ屋で今までの公演に使った小道具や衣装を展示してると聞いて行ってきました。</p>

<p><a title="ギャラリィトウキョウジョウ :: かるめ屋ギャラリー" href="http://www.tokyojoe.jp/news/exhibition/post-60.html">ギャラリィトウキョウジョウ :: かるめ屋ギャラリー</a></p>

<p>立ち上げてからもう4年だそうで。演劇だと1年に公演できる回数もそんなに多くないので、年月の過ぎるのが早く感じるね。<br />
しかし今までのチラシが貼られてるの見て、ずいぶんとやってるなぁと感じました。</p>

<p>今回はギャラリーと言うことでしたが、ちょっとした小芝居が始まったりして楽しかったです。「<a href="http://vkgtaro.jp/2004/09/07/000225">すきとおったほんとうの食べ物</a>」のサルたちの部分だけとか、遠藤さんが即興で描いた絵に対して批評したり、紙芝居があったり。夕方からバラシまでずっとおじゃましてました。</p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3089554606/" title="画像 022 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3046/3089554606_2b84f91089.jpg" width="500" height="333" alt="画像 022" /></a></p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3089565054/" title="画像 037 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3149/3089565054_2b31ee9ec1.jpg" width="500" height="333" alt="画像 037" /></a></p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3088729345/" title="画像 040 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3066/3088729345_297fac7b9e.jpg" width="500" height="333" alt="画像 040" /></a></p>

<p><a href="http://www.flickr.com/photos/vkgtaro/3088746529/" title="画像 085 by vkgtaro, on Flickr"><img src="http://farm4.static.flickr.com/3267/3088746529_dcf07f3462.jpg" width="500" height="333" alt="画像 085" /></a></p>

<p><a href="http://flickr.com/photos/vkgtaro/sets/72157610786383739/">そのほかの写真</a></p>

<p>この季節になると毎週のように誰かしら公演やってたりするわけですが、最近は引きこもり発動してて行けなくてごめんなさい。今日、二等辺の殺陣がすごかったと聞いた時は行かなかったの後悔したorz</p>

<p>もう今年もあとわずかだなぁ。<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/%E3%81%8B%E3%82%8B%E3%82%81%E5%B1%8B" rel="TAG" title="TAG:かるめ屋">かるめ屋</a>]<p>]]>
</content:encoded>
<dc:subject>観劇</dc:subject><dc:subject>かるめ屋</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-12-07T23:57:03+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/11/19/log_dispatch_colorful">
<title>[colorful][log][perl]Log::Dispatch で Colorful!</title>
<link>http://vkgtaro.jp/2008/11/19/log_dispatch_colorful</link>
<description>追記

CodeRepos にコミットして CPAN うｐしましたー。
$default_color 無くしたので、color 指定しなければただの Dumper な Screen として使えると思います。

本文

Catalyst::Plugin::Log::Colorful を使って以来、開発中は Colorful な log じゃないと Debug モードの気がしなくなってしまった自分ですが、ちょっと、Log::Dispatch で Colorful な Dumper してみたくなったのでやってみました。



Log::Dispatch をよくわかってなくてきっとおかしな事をしていると思う。
message 周りの callback で一番最初に処理してほしいから頭に割り込んでみたり、Dumper したくて log メソッドの validate 外したり。

test_log.pl

Log::Dispatch::Config から使ってます。


use strict;
use warnings;
 
use lib qw(./lib);
 
use Data::Dumper;
use Log::Dispatch::Config;
use Log::Dispatch::Configurator::YAML;
 
my $config = Log::Dispatch::Configurator::YAML-&gt;new('log.yaml');
Log::Dispatch::Config-&gt;configure($config);
 
my $log = Log::Dispatch::Config-&gt;instance();
 
$log-&gt;notice('noooooootiiiiiiiiiceeeeeeeeeee');
$log-&gt;info('infoooooooooooooooooooooooo');
$log-&gt;error('eeeeeerrrrrrrrrrrrrrooorrrrrr');
$log-&gt;debug('deeeeeeeeebuuuuuuuuuuuuuug!');
$log-&gt;debug({
    foo =&gt; 'bar',
});


log.yaml

log.yaml はこんな感じ。


dispatchers:
  - screen
 
screen:
  class: Log::Dispatch::Colorful
  min_level: debug
  stderr: 1
  format: '[%d] [%p] %m at %F line %L%n'
  color:
    info:
      text: green
    debug:
      text: red
      background: white
    error:
      text: yellow
      background: red


Log::Dispatch::Colorful

これがその Colorful さん。


package Log::Dispatch::Colorful;
 
use strict;
use warnings;
 
use base qw( Log::Dispatch::Output );
 
use Data::Dumper;
use Log::Dispatch::Output;
use Params::Validate qw(validate BOOLEAN SCALAR ARRAYREF CODEREF);
use Term::ANSIColor;
 
Params::Validate::validation_options( allow_extra =&gt; 1 );
 
our $VERSION = '0.01';
 
our %LEVELS;
 
BEGIN {
    foreach my $l (qw( debug info notice warning err error crit critical alert emerg emergency )) {
        my $sub = sub {
            my $self = shift;
            my $messages;
            foreach my $message (@_) {
                if ( ref $message ) {
                    $message = Dumper($message);
                }
                $messages .= $message || '';
            }
 
            $self-&gt;log( level =&gt; $l, message =&gt; $messages );
        };
 
        $LEVELS{$l} = 1;
 
        no strict 'refs';
        no warnings 'redefine';
        *{ "Log::Dispatch::" . $l } = $sub;
    }
}
 
sub new {
    my $proto = shift;
    my $class = ref $proto || $proto;
 
    my %p = validate(
        @_,
        {   stderr =&gt; {
                type    =&gt; BOOLEAN,
                default =&gt; 1
            },
        }
    );
 
    my $self = bless {}, $class;
 
    $self-&gt;_basic_init(%p);
 
    my $default_color = {
        error =&gt; {
            text       =&gt; 'yellow',
            background =&gt; 'red'
        },
        debug =&gt; { text =&gt; 'red' },
    };
 
    $self-&gt;{color}  = exists $p{color}  ? $p{color}  : $default_color;
    $self-&gt;{stderr} = exists $p{stderr} ? $p{stderr} : 1;
 
    my $callbacks = [
        sub {
            my %p = @_;
 
            if  ( $self-&gt;{color}-&gt;{ $p{level} }-&gt;{text} ) {
                $p{message}
                    = color( $self-&gt;{color}-&gt;{ $p{level} }-&gt;{text} )
                    . $p{message}
                    . color('reset');
            }
 
            if ( $self-&gt;{color}-&gt;{ $p{level} }-&gt;{background} ) {
                $p{message}
                    = color( 'on_' . $self-&gt;{color}-&gt;{ $p{level} }-&gt;{background} )
                    . $p{message}
                    . color('reset');
            }
 
            $p{message};
        },
        @{ $self-&gt;{callbacks} }
    ];
    $self-&gt;{callbacks} = $callbacks;
 
    return $self;
}
 
sub log {
    my $self = shift;
 
    my %p = validate( @_, { level =&gt; { type =&gt; SCALAR }, } );
 
    return unless $self-&gt;_should_log( $p{level} );
 
    $p{message} = $self-&gt;_apply_callbacks(%p)
        if $self-&gt;{callbacks};
 
    $self-&gt;log_message(%p);
}
 
sub log_message {
    my $self = shift;
    my %p    = @_;
 
    if ( $self-&gt;{stderr} ) {
        print STDERR $p{message};
    }
    else {
        print STDOUT $p{message};
    }
}
 
1;


Dumper できるの便利だけど、リファレンス渡すと他の Log クラスに Dispatch しづらくなるなぁ。</description>
<content:encoded><![CDATA[<h4>追記</h4>

<p><a href="http://coderepos.org/share/browser/lang/perl/Log-Dispatch-Colorful">CodeRepos にコミット</a>して <a href="http://search.cpan.org/dist/Log-Dispatch-Colorful/">CPAN うｐ</a>しましたー。<br />
$default_color 無くしたので、color 指定しなければただの Dumper な Screen として使えると思います。</p>

<h4>本文</h4>

<p>Catalyst::Plugin::Log::Colorful を使って以来、開発中は Colorful な log じゃないと Debug モードの気がしなくなってしまった自分ですが、ちょっと、Log::Dispatch で Colorful な Dumper してみたくなったのでやってみました。</p>

<p><img alt="log-colorful.png" src="http://vkgtaro.jp/img/log-colorful.png" width="648" height="133" /></p>

<p>Log::Dispatch をよくわかってなくてきっとおかしな事をしていると思う。<br />
message 周りの callback で一番最初に処理してほしいから頭に割り込んでみたり、Dumper したくて log メソッドの validate 外したり。</p>

<h4>test_log.pl</h4>

<p>Log::Dispatch::Config から使ってます。</p>

<pre class="prettyprint">
use strict;
use warnings;
 
use lib qw(./lib);
 
use Data::Dumper;
use Log::Dispatch::Config;
use Log::Dispatch::Configurator::YAML;
 
my $config = Log::Dispatch::Configurator::YAML->new('log.yaml');
Log::Dispatch::Config->configure($config);
 
my $log = Log::Dispatch::Config->instance();
 
$log->notice('noooooootiiiiiiiiiceeeeeeeeeee');
$log->info('infoooooooooooooooooooooooo');
$log->error('eeeeeerrrrrrrrrrrrrrooorrrrrr');
$log->debug('deeeeeeeeebuuuuuuuuuuuuuug!');
$log->debug({
    foo => 'bar',
});
</pre>

<h4>log.yaml</h4>

<p>log.yaml はこんな感じ。</p>

<pre class="prettyprint">
dispatchers:
  - screen
 
screen:
  class: Log::Dispatch::Colorful
  min_level: debug
  stderr: 1
  format: '[%d] [%p] %m at %F line %L%n'
  color:
    info:
      text: green
    debug:
      text: red
      background: white
    error:
      text: yellow
      background: red
</pre>

<h4>Log::Dispatch::Colorful</h4>

<p>これがその Colorful さん。</p>

<pre class="prettyprint">
package Log::Dispatch::Colorful;
 
use strict;
use warnings;
 
use base qw( Log::Dispatch::Output );
 
use Data::Dumper;
use Log::Dispatch::Output;
use Params::Validate qw(validate BOOLEAN SCALAR ARRAYREF CODEREF);
use Term::ANSIColor;
 
Params::Validate::validation_options( allow_extra => 1 );
 
our $VERSION = '0.01';
 
our %LEVELS;
 
BEGIN {
    foreach my $l (qw( debug info notice warning err error crit critical alert emerg emergency )) {
        my $sub = sub {
            my $self = shift;
            my $messages;
            foreach my $message (@_) {
                if ( ref $message ) {
                    $message = Dumper($message);
                }
                $messages .= $message || '';
            }
 
            $self->log( level => $l, message => $messages );
        };
 
        $LEVELS{$l} = 1;
 
        no strict 'refs';
        no warnings 'redefine';
        *{ "Log::Dispatch::" . $l } = $sub;
    }
}
 
sub new {
    my $proto = shift;
    my $class = ref $proto || $proto;
 
    my %p = validate(
        @_,
        {   stderr => {
                type    => BOOLEAN,
                default => 1
            },
        }
    );
 
    my $self = bless {}, $class;
 
    $self->_basic_init(%p);
 
    my $default_color = {
        error => {
            text       => 'yellow',
            background => 'red'
        },
        debug => { text => 'red' },
    };
 
    $self->{color}  = exists $p{color}  ? $p{color}  : $default_color;
    $self->{stderr} = exists $p{stderr} ? $p{stderr} : 1;
 
    my $callbacks = [
        sub {
            my %p = @_;
 
            if  ( $self->{color}->{ $p{level} }->{text} ) {
                $p{message}
                    = color( $self->{color}->{ $p{level} }->{text} )
                    . $p{message}
                    . color('reset');
            }
 
            if ( $self->{color}->{ $p{level} }->{background} ) {
                $p{message}
                    = color( 'on_' . $self->{color}->{ $p{level} }->{background} )
                    . $p{message}
                    . color('reset');
            }
 
            $p{message};
        },
        @{ $self->{callbacks} }
    ];
    $self->{callbacks} = $callbacks;
 
    return $self;
}
 
sub log {
    my $self = shift;
 
    my %p = validate( @_, { level => { type => SCALAR }, } );
 
    return unless $self->_should_log( $p{level} );
 
    $p{message} = $self->_apply_callbacks(%p)
        if $self->{callbacks};
 
    $self->log_message(%p);
}
 
sub log_message {
    my $self = shift;
    my %p    = @_;
 
    if ( $self->{stderr} ) {
        print STDERR $p{message};
    }
    else {
        print STDOUT $p{message};
    }
}
 
1;
</pre>

<p>Dumper できるの便利だけど、リファレンス渡すと他の Log クラスに Dispatch しづらくなるなぁ。</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/colorful" rel="TAG" title="TAG:colorful">colorful</a>][<a href="http://vkgtaro.jp/tag/log" rel="TAG" title="TAG:log">log</a>][<a href="http://vkgtaro.jp/tag/perl" rel="TAG" title="TAG:perl">perl</a>]<p>]]>
</content:encoded>
<dc:subject>perl</dc:subject><dc:subject>colorful</dc:subject><dc:subject>log</dc:subject><dc:subject>perl</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-11-19T10:18:50+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/11/10/amazon_ec2_centos5">
<title>[amazon][aws][ec2]Amazon EC2 用に自分で CentOS 5 のイメージを用意する</title>
<link>http://vkgtaro.jp/2008/11/10/amazon_ec2_centos5</link>
<description><![CDATA[Amazon EC2 では、Amazon 公式で用意されたイメージの他にいろんなひとがイメージを登録して share してるんですが、やっぱり見ず知らずの人が用意したイメージはあまり使いたくないなぁということで、自分で用意してみたのでその手順です。
EC2 のマニュアルでは、"Using Amazon EC2" -> "Creating and Preparing AMIs" あたりです。（マニュアルは Fedora ベースです）

作業は CentOS5 上で行いました。ちなみに Xen 上の Dom0 です。

AMI tools をインストールする

AMI tools は ruby が必要なので、install されていない場合は入れてください。

# yum install ruby

ec2-ami-tools.noarch.rpm をインストールします。

# rpm -i ec2-ami-tools.noarch.rpm

まず空のイメージを作る

# dd if=/dev/zero of=centos5.img bs=1M count=2024

マニュアルだと例示されてるのが 1GB なんですが、CentOS 5 入れてて足りなくなったので 2GB にしました。（やっぱりこころもとなかったので 3GB 作り中。後で CPAN とかインストールしたイメージ作りたいから。ちなみに /mnt に 残りの領域がマウントされるので、/home とかはそっち使えばいいと思う。）

ext3 ファイルシステムを作成する

# mke2fs -F -j centos5.img

マウントする


# mkdir /mnt/ec2-fs
# mount -o loop centos5.img /mnt/ec2-fs


イメージ上にディレクトリ作ったりしていろいろ準備

/dev を用意する。


# mkdir /mnt/ec2-fs/dev
# for i in console null zero ; do /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x $i; done


/mnt/ec2-fs/etc/fstab を作る。


/dev/sda1  /         ext3    defaults        1 1
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0


yum-xen.conf をつくる


[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null
 
[base]
name=CentOS-5.2 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=os
enabled=1
 
[updates-released]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=updates
enabled=1


proc ディレクトリ作って mount する


# mkdir /mnt/ec2-fs/proc
# mount -t proc none /mnt/ec2-fs/proc


yum で 作ったイメージに CentOS 5 をインストールする


yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Core
yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Base


/mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0 を作る


DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no


/mnt/ec2-fs/etc/sysconfig/network を作る


NETWORKING=yes


/mnt/ec2-fs/etc/fstab に追記

EC2 のサービスでは /mnt 以下に今回作ったイメージ以外の領域がマウントされるので、それを追記しておきます。


/dev/sda2  /mnt      ext3    defaults        0 0
/dev/sda3  swap      swap    defaults        0 0


キー受け取り用のスクリプトを仕込んでおく

これをやっておかないと ec2-add-keypair で作った公開鍵が、起動時に受け取れません。このあたり意味がわからなくて少しハマった。

/mnt/ec2-fs/etc/rc.d/rc.local


#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
/usr/local/sbin/get-credentials.sh


/usr/local/sbin/get-credentials.sh
このファイルは、実行権限付けておくのも忘れないように！


#!/bin/bash
 
# Retreive the credentials from relevant sources.
 
# Fetch any credentials presented at launch time and add them to
# root's public keys
 
PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub
PUB_KEY_FROM_EPHEMERAL=/mnt/openssh_id.pub
ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys
 
 
 
# We need somewhere to put the keys.
if [ ! -d /root/.ssh ] ; then
        mkdir -p /root/.ssh
        chmod 700 /root/.ssh
fi
 
# Fetch credentials...
 
# First try http
curl --retry 3 --retry-delay 0 --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI
if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then
    if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS
    then
            cat $PUB_KEY_FROM_HTTP &gt;&gt; $ROOT_AUTHORIZED_KEYS
            echo "New key added to authrozied keys file from parameters"|logger -t "ec2"
    fi
    chmod 600 $ROOT_AUTHORIZED_KEYS
    rm -f $PUB_KEY_FROM_HTTP
 
elif [ -e $PUB_KEY_FROM_EPHEMERAL ] ; then
    # Try back to ephemeral store if http failed.
    # NOTE: This usage is deprecated and will be removed in the future
    if ! grep -q -f $PUB_KEY_FROM_EPHEMERAL $ROOT_AUTHORIZED_KEYS
    then
            cat $PUB_KEY_FROM_EPHEMERAL &gt;&gt; $ROOT_AUTHORIZED_KEYS
            echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
 
    fi
    chmod 600 $ROOT_AUTHORIZED_KEYS
    chmod 600 $PUB_KEY_FROM_EPHEMERAL
 
fi
 
if [ -e /mnt/openssh_id.pub ] ; then
        if ! grep -q -f /mnt/openssh_id.pub /root/.ssh/authorized_keys
        then
                cat /mnt/openssh_id.pub &gt;&gt; /root/.ssh/authorized_keys
                echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
 
        fi
        chmod 600 /root/.ssh/authorized_keys
fi


unmount する


# umount /mnt/ec2-fs/proc
# umount -d /mnt/ec2-fs


登録用イメージ作成

aws user は、aws.amazon.com にログインしてアカウント情報見たときの右上に表示されてるやつ。ハイフンはいらない。

# ec2-bundle-image -i centos5.img -k &lt;secret key file&gt; -c &lt;cert file&gt; -u &lt;aws user&gt;

アップロード

S3 の backets は、無い名前を作ってくれます。S3 全体でユニークな名前にする必要があります。

# ec2-upload-bundle -b &lt;s3 backets&gt; -m /tmp/centos5.img.manifest.xml -a &lt;access id&gt;  -s &lt;secret key&gt;

登録

ここから先は ec2 コマンド群をインストール済みの mac で作業を行いました。

$ ec2-register &lt;s3 backets&gt;/centos5.img.manifest.xml

自分のイメージ確認

$ ec2-describe-images -o self 

秘密鍵生成


$ ec2-add-keypair vkgtest | sed -e "1d" &gt; vkgtest.id
$ chmod 400 vkgtest.id


このコマンドで、公開鍵が AWS 側に登録される。
秘密鍵は他の ssh 秘密鍵と同様に保管します。

ec2-describe-keypair で登録した鍵の一覧が見られます。

インスタンス起動

$ ec2-run-instances &lt;image id&gt; -k vkgtest

image id は ami で始まる文字列です。
-k オプションには使用する鍵名を渡します。
すると起動時に指定された公開鍵をセットして起動してくれます。

Firewall の port 22 を開ける

$ ec2-authorize default -p 22

これで 22 番が開きます。
もう少し細かく接続もととか指定できるみたいだけどマニュアル参照で。

ちなみに ec2-describe-group で設定した内容が見えて、ec2-revoke で削除できます。
default ってのは iptables のチェーンみたいなものかなぁ。

インスタンス状態確認

$ ec2-describe-instances

正常に起動できていたら、ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com のようなサブドメインが割り当てられていると思います。
こんな感じでログインできます。

$ ssh -i .ssh/vkgtest.id root@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com

起動できていてログイン出来なかったら、/usr/local/sbin/get-credentials.sh のセットアップに失敗しているかも。

インスタンスシャットダウン

$ ec2-terminate-instances &lt;instance id&gt;

参考にさせていただきました


  EC2 公式のマニュアル
  はじめてのAmazon EC2&S3　～これからの新サービスの公開の形～
  一人前のプログラマを目指す日記:[AWS] EC2の仮想マシンイメージを作った - livedoor Blog（ブログ）
  /var/log/maeda.log: Amazon EC2で素のCentOS 5を動かす手順（起動して一部参考にしたりした）
]]></description>
<content:encoded><![CDATA[<p><a href="http://aws.amazon.com/ec2/">Amazon EC2</a> では、Amazon 公式で用意されたイメージの他にいろんなひとがイメージを登録して share してるんですが、やっぱり見ず知らずの人が用意したイメージはあまり使いたくないなぁということで、自分で用意してみたのでその手順です。<br /><br />
<a href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/">EC2 のマニュアル</a>では、"Using Amazon EC2" -> "Creating and Preparing AMIs" あたりです。（マニュアルは Fedora ベースです）</p>

<p>作業は CentOS5 上で行いました。ちなみに Xen 上の Dom0 です。</p>

<h4>AMI tools をインストールする</h4>

<p>AMI tools は ruby が必要なので、install されていない場合は入れてください。</p>

<pre># yum install ruby</pre>

<p><a href="https://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm">ec2-ami-tools.noarch.rpm</a> をインストールします。</p>

<pre># rpm -i ec2-ami-tools.noarch.rpm</pre>

<h4>まず空のイメージを作る</h4>

<pre># dd if=/dev/zero of=centos5.img bs=1M count=2024</pre>

<p>マニュアルだと例示されてるのが 1GB なんですが、CentOS 5 入れてて足りなくなったので 2GB にしました。（やっぱりこころもとなかったので 3GB 作り中。後で CPAN とかインストールしたイメージ作りたいから。ちなみに /mnt に 残りの領域がマウントされるので、/home とかはそっち使えばいいと思う。）</p>

<h4>ext3 ファイルシステムを作成する</h4>

<pre># mke2fs -F -j centos5.img</pre>

<h4>マウントする</h4>

<pre>
# mkdir /mnt/ec2-fs
# mount -o loop centos5.img /mnt/ec2-fs
</pre>

<h4>イメージ上にディレクトリ作ったりしていろいろ準備</h4>

<p>/dev を用意する。</p>

<pre>
# mkdir /mnt/ec2-fs/dev
# for i in console null zero ; do /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x $i; done
</pre>

<p>/mnt/ec2-fs/etc/fstab を作る。</p>

<pre>
/dev/sda1  /         ext3    defaults        1 1
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0
</pre>

<p>yum-xen.conf をつくる</p>

<pre>
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null
 
[base]
name=CentOS-5.2 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=os
enabled=1
 
[updates-released]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=updates
enabled=1
</pre>

<p>proc ディレクトリ作って mount する</p>

<pre>
# mkdir /mnt/ec2-fs/proc
# mount -t proc none /mnt/ec2-fs/proc
</pre>

<h4>yum で 作ったイメージに CentOS 5 をインストールする</h4>

<pre>
yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Core
yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Base
</pre>

<h4>/mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0 を作る</h4>

<pre>
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
</pre>

<h4>/mnt/ec2-fs/etc/sysconfig/network を作る</h4>

<pre>
NETWORKING=yes
</pre>

<h4>/mnt/ec2-fs/etc/fstab に追記</h4>

<p>EC2 のサービスでは /mnt 以下に今回作ったイメージ以外の領域がマウントされるので、それを追記しておきます。</p>

<pre>
/dev/sda2  /mnt      ext3    defaults        0 0
/dev/sda3  swap      swap    defaults        0 0
</pre>

<h4>キー受け取り用のスクリプトを仕込んでおく</h4>

<p>これをやっておかないと ec2-add-keypair で作った公開鍵が、起動時に受け取れません。このあたり意味がわからなくて少しハマった。</p>

<p>/mnt/ec2-fs/etc/rc.d/rc.local</p>

<pre class="prettyprint">
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
/usr/local/sbin/get-credentials.sh
</pre>

<p>/usr/local/sbin/get-credentials.sh<br />
このファイルは、実行権限付けておくのも忘れないように！</p>

<pre class="prettyprint">
#!/bin/bash
 
# Retreive the credentials from relevant sources.
 
# Fetch any credentials presented at launch time and add them to
# root's public keys
 
PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub
PUB_KEY_FROM_EPHEMERAL=/mnt/openssh_id.pub
ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys
 
 
 
# We need somewhere to put the keys.
if [ ! -d /root/.ssh ] ; then
        mkdir -p /root/.ssh
        chmod 700 /root/.ssh
fi
 
# Fetch credentials...
 
# First try http
curl --retry 3 --retry-delay 0 --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI
if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then
    if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS
    then
            cat $PUB_KEY_FROM_HTTP &gt;&gt; $ROOT_AUTHORIZED_KEYS
            echo "New key added to authrozied keys file from parameters"|logger -t "ec2"
    fi
    chmod 600 $ROOT_AUTHORIZED_KEYS
    rm -f $PUB_KEY_FROM_HTTP
 
elif [ -e $PUB_KEY_FROM_EPHEMERAL ] ; then
    # Try back to ephemeral store if http failed.
    # NOTE: This usage is deprecated and will be removed in the future
    if ! grep -q -f $PUB_KEY_FROM_EPHEMERAL $ROOT_AUTHORIZED_KEYS
    then
            cat $PUB_KEY_FROM_EPHEMERAL &gt;&gt; $ROOT_AUTHORIZED_KEYS
            echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
 
    fi
    chmod 600 $ROOT_AUTHORIZED_KEYS
    chmod 600 $PUB_KEY_FROM_EPHEMERAL
 
fi
 
if [ -e /mnt/openssh_id.pub ] ; then
        if ! grep -q -f /mnt/openssh_id.pub /root/.ssh/authorized_keys
        then
                cat /mnt/openssh_id.pub &gt;&gt; /root/.ssh/authorized_keys
                echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
 
        fi
        chmod 600 /root/.ssh/authorized_keys
fi
</pre>

<h4>unmount する</h4>

<pre>
# umount /mnt/ec2-fs/proc
# umount -d /mnt/ec2-fs
</pre>

<h4>登録用イメージ作成</h4>

<p>aws user は、aws.amazon.com にログインしてアカウント情報見たときの右上に表示されてるやつ。ハイフンはいらない。</p>

<pre># ec2-bundle-image -i centos5.img -k &lt;secret key file&gt; -c &lt;cert file&gt; -u &lt;aws user&gt;</pre>

<h4>アップロード</h4>

<p>S3 の backets は、無い名前を作ってくれます。S3 全体でユニークな名前にする必要があります。</p>

<pre># ec2-upload-bundle -b &lt;s3 backets&gt; -m /tmp/centos5.img.manifest.xml -a &lt;access id&gt;  -s &lt;secret key&gt;</pre>

<h4>登録</h4>

<p>ここから先は ec2 コマンド群をインストール済みの mac で作業を行いました。</p>

<pre>$ ec2-register &lt;s3 backets&gt;/centos5.img.manifest.xml</pre>

<h4>自分のイメージ確認</h4>

<pre>$ ec2-describe-images -o self </pre>

<h4>秘密鍵生成</h4>

<pre>
$ ec2-add-keypair vkgtest | sed -e "1d" &gt; vkgtest.id
$ chmod 400 vkgtest.id
</pre>

<p>このコマンドで、公開鍵が AWS 側に登録される。<br />
秘密鍵は他の ssh 秘密鍵と同様に保管します。</p>

<p>ec2-describe-keypair で登録した鍵の一覧が見られます。</p>

<h4>インスタンス起動</h4>

<pre>$ ec2-run-instances &lt;image id&gt; -k vkgtest</pre>

<p>image id は ami で始まる文字列です。<br />
-k オプションには使用する鍵名を渡します。<br />
すると起動時に指定された公開鍵をセットして起動してくれます。</p>

<h4>Firewall の port 22 を開ける</h4>

<pre>$ ec2-authorize default -p 22</pre>

<p>これで 22 番が開きます。<br />
もう少し細かく接続もととか指定できるみたいだけど<a href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?CLTRG_api_tools.html">マニュアル</a>参照で。</p>

<p>ちなみに ec2-describe-group で設定した内容が見えて、ec2-revoke で削除できます。<br />
default ってのは iptables のチェーンみたいなものかなぁ。</p>

<h4>インスタンス状態確認</h4>

<pre>$ ec2-describe-instances</pre>

<p>正常に起動できていたら、ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com のようなサブドメインが割り当てられていると思います。<br />
こんな感じでログインできます。</p>

<pre>$ ssh -i .ssh/vkgtest.id root@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com</pre>

<p>起動できていてログイン出来なかったら、/usr/local/sbin/get-credentials.sh のセットアップに失敗しているかも。</p>

<h4>インスタンスシャットダウン</h4>

<pre>$ ec2-terminate-instances &lt;instance id&gt;</pre>

<h4>参考にさせていただきました</h4>

<ul>
  <li><a href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/">EC2 公式のマニュアル</a></li>
  <li><a href="http://gihyo.jp/dev/serial/01/amazon_ec2">はじめてのAmazon EC2&S3　～これからの新サービスの公開の形～</a></li>
  <li><a href="http://blog.livedoor.jp/matssaku/archives/50383469.html">一人前のプログラマを目指す日記:[AWS] EC2の仮想マシンイメージを作った - livedoor Blog（ブログ）</a></li>
  <li><a href="http://vividtone.seesaa.net/article/97841106.html">/var/log/maeda.log: Amazon EC2で素のCentOS 5を動かす手順</a>（起動して一部参考にしたりした）</li>
</ul>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/amazon" rel="TAG" title="TAG:amazon">amazon</a>][<a href="http://vkgtaro.jp/tag/aws" rel="TAG" title="TAG:aws">aws</a>][<a href="http://vkgtaro.jp/tag/ec2" rel="TAG" title="TAG:ec2">ec2</a>]<p>]]>
</content:encoded>
<dc:subject>プログラミング</dc:subject><dc:subject>amazon</dc:subject><dc:subject>aws</dc:subject><dc:subject>ec2</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-11-10T21:54:16+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/10/28/catalyst_controller_resources_and_request_token">
<title>[catalyst][perl]CC::Resources と CC::RequestToken を一緒に使う</title>
<link>http://vkgtaro.jp/2008/10/28/catalyst_controller_resources_and_request_token</link>
<description>追記

Controller::Resources の作者に対応してもらったよ！ありがとう！

ここから元の記事

Catalyst::Plugin::RequestToken が廃止対象になって Catalyst::Controller::RequestToken が出てからだいぶ経ちましたが、Resources とどう組み合わせて使おうか悩んでいて、こうやったら一緒に使えるなぁと思ったのでやってみた。


package MyApp::Base::Controller::Resources;
 
use strict;
use warnings;
use base qw(Catalyst::Controller::Resource Catalyst::Controller::RequestToken);
 
use Catalyst::Utils;
 
sub setup_collection_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self-&gt;{collection} || {},
        {   list      =&gt; { method =&gt; 'GET',  path =&gt; '',    token =&gt; 'create' },
            do_create =&gt; { method =&gt; 'POST', path =&gt; '',    token =&gt; 'validate' },
            create    =&gt; { method =&gt; 'GET',  path =&gt; 'new', token =&gt; 'create' },
        }
    );
    $self-&gt;setup_actions( collection =&gt; $maps );
}
 
sub setup_member_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self-&gt;{member} || {},
        {   show       =&gt; { method =&gt; 'GET',  path =&gt; '',       token =&gt; 'create' },
            do_update  =&gt; { method =&gt; 'POST', path =&gt; 'update', token =&gt; 'validate' },
            update     =&gt; { method =&gt; 'GET',  path =&gt; 'update', token =&gt; 'create' },
            do_destroy =&gt; { method =&gt; 'POST', path =&gt; 'delete', token =&gt; 'validate' },
            destroy    =&gt; { method =&gt; 'GET',  path =&gt; 'delete', token =&gt; 'create' },
        }
    );
    $self-&gt;setup_actions( member =&gt; $maps );
}
 
sub _construct_action_attributes {
    my ( $self, $chained_from, $map ) = @_;
 
    return (
        'Resource',
        'Args(0)',
        "Chained('$chained_from')",
        "Method('$map-&gt;{method}')",
        exists $map-&gt;{path} ? "PathPart('$map-&gt;{path}')" : 'PathPart',
        ( exists $map-&gt;{token} &amp;&amp; $map-&gt;{token} eq 'create' )   ? 'CreateToken'
      : ( exists $map-&gt;{token} &amp;&amp; $map-&gt;{token} eq 'validate' ) ? 'ValidateToken'
                                                                : ''
    );
}


_construct_action_attributes を上書きして、$map-&gt;{token} に入っている値を見て、CreateToken か ValidateToken アトリビュートを付加するようにしてます。

後は setup_(collection|member)_actions で token の指定するだけ。
list と show を CreateToken にしてるのは、一覧画面とか詳細画面自体にフォームがある場合があるからです。</description>
<content:encoded><![CDATA[<h4>追記</h4>

<p><a href="http://catalyst.g.hatena.ne.jp/ikasam_a/20081029/1225280708">Controller::Resources の作者に対応してもらったよ！ありがとう！</a></p>

<h4>ここから元の記事</h4>

<p><a href="http://search.cpan.org/~hide/Catalyst-Plugin-RequestToken-0.06/">Catalyst::Plugin::RequestToken</a> が廃止対象になって <a href="http://search.cpan.org/~hide/Catalyst-Controller-RequestToken-0.01/">Catalyst::Controller::RequestToken</a> が出てからだいぶ経ちましたが、<a href="http://search.cpan.org/~masaki/Catalyst-Controller-Resources-0.03/">Resources</a> とどう組み合わせて使おうか悩んでいて、こうやったら一緒に使えるなぁと思ったのでやってみた。</p>

<pre class="prettyprint">
package MyApp::Base::Controller::Resources;
 
use strict;
use warnings;
use base qw(Catalyst::Controller::Resource Catalyst::Controller::RequestToken);
 
use Catalyst::Utils;
 
sub setup_collection_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self->{collection} || {},
        {   list      => { method => 'GET',  path => '',    token => 'create' },
            do_create => { method => 'POST', path => '',    token => 'validate' },
            create    => { method => 'GET',  path => 'new', token => 'create' },
        }
    );
    $self->setup_actions( collection => $maps );
}
 
sub setup_member_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self->{member} || {},
        {   show       => { method => 'GET',  path => '',       token => 'create' },
            do_update  => { method => 'POST', path => 'update', token => 'validate' },
            update     => { method => 'GET',  path => 'update', token => 'create' },
            do_destroy => { method => 'POST', path => 'delete', token => 'validate' },
            destroy    => { method => 'GET',  path => 'delete', token => 'create' },
        }
    );
    $self->setup_actions( member => $maps );
}
 
sub _construct_action_attributes {
    my ( $self, $chained_from, $map ) = @_;
 
    return (
        'Resource',
        'Args(0)',
        "Chained('$chained_from')",
        "Method('$map->{method}')",
        exists $map->{path} ? "PathPart('$map->{path}')" : 'PathPart',
        ( exists $map->{token} && $map->{token} eq 'create' )   ? 'CreateToken'
      : ( exists $map->{token} && $map->{token} eq 'validate' ) ? 'ValidateToken'
                                                                : ''
    );
}
</pre>

<p>_construct_action_attributes を上書きして、$map->{token} に入っている値を見て、CreateToken か ValidateToken アトリビュートを付加するようにしてます。</p>

<p>後は setup_(collection|member)_actions で token の指定するだけ。<br />
list と show を CreateToken にしてるのは、一覧画面とか詳細画面自体にフォームがある場合があるからです。</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/catalyst" rel="TAG" title="TAG:catalyst">catalyst</a>][<a href="http://vkgtaro.jp/tag/perl" rel="TAG" title="TAG:perl">perl</a>]<p>]]>
</content:encoded>
<dc:subject>perl</dc:subject><dc:subject>catalyst</dc:subject><dc:subject>perl</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-10-28T10:57:22+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/09/27/000643">
<title>[movie]The Wizard of Oz（オズの魔法使い）</title>
<link>http://vkgtaro.jp/2008/09/27/000643</link>
<description>最近何となく、オズの魔法使いを観たいなぁと思って Amazon 探したら、なんと 500 円だったので買って観た。安すぐる。

竜巻に巻き込まれてオズの国にたどり着いた少女ドロシーと飼い犬のトト、オズの大魔法使いに会うための道のりで出会う、脳みそがないかかし、ハートがないブリキの木こり、勇気がない臆病なライオンの皆さんよくご存じの物語。なんだけど、西の魔女とか北の魔女とか、道中は全然覚えてなかった。

オズの魔法使いposted with amazlet at 08.09.27ファーストトレーディング (2006-12-14)売り上げランキング: 2920おすすめ度の平均:  この名作が500円で入手できるとはAmazon.co.jp で詳細を見る

観はじめて気がついたけど思いっきりミュージカルだった。けどまぁ、これはこれで楽しめた。歌いつつ踊りつつのやりとりもおとぎ話の国ならではですね。マンチキンの小人達の踊りとか。個人的にかかしの動きが凄い良かった。中身が"わら"だから足もとがちょっと危うかったりする動きが良く表現されてる。踊ったりする中では周りに支えてもらったりして、ちょっとしたアクセントになってた。あとはライオンが凄い人の良さそうなおっさんだったりとか、ブリキの木こりが泣きそうになる度に「おい、泣くなよ。また錆ちまうぞ」って突っ込まれたりしてるトコが面白かった。

ベタだけど、自分に欠けていたと思っていたものが、実はすでに持っていたと気がつく話ってなんか好き。

「最初から言ってよ」「自分で学ぶべきことだもの」
</description>
<content:encoded><![CDATA[<p>最近何となく、オズの魔法使いを観たいなぁと思って Amazon 探したら、なんと 500 円だったので買って観た。安すぐる。</p>

<p>竜巻に巻き込まれてオズの国にたどり着いた少女ドロシーと飼い犬のトト、オズの大魔法使いに会うための道のりで出会う、脳みそがないかかし、ハートがないブリキの木こり、勇気がない臆病なライオンの皆さんよくご存じの物語。なんだけど、西の魔女とか北の魔女とか、道中は全然覚えてなかった。</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000LZ6EB8/taroweb-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51HdmZaRyAL._SL160_.jpg" alt="オズの魔法使い" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000LZ6EB8/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">オズの魔法使い</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B000LZ6EB8/taroweb-22/ref=nosim/" title="オズの魔法使い" target="_blank">amazlet</a> at 08.09.27</div></div><div class="amazlet-detail">ファーストトレーディング (2006-12-14)<br />売り上げランキング: 2920<br /></div><div class="amazlet-review" style="margin-top:10px; margin-bottom:10px"><div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5.0" /></div><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> この名作が500円で入手できるとは<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000LZ6EB8/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<p>観はじめて気がついたけど思いっきりミュージカルだった。けどまぁ、これはこれで楽しめた。歌いつつ踊りつつのやりとりもおとぎ話の国ならではですね。マンチキンの小人達の踊りとか。個人的にかかしの動きが凄い良かった。中身が"わら"だから足もとがちょっと危うかったりする動きが良く表現されてる。踊ったりする中では周りに支えてもらったりして、ちょっとしたアクセントになってた。あとはライオンが凄い人の良さそうなおっさんだったりとか、ブリキの木こりが泣きそうになる度に「おい、泣くなよ。また錆ちまうぞ」って突っ込まれたりしてるトコが面白かった。</p>

<p>ベタだけど、自分に欠けていたと思っていたものが、実はすでに持っていたと気がつく話ってなんか好き。</p>

<p>「最初から言ってよ」「自分で学ぶべきことだもの」<br />
</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/movie" rel="TAG" title="TAG:movie">movie</a>]<p>]]>
</content:encoded>
<dc:subject>観劇</dc:subject><dc:subject>movie</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-09-27T23:54:11+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/09/24/000642">
<title>[catalyst][dbic][perl]CA::Creditional::* で auto_create</title>
<link>http://vkgtaro.jp/2008/09/24/000642</link>
<description>ちょっと人に頼まれて、livedoor の認証 API を Catalyst で使うために Catalyst::Authentication::Credential::Livedoor を Catalyst::Plugin::Authentication::Credential::Livedoor からパクリつつ実装してたんだけど、認証 API だと元々手元の DB にはそのユーザはいないので、CA::Store::DBIx::Class とかを store に指定すると認証が通らなくなる。

そこで、auto_create を指定するらしいんだけど、ただ指定しただけだと auto_create なんてメソッド無いっていわれるので、テーブルクラスにメソッド生やしておく


package MyApp::Schema::Member;
 
use strict;
use warnings;
 
__PACKAGE__-&gt;resultset_class('MyApp::Schema::ResultSet::Member');
 
{
 
    package MyApp::Schema::ResultSet::Member;
    use Carp::Clan qw/^DBIx::Class/;
    use base qw(DBIx::Class::ResultSet);
 
    sub auto_create {
        my ( $class, $hashref, $c ) = @_;
 
        my $member = $class-&gt;create({
            livedoor_id =&gt; $hashref-&gt;{livedoor_id} || undef,
        });
 
        return $member;
 
    }
}
 
1;


んで、こんな感じ。


'Plugin::Authentication':
  default_realm: members
  realms:
    members:
      credential:
        class: Livedoor
        app_key: ************************
	seacret: **********
        get_livedoor_id : 1
      store:
        class: DBIx::Class
        user_class: DB::Member
        id_field: livedoor_id
      auto_create_user: 1


こうすると my $user = $realm-&gt;find_user( $userinfo, $c ); なコードのところで、auto_create してくれる。単純に create メソッド使ってくれるとも少しうれしいんだけども。

参考にしたの


    Catalyst-Authentication-Credential-OpenID
    Catalyst::Authentication::Credential::OpenID(CodeRepos の方) でログイン

</description>
<content:encoded><![CDATA[<p>ちょっと人に頼まれて、<a href="https://auth.livedoor.com/">livedoor の認証 API</a> を Catalyst で使うために Catalyst::Authentication::Credential::Livedoor を <a href="http://search.cpan.org/author/IKEBE/Catalyst-Plugin-Authentication-Credential-Livedoor-0.03/lib/Catalyst/Plugin/Authentication/Credential/Livedoor.pm">Catalyst::Plugin::Authentication::Credential::Livedoor</a> からパクリつつ実装してたんだけど、認証 API だと元々手元の DB にはそのユーザはいないので、CA::Store::DBIx::Class とかを store に指定すると認証が通らなくなる。</p>

<p>そこで、auto_create を指定するらしいんだけど、ただ指定しただけだと auto_create なんてメソッド無いっていわれるので、テーブルクラスにメソッド生やしておく</p>

<pre class="prettyprint">
package MyApp::Schema::Member;
 
use strict;
use warnings;
 
__PACKAGE__->resultset_class('MyApp::Schema::ResultSet::Member');
 
{
 
    package MyApp::Schema::ResultSet::Member;
    use Carp::Clan qw/^DBIx::Class/;
    use base qw(DBIx::Class::ResultSet);
 
    sub auto_create {
        my ( $class, $hashref, $c ) = @_;
 
        my $member = $class->create({
            livedoor_id => $hashref->{livedoor_id} || undef,
        });
 
        return $member;
 
    }
}
 
1;
</pre>

<p>んで、こんな感じ。</p>

<pre class="prettyprint">
'Plugin::Authentication':
  default_realm: members
  realms:
    members:
      credential:
        class: Livedoor
        app_key: ************************
	seacret: **********
        get_livedoor_id : 1
      store:
        class: DBIx::Class
        user_class: DB::Member
        id_field: livedoor_id
      auto_create_user: 1
</pre>

<p>こうすると my $user = $realm->find_user( $userinfo, $c ); なコードのところで、auto_create してくれる。単純に create メソッド使ってくれるとも少しうれしいんだけども。</p>

<h4>参考にしたの</h4>

<ul>
    <li><a href="http://coderepos.org/share/browser/lang/perl/Catalyst-Authentication-Credential-OpenID/trunk">Catalyst-Authentication-Credential-OpenID</a></li>
    <li><a href="http://hibinokoto.jp/archives/2008/04/post-262.html">Catalyst::Authentication::Credential::OpenID(CodeRepos の方) でログイン</a></li>
</ul>
]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/catalyst" rel="TAG" title="TAG:catalyst">catalyst</a>][<a href="http://vkgtaro.jp/tag/dbic" rel="TAG" title="TAG:dbic">dbic</a>][<a href="http://vkgtaro.jp/tag/perl" rel="TAG" title="TAG:perl">perl</a>]<p>]]>
</content:encoded>
<dc:subject>perl</dc:subject><dc:subject>catalyst</dc:subject><dc:subject>dbic</dc:subject><dc:subject>perl</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-09-24T01:28:45+09:00</dc:date>
</item>
<item rdf:about="http://vkgtaro.jp/2008/09/17/000641">
<title>[fantasy zone]SEGA AGES 2500シリーズ Vol.33 ファンタジーゾーン コンプリートコレクション</title>
<link>http://vkgtaro.jp/2008/09/17/000641</link>
<description>また買ってしまった……。今回は前回のような 3D 化はされて無い普通のファンタジーゾーンの模様。それだけじゃなくて、これまで出たファンタジーゾーンがほとんど詰まってるみたいですね。

SEGA AGES 2500シリーズ Vol.33 ファンタジーゾーン コンプリートコレクションposted with amazlet at 08.09.17セガ (2008-09-11)売り上げランキング: 73おすすめ度の平均:  SEGAAGES有終の美 近所のお店にあった! 素晴らしいです! いいのですが・・・ なつかし〜Amazon.co.jp で詳細を見る

またウィンクロンでやられるんだろうなぁ。</description>
<content:encoded><![CDATA[<p>また買ってしまった……。今回は<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00009VGCI/taroweb-22/ref=nosim/">前回</a>のような 3D 化はされて無い普通のファンタジーゾーンの模様。それだけじゃなくて、これまで出たファンタジーゾーンがほとんど詰まってるみたいですね。</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001BATFGI/taroweb-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/61Q4aJXuYfL._SL160_.jpg" alt="SEGA AGES 2500シリーズ Vol.33 ファンタジーゾーン コンプリートコレクション" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001BATFGI/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">SEGA AGES 2500シリーズ Vol.33 ファンタジーゾーン コンプリートコレクション</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B001BATFGI/taroweb-22/ref=nosim/" title="SEGA AGES 2500シリーズ Vol.33 ファンタジーゾーン コンプリートコレクション" target="_blank">amazlet</a> at 08.09.17</div></div><div class="amazlet-detail">セガ (2008-09-11)<br />売り上げランキング: 73<br /></div><div class="amazlet-review" style="margin-top:10px; margin-bottom:10px"><div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5.0" /></div><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> SEGAAGES有終の美<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> 近所のお店にあった!<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> 素晴らしいです!<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> いいのですが・・・<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> なつかし〜<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001BATFGI/taroweb-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<p>またウィンクロンでやられるんだろうなぁ。</p>]]>
<![CDATA[<p>[<a href="http://vkgtaro.jp/tag/fantasy%20zone" rel="TAG" title="TAG:fantasy zone">fantasy zone</a>]<p>]]>
</content:encoded>
<dc:subject>Game</dc:subject><dc:subject>fantasy zone</dc:subject>
<dc:creator>海賊たろ（小松大輔）</dc:creator>
<dc:date>2008-09-17T23:58:56+09:00</dc:date>
</item>


</rdf:RDF>
