Born Too Late

Yuya's old tech blog.

Google App Engine の開発サーバーで DataStore を保持し続ける

2010-05-01 20:51:17

ゴールデンウィーク中にサービスをひとつリリースするべく、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 プログラムのフォルダ内に保存すると、本番環境へのデプロイ時に一緒にアップロードされるので、保存先は外のフォルダに保存しましょう。

JavaScript で private なインスタンス変数 (のようなもの) を作る

2010-04-13 14:13:44

通勤電車の中で思いついたコードを、昼休みを利用して書いてみました。動いたので公開。ただし、バッドノウハウなので要注意。

解説

まず、クロージャを利用して、外からは見えない privateNameSpace という名前空間を作ります。この privateNameSpace 自体は、言わば private static なものなので、Dog オブジェクトが個別に持つものではなく、Dog クラスに紐づく (ように見える) 空間です。

これを、各インスタンス毎に分けて使えるよう、Dog コンストラクタで objectId というメンバ (これは public) を作っています。objectId は、ミリ秒単位の時間と、乱数を文字列として結合したもので、およそユニークであることが期待されています。とはいえ、理論上は衝突の可能性もあり得るのですが・・・。

この objectId をキーに、privateNameSpace の中に、連想配列オブジェクトを作れば、インスタンスごとに private な名前空間を持つことができる、というわけです。

2 番目のコードを動かしてみると、何となくそれらしく動いていることが確認できます。

ただ、大きな問題は、objectId を乗っ取ることができてしまうということです。3 番目のコードのようにすることで、もともとは pochi オブジェクトだったものが、あたかも taro オブジェクトであるかのように振舞うようになってしまいます。

まとめ

上記の問題の他にも、メンバの取得のための記述が煩雑なところも大きな問題と言えます。もう少し抽象化できれば書きやすくなるかもしれませんが、いずれにせよ、実用的な方法では無いでしょう。

似たようなことを実現するためのノウハウはネット上にいろいろ転がっているようなので、そちらも読んでみたいと思った次第です。

あとで読む

HTML ファイル中に含まれるタグを抽出するワンライナー

2010-03-23 09:43:14
$ ruby -ne 'puts $_.downcase.scan(%r|<([a-z0-9]+)[^>]*>|i)' ./index.html | sort | uniq
a
body
br
dd
div
dl
dt
h1
h2
h3
h4
head
html
img
input
li
link
meta
p
script
title
ul

ね、簡単でしょ?