simpleXMLのバグ

2009/09/19 | XML

今日気づいたことがある。これはsimpleXMLのバグでしょ。

simpleXMLElement->asXML(FILE_PATH)

上記のメソッドを実行すると、FILE_PATHにXMLを書き込んでくれることになっている。マニュアルによると書き込みに成功するとtrue、失敗するとfalseを返すことになっている。確かにマニュアルにはそう書いてある。

実際はそうはならない。書き込みに成功した場合、引数なしの場合と同様にXMLを返してきた。書き込みに失敗した場合、成功時と同じようにXMLを返してきた。おいおい。なぜだろう。ちょっと心配になって、最初試していたレンタルサーバとは別のレンタルサーバに同じファイルを設置して試してみた。やっぱり結果は同じ。

こんなバグがあるのか!、と思って調べてみたけど検索結果には出てこない。ひょっとして自分の書き方が間違っているのだろうか。それともバグの第一発見者かも?。

最初は以下のように記述していた。

if(!$xmlObj->asXML(FILE_NAME)){

しかし成否の判別ができないことがわかったので以下のように書き直すことにした。

if(!@file_put_contents(FILE_NAME,$xmlObj->asXML())){

・・・。ばかげてる。誰か追試してくれないかな。

パーミッションが違う

2009/09/16 | PHPの基本

ファイルのアップロード処理をする際、アップロードされたファイルを適切な場所に移動させる必要がある場合がある。このとき、一番いいのはmove_uploaded_file関数を使って、ファイルを移動するのがいい。というのは移動元のファイルがアップロードされたファイルなのかどうかをチェックしてくれるからだ。これにより、あらぬセキュリティ問題を考えなくてすむからだ(もちろん他にも問題は山積するのだが)。

ファイルのチェックという意味では、似た機能としてis_uploaded_file()という関数がある。これはHTTP POSTでアップロードしたファイルかどうかをチェックしてくれる関数だ(でもこれは本題ではない)。

ファイルの移動なら、copy関数もあるし、ファイルポインタをopenして(fopen)して、新しいファイル(移動先)に内容を書き込んだりすることでも実現できる。これらの方法はmove_uploaded_file()関数と圧倒的な違いがある(前述のセキュリティの問題を除いて)。それは移動されたファイルのパーミッションだ。CentOS5のデフォルトな環境だと、移動先のファイルは以下のようになる。

move_uploaded_file()で移動した場合・・・600
その他の方法で移動した場合・・・644

なんで違うんだろ。umask()の設定が影響しているんだろうか。前者の場合はapacheの読み書き権限しかないので、FTPでダウンロードとかできないわけで、ちょっと不便だったりする。手間だけど、is_uploaded_file()でチェックしつつ、copy()等で移動するほうが使いやすい(もしくはchmod()か)。やりようはいろいろあるんだけど、一番スマートな方法を極めるためには少し調べる必要がありそうだ。

PEARを久々に使う

2009/09/15 | その他PEAR全般

久々にPEARを使うことになった(というより使わなければいけない羽目になった)。もちろんPEAR自体はとてもよくできていていいのだが、個々のライブラリ間の依存度合いが非常に強く、トータルで使わなければその実用性が発揮できないからだ(いや、本当はそんなことないけど、個人的に依存度合いの強いものを使いたくないだけ)。

文句ばかりでもしょうがないので、久々にインストール作業をすることになる。インストール対象はCentOS5。PEARをインストールするときは、いつも専用のディレクトリを作って、そこにまとめてインストールしていた。しかし今回はサーバのデフォルトの場所にインストールすることにした。

pear install (パッケージ名)

rootになってこのコマンドで一発インストールできるのだが、早速依存関係で怒られる。で、依存関係も解消してくれるよう以下のコマンドを実行する。

pear install –alldeps (パッケージ名)

はい、できあがり。これで一応使えるようになった(と思う)。あとはパスが通っているかどうかチェックするだけ。でもまぁ、あんまり乗り気ではない。

CPIでの嫌なPHP設定

レンタルサーバCPIのサーバを、実はあまり好きではない。デフォルトの設定が嫌なのだ。

mbstring.encoding_translation on
mbstring.internal_encoding EUC-JP

いまどき、こんな初期設定がされているサーバって…と思うが、それはまぁ、仕方のないこと。注意としては.htaccessでは設定できないところ。設定方法はSixCore共用サーバに近い。php.iniファイルを作成して、以下のように記述し、設定を反映させたいディレクトリにファイルを設置する。

mbstring.encoding_translation=off

設置したディレクトリの下位のディレクトリには、この設定は反映されない。反映させるには別途設定が必要。もしくは同じ記述のphp.iniを、やはり設定を反映させたいディレクトリに設置する。

最初から、何の設定もされてなければいいのに。

PostGISなデータをSELECTしてみる

2009/09/06 | PostgreSQL

さて、今度はPostGISなデータをSELECTしてみる。まず単純に「SELECT * FROM table;」なんてしてみたら位置データの入っているカラムには長い文字列が入っていた。

0101000020E61000000000000000E060400000000000804140

え、何これ。どうやって解釈するの。でも、きっと解釈する関数があるはず、と思って調べたらありました。

SELECT AsText(column) FROM table;

これでちゃんと目で見て判る形式で出力されました。

POINT(135 35)

PostGISを使うには、やっぱり関数郡には一通り目を通しておく必要がありそうだ。

ちなみに経度と緯度それぞれに分けて表示させるにはX関数、Y関数を使うとのこと。

SELECT X(column),Y(column) FROM table;

こっちのほうが使いやすいかな。


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