app engine ja night 9 beertalk2

18
SDKを試しに読んでみるよ AppEngine ja night 9 BeerTalk2 @tagomoris

Upload: satoshi-tagomori

Post on 01-Nov-2014

2.329 views

Category:

Technology


3 download

DESCRIPTION

テーマ:「SDKを試しに読んでみるよ」 内容:Python on GAEのコードをDatastoreを中心に追いかけてみます。難易度やどこをメインで読むかは参加者の意思とノリ、残り時間次第? http://atnd.org/events/5951

TRANSCRIPT

Page 1: App engine ja night 9 beertalk2

SDKを試しに読んでみるよAppEngine ja night 9 BeerTalk2

@tagomoris

Page 2: App engine ja night 9 beertalk2

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

SDK読む?• AppEngine の内部実装には興味がある

• Low level APIとかProtocolBufferが大好き!

•処理系に詳しければ実装の最適化が

•だってドキュメントがプア……(特に日本語!

•そのほか

Page 4: App engine ja night 9 beertalk2

コードリーディングのとっかかりに

おおまかな流れをざっと

一度でもちょっと読むと抵抗なくなって新しい世界が!

SDKプレリリース日にちょう盛り上がれるよ!

Page 5: App engine ja night 9 beertalk2

AppEngineのコードの特徴• Python, Javaで実装がかなり似ている

•内部APIのコール名まで共通点が多い

•基本的にバックエンドへのRPCが透けて見える

• Service側は全部共通だし

•各サービスの制約や最適化方法も多分共通でしょう

• MultiQueryとかー、batch putとかー

Page 6: App engine ja night 9 beertalk2

合言葉は

MakeSyncCall

Page 7: App engine ja night 9 beertalk2

appspotでもMSCより上は

全部SDKがそのまんま動いてるしね

Page 8: App engine ja night 9 beertalk2

GoogleのPythonコード•基本的にすごく綺麗で読みやすい

•メソッド名から内容がちゃんと分かるのはスゴい

•たまにそうでもないメソッドがあると悲しさ倍増

•ただし処理がすごく細切れ

•数行ですぐ他所に処理が飛ぶから、脳内スタックがオーバーフローしそうになる

•同じ名前のメソッドがあちこちのモジュールにある

Page 9: App engine ja night 9 beertalk2

再掲合言葉は

MakeSyncCall

Page 10: App engine ja night 9 beertalk2

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

大事なこと ふたつ

•どこを読むべきかを意識しながら

•次の行き先を確認しながら

Page 12: App engine ja night 9 beertalk2

MakeSyncCallの壁 ApiProxyStubMap

Taskqueue

Memcache

Users

ApiProxy

UrlFetch

ext.db

ユーザアプリケーション

ApiProxyStubMap

Datastore

ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub

ProtocolBuffer

Page 13: App engine ja night 9 beertalk2

MakeSyncCallの壁 ApiProxyStubMap

Taskqueue

Memcache

Users

ApiProxy

UrlFetch

ext.db

ユーザアプリケーション

ApiProxyStubMap

Datastore

ServiceStubDatastoreFileStub DatastoreSqliteStub CapabilityStub

ProtocolBuffer

このへん読みたい

Page 14: App engine ja night 9 beertalk2

余談

PythonにはMakeAsyncCall はありません

なんでここはJavaと構造違うんだろうね?

Page 15: App engine ja night 9 beertalk2

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

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

では読んでみよう!

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

一番楽しいのは「空行」あとでわかるよ!