torutkのブログ

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

JJUG CCC 2013 Fallに参加してきました #jjug_ccc

本日、日本Javaユーザーグループ(JJUG:Japan Java User Group)主催のJJUG CCC 2013 Fall*1に参加してきました。
http://www.java-users.jp/?page_id=695

午前中は基調講演2つ、午後は公募で採択された技術セッション、ハンズオンから構成されています。ユーザーグループ主催なので費用は無料です。

午前中は、子供の学校のイベントがあったので2つ目の講演から少々遅れて参加しました。夕方までのセッションは同じ時間帯に複数聴きたいものがあるのでどっちを聴くか苦渋の決断をしたのもあったのですが、夜の部は興味のスコープから外れるものが多く、早めに上がりました。

本イベントの公式ハッシュタグは#jjug_ccc、各講演・セッションにも公式タグが割り当てられています。

基調講演-2 2013エンタープライズJava最前線(#ccc_k2)

日本オラクルJJUG幹事の寺田さんによる講演です。講演会場入りしたときは、Java EE 7の話でした。
Java EE 7の3大テーマは、HTML5エンタープライズニーズ、開発生産性とのことです。
続いて、Project Avatarの話題で、「シン・サーバー・アーキテクチャ」クライアント側にMVCを持たせてデータの表示操作を行うという点で従来のWebアプリケーションのアーキテクチャとは異なるということを述べておりました。Java SE 8では従来のJava Script EngineであるRhinoから新しいNashornに置き換えられ、性能が格段に向上(20倍)したとの話(数値は眉唾説も流れ・・・)がありました。
その後は、Java EE 8の話題が出ていました。

お昼

会場のベルサール西新宿は、周囲にあまり食事処がありません。そこで、都庁から新宿寄りの高層ビル群のところを探索し、タイ料理屋さんでランチをしました。高層ビルの地下にあってかなり空いていました。グリーンカレーのランチを食べ、同じエリアにあるスターバックスで食後のコーヒーを飲んで会場に戻りました。

H-1 ジェネリクスの基礎とクラス設計への応用(#ccc_h1)

なぎせゆうきさんによるジェネリクスのセッションです。

本日のキーワードは「Generics Hell」とのことです。

ジェネリクスのない世界では、コレクションはObject型からのダウンキャストが付きまとい型不安全で実行時にエラーが出る可能性がありました。コレクションに詰める要素の型はドキュメントするしかない状況でした。ジェネリクス以後の世界は、安全がもたらされました。でも・・・

ジェネリクスを使ったAPIを利用するプログラマーはそんなに知識はなくてもいいとのことです。
ジェネリクスのスコープは、メソッド(主にstaticメソッド)、インスタンスの2つがあります。

このあと型のバインド、型推論、継承によるバインド、ワイルドカード再帰ジェネリクス、・・・と話が展開されていきました。以下は興味持ったことのメモです。

  • Javaの配列は型安全ではない
  • Javaジェネリクスはイレイジャー方式なので実行時にはジェネリクスの情報は消えていると思いがちですが、実はパラメタライズ型情報はクラスの中に残っています。JavaコードからもリフレクションAPIで取得することができます。
  • ジェネリクスでは、通常new T()のようなインスタンス生成ができません。ファクトリメソッドを作るか、引数にクラス型情報を取るかする必要があります。継承バインドを使うと、引数にクラスを取らなくてもリフレクションAPIでnewすることができます。

現在、ジェネリクスに関する書籍執筆準備中とのことで、ジェネリクスについて何でもツイッター、ブログ等で受け付けています、とのことです。

R1-2 JavaFX 8に関する7つのこと(#ccc_r12)

櫻庭 祐一さんによるセッションです。当日になるまで調整中だった枠で、本来別セッションの予定だったのが、昨日急遽決まったとのことです。

裏が(表が)Project Lambdaなので参加者はまばら、でもJavaFXプログラミングやったことある人にほとんど手が挙がっていました。

JavaFXの概要であった話を列挙。

  • JavaFX 8の開発コード名は"Lombard"、ちなみにJavaFX 2は"Presidio"、どちらもサンフランシスコの地名です
  • Javaのコードでも書けるけど、FXML使って欲しい
  • それぞれのMVCがあるよね、V-C-Mと一直線になる(Webちっく?)のは気持ちが悪いけど(櫻庭さんはSmalltalkMVC派)
  • JavaFXでは、Applicationを拡張したクラスをまず書きますが、mainメソッドは要注意、初期化コードをそこに書いても呼ばれないことあります(実は別にmainを持つクラスが作られ、プログラムのエントリーはそちらになる)
  • コントローラはモデルに引き継ぐ役割で、ロジックはモデルに記述してください

7つのことは次です。

  • Performance
  • 3D
  • Theme
  • Printing
  • Swing
  • Rich Text
  • TransformationList(?)
  • Misc(あれ、8つ目)

GPUを使って描画するので、GPUによって大きく性能が違ってきます。IntelのCPU統合GPUにも対応しているので最近のPCなら大丈夫です。古いPCの人はこれを機に買い換えてください!とのことです。
WebViewが速くなりましたが、Java SE 8のJavaScriptエンジンNashornのおかげです。セッションでは、WebKitJavaScriptベンチマークJavaFX 2、JavaFX 8、Chromeで実行して比べていました(それぞれ順に835ms, 311ms, 155ms)。ただ、JavaFX 8のWebViewは文字化けがあったり描画が一部欠けたりとまだバギーでした。

JavaFX 2ではテーマ(ルック&フィール)は固定(Caspian)でしたが、JavaFX 8ではModenaが追加されました。ApplicationクラスのsetUserAgentStylesheetメソッドでテーマのスタイルシートを指定することで
切り替えできます。自前のテーマもスタイルシートを作成してファイル名を指定すれば適用できますのでぜひテーマを作って公開してくださいとのことです。

Swing統合は、SwingベースのGUI上にJavaFXのパネルを貼る方法(JFXPanel)と、JavaFXベースのGUI上にSwingのコンポーネントを貼る方法(SwingNodes)があり、どちらもスレッドの扱いが注意とのことです。

Miscでは、UnifiedStage(メインウィンドウにツールバーが加わる等)、フルスクリーンのショートカット、非同期の処理で繰り返し等ができるScheduledServiceが挙がっていました。

Q&Aメモ

  • JavaFXプログラムのビルドにはAnt以外にmaven、gradleがあって、OpenJFXはgradleでビルドしているとのこと。

R5-3 Project Lambdaハンズオン(#ccc_r53)

櫻庭 祐一さんによる「Lambda道場」セッションです。満席(立ち見)です。

ハンズオンといってもPCで動くプログラムを作るのではなく、紙と鉛筆です。
無名クラスを使ったコードやfor文で書かれたコードをラムダ式やStreams APIを使ったコードに書き直す演習が行われました。

ラムダ式は、慣れのところが多いと思うので、この方法は目で見て耳で聞いて手を動かしてと五感を駆使して身に付けるいいやり方だなと思いました。後半のStreams APIが少し時間不足で駆け足になってしまいました。

ちなみに配布された教材(使用後)の一部の写真を載せます。

なお、手でコードを書くことで、ラムダ式のメリットの1つであるコード量が少なくてすむという点がよく分かりました。NetBeans(等のIDE)だとバシバシ補完できてしまって多少コード量多くても気にならないです。

comparator1 = (Integer x, Integer y) -> { return x -y; };

と紙に鉛筆で書くと大変ですが

comparator1 = (x, y) -> x - y;

なら楽ですね。

また、今回書き換えの演習で、いくつかメソッドリファレンスを使ったケースもあり、何回か書いたことによってメソッドリファレンスも抵抗感が少なくなったと感じました。

R5-5 JVMコードリーディング入門〜JVMのOS抽象化レイヤーについて〜(#ccc_r55)

虎塚さんのセッション。
OpenJDKのソースコード入手方法、コードリーディングのためのツール(エディタ)、そしてメインのソースコードの読み方の話です。

java.netが重い件は櫻庭さんから「java.netサイトがDOS攻撃を頻繁に受けているため」とのフォローが
ありました。

エディタは、宗派がなければ(Windowsだけど)サクラエディタを薦めてるよとのことです。
Eclipse CDT(EclipseC/C++編集する機能)は環境構築(タグジャンプできるようにする)が大変でEmacs使ったほうが楽だよとの半分冗談(半分本気)トークもあって、話がとても面白いセッションでした。

コードの読み方については、これはJVM内部のコードとかC/C++コードとかに限定される話ではなく、JVMのような複雑で規模の大きなソースコードをどう読みこなしていくかという割と普遍的な内容でした。
メモを取りながら読む(分からない箇所では、分からんとメモすることも大事)、仮説と検証を繰り返す(予想を立ててから読む)、分からないことは仮設を立てて先に進む、などです。

JVMC/C++コード特有のリーディングについては、ざっくり読むにはまずヘッダーファイルに目を通す、assertはコントラクトを表現しているので大事、デバッグコード(non-PRODUCTコード)は読み飛ばしてよい、中にはクラス丸ごとデバッグ用というのもあるので、コメントは信頼できないのもあるが、まずヘッダーファイルのコメントは設計指針やJVMドメインの解説があるので読む、ソースファイル(.cpp)のコメントは玉石混合なので、署名付きコメント、バグとラッカーID付きコメント、日付(割と最近の)付きコメントは読む、といったテクニックの紹介などがありました。

コードの図解として、blockdiagを使ってかなり大きなブロック図を作っていました。

スライドリンク

その他

参加ブログリンク

2013-11-11夜中時点でみつけたものです。(11-15夕時点で追加)

*1:CCC:Cross Community Conference、日本の各Javaコミュニティを横断して開催している技術カンファレンス