本日は、日本Javaユーザーグループ(JJUG:Japan Java User Group)主催の「祝☆Java 8 Launch」イベントに参加しました。
今回は各セッションのYouTube動画が作成されています。素晴らしい!
セッションメモ
祝 Java SE 8 正式リリース
最初は、Javaエバンジェリスト寺田さん、135枚のスライドを30分で、最初の35枚が講演内容で、残り100枚はJava SE 8の変更点紹介(それでも全体の7-8割の網羅とのこと)です。JavaVMにも性能改善、メモリ使用量低減改善が入っているので、過去のプログラムもJava SE 8で実行するだけで恩恵を受けますとのこと。ただ、互換性が気になるなぁと思っていたら、「重要資料」としてリリースノート、互換性・非互換性ガイド、既知の問題、サポートのロードマップなどを見てねと紹介がありました。これらにはちっとも目を通していませんでした。ゆっくり目を通そうと思います。最後に今後のJavaイベントの紹介がありました。
- 5月22日(木)「Java Day Tokyo 2014」
- 5月18日(日)に「JJUG CCC 2014 Spring」
徹底解説!Project Lambdaのすべて リターンズ
次は、立命館大学生2回生の吉田さん、JDKのラムダ開発メーリングリストで活発に活動していると寺田さんから紹介がありました。Java SE 8は、2004年のJava SE 5リリース以来の大型アップデートで、当時吉田さんは小学生だったといったとき会場にどよめきが起きました。落ち着いた分かりやすいプレゼンでした。
JavaのProject Lambdaは、並列処理を容易に書けるよう、言語仕様とライブラリを整備するという目的指向でのプレゼンテーションで、今までのJavaの並列処理のアプローチであるライブラリでの解決では不十分なため言語仕様での解決を導入したという説明はとても腑に落ちる内容でした。アムダールの法則を数式でなく示そうという野心的な部分も織り交ぜていました(ちょっと厳しかったかも)。ラムダ式の説明で、匿名クラスのシンタックスシュガーでないという説明(意味論が違う)もよかったです。Stream APIの説明での中間操作・終端操作の説明あたりもしっくりきました。
Q&Aのときに、Stream APIでparallel状態で並列処理されるがスレッドセーフを気にしなくて大丈夫かという質問が上がり、終端処理は1スレッドで動くので大丈夫なはずという解答でした。吉田さんがツイートで補足をしていました。
collectは複数のスレッドから一つの集約先のメソッドが呼ばれるのではなくて,スレッドごとの集約先のメソッドが呼ばれる感じです.なので,複数のスレッドで並列に実行されても大丈夫です. #jjug
懇親会のおり、Stream APIのparallelの効果について伺ってみました。データ量が多くなればparallelモードの威力を発揮するけれど、少ないと逆に遅いこともあるといった状況とのことです。parallelの際、どれだけスレッド数が起きるのかは内部で使用しているForkJoinに委ねられているそうです。
Brand new Date and Time API
3番目は蓮沼さん、JSR 310オブザーバーとして日本でもっともDate and Time APIを語れる方です。
今回のセッションは、JSR 310の考え方(設計思想、概念)をしっかり伝えるために、JSR 310がベースとしている国際標準規格ISO 8601とその技術背景となっているUTCについて、古代バビロニアからの暦の歴史や原子時計のコアとなっているセシウム133の話を織り交ぜて解説、UNIX Timeに基づく従来のライブラリとは概念がことなるという説明(だったかとおもいます)でした。JSR 310の仕様化の話にも触れ、複雑なAPIだったものがいろいろとシェープアップされて今に至っているということでした。JSR 310では、Clock(時の刻み)を停止させることもでき、現在時刻を使う機能をテストするときに便利そうです。
Q&Aで和暦の質問がありました。JSR 310では和暦の定義がハードコードされているので、もし今後元号が変わったらJavaのアップデートで対応されるはず、ということです。また、明治より前の和暦は太陰暦なので対応はしないということでした。
JSR 310にはJava SE 7向けのバックポート(懇親会でお伺いしたところ、Java SE 8用のDate and Time APIを、Java SE 7で動くように修正した版、パッケージ名は異なるがクラス名やpublicなメソッド名は同じにしているとのことでした。JODA Time APIとの使い分けについては、JSR 310バックポートは現在Ver.0.8なのでほぼ動いているけど微妙なところとのこと)もあります。
なお、スライドは説明に使った部分の後に演習問題が用意されているとのことなので、公開したらぜひやってみたいですね。
null書いたら負け!Java8コーディング作法
4番目はきしださん、書籍「創るJava」の著者で、ブログ「きしだのはてな」も有名です。
Java SE 8で導入されたOptional
Optional型に続いて、Stream APIの注意点、遅延実行を生かしたloggerの呼び出し、Mapで値にリストを使う構造でのメモ化、パターンマッチ、メソッド参照とラムダ式の使い分け、などについて紹介がありました。
懇親会のときに少し話をさせていただいたときに、Optional型を戻り値に使うのはお勧めだけれども、引数で使うとメソッドの呼び出し側が書かなければいけないコードが増えてしまうので従来どおりメソッド実装側でnullチェックするのがよいとのことで、なるほどと思いました。
JavaFX - GUI by Illusion
5番目のセッションは、日本で唯一人のJavaチャンピオンの称号を持つ櫻庭さんです。日経コンピュータ主催のITProサイトでJava技術最前線の連載記事の著者です。この3月から新たに詳解Java SE 8のテーマでの連載が開始されました。
本日のセッションは、JavaFXの概要、入門、Swingとの部品の対比、などを紹介するセッションでした。Webページを表示する部品、ムービー表示する部品、エフェクトの設定、タッチパネル操作イベントを扱うなどの「リッチな」GUIっプリをデモでみました。JavaFXでは、レイアウトをFXMLと呼ぶXMLで記述し、ルックアンドフィールをCSSで記述、ロジックをJavaで記述するスタイルです。ただし、Javaだけでもすべてを記述できます。XML記述は専用のレイアウトツールSceneBuilderが提供されています。CSSはSceneBuilderでは編集できず、NetBeans等で編集します。FXMLでレイアウトした部品(コントロール)とJavaのロジックとは双方向バインディングで結び付けます。
SwingとJavaFXとの違いで、一番顕著なのがTable(表部品)です。SwingのJTableに馴染んでいると、JavaFXのTableViewが難しいです。今回はコードではなく概念の違いを分かりやすく説明されていました。
続いて、JavaFX 8の機能をかいつまんで説明し、その中から3Dについてデモを含めた紹介です。短い時間でプリミティブからフォンシェーディング、テクスチャまで駆け足でした
なお、例によって本プレゼンテーションはJavaFXで書かれたアプリケーションプログラムとなっています。
懇親会のときに、ベクターグラフィックスの実装方法として、ベクターを1つ1つシーングラフに追加する方法とCanvasに書く方法があるけど性能どちらがいいでしょうかと質問させていただいて、特に再描画(ダーティリージョン)が発生するならCanvasが性能いいよとのアドバイスをもらいました。そのほか、3Dでガス状の描画をするパーティクルについて話をきくことができました(道のりは長そうです)。
先のDate and Time APIのセッションで和暦(元号)の処理がハードコーディングされているという話を受けて、Date and Time APIに比べてCalendarの唯一のいいところは、和暦(元号)が設定ファイル(calendars.properties)に書かれているので、追加は可能ですよということでした。
from old Java to modern Java – reloaded
6番目のセッションは、Acroquest Technologyの谷本さんで、JavaOneサンフランシスコ2013に登壇した方です。
仕事でJava SE 8を使うときに何に気をつければよいか、というテーマのセッションですが、実はコードレビューをする側の人達(年寄り世代)に対して、若手がJava SE 8の新しい機能を使って書いたコードを「よく分からないから以前のように書き直して(その方が可読性が高い)」などと言ってしまう老害になることを防ぐための呼びかけでした。
ファイル操作では、Paths/Pathクラスを使い、forEachなどへラムダ式を渡して処理するような書き方をしていきましょう(ちょっと違う?)、文字列操作(String.join)、集計処理(GroupByがある複雑な処理)などを従来の書き方、新しい書き方で対比しての説明でした。
正直最後の集計処理はStream APIで書かれたものがすっと理解できず、厳しかったところもありますが、全体的には新しいJava SE 8の書き方がいろいろ分かりました。集計処理についても、SQLを始めた最初の頃はGROUPBYは書けないよね、勉強して書けるようになったよね、だからJava SE 8でも勉強は必要だよ、ということなので、もう少し勉強が必要なことを痛感しました。
Q&Aのときに、Stream APIの式を途中で中間変数に置いて、分かりやすいように式を分割する際、Streamを変数にしてしまうと危険があるよという指摘がありました。Streamはコレクションではない、単なるイテレータなので、コレクションが変更されるとイテレータは正常に動作しないから、ということだったかと思います。
Raspberry Pi on Java ショートアップデート
日本ラズベリーパイ・ユーザーグループの太田さんによるRaspberry Piの紹介、Oracle Javaの搭載状況などのお話です。Oracle Java SE 7は今やapt getでインストールできるようになっています。Java SE 8はまだaptには載っていないのでダウンロードして展開するということです。なお、Java SE 8はhard floatなので気をつけてね、カーネルはなるべく最新がいい、とのことです。
Raspberry Piは、秋葉原でも売っているけれど、通販に比べて1000円くらい高いから通販がお勧め!とのことです。
懇親会メモ
セッション終了後、セッション会場の隣の会議室でビアバッシュ形式で懇親会が実施されました。
JJUGのセミナーの場合、発表者の方が大抵懇親会に参加するので、いろいろと話を聞くよい機会です。
といいながら、そんなに気軽に知らない人と話をすることができないよ、というのもあります。社交的ではない日本人的メンタリティを持つ身として、そういう時には面識のない参加者の人にいきなり話しかけるより、発表者の方に話しかける方が最初に振る話題が特定できて楽だったりします。うまくいくと、回りの人も講演内容についての話題だと入ってきやすいので、数人で議論が行える状況が生まれます。そうすると、参加者の人とも自然と話が出来る状態になります。
資料集
Togetterまとめ:Thanks to @yamadamn さん
YouTube動画:Thanks to 山本裕介さん(@yusuke)
発表資料
- 祝 Java SE 8 正式リリース
- 徹底解説!Project Lambdaのすべて リターンズ
- Brand new Date and Time API
- JavaFX - GUI by Illusion
写真(櫻庭さん撮影)
登壇者のブログ
- 【祝】Java SE 8 正式リリース | 寺田 佳央 - Yoshio Terada
- 「祝Java8Launch」に登壇してきました #jjug - きつねとJava!
- http://www.coppermine.jp/docs/programming/2014/03/date-and-time-api-1.html
- http://www.coppermine.jp/docs/programming/2014/03/date-and-time-api-2.html
参加者のブログ
- JJUG 春の Java 8 祭りに行ってきた - この国では犬が
- JJUGイベント 「祝☆Java 8 Launch」に参加してきました - シュンツのつまづき日記
- ラムダ禁止じゃなくてラムダ促進を目指してStream APIを考える: そらの彼方からの輝き
- Java 8 Launchイベントやってきた。 - 水まんじゅう2
- #JJUG イベント 「祝☆ #Java8 Launch」に行ってきた - コードつれづれ
- http://ogaclejapan.com/languages/2014/03/22/learn-java8/
- 「祝Java8Launch」に参加してきました #jjug - きつねとJava!
- 「祝☆Java 8 Launch」に行ってきた #JJUG - 旧山pの楽しいお勉強生活
- 祝☆Java 8 Launch (3/21) : 人生、気合いと具合 - blog
- JJUGイベント 「祝☆Java 8 Launch」に参加してきた – NaviPlus Engineers' Blog
- 3/21 JJUGイベント 「祝☆Java 8 Launch」に行ってきました - 日々のきの
- 「祝☆Java 8 Launch」イベントへ行ってきました - 虎塚
- http://act2012bl.wordpress.com/2014/03/23/jjug%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88-%E3%80%8C%E7%A5%9D%E2%98%86java-8-launch%E3%80%8D%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/