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

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

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

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

varchar形をソート

2009/03/05 | MySQL

いつもよく使うMySQL。特定カラムでソートするときのTipsというか備忘録。

本来は数値で入力しておくべきカラムなのだが、わがままなクライアントが時として文字列を入力したいということがあるので、とりあえずvarchar型を採用することにしたのが、そのカラムでソートする必要が出てきてしまった。

SELECT * FROM myTable ORDER BY myColumn DESC;

普通にこんな風に描いてみたけど問題が出た。たいていの場合、そこには二桁の数字が入るのだけれど、まれに三桁の数字が入ることがある。そのときに期待通りに並ばない。例えば90と100という”文字列”が入っていたときに、上記のSQLなら100のほうが上位になってほしいのに下位になってしまうのだ。文字列で判断しているわけだから最初の文字「9」と「1」で判断して、そういう結果になるのは当たり前なのだが・・・、100のほうが上位になってほしい。

そんなときに使用する関数(MySQLの)がCASTだ。名前のとおり型変換(型のキャスト)をしてくれる関数だ。上記のSQLを以下のように書き換えてうまく動作してくれた。

SELECT * FROM myTable ORDER BY CAST(myColumn as signed) DESC;

すっきり。でもこれ、行数が多いと時間かかりそう。

画像を作って日本語文字列を表示

画像を操作する関数としてGD関数群が用意されている。で、それらの関数を使うと、拡大とか縮小とかトリミングとかいろいろできる。さらに画像の中に文字を書き込むこともできる。でもって、さらに、マルチバイトな文字も書き込むことができる。それがimagettftext関数だ。

imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

ただし、一手間かけないといけない。7つ目の引数「フォントファイル」の指定だ。たいていの場合、レンタルサーバにはそんなものは用意されていないので、自前で準備する必要がある。で、使えるフォントはこちらのがいいようです。

M+とIPAフォントの合成フォント

請求書フォームとかPDF出力したりするのにもつかえそう。

simplexmlを使ってみて

2009/03/03 | XML

とあるお仕事でXMLを扱うことになって、simplexmlを使っているのだが、使っていて思ったことをいくつか。

クライアントからいただいたファイルをみてちょっと唖然。XML自体は構造もしっかりしているのだが、タグは全て日本語。これはすごく萎えた。日本人だから・・・しょうがないんだよね。でも、これっていろんなソフトで加工するときに障害にならないのか不安に思えた。そして萎えたことがもう一つ。文字コードシフトJISじゃんかー。これも、まぁ、日本人だから・・・しょうがないんだよね。

ということでシフトJISでマルチバイトなタグで構成されたXMLファイルがsimplexmlで扱えるのか試してみた。結果からいうと「すごい!」「使える!」。まず普通にsimplexml_load_fileとかして、var_dumpしてみた。ちゃんと全部オブジェクトに格納されている!。と、ひとまず感動した。

そして文字コードはというと、UTF-8に変換されて格納されている!。扱いやすい!。XMLファイルの先頭に文字コードの宣言(もちろんShift_JISと指定)がされているのだが、ここを判断して(もしくは文字コード自動判別で)、変換されているんだろう。「自動」というのはいささか怖い気もするが、それでもまぁ満足がいく。

さて、各タグにアクセスできるかどうか、だがこれもOK。以下のように記述して、アクセスすることができた。

$xmlObj->{‘日本語のタグ名’}

正直ほっとした。シフトJISでマルチバイトなタグのXMLを見たときはどうなることかと思ったが何とかなりそうだ。

1点気づいたことがあった。いったんsimplexml_load_fileして、再度asXML()でXMLを吐き出すときにXML宣言がなくなっちゃってしまったことだ。これはそういう仕様なんだろうか。そもそもXML宣言部分は、XML本体とは別物という扱いなんだろうか。ここを再現することはできないんだろうか。

まぁ、かっこいいプログラムである必要はない。要求どおりに動いてくれさえすればいいので、XML宣言は後付することにする。何はともあれいろいろ発見できた一日だった。

Exifを処理する

2009/02/25 | PHPライブラリ

PHP5ってほんと便利。新しい関数を見つけるたびに思う。

今日見つけたのはExifを扱うライブラリ。最近のデジカメでは大抵採用されている、画像ファイルにデータを付加するための約束事。JPEGとTIFFに対応しているらしい。いつも思うことだけど、JPEGが先かExifが先か(鶏が先か卵が先か、みたいな)。

PHP5ではExifも読むことができる。一番簡単なのはExif拡張モジュールを使うこと。外部ライブラリなしでExifを読むことができるのだけれど、–enable-exif付きでPHPコンパイルされている必要がある。意外とレンタルサーバとかだと敷居が高いかもしれない。調べてみると他にも方法がある。sourceforgeに登録されているPELというライブラリだ。

http://pel.sourceforge.net/

すべてPHPのみで実装されているらしい(Exif拡張モジュールなしでやってるのかな・・・すごい)。名前からしてJPEGとExifのためのライブラリだろう。ソースを読めばExifとJPEGの知識が増えそうだ(読まないけど)。最近のデジカメでも携帯のカメラでもいろんな機能が付いてるので、画像だけで、GPS位置情報とかも取得できるかもしれない。まぁ、そういう必要に迫られて調べているので、時間を作ってスクリプトを一つ書いてみることにしよう。


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