今日は、日本オラクル主催のJava Day Tokyo 2013が秋葉原で開催されました。会場は秋葉原駅そばの秋葉原UDXです。Java関係の大きなイベントは秋葉原では初とのことです。
https://oj-events.jp/public/application/add/64
基調講演
Java SE
2011年にリリースされたJava SE 7では、サポートプラットフォームをMac OS X、Linux/ARMに拡大しました。Java SE 8は来年第1四半期にリリース予定です。Java SE 8には新しい機能がいろいろ入りますが、目玉はラムダ式で、言語仕様、ライブラリ、そしてJVMに手が入ります。JVMへは、デフォルトメソッドとInvokeDynamic。デフォルトメソッドはラムダ式の導入で既存インタフェースを変更する必要が生じますが、後方互換性を維持するためにインタフェースに定義するメソッドにデフォルト実装を持たせます。デフォルトメソッド導入によって実装(振る舞い)の多重継承がJavaに入ってしまいます*1。ただし、C++のように状態の多重継承は持たないので、影響は限定的という判断です。
Java SE 8は、現在早期アクセス版が公開されています。まもなくフィーチャーコンプリートを迎えます。是非試して問題点があれば連絡してください。
昼食と散歩
お昼はJava読書会メンバーの小棚木さんと食べました。昼時ですが待たずに入れました。午後一のセッションは当初申し込んでいたG1GCが中止となり、ぽっかり空いていたのでせっかく秋葉原に来たのだからPCパーツショップをぶらっと見て回り、コーヒーを飲んで14:30からのセッションに出ました。
Java SE 8の関数プログラミング
ラムダ式導入の目的は、計算機の性能を最大限に引き出すことです。コンピュータ(CPU)の進化はムーアの法則に沿ってトランジスタ数を増やしてきているが、クロック向上が限界になりコアを増やす方向となっています。そのため、性能を引き出すには並列処理をプログラミングします。今まではマルチスレッドにより実現していましたが、これはプログラミングが大変です。そこで、Java SE 8では複雑な構造をライブラリ内に閉じ込め、使い方を理解すれば並列処理が実現できるスタイルを導入しました。これにはライブラリが重要となります。
ここで2011年に卒業した学生の最高得点を探す、お決まりの例題について、今までの実装、並列処理の実装、ラムダ式による実装と3つのコードを紹介し比較してラムダ式の簡潔さ(読みやすさ)を強調していました*2。
ラムダ式は関数インタフェースのインスタンスを作る構文で、クロージャとは違います、ということです。実効finalの話が出ていました。
そのほかメソッド参照、コレクションのソートのコード例でラムダの使用による記述の簡潔化の例を説明していました。
最後にラムダ式のJava内部での実現方法として考えられるいくつかの案を並べ、それぞれの得失を説明していました。例えば、ラムダ式を単純に匿名内部クラスに展開する実現方法があるが、ラムダ式1つについて1クラス(インスタンス)を生成するため性能面でよろしくないといった説明がありました。実際には、invokationコストを最適化するための実現方法が取られています(invokeDynamicを使って)。
追記
このセッションで紹介されたサンプルコードは少し古いもので、現在入手できるJDK8 b89でそのまま実行することができません。
JVM言語(Groovy, Scala, Clojure, JRuby)でのJavaFX
Vanishing CirclesというJavaFXのデモプログラムを、Java、Groovy、Clojure、Scala、Project Visage(ScalaでDSL?)、JRubyで記述した比較を紹介するセッションです。Vanishing CirclesのデモはJavaFXのチュートリアル資料にあったアニメーションのサンプルと似ています(同じ?)。
http://docs.oracle.com/javafx/2/get_started/animation.htm
各言語で書いた場合のコード量(行数と文字数)をそれぞれ出していたのでメモ
言語 | 行数 | 文字数 |
Java | 40行 | 1299文字 |
Groovy | 29行 | 671文字 |
Scala | 33行 | 591文字 |
Project Visage | 35行 | 487文字 |
JRuby | 33行 | 842文字 |
Groovyでアニメーションの時間指定(Duration)に 40.s で40秒のDurationになるといった記述は面白いですね。Scalaも(40 s)で40秒のDurationになるそうです。
あとGroovyの@FXBindableアノテーションは簡単でいいですね。たしかにこう比較されるとJavaはコード量が多いです。
あと、講演者のStephen Chin氏は、各言語を日本のアニメに例えていました(アニメ好き?)。ルパン三世、ワンパンマン(ONE PUNCH-MAN
)、グレンラガン、エヴァンゲリオン、ブリーチが登場していました。
タブレット用のJavaFX(マルチタッチ)
マルチタッチアプリケーションで考慮する4つのことを説明
- ジェスチャー(スワイプ、スクロール、ローテート、ズーム)
- タッチイベント、タッチポイント
- ページネーション制御
- 指の大きさに対応
JavaFXではいずれも簡単な記述で実現できるようです。面白いので試してみたいと思ったものの、タッチパネルを持つJava SE 7が動くデバイスを持っていないので当面見るだけかな・・・。
Java The Night
9組のデモが各8分間の持ち時間で行われました。多くがJavaFXを使ったものです。
以下、ツイートした内容の転記です。
- 1つ目、VisualVMでG1GCをみてもRegionが可視化できないので、GCログから可視化するプログラム、JavaFXで作成。
- 2つ目、プレゼンツール、PDFの上にJavaFXのGUIを重ねて表示するpdfx。このプレゼン自体がpdfxで作られたもの。学生参加!プログラミングを楽しんでいることがやんわり伝わってきます。
- 3つ目、JavaFXでJavaEEの豊富な監視機能を呼び出し可視化。JAX-RSを使ってる。ステータスに応じて色付け、グラフ表示、透過ウィンドウなど凝った作り。
- 4つ目、古の技術Sun SPOTで操作する、JavaFXのブロック崩しとJavaFX8の3Dジオメトリ。
- 5つ目、デュクレレと007の音楽で開始、JavaFXのプレゼンツールCARAIBE。テキストエリアにJavaコードを書いて実行も。コンテンツは任意のドローツールで書いてSVGで取り込むなど。
- 6つ目、Java障害解析ツールHeapStats。エージェントをJVMにくっつけてアナライザで可視化。
OSの情報も取れるのでJNIも安心。オーバーヘッドを2、3%に押さえてるためHotSpotのC++に入り込んで作ってる。
- 7つ目、GlassFishのクラスタを自宅のSolarisで24台(仮想?、物理6?)で24ノードで実行。VPNで自宅につないでのデモ。
- 8つ目、Raspberry Piでjetty?、h2 DBを実行。JBossは起動がめちゃ遅いとか。
CPUは遅いのでアプリ作るときは気を付けて、GPUはいいので、JavaFXは速いとのこと。
最後に、日本オラクルの寺田さんから、Java SE 7のAPIドキュメント日本語版を日本オラクルから提供することができましたと紹介がありました。
Java SE7API日本語版提供開始 | 寺田 佳央 - Yoshio Terada
感想
Javaはまだまだ進化しているということが伝わってきました。しかも、互換性(後方互換性)をとても重要視していて、いままでJavaで作った資産(アプリケーションやライブラリ)が新しいバージョンでも動くことに最大限努力をしています。
このことは前から感じてはいましたが、言語仕様ほかに手が入るラムダにおいても変わっていないので、Javaを使ってプログラムを書く身としてはうれしいことです。Javaを気に入っている理由の1つです。
オブジェクト指向プログラミング言語でラムダ式が書けない唯一の言語だともいわれるJavaですが*3、来年やっと並ぶことができるので少しあゆみが遅いと思われるかもしれませんが、プログラミングを習得する時間を考えるとちょうどよいとも思っています。2年ごとにメジャーバージョンアップというのはむしろ短いくらいと感じています。
また、ARMプロセッサのデバイスでもJavaが動くようになるのはうれしいですね。Javaを知ってしまうと、C++で書くのは大変ですし、Cで書くのはさらに・・・。
Raspberry Piを買って遊んでみようと思いました。
あとは、仕事でも趣味でもJavaでWebアプリを作ることはほとんどないので、数年前までのWeb/Java EEばっかりなセッションではなく、Java SE、組み込み系のセッションが増えて、よいバランスとなっている今回のJava Dayの構成はとても良いと思います。