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 部門でした。おめでとう。受賞者一覧はこちら

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