<?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 &#187; rails</title>
	<atom:link href="http://www.func09.com/wordpress/archives/tag/rails/feed" rel="self" type="application/rss+xml" />
	<link>http://www.func09.com/wordpress</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 04:25:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[rails] resque-web にだけBasic認証をかける方法</title>
		<link>http://www.func09.com/wordpress/archives/1194</link>
		<comments>http://www.func09.com/wordpress/archives/1194#comments</comments>
		<pubDate>Fri, 04 Feb 2011 03:42:07 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[resque]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=1194</guid>
		<description><![CDATA[メモです。 非同期処理にResqueを使う場合、/resque にアクセスすることでResqueのジョブ管理画面を利用できます。 公開する場合、管理画面には認証をかけておきたいので、簡単にBasic認証をかけます。 Ra [...]]]></description>
			<content:encoded><![CDATA[<p>メモです。</p>

<p>非同期処理にResqueを使う場合、/resque にアクセスすることでResqueのジョブ管理画面を利用できます。</p>

<p>公開する場合、管理画面には認証をかけておきたいので、簡単にBasic認証をかけます。</p>

<p>Rails.root にあるconfig.ruを編集します。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> ::<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">expand_path</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'../config/environment'</span>, &nbsp;<span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'resque/server'</span><br />
<span style="color:#008000; font-style:italic;"># run Rack::URLMap.new</span><br />
<span style="color:#008000; font-style:italic;"># &nbsp; &quot;/&quot; &nbsp; &nbsp; &nbsp; =&gt; MyApp::Application,</span><br />
<span style="color:#008000; font-style:italic;"># &nbsp; &quot;/resque&quot; =&gt; Resque::Server.new</span><br />
<br />
map <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; run <span style="color:#6666ff; font-weight:bold;">MyApp::Application</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
map <span style="color:#996600;">'/resque'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; use <span style="color:#6666ff; font-weight:bold;">Rack::Auth::Basic</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>user, passwd<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; user == <span style="color:#996600;">'admin'</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> passwd == <span style="color:#996600;">'passwd'</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; run <span style="color:#6666ff; font-weight:bold;">Resque::Server</span>.<span style="color:#9900CC;">new</span><br />
end<span style="color:#006600; font-weight:bold;">%</span></div></div>

<p>これで「admin/passwd」で認証が掛かりました。</p>

<p>Rackって便利っすねー。</p>

<p>参考：<a href="http://akr97.com/capsule/?tag=ruby&#038;paged=3
http://akr97.com/capsule/?tag=ruby&#038;paged=3">http://akr97.com/capsule/?tag=ruby&amp;paged=3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/1194/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Rails3][Mongoid] スレッド式掲示板を作ってみた</title>
		<link>http://www.func09.com/wordpress/archives/980</link>
		<comments>http://www.func09.com/wordpress/archives/980#comments</comments>
		<pubDate>Mon, 16 Aug 2010 02:22:38 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mongoid]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=980</guid>
		<description><![CDATA[Rails3で簡単なサンプルを作ってみた スレッド式掲示板です。 レスは追加できるけど、スレッド追加する機能は作り忘れた。 Mongoid版 http://github.com/func09/rails3_sample_ [...]]]></description>
			<content:encoded><![CDATA[<p>Rails3で簡単なサンプルを作ってみた
スレッド式掲示板です。</p>

<p><img class="alignnone size-medium wp-image-984" title="Bbs" src="http://www.func09.com/wordpress/wp-content/uploads/Bbs-300x282.jpg" alt="" width="300" height="282" /></p>

<p><img class="alignnone size-medium wp-image-983" title="Bbs-1" src="http://www.func09.com/wordpress/wp-content/uploads/Bbs-1-300x280.jpg" alt="" width="300" height="280" /></p>

<p>レスは追加できるけど、スレッド追加する機能は作り忘れた。</p>

<p><strong>Mongoid版</strong></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/tree/mongoid-20100813">http://github.com/func09/rails3_sample_bbs/tree/mongoid-20100813</a></p>

<p><strong>ActiveRecord版</strong></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/tree/activerecord-20100813">http://github.com/func09/rails3_sample_bbs/tree/activerecord-20100813</a></p>

<p>それぞれのREADMEに従えば動くはず。
rake db:seed でサンプルデータがインサートされるます。</p>

<p>Rails3だからといって、別段特殊なコードは書けなかった。
よくもわるくもいつもどおり書けた。</p>

<p><a href="http://github.com/func09/rails3_sample_bbs/zipball/mongoid-20100813">http://github.com/func09/rails3_sample_bbs/zipball/mongoid-20100813</a></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/zipball/activerecord-20100813">http://github.com/func09/rails3_sample_bbs/zipball/activerecord-20100813</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/980/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails3のリリース前にチェックすべきこと</title>
		<link>http://www.func09.com/wordpress/archives/970</link>
		<comments>http://www.func09.com/wordpress/archives/970#comments</comments>
		<pubDate>Tue, 10 Aug 2010 08:14:58 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=970</guid>
		<description><![CDATA[みんな大好きRuby on Railsも、RCが出て、いよいよバージョン３登場間際といった感じですね 2010年8月30日にリリースされました。 ベータ版をいれるのはちょっと・・と尻込みしていた人（僕）も、やっと重い尻を [...]]]></description>
			<content:encoded><![CDATA[<p>みんな大好きRuby on Railsも、<a href="http://weblog.rubyonrails.org/2010/7/26/rails-3-0-release-candidate">RC</a>が出て、<del datetime="2010-08-30T05:28:37+00:00">いよいよバージョン３登場間際といった感じですね</del> 2010年8月30日にリリースされました。</p>

<p>ベータ版をいれるのはちょっと・・と尻込みしていた人（僕）も、やっと重い尻を上げてみようじゃないかと思わなくもないのではないでしょうか？</p>

<p>そこで、Rails3のリリース前にチェックすべき事などをメモします。</p>

<h2>RVMをインストールして、Rails2とRails3の環境を共存させる</h2>

<p>Rails3から、railsコマンドの挙動が大きく変わっているので、これまでのRails2も使う必要がある場合は、RVMで複数のRuby環境を準備しておくのが良いです。</p>

<p>Ruby Freaks Lounge 第39回　RVM（Ruby Version Manager）による環境構築<br />
<a href="http://gihyo.jp/dev/serial/01/ruby/0039">http://gihyo.jp/dev/serial/01/ruby/0039</a><br /></p>

<p>Ruby Freaks Lounge 第40回　RVM（Ruby Version Manager）による環境構築（2）<br />
<a href="http://gihyo.jp/dev/serial/01/ruby/0040">http://gihyo.jp/dev/serial/01/ruby/0040</a></p>

<p>※追記を参照のこと</p>

<h2>Rails2 と Rails3 の違いを、ざっくりっと学ぶ</h2>

<p>いままで慣れ親しんだRails2のインターフェイスは、結構互換性があるので、移行に関してものすごく大きなインパクトがあるわけではないようです。</p>

<p>Rails2との違いを比較しながら、Rails3の新しい部分を紹介した素晴らしいスクリーンキャストがあります。
各コンポーネントごとに動画が用意されていて、資料のPDF（全８６ページ）もとてもわかりやすく、一度Rails2を学んだ人であれば、ひととおり流せばRails3の新機能を把握できると思います。</p>

<p>Dive into Rails3<br />
<a href="http://rubyonrails.org/screencasts/rails3">http://rubyonrails.org/screencasts/rails3</a><br /></p>

<p>上記のプレゼン資料（PDF）<br />
<a href="http://assets.en.oreilly.com/1/event/40/The%20Rails%203%20Ropes%20Course%20Presentation.pdf">http://assets.en.oreilly.com/1/event/40/The%20Rails%203%20Ropes%20Course%20Presentation.pdf</a></p>

<p>時間がないひとはPDFを見るだけで十分ですよ。</p>

<h2>Rails2のプロジェクトをRails3にアップデートする</h2>

<p>既存のRails2プロジェクトをRails3にアップデートする方法は、RailsCastsで紹介されています。</p>

<p>Upgrading to Rails 3 Part 1<br />
<a href="http://railscasts.com/episodes/225-upgrading-to-rails-3-part-1">http://railscasts.com/episodes/225-upgrading-to-rails-3-part-1</a></p>

<p>Upgrading to Rails 3 Part 2<br />
<a href="http://railscasts.com/episodes/226-upgrading-to-rails-3-part-2">http://railscasts.com/episodes/226-upgrading-to-rails-3-part-2</a></p>

<p>Enjoy Rails3!</p>

<h2>追記：2010-08-30</h2>

<p>RVMはGemによるインストールが非推奨なので、こちらの方法に従うのがよいとのことです（by <a href="http://twitter.com/babie/status/22489257187">@babie</a>）。</p>

<p><a href="http://rvm.beginrescueend.com/rvm/install/">http://rvm.beginrescueend.com/rvm/install/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/970/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails]PaperClipでクロッピング</title>
		<link>http://www.func09.com/wordpress/archives/968</link>
		<comments>http://www.func09.com/wordpress/archives/968#comments</comments>
		<pubDate>Fri, 06 Aug 2010 09:58:57 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[paperclip]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=968</guid>
		<description><![CDATA[PaperClipでクロッピングしたい場合の書き方メモ has_attached_file :picture, :styles =&#62; { :thumb =&#62; "200x200#" } サイズ指定の後ろに「#」 [...]]]></description>
			<content:encoded><![CDATA[<p>PaperClipでクロッピングしたい場合の書き方メモ</p>

<pre class="brush:ruby">has_attached_file :picture, :styles =&gt; { :thumb =&gt; "200x200#" }</pre>

<p>サイズ指定の後ろに「#」で切り抜きになるようだ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/968/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails] nifty_layoutがHamlに対応してた</title>
		<link>http://www.func09.com/wordpress/archives/922</link>
		<comments>http://www.func09.com/wordpress/archives/922#comments</comments>
		<pubDate>Tue, 29 Jun 2010 03:48:44 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[haml]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=922</guid>
		<description><![CDATA[NiftyGeneratorとは？ すごくニッチな話題になってしまいますが Railsでサクっとモックを作る時、僕はnifty_generatorを使います http://github.com/ryanb/nifty-g [...]]]></description>
			<content:encoded><![CDATA[<h2>NiftyGeneratorとは？</h2>

<p>すごくニッチな話題になってしまいますが
Railsでサクっとモックを作る時、僕はnifty_generatorを使います</p>

<p><a href="http://github.com/ryanb/nifty-generators">http://github.com/ryanb/nifty-generators</a></p>

<p>nifty_generatorは<a href="http://railscasts.com/">RailsCasts</a>のryanb作の、サクっと便利でシンプルなコードを生成してくれるパッケージで</p>

<ul>
    <li>レイアウト</li>
    <li>Scaffold</li>
    <li>設定ファイル</li>
    <li>認証処理</li>
</ul>

<p>を生成するコマンドを提供してくれます。</p>

<p>RailsCasts内のサンプルアプリケーションは、いつもnifty_generatorを使ってますね。</p>

<p>標準のGeneratorスクリプトに比べて良い点は</p>

<ul>
    <li>デザインがシンプルだけど適度に良く、拡張する土台にしやすい</li>
    <li>レイアウトが良くできている</li>
    <li>レイアウトだけ生成できる</li>
</ul>

<p>という具合です。</p>

<p>特にScaffoldしなくてもレイアウトを生成してくれるのは、非常に便利なので僕は常用しているのですが、</p>

<p>最近ViewをHamlで書くようになってから、ちょっと不便だなぁと感じていました。</p>

<h2>Haml対応してた</h2>

<p>ヘルプみたら、普通に対応してるし・・。</p>

<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">script<span style="color: #000000; font-weight: bold;">/</span>generate nifty_layout <span style="color: #660033;">--haml</span><br />
create app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>layouts<br />
create public<span style="color: #000000; font-weight: bold;">/</span>stylesheets<br />
exists app<span style="color: #000000; font-weight: bold;">/</span>helpers<br />
create public<span style="color: #000000; font-weight: bold;">/</span>stylesheets<span style="color: #000000; font-weight: bold;">/</span>sass<br />
create app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>layouts<span style="color: #000000; font-weight: bold;">/</span>application.html.haml<br />
create public<span style="color: #000000; font-weight: bold;">/</span>stylesheets<span style="color: #000000; font-weight: bold;">/</span>sass<span style="color: #000000; font-weight: bold;">/</span>application.sass<br />
create app<span style="color: #000000; font-weight: bold;">/</span>helpers<span style="color: #000000; font-weight: bold;">/</span>layout_helper.rb</div></div>

<p>すごい！かわいい！nifty_layout！</p>

<p>そして僕はどんどんコードをエディタで書かなくなるんだ！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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="codecolorer-container rails blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Facebook ユーザーID</span><br />
facebook_id = <span style="color:#006666;">1234567890</span><br />
<br />
<span style="color:#008000; font-style:italic;"># Facebookのセッションキー</span><br />
session_key = <span style="color:#996600;">'xxxxxxxxxxxxxxxxxxxxxxxxx'</span><br />
<br />
<span style="color:#008000; font-style:italic;"># Facebook APIにアクセスするためのセッション作成</span><br />
fb_session = <span style="color:#6666ff; font-weight:bold;">Facebooer::Session</span>.<span style="color:#9900CC;">create</span><br />
fb_sessoin.<span style="color:#9900CC;">secure_with</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>fb_sessoin, facebook_id, <span style="color:#006666;">1</span>.<span style="color:#9900CC;">hour</span>.<span style="color:#9900CC;">from_now</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
fb_session.<span style="color:#9900CC;">user</span> <span style="color:#008000; font-style:italic;">#=&gt; セッションユーザー情報。Facebooker::Userのインスタンス</span><br />
fb_session.<span style="color:#9900CC;">user</span>.<span style="color:#9900CC;">friends</span> <span style="color:#008000; font-style:italic;">#=&gt; セッションユーザーの友人のユーザー情報。Facebooker::Userインスタンスの配列</span></div></div>

<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="codecolorer-container rails blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = fb_session.<span style="color:#9900CC;">user</span> <span style="color:#008000; font-style:italic;"># まだREST APIにリクエストしてない</span><br />
user.<span style="color:#9900CC;">name</span> <span style="color:#008000; font-style:italic;">#=&gt; 'Yukio Hatoyama' このタイミングでREST APIにリクエストしている</span><br />
user.<span style="color:#9900CC;">sex</span> <span style="color:#008000; font-style:italic;">#=&gt; 'Male' メモリーから取得</span></div></div>

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

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

<div class="codecolorer-container rails blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># UID123456789のユーザー</span><br />
user = <span style="color:#6666ff; font-weight:bold;">Facebooker::User</span>.<span style="color:#5A0A0A; font-weight:bold;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#008000; font-style:italic;"># users.getInfo APIにアクセスする</span><br />
user.<span style="color:#9900CC;">name</span> <span style="color:#008000; font-style:italic;">#=&gt; 'Yukio Hatoyama'</span><br />
<br />
<span style="color:#008000; font-style:italic;"># 同じUIDを持つユーザー</span><br />
sameuser = <span style="color:#6666ff; font-weight:bold;">Facebooker::User</span>.<span style="color:#5A0A0A; font-weight:bold;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#008000; font-style:italic;"># Users.getInfo APIにアクセスする</span><br />
sameuser.<span style="color:#9900CC;">name</span> <span style="color:#008000; font-style:italic;">#=&gt; 'Yukio Hatoyama'</span></div></div>

<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="codecolorer-container rails blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = <span style="color:#6666ff; font-weight:bold;">Facebooker::User</span>.<span style="color:#5A0A0A; font-weight:bold;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
user.<span style="color:#9900CC;">friends</span> <span style="color:#008000; font-style:italic;">#=&gt; Userインスタンスの配列コレクション。友達が20人いれば、リクエスト数は21回。</span></div></div>

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

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

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = <span style="color:#6666ff; font-weight:bold;">Facebooker::User</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">123456789</span>, fb_session<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
<span style="color:#008000; font-style:italic;"># フレンド数分、users.getInfo APIをリクエスト</span><br />
user.<span style="color:#9900CC;">friends</span> <br />
<br />
<span style="color:#008000; font-style:italic;"># メモリのキャッシュから返すので、APIはリクエストしない</span><br />
user.<span style="color:#9900CC;">friends</span> <br />
<br />
<span style="color:#008000; font-style:italic;"># プロパティを指定した場合、もう一度人数分リクエストする</span><br />
user.<span style="color:#9900CC;">friends</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:sex</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <br />
<br />
<span style="color:#008000; font-style:italic;"># キャッシュから返すのでAPIはリクエストしない</span><br />
user.<span style="color:#9900CC;">friends</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:sex</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></div>

<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>どうして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="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># user_session.rb<br />
class UserSession &lt; Authlogic::Session::Base<br />
end<br />
<br />
# ログインする<br />
session = UserSession.new(:login =&gt; &quot;bjohnson&quot;, :password =&gt; &quot;my password&quot;, :remember_me =&gt; true)<br />
session.save<br />
<br />
# ログインしているユーザーセッションを取得する<br />
current_user_session = UserSession.find<br />
<br />
# ログアウトする<br />
session.destroy</div></div>

<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="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ActionController::Base.send(:include, Authlogic::ControllerAdapters::RailsAdapter::RailsImplementation)</div></div>

<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="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">klass.prepend_before_filter :activate_authlogic</div></div>

<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="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">def activate_authlogic<br />
&nbsp; Authlogic::Session::Base.controller = RailsAdapter.new(self)<br />
end</div></div>

<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>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です） あこがれのRail [...]]]></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>
		<item>
		<title>[rails] BackgrounDRbのメモ</title>
		<link>http://www.func09.com/wordpress/archives/688</link>
		<comments>http://www.func09.com/wordpress/archives/688#comments</comments>
		<pubDate>Wed, 30 Sep 2009 08:12:43 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=688</guid>
		<description><![CDATA[個人的メモ 結構リソース食うので次はdelayed_jobにしたい・・ 実行してことはあるけど、正常に終了してないキューを取得する BdrbJobQueue.find(:all, :conditions =&#62; [' [...]]]></description>
			<content:encoded><![CDATA[<p>個人的メモ</p>

<p>結構リソース食うので次はdelayed_jobにしたい・・</p>

<h2>実行してことはあるけど、正常に終了してないキューを取得する</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue.find(:all, :conditions =&gt; ['finished = ? AND taken = ?',0,1])</div></div>

<h2>キューをもう一回実行させる</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue#release_job</div></div>

<h2>上の合わせ技</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue.find(:all, :conditions =&gt; ['finished = ? AND taken = ?',0,1]).each do |job|<br />
&nbsp; job.release_job<br />
end</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/688/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails] paperclipでAmazon CloudFrontを使う</title>
		<link>http://www.func09.com/wordpress/archives/680</link>
		<comments>http://www.func09.com/wordpress/archives/680#comments</comments>
		<pubDate>Thu, 10 Sep 2009 10:55:11 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=680</guid>
		<description><![CDATA[Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。 前回paperclipからS3を使う設定はわかったので、今回はさらにCloudFrontを利用するための設定です 前 [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。</p>

<p><a href="http://www.func09.com/wordpress/archives/674">前回paperclipからS3を使う設定</a>はわかったので、今回はさらにCloudFrontを利用するための設定です</p>

<h2>前回のおさらい</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">has_attached_file :avatar,<br />
&nbsp; :storage =&gt; :s3,<br />
&nbsp; :s3_credentials =&gt; &quot;#{RAILS_ROOT}/config/s3.yml&quot;,<br />
&nbsp; :path =&gt; &quot;:attachment/:id/:style.:extension&quot;,<br />
&nbsp; :bucket =&gt; 'mybucket'</div></div>

<p>前回こんな感じでS3の設定をしました。</p>

<p>コンソールから利用してみると</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = User.new<br />
user.avatar = File.open('/tmp/myface.jpg')<br />
user.save<br />
<br />
puts user.avatar.url #=&gt; http://mybucket.s3.amazonaws.com/avatar/1/original.jpg</div></div>

<p>こんな感じでS3のURLがとれるようになっているはず。</p>

<h2>s3_host_aliasを効かす</h2>

<p>キャッシュサービスであるCloudFrontを利用する場合は、ホスト名を適宜変えるだけなので
paperclipが勝手にやってくれるといいなぁ〜なんて思いました。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">has_attached_file :avatar,<br />
&nbsp; :storage =&gt; :s3,<br />
&nbsp; :s3_credentials =&gt; &quot;#{RAILS_ROOT}/config/s3.yml&quot;,<br />
&nbsp; :path =&gt; &quot;:attachment/:id/:style.:extension&quot;,<br />
&nbsp; :bucket =&gt; 'mybucket',<br />
&nbsp; :s3_host_alias =&gt; &quot;xxxxxxxxxxxx.cloudfront.net&quot;,<br />
&nbsp; :url =&gt; &quot;:s3_alias_url&quot;</div></div>

<p>オプションが２つ増えてます</p>

<ul>
<li>:s3_host_alias は、エイリアスのFQDNを記述しておきます。</li>
<li>:url には「&#8221;:s3_alias_url&#8221;」を記述します。注意なのは、rubyのシンボルじゃなくて、文字列だってところです。ハマりました。</li>
</ul>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = User.new<br />
user.avatar = File.open('/tmp/myface.jpg')<br />
user.save<br />
<br />
puts user.avatar.url #=&gt; http://xxxxxxxxxxxx.cloudfront.net/avatar/1/original.jpg</div></div>

<p>わーーこりゃ幸せだ。</p>

<h2>余談</h2>

<p>さらにサイト全体でアセット関係（public以下）もCloudFrontにしたければ</p>

<p>config/environments/#{RAILS_ENV}.rb 内で</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config.action_controller.asset_host = &quot;http://xxxxxxxxxxxx.cloudfront.net&quot;</div></div>

<p>こうしとけば、image_path()やらimage_tag()やらjavascript_include_tag()やらを使ったときに、リクエスト先を書き換えてくれてさらに幸せ度アップ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

