November 6, 2009

Google App Engine (Python) でテストを書くには

Google App Engine (Python) でテストを書くにはどうしたらいいんだろう、と思ってちょろっと調べた。

Google で検索してまずここを見た。
http://blog.appenginefan.com/2008/06/unit-tests-for-google-app-engine-apps.html

ここも見た。
http://coreblog.org/ats/3-tips-to-perform-test-driven-development-with-google-app-engine

nose-gae

nose-gae
http://code.google.com/p/nose-gae/
使い方
http://farmdev.com/projects/nosegae/

python に nose というテスティングフレームワークがあるっぽくて、それを GAE アプリで使えるようにしているもののよう。
簡単に使えそうな印象。

nose
http://somethingaboutorange.com/mrl/projects/nose/0.11.1/

webtest という WSGI アプリをテストするためのライブラリと組み合わせて使うとよさそう。

webtest
http://pypi.python.org/pypi/WebTest/

December 19, 2008

Google App Engine で Google GData API を使う (2)

前回の続きです。

Picasa での認証

えーっと、やりたいことは Picasa から private な画像の情報を取ってくることです。
そのためには Picasa 側で認証処理を通す必要があります。
具体的に何をやるかというと、private な情報にアクセスするための「トークン」を Picasa に発行してもらいます。
そのためには実際ちょっとややこしい手順を踏む必要があります。

扱うトークンには「AuthSub Token」と「AuthSub Session Token」の2種類があります。
「AuthSub Token」は一度しか使えないトークンです。
トークンが一度しか使えないとアプリケーション的にはちょっと不便なので、何度でも使えるトークンが欲しいところです。
そこで「AuthSub Session Token」です。
「AuthSub Session Token」を使えば何度でもデータを取ってこれます。

処理の流れとしては、まず「AuthSub Token」を Picasa に発行してもらい、それを使って「AuthSub Session Token」を取得する、というふうになります。
わかりやすいように絵にしてみました。

authsub_token_1.png
まず「AuthSub Token」を発行してもらいます。
Picasa 側でアクセス許可の操作を行った後、URL にトークンを含んだ状態でリダイレクトされてアプリ側に帰ってきます。

authsub_token_1.1.png
「AuthSub Token」をゲットしました。

authsub_token_2.png
取得した「AuthSub Token」を使って今度は「AuthSub Session Token」を発行してもらいます。

authsub_token_2.1.png
「AuthSub Session Token」をゲットしました。
このトークンはデータベースに保存するなどして大事に取っておきます。

authsub_token_3.png
「AuthSub Session Token」を使えば private な画像の情報も取得できます。

意外と面倒くさいですが、理解してしまえば簡単です。
あとは API を使ってどんなアプリケーションを作るか考えるだけです。

サンプルコード

以下にサンプルコードを置いたので、よかったら参考にしてください。

http://github.com/jugyo/using-picasa-web-albums-data-api

Google App Engine で動くように実装されています。

関連記事

Google App Engine で Google GData API を使う (1)

December 15, 2008

Google App Engine で Google GData API を使う (1)

GAE Hack-a-thon に行ってきました

GAE Hack-a-thon というのに行ってきました。
Google App Engine で何か作るハッカソンです。
渋谷にあるグーグルのオフィスで開催されました。
昼食のお弁当がおいしかったです。
ありがとうございました。

さて、僕はマッシュアップなアプリを Google App Engine を使って作ることに挑戦しました(マッシュアップっていう単語、最近あまり聞かなくなりましたね。)。
4人のチームを組んで取り組みました。
みんなでドキュメントを探したりサンプルコードを解読したりしながら作業したんですけど、なかなか楽しかったです。
チームを組んで何かを作るって、仕事以外ではあんまりやらないので新鮮でした。

gdata-python-client

具体的に何をやったかというと、Google Data API というものを使って Picasa から画像の情報を取ってくるプログラムを作りました。

gdata-python-client という便利なライブラリがあったのでこれを活用しました。
python で Google Data API を扱うためのライブラリです。

以下のページからダウンロードできます。
gdata-python-client

Picasa Web Albums Data API

Picasa からデータを取ってくるには、Google Data API に含まれる Picasa Web Albums Data API という API を使います。
gdata-python-client ライブラリに含まれている PhotoService クラスを使ってこの API にアクセスすることができます。
Picasa からちゃんと画像の情報が取ってこれるか以下のコードで確認してみました。

http://gist.github.com/35853

このコードを実行すると、<ユーザーID> に指定したユーザーのアルバムとそれに含まれる画像の情報が全て取得できます。

当然ながらこのプログラムでは private なアルバムのデータは取ってこれません。
private なデータを取得するためには、Picasa 側でアクセスを許可してやる必要があります。
その認証に関わる部分を Google App Engine 上で実装したんですけど、これがなかなか難しくて(というか全然理解していなくて)、一筋縄ではいきませんでした。

続く…

September 23, 2008

読書: みんなのPython

みんなのPython みんなのPython
柴田 淳

ソフトバンククリエイティブ 2006-08-22
売り上げランキング : 9407

Amazonで詳しく見る by G-Tools

この本はわかりやすくて良いですよ。
これから Python を初めてみようって人にはものすごくおすすめです。

オブジェクト指向の機能は Ruby なんかと比べると若干貧弱というか、よく言えばシンプルなのかな。
Python って Ruby みたくクロージャ書けないですよね。
そこんところがちょっと惜しい気がする。
ま、それぞれの言語にも一長一短があるわけで一概に(略)

プログラムの構造をインデントで表すっていうのはすごいアイデアだといつ見ても思う。
それのおかげでプログラムの編集が非常にやりやすい。

python のコードを書くのはなかなか楽しい。
仕事で python のプログラムを書かないといけなくなったとしたら喜んでやるな。

復習もかねて後で読み直そう。

July 20, 2008

読書: Pythonチュートリアル

Pythonチュートリアル Pythonチュートリアル
鴨澤 眞夫

オライリー・ジャパン 2007-09-22
売り上げランキング : 118178

Amazonで詳しく見る by G-Tools

これだけの分量(実質150ページくらい)でなんとなく Python を知った気になれるのがいい。
Java とか Ruby などの一般的なプログラミング言語をそれなりに理解している人であればさらっと読めてしまうと思う。
いろんな言語を学ぶのは面白いですねぇ。
(「学ぶ」と「使いこなす」の間にはものすごい差があるんだけど)

Python のコードの見た目はすごく好きなんですよねぇ、すっきりしてて。
インデントをプログラムの構文として扱うっていう発想がすごい。

興味を引かれたところ。

タプルっていう概念(データ構造の一種)が面白いなと思った。
関数の扱いが若干 Javascript っぽいなと思った。
変数に代入して簡単に呼び出したりできるし。↓

class Hoge:
  def f(self):
    print 'f'

h = Hoge()
f = h.f
f()  #=> f

プロパティに値を代入するような気軽さでメソッドを簡単に上書きできてしまうのがちょっと怖いけど。↓

...

h = Hoge()
h.f() #=> f

def f2():
  print 'f2'

h.f = f2
h.f() #=> f2

多重継承が一応できるみたい。

よし、もうちょっと勉強しよう。