app engine ja night 9 beertalk2
DESCRIPTION
テーマ:「SDKを試しに読んでみるよ」 内容:Python on GAEのコードをDatastoreを中心に追いかけてみます。難易度やどこをメインで読むかは参加者の意思とノリ、残り時間次第? http://atnd.org/events/5951TRANSCRIPT
![Page 1: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/1.jpg)
SDKを試しに読んでみるよAppEngine ja night 9 BeerTalk2
@tagomoris
![Page 2: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/2.jpg)
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
![Page 3: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/3.jpg)
SDK読む?• AppEngine の内部実装には興味がある
• Low level APIとかProtocolBufferが大好き!
•処理系に詳しければ実装の最適化が
•だってドキュメントがプア……(特に日本語!
•そのほか
![Page 4: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/4.jpg)
コードリーディングのとっかかりに
おおまかな流れをざっと
一度でもちょっと読むと抵抗なくなって新しい世界が!
SDKプレリリース日にちょう盛り上がれるよ!
![Page 5: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/5.jpg)
AppEngineのコードの特徴• Python, Javaで実装がかなり似ている
•内部APIのコール名まで共通点が多い
•基本的にバックエンドへのRPCが透けて見える
• Service側は全部共通だし
•各サービスの制約や最適化方法も多分共通でしょう
• MultiQueryとかー、batch putとかー
![Page 6: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/6.jpg)
合言葉は
MakeSyncCall
![Page 7: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/7.jpg)
appspotでもMSCより上は
全部SDKがそのまんま動いてるしね
![Page 8: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/8.jpg)
GoogleのPythonコード•基本的にすごく綺麗で読みやすい
•メソッド名から内容がちゃんと分かるのはスゴい
•たまにそうでもないメソッドがあると悲しさ倍増
•ただし処理がすごく細切れ
•数行ですぐ他所に処理が飛ぶから、脳内スタックがオーバーフローしそうになる
•同じ名前のメソッドがあちこちのモジュールにある
![Page 9: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/9.jpg)
再掲合言葉は
MakeSyncCall
![Page 10: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/10.jpg)
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もあるよ!
![Page 11: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/11.jpg)
大事なこと ふたつ
•どこを読むべきかを意識しながら
•次の行き先を確認しながら
![Page 12: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/12.jpg)
MakeSyncCallの壁 ApiProxyStubMap
Taskqueue
Memcache
Users
ApiProxy
UrlFetch
ext.db
ユーザアプリケーション
ApiProxyStubMap
Datastore
ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub
ProtocolBuffer
![Page 13: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/13.jpg)
MakeSyncCallの壁 ApiProxyStubMap
Taskqueue
Memcache
Users
ApiProxy
UrlFetch
ext.db
ユーザアプリケーション
ApiProxyStubMap
Datastore
ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub
ProtocolBuffer
このへん読みたい
![Page 14: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/14.jpg)
余談
PythonにはMakeAsyncCall はありません
なんでここはJavaと構造違うんだろうね?
![Page 15: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/15.jpg)
Google流モジュール取扱い• import方法
import google.appengine.ext.db.*
Model.get(...)
from google.appengine.ext import db
db.Model.get(...)
![Page 16: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/16.jpg)
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
![Page 17: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/17.jpg)
では読んでみよう!
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
だいたいこんな順番で潜っていくよー
![Page 18: App engine ja night 9 beertalk2](https://reader033.vdocument.in/reader033/viewer/2022051608/5455c950af795998788b4a63/html5/thumbnails/18.jpg)
一番楽しいのは「空行」あとでわかるよ!