【勉強会メモ】Java Day Tokyo 2017

Java Day Tokyo 2017に参加してきたのでその時のメモ。
今回はJavaSE9について重点的に聞いてきました。

自分用に書いていたので歯抜けが多く申し訳ないです。
間違いや補足事項あればご指摘いただけると幸いです。

# Java Day Tokyo 2017 とは
日本オラクルが開催する、国内最大規模のJava年次イベント。
公式ページ：http://www.oracle.co.jp/events/javaday/2017/
ハッシュタグ: [#JavaDayTokyo](https://twitter.com/hashtag/JavaDayTokyo?src=hash)

#参加したセッション
※敬称略
1. 基調講演  （日本オラクル代表執行役社長　杉原博茂、Oracle Vice President　Bernard Traversat、Oracle Senior Director　Will Lions）
2. Java 9 and Beyond: Java Renaissance in the Cloud（Oracle Vice President　Bernard Traversat）
3. Modular Development with JDK （日本オラクル株式会社　デイビッド・バック）
4. Servlet 4.0 で始めるHTTP/2（日本オラクル株式会社　柳原 伸弥）
5. Java SE 9のすすめ　（Java in the Box　櫻庭 祐一）
6. Spring Framework 5.0によるReactive Web Application （Pivotalジャパン株式会社　槙 俊明） 
  発表資料：https://www.slideshare.net/makingx/spring-framework-50-reactive-web-application-javadaytokyo

# トピック＆まとめ
#### ◆Javaの現状、今後の動向について
- Java SE 9, Java EE 8がリリースされる
- Claud上で最適化するための機能強化

####◆今年7月にリリース予定のJava SE 9, Java EE 8について
- Java SE 9については後述。Java EE 8についてはあまり聞けなかったため言及しない。

#### ◆Java SE 9 で導入される、module(Project jigsaw)とその他の新機能について
- Module System(Project jigsaw)：最も注目されている機能。依存性をモジュール単位で設定可能とする。
- JShell：PythonやRubyのREPLのように、インタラクティブにコードを実行する機能。
- JLink：JDKのクラスモジュールのうち必要なものだけ指定して読み込むことができる機能。
- Ahead of Time Compilation(AOT)：仮想マシンの起動前にJavaクラスをネイティブコードにコンパイルする機能。起動時の時間短縮。
- G1GC：デフォルトのGCが、パラレルGCからG1GCに変更された。

#### ◆Java SE 9 で発生した仕様変更について
- Milling Project Coin (参考：http://itpro.nikkeibp.co.jp/atcl/column/15/120700278/050800037/?rt=nocnt)
- イミュータブルなコレクションが作成可能になる。(Collectionインターフェースのofメソッド)
- Stringの内部実装がchar[]→byte[]に。Heapの使用量がかなり減る。

#### ◆Servlet 4.0 で対応するHTTP/2について
- HTTP/2を利用することで、クライアントとのHTTP通信が高速化可能に。Servlet 4.0 を素で使うのはあまり実現的でないので、フレームワーク側に対応動向をチェックしておく。

#### ◆Spring Framework 5.0のReactiveプログラミング対応
- Spring Framework 5.0より、Reactiveプログラミング対応としてSpring WebFluxという新しいWebフレームワークが追加された。
- Reactiveプログラミングを行うと、Non-Blockingなデータ通信により高速化、柔軟なスケーラリビティが期待できる。
- RxJava, Reactor, Akka などのライブラリが有名どころ。JavaSE9ではFlowインターフェースによるReactiveプログラミング対応が行われている。


# 以下、各セッションのメモ
## Java Day Tokyo 2017 基調講演　（日本オラクル代表執行役社長　杉原博茂、Oracle Vice President　Bernard Traversat、Oracle Senior Director　Will Lions）
#### 概要(公式ページより)
いよいよJava SE 9とJava EE 8のリリースが近づいてきました！今回のJava Day Tokyoの基調講演は、Java SE、Java EEそれぞれの開発部門のVice Presidentが、直接みなさまへ新バージョンの価値をご紹介します。新バージョンの注目すべきポイント、さらにその先に何があるのかを、ぜひみなさまご自身でお確かめください。ご参加をお待ちしています。


### 日本オラクル代表取締役　杉原博茂 氏

- 「日本を幸せにするカンパニーへ」
- ITの人材不足が課題、2030年には60万人の不足に
- オンプレ(12兆)　＞　IaaS(2100億)
- Cloud上で最適化するための機能強化

----
### Oracle Vice President　Bernard Traversat 氏

- Cloudの基盤となる
  - AWS,MS AzuleなどのコアにJavaが使われている
- Java is deadはOracleに買収されて払拭された
- 先日、Dockerとのパートナーシップを発表した

#### Java9
- 122のフィーチャーが入った
  - module system
  - modular JDK
  - JShell
  - Encapsulate Internal APIs
  - JLink: Java Linker
  - Ahead of time compilation(AOT)
      - Java9ではスタティックのコンパイレーションを利用可能
      - コンパイラがリアリタイム情報を取得可能に

#### Java9以降の動向（OpenJDK）
#####project Valhalla

* ValueTypes
* Specialized Generics
* Var Handles

##### Project Panama
ビッグデータへの適用
GPUでの実行

* Foreign Function Inteerface
* Date Layout Control
* Arrays 2.0


### MazdaでのJavaの利用について
####従来型
* ビジネスプロセスをサポート
* 機能要件・非機能要件をサポートするのは必須
* 全ての開発者は共通の開発環境、アーキテクチャ、開発ルール、FWを使っている
* 自動生成ツールを作成
* 言語が長生きしてくれるのも重要
* 下位互換性（バージョンアップしやすい）

####最近の流れ
* 組み合わせ
    * Strategy Pattern →関数型に
* 期待
    * 開発環境やFWの共通化→肥大化→Jigsawに期待
    * 大量データ→GCの問題→BigData/AI時代のJavaに期待


####JShell
- REPLのようにインタラクティブに実行可能となる
- mvn jshell compile
- 補完機能もついている
- プロトタイプをJShellで作成し、形ができてきたらコードに落とし込む


----
###Oracle Senior Director　Will Lions 氏

- JavaEE8は早ければ今年の夏に発表予定
- HTTP/2は速度が速くセキュア、アプリケーションに変更必要なし

###JJUG
- 現在6300人以上、コアは20-30代
- なぜコミュニティに参加するのか
  * 一緒に考えてくれる仲間に出会える
  * すごいエンジニアを知ることが出来る
  * 発信して勉強できる



##Java 9 and Beyond: Java Renaissance in the Cloud
###概要(公式ページより)
本セッションはJava 9リリースのアップデート情報をお届けします。Java 9は、エンジニアがjavaサービスをクラウド上にjavaサービスを開発し展開する方法を根本的に変えます。新たなツールであるAOTやJLinkはJava 9の新モジュールシステムを活用して新しいタイプのパフォーマンスと密度の最適化を可能にします。Java 9でデフォルトGCに位置づけられたG1はビッグデータクラウドサービス向けの新たなレベルのスケーラビリティを提供します。さらに、value typeやJNIの移行、言語の改良など、Java 9以降の新機能についても触れたいと思います。またこのセッションでは、これら新機能のデモを通してクラウドベースの開発者にとってのJava 9の重要性を理解頂きます。


### Java9
- Javaの問題
  * 冗長性
  * メモリを食う
- Javaの優先度
  * セキュリティ

###新機能
* jigsaw
* JLink
* Ahead of Time(AOT) Java Compiler
* JShell
* G1 GC as the Default

###Java SE Advanced
* Flight Recorder Performance
    * 条件に基づいた情報をトレーシングすることが可能
* Java Mission Control Console
    * 問題箇所を調査することが出来る
* Advanced Management Console
    * 特定のアプリだけ古いJavaを利用、などを設定できる（セキュリティの向上）

###Java9以降の動向
* Uniform
    * Array, Values, types
* memory
    * なるべくコンパクトに、もっとライトウェイトなスレッド
* Compatible
    * 互換性
* Performance
    * CPU/GPU

## Modular Development with JDK 9 （日本オラクル株式会社　デイビッド・バック）
###概要(公式ページより)
モジュラー開発スタイルは全てのJava開発者（あなたのアプリケーションがたった１つのJARであっても100個のJARであっても）にメリットがあります。本セッションでは内部APIを強力に保護しながら数十の再利用可能なモジュールとしてJDKを構造化したJava 9のモジュールシステムを紹介します。
そして、セッションではモジュールをどのようにして作成するか、一般的に利用されているライブラリ潜むJDKの内部APIへの依存の回避をどのように行うかについて解説します。最後に、モジュールのために用意されたツール群について説明します。

###Programs are ~~Classes~~  ~~Package~~ Mogules
* “public” no longer mean “accessile ti everyone”.
![新規ドキュメント 2017-05-17 14.13.09_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/955ca7d5-2fa6-cb01-014c-6a2e6886c33a.jpeg)

![新規ドキュメント 2017-05-17 14.14.37_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/ff1b7b87-3b9a-28da-d5ac-c5d82de8dabd.jpeg)

exports はパッケージ単位。requires はモジュール単位
![新規ドキュメント 2017-05-17 14.20.12_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/99a17a1f-a1a4-1a46-76a7-3c8973ebf467.jpeg)


JLinkを利用すると、JDKのクラスモジュールのうち必要なものだけ指定して読み込むことが出来る
→メリットは？
cloudなどで多数のJDKを起動する場合などに、リソースの節約になる


jdepsでjarの依存関係を検査することができる（Java8から提供されている）
![新規ドキュメント 2017-05-17 14.32.35_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/0589433a-9d19-485c-a194-8b68abcde906.jpeg)


Automatic Modules
既存のJarを自動的にmodule化する機能
モジュールベースで開発されてないものは、Automatic modules機能を使う。Jarの変更なし


##Servlet 4.0 で始めるHTTP/2  （日本オラクル株式会社　柳原 伸弥）
###概要(公式ページより)
HTTPの仕様が16年ぶりにHTTP/1.1 からHTTP/2に更新され、通信効率を向上するさまざまな仕組みが取り込まれました。Servlet 4.0では、HTTP/2の活用するアップデートが行われています。本セッションでは、Servlet 4.0を用いたHTTP/2 の活用例についてご紹介します。

###Servlet振り返り
* サーバサイドで動作するJava
* Controllerとしての役割

###Servlet4.0概要
* Servlet4.0 2017/7リリース予定
* HTTP２対応

###HTTP／２概要
* 1系
    * TCPコネクションについて、リクエスト・レスポンスが1:1
    * 原則として１つのリクエストの完了を待ってから、次のリクエストを送信→待ちが発生
    * 高速化の取り組み
        * CSSスプライト
        * インラインイメージ
        * ドメインシャーディング
* 2系
    * TCPコネクションについて、ストリームの多重化
    * ストリーム優先度
    * Server Push
    * ヘッダー圧縮（オーバーヘッドを少なくする）
    * バイナリー・フレーム（今まではテキストベースだった）

###Server Push
* 一つのリクエストに複数のレスポンスを返す
* PushBuilderオブジェクトを作成 (request.newPushBuilder();)
* PushBuilderオブジェクトは再利用可能
* GETまたはHEADを利用する（「キャッシュ可能」かつ「安全」であること(RFC 7540の仕様に準拠)）
* JSファイルの結合や、CSSスプライトを行う必要がなくなる

![新規ドキュメント 2017-05-17 14.32.35_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/5be30a24-d77c-72be-3ec0-1be8fd1661aa.jpeg)

##Java SE 9のすすめ　（Java in the Box　櫻庭 祐一）
###概要(公式ページより)
Java SE 9というと、Project JigsawやJShellを思い浮かべるかもしれません。しかし、Java SE 9はそれだけではありません。Java SEの機能追加を定めるJEPの数は89もあります。
本セッションでは、Java SE 9の多くの新機能の中から言語仕様の変更や、コアライブラリの変更点、また互換性に問題がある点などについて実例と共に解説します。


Jigsaw, JShellの話はしない

###アジェンダ
* Compatibility
* Brand new
* Update

###Compatibility
* Language & Library
    * アンダースコアのみの変数名は使用できなくなった
    * 消えたメソッド
        * OSに直結するようなメソッドは隠蔽された（Jigsaw絡み)
    * deprecated
        * threadのStop
        * Reflection系のメソッド 
* VM&Tools
    * No More Java Plug-in Applet
    * No More Windows x86 Clinent VM
    * No More Java DB
* Operation & Management
    * No More Visual VM
    * No More hprof(heapのプロファイラ), jhat
    * JRE Structure
        * ディレクトリ構成が変わった
    * No More rt.jar, tools,jar, lib/ext
    * No More -Xbootclasspath
    * Default GC: G1GC (今まではパラレルGC)
    * Deprecated: CMS(GCの一種)


###Brand New
* Jigsaw
* Project Kulla/JShell
* Reactive Streams
    * 非同期プロセス
    * Publisher-Subscriver Model (w / Back Pressure)
    * Flowインターフェース
        * Publisher
        * Subscriber
        * Subscription
* JEP11 Incubator Modules
    * ベータ版のような機能をJDKに含める
        * Java SE 9 : HTTP/2 Client

###Update
* Language: Milling Project Coin
    * @SafeVarargs
    * try-with-resources
        * finalのついた変数ならばtry句に使用可能に(実質的finalでもOK(Java8より))
    * ダイヤモンド演算子(<>)
        * 匿名クラスでも利用可能に
    * Interfaceでprivateメソッド
    * アンダースコア
* Library
* Stream
    * Factory Methods
        * ofNullable(t)
            * 
        * iterate(seed, hasNext, next)
            * 条件とつけられるようになった（今までは無限イテレート）
    * New Methods
        * take/dropWhile
        * Collectors.flatMapping
        * Collectors.filtering
* Optional
    * stream()
    * ifPresentOrElse(action, elseAction)
    * or(supplier)
        * Optional<String> opt = opt1.or(() -> opt2)
* Collection
    * Factory Method 
        * of()
            * List<Integer> l = List.of(0,1,2);
            * Map<Integer, String> m = Map.of(0,”a”,1,”b”);
    * Making Immutable Collection
    * Enumeration.asIterator();
* String
    * char[] → byte[]
        * heapの使用量がかなり減る
    * concatenation
        * StringBuilder → InvokeDynamic
            * 最適化が可能に
* Deprecated
    * @Deprecatedのついたものは本当に消される
        * Deprecatedの警告が出た場合はすぐに対応すべき
* Javadoc
    * HTML5対応
    * SearchBox


##Spring Framework 5.0によるReactive Web Application　（Pivotalジャパン株式会社　槙 俊明）
###概要(公式ページより)
Spring Framework 5.0の目玉機能としてReactiveプログラミング対応が加わり、Spring WebFluxという新しいWebフレームワーク及びランタイムが追加されます。
本セッションでは、Reactive対応の背景とReactive Streams/Project Reactorの説明から入り、Spring Boot 2.0を交えたSpring WebFluxの使い方をコード例を中心にご紹介します。
###発表資料
https://www.slideshare.net/makingx/spring-framework-50-reactive-web-application-javadaytokyo


###Reactiveとは？
* Non-Blocking
* event-driven
* backpressure

###種類
* Sync/Bloking
* Async & Blocking
  * マルチスレッド
    * スレッドを立ち上げる処理が重い
* Async & Non-Blocking
  * Event-Loop
  * I/Oの待ち時間を有効に利用できる

- Servletを使うと必然的にBlockingになる
- Nettyを利用するとNon-Blocking & Event-Loop (Apple, Twitterなどで利用されている)

###SpringがReactive対応する理由
* マイクロサービス→無駄なくスケール可能に
* スロークライアントからのアクセス
* スケーラビリティ・安定性など


###Reactive Streams
* non-blocking
* back prassure
    * データの流量を調節する機構

###対応ライブラリ
* RxJava
* Reactor
* Acca Stream

###Reactorの場合
####Flux/Mono
* Flux<T>
    * Publisherの実装0~N件のデータを表現する場合に使用
* Mono<T>
    * Publisherの実装 0または1のデータを表現する場合に使用

SpringFW5.0でのReactive Stream
![新規ドキュメント 2017-05-17 17.52.39_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/41569/dfda7529-2ee0-8b79-175a-20d4c05a2128.jpeg)