2016/09/22

JavaOne 2016 Day 5

このエントリーをはてなブックマークに追加

やっとというか、あっという間というか、今日が最終日です。

今日はあさイチで Community Keynote。昨日の Appreciation Event の次の日のあさイチはつらい ><

ということで、今日聴講したセッション。

  • Java Community Keynote
  • Troubleshooting the Java HotSpot VM [CON1640]
  • Vectors for Java [CON1560]

通常、最終日の午後はまったりムードで、リピートセッションなどが多いのです。金曜の午後には帰ってしまう人も多いし。でも、今年はなぜか Panama のセッション。これは出ないわけにはいかないです。

でも、その前の Troubleshooting のセッションはイマイチ。話題を盛り込みすぎて、1 つ 1 つが浅くなってしまってました。もったいない。

Java Community Keynote

キーノートは後で写真を加えて、更新する予定です。

キーノートは去年と同じく、前半が IBM で、後半が Community Keynote です。

IBM は 3 年連続 John Duimovich。まぁ、普通のキーノートです。

初日のキーノートで Oracle JDK を Docker に対応させることが発表されましたけど、IBM も IBM SDK for Java を Docker 対応させるのだそうです。また、J9 をオープンソースにするという発表は、Eclipse OMR についても言及してます。

最後に Devoxx の人たちを迎えてデモ。Nao にしゃべらせてみたり、同じエンジンを使ってスマホからアクセスするものです。

さて、Community Keynote です。

Community Keynote は去年と同じ寸劇。Starwars の超劣化版パロディ。JUG のメンバや Java Champion たちが出演しているのですが、なんだかなぁ。みんなこれおもしろいと思っているのかなぁ。やっている人たちはおもしろそうですけど。

James Gosling が悪役なのですが、まったくセリフ覚えていないで、台本見てしゃべっていたりするのは、まぁご愛敬。

今年は日本オラクルの伊藤さんと、HeapStats の久保田さん (@sugarlife) さんも出演してました。HeapStats も一緒に出演 (?) してました。

とはいえ、技術的な要素はなにもないし、ほんとうちわノリなんですよね。来年はどうにかしてほしいなぁ....

Vectors for Java [CON1560]

さて、今年の最後のセッションです。スピーカーは Oracle の Paul Sandoz と Intel の Ian Graves。資料はこちら

火曜日にも Panama のセッションがありましたが、あちらは JFFI に関して。このセッションは Panama のもう一方の Vector API について。java.util.Vector の話じゃないよとお約束のつっこみw

そのあと、Safe Harbor が提示されたのですが、Oracle の Safe Harbor に比べて、Intel の Safe Harbor が長い! Safe Horbor もネタとしてしか扱われないというのは ^ ^;;

さて、本題に入って、パラレル処理です。Hadoop のように複数マシンでパラレル処理はもちろん、CPU 単体でもマルチコアでパラレルになっています。

このセッションでは後者の単体の CPU での話。

CPU では Single Instruction, Multiple Data (SIMD) や SPARC で扱っている Data Analytics Accelarator (DAX) などがあります。その他にも GPU や FPGA があるのはご存知の通り。このセッションでは SIMD と Java について。

GPGPU に関しては Project Sumatra があったのですが、最近進捗がないようなんですよね。

HotSpot ではすでに Intel の AVX インストラクションは扱っていて、C2 コンパイラで SIMD のコードに最適化しているようです。配列のコピーなどに使用していると。でも、まだまだ限定的です。

そこで、Java でも低レベルでデータを扱えるようにしようというのが発端。これには 2 つのプロジェクトが関わっており、ハードに近いのが Project Panama、Java に近い方が Project Valhalla です。

たとえば 128bit を扱う Long2 とか、256bit を扱う Long4、さらに Long8 などを新たに導入するわけですが、だからといってそれをそのまま扱うにはなかなか難しい点があります。

そこで、使うのが Value Type と MethodHandle です。MethodHandle はもともと invokeDynamic のために作られた API ですけど、indy ほんといろいろ使われてるww こんなに使われるとは導入当時は思いもつかなかったろうなぁ。

さらに多ビットを表すために Vector API を導入します。多ビット演算や map なども定義されていて、それをパラレルに処理していくわけです。

なんかすごいおもしろい。こういうのが出てくるとワクワクしますねw

ということで、今年の JavaOne はこれでおしまい。

2016/09/21

JavaOne 2016 Day 4

このエントリーをはてなブックマークに追加

今日の夜は Appreciation Event でライブ。今年は Sting と Gwen Stefani です。

Sting は 2011 年に続き、2 回目の登場。一方の Gwen は初登場です。というか、もともとは Billy Joel のライブが予定されていたのですが、急きょ変更されたのでした。

それにしても、Sting と書こうとして、何度 String と書いてしまったことか ^ ^;; 完全に手癖になってしまっています。

ということで、今日は BOF はなしです。

Apreciation Event については、写真を含めてまた後で更新します。

  • Unified JVM Logging in JDK 9 [CON6225]
  • Java Debuggers: A Peek Under the Hood [CON1503]
  • Introduction to Modular Development [CON3707]
  • Advanced Modular Development [CON3711]

今日、イタかったのが Project Valhalla の唯一のセッションだった Unsafe Zone がキャンセルされてしまったこと。そりゃないよ。これで、今年は Valhalla 関連のセッションがなくなっていまいました ><

その代わりに聴講したのが Java Debuggers。これは David のセッションです。今年、David は 4 つもセッションを持っていてタイヘン。でも、タイミングが合わなくて、1 つも聞けないと思っていたのです。たまたま、Unsafe Zone がキャンセルされたので、Debuggers を聞くことができました。

David のセッションの後、体調がすぐれなかったので、一度ホテルに帰って寝てました。ライブまでには回復したのでよかったのですが、時差ボケもあいまって体調が不安定なのは困ったものです。

それにしても、年をとると、どんどん時差ボケがひどくなるような気がします。体力が落ちているんでしょうね。

Unified JVM Logging in JDK 9 [CON6225]

Java のシステムログって複雑怪奇で、しかもバージョンごとにいろいろ変わるし、オプションもいろいろあって分からんのです。それを Java SE 9 では統一して扱うことになりました。ということで、そういうセッションです。

スピーカーは Oracle の Marcus Larsson。資料はこちら

一番はじめに java.util.logging.Logger の話ではないよと。まぁ、お約束ですね。

今まで、ログを出力するにはいろいろとオプションがありましたが、Java 9 からは -Xlog に統一されます。でも、-Xlog の後にやっぱりいろいろと書かなくてはいけないのはしかたない。

特に、gc や cpu などどの項目を出力するかを指定するために、+ と * が使えるのですが、この指定がちょっとわかりにくい。たとえば、T1 に関する項目を表示させるためには T1 もしくは T1* のどちらかを記述します。T1 と記述すると、T1 だけに関することだけが出力されます。たとえば、T1 と T2 に関連している項目は出力されません。

T1 と T2 の両方に関連している項目も含めて、T1 に関するすべてを出力するには T1* と記述する必要があります。

それ以外にもいろいろとオプションがあるので、システムを保守している人は資料をチェックしておいた方がいいと思います。

ついでに、ログをファイルに出力して、ついでにファイルをローリングすることもやっとできるようになりました。

なお、Java 8 までの古い書き方も使えますが、新しい書き方もヒントとして出力されますよ。

Java Debuggers: A Peek Under the Hood [CON1503]

Debbuger で使用する JVMTI に関するセッション。スピーカーは前述したように David Buck です。

資料はこちら

今年の JavaOne のセッションには Under the Hood 多すぎと書きましたが、なんと Debugger に関する Under the Hood が 2 セッションもあるのです。1 つが JVM Debugging Under the Hood で、もう 1 つがこのセッション。

David によると、前者は JDI に関するセッションで、David は JVMTI と JDWP に関する部分を話すそうです。JDI は JVMTI に依存していますが、JVMTI は独立で扱うことができます。

JDI は Java Debugger Interface で JVMTI に JDWP を使用して接続して、デバッグを行うためのフレームワークです。JDWP は Java Debug Wire Protocol。JDI と JVMTI 間の通信プロトコルを決めています。

そして、JVMTI が Java VM Tool Interface。JVM のプロファイルやデバッグを行います。JVMTI は J2SE 5 まで使っていたプロファイル用の JVMPI とデバッグ用の JVMDI を統合したものです。

でも、JVMTI の概要だけでセッション終わってしまいました。具体的にデバッグ時にどういう動きするのかとか、簡単なデバッガサンプルとか出してくれればもっと分かりやすかったと思うんですけどね。

おととい、David とちょっと話したのですが、このセッションが一番準備ができていなかったらしいです。しかも、このセッションだけ録画されるらしい。そのせいもあってか、ちょっと内容が硬かったですね。

Introduction to Modular Development [CON3707]

今日の後半 2 セッションは Project Jigsaw のセッション。スピーカーは Alan Bateman。

資料はこちら

はじめに標準のモジュールの話。モジュールは java のオプション -list-modules で確認できます。

続いて、もじゅーつの定義について。って、定義もなしに標準モジュールの説明をするのは間違っているのではないのかなぁ。というか、このセッションも次の Advanced ももうちょっとセッションのストーリーを考えた方がいいと思うよ。

このセッションで理解できると考えるのが、私には信じられません。

module-info.java に依存性と公開範囲を記述してというように話は続くのですが、ほぼ去年と同じ。まぁ、しかたないか...

Advanced Modular Development [CON3711]

引き続き Jigsaw のセッション。スピーカーは前半が Alex Buckley で、後半が Alan Bateman。Mandy Chung もタイムテーブルには書いてありましたけど、話はせず。でも、会場には姿を見せてました。

資料はこちら

開口一番、Alex がこのセッションは録画しないので、何をしゃべってもだいじょうぶ。何でも質問していいよと。やっぱり Alex や Alan クラスでも、録画されるかどうかで緊張度が変わるもんなんですね ^ ^;;

資料はかなり去年と同じ。

前半が Alex で Automatic Module、後半が Alan でマイグレーションの話。

前半で異なっていたのは Automatic Modle を扱う場合、module の前に weak をつけること。weak module は 9 月になって機能リクエストとしてあがったぐらいで、私もよくわかっていません。

後半は、去年とほぼ同じかな。

2016/09/20

JavaOne 2016 Day 3

このエントリーをはてなブックマークに追加

今日のあさイチのセッションはチュートリアルだと思っていたらハンズオンだったので、自主休講。ちゃんと朝起きたのに...

JavaFX のハンズオンだったのですが、コントロールを自作しようというハンズオン。昨日のセッションの内容ともかなりかぶっていたのでした (はじめに CSS で見栄えを変えて、次にスキンを入れ替えてというようなぐあい)。

かといって、代わりに聴講したいセッションもなかった ><

ということで、今日、聴講したセッションです

  • Modules and Services [CON2949]
  • Connecting Oceans with Project Panama: A Journey into Native [CON1471]
  • Project Jigsaw: Under The Hood [CON2963]
  • Thinking in Parallel [CON5051]

これ以外に、Prepare for JDK 9 もセッション登録していたのですが、どうやら Jigsaw 関連はあまりアップデートがなさそうということが分かったので、こちらも自主休講。

また、今日は 19 時から Duke Cafe で Duke's Choice Awards の表彰があるので、BOF も勝手にお休み。

というのも、HeapStats が Duke's Choice Awards を受賞したからなのです。

おめでとう!!

そんなこんなで、今日は少なめ。

Modules and Services [CON2949]

スピーカーはおなじみの Alex Buckley。

このセッション、何がビックリしたって、Alex がすごい痩せていたのがビックリですよ。

去年まではすごい太っていて、それじゃ膝がつらいのではと思ったぐらいだったのが、今年はかなりスリムになってます。

これが、今年一番のサプライズかもw

Project Jigsaw 関連のセッションは去年とセッションタイトルが同じものが多いのですが、このセッションだけは去年はなかったのです。セッション資料はこちら

このセッションでは、今まで ServiceLoader でロードしていたサービスを Project Jigsaw でどうやれば実現できるかということを説明してます。でも、ほとんど既知のことでした。 このセッションで説明したことのほとんどは、ITpro の Java SE 9、Project Jigsawにおけるpublicに書いたので、そちらをご覧ください。

簡単にいうと、インタフェースを定義するモジュールでは、module-info.java に use 文を使ってインタフェースを記述します。そして、実装クラスを提供するモジュールでは、module-info.java に provides 文で実装クラスを記述します。

その他に、Unnamed module (いわゆるモジュールではない JAR ファイルです) に依存した場合などについても説明してましたが、それほど使うこともないと思います。

Connecting Oceans with Project Panama: A Journey into Native [CON1471]

数少ない Project Panama のセッション。スピーカーは Oracle の Mikael Vidstedt と Henry Jen。

Panama は 2 つの側面があって、Vector API に代表されるヒープのレイアウトと、ネイティブコードをコールするための JNR と JFFI の組み合わせです。後者は JNI の置き換えをはかっています。

で、このセッションは後者の方。特に JFFI (Java Foreign Function Interface) に関して。

JNR と JFFI は、JNR が Java からネイティブコードをコールするためのフレームワークで、JNR が実際にネイティブコードとやりとりする部分を JFFI で実現しています。

でも、よくわからないんですよね、このセッション。

JNR の話がまったく出てこなくて、JNR との切り分けが全然わからないのです。というか、JNR って亡きものされてしまった?

JNR は JRuby の Charles Nutter がメインになっているのですが、今年は Charles は JNR のセッションやらないので、よくわからないままです。

ま、それはおいておいて、このセッションです。

JNI でネイティブコードをコールするにはいろいろと手順が必要でした。ターゲットする API の Java のラッパを作成し、javah を使ってヘッダファイルを作って、C 側で再びターゲット API をコールする部分を作成し、やっとコールすることができます。

JNI って Java で足りないものを C で作る的な立場で作られているので、既存のネイティブライブラリをコールするには無駄が多かったわけです。

これに対して、JFFI はネイティブライブラリ側の API に合わせて、Java へのバインディングコードを作成できます。そのためのツールが Groveler ツールの jextract。

Groveler という単語、聞いたことがなかったのですが、grovel が「はらばう」とか「ひれ伏す」で、groveler が「こびへつらう人」になっていて、あんまりいい意味じゃなのです。なんでこんな単語使うのだろう。

jextract を使うと、ターゲット API のヘッダファイルから Java のインタフェースと実装クラスを作成してくれます。そこでは C の int から Java の int へなどのデータの変換なども行ってくれるようです。

ここで定義されたメソッドをコールするには、まずネイティブライブラリとバインディングを行います。

NativeLibrary クラスの loadLibrary メソッドでロードし、bindRay メソッドもしくは bind メソッドでバインドします。あとはバインドでえられたオブジェクトのメソッドをコールするだけ。簡単そう。

もちろん、相手はネイティブコードなので、ポインターやメモリアクセス、そのスコープなどをちゃんと決めないといけません。そこらへんも JFFI ではある程度やってくれそうです。

現状では Linux/x64 でプロトタイプが動いているようです。

Project Jigsaw: Under The Hood [CON2963]

Project Jigsaw の Under the Hood ですが、今年は Under the Hood セッションが多すぎ。なんと 8 セッションもありました。みんな、Under the Hood 好きだよねぇww

このセッションのスピーカーは、今日 2 回目の Alex Buckley。今年の Jigsaw セッションも Alex Buckley と Alan Bateman が分担しています。

ちなみに、この前の Prepare for JDK 9 はやっぱり内容は去年と同じようだったらしいです。で、このセッションも内容的には去年とあまり変わらず。Under the Hood なんだから、もうちょっと深いところまで説明してほしいんだけどなぁ。

セッション資料はこちら

はじめにアクセシビリティの話。やっと昨日の exports private の謎がとけました。

requires 文と exports 文の仕様が一部変更されたようです。

変更されたのが exports private 文と requires transitive 文です。

exports 文で公開されたパッケージの private メソッドやフィールドに対して、リフレクションの setAccesibility(true) メソッドをコールすると実行時例外が発生します。

これに対して exports private 文では setAccesibility(true) をコールしても例外になりません。

requires transitive 文は以前は requires public と記述していたものです。

つまり、requires transitive は依存しているモジュールで公開されているパッケージを、そのモジュールでも公開できるようにするために使用します。

その他にセッションでは出てこなかったのですが、コンパイル時だけにモジュールを使用する場合 requires static を使用します。

さっそく、bitter_fox さんがこれらを blog にまとめてくれました。すごい!

さて、セッションでは次に Unnamed Module と、クラスローダについて説明したのですが、これは去年とほぼ同じ。でも、もうちょっと詳しく説明してほしいところです。

特に bootclasspath が使えなくなった代わりにどうすればいいかとか、Automatic Module あたりはちゃんと説明してほしい。Automatic Module は資料にはありますけど、あれじゃ全然わからないです。

自分で解明するしかないか....

Thinking in Parallel [CON5051]

今日聴講したセッションの中で一番おもしろかったセッション。スピーカーは Stuart Marks と Brian Goetz。

Mr. Deprecator こと Stuart はやっぱり話がおもしろい!!

それにしても、Stuart は髪の毛が白くなったなぁ。去年よりも一段と白くなっていました。Dr. Deprecator としての心労がいろいろあるのかなぁ。

このセッション、パラレル処理関係の新しい機能の紹介は... まったくありません。でも、おもしろい。資料はこちら

セッションは前半と後半に分かれていて、前半が Stuart、後半が Brian になっています。

前半では、for 文と Stream を比較して、なぜ Stream を使うべきなのかのサンプルを使って説明。

for 文は長く使ってきているし、表現が直接的で、効率的だといわれているかもしれませんが、それらはみんな間違っていると。そして、Stream を使うのは新しくてクールだからというわけでもないと。

Stream が優れているのは、より高い抽象度で問題を表しているからだといいます。また、パラレル処理ができるからというのは理由ではないといいます。

パラレル処理ができるのは良いコードを書いたボーナスのようなものだと。

次にもうちょっと複雑なサンプル。これは stackoverflow にあった質問をベースにしているらしいです (資料の URL は間違っているっぽいです。リンクは正しいものにしてあります)。

問題はリストに入っている文字列を区切り文字で切り分けて、リストのリストにするというものです。

[a, b, #, c, #, d, e] に対して、# でリストを区切って、[[a, b], [c], [d, e]] というようにします。

この問題、意外に Stream だけではやりにくいんですよね。Stuart が例としてあげたコードも、個人的には納得がいきません。そのコードがこちら。

 

<T> List<List<T>> split(List<T> input, Predicate<T> pred) {
    int[] edges = IntStream.range(-1, input.size() + 1)
                           .filter((i -> i == -1 || i == input.size() || pred.test(input.get(i))))
                           .toArray();

    return IntStream.range(0, edges.length - 1)
                    .mapToObj(k -> input.subList(edges[k]+1, edges[k+1]))
                    .collect(Collectors.toList());
}

さて、ここから Brian のターン。

Brian はなんでもかんでもパラレルでやるべきではないといいます。パラレルはあくまでも最適化の手法の 1 つであり、そのためには正しく効果の計測をしなくてはいけないといいます。

そして、分割統治の説明を行い、最終的に値をまとめるマージの処理が重要であることも説明しました。

パラレルにするかどうかは、NQ モデルという単純な指標があります。N がデータの要素数、Q が 1 つに要素にかかる処理量です。そして、 NQ > 10,000 にならないとパラレルにしてもパフォーマンスが上がらないといいます。

この関係は私の経験ともかなり重なります。

最後にまとめとして、もう一度パラレルは最適化にすぎないと繰り返しています。そうなんですよね、なにからなにまで全部パラレルというのは考えにくいですし。

ちなみに、質問で I/O がある場合はどうすればいいのかとありましたが、このセッションで議論しているのはコンピュテーションだけなので、I/O が入るとまた違った議論になります。I/O が入ると、待ち時間などの問題が大きくなりますし、別な問題として扱う方がいいですね。

Duke's Choice Awards

今日は、夜の 7 時から Duke Cafe で Duke's Choice Awards の表彰式。

その前に、Null Pointers のライブ。Null Pointers はかなりメンバ入れ替わってます。去年、飛び入り参加していたボーカルの女性も今年は正式メンバになったもようw

びっくりしたのが、Jim Weaver がギター弾いていたこと。Jim さん、Oracle やめてからも、Java 続けているらしいです。

さて、表彰ですが、Sharat と Georges が Duke のトロフィーを渡して、記念写真を撮るだけのあっさりしたもの。トロフィーもその場で渡さずに、後で取りに行くようです。

Duke's Choice Awards はカテゴリーに分かれているのですが、HeapStats は Tool 部門でした。おめでとう。受賞者一覧はこちら

それにしても、ちゃんとトロフィー受け取れたのかなぁ?

2016/09/19

JavaOne 2016 Day 2

このエントリーをはてなブックマークに追加

JavaOne は iOS と Andoroid 向けの公式アプリがあるのですが、私の iPhone ではまったく動いてくれません >< 動いていても、Web から登録したセッション情報を同期できないなど、できが悪すぎ。

よっぽど、Gluon が JavaFX で作ったアプリの方がサクサク動いてます。セッションの登録情報を表示できれば、Oracle のアプリは使わないんだけどなぁ。

というわけで、今日聴講したセッションです。

  • Adventures with Extreme Types in a Purely Functional Language [TUT1288]
  • JDK 9 Language, Tooling, and Library Features [CON2497]
  • JavaFX: New and Noteworthy [CON2483]
  • A Survey of Memory Footprint Optimizations in Java SE and Java HotSpot VM [CON1938]
  • Introduction to Troubleshooting in JDK 9: Serviceability Tools Are Your Friends [CON3733]
  • Building JavaFX UI Controls [CON2476]
  • Tools for High-Performance Polyglot Programming on the JVM [BOF4837]

今日はかなりマジメにセッション出てました。マジメにセッション出ると、ランチが食べられないというジレンマがあるわけですが、朝ご飯いっぱい食べたので大丈夫です。

Adventures with Extreme Types in a Purely Functional Language [TUT1288]

型の話といいつつ、関数型プログラミングの話。スピーカーは Canoo の Dierk Koenig。

この人、話し方も柔らかいし、発音がはっきりしているので、とても聞きやすい。まだ英語慣れしていないので、聞くのが楽でした。

Extream Type というのは特殊な方ではなくて、immutable value とか pure function とか constraint context などを加えた型についてだそうです。なんで型でを考えるかというと、No Silly Error とか Safe Refactoring とか Less Tricky Error とか Abstraction などの理由から。

Extream Type を使うと、暗黙的な制約を明示的にできます。コードで制約を書くのではなく、型で制約を与える方がいいということなのでしょう。型であれば、まちがいがあってもコンパイル時に分かりますからね。

現在の Java であれば、Stream や JavaFX の一部で Extream Type が使われています。

さて、はじめのサンプルとして、以下のプログラムが示されました。

 

import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
import java.util.stream.Stream;

public class RNG {
    static Supplier<Integer> countGen(AtomicInteger i) {
        return (() -> i.getAndIncrement());
    }

    public static void main(String... args) {
        final Supplier<Integer> numbers = countGen(new AtomicInteger(1));
        final Optional<Integer> sum = Stream.generate(numbers)
            .limit(100)
//            .parallel()
            .map(a -> a^2)
            .reduce((a, b) -> a + b);
        System.out.println("sum = " + sum);
    }
}

このプログラム、parallel メソッドのコメントを外すと正しい値になりません。問題は countGen メソッドで作成している Supplier オブジェクトです。Supplier インタフェースは関数型インタフェースなので、あたかも関数のように扱えます。しかし、ここでは countGen メソッドの引数になっている AtomicInteger オブジェクトに依存してしまっています。

つまり、Supplier オブジェクトは純粋関数としては扱えません。純粋な関数だけでプログラミングをしましょというのが、Koenig さんの主張。

そこで、例として取り上げられたのが、Online REPL の try.frege-lang.org です。frege では、ブラウザ上で Haskell の REPL を実行することができます。

その後、関数合成などの関数を用いたプログラミングの説明がされました。

ちなみに、frege は Haskell のコードを Java のコードに変換して、コンパイルしているようです。これもなかなかおもしろそう。

最後に Fizzbuzz を frege で書くのを紹介されたのですが、なかなかおもしろい。でも、Java の Stream には zip がないから難しいなぁ... と思っていたら、隣に座っていた @bitter_fox さんがさっそく Java で書き直してました。もちろん、zip も作ってあります。それが、こちら

さすが、OpenJDK コミッタともなると、やることが早い!

JDK 9 Language, Tooling, and Library Features [CON2497]

Java SE 9 の言語仕様の変更や、ツール類の説明セッション。スピーカーは Joe Darcy です。

Joe はいつもの赤シャツ。Joe は Project Coin のリードだったことからも分かるように、言語仕様の取りまとめを行っている重鎮です。

Joe のセッションではおなじみなのですが、最初に言語仕様を変えるのは大変という話。Java 9 でもバイナリーコンパチが崩れる部分があるようです。

たとえば、AWT の peer が使えなくなるようなのですが、これは AWT 使っている人には結構いたいのじゃないかなぁ。

ツール関係でまず紹介したのが、jshell。Java の REPL です。昨日のキーノートでもやってましたね。

そして、Javadoc 関連。HMLT 5 に対応したり、検索が使えるようになるなど、いろいろ変更されてます。ちなみに、検索はクライアントだけで実行しているので、サーバーはいらいようです。

次に紹介したのが、javac で違うバージョンのソースをコンパイルすること。今までは -target -source そして -bootclasspath を指定しなくてはいけなかったのですが、新たに -release というオプションが導入されました。

-release N と記述した場合、-target N -source N -bootclasspath rtN.jar に相当するそうです。

そして、言語仕様。

まずは Project Coin。Java 7 で導入された Coin ですが、Java 9 でも言語仕様の変更を Coin で行っています。

@SafeVarargs の変更や、try with resources で final もしくは effectively final であれば、try ブロックの外側で記述できるようになったりしています。

また、ダイヤモンド演算子がやっと匿名クラスでも使えるようになりました!

さらに Java 8 で予告されていた、_ を 1 文字でメソッド引数に使用できないようになっています。Java 8 ではラムダ式では使えなかったのですが、Java 9 ではすべてのメソッドでコンパイルエラーになります。

@Deprecated もいろいろ変化しています。@Deprecated に関しては Dr. Deprecator こと Stuart Marks のセッションもありますが、とってないんですよね ^ ^;;; 後で資料をチェックしないと。

その他に、ダイヤモンド演算子やラムダ式で使う型推論を入れ子で使用するとコンパイル時間が長くなる問題があったのですが、それもかなり解消されたようです。

また、コレクションにファクトリメソッドの of が追加されています。Arrays.asList メソッドと同じように変更不可のコレクションを作成できます。

Java 9 は大きい変更は Project Jigsaw だけですが、細かい部分はいろいろと変わっているので、ぜひ資料をチェックしてみてください。

JavaFX: New and Noteworthy [CON2483]

JavaFX のロードマップ的なセッション。今年も、Kevin Rushforth と Jonathan Giles がスピーカー。

このセッション、去年と内容があまり変わっていないのです。なんか、残念。

JavaFX 9 での一番の変更は Jigsaw 対応。特に今まで公開していなかった skin 関連の API を公開するように変更することによって、いろいろ変わっていると (JEP 253)。

ちなみに、Jigsaw 対応の中で exports private というキーワードが出ていたけど、後で Jigsaw のセッションで確認します。

それと、今まで使用できていた impl_* のメソッドは全部使えなくなります。まぁ、しかたないか。ハックするときは impl_* から辿ることが多かったので、ちょっと残念なのですが ^ ^;;

それ以外の機能としては Hi DPI 対応。Mac はすでに対応済み、Windows では部分的に対応されていましたが、Linux でも Hi DPI をサポートします。これ以外にも小さな変更があるようですが、小さいんですよね。

去年のセッションでは Java 9 のリリース時期が伸びたからもうちょっと機能を追加できるかもといっていたのですが、あまり追加できなかったようです。

さて、Java 9 以降の話をちょっとだけ。

まだ計画段階なので、実際にどうなるかわからないですけど、たとえば AWT を必要としなくなるなどの変更を計画しているようです。でも、大きな変更はあまりないような気が... シェーダーはやっぱり入れてくれないのかなぁ....

A Survey of Memory Footprint Optimizations in Java SE and Java HotSpot VM [CON1938]

JVM のメモリ関連のまとめ的なセッション。でも、GC については触れないのです。スピーカーは Charlie Hunt。

Charlie は Salesforth に転職していたのですが、また Oracle に復職していました。全然知りませんでしたよ。

ちなみに、最近 Charlie は共著で Java Perfomance Companion という本を出しています。G1GC のチューニングに関してかなり書かれているので、G1GC を使うのであれば、必読ではないかと思います。

さて、なぜメモリのフットプリントが大事なのかということからセッションは始まりました。メモリは CPU に比べるとパフォーマンスが向上していません。このため、CPU やネットワークとのギャップがどんどん開いてしまっているわけです。

このため、キャッシュやメインメモリのフットプリントがダイレクトにパフォーマンスに直結することになっているわけです。

さて、メモリを調べるには、いくつかの方法があります。Java のヒープであれば、jmap や Mission Control のプラグインである JOverflow が使用できます。

次に、Java のヒープを削減するために取り入れられた手法の紹介。

たとえば、Java 6 で導入された Compressed Ordinary Object Pointer。多くのオブジェクトに対するポインターを効率よく表すために、64bit を使用せずに、もっと少ないビット数で表す手法です。

また、Java 8 で導入された Metadata やアプリケーションのクラスデータの共有なども。

Java 9 ではアスキー文字を 16bit を使わずに 7 bit で表す Compact String が導入されます。

最後に WebLogic のリソースマネージメントの説明があったのですが、よくわかりません。メモリ使用量がかなり減るらしいですよ。

Introduction to Troubleshooting in JDK 9: Serviceability Tools Are Your Friends [CON3733]

久保田さん、末永さん、高尾さんのセッション。去年は BOF だったのですが、今年はカンファレンスセッションに格上げです。

この 3 人のセッションなのですから HeapStats の紹介セッションなのかと思ったら、それほど HeapStats には触れず。なんかもったいない。

jcmd と jhsdb と HeapStats の 3 本立て。でも、トピックがありすぎて、焦点がちょっとぼけちゃったかな。単にコマンドの紹介だけのようになってしまった感じです。

とはいえ、久保田さんは去年に比べればかなり落ち着いてしゃべってましたね。

Building JavaFX UI Controls [CON2476]

JavaFX で部品を作る話。スピーカーは Jonathan Giles。

開口一番、このセッションは 2014 年にやったけど、Java 8 や 9 のアップデートを加えてあるよと。でも、あまり変わらなかった。そりゃそうか。

このセッションでは JavaOne ボタンを以下の 4 種類の方法で作成していきます。ソースコードは Bitbucket で公開されてます。

  1. 既存のコントロールを CSS でカスタマイズ
  2. 既存のコントロールのスキンを置き換え
  3. 既存のコントロールを組み合わせて新しいコントロールを作成
  4. Control クラスを派生させて新しいコントロールを作成

数字の若い方が簡便な方法です。

でも、作るとしたら、結局は 3 か 4 だろうな。

Tools for High-Performance Polyglot Programming on the JVM [BOF4837]

複数の言語を Java プラットフォームで扱いやすくする Graal VM のセッション。スピーカーは OpenJDK の Graal Project のリードの Michael Van de Vanter。

Graal VM は JVM Compiler Interface 上に Graal コンパイラを作成し、動的にコンパイルすることができます。

このセッションでは NetBeans 上で Graal 使ってデモしてました。デモでは、NetBeans 上で Java のコードと Ruby のコードを示し、Ruby のコードでもデバッガでトレースできることを示してました。デバッガは Truffle とよばれているものです。

パフォーマンスも Ruby ではかなり向上しているようす。Scala などはあまり変わらないようでしたが。

Graal コンパイラでは Instrumentation を使用して、AST を操作して最適化や部分評価を行っているようです。なかなかおもしろい。こういう話が効けるのが、JavaOne の醍醐味の 1 つですね。

おまけ

去年の JavaOne では、セッションのアンケートの代わりに、赤黄青を入力できる JavaFX のアンケートマシンが使われていました。

今年はそのアンケートマシンがパワーアップ。画面が大きくなってます。でも、裏を見ると、やっぱり Raspberry Pi。でも、去年のむき出し状態とはことなり、ちゃんとケースに入ってましたよ。

というか、画面が大きくなったことと、ケースに入ったことぐらいしか違いはないわけです。

やるんだったら、もうちょっと新しいことをやればいいのに。

2016/09/18

JavaOne 2016 Day 1

このエントリーをはてなブックマークに追加

今年も JavaOne の季節がやってきました。

直前になって、Java SE 9 のリリース延期が提案されていたりして、あんまり期待はできないのですが、実際のところは....

さて、今日はコミュニティが主催しているセッションとキーノートです。とはいえ、はっきりいってコミュニティ主催のセッションはクオリティが低い。審査も何もないし、しかたないとは思うんですけどね。

それでも、1 つだけセッションをとってみました。ということで、今日聴講したのはこちら。

  • UGF7875 Refactoring Your Code with Java 8: Functional Programming to the Rescue
  • KEY7967 Java Keynote

UGF7875 は朝 8 時のセッション。早すぎ!

UGF7875 Refactoring Your Code with Java 8: Functional Programming to the Rescue

なぜ、このセッションに出ようと思ったかというと、関ジャバ会長の @jyukutyo がスピーカーだから。

メインのスピーカーは Red Hat の Eder Ignatowicz。Red Hat といっても US のではなくて、ブラジルの Red Hat だそうです。

で、朝の 8 時前に会場の Moscone Center にいってみたら..... @jyuktyo が見当たらない!!

結局、@jyukutyo なしでセッションは進んでしまいました。

内容的にはデザインパターンと関数を使ってモダンなコード書こうねという内容。Template Pattern など関数を使いやすいパターンがあるので、そういうのに組み合わせていこうというものでした。

まぁ、取り立てて言うことはないです。

後から @jyukutyo に聞いてみたら、寝坊したらしいですww

ちなみに、今日は JJUG 会長もスピーカーに名を連ねていたのですが、そちらは壇上にはいたらしいものの、しゃべらず。

日本の 2 大 JUG の会長がスピーカーに名を連ねるものの一言も話をしなかったということは、日本の Java の歴史に確実に刻まれることでしょうww

KEY7967 Java Keynote

メインは火星でした。以上。

ということで終わらせることはできないですよね ^ ^;;

それにしても新味に欠けるキーノートでした。Oracle 前に Intel のキーノートがあったのですが、よっぽどそっちの方がちゃんとしてましたよ。

予算がないのは分かるけど、もうちょっと工夫しようよ。

詳しい内容はまた後で写真と共に追加します。

Java SE のパートはいつもの Mark Reinhold。

彼が紹介したのは Project Kulla と Project Jigsaw。

Kulla は Java で REPL を実現する jshell を提供しています。で、jshell のデモをしようとするのですが、画面がなかなか切り替わらずにイライラする Mark。

REPL だからデモは地味だよね。でも、しかたない。

で、そのまま Jigsaw へ。Jigsaw の機能も jshell で紹介します。

ところが、画面の縦横比があってなくて、スクリーンの右側が見切れてしまっていました。Mark がスタッフにどうにかしてくれというのですが、誰も出てこないし、誰も直そうとしない。

イライラした Mark は舞台裏に戻ってしまいます。まさか、怒って出て行ってしまった?

でも、スタッフとともに戻ってきました。よかった、よかった。

Jigsaw もあまり新しいことはなし。exports private というキーワードが出ていたけど、後で Jigsaw のセッションで確認します。

途中から Brian Goetz が出てきて、Project Valhalla と Project Panama の話。ここも去年とほとんど変わらず。唯一、var がさらっと紹介されていましたww

Java EE もあれだけ Guardian に責められていたのに、これでいいのという内容。まぁ、久しぶりに Garr さんが技術の話をしてましたけど。結局、まだ何も決まっていないんだろうなぁ。その割には 2017 年に Java EE 8、2018 年に Java EE 9 をリリースするというのは、誰も信じてないと思います。

最後にデモをやろうとしたのですが、時間切れで終了。Larry のキーノートが次に控えているので、時間厳守です。

個人的には、Java EE は役目が終わったと思うのですが、どうなんでしょうね。