web技術勉強会 第26回

41
WEB技術勉強 技術勉強 技術勉強 技術勉強 第 26RYUICHI TANAKA. Amazon署名対応 署名対応 署名対応 署名対応+MLDBMによる による による によるCache

Upload: -

Post on 28-May-2015

2.102 views

Category:

Technology


6 download

DESCRIPTION

Web技術勉強会 第26回

TRANSCRIPT

Page 1: Web技術勉強会 第26回

WEB技術勉強会技術勉強会技術勉強会技術勉強会 第第第第26回回回回RYUICHI TANAKA.

Amazon署名対応署名対応署名対応署名対応+MLDBMによるによるによるによるCache

Page 2: Web技術勉強会 第26回

アジェンダ

� Amazonのののの署名署名署名署名(Signature)対応方法対応方法対応方法対応方法� Amazon (Signature)

� MLDBMをををを利用利用利用利用したしたしたしたCache方法方法方法方法

Page 3: Web技術勉強会 第26回

Amazon WebService

� Amazonのデータのデータのデータのデータ取得取得取得取得� Amazonのデータのデータのデータのデータ取得取得取得取得

� REST形式形式形式形式

改めて言う必要ないよね^^;

Page 4: Web技術勉強会 第26回

しかししかし

Page 5: Web技術勉強会 第26回

2009年8月15日から2009年8月15日から動かなくなります

Page 6: Web技術勉強会 第26回

どうやらAmazonとしては、サーバからのリクエスト以外は弾きたい模様。ブログパーツに組み込まれているAPI経由でAmazonのサーバを叩きまくってることでサーバの負荷がやはりひどいとのこと。

数ヶ月前にアナウンスされたが、いまだに対応していないところは多い。なので、8/15に同時多発的に動かなくなる可能性がある。は多い。なので、8/15に同時多発的に動かなくなる可能性がある。(大手ブログサービスを利用していない個人サーバはその恐れ大)

ちなみに、現在は直っているが、Amazon本家のAPIドキュメントが貧弱、サンプルプログラムが動かない現象もあった。

Page 7: Web技術勉強会 第26回

Product Advertising API

� APIの正式名称が変更

� Signatureが必須� Signatureが必須

�そろそろ対応しないとまずい

Page 8: Web技術勉強会 第26回

対応方法

�PHP

� PEAR::Services_Amazon(新APIに対応済み)(新APIに対応済み)

�Perl

� URI::Amazon::APA(id:dankogai@CPAN, CodeRepos, github)

Page 9: Web技術勉強会 第26回

自作する場合

今回はこの方法を紹介します今回はこの方法を紹介します

Page 10: Web技術勉強会 第26回

Signatureが鬼門

Signature

の作り方が面倒!

Page 11: Web技術勉強会 第26回

Signatureのルール

①必要なパラメータを用意する

Key Value

Service AWSECommercesService

AWSAccessKeyId アクセスキーAWSAccessKeyId アクセスキー

Operation ItemSerchなど

SerchIndex Booksなど

Keywords キーワード

ResponseGroup ItemAttributesなど

Timestamp タイムスタンプ

Version バージョン

Page 12: Web技術勉強会 第26回

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

Page 13: Web技術勉強会 第26回

Signatureのルール

③HMAC with SHA256 hash algorithmを適用してSignatureを生成し、URLエンコードする

SignaturePO%2FwmLa9hVwrLGEOnmf3i%2FqPzLvuGOM0hYXl8

uKOKxk%3D

Signature

Page 14: Web技術勉強会 第26回

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

Page 15: Web技術勉強会 第26回

あとは煮るなる焼くなり

あとは従来通りXMLで返ってくるので、JSONにするなてくるので、JSONにするなりDBに入れるなりしましょう。

Page 16: Web技術勉強会 第26回

だが、

> Amazonのサーバを叩きまくってることでサーバの負荷がやはり> ひどいとのこと。

どうせならAmazonにどうせならAmazonに対して優しくなろう!

Page 17: Web技術勉強会 第26回

優しくない方式

Page 18: Web技術勉強会 第26回

優しくない方式

Page 19: Web技術勉強会 第26回

優しくない方式

Page 20: Web技術勉強会 第26回

優しい方式

Page 21: Web技術勉強会 第26回

優しい方式

Cache

Cache

Cache

Page 22: Web技術勉強会 第26回

優しい方式

Cache

Cache

Cache

Page 23: Web技術勉強会 第26回

データをキャッシュする

�データをキャッシュするには…

�ファイルキャッシュ?

�RDBMS?

Page 24: Web技術勉強会 第26回

どちらも悪くないどちらも悪くないが、良くもない

Page 25: Web技術勉強会 第26回

一番やるべきは、

「ハッシュそのもの」をキャッシュすること。をキャッシュすること。

単なるファイルベースのキャッシュやRDBMSでは難しい

Page 26: Web技術勉強会 第26回

そこで…

組み込み向けの組み込み向けのDBを使う

Page 27: Web技術勉強会 第26回

組み込みDB

� Berkeley DB

� 組み込みDB。SQLは持たない。C言語など多くの言語から使用可能C言語など多くの言語から使用可能

� SDBM

� Key、Value含め1008バイトしか保存できない

Page 28: Web技術勉強会 第26回

組み込みDB

� Data::Dumper

� ハッシュのままテキストに保存可能(読み込み時にハッシュとして扱える)(読み込み時にハッシュとして扱える)

� MLDBM

� ハッシュをメモリで記憶しているそのままの形式でファイルに保存可能。テキストデータより小さい、読み書きが高速。格納する容量制限がない。

Page 29: Web技術勉強会 第26回

MLDBMが

最も使える!最も使える!

Page 30: Web技術勉強会 第26回

MLDBMを使う前に…MLDBMを使う前に…

Page 31: Web技術勉強会 第26回

tie関数

�オブジェクトでない、Perlの組

み込みデータ型を裏でオブジェクト化する仕組み。クト化する仕組み。

�変数を指定されたクラスに結びつける

Page 32: Web技術勉強会 第26回

tie関数

tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666

Page 33: Web技術勉強会 第26回

tie関数

結び付けられる

結びつけるオブジェクト

オブジェクトに

tie my %data, ‘DB_File’, ‘/path/to/cache.db’, O_CREAT, 0666

結び付けられる変数

オブジェクトに渡す引数

「結びつけるオブジェクト」には、DESTROY、FETCH、STOREなどのメソッドを実装しておく必要がある。

Page 34: Web技術勉強会 第26回

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などが使える。

Page 35: Web技術勉強会 第26回

今回の成果物

� Cache.pm

� MLDBMを利用したキャッシュモジュール。キャッシュの新規作成と読み込みが可能。

� Amazon.pm� Amazon.pm

� 署名対応Amazon書籍検索モジュール。JSON

を返す。Cache.pmを継承している。インスタ

ンス作成時のオプションでキャッシュするかしないかを決められる。

Page 36: Web技術勉強会 第26回

#!/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();

Page 37: Web技術勉強会 第26回

キャッシュによる効果

� 実行環境

� OS:Windows Vista

� CPU:Core 2 Duo U9300� CPU:Core 2 Duo U9300

� MEM:3.00GB

� Eclipse3.4上で実行(ActivePerl、EPIC)

Page 38: Web技術勉強会 第26回

キャッシュによる効果

�実行結果

�キャッシュなし:約1.9秒

�キャッシュあり:約0.07秒�キャッシュあり:約0.07秒

Page 39: Web技術勉強会 第26回

結論

�キャッシュ万歳!

�Amazon対応はお早めに�Amazon対応はお早めに

Page 40: Web技術勉強会 第26回

参考資料

� 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

Page 41: Web技術勉強会 第26回

参考資料

� 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