2017/06/03

Oracle Code Japan Tour

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

今年も Stephen Chin さんと Sebastian Daschner さんはオートバイに乗って日本各地の JUG を回っているのです。

去年は Nighthacking Tour でしたけど、今年は Oracle Code Tour。

でも、去年は沖縄と札幌だけは飛行機だったのです。どうやら、Steve たちは、沖縄はともかく、札幌にバイクで行けなかったことを悔やんでいたらしいです。

で、今年はすべての行程をバイク。札幌もバイクでした。

全行程を示すと...

東京 - 名古屋 - 大阪 - 岡山 - 広島 - 熊本 - 福岡 - 福井 - 仙台 - 札幌

だそうです。セミナはありませんでしたけど、四国にも彼らはいっていたようです。

櫻庭は去年と同じく、週末だけのスポット参戦。広島札幌で登壇させてもらいました。

広島で講演するのは 2013 年以来。@soudai1025 さんに誘われてオープンセミナー広島に登壇したのでした。その時は Java SE 8 について話したのですが、今回は Java SE 9。

札幌は去年の Night Hacking Tour でも講演させていただいたので、2 年連続。

去年は大韓航空機が羽田で事故を起こしたせいで、札幌に来るまでが大変でした。今年はそんなトラブルもなく、無事に講演することができました。

両方とも内容は Java SE 9 です。Java Day Tokyo の資料を日本語にして、Jigsaw と JShell をくっつけています。

広島と札幌では微妙に資料が違うのですが、それらを統合したものを slideshare にアップしてあります。

2017/05/20

JJUG CCC 2017 Spring

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

Java Day Tokyo の後は、CCC です。前回の秋は出なかったので、1 年ぶり。

今回は、Project Jigsaw です。

しかし、今月になって Jigsaw の JSR 376Public Review Ballot が否決されてしまうと波乱があったばかり。こんな状態で、なんの話をすればいいのでしょう?

Ballot の意見を見ていても、結局は過去とのマイグレーションをどうすればよいかという点が指摘されています。OpenJDK の Jigsaw の ML でも、マイグレーション関連について活発に議論されています。

しかし、このあたりのことは Java Day Tokyo でのキーノートや Jigsaw のセッションでは一切触れられていませんでした。

そこで、このセッションでは発表時点で分かっていることはなるべく盛り込んで、話をしています。しかし、セッション後にやはり変更された点や追加議論が必要とされている項目も出てきています。

そういう点については、また稿をあらためて紹介できればと思っています。6 月の Public Review Reconsideration Ballot の後ですかね。

さて、発表資料はこちら。

すでに、ほぼ確定の module-info.java の書き方や、ビルド/実行の方法などについて触れた後、残りの 1/3 の時間を使ってマイグレーションについて話をしました。

特に既存の JAR ファイルをモジュールとして扱う Automatic Module について紹介しました。しかし、その Automatic Module が JCP での議論のトピックになっているわけです。とりあえず、セッションでは改定案を紹介しましたが、最終案がこうなるとはかぎりません。

あっ、1 点だけ、セッションで失敗したと思ったことが...

標準で提供されている Platform Module を調べるために java コマンドに --list-modules オプションがあります。これで調べた結果を示したのですが、JRE の java コマンドを使ってしまいました ><

JDK の java コマンドと JRE の java コマンドだと使えるモジュールも異なるのです。たとえば、jdk.jshell などは JDK の java コマンドだけです (もちろん、JRE でも --add-modules すれば使えます)。その点をすっかり忘れて、JRE でやってしまったのでした。

 

このセッションでは質問を受け付けるために sli.do というサービスを使いました。

Java Day Tokyo で @bitter_fox さんが、このサービスを使っていたので、私もまねしてみたわけです。

セッション中にオンラインで質問を投げられるし、それに対して「いいね」をすることもできます。なかなかいいですね、これ。次回も使ってみよう!!

というわけで、セッション中にいただいた質問をここで答えておきます。

 

Q. JASRACのひとがやってくる危険が危なくないですかww?

A. あー、あー、聞こえない、聞こえない

Q. mavenでは、moduleとどうやって整合とるのでしょう

A. Maven の動きをあまり追いかけていないのですが、問題となるのは Jigsaw のモジュールと artifacts が違うものだというこということにあると思います。どうやって折り合いをつけるかということは、まだ決まっていないようです。

プレゼンテーションにも登場させた Stephen Colebourne がこの件についてブログで言及しているので、ご参考までに。

Java SE 9 - JPMS modules are not artifacts

Q. メタ情報なのに.javaっていうのがちょっと嫌。JSONじゃダメなんだろうか。

A. Java で JSON を扱うのは意外に面倒なので... module-info.java を扱うのは javac なので、Java の構文解析がそのまま使えるのがいいのではないでしょうか。

プレゼン中にも言及しましたが、JSON-B が Java SE でも使えるようになったら変わるかもしれません。あくまでも個人的な意見ですが。

Q. moduleやrequires, exportsなどのキーワードはmodule-info.javaでのみ有効な予約語?の位置づけでしょうか

A. module-info.java のみで使用できる予約語です。

Q. モジュール化した場合としない場合でアプリの起動時間にどのくらい差がでてきますか?

A. 大きいシステムでモジュールを多くロードするようなシステムであれば差がでると思いますが、私自身は試してないのでよく分かりません。小さいシステムだと、それほど差がないように感じます。しかし、計測を行ったわけではないので、あくまでも感想レベルだと思ってください。

Q. module-info.javaが小文字始まりになった理由は何かあるのでしょうか

A. パッケージの情報を記述する package-info にならったのだと思います。

Q. // puckage export typo?

A. タイポはなかなか気がつかないので、ご指摘ありがとうございます! 公開している資料では修正してあります。

Q. モジュール版のmavenセントラルができることになるんですか?

A. 今のところそのような予定はないです。個人的には Maven セントラルが利用できれば一番いいのではないかと考えていますが、そのためには前述した artifacts とモジュールのすり合わせを行う必要があります。まだ、道は遠そうです。

Q. 昔、jarの中にjarを入れるsuper packageみたいな話があった気がしますが、そっちの話はどうなったのでしよう

A. JAR をまとめたパッケージングに関しては JSR 277 で JAM (Java Archive Module) というのが提案されていましたが、棄却されています。super package は言語側の拡張提案で、JSR 294 で提案されていましたが、こちらも棄却されました。これらを受け継いだのが、Project Jigsaw になります。

Q. Jigsawにはバージョンを管理する仕組みはないのでしようか? モジュール名にバージョン番号を入れる?

A. バージョンをつけることは可能です。バージョンをつけるには、jar コマンドの --module-version オプションで記述します。ただし、そのバージョンを使用して、バージョンを指定してビルドするなどは、現状ではサポートされていません。

Q. exportsで指定したパッケージのサブパッケージは公開されるのでしょうか?

A. 公開されません。公開するにはサブパッケージも exports 文を記述する必要があります。

Q. MANIFEST.MF に名前がなかったらどうするのでしょう

A. ファイル名が使われると思いますが、確認はしていません。

Q. testだけでパッケージを公開(exports, opens)したい場合やmoduleをrequiresしたい場合はどうするのが良いのでしょうか?

A. これは非常に難しい問題で、現状 Jigsaw では同じパッケージを複数のモジュールに分割することはできません。そのため、ファイルツリーを src と test に分割している (ビルドしたクラスファイルも別ディレクトリ) 場合はモジュールにしてしまうと、テストを実行することができません。

櫻庭もこれに対する最適解を見つけている最中なのですが、現状はテストの時はモジュールとして扱わないようにしています。コンパイルや実行に他のモジュールが必要な場合、--module-path と --add-modules オプションを使用して必要なモジュールをロードするようにしています。

2017/05/17

Java Day Tokyo 2017

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

今年も Java Day Tokyo で講演してきました。

講演内容は Java SE 9 の全般。資料はこちらです。

裏話を書いてしまいますが、私のセッション、内容がなかなか決まらなかったのです。

当初、Jigsaw についてを要望されたのです。しかも、Alex Buckley が Jigsaw の応用的な話をするので、入門編をやってくれということでした。

というか、Alex ですよ!! Jigsaw の JSR 376 のスペックリードですよ!! 私ごときが、Alex と同じ話題を喋るなんて、恐れ多い。

でも、結局 Alex と Bernard Traversat さんが Jigsaw を話すことになったわけです。

その他に、Java SE 9 関連だと JShell を @bitter_fox さんが話すので、Java SE 9 の注目 2 機能はとられてしまったわけです。

そこで、Jigsaw と JShell 以外の全般について話すことになったわけです。

話題的には次の 3 つ。

  • コンパティビリティ
  • 新機能
  • 改良された機能

特にコンパチの話は、今まで使えていたけれども使えなくなるモノがいろいろあるので、それを中心に説明しました。

メソッドもほんとに使えなくなったり、Deprecated になったものが多くあります。多くは Jigsaw に起因するメソッドですが、Jigsaw では今後いろいろと隠されてくことになるはずです。

ツールもいろいろなくなっています。個人的には VisualVM がなくなってしまうのがイタい。便利なのになぁ...

新機能としては、主に Reactive Streams を紹介しました。

残念ながら、Java SE 9 では Reactive Streams を導入しただけで、それ以上の機能は自分で作りこまなくてはいけないのがつらいところです。Publisher だけは実装クラスである SubmissionPublisher クラスが提供されていますが、Subscriber は実装する必要があります。

改良された機能は、Milling Projet Coin と Stream API、そして Collection を紹介しました。

Collection のファクトリメソッドである of メソッドは、Java SE 9 で導入されたメソッドの中で一番のヒットではないかと思っております。

また、String クラスの内部構造が変更されたことなどにも触れてます。

もっと多くの機能について触れたかったのですが、講演時間は限られているので、これぐらい。

ITpro の 最新 Java 情報局 でより詳細な情報を執筆しているので、ぜひそちらも参考になさってください。

 

さて、こういう多くのトピックがある話題を話すプレゼンって、とても難しいです。

単に、「続きましては...」とかで次のトピックにつなげていくだけにしてしまうと、ぜんぜんおもしろくないどころか、聞いている方は退屈してしまいます。

実際、こういうセッションをしている人が過去に何人もいたのです。そして、聞いている私は、完全に退屈してしまったわけですww

トピックがズラズラと続くだけなので、盛り上がりにも欠けてしまいます。

「いつまでこの調子で続けるの?」と思われてしまっても、しかたないですよね。

そのために、今回はどうやったかというと、トピックをツリー状に構造化して、今話しているトピックが全体の中のどこに位置しているかを分かるようにしてみました。

具体的には、こんなツリーになっています。

Topic Tree

ツリーの葉は 3 つ以上にならないようにしています。それ以上になってしまうと、聞いている方が今どのあたりを話しているかを把握できなくなってしまうからです。

そして、話している時も、なるべく今話しているトピックが分かるように、かつ、なるべくトピック間に関連をもたせるように話してみました。さて、結果はどうだったんでしょうね。

2017/05/14

JOnsen 2017

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

伊豆の下田で行われた JOnsen というクローズドなイベントに参加してきました。

基本的には、Steve Chin さんが招待した人だけのクローズドなイベントなんですけど、なんかオープンなイベントのように受け取られている人が多いようなので....

来年はどうなるか分からないですけどね。

海外からの参加者は Steve が直接招待した人たち。主に Java Champion です。私とてらださんも Steve に直接招待されました。

後は日本の JUG の代表ということで、@cero_t@jyukutyo

他は日本の Oracle から伊藤敬さん、 @chiroitoロジ子さんの中の人、David Buck。後は US のオラクルの人。

はじめ、登録していた日本人が伊藤さんと私しかいないので、結構焦りました。だって、そんな英語話せないし.... すぐにてらださんが登録してくれたので、少し安心したのは事実です。

総勢、23 名かな。

で、何をやるかというと、アンカンファレンスです。参加者が自分が話したいトピックをあげて、それに興味を持った人が集まって議論するということの繰り返しです。

初日

この日は夕方から。

自己紹介と、1 人 1 つ以上の議論したいトピックの洗い出し。

下の写真のように車座になって、自分の話したいトピックを説明します。

_DSC7217

みながトピック出し終わったら、それを付箋でホワイトボードに貼って、それを整理するところまでで今日はおしまい。

_DSC7234 _DSC7229

それにしても、いきなり英語はつらかった。プレゼンテーションなどは事前に準備できるからまだいいですけど、何も準備もなしに議論しろとか絶対ムリ ><

まぁ、それでもなんとか初日は乗りきりました。

夕飯はホテルで和洋食のブッフェ。

洋食はいいのですが、和食を説明するのはたいへん。大葉の天ぷらがあったのですが、これは何と言われても.... 大葉は日本のバジルのようなものだといったのですが、バジルが通じない。ハーブは何とか通じました。

後で調べてみたら、シソはほんとに Japanese Basil と呼ぶらしいです。いい線ついていたんだけどなぁ。でも、発音はバジルではなく、ベイジル。それじゃ、通じないわけだ。

わらび餅も説明がたいへんだった。ワラビなんて訳せないし。柔らかいグミのようなものだと説明しましたけど、分かったかなぁ。

_DSC7269 _DSC7272 _DSC7260

そして、この日、参加者の 1 人、Andres Almiray さんの誕生日。サプライズでケーキ用意されてました。

照れる Andres。

_DSC7282 _DSC7319

そんなこんなで 1 日が終ったのでした。しかし、疲れた...

2 日目

Beach

今日は午前はアンカンファレンス、午後はみんなで水族館へお出かけ。ほんとは寝姿山にハイキングの予定だったのですが、雨なので。

朝ご飯はホテルで。よくある和洋食のビュッフェ。

Breakfast

アンカンファレンスの開始は 9 時。9 時ちょっと前に会場にいったら、ぜんぜん人がいない。いるのは日本人ばかり。日本人、まじめだなぁ。まじめそうに見えない人もいましたけどw

JOnsen 2017

昨日、トピックだしをしたので、今日は 2 グループに分かれて、そのトピックに関しての議論。

Java に関する話題はサーバー系の話が多かったので、私は Java にはあまり関係ないトピックの方に参加してました。Java チャンピョンが日本で少ないというトピックや、JUG をどうやって活性化すればいいかなど。

今、日本には 2 人しか Java Champion はいないのですが、私が Java Champion になったのはかなりラッキーでした。

Java Champion のプログラムが始まったばかりで、アジアから Champion を選出したいという Sun の意向があったことと、ちょうどその時に東京で JavaOne があったことが大きかったです。その時に、Sun の本社の人たちと知り合いになれたというのと、Java の開発をしていた人に推薦をしてもらえたので。

今は Java Champion は Champion の互選なので、Champion の人たちに知られていないと Champion になれないのです。

なので、日本では有名であっても、世界に向けて発信している人じゃないと Champion になりにくいんですよね。みんな、英語で発信しよう!

JOnsen 2017 JOnsen 2017

それにつけても、議論に入っていけない >< みなが言っていることはある程度理解していたとしても、議論に入っていくタイミングが難しいし、自分の考えを英語でいうのも難しい。一番はじめのポジショントーク的なことは話せても、議論の途中に割って入ったりするのはムリ。

やっぱり、英語やりなおさないとなぁ....

そういえば、Jigsaw の話題がなかったのは、みんな空気読んでいたのかなぁw

ランチは朝食と同じ場所。

洋食で前菜、スープ、メイン、デザートとけっこうちゃんとしているランチでした。でも、ポーション少なすぎ。

実をいうと、人数のカウントが間違っていたのか、2 人分余っていたのですが、私と Sebastian が全部いただきました。なので、2 人分食べたんですけど、そんなおなかいっぱいという感じではないです ^ ^;;

ランチは結構、英語で話ができたので、よかった!

Michael Hoffer さんが抹茶アイスがおいしいところを探していたので、青山のななやをお勧めしておきました。こういう話だったら、いくらでもできるんですけどね。

Lunch Lunch Lunch Lunch

さて、午後は下田海中水族館へ。

下田海中水族館といえば、イルカ。ちょうど最後のイルカショーにまにあったので、みんなで鑑賞。けっこう楽しんでくれたようです。イルカ、クジラの議論し始めるようなひとがいなくてよかったw

それにしても、水族館に来ると分かっているのであれば、望遠レンズ持ってきたんだけどなぁ...

結局、閉館時間までここですごしたのでした。

Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium Shimoda Floating Aquarium

今日の夕飯は下田駅に直結しているさかなや道場へ。

JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店 JOnsen Reception, 下田漁港直送 さかなや道場 伊豆急下田店

こうやって座敷で食べるというのも、欧米だとないんだろうなぁ。さすがに、箸が使えない人はいませんでした。

ここで問題発覚!!

なんと Breandan Considine さんがいないのです。誰も人数とかチェックしていないので、ぜんぜん気がついてませんでした。

水族館からは帰っていることはタクシーに一緒に乗車している人がいたので確かなのですが、それからが分からない。で、ホテルに電話してみたら、ホテルにいました!!

水族館から帰った後、疲れて寝てしまったようです。よかった、行方不明でなくて。

最終日

Morning

昨日の雨は明け方にやっとあがりましたが、スッキリ晴れとまではいかない微妙な天気。

今日は、午前は再びアンカンファレンス。ランチ後、ラップアップをしておしまいです。

今日はこの 2 人がおそろいの T シャツでした。Sebastian はこの T シャツ気に入っているようで、よく着てます。

JOnsen 2017

今日はワークライフバランスやツールの話題などの議論に参加しました。

ツールといってもビルドツールの話に始終してしまい、Maven か Gradle になってしまったのが残念なところ。私自身はそれほど大きいシステムは作っていないし、ビルドでいろいろやらないといけないような状況にないので、Maven でも Gradle でもどっちでもいいんですけどね。

JOnsen 2017 JOnsen 2017 JOnsen 2017

Sebastian はなんで裸足だったのだろう?

ランチは昨日と同じ感じ。

ランチ後にラップアップ。

外国からのゲストはほとんどの人がもう一泊するのだと。で、天気も回復してきたので、午後から寝姿山にハイキングにいくことになったらしいです。

日本人はみな帰途に。てらださんが車を出してくれているので、熱海まで乗せてもらいました。

ということで、JOnsen は終了。

来年は、今年よりはオープンにするらしいです。でも、あまり日本人が多すぎると日本人で固まってしまうので、つまらないかも。

外国人より日本人が多くならないようにした方がいいと思っています。まぁ、来年にならないと分からないですけどね。

D810 20 万枚

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

JOnsen にいっている間にいつのまにか D810 で撮った写真が 20 万枚を超えてました。

D810 を購入したのは 2014 年 7 月 17 日なので、だいたい 3 年使ったわけです。去年ぐらいからちょっと写真を撮るペースがダウンしてきてますけど、それでも年に 7 万枚ぐらいでしょうか。

でも、ぜんぜん写真うまくなっていないような気がする ><

とりあえず枚数撮れば分かってくるものもあるんだけど、ある程度いくと撮っているだけじゃダメなのは確かだからなぁ....

20 万枚目の写真はイマイチだったので、199,994 枚目の写真。下田プリンスホテルの正面です。

20 万枚も撮るとカメラもいろいろとガタがくるので、ここらへんでメンテナンスしないと!!

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 は役目が終わったと思うのですが、どうなんでしょうね。

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 のめんどうなところと似ています。