2010年2月8日月曜日

謎のamazonへのアクセス失敗

さらに続くのだがw

そうなってくると、目的はしっかりしたので、手段を決めて、ひとつづつ解決していけばいいわけです。もう、ここまでくれば50%はできたも同然。
技術的に懸念があるとすれば amazonのAPI使ったことないのでその使い方の習得と、iPhoneでのバーコードスキャン機能。

バーコードスキャン機能はバーコードの規格やら画像認識やら面倒が多そうなので、まずはamazon APIへのアクセス方法を調べて実際にやってみることに。

これはそんなに難しくなかった。
amazonはすでにAWSのEC2をつかっていたりするのでデベロッパとして登録済み。なのでamazonサイトを漁って必要なドキュメントを読んだり、webで解説している人たちのサイトを参考にして自分でもAPIつかってamazonにアクセスしてみることにした。
もちろん、いきなりiPhoneのコードで書くと基本的なところでツマズいた時に原因の切り分けができない可能性あるので手馴れたPHPでwebサービスとして実験コードを書いてみた。資料もあるしPHPのコーディングは慣れているのであっという間に完成。個人的にamazon EC2のサーバを借りているのでそこに設置して実験してみた。
amazon.co.jpにISBNをItemの引数としてアクセスしてみると見事にamazonで表示される情報が引き出せた。これは楽勝!

と、おもいきや、なんかうまく引き出せない場合もある。
まったく同じISBNなのに、うまくできるときとできないときがあり、原因がわからない。ちなみにamazon.comやamazon.co.ukへのアクセスではこのような状況は発生せず、毎回、すべてうまくアクセスできた。amazon.co.jpだけ、なんかダメみたい。
 webで同じ様な境遇が人がいないかと調べたけど、こんな症状はみつからないので、仮説をたてた。

◆仮説
 仮定1.
amazon.co.jpのAPIリクエストを受けるサーバは複数台ある。
(これは仮定ではなくて実際そうだとおもう)

仮定2.
そのサーバは地域もしくはIPアドレスでフィルタされる設定がされている。
もしくはルータとかでフィルタされているかもしれない。
(実際、アクセスしてくるIPアドレスでブロックしていて、amazonからの接続を拒否されているwebサービスもあったらしい)

仮定3.
私が実験しているサーバのIPアドレスもしく地域(us東海岸)がそのフィルタにひっかかっている。IPアドレスはEC2から払い出しされたものなので可能性はある。

仮定4.
で、そのフィルタの設定はamzonのサーバ間で共有、統一されていない。
(不当なwebサービスをブロックしたいなら、一部サーバだけでもブロックすれば恒常的なサービスとして提供できなくなるのでamazonとしてはこれで問題はないだろう)

この4つの仮定が成立していることによって、私の実験コードはうまくいったりいかなかったりしているのではないか?
これはamazon.com/co.uk/.fr/.ca/.de のそれぞれでは発生しなかったため、amazon.co.jpだけの固有の問題だと思われる。

ってことでIPアドレスを変えればうまく行くだろう。という結論にした。
他にグローバルIPアドレスは持っていないので実験はできないけど、これを問題にしている人が見つからないということから、非常に稀な現象であろうと。なので1つでも仮定が崩れれば問題なくアクセスできるであろう。ということにした。こんなことでいつまでも時間とられれていても仕方なのでね。

まぁPHPで不安は残りながらもamazon APIの使い方はわかったのでそれをもとにObjective-CでiPhoneに実装してみたところ、もちろん、アクセスに失敗することなどなく、すべてうまくいきました。
仮説成立!めでたしめでたしw


ちなみに、この時点でISBNコードの手入力でブックレビューを表示するところまでは成功している。これ1月の中旬ごろのことだと記憶している。ここまでくれば機能的には70%はできたも同然状態でしょうか。最悪、バーコードスキャンのプログラムが失敗しても製品としては言い訳がたつくらいの機能はついています。

でも、本当にほしいのはISBNバーコードをサクっとスキャンしてレビュー表示する機能です。本題はこれからだっ!!!


注)
http://twitter.com/ohneta_/status/8064153065
http://twitter.com/ohneta_/status/8064154887
ここらへんで結論をtweetしてるけど、これはiPhoneで実際にamazon.co.jpにアクセスした結果をもとにして確証を得たあとの発言です。

0 件のコメント:

コメントを投稿