<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>func09</title>
	<atom:link href="http://www.func09.com/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.func09.com/wordpress</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Fri, 19 Feb 2010 11:18:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facebooker のユーザー情報取得とキャッシュの仕組みを調べたメモ</title>
		<link>http://www.func09.com/wordpress/archives/814</link>
		<comments>http://www.func09.com/wordpress/archives/814#comments</comments>
		<pubDate>Fri, 19 Feb 2010 10:08:31 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=814</guid>
		<description><![CDATA[Facebooker

FacebookerはRuby on Rails用のFacebookプラグインです。
Facebookアプリケーションを作ったりFBMLのヘルパーがあったりREST APIへのラッパーが用意されて [...]]]></description>
			<content:encoded><![CDATA[<h2>Facebooker</h2>

<p><a href="http://github.com/mmangino/facebooker">Facebooker</a>はRuby on Rails用のFacebookプラグインです。<br />
Facebookアプリケーションを作ったりFBMLのヘルパーがあったりREST APIへのラッパーが用意されていて、大変に便利が良いです。</p>

<p>使い方は</p>

<p>チュートリアル<br />
<a href="http://apps.facebook.com/facebooker_tutorial/">http://apps.facebook.com/facebooker_tutorial/</a></p>

<p>や</p>

<p>Developing Facebook Platform Applications with Rails
<a href="http://www.pragprog.com/titles/mmfacer/developing-facebook-platform-applications-with-rails">http://www.pragprog.com/titles/mmfacer/developing-facebook-platform-applications-with-rails</a></p>

<p>を参考にしてください。<br />
書籍の方はちょっと情報が古いのですが、それでも十分役立ちます。</p>

<h2>ユーザー情報の取得方法</h2>

<p>Facebookerでのユーザー情報の取得は、とてもRails的でわかりやすいです。</p>

<p>script/console で実行する場合</p>

<div class="syntax_hilite"><div id="code-6">
<div class="code"># Facebook ユーザーID<br />
facebook_id = <span style="color:#800000;">1234567890</span><br />
<br />
# Facebookのセッションキー<br />
session_key = <span style="color:#CC0000;">'xxxxxxxxxxxxxxxxxxxxxxxxx'</span><br />
<br />
# Facebook APIにアクセスするためのセッション作成<br />
fb_session = Facebooer::<span style="">Session</span>.<span style="">create</span><br />
fb_sessoin.<span style="">secure_with</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>fb_sessoin, facebook_id, <span style="color:#800000;">1</span>.<span style="">hour</span>.<span style="">from_now</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
fb_session.<span style="">user</span> #=&gt; セッションユーザー情報。Facebooker::<span style="">User</span>のインスタンス<br />
fb_session.<span style="">user</span>.<span style="">friends</span> #=&gt; セッションユーザーの友人のユーザー情報。Facebooker::<span style="">User</span>インスタンスの配列</div>
</div></div>

<p><br /></p>

<p>ユーザー情報の取得には、<a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">Users.getInfo API</a>を利用する。</p>

<h2>ユーザー情報のキャッシュ</h2>

<p>Facebooker::Userインスタンスは、生成された後、最初にプロパティ（#name, #age ..etc）にアクセスしたタイミングで<a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">Users.getInfo API</a>にリクエストを投げる。一度リクエストしたら、２度目はキャッシュしたメモリから値を返す。</p>

<p>Facebooker::Userインスタンスを作成しても、プロパティにアクセスしなければ<a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">Users.getInfo API</a>をリクエストしないので、少しはパフォーマンスに効果があるのかもしれない。</p>

<div class="syntax_hilite"><div id="code-7">
<div class="code">user = fb_session.<span style="">user</span> # まだREST APIにリクエストしてない<br />
user.<span style="">name</span> #=&gt; <span style="color:#CC0000;">'Yukio Hatoyama'</span> このタイミングでREST APIにリクエストしている<br />
user.<span style="">sex</span> #=&gt; <span style="color:#CC0000;">'Male'</span> メモリーから取得</div>
</div></div>

<p><br /></p>

<h3>同じユーザーでもキャッシュは効かない場合がある、ていうかほとんど。</h3>

<p>基本的にはインスタンス変数にデータを蓄えているだけなので、同じFacebookユーザーでもオブジェクトが違えば、キャッシュは当然効いていないため、それぞれAPIへリクエストすることになる。</p>

<div class="syntax_hilite"><div id="code-8">
<div class="code"># UID123456789のユーザー<br />
user = Facebooker::<span style="">User</span>.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
# users.<span style="">getInfo</span> APIにアクセスする<br />
user.<span style="">name</span> #=&gt; <span style="color:#CC0000;">'Yukio Hatoyama'</span><br />
<br />
# 同じUIDを持つユーザー<br />
sameuser = Facebooker::<span style="">User</span>.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
# Users.<span style="">getInfo</span> APIにアクセスする<br />
sameuser.<span style="">name</span> #=&gt; <span style="color:#CC0000;">'Yukio Hatoyama'</span></div>
</div></div>

<p><br /></p>

<h2>フレンド情報の取得</h2>

<p>Facebookerでのフレンド情報取得は、Facebooker::User#friendsを利用することになる。
このようなAPIがFacebookに存在しているわけではなくて、<a href="http://wiki.developers.facebook.com/index.php/Friends.get">Friends.get API</a>で友人のID一覧を取得した後にその人数分<a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">Users.getInfo API</a>をリクエストしにいっている。</p>

<p>従って、かなり効率が悪いです・・。</p>

<div class="syntax_hilite"><div id="code-9">
<div class="code">user = Facebooker::<span style="">User</span>.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
user.<span style="">friends</span> #=&gt; Userインスタンスの配列コレクション。友達が<span style="color:#800000;">20</span>人いれば、リクエスト数は<span style="color:#800000;">21</span>回。</div>
</div></div>

<p><br /></p>

<h2>フレンド情報のキャッシュ</h2>

<p>フレンド情報の取得にはキャッシュが効く。効かなかったらやばいよね。</p>

<div class="syntax_hilite"><div id="code-10">
<div class="code">user = Facebooker::<span style="">User</span>.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
# フレンド数分、users.<span style="">getInfo</span> APIをリクエスト<br />
user.<span style="">friends</span> <br />
<br />
# メモリのキャッシュから返すので、APIはリクエストしない<br />
user.<span style="">friends</span> <br />
<br />
# プロパティを指定した場合、もう一度人数分リクエストする<br />
user.<span style="">friends</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>:name, :sex<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <br />
<br />
# キャッシュから返すのでAPIはリクエストしない<br />
user.<span style="">friends</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>:name, :sex<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</div></div>

<p><br /></p>

<p>これもUserインスタンス内の変数にキャッシュしているだけだから、あまり効果なさそうだなぁ。。</p>

<h2>最後に</h2>

<p>FacebookerはFacebookアプリをRubyで作りたい場合、とても便利です。<br />
情報も他のライブラリに比べて一番充実していると思います。</p>

<p>僕もこれまでFacebook関連のアレをやってきましたが、Facebookerのインターフェイスの良さにはしびれっぱなしです。</p>

<p>キャッシュに関しては、FacebookのユーザーIDベースでKey Value Storeに保持しておけるようにできたらいいなと思っていますが、Facebookの規約的にアウトじゃないのか？とか、そもそもユーザー情報の見え方がユーザーによっては違うはずなので、やっぱりサービス全体でキャッシュするのはダメかなぁ。</p>

<h2>追記</h2>

<p>Facebooker::User#users(ids)メソッドを使えば、リクエストが１回で済むことがわかった。<br />
基本的にはこっちを使おうかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/814/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[sinatra for flasher] 大量のダミーデータを返すAPIを作る</title>
		<link>http://www.func09.com/wordpress/archives/801</link>
		<comments>http://www.func09.com/wordpress/archives/801#comments</comments>
		<pubDate>Wed, 17 Feb 2010 04:30:41 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[haml]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=801</guid>
		<description><![CDATA[FLASHer のためのSinatra入門 [導入編]

前回の続きです。

今回は大量のダミーデータを返すAPIを作ってみます。
要件としては


住所録を返すAPI
本番サーバはPHPなので、URLもそれに合わせる
 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.func09.com/wordpress/archives/764">FLASHer のためのSinatra入門 [導入編]</a></p>

<p>前回の続きです。</p>

<p>今回は大量のダミーデータを返すAPIを作ってみます。<br />
要件としては</p>

<ul>
<li>住所録を返すAPI</li>
<li>本番サーバはPHPなので、URLもそれに合わせる</li>
<li>100件程度、ランダムで返す</li>
<li>XMLの内容は、名前、メール、メッセージ、性別、国</li>
</ul>

<p>という感じです。</p>

<p><span id="more-801"></span></p>

<h2>Haml</h2>

<p>今回はテンプレート言語に<a href="http://haml-lang.com/">Haml</a>を使っていきます。<br />
タグ構造をインデントと簡略構文でガシガシ書いていけるので、慣れると気持ちいいです。</p>

<p>日本Hamlの会<br />
<a href="http://haml.ursm.jp/">http://haml.ursm.jp/</a></p>

<p>Getting Started Haml<br />
<a href="http://haml.ursm.jp/getting-started">http://haml.ursm.jp/getting-started</a></p>

<p>ざっくりと説明すると</p>

<div class="syntax_hilite"><div id="code-20">
<div class="code">!!! XML<br />
%items<br />
&nbsp; %item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#CC0000;">"1"</span><span style="color:#006600; font-weight:bold;">&#41;</span> こんにちは<br />
&nbsp; %item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#CC0000;">"2"</span><span style="color:#006600; font-weight:bold;">&#41;</span> さようなら</div>
</div></div>

<p><br /></p>

<p>というHamlマークアップが</p>

<div class="syntax_hilite"><div id="code-21">
<div class="code">&lt;?xml version=<span style="color:#CC0000;">'1.0'</span> encoding=<span style="color:#CC0000;">'utf-8'</span> ?&gt;<br />
&lt;items&gt;<br />
&nbsp; &lt;item id=<span style="color:#CC0000;">"1"</span>&gt;こんにちは&lt;/item&gt;<br />
&nbsp; &lt;item id=<span style="color:#CC0000;">"2"</span>&gt;さようなら&lt;/item&gt;<br />
&lt;/items&gt;</div>
</div></div>

<p><br /></p>

<p>に変換されます。<br />
雰囲気だけ掴んでもらって、詳しくは<a href="http://haml-lang.com/tutorial.html">チュートリアル</a>や<a href="http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html">ドキュメント</a>を御覧下さい。</p>

<h2>Forgeryでサンプルデータの作成から解放される</h2>

<p><a href="http://github.com/sevenwire/forgery">forgeryというgemライブラリ</a>で、煩瑣なサンプルデータ作成とはおさらばできる。</p>

<div class="syntax_hilite"><div id="code-22">
<div class="code">sudo gem install forgery</div>
</div></div>

<p><br /></p>

<p>でインストールして、使い方は</p>

<div class="syntax_hilite"><div id="code-23">
<div class="code">require <span style="color:#CC0000;">'forgery'</span><br />
puts Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:internet<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">email_address</span> #=&gt; tmccoy@topiclounge.<span style="">biz</span><br />
puts Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:internet<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">email_address</span> #=&gt; charper@voolia.<span style="">net</span></div>
</div></div>

<p><br /></p>

<p>こんな感じ。標準でサンプルデータの辞書がいろいろ入っていて、上記のコードはメールアドレスのサンプルデータをランダムに生成している。</p>

<p>今回はForgeryを積極的に使う。</p>

<h2>コード</h2>

<p>いきなりですが最終型のコード</p>

<div class="syntax_hilite"><div id="code-24">
<div class="code">require <span style="color:#CC0000;">'rubygems'</span><br />
require <span style="color:#CC0000;">'sinatra'</span><br />
require <span style="color:#CC0000;">'forgery'</span><br />
<br />
before do<br />
&nbsp; content_type <span style="color:#CC0000;">'xml'</span> # 常にContent-Typeを <span style="color:#CC0000;">'application/xml'</span>に<br />
end<br />
<br />
get <span style="color:#CC0000;">'/api/getFriends.php'</span> do<br />
&nbsp; haml :get_friends_php<br />
end<br />
<br />
__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= yield<br />
<br />
@@ get_friends_php<br />
%friends<br />
&nbsp; - rand<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">times</span> do |i|<br />
&nbsp; &nbsp; %friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#CC0000;">"#{i}"</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; %name<br />
&nbsp; &nbsp; &nbsp; &nbsp; %first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; %last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">last_name</span><br />
&nbsp; &nbsp; &nbsp; %email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:internet<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">email_address</span><br />
&nbsp; &nbsp; &nbsp; %message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:lorem_ipsum<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">paragraph</span><br />
&nbsp; &nbsp; &nbsp; %gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:personal<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">gender</span><br />
&nbsp; &nbsp; &nbsp; %country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:address<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">country</span></div>
</div></div>

<p><br /></p>

<p>今回は1ファイルで完結させてみた。</p>

<p>ブラウザで http://localhost:9393/api/getFriends.php （ポートはshotgunデフォルト）にアクセスすると、下みたいなXMLが取得できる。</p>

<p><img src="http://www.func09.com/wordpress/wp-content/uploads/16ff47c99cb3e8cd7ed0b7054cfbbdb8.jpg" alt="" title="次のソース_ http___localhost_9393_api_getFriends.php" width="550" height="464" class="alignnone size-full wp-image-805" /></p>

<h3>beforeフィルター</h3>

<p>常にXMLを返すAPIなので、リクエストを受け付けて処理する前にContent-Typeを'application/xml'にするように設定。<a href="http://www.sinatrarb.com/book.html#filters">Sinatraのbeforeフィルター</a>という機能で実現。</p>

<div class="syntax_hilite"><div id="code-25">
<div class="code">before do<br />
&nbsp; content_type <span style="color:#CC0000;">'xml'</span> # 常にContent-Typeを <span style="color:#CC0000;">'application/xml'</span>に<br />
end</div>
</div></div>

<p><br /></p>

<h3>URLに対する処理</h3>

<p>/api/getFriends.phpというパスに対して処理したい場合、Sinatraのgetメソッドに続いて、そのパスを定義する。 do ~ end ブロックの中に処理を記述。</p>

<p>この場合Hamlでget_friends_phpテンプレートを出力する処理のみだね。</p>

<p>パスに普通に「.php」とか使えているところに注目してもらいたい。要するにマッチすればなんでも良いので「.pl」でも「.cgi」でも「.do」でも本番と同じパスを表現できるはずだ。</p>

<div class="syntax_hilite"><div id="code-26">
<div class="code">get <span style="color:#CC0000;">'/api/getFriends.php'</span> do<br />
&nbsp; haml :get_friends_php<br />
end</div>
</div></div>

<p><br /></p>

<h3>Hamlによるテンプレート</h3>

<p>Sinatraには「ファイル内テンプレート」という機能があって、テンプレートをわざわざ別ファイルとして用意しなくても、ソースファイルの最後（<strong>END</strong>以降）に テンプレートを書いても良いことになっている。</p>

<p>テンプレート名は「@@index」とか「@@layout」とか先頭に「＠＠」を付けて置くこと。</p>

<div class="syntax_hilite"><div id="code-27">
<div class="code">__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= yield<br />
<br />
@@ get_friends_php<br />
%friends<br />
&nbsp; - rand<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">times</span> do |i|<br />
&nbsp; &nbsp; %friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#CC0000;">"#{i}"</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; %name<br />
&nbsp; &nbsp; &nbsp; &nbsp; %first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; %last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">last_name</span><br />
&nbsp; &nbsp; &nbsp; %email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:internet<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">email_address</span><br />
&nbsp; &nbsp; &nbsp; %message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:lorem_ipsum<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">paragraph</span><br />
&nbsp; &nbsp; &nbsp; %gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:personal<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">gender</span><br />
&nbsp; &nbsp; &nbsp; %country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:address<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">country</span></div>
</div></div>

<p><br /></p>

<h4>レイアウト</h4>

<p>layout という名前のテンプレートがあれば、Sinatraはすべてのテンプレートのレイアウト、つまり枠として利用する。</p>

<p>「!!! XML」はXMLのドキュタイプ宣言を簡略表現で、「= yield」は、ここにメインテンプレートの内容を流し込むよーという処理。</p>

<h4>get_friends_php テンプレート</h4>

<div class="syntax_hilite"><div id="code-28">
<div class="code">@@ get_friends_php<br />
%friends<br />
&nbsp; - rand<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">times</span> do |i|<br />
&nbsp; &nbsp; %friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#CC0000;">"#{i}"</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; %name<br />
&nbsp; &nbsp; &nbsp; &nbsp; %first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; %last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">last_name</span><br />
&nbsp; &nbsp; &nbsp; %email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:internet<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">email_address</span><br />
&nbsp; &nbsp; &nbsp; %message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:lorem_ipsum<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">paragraph</span><br />
&nbsp; &nbsp; &nbsp; %gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:personal<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">gender</span><br />
&nbsp; &nbsp; &nbsp; %country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span>:address<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">country</span></div>
</div></div>

<p><br /></p>

<p>XMLのタグ表現を「%タグ名」とインデント階層でマークアップしていく。<br />
「- rand(100).times do |i|」は、以降の下層インデントの部分をランダムで100件まで繰り返させている。</p>

<p>あとはForgeryの住所辞書や名前辞書を使ってサンプルデータを埋め込むよ。</p>

<h2>さいごに</h2>

<p>今回はFlashで使えそうな大量のダミーデータAPIをさくっと作ってみたよ。慣れれば10分もあれば作れるので、下手に実データを作るより楽なはず。</p>

<p>今後は</p>

<ul>
<li>HTTP POSTでデータを送信するような場合</li>
<li>JSONの場合</li>
</ul>

<p>など書いてみようかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/801/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Sinatra] Sinatraでnamespaceルート（嘘）</title>
		<link>http://www.func09.com/wordpress/archives/799</link>
		<comments>http://www.func09.com/wordpress/archives/799#comments</comments>
		<pubDate>Tue, 16 Feb 2010 14:57:23 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=799</guid>
		<description><![CDATA[Sinatra 楽しい！

今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。

かといってコントローラーを複数に別けるのもSinatraス [...]]]></description>
			<content:encoded><![CDATA[<p>Sinatra 楽しい！</p>

<p>今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。</p>

<p>かといってコントローラーを複数に別けるのもSinatraスタイルに反しているような気がする。そこでルートの階層をわかりやすくするTIPS。</p>

<div class="syntax_hilite"><div id="code-32">
<div class="code">def namespace routename, &amp;block<br />
&nbsp; yield<br />
end</div>
</div></div>

<p><br /></p>

<p>namespaceというメソッドをトップレベルに定義しておく。このメソッドはブロックの内容を実行するだけ。</p>

<div class="syntax_hilite"><div id="code-33">
<div class="code">get <span style="color:#CC0000;">'/users'</span> do<br />
&nbsp; <span style="color:#CC0000;">'Users Index'</span><br />
end<br />
get <span style="color:#CC0000;">'/users/new'</span> do<br />
&nbsp; <span style="color:#CC0000;">'New User'</span><br />
end<br />
get <span style="color:#CC0000;">'/todos'</span> do<br />
&nbsp; <span style="color:#CC0000;">'Todos Index'</span><br />
end<br />
get <span style="color:#CC0000;">'/todos/:id'</span> do<br />
&nbsp; <span style="color:#CC0000;">"Show Todo #{params[:id]}"</span><br />
end</div>
</div></div>

<p><br /></p>

<p>これが</p>

<div class="syntax_hilite"><div id="code-34">
<div class="code">namespace <span style="color:#CC0000;">'/users'</span> do<br />
&nbsp; get <span style="color:#CC0000;">'/users'</span> do<br />
&nbsp; &nbsp; <span style="color:#CC0000;">'Users Index'</span><br />
&nbsp; end<br />
&nbsp; get <span style="color:#CC0000;">'/users/new'</span> do<br />
&nbsp; &nbsp; <span style="color:#CC0000;">'New User'</span><br />
&nbsp; end<br />
end<br />
namespace <span style="color:#CC0000;">'/todos'</span> do<br />
&nbsp; get <span style="color:#CC0000;">'/todos'</span> do<br />
&nbsp; &nbsp; <span style="color:#CC0000;">'Todos Index'</span><br />
&nbsp; end<br />
&nbsp; get <span style="color:#CC0000;">'/todos/:id'</span> do<br />
&nbsp; &nbsp; <span style="color:#CC0000;">"Show Todo #{params[:id]}"</span><br />
&nbsp; end<br />
end</div>
</div></div>

<p><br /></p>

<p>こう書けるようになる。</p>

<p>少し見やすい</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/799/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FLASHer のためのSinatra入門 [導入編]</title>
		<link>http://www.func09.com/wordpress/archives/764</link>
		<comments>http://www.func09.com/wordpress/archives/764#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:33:01 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[erb]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=764</guid>
		<description><![CDATA[はじめに

こんにちはーFlasherのみなさん。
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。
久しぶりにFLASHerのための記事を書けそうです。

今日とりあげる [...]]]></description>
			<content:encoded><![CDATA[<h2>はじめに</h2>

<p>こんにちはーFlasherのみなさん。<br />
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。<br />
久しぶりにFLASHerのための記事を書けそうです。</p>

<p>今日とりあげるのは<a href="http://www.sinatrarb.com/">Sinatra</a>というRubyで作られた超シンプルなフレームワークです。<br /></p>

<div class="syntax_hilite"><div id="code-51">
<div class="code">require <span style="color:#CC0000;">'rubygems'</span><br />
require <span style="color:#CC0000;">'sinatra'</span><br />
get <span style="color:#CC0000;">'/hi'</span> do<br />
&nbsp; <span style="color:#CC0000;">"Hello World!"</span><br />
end</div>
</div></div>

<p><br /></p>

<p>このたった5行で、http://localhost:4567/hi にアクセスすると「Hello World!」というテキストを返すAPIサーバがローカルPC上に完成するんだ。</p>

<p>Rubyがわからなくたって、どんなプログラムなのか一目瞭然だ。シンプルだと思わないかい？<br />
<strong>今回はこのシンプルなSinatraを使って、あなたのFlash案件に使える、より本番に近いモックAPIサーバを作ろうというお話です。</strong></p>

<p><span id="more-764"></span></p>

<h2>この記事の対象者</h2>

<ul>
<li>サーバ連携なFlash案件が多いFlash開発者</li>
<li>Macユーザー（Windowsの人もインストール編以外は共通だと思う）</li>
<li>ターミナル.appが少しは触れる人（達人じゃなくてよい）</li>
</ul>

<h2>今回のシチュエーション</h2>

<p>FlashでToDo管理アプリを作ることになった。
まずはToDoの一覧をサーバからXMLで取得して、それが表示できるようにしたい。</p>

<p>APIのURLと、どんなXMLが返ってくるかは決まっているんだけど、肝心なサーバ側は完成していないどころかリリース前日には出来上がるスケジュールらしい。
こうなったら自分でダミーAPIを用意しながら開発するしかない。</p>

<p>ToDo一覧を取得するAPIと返ってくるXMLのサンプル<br />
<strong>http://example.jp/api/todolist</strong></p>

<div class="syntax_hilite"><div id="code-52">
<div class="code">&lt;?xml version=<span style="color:#CC0000;">"1.0"</span> encoding=<span style="color:#CC0000;">"UTF-8"</span>?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;todo id=‘<span style="color:#800000;">1</span>’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id=‘<span style="color:#800000;">2</span>’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div>
</div></div>

<p><br /></p>

<h2>効率よく開発を進めるためのFlashの設計</h2>

<p>さて、上記のようなシチュエーションの場合、ローカルにダミーXMLを配置して、それを読み込むというのが一番てっとり早い開発手法なんだと思う。
しかしAPIの種類が100種類とか膨大だったり、同じAPIでもパラメーターで返却のバリエーションが変わるとか想定すると、<strong>本番により近いAPIモックを用意できるのがベスト</strong>だ。</p>

<p>例えば本番APIとドメイン以外まったくURLが同じという構成があったら、Flashの設計も随分綺麗になると思うよ。</p>

<div class="syntax_hilite"><div id="code-53">
<div class="code">import flash.<span style="">events</span>.*;<br />
import flash.<span style="">net</span>.*;<br />
<br />
<span style="color:#FF9933; font-style:italic;">// 実行環境をSWF起動時に設定する</span><br />
var environment:String = <span style="color:#CC0000;">'development'</span>;<br />
<br />
<span style="color:#FF9933; font-style:italic;">// 設定</span><br />
var setting:Object = <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; production: <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#FF9933; font-style:italic;">// 本番用</span><br />
&nbsp; &nbsp; host: <span style="color:#CC0000;">'http://example.jp'</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span>,<br />
&nbsp; development: <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#FF9933; font-style:italic;">// 開発用</span><br />
&nbsp; &nbsp; host: <span style="color:#CC0000;">'http://localhost:4567'</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
<br />
<span style="color:#FF9933; font-style:italic;">// ローダー</span><br />
var request:URLRequest = new URLRequest<span style="color:#006600; font-weight:bold;">&#40;</span>setting<span style="color:#006600; font-weight:bold;">&#91;</span>environment<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="">host</span>.<span style="">concat</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'/api/todolist'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
var loader:URLLoader = new URLLoader<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
loader.<span style="">addEventListener</span><span style="color:#006600; font-weight:bold;">&#40;</span>Event.<span style="">COMPLETE</span>, function<span style="color:#006600; font-weight:bold;">&#40;</span>e:Event<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; trace<span style="color:#006600; font-weight:bold;">&#40;</span>URLLoader<span style="color:#006600; font-weight:bold;">&#40;</span>e.<span style="">target</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="">data</span><span style="color:#006600; font-weight:bold;">&#41;</span>;&nbsp; &nbsp;&nbsp; <br />
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
loader.<span style="">load</span><span style="color:#006600; font-weight:bold;">&#40;</span>request<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div></div>

<p><br /></p>

<p>上のコードでは、「environment」変数の中身がdevelopmentなら開発環境用のAPIを、productionなら本番環境用のAPIをリクエストする。</p>

<h2>インストール編</h2>

<p>ここからはSinatraをインストールする話</p>

<p>Sinatraでモックサーバを作るには最低でも以下のようなものが要求されるよ、がんばれ！</p>

<ul>
<li>ターミナル.appの操作</li>
<li>ruby</li>
<li>rubygems</li>
<li>sinatra</li>
</ul>

<p>まずはターミナル.appを起動しよう。Macの「/アプリケーション/ユーティリティ/」に入っている。これを機会にターミナルをDockに入れておいたら周りの同僚に一目おかれるかもね。</p>

<p>起動したらRubyが入っているか確認だ。MacOS10.4くらいからRubyは最初から入っているはず。最新の10.6ならRubyのバージョンは1.8.7のはずだ。</p>

<div class="syntax_hilite"><div id="code-54">
<div class="code">% ruby -v<br />
ruby <span style="color:#800000;">1</span>.<span style="color:#800000;">8</span>.<span style="color:#800000;">7</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">2008</span>-<span style="color:#800000;">08</span>-<span style="color:#800000;">11</span> patchlevel <span style="color:#800000;">72</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#91;</span>universal-darwin10.<span style="color:#800000;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</div></div>

<p><br /></p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg"><img src="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg" alt="" title="b6a800e18860f12ebd76a523990cf2c6" width="555" height="383" class="alignnone size-full wp-image-777" /></a></p>

<p>次にrubygemsのバージョン確認。rubygemsはrubyのサードアプリをインストールしたりするための管理ツールだよ。
今回のSinatraもそうだし、有名なRuby on Railsもrubygemsでインストールできるんだ。</p>

<div class="syntax_hilite"><div id="code-55">
<div class="code">% gem -v<br />
<span style="color:#800000;">1</span>.<span style="color:#800000;">3</span>.<span style="color:#800000;">5</span></div>
</div></div>

<p><br /></p>

<p>ひょっとしたらバージョンは1.3.5より低いかも。そのままでも大丈夫だと思うけどアップグレードするなら。</p>

<div class="syntax_hilite"><div id="code-56">
<div class="code">% sudo gem update —system</div>
</div></div>

<p><br /></p>

<p>でアップグレードしよう。</p>

<h2>Sinatraのインストール</h2>

<p>さて、RubyGemでお目当てのSinatraをインストールする。ついでに他にも使えそうなライブラリをいれておくよ。</p>

<div class="syntax_hilite"><div id="code-57">
<div class="code">sudo gem install sinatra haml rack shotgun</div>
</div></div>

<p><br /></p>

<p>パスワードを要求されるので、自分のアカウントのパスワードを入力しよう。するとインストールが始まる。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg" alt="" title="ターミナル — zsh — 65×19-1" width="559" height="385" class="alignnone size-full wp-image-780" /></a></p>

<p>お疲れ様でした！あとはダミーサーバを書くだけだ。</p>

<h2>さぁ、SinatraでダミーAPIを書くんだ！</h2>

<p>ここまで準備ができたら、Flashプロジェクトの中にでもsinatra用のディレクトリ「mock」を作る。全体の構成はこんな感じにしたよ。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg" alt="" title="mytodos" width="505" height="203" class="alignnone size-full wp-image-782" /></a></p>

<p>mockディレクトリの中にapp.rbというテキストファイルを作成して、エディタで以下のように書く。</p>

<div class="syntax_hilite"><div id="code-58">
<div class="code">require <span style="color:#CC0000;">'rubygems'</span><br />
require <span style="color:#CC0000;">'sinatra'</span><br />
get <span style="color:#CC0000;">'/api/todolist'</span> do<br />
&nbsp; <span style="color:#CC0000;">'Hello World!'</span><br />
end</div>
</div></div>

<p><br /></p>

<p>そして、ターミナルでプロジェクトのmockディレクトリまで移動してサーバを起動しよう。
え？ターミナルでmockディレクトリまで移動ができない？
デスクトップにmytodosプロジェクトフォルダがあるなら</p>

<div class="syntax_hilite"><div id="code-59">
<div class="code">% cd ~/Desktop/mytodos/mock</div>
</div></div>

<p><br /></p>

<p>と入力してエンターだ。</p>

<p>それでもわからなかったら、「cd 」とだけ書いて、移動したいフォルダをターミナルへドラッグドロップでもオッケー。</p>

<p>そしてサーバ起動だ。</p>

<div class="syntax_hilite"><div id="code-60">
<div class="code">% ruby app.<span style="">rb</span></div>
</div></div>

<p><br /></p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg" alt="" title="ターミナル — ruby — 65×19" width="556" height="386" class="alignnone size-full wp-image-784" /></a></p>

<p>こんな感じになってるかな？</p>

<p>なっていれば、君による君だけのAPIサーバが起動した。おめでとう！
そうそう、サーバを止めたい時はCTRL+Cを押すんだよ。</p>

<p>ブラウザで <a href="http://localhost:4567/api/todolist">http://localhost:4567/api/todolist</a>アクセスしてみよう。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg" alt="" title="http___localhost_4567_api_todolist" width="518" height="318" class="alignnone size-full wp-image-786" /></a></p>

<p>すごい！完璧だ！サーバサイドエンジニアになれるんじゃないか？！</p>

<h2>モックAPIを作る</h2>

<p>僕らの目的は「Hello World」を表示することじゃない。XMLを返すサーバを作ることだから先を急ぐよ。</p>

<p>mock/app.rbをちょっと変更してきちんとXMLを返すようにしてみるよ</p>

<div class="syntax_hilite"><div id="code-61">
<div class="code">require <span style="color:#CC0000;">'rubygems'</span><br />
require <span style="color:#CC0000;">'sinatra'</span><br />
get <span style="color:#CC0000;">'/api/todolist'</span> do<br />
&nbsp; content_type <span style="color:#CC0000;">'xml'</span><br />
&nbsp; erb :api_todolist<br />
end</div>
</div></div>

<p><br /></p>

<p>そして、mock/views/api_todolist.erb というファイルを作成して</p>

<div class="syntax_hilite"><div id="code-62">
<div class="code">&lt;?xml version=<span style="color:#CC0000;">"1.0"</span> encoding=<span style="color:#CC0000;">"UTF-8"</span>?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;todo id=<span style="color:#CC0000;">'1'</span>&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id=<span style="color:#CC0000;">'2'</span>&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div>
</div></div>

<p><br /></p>

<p>としよう。</p>

<p>ブラウザでアクセスすれば、今度はXMLが返ってくるようになったはずだ。</p>

<p>簡単に説明すると、「content_type ‘xml’」でXMLとしてレスポンスを返すように定義して、
「erb :api_todolist」で views/api_todolist.erbというテンプレートファイルを出力してね。</p>

<p>ということになる。ERBというのはRubyでスタンダードなテンプレートシステムだ。<br />
参考：<a href="http://www.druby.org/ilikeruby/erb.html">http://www.druby.org/ilikeruby/erb.html</a></p>

<h2>もうちょっと高度なことをする</h2>

<p>これじゃローカルにXMLを置くのと変わらないよドラえもーん、と嘆いている、そこののび太くん。
ERBを使えば繰り返しが可能なので、例えば999件のXMLを返したい時はこうだ。</p>

<p>mock/views/api_todolist を修正</p>

<div class="syntax_hilite"><div id="code-63">
<div class="code">&lt;?xml version=<span style="color:#CC0000;">"1.0"</span> encoding=<span style="color:#CC0000;">"UTF-8"</span>?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;% <span style="color:#800000;">999</span>.<span style="">times</span> do |id| %&gt;<br />
&nbsp; &lt;todo id=<span style="color:#CC0000;">'&lt;%= id %&gt;'</span>&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る &lt;%= id %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div>
</div></div>

<p><br /></p>

<p>数値.times do ~ end で数値分繰り返し処理されるのはRuby独特の書き方だ。</p>

<h2>さらに高度なことをする</h2>

<p>単純な繰り返しじゃいやだ！自分でレコードを作りたい！でもデータベースは嫌だ！
OK。ならこうだ。</p>

<p>mock/app.rb修正</p>

<div class="syntax_hilite"><div id="code-64">
<div class="code">require <span style="color:#CC0000;">'rubygems'</span><br />
require <span style="color:#CC0000;">'sinatra'</span><br />
get <span style="color:#CC0000;">'/api/todolist'</span> do<br />
&nbsp; # TODOの配列を作る %w はRubyの配列式<br />
&nbsp; @todos = %w<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; コンビニに寄る<br />
&nbsp; &nbsp; ジャンプを立ち読みする<br />
&nbsp; &nbsp; 牛乳をレジへ持っていく<br />
&nbsp; &nbsp; <span style="color:#800000;">178</span>円払う<br />
&nbsp; &nbsp; 店員さんにありがとうと言う<br />
&nbsp; &nbsp; 牛乳を買って帰る<br />
&nbsp; &nbsp; 牛乳を冷蔵庫へしまう<br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; content_type <span style="color:#CC0000;">'xml'</span><br />
&nbsp; erb :api_todolist<br />
end</div>
</div></div>

<p><br /></p>

<p>mock/views/api_todolist.erb修正</p>

<div class="syntax_hilite"><div id="code-65">
<div class="code">&lt;?xml version=<span style="color:#CC0000;">"1.0"</span> encoding=<span style="color:#CC0000;">"UTF-8"</span>?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;% @todos.<span style="">each_with_index</span> do |todo, id| %&gt;<br />
&nbsp; &lt;todo id=<span style="color:#CC0000;">'&lt;%= id %&gt;'</span>&gt;<br />
&nbsp; &nbsp; &lt;title&gt;&lt;%= todo %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div>
</div></div>

<p><br /></p>

<p>app.rbで設定した@todosをテンプレートからアクセスしている。<br />
@todos.each_with_index do |element, index| ~ end という形もRubyでは日常茶飯事に使われる配列の繰り返し方。</p>

<h2>さいごに</h2>

<p>ざっとFLASHerがSinatraを使ってモックサーバを用意する方法を書いてみた。</p>

<p>Sinatra側のコードは書き換える度にサーバを再起動する必要があるから注意してね。
それがめんどくさい場合はshotgunコマンドを使うと、再起動の心配は必要無くなる。</p>

<div class="syntax_hilite"><div id="code-66">
<div class="code">% shotgun app.<span style="">rb</span></div>
</div></div>

<p><br /></p>

<p>駆け足だったので、もっと具体的なことをしたいとか、これはどーやって実現するんだ？という質問があったら、コメントなりメールなり<a href="http://twitter.com/func09">@func09</a>なりへどうぞ。</p>

<p>それから、モックサーバを作るためにRubyにハマりすぎると、僕みたいにFlasherを引退してまでRubyを書くことになっちゃうからほどほどにね。</p>

<p>enjoy flash and ruby!</p>

<p>参考URL: <a href="http://d.hatena.ne.jp/seiunsky/20091108/1257695951">AS3でちょっとしたサーバサイドのプログラムが必要になる時に毎回書くのが面倒なので、適当に sinatra で書いた</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/764/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>どうしてAuthlogic::Session::Baseがコントローラーにアクセスできるのか調べた</title>
		<link>http://www.func09.com/wordpress/archives/751</link>
		<comments>http://www.func09.com/wordpress/archives/751#comments</comments>
		<pubDate>Mon, 15 Feb 2010 08:04:47 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=751</guid>
		<description><![CDATA[Railsで最近人気の認証フレームワーク「Authlogic」は、ユーザーセッションをまるでActiveRecord風なモデルのように扱えることによって、セッション周りの処理をコントローラーからモデル側へ移すことができて [...]]]></description>
			<content:encoded><![CDATA[<p>Railsで最近人気の認証フレームワーク「Authlogic」は、ユーザーセッションをまるでActiveRecord風なモデルのように扱えることによって、セッション周りの処理をコントローラーからモデル側へ移すことができていて、コードがシンプルになります（コントローラーがごちゃごちゃしないという点で）。</p>

<p>AuthlogicではユーザーセッションをAuthlogic::Session::Baseを継承したクラスで管理するようになっており</p>

<div class="syntax_hilite"><div id="code-71">
<div class="code"># user_session.<span style="">rb</span><br />
class UserSession &lt;Authlogic::<span style="">Session</span>::<span style="">Base</span><br />
end<br />
<br />
# ログインする<br />
session = UserSession.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>:login =&gt; <span style="color:#CC0000;">"bjohnson"</span>, :password =&gt; <span style="color:#CC0000;">"my password"</span>, :remember_me =&gt; true<span style="color:#006600; font-weight:bold;">&#41;</span><br />
session.<span style="">save</span><br />
<br />
# ログインしているユーザーセッションを取得する<br />
current_user_session = UserSession.<span style="">find</span><br />
<br />
# ログアウトする<br />
session.<span style="">destroy</span></div>
</div></div>

<p><br /></p>

<p>と、こんな感じのインターフェイスでログイン周りの処理が書けて、非常にわかりやすい。</p>

<p>しかし隠蔽されているとはいえ、モデルからセッションやCookieにアクセスするといった事を自分で実装したことがなかったので、一体どんな仕組になっとるんか？と考え調べました。</p>

<h2>読んだポインタ</h2>

<p><a href="http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/abstract_adapter.rb">http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/abstract_adapter.rb</a><br />
<a href="http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb">http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb</a></p>

<h2>３行で説明</h2>

<ol>
<li>ActionControllerのbefore_filterの先頭で</li>
<li>ActionControllerをラップしたアダプタークラス（RailsAdapter）への参照を</li>
<li>Authlogic::Session::Base.controllerに代入している</li>
</ol>

<p>モジュールをインクルードしている箇所
<a href="http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L48">http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L48</a></p>

<div class="syntax_hilite"><div id="code-72">
<div class="code">ActionController::<span style="">Base</span>.<span style="">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>:include, Authlogic::<span style="">ControllerAdapters</span>::<span style="">RailsAdapter</span>::<span style="">RailsImplementation</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</div></div>

<p><br /></p>

<p>コントローラーの先頭のフィルターに:activate_authlogicという処理を追加している箇所
<a href="http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L36">http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L36</a></p>

<div class="syntax_hilite"><div id="code-73">
<div class="code">klass.<span style="">prepend_before_filter</span> :activate_authlogic</div>
</div></div>

<p><br /></p>

<p>Authlogic::Session::Base.controllreにコントローラーのアダプターを代入している箇所
<a href="http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L40-42">http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L40-42</a></p>

<div class="syntax_hilite"><div id="code-74">
<div class="code">def activate_authlogic<br />
&nbsp; Authlogic::<span style="">Session</span>::<span style="">Base</span>.<span style="">controller</span> = RailsAdapter.<span style="">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>self<span style="color:#006600; font-weight:bold;">&#41;</span><br />
end</div>
</div></div>

<p><br /></p>

<p>とても勉強になったんだけど、Authlogicはソースが綺麗に分割されすぎてて探しにくい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/751/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「ナゼナゼくん」というサービスが面白い</title>
		<link>http://www.func09.com/wordpress/archives/733</link>
		<comments>http://www.func09.com/wordpress/archives/733#comments</comments>
		<pubDate>Wed, 03 Feb 2010 03:50:40 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[WEB]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=733</guid>
		<description><![CDATA[前田製作所さんの作った「ナゼナゼくん」というサービスがおもしろい。

自分の問題だと思っている事柄を入力すると、「なんで××なのですか？」としつこく質問されつづけているうちに、自分と向き合わざるを得なくなるツールです。
 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://maedaseisaku.com/">前田製作所</a>さんの作った「<a href="http://maedaseisaku.com/labs/nazenaze/">ナゼナゼくん</a>」というサービスがおもしろい。</p>

<p>自分の問題だと思っている事柄を入力すると、「なんで××なのですか？」としつこく質問されつづけているうちに、自分と向き合わざるを得なくなるツールです。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/9f24719ae51e10438bcdd0a464f23645.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/9f24719ae51e10438bcdd0a464f23645.jpg" alt="" title="ナゼナゼくん" width="550" height="513" class="alignnone size-full wp-image-732" /></a></p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/6b46eb8e7a3afa24e7eab266c9f46fce.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/6b46eb8e7a3afa24e7eab266c9f46fce.jpg" alt="" title="ナゼナゼくん-1" width="550" height="487" class="alignnone size-full wp-image-731" /></a></p>

<p>まぁ、どんな不満も結局は自分に問題があるという結果になってしまうというか、そうでない方が問題なのだけど、いくらWebサービスとは言え、質問攻めにされるのはいい気分じゃないです。</p>

<p>結構むかむかして、心がささくれだってくるんですが、訳のわからんキャラのせいでどーでもよくなります。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/05c6bbde9548ed4e88775fbc0d56ab25.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/05c6bbde9548ed4e88775fbc0d56ab25.jpg" alt="" title="ナゼナゼくん-2" width="186" height="164" class="alignnone size-full wp-image-736" /></a></p>

<p>つーか何、残像してんだよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/733/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails]delayed_jobの再試行ロジックについてメモ</title>
		<link>http://www.func09.com/wordpress/archives/726</link>
		<comments>http://www.func09.com/wordpress/archives/726#comments</comments>
		<pubDate>Tue, 15 Dec 2009 11:28:52 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=726</guid>
		<description><![CDATA[Railsで非同期処理？

railsで非同期処理をやる場合、最近はdelayed_jobがメジャーらしいですね。

以前はbackgrounDRbが定番だったようだけど、EngineYardが「友達にBackgroun [...]]]></description>
			<content:encoded><![CDATA[<h2>Railsで非同期処理？</h2>

<p>railsで非同期処理をやる場合、最近は<a href="http://github.com/collectiveidea/delayed_job">delayed_job</a>が<a href="http://ruby-toolbox.com/categories/queueing.html">メジャーらしい</a>ですね。</p>

<p>以前はbackgrounDRbが定番だったようだけど、EngineYardが「<a href="http://www.engineyard.com/blog/2009/5-tips-for-deploying-background-jobs/">友達にBackgrounDRbを使わせるな</a>」とまで書いているので、そこまで言われると使う気になりませんでした。実際リソース食いだったし。</p>

<h2>使い方参考ページ</h2>

<p>使い方はそんなに難しくないので、ここで説明することは放棄します。</p>

<p><a href="http://github.com/collectiveidea/delayed_job/blob/master/README.textile">README</a>と<a href="http://railscasts.com/episodes/171-delayed-job">Railscastsのエピソード171</a>でなんとかなると思います。</p>

<h2>再試行のロジック</h2>

<p>いろいろとすっとばして本題、キューの再試行のロジックが変だなぁと思ったのでメモです。</p>

<h3>Delayed::Job::max_attempts</h3>

<p>delayed_jobには試行回数上限があって、この上限値を超えるまでリトライしつづけます。
デフォルトは25回で、Delayed::Job::max_attempts という定数に設定されています。</p>

<h3>Delayed::Worker::sleep_delay</h3>

<p>ワーカーが起動するインターバルです。デフォルトは5秒。</p>

<p>例えば絶対に失敗するキューがあった時、<br /></p>

<div class="syntax_hilite"><div id="code-76">
<div class="code">キュー失敗、５秒待機、キュー失敗、５秒待機、（以下<span style="color:#800000;">25</span>回失敗するまで繰り返し）</div>
</div></div>

<p><br />
という流れを勝手にイメージしていたのですが、そうではないみたいです。<br /></p>

<h3>キューが失敗した時の再スケジューリング</h3>

<p>キューが失敗すると、次に実行する予定時刻を決めます。そのロジックが</p>

<blockquote>On failure, the job is scheduled again in 5 seconds + N ** 4, where N is the number of retries.</blockquote>

<p>となっています。</p>

<p>「トライした回数の4乗に5秒足した時間」後にリトライをするよう再スケジューリングするので、失敗すればするほどインターバルが開いていきます。</p>

<p>1回失敗したら次回のリトライは6秒後 <br />
2回失敗したら次回のリトライは21秒後 <br />
3回失敗したら次回のリトライは86秒後 <br />
4回失敗したら次回のリトライは261秒後 <br />
5回失敗したら次回のリトライは630秒後 <br />
6回失敗したら次回のリトライは1301秒後 <br />
7回失敗したら次回のリトライは2406秒後 <br />
8回失敗したら次回のリトライは4101秒後 <br />
9回失敗したら次回のリトライは6566秒後 <br />
10回失敗したら次回のリトライは10005秒後 <br /></p>

<p>最初の方は１分以内にリトライさせますが、10回目ともなるとリトライは２時間後。<br />
何度も失敗していると、もうこいつアカンわ・・と見捨てられていく感じを良く表現したロジックですねー。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/726/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mixiアプリでの外部通信のあれこれを調べた</title>
		<link>http://www.func09.com/wordpress/archives/721</link>
		<comments>http://www.func09.com/wordpress/archives/721#comments</comments>
		<pubDate>Thu, 19 Nov 2009 07:14:25 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mixi]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=721</guid>
		<description><![CDATA[久しぶりにmixiアプリの事を調査したよ。

多分日頃からOpenSocial開発をしてる人には当たり前のことなんだろうけど
ぐぐってもわからなかったので。。

iframeで外部ページを埋め込めるか？

mixiアプリ [...]]]></description>
			<content:encoded><![CDATA[<p>久しぶりにmixiアプリの事を調査したよ。</p>

<p>多分日頃からOpenSocial開発をしてる人には当たり前のことなんだろうけど<br />
ぐぐってもわからなかったので。。</p>

<h2>iframeで外部ページを埋め込めるか？</h2>

<p>mixiアプリはそもそもiframe内にgadget.xmlをキャッシュされた状態で起動する。</p>

<p>つまり、mixi.jp内のページにmixi-platform.comにキャッシュされたコンテンツを表示していて<br />
さらにその中で別ドメインなコンテンツを表示できるのか？</p>

<p>結論としてはできる。
ただ外部ページからではOpenSocialAPIに接触しようがないから、不便は不便。</p>

<p>iframeの中にfacebookアプリを埋め込んだりもできたよ。<br />
でもmixiアプリ上で認証させるのは多分規約違反。</p>

<p>iframeで外部コンテンツを表示するっていう作法も、外部サイトへの遷移の規約に従ってない気がするのでアウトかな？</p>

<p>どうでしょう？</p>

<h2>Flashから外部コンテンツとの通信</h2>

<p>OpenSocialのFlash埋め込みAPIを使って、配置したSWFから<br />
URLLoaderなんかを使って普通にクロスドメインな通信ができるかチェック。</p>

<p>これもできる。相手のサーバから拒否されてなければ。</p>

<p>JavaScriptはXHRを使えないから（ひょっとして使える？）、makeRequestするわけだけど<br />
Flashは普通に通信できるなら、mixiアプリは開発しやすさで言えばFlashで作るに限るってことかなぁ。</p>

<p>makeRequestはoAuthの署名リクエストが使えるので、通信にセキュリティを保証したい場合は有効だと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/721/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Railsのソースの中に「らきすた」が出てくる件</title>
		<link>http://www.func09.com/wordpress/archives/716</link>
		<comments>http://www.func09.com/wordpress/archives/716#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:18:12 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=716</guid>
		<description><![CDATA[なんかto_jsonについて調べてたら

activerecord/lib/active_record/serializers/json_serializer.rb

にらきすたのこなたが出てくるんだけど、これって有名な [...]]]></description>
			<content:encoded><![CDATA[<p>なんかto_jsonについて調べてたら</p>

<p>activerecord/lib/active_record/serializers/json_serializer.rb</p>

<p>にらきすたのこなたが出てくるんだけど、これって有名なんだろうか・・。</p>

<p>あまりにも意外すぎて、なんの作業してたか忘れたよ。いい迷惑だ！</p>

<p><a href="http://github.com/rails/rails/blob/55501b9f6ab46d45db04a81956579402511ad092/activerecord/lib/active_record/serializers/json_serializer.rb#L18-75">http://github.com/rails/rails/blob/55501b9f6ab46d45db04a81956579402511ad092/activerecord/lib/active_record/serializers/json_serializer.rb#L18-75</a></p>

<p>--</p>

<p>追記：</p>

<p>例えばこんな感じ、コメントの中にサンプルコードとして登場します</p>

<div class="syntax_hilite"><div id="code-78">
<div class="code">#&nbsp; &nbsp;konata = User.<span style="">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; #&nbsp; &nbsp;ActiveRecord::<span style="">Base</span>.<span style="">include_root_in_json</span> = true<br />
&nbsp; &nbsp; #&nbsp; &nbsp;konata.<span style="">to_json</span><br />
&nbsp; &nbsp; #&nbsp; &nbsp;# =&gt; <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0000;">"user"</span>: <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0000;">"id"</span>: <span style="color:#800000;">1</span>, <span style="color:#CC0000;">"name"</span>: <span style="color:#CC0000;">"Konata Izumi"</span>, <span style="color:#CC0000;">"age"</span>: <span style="color:#800000;">16</span>,<br />
&nbsp; &nbsp; #&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#CC0000;">"created_at"</span>: <span style="color:#CC0000;">"2006/08/01"</span>, <span style="color:#CC0000;">"awesome"</span>: true<span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div></div>

<p><br /></p>

<p>はてブのコメントによると２年前からコードの中に存在していたらしい。<br />
アニメ好きな外人のコミッターが犯人だったんすね。</p>

<p>http://blog.codefront.net/2007/10/15/konata-izumi-in-edge-rails/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/716/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Railscastsと同じTextMateのテーマ</title>
		<link>http://www.func09.com/wordpress/archives/712</link>
		<comments>http://www.func09.com/wordpress/archives/712#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:54:00 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[textmate]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=712</guid>
		<description><![CDATA[

RailsCasts大好きです。


Rails好き
わかりやすい
ネタが早い
声が素敵


などいろいろ良い点がありますね。

さて、最近TextMateを使うようになりまして（メインはNetBeansです）
あこ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.func09.com/wordpress/wp-content/uploads/2009/10/friendship.rb-—-bdd_sample.jpg" alt="friendship.rb — bdd_sample" title="friendship.rb — bdd_sample" width="550" height="326" class="alignnone size-full wp-image-713" /></p>

<p><a href="http://railscasts.com/">RailsCasts</a>大好きです。</p>

<ul>
<li>Rails好き</li>
<li>わかりやすい</li>
<li>ネタが早い</li>
<li>声が素敵</li>
</ul>

<p>などいろいろ良い点がありますね。</p>

<p>さて、最近TextMateを使うようになりまして（メインはNetBeansです）
あこがれのRailsCastsみたいな色にしたいと奮闘しましたが
本家からダウンロードできるのでした・・</p>

<p><a href="http://railscasts.com/about">http://railscasts.com/about</a></p>

<p>好きな人はぜひ！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/712/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
