Java開発におけるErrorProneのススメ

こんにちは、今シーズンのNBAもGSWの試合は全試合観てる米林です🏀 今年は毎試合満員御礼のOracleアリーナに行って観戦したいなぁと思いつつカリフォルニア州オークランドの人たちはOracleがデータベースの会社って知ってるのかどうか毎回気になっています🏀

うちの会社ではJavaの開発において、Error Prone を積極的に取り入れている。 その理由はCTOのmopemopeが入れろって怖いから、ただそれだけである。

実際のところ導入して損は無いので皆さんも是非導入を検討して頂きたい。

Error Prone とは

github.com

Error Prone とはGoogleが公開していて、githubに記載されている説明のとおり “Catch common Java mistakes as compile-time errors” そのままである。 コンパイル時にエラーが起きそうなところははじいてしまおうという素敵なものだ。 Error Prone は Bazel, Maven, Ant, Gradle で動作します。

Java開発者の方に馴染みのある FindBugs のようなものだと思ってもらえると理解は早いと思います。

現在、私が開発しているプロジェクトでは Gradle に組み込んで IntelliJ から実行していて Error Prone のエラーをクリアしないと実行が出来ないため、エラーを直さないと CTO に怒られる以前に実行出来ないためエラーがある状態では業務に支障をきたしてしまいますので強制的にエラーは排除する必要があります😢

インストールなどは公式ドキュメントを見てください。イマドキのJavaの開発であれば、ほぼ Gradle プロジェクトで開発されていると思うので、Gradleに組み込んで実行するまでは3分もあれば確認出来るかと思います。私が自身で作ったプロジェクトに組み込んだ際には既存の build.gradle に以下を追加しただけです。

apply plugin: 'net.ltgt.errorprone'

repositories {
    mavenCentral()
}

configurations.errorprone {
    resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.14'
}

bugpattern

バグパターンはエラーや警告などいくつかに分かれています。 こちらにバグパターンが一覧化されています。そこそこ数が多いですが、色々みていくと自身非常にためになったのでJava開発者の皆さんは是非みてみてください。

バグパターンは、それぞれのサンプル毎に Positive examplesNegative examples があります。英語って難しいですね、どっちが正しいのか最初理解に苦しみました。

バグパターンの一例ですが、ArrayToStringというものがあり、配列をそのまま toString している箇所はNGとなります。

githubexampleを置いておくのでcloneしてGradleでbuildしてみてください。エラーが以下のように表示されるので、Main.java を直しながら確認してみると分かりやすいと思います。

$ git clone https://github.com/yone098/error-prone-example.git
$ cd error-prone-example/
$ gradle clean run
:clean
:compileJava
/Users/yone098/p/error-prone-example/src/main/java/example/Main.java:17: エラー: [ArrayToString] Calling toString on an array does not provide useful information
        System.out.println(nameArray);
                           ^
    (see http://errorprone.info/bugpattern/ArrayToString)
  Did you mean 'System.out.println(Arrays.toString(nameArray));'?
エラー1:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed with exit code 1; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 5.081 secs

custom plugin

plugin としてカスタムチェックを追加することが可能です。 BugCheckerを継承して、MethodInvocationTreeMatcherを実装しプラグインを作成します。

@AutoService(BugChecker.class) // the service descriptor
@BugPattern(
  name = "MyCustomCheck",
  // ...
)
public class MyCustomCheck extends BugChecker implements MethodInvocationTreeMatcher {
  @Override
  public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
    // TODO:
  }
}

Gradleで利用するには

configurations {
  annotationProcessor
}

dependencies {
  annotationProcessor project(':custom-checks')
}

tasks.withType(JavaCompile) {
  options.compilerArgs += [ '-processorpath', configurations.annotationProcessor.asPath ]
}

詳しくは、Plugin Checksをチェックしてください。

最後に

Java開発している方には是非、自身のプログラムを ErrorProne で一度チェックしてみては如何でしょうか?

そして、株式会社Abbyでは絶賛開発者を募集しています。現在、募集しているプロジェクトでは CTO のもとで一緒に楽しく開発出来ますし、もちろん一緒に ErrorProne も見守ってくれます。

気軽にtwitterFacebookなどで声かけてください。そして一度弊社まで遊びにきてください!よろしくお願いします!

2016年 振り返り

クリスマスゲームでGSWが負けてイライラマックスのyone098です🏀 今年も残り僅かなので2016年を振り返ってみたいと思います。

9月

9月には最後の Seasar Conference が行なわれました。OSS を通じて多くの人と知り合えた Seasar には大変感謝しますし愛着があるプロダクトだっただけに寂しい思いもあります。ありがとう Seasar

seasar.connpass.com

10月

開発した新しい箱庭ゲームのリリースがありました🐻🐻🐻 クレジットに会社名やメンバーの名前を見ると毎回嬉しい気持ちになります。

今回もクライアントは JavalibGDX を採用し、サーバーは Go で作りました。

play.google.com

f:id:yone098:20161228110830p:plain:w300

会社

順調に優秀なメンバが増え平均年齢も年々下がり、とても嬉しく思っています。箱庭ゲーム開発のノウハウを生かして引き続き質の高い箱庭タイトルを開発しながら新しいチャレンジを続けていきたいと思います。

箱庭ゲーム開発以外では海外展開のシステム開発に携わっており、プロジェクトメンバが海外出張に行く機会が増えたことも新しいチェレンジにつながっています。こちらも引き続き頑張っていきたいです!

会社のメンバには今年も感謝の気持ちで一杯です。来年もよろしくお願いします!!!

Seasar の終わり

9/24(土)に法政大学で行われた Seasar Conference 2016 Final に行って来ました。

https://event.seasarfoundation.org/sc2016/

まず、このカンファレンスが Seasar にとっての最後のカンファレンスだったにも関わらず準備も宣伝も告知もほぼ出来なかったこと、スピーカーにも全然声が掛けられずに少ないセッション数になってしまったことに関してごめんなさい。

Seasar プロジェクト EOL

Seasar プロジェクト は、本日 2016/09/26 をもって EOL となります。 例外のプロジェクトもありますので、詳細は seasar.org をご覧下さい。

これは Seasar を使うなという意味ではありませんし、EOL に関する話しは久保さんの blog が大変参考になるので是非読んで下さい。

Seasar Conference 2016 Final

EOL になることだし、最後の Seasar Conference をやろうと言った去年のカンファレンスからあっという間に1年が経ち当日を迎えました。 ひがさんの Seasar Project の振り返りを聞いていて懐かしいなぁと思うこともあり寂しい気持ちになりました。

Seasar Conference は、全盛期には1,000人を超えるほどの参加者がいて、日本を代表するようなカンファレンスだったと思います。 去年は久しぶりの開催だったことや告知や集客も行ったので多くの来場者数でしたが、今年は去年に比べると参加者は少なかったです。 準備不足だったこと本当にごめんなさい。

懇親会には行けませんでしたが久しぶりに会う人が多くて懐かしくもありとても嬉しかったです。

Seasar に思うこと

Seasar の良かったところは、開発者が皆ワクワク出来たことに尽きると思います。
MLやはてなダイアリーのコメントのやり取りで、ひがさんやコミッター達や利用者がパブリックなところで議論して決めてそれを実装しリリースされるサイクルや自分達が作った OSS が次々に実戦投入されていくところが当時のモチベーションになっていました。
コミッターも最大100人を超えたり、.NETやPHPのプロダクトも出てきて他言語も巻き込んで、国内の開発者に多くの影響を与えたOSSだったと思います。

個人的には、Seasar があったからこそ色んな人に出会い、そして今の自分があるので Seasar というプロダクトにはとても感謝しています。

いま会社を支えてくれている松原さん(@mopemope)に初めて会ったのが Seasar Conference でした。
今ではプライベートでも仲良しな橋本正徳(@hsmt)に初めて会ったのも Seasar Conference で「きったねぇジャージ着てるなーこいつ」と思ったのが最初の印象でした。
そんな人と10年来の付き合いになったり、仕事も一緒にしたりして Seasar が無かったら絶対に出会ってない人に出会えて感謝しています。
コミュニティの盛り上げ方や OSS の運営の難しさなどを学ばせてもらったのも Seasar でした。

最後に、Seasar に関わった多くの開発者の方々、そしていつもインフラや会場を手配してくれていたふたがわさん、本当にありがとうございました。

Seasar Conference 2016 Final 撮影 橋本正徳