今日のあさイチのセッションはチュートリアルだと思っていたらハンズオンだったので、自主休講。ちゃんと朝起きたのに...
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 部門でした。おめでとう。受賞者一覧はこちら。
それにしても、ちゃんとトロフィー受け取れたのかなぁ?