マニュアル続編 PEAR便利マニュアル

2007/09/17 | マイPHPメモ

ちょっと便利マニュアルのPEAR版も作ってみた。こちらから。

PEAR便利マニュアル

やってることはPHP便利マニュアルと同様で、msearchによる全文検索システムと、関連サイトの表記だ。PHPでも書いたが、PEARはクラスを使って記述されているので、初心者にとっては、なおさらマニュアル中の用例等がわかりにくかったりする。参考サイトがあれば、大抵そちらは難解な記述ではなく、用例を取りまとめてあることが多いので、きっと便利なはず。

よかったら活用してみてくださいな。
いろんなところで紹介してもらってもOKだし、「こんな機能欲しいかも」みたいなリクエストも受けるけるので、よろしければコメントからどうぞ。

perlの全文検索ソフトmsearch

2007/09/16 | その他

PHPとは全然関係ない話。
せっかく作ったマニュアルに検索機能をつけたい、と思った。もちろん全文検索で。

全文検索と言えば「namazu」と思うのだが(phpで使える何かいいのがあったら教えて)、あいにく共用レンタルでmakeとかできず、設置できない。探してみたらmsearchなる全文検索エンジンに出くわした。インデックスを作成するタイプだけど、ファイル設置してパーミッション設定するだけで動くようだ(優れもの!)。Perlなのだが、まぁ、やりたいことが満たせればいいだけなので、とりあえず設置!。あっという間に設置できた。

ちなみに設置したエンジンはこちらでどうぞ

設置結果はこちら(PHP便利マニュアル)

なんとなく動いている雰囲気なのだが、全てちゃんと正しく動いているわけでもなさそうだ。例えばarray_shift関数を検索しようと「array_shift」って入力してみたのだが出てこなかった(array_popとかはOKなんだけど)。
理由はわからないけれど、あえて追求しない(Perlのソースを読む気がしないから)。

この点が改善されたら、ものすごく便利な仕組みのように思うんだけれど・・・。今後に期待。

phpの便利マニュアルを作成

2007/09/15 | マイPHPメモ

PHPに限らず、またプログラム言語に限らず、なんでもマニュアルと言うのは大切だ。MLとかで、ろくにマニュアルも見ず質問する人もいるようだが、そういう人はプログラマに向いてない(と思う)。といっても趣味でプログラムを楽しむ程度の人なら、それでもいいかもしれない。
プログラム言語のマニュアルは、その言語である程度の知識がある人にとっては有用だが、プログラム初心者には意外と敷居が高いかもしれないと思う。今でこそ、「まずマニュアルで確認を」と思うが、昔はウェブで調べて用例が載ってるサイトを参考にしてプログラムを書いていたことがある(今でも時々・・・)。
そういう時代を思い出して、個人的にちょっと「うれしいマニュアル」を作ってみた。そのマニュアルはここ。

PHPのちょっと便利なマニュアル

トップページは何の変哲もないマニュアルなのだが、どこでもいいから関数の解説ページを見ると・・・。

左上に、その関数に関連しそうなウェブページへのリンクを貼り付けるようにしてみた。世の中のウェブページでプログラム言語の関数を書いているようなページには、大抵の場合その関数の使用例が書かれているはずだ。だからマニュアルを見て使用方法がわからなくても、こちらのリンクから使用方法がわかる可能性もある、というわけ。初心者に優しいマニュアルにしてみたのだ(ハイ、自分用です)。

ちなみにこのリンクは、Yahooウェブ検索APIを利用している。APIに対して、キーワードとなる関数名を投げ、得られた結果から、いわゆる「マニュアル」と思われるものだけを削除して表示している、ということになる。

個人的に結構便利なので、PEAR版とかも作るかもしれない(PEAR、あまり使ってないけどね)。

xmlrpcブログ投稿時の投稿時刻指定

2007/09/13 | XML

あいもかわらずxml-rpcで遊んでいる今日この頃(生活も厳しくなってきたT_T)。ブログ投稿時に、投稿時刻をプログラムを動作させたその日時以外を指定したい場合が出てきた。つまり、例えば「投稿日時を過去の日付を指定したい」といった具合だ。iso8601のフォーマットがどうとかこうとか書いてあるウェブサイトはいっぱい見つけたけど、「じゃぁ、実際どうすりゃいいのよ!」というところで放置していた。
今日ふと思い立ってやってみたら、簡単に出来た。でも忘れそうなのでメモしておく。ちなみに使用するのはxmlrpc.inc(http://phpxmlrpc.sourceforge.net/)。

まず実際のデータから。記事投稿時はもちろんXMLでサーバにデータを送るわけだが、そこはこんなXMLになる。
<dateTime.iso8601>20060418T21:00:21<dateTime.iso8601>

上記の真ん中のデータはUTC指定で、日付(年月日)と時刻(時:分:秒)を「T」でつないだもの、ということになる。2007年12月31日23時59分59秒なら
「20071231T14:59:59」
という値が入るはずだ(日本は9時間早いのだからUTCの時刻表記では9時間引いておく)。

これを手動で計算するのが一番いい。ちなみにPHP5ではiso8601フォーマットで日時を返すdate関数のオプションが用意されているらしいのだが、自分の環境は全てPHP4なので、ここでは使えない。でもxmlrpc.incには相応の関数が用意されていた。こんなの。

function iso8601_encode($timet, $utc=0)

戻り値はUTCの時刻だ。引数$timetは自分が指定したい日時のユニックスタイムスタンプ値。これを直接UTCで指定した場合は次の引数$utcに1を指定する。デフォルトは0で与えられたタイムスタンプから自動的にUTCに変換した値が返される。簡単お手軽関数だ。

でも、実は注意が必要で、サーバの「タイムゾーンのオフセット秒数」を使っているので、海外サーバで日本向けサービスを・・・なんて場合にはヘンテコリンな時刻になってしまう。どうせなら

function iso8601_encode($timet, $offset=0)

みたいにして、オフセットの時刻で指定できるようにすればよかったのに・・・。てことでここの関数は簡単なので、すぐ自作してしまおうっと。

APIとPHPのまとめ

2007/09/11 | XML

最近はYahooやAmazon、楽天といった各種ウェブサービス(API)を絡めた開発を多くやっている(といっても、仕事が暇なので自分用サイトとかアフィリエイト用サイトを数多く作っているのだが・・・)。またAPIを提供する会社もたくさん増えてきたので、これから本業でもそういう仕事が増えていくと思っている。実際、最近新規で受けたり相談されている仕事もウェブサービス絡みだ。そこでウェブサービス利用の「傾向と対策」みたいな、受験勉強的メモを残しておくことにする。

(0) APIを利用するために
各種APIを利用するためにはいろいろな手順を踏まないといけないことが多い。例えば、Yahooの開発者向けAPIを利用するためには「Yahoo JAPAN IDを取得」「アプリケーションIDを取得」などの手順を踏む必要があるし、さらに一日あたりのアクセス回数上限なども気にする必要がある。もちろん利用規約も守らなくてはならない。実際にプログラムを組む前に、API毎に諸々調べておく必要がありそうだ。

(1) APIで必要な知識
APIを使用するに当たって必要な知識がいくつかある。知識といっても難しいことではなく、プログラムのスキルと言ってもいいだろう。必要なスキルは以下の3つくらいに分けられる。
・データを取得する
・取得したXMLをPHPで解釈する
・一日のアクセス上限回数を越えないよう制御する

(1)-1.データを取得する
データの取得は、最近ではRESTが一般的だ。xmlrpcやsoapを使うものもあるが、簡単と言う点からか、RESTが広く普及してきたように思われる。実際のアクセスにはPEARが使えるならHTTP_Requestや、その関連のものを使うのがいいだろう(関連リンク)。ちなみに一番お手軽なのは、file_get_contentsだ。引数にURIを与えればXMLを取得できる。ただし利用できるように設定されていることが必要だ。file_get_contents(‘http://www.yahoo.co.jp’)等として、データを取得できるかどうかチェックしてみたほうがいい。またデータの取りこぼしが出る場合があるので、要注意だ。一番確実なのはfsockopenを使って、直接HTTPでお話しすることだ。そういうクラスを一つ書いておくのがいいだろう(今後、要望次第で時期を見て公開する予定)。もちろんHTTPの最低限の知識は必要になる。

(1)-2.取得したXMLをPHPで解釈する
XMLは構造化されているとはいえ、ただのテキストだ。PHPで扱いやすいようにするには、配列や構造体に格納してやるのがわかりやすい。そのためのライブラリや関数は以前に紹介した。
XMLを配列に読み込む
楽天APIを少し・・・(XMLを配列に)
XMLを配列に・・・これが最適解かも
上記の記事を参考にしていただきたい。

(1)-3.一日のアクセス上限回数を越えないよう制御する
ウェブはいつ誰がアクセスしてくるかわからない。もちろん、いつ誰がアクセスしても、うまく動いているように見せたい。「なぜかあのサイトは夕方以降はエラーが出る」なんてことにならないようにしなくてはいけない。例えば、単純にデータを毎回取得するとし、ウェブサービスの一日のアクセス上限回数が5000回と仮定して、一日6000回アクセスがあると、最後の1000回は、上限回数を超えているので必ずエラーになるのだ。これは避けなければいけない。
上限回数が決まっているのであれば、それを超えないようにすれば良い。一番簡単なのは「一度取得したデータを使いまわす」ことだ。いわゆるキャッシュだ。キャッシュの実現方法はさまざまだが二つ紹介すると・・・。

[a] cronで一定時間ごとにデータを取得しておき、ウェブからのアクセスの際はそのデータを参照する。
[b] PearのCacheを使い、前回アクセス時刻から一定時間以上経過していない場合は前回取得したデータを使いまわす。

前者の場合は、取得したデータをデータベースなどに格納しておけば、参照は容易だろう。後者の場合はPEARのCache_Liteがおすすめかな(以前の記事「キャッシュして軽いページを(Cache_Lite)」参照)。

これだけのことを知っていれば、メジャーなウェブサービスAPIの利用は難しくない。あとは(1)-2でPHPで扱いやすいように整形したデータを、いかに使うか、ということに尽きる。

ウェブサービスやAPIの利用に関しては、今後発展していくと思うので、もし不明な点があれば気軽にコメントで相談してもらっていいです(「スクリプトを書いてくれ」みたいなのはお金もらいますが、一緒に相談できるような人がいれば、勉強会を主催してもいいくらい・・・)。


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