appengine ja night #5 #ajn5

http://atnd.org/events/2950 見に行けなかったのでまとめてみた。結構適当にまとめたので、重要なワードで抜けがあったら追加しておいてください。
3
higayasuo @higayasuo

@ashigeru #slim3 gtxをまじめに理解しようとすると2PCの知識とか必要になり結構大変なのでイントロとしてはあんな感じかなと思っています #ajn5 ではかなり突っ込んだ話をするつもりです

2010-02-10 19:40:44
佐々木竹充/SASAKI TAKERU @urekat

scalaは無理っぽいからトランザクション繋がりで http://bit.ly/azgMGH これの話にさせてください #ajn5 のビールの件。 #appengine

2010-02-10 22:33:01
shin1ogawa @shin1ogawa

本日は #appengine ja nightです。atndに参加登録したけど行けそうに無い!という方は補欠の方のためにも必ずキャンセルをお願いします。 http://atnd.org/events/2950 #ajn5

2010-02-12 10:57:05
shin1ogawa @shin1ogawa

時間配分はどうしよう?→ひがさん「1時間1時間にしましょう。俺が後でします、俺のヤツは終わらないから」 #ajn5

2010-02-12 19:03:26
shin1ogawa @shin1ogawa

@tmatsuo さんの App Engine Anti Pattern 開始。 #ajn5

2010-02-12 19:04:07
shin1ogawa @shin1ogawa

PostにTagを保持する時、正規化するとTag{Key,String}でPostエンティティにTagのKeyのリストを持つ。これだとappengineでは検索の時に面倒になる。Postに直接Stringのリストを持つのが良い。基本。 #ajn5

2010-02-12 19:10:45
shin1ogawa @shin1ogawa

[Q]Stringのリストでタグを保持した場合、タグ名を変更したいときどうしよう?→…各モデルを回して処理するしか無いですね #ajn5

2010-02-12 19:12:10
shin1ogawa @shin1ogawa

ひがさん:後で変更する可能性があるのであれば、俺ならKeyで保持するKeyのGetは早いし。→変更の頻度によって設計を変えましょう。 #ajn5

2010-02-12 19:14:55
shin1ogawa @shin1ogawa

次はインデックス爆発の話。 #ajn5

2010-02-12 19:17:23
shin1ogawa @shin1ogawa

検索不要なプロパティは、インデックス対象にならないようにPUTしましょう。 #ajn5

2010-02-12 19:18:35
shin1ogawa @shin1ogawa

tmatsuo:ちょっとしたTipsを。実はkindの名前やプロパティの名前も、コード上の属性名やクラス名とは別に命名する事ができる。GQLの時は別途命名した名称を使う必要がある。…つまり、使いづらい!? #ajn5

2010-02-12 19:20:33
shin1ogawa @shin1ogawa

ひがさん:カインドの属性名もmetaデータとして保持されるので、短い属性名を使うことでデータストアの消費量がそこそこ節約できる #ajn5

2010-02-12 19:22:02
shin1ogawa @shin1ogawa

slim3も当然属性名カインド名に別名をつける事ができるし、通常のタイプセーフクエリを使ってりゃ別名を意識する必要もない #ajn5

2010-02-12 19:23:35
shin1ogawa @shin1ogawa

[Q]インデクス対象にしない、と指定した属性を、やっぱインデックス対象にしたときは?→[A]インデクス対象にした以降のものだけインデクスが作成される。インデクスしない状態で保存したエンティティは再度PUTしなおさないとインデクスが生成されない。 #ajn5

2010-02-12 19:26:08
shin1ogawa @shin1ogawa

tmatsuo:インデクスがつぶれる事がある→[Q]シングルプロパティインデクスでもありますか?→[A]あると思う。CSVからがんがんImportしたりするとなると思う。誰かそーなったら教えて #ajn5

2010-02-12 19:28:01
kashisan @kashisan

indexの作成が失敗したときは、getしてputしなおすとindexが作られる。大量データ投入したときは、全件INDEXが作成するか確かめて、作られていなければ作るような仕組みを作る #ajn5

2010-02-12 19:30:41
shin1ogawa @shin1ogawa

ListPropertyに対してコンポジットインデックスをつくってしまうと、全ての組み合わせに対するインデックスエントリを作成してしまうため、破綻(爆発)する! #ajn5

2010-02-12 19:33:58
shin1ogawa @shin1ogawa

ちなみに1エンティティに対するインデックスのエントリの上限は5000 #ajn5

2010-02-12 19:36:02
shin1ogawa @shin1ogawa

ひがさん:ListPropertyでコンポジットインデックス作るのは自殺行為。ヒドイ事になる #ajn5

2010-02-12 19:39:58
shin1ogawa @shin1ogawa

tmatsuo:クエリはequality filterでしのいで、メモリ内でソートまたはクライアント側でソート、とかでしのぐしかないかも。→asigeru:Keyのnameに時刻を埋め込んだりしたらどうか→tmatsuo:お、いけるかもね #ajn5

2010-02-12 19:42:45
shin1ogawa @shin1ogawa

pythonではimportはファイルの先頭に書くのが普通。でもこれはappengine的にはむだ。appengineの場合は関数の中で必要なモジュールのみimportしよう(Lazy loading)。 #ajn5

2010-02-12 19:47:24
shin1ogawa @shin1ogawa

@matsuu アプリケーションが処理されるインスタンスはシングルスレッド。インスタンスがspinupしている間に到着したリクエストは一旦Frontendsのキューに追加されて、その中での寿命が10秒。超えるとRequestAborted云々のエラーが発生する。 #ajn5

2010-02-12 19:49:12
shin1ogawa @shin1ogawa

tmatsuo:とりあえずこれでアンチパターンの話は終わり。1.3.1の新機能を紹介します #ajn5

2010-02-12 19:51:06
shin1ogawa @shin1ogawa

まずはtransactional task queue。実は前からあった。 #ajn5

2010-02-12 19:51:34
shin1ogawa @shin1ogawa

TransactionalTaskQueue→transactionが成功した時のみTaskQueueを追加する。transactionが失敗したときはTaskがQueueに追加されない、という機能。 #ajn5

2010-02-12 19:53:55