GeekFactory

int128.hatenablog.com

java

Jsonizer 0.9.2をリリースしました

軽量なJSONシリアライザ Jsonizer 0.9.2 をリリースしました。Java6上で動作します。あらかじめテンプレートを定義しておき、オブジェクトに対してテンプレートを再帰的に適用してシリアライズするのが特徴です。以前は Object.getClass() に厳密に合致する…

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…

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ヶ月もブログを書いていません…

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

OpenSocialアプリの開発に役立つライブラリです。バージョン0.6ではGoogle App Engine向けの最適化を行いました。このライブラリと並行してmixiアプリも開発中です。詳しくはこちらから。http://code.google.com/p/opensocial-oauth-filter/

JSONICとSlim3 DatastoreによるREST APIサービス

JSONベースのRESTサーバにJerseyを使っているのですが、App Engineの実環境ではspin-up timeが長いので困っていました。mixiアプリの表示に10秒もかかると見る気が失せてしまいます。そこで、JSONICのWeb Service Servletを使ってみました。POJOをJSONで返す…

opensocial-oauth-filter-0.5.1をリリース

NullPointerExceptionが発生するバグを修正しました。OpenSocialコンテナからのリクエストを検証するサーブレットフィルタを作っています。Javaでmixiアプリを作るのが少し楽になるライブラリです。opensocial-oauth-filter - Signature validation filter f…

opensocial-oauth-filter-0.5をリリースしました

OpenSocialコンテナからのリクエストを検証するサーブレットフィルタを作っています。Javaでmixiアプリを作るのが少し楽になるライブラリです。バージョン0.4からの変更点は以下です。 XMLファイルに設定を書くようにしました。 jarファイルが1つになりまし…

他ライブラリに依存せずにXML設定ファイルを読み込む方法

ライブラリをパッケージして配布する時、なるべく依存するjarを減らしたいことがあります。Mavenを使えば何ともないのですが、敷居を下げる意味では「1つのjarだけ入れれば動きます」が望ましいと思います。*1Commons DigesterやJAXBを使うと、XML設定ファイ…

mixiアプリからのリクエストを検証するフィルタ

mixiアプリからのリクエストに対して署名検証を行うサーブレットフィルタを作りました。Apache Tomcatなどのサーブレットコンテナで使用できます。ではサーブレット内で署名検証を行っていますが、このフィルタを使うとサーブレット内の実装が不要になります…

リバースプロキシを通してリクエストを受ける際の注意点

OAuthの署名検証を行う際、以下の2つが合致していないと検証エラーになるようです。 (OpenSocialコンテナ)gadgets.io.makeRequest()に渡すURL (サーバサイド)OAuthMessageのコンストラクタに渡すURL net.oauth.OAuthProblemException: signature_invalid…

サーブレットフィルタによる署名検証

OpenSocialコンテナは外部サーバにリクエストを発行する機能があります。gadgets.io.makeRequest()を使ってリソースを取得したり、データを送信したりできます。 var xapp = {}; xapp.configuration = { endpoint: 'http://example.com/api'; }; xapp.query …

Axis1とAxis2の相互接続

Webサービスといえば巷はRESTで盛り上がっていますが、企業内システムではSOAPも多く使われています。SOAPの代表的な実装としてApache Axisがあります。2005年ぐらいにAxis1が爆発的に使われ始めた記憶がありますが、パフォーマンスが悪いとかWSDL 2.0に準拠…