Web技術勉強会 第26回
Upcoming SlideShare
Loading in...5
×
 

Web技術勉強会 第26回

on

  • 2,227 views

Web技術勉強会 第26回

Web技術勉強会 第26回

Statistics

Views

Total Views
2,227
Views on SlideShare
2,227
Embed Views
0

Actions

Likes
1
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Web技術勉強会 第26回 Web技術勉強会 第26回 Presentation Transcript

  • 署名対応+MLDBMによる 署名対応 Amazon署名対応 によるCache による WEB技術勉強会 第26回 技術勉強会 回 RYUICHI TANAKA.
  • アジェンダ Amazonの署名(Signature)対応方法 Amazonの署名(Signature)対応方法 を利用した したCache方法 MLDBMを利用した 方法
  • Amazon WebService Amazonのデータ取得 のデータ取得 のデータ 形式 REST形式 改めて言う必要ないよね^^;
  • しかし
  • 2009年8月15日から 動かなくなります
  • どうやらAmazonとしては、サーバからのリクエスト以外は 弾きたい模様。ブログパーツに組み込まれているAPI経由で Amazonのサーバを叩きまくってることでサーバの負荷がやはり ひどいとのこと。 数ヶ月前にアナウンスされたが、いまだに対応していないところ は多い。なので、8/15に同時多発的に動かなくなる可能性がある。 (大手ブログサービスを利用していない個人サーバはその恐れ大) ちなみに、現在は直っているが、Amazon本家のAPIドキュメント が貧弱、サンプルプログラムが動かない現象もあった。
  • Product Advertising API APIの正式名称が変更 Signatureが必須 そろそろ対応しないとまずい
  • 対応方法 PHP PEAR::Services_Amazon (新APIに対応済み) Perl URI::Amazon::APA (id:dankogai@CPAN, CodeRepos, github)
  • 自作する場合 今回はこの方法を紹介します
  • Signatureが鬼門 Signature の作り方が面倒!
  • Signatureのルール ①必要なパラメータを用意する Key Value Service AWSECommercesService AWSAccessKeyId アクセスキー Operation ItemSerchなど SerchIndex Booksなど Keywords キーワード ResponseGroup ItemAttributesなど Timestamp タイムスタンプ Version バージョン
  • 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
  • Signatureのルール ③HMAC with SHA256 hash algorithmを適用し てSignatureを生成し、URLエンコードする Signature PO%2FwmLa9hVwrLGEOnmf3i%2FqPzLvuGOM0hYXl8 uKOKxk%3D
  • 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
  • あとは煮るなる焼くなり あとは従来通りXMLで返っ てくるので、JSONにするな りDBに入れるなりしましょ う。
  • だが、 > Amazonのサーバを叩きまくってることでサーバの負荷がやはり > ひどいとのこと。 どうせならAmazonに 対して優しくなろう!
  • 優しくない方式
  • 優しくない方式
  • 優しくない方式
  • 優しい方式
  • 優しい方式 Cache Cache Cache
  • 優しい方式 Cache Cache Cache
  • データをキャッシュする データをキャッシュする には… ファイルキャッシュ? RDBMS?
  • どちらも悪くない が、良くもない
  • 一番やるべきは、 「ハッシュそのもの」 をキャッシュすること。 単なるファイルベースのキャッシュや RDBMSでは難しい
  • そこで… 組み込み向けの DBを使う
  • 組み込みDB Berkeley DB 組み込みDB。SQLは持たない。 C言語など多くの言語から使用可能 SDBM Key、Value含め1008バイトしか保存 できない
  • 組み込みDB Data::Dumper ハッシュのままテキストに保存可能 (読み込み時にハッシュとして扱える) MLDBM ハッシュをメモリで記憶しているそ のままの形式でファイルに保存可能。 テキストデータより小さい、読み書 きが高速。格納する容量制限がない。
  • MLDBMが 最も使える!
  • MLDBMを使う前に…
  • tie関数 オブジェクトでない、Perlの組 み込みデータ型を裏でオブジェ クト化する仕組み。 変数を指定されたクラスに結び つける
  • tie関数 tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666
  • tie関数 結びつける オブジェクト tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666 結び付けられる オブジェクトに 変数 渡す引数 「結びつけるオブジェクト」には、 DESTROY、FETCH、STOREなどのメソッドを 実装しておく必要がある。
  • 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などが使える。
  • 今回の成果物 Cache.pm MLDBMを利用したキャッシュモジュール。 キャッシュの新規作成と読み込みが可能。 Amazon.pm 署名対応Amazon書籍検索モジュール。JSON を返す。Cache.pmを継承している。インスタ ンス作成時のオプションでキャッシュするか しないかを決められる。
  • #!/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();
  • キャッシュによる効果 実行環境 OS:Windows Vista CPU:Core 2 Duo U9300 MEM:3.00GB Eclipse3.4上で実行(ActivePerl、EPIC)
  • キャッシュによる効果 実行結果 キャッシュなし:約1.9秒 キャッシュあり:約0.07秒
  • 結論 キャッシュ万歳! Amazon対応はお早めに
  • 参考資料 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
  • 参考資料 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