Web技術勉強会 第26回

2,311 views

Published on

Web技術勉強会 第26回

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,311
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Web技術勉強会 第26回

  1. 1. 署名対応+MLDBMによる 署名対応 Amazon署名対応 によるCache による WEB技術勉強会 第26回 技術勉強会 回 RYUICHI TANAKA.
  2. 2. アジェンダ Amazonの署名(Signature)対応方法 Amazonの署名(Signature)対応方法 を利用した したCache方法 MLDBMを利用した 方法
  3. 3. Amazon WebService Amazonのデータ取得 のデータ取得 のデータ 形式 REST形式 改めて言う必要ないよね^^;
  4. 4. しかし
  5. 5. 2009年8月15日から 動かなくなります
  6. 6. どうやらAmazonとしては、サーバからのリクエスト以外は 弾きたい模様。ブログパーツに組み込まれているAPI経由で Amazonのサーバを叩きまくってることでサーバの負荷がやはり ひどいとのこと。 数ヶ月前にアナウンスされたが、いまだに対応していないところ は多い。なので、8/15に同時多発的に動かなくなる可能性がある。 (大手ブログサービスを利用していない個人サーバはその恐れ大) ちなみに、現在は直っているが、Amazon本家のAPIドキュメント が貧弱、サンプルプログラムが動かない現象もあった。
  7. 7. Product Advertising API APIの正式名称が変更 Signatureが必須 そろそろ対応しないとまずい
  8. 8. 対応方法 PHP PEAR::Services_Amazon (新APIに対応済み) Perl URI::Amazon::APA (id:dankogai@CPAN, CodeRepos, github)
  9. 9. 自作する場合 今回はこの方法を紹介します
  10. 10. Signatureが鬼門 Signature の作り方が面倒!
  11. 11. Signatureのルール ①必要なパラメータを用意する Key Value Service AWSECommercesService AWSAccessKeyId アクセスキー Operation ItemSerchなど SerchIndex Booksなど Keywords キーワード ResponseGroup ItemAttributesなど Timestamp タイムスタンプ Version バージョン
  12. 12. Signatureのルール ②パラメータを昇順にソートして連結 (このときUTF-8でURLエンコードする) GET¥n webservice.amazon.co.jp¥n /onca/xml¥n AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxxx&Keywords=Pe rl&Operation=ItemSearch&ResponseGroup=Images%2C ItemAttributes&SearchIndex=Books&Service=AWSECo mmerceService&Timestamp=2009-07- 26T12%3A45%3A44Z&Version=2009-03-31
  13. 13. Signatureのルール ③HMAC with SHA256 hash algorithmを適用し てSignatureを生成し、URLエンコードする Signature PO%2FwmLa9hVwrLGEOnmf3i%2FqPzLvuGOM0hYXl8 uKOKxk%3D
  14. 14. Signatureのルール ④SignatureをリクエストURLの末尾に連結 http://webservices.amazon.co.jp/onca/xml?AWSAccessK eyId=02GA6TH96EC9SQKGEJ82&Keywords=Ruby&Ope ration=ItemSearch&ResponseGroup=Images%2CItemAt tributes&SearchIndex=Books&Service=AWSECommerce Service&Timestamp=2009-07- 26T13%3A07%3A47Z&Version=2009-03- 31&Signature=PO%2FwmLa9hVwrLGEOnmf3i%2FqPzL vuGOM0hYXl8uKOKxk%3D
  15. 15. あとは煮るなる焼くなり あとは従来通りXMLで返っ てくるので、JSONにするな りDBに入れるなりしましょ う。
  16. 16. だが、 > Amazonのサーバを叩きまくってることでサーバの負荷がやはり > ひどいとのこと。 どうせならAmazonに 対して優しくなろう!
  17. 17. 優しくない方式
  18. 18. 優しくない方式
  19. 19. 優しくない方式
  20. 20. 優しい方式
  21. 21. 優しい方式 Cache Cache Cache
  22. 22. 優しい方式 Cache Cache Cache
  23. 23. データをキャッシュする データをキャッシュする には… ファイルキャッシュ? RDBMS?
  24. 24. どちらも悪くない が、良くもない
  25. 25. 一番やるべきは、 「ハッシュそのもの」 をキャッシュすること。 単なるファイルベースのキャッシュや RDBMSでは難しい
  26. 26. そこで… 組み込み向けの DBを使う
  27. 27. 組み込みDB Berkeley DB 組み込みDB。SQLは持たない。 C言語など多くの言語から使用可能 SDBM Key、Value含め1008バイトしか保存 できない
  28. 28. 組み込みDB Data::Dumper ハッシュのままテキストに保存可能 (読み込み時にハッシュとして扱える) MLDBM ハッシュをメモリで記憶しているそ のままの形式でファイルに保存可能。 テキストデータより小さい、読み書 きが高速。格納する容量制限がない。
  29. 29. MLDBMが 最も使える!
  30. 30. MLDBMを使う前に…
  31. 31. tie関数 オブジェクトでない、Perlの組 み込みデータ型を裏でオブジェ クト化する仕組み。 変数を指定されたクラスに結び つける
  32. 32. tie関数 tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666
  33. 33. tie関数 結びつける オブジェクト tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666 結び付けられる オブジェクトに 変数 渡す引数 「結びつけるオブジェクト」には、 DESTROY、FETCH、STOREなどのメソッドを 実装しておく必要がある。
  34. 34. MLDBMを使う use MLDBM qw/DB_File Storage/; use Fcntl; tie my %data, ‘MLDBM’, ‘/path/to/cache.db’, O_CREAT | O_RDWR, 0666 or die “$!”; ・DB_FileはBerkeleyDBを使うためのモジュール。 DB_File BerkeleyDB ・Storageはデータのシリアライズ方法。 ほかの方法よりも高速。 ・FcntlでO_CREATなどが使える。
  35. 35. 今回の成果物 Cache.pm MLDBMを利用したキャッシュモジュール。 キャッシュの新規作成と読み込みが可能。 Amazon.pm 署名対応Amazon書籍検索モジュール。JSON を返す。Cache.pmを継承している。インスタ ンス作成時のオプションでキャッシュするか しないかを決められる。
  36. 36. #!/usr/bin/perl use strict; サンプルコード use warnings; use CGI; use FindBin::libs qw{ export base=syscommon }; use MyLibs::Diarysys::Service::Amazon; my $cgi = new CGI(); print $cgi->header(-type=>"application/x-javascript", -charset=>"utf-8"); my $amazon = MyLibs::Diarysys::Service::Amazon->new({ key => “Input your Accesskey", secret => “Input your Secretkey", keyword => $cgi->escapeHTML($cgi->param('keyword')), callback => $cgi->escapeHTML($cgi->param('callback')), cache_file => "/path/to/cache.db", ttl => 10000 }); print $amazon->get_data();
  37. 37. キャッシュによる効果 実行環境 OS:Windows Vista CPU:Core 2 Duo U9300 MEM:3.00GB Eclipse3.4上で実行(ActivePerl、EPIC)
  38. 38. キャッシュによる効果 実行結果 キャッシュなし:約1.9秒 キャッシュあり:約0.07秒
  39. 39. 結論 キャッシュ万歳! Amazon対応はお早めに
  40. 40. 参考資料 perlによる大規模データの取扱い http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_b igdata.html#sdbm MLDBM http://perldoc.jp/docs/modules/MLDBM- 2.01/MLDBM.pod tie関数: dbmopenの代わりに使う - bluespearの勉強メモ - bluespearグループ http://bluespear.g.hatena.ne.jp/bluespear/200710 14/1192342961
  41. 41. 参考資料 404 Blog Not Found:perl - tie()って 何をtieするの? http://blog.livedoor.jp/dankogai/archives/51076010 .html Signed Requests Helper - Amazon Product Advertising API http://associates- amazon.s3.amazonaws.com/signed- requests/helper/index.html

×