Appresso Engineer Blog

アプレッソのエンジニアが書く技術ブログです。

行ってきました! JJUG CCC 2016 Spring & Java Day Tokyo 2016

こんにちは。この春にはじめて結婚式に着物で参列した開発部の陳です。

春(4~5月)は日本の結婚シーズンではあるが、実は Java のイベントシーズンでもあることは、ご存知の方結構いますかね?

先月下旬の 5/21(土)と 5/24(火)に開催された日本の Java 二大イベント、 JJUG CCC 2016 SpringJava Day Tokyo 2016 に、 私は両方とも参加してきました。

www.oracle.co.jp

若干時間経ってしまいましたが、参加したセッションの簡単な紹介と感想を共有したいと思います。

【目次】


JJUG CCC 2016 Spring

各セッションの資料が、JJUG サイトからダウンロードできるようになっています。

[GH-1] Type Annotation for Static Program Analysis

ITPro 連載でお馴染みの櫻庭さんによるセッションです。

従来のアノテーションの基本用途と使用例を紹介したあとに、 Java 8 でのアノテーションの変更点と、 静的文法チェックでの利用を簡潔に解説しました。

アノテーションは Java 7 まで宣言にしか記述できなかったが、 Java 8 では ElementType に型パラメータ TYPE_PARAMETER と型の使用箇所 TYPE_USE が追加されて、 その結果ツールによる静的文法チェックの制限も少なくなりました。

しかし、現状では言語レベルの標準な型アノテーションが存在しない、関連している JSR-305 も休止状態になっていて、 導入に躊躇する人も多い*1でしょう。

さらに、IDE 独自に定義した静的文法チェック用のアノテーションもあるが、 異なる IDE 間には一貫性がないので、開発環境を変えるとチェックできなくなります。

そこで、Check Framework を使うと、 IDE 間の違いを意識せずにいろんな静的文法チェックができるから、 より快適な開発ライフを送ることができるかもしれません。

[GH-2] Eclipse Collections で学ぶコード品質向上の勘所

ゴールドマンサックスの伊藤さんのセッションです。

Eclipse Collections でのコード品質を向上させる施策と、 俯瞰的な観点から見たソフトウェア開発においてのコード品質の話でした。

コード品質を如何に向上させるか、という話の前に、 ソフトウェア開発においての「コード品質」とは何か、を金融畑の開発者視点から語りました。

一般的に悪者扱いされている技術的負債でも、 捉え方を変えるだけで、ソフトウェアの価値を高める戦略的な手段の一つになるので、 最も大事なポイントは「どのように技術的負債とつきあうか」になります。

技術的負債を抑えるために必要なコストと戦略の妥協点を見極めて、 返済計画を事前に立てたうえで技術的負債を許容することで、 開発スピードとソフトウェアの品質をより容易に両立させることができます。

いつもソースコード中心に考えることが多い私に、技術的負債を見る新しい視点を提示してくれた、とても啓発的なセッションでした。

DRY 原則*2を徹底するための具体的な施策として、 デフォルトメソッドを活用したユニットテスト構成も結構参考になりました。

[GH-3] Jenkins 2.0

Jenkins の産み親である川口さんのセッションで、 内容は主に Jenkins の歴史、現状、と新機能の Pipeline を中心とした説明でした。

最後のユーザをベストプラクティスに誘導するための施策と、 セキュリティに関する取り組みの話以外、 全体的にドキュメントとの重複が多かった印象でした。

[CD-4] ネクスト Struts/Seasar2 としての Java EE アクションベース MVC 入門 ― MVC 1.0、Jersey MVC、RESTEasy HTML

カサレアルの多田さんのセッションです。

掲題通り、Java EE 8 に導入される MVC 1.0 の紹介と、 MVC 1.0 の参照実装である Ozark にテンプレートエンジン Thymeleaf を使う方法を説明しました。

2017 年上半期に Java EE 8 が出るまでのつなぎとして、 Java EE 7 で Jersey MVCRESTEasy HTML を使う方法も紹介されました。

[M-5] Python + GDB = Javaデバッガ

富士通の数村さんによるセッションです。

最初タイトルを見た時、JJUG CCC に Python の話?と訝っていたが、 どのように GDB を Python スクリプトでカスタマイズして、Java のデバッガを作る内容でした。

JVM の仕様と HotSpot の実装の説明を交えつつ、 デバッガに必要な機能を実現するまでの道筋を立てて話していたので、 Python に詳しくない私でも問題なく理解できました。

ちょうど Java Day Tokyo 2016 にもデバッガ関連の話があったので、実際聞いてみたところ、 Java スタックと native スタックを透過的にデバッグしたい需要は結構あるよね、と自分の中で勝手に納得しました。

[CD-6] SmartNews のニュース配信を支えるサーバ技術

SmartNews の瀬良さんによるセッションです。

ニュース配信のウラで、実装面と運用面においてどのように工夫したかの話でした。 基本的に、実装は既存のライブラリとフレームワークを、運用は既存のツールとサービスを積極的に使うイメージです。

話に出てきた以下のものは個人的に気になるので、機会があったら試してみたいと思います。

完全に余談ですが、発表スライドに前職の先輩の写真が載っていました。

[GH-7] Java Puzzlers

寺田さんと櫻庭さんが送る、Java のパズルをみんなで解いていく楽しいセッションでした。

普段でよく使ってる演算子やメソッドでも、細かい動作を把握していないと、 出来あがったプログラムが意図しない奇妙な動きになるかもしれません。

言語仕様を把握して、Javadoc をちゃんと読むことはとても大事であると、 改めて気づかされました。(前の二問が不正解なので…)

Java Day Tokyo 2016

各セッションの資料が、Oracle Technology Network からダウンロードできるようになっています。

[基調講演] Innovate, Collaborate, with Java

例年通り、基調講演は日本オラクル社長の杉原さんを皮切りに、多くの人が入れ替わり立ち代わり話をしていくスタイルでした。

杉原さんが最初に日本の現状と課題に対して、IT による生産性向上が急務であると話したのはとても印象深いでした。 私が思うには、グローバル化に影響で先進国家のほとんども似ているような課題を抱えていて、 結局のところ、どのように IT 技術を使って人の幸せに促進するかに帰着します。

杉原さんのあとに多くの方が登壇したが、内容をかいつまんでお伝えすると、以下のようなものでした。

  • 成長し続けている Java エコシステム
  • Java Magazine を購読しよう
  • JCP は変わる、もっとオープン、透明、参加しやすように
  • Java SE/ME/EE のこれまでの軌跡とこれからの道
  • 損保ジャパンの事例:基幹システムを COBOL から Java EE 7 へ
  • バイクでのJava Japan Tour
  • JJUG の活動
  • デモ:Secure IoT Gateway でドローンを飛ばす
  • デモ:Pepper + Oracle Cloud Platform

基調講演の動画が公開されているので、もし興味ありましたら是非ご覧ください。

youtu.be

[1-A] Java SE 9 Overview

Oracle の Bernard Traversat さんが Java SE 9 で予定される変更点を説明するセッションでした。

主な変更点は

  • Project Jigsaw の導入
  • G1 GC がデフォルト
  • REPL 環境として JShell が追加される
  • 新しいバージョンの付け方
  • ライブラリのモジュール化に伴い、sum.misc.* や sum.reflect.* などの内部 API を削除

などがあります。

これらの変更点のうち、 開発者にとってインパクトが最も大きいのは sum.misc.* や sum.reflect.* の削除でしょう。

一部広く使用されている API はモジュール化する際、可視性は public のままにするが、 API 全体の互換性が維持されるかはなんとも言えない状況なので、可能であれば、Java 9 EA リリースを試してフィードバックしましょう。

f:id:chyiro:20160609165449j:plain

[2-A] Project Jigsaw ではじめるモジュール開発

櫻庭さんのセッション、(私が受講したこの二日間の)第3弾です。

このセッションは Project Jigsaw が解決しようとする問題と、 Project Jigsaw が Java 9 入り決定までの歴史と、 モジュールの基本的な使い方と注意点を紹介しました。

f:id:chyiro:20160609165451j:plain

[3-C] Java Concurrency, A(nother) Peek Under the Hood

イベントでいつも HotSpot の話をしてくれる David Buck さんですが、 今回のセッションは並列プログラミングにまつわる話で、 主にメモリ・モデルと、JITでコンパイルされたコードの分析でした。

6/9現在セッションの資料はまだ公開されていないので、内容を少し詳しく説明したいと思います。

マルチスレッドプログラムは性質上、 スレッドの動作を観察(ログ出力、ブレークポイントによる中断)するだけでも、 全体の振る舞いに影響を与えるので、 バグが織り込まれたら、ほとんどの場合は heisenbug*3 になります。

Java ではマルチスレッド動作の正確性を保証するために、

  1. synchronized
  2. メモリ・モデル
  3. java.util.concurrent(JSR-166)

などの仕組みが用意されました。

メモリ・モデルは書き込まれた値が正しく読み出される条件と、開発者が頼っていい振る舞いを明確にするものですが、言い換えるとスレッドが悪さをする範囲を制限するものです。メモリ・モデルを理解するには happens-before(前に発生)の概念がとても重要です。一つのアクションが別のアクションの「前に発生」なら、前者は後者から見えるほか、順序も後者の先になります。

排他制御を行う synchronized と値の可視性を保証する volatile は、まさに複数スレッド間の「前に発生」の関係を確保するための仕組みです。また、値を変更させない final は読みしか許さないから、実質上の「前に発生」が保証されます。

「前に発生」の関係が保証されていない Java プログラムでは、コンパイラの最適化によるメモリアクセス順序の調整の影響で、予想されない動作になる可能性があります。 もし運が悪くこのような不可解な動作に直面した場合、HotSpot の disassembler である hsdis を使うと、何か役に立つかもしれません。

セッション最後に、 volatile の有無によって HotSpot Client/Server VM の動作が変わるコード例と、hsdis によるコード例の解析結果、が紹介されました。

[4-A] Java 9 で進化する診断ツール

NTTコムウェアの末永さんによるセッションです。

内容はJava 9の診断ツール、jcmdjhsdb の紹介です。

機能拡張された jcmd の方は開発中によくあるシーンに合わせて、その場合に使えるコマンド例を説明しました。

新しいツール jhsdb は基本な使い方の他、HSDB を中心に説明しました。 ただし、native の C/C++ コードでクラッシュした場合、最後はやはり GDB にたどり着くことになります…

最後の GDB の話を聞いた瞬間、だったら最初から GDB で Java スタックと native スタックを両方扱えれば楽なのになぁー、と思いましたが、 よく考えてみたら、この思いこそPython と GDB で Java デバッガを作るモチベーションでしょうね。

[5-D] オラクルコンサルが語る Java SE 8 新機能の勘所

Oracle のコンサルである伊藤さんによるセッションです。

Java SE 8 の主な変更点である

  1. Date and Time API
  2. Lambda 式
  3. Stream API

を、パフォーマンス分析の観点で旧来のソリューションと比較して、ついでに Java Flight Recorder を紹介する内容でした。

私自身は開発においてこれらの新機能をよく使用していたので、比較結果は大体期待通りでした。 Lambda 式の例外処理の話を少し期待したが、時間の関係か全く触れなかったので、個人的には若干物足りなさを感じます。

まとめ

JJUG CCC も Java Day Tokyo も以前参加したことがあるが、 このような近い時期に開催されたイベントに連続参加するのは今回がはじめてです。

Java のエコシステムはコミュニティによって支えている部分が大きいせいなのか、 イベント講演者の顔ぶれは大体同じです。(そして会う回数が増えるにつれてなぜか親近感がわく…)

講演者の顔ぶれが同じであっても、それぞれのイベントの位置づけがはっきりしているので、 プログラムは相互補完的な構成になっていて、照らし合わせられるような内容もあります。 記憶が新しいうちにさらに刺激を得られるから、結果的に知識も身につきやすくなります。

もし今後このように近い時期に開催されるイベントに参加する機会があったら、是非ふるって参加してみてください。 きっとたくさんの収穫が得られると思います。

*1:私も前職で JSR-305 の導入を踏みきれませんでした。まあ、その時は Java 7 でしたが…

*2:Don't Repeat Yourself

*3:調査しようとすると変貌したり消えたりするバグ。名前は不確定性原理を提唱した Heisenberg 氏にちなんで命名されたもの