2015/12/13

JRE をカスタマイズ - jlink

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

この記事は、Java Advent Calendar 2015 の 13 日目の記事です。

昨日は @cero_t さんのStream APIをつくろう でした。明日は opengl_8080 さんです。

 

JavaOne にいってから、Project Jigsaw で遊ぶことが多くなりました。で、モジュールを作った後の話を紹介します。ちょうど、JavaFX in the Box の方の このエントリー の後の話題のようなものです。

このエントリーでは JavaFX のサンプルのモジュールの依存性を調べたのですが、せっかく依存性を調べたのですから、モジュールを作ってみましょう。

サンプルはこれです。

package fxdemo;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class FXDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Label label = new Label("Label");
        label.setFont(Font.font(24));
        
        StackPane root = new StackPane(label);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("FXDemo");
        stage.show();
    }
    
    public static void main(String... args) {
        launch(args);
    }
}

このサンプルが依存しているのは、java.base モジュール、javafx.controls モジュール、そして javafx.graphics モジュールです。ですので、module-info.java は次のようにしました。

module fxdemo {
    requires javafx.controls;
    requires javafx.graphics;
}

では、コンパイルして、モジュールを作ってみましょう。ソースは src ディレクトリ、クラスは bin ディレクトリ、モジュールは mods ディレクトリに置くとしましょう。

C:\fxdemo>javac -d bin src\module-info.java src\fxdemo\FXDemo.java

C:\fxdemo>jar --create --file mods\fxdemo.jar --module-version 1.0 -C bin .

これで、モジュールができました。JAR ファイルなので、これだけだとモジュールかどうかよく分からないのが玉にキズ。

では、実行してみましょう。

C:\fxdemo>java -mp mods -m fxdemo/fxdemo.FXDemo
Exception in Application constructor
Exception in thread "main" java.lang.RuntimeException: Unable to construct Appli
cation instance: class fxdemo.FXDemo
        at com.sun.javafx.application.LauncherImpl.launchApplication1(javafx.gra
phics@9-ea/LauncherImpl.java:926)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$138(
javafx.graphics@9-ea/LauncherImpl.java:220)
        at java.lang.Thread.run(java.base@9-ea/Thread.java:747)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.La
uncherImpl (in module javafx.graphics) cannot access class fxdemo.FXDemo (in mod
ule fxdemo) because module fxdemo does not export fxdemo to module javafx.graphi
cs
        at sun.reflect.Reflection.throwIllegalAccessException(java.base@9-ea/Ref
lection.java:452)
        at sun.reflect.Reflection.ensureMemberAccess(java.base@9-ea/Reflection.j
ava:135)
        at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(java.base@9-
ea/AccessibleObject.java:370)
        at java.lang.reflect.AccessibleObject.checkAccess(java.base@9-ea/Accessi
bleObject.java:362)
        at java.lang.reflect.Constructor.newInstance(java.base@9-ea/Constructor.
java:435)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$144
(javafx.graphics@9-ea/LauncherImpl.java:838)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$158(javafx.
graphics@9-ea/PlatformImpl.java:351)
        at com.sun.javafx.application.PlatformImpl.lambda$null$156(javafx.graphi
cs@9-ea/PlatformImpl.java:320)
        at java.security.AccessController.doPrivileged(java.base@9-ea/Native Met
hod)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$157(javafx.gr
aphics@9-ea/PlatformImpl.java:319)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(javafx.graphics@9-e
a/InvokeLaterDispatcher.java:96)
        at com.sun.glass.ui.win.WinApplication._runLoop(javafx.graphics@9-ea/Nat
ive Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$130(javafx.graphics@9
-ea/WinApplication.java:191)
        ... 1 more

C:\fxdemo>

あれ、動かない。

まぁ、理由は簡単で、module-info.java に exports の項を書かなかったためです。このサンプルは外部から使うわけではないと思ったわけですが、実行するということは main メソッドを外部から呼ぶことになるため、exports が書いてないと実行できないのです。

ということで、module-info.java を次のように書きかえました。

module fxdemo {
    requires javafx.controls;
    requires javafx.graphics;

    exports fxdemo;
}

これで、同じようにコンパイルして、モジュールを作ったら、無事に実行できました。

Jigsaw で実行する場合は、-modulepath もしくは -mp でモジュールがおいてあるディレクトリを指定し、-m でメインクラスを指定します。この時、[モジュール名]/[クラス名] のようにモジュールとクラス名を / で区切って併記するようにします。

さて、これでモジュールができたので、次にこのサンプルのモジュールと最小限のモジュールを含む JRE を作ってみましょう。

それをやるには jlink コマンドを使用します。

C:\fxdemo>jlink --modulepath mods;"c:\Program Files\Java\jdk-9\jmods" --addmods
fxdemo --output fxdemo

オプションはだいたい分かると思いますが、--modulepath でモジュールのディレクトリを指定します。サンプルのモジュールだけでなく、JDK のモジュールの場所も指定しておきます。--addmods が追加するモジュールです。javafx.controls モジュールなどを追加しないのは、依存性の記述から勝手にやってくれるからです。

そして、fxdemo ディレクトリにイメージを作成します。このディレクトリには bin、conf、lib のディレクトリを作成します。

bin ディレクトリには java コマンドがあるので、どういうモジュールがあるか調べてみましょう。

C:\fxdemo\fxdemo\bin>java -listmods
fxdemo@1.0
java.base@9-ea
java.datatransfer@9-ea
java.desktop@9-ea
java.instrument@9-ea
java.logging@9-ea
java.management@9-ea
java.naming@9-ea
java.prefs@9-ea
java.rmi@9-ea
java.security.sasl@9-ea
java.xml@9-ea
javafx.base@9-ea
javafx.controls@9-ea
javafx.graphics@9-ea
jdk.jfr@9-ea
jdk.vm.ci@9-ea

javafx.controls モジュールなどの依存性も解決することで、必要最低限のモジュールを導入した JRE を作成することができました!

2015/11/20

現場で使える[最新]Java SE 7/8 速攻入門

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

Java に関する本をはじめて書きました!

内容は Java SE 7 と Java SE 8 の主要な新機能である以下のトピックだけに特化して紹介した本です。

  • Project Coin
  • NIO.2
  • Project Lambda
  • Date and Time API

今まで続けてきた ITpro の連載の中から、Java SE 7 と Java SE 8 のトピックをまとめたような内容ですが、実際にはすべて書き下ろしです。

でも、連載と掛け持ちしていたり、講演などをしていたりすると、すぐにスケジュールが遅延してしまって... 当初の予定だと去年の今ごろ出版されていたはずなんですが ^ ^;;;

ほんとうに編集の方にはご迷惑をおかけしました。

たまたまなのですが、ITpro の連載が 5 月に終わったので、その後はかなり集中して書くことができました。

とはいうものの、JavaOne に旅立つ成田空港でもまだ校正をやっていたりと、ほんとにギリギリまであがいていました。徹夜して飛行機に乗って、サンフランシスコ着いたら体調悪化して寝込んだりしてました。飛行機の中では爆睡していたんですけど、寄る年波には勝てないです。

まぁ、それでも無事に出版することができてほんとよかったです。

Java SE 8までカバーしている本は何冊かあると思いますが、Project Lambda についてここまで書いた本は他にはないと自負しております。

今まで、いろいろなところで Project Lambda の講演やハンズオンをやってきました。参加された方たちからは、その場ではなんとなく分かったような気になっても、いざ自分でラムダ式や Stream API を使って書くという時には困難さを感じていたというようなことを聞いています。この本によって少しでもラムダ式や Stream API を使うためのハードルが下がってくれれば幸いです。

もちろん、他の Coin や NIO.2、Date and Time API も参考になるはずです。

ぜひ書店でお手にしていただいて、とりあえずはパラパラとめくっていただければ思います。もちろん、Kindle や Kobo、PDF などの電子書籍版もあります。

 

ちなみに、発売前にタイポがすでに見つかっています。技術評論社のサイトに正誤表がありますので、ぜひそちらをご参照ください。

サポートページ

また、タイポや間違いなどがありましたら、技術評論社もしくは櫻庭までご報告いただければ幸いです。

 

とうぶん、本を書くことはないと思いますが、次は JavaFX の本にしたいなぁ... 需要があるかどうか微妙なのですけどね。

2015/10/28

Mazarine Coffee

このエントリーをはてなブックマークに追加
Mazarine Coffee, San Francico

奇跡的に早く起きられたので、最近できた Mazarine Coffee にいってみました。

なかなかいい雰囲気の内装で、落ち着いた感じ。

グラノラ (なぜかヨーグルトパフェになっtましたけど)とクロワッサン。それにラテ。

パンは提携したパン屋さんから提供されているようですけど、なかなかおいしい。こういうクロワッサンを普通のカフェでも食べられるようになったのは、ほんとうれしい。

でも、後から Fig & Ricotta Toast という魅力的なメニューを見つけてしまった。今、SF ではトースト流行っているんだよなぁ。次回はこれたべよう!!

Mazarine Coffee, San Francico
Mazarine Coffee, San Francico

Latte, Mazarine Coffee, San Francico
Croissant, Mazarine Coffee, San Francico
Yogurt Parfait, Mazarine Coffee, San Francico

JavaOne 2015 San Francisco 4 日目

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

昨日の夜から雨が降っていて、朝もまだパラパラしてたのですが、朝ご飯を食べ終わって店を出たら虹が出てました。

さて、今日は Appreciation Event で Elton John と Beck のライブがあるので、セッションは少なめ。

  • CON7823 jshell: The New Interactive Java Language Shell for JDK 9
  • CON2709 The New HTTP Client API, Including HTTP/2 and WebSocket
  • CON7432 New Trics for Old Dogs: Collections Enhancements in Java 8
  • CON5118 Introduction to Modular Development
  • CON6936 Understanding Java Garbage Collection
  • CON1667 Effective Exceptions and Java 8 Streams

GC のセッションは初心者向けであまりおもしろくありませんでした。スピーカーの Gil Tene は Azure の人なので、Azure ならではの話が聞けると思ったのですが...

CON7823 jshell: The New Interactive Java Language Shell for JDK 9

Robert Field, CON7823 jshell: The New Interactive Java Language Shell for JDK 9, Including HTTP/2 and WebSocket, JavaOne 2015 San Francisco

Java にとうとう REPL が導入されることになったわけです。それが jshell。

個人的には、そんなにうれしくないのですが、ちょっと試してみたいとか教育目的にはいいかもしれません。ついでですが、@bitter_fox くんは OpenJDK の jshell プロジェクトのコミッタです。

スピーカーは、その jshell プロジェクトのリードの Robert Field。セッション中に @bitter_fox くんもコミッタとして紹介されていました!

jshell がどういうツールかという説明はあるのですが、なぜ今 REPL なのかなどの背景などはあまり説明がなく... 本当はこういうところが重要なんですけどねぇ。

まぁ、その代りデモはいっぱいやってくれましたけど。

jshell で書くのは Java のスニペットで、クラスなどをちゃんと書く必要はありません。スクリプト言語的に記述ができるわけです。もちろん、クラスを書くこともできますけど。

jshell の組み込みコマンドは /help で一覧が表示されます。リストを表示するとか、保存するとか、定義したメソッドの一覧を表示することなどができるようです。

実装がなかなかおもしろそう。コードのスニペットだとしても、それを補ってクラスにしてしまい、その都度コンパイルと実行を行っているようです。この法式だとパフォーマンスは悪くなりますけど、REPL でパフォーマンスのことをいってもしかたないですね。

ちょっとした用途には、いいかも。

CON2709 The New HTTP Client API, Including HTTP/2 and WebSocket

Michael Mcmahon, CON2709 The New HTTP Client API, Including HTTP/2 and WebSocket, JavaOne 2015 San Francisco

因縁の HTTP Client のセッションです。というのも、HTTP Client は Java SE 8 で導入予定だったのですが、スリップしてしまったのでした。当時、期待していたので、スリップは残念だったことを思い出します。

スピーカーは Oracle の Michael McMahon。

前半が HTTP/2 の説明で、後半が API の説明なのですが、一番はじめは CompletableFuture クラスについて。ようするに、新しい HTTP Client は CompletableFuture クラスをベースに作られているということです。

CompletableFuture クラスは処理を関数で表し、メソッドチェーンでつなげていきます。そのおかげで、今までのURLConnectionクラスよりも格段に使いやすそうですし、プロパティなども設定しやすいようです。

WebSocket も同じように使えそう。これは期待が持てるかも。

そういえば、このセッション、珍しくてらださんと一緒でした。

セッションの後、てらださんが「なんであんなめんどうくさいことするんですか。Java EE の WebSocket はアノテーションだけで指定できるのに」というわけです。

こういうところがてらださん、分かってないんだよなぁ。

Java SE は他のエディション、特に Java EE のベースになるエディションなわけです。つまり、Java EE から見たら、下位の API に相当します。

下位の API は上位の API に対して、必要十分な機能を提供しなくてはなりません。設定項目などもすべてちゃんと設定できなくてはならないわけです。それに対し、アノテーションでコードを自動生成する法式だと、上位の API から使いにくくなってしまうわけです。しかも、デバッグもやりにくくなるし。

だからというわけではないと思いますが、Java SE ではほとんどアノテーション使いません。@Override ぐらい。

Java SE と Java EE の立ち位置の違いをちゃんと理解してほしいなぁ > てらださん

CON7432 New Trics for Old Dogs: Collections Enhancements in Java 8

Stuart Marks, CON7432 New Trics for Old Dogs: Collections Enhancements in Java 8, JavaOne 2015 San Francisco

Java SE 8 でのコレクションフレームワークの変更点について。

スピーカーは Oracle の Stuart Marks。

コレクションに関しては、例年、Michael Duigou がスピーカーだったのですが、今回は壇上にはいるものの、話はせず。役割が変わったんですかねぇ。

Stuart は自分の資料にハッシュタグつけて、ツィートしてねというんだけど、あんまりツィートで実況する人はいないんですよね。日本だったら、当たり前のようにやってますけど、海外ではそんなことないのかな?

さて、コレクションですが、Java 8 で大きく変化しました。もちろん、Stream の存在もそうなのですが、それよりも何よりも影響が大きいのがデフォルトメソッドです。

コレクションはインタフェースで定義されているので、おいそれとは機能が追加できなかったのですが、デフォルトメソッドによって機能を追加することができることになりました。そのおかげで、List や Map に新しいメソッドがいっぱい追加されました。特に、Map。

というわけで、デフォルトメソッドで追加されたメソッドを半分以上の時間をかけて説明しています。たとえば、Map の getOrDefault とか putIfAbsent などなど。

後は、コレクションでよく使用する Comparator。Comparator もいっぱいメソッドが追加されています。

最後にちょっとだけ Java 9 の変更について。

ファクトリメソッドの of がコレクションにも追加されます。変更不可でイミュータブルなコレクションを作成できるようなので、Arrays.asList のコレクション版のような感じです。ついでですが、of メソッドでは null は使えません。イミュータブルだったり、null を要素にとれないというのは、安全性や、パラレルで使うことを考えたら当然ですね。

Map にも of メソッドがあって、キーと値を順々に並べていく感じです。これはちょっとわかりにくいような気が。タプルがあればいんですけどね。Map.Entry を生成する entry というメソッドもできるようなので、これを使っても書けます。

Java のコレクションは生成して、値を設定するのがめんどうなので、こういうファクトリメソッドはほんとうれしいです。

CON5118 Introduction to Modular Development

Alan Bateman, CON5118 Introduction to Modular Development, JavaOne 2015 San Francisco

このセッションのスピーカは Alan Bateman。昨日も Alan のセッション受けているし、毎日会っていますww

それにしても、Jisaw のセッションをいろいろ聞いた後に Itroduction を聞くのは、ほんとにセッションの取り方を間違えたとしかいえないです。

JavaOne で聞いていた時は頭のなか疑問符だらけだったのですが、家に帰って整理してやっと理解できた感じ。

基本的なところで、勘違いしていたのが、モジュールは JMOD ファイルだと思っていたこと。去年までは JMOD ファイルだったんですよ。でも、今年は JAR ファイルでモジュールを表せるようになったのでした。

JAR ファイルの説明ばかりして、モジュールはいつ出てくるんだろうと思っていたのですが、そもそもそれが勘違いだったわけです。

でも、去年からの差分では説明してくれないので、全然気が付かなかったわけです ^ ^;;

さて、モジュールは JAR ファイルにモジュールの定義情報を組み合わせたものだということが分かりました。では、そのモジュール定義をどこに書くかということですが、それは module-info.java というファイルに書きます。ここら辺も去年とは変わったところです。というか、元に戻ったというべきか。

module-info.java にはモジュールが依存しているモジュールと、公開するパッケージを記述します。依存性は Maven などと同じような感じ。パッケージはデフォルトでは非公開で、たとえ public なクラスであったとしても、外部からアクセスできないようになります。で、module-info.java に公開する (exports する) と指定したパッケージだけが、外部からアクセスできるようになるわけです。

そして、標準ライブラリもモジュールに分割されます。モジュールはかなり多いです。

実行やコンパイル時は -classpath ではなくて、-modulepath を使用します。-cp とは違って、-mp はディレクトリを指定します。-mp で指定されたディレクトリにあるモジュールのうち、依存性で芋づる式にモジュールをロードしていくようです。

困ったのが jar コマンドのオプションが全然見られないものになっていること。--create とか --file とかになってます。確かに、今までの cfv とかは、UNIX の ar とか tar を使っていない人にはなんのことかさっぱり分からないですから、こっちの方がいいのかも。

最後にちょっとだけ jlink の紹介。これはすでに書いたからいいでしょう。

ということで、やっと分かったような気がする。

CON1667 Effective Exceptions and Java 8 Streams

Benjamin Weber, CON1667 Effective Exceptions and Java 8 Streams, JavaOne 2015 San Francisco

Stream を使っていて困るのが、例外の扱い。そもそも java.util.funtion パッケージの関数型インタフェース群が例外返さないように定義されていることが問題なわけです。もちろん、そうしたのは理由があるわけですが、例外を扱うのが面倒になったのは事実です。

で、このセッションになるわけです。

スピーカは Benjamin Weber。

例外がスローできないといっても、できないのはチェック例外です。なので、よく使われる手としては RuntimeException にくるんで、スローする方法。

でも、メインに紹介したのが Either を使う方法。簡単にいえば、値もしくは例外を保持するコンテナクラスです。Optional の例外版のような感じですかね。

ただちょっと面倒くさいかな。正常に動作した場合を書いていかなくてはいけないんですよね。ここらへんも Optional のめんどうなところと似ています。

2015/10/27

JavaOne 2015 San Francisco 3 日目

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

後半戦スタートです。

だんだんと疲れてきて、今日は朝起きられませんでした。なので、朝ご飯は抜き ><

さて、今日聴講したセッションです。

  • TUT6825 Project Jigsaw Hack Session
  • CON6712 Enhanced Process APIs
  • CON5107 Prepare for JDK 9
  • CON3523 JSR 377: What's Up and What's Next
  • CON1868 Shenandoah: An Ultralow-Pause-Time Garbage Collector for OpenJDK
  • BOF7768 Visualize Log Files for Troubleshooting Java Applications

今日はいろいろと失敗続き。

まず、Jigsaw の Hack Session がチュートリアルなのに、実質 Q&A セッションだったこと。質問できるレベルじゃないんだから、ちゃんとしたチュートリアルにしてほしかった....

次にランチ食べに行っていたら、聞きたいセッションに間に合わなかったこと。Unsafe に関するセッションを聞きたかったんだけど、満員で部屋に入れませんでした。しかも、Java SE 10 に関する話もあったらしい。

今年の JavaOne は Java SE 10 のセッションがぜんぜんないので、Java SE 10 に関する話、特に Project Valhala に関する話題は貴重だったのに....

そして、JSR 377 のセッションで、JSR 377 がまったく進んでいないことがわかったこと。JSR 377 は GUI アプリケーションの標準フレームワークを策定しようとしているのですが、やっぱり難しいのかなぁ....

TUT6825 Project Jigsaw Hack Session

壇上にいるのは Mark Reinhold、Alan Bateman、Manday Chung。

前に書いたように、チュートリアルのくせに Q&A セッションだったこのセッションですが、Alan と Manday がちょっとだけデモをしてくれました。

デモをしたのは、2 つのコマンド、jdeps と jlink です。jdeps が依存性を調べるコマンドで、jlink が JRE のイメージを作るコマンドのようです。

jdeps は JDK 8 にも含まれているのですが、Project Jigsaw 用に拡張されているようです。どのモジュールを必要とするかの一覧を表示することができます。

さらに、依存関係から、依存関係を記述する module-info.java を作成してくれるようです。

そして、jlink は JRE を作ってしまうコマンド。必要なモジュールだけを集めて、JRE を作れるようです。これ、なにげにすごいことかもしれない!

javapackager コマンドと組み合わせれば、アプリケーションの配布も小さくてすむし、かなり便利かも。

Mark Reinhold, TUT6825 Project Jigsaw Hack Session, JavaOne 2015 San Francisco
Mandy Chung and Alan Bateman, TUT6825 Project Jigsaw Hack Session, JavaOne 2015 San Francisco

 

CON6712 Enhanced Process APIs

Roger Riggs, CON6712 Enhanced Process APIs, JavaOne 2015 San Francisco

スピーカーは Roger Riggs。Roger といえば、Date and Time API の Oracle 側の責任者でしたけど、Java SE 9 では Process APIs の担当になったようです。

Process APIs は J2SE 5 で導入されたんですけど、イマイチ使いにくい API でした。もちろん、Runtime#exec メソッドを使うことを考えれば、少しは楽になっていますが...

Runtime#exec メソッドで分かると思いますが、Process API は外部プロセスを制御するための API です。今は Runtime#exec メソッドも内部で Process API を使うようになっています。

それが 10 年以上の歳月の後、変更されることになったわけですが、何が変わったのでしょう。ところが、このセッション、とても不親切で、どこまでが既存のメソッドで、どれが新しい部分なのかさっぱり分からないんですよね。なんだかなぁ....

Process クラスでは onExit メソッドなどが追加されたようです。onExit メソッドの戻り値の型は ComputableFuture クラス。ということは、外部プロセスが終わったら、次に何かするのを簡単に書けるというわけです。onExit メソッドに関してはセッションの後半でいろいろ解説してましたけど、ComputableFuture の使い方的になっていました。

また、ProcessHandle インタフェースが追加されました。MethodHandle のプロセス版だと思えばいいのかな。

そして、プロセスの情報は ProcessHandle インタフェースのサブインタフェースである ProcessHandle.Info インタフェースで取得できます。実行ユーザや、コマンド名、引数、実行時間などが取得できるようです。これらはすべて型が Optional クラス。OS によって取得できるものと取得できないものがあるようです。

最後に紹介していたのが、プロセス間のパイプ。今までプロセスの出力を、他のプロセスの入力に直接パイプで流し込むことができなかったのですが、それもできるようになるようです。でも、イマイチよく分からん。

そういえば、このセッションに I18N チームの佐藤さんが聞きに来ていました。I18N チームも Rogger が所属する Core Library グループに含まれることにことになったようです。

CON5107 Prepare for JDK 9

再び、Project Jigsaw 関連のセッション。スピーカーは Alan Bateman ですけど、Mark と Manday も壇上に上がってます。途中から Alex も。

このセッションでは Java SE 9、主に Project Jigsaw に合わせて、アプリケーションやライブラリの作者が用意すべきことを説明したセッションです。

Java SE 9 でコンパティビリティが保たれない点として以下の項目があげられています。

  • Encapsulate most JDK-internal APIs
  • Remove a small number of supported, JCP-standard APIs
  • Change the binary structure of the JRE and JDK
  • Remove the endorsed-standards override and extension mechanisms
  • New version-string format
  • Underscore not allowed as a one-character identifier in source code

下の 2 つ以外は Jigsaw に由来するものです。一番最後の _ を単独で変数として使えないのは、Project Lambda に関わることで、Java SE 8 では警告が出ていたはずです。

まず、内部 API を使えないようにするというのは、Jigsaw の目的の 1 つです。sun.* などのパッケージは内部的に使うもので本来は使うべきではないのですが、今までは使えてしまいました。

特に多く使われているのが、sun.misc.BASE64Encoder と sun.misc.Unsafe です。BASE64Encoder は別の API が用意されたので、そちらを使うべきです。

問題は Unsafe。そこで、JEP 260 では Unsafe のようなクリティカルな内部 API は Java SE 9 で deprecated にして、Java SE 10 で廃止という流れになるようです。

クリティカルな API としてあげられていたのが、以下の項目。

  • sun.misc.Unsafe
  • sun.misc.{Signal,SignalHandler}
  • sun.misc.Cleaner
  • sun.reflect.Reflection::getCallerClass
  • sun.reflect.ReflectionFactory

内部 API を使っているかどうかは jdeps コマンドで調べられます。jdeps の起動オプションで -jdkinternals をつけると、使用されている内部 API の一覧を出力してくれます。

また、クリティカルではなくて、カプセル化されてしまった API も -XaddExports を使用すれば、使えるようです。ただし、あくまでも移行措置だと思っていた方がいいと思います。

次の削除される API ですが、java.util.logging.LogManager と java.util.jar.Pack200 の PropertyChangeListener に関するものです。これらも Jigsaw 関連なんだそうですけど、よく分からず ><

JRE と JDK の構造の変更はライブラリがモジュール化されたからです。かなり変わるようなので、JDK_HOME 以下のディレクトリ構造を決め打ちにしているようなアプリは注意が必要ですね。

そのほかに java のオプションの -Xbootclasspath や -Xbootclasspath/p などが使えないようになるようです。

バージョン番号は JEP 223 に書いてありますけど、基本的には 1.9 はやめて 9 にするよ、ということのようです。また、Update Release はマイナーバージョンアップになるようです。ここにきて、マイナーバージョンアップが復活するとは思いませんでしたよw

Alan Bateman, CON5107 Prepare for JDK 9, JavaOne 2015 San Francisco
Alan Bateman, Alex Buckley, Mandy Chung and Mark Reinhold, CON5107 Prepare for JDK 9, JavaOne 2015 San Francisco

 

CON1868 Shenandoah: An Ultralow-Pause-Time Garbage Collector for OpenJDK

Christine Flood, CON1868 Shenandoah: An Ultralow-Pause-Time Garbage Collector for OpenJDK, JavaOne 2015 San Francisco

スピーカーは Red Hat の Christine Flood。

Shenandoah は Red Hat が主導している新しい GC の手法なんですが、イマイチ分からん。OpenJDK のプロジェクトなので、サイト見に行ってもあまり情報がない....

ちなみに、Shenandoah はバージニア州の川もしくは地域の名前のようですね。

Shenandoah の目標は 100 GB 以上のヒープを、10ms 以下のポーズタイムで GC すること。かなり意欲的な目標です。

GC 全体の手法がよく分からないのですが、どうやら G1GC を改良した GC のようです。CMS や G1GC では他のアプリケーションスレッドが動作している状態でも、GC のスレッドを動かしています。Shenandoah はこの Concurrent のスレッドを増やしているのが特徴なのかな。

Parallel GC のように使える限りのスレッドをすべて GC に割り当てるのではなく (当然、Parallel GC が走っている時はアプリケーションスレッドはポーズします)、Shenandoah では余っているスレッドを割り当てているようです。

SpecJBB での G1GC との比較だと、かなりポーズ回数や時間が減っていることが分かります。

でも、もうちょっと詳しい解説がほしいなぁ....

BOF7768 Visualize Log Files for Troubleshooting Java Applications

Shin Tanimoto, BOF7768 Let’s Visualize Log Files for Troubleshooting Java Applications, JavaOne 2015 San Francisco
こうやって演台に手をついて、もたれたように立つのはほんとダメ

cero_t と石田さんのセッション。

なんかグダグダでイマイチ。直前まで内容が決まっていなかったようで、石田さんはオープニング以外はほとんど喋らないし。

日本語だったらどうにかなったかもしれないけど、英語でそれはまずいよね。

しかも、cero_t はポスチャーが悪いので、話に信憑性や信頼性がなくなってしまうのです。話題がどんなに興味深いものであったとしても、ポスチャーの悪いと聞いてもらえなくなるのに.... 限に、途中退席者が多かったのは、そういうところにあると思うんですよね。

特に欧米でプレゼンをやる時は、ポスチャーがとても重要!!

おまけ #1

Cross Your Tees, JavaOne 2015 San Francisco

上に書いたように、ランチにいって、Unsafe のセッションに入れなかったわけです。一緒にランチに誘った @bitter_fox くんにはとても悪いことをしてしまいました。

ぽっかり時間が空いてしまったので、20 周年の T シャツをもらいに行ってきました。

Java SE のセッションは Hilton なのですが、T シャツは Park 55 なので、なかなか行きづらかったんですよね。単に T シャツをもらえるだけかと思ったら、その場でプリントしてました。いわゆるシルクスクリーンというやつです。しかも 2 色摺り。

これはなかなかいいですね。

それにしても北斎がこんなところにも使われるなんて、ほんとすごいことです。

Cross Your Tees, JavaOne 2015 San Francisco
Cross Your Tees, JavaOne 2015 San Francisco

Cross Your Tees, JavaOne 2015 San Francisco
Cross Your Tees, JavaOne 2015 San Francisco
Cross Your Tees, JavaOne 2015 San Francisco

 

おまけ #2

Pepper, JavaOne Pavilion, JavaOne 2015 San Francisco

まだ時間があったので、@bitter_fox くんとは別れて、パビリオンへ。

パビリオンがまた縮小されているような気がするのですが... なんとも寂しいものです。

去年のパビリオンではアルデバランの Nao がいっぱいいたのですが、今年は Pepper のようです。

そこでたまたま会ったのが David。あれっ、昨日のセッションではひげはやしていたのに、今日はひげがない。

聞いてみたら、昨日私が Facebook にあげた写真を見て、ひげが汚らしいように感じたので、今日剃ってしまったと。そうだったんだ! でも、ひげない方がいいと思うよ。

David が Pepper に "Shake hands" とか "Hug me" などと話しかけても、一切無視されていたのが ^ ^;; ノイジーな場所だからしょうがないとは思うけど、反応する人にはちゃんと反応するので、何かが違うんでしょうねw

 

Nao, JavaOne Pavilion, JavaOne 2015 San Francisco
Pepper, JavaOne Pavilion, JavaOne 2015 San Francisco
Pepper, JavaOne Pavilion, JavaOne 2015 San Francisco

 

おまけ #3

Null Pointers, JavaOne 2015 San Francisco

今日は Taylor Street を封鎖して作られている Duke Cafe で Nll Pointers がプレイするというので、大山さんと聞きにいきました。

今年の Null Pointers はちょっと違う。なんと GS の伊藤さんがドラムとして参加されているのです。伊藤さんに聞いたところによると、バンドで練習したのは土曜日がはじめてということなので、なかなか厳しいですね。

ちなみに Null Pointers はコミュニティのバンドで以前からメンバをその都度代えながら、綿々と続けられているバンドです。

オリジナルはもちろんなくて、いわゆる懐メロ系のカバー。懐メロといっても、演歌ではないですけど。

なかなか楽しめました。

Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco

Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco

Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco
Null Pointers, JavaOne 2015 San Francisco

Mikkeller Bar

このエントリーをはてなブックマークに追加
Mikkeller Burger, Mikkeller Bar, San Francisco

Mikkeller Bar というバーのハンバーガーがおいしいという噂を聞いたのですが、ノンアルコールを一切おいていないという場所らしいのです。しかも、ランチはビールがセットになっているらしい。

ということは、飲まない櫻庭にとってはかなりハードルが高い。こういう時こそ、大山さんの力を借りるしかない!!

ということで、大山さんに私の分のビールを飲んでもらうことにしました。@bitter_fox さんも興味があるというので、3 人で Mikkeller Bar へ。ちなみに、Mikkeller Bar は渋谷に支店があったらしいんですけど、つぶれちゃったんですよね。

店にいってみたら、タップがずらり。さすがにここまでタップが並んでいるのを見るのははじめてです。

で、私はもちろん Mikkeller Burger。最近、アメリカでもバーガーの付け合わせをチップスにするかサラダにするかと聞かれることがあるのですが、まさかこんな Bar でも聞かれるとは思いませんでした。で、サラダにしてみたら、やさいたっぷり。旅行中は野菜不足になりがちなので、これはうれしいかも。

で、バーガーですが、とても肉々しいバーガー。バンズはベーグルかな? こちらもローストしてあって外側はカリッとしていて、おいしい。一昨日の The Cavalier のバーガーよりも、こっちの方が全然おいしい。

とはいっても、来るにはハードルが高いからなぁ...

Mikkeller Bar, San Francisco
Mikkeller Bar, San Francisco

Mikkeller Bar, San Francisco
Mikkeller Burger, Mikkeller Bar, San Francisco
Mikkeller Burger, Mikkeller Bar, San Francisco

Aveline

このエントリーをはてなブックマークに追加
Pan Roasted Chicken, Aveline, San Francisco

Duke Cafe で Null Pointers のライブ見てから、大山さんとごはん。Twitter で誰か誘ってみたんだけど、誰ものってくれなかった ><

で、行ったことはないけど Yelp で比較的高い評価 & 近くだったので、Warwick Hotel の 1F だけにある Aveline へ。

内装はカッコいいし、客席から直接見えるワインセラーにはワインいっぱいで、ワインのセレクションもいいようです。といっても、飲まないので分からないけど ^ ^;;

前菜に House Cut Fries と Buratta Cheese。

このフレンチフライがガーリックが効いていて、止まらない系でした。Buratta はモッツアレラで生クリームをとじこめたチーズ。それをサラダ仕立てで、バルサミコのソースをかけてあります。これもなかなかおいしい。

Aveline, San Francisco
Aveline, San Francisco

Pink Lemonade, Aveline, San Francisco
House Cut Fries, Aveline, San Francisco
Burrata Cheese, Aveline, San Francisco

メインはチキンのロースト。アメリカではチキンというと胸肉なのだけど、パサパサになりがち。でも、ここはちゃんとしっとりしていて、おいしい。たぶん真空調理していて、最後に焼き目をつけているのだと思う。

デザートは Chef's Whim Sundae。パフェのようなサンデーが来るのかと思ったら、単にアイスクリームをスクープしているだけ。でも、アイスがおいしかったから、よしとしよう。

ついでだけど、「シェフの気まぐれなんとか」というメニューはたまにあるけど、英語だと Chef's Whim Somthing なんだね。はじめて知りました。

Pan Roasted Chicken, Aveline, San Francisco
Espresso, Aveline, San Francisco
Chef's Whim Sundae, Aveline, San Francisco