本日がJavaOne Day One(通算2日目)となります。
ホテルを8時過ぎに出ても会場に10分ちょっとで着くので近いといいですね。
昨晩のアルコールが少し残って食欲が出なかったので青汁、バナナ半分を食べてホテルを出発、徒歩でヒルトンホテルに向かいました。
TUT3227:JavaFX CSS API
8:30-10:30 チュートリアルセッション
JavaFXのCSSについてかと思っていたら、JavaFXの部品を自分で作る場合に任意のCSSプロパティを定義するときに使うCSS処理のAPIについての解説でした。
JavaFXの描画処理(pulse)は、イベント処理のフィルタリング→プロパティ状態変更→CSS解析→レイアウト処理→描画の流れになり、CSS解析とレイアウト処理をCSS APIを使って作り込みます。
主要なクラスは3つ、Styleable, CssMetaData, StyleablePropertyです。
本チュートリアルでは、BorderPaneを継承したCaptionPaneを作成し、CSSクラスcaption-paneとCSSプロパティcaption-sideを定義し、実行時にCSSプロパティを解析してキャプション表示の位置を変えるというサンプルを解説していました。
ちょっとコーディングが複雑ですが、Java SE 8u40からStyleablePropertyFactoryが追加され楽になるよという紹介もありました。
セッションの合間に
2時間の予定が1時間そこそこで終わったので、すこしぶらぶらしました。
書籍売り場
Java関係の書籍が20%OFFで販売されています。日本でamazon.co.jpで買う価格より安ければ飼おうと候補をみてました。
「Java 7 Concurrency Cookbook(Quick Answer to Common Problems)」
「Mastering JavaFX Controls」
「JavaFX Rich Client Programming on the NetBeans Platform」
3つ目は、明日サイン会が催されるのでそのときに買うかも。
展示会場
10時過ぎに入ったら、奥の方で食べ物、飲み物を出していました。ジュース、牛乳、コーヒー、パンを摂りました。展示会場には、昨日基調講演で使われたデモも展示されていました。会場を出る手前でオライリーの「Getting Started with OpenShift」(100ページ弱の薄い本)を渡され受け取ってしまいました。
CON2942: Keeping Memory Leaks at Bay
11:00-12:00
メモリに関する問題は3つに分けられると導入し、メモリリークについて展開していく流れでした。
メモリリークの定義、メモリモニタツールと話を進めて、GCログの計測と解釈の仕方、注意点を丁寧に(入門者向けに)説明していました。
メモリリークの定義は、「ルートから到達可能だがアプリケーションでは使われないオブジェクトが繰り返し生成される」として、その例にStringクラスのsubstringメソッドで生成される部分文字列のStringオブジェクトは元のStringを抱えており、大きな文字列の部分文字列を生成すると使われないデータがメモリに置かれる件を挙げていました。
GCの挙動を知っている人には暗黙知で新しいことはほとんどないので、対象をintermediateではなくintroductionにすればいいのにと思いましたが、説明はよかったかと思います。
計測期間が短いとGCが動くまでの単調増加をリークと見誤る、ボトムラインの増加を見る、大きなスパイクは要調査、性能テスト時は必ずメモリも計測せよ(負荷の小さな状況を計測しても意味がない)、開発・試験・ステージング・本番のいずれでも計測せよ、といった要点がよくまとまっていたので、メモリリーク調査の手引きとしてはいい内容だなと感心しました。
CON1993: JavaFX 3D:Advanced Application Development
12:30-13:30
3つの事例を紹介するセッションでした。
- ニューログラフをNetBeans Platform上でJavaFX 3Dを使って可視化
- 人工衛星の軌道をJavaFX 3DとFXyzライブラリを使って可視化
- LEAP MOTION V2を使ったデモ
ニューログラフはパーティクル表示状のもので、高速にぐりぐり動かしていました。
FXyzライブラリで対象オブジェクトを中心にカメラを回してカメラが常に対象オブジェクトを向くという機能の細く紹介がありました。
LEAP MOTIONは入力デバイスで手をかざすとその形(動き)を検出してそれを3D表示に反映させるデモでした。
3Dのデモを言葉では説明するのは難しいので、いずれセッション動画が公開されると思われるので、その時にご覧ください。
ランチ
引き換えていたランチボックスをまだ食べていなかったので、Duke's Cafe(テイラーストリート上に設けられたオープンカフェスペース)で食べました。空いていたテーブルで食べてました。その後合席になった人に話しかけられ、かなりたどたどしい英語で何回も聞き直しながらでしたが、なんだかんだと30分弱話をしていました。ニュージャージーから来たおじさんで、UPS(米国の郵便局ですね)に勤務、荷物のトラッキングや管理などのシステムでJava EEな分野とのことです。兄弟が厚木基地に勤務していて日本話題もいろいろ盛り上がりました。
印象に残った話題の1つは、昔の日本製品は寿命が長く品質が高い、クラフトマンシップが優れていたけど最近の日本製品は中国などで作っているので品質が落ちてるのが残念だよと言ってました。
CON6132: Modular Architectures Using Microsevices
14:30-15:30
モジュラリティの主要特性の1つ再利用について、コピー&ペースト→オブジェクト指向→コンポーネントベースと技術が進歩していると整理していました。なるほど。
Microserviceの用語はやはりマーチン・ファウラー由来でした。
コンポーネント論、サービスの定義のあとOSGiに入り、後半はほとんどIDEの画面ばかりで何をしているのかよくわかりませんでした。
もうちょっと設計の話を期待していたのですが・・・
今回のJavaOneのセッション全般ですが、IDEの操作をプロジェクターに投影するケースが多いのですが、文字が小さ過ぎて前から10列以内に座っていても見えません。スピーチはともかくプレゼンテーションとしては片手落ちなものが多いのが残念です。
CON3420: Java Performance is a Social Activity
16:00-17:00
寝落ちセッションでした。
パフォーマンス改善の心構え的な内容で、トークショーのような進め方できつかったです。
テストデータ(通常小さくきれいなデータ)でなく実データ(大きくイレギュラーが含まれるデータ)で性能改善の効果を計れ、JVMスイッチは1度に1つだけ変えて計れ、くらいからあとは脱落です。
アーキテクチャを理解するには図が不可欠
- コンポーネント図
- シーケンス図
- データフロー図
がないと理解が難しいよということです。
CON2654: Java Performance:Hardware, Structures, and Algorithms
17:30-18:30
ハードウェアカウンタでCPI(サイクル数)、L1キャッシュミスなどを計測しそれから問題を分析する話です。
最初に、新しいJavaVMは新しいCPUの命令に対応しているので、新しいJavaVMを使うだけでも速くなるよという話がありました。CPUが4年で大きく変わっているので、新しいCPUの機能に対応したJavaVMを使うことで高速化できるということです。
vm/opto/library_call.cpp のコード断片を参考紹介していました(bitcountの例で)。
CPIを計測し、高い場合はメモリストール発生なのでデータ構造を見直し、低い場合は命令の問題なのでアルゴリズムを見直しという判断に使います。
メモリについては、CPUのTLB及びキャッシュと物理メモリのページングの解説でキャッシュミス時のアクセスコスト(数百CPUサイクル)が発生するというモデルを説明、その後にHashMapとTreeMapのアクセス時間がボトルネックだとしたら、キャッシュミスが起きているのでハッシュ値やツリーのバランスを要調整ということを言っていた(か?)と思います。
BOF3234: JavaFX Controls:Debugging Controls
19:00-19:45
最初にScenicViewというオープンソースJavaFXライブラリの紹介をしていました。
シーングラフの情報を可視化するツールとのことです。
デバッグTips紹介といったセッションでした。ひたすらとったメモを列挙
- button.setStyle("-fx-border-color: red;") としてノードに境界を描かせてレイアウトのデバッグ
- button.armedProperty().addListenerでprint文を埋め込みデバッグ
- com.sun.javafx.Loggingクラスを使ったログ出力
- Logging.getLayoutLogger().setLevel(Level.FINER)
- OpenJFXでソースを入手しハックしてビルド
- ビルドしたjfxrt.jarは、-Xbootclasspathで指定
- SkinBaseのcomputeMinHeight,computePrefHeight,computeMaxHeightなどをサブクラスを作ってオーバーライドしてデバッグ
- buttun.addEventFilter(MouseEvent.MOUSE_ENTERED, e -> System.out.println("filter:" + e)); のようにイベントのデバッグ
- キーイベントは、com.sun.javafx.scene.control.behavior.BehaviorBase あたり
- ブレークポイントをcom.sun.javafx.event.EventHandlerManagerのメソッドdispatchBubblingEventあたりにおく
- 処理タイミングをjavadocのNode#applyCssメソッドに記載されているので見てね
- button.impl_findStyles(null)から探る
- ロギングは、Logging.getCssLogger().setLevel(level.FINER);
- デバッガのブレークポイントをjavafx.scene.CssStyleHelperのgetStyleに置く
- 大量に通過するので、プロパティ名とnode.getId()で条件ブレーク
TableViewとListView
夕食
本日のBOFセッションは会場がモスコーニセンターだったので、休み時間にモスコーニセンターのNorthとSouthの間のストリート上に設けられたイベントスペースで振舞われる食事を食べました。
BOF2248: JavaFX Packager Tool Integration Deep Dive
21:00-21:45
いきなりQ&Aから始まってしまいました。聞き取るのが大変(かなり聞きこぼしてます)。
- SplashScreenサポート切に願う
- 8u60で何かするといっていたようだが、不明
- バージョン番号やコピーライトはSplashScreenの画像に書かず、後からJava側から描画させるのが望ましい
- LinuxとWindowsと配布パッケージを一体化できないか?
- 回答はよく聞き取れず(解はなさそうな感じ)
- モジュールを選択してインストールできるようにならないか?
- 将来のプラン、Jigsawと関係する、といった回答
APIが8u20で追加
8u40で
ランチャは、プラットフォームごとではなく単一のソースファイル(C++)で記述、再頒布ライセンスも見直すようです。ランチャーの実行ファイルとPackage.dllの組み合わせとなります。
+---------------------+ | Application | +---------+-----------+ |Launcher | | +---------+ | |Packager | Java | +---------+ | |Platform | | +---------+-----------+ | OS | +---------------------+
Windowsの場合のアプリケーション配布ディレクトリイメージ
MyAwesomeApp\ +-- app\ | +-- MyAwesomeApp.cfg | +-- MyAwesomeApp.jar | +-- Packager.jar +-- MyAwesomeApp.exe +-- Packager.dll +-- msvcr100.dll +-- msvcp100.dll +-- runtime\ +-- jre\ :