2009/06/19

今日の JavaFX 1.2

明日のオープンソースカンファレンスのために札幌に前泊。ぜっかく札幌まで来ているのですから、札幌 Java コミュニティ渡辺さんに連絡をとって、勉強会をやっていただくことにしました。

Swing とかの GUI 系の話題がいいということであったので、Swing のスレッドモデルと非同期処理についてお話しすることにしました。

しかし、明日の資料作成が全然終わらない。

JavaFX のプレゼンツール Caraibe は JavaFX 1.1 で作っていたので、せっかくだから JavaFX 1.2 に対応させようと思ったのが運のつき。

安易に NetBeans の JavaFX Plugin を JavaFX 1.2 対応のものにアップデートしてしまったのです。

そうしたら、動かない、動かない。

もう JavaFX 1.2 をやめて 1.1 に戻そうと思ったのですが、プラグインのダウングレードってどうやるかよく分からないし... しかたないので、例外はでるけど動くというところで、妥協することにしました。

ドキュメントには書いていないところで変更されていたのが、Scene Graph プロジェクトの Scenario.jar に関する部分。ようするに、JavaFX の描画要素と Swing を連携させる部分です。

まず、Scenrario.jar がありません。しかたないので、JAR ファイルを展開して (といっても jar コマンドの t オプションで調べるだけですが)、対応しそうなクラスを探すというところから。

その結果、javafx-sg-common.jar ファイルと javafx-sg-swing.jar の 2 つの JAR ファイルが Scenario.jar ファイルに対応することが分かりました。

今まで Node オブジェクトが貼られている Swing コンポーネントは

    var node: Node = ...;
    var pane: JSGPanel = node.impl_getSGNode().getPanel();

で取得することができたのですが、これができません。

var panel = (node.impl_createPGNode() as SGGroup).getPanel();

でパネルは取得できることがわかったのですが、どうもちゃんと Node オブジェクトが貼られているパネルではないようなのです。

この時点でこれはあきらめました。このため、ポップアップメニューで指定のページに移動することや、終了させることは省略。まぁ、プレゼン自体には影響ないので、大丈夫です。

この問題はもう少し時間をかけて調べれば、どうにかなるでしょう。Scene Graph プロジェクトのソースが公開されていれば、もっと簡単に調べられるのですが...

もう 1 点、分からないところがあります。

Caraibe ではマウスクリックによって、動的に Node オブジェクトを生成し、シーングラフに追加していきます。しかし、以下のようなメッセージと例外が発生してしまうのです。

WARNING * WARNING * WARNING * WARNING * WARNING
An attempt has been made to add node to a new group without
first removing it from its current group. See the class
documentation for javafx.scene.Node for further information.
This request will be granted temporarily but it will
be refused in the future. Please change your code now.
node=Group [id=background] oldgroup=Group newgroup=Group
Stack trace follows.
java.lang.IllegalArgumentException
        at javafx.scene.Group$_SBECL.onChange(Group.fx:162)
      <<以下、省略>>

この理由が全然分からない。例外が投げられている箇所の動的追加をやめたとしても、やっぱりまだ例外が発生します。

Caraibe 全体だと大きすぎるので、小さいサンプルを作って現象を再現させようと思ったのですが、普通に追加できます。

一体全体、なにがわるいんだろう。全然分からない。

幸いなことに、例外が投げられたとしても、動作はそのまま続けられるので、これも追求するのをやめました。クリックするたびに例外が投げられるのは気持ち悪いけど、背に腹は代えられません。

ほんとは札幌 Java コミュの勉強会に出るまでに、写真を撮りにいったり、なにか軽く食べたりしたかったのですが、断念。

今日は、朝からなにも食べていないのですごいおなかへっているのですが、しかたありません。

私がこうやってホテルで資料作り & デバッグをしている間、Java カンの人たちは、寿司食べに行って、その後ジンギスカンまで食べたというじゃないですか。いいなぁ。

ラベル: ,

今日の札幌 Java コミュニティ勉強会

というわけで、勉強会です。

前に書いたように、Swing のスレッドモデルと SwingWorker についてお話ししました。

Swing のスレッドモデルということで、まずスレッドセーフについて少し解説しました。でも、さわりだけ。マルチスレッドで実装するのは難しいんだよということが伝われば OK。

その後、Swing というか、ウィンドウシステム全般のアプリケーションがどうやって動作するのか、つまりイベント駆動について解説。ここで、重要なのはイベントをイベントキューにためておき、EventDispatchThread オブジェクトが唯一イベントキューからイベントを取りだして、イベント処理をおこなう (実際は以上するだけですが) ことです。

そうして、もう 1 つ重要なのが、イベントディスパッチスレッドと他のスレッドの間の橋渡しをしているのが、イベントキューだということです。なので、イベントディスパッチスレッド以外のスレッドから Swing の操作をおこないたい場合は、イベントキューにイベントを追加することしかできません。

よく使用される SwingUtilities.invokeLater メソッドを追っていくと、イベントキューにイベントを追加しているだけということが分かります。

これが、JFrame を生成するところで、SwingUtilities.invokeLater メソッドを使う理由というわけです。

後は、SwingWorker クラスの説明。まぁ、これはおまけみたいなものですね。

このページのコンテンツには、Adobe Flash Player の最新バージョンが必要です。

Adobe Flash Player を取得

(資料はクリックすれば進みます)

 

勉強会の後は懇親会。地鶏と旬魚 手づくり豆冨 とととという居酒屋で歓談。北海道の状況とかいろいろをお話しできて、よかったです。

今度、札幌にいくことがあったら、またよろしくお願いします。

ラベル: ,

今日の一枚

Buddy Guy "Skin Deep" (2008)

シカゴブルースの重鎮である Buddy Guy ですが、70 歳をすぎた今でもこれだけ活動しているというのはすごいことです。

このアルバムは最近の傾向と同じくいろいろなゲストを迎えて作られたアルバムです。でも、今回のゲストは渋い。Eric Clapton は別格として、Derek Trucks に Robert Randolph、そして Susan Tedeschi ですよ。しかも、Derek Trucks と Susan Tedeschi は夫婦 ^ ^;;

個人的には Susan Tedeschi、Derek Trucks と競演している Too Many Tears がお気に入り。Susan Tedeschi いいですねぇ。パワフルな Buddy Guy と負けてません。

Robert Randolph がゲストの Out in the Woods は逆回しイントロ? スライドがむちゃくちゃカッコいい。さすが、Robert Randolph。

アルバムタイトルナンバーの Skin Deep だけは他の曲とは曲調が違います。ちょっと聞くとフォーク? って感じ。Derek Trucks のスライドがこれまたカッコいい。もともと The Allman Brothers Band ですから、当然といえば当然ですが、スライドいいですよ。

もちろん、Buddy Guy のギターも健在。これだけギンギンに弾いてくれるとほんと気持ちいいです。

ラベル:

2009/06/17

今日の活動予定

今週末から、怒濤のようにいろんなところで講演します。

ぜひ、ご参加ください。

あさっては札幌 Java コミュで勉強会。まだ定員に達していないようなので、札幌近郊の方はぜひ。

ありがたいことに、OSC は満員。でも、会場に行ってみると入れるかもしれないので、登録できなかった方でも、セッション前にのぞいてみてください。

その後の、JavaOne 報告会は Java SE と JavaFX に関して報告します。詳細はまだ決まっていないので、決まりしだいアップデートします。

ラベル: , ,

今日の一枚

Petteri Sariola "Silence" (2008)

Michael Hedges をもっと激しくロックぽくした人ですね。フィンランド人で、かなり若いです。しかし、自分のサウンドを確立しているあたりがすごい。

タッピング系のプレイヤーですが、タッピングが激しい ^ ^;; しかも、ボディ叩きまくり。SLAM 奏法というらしいです。彼の MySpace のページにムービーが集められているので、必見。

ボディを叩く方法と低音弦をピッキングするのは分るのですが、高音弦はどうやってタッピングしているんだろう? 普通、フィンガーピッキングする時は左手はほとんど動かないのですが、彼の弾き方はストロークしているように動きまくり。これで正確なピッキングしているというのが驚きです。

1 曲目の Stomp は Michael Hedges を彷彿させる曲。ドン、ドンという音が入っていたので、バスドラムだと思っていたのですが、どうやらボディを叩いているらしいです。この曲、ほんとカッコいい。

Stomp はインストですが、2 曲目の Silence はボーカル入り。結構、いい声です。しかし、よく歌いながらこんなの弾けるなぁ。それと、Unitted Blues。この曲、とてもドラマチックです。ピアノのイントロがなんだこりゃ? 的ですが、その後はまったく違う曲。基本的なリフがカッコいいんです。

この 2 曲が櫻庭のお気に入り。でも、その他の曲もいいですよ。インストとボーカル入りは半々ぐらい。櫻庭的にはインストの方が好みです。

最後の Where the Streets Have No Name は U2 の曲。これもいいですね。これをほとんど 1 人でやっているのはほんと驚きです。

ラベル:

2009/06/05

今日の JavaOne 2009 Day 4 (暫定版)

今日は次のセッションを聴講しました。

General Session

Technical Session

The Toy Show

後で書きます。

TS-5427 Inside Out: A Modern Virtual Machine Revealed

なんでもいいけど、話すスピード早すぎ。特に Tony Printezis。

昨日もそうだったけど、VM に関係する人ってみんな早口なのかなぁ?

VM、特に HotSpot のように動作中にダイナミックにコンパイルする VM に関して。HotSpot って、動作しながらプロファイルして、ホットスポットをネイティブにコンパイルするわけです。逆に使われないようになったらデコンパイルもします。

そういう VM の最適化について。たとえば、インラインとか。null にならないことが保証できれば、null チェックをネグってしまうなんて全然知りませんでしたよ。

内容はおもしろいのですが、資料の文字は多いし、早口だし、でついていくのが大変でした。

そういえば、質問の時間に、演台につかつかと近づいていく人が。誰かと思ったら Cliff Click でした。

TS-4466 Move Your Users - Animation Principles for Great User Experiences

Chet Haase と Romain Guy のセッションといえば Filthy Rich Clients という名物セッションなわけですが、今年はなぜかタイトルが変わってしまいました。タイトルが変わってしまったため気づかなかった人が多いのか、最終日のせいか、聴講者は少なめ。おもしろいセッションなのにもったいない。

開口一番、Chet が "Welcome to the Filthy Rich Clients" というと、Romain がすかさず突っ込み。こんな感じで、漫才のようにセッションが続いていきます。タイトルも勝手に Animation Rules に変えちゃったりして。

でも、内容はかなり示唆に富んだもの。

ディズニーが出している The illusion of Life というアニメーションを作るための本と、Timing for Animation という本をベースに、漫画のアニメーションと GUI のアニメーションで通じるところ通じないところを比較しながら、効果的なアニメーションについて考えていくセッション。

まずは、漫画のアニメーションにおける 12 の法則。一応日本語にしてみましたけど、もしかするとアニメ特有の訳語や言い回しがあるのかもしれないので、参考程度に。

  • Squash & Stretch つぶす & のばす
    物体を動かす時にそのままの形状でなく、ぶつかった時はつぶし、飛び上がる時はのばすなど変形させる
  • Anticipation 先行
    速い動作の前に、ちょっとだけ後ろに引くような動作を付け加えると、スピード感が増す
  • Staging 演出
  • Straight Ahead vs. Pose to Pose 連続 vs 離散
    物体がある地点から他の地点に移動する時、刻々と形状を変化させるか、移動開始の形状をそのまま維持するか
  • Follow Through & Overlapping Action 事後動作 & オーバラップした動作
  • Slow In & Out スローイン & スローアウト
  • Arcs 弧
    物体を移動させる時に弧を描かせる
  • Secondary Action 第 2 の動作
    移動する時に、移動のアニメーションだけでなく、もう1つ別のアニメーションを組み合わせる
  • Timing タイミング
  • Exaggeration 誇張表現
  • Solid Drawing リアルな絵
  • Appeal アピール

こういうことに対し、GUI では普通のアニメに比べてリフレッシュレートが高いことや、手書きではないことから、すべてをそのまま鵜呑みにできるわけではありません。もちろん、かぶるところもあります。

ということで、GUI での 12 の原則。

  • Squash & Stretch
  • Anticipation
  • Staging
  • Straight Ahead vs. Pose to Pose
  • Follow Through and Overlapping Action
  • Slow In & Out
  • Arcs
  • Secondary Action
  • Timing
  • Exaggeration
  • Solid Drawing
  • Appeal

その他に細かいところだと

  • Timed
  • Designed
  • Smooth
  • Transitioning
  • Realistic
  • Anticipatory
  • Simple

考えさせられますね。

おもしろかったのが、サンプル。現在、Chet は Adobe に所属しているのですが、サンプルは半分が Flash、半分が Java でした。やっぱり、まだ Java を使かっているんですかねぇ。

ラベル: , ,

2009/06/04

今日の JavaOne 2009 Day 3 (暫定版)

今日は次のセッションを聴講しました。

Technical Session

BOF

  • BOF-5087 All Things I/O with JDK Release 7
  • BOF-4595 Insights into Java Platformsk Standard Edition, and JavaFX Platform Performance
  • BOF-4135 Java Programming Language Tools in JDK Release 7

その他

  • After Dark Bash

今日の General Session は MS と IBM なので、自主休講。

そして、今日も BOF はすべてはずれ。今年の BOF は不作だ。まぁ、いろんなあるからしかたないかなぁと思いますけど。

TS-5578 The New World: JavaFX Technology-Based UI Controls

JavaFX のチームが JavaFX 1.2 の機能を紹介する唯一のセッションかもしれません。ほんとはちゃんとジェネラルな情報、たとえば JavaFX 1.2 の新機能をまとめたり、今後のロードマップを紹介したりするセッションを初日に欲しいところです。

なぜ初日かというと、そこで各機能の詳細を紹介するセッション情報を得られるので、予定を組み直すことも可能だからです。

で、このセッションは JavaFX 1.2 で拡充された UI Controls に関するセッション。

UI Controls は Swing をベースにしていない GUI コンポーネントのことです。Swing をベースにしていないので、JavaFX Mobile でも使うことが可能です。

JavaFX 1.1 で JavaFX Mobile を使うことができるようになりましたが、GUI コンポーネントが皆無だったので (ほんの少しだけありましたけど)、ろくにアプリケーションを書くことができませんでした。それが、やっと普通に使えるレベルまで達したというところです。

UI Controls には

  • Button
  • ToggleButton/RadioButton/CheckButton
  • Slider
  • Label
  • ScrollBar
  • Hyperlink
  • ProgressIndicator
  • TextBox
  • ListView

その他に

  • Single/Multiline text
  • Position text within Labeled bouds
  • Text overrun rules
  • Font
  • Graphic

が用意されています。しかも、これらの機能は JavaFX 1.2 の新機能である Mixin で提供されます。

JavaFX ではもともとインタフェースが使えないかわりに、多重継承をサポートしていたのですが、多重継承は使うのが難しい。だから、今回の Mixin はいい選択だと思います。

で、これらは CSS で外観を変えることも可能です。

そして、もう 1 つが Charts。棒グラフや円グラフ、折れ線グラフなどを使えるようになりました。

個人的にはレイアウトマネージャが拡充されたのがうれしいところ。JavaFX ではノードごとに回転やスケールなどが変更できるので、それらを含めたレイアウトをするのは大変らしいです。

それにしても、これでやっとまともなレイアウトをできるようになりました。これで、ずいぶん Flex に近づいてきたという感じですね。

TS-5052 Hacking the File System with JDK Release 7

JSR 203 More New I/O APIs for the Java Platform ("NIO.2") のファイルシステムに関する部分だけを紹介するセッション。

今まで、java.io.File クラスではできなかったことがいろいろとできそうです。

基本は Path クラス。ディレクトリやシンボリックリンクも扱うことができます。また、ファイルが変更されたことをイベントとして扱うことも可能。

個人的におもしろかったのが、Visitor パターンを使ってファイルをトラバースしながら処理を行なう API。これはおもしろい。

TS-4887 Garbage Collection Tuning in the Java HotSpot Virtual Machine

Java VM はいろいろな種類の GC が採用されていますが、それぞれの特徴とチューニング方法を紹介するセッション。

おもに、Yound 世代の CopyGC と、パラレル GC、Concurrent Mark & Sweep の 3 種類。残念なことに G1 GC は紹介されませんでした。

最後に GC をモニタリングする方法。

びっくりしたのが、VisualGC が VisualVM のプラグインとして提供されるようになったこと。jconsole がなかったころは VisualGC をよく使っていたので、ここで復活するとは思いもしませんでした。

確かに、jconsole では Young 世代の寿命のチャートが表示されないので、それなりに使えるかもしれません。

その他に、オフラインのツールとして

  • GC Logging
  • PrintGCStats
  • GChisto

が紹介されました。

TS-5496 This in Not Your Father's Von Neumann Machine; How Modern Architecture Impacts Your Java Apps

CPU のアーキテクチャーの歴史と、それがどのようにアプリケーションに影響するかというセッション。

印象的だったのが、CPU とメモリのスピードのギャップが大きくなってしまった現在は、メモリは新しいディスクとしてみるしかないということ。

だから、なるべくキャッシュをなるべくミスしないようにするのが重要になってくるわけです。

ラベル: , ,

2009/06/03

今日の JavaOne 2009 Day 2 (暫定版)

今日は次のセッションを聴講しました。

General Session

Technical Session

BOF

  • BOF-4724 Monitoring and Troubleshooting Java Platform Applications with JDK Software
  • BOF-4813 SwingLabs Development Update

今日は 2 つの BOF が両方ともはずれ。なんか内容が薄いんだよなぁ...

Sun General Session - Your Java Lifestyle: Mobile, TV and Beyoond

ここ数年、Java ME は初日の Technical General Session から外されてしまい、普通のセッション枠で Java ME だけの General Session をやっていました。

ところが、今年は Java ME 単独でちゃんとした General Session が行なわれました。

この枠はもともとプラチナスポンサー枠だったのが、プラチナスポンサーが決まらなくて、しかたなく Java ME 枠になったというのが櫻庭の見るところです。 Orable も今年はスポンサーはできないと思うので、スポンサー集めは苦しいんでしょうね。

ということで、もともとは Technical General Session だったという過去を持つ、この General Session ですが、Technical なところが全くないというのはどういうことなのだろう。

話のメインは JavaFX。JavaFX Mobile や JavaFX TV、そして、昨日の General Session でも搭乗した JavaFX オーサリングツール。

しかし、いずれもデモのみで、新しいバージョンの機能紹介とか、今後のロードマップなどまったく説明されません。こんなんでいいのか?

JavaFX 以外は他の企業で、たとえば PayPal や、Sony Ericsson、Qualcomm などからゲストを呼んで話をしたり、デモするだけ。こういうないようなのであれば、初日の朝の General Session でやってもらいたいですね。

確かにメディア受けはすると思いますけど、開発者にはつまらないです。

ちなみにこのセッションでも T-Shirt 投げがありました。このためにだけ James Gosling が駆り出されてましたよ。T-Shirt 投げが終わったら、T-Shirt 用スリングショットを持ってすぐに帰って行ってしまいました。

ちなみのちなみですが、ここで T-Shirt を受け取った人は JavaFX Phone ももらえるというおまけ付き。これはちょっと欲しかった ^ ^;;

TS-5575 Extrem GUI Makeover (Hybrid Swing and JavaFX Technology)

Extream GUI Makeover は毎年行なわれている名物セッションですが、去年から JavaFX を使いはじめました。今年は Hybrid というので、Swing アプリで一部だけ JavaFX を使う話かと思ったら... 逆でした。

でも、それは当たり前すぎてつまらないなぁ。

ちょっとおもしろかったのが、ページをめくる動作。3D は使わずに 2D だけでやっています。自分でもやったことがあるのですが、どうもうまくページがめくれていくように見えないのです。

今日気がついたのは、影のつけかた。そうか、あすこに影をつけるともっともらしいんですね。

TS-5217 "Effective Java": Still Effective After All These Years

Effective Java も名物セッション。このセッションはほんとに人気があって、事前登録ができませんでした。で、キャンセル待ち列に並んだんですが、すでにこちらも 200 人ぐらい並んでいる。入れないかと思いました。

ようやく入れたのはセッションが開始されてから 10 分後。会場内は立ち見もいっぱい。とりあえず、床に座るとしても前の方がいいので、前にいってみたら前から 2 列目に空席があったのですかさずゲット。そしたら、斜め前には N 社の K 村さんが座ってました ^ ^;;

はじめはジェネリクスの extends や super の使い方。途中から入ったのでよく理解できていませんが、去年の PECS 原則をもう一度やっていたようです。

次が 2 値しか取らない変数でも、true と false で意味が分かりにくい場合は積極的に enum を使おうね、という話。

そして、可変数引数。可変数引数はパフォーマンスが落ちるらしいです。なので、よく使われる引数の個数が分かっているのであれば、それを可変数引数ではなく、固定引数で作っておいて、その他に可変数引数を使うという使い方を紹介してました。

たとえば、EmunSet クラスの of メソッドは引数が 5 つまでのメソッドは固定で定義されていて、それ以上が可変数引数が使われているのだそうです。

次は CocurrentMap の話。

Concurrency Utilities で定義されているクラスは synchronized で囲ったらダメ、という話。get して、値がなかったら put する時に使う putIfAbsent メソッドの使い方。Brian Goetz の本で勉強していたので、putIfAbsent メソッドは知っていましたけど、パフォーマンスを上げるにはどう書けばいいかという話。

でも、get メソッドの後、putIfAbsent メソッドをコールするまでの間に、他のスレッドからアクセスされていたらどうなるんだろう?

最後がシリアライズする時に、Proxy Pattern が使えるよという話でした。

 

続きは後ほど...

ラベル: , ,