グラフ描画ももはやAPIでOK

数年前まではPHPでグラフを描画させようと思うと相応の苦労が必要だった。自前で美しいグラフを描かせるのにはかなりのステップ数のプログラムを書かなくてはいけない。必然的に先駆者のお知恵拝借でライブラリをさがすことになる。その次に日本語化。日本語フォントファイルをIPAあたりからダウンロードしてきて試行錯誤してみたり・・・。

最近、グラフを描かせる必要性に迫られてウェブで検索していると、もはやRESTで呼び出すだけでグラフを描画してくれるサービスがあることに驚いた。

Google Chart API

RESTで呼ぶだけだから、プログラムの必要性もない。パラメータは引数で渡すだけ。しかも日本語も通る。2年ほど前から公開が始まっていたっぽい。グラフの種類も10種類くらいあるし、QRコードの作成までOK(これでQRコードのプログラムさえ必要なくなる)。見栄えも相応に美しいし文句のつけようもない。

こうしてみていると、かつて「ウェブ上で実現するのが難しく相応の技量が必要だったこと」ということが、誰でも間単にできてしまうようになってきた。敷居を下げるという意味では大変有意義なことではあるが、当然試行錯誤することがなくなるわけで、それだけプログラムの技量を磨く機会を失いつつあるということに少し危機感を感じる。

15年も前だとウェブプログラミングが一般的でなかったし、フレームワークもなかったし、わかりやすい書籍もほとんどなかった。何でも一から書かないといけなかった。今から思えば試行錯誤の連続だった。状況は急転している。今でも生まれつき優秀なプログラマはたくさんいるだろうけど、そういう人はいつの時代に生まれてもやっぱり優秀なんだろう。でも自分のような普通のプログラマは、相応に学習する機会に恵まれないと(嫌でもやらざるを得ない状況に追い込まれないと)、そこそこのプログラマにたどり着けないような気がしてならない。まさしく両極化だ。

いいライブラリに出会えたけど、考え事も増えそうだ。

AWSの署名でSignatureDoesNotMatchエラー

3日間も悩んで、結果すごくおバカなミスだったという話。

Amazon Web ServiceでREST形式でいろいろできる手法に署名(Signature)をつけるよう仕様が変更される。8月15日までは移行期間で、それ以降はRESTに署名をつけないと処理されなくなる。そこで早めに対応しておこうと処理を書いてみた。

$secretKey=’0123456789′; // AWSより提供されたSecret Access Key
$url= ‘http://ecs.amazonaws.jp/onca/xml';
$parameters=array(‘Service’=>’AWSECommerceService’, ‘Version’=>’2009-03-31’………);  //必要なパラメータ
$parameters[‘Timestamp’]=gmdate(‘Y-m-d\TH:i:s\Z’); //タイムスタンプが必要になった
ksort($parameters); //署名の際、クエリの並び順も関係するのでソートしておく
//クエリの組み立て
$query=”;
foreach($parameters as $id => $value){
$query.=’&’.$id.’=’.str_replace(“%7E”,’~’,rawurlencode($value));
}
$requests=parse_url($url);
//署名のための文字列を生成して署名を作る
$string4sign=”;
$string4sign.=”GET\n”;
$string4sign.=$requests[‘host’].”\n”;
$string4sign.=$requests[‘path’].”\n”;
$string4sign.=$query;
$signature=str_replace(“%7E”, ‘~’, rawurlencode(base64_encode(hash_hmac(‘sha256′, $string4sign, $secretKey, true))));
$url.=’?’.$query.’&Signature=’.$signature;

このスクリプトは最終的に動作したもの。しかし最初に書いたスクリプトで$urlにアクセスしても「SignatureDoesNotMatch」。なぜだ。

The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

Secret Access Keyが間違っているか、署名方法が間違ってるよ、といわれる。何度も何度も微調整して、他のサイトも参考にしたけど理由がわからなくて、3日間も悩んでしまった。間違っていた箇所は2つ。

(1) ちゃんとエンコードした値を渡す。
$query.=’&’.$id.’=’.str_replace(“%7E”,’~’,rawurlencode($value));

動かなかったスクリプトではちゃんとRFCにそったエンコードをかけていなかった。んで、ここはとりあえず解決。そしてもっと致命的なミスがあった。

(2) Access Keyが違う!。

そもそもなんで違うアクセスキーを使っていたのかがわからない。ていうか、どこでそのアクセスキーを取得したのかもわからない。すべて謎。たぶんどっかのスクリプトをコピペした際に、アクセスキーを書き換えるのを忘れていたんだと思う。「コピペ元の方、ごめんなさい」という感じだ。ま、そもそもAccess KeyとSecret Access Keyの組み合わせが違うんだから絶対に署名があうわけないのだ。

前者のミスは早々に気がついていたのですぐに修正したけれど、それでも動作しないから「記述方法が悪いんじゃないか」と思ったり、署名用の文字列の作り方が悪いんじゃないか、と思ったりで後者のミスに気がつかなかった。というか、そもそも間違えているなんて夢にも思わなかった。

結果的に2つもミスがあったので、ほんと3日間も悩んでいてバカみたいだった。でも、スッキリ。

楽天APIのジャンル検索が面倒だったので

楽天APIで遊んでいる。今は商品検索APIを試用していて、キーワード検索の機能を使っているのだが、これだとキーワードにマッチするいろんな商品がひっかかってしまう(例えば「くつ」で検索した場合、シューズはもちろん、靴乾燥機や靴下も出てくる)のでジャンルを指定することにした。しかしこれ意外と面倒。ジャンルのリストが用意されているわけではなくて、いちいちAPIを使ってジャンルを検索していかないといけないのだ。はじめのうちはちょこちょこプログラムを書いてvar_dumpしつつデータを読み取っていたけれど、なんとも面倒なので汎用ジャンル検索ができるようプログラムを作ってみた。んでもって、誰でも使えるよう公開してみることにした。

楽天ジャンルID検索ツール

プログラムは単純でジャンル検索APIに準じてRESTを投げ、取得したXMLをsimplexml関数でデコードしている。自分のデベロッパーIDを使って公開すると、検索プログラムの負荷が高まって実際の商品検索ができなくなってしまうので、各自のデベロッパーIDを入力して使えるようにしてみた。自分で使ってみて・・・正直これは便利。他の人はどうしてるんだろ。自作して公開してる人もいるのではないだろうか・・・。

AmazonWebServiceのSearchIndex現在の一覧

AmazonWebService(AWS)では商品の検索をかける際に、商品分野としてSearchIndexというものを指定する。この項目は20弱程度しかないのだが、Amazon側で分野が追加されると、当然のごとくこちらも追加される。よって書籍やウェブ上の情報が古い場合は、最新のSearchIndexが記載されていないことも多々ある。普段参考にしている「超極めるPHP」という書籍も例外ではない(右下参照)。

ちなみに2007年4月15日現在は以下のものが有効の模様(■が比較的最近追加のもの)。
□Blended:(Amazon全体)
□Books:(本)
□Classical:(クラシック音楽)
□DVD:(DVD)
□Electronics:(電化製品)
□ForeignBooks:(洋書)
■HealthPersonalCare:(ヘルス&ビューティー)
□Hobbies:(ホビー)
□Kitchen:(ホーム&キッチン)
□Music:(音楽)
□MusicTracks:(音楽:曲名から)
□Software:(ソフトウェア)
□SportingGoods:(スポーツ用品)
□Toys:(おもちゃ&ホビー)
□VHS:(ビデオ)
□Video:(DVD&ビデオ)
□VideoGames:(ゲーム)
■Watches:(時計)

AmazonウェブサービスのResponseGroup

Amazon Web Serviceでデータを取得する際に指定する「ResponseGroup」。何があるかいつも検索しないといけないので、リストにしておくことにした。

Accessories アクセサリー情報。
BrowseNodeInfo ブラウズノードの情報。
BrowseNodes ブラウズノード。
Cart CartId、HMAC、PurchaseURL等リモートカート用の情報。
CartSimilarities カート内の商品と関連のある商品の情報。
CustomerFull ResponseGroupのセット。
CustomerInfo 特定の顧客情報。
CustomerLists 特定の顧客情報。
CustomerReviews 特定の顧客によるレビューの情報。
EditorialReview Amazon.co.jpからの商品紹介情報。
Help リクエストしたOperationとResponseGroupsの情報。
Images 商品画像の情報。Small,Medium,Largeの3つがある。
ItemAttributes 各商品に付随する情報(タイトルや商品のサイズ、発売日等)。
ItemIds ASINコード。
Large ResponseGroupのセット。
ListFull ResponseGroupのセット。
ListInfo リストの情報。
ListItems リストの入っている商品の情報。
ListmaniaLists リストマニアのリスト情報。
ListMinimum ListId。
Medium ResponseGroupのセット。
OfferFull Offersと出品者のニックネーム+Location等の情報。
Offers OfferSummaryとその出品商品の情報。
OfferSummary 出品者リスト数とその最低価格の情報。
Request リクエストした内容の情報。
Reviews 顧客レビューのリスト、ランク、レビューの数。
SalesRank SalesRankの情報。
Seller 出品者の情報。
SellerListing マーケットプレイスでのリスト情報。
Similarities 関連商品の情報。
Small ResponseGroupのセット。
Subjects 書籍の名称の情報。
Tracks CDのタイトルと曲名の情報。
TransactionDetails アマゾンの取引に関する情報。
VariationMinimum 子ASINコードの情報。
Variations ResponseGroupのセット。
VariationImages 子ASINコードの画像の情報。
VariationSummary 子ASINコードの価格の情報。

守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net