SnowLeopard で OpenSSL がバージョンアップしたことに伴い
amazon-jp-api を作り直した。
=>
2010-amazon-jp-api
[参考になったURL]
OpenSSL SHA 256 の使い方はhttp://diaspar.jp/node/239 を参考にしました。
[主な変更点]
1, Mac OS X 10.6.3 で SHA256 を使えるようになったことに伴う変更。
module AmazonAuth => 新規に作ったモジュール。認証用。
2, 設定ファイル => 2つのモジュールにわけた。
3, class AwsItem => インスタンス変数の持ち方の変更。
4, class AmazonAccess => アマゾンにアクセスしデータを獲得したのちに AwsData.new(data).add_data でアイテムまで生成していたが、アイテム生成は他のクラスに移動させて、このクラスはアマゾンにアクセスしデータを獲得するだけのクラスに変更した。
5, class AwsDataWriter => 新規に作ったクラス。マーシャルデータを変更するためのクラス。
6, class AwsDataReader => 新規に作ったクラス。マーシャルデータを読み込んで表示させるためのクラス。
7, module AmazonAuth => 新規に作ったモジュール。アマゾン認証を行うためのもの 。
[変更されていない点]
1, ローカルで使うもの。
2, Ruby 1.9.1 だけで動き Ruby 1.8 系はサポートしていない。
3, マーシャルデータを使用している。
4, 指定したEAN の本やCDのデータをアマゾンから受け取ることができるがアマゾンサーバに対して検索はできない。
5, README に書いたオプション引数はそのまま。
[少しだけ気になっている点]
1, もともとのものは force_encodig を使わないように 変更している。今回もこの状態でうまくいったので受け取ったXMLデータが valid? かどうかだけチェックするにとどめ encode 変換は行っていない。このことによってなにか弊害があるのかないのかは謎。
2, timeout を使っている。使わないバージョンも作ってみたがあっさり挫折。
3, exec を使っている。exec を使わないバージョンを考えてみたがわからなくなって中断。
4, send を使っている。最近使い方を覚えたため、使ってみたかったから使っているにすぎない。あえて使う必要はないのかもしれない。
[このブログ内の関連する投稿]
=> http://midorex.blogspot.com/2009/06/amazon-web-with-ruby-191.html
=> http://midorex.blogspot.com/2009/08/amazon-product-advertising-api.html
=> http://midorex.blogspot.com/2009/12/forceencoding.html
=> http://midorex.blogspot.com/2008/12/amazon-aws-with-ruby191.html
[Amazon ラベルをもつ全ての投稿]
Amazon
2010/04/21
2010-amazon-api-jp
2010/04/03
はじめての send
ISBN: 978-4048678841 | リファクタリング:Rubyエディション (大型本)
この本、私は対象読者ではなかった。飛ばし読みしていたらあっという間に p.165 までたどり着いてしまった。
そこで目にしたもの
p.165
サンプル
引数をまとめたHash を受け付けて、それらの引数をインスタンス変数に代入する SearchCriteria クラスがあるものとする。
とあり
p.166
Class.send :include, CustomInitilizers
send って何?といろいろ試してみた。
1 #!/usr/local/bin/ruby191
2 # coding: utf-8
3
4 module Items
5 module Setup
6 def base(h)
7 h.each{|k,v| self["@#{k}"] = v}
8 end
9 alias []= instance_variable_set
10 alias [] instance_variable_get
11 end
12 class Music
13 def initialize(h)
14 self.base(h)
15 end
16 end
17 class Book
18 def initialize(h)
19 base(h)
20 end
21 end
22 Object.send :include, Setup
23 end
24
25 h = {:isbn=>'978xxx', :title=>'book-title', :price=>'1000'}
26 p b = Items::Book.new(h)
27 h = {:isbn=>'077xxx', :title=>'music-title', :price=>'2000'}
28 p b = Items::Music.new(h)
29 p b['@title']
=>
#<Items::Book:0xxxx @isbn="978xxx", @title="book-title", @price="1000">
#<Items::Music:0xxx @isbn="077xxx", @title="music-title", @price="2000">
"music-title"
最近知った あのaliasを使ってみた。
そして
「プログラミング言語 Ruby」p.285
を読み直した
Book.public_send :include, Setup
にしてもOKだった。
さらに
「Ruby Way」( Second edition)
にて send を探してみたら p.350 にsort_by のカスタムバージョン例の中で send を使う例があった。
self.sort{|x,y| x.send(sym) <=> y.send(sym)
この場合、x はArrayの要素でその要素のひとつひとつには Preson.new() Object が入っていて、
で、Presonの@name は attre_reader で読み込めるようになっている。ここがミソ。従ってソート対象として:name を指定することができる、と。
attre_writer :name だったらこれは成功しないだろう。
p.350 をジーとみているとうっかり send(@name)なのだと勘違いして理解しそうになるが、
send は「シンボル」を受けつけるのだから、send(@name) ではダメ。
+++ まとめ +++
send or public_send (Ruby 1.9) はシンボルを受けつける
module XXX
module Setup ... end
class Book ... end
class Music ... end
Object.send :include, Setup
end
Object.send とした場合は module が内包する[全て]のクラスのinclude メソッドに Setup module をおくりつけたことになる、と。
Object.send を Class.send としてみたら
`initialize': undefined method `base'
のエラーになった。
module XXX
module Setup ... end
class Book ... end
class Music ... end
Book.send :include, Setup
end
とした場合は module XXX が内包するBook クラスに[だけ]Setupをおくったことになる
従ってこの場合
module XXX
module Setup ... end
class Book
include Setup
end
end
と全くおなじ、と。