GeekFactory

int128.hatenablog.com

java

Spring Bootアプリケーションのログファイル運用

Spring Bootアプリケーションのログファイル運用についてメモ。 前提 EC2などのクラウドのインスタンスで運用する場合を想定する。 ログ基盤に転送して蓄積する。 インスタンスに残っているログファイルは基本的に見ない。 Spring Bootのログ Spring Bootの…

JVMベースのコマンドラインツールをHomebrewで配布する

JavaVMで動くコマンドラインツールをHomebrewで配布する方法を説明します.JavaやScala,Groovyなどで書かれたツールをMacユーザに配布する際に役立ちます. Homebrewとは Mac OS Xで使えるパッケージ管理システムの一つにHomebrewがあります. Homebrewを使…

InstaGitという即席Gitサーバを作った

ローカルのGitリポジトリをover HTTPで転送したい時に使える即席Gitサーバを作ってみました. int128/instagit Gitリポジトリをネットワーク越しに転送するには git daemon を使う方法もありますが,InstaGitはHTTPをサポートしているので,Webブラウザで問…

GradleによるJVMアプリケーションのパッケージングと配布 #gadvent

G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2014 - Qiitaの10日目です。 アプリケーションを公開する際、ユーザが使いやすい形でアプリケーションを配布することで、より多くのユーザに使ってもらえることが期待できます。また、ア…

docker run dockerfile/java:oracle-java7

JDK 7u65/8u11以降でバイトコード検証の不具合があったためこれまでDockerfileを自作していましたが、JDK 7u72/8u25で不具合が修正されたのでDocker Hubで公開されているイメージに乗り換えました。Docker HubではいくつかのJavaイメージが公開されています…

GradleでBintrayを経由してMaven Centralに成果物を公開する

Maven Centralに成果物を公開するには、OSS Sonatype Nexusに成果物をアップロードする方法が広く知られていますが、Bintrayを経由してリリースする方法もあります。この方法には以下のメリットとデメリットがあります。 メリット Bintrayには成果物に署名を…

バイトコード検証の不具合がJDK 7u72/8u25で修正された

JDK 7u65/8u11以降にはバイトコード検証の不具合 JDK-8051012 があり、Groovyなどの処理系に影響があるという記事を書きましたが、最近リリースされたJDK 7u72/8u25で修正されたようです。 JDK-8051012 への対応状況を以下にまとめました。○は動く、×は動か…

GradleでMaven Central Repositoryに成果物をリリースする

Gradleでビルドした成果物をMaven Central Repositoryにリリースする方法を説明します。成果物の公開にあたってはSonatype OSSRHで申請が必要です。こちらのイケメンな記事が大変参考になります。こちらの記事ではMavenを使っていますが、本稿ではGradleを使…

Gradleのマルチプロジェクト構成を運用してみた

Gradleでマルチプロジェクト構成を運用してみて、気付いた点を書いてみます。以下の環境で確認しています。 JDK 1.7 Eclipse 4.2 Subversive, SVNKit 1.7 Gradle IDE 3.0 Jenkins マルチプロジェクト構成については下記が参考になります。 第7章 Javaクイッ…

How to install Apache Tomcat 7.0 on Linux

公式ドキュメントに従って Apache Tomcat 7.0 をインストールしてみました。前提条件 Scientific Linux 6.3 x86_64 Oracle JDK 7u7 x86_64 Apache Tomcat 7.0.30 gcc, make などのビルドツールが必要です。 実行ユーザ 実行ユーザを作成します。ここでは tom…

GradleでAPT (Annotation Processing Tool) を使う

GradleでAPTを使うにはAntのaptタスクを利用します。slim3-genをどうやって組み込むか小一時間悩んだので残しておきます。やり方は色々あると思います。私は以下の方針でやってみました。 新しいソースセット(apt)を定義します。 APTコンパイルタスク(com…

Apache CXFでRESTサービスをさくさく作る

Apache CXF で REST サービスをさくさく作ってみます。自分で用意するもの。 Java 6 Eclipse Indigo m2e (Maven integration for Eclipse) Maven が用意してくれるもの。 Apache CXF Spring JUnit Apache Tomcat 新しいプロジェクトを作る [New]-[Project...…

JenkinsとApache Ivyで開発からデプロイまでを管理する

Eclipse, Jenkins, Apache Ivyを使ったプロジェクトにおける開発からデプロイまでの流れを図に描いてみました。図では書き表せないことがありますね。テスト実行時のクラスパスは実行時ライブラリを含むとか、図で描くとカオスになります。GUIツールでビルド…

一定スループットでテストメールを送信するツール

一定のスループットでテストメールを送信するツールを紹介します。2年前に作ったものを掘り出しました。JMeterが使えない環境で役に立つと思います。 SendMail.java 1クラスで完結するように書いたので、クラスファイルとプロパティファイルを配置するだけで…

Webアプリの実行時にJavaScriptを圧縮する

Webアプリの公開にあたっては、データ転送量や実行効率の点からJavaScriptを圧縮(minify)して配信することが推奨されています。ここでは実行時に圧縮する方法を説明します。JavaScriptの圧縮にはGoogle Closure Compilerを利用します。Maven pom.xmlに以下…

Rhinoを使って簡単に本番環境の挙動を確認する

開発環境ではうまく動くのになぜか本番環境で動かないとか、本番環境での挙動が分からんといったとき、いちいち本番環境にテストコードをデプロイして確認するのは面倒ではありませんか?Rhinoを利用して動的にコードを実行するツールを使うと、本番環境での…

Google Tasks API Client Libraryを1.3.0にバージョンアップした場合の変更点

Google Tasks APIにはJavaのクライアントライブラリが用意されています。クライアントライブラリ(google-api-services-tasks)のバージョンを1.2.2から1.3.0に上げたときの変更点をまとめておきます。基本的には一部のメソッドが非推奨になっただけで、後方…

完了したタスクのステータスを未完了に戻すには

完了したタスクを未完了に戻すにはステータスをcompletedからneedsActionに変更します。このとき、ステータスの変更と同時に完了日付をクリアする必要があります。具体的には、以下のJSONをリクエストボディに入れてPATCHメソッドを投げます。 { id: "taskID…

WebアプリからGoogle Tasks APIにアクセスする

Google Tasks APIはタスクにアクセスするためのAPIです。GoogleカレンダーにTo Doリストが付いていますよね、あれです。WebアプリからGoogle Tasks APIにアクセスするにはクライアントサイド(JavaScript)とサーバサイドの2つの方法がありますが、今回はサ…

google-http-java-client bug #28 fixed

google-api-java-clientでモデルをJSON化するとマルチバイト文字が化ける件について、google-http-java-clientプロジェクトにバグレポートを出していましたが、10/31に修正されました。レポートした JsonFactory#toString() 以外でもエンコーディングに依存…

Google Tasks APIでタスクの期限を設定する

Google Tasks APIでタスクの期限を設定するとき、タイムゾーンに注意する必要があります。Google Tasks上ではタスクの期限は日付(タイムゾーンはUTC固定、時刻は00:00:00固定)で扱うのが無難です。 注意すべき仕様 Taskモデルのdueプロパティはタイムゾー…

Picasa APIを利用するコードのユニットテスト

Picasa Web Albums APIのクライアントライブラリを利用するコードのユニットテストをどう実現するか考えてみました。結論としてはモックを使った普通のテストになりました。 テスト対象はドメインロジックとする。Picasaクライアントライブラリの実装にテス…

google-api-java-clientの文字化けと対処法

Google Tasks APIにアクセスするコードを書いているのですが、App EngineのProduction環境で文字化けするパターンがあったのでまとめておきます。ちょっと変わった使い方をしていたので見つけました。Tasks APIへのアクセスには google-api-java-client とい…

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では、特定のメールアドレスに写真を添付して送ると「ドロップボックス」というアルバムに入るようになっています。この「ドロップボックス」の写真…

Picasaアルバムに画像をアップロードするコード

Google Picasaのウェブアルバムに画像をアップロードするバッチを書いています。Javaのコードはとても簡単ですが、クライアントライブラリを揃えるのに一手間掛かったのでメモします。Eclipseで新しいJava Projectを作成します。必要なライブラリを入手しま…

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

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

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/