JavaOne参加レポート (9/26)

JavaOne 最終日となる 5 日目のレポートです。この日のセッションは前日同様夕方までで、午前中はコミュニティセッションでした。
前日のイベントの疲れもあったのか、コミュニティキーノートはちょっと遅れての到着でした。(> <)
そして夜には伝統の蟹パーティにも参加しました!

この日に参加したセッションは次の通りです。

Java Community Keynote [KEY11027]

最終日はコミュニティキーノートから始まりました。前述したように、ちょっと送れての到着となりました。
最初は組み込み向けプロセッサ開発で有名な freescale 社によるスポンサーセッションでした。
やはり内容は IoT についてです。エッジノード (センサーとか電源とか) 、短距離接続 (Wi-Fi とか Bluetooth とか) 、ゲートウェイ、WAN、クラウドといったレイヤ分けを行い、それぞれのレイヤにおいてソフトウェアに求められることの違いみたいなことを説明していました。
また、組み込み開発における Java ME の C++ に対する優位性 (クロスプラットフォームロバストな点が優位) 、Java ME を中核とした開発のプラットフォームを作ったことなどを話していました。
事例として紹介した、ヘルスケアでのデータ解析の話がちょっと目を引きました。各種医療機器からのレコードをゲートウェイ (Home Health Hub と呼んでいました) を通して集め、それを OEP (Oracle Event Processing) という Oracle の CEP (Complex Event Processing) エンジンを通して分析するというものです。OEP for Java Embedded というものがあるようで、組み込み向け CEP があるということに驚きました。

続いてコミュニティキーノートです。
Raspberry Pi チャレンジの話があり、そこで Oracle が何と Raspberry Pi と OEM 契約したことが発表されました。今後は最初から Java が入ったイメージが出てくるようです。
また、Square が OpenJDK に参加するというニュースもありました。CDI の仕様策定過程で物議を醸した Crazy Bob こと Bob Lee さんの写真が出てきて驚きました。

そこから話の内容が教育に移り、Devoxx 4 Kids の様子がビデオ紹介されました。続いて 10 歳の Minecraft ハッカー、Aditya Gupta くん (Java EE の世界で有名な Arun Gupta さんの息子さんのようです) が登場し、壇上で Eclipse を広げて Minecraft をハックするデモンストレーションを行い、大いに盛り上がりました!
今後、ソフトウェアの重要性は上がる一方なので、確かに子供の教育は重要になってきますね。最近は普通の人が触るコンピューターはプログラミングの可能な PC から、プログラミング環境のないタブレットスマートフォンといったデバイスに移ってきているだけに、なおのこと重要になっていると思います。

次に安全、環境、宇宙、金融という 4 つの分野における Java の関わりについての話になりました。
安全ではロボットや自動運転の話が挙がり、Java for LEGO Mindstorms の紹介や、Java での自動車自動運転のビデオが流されたりしました。
環境では省エネの話になり、家庭における電力消費状況やそれに関するイベントの可視化をする様子が紹介されました。キーワードとして HadoopHibernate が登場していました。日本でもスマートメータースマートグリッドの話題が良く出てくるようになりましたし、この分野はどんどんホットになっていくでしょうね。
宇宙では初日の NetBeans のセッションでも見た、NetBeans + JavaFX で作ったアプリが登場しました。3D で太陽風を測定する衛星のフォーメーションを管理している様子を紹介していました。Geertjan Wielenga さんのブログでも良く紹介されるのですが、NetBeans プラットフォームは科学研究分野でよく使われている印象があります。
金融ではゴールドマンサックスの人が登場し、GS では 3000 人の開発者いて、コードは 1 億行に達し、22PB のストレージ、63K の CPU を使っていることを話していました。恐るべしです。そして、JCP にも OpenJDK にも参加しているよ、とアピールしていました。あちらではユーザー企業側が自ら開発しているのですよねえ。金融分野はもはやシステムが心臓となっているので、ある意味当然なのですが、日本のメガバンクも今後 JCP に参加するくらいのことをするのだろうか?

最後に予想はしていましたが Gosling さんも登場しました。初日の NetBeans のセッションで話したことと全く同じ内容の発表を行っていました。(^^;;

あ、そうそう。寺田さんが T シャツ投げデビューしてました。(^^)

nuvos: The Universal SDK―Write in Java; Run on IOS, Android, HTML5, and JVM [CON10821]

IntraMeta 社の nuvos という Java によるリッチアプリケーション開発プラットフォームの紹介を行うセッションでした。
本来は別のセッションを入れていたのですが、キャンセルになったので代わりにこれを聞くことにしました。

nuvos は Java でアプリケーションを作ったら、そこから iOSAndroid といったスマートデバイス向けアプリケーション、デスクトップ向けアプリケーションを生成するという製品です。
スマートデバイス向けには GWT ベースの JavaScript アプリケーションを、デスクトップ向けには JavaFX アプリケーションを生成するようです。
なかなかすごい製品だとは思いますが、プレゼンテーションの流れがとても退屈で、正直ちょっと眠かったです...。題材が良くても説明の仕方が下手だと台無しになることがよく分かりました。

デモンストレーションは面白かったです。nuvos を用いて出力したアプリケーションが、HTML5 バージョンも JavaFX バージョンも見た目、操作性がほぼ同じで驚きました。製品としてはとても面白いなと思いました。

Moving from Swing to JavaFX [CON7852]

Dassault Systems 社による、Swing アプリケーションを JavaFX に移植した事例について紹介するセッションです。Dassault Systems 社は航空機とかで有名なフランスの Dassult のシステム子会社です。

Enginuity という調剤の設計を行うためのソフトウェアを JavaFX に移行する話をしてくれました。
ビデオ機能やマルチタッチ機能が必要で、JavaFX を利用することにしたとのことです。アプリケーションの国際化やデザインのカスタマイズを行えるようにできるかが懸念事項だったとのことです。
以前のバージョンと同じ動作をすること、ビジネス価値に寄与する開発ができること、開発したものの資産化ができること、自動テストができること、といった点を移行に当たって重視したとのことでした。

JavaFX の利点として、HTML5 アプリケーションと組み合わせられること、ビルトインコンポーネントが豊富であること、次に示すような Swing の課題を解決していた点を挙げていました。

  • JTable のカスタマイズが難しい
  • エフェクトの実装が難しい
  • UI とデータモデルをバインディングする仕組みがない
  • L&F のカスタムが難しい
    • Nimbus L&F には package protected なコードがある!

JavaFX に変更するに当たってのチャレンジングな点としては、Swing とコンポーネントモデル、スレッドモデル、イベント、バインディングなどが異なる点を挙げていました。

続いて移植の内容についての説明になりました。
先述したようにリグレッションは許されないので、リグレッションテストスイートを作ったとのことです。
JavaFXアーキテクチャiOS に似ているため (FXML と Controller の関係が iOS の Screen と ViewController の関係に似ている) 、iOS での開発スタイルを参考にしたようです。
Controller はプレゼンテーション技術から切り離すようにし、画面間の共通に使われるプレゼンテーションロジックは Component Delegate を作ってそこに委譲するスタイルと取っています。Component Delegate はバインド等のエラーをハンドルし、ビジュアルフィードバックを返せるように作られています。データは JavaFXバインディングの仕組みを利用しています。

全部を一度に移植するのはリスキーなので、手始めに簡単なプロパティエディタから移植したとのことです。リグレッションテストスイートをまず作成し、そのテストが通ったら徐々に JavaFX ならではの機能追加を行っていきます。そこから徐々に移植対象を増やしていきました。
さすがに業務系のソフトウェア開発であるため、とても堅実なアプローチでやっていますね!

苦労した点として、Swing に WebView を貼り付けたときにスクロールバーが表示されなかった問題 (WebView を先に Scene に貼り付けてから JFXPanel に Scene を追加することで解決)、ファイルチューザーの見た目が変わったこと *1 、自動テストツールJavaFX を認識しなかったことを挙げていました。
また、Scene Builder について、これは開発者向けツールなので別途デザイナ向けツールが必要なこと、プロパティエディタの強化が必要なこと、プラグイン機構が欲しいことをリクエストとして挙げていました。

Swing から JavaFX への移植に限らず、システム移行のやり方としてもとても参考になるセッションでした。

Be Creative and Create Your Own JavaFX 8 Controls [CON2494]

いつもかっこいい JavaFX カスタムコントロールを色々作って、Harmonic Code というブログに投稿している、Gerrit Grunwald による JavaFX 8 でのカスタムコントロールの作成方法についてのセッションです。

JavaFX はスタイリングに CSS を使えるのが特徴的ですが、JavaFX 8 からは自分で作ったコンポーネントに独自の CSS プロパティを用意できるようになります。疑似クラスも定義できます。
CSS の属性を定義するには、コントロールにおいて、プロパティを StyleableProperty インターフェースを実装したプロパティクラスで定義します。
実装クラスでは getCssMetaData() と getControleCssMetaData() というメソッドを実装するのですが、このメソッドCSS エンジンが拾うそうです。
CSS 属性に対して疑似クラスを用意したい場合は、BooleanPropertyBase を実装したプロパティを用意し (そのプロパティの名称が CSS での疑似クラス名になります) 、invalidated() メソッドの中でスタイルの変更を行います。
CSS を自分でカスタムできるようになりたければ、JavaFX 8 の標準テーマである Modena の CSS コードを理解することが大事だとのことでした。読むのは大変だけど、その価値はあるとのことです。

カスタムコントロールを作るには、Control クラスを継承したクラスを作り、さらに対となる Skin クラスを用意します。
MVC アーキテクチャに照らし合わせると、Control が Model の、Skin が View と Controller の役割を担います。
つまり、Control にはカスタムコントロールの各種プロパティを保持し、Skin が見た目とユーザーインタラクションに対する応答を提供します。
よって、Skin クラスではスタイルとイベントリスナを登録します。スタイルは CSS で作ります。CSS の属性には SVG の記述も渡せるので、それでシェイプを作ることができます。
「Swing よりずっと楽になっているよー」とのことでした。 *2

ただ、この方法は本当に汎用的なコントロールを作りたい場合の話で、もう少し簡略化した作り方もできるとして、以下の 3 種類の方法を紹介していました。

  1. Canvas で作る方法
  2. Region を継承する方法
  3. Control + Skin + CSS で作る方法

いずれの方法でも初期サイズ、初期に表示するグラフィック、リスナ登録、プロパティのハンドリング、リサイズについての考慮が必要となります。
3 つ目は上で述べた方法です。
1 つ目の方法は Region を継承したクラスを作り、その中に Canvas を保持して、直接ドローイングする方法です。一番ストレートな方法ですね。サイズに対してリスナを登録しておき、変化があったら描き直します。ユーザーインタラクションがない場合はこの方法で充分ですが、CSS でスタイリングできないという欠点があります。
2 つめの方法は、やはり Region を継承するのですが、Region 内にさらに別の Shape やコントロールを配置します。要は既存のコンポーネントを組み合わせるという方法ですね。この方法の場合は CSS を使うことができます。大抵の場合はこのやり方で充分とのことです。私もカスタムコントロールを作るときは基本的にこの方法で作っています。

最後に、カスタムコントロールを作るのに便利なツールとして、以下のツールを紹介していました。

Caspian Styler
FX Experience Tools に含まれている、CSS 設定を確認できるツール
Scenic View
シーングラフの状態を確認できるツール
Inkscape or Illustrator or Fireworks
説明不要ですね
FXG Converter
Gerrit さんが開発した、Adobe FXG ファイルを JavaFX コードにコンバートするツール

Java EE 8 and Beyond [CON2406]

このセッションはパネルディスカッション形式のセッションでした。基調講演でも Java EE パートの説明をした Cameron Purdy さんや金魚本で有名な Antonio Goncalves さんをはじめ、IBMRed Hatアプリケーションサーバーの開発に携わっている人達がパネリストになっていました。

Java EE 8 はまだ具体的な動きだしがほとんどないようで、Java EE 8 はどうあるべきかをこの場で語り合おう、という内容になっていました。
正直私の英語力では聞き取りが結構厳しかったのです。

やはり話題になっていたのは "DevOps" でした。この言葉がバズっていたのは日本だけじゃなかったんですねえ。EE 7 では結局見送られた PaaS 対応に俄然期待が掛かるという感じですね。
つまり、モジュラリティの向上や、DevOps 向けの API の充実とかしていきたいねえ、という話をしていました。
(毎回 SLF4J の設定とかいちいちやりたくないよね?みたいなことを話してましたねえ)
他にもアノテーションをもっとシンプルに、新しい技術にどんどん追従して欲しいという声が挙がっていました。

EJB もやはり話題に挙がりました。CDI の登場により、Java EE における EJB の位置付けが微妙になってきています。アノテーションについて、CDI 側に寄せた方が良いのか、従来の EJBアノテーションを残した方が良いのか、を聴講者に聞いていましたが、前者に手を上げる人が多かったですね。

そして Spring はどうしても話題に挙がりますね。ことあるごとに「それ Spirng でも」な突っ込みが入っていましたw
他には「Oracle ってちゃんと JavaJava EE で儲かっているの?」とか (Fusion MiddlewareWebLogic でちゃんと儲けてるよ、との回答) 、「JSF どうするよ?」とか (Single Page Web App の開発では効いてくるのでは?という話が) 、Java EE にも HTML5 みたいなロゴが必要なんじゃない? という話が出てきたりしました。
まあ、何というか全般的にまったりした感じで話し合ってましたねえ。

Java EE 7 がリリースされたばかりなので、EE 8 についてはまだ何をするのかほとんど決まっていないような感じです。なので、今はみんなで色々リクエストを出すと良いのかも知れませんね。


以上、初めて参加した JavaOne のセッションレポートでした。ハードでしたが非常に中身の濃い 5 日間を過ごすことができました。
今回初めて知ったのですが、JavaOne って AppleWWDC より遙かに規模が大きいのですね。やはり Java のコミュニティの大きさは最大規模であることがよく分かりました。
セッションの内容もここでしか聞けないことが多いのももちろんですが、この大きな Java コミュニティの雰囲気を体感できることや、Java の仕様策定に携わっている人達の話が直接聞けること (その人達の人柄を見ることができたこと) も大きかったです。いやー、本当に行けてよかった。

*1:JavaFX はネイティブのファイルチューザーを表示します。

*2:ちなみに Gerrit さんは Swing でもかっこいいコントロールを色々作っています

JavaOne参加レポート (9/25)

JavaOne 4 日目となる 9/25 のレポートです。JJUGJavaOne 報告会の準備でこちらの作業を後回しにしてしまい、こんなに遅い公開となりました。ごめんなさい。
この日に参加したセッションは次の通りです。この日は夜に Oracle Open World と一緒に開催される Appreciatition Event があったので、夕方まででセッションが終わりました。

  • In-Database Container for Hadoop: When MapReduce Meets RDBMS [CON9240]
  • Java 8 Streams: Lambda in Top Gear [CON7942]
  • Java 8 Collections and Concurrency [CON7962]
  • Optimizing JavaFX Applications [CON3141]
  • Top 10 Web Application Defenses for Java Developers [CON5523]
  • The State of Java Web Container Security [CON8016]

JavaFXJava SE ではとても濃い内容の話を聞けました。また、Hadoop という JavaOne ではちょっと異色のセッションにも参加しています。

In-Database Container for Hadoop: When MapReduce Meets RDBMS [CON9240]

Hadoop についてのセッションです。Oracle では何と HadoopOracle のコンテナ上で動かしてしまおうという試みを行っているようで、そのアーキテクチャ、利用方法についてデモを交えて解説するというものでした。

Hadoop を利用する上で大きな課題がデータの移動です。多くの場合、Hadoop を使って解析したいデータは何らかの別のストレージ (多くはデータベース) に置かれています。
これを Hadoop (HDFS) 側に持ってくる必要がありますが、何せ対象は「ビッグデータ」。移動するだけでも大変ですが、セキュリティ、データの整合性などにも気をつかう必要があり、相当な運用スキルが要求されます。

そこで Oracle が考えたのは、いっそのこと Oracle の上で Hadoop を動かしちゃおう!というものです。
Oracle DB は JVM も動かしていますが、この上で Apache Hadoop を動かします。Oracle の Parallel Query エンジンがデータのパーティショニングやジョブのスケジューリングを行うというアーキテクチャです。
データストレージとしては通常のファイルの他に Oracle 上のテーブルやビューも対象とします。Oracle のテーブルやビューを読み書きするために専用の TableReader、TableWriter クラスを用意しています。ダイレクトに Oracle のテーブル上のデータを読み書きできるので、わざわざデータを移動する必要がないということになります。

MapReduce ジョブの実行方法についてですが、Mapper と Reducer は通常の Hadoop の開発と同じように作ります。この MapReduce ジョブは Java でドライバクラスを作って実行する方法 (通常の Hadoop におけるジョブ実行方法) と、SQL から実行する方法があります。
Java で記述する場合、oracle.sql.hadoop パッケージにある Job クラスを使って、ジョブの実行設定を記述します。Job#setMapOutputKeyDBType("VARCHAR2(10)") とか記述しますw Job#run() の引数に読み込み元のテーブルと出力先のテーブルを指定します。
Java で作ったジョブは Oracle に登録し、Java ストアドプロシージャとして実行することになります。
SQL の場合、SELCT * FROM TABLE (HREDUCE_JP_WORDCOUNT(:RedConf, ... (HMAP_JP_WORDCOUNT(:MapConf, ... という感じで、Map ジョブや Reduce ジョブの結果をテーブルに見立てて SQL を記述します。うまく書けば SQL でデータのパイプラインを組み立てられることになります。
これもやはりストアドプロシージャとして登録して実行することになります。

実際にデモも行ってもらいました。MapReduce を使ってアクセス数を集計するというものです。SQL* Plus から MapReduce ジョブを実行する様はなかなかシュールでしたw
MapReduce タスクが読み込みやすいような形のビューを作って実行させていました。

なかなかすごいのですが、現時点ではプロトタイプのみで製品にはなっていないようです。ですがデータ移動に困っている人は結構多いはずですので、製品化を期待して待っています。
でも高そう。製品化するとなると恐らく Big Data Appliance や Exadata といったアプライアンス製品に載るんでしょうね。

なお、先日行われたJavaOne 2013 サンフランシスコ報告会 TokyoでもLTでこのセッションについてのお話しをしました。当日の発表資料を以下に示しておくのでご参考までに。

JavaOne2013報告会 LT資料 Hadoopの話を聞いてきた from Takashi Aoe

Java 8 Streams: Lambda in Top Gear [CON7942]

Brian Goetzさんによる、Stream についてみっちり解説するセッションです。大変人気のあるセッションで、立ち見が発生していました。

Java SE 8 になって導入される Lambda 式ですが、その Lambda 式の導入で最も大きな変化があるのがコレクションの操作です。Stream の導入により、Java でもデータ操作を宣言的に行えるようになります。

Stream はデータセットに対する処理の抽象化です。データ構造ではありません。
無限リストを取り扱うことができ、処理は UNIX のコマンドのようにパイプラインをつなげるような形で処理を行います。
Stream のパイプラインはソース、0かそれ以上の中間操作、終端操作で構成されます。基本的に中間操作を行うメソッドパイプラインを組み立てるだけで、可能な限り遅延処理されます。パイプラインの実行を行うのは終端操作となります。

Stream<Txn> s1 = txns.stream();                                          // ソース
Stream<Txn> s2 = s1.filter(t -> t.getBuyer().getState().equals(“NY”)); // 中間操作
IntStream   s3 = s2.mapToInt(Txn::getPrice);                             // 中間操作
int         sum = s3.sum();                                              // 終端操作

ソースの生成方法は色々あります。通常はコレクションの stream() メソッドを呼び出して作りますが、IntStream.range() や Files.walk() みたいなのもあります。
このソースによって SIZED、ORDERED、DISTINCT、SORTED といった Stream の性質が決まります。例えば ArrayList だったら SIZED と ORDERED という性質を持ちます。
また、ソースによって Decomposition (ばらしやすさ) が異なり、並列処理に影響します。例えば LinkedList はばらせないので、並列処理の効果がありません。
中間操作の処理は先ほども述べたように遅延されます。また、中間操作はパイプラインの性質に影響を与えます。例えば map() は SIZED を保持しますが、DISTINCT や SORTED の性質は消えます。
そして終端操作がパイプラインを実行することになります。この処理がシーケンシャルもしくはパラレルに実行されることになります。

また注意点として、パイプラインは一度きりの実行で分岐や再利用はできないこと、実行中はソースをいじらないこと、処理はステートレスに行う必要があることを挙げていました。
最後の点についてですが、例えば次のように forEach() の中で外部のコレクションに値を追加するようなことは NG です。こうするとスレッドセーフでなくなり、並列化できなくなります。

List<Person> sellers = new ArrayList<>();
txns.map(Txn::getSeller).forEach(s -> sellers.add(s));

次のように畳み込み処理のために用意されたメソッドを使うようにします。

txn.map(Txn::getSeller).collect(Collectors.toList());

並列処理を行う場合は stream() メソッドの代わりに parallelStream() メソッドを使います。当然のことながら並列化してもしなくても結果が同じになるようにしなければいけません。 *1
また、タスクごとに互いの結果に触れることもできません。
Java SE 7 で導入された Fork/Join フレームワークをベースに作られている *2 ので、分割統治法で処理されます。

最後に並列化の性能について触れていましたが、データセットのサイズを N 、パイプライン処理のコストを Q として、N * Q が高い値になるほど並列化の効果が得られやすいとのことでした。
実データの比較結果を見せてもらいましたが、だいたいレコード数が 10,000 を超えたあたりで逆転していました。

とても濃い内容のセッションでした。仕様策定に関わった人から直接こういう濃い内容の話を聞けるというのはいいですねえ。

Java 8 Collections and Concurrency [CON7962]

Java SE 8 におけるクラスライブラリの細かい改善について解説するセッションです。具体的には JSR-335、JEP-142、155、171、180 についての解説です。

JEP-142 は @Contended というアノテーションを追加し、False Sharing 問題を解決するというものです。
Java でフィールドを複数持つクラスを定義すると、それぞれのフィールドが連続したメモリアドレスに配置されますが、マルチコアの場合、共有していないデータを CPU キャッシュ上の同一ラインで共有してしまうという、False Sharing 問題を発生させることがあります。 *3
そこで新たに加わった @Contended アノテーションを片方のフィールドに付与すると、別々のラインに配置してくれるようになるとのことです。

JEP-155 は並行処理に関する小さなアップデートを集めたものです。以下に概要を列挙します。

  • 複数のスレッドから更新され、参照頻度が少ない場合に従来の AtomicLong や AtomicDouble などの代わりに使うことのできる、LongAccumulator や LongAdder といったクラスが追加された。
    • Accumulator は汎用的な更新に使う。
    • Adder には increment() や add()、sum() といった演算メソッドが用意されている。
  • ConcurrentHashMap が強化されている。大きな要素数になった場合のスキャン性能が強化され、バルク操作もできるようになる。よりキャッシュ向きになった。
  • ForkJoin の改善。多数のタスクをコミットしたときのスループットが向上している。
  • ForkJoin 共有プール。Java SE 8 からは明示的に ForkJoinPool を作らなくても、デフォルトで ForkJoinTask の共有プールが用意されている。
  • ReadWriteLock に対する StampedLock というものが新たに追加される。これはいわゆる楽観ロック。
    • StampedLock#tryOptimistcRead() して stamp をとり、StampedLock#vaidate() に渡す、という使い方をする。
  • CompletionStage というインターフェースが加わる (実装クラスとして CompletableFuture がある) 。これは Deferred オブジェクトに相当するもの。
    • stage.thenApply(Lambda 式).thenAccept(Lambda 式).thenRun(Lambda 式) という風に書ける。

JEP-171 はメモリ操作の順序性を保証する機能 (Fence) を追加するというもののようで、sun.misc.Unsafe クラスに読み込み、書き込み、読み書き両方のそれぞれに相当する loadFence()、storeFence()、fullFence() というメソッドが追加されるとのことです。
でも sun パッケージに入っているので表には出てこないということですね。

JEP-180 は HashMap の改善に関するもので、これまではキーのハッシュの衝突が発生した場合、LinkedList に格納していましたが (O(n) オーダーの検索になる) 、8 ではエントリが Comparable の場合に限って、B ツリーに格納するように改善されたようです。
もっとも、良いハッシュアルゴリズムを使うことが一番大事だよと話していました。まあそうですねえ。

JSR-335 はコレクションの拡張です。次のような改善が行われています。

  • sort() にデフォルト実装が入る。
  • コアクラスの実装がより最適化されている。
  • map に computeIfAbsent() が入る!
    • これは個人的に嬉しかったです。次のようなことができます。
map.computeIfAbsent(key, k -> new ArrayList()).add(elm)

このような感じで、細かいアップデートについてカバーするというセッションでした。こういう細かい情報は案外得られなかったりするので、とってもありがたかったです。

Optimizing JavaFX Applications [CON3141]

JavaFXレンダリング処理の詳細について解説するという実にディープな内容のセッションでした。

JavaFX は主に 2 つのスレッドが使われています。1 つは FX アプリケーションスレッド (以下 FX スレッド) 。こちらはアプリケーションの入力イベントや後述の pulse イベントを処理するスレッドです。もう 1 つはレンダースレッドで、こちらはシーングラフの状態をレンダリングする処理のために使われます。

そして pulse についての説明です。pulse とは 16ms おきにタイマーで起動されるイベントで、シーングラフの状態を調べて、どうペイントすべきかを決定する処理を行います。タイマーチェックの際に次の条件を満たしていれば実行されます。

  • アニメーションが実行中である
  • シーン上で変更が発生している (dirty scenes が存在する、という言い方をしていました)
  • 明示的に pulse の実行が要求された
  • 前の pulse がまだ実行中ではない

pulse の中では、アニメーションの実行 -> CSS の評価 -> レイアウトの評価 -> コンポーネント境界の更新 -> (前回の pulse の結果発生した) レンダリング完了の待機 -> Scene 上の Node の同期 -> RenderJob の作成、の順で処理が行われます。そして、最後の処理で作った RenderJob をレンダースレッドに渡して、レンダースレッドに描画を行ってもらいます。
なお、JavaFX 2.x では FX スレッドとレンダースレッドの並行性に問題があり、レンダースレッドでの RenderJob の実行が完了しなければ次の pulse が実行されないようになっていました。JavaFX 8 では pulse の途中でレンダリング完了を待つフェーズを挟み込むようにし、より並行性を高めているとのことです。

続いて、ハードウェアアクセラレーションが効いている場合とそうでない場合の違いについての説明に入りました。
Windows では Direct3D を使いますが、その場合、 pulse で作られた RenderJob はレンダースレッドに渡され、レンダースレッドにて paint して D3DSwapChain#present() をコールします。
これに対し、ソフトウェアレンダリングになった場合は、レンダースレッドで paint した後、ピクセルをバッファにコピーして FX スレッドに戻してピクセルを更新します。つまり、D3D の場合と違って描画処理の一部が FX スレッドを使うことになります。
Mac の場合は OpenGL を使いますが、レンダースレッドで paint 後、 FX スレッドに戻して、FX スレッドで OpenGL のコンテキストを使ってテクスチャを描画します。
また、JFXPanel を使って Swing 上に JavaFX のシーングラフを置いた場合、Java2D を使ってシーングラフを描画することになります。この場合はレンダースレッドが AWT の Component#repaint() をコールして、AWT に描画させます。

WebView については、WebKit に対して代理のタイマーを渡しているそうです。このタイマーは常に空のアニメーションを実行しており、JavaScript によるアニメーションをハンドルします。
また、Web ページ上でダーティリージョンが発生した場合、レンダリングキューを作って処理をレンダースレッドに渡しているとのことです。

このような JavaFX の動きについて説明した上で、パフォーマンスの計測方法についての解説を行いました。
PerformanceTracker というクラスが com.sun.javafx.perf パッケージにあります。このクラスの getSceneTracker() メソッドの引数に Scene を渡してインスタンスを作ります。このクラスには getInstantFPS() や getAverageFPS() といった性能測定に必要なメソッドが用意されています。
setOnPulse() や setOnRenderedFrameTask() といった、処理フェーズの合間に処理を挟み込めるようなメソッドも用意されています。
また pulse の状態を見るには PulseLogger というものがあり、-Djavafx.pulseLogger=true を設定することで出力されるようになります。pulse の処理情報、実行時間、カウンタなどが出力されます。

最後に JavaFX ランタイムの挙動を変更するいくつかのオプションを紹介していました。

  • Glass Robot。com.sun.glass.ui.Robot クラスがそれで、JavaFX 専用の Robot クラス。JemmyFX が使用している。
  • フルスピードモードというものがある。-Djavafx.animation.fullspeed=true を設定すると有効化され、pulse の間の待ち時間がなくなる。
    • つまり 60FPS 以上を出すことが可能になります。使うとしたらベンチマークの時くらいでしょうね。
  • -Dquantums.norenderjobs=true を設定するとシングルスレッドモードになる。
  • GLTrace という OpenGL/EGL API の呼び出し状況をトレースするツールがあり、Linux 版及び MacOSX 版がある。
    • openjfx/rt/gltrace にソースがある。

最後に JavaFX におけるプロファイリングについてのアドバイスがあり、JavaFX は多くの処理を GPU に行わせており、また CPU を使う処理も大半は JavaFX ランタイムが処理を行っているため、CPU プロファイリングは余り効果的ではないとのことでした。
このセッションで紹介した PulseLogger などのツールを活用すべし、ということでしょうね。

いや、実に濃いセッションでした。こういう話を聞くと、JavaOne に来て良かったなあと思いますね。

Top 10 Web Application Defenses for Java Developers [CON5523]

OWASP のメンバーの Jim Manico さんによる、Web アプリケーションのセキュリティ対策についてのセッションです。
この方、とにかくノリのいい、楽しい方で、すさまじいマシンガントークで、ノリノリになってまくし立てていました。それを聞いているだけで楽しかったです。

SQL インジェクション、パスワード保存、XSS、HTML サニタイズCSRF、暗号化、クリックジャッキング、アクセスコントロールなどについて、防御方法を順に説明していました。
それらの説明に割と共通していたのが、「下手に自分で作り込むよりも、過去の知見が集積された OSS ライブラリを活用するように」という点でした。これはなるほどと感心しました。以下、概要を列挙します。

  • SQL インジェクションの防止はパラメータ化。Web アプリケーションがクラックされるトップの原因は「';」をテキストボックスに入力されること。
  • パスワードの保存についての注意点。
    • パスワードは絶対に文字種を限定しないこと!
    • 暗号化する場合、キーはクレデンシャルとは別のストアに置くこと。
    • ハッシュ生成は別サービスで行う。
    • ソルトを付けること。
  • XSS の対策はもちろんエスケープだけど、エスケープは色んな種類があって大変。そこで OWASP Java Encoder Project がお勧め。コンテキスト別に必要な関数を提供しており、パフォーマンスもとても良い。
  • HTML のサニタイズは、最近だとリッチテキストエディタを用意する必要もあったりして、一概に全てサニタイズできない。そこで OWASP HTML Sanitizer Project がお勧め。許可するタグだけを設定してサニタイズができるようになる。
  • CSRF 対策。
    • 最近だとホームルーターCSRF 脆弱性を突いてパスワードを変更するといった事例も出てきている。
    • トークンを入れるのが基本的かつ強力な対策。ただし、XSS 対策がきちんと行われていることが前提!
    • Amazon のように、再認証プロセスを入れるのも良い。
  • クリックジャッキング。
    • iframe を透明化して、別 Web サイトを被せて誤操作させる手口。
    • X-FRAME-OPTIONS に SAMEORIGIN を設定して対策する。
  • アクセスコントロール。
    • 自分で認証認可のロジックを作り込むと、バグがあったときに大変。
    • Apache Shiro のようなライブラリを活用しよう。
  • Certificate Pinning (証明書のピン留め) 。

このような感じで、結構いいまとめでした。なによりセッション全体が楽しかったですねえ。あんな風に楽しいプレゼンができるようになりたいなあ。

The State of Java Web Container Security [CON8016]

これはパネルディスカッションでした。今後 Java EE コンテナに対して、どのようなセキュリティ面での対策が加わるようになるといいのか、について議論するものです。
正直こういうフリーディスカッションの形式だと、自分の英語力では少し厳しかったです。(>_<)
次のような話が話題に挙がりました。

  • CSRF 対策。
    • Tomcat は対策が入っている。
    • タグを書き込む形式がいい?それともコンポーネントを用意?
    • トークンの生成頻度はどれが適当?
      • セッション単位?毎回?
      • Tomcat はレベルを設定出来るよね。
    • 一律に対策を入れちゃうとブックマークができなくちゃっちゃうよね。
  • HTTP パラメータ汚染。
    • 今のサーブレットでは URL のクエリパラメータが form パラメータに優先されるという問題がある。
      • どちらも HttpServletRequest#getParameter() で取得するので。
    • 明確に GET と POST で取り出す場所を分けるべきでは? PHP みたいに。
  • セキュリティ制約。
    • 今は URL パターンのみだよね。
    • ブラウザに指示する HTTP ヘッダ (Strict-Transport=security とか X-Frame-Options とか) を扱えるようにすべきでは?
  • 認証認可。
    • Spring Security ライクに XML で外部定義したいなあ、という意見が。
      • (それに対し、「いや設定変えたらテストするからどっちみちコンパイルするだろ」という突っ込みがw)

私が聞き取れたのは大体こんなところです。(^^;;
確かにもう少し JavaEE レベルでこのあたりの対策は追加していって欲しいかな、とは思っています。

*1:deterministic でないといけない、という言い方をしますね。

*2:なので、使用スレッド数などの設定も同様であるとのことでした。

*3:当日セッションを聞いていたときは、この False Sharing 問題についてよく知らなかったのですが、ここの解説が分かり易かったです。

JavaOne報告会でJavaFXについての発表&LTを行ってきました

10/19 に実施されたJavaOne 2013 サンフランシスコ報告会 Tokyoにて、JavaFXのアップデートについての発表とLTを行ってきました。

当日のJavaFXアップデートの資料は以下の通りです。

JavaOne2013報告会 JavaFX Update from Takashi Aoe

JavaOne初参加の身でありながら、例年は櫻庭さんが担当されているポジションを引き継ぐことになったので、とても緊張しました。
自分の前に寺田さん、大山さん、櫻庭さんが発表がありました。3人の発表で場が大盛り上がりした状態で自分の発表に入ったのですが、自分の発表になると雰囲気がしーんとした感じになってしまったので、「うわ、これは失敗かなあ...」とショックを受けたのですが、後から聞いた話だと結構皆さんそれなりに楽しんで聞いて頂けたようで、ほっとしています。
そうは言ってもこのような大きな場で長丁場の発表をするのにはまだまだ修行が必要だと言うことがよーく分かりました。精進します。

本編のJavaFXアップデートに続いて、LTでもお話しをしてきました。こちらはJavaOneではちょっと珍しい感じのHadoopのセッションについてです。
JavaFXの方は真面目な感じで行ったので、こちらはちょっとくだけた感じにしました。
発表資料は次の通りです。

JavaOne2013報告会 LT資料 Hadoopの話を聞いてきた from Takashi Aoe

今のところSlideShareでのページビューはLTの方がちょっと上ですね。何だかんだ言ってHadoopは注目ネタですかね。

さて、ブログの方のJavaOne報告もまだ半分ほど残っていますね。こちらも早めにアップします。(^^;;

JavaOne参加レポート (9/24)

JavaOne 3 日目となる 9/24 のレポートです。この日に参加したセッションは以下の通りです。

  • Securing Java in the Server Room [CON3636]
  • Ten Man-Years of JavaFX: Real-World Project Experiences [CON2670]
  • JDK 8 Compact Profiles for Embedded and Oracle ADF Mobile on iOS Devices [CON3736]
  • Java Persistence 2.1 [CON6700]
  • Dissecting Java Malware [CON5593]
  • Jersey 2 MVC in Action [BOF5548]
  • Money and Currency in Java: Best Practices, Libraries, and JSR 354 [BOF5267]
  • What and How Java Troubleshooters Think: Eight Years of Troubleshooting Java [BOF7862]

この日はセキュリティ系のセッションを 2 つ取りました。今年の JavaOne はセキュリティ系のセッションが多いように思われます。やはりここ最近セキュリティ関連で問題が色々起きたためでしょうか。

Securing Java in the Server Room [CON3636]

IBM UK の方 (IMB Java SE 8 のテクニカルリードだそうです) による、サーバーサイドアプリケーションにおけるセキュリティについてのセッションでした。
サーバーサイドアプリケーションは複数のユーザーのために 1 つのタスクをこなし、様々なクライアントアプリえーションやバックエンドシステムにつながるという特徴があります。ビジネス的に価値があるものを扱っていることが多く、様々なデータが行き交うため、アタッカーの標的になりやすいです。

そのためには計画、開発、運用それぞれのフェーズに置いて計画、対策を行うことが重要であるとのことでした。
つまり、要件定義の段階で分析を行い、開発においてはコード、ライブラリ管理や規約整備をきちんと行い、その上で運用するプラットフォームにおいて各種セキュリティ対策を行う、とライフサイクル全体で取り組むべきであるということです。
また、ウォッチすべき情報源としては CVE や NVD、OWASP、Vender Security Bulletins を紹介していました。

クライアント、サーバー、DB で構成されるシンプルなアーキテクチャを例に、レイヤ別に注意すべき点を次のように説明していました。

  • プラットフォーム
    • 設定の誤りによって脆弱性を作ってしまう可能性がある。
    • ユーザーグループの設定の誤りやポートの割り当てなど。
  • Java プラットフォーム
    • API を正しく使うこと。
    • セキュリティ原則に従ったコーディングを行うこと。リフレクションには注意を払って。
  • ミドルウェアとアプリケーション
    • ミドルウェアのコンセプトに照らし合わせた正しい使い方を。
    • データアクセスへの認証、認可をアプリケーションレイヤで行っている場合は要注意。
  • ユーザーセッション
    • Unit of Work の範囲内にきちんとデータを保護すること。
    • アイデンティティ情報をシェアするときはきちんと保護すること。
  • クライアントとのインターフェース
    • データ交換には気を遣うこと
    • cryptographic のテクニックは色々問題がある。
  • データベース
    • ビジネス上の要件に照らし合わせて、適切なアクセス制御を行うこと。
    • DB の外にも (ファイルなど) データを置くとリスクが増大する。
  • システム
    • syslog に出力する内容には注意。
    • システム固有のツールを利用する場合は注意すること。

割と一般論的な内容でしたが、良くまとまっていたと思います。最後に IBM AppScan という製品を紹介していました。

Ten Man-Years of JavaFX: Real-World Project Experiences [CON2670]

「10 人年の JavaFX 開発!」というなかなか刺激的なタイトルです。
リッチクライアントのテストツールなどを開発、販売している SmartBear 社の方によるセッションです。 *1
LoadUIという JavaFX で開発した負荷テストツールの開発を通して、JavaFX の実開発を通して学んだ JavaFX の良さ、開発上の注意点、工夫したことについて紹介するというとても実践的な内容でした。

先にも挙げたように LoadUI は負荷テストツールです。負荷テストツールと言えば古くからある LoadRunner 、そして OSSJMeter が有名ですが、これらは UI がとても醜いため、新たに負荷テストツールを開発することにしたとのことです。
LoadUI のインターフェースは以下の写真のようにど派手なものとなっています。

画面内のキャンバスに表示されているボックスが JMeter で言えば左側のツリーに表示されるオブジェクトに相当し、ボックス同士をワイヤリングしてワークフローを作っていきます。ワークフローが視覚的に分かり易いのが特徴です。何よりかっこいいので使っていて楽しそうですね。

最初のバージョンは JavaFX1 で構築しました。JavFX を選んだ理由としては、Illustrator で作成したコンセプトデザインを JavaFX ならば忠実に再現可能だったからだそうです (Swing では難しかった) 。
しかし、JavaFX2 での突然の方針転換。SmartBear 社の CTO が直々に Oracle に EOL を延ばしてくれ!と頼んだそうです。でも答えは「No.」...。ただランタイムの配布は 2013 年 3 月までに延ばしてもらい、2013 年 4 月に JavaFX2 へのマイグレーションを完了、というぎりぎりのタイミングで乗り切ったそうです!

JavaFX1 から 2 への移行は9ヶ月で行ったそうです。ソースコード量は 41K 行から 32 K 行に減りましたが、リライトの必要な部分が多かったとのことです。性能は 2 にすることで大幅に向上したようです。
JavaFX2 の良さとして、JavaFX1 で存在した、IDE サポートがプア、デバッグしにくい、コントロールの種類が少ないという弱点が解消され、FXML によって MVC/MVP アーキテクチャを取れるという利点が加わった点を挙げていました。
ただ、プラットフォーム別に微妙に異なる問題があったり、Bindings.bindBidirectional() / bindContent() が弱参照である点がドキュメント化されていないという落とし穴にはまったとのことです。

JavaFX2 実開発を行った上で学んだ Tips として、全プラットフォームでテストすること、CSS、FXMLをよく学ぶこと、ビットマップは極力避けてなるべく CSS スタイリングを使う、IDEIntelliJNetBeans が良いこと、Java8 をしっかり予習しておこう、何より楽しもう!といった点を挙げていました。

また、LoadUI の開発を通して、開発を支援するために開発した、GuavaFXTestFX を紹介しました。どちらも OSS で公開しています。
GuavaFX は Goole Guava にインスパイアされた ObservableList を拡張するライブラリです。transfrom、filter、concat といった機能を備えています。キャンバスにドロップしたオブジェクトをまとめてバインディングするのに利用しているようです。JavaFX8 では GuavaFX に備わっている機能がいくつか実装されており、将来的にはこのライブラリが不要になることを望んでいるとのことです。
TestFX は文字通り JavaFX アプリケーションの自動 UI テストを行うためのツールです。OpenJFX では似たようなものとして JemmyFX というツールが開発されていますが、JemmyFX は複雑で冗長であったため、別に開発したとのことです。
JUnit のテストコード上に rightClick("#desktop").moveMouseTo("New").click("Text Documents")... という感じで流れるようにテストする動作を記述できるようになっており、なるほどこれはとても使い易そうだと思いました。

このような感じで本格的なプロジェクトを通しての体験談であったため、非常に聞き応えがあり、学ぶことの多いセッションでした。

JDK 8 Compact Profiles for Embedded and Oracle ADF Mobile on iOS Devices [CON3736]

JavaOne を通して自分が聞いた唯一の Embedded のセッションです。タイトルに iOS と入っていますがこれは完全に釣りで、内容の大部分が JDK8 Compact Profile についての解説でした。

Java SE 8 Compact Profiles とは JDK8 に新たに含まれる小さなランタイムで、Java SE のサブセットとなります。
Java ME/ CDC Converged productに基づいており、ランタイムの小さい順に compact1 / 2/ 3 の 3 種類があります。それとは別に UI スタックとして JavaFX が選択できるようになっています。
compac1 は最も小さく、CDC からの移行に最適で、compact2 はこれに XMLJDBCRMI などが加わります。compact3 にはさらに JMX、naming、security、コンパイラ API が加わります。ただし、これらプロファイルに含まれているものでも、java.beans パッケージを参照している API は取り除かれます。

Compact Profile は OpenJDK のソースからビルドすることが可能で、Linux のみをターゲットとしているとのことです。
OpenJDK のソースを hg fclone して、make images profiles を実行することで各プロファイルのイメージがビルドされます。
各イメージは別のクラスファイルが生成されるので、compact1 のイメージに compact2 のクラスファイルを追加する、といったことはできないそうです。

プロファイルを利用するアプリケーションを開発する場合、 javac -profile とするか、javac -bootclasspath でクラスパスを指定します。
また、NetBeans7.4 ではプロファイルが選択できるようになっています。その場合、プロファイルで使用できないクラスを使うと、ソースエディタ上で警告してくれるようになります。

さて、この Compact Profile の配布形態についてですが、 RI と Embedded Compact Profiles という 2 種類のプロダクトがリリースされるとのことです。
前者は文字通り参照実装で、Linux x86 のみをターゲットとしており、サイズもそのままとのことです。
これに対し後者は Oracle の商用プロダクトであり、ARM、PPCx86 に対応し、サイズもより小さくなっているとのことです。組み込み向けに jrecreate というツールも同梱されており、アプリに JRE ごと同梱したい場合などに、必要なものだけを含めたランタイムを生成できるようにしているようです。

Embedded Profiles にはオプショナルコンポーネントとして JavaFX やセキュリティコンポーネントを選べます。
JavaFX は、WebView と MediaView がまだ使えないとのことです。また FXML は Compact2 以上が必要です。JavaFX を追加するとサイズが 10MB 程増え、全体のサイズが 18MB になります。でも仮に Swing/AWT だとこれが 52MB になっちゃうそうです。
また、Swing だと X が必要ですが、JavaFX の場合は直接 OpenGL のライブラリを使うので不要みたいなことを言っていました。

こういった Compact Profile のユースケースとして、キオスク端末やホームゲートウェイ、ETC 的なシステムなどを挙げていました。まさに今回のキーノートでも強調していた IoT 的な分野に関わってきますねえ。

最後にちょっとだけ ADF Mobile とその iOS 実装についての話がありました。Cordova ベースの iOS アプリ部分が VMChannel を通して Compact2 Profile の JVM と通信するというアーキテクチャになっているようです。

現在は Linux のみをターゲットとし、WindowsMac 向けには Compact Profile の提供はありませんが、Mac AppStore や Windows Store 向けにあった方が良いのかも知れないと話していました。

こんな感じで iOS 云々は完全に釣りでしたが、ほとんど知らなかった Compacto Profile についての情報を収集できたので、まあ良かったかなと思いました。

Java Persistence 2.1 [CON6700]

Linda DeMichiel さんによる JPA2.1 についての解説です。スペックリード本人に解説してもらうというのは JavaOne に参加した甲斐がありますねえ。

JPA2.1 では DB のベンダー関数サポート、Criteria Query でのバルク update、delete サポート、コンバータ、ネイティブクエリの強化などがありますが、今回は Entity Graph 、ストアドプロシージャサポート、スキーマ生成機能の強化の 3 点について詳しく解説してもらいました。

Entity Graph は、エンティティの関連をフェッチする新しい機能です。エンティティ関連のグラフ構造を見て、メタデータを定義することでフェッチを行えるようにするというものです。
例えば、以下の図のようにエンティティの関連の内、赤い部分だけフェッチしたい、というような複雑なフェッチを行う場合に使います。

EntityGrapsh クラスのインスタンスにたどりたいグラフの属性を指定し、そのインスタンスをクエリに対してヒントとして渡すような使い方をします。余りツリーが深いと大変なので、サブグラフを切り出してまとめるようなこともできます。
中々面白い機能だとは思いましたが、使いこなせる人は少なそうだなあとも思いました。そもそも DB からレコードをフェッチする際にグラフ構造を意識してデータを取ってこようという人が果たしてどれ位いるのだろうか? 少なくとも SIer の現場ではなさそうだなあ。(苦笑)

ストアドサポートは、ストアドの実行と永続化プロバイダへのストアドの登録をサポートしています。
ネイティブクエリと同様、アノテーションでの定義と動的に組み立てての実行の両方が可能です。
結果は INOUT、OUT パラメータや ResultSet のマッピング (ネイティブクエリの場合と同じ) 、executeUpdate() の返値で受け取ります。

スキーマ生成については、インデックスやデフォルト値などの指定ができるようになります。また、FK などの制約も掛けるかどうかを指定できるようになります。これらはメタアノテーションとして用意されています。
また DDL もファイルとしてはき出せるようになります。
ここまでできるようになれば、Java コード側に設定を集約することが可能になりますね。地味ながらもいい進歩だと思いました。

今後についてですが、EE8 にアサイン予定で、現在リクエストを受付中ですよとのことです。

Dissecting Java Malware [CON5593]

今年の Java はセキュリティ面での話題がとても多かったですが、その Java で作られたマルウェアがどのように作られているのか、についてを解説するセッションでした。

Java はブラウザプラグイン経由で起動する場合、SecurityManager を起動します。マルウェアはこれをバイパスすることを狙います。パラメータをチェックしていないネイティブメソッドやプログラムのバグを突いてきます。
最近は Exploits as a Service なんて言葉も出てきているようで、エクスプロイトツールは様々な場所で公開されているようです。urlquery.net ではマルウェアの危険性がある URL がリストアップされているので、参考になるとのことです。

マルウェアは解析を困難にするために様々な工夫をしています (これを Obfucation と呼びます) 。難読化、実行時に定数プールをデコード、決して使わない変数を紛れ込ませてスタックをスクランブルする、といったテクニックを使ってきます。
また、Java のソースとしては戻り値だけが異なるオーバーロードメソッドは NG なのですが、バイトコードとしては許されます。これも obfucation に良く使われるそうです。
ただ、どんなマルウェアJVM の仕様には従う必要があるので、JVM 上でのコントロールフローを視覚化して解析しているそうです。(そのようなツールとして IDA を紹介していました)

そして、いくつかのマルウェア分析例についての解説がありました。
シリアライズしたオブジェクトを JAR に置く、文字列をわざと StringBuilder 組み立てにして本来の文字列を隠す (RMI 接続のデフォルト名を隠していました) 、null 同士の比較をして絶対に通らないコントロールフローを作る、GIF にデータを紛れ込ませる、といった手段を紹介していました。
ちょっと難しい内容でしたが、実に興味深かったです。

で、こういったマルウェアに対する JRE 側の対策ですが、Java SE 7u25 以降では、コントロールパネルのセキュリティスライダが「高」より上しかなくなり、未署名の Applet は警告ダイアログを出す、古い JRE では動かないようにする、という変更が行われました。
また、古い JRE を除去するツールも用意したとのことです (現在は Windows 用のみ) 。
Applet、Web Start で署名必須にした理由としては、攻撃者にツールとして Java を選択する意欲を低下させる狙いがあったとのことです。

サンドボックス上で動く Java で署名必須というのも何だかなあとは思いますが、最近のクライアントアプリ開発は iOSMacWindows など審査を通す必要のあるプラットフォームが増えましたし、牧歌的な時代は終わったのかも知れませんねえ。

Jersey 2 MVC in Action [BOF5548]

JAX-RS の参照実装である Jersey には、HTML Web アプリケーションを開発するためのちょっとした MVC フレームワークが付いています。Java EE 7 に対応した Jersey2 の MVC フレームワークの新機能について解説するセッションです。Jersey MVC は自分の仕事でも使っていることもあり、とても楽しみにしていたセッションでした。

Jersey2 では MVC フレームワークは別モジュールとなり、基本となる jersey-mvc 、Bean Validation と統合する jersey-mvc-bean-validation 、そしてテンプレートエンジン別に jersey-mvc-jsp / freemarker / mestache モジュールが用意されています。
新機能としては Bean Validation との統合、テンプレートアノテーションの追加、テンプレートエンジンとして FreeMarker と Mustache サポートの追加、が挙げられます。
テンプレートエンジンに Java の世界ではおなじみの FreeMarker に加え、Mustache が追加されたのは驚きました。Mustache はどちらかというと JavaScript の世界でよく使われているテンプレートというイメージがありましたが、Java の世界でも人気が出てきているのでしょうか。

テンプレートについてはこれまでの返値として Viewable オブジェクトを返す方法に加え、@Template アノテーションでテンプレートを指定する方法が加わりました。アノテーションを使った場合はエンティティだけをリターンすれば良くなります (HTML 以外のコンテンツタイプにも一緒に対応できますね) 。
さらに、@ErrorTemplate アノテーションもあり、例外が投げられた場合のテンプレートをしていできます。こうすることでエラー時の分岐も楽に対応できるようになりますね。
これだけでも Jersey2 に移行したいと思いました。

続いてテンプレートの利用についての説明があり、JSP では、コンテキスト変数 it を経由してモデルにアクセスしますが、FreeMarker では model という名称の変数に、Mustache では直接プロパティにアクセスする形式になるとのことです。
また、BeanValidation のエラーメッセージもテンプレートに渡されるようです。
カスタムで好きなテンプレートエンジンを使いたい場合は TemplateProcessor を実装します。割と簡単に実装できそうです。

Bean Validation との統合については、リソースクラスのメソッドパラメータ、フィールド、プロパティに対して Bean Validation の制約アノテーションが付与できるようになります (コンストラクタだけ無理) 。バリデーションエラーは ConstraintViolationException が送出されるので、これに対する ExceptionMapper を用意することになります。
@ErrorTemplate アノテーションを使った場合、List がモデルになります。

以前、自分のブログでも以下のエントリで Jersey の MVC 機能を取り上げましたが、Jersey2 では足りないところが結構補われてきたと思いました。これくらいの機能があれば、もう Struts1 はいらないですね!

JAX-RSはHTML Webアプリケーションを開発するのに充分なフレームワークであるか?
http://d.hatena.ne.jp/aoe-tk/20130317/1363527825

Money and Currency in Java: Best Practices, Libraries, and JSR 354 [BOF5267]

JSR 354: Money and Currency API についてのセッションです。スピーカーは Date Time API のセッションも行っていた Stephen Colebourne と、スペックリードである Anatole Tresch さんでした。

Money はとっても大切なドメイン上の概念であるのに、JDK8 になってもまだ何のサポートも入っていないとの問いかけで始まりました。
一方、Currency については既に JDK に入っています。イミュータブルで、ISO 4217 の貨幣コードに対応しています。JDK7 ではオーバーライドが可能になり、JDK8 は貨幣の変更日もサポートできるようになるといった強化がされています。
この Currency クラスは使えるならば使うようにし、文字列を使うことは避けよう!とのことです。

そして Money ですが、これは Amount + Currency の概念を表すものです。これまで金額を扱う場合は BigDecimal を使うか、Joda-Money や Tom Gibara 氏作成の Money ライブラリを利用していました。JSR-354 はこれらライブラリをベースにした標準になるものです。
JDK9 をターゲットに仕様策定を進めており、貨幣のサポート、丸め処理など最小限の演算、貨幣変換、フォーマットなどをサポートします。

登場するクラス群ですが、Stephen Colebourne 氏が参加しているためか、細かいクラスが色々出てきますw
旧 Currency に近い貨幣を表すクラスである MoneyCurrency、金額を表し、計算に必要なメソッドを備えた Money、フォーマッティングを担当する Formatting、貨幣の変換を行う Conversion などがあります。
ヒストリカルなデータにアクセスしたり、リージョンを扱えたりするような拡張も行えるようにするそうです。

まだ仕様策定中であるということもあり、解説は早めに切り上げて、ディスカッションを行う時間を取っていました。JDBC サポートとかも考えたいね、といった話とかしてましたねえ。

What and How Java Troubleshooters Think: Eight Years of Troubleshooting Java [BOF7862]

アクロクエスト谷本さん勝本さんによる BOF です!

途中何度か詰まってしまったところがあって、見ているこちらもとても緊張しましたw
でも、内容的には実事例を元にした実践的な内容であったので、結構聴講者を引きつけていたと思います。人も結構入っていたし、途中から退席する人も少なかったように見えます。まずまず成功したといっていいのではないでしょうか。お疲れ様でした!

*1:自分のブログでも以前にこのエントリでSmartBear社のツールについて取り上げたことがあります。

JavaOne参加レポート (9/23)

それでは2日目となる9/23のレポートについてまとめます。
この日からが本番と言った感じで、朝から晩までびっちりとセッションが埋まっています。結構ハードです。

この日に参加したセッションは以下の通りです。

  • All the Nodes That Are Fit to Print: A Tour of the New JavaFX Printing APIs [CON2662]
  • Securing JAX-RS RESTful Services [CON5179]
  • Architecting Enterprise JavaFX 8 Applications [CON2229]
  • Introducing the Java Time API in JDK 8 [CON6064]
  • Type Inference in Java SE 8 [CON8165]
  • Lightning-Fast Access to Big Data [BOF5957]
  • JAX-RS and JSON Binding: Past, Present, and Future [BOF5519]

Java SE、Java EEJavaFX をまんべんなく取りました。型推論のセッションがちょっと自分には難易度が高かったですね。

All the Nodes That Are Fit to Print: A Tour of the New JavaFX Printing APIs

JavaFX8 でようやく印刷のためのAPIが導入されました *1 。それについて解説するセッションでした。
JavaFX8 の印刷 API は開発者向けには分かり易い API を提供し、業務アプリケーションに要求されるレベルを満たすことを目標として設計したとのことです。

中心となるクラスは javafx.print.package.PrinterJob クラスで、このクラスが印刷ジョブを制御します。
このクラスの showPrintDialog() メソッドで画面に印刷設定ダイアログを出し、printPage() メソッドに印刷したい範囲のシーングラフを渡します。そして startJob() メソッドで印刷ジョブを開始します。
印刷ダイアログは、独自のダイアログをだしてエンドユーザーに嫌われることが多かったSwingの時の反省から、プラットフォームネイティブなダイアログを出すようにしています。

他に重要なクラスとして、プリンターデバイスを表す Printer クラス、プリンターの機能に関する情報 (サポートしている用紙サイズとか) を保持する PrinterAttribute クラス、印刷ジョブの設定 (サイズ、枚数、色など) を保持する JobSettings クラス、印刷レイアウトの情報 (ページ方向、マージン、 Node の表示範囲など)を保持する PrinterLayout クラスがあります。

デモをあり、JavaFX で描いた円や、JavaFX8 に付いてくる新しい Ensemble アプリケーションのサンプルを印刷する様子を見せてくれました。なお、新しい Ensemble には印刷ボタンが付いています。

総じて中々使い易そうな API だと感じました。現在は Java2D の印刷機能をベースに実装しているようです (WebView については WebKit のプリントレイアウトエンジンを使っている) 。そのため、Java SE 8 のフルプロファイルが必要となります。将来的にはリライトしたいとのことです。
今後は、よりプリンターフレンドリーに、また CSS にも対応して、HTML のように media=print と書けるようにして、画面と印刷で別のスタイルを定義するようなことをやっていきたいとのことでした。

Securing JAX-RS RESTful Services

JavaEE7 に含まれる JAX-RS2.0 について、サーバーサイドの認証/認可、クライアント API 側の認証、そして JAX-RS サービスで OAuth 認証に対応する方法について解説するセッションでした。

サーバー側の認証/認可についてですが、サーブレットコンテナが用意している仕組みはそのまま使えます。この方法は記述が冗長であり、メンテしにくいと言う欠点があります。
JAX-RS では SecurityContext を用意しており、@Context アノテーションでインジェクトできるようになっています。このオブジェクトを使えば、メソッド内の特定の範囲だけ認可の仕組みを入れるなど、柔軟な制御が可能になります。
また、javax.annotation.security パッケージには @PermitAll などと言った認可のための各種アノテーションが用意されており、クラスやメソッド単位で宣言的に認可の設定を行えるようになっています。
また、Jersey2 + MOXy 限定ですが、Entity フィルタリングという機能が用意されています。これはリソースメソッドが返すエンティティのプロパティにアノテーションを貼って、アクセス元の権限に応じてエンティティの特定の属性だけを見せない、といった制御を可能にする機能です。

次にクライアント側についてです。
まず SSL で保護されたサービスにアクセスするために SslConfigurator というクラスが用意されています。ここにキーストアファイルなどの設定を行えます。
認証が必要なサービスへのアクセスですが、Jersey にはリクエスト、レスポンスをフィルタするための ClientRequestFilter、ClientResponseFilter というものがあります。そして、Web サービス側の認証方法に応じた、BasicAuthFilter や OAuth1Filter、OAuth2Filter が用意されていて、これら認証処理に容易に対応できるようになっています。

最後に JAX-RS (Jersey) を使って構築した Web サービスが、OAuth による認証を行う第3者サービスを利用する方法についての解説がありました。
Jersey では OAuth1.0a、2.0 をサポートしており、それぞれ OAuth1AuthorizationFlow, OAuth2AuthorizationFlow というクラスが用意されています。
この Flow オブジェクトにリダイレクト URI やプロンプト方法、識別子を設定し、 start() メソッドで認証を開始します。
そしてサービスプロバイダからコールバックしてもらうためのリソースメソッドを用意し、このメソッドの中で Flow オブジェクトが取得できると認証が成功となります。
実際に Google Task サービスにアクセスするデモを行って見せてくれました。

Architecting Enterprise JavaFX 8 Applications

Adam Bien さんによるセッションです。JavaFXエンタープライズ向けアプリケーションを構築する際のアーキテクチャはどうあるべきか、そしてその考え方を実装した自身作のフレームワークである afterburnerfx の実装について説明を行ってもらいました。

一般的に GUI アプリケーションのアーキテクチャとしては Smalltalk 由来の MVC パターンが良いとされています。しかしながら、近年になって複雑化する一方の GUI アプリケーションにおいては不十分であると考えられるようになってきました。
特にアプリケーションのリッチ化が進むにつれて、View 側のロジックが複雑化する一方です。View のテストは難しいです。そこで、MVC を変形したパターンとして、MVP (Model View Presenter) パターン、Presentation Model パターンなどといった新しいパターンが出てきました。 *2
MVP パターンは簡単に言うと Controller に View を操作する役割を持たせたパターンで、Presentation Model パターンはプレゼンテーションに関連するステートを保持する Model (Presentation Model) 用意し、View と Model の間に置くというパターンです。

JavaFX では FXML という仕組みがあります。FXML はマークアップ側 (View) と1対1で結びつく Controller が存在し、@FXML アノテーションで View 側のコントロールを Controler にインジェクション、さらにメソッドに対しても @FXML アノテーションで View 側で発生したバインディングさせることができます。
よって、FXML の Controller は MVP パターンにおける Presenter の役割を持たせることができます。
さらに JavaFX にはバインディングという優れた仕組みがあるため、Presentation Model を用意すれば、バインディングを利用することでプレゼンテーション側の実装コードを減らすことができるようになります。
そこで、afterburnerfx では次の図の様なアーキテクチャを取っています。

Presenter はサービス (主にネットワーク経由で外部サービスからレコードを取得するコンポーネント) と Presentation Model にアクセスします。サービス経由で取得したデータで Presentation Model をアップデートし、View は Presentation Model のプロパティとバインドしているので、自動的に表示が更新されます。
コンポーネントの結び付けは afterburnerfx 独自で開発した DI の仕組みを使って結びつけています*3 。FXMLLoader には setControllerFactory() というメソッドがあり、ここをフックして Presenter に対してサービスや Presentation Model のインジェクションを行うようにしています。View と PresentationModel のバインドは Presenter が行います。
View の更新はバインディングを利用して極力 PresentationModel のステート変化だけで行えるようにし、イベントハンドリングは FXML のメソッドバインドを使って Presenter のメソッドをそのまま呼び出すようにすることで、JavaFX 固有の API への依存が減るため、よりテスタブルになるというわけです。

JavaFX ではこれまでこのような本格的な GUI アーキテクチャに関する話があまり出ていなかったので、とても興味深いセッションでした。こういう議論が出てくるようになったということは、ある程度 JavaFX が普及期に入りつつあるといえるのかも知れません。

Introducing the Java Time API in JDK 8

Java8 で新たに導入された Date Time API (JSR-310) について、スペックリードの Stephen Colebourne 自身に説明してもらうというセッションです。とりあえず噂の Colebourne さんのお顔が拝めただけでも良かったと思っています。

Date Time API はイミュータブル、流れるような API、明確な API であることを目標として設計したとのことです。日付や時刻を取り扱う上で登場する概念をきちんと分類して、対応するクラスを用意しています。
おかげで沢山の種類のクラスが登場します。日付を表す Date クラス、時刻を表す Time クラス、両方を組み合わせた DateTime クラス、そしてこれらには Local**、Offset**、Zoned** クラスが用意されます。
そして時刻のある時点を指す Instants、時系列に縛られない時間の量を表す Amount (時刻ベースは Duration、日付ベースは Period) といったクラスもあります。
これらクラスにはインスタンスを取得するための now() メソッドや of() メソッド、各種演算メソッドや変換メソッドなどが用意されています。メソッドの意味は比較的明確で、メソッドチェーンができるようになっているので、流れるように記述されます。

各所で色々言われているように、覚えることが多くて大変かもしれませんが、API の意図は非常に明確であるので、個人的には以前のひどかった API よりは随分良くなったと思っています。
Colebourne さんはセマンティクスを明確にすることを重視される方に見受けられました。後日セッションがあった Colebourne さんが中心になって仕様を策定しているの Money and Currency にもそれが良く現れていました。
やっぱり仕様を考えた人のお話を直接聞くというのは理解する上でとても価値があるなあと思いました。

Type Inference in Java SE 8

Java SE 8 での型推論についてのセッションです。私自身が型システムに対して不勉強なこともあり、ちょっと難しい内容のセッションでした。

基本的に Java には型推論はありませんが、型パラメータの指定部分だけではちょっとだけ推論が効きます。Java SE 7 のダイアモンド演算子がそうですね。ただ、Java SE 7 ではこの推論が余り賢くなく、メソッド引数では効かなかったりしていました。それが Java SE 8 では改善されています。また、ラムダ式でもメソッドパラメータの型についてはかなり推論が効くようになっています。
このセッションでは、Java SE 8 ではコンパイラのストラテジーをどのように変更することで改善を行ったかの説明がされていました。

型の推論はプログラムの記述から読み取れる変数の上限、下限境界の情報から連立不等式を組み立て、それを解くような感じになります。不等式が解けない場合は型の推論ができず、コンパイルエラーが起きます。
Java SE 8 ではこの式の組み立てや条件の与え方をより改善することで、これまでは NG だったメソッド引数での型パラメータの省略や、ジェネリックな返値の解決などができるようになっています。条件演算子を挟んでも推論が効くようになります。
このように Java8 では型推論がかなり改善されたため、ダイアモンド演算子が大概の場所で使えるようになるので、より複雑な API を設計可能になるとのことです。

What's New in Java Transaction Processing [BOF3433]

Java EE 7 に含まれる、JTA 1.2 についての解説です。JTA は実に 10 年振りの改訂となったそうです。

2 つの大きな仕様追加があり、1 つは @Transactional アノテーション、もう 1 つは @TransactionScoped アノテーション。どちらも CDI に関わるものです。
@Transactional アノテーションEJB と深く結びついていた CMT を EJB から切り離すためのものです。CDI の管理対象 Bean にこのアノテーションを貼ることで、EJB の CMT と同じ機能が得られるようになります。サポートしているトランザクションタイプとか、デフォルトは実行時例外でロールバックし、チェック例外ではロールバックしないのも同じです。
@TransactionScoped アノテーションCDI 管理対象 Bean のスコープを定めるもので、トランザクションの範囲内でコンテキストが維持されるというものです。

Java EE の持つ機能は元々 EJB と強く結びついていたものが多かったのですが、このトランザクションのようにどんどん EJB から機能を独立して使えるようにしている流れになっているように見受けられます。今後は EJB は元々の役割であった分散処理、非同期処理の専用コンポーネントに戻っていくことになるのでしょうね。

Lightning-Fast Access to Big Data

IBM の方による BOF でしたが、分散インメモリキャッシュの話でした。一般論的に話そうとはしていましたが、まあ IBM の製品の話だったのでつまんなかったです。
やはり「ビッグデータ」なる言葉に釣られるとネタであってもロクなことがないと強く感じましたw

JAX-RS and JSON Binding: Past, Present, and Future

Java EE 7 では JSON をパースするための JSON-P は入りましたが、JSON のデータを JavaBeans にバインドするための JSON-B は結局入りませんでした。
次の Java EE に向けて、JSON-B の仕様が検討されているところのようですが、現在検討されているアノテーションについて淡々と説明する内容でした。
現在、JavaJSON バインディングのライブラリとしては Jackson や Gson あたりが有名だと思いますが、どうも Jackson をベースにしたものになりそうです。ただ、それに MOXy の機能も入れてみたいと考えているようです。(JAX-RS の参照実装である Jersey は 2.x で MOXy を使うようになっていますしね)

*1:JavaFX2.x の時は時間が足りず、ドロップしたそうです。

*2:Martin Fowler の GUI Architectures が参考になります

*3:ただし、インジェクションポイントを示すアノテーションには JSR-330 で定められている @Inject アノテーションを使っています

JavaOne参加レポート (9/22) (作成中)

今回、USサンフランシスコで開催される本家JavaOneに初めて参加することになりました。
本家JavaOneの雰囲気はすごいです!
9/21から現地入りし、26までフルに参加します。1日ごとにエントリをまとめたいと思います。
ただ、JavaOneは朝速くから夜遅くまでびっちりセッションが入っていて、結構忙しいです。とりあえず期間中は歯抜けの状態でアップして、あとで追々追記していきます。

本日 (9/22) は初日で、キーノートセッションと、他にはコミュニティ関連のセッションが中心でした。キーノート以外はまあ肩慣らしといった感じで軽めの内容のものが中心でした。
自分が参加したセッションは次の通りです。

  • Fifteen Years of the NetBeans IDE [UGF10366]
  • NetBeans Power Tools with James and Kirk [UGF10336]
  • Java Strategy and Technical Keynotes [KEY11050]
  • Cool NetBeans Tips and Tricks for JavaFX Development [UGF10339]

コミュニティセッションは全てNetBeans関連のセッションに参加しました。

以下、簡単にレポートをまとめます。

Fifteen Years of the NetBeans IDE [UGF10366]

NetBeansのこれまでとこれからについてのセッションです。NetBeansは今年で誕生してから15年になるとのことです。
パネリストの中に何とJames Goslingさんがいらっしゃいました!

過去の歴史のお話しでは懐かしい2.xや3.x時代のスクリーンショットが出てきました。最近になって利用者やコントリビュートが大きく伸びているそうです。
NetBeansの歴史を振り返った後7.4の説明になり、その後Goslingさんの思い出話になりました。でも、ぼそぼそとしゃべるので良く聞こえない。(><)
MSを常に意識していたとか、NetBeans前のSunのIDE開発の失敗の話とか、Eclipseについて「あいつらマーケティングがうまいんだよなー」と評したりとかそんな話をしてました。
でも最近盛り上がっていて、それはとっても嬉しいとのことでした。

その後ベータテストプログラムのNetCATや、NetBeansのハイスキルなコントリビューターやユーザで構成したプロモーションチームであるNetBeans Dream Teamの紹介をして締めくくっていました。ちなみにNetCATの一番の貢献者には実際に会ったことがないと話してました。OSSらしいですねえ。

NetBeans Power Tools with James and Kirk [UGF10336]

こちらにもGoslingさんがスピーカーとして登場していました。もう一人のスピーカーはJava Performance Tuningで有名なKirk Paperdineさんです。
Goslingさんは所属しているLiquid Robotics社の海洋探査ロボットのデスクトップ版とWeb版コンソールの話、KirkさんはVisualVMによるメモリプロファイルの話をしました。はい、お2人の話の間には何の関連性もありませんw

Goslingさんの海洋探査ロボットのデスクトップ版コンソールですが、確か去年のJavaOneに登場したときのデモでは、「JavaFXを使っていなくてごめんねー」と言っていたように記憶していますが、最近JavaFXも使うようになったようです!WebViewを活用していて、ロボットの位置を地図上でトレースする様子を見せていました。
面白かったのはWeb版クライアントで、ロボットにEmbedded GlassFishが入っており、ブラウザから直接指令を送れるようになっていました。実際に今動いているロボットに対して、ブラウザから「右にターンしろ」と指令を出して、見事に向きを変え、デスクトップ版コンソールからも航路を変更している様子が見えました。

KirkさんはNetBeansのメモリプロファイルの機能の説明をデモを交えて行いました。実際にはNetBeansではなくJDKに付いてくるVisualVMですけど。なかなか高機能で、下手な商用アプリだと負けてしまいそうな感じですね。*1

Java Strategy and Technical Keynotes [KEY11050]

基調講演です。前半がストラテジーキーノートで、間にIBMのスポンサーキーノートが入って、その後にテクニカルキーノートを行うという流れでした。
今年はMosconeで行いましたが、雰囲気がすごいですね。まあAppleのキーノートとかには明らかに負けますが、でも講演の合間に歓声が飛んだりして、日本では考えられないような熱気でした。

ストラテジーキーノートで繰り返し強調されていたキーワードは "Internet of Things (IoT)" でした。日本語では「モノのインターネット」と訳されることが多いですが、これまでインターネットの利用は基本的に人間が介在していましたが、今後は様々なデバイスがインターネットにつながるため、デバイス同士が人間を介さずにインターネットを通じて連携する技術を指しています。M2M (machine to machine) と言う言葉もよく使われますね。
なので内容はかなりJava MEに重点が置かれていました (この部分を担当されていたのはJavaFXでもおなじみのNandini Ramaniさんでした) 。今までだとちょっと考えられないことでした。これまで組み込みJavaは様々なプロファイルが乱立し、Java SEとの乖離も大きかったのですが、今後はJava SEとMEの乖離を小さくする方向に持っていくことを繰り返し語ってしました。Java8EAもSE、ME両方リリースしています。このお陰でSEの開発者とMEの開発者のスキルセットが共有できるようになり、よりJava技術者の活躍の場が広がりますよ、とのことでしたw
ストラテジーキーノートの後半はEEの話でしたが、今年リリースしたJava EE 7の説明をした後に、何とAvatarオープンソース化の発表がなされました!avatar.java.netにホストされています。サプライズという意味ではこれが一番大きなニュースだと思います。

(スポンサーキーノートの話は後で追記します)

テクニカルキーノートはさほど真新しい話はなかったのですが、構成がとても良かったです。
最初はMark ReinholdさんとBrian Goetzさんの掛け合いでのLambdaの解説。落ちは分かっていましたが掛け合いがとても面白い。
次にJavaEEの話。iPad上のSafariで動く対戦チェスゲームを紹介し、これはJavaEE7の新機能 (WebSocket、JSONハンドリング、バッチなど) を駆使して開発したHTML5アプリケーションである、そしてNetBeansを利用してクライアントとサーバーを通しての開発が可能であることをデモしていました。
続いてJavaFX。何やらごついタブレットを持ってRichard Bairさん、Jasper Pottsさんが登場しました。これはDukePadというRaspberry Piをベースに組み立てたお手製タブレットでした! *2
このタブレット上で3Dのチェスゲームを稼働させ、先ほどのサーバーとWebSocketを通じてSafariのブラウザと対戦可能なことをデモしていました。Raspberry PiはCPUがとても貧弱ですが、GPUは強力で、GPUを有効活用するJavaFXなら3Dでも動かせることをアピールしていました。
さらにPC上で3DのDukeをチェスの駒にしたバージョンを披露。Dukeが歩いたり戦ったりと、よりゴージャスなできになっています。
そしてそこからさらに "One more?"。今度はチェスをするロボットです!これもやはりWebSocket経由でこれまでに出てきたチェスアプリケーションと対戦できます。
このように、チェスゲームという1つの軸を中心にして、モバイルブラウザ、スマートデバイス、デスクトップPC、そしてロボットと様々なクライアント、デバイスがインターネットとして通じること、そしてそれら全ての場面でJavaを使うことができる、というメッセージを伝えていました。前半のストラテジーキーノートともきちんとリンクした内容でしたね。
最後にちょっとJava9の話も出てきましたが、Unified TypeとJNI2というキーワードが気になりました。本当にできるのかどうかは分かりませんが...。

Cool NetBeans Tips and Tricks for JavaFX Development [UGF10339]

NetBeansプラットフォームとJavaFXを組み合わせた様々なアプリケーションを紹介するというセッションでした。
インパクトがあったのはNASA Mission Operationsです。太陽風と地球の磁気圏の干渉点の測定をするというミッションにおいて、そのデータを解析、視覚化するアプリケーションをNetBeansプラットフォームとJavaFXを組み合わせて作っていました。NetBeansプラットフォームはデータの管理アプリケーションを作るのに向いており、JavaFXは並列処理、DnDクリップボードの扱いが優れているとのことでした。特に天体観測だとデータセットが非常に巨大になるのですが、並列処理を扱い易いというのは有り難かったようです。チャートコンポーネントも大量のデータ表示に耐えてくれたとのことでした。
その他にも様々なアプリケーションを紹介していましたが、どのアプリケーションもNetBeansプラットフォームを基盤としつつ、UXを強化したいところでJavaFXを食い込むという使い方をしていました。
セッションの最後にNetBeansのチームのメンバーに対して「NetBeansJavaFXベースにする予定は?」という質問が飛んでいましたが、当面は考えてないとのことです。ただ、SwingとJavaFXのスレッド統合が組み込まれたら、どんどんJavaFXを取り込んでいくことになるだろうとの事でした。

*1:そういやOptimizeItもJProbeも見かけなくなったなあ

*2:紹介したリンク先でどうやって作ったかを解説しています