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

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

tips

#appengine Task Queueの放置タスクをGTalkで調べるbot作りました

DevFestのセッションに向けてTask Queueでの並列処理デモを作成してます。それをいじってる過程で気づいた挙動がありました: タスクを数個だけ(1〜3個くらい?)追加しとくと、数10秒〜数分ほったらかしにされることがある(以下、放置タスク) で、この挙…

最近のApp Engineの英語MLは量が多すぎて読めねぇとお嘆きの貴兄に

App Engineの英語MLちゃんと読んでますか? 私は読んでません!(キリッ 量多すぎます!そこで初めてYahoo Pipesなるものをいじって、「3つのApp Engine MLからフィードを取得して、Googlerが書いた記事(送信者メアドにgoogle.comが含まれるもの)だけ取得するR…

ATNDの参加者名簿からid名札ラベルを作る方法

技術者出会い系サービスATNDにはいつも大変お世話になっております。前々から「ATNDの名簿からID名札を印刷したいなぁ〜」と思ってて、その方法論を確立できた気がしたので、メモしときます。 CSVをダウンロードする 自分が管理しているイベントのページにて…

BigtableとSmalltable

App Engineによる設計手法でひとつ私が実案件で試してなかなかうまくいったと思ったのは、「Smalltable」って私が勝手に呼んでいるアーキテクチャです。簡単にいうと、「複数クライアントのローカルのSQLite間をDatastoreを介して同期する」仕組みです(こう…

Slim3 Datastoreドキュメントの日本語訳

彼氏がJDO使ってた。別れたい…とか言われないように、これからApp Engine/Jで書くコードはデフォルトでSlim3 Datastoreで行きたいところですが、@bufferingsさんが日本語訳を公開されました:Slim3 Datastore を日本語に訳してみた - bufferingsこれは大変嬉…

100万PV/日のmixiアプリモバイルをGoogle App Engineで実装した@gclue_akira氏に直撃インタビュー

100万PV/日のmixiアプリモバイルをGoogle App Engineで実装した@gclue_akira氏との会話がすごくためになったのでまとめ:togetterまとめ: http://togetter.com/li/494

今度はServletContext+UUIDで負荷分散状況を調べてみた #appengine

@higayasuoさんのつぶやき: #appengine でリクエストを処理するスレッドは1インスタンスあたり1つという仮定は正しい。ただし、インスタンスの特定にRuntimeのhashCodeを使うのは間違いでFilterなどで起動時にServletContextにUUIDなどを突っ込んで調べるの…

ロックを使わずにmemcacheで値を受け渡す方法

memcacheに対するロックを書かずに、リングバッファみたいなキューを作って値を受け渡しする方法が以下の記事で紹介されてました:Memcache lockless queue implementation値を書き込むときはこんな感じ。例のincrementメソッドでアトミックに連番を取得して…

Task Queueのタスクがどのように複数のJVMに負荷分散されるか試したよ #appengine

ご存じのとおり、App EngineのJVM(App Server)はクラスタ化されていて負荷分散される――というのがGoogleの説明です。しかし、WebブラウザからApp Engineに届くHTTPリクエストや、Task Queueのタスクによって呼び出されるHTTPリクエストは、実際にどのよう…

Memcacheでスピンロックを実装してTask Queue処理結果を集約してみるテスト

TaskQueueで分散処理した結果をまとめるときは、排他を考慮する必要があります。Datastoreを使う場合なら、単に結果を新規エンティティとして追加したり、エンティティグループの楽観排他を使ったりすればOKです。一方、やっぱりMemcacheでスピーディーに集…

NoClassDefFoundErrorが発生するメカニズム

謎なエラーのひとつ、NoClassDefFoundErrorについてヒントとなりそうなポストがMLにありました。http://groups.google.com/group/google-appengine-java/browse_thread/thread/ec4a06cd90cc49f3# You had a request back at 09-25 06:27AM 29.110 that excee…

複雑なクエリのためのプロパティを仕込んでおく方法

以前、コンポジットインデックスを自作するというエントリを書きましたが、そのためにわざわざ新しいエンティティを作らずに、普通のエンティティにコンポジットインデックス代わりのプロパティを持たせる方法をちょこちょこ使い始めました。例えば、以下の…

謎なエラーのためにお金を払うの巻

appengineをここ10日くらいproductionで運用して、もうひとつ気づきました。CPUコストのほとんどが、アプリケーションの正常動作ではなくて、Datastoreやmemcacheが勝手に固まる謎のエラーによるものってことです。Datastoreやmemcacheが固まると、そのまま3…

謎なエラーを集めてみよう

appengineを運用していると、ときおり原因不明のエラーが起きます。Googleが説明する0.1%程度のエラーとはちょっと違う感じがします。どれも毎回起きるわけじゃなくて、一時的に頻発したりします。想像するに、特定のApp Serverノード上でデプロイやクラスロ…

Migration to a Better Datastoreの要点メモ・その2

Migration to a Better Datastoreの要点の後半です(前半はこちら)。 Megastoreレプリケーションで解決 Megastoreとは、Bigtable上に実装されたGoogle内部のライブラリ 宣言的スキーマ(スキーマ定義ってこと?)、複数行トランザクション、セカンダリイン…

Migration to a Better Datastoreの要点メモ・その1

appengine blogにポストされたMigration to a Better Datastoreの要点をピックアップしてみました。間違い等ありましたらご指摘ください! Googleは「マルチホーミング」を追求している データセンター単位でのダウンに対応する リードオンリータイプのアプ…

Seasarカンファレンスの「Bigtable脳」を見たメモ

Seasar Conference 2009 Autumnのひがさんのセッション「SQL脳からBigtable脳へ」を見てきました。おおこれはB脳だ!と思った部分: レンジスキャンがBigtableのかなめ Bigtableは単なるKVSではなく「ソートされたキー」があるKVSという点が重要 自分の要件…

クラウドへのデプロイ時のチェックリスト

私の環境ではprod/qa/devそれぞれにapp idを分けてます。切り替えながらデプロイするとオペミスがしばしばありますので、チェックリストを作ろうと思いました(随時更新)<デプロイ前> デプロイ先のapp idは間違いないか? cron.xmlの内容は問題ないか?(…

cb nanashiさんのGAE/Jアプリ開発のTIPSまとめ

cb nanashiさんによるすばらしい実践的tipsまとめ!「あるある〜」という感じです。GAE/Jアプリ開発のTIPSまとめ

Task Queue戦記

とても遅かった以前の実装をTask Queueを使って書き換えることができました。感想をまとめると、 Task Queueはすばらしい。30分かかってた処理が3分で終わるようになった(前の実装がヘボいのではという疑惑はさておき) 処理を複数のタスクに分割して並列処…

DatastoreTimeoutExceptionって何?

Datastoreで大量のエンティティを扱うようなコードを走らせると、DatastoreTimeoutExceptionがしょっちゅう出ます。こんな感じ: Caused by: com.google.appengine.api.datastore.DatastoreTimeoutException: Unknown at com.google.appengine.api.datastore…

Task QueueはMapReduceの夢を見るか

いまコーディング中の案件で、Task Queueにぴったりハマる要件があったので、飛びついてみました。 課題:Datasource上の大量のデータをクライアントにダウンロードしたい。30秒内では終わらないので複数のリクエスト/レスポンスに分割してダウンロードする…

SDK 1.2.5の変更点まとめ

bufferingsさんのありがたいまとめ: http://d.hatena.ne.jp/bufferings/20090904/1252080958

App Engineと使うXMPPサーバーを探す

今朝のtwitterはSDK 1.2.5のリリースで賑やかでした。Task Queueはもちろん、さっそく使ってみたいのはXMPPです。ちょうどぴったりな要件があったのですごく嬉しい。。ただひとつ勘違いしてました。。App EngineのXMPPサポートってXMPPクライアント機能のサ…

Protocol Buffer on HTTPでクライアントからDatastoreを直接呼び出し

shin1ogawaさんのエントリ:「#appengine JavaのLow-Level API入門 Relationship編」 ここまで読んでしまうような変態な皆さんは、フックする為に使用しているMyDelegate#makeSyncCall()メソッドが気になって仕方無いですよね。特に第四引数であるbyte[] req…

Datastore Low level APIのわかりやすいまとめ・その2

JDOが水面下でどう水かきしてるか垣間見えて面白いです。shin1ogawaさんのエントリ:「#appengine JavaのLow-Level API入門 Relationship編」 「JDOで色んなRelationshipの方法があるが、結局「EntityGroupはキーだけで構成される」という事がわかります。JD…

Datastore Low level APIのわかりやすいまとめ

#appengine JavaのLow-Level API(低レベルAPI)入門shin1ogawaさんの大変ありがたいまとめ! 英訳してGoogleのApp Engineドキュメントに掲載してほしいくらいですね。 個人的な思いとしては、GAE/JのDatastoreについてJDOから入るのは間違いの元だと思ってる…

Datastoreで実装したファイルシステム「GaeVFS 」

http://code.google.com/p/gaevfs/ GaeVFS is an Apache Commons VFS plug-in that implements a distributed, writeable virtual file system for Google App Engine (GAE) for Java. GaeVFS is implemented using the GAE datastore and memcache APIs. Th…

App Engineは「ACID保証しない」ではなく「ACID保証したくなくなる」

App Engine未体験の方の中には、「App Engineはトランザクションをサポートしていない」ような印象を持っている方もいるかもしれませんが、そんなことはありません。App Engineのドキュメントに The App Engine datastore is strongly consistent, but it's …

cronでお手軽に並列バッチ処理

あるカインドのエンティティを全部削除したい等のバッチ処理は、1つのcronジョブでちまちまやっていると時間がかかります(1回25秒で2〜300件くらい)。そんなときは同じURLで複数のcronジョブを並列で走らせれば早いです。並列実行できる処理に限りますが。…