Andoroid SDKの中のサンプルプログラムの一覧

Android

Andoroid SDKの中のサンプルプログラムの一覧

Android SDKのフォルダの中に、Googleが作ってくれているサンプルプログラムがあります。
中身をみると、非常に勉強になるのですが、そもそもフォルダ名を見ればわかるアプリもあれば、そうでないアプリもあります。
どっかに一覧ないの~?と思っていたら、ここにありました。

http://jayxie.com/mirrors/android-sdk/resources/samples/index.html

よかったよぉ~ よかったねぇ~(^_^)

Andorid Google MapがGoogle Playに載せたら表示されない

Android

Andorid Google MapがGoogle Playに載せたら表示されない

ローカル環境でデバッグや、テスト機ではOKだったのに、Google Playにアップロードした後はGoogle Mapが表示されない、という場合、Google MapのAPIが、デバッグ用のキーになってないか確認してみましょう。

証明書を使ってサインした後も、テスト機でテストする必要がありますね(^_^;

An unknown error occurred

Xcode
実機テストで、ビルドする際、
「An unknown error occurred」というエラーが発生し、ビルドすらしない場合はXcodeのDerived Dataを削除するとうまくいく場合がある。
Derived DataはXcodeのキャッシュなのでフォルダの中身をまるごと削除してしまって構わない。
/Users/[ユーザー名]/Library/Developer/Xcode/DerivedData
に存在する。

Amazon Product Advertising API パラメーターとカテゴリの組み合わせ

PHP

Amazon Product Advertising API パラメーターとカテゴリの組み合わせ

Amazon Product Advertising API はじめの一歩に書きましたように、Amazonにリクエストを送って、結果が帰ってくるようになりました。

ですが、またもや悩ましい問題がっ!

Amazon Product Advertising APIでは、製品のカテゴリーによって、検索条件に入れられるもの、入れられないものが複雑に決まっているのです。

その一覧が下記。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/JPSearchIndexParamForItemsearch.html#JPSearchIndexParamForItemsearch_Watches

大体の人が、買い物する時に参考にしたいのは金額だと思いますから、金額に話を絞りますと、たとえばApparelにカテゴリを指定すると、最低金額、最高金額での絞り込みができません。
ElectronicsやJewelryも同様です。
Watchesは、MinimumPriceしか指定できません。

上記のカテゴリーを見ると、高額商品のカテゴリーなので、転売に使われないようにしている、ということでしょうか…。
なんかこういう細工はやめて頂きたいですけどねぇ。。。

Amazon Product Advertising API はじめの一歩

Ajax

Amazon Product Advertising API はじめの一歩

Amazonの商品を検索して、販売するというアプリを作ろうとしています。
最初は
「APIのリファレンス読んでちゃちゃっとできるだろう!」
と思っていたら、意外と難しかったので、つまづいた点などをメモしておきます。

そもそも、RESTとか、証明書とか、リクエストを送って結果を受信する方法もわからないよ!という人向けです。

読むべきドキュメント

最初につまづいたポイントは、
「とにかくAmazonのドキュメントがわかりにくい!どこにおいてあるのかさえわかりにくい!!」
ということです。

たとえば、下記がProgramming Guideの目次となっていますが、コンセプトみたいな話も多く、いらない情報が多いのです。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/ProgrammingGuide.html

何がいらないかと言うと、下記のようなEコマースとはなんぞや?というドキュメントもあります。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/WhatisECommerce.html

要約すると、
「Eコマースとはアマゾンみたいなサイトのことだよん。
Eコマースについて知りたければ、アマゾンで買い物してよねっ。」
とか書いてあります。どういう商魂のたくましさでしょうか。
ってか、こんなのをProgramming Guideに入れるな!と大声で言いたいです。

とにかく、それぐらいAmazonが提供しているドキュメントが混乱しているということがわかって頂けたでしょうか?

また、Amazon Product Advertising API Best Practices というページもあります。2007年に書かれたもののようです。
しかし、役には立ちそうなので、一読しておいた方がいいでしょう。
http://aws.amazon.com/articles/Product-Advertising-API/1057

サンプルコードの一覧が下記にあります。腕に覚えありの人は、こういうの見たほうが早いでしょうか?
http://aws.amazon.com/code/Product-Advertising-API?browse=1

Amazonに商品検索のパラメーターを送って、結果を受信する

Amazonに商品検索のパラメーターを送って、結果を受信するには、Amazon Product Advertising APIでは、リクエストをRESTで送信し、結果を受信する、ということになります。

そもそも「RESTで送信」とは??なんぞや?
と言いますと、RESTとはとか言い出すと、WikiPediaを見てください、ということになりますが、簡単に言うと、ここで必要なのはHTTPでリクエストを送信することです。

下記のようなURLをブラウザで実行することも、HTTPで送信している、ということになります。

 http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&
 AWSAccessKeyId=[Access Key D]&AssociateTag=[ID]&SearchIndex=Apparel&
 Keywords=Shirt&Timestamp=[YYYY-MM-DDThh:mm:ssZ]&Signature=[Request Signature]

RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html

そのために、AmazonのAmazon Product Advertising APIのアクセスキーというものが必要になります。

AmazonのAmazon Product Advertising APIのアクセスキーを取得する

下記のページの、
https://affiliate.amazon.co.jp/gp/advertising/api/detail/your-account.html

 こちらのリンクから、以下の処理が可能です:

の「こちらのリンク」をクリックしてください。
日本国内で、アフィリエイトのリンクを張りつけるだけのアカウントを持っている場合があると思いますが、これは別にIDを登録しないといけません。

情報を入力していくと、アカウントができます。

そのあと、アカウントを作り、再度上記の画面からサインインしますと、Amazon Web Serviceの管理画面に行けます。

いきなり、アラートが出て、今後はこの管理画面は使えなくなり、今後は、Your Security Credentialsという管理画面に映るそうです。

未来のために、Your Security Credentialsの説明を書いておきます。

下記のような画面ですが、確かにAccess Key IDとは書いてありますが、Secret Access Keyがありません。
え??( ゚Д゚)
と思いますよね。

赤マルで囲んだボタンをクリックします。
すると、新しいAccess Key IDとSecret Access Keyをダウンロードできます。

つまりは…このSecret Access Keyは一度ダウンロードしたら、同じものは二度とダウンロードできないのです!!!

もしSecret Access Keyがなくなってしまったら、新しいものを発行するしかないのです。

恐ろしすぎます…。Secret Access Keyは大事大事に保存しましょうね!!

ちなみに、現在利用できる日本語の管理画面では、画面上でSecret Access Keyを表示させることができます。

ふぅー
やっとアクセスキーとシークレットアクセスキーが取得できましたね。

そして再度RESTでリクエストを送ってみる

もう一度、RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html

わかりにくいので解説ですが、そもそもリクエストを投げるパラメーターを含んだリクエストを、一旦解剖してからシークレットキーでハッシュ化し、最後にパラメーターとして付与することになります。
なんでこんな面倒なことするんですかね…
アマゾンの価格だけ調べて、利用しようとする人たちを一生懸命排除するためでしょうか。

つまり、下記のようなリクエストをHTTPで投げたいとして

 http://ecs.amazonaws.co.uk/onca/xml?Service=AWSECommerceService&A
 WSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Operation=ItemSearch&Actor=Joh
 nny%20Depp&ResponseGroup=ItemAttributes,Offers,Images,Reviews,Var
 iations&Version=2009-01-01&SearchIndex=DVD&Sort=salesrank&Associa
 teTag=mytag-20

上記をまず、下記の状態にします。

 GET
 ecs.amazonaws.co.uk
 /onca/xml
 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Actor=Johnny%20Depp&Associate
 Tag=mytag-20&Operation=ItemSearch&ResponseGroup=ItemAttributes%2C
 Offers%2CImages%2CReviews%2CVariations&SearchIndex=DVD&Service=AW
 SECommerceService&Sort=salesrank&Timestamp=2009-01-01T12%3A00%3A0
 0Z&Version=2009-01-01

それを、HMACの SHA256で暗号化します。
PHPであれば、

 hash_hmac('sha256', $string_to_sign, $secret_access_key, true)

などとやります。別にこれは、自分のサーバーで行えばよいです。

で、暗号化された文字列が、下記のようにできますが、

 TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D

これを

 Signature=TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D

として、先ほどのHTTPリクエストに混ぜてやります。
全体のHTTPリクエストは、下記のようになります。

 http://ecs.amazonaws.co.uk/onca/xml?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
 &Actor=Johnny%20Depp&AssociateTag=mytag-20&Operation=ItemSe
 arch&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews%2CV
 ariations&SearchIndex=DVD&Service=AWSECommerceService&Signature=T
 uM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D&Sort=salesrank&Ti
 mestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-01

と、長々と書きましたが、なかなか書くのは面倒ですね…
少し間違うと、すぐ下記のようなメッセージが帰ってきてしまいます。

 The request signature we calculated does not match the signature you provided. 

下記にて、上記の流れのサンプルコードを公開されている方がいらっしゃいました。
ありがとうございます!!
https://gist.github.com/DQNEO/6231929

これで、AmazonからXMLが帰ってくれば、成功です★

後日段

後日、file_get_contents()ではなく、ソケット通信 fsockopen()でやろうとしましたが、Request Not Supported と返されてしまいました。(^_^;
残念。