torutkのブログ

ソフトウェア・エンジニアのブログ

JavaOne 2014 SF(09-29)

本日がJavaOne Day One(通算2日目)となります。
ホテルを8時過ぎに出ても会場に10分ちょっとで着くので近いといいですね。
昨晩のアルコールが少し残って食欲が出なかったので青汁、バナナ半分を食べてホテルを出発、徒歩でヒルトンホテルに向かいました。

TUT3227:JavaFX CSS API

8:30-10:30 チュートリアルセッション

JavaFXCSSについてかと思っていたら、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つの事例を紹介するセッションでした。

ニューログラフはパーティクル表示状のもので、高速にぐりぐり動かしていました。
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あたりにおく

CSSデバッグ

  • 処理タイミングを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側から描画させるのが望ましい
  • LinuxWindowsと配布パッケージを一体化できないか?
    • 回答はよく聞き取れず(解はなさそうな感じ)
  • モジュールを選択してインストールできるようにならないか?
    • 将来のプラン、Jigsawと関係する、といった回答

APIが8u20で追加

  • 新ハンドラ: Mac PKG、Mac AppStore Ready、Singing

8u40で

  • 単一ソースのランチャ
  • Simple API for JVM User Overrides
  • Multipleランチャー
  • ファイルの関連付け(インストール時に登録)
  • デフォルトのアプリケーション引数

ランチャは、プラットフォームごとではなく単一のソースファイル(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\
              :

その他