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 でもかっこいいコントロールを色々作っています