<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>おいぬま日報 &#187; Rails</title>
	<atom:link href="http://tech.lampetty.net/tech/index.php/archives/category/rails/feed" rel="self" type="application/rss+xml" />
	<link>http://tech.lampetty.net/tech</link>
	<description>Apache, MySQL, Perl, Python あたり</description>
	<lastBuildDate>Wed, 18 Jan 2012 15:52:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tech.lampetty.net/tech/index.php/archives/category/rails/feed" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>RailsでTwitterのOAuthを試す</title>
		<link>http://tech.lampetty.net/tech/index.php/archives/323?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rails%25e3%2581%25a7twitter%25e3%2581%25aeoauth%25e3%2582%2592%25e8%25a9%25a6%25e3%2581%2599</link>
		<comments>http://tech.lampetty.net/tech/index.php/archives/323#comments</comments>
		<pubDate>Sat, 20 Jun 2009 18:14:26 +0000</pubDate>
		<dc:creator>oinume</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://tech.lampetty.net/tech/?p=323</guid>
		<description><![CDATA[OAuthが前々から気になっていたので、RailsでTwitterのOAuthを使うサンプルを作成しました。OAuthについてはここでは詳しく説明しませんが、 本家のgetting-started OAuthとは？―OA [...]]]></description>
			<content:encoded><![CDATA[<p>OAuthが前々から気になっていたので、RailsでTwitterのOAuthを使うサンプルを作成しました。OAuthについてはここでは詳しく説明しませんが、</p>
<ul>
<li><a href="http://oauth.net/documentation/getting-started">本家のgetting-started</a></li>
<li><a href="http://gihyo.jp/dev/feature/01/oauth/0001">OAuthとは？―OAuthの概念とOAuthでできること</a></li>
</ul>
<p>の記事がよくまとまっているので、目を通してみるとよいでしょう。OAuthを一言でいうと、サードパーティのアプリケーション(Consumer)をサービスプロバイダ側(Service Provider)で認可するという仕組みで、端的に言えばサードパーティ側でサービスプロバイダのアカウント情報を保持する必要がなくなるというメリットがあります。</p>
<p>たとえば、今回の例だとTwitter(=Service Provider)のデータを利用するので、Twitterから認可を受ける必要があります。これをOAuthという仕組みを使って、サンプルアプリケーション(=Consumer)ではTwitterのアカウント情報を一切入力させないようにします。</p>
<p>Twitter API Wikiに<a href="http://apiwiki.twitter.com/OAuth+Example+-+Ruby">OAuth Example &#8211; Ruby</a>という素晴らしいページがあるのですが、これが最新版の仕様に対応してなさそうなので、上げてみました。</p>
<h3>railsやoauthなどのライブラリのインストール</h3>
<p>必要なものは以下になるので、rubygemsでインストールしておきます。</p>
<ul>
<li>rails 2.3.2</li>
<li>oauth 0.3.5</li>
<li>json</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rails
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> oauth
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> json</pre></div></div>

<h3>Twitterでアプリケーションを登録</h3>
<p>サンプルを作る前に<a href="http://twitter.com/oauth_clients">TwitterのOAuthのページ</a>でアプリケーションを登録します。</p>
<p style="text-align: center;"><a class="" rel="lightbox" title="Twitterでアプリケーションを登録" href="http://www.flickr.com/photos/8250493@N05/3644573970/"><img src="http://static.flickr.com/2466/3644573970_307ac49f2c.jpg" alt="Twitterでアプリケーションを登録"></a></p>
<p>Callback URLは http://localhost:3000/oauth_callback とか書くとエラーになるので、http://example.com/ のように適当なURLを記載しておきます。(実際にここで設定したURLがコールバックされるわけではありません)</p>
<p>全て記入して登録すると、Consumer keyとConsumer secretが発行されるのでこれを記録しておきます。後述する IndexController でこれらを使用します。</p>
<h3>サンプル作成</h3>
<p>サンプルアプリの雛形を作成します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rails twitoauth
$ <span style="color: #7a0874; font-weight: bold;">cd</span> twitoauth
$ script<span style="color: #000000; font-weight: bold;">/</span>generate controller index</pre></div></div>

<h3>IndexControllerの作成</h3>
<p>app/controllers/index_controller.rbを編集して、IndexControllerを実装します。Consumer key、Consumer secretは先ほどTwitterから発行されたものを使用してください。</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'oauth'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'json'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> IndexController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">consumer</span>
    <span style="color:#6666ff; font-weight:bold;">OAuth::Consumer</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
      <span style="color:#996600;">&quot;Consumer key&quot;</span>,
      <span style="color:#996600;">&quot;Consumer secret&quot;</span>,
      <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:site</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;http://twitter.com&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> oauth
    <span style="color:#008000; font-style:italic;"># :oauth_callbackに認証後のコールバックURLを指定</span>
    <span style="color:#008000; font-style:italic;"># この場合だとこのコントローラー内の oauth_callback メソッドが実行される</span>
    request_token = IndexController.<span style="color:#9900CC;">consumer</span>.<span style="color:#9900CC;">get_request_token</span><span style="color:#006600; font-weight:bold;">&#40;</span>
      <span style="color:#ff3333; font-weight:bold;">:oauth_callback</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;http://#{request.host_with_port}/oauth_callback&quot;</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
    session<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request_token</span><span style="color:#006600; font-weight:bold;">&#93;</span> = request_token.<span style="color:#9900CC;">token</span>
    session<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request_token_secret</span><span style="color:#006600; font-weight:bold;">&#93;</span> = request_token.<span style="color:#9900CC;">secret</span>
    <span style="color:#008000; font-style:italic;"># twitter.comで認証する</span>
    redirect_to request_token.<span style="color:#9900CC;">authorize_url</span>
    <span style="color:#0000FF; font-weight:bold;">return</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> oauth_callback
    consumer = IndexController.<span style="color:#9900CC;">consumer</span>
    request_token = <span style="color:#6666ff; font-weight:bold;">OAuth::RequestToken</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
      consumer,
      session<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      session<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request_token_secret</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    access_token = request_token.<span style="color:#9900CC;">get_access_token</span><span style="color:#006600; font-weight:bold;">&#40;</span>
      <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
      <span style="color:#ff3333; font-weight:bold;">:oauth_token</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:oauth_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#ff3333; font-weight:bold;">:oauth_verifier</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:oauth_verifier</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    response = consumer.<span style="color:#9900CC;">request</span><span style="color:#006600; font-weight:bold;">&#40;</span>
      <span style="color:#ff3333; font-weight:bold;">:get</span>,
      <span style="color:#996600;">'/account/verify_credentials.json'</span>,
      access_token, <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:scheme</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:query_string</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">case</span> response
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Net::HTTPSuccess</span>
      <span style="color:#0066ff; font-weight:bold;">@user_info</span> = JSON.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>response.<span style="color:#9900CC;">body</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@user_info</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'screen_name'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        flash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;Authentication failed&quot;</span>
        redirect_to <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:index</span>
        <span style="color:#0000FF; font-weight:bold;">return</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      RAILS_DEFAULT_LOGGER.<span style="color:#9900CC;">error</span> <span style="color:#996600;">&quot;Failed to get user info via OAuth&quot;</span>
      flash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;Authentication failed&quot;</span>
      redirect_to <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:index</span>
      <span style="color:#0000FF; font-weight:bold;">return</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>完了したら、indexアクションに対応するViewである app/views/index/index.erb を作成します。これは単純に /oauth に飛ばすだけのテンプレートです。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span>=<span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>OAuthのサンプル<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;/oauth&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>OAuthで認証<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h3>config/routes.rb を修正</h3>
<p>次に IndexController に定義されているアクションが呼び出されるようにURLとのマッピングをします。具体的には config/routes.rb の</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':controller/:action/:id'</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':controller/:action/:id.:format'</span></pre></div></div>

<p>となっている箇所の上に下記を追記します。</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'index'</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':action'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'index'</span></pre></div></div>

<h3>OAuthを試してみる</h3>
<p>とりあえず9割方準備が整ったので、サーバを起動して http://localhost:3000/ にアクセスします。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>server</pre></div></div>

<p>OAuthで認証のリンクをクリックすると、下記のようにTwitterにリダイレクトされたでしょうか？(うまくリダイレクトされない場合は index_controller.rb の index アクションのコードに問題がある可能性が高いです)</p>
<p style="text-align: center;"><a class="" rel="lightbox" title="TwitterでOAuth認証" href="http://www.flickr.com/photos/8250493@N05/3644596210/"><img src="http://static.flickr.com/3657/3644596210_cbfc9e8b7a.jpg" alt="TwitterでOAuth認証"></a></p>
<p>ここでTwitterのアカウントを入力して&#8221;Allow&#8221;をクリックすると、「アプリに転送します」というメッセージが表示され、サンプルアプリに遷移します。具体的には、index_controller.rb のoauthアクション内のget_request_tokenメソッドで登録したコールバックURLにリダイレクトされています。</p>
<p>ただ、現状だとコールバック先の画面で使用するテンプレートファイルを作成していないため </p>
<blockquote><p>
Template is missing<br />
Missing template index/oauth_callback.erb in view path app/views
</p></blockquote>
<p>というエラーになるので、次はこのテンプレートを作成します。</p>
<h3>最後の仕上げ</h3>
<p>/oauth_callback のテンプレートを下記の内容で作成します。やっていることは単純で、/account/verify_credentials.json のAPIで取得した情報を表示しているだけです。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span>=<span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>TwitterからOAuthで認証してもらったよ！<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span>&lt;%= @user_info<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#93;</span> %<span style="color: #000000; font-weight: bold;">&gt;</span></span>さんの最新のつぶやき<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;">&lt;%= @user_info<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'status'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'text'</span><span style="color: #66cc66;">&#93;</span> %<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>これを app/views/oauth_callback.rb として保存したら、もう一度 http://localhost:3000/ にアクセスして最初から認証をやり直します。下記のようにTwitterの情報が取得できれば、OAuthでの認証+APIの呼び出しは成功です。</p>
<p style="text-align: center;"><a class="" rel="lightbox" title="OAuthでログインしてTwitterのデータを取得" href="http://www.flickr.com/photos/8250493@N05/3644632746/"><img src="http://static.flickr.com/3406/3644632746_10d63591a7.jpg" alt="OAuthでログインしてTwitterのデータを取得"></a></p>
<h3>まとめ</h3>
<p>ライブラリを使えば少しの労力でOAuthでTwitterに認証してもらえることが伝わったでしょうか？OAuthを使えば、サービス側(Consumer側)でTwitterのアカウント/パスワードを保持しなくて済むので、よりユーザに安心を提供できるはずです。現状、コールバックURLを使う方法はPCのブラウザでしか実行できませんが、モバイルやデスクトップアプリのためにPINコードを発行する方法も用意されているので、より詳しく知りたい人は本家のドキュメントを読んでみると良いと思います。</p>
<div class="tmkm-amazon-view">
	<p><a href="http://www.amazon.co.jp/Rails%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E7%AC%AC3%E7%89%88-Sam-Ruby/dp/4274067858%3FSubscriptionId%3DAKIAJGVWECUONT35GEJA%26tag%3Dkazzhomeunixo-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4274067858"><img src="http://ecx.images-amazon.com/images/I/51fSL0ybmNL._SL160_.jpg" border="0" alt="" /></a></p>
	<p><a href="http://www.amazon.co.jp/Rails%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E7%AC%AC3%E7%89%88-Sam-Ruby/dp/4274067858%3FSubscriptionId%3DAKIAJGVWECUONT35GEJA%26tag%3Dkazzhomeunixo-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4274067858">RailsによるアジャイルWebアプリケーション開発 第3版</a></p>
	<p><em>著者／訳者：</em>Sam Ruby David Heinemeier Hansson Dave Thomas </p>
	<p><em>出版社：</em>オーム社( 2009-12-01 )</p>
	<p>単行本 ( 675 ページ )</p>
<hr class="tmkm-amazon-clear" /></div>
]]></content:encoded>
			<wfw:commentRss>http://tech.lampetty.net/tech/index.php/archives/323/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tech.lampetty.net/tech/index.php/archives/323" />
	</item>
	</channel>
</rss>

