App engine ja night 9 beertalk2

Post on 01-Nov-2014

2.328 views 3 download

Tags:

description

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

Transcript of App engine ja night 9 beertalk2

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

@tagomoris

TAGOMORI Satoshi / 田籠 聡Twitter: @tagomoris

E-mail: tagomoris@gmail.comBlog: 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

だいたいこんな順番で潜っていくよー

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