社内勉強会にて、PHP のセキュリティについてプレゼンすることになりました。その中で、addslashes() はマルチバイト文字のことを考慮していないから使用禁止 ! ということを話すのですが、代案を示さないのもよくないので、mb_addslashes() というものを作りました。
ただ、addslashes() がマルチバイトに対応したところで、SQL 文のエスケープとして適切か ? というと必ずしもそうではないので、今度は mb_mysql_real_escape_string() (長い) を作ろうと思います。
ともあれ、せっかく書いたので公開します。mbstring 必須です。
mbstring, PHP
Google App Engine (以下 GAE) 上で Amazon の Product Advertising API を扱うべく、Python の XML ライブラリについて調べていました。どうも Pythonista の間では lxml というのがメジャーらしいので、さっそく組み込んでみたのですが、どうも動かない。
調べて見たところ、GAE 上では、セキュリティの関係上、C 拡張による Python ライブラリは動かないとのことで、lxml は使えないようです。
代替ライブラリを探す
C 拡張がダメということは、つまり Pure Python なライブラリなら OK、という解釈でいいのでしょうか。探してみたところ、ちょうど先日購入した Python クックブック 第2版 の p.479 に「XML 文書を Python のオブジェクトツリーに変換」というレシピが載っていました。
写経、そして修正
さっそく写経してみたのですが、動かない。しばらく調べた結果、誤植によるものと思われるバグを発見。その他いくつかの修正を加えたものを GitHub に公開しました。
主な変更点は以下の通りです。
- Xml2Obj.EndElement が上手く動かないのを修正
- UTF-8 に対応
- ファイルからではなく、文字列を XML として読み込むよう変更
- __getattr__ メソッドにより、Element.getElements() のショートカットを作成 (詳細は後述)
ただし、あくまでも習作であり、エラー処理等もかなり甘いので、実用的とは言えません。
その代わり、ちょっと遊ぶ程度にはちょうどいい手軽さかも。
コード
テストコード
__getattr__ による Element.getElements() へのショートカットについて
__getattr__ というのは、インスタンスに存在しないプロパティを呼び出そうとしたときに呼び出されるもので、PHP でいうと、マジックメソッドの __get にあたるものと言えるでしょう。
これにより、以下のようなショートカットを実現しています。意味はどちらも同じです。
終わりに
もともと GAE に組み込むことを目的として上記ライブラリを修正したわけですが、実はまだ組み込めてません・・・。ただ、expat を GAE に組み込んでいる例はネット上に転がっているので、まぁこれもいけるのではないかと。真相はまた今度。
関連リンク
GAE, Google App Engine, Python, XML
ゴールデンウィーク中にサービスをひとつリリースするべく、Google App Engine (以下 GAE) に奮闘中です。なので、しばらくは、Google App Engine 上での開発を行うにあたっての Tips 的なエントリーが続きそうです。
さて、本題ですが、DataStore はもともと永続化しているものですが、ここでの話は「開発環境の再起動をする度に DataStore がクリアされるのを何とかしたい」という話です。
どういうことかというと、GAE の開発サーバー dev_appserver.py (Python 版) では DataStore のファイルがテンポラリーフォルダ (Linux だと /tmp) に保存されるので、OS を再起動したりすると、DataStore がクリアされてしまうので、それを防ごう、という話です。
やり方
dev_appserver.py の起動時に、–datastore_path というオプションで保存ファイル名を指定してあげれば OK。
$ dev_appserver.py . --datastore_path=PATH
こうすれば、テスト時のデータを保持し続けることができます。
注意
GAE プログラムのフォルダ内に保存すると、本番環境へのデプロイ時に一緒にアップロードされるので、保存先は外のフォルダに保存しましょう。
GAE, Google App Engine