2008-06-24

Google App EngineでUnitTest

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engineで提供されている機能もあわせてUnitTestをしたいなぁと思って調べたところ
http://coreblog.org/ats/3-tips-to-perform-test-driven-development-with-google-app-engine
がとても参考になりました。

ちなみにmemcacheの機能をテストするには、
from google.appengine.api.memcache import memcache_stub
apiproxy_stub_map.apiproxy.RegisterStub('memcache', memcache_stub.MemcacheServiceStub())
を加えることでテストコードは動くようになりました。


pythonのUnitTestのこともよくわかっていなかったのですが、それは
http://www.python.jp/doc/release/lib/module-unittest.html
を見れば大丈夫でした。

2008-06-23

Google App EngineでWEBサービスを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App EngineでWEBサービスを使うには、
http://d.hatena.ne.jp/hamatsu1974/20080420/1208632502
http://webdba.blogspot.com/2008/05/urlfetch-rss-img.html
http://yamashita.dyndns.org/blog/google-app-engine-xml/
を見れば基本的にはOKです。

ようはサービスを提供してくれているところへのアクセスには、
Google App Engineで提供されているurlfetchを利用して、
戻ってきたXMLデータの解析には、ElementTreeというのを使うということです。


たいていは普通に使えたのですが、AmazonのWEBサービスを使う際に
例の通りに

import xml.etree.ElementTree as etree
from google.appengine.api import urlfetch

result = urlfetch.fetch(url)
if result.status_code != 200:
 return False
dom = etree.fromstring(result.content)
items = dom.find('.//Items')

とやってもItems以下の情報がとれなかったのです。
いろいろ調べた結果、
Amazonからの戻りXML内に
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2008-04-07">
というのがあって、ここのxmlnsで指定されているネームスペースを利用しないといけないということでした。
ネームスペースが利用されていると、ElementTreeは各XMLタグを
{ネームスペース}タグ
として扱っているようです。
なので、
items = dom.find('.//Items')
ではなく、
namespace ='http://webservices.amazon.com/AWSECommerceService/2008-04-07'
items = dom.find('.//{%s}Items' % namespace)
とすることで取れるようになりました。

2008-06-17

iアプリでHTTP通信してデータをPOSTする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iアプリからPOSTでデータを渡す方法は、
http://www.okisoft.co.jp/esc/i-appli.html#6
がずばりで参考になります。
通常は、iアプリでデータ送信に利用する文字コードはSJISになっているみたいなのですが、
UTF-8でやりたいなぁと思っていたところ、
OutputStreamWriter(out);

InputStreamReader(in);
の部分を
OutputStreamWriter(out,"UTF-8");

InputStreamReader(in,"UTF-8");
に変更すれば、サーバー側はUTF-8で受け取ることができました。

2008-06-14

Datastoreでの重複値チェック

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engineでデータベースの役割をするDatastoreではデータを追加すると勝手に主キーにあたるKeyを設定してくれる。
ただしこのKey値はなんかランダム(?)な文字列と一応id(数値)が対応づけられている。
idの変わりにnameというこちらで指定した文字列を設定しておくことができるようです。
なので、このname部分を重複値チェック用に使ってみることにしてみた。

Key値を自分で作るには
Key.from_path
を利用するみたい。
利用する際には
k = db.Key.from_path(キーを設定するモデル名, 設定するキー値)
って感じで使えばよいみたい。
ここの設定するキー値は数値で始まってはいけないようです。

以下は、トランザクションを利用して登録前に複数のカラムで重複チェックをしている例

------------------
from google.appengine.ext import db

class Samples(db.Model):
 col1 = db.StringProperty(required=True)
 col2 = db.StringProperty(required=True)

def add_new(c1,c2):
 #c1の最初が数値で始まるかもしれないので念のため固定値を付与しておく
 kname = "id" + c1 + "__" + c2
 obj = db.get(db.Key.from_path("Samples", kname))
 if not obj:
  obj = Samples(key_name = kname,col1 = c1,col2 = c2)
  obj.put()
 else:
  raise db.TransactionFailedError

c1 = "aaa"
c2 = "bbb"
try :
 db.run_in_transaction(add_new,c1,c2)
 print '登録成功'
except db.TransactionFailedError:
 print 'すでに利用されている組み合わせです'
try :
 db.run_in_transaction(add_new,c1,c2)
 print '登録成功2'
except db.TransactionFailedError:
 print 'すでに利用されている組み合わせです2'
------------------

実際にちゃんと動かして試してないですが、こんな感じで使えると思います。
以下のように出てくると思います。
登録成功
すでに利用されている組み合わせです2


ちょっとこれでいいのかどうかわからないのが、トランザクションを中止するときに
db.TransactionFailedError
をraiseしていいのかどうかがよくわからないのですけどね。
実際は、自分用のエラーとかを作った方がよいのかな?

2008-06-11

pythonで携帯の機種判定

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonで携帯サイトを作ってみようかなぁとか、ちょっと思ってみたので調べたところ
Pythonで携帯の機種判別をする
があったので、ちょっと試してみました。
まだちゃんと試してないですが、最近始まったiモードIDにも対応しているようです。
以下のような感じで使えるようです。
------------------------
from uamobile import detect
dev = detect({'HTTP_USER_AGENT':os.getenv('HTTP_USER_AGENT'),'HTTP_X_DCMGUID':os.getenv('HTTP_X_DCMGUID')})
iid = dev.guid
------------------------
これで、携帯の機種判定ができるようです。
後は、IPでのキャリア判定もしたい気がするので、その方法をそのうち調べてみましょう。

2008-06-04

Google App Engine

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、pythonをいじり始めたのも、Google App Engineを利用してなんか作ってみたいなぁと思ったからなわけです。
で、いろいろと参考になるサイトもあるなぁというわけでメモです。

Eclipseで開発できるようにするためには、
http://d.hatena.ne.jp/c9katayama/20080412/1207995411

Google App Engineの公式ページの日本語訳でかなりお世話になっている
http://d.hatena.ne.jp/hamatsu1974/searchdiary?word=%2a%5bGoogle%20App%20Engine%5d

そして当然、公式ページはここいらへんで
http://code.google.com/appengine/docs/whatisgoogleappengine.html

そしてPythonがわからないことにはどうしようも・・・ということで
http://www.python.jp/Zope/links/python_documents

そしてテンプレートエンジンにDjangoとかいうのが使われているようなので、その説明ページ
http://ymasuda.jp/python/django/docs/templates.html

いろいろ実例をみていいくならば、
http://www10.atwiki.jp/appengine/
http://mattn.kaoriya.net/?-tags=google%20app%20engine&-technorati-hack=/google%20app%20engine

皆さんの行動の早さに尊敬です。自分ももうちょっと早くやらなくては!とちょっと思ってみました。

2008-06-02

easy_install

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、pythonをちょっといじり始めたりしています。

pythonで便利なパッケージなどを使う際には、
python setup.py install
やら
easy_install
やらを使ってインストールする模様。

そのためには、easy_installをインストールする必要があるらしい
linuxだったら
wget http://peak.telecommunity.com/dist/ez_setup.py

python ez_setup.py
を実行すればいいみたいです。

Windowsでもたぶんダウンロードして実行すればいいもようです。