スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

tips

App Engine開発でまず用意したくなるものリスト

(随時更新) グローバルなタイムスタンプ 「System#currentTimeMillis()の値」と「memcacheに記録した前回の値+1」と比較して大きい方を返す こういう部分で分散システムを意識しなきゃならない(しないとハマる)のがApp Engineの罠 ライトバックキャッシ…

owned関連がスケールしないみたい

ぶいてくさんのエントリ:【Google App Engine】 Entityとトランザクション3 先日、Entityとトランザクション2において、Ownedな関連を使ったUpdateサンプルを紹介したわけだが、実はこれ、大量データをINSERTすると急激に遅くなるという問題を含んでいる…

データのインポートやバッチ処理がとても面倒

bluerabbitさんのエントリ:google app engineではマスタの取り込みが辛い しかも、マスタが正しく取り込まれたかを検証するのがまた困難で件数チェックだけでも1000件の制約にかかったりするわけです。そこで前のエントリーの 1000件以上取得する方法とかご…

shin1ogawaさんのわかりやすGAE/Jまとめ

shin1ogawaさんのわかりやすGAE/Jまとめ: http://www.slideshare.net/shin1ogawa/gaejava

1000件以上のクエリ結果件数の取得

これは大変ありがたいまとめ! JDOだと1000件以上取得できるとは知らなかった。。http://shin1o.blogspot.com/2009/08/appengine-1000.html http://shin1o.blogspot.com/2009/08/appengine-1000_15.html * Low-level APIのPreparedQueryだと1000件の上限があ…

DatastoreやMemcacheのAPIコールは、ときどき固まる

例えばDatastore APIで多数のエンティティに読み書きしていると、数100回〜数1000回に1回くらい?(すごくおおざっぱな印象)の割合で延々とブロックされて、 com.google.appengine.api.datastore.DatastoreTimeoutException: Unknownが出たり、もしくは30秒…

Mail APIではFromアドレスが制限される

http://code.google.com/intl/en/appengine/docs/java/mail/overview.html For security purposes, the sender address of a message must be the email address of an administrator for the application, or the Google Account email address of the curr…

クエリやURLフェッチを並列実行するasynctools

http://code.google.com/p/asynctools/ asynctools is a library allowing you to execute Google App Engine API calls in parallel. API calls can be mixed together and queued up and then all are kicked off in parallel. Callbacks can be used to o…

App EngineでOpen Session In View

以前のエントリに、ひがさんからご丁寧なコメントをいただいて、もったいないので新しいエントリにさせていただきました。 AMFでの通信なら、persistentなうちにクライアントが触る可能性のある関連は触っておくのが一番無難な気がします。 この辺は、EJB3(E…

大きなコンポジットインデックスは自作した方が早いかも

大きめのコンポジットインデックスを作ろうとしたら、管理コンソールのインデックス状態が「Error」となってしまいました。大きめといっても、2M件くらいなので“爆発”状態ではないのですが。。MLで問い合わせしてみました。http://groups.google.com/group/g…

JDOでのeagar loadingの指定方法

は、ここが参考になりそうです(試してない)。http://www.datanucleus.org/products/accessplatform_1_1/jdo/fetchgroup.html

プロファイリングツールがほしい

ローカルの開発環境とクラウドの本番環境では、Datastoreのパフォーマンスがずいぶん違います。ローカルのDatastoreはいわばエミュレーターなので、本番環境のDatastoreのもっさり感(とくに更新処理)をちゃんと再現してくれません。まして、先のエントリで…

ローカルのDatastoreは壊れやすい

ローカルの開発環境ではDatastoreに保存したデータがlocal_db.binというファイルに格納されます。SDK 1.2.2からはこの内容がWebブラウザから閲覧できるようになって便利になりました。しかしやはりあくまでデバッグ用ということで簡素な作りになっているよう…

Datastoreの更新スピードのナゾ

現在、既存DB(全テーブル合計で100万レコードくらい)をDatastoreにインポートする作業を進めています。現状ではバルクアップロードの機能がサポートされていないので、アップロード用の簡単なツールを作って、100件ずつサーバに投げて25秒過ぎた時点で中断…

merge-joinを明示的に実行する方法

はありません、とMLで教えてもらいました。http://groups.google.com/group/google-appengine-java/browse_thread/thread/35ede3e4a299a2e6/bb64cb6dd3e6c913#bb64cb6dd3e6c913 As long as your query consists entirely of equality filters and does not h…

アプリのversion等を取得する方法

MLで聞いたら教えてもらえました。ありがたや。。http://groups.google.com/group/google-appengine-java/browse_thread/thread/e6bfcbfafd4f6e1e You can try using ApiProxy: import com.google.apphosting.api.ApiProxy; ... String version = ApiProxy.g…

XPathをつかう

App EngineでXPathを使うときはXalanが必要でした。以下のまとめを参考にしたところ動きました。http://jx-script.blogspot.com/2009/05/gaejxml.html http://groups.google.com/group/google-appengine-java/browse_thread/thread/dda1848382d3da8/ee9b0761…

SDKの外部JARも切り替えよう

SDKを1.2.2にアップデートしたところ、Datastoreを使う単体テストが通らなくなってしまいました(NoSuchMethodExceptionが出る)。一瞬はまりましたが、原因は、単体テスト用にEclipseのビルドパスで「外部JAR」として参照していたSDKの各種JARファイルが1.2…

Datastoreに長い文字列を保存する

Datastoreのエンティティでは、String型のフィールドに500文字バイト以上の文字列を保存することができません。代わりに「com.google.appengine.api.datastore.Text」型を使います(この型のフィールドにはインデックスを張れません)。しかし、いま作ってい…

memcacheとDatastoreでライトバック付きKVSをつくる

Datastoreの鬼門である集計関数の代わりのカウンター等を実装するとき、sharded counterより高速なものを求めると、「とりあえずmemcacheに書き込んで、cron/TQでDatastoreに非同期に保存する」ような仕組みがほしくなります。カウンターに限らず、「ライト…

@Transactionalでお手軽にトランザクション管理(するにはコンテナが必要でした)

Datastoreでトランザクション管理をするには、 try { tx.begin(); <更新処理> pm.makePersistent(members); tx.commit(); } finally { if (tx.isActive()) { tx.rollback(); } }といったコードを書きます。これを毎回書くのが面倒なので、AOPやテンプレー…

Bigtableの内部構造

Bigtableの概要 Bigtableとは 構造化データを管理するための分散化ストレージ 膨大な数の汎用サーバーをつなげてペタバイト規模のデータを扱えるよう設計されている Bigtableの歴史 およそ7人年の開発作業を経て、2005年4月からプロダクション利用を開始 200…

GAEのサーバー構成とリクエストの流れ

<Google App Engine Stackの構成(引用元)> GAE Stackの特徴 現在の利用状況 8万以上のアプリを収容 140M PV/day 20万人以上の開発者が利用 統合環境を提供 サーバーの構築や管理が不要。デプロイが容易 ログ管理、管理コンソールや各種ツールを提供 スケ…

Google App Engineのtips集

(随時更新中です。間違いなどありましたらコメントをお願いします!)このページのtinyurl: http://tinyurl.com/gaetips Datastoreのtips Bigtableの内部構造 BigtableによるDatastoreの実装 Datastoreによるクエリの実装 トランザクションとエンティティグ…

Datastoreによるクエリの実装

クエリ=インデックス+スキャン すべてのクエリは「インデックス+スキャン」に変換される Bigtableはクエリをサポートしていない。GAEのアプリが実行するすべてのクエリは、インデックスとスキャンの組み合わせに変換される Datastoreのインデックスとは …

BigtableによるDatastoreの実装

Bigtableにできること Bigtableは「ソート済みのExcel表」のようなデータ構造 個々のセルは過去の履歴を残せる 巨大なkey-value store。個々の行の「キー」があれば「値」を高速に取得できる キーの辞書順でソートされている スキーマレス(各行ごとにカラム…

トランザクションとエンティティグループ

Datastoreのトランザクション エンティティグループ単位でACIDを保証 Bigtableは行単位のACIDしか保証しない。Datastoreではエンティティグループ単位でのACIDを保証している 楽観的排他制御(optimistic lock)を実装 エンティティグループのrootエンティテ…

Datastoreのtips

Datastoreのパフォーマンス Datastoreのパフォーマンスは、エンティティの数とは無関係 保存されているエンティティが1件でも、1000件でも、1000万件でも、パフォーマンスに変化はない Datastore performance doesn't depend on how many entities you have …

開発環境とプロダクション環境の違い

開発環境のDatastore 開発環境ではトランザクションはサポートされない ロールバックしても値は元に戻らない http://groups.google.com/group/google-appengine-java/browse_thread/thread/815312d5d152a5c5