今日も、朝 8 時から。今日は昨日に比べると、出足は遅いみたいです。
今回の JavaOne は櫻庭はスピーカーではあるのですが、ブロガーとしても登録してもらっています。というのも、ブロガーで登録しておけば写真取りほうだいだから。寺田さんにはいろいろとご迷惑をかけてます ^ ^;;
で、セッション会場はプレスとブロガーは最前列に用意されているので、そこに座ってキーノートが始まるのを待っていました。たまたま隣に座っていたのは岸上さん。
ふとそこに外国人が話しかけてきたのです。"君は Twitter の□△*%だろ?" と。でも、櫻庭のつたない英語力では全然聞き取れなかったわけです。でも、Twitter は聞こえたのです。とはいっても、私は Twitter で働いているわけでもないしなぁと思って、違うんじゃないと答えたわけです。
その人は怪訝な顔で去って行ったわけですが、そうしたら岸上さんが skrb っていってたんじゃないのと。えっ、そんなこといってましたか! しかし、なんでその人は私のことを知っているわけ?
で、後から判明したのですが、その話しかけてきてくれた人が JavaFX チームの Jonathan Giles だったんです。
午後に Jonathan のセッションに出た後に、さっきのごめんといいに行ってきましたよ。
というわけで今日、聴講したセッションです。
- Keynote
- Technical Session & BOF
- JS2-02 JavaFX Architecture and Programming Model
- JS2-11 Project Jigsaw: Putting It All Together
- JS2-42 UI Controls and Charts: Drag-and-Drop, Filtering, Sorting, Table Hookup with Charts
- BOF2-03 Learn How the JVM is Fundamental to Our Architecture
- Special Session
- Lunch Session
- JavaOne Community Panel Discussion
- おまけ
- JJUG JavaOne Tokyo 2012 Night Party
JK2-01 Techinal Keynote
Togetter はこちら。
今日も Java SE と JavaFX しかちゃんと聞いてないのですが、Java SE はまったくといっていいほど SF の JavaOne の焼き直しでした。
JavaFX の Richard Bair も基本的には SF のと同じ。Swing ではなかったグラフ (チャート) をちゃんとサポートしているのがいいですね。チャートは社内システムとかでよく使われるものですしね。
MC は昨日に引き続き伊藤さん | Java SE は Alex Buckley |
JavaFX は Richard Bair | |
デモをしていたのが Jonathan | |
Java EE は Mike Keith | |
Java ME は Roger Brinkley | そして、もう 1 人 Terrence Barr |
富士通の藤井さん |
JS2-02 JavaFX Architecture and Programming Model
Richard Bair のセッションとあれば参加せずにはいられないでしょう。でも、裏の @nahi さんの JRuby の InvokeDynamic のセッションとどちらにしようか、かなり悩みました。
Togetter はこちら。
このセッションでははじめに JavaFX のアーキテクチャ、その後に GUI ではない部分の重要な部分について解説を行っています。GUI に関連しない部分の解説なので、JavaFX のセッションなのに非常に地味なのはご愛敬 ^ ^;;
まずはアーキテクチャから。
JavaFX は例に漏れずレイヤー構造をなしています。一番上位は API やシーングラフで、その下に Toolkit、より下層に Quantum Toolkit があります。
AWT もそうだったのですが、Toolkit は抽象クラスで記述されていることが多く、具象化クラスのレベルが Quantum Toolkit なのだと思っています (もしかしたら、違うかも)。
そして、その下にグラフィックエンジンの Prism といわれていたのですが、現在はその下に Glass レイヤーがあります。JavaFX は複数のプラットフォームで動作しますが、プラットフォームの違いを吸収するのが Glass レイヤーです。
現在はないのですが、Headless 用の Glass も今後実装していく予定らしいです。
Prism はハードウェアアクセラレーションを活用するようになっています。まったく、ハードウェアアクセラレーションが使えない環境では Java 2D で描画するので、パフォーマンスは落ちてしまいます。
ここで、Glass によるプラットフォームの差異を吸収する例として iOS について紹介しました。実際に、Mac で動いているものを iPad にデプロイさせて動作させるというデモです。
iPad にデプロイさせるために xcode で作業をするのですが、xcode で表示されていた Objective-C のコードは JNI で JVM を動作させるコード、つまり createJVM メソッドなどをコールしていました。
ということは、やっぱり iOS で JNI もちゃんとサポートした JRE があるということですね。
Mac で四角をアニメーションさせるサンプルを iPad にデプロイしていたのですが、はじめ Mac 上では分かる程度の 50x50 の四角の大きさでデプロイさせたのです。ところが、新しい iPad の Retina ディスプレイだと、これが点にしか見えない。
私は一番前に座っていたので、アニメーションしているのは見えたのですが、ほんとに小さい四角でしかありませんでした。
これはダメだということで、すぐに四角を大きくしました。しかし、このことは逆に機種による DPI の違いを JavaFX が扱えないという欠点があるということもさらしてしまったわけです。
Android の dip みたいな機構を取り込まないとダメですね。
そういえば、iPad を持っていてもらうために会場から人を募ったのですが、 @challengejfx さんがすかさず手を上げてました。で、iPad を持っていたのですが、iPad を返す時になって "Thank you!" とお約束の持ち帰るふり。
Richard Bair さんもこれには苦笑してましたね。
さて、アーキテクチャの後は、まずコレクションの話。
JavaFX では java.util のコレクションを確証させた Observable Collections を使用します。というのも、リストなどに要素が追加されたなどのイベントを扱いためです。
コレクションに変化があった場合、それをすぐに View に反映させるためには、そのような機構が必要になってきます。
このため、Observable Collections は java.util のコレクションに Java Beans の機能を追加したコレクションになっています。
同じように Java Beans を拡張させているのがプロパティです。Java Beans の拡張なので、プロパティの値が更新されたらイベントを出すことができます。
JavaFX ではフィールドを Property で扱うのですが、それがちょっと面倒です。ほんとうは言語レベルでここら辺を扱えるようになっているといいんですが....
セッションではリードオンリーなプロパティなど、いくつかのプロパティの使用法を説明していました。
プロパティで重要な機構としてあるのが、バインドです。今回はちょっと触れるだけで、あまり説明がなかったのが残念なところ。
そして、イベント。JavaFX では Swing と同じようにイベントを扱うのですが、重要なのがリスナが 1 種類しかないこと。イベントの種類はジェネリクスで指定します。
具体的には EventHandler インタフェースを使用するのですが、この EventHandler インタフェースは handle メソッドしか定義していません。
従来の、たとえば MouseListener インタフェースであれば mouseClicked メソッドや mousePressed メソッドなど複数のメソッドを定義してあります。しかし、JavaFX では EventHandler オブジェクトを設定する時に、どのイベントにするかを明確にするために、メソッドは handle メソッドだけで大丈夫なのです。
たとえば、マウスのボタンが押されたイベントであれば次のように書きます。
Node node = ... node.setOnMosuePressed(new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { // イベント処理 } });
ここで重要なのが、EventHandler インタフェースのメソッドが 1 つだけであること。これは Java SE 8 の Project Lambda を使用すれば、ラムダ式で表せるということです。
ラムダ式で表せれば、かなりすっきり表せるのでいいですね。
この後、スレッドについても触れたのですが、スレッドに関しては Swing などと同じですね。JavaFX はシングルスレッドで、基本的にはそのスレッドからしかアクセスしてはいけないようになっています。
ただし、バックグラウンドでシーングラフを作ることはできます。でも、Scene オブジェクトにシーングラフをセットしたら、その後は JavaFX のスレッドでしかアクセスできないようになります。
JS2-11 Project Jigsaw: Putting It All Together
Togetter はこちら。
Jigsaw も、昨日の Lambda と同じ David Holmes が担当。しかし、なんで Alex Buckley じゃないんだろうか?
JavaOne の Jigsaw のセッションは Mark Reinhold か Alex Buckley なので、ちょっと変な感じをうけます。逆に Alex が担当した Coin の方が David に合っているような気も...
まぁ、それはさておき、Jigsaw です。Jigsaw も SF の JavaOne とそれほど変化なし。ところが、SF の JavaOne は Jigsaw のセッションがないことにされていて、資料も公開されていないので、今回のセッションはかなり貴重かもしれません。
ついでにいうと、JavaOne 2012 のレジストレーションが始まってからは、去年の JavaOne のコンテンツがほとんど見られなくなっています。プレゼン資料も見られなくなってしまいました。少なくとも、2, 3 年は公開したままにしておいてほしいです!!
Project Jigsaw では 2 つの側面があって、一方がプログラムの名前空間を表すパッケージに代わるモジュール、もう一方が JAR ファイルの代替としてのモジュールになります。
まずは名前空間のモジュールから。
今までのパッケージだと、バージョンを表せないとか、パッケージが依存している他のパッケージの情報がないなど、いろいろと問題がありました。そこらへんをモジュールで解決しています。
とはいうものの、パッケージがなくなるわけではなく、複数のパッケージをまとめて、他の情報も付加できるのがモジュールと考えることができます。
モジュールの定義は module-info.java に書きます。
パッケージの場合、package-info.java はパッケージの Javadoc を記述するためにだけ使用していましたが、モジュールでは定義をここに書きます。ついでにいうと、package-info.java は当該パッケージのディレクトリに置きましたが、module-info.java はトップディレクトリに配置しておきます。
module-info.java の例を次に示します。
module com.foo @ 1.0.0 { // @ の後はバージョン class com.foo.Main; // メインクラスがあるクラス requires org.bar.lib@2.1-a; // このモジュールが依存するモジュール requires deu.baz.util@5.2_11; // ようするにこのモジュールが内部的に使用するモジュール permits net.qux; // このモジュールはnet.qux以外からは使用できないようにする requires optional com.foo.extra; // オプションで依存するモジュール }
こんな感じでいろいろと書けるわけです。
次に JAR ファイルの代わりとなるモジュールファイルです。実際のファイルとしては jmod ファイルになります。
JAR ファイルの場合は -classpath で指定しますが、モジュールの場合 -modulepass になります。
クラスファイルをまとめて jmod ファイルを作成するためには、jpkg コマンドを使用します。ここでレポジトリを作成して、そこに jmod ファイルをデプロイするために使用するのが jmod コマンドです。
java コマンドで実行する場合は、レポジトリを -L で指定し、モジュールを -m で指定します。
このモジュールを使用して JRE のライブラリもモジュール化されます。rt.jar ファイルは巨大だったので、これはいいですね。
JS2-42 UI Controls and Charts: Drag-and-Drop, Filtering, Sorting, Table Hookup with Charts
今日の午前中の Keynote の JavaFX のデモを担当していた Jonathan Giles のセッション。本当はこの前の Interface Layout with JavaFX 2.0 も出たかったのですが、いろいろあって出られませんでした (理由はおまけに書きます)。
Togetter はこちら。
Jonathan Giles はセッションに出るまで全然気がついていなかったのですが、JavaFX の公式情報 blog の FX Experience で毎週月曜日に JavaFX のニュースをまとめてくれている人でした。
この Jonathan のセッションは何はともあれ、すごい早口。ついて行くのがやっとです。
内容的には JavaFX の GUI 部品である UI Controls やチャートのほとんどについて簡単な解説をつけて紹介するというもの。まぁ、全容が分かるという意味ではよかったんですけど、いきなりこのセッションを出たら分からないだろうなぁ。
もう 1 つ文句をつけるとしたら、Java のコードだけでなく、FXML でどう書くかを一緒に示してくれればと感じました。
ただ、質問はいろいろと出たのはよかったですね。コンボボックスやダイアログはすでに Jonathan は作成してあるけど、まだリリースしていないようです。
追記: ComboBox は JavaFX 2.1 で追加されてました。ダイアログはまだみたいです。
JavaOne Community Panel Discussion
2 日目の最後は Community Panel Discussion です。
壇上に上がったのは
昨日とはうって代わって、かなりまじめなパネルです。各コミュニティの意義とか、コミュニティのあり方とか、いろいろと議論になりました。
でも、結局はまとまらない感じ。逆にいえば、まとまるの方がおかしいです。コミュニティなんて、100 あれば、100 のあり方があるわけですから。
ちなみに上の写真は、パネルが始まる前の 1 コマ。ろくろを如何にうまく回せるかというのもコミュニティには大事?
おまけ
今日はランチセッションがあったので、2:30 からのセッションは聞かずに、ごはんを食べにいっていたのです。そこに寺田さんから Twitter の DM が。
すぐに講師控え室に戻ってくることはできるかというのですが、ちょうど今注文が終わったばかりの所。そうしたら、15:30 でも大丈夫だというので大急ぎで食べて、講師控え室 (といっても日本人ではなく、外国人の講師控え室の方) へいったわけです。
そうしたら、なんと Java の Podcast に出てもらいたいというではないですか。日本語だったらいいのですが、インタビューアーは Roger Brinkley。でも、通訳をつけてくれるというので、了承しました。
で、どこで録音したかというと、Duke のフォトセッションがある場所。かなり恥ずかしいです。Podcast はそのうち公開されるでしょう。
というわけで Jonathan のレイアウトのセッションに出られなかったわけです。
そのまま、Podcast の録音の後も展示会場にいたのですが、1 日目の Keynote で Kinect を使った JavaFX のデモがあったわけです。私もやってみましたけど、ちゃんと動きますね。
と、そこにやってきたのが Duke!!
Duke が仮想 Duke を操るのか!! でも、Duke はどうしても Kinnect に認識されないのです。Kinnect は人間用だからしかたないですね。でも、すごい残念。
JJUG JavaOne Tokyo 2012 Night Party
JavaOne が終了した後、JJUG が主催したパーティが行われました。海外のスピーカーも参加して賑やかに行われたのですが、場所が狭くてギュウギュウでしたね。
JJUG としては、入場の時のお金のやりとりにすごい時間がかかってしまって、なかなか会場に入れなかったのが反省事項です。
まぁ、それでもみなさん楽しんでいただいたようなので、よかったです。
しかも、これは事前に決めたことでもなんでもないのですが、最後に寺田さんの胴上げ! 今回の JavaOne で一番悔やまれるのが、この胴上げの写真を撮れなかったこと。
暗い上に、動きが速くてピントが合わない orz オートフォーカスをあきらめて、マニュアルで撮ればよかった。
これで JavaOne Tokyo 2012 はすべて終了。みなさま、おつかれさまでした。