torutkのブログ

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

Java Day Tokyo 2013に参加して

今日は、日本オラクル主催のJava Day Tokyo 2013が秋葉原で開催されました。会場は秋葉原駅そばの秋葉原UDXです。Java関係の大きなイベントは秋葉原では初とのことです。
https://oj-events.jp/public/application/add/64

基調講演

Java SE

2011年にリリースされたJava SE 7では、サポートプラットフォームをMac OS XLinux/ARMに拡大しました。Java SE 8は来年第1四半期にリリース予定です。Java SE 8には新しい機能がいろいろ入りますが、目玉はラムダ式で、言語仕様、ライブラリ、そしてJVMに手が入ります。JVMへは、デフォルトメソッドとInvokeDynamic。デフォルトメソッドはラムダ式の導入で既存インタフェースを変更する必要が生じますが、後方互換性を維持するためにインタフェースに定義するメソッドにデフォルト実装を持たせます。デフォルトメソッド導入によって実装(振る舞い)の多重継承がJavaに入ってしまいます*1。ただし、C++のように状態の多重継承は持たないので、影響は限定的という判断です。

Java SE 8は、現在早期アクセス版が公開されています。まもなくフィーチャーコンプリートを迎えます。是非試して問題点があれば連絡してください。

JavaFX

Java SE 8に合わせてJavaFX 8が出ます。そのJavaFX 8の新機能の一つがJavaFX 3Dです。3Dジオメトリ機能(プリミティブな3次元シェープとユーザー定義シェープ-三角メッシュ)、カメラ、ライティングが主要機能です。
JavaFX 3Dのデモがあり、バンプマッピングや点光源を動かしての表示など多彩な機能を紹介していました。ソースコード断片も見せていましたが、非常にシンプル(要所をスライド1枚に収める程度)でした。デモはWindows 8 SurfaceタブレットPC)を使っていました。

組み込み系(Embedded/Java ME)、エンタープライズ系(Java EE

メモを取り切れず割愛。
なお、この時点で1698人の参加者があるとスピーチしていました。

Javaコミュニティ(Java User Group)

世界にはたくさんのJUG(Javaユーザーグループ)がある。日本では、ということで日本Javaユーザーグループ会長の鈴木さんが紹介されプレゼン実施していました。
デベロッパーとして成長するために活用してほしいというメッセージを発信していました。なお、先週開催したJJUG CCCの紹介スライドにはJava読書会ライブの文字が!

昼食と散歩

お昼は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、ClojureScala、Project VisageScalaDSL?)、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の上にJavaFXGUIを重ねて表示するpdfx。このプレゼン自体がpdfxで作られたもの。学生参加!プログラミングを楽しんでいることがやんわり伝わってきます。
  • 3つ目、JavaFXJavaEEの豊富な監視機能を呼び出し可視化。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は速いとのこと。

  • 9つ目、趣味のミニ四駆の話、残り3分、どうJavaにつなげるのか? twitter4jでミニ四駆のツイートを取ってmongo DBに入れたと、時間切れ。

最後に、日本オラクルの寺田さんから、Java SE 7のAPIドキュメント日本語版を日本オラクルから提供することができましたと紹介がありました。
Java SE7API日本語版提供開始 | 寺田 佳央 - Yoshio Terada

日本オラクルも日本のJavaデベロッパーへのサポートをしています、ということです。日本オラクルさんありがとう。

感想

Javaはまだまだ進化しているということが伝わってきました。しかも、互換性(後方互換性)をとても重要視していて、いままでJavaで作った資産(アプリケーションやライブラリ)が新しいバージョンでも動くことに最大限努力をしています。
このことは前から感じてはいましたが、言語仕様ほかに手が入るラムダにおいても変わっていないので、Javaを使ってプログラムを書く身としてはうれしいことです。Javaを気に入っている理由の1つです。

オブジェクト指向プログラミング言語ラムダ式が書けない唯一の言語だともいわれるJavaですが*3、来年やっと並ぶことができるので少しあゆみが遅いと思われるかもしれませんが、プログラミングを習得する時間を考えるとちょうどよいとも思っています。2年ごとにメジャーバージョンアップというのはむしろ短いくらいと感じています。

また、ARMプロセッサのデバイスでもJavaが動くようになるのはうれしいですね。Javaを知ってしまうと、C++で書くのは大変ですし、Cで書くのはさらに・・・。
Raspberry Piを買って遊んでみようと思いました。

あとは、仕事でも趣味でもJavaでWebアプリを作ることはほとんどないので、数年前までのWeb/Java EEばっかりなセッションではなく、Java SE、組み込み系のセッションが増えて、よいバランスとなっている今回のJava Dayの構成はとても良いと思います。

*1:型の多重継承はすでにJavaに存在している

*2:ラムダとfilter/map系APIの書き方に慣れないうちは読みやすいと感じませんが・・・

*3:C++ですらラムダ式が書ける