PostgreSQLのバックアップ

2009/09/26 | PostgreSQL

普段使わないので、失念することも多いので、メモしておく。

pg_dump  -d database | /bin/gzip > dump.gz

-dオプションでCOPYコマンドではなく、INSERTコマンドの形式にする。
パイプ処理でgzipし、出力先ファイル名にリダイレクト。

-dよりも-Dのほうがいいかも(-Dはカラム名も含めてくれる)。

XMLのルール

2009/09/23 | XML

知っているようで実はぜんぜん知らないXML。XML文書の中で、&が入るのは特別な場合を除いてエラーになることを今日はじめて知った。調べてみたらいろいろあるっぽい。知っていることも含めて列挙しておく。

  • ルート要素が必要。
    全ての要素を包含する一つのルート要素が必ず必要。
  • 終了タグが必ず必要。
    XHTMLでは当たり前だから、特に問題なし。
  • 要素は正しくネスト。
    これもXHTMLでは当たり前。 というか正しくネストしていないと気持ち悪くて。
  • 値を引用符で囲む。
    これも当たり前。
  • 大文字・小文字は区別。
    Linuxやってれば、これもぜんぜん気にならない。
  • エンティティ参照の宣言が必要。
    &と<を使うには一工夫必要。

6番目のが今回ぶつかった問題。例えば&amp;はOKだけど&copy;や&nbsp;はダメ。&は;他と組み合わせて、エンティティとして使うのだが、特別な場合を除いて、DTDで宣言してやらないといけない。特別な場合というのは&amp;、&lt;、$gt;、&quot;、&apos;。だから&copy;や&nbsp;をXML文書中で使用するのは間違いになる(どうしても使いたい場合はDTDで宣言しないといけない)。&単品で使用するのもダメ。必ず特別な場合の組み合わせのみで使用しないといけない。

いろいろ難しい。

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 (パッケージ名)

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


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