web技術勉強会 第26回
DESCRIPTION
Web技術勉強会 第26回TRANSCRIPT
WEB技術勉強会技術勉強会技術勉強会技術勉強会 第第第第26回回回回RYUICHI TANAKA.
Amazon署名対応署名対応署名対応署名対応+MLDBMによるによるによるによるCache
アジェンダ
� Amazonのののの署名署名署名署名(Signature)対応方法対応方法対応方法対応方法� Amazon (Signature)
� MLDBMをををを利用利用利用利用したしたしたしたCache方法方法方法方法
Amazon WebService
� Amazonのデータのデータのデータのデータ取得取得取得取得� Amazonのデータのデータのデータのデータ取得取得取得取得
� REST形式形式形式形式
改めて言う必要ないよね^^;
しかししかし
2009年8月15日から2009年8月15日から動かなくなります
どうやらAmazonとしては、サーバからのリクエスト以外は弾きたい模様。ブログパーツに組み込まれているAPI経由でAmazonのサーバを叩きまくってることでサーバの負荷がやはりひどいとのこと。
数ヶ月前にアナウンスされたが、いまだに対応していないところは多い。なので、8/15に同時多発的に動かなくなる可能性がある。は多い。なので、8/15に同時多発的に動かなくなる可能性がある。(大手ブログサービスを利用していない個人サーバはその恐れ大)
ちなみに、現在は直っているが、Amazon本家のAPIドキュメントが貧弱、サンプルプログラムが動かない現象もあった。
Product Advertising API
� APIの正式名称が変更
� Signatureが必須� Signatureが必須
�そろそろ対応しないとまずい
対応方法
�PHP
� PEAR::Services_Amazon(新APIに対応済み)(新APIに対応済み)
�Perl
� URI::Amazon::APA(id:dankogai@CPAN, CodeRepos, github)
自作する場合
今回はこの方法を紹介します今回はこの方法を紹介します
Signatureが鬼門
Signature
の作り方が面倒!
Signatureのルール
①必要なパラメータを用意する
Key Value
Service AWSECommercesService
AWSAccessKeyId アクセスキーAWSAccessKeyId アクセスキー
Operation ItemSerchなど
SerchIndex Booksなど
Keywords キーワード
ResponseGroup ItemAttributesなど
Timestamp タイムスタンプ
Version バージョン
Signatureのルール
②パラメータを昇順にソートして連結
(このときUTF-8でURLエンコードする)
GET¥n
webservice.amazon.co.jp¥nwebservice.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エンコードする
SignaturePO%2FwmLa9hVwrLGEOnmf3i%2FqPzLvuGOM0hYXl8
uKOKxk%3D
Signature
Signatureのルール
④SignatureをリクエストURLの末尾に連結
http://webservices.amazon.co.jp/onca/xml?AWSAccessK
eyId=02GA6TH96EC9SQKGEJ82&Keywords=Ruby&Ope
ration=ItemSearch&ResponseGroup=Images%2CItemAtration=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にするなてくるので、JSONにするなりDBに入れるなりしましょう。
だが、
> Amazonのサーバを叩きまくってることでサーバの負荷がやはり> ひどいとのこと。
どうせならAmazonにどうせならAmazonに対して優しくなろう!
優しくない方式
優しくない方式
優しくない方式
優しい方式
優しい方式
Cache
Cache
Cache
優しい方式
Cache
Cache
Cache
データをキャッシュする
�データをキャッシュするには…
�ファイルキャッシュ?
�RDBMS?
どちらも悪くないどちらも悪くないが、良くもない
一番やるべきは、
「ハッシュそのもの」をキャッシュすること。をキャッシュすること。
単なるファイルベースのキャッシュやRDBMSでは難しい
そこで…
組み込み向けの組み込み向けのDBを使う
組み込みDB
� Berkeley DB
� 組み込みDB。SQLは持たない。C言語など多くの言語から使用可能C言語など多くの言語から使用可能
� SDBM
� Key、Value含め1008バイトしか保存できない
組み込みDB
� Data::Dumper
� ハッシュのままテキストに保存可能(読み込み時にハッシュとして扱える)(読み込み時にハッシュとして扱える)
� MLDBM
� ハッシュをメモリで記憶しているそのままの形式でファイルに保存可能。テキストデータより小さい、読み書きが高速。格納する容量制限がない。
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.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({
サンプルコード
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� CPU:Core 2 Duo U9300
� MEM:3.00GB
� Eclipse3.4上で実行(ActivePerl、EPIC)
キャッシュによる効果
�実行結果
�キャッシュなし:約1.9秒
�キャッシュあり:約0.07秒�キャッシュあり:約0.07秒
結論
�キャッシュ万歳!
�Amazon対応はお早めに�Amazon対応はお早めに
参考資料
� perlによる大規模データの取扱い� http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_b
igdata.html#sdbm
� MLDBM� 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.html
� Signed Requests Helper - Amazon Product
Advertising API
� http://associates-
amazon.s3.amazonaws.com/signed-
requests/helper/index.html