GeekFactory

int128.hatenablog.com

app engine

AppEngine + Spring SessionでCookieが出力されない問題

AppEngine/Java + Spring Sessionを使っていて気づいたのですが、セッションの使い方によってクッキーにセッションIDが出力されない場合があります。具体的には以下の場合があります。 Spring SecurityのCSRFフィルタ:OK Spring Securityのログイン:OK Con…

CircleCIでApp Engine Javaアプリをデプロイする

CircleCI 2.0でGoogle App Engine (Java8 Standard) をデプロイする方法を調べたのでメモ。 google/cloud-sdk イメージを使う。 App Engine SDKとGradleでJavaが必要になるので、 google/cloud-sdk:alpine イメージに openjdk8 を追加する。DebianはJavaの依…

Continuous deployment to App Engine from Circle CI by Gradle

Circle CIを利用して、JVMベースのアプリをGoogle App Engineにデプロイする作業を自動化してみました。 うれしいこと 誰でも簡単にデプロイできる CIやPull Requestレビューを通過したコードのみデプロイできるように制限できる ビルド環境の差異による影響…

Template project of AngularJS, Scala and Unfiltered on App Engine

App EngineでAngularJSとScalaのアプリを開発する時のテンプレートプロジェクトを作りました。 クライアントサイドとサーバサイドを別のプロジェクトに分けています。App Engineは静的コンテンツの配信が高速なので、クライアントサイドでページをレンダリン…

App EngineでUnfiltered filterとScalateを使う

App EngineでUnfiltered filterとScalateを使う場合のメモです。 Unfiltered filter クラスパスに依存関係を追加するだけでOKです。App Engine特有の考慮は必要ありませんでした。spin-upも早いので問題なさそうです。 import unfiltered.request._ import u…

Picasaアルバムを撮影日ごとに仕分けする

6月に書いた記事のコードを書き直しました。新しいコードはgithubに上げています。Picasaのアルバムにある写真を撮影日ごとに仕分けするバッチです。図に描くとこんな感じです。PicasaにアクセスするにはGData APIを使います。Java向けにクライアントライブ…

Task Queue用のジョブスケジューラを設計する

App Engineで日次バッチを動かす場合はCronかTask Queueを選択することになります。重複起動したくない、ジョブ失敗時はリトライしたい*1という要件があるならTask Queueを使います。Cronの場合は WEB-INF/cron.xml を編集するだけですが、Task Queueの場合…

Google Picasaアルバムを撮影日ごとに整理してくれるバッチ

Google Picasaは写真を保存しておくのに便利です。年間$5で20GBのスペースが手に入るのも魅力的です。Picasaでは、特定のメールアドレスに写真を添付して送ると「ドロップボックス」というアルバムに入るようになっています。この「ドロップボックス」の写真…

appengine ja night #14に参加しました

appengine ja night#14にて、AppEngine MapReduceと大量データ処理についてお話しさせて頂きました。speakerdeck.comTask ChainやQuery Chainの基礎的な話、AppEngine Mapperの仕組みについて解説しました。事例紹介などの派手なお話はできませんでしたが、…

Twitterのタイムラインを分かち書きにする

Google App Engine上で動く 形態素解析ライブラリ Gomoku が公開されています。jarに日本語辞書が含まれているため、jarを追加するだけで動作します。早速ですが、Twitterのタイムラインを分かち書きにするページを作ってみました。サーバサイドの形態素解析…

__scatter__ プロパティを利用してエンティティを分割する

前のエントリで id:kissrobber さんにコメントを頂きました。 Datastoreのスプリット処理ですが、"__scatter__"プロパティを使ってバラす方法もありますよ。 http://goo.gl/gNeh4 が参考になるかと思います。 App Engineで動く並列処理フレームワーク ElShar…

App Engineで動く並列処理フレームワーク ElShard

App Engineで大量のデータを並列処理するフレームワーク ElShard を作っています。batch addとdeleteのサンプルができたので、とりあえずまとめてみます。ElShardは、入力リストを分割して処理して集約する考え方に基づいています。並列処理はApp EngineのTa…

タスクチェーンのフレームワーク

App Engineでは実行時間に制限があるため、長時間にわたる処理を行う場合は複数のタスクに分割する必要があります。この手法は一般にタスクチェーンと呼ばれています(たぶん)。タスクチェーンを抽象化してフレームワークにできるか考えてみました。タスク…

AppEngineで大量のエンティティを処理するパターン

App Engine上で大量のエンティティを処理するパターンをまとめてみました。 Concurrent Pattern 対象のエンティティをシャードに分割し、それぞれを並列に処理するパターンです。シャーディングを行うSplitterとエンティティを処理するMapperが並行して動き…

47,000件のbatch putを16秒で処理

以前に 大量のエンティティを処理するデザインパターン - GeekFactory を紹介しましたが、シングルスレッドのバッチ処理なのでスループットが頭打ちになる問題がありました。コンカレントに処理する方法を思いついたので実装してみました。シングルスレッド…

appengine-mapreduce-javaにおけるShardingの制限事項

appengine-mapreduce-javaで並列度が上がらないから変だと思っていたら、ユーザガイドに以下の記述がありました。 Sharding is currently done by splitting the space of keys lexicographically. For instance, suppose you have the keys 'a', 'ab', 'ac'…

security-constraintによる認証と認可について

web.xml で security-constraint を記述すると、指定したURLパターンについてOpenID Providerによる認証が有効になります。認可の設定は role-name で指定します。 role-name=* すべてのユーザに対してアクセスを許可します。アプリケーションでは User#getF…

プロパティの一部をkindに含める設計について

データストアで時系列データをカレンダー表示したい場合、どのような設計が最適でしょうか。下記のモデル(Event)を考えます。 プロパティ 型 説明 key com.google.appengine.api.datastore.Key キー(userId/time) userId java.lang.String ユーザID time…

AjaxによるFederated Loginの待ち時間の短縮

App Engine上のアプリでは利用者の体感待ち時間を短くするため、JSPを使わずにAjaxで実装することがあります。この方法はOpenID認証(Federated Login)でも有効です。web.xmlのsecurity-constraintで認証をチェックする方法を以前紹介しましたが、この方法…

Jsonizer 0.9

Google App Engineに最適化したJSONライブラリ Jsonizer のバージョン0.9をリリースしました。以前のエントリで開発中と書きましたが、仕様が安定してきたので公開します。Slim3と組み合わせて使う場合は以下のようになります。タイプセーフなプロパティマッ…

Jsonizer

Google App Engineに最適化したJSONライブラリを作っています。依存クラスが少なく、リフレクションを使わないので、高いパフォーマンスが期待できます。使い方はこんな感じ。 public class EventlogController extends Controller { @Override public Navig…

流れるようなインタフェースでJSONを返す

いわゆる流れるインタフェースでJSONレスポンスを返す仕組みを実装してみました。Slim3じゃなくても使えそうです。 public class EventlogController extends Controller { private final EventService eventService = new EventService(); @Override public…

App Engineで利用可能なタイムゾーンの一覧

調べてみました。App Engineで利用可能なタイムゾーン よく調べてみるとApp EngineとSun JDKでタイムゾーンが微妙に異なるようです。 アルゼンチン時間 App Engine = GMT-03:00 Sun JDK = GMT-03:00, GMT-04:00 アルゼンチン時間は GMT-03:00 が正しいはず。…

大量のエンティティを処理するデザインパターン

データストアにある大量のエンティティを処理したい場合、クエリ結果を複数のタスクに分散して処理する必要があります。クエリ結果のカーソルを次のタスクに引き継ぐパターンをテンプレート化してみました。基本的な流れはこんな感じ。 タスクが実行される。…

エンティティ変換タスクのRespawnパターン

長時間にわたる処理は、App Engineの最大実行時間である30秒ごとに分割する必要があります。大量のエンティティを変換する処理もその一つです。いろいろ試してみた結果、Respawnパターン*1が使いやすいと思います。Respawnパターンは、Task QueueがDeadlineE…

OpenID SSOの認証シーケンス

App EngineでOpenIDシングルサインオンを利用した場合のシーケンス図を書いてみました。OpenID Providerが「はてな」の例です。開発者が用意するページは黄色の部分に示したログインページだけです。設定内容は OpenID認証によるシングルサインオン - GeekFa…

App Engineの信頼性は95%程度?

最近、App Engineで下記のようなエラーをよく見かける気がします。 500 10871ms 0cpu_ms 0kb AppEngine-Google; (+http://code.google.com/appengine)Request was aborted after waiting too long to attempt to service your request. This may happen spor…

OpenID認証によるアクセス制御フィルタ

2010-06-05 お詫び:ソースコードに間違いがありましたので修正しました。OpenIDのIdentifierを取得するには getUserId() ではなく getFederatedIdentity() を使用してください。データ変換タスクをTaskQueueに投入するページなど、開発者のみアクセスを許可…

OpenID認証によるシングルサインオン

App Engine 1.3.4でOpenID認証に対応しました。調べてみると意外と普通にシングルサインオンできたので、使い方と仕組みを説明します。まず、OpenID認証を要求するURLパターンをweb.xmlに書きます。 <security-constraint> <web-resource-collection> <web-resource-name>Authentication required url</web-resource-name> <url-pattern>/user/*</url-pattern> </web-resource-collection> </security-constraint>

OpenSocial OAuth Filter バージョン0.7をリリースしました

OpenSocialアプリの開発に役立つライブラリです。バージョン0.7ではパラメータチェックを一部省略できるようになり、柔軟性が向上しました。詳しくはこちらから。http://code.google.com/p/opensocial-oauth-filter/気付いたら1ヶ月もブログを書いていません…