SJISなCSVを読み込む手法

2009/07/13 | PHPの基本

CSVを読み込むためにPHPではfgetcsvという便利な関数が用意されている。だけどPHPで使用できる文字コードの関係で、CSVファイルがシフトJISな場合はデータが破損してしまうことがある。普通なら「文字コードを変換すれば」ということになるが、fgetcsv関数はファイルポインタを引数としてとるため、一旦文字コード変換した内容を一時ファイルに書き出してやらなければならない。しかしこれはスマートでない。また、実はPHPにはそれさえも考慮したstr_getcsv関数があるらしい。こちらは引数として文字列を与えることができる!。しかしこの関数、どうもCVSバージョンだけに存在するらしく、たいていの場合この関数を使用できる環境ではなさそうだ。

実は便利な手法があった。ファイルとして書き出すのではなく「いったんメモリに保存する」というなんともおしゃれな手法だ。やり方としてはこんな感じ。

$text=file_get_contents($filePath);
$text=mb_convert_encoding($text,’UTF-8′,’SJIS’);
$fp=fopen(‘php://temp’,’r+’);
fwrite($fp,$text);
rewind($fp);
while($values=fgetcsv($fp,1024)){
var_dump($values);
}

3行目がおしゃれ。php://tempとすることでメモリに書き出してくれるらしい。しかも容量を考慮して、容量が大きい場合はファイルに書き出してくれたりもする(たぶん一時ファイルとして書き出して処理完了後は消えてくれるんだろうと期待するわけだが)。この行が魅力的なのはr+でオープンしているところ。それは5行目を見れば理解できる。

もう一個ミソが5行目。書き出したファイルを一旦クローズして、再度オープンするなんてことはしない。rewind関数でファイルポインタを最初に戻してやるわけだ。ここでr+オープンした意味が出てくる。書き出しておいて、読み直すわけだ。

すごくかっこいい。多用しそう。でも「php://temp」はPHP5.1という条件付。入出力ストリームは使う機会こそ少ないけれど、要所要所で重要になる使い方だとしみじみ思う次第であった。

PHPで使用中のメモリを知る

2009/07/05 | PHPの基本

PHPでは、設定を変更することで使用するメモリ量の上限値を決めることができる。php.iniのmemory_limitの設定だ。しかしこの値は上限値であって、実際のところどのくらい使っているのかを知らないと、正しく設定することができない。結局変数に格納されているデータを想定(もしくはグローバルに格納された値の容量を調べる)しないといけないのか。

と思ったら、便利な関数がありました。memory_get_usage。この関数を呼び出した時点で、そのプログラムに割り当てられたメモリ量を知ることができるとのこと。素敵な関数だ。

大きな配列やファイルを読み込む必要があるときは重宝しそうだ。

PostgreSQLとPostGIS

2009/07/04 | PostgreSQL

最近PostGIS関連の話題に触れる機会があった。前々から手をつけなくてはいけない、と思いつつ、データベースのこみいったこととか得意ではないので放置していたが少しがんばることにした。まずはローカルのWindowsマシンに新ストールするところからはじめた。

以前WindowsマシンにPostgreSQLをインストールしようとしたときに、pgAdminから接続できなかったりいろいろてこずった記憶があった(Windowsマシンには残骸が残っていた)。しかし今回はスムーズにインストールできた。まず最初に残骸を一式削除し、PostgreSQLのサイトから8.3系をダウンロードした。最新はPostgreSQL8.4だけど(公開ほやほや)、最新である必要もないので今回は8.3にしておいた。ダウンロードは以下のページから。

http://www.postgresql.jp/

すごく久々にPostgreSQLのサイトを見たけど、リニューアルされた感じ。わかりやすいかどうかといわれると、それはなんともいえないけれど、ダウンロードページへの導線がわかりやすくてよかったかも。

インストーラを起動し、適宜必要な項目を入力。メインのインストールが完了したら、アプリケーションスタックビルダなるユーティリティが起動した。ここからPostGISをインストールできるらしい。なんとも簡単になったものだ。しかしPostGISを選択してインストールを続行していると、「要求された操作には管理者特権が必要です」なんてメッセージが表示されてどうしてもインストールできない。

とりあえず悩むのも面倒だったので、メッセージ中に書かれているPostGISインストーラ(上記操作の中でダウンロードだけは完了している)を直接起動したらうまくインストールできた。この後pgAdminを起動し、PostgreSQLサーバにうまく接続できることを確認した。pgAdminから確認して、データベース「postgis」とか、PostGISのテンプレートとかができていることは確認できたからたぶん大丈夫なんだろう。興味本位でいろいろ見てみたら、関数がたくさん用意されているようだ(674個)。これがPostGISの本体に相当するものだろうか・・・。

さて、作業はここまででいったん終了。これからどうしようか・・・。途方にくれる。

携帯とメールヘッダ

2009/07/03 | ケータイ

mb_send_mailとかでメールを送信する際、第4引数に何も設定していなければ、メール受信者はわけのわからないアドレスからのメールを受信することになる。そこで以下のようにFromヘッダを与えて、送信者のアドレスを通知することが一般的だと思う。

From: hoge@example.com

さらに、メールアドレスだけではイマイチなのでニックネームをつけてあげることも多い。マルチバイトな文字をニックネームとして付与する場合、たとえmb_send_mail関数を使っていても第4引数に関しては何も処理してくれないので、自分でエンコードしてやる必要がある。

‘From: ‘.mb_encode_mimeheader($name).'<hoge@example.com>’

で、最近気づいたこと。こんな具合に書いても、携帯でメールを受信する場合はニックネームである$nameが展開されない(無視される)場合があるようだ。うちには3キャリアの携帯電話があるが、そのうちドコモ(F705i)はだめだった。たぶん機種依存な部分なんだろう。

ちょっと嫌だなぁ、と思ったのでメモしてみた。

ZEUS決済

2009/07/02 | 決済

仕事で決済システムの導入をやるかもしれない。決済代行会社はZEUS使用の予定。実は決済システム導入の経験がないのでちょっと緊張している。

ZEUSは多彩な決済方法があるようで、簡単っぽい。意外と緊張する必要もないのかもしれないけれど。いちおう事前にプログラム等のフローを知りたくて問い合わせたら「詳細は契約後でないとお伝えできません」というつれない返事だった。面倒だったので、突っ込まなかったけれど、簡単な流れくらいは聞き出せただろうに、と思って少し公開している。

おそらく使用するのはリンク型と呼ばれるタイプ。ウェブ上で紹介されている内容を見る限りでは以下のステップになると思う。

  1. 購入申し込みフォームを用意する。
  2. 購入申し込みそのものはここで完結させる。
  3. 購入完了後にZEUSの決済ページへ遷移させる(たぶんこの際にID番号か何かを引き渡すんだと思う)。
  4. ZEUSで決済処理を済ませてもらう。
  5. 決済完了後、事前にZEUSに設定しておいたURLへ遷移させる。
    裏でZEUSが、こちら側の特定のプログラムに対してクエリを発行して、入金を確認できるようにする。
  6. ZEUSの結果を表示させる。
    もしくはZEUSに起動された特定のプログラムから決済完了のメールを送信させる。

たぶん、こんな流れなんだと思う。だから実際に記述しなければいけないプログラムは、購入のためのプログラムと、ZEUSからのアクションを受け取るプログラムの二つになると思われる。

だれか経験者の人がいたら、だいたいあっているかどうかこっそり教えてほしい今日この頃である。


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