2007/06/30

Book class for amazon

amazon 用のbook クラス考。テキストの中に isbn を探す始まるマークがみつかったら、Book クラスを呼び出す。
ItemLookup でamazon からのレスポンス XML は、Search で得られる結果とは異なり <Items><Item> 要素は1つ。指定したISBN がなければエラーXMLが返ってくる。

  item = Book.new(amazonxml).setup.item


amazon からのレスポンス xml を Book クラスに対して Book.new(xml) し...setup.item すると、Book の Struct で指定された要素を拾う。拾いたい要素のフルパスをコード内に記述しない方法の模索。

仮に<small><url>... <big><url>... といったように異なる親要素を持つ同一名の要素が レスポンス xml内 にあった場合で、
<big>要素の<url>要素 を拾いたい時、Book の Structに big_url とアンダーバーで要素名を連結するとその要素パスにマッチしたデータを探す。

Book クラス @h の中身は、{ [アマゾンXML の要素フルパス]=> 要素のテキスト ...]

#require 'time'
#require 'uri'
#require 'net/http'
#require "rexml/document"

class Book < Struct.new(:mediumimage_url, :detailpageurl, :author, :isbn, :publisher, :publicationdate, :title, :listprice_amount)

  def initialize(xml=nil)
    @getxml = REXML::Document.new(xml)
    #@tplxml = Tpl.new().tplamazon
    str = '<?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="amazon.xsl"?>
    <docroot>
      <link rel="alternate" type="text/html" href="http://www.midore.net/"/>
      <modified/>
      <Items/>
    </docroot>'
    @tplxml = REXML::Document.new(str)
    @h = Hash.new
  end
  
  def errorcheck
    @tplxml = nil
  end

  def setup
    get_ele() if @h.empty?
    @h.each{|k,v|
      members.select{|x| self[x] = v if k.downcase.include?(x)}
    }
    #unless detailpageurl.nil?
      #durl = detailpageurl.scan(/\/.\/ASIN\/.*?%/).last.gsub("%",'') 
      #self.detailpageurl = 'http://www.amazon.co.jp' + durl
    #end
    return self
  end
  
  def item
    return nil if @tplxml.nil?
    item = REXML::Element.new('item')
    each_pair{|k,v| 
      item.add_element(k.to_s).add_text(v.to_s)
    }
    return item
  end

  def get_ele(ele=nil)
    ele = @getxml.root if ele.nil?
    errorcheck if ele.to_s.include?('Error')
    return nil if @tplxml.nil?
    ele.each{|x| 
        get_ele(x.entries) if x.has_elements?
      @h[x.xpath.to_s.gsub("/", '_')] ||= x.text unless x.text.nil?
      }
  end

end 

p Book.new(amazonxml)
#<struct May::AmazonAWS::Book mediumimage_url=nil, detailpageurl=nil, author=nil, isbn=nil, publisher=nil, publicationdate=nil, title=nil, listprice_amount=nil>

p item = Book.new(amazonxml).setup.item
item 要素に自分が欲しい要素だけを集めてある。
<item> ... </>

最終的な item 要素の中身

<item>
<mediumimage_url/>
<detailpageurl/>
<author/>
<isbn/>
<publisher/>
<publicationdate/>
<title/>
<listprice_amount/>
</item>


問題点 :
1, 著者が複数だった場合はどうする?
2, 画像サイズ指定し忘れた。
3, 表示させる要素に ISBN or EAN を含めるべきかどうか。その他、etc

--imported_from
http://www.midore.net/daybook/2007/06/1183167964.html

パズルパレス

ダビンチコードを書いた Dan Brown の初期の作品

ISBN: 4047915173

1998 年に書かれたもの。日本では2006年が初版。
トランスレータという巨大な暗号解読機械をめぐっておこる脅迫事件。
この作者がいかに暗号好きかを察することができる。
ストーリが大どんでん返しで終わるのも、テレビをみているかのような画面切り替えのような描写方法も、この頃から使われていたのだな、とわかった。

--imported_from
http://www.midore.net/daybook/2007/06/1183161318.html

2007/06/29

芥川龍之介

「没後80周年特別企画」と帯に書かれてあった。現代の芥川賞、直木賞作家らのエッセイつき。

ISBN: 4796656774

++ 収録作品 ++
蜘蛛の糸
杜子春
羅生門

芋粥
半巾
戯作三昧
地獄編
奉教人の死
きりしとほろ上人伝
蜜柑
魔術

秋山図
薮の中
トロッコ
玄鶴三房
河童
歯車
或阿呆の一生

この本の中で、作品「半巾」について平野敬一郎氏は、
「...芥川的なアイロニーのあり方が、初期において最も端的に描かれた作品...」
と述べている。

文学的テキストから受ける印象は人によって非常に千差万別なので、人それぞれ感じ方が違って当然なのだけど、面白いことに、同じ作品であっても感情が炸裂したかのような激情的な文章だという印象を受ける人もいれば、非常に冷徹で知的クールな文章だという印象を受ける人もいる、、、。まるで違う作品を読んだかのごとく。

芥川作品はまるで短距離走者のようだとどこかに書かれていたが、実際「単語」ひとつひとつに対してかなり熟考したのかもしれない、とみうけられなくもない。でもそれは読者の勝手な憶測なのかもしれない。それほど考えて書いた訳じゃないよと本人は云うかもしれない。
どちらだったにせよ、その単語を選んだという事実を眺めてみた時、芥川作品全般に流れる心の痛みに思いをはせてしまう。

河童は、中学生の時に読んでいたにも関わらず初めて読むような気がした。
読むべき対象年齢があるのかも?と思った。一定の年齢に達してからでないと、かなわない作品だったのかもしれない。。。じゃ、対象年齢て何?などと考えていたら、実は私のつまらん思い込みで読むべき対象年齢なんて実は「ない」のかもしれない。

途中、作者の怒りにまかせて溢れてくる鋭利な刃物のような単語のつらなりを感じた。怒れば怒るほどに、クールに的確に相手を論破できる人っているんだよなーと思う。そういう人物像を連想させられた。
と、おもいきや、作者のメンタリティはもっともっと違うところにもあるようにも読めてくるから面白い。

--imported_from
http://www.midore.net/daybook/2007/06/1183127623.html


+++ 追記 +++
2010-02-06
midorex.blogspot.com に import するにあたって

今、この本に収録されている作品の中で一番印象深いものをあげよといわれたら「半巾」かな。
短編であれ小説であれ、読んだことを忘れた頃、おもむろに開いたページを読んだその瞬間に鮮やかな何かを瞬時に読者の心に再現させてしまう作品ってある。しかもその再現は時間軸とともに微妙に変化し読む側はそれをはっきりと意識せざるをえないので、読者は何度も新鮮な読書ができてしまうの。

2007/06/06

Amazon Web Services 2

昨日作ったやつの答え合わせのつもりで検索検索。

natu_nの日記

Amazon ECS (Ver.2007-01-15) のドキュメント

Docs: Amazon E-Commerce Service (API Version: 2007-01-15)

ISBN(国際標準図書番号)規格改定に伴うアソシエイト・リンクの対応について [追加情報]

げげ?ISBNが13桁に?

ISBN(国際標準図書番号)規格改定等について お知らせ

(1) 2007年以降ISBNの規格は13桁とし、流通コードの国際標準であるEANコード(わが国ではJANコード)と一致させる。
http://www.isbn-center.jp/whatsnew/kikaku.html
(5) 2007年以降、現行のISBNは無効となる。


Type of product ID you are requesting information about.ISBN is for looking up books by their ISBN number. So, the ItemId must be a valid ISBN number and the search index in the request must be Books or ForeignBooks. The ISBN value must be 13 digits long and cannot include hyphens. The older 10-digit ISBN numbers can be converted in to the new 13-digit version by prepending "978" to the 10-digit ISBN number, which makes it 13 digits long.SKU requires a MerchantId. US only.UPC is US only.EAN is the same as JAN (Japanese article number), so you may use this parameter to look up items by JAN or EAN. DE/JP/CA only.If you select SKU, UPC, or EAN as the IdType for your request, you also need to include the SearchIndex parameter.


translation に頼ってみる。

ISBNは、彼らのISBN番号によって本を調べることに賛成です。それで、ItemIdは有効なISBN番号でなければなりません、そして、要請の検索インデックスはBooksまたはForeignBooksでなければなりません。ISBN価値は長さ13桁でなければならなくて、ハイフンを含むことができません。以前の10桁ISBN番号は10桁ISBN番号に「978」を前に付加することによって新しい13桁バージョンに中で変わることができます。そして、それはそれを13桁長くします。SKUは、MerchantIdを必要とします。USだけ。UPCは、USだけです。EANはJAN(日本の記事番号)と同じですので、あなたはJANまたはEANによってアイテムを調べるためにこのパラメータを使うかもしれません。DE/Japan paper/CAだけ。あなたがSKU、UPCまたはEANをあなたの要請のためのIdTypeとして選ぶならば、あなたもSearchIndexパラメータを含める必要があります。


2007 年以降は国際標準 EANだって読んだんだから、IdType=EAN を追加して実行してみると。

Result_ IdType=EAN # ISBN-13:9784797336610

リクエストには必要なパラメータの組み合わせが含まれていません。IdTypeがEANである場合、SearchIndexが必要です。


あっ、SearchIndex パラメータが必要だと書いてあったんだった。

> 検索インデックスはBooksまたはForeignBooksでなければなりません


公式ドキュメント_ SearchIndex

The Amazon store to search. Do not use this parameter with ASIN searches; an error will be returned.SearchIndex is required any time you select SKU, UPC, or EAN as the IdType for your request. The list of available SearchIndex values, segmented by locale, can be found on the search index values page.If IdType is set to EAN, SearchIndex is restricted to a select group of values by locale (Amazon.de and Amazon.co.jp).


やくす

捜すアマゾン店。ASIN検索でこのパラメータを使わないでください;エラーは返されます。あなたがSKU、UPCまたはEANをあなたの要請のためのIdTypeとして選ぶどんな時でも、SearchIndexは必要です。利用できるSearchIndex価値(現場によって分割される)のリストは、検索指数値ページで見つかることができます。IdTypeがEANにセットされるならば、SearchIndexは現場(Amazon.deとAmazon.co.jp)によって選ばれたグループの値に制限されます。


捜すアマゾン店。笑
「SearchIndexは現場(Amazon.deとAmazon.co.jp)によって選ばれたグループの値」てなんだろ。

Search Index Values
http://docs.amazonwebservices.com/AWSEcommerceService/2007-01-17/ApiReference/SearchIndexValues.html

SearchIndex=Books で試す。

Result_ IdType=EAN, SearchIndex=Books # ISBN-13: 9784797336610

9784797336610は、ItemIdの値として無効です。値を変更してから、再度リクエストを実行してください。

10桁ならとおる?
Result_ IdType=EAN, SearchIndex=Books # ISBN-10: 4797336617

4797336617は、ItemIdの値として無効です。値を変更してから、再度リクエストを実行してください。


おかしい。

公式ドキュメント_ItemId

Product(s) you would like information about. You may specify up to ten IDs using a comma-separated list (REST) or multiple elements (SOAP). By default the item IDs are assumed to be ASINs, unless you specify the IdType parameter.


やくす

あなたが情報が好きだろう製品(s)。あなたは、コンマで区切られたリスト(REST)または複数の要素(SOAP)を使用している最高10のIDを指定するかもしれません。あなたがIdTypeパラメータを指定しない限り、デフォルトで、アイテムIDはASINsであるとされます。


ItemId はIdTypeで指定されたTypeになると。何も指定しない時は ASIN になるよと。
IdType=EAN と指定したら必ずSearchIndexが必要と。その通りにしたつもりなんだけどな。Books じゃいけないのかなー。

どうすればいいのー?> google

実験結果をわかりやすくまとめてくださってました!。すばらしぃ!
HekatonCarefuleな日記

IdType=ISBN, SearchIndex=Books で13桁のISBNを指定したら成功とのこと。
13桁の ISBN を利用するには今のところ(2007/06) IdType=ISBN を指定する必要があるってことなんだね。EAN は使えないのかな。

Amazon Web Services Resource Center で検索
http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=59

http://developer.amazonwebservices.com/connect/entry.jspa?externalID=765&categoryID=17

The EAN field does not support ISBN-13 in the JP locale.


うわわ。IdType=EAN が指定できないのは日本ローカルな問題!?? だったのか。そか。そーだったのか。

日本のアマゾンさんは、なんでこの問題を日本語で明記してないのかなぁ。それとも私の探し方がたりないのかな。
「HekatonCarefuleな日記」さんが書かれているような内容は日本アマゾンの公式なページに掲載されていてしかるべき内容だと思うんだけど。あんのかなぁ。

+++++++++++++++++++++++++++++
まとめ。これでリクエストすれば13桁で検索できました。

        "Service=AWSECommerceService",
        "AWSAccessKeyId=#{@aws_key}",
        "Operation=ItemLookup",
        "ItemId=#{isbn}",
        "IdType=ISBN",
        "SearchIndex=Books",
        "AssociateTag=#{@aws_id}",
        "ResponseGroup=Medium"

けど、ISBN-10桁の本の情報を得たい時にはこれだとエラーになってしまうんでプログラム側でISBN桁数をみてからパラメータを分岐させるようにしないといけないということになりそ。
+++++++++++++++++++++++++++++

あらためて情報収集

本出している有名な方。Perl で書かれてありました。やっぱりパラメータはHekatonCarefuleな日記さんと同じでした。
Amazon Web Servicesを使ってISBN-13からASINを取得するPerlプログラム
http://d.hatena.ne.jp/hyuki/20070123#isbn

おや!?
"Version=2007-01-15" ひょっとしてひょっとしてこれを追加すれば10桁も可能になったりして?...それはありませんでした。
Result_ IdType=ISBN, SearchIndex=Books # ISBN-10: 4797336617

4797336617は、ItemIdの値として無効です。値を変更してから、再度リクエストを実行してください。


上級者の方発見。ちゃんとISBN 桁数で条件分岐もあるしエラーチェックもあってすごいです。答え合わせの答えが見つかった感じがしました。
http://www.iwazer.com/~iwazawa/diary/archives/003010.html
Version => '2007-05-14', ってかいてあった。あとで調べてみよう。

Amazon Web Services Resource Center
http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=59

Thread: 2007年からの和書のASINについて
http://developer.amazonwebservices.com/connect/thread.jspa?threadID=12010&tstart=0

--imported_from
http://www.midore.net/daybook/2007/06/1181131399.html

2007/06/05

Amazon Web Service

Amazon Web Service に ISBN で問い合わせしてみる。

登録IDの取得
http://www.amazon.co.jp/gp/feature.html?docId=451209

オンラインドキュメントトップページ
http://www.amazon.com/gp/browse.html/?node=3487571

オンラインドキュメントトップページから迷子になった後にやっとたどり着いたページ
http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/

問い合わせ先:ecs.amazonaws.jp
目的のXML :
Medium Response Group
http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/ApiReference/MediumResponseGroup.html

獲得したい情報:

URL
表紙URL
著者名
ISBN
出版社名
出版日付
タイトル
価格

# isbn_lookup.rb
=begin
The Base URL
# http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/PgRestRequestsArticle.html
# For Amazon.co.jp (JP) => http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService

ItemSearch Operation
# http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/ApiReference/ItemSearchOperation.html

Medium Response Group
# http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/ApiReference/MediumResponseGroup.html>

The Request that Generated the Response (REST)

http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
# http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService
    &AWSAccessKeyId=[Your Access Key ID Here]
    &AssociateTag=[Your Associate ID Here]
    &Operation=ItemLookup
    &ItemId=B00008OE6I
    &ResponseGroup=Medium
=end

require 'uri'
require 'net/http'
require "rexml/document"

module Amazon

  class ISBN_Lookup

    def initialize(aws_accessKeyId, associate_ID)
      @aws_key = aws_accessKeyId
      @aws_id = associate_ID
      @jp_ecs = 'http://ecs.amazonaws.jp'
    end

    def seturi(isbn)
      uri = URI.parse(@jp_ecs)
      uri.path='/onca/xml'
      q = [
        "Service=AWSECommerceService",
        "AWSAccessKeyId=#{@aws_key}",
        "Operation=ItemLookup",
        "ItemId=#{isbn}",
        "AssociateTag=#{@aws_id}",
        "ResponseGroup=Medium"
      ]
      uri.query = q.join("&")
      return uri
    end
  end

  class Access

    def initialize(uri)
      @host = uri.host
      @request = uri.request_uri
    end

    def error_message
      print "SocketError\n"
    end

    def reponse
      begin
        Net::HTTP.start(@host) { |http|
          response = http.get(@request)
          return response.body
        }
      rescue SocketError, error_message
      end
    end
  end

  class Book < Struct.new(:detailpageurl, :mediumimage_url, :author, :isbn, :publisher, :publicationdate, :title, :amount)

    def initialize(res)
      @doc = REXML::Document.new(res) unless res.nil?
      @itemAttributes = @doc.root.elements['Items/Item/ItemAttributes'] unless res.nil?
    end

    def setup
      return nil if @doc.nil?
      return nil if @itemAttributes.nil?
      @itemAttributes.to_a.each{|x| 
        xx = x.name.downcase
        self[:amount] = x.text('Amount') if xx.to_s == "listprice"
        unless members.index(xx.to_s).nil?
          sym = xx.to_sym  #symbol
          self[sym] = x.text
        end
      }
      self.detailpageurl = urldegital
      self.mediumimage_url = urlimg
      return self
    end

    def get(xpath)
      @doc.root.elements[xpath].text unless @doc.root.elements[xpath].nil?
    end

    def urldegital
      get('Items/Item/DetailPageURL')
    end

    def urlimg
      get('Items/Item/MediumImage/URL')
    end

  end

end

#+++++++++++++++++++++++++
#example;

# ISBN :4063406482
aws_key = xxxxxxx 
aws_id = xxxxxxx

isbn = '4063406482'
uri = Amazon::ISBN_Lookup.new(aws_key, aws_id).seturi(isbn)
res = Amazon::Access.new(uri).reponse
book = Amazon::Book.new(res)
p book.setup
#exit
puts book.mediumimage_url
#=> http://ec1.images-amazon.com/images/I/21po5oj5XOL.jpg
puts book.author
#=> 二ノ宮 知子
puts book.isbn
#=> 4063406482
puts book.publisher
#=> 講談社
puts book.publicationdate
#=> 2007-06-13
puts book.title
#=> のだめカンタービレ #18 (18)
puts book.amount
#=> 410


これをもとにエントリーに書籍リンクをはるとこまでが目的。。。

--imported_from
http://www.midore.net/daybook/2007/06/1180989126.html

2007/06/02

mDNS UDP 5353 port

Security Update 2007-005
http://docs.info.apple.com/article.html?artnum=305530-ja

CVE-ID:CVE-2007-2386
mDNSResponder のセキュリティパッチ

mDNSResponder はUDP Port 5353 をローカルネットワークに送信していて、このポートを閉じると印刷できなくなったり、 AirPort などが使えなくなったりするらしい。
らしい、というか実際試してみたらプリンタの存在を認識してもらえなかったし(プリンタにもよるがキューを送信できなくなったりプリンタの存在が見えなくなったり)、AirMacExpress で AirTunes を使うこともできなくなった。

印刷も必要なければ、無線もいらない、意図的にUDP5353ポートを送信させたくない時はある...というか、本来ならばユーザが必要な時にだけ!このポートを送信するという仕様だったらよかったのにな。むやみやたらにまき散らすのでなく。

このポートを操作する方法が下記に簡潔に紹介されていたのでメモメモ。同様のことは mac osx hint でも紹介されていたような気もする。2,3 年前?だったっけ。下記を実行してから netstat -a で確認。

http://www.isskk.co.jp/support/techinfo/general/apple_mac_osx_264.html

パッチをすぐにインストールできない場合は、次のコマンドを使用して、影響を受けるコンポーネントを無効にすることができます。
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

コンポーネントを再度有効にするには、次のコマンドを使用します。
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

このコンポーネントを無効にすると、次のようなその他多くの機能も無効になります。
Auto Discovery での印刷、Airport および Airport Express、AirTune、iTune ミュージックの共有、カレンダー、アドレス ブックなど。


--imported_from
http://www.midore.net/daybook/2007/06/1180750920.html

2007/06/01

疲れた男のユートビア、砂の本から

よみなおし

砂の本 / ホルヘ・ルイス-ボルヘス / 集英社 / 408-773089-1

そんなものは、発明と推理への、たんなる出発点にすぎません。われわれは、学校で懐疑と忘却術を教えられる。とりわけ個人的、ならびに地方的なものを忘れる術です。われわれは連続的な時間のなかに生きています。
...
「私のおかしな過去には」とわたしは言った。「毎日、夕方から朝にかけて事が起こり、それを知らないでいるのは恥だ、という迷信がはびこっていました。
...
「政府はどうなりました?」「言い伝えによれば、次第に廃れました。政府は、選挙を公示し、宣戦し、税金を徴収し、財産を没収し、逮捕を命令し、検閲を課そうとねらいましたが、地球上のだれひとり、従おうとしなかった。...」


痛快だった。今、まさに日本政府は「税金を徴収し」...我らの年金はどこへ?という感じで。^^;
作者は現代人が未来に迷い込んだ設定を施してはるかに遠い未来の社会の有様を未来人に語らせている。未来人はどうやら永久の生をも手に入れたらしい。

ニュースをみたり聞いたりする社会人として常識であるような価値基準を、未来人は「迷信」と断言する。
「情報の遮断」という言葉が思い浮かぶしそれへの価値づけについてぼんやり考えてしまった。昔「情報は取得した後、一度遮断する必要がある」と人に聞いたのを思い出しつつ...

物語中、現代人が自分の生きてきた時代を「おかしな過去」と呼ぶ。政府はどうなったか?なんて、えらく他人事のような質問もする。
私たちが常識と捉えられているシステムや価値観をばっさばっさと cool に斬りたおす。次第に作者が思い浮かべる未来ががひしひしと伝わってきて読みすすむにつれ文字通りのユートピアを満喫できる。が、最後の最後にそのユートピアが抱え込む難題がみえてきて未来にも現代にも共通した爆弾のような何かをみせられ、急に物語は終わる。

ところで作者は「懐疑力を鍛えられる」という文章をどんな気持ちで書いたんだろう。
そういえば、がっこの先生から、なんでもいいから疑問を感じたことを感想文で提出しなさい、と言われたことはあったろうか?疑問を感じないなどとはケシカラン!と叱られたことはあったろうか?疑問をもつことはとても重要です、といった先生のお話しを聞いたことはあったろうか?私の記憶力が衰退しているのを考え合わせたとしても義務教育期間中に懐疑力を鍛えられたことは「なかった」と思う。むしろ、その逆の力を鍛えられたのはよく覚えていたりもするなぁ。と

西暦2007年の日本。今日もどこかで「どうして太陽はおちてこないの?」と口にしてしまった子供がいたとしたら、その瞳は大きく開かれたろうか。それとも、くぐもっただろうか。常識とはなんだろうと考えていたら「ハッカーと画家」を思い出してまた読みなおしてみたくなった。プログラミングの話ではないあたりを。

--imported_from
http://www.midore.net/daybook/2007/06/1180703867.html

+++ 追記 +++
2010-02-06

> 私の記憶力が衰退しているのを考え合わせたとしても

私の記憶力は衰退しているものの
の間違いのようだ。