GeekFactory

int128.hatenablog.com

java

Springでリクエストとレスポンスのログを出力する

Spring MVCでリクエストとレスポンスのログを出力する方法を説明します。 リクエストログだけなら CommonsRequestLoggingFilter もしくは AbstractRequestLoggingFilter を使う方法が簡単です。詳しくは下記の記事で説明しています。 int128.hatenablog.com …

#渋谷java でSwaggerのテンプレートを魔改造した話をした

第二十回 #渋谷java で、複数チームの並行開発におけるSwagger(OpenAPI)の活用についてお話しさせていただきました。 speakerdeck.com TL;DR 複数チームが並行開発を行う場合はインクリメンタルなAPI設計は避けられない。 OpenAPI YAMLからAPI Server, Cli…

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と大量データ処理についてお話しさせて頂きました。speakerdeck.comTask ChainやQuery Chainの基礎的な話、AppEngine Mapperの仕組みについて解説しました。事例紹介などの派手なお話はできませんでしたが、…