<?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>ひげろぐ &#187; Amazon-Webサービス</title>
	<atom:link href="http://brass.to/blog/tag/amazon-web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/feed" rel="self" type="application/rss+xml" />
	<link>http://brass.to/blog</link>
	<description>技術者として仕事人としての思うところや覚え書きやらです</description>
	<lastBuildDate>Fri, 30 Jul 2010 10:07:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Amazon WebサービスのレスポンスをActiveRecordでキャッシュ</title>
		<link>http://brass.to/blog/amazon_web_service_cache.html</link>
		<comments>http://brass.to/blog/amazon_web_service_cache.html#comments</comments>
		<pubDate>Thu, 20 Mar 2008 13:49:49 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[Amazon-Webサービス]]></category>

		<guid isPermaLink="false">http://brass.to/blog/amazon_web_service_cache.html</guid>
		<description><![CDATA[前回RailsでAmazonのWebサービスを使ってみたけれども、何かあるたびに毎回リクエストを送るのはいろいろ無駄があって忍びないのでレスポンスをキャッシュしなければならない。
ということで今回はActiveRecordを使ってざっくりキャッシュしてみる。
キャッシュテーブルにたくさんカラムを定義するのは面倒なので検索キーにしたいものだけカラムとして定義して、あとは結果をシリアライズして突っ込む方針で。
キャッシュ用のテーブルとモデルを作る
まずはキャッシュするためのテーブルとモデルを準備。
テーブル
とりあえずマイグレーションでテーブルを作る。
class CreateAmazonCaches &#60; ActiveRecord::Migration
  def self.up
    create_table :amazon_caches do &#124;t&#124;
      t.string :asin
      t.string :title
      t.text :response_dump

      t.timestamps
    end
  end

  def self.down
    drop_table :amazon_caches
 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://brass.to/blog/rails_with_amazon_web_service.html">前回</a>RailsでAmazonのWebサービスを使ってみたけれども、何かあるたびに毎回リクエストを送るのはいろいろ無駄があって忍びないのでレスポンスをキャッシュしなければならない。</p>
<p>ということで今回はActiveRecordを使ってざっくりキャッシュしてみる。<br />
キャッシュテーブルにたくさんカラムを定義するのは面倒なので検索キーにしたいものだけカラムとして定義して、あとは結果をシリアライズして突っ込む方針で。</p>
<h4>キャッシュ用のテーブルとモデルを作る</h4>
<p>まずはキャッシュするためのテーブルとモデルを準備。</p>
<h5>テーブル</h5>
<p>とりあえずマイグレーションでテーブルを作る。</p>
<pre><code>class CreateAmazonCaches &lt; ActiveRecord::Migration
  def self.up
    create_table :amazon_caches do |t|
      t.string :asin
      t.string :title
      t.text :response_dump

      t.timestamps
    end
  end

  def self.down
    drop_table :amazon_caches
  end
end</code></pre>
<h5>モデル</h5>
<p>キャッシュを参照するためのモデル。<br />
データを参照するときにレスポンスの内容をデシリアライズする。</p>
<pre><code>class AmazonCache &lt; ActiveRecord::Base
  @reponse_hash = nil
  @search_limit = 10

  def get(name)
    @response_hash = Marshal.restore(response_dump) if @response_hash.nil?
    @response_hash[name.to_sym]
  end

  def self.search(title, order = 'id', limit = nil)
    @search_limit = limit if limit
    self.find(:all, :conditions =&gt; ["title like ?", "%#{title}%"], :order =&gt; order, :limit =&gt; @search_limit)
  end
end</code></pre>
<p>ハッシュのデシリアライズのタイミングはafter_findでもいいかもしれないなぁ。</p>
<h4>キャッシュの保存と参照</h4>
<p>テーブルとモデルができたので次はそれを使って実際にキャッシュする。</p>
<h5>レスポンスをキャッシュする</h5>
<p>以下がレスポンスをキャッシュするためのコード。</p>
<p>get_hashで取得したデータのハッシュだけシリアライズして突っ込む。<br />
（itemのままだとなにやらうまいことMarshalでシリアライズできなかった）</p>
<pre><code>res = Amazon::Ecs.item_search("Rails", :response_group =&gt; 'Large')
res.items.each do |item|
  AmazonCache.create(:asin =&gt; item.get('asin'), :title =&gt; item.get('title'), :response_dump =&gt; Marshal.dump(item.get_hash))
end</code></pre>
<h5>キャッシュを参照する</h5>
<p>参照は以下のように。</p>
<pre><code>items = AmazonCache.search("Rails")
items.first.get(:title) # =&gt; Railsの何かの本とかそんなタイトル</code></pre>
<p>smallimageのように子要素を持つ要素はXMLの断片が保存されている。</p>
<pre><code>items.first.get(:smallimage) # =&gt; "&lt;url&gt;http://ecx.images-amazon.com/images/I/hogehogehoge-.jpg&lt;/url&gt;&lt;height units=\"pixels\"&gt;75&lt;/height&gt;&lt;width units=\"pixels\"&gt;58&lt;/width&gt;"</code></pre>
<p>これは正規表現とかで値を取り出すのが楽かね。<br />
モデルにそれ用のメソッドを追加してしまってもいいかもしれない。</p>
<p>まあひとまず今回はこんなところで。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/amazon_web_service_cache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsでAmazon Webサービス</title>
		<link>http://brass.to/blog/rails_with_amazon_web_service.html</link>
		<comments>http://brass.to/blog/rails_with_amazon_web_service.html#comments</comments>
		<pubDate>Mon, 17 Mar 2008 10:07:03 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[Amazon-Webサービス]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://brass.to/blog/rails_with_amazon_web_service.html</guid>
		<description><![CDATA[以下のページを参考にAmazon WebサービスにRailsからアクセスしてみた。
かなり楽ちん。
RoRでAmazon Associate Web Serviceを使う : Mashupを作ろう : 記事 : MASHUPEDIA &#8211; マッシュペディア &#8211; : Web API x Mashup
前準備
まずamazon-ecsというライブラリをgemで入れる。
$ sudo gem install amazon-ecs
次にRailsのconfig/environment.rbの末尾にamazon-ecsのオプションの設定を書く。
require ‘amazon/ecs’

Amazon::Ecs.options = {
  :aWS_access_key_id =&#62; "hogehogehoge",
  :associate_tag =&#62; "stepfeed-22",
  :country =&#62; :jp
}
アソシエイトIDも設定できる。
あとはRailsのどこでもamazon-ecsを使ってAmazonのデータを検索可能。
使い方
検索
Amazon::Ecsのitem_searchというメソッドを使うとAmazon Webサービスにアクセスしてレスポンスを取得する。
レスポンスはAmazon::Ecs::Responseオブジェクトになって返される。
res = Amazon::Ecs.item_search("Rails")
これだとタイトルやASINなどの基本的なデータしか取得できない。
簡単なテキストリンクを作るだけならそれだけで十分だが、画像やユーザーレビューなどの詳細なデータを取得したい場合は:reponse_groupオプションでMediumとかLargeとか指定して検索する。
res = Amazon::Ecs.item_search("Rails", :response_group =&#62; 'Large')
:sortオプションでソート条件指定も可能。
res = Amazon::Ecs.item_search("Rails", :sort =&#62; 'titlerank')
データの参照
検索したデータは返されたAmazon::Ecs::Responseオブジェクトのitemsという変数に入っている。
itemsはAmazon::Elementオブジェクトの集まり。
Amazon::Elementは個別のAmazon商品情報を持っている。
getメソッドを使うと特定の項目のデータを取得できる。
res.items.first.get(:title)
またget_hashメソッドを使うとデータをハッシュで取得できる。
ハッシュになるとキーはシンボルになるので、文字列で指定しないように注意。（getメソッドの引数は文字列でもシンボルでも可）
data = res.items.first.get_hash
data[:title] # =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>以下のページを参考にAmazon WebサービスにRailsからアクセスしてみた。<br />
かなり楽ちん。</p>
<p><a href="http://www.mashupedia.jp/docs/view/84" target="_blank">RoRでAmazon Associate Web Serviceを使う : Mashupを作ろう : 記事 : MASHUPEDIA &#8211; マッシュペディア &#8211; : Web API x Mashup</a></p>
<h4>前準備</h4>
<p>まずamazon-ecsというライブラリをgemで入れる。</p>
<pre><code>$ sudo gem install amazon-ecs</code></pre>
<p>次にRailsのconfig/environment.rbの末尾にamazon-ecsのオプションの設定を書く。</p>
<pre><code>require ‘amazon/ecs’

Amazon::Ecs.options = {
  :aWS_access_key_id =&gt; "hogehogehoge",
  :associate_tag =&gt; "stepfeed-22",
  :country =&gt; :jp
}</code></pre>
<p>アソシエイトIDも設定できる。</p>
<p>あとはRailsのどこでもamazon-ecsを使ってAmazonのデータを検索可能。</p>
<h4>使い方</h4>
<h5>検索</h5>
<p>Amazon::Ecsのitem_searchというメソッドを使うとAmazon Webサービスにアクセスしてレスポンスを取得する。<br />
レスポンスはAmazon::Ecs::Responseオブジェクトになって返される。</p>
<pre><code>res = Amazon::Ecs.item_search("Rails")</code></pre>
<p>これだとタイトルやASINなどの基本的なデータしか取得できない。<br />
簡単なテキストリンクを作るだけならそれだけで十分だが、画像やユーザーレビューなどの詳細なデータを取得したい場合は:reponse_groupオプションでMediumとかLargeとか指定して検索する。</p>
<pre><code>res = Amazon::Ecs.item_search("Rails", :response_group =&gt; 'Large')</code></pre>
<p>:sortオプションでソート条件指定も可能。</p>
<pre><code>res = Amazon::Ecs.item_search("Rails", :sort =&gt; 'titlerank')</code></pre>
<h5>データの参照</h5>
<p>検索したデータは返されたAmazon::Ecs::Responseオブジェクトのitemsという変数に入っている。<br />
itemsはAmazon::Elementオブジェクトの集まり。</p>
<p>Amazon::Elementは個別のAmazon商品情報を持っている。<br />
getメソッドを使うと特定の項目のデータを取得できる。</p>
<pre><code>res.items.first.get(:title)</code></pre>
<p>またget_hashメソッドを使うとデータをハッシュで取得できる。<br />
ハッシュになるとキーはシンボルになるので、文字列で指定しないように注意。（getメソッドの引数は文字列でもシンボルでも可）</p>
<pre><code>data = res.items.first.get_hash
data[:title] # =&gt; なんかのタイトル
data['title'] # =&gt; nil </code></pre>
<h5>子要素を持ったデータの参照</h5>
<p>smallimageなどいくつかの情報は子要素を持っているがgetで参照するとXMLの断片が文字列で返ってくる。</p>
<pre><code>res.items.first.get(:smallimage) # =&gt;
"&lt;url&gt;http://ecx.images-amazon.com/images/I/hogehogehoge-.jpg&lt;/url&gt;&lt;height units=\"pixels\"&gt;75&lt;/height&gt;&lt;width units=\"pixels\"&gt;58&lt;/width&gt;"</code></pre>
<p>子要素を参照するにはget_hashを使うと便利。</p>
<pre><code>data = res.items.first.get_hash(:smallimage)
data[:url] # =&gt; "http://ecx.images-amazon.com/images/I/hogehogehoge-.jpg"</code></pre>
<h4>参考</h4>
<p><a href="http://amazon-ecs.rubyforge.org/doc/" target="_blank">amazon-ecsのRDoc</a></p>
<p><a href="http://ecs.amonya.com/ecs40/sort.html" target="_blank">Sortパラメータ : ええもん屋 ラボ</a></p>
<p><a href="http://www.ajaxtower.jp/ecs/itemsearch_sort/index.html" target="_blank">検索結果のソート(Sort) &#8211; Amazon Web サービス</a></p>
<h4>追記</h4>
<p><a href="http://brass.to/blog/amazon_web_service_cache.html">ActiveRecordを使ってレスポンスをキャッシュする手順をまとめてみた。</a></p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/rails_with_amazon_web_service.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
