app engine ja night 9 beertalk2
DESCRIPTION
テーマ:「SDKを試しに読んでみるよ」 内容:Python on GAEのコードをDatastoreを中心に追いかけてみます。難易度やどこをメインで読むかは参加者の意思とノリ、残り時間次第? http://atnd.org/events/5951TRANSCRIPT
SDKを試しに読んでみるよAppEngine ja night 9 BeerTalk2
@tagomoris
TAGOMORI Satoshi / 田籠 聡Twitter: @tagomoris
E-mail: [email protected]: http://d.hatena.ne.jp/tagomoris/
Projects:
GAETestBase: code.google.com/p/appengine-test-helper
simpleoauth-gae: code.google.com/p/simpleoauth-gae
tagomoris
SDK読む?• AppEngine の内部実装には興味がある
• Low level APIとかProtocolBufferが大好き!
•処理系に詳しければ実装の最適化が
•だってドキュメントがプア……(特に日本語!
•そのほか
コードリーディングのとっかかりに
おおまかな流れをざっと
一度でもちょっと読むと抵抗なくなって新しい世界が!
SDKプレリリース日にちょう盛り上がれるよ!
AppEngineのコードの特徴• Python, Javaで実装がかなり似ている
•内部APIのコール名まで共通点が多い
•基本的にバックエンドへのRPCが透けて見える
• Service側は全部共通だし
•各サービスの制約や最適化方法も多分共通でしょう
• MultiQueryとかー、batch putとかー
合言葉は
MakeSyncCall
appspotでもMSCより上は
全部SDKがそのまんま動いてるしね
GoogleのPythonコード•基本的にすごく綺麗で読みやすい
•メソッド名から内容がちゃんと分かるのはスゴい
•たまにそうでもないメソッドがあると悲しさ倍増
•ただし処理がすごく細切れ
•数行ですぐ他所に処理が飛ぶから、脳内スタックがオーバーフローしそうになる
•同じ名前のメソッドがあちこちのモジュールにある
再掲合言葉は
MakeSyncCall
MakeSyncCallが定義されている箇所
google.appengine.api.apiproxy_stub.ApiProxyStubgoogle.appengine.api.apiproxy_stub_map
google.appengine.api.apiproxy_stub_map.ApiProxyStubMapgoogle.appengine.runtime.apiproxy
google.appengine.api.datastore_file_stub.DatastoreFileStubgoogle.appengine.datastore.datastore_sqlite_stub.DatastoreSqliteStub
google.appengine.api.images.images_not_implemented_stub.ImageNotImplementedServiceStubgoogle.appengine.ext.remote_api.remote_api_stub.RemoteStub
google.appengine.ext.remote_api.remote_api_stub.RemoteDatastoreStub
9(7モジュール)
MakeCallやmake_call
_MakeSyncCallもあるよ!
大事なこと ふたつ
•どこを読むべきかを意識しながら
•次の行き先を確認しながら
MakeSyncCallの壁 ApiProxyStubMap
Taskqueue
Memcache
Users
ApiProxy
UrlFetch
ext.db
ユーザアプリケーション
ApiProxyStubMap
Datastore
ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub
ProtocolBuffer
MakeSyncCallの壁 ApiProxyStubMap
Taskqueue
Memcache
Users
ApiProxy
UrlFetch
ext.db
ユーザアプリケーション
ApiProxyStubMap
Datastore
ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub
ProtocolBuffer
このへん読みたい
余談
PythonにはMakeAsyncCall はありません
なんでここはJavaと構造違うんだろうね?
Google流モジュール取扱い• import方法
import google.appengine.ext.db.*
Model.get(...)
from google.appengine.ext import db
db.Model.get(...)
Google流モジュール取扱い•関数定義の再代入の多用
# google/appengine/api/datastore.py
def _FindTransactionFrameInStack():
....
_CurrenyTransactionKey = _FindTransactionFrameinstack
# google/appengine/ext/db/__init__.py
run_in_transaction = datastore.RunInTransaction
...
RunInTransaction = run_in_transaction
では読んでみよう!
1. demos/guestbook/guestbook.py
2. google/appengine/ext/db/__init__.py
3. google/appengine/api/datastore.py
4. google/appengine/api/apiproxy_stub_map.py
5. google/appengine/runtime/apiproxy.py
だいたいこんな順番で潜っていくよー
一番楽しいのは「空行」あとでわかるよ!