読者です 読者をやめる 読者になる 読者になる

JJUGナイトセミナー Java API訴訟問題を考える

JJUGナイトセミナー Java API訴訟問題を考える に行ってきました。

Oracleが訴えるまでの経緯について~SunとOSSとIBMとAndroid~

鈴木雄介さん(JJUG会長)

Oracle vs Googleの前に知っておいてほしいこと

Javaのエコシステム

Javaの魅力

  • 標準仕様と各社別の実装
  • 仕様の策定はオープン
    • 仕様はJCPを通じて作成される
    • 当時はSunを中心にベンダー各社が標準の組織
    • 2011年になってJUG(経由で個人)も参加可能に

各社別の実装

  • ベンダーはJava標準APIを実装した製品を販売する
  • 標準だからロックインが回避できる
    ベンダー独自実装への極端な拒否感があった時代

JCPの目的

  • 標準化の共有と追加実装の許容
  • ただし、標準認定にはSunによるテストが必要
  • パスするとJavaのロゴマークを使える(お金は払う必要がある)
  • とてもよくできたエコシステム

  • 一方Javaは肥大化するばかり

    • 当時は全てを実装しないといけなかった

OSSのエコシステム

  • Apache Software Foundation
    • 1999年設立 オープンソースを支援する任意団体
    • OSSをホストするためのプロセスがある
    • 基本的にApashce Software Licence(AL) 2.0
      • 商用製品やクローズドにも利用可能
      • 公開しなくてもいい

IBMとASF

  • WebSphereはASFの成果物を利用
    • ServletコンテナはTomcatベース
    • HTTPはApacheベース
  • オープンソースを戦略的に活用
    • Linux成功体験がベース
    • Eclipseを2001/11にOSS化
  • OSSを通じた実質的な標準化

  • 2004年 TomcatがRI(参照実装)に

  • コミュニティからのイノベーション

    • 2005年 IoC(後のDI)、Spring
    • 2006年 JBoss旋風
    • JavaSEがついていけてなかった
  • JavaSEでもTomcatのようなことができないか

JavaとOSS

  • 2005/5 ProjectHarmonyが提案
  • Apache Licencse2.0 て提供されるJ2SE 5 の実装を提供すること
  • モジューラーランタイム、つまりJavaVMやクラスライブラリの実装を自由に組み合わせられる仕組みにすること
  • 参加者多数 BEA、IBM、Intel 等
  • 2006/10 ApacheHarmony誕生

  • 2006/11 Sunが対抗してJ2SEをOSS化

    • のちのOpenJDK
    • ただしGPLv2(コード公開義務あり)
      ベンターは不満
  • 2006年 Apache Harmonyが認定を要求

    • Javaが規定するJavaseの利用目的に組み込み系への利用制限があったため適用せず
    • 2007年 公開書簡
      • Harmony 制限外せ
      • Sun やだ
  • 2007/8 SunがTCK(認定のテストキット)を公開

    • ただしGPLv2なら
    • どう見てもOpenJDK専用
    • Apacheが抗議活動をし、JCPでのJSR承認に全て反対する

AndroidとJava

2005年頃からGoogleのAndroid戦略

  • オープンソースによる共有資産を作ることでキャリアも端末メーカーも大きなメリット
  • MSを倒す
  • キャリアや端末メーカーに互換性を提供する
  • Androidコミュニティを構築する

  • この時点ではMozzilaライセンスを検討

  • Andy Rubin氏によるSunへの批判

    • Androidはプラットフォームであり、各社が自由に差別化できるべき
    • SunはOSSにしたとしても、独自実装を含むならSUNから認定を受けるためにロイヤリティを払う必要がある
  • Googleも当初は認定をとるつもり

Android

  • しかたなく独自JVMのDalvkを作る

  • ソフトウェアの呪縛から逃れたかったハードやキャリアが支持

  • Googleはソフトウェアの対価は不要。ユーザーベースが欲しい

  • 結果として分断が生まれた

    • Googleの責任もあり、メーカーのセンスのなさもある

その後

  • SunのOSS戦略は成功せず
  • 2009/4/20 Oracle買収発表

  • 2010/8 OracleがGoogleを提訴

  • 2010/10 IBMがOpenJDKに ー Harmonyは2011/11に活動停止

まとめ

  • Javahaベンダーによる標準システムのエコシステムをつくったのはよかった
  • しかし、OSSの実装の共有と独自実装の流れになった

個人的見解

  • GoogleがJavaを分断したは正しい
  • SunがOSSを利用したビジネスをできなかったことも問題

    • OSSを戦略的に利用できなかった
    • JavaをOSS化しなければもっと分断したと思われる
  • なぜ訴えたか

    • JavaMEで得ていたライセンスがなくなったのはAndroidのせい?
  • IBMすごい
    • Harmonyを始めたのも終わらせたのもIBMなのに訴訟の話には出てこない
    • うまく暗躍してる感じ

Oracle vs Google訴訟の全貌と概要 ~APIは著作権で保護されるべきか~

栗原潔さん(弁理士)

訴訟の概要と争点

論点は3つ
最初の二つは解決済み

  • 特許権侵害

    • OracleがSun買収に伴い獲得した特許権
    • Oracle敗訴
  • Javaライブラリ実装コード本体の無断複製

    • 対象はわずか rangeCheck() の9行のみ
    • 違反だが違反金は(たしか)$0
  • JavaAPIの著作権侵害

    • APIは書作権で保護されるか
    • API利用はフェアユースになるか
    • 2016/6 保護されるがフェアユースにあたるとの評決
    • Oracleは控訴の方針

法律議論の注意点

  • 解釈論
    現在の法律をどう解釈すべきか
  • 立法論
    そもそも法律はどうあるべきか

著作権制度の大原則

  • 申請しなくても創作したら自動的に生じる
  • 著作権法は表現を保護するものであって、アイデアを保護するものではない(二分論)
    • 表現とアイデアが常に明確に分離可能とは限らない
    • 特にプログラムについてはそう言える

そもそも論

  • なぜプログラムは著作権法で保護されるのか ー 本来音楽、美術、文学等に関連した法律で、技術産業とは縁が薄かった
  • 1980年代にプログラム保護が急務だったため、政策的に「文芸の著作物」として保護することが決められた
    • 日本は特別法による保護を主張していたが、米国の圧力で断念
    • ベルヌ条約で国際的調和を早期に実現する以上やむをえない決断だったと言える

米国フェアユース制度とは

著作権の例外規定

  • 日本
    • 法律に明記された制限規定に従う
  • 米国
    • 公正な利用であれば著作権が制限される(フェアユース)

社会にメリットがあると判断されればフェアユースとなる

  • 仕様の目的および性質(非営利だとフェアユースになりやすい)
  • 著作権のある著作物の性質
  • 全部コピーか一部か
  • 潜在的市場または価値に対する仕様の影響
    • 実際はこの要素が重要視されることが多い
    • コピーされたことで元の商品が本当に売れなくなったか等

例:家庭でテレビを録画しても侵害にならない理由

  • 日本
    • 私的利用目的のため
    • 判断基準は法律にどう書いてあるか
      • 予測可能性が高い
  • 米国
    • タイムシフト録画はフェアユースであると最高裁判決が出されたから
    • 後に法制化
    • 判断基準は実態として損害があったか等
      • 社会・技術の変化に迅速に対応

フェアユースに関するOracleとGoogleの言い分

Oracle

  • GoogleはAndroidから420億ドルの広告料を受けている
  • フェアユースは報道、教育、研究などに適用されるもの
  • Googleはスマホ市場の遅れを取り戻すために流用した

Google

  • APIの再利用はイノベーションの源泉
  • Javaは最初からフリーでオープンなものとして構築された。これにより産業と社会は大きな御社を受けた(証言:ジョナサン・シュバルツ)
  • Oracleはスマホ市場で競合しておらず、ライセンス収益を求めているだけ

一旦フェアユースとなったが、Googleが正しいとは必ずしも言い難く、ひっくり返る可能性はあると思う。

個人的見解

  • 実装コードの大量デッドコピーに限定されるべき
  • そもそもソフトウェアのSSOは著作権で保護されるべきではない
    • 車のエンジンで他社のを見て真似るようなことは普通にされていることで、プログラムだけ許されないのはおかしい。特許は別。
  • 互換プラットフォームのためのAPIは制限されるべきではない(ただし、こんかいは完全な互換PFとは言い難い)
  • 仮にGoogleが敗訴してもAndroidが販売禁止になることはなく、お金で解決されるだろう

JavaOne 2015 報告会 @ 東京

JavaOne 2015 報告会 @ 東京に行ってきました。

Opening & JavaOne 2015 over all

伊藤 敬さん(日本オラクル)

Keynoteはあまり見所がなかった。セッションが中心。 参加者は去年より微増。9000人くらいか。

キッズプログラムが非常に大きな規模で行われた。 小学3,4年から中高生までWebだけでなくIoTやロボットなんかもあった。 印象に残ったのは、社会人と同じくらいプログラムができる子供が非常に多かった。

Java人口は1000万人くらいに戻してきている。
ロードマップは今までと変わらなかった。OpenJDKはコミッターの数が136%伸びた。 UserGroupは倍増。南米で増えている。日本でも増えた。

JCPの法人会員を増やそうとしている。法人会員費を免除しようとしている。 あとは可決を待つだけで、実際は今問い合わせをすると無料にしてくれる。

Impressions of JavaOne & Java trends

鈴木 雄介さん(JJUG)

JavaOne感想

目玉は無し。20周年がなければ寂しかった。
Sunの創業者のスコットが登場。

コミュニティ・キーノートが開催されたが、学芸会のようなパーティーのノリ。 Kids are future.(子供達が未来)

OracleとJava

Oracleは予定通りに作業を進める会社。
Javaエヴァンジェリストを削減。
コミュニティの声を聞こうという姿勢。JCPにもJUGが関わっていくことも可能。Javaカラーは維持されている。

コミュニティを重視しているのは間違いない。一方でJavaビジネスは苦労していそう。OracleとJavaはいい関係でもあり微妙な関係でもある。

JJUGとしては引き続きエンジニアの地位と技術力の向上に貢献します!

技術トレンド

  • DevOps & Microservices
    Javaそのものが重要ではない(Javaは基盤)
    Javaという単語が出てこないセッションも結構あった。
    ITサービス運用が重要
    いかにITサービスを継続していけるか
    ソフトウェア開発は十分に成熟している

現時点では先端Webサービス系企業が取り組んだものが共有されて広がりつつある状態。
Netflix、Gilt、Twitter、Foursquare等

  • カナリアリリース
    現行システムに並行してNewバージョンを動かして、少しずつNewに移行していく。
    サーバー台数が倍必要。クラウドならではのリリース方式。

  • ダークカナリア
    開発者にしか見えないリリースを本番環境にする。(本番環境でのテスト)
    ステージングではなく、バグがあってもいきなり本番環境にリリースして、開発者だけがアクセスしてテストする。

  • Chaos Monkey
    ランダムにサーバーをダウンさせるOSS
    インスタンスは毎週、アベイラビリティゾーンあるいはリージョン丸ごとは毎月おとしている。

全体的にサービス品質を高めるために、部分的な品質劣化を許容する。
不運なユーザーはいるが、サービスがダウンすることにはならない。
エンタープライズ発想とは異なる。どちらがいい悪いではない。

重要なポイントが変化している。
昔は内部の構造(クラス図とか)が大事
-> プロセスや外部品質が大事(アジャイルやユニットテストとか)
-> サービスを維持することが重要に

Javaエンジニアだからと言ってサーバーのことを知らなくてもいい時代ではなくなった。

サマリ

来年のJavaOneに注目
Java9がリリース!

Javaだけではないトレンドにも注目
サービスにも目を向けてみよう。

JJUGをよろしく!
Javaコミュニティは引き続き元気です!
懇親会も大事だよ!

JDK Update

久保田 祐史さん(NTT)

Java SE - Oracleが出しているもの
JDK - Oracleが出しているとは限らない

なぜJavaOneに行くのか
課題:Javaの進化方向
人物:誰が何の担当か
詳細:技術内容等

Java9が2016/9/22にリリース
JavaOneの最終日に合わせてきたので、何が何でも出してくると思う。

Java9
Module導入(ProjectJigsaw)とそれ以外

JDK10+
ハードウェア、OSへの最適化
去年出ていた話とほぼ一緒なので今回は話さない。

Java9

Project Jigsaw以外の変更点

jshell
Java.Doc.Next
Cross ompiling and the javac -release
Miling Project Coin - "_"のみの変数名が禁止になるので互換性に問題ある
Deprecation and imports
Re-engineering javac - Diamond nest でコンパイルが遅くなるのを解消

6つの非推奨メソッド削除(JEP162)
JDK内部APIのカプセル化
JDK/JREのランタイムイメージ変更(JEP220)
ブートクラスパスを変えるものが削除(JEP261)

Project Jigsawの変更点

長いので全部話せないと思うが、資料を公開するので後でみてください。

JAR Hell - 例えばHadoopのクラスパスの指定がとてつもなく長い
紛失したライブラリはどれ?
コンフリクトはどこで発生?
内部APIを安全に変更できる?依存関係がよくわからない

JARの抽象化機構が必要 -> Moduleの導入

Moduleは複数のPackageをまとめたコンテナ
コンテナによって

  • 依存関係を明確化
  • 他コンテナを妨げない
  • 特定パッケージのみ公開する

Moduleの定義は module-info.java ファイルに記述

例:com.foo.barの場合

module com.foo.bar {
 requires java.sql; -> 依存するパッケージ
 exports com.foo.bar.alpha; -> 公開するパッケージはexports
 exports com.foo.bar.beta to -> toで公開先を限定できる
  com.foo.app,
  com.foo.xxx
}

以下のコマンドでモジュールのリストが表示できる。

java -listmods

jdepsコマンドで依存ライブラリ確認

java.baseモジュールは基底のモジュールなので、自動的に読み込まれる。

実行可能イメージ作成
jlinkコマンドでモジュールを指定して実行バイナリファイルが作成できる
組み込みやセキュリティで活躍するかも

Java SE 講演から

伊藤 博志さん(ゴールドマン・サックス)

Eclipse Collections

ゴールドマン・サックスがEclipse Foundation Memberになったので、これまでGS Collectionsとし作っていたものをEclipse Collectionsに移管することになった。

Java8 Streamを内包して便利な機能を追加したもの。Java8でなくても、5以降であれば使うことができる。

JDKのHashSetは非常にひどい実装。HashMapをラップしているだけ。Keyを使ってValueの方は使ってないのでメモリ効率が非常に悪い。
Eclipse Collectionsでは最大で6倍くらい速度が変わってくる。

Mapも2倍くらいメモリ効率がいい。プリィティブのリストを操作する場合にも効率的な方法で使える。

Java ME & IoT

大山 弘樹さん(Javaカンファレンス)

発表時間は20分と言われたが、正直そんなに内容が無い。3分で終わる。

Java ME Embeddedバージョンが8から8.2になった。
Linux対応になった。

ME Embedded と SE Embedded があるが、SE embedded はセッションが1つも無かった。無くなったのかもしれない。

Raspberry Piが2になった

KeynodeではEmbeddedのデモがなかった。初めてのこと。

Java EE Update

大中 浩行さん(グロースエクスパートナーズ), 上妻 宜人さん

Java EE 8 は2017年リリース予定
Java EE 8 はまだ検討中なので変更になる可能性があり。

Java EE 8 のアップデート

Servlet 4.0

サーブレットコンテナもHTTP/2に対応
サーバープッシュ(関連するリソースをまとめて返す)で既存の1リクエスト、1レスポンスが崩れるので、Servletを修正する必要がある。

JAX-RS2.1

非同期クライアントAPIの改善
並列で依存関係のあるWebAPIを呼び出したい
アノテーションによる依存関係制御が追加されるかもしれない

ノンブロッキングI/O
データ読み込みでブロックしていたのが問題。データが来た時だけreadを呼び出すように変更するアイデアが提案されていた。
本当に必要?ユーザーレベルでNIOを意識しなくてもいいのでは等の意見も。

JMS2.0

これまでMessageListenerを実装する必要があった。テキストが欲しいだけなのにキャストが必要。
MessageListenerを無くす案がある。

JPA2.2

Java SE 8対応
Date and Time API への対応
@NamedQueryのRepeatable対応

スクロール機能の標準化

Java EE 周辺の話

WildFly Swarm

Spring Boot風のJava EE
2015/5に1.0.0.Alphaリリース
まだ商用には早い

実行可能なjarファイルが作成される。
java -jar xxx でWildFlyが起動されてアプリケーションが実行される。
WildFly全体で約127MBなのでまだ大きい。最終的にはもっと小さくなるのでは。

MVC1.0

actionベースのMVCフレームワーク
現在はEarly Draft
リファレンス実装はozark

なぜJSFでなくMVCなのか? 見通しのよさ、簡便さ
RESTとの相性が良い
フロントエンドの流行り廃りの激しさ
定着した技術としてのサーバーサイドMVCへのニーズ

MVCのControllarはJAX-RSのresourceとして実装

Validation
Bean Validation(JSR349)ベース
ハンドリングの仕様がprimitiveな印象

JSON-P 1.1

1.0はJavaEE7で実装
現在はEarly Draft Review
なぜかbooleanが対応の型に入っていない

JSON-PATCH
JSON更新処理の標準化
2つのJSON間のdiffが取れる

JSON-MERGE PATCH
JSON間のmerge処理
nullの値をマージするとキーの削除ができる仕様が追加になった

JsonObject/JsonArrayをMap/Listとしてstream+Lambdaで使用可能に
streamモデルによる大容量JSONデータの処理

JSONに対する低レベル操作API
JSONとJavaオブジェクト(JavaBean)へのマッピング機能は持っていない
 -> JSON-B(JSR367)で解決できるかもしれないが、標準化に時間がかかりすぎる!

おまけ

セッションを聞いていると、既に日本で聞いたことのある話が多い。
ソフトウェア開発レベルでは日本は海外に遅れてはいない。

Speaker Panel: How to be a speaker at JavaOne?

モデレータ:
 伊藤 敬さん(日本オラクル)
パネル:
 寺田 佳央さん(日本マイクロソフト)
 谷本 心さん(Acroquest Technology)
 伊藤 博志さん(ゴールドマン・サックス)

Q1.JavaOneで講演してみてどうでしたか?率直な意見を聞かせてください

[谷本さん]
費用がでなくて自腹なので高い。金銭的なメリットはないが、コミュニティに貢献できていることがうれしい。
受かるテーマで申し込んだ。ログの可視化。トラブルシュートネタは受かりやすいと踏んだ。 自分の英語が通じるかどうかが怖かったが、ちゃんと準備していれば文法が間違っていてもみんなわかってくれる。

[伊藤さん]
初めてのJavaOne参加。登壇が決まったのは9月。とにかく楽しかった。
Eclipse Fundationで枠が余ってるのでやらない?と言われて軽いノリでやった。
日本ではみんなが楽しんでるかわからないところがあるが、JavaOneでは興味持ってくれていることがすぐわかる。

[寺田さん]
今回2回目。Oracleをやめることになったが今年のJavaOneは絶対出たかった。
自分で申し込んだのではなく、他の人のセッションに一緒に出させてもらった。1セッションに2,3人でられるので、1人で不安な人は一緒にやるのもいい。
発表する10分前にお願いして出させてもらった。スライドは全部日本語で書いてあったが、結構みんな理解してくれた。 1回目の時はすごい緊張した。セッションがつまらないとみんな一気に去っていくので緊張した。今回は結構気楽にできた。
日本でやるときとは少し変えた。日本は最後まで聞いてくれるので、最後に面白いことを持ってきてもいいが、JavaOneではみんなすぐ去っていくので、最初にどんな面白いことをやるか説明すると、そこまでは聞いてくれると思った。

Q2.今後、どんな人にJavaOneで講演してもらいたいと思いますか?

[谷本さん]
CCCとかのJJUGで発表している人はでて欲しい。
日本のレベルは高いので、そのまま英語にすれば十分通じると思う。
子供がスピーカーをやるのを見てみたい。

[伊藤さん]
日本のJJUGのツイートは圧倒的に多いと思う。日本のコミュニティのあり方はユニークだと思うので、それを発信していくといいと思う。

[寺田さん]
いまここに来ているみなさんに、まずは日本で情報発信していただきたい。
事例系の話は受かる確率が高いと思うので、そういったものがある人に行ってほしい。

Q3.あなたが習得した「JavaOneスピーカーになるための極意」を教えて下さい

[谷本さん]
プレゼン中にどんどん質問がくるので、英語が苦手なら最初にTwitterで質問してくださいという。手を上げてる人がいたが見ない振りをした。
今の仕事を頑張れ。仕事を頑張ってその内容を話せばいい。仕事頑張らずに趣味の範囲で話そうとすると事例として意味がなかったり面白くなかったりすると思う。自分が体験した痛みを通して話したほうがいい。小さい会社は知名度がないのでなにか泊をつけた方がいい。お客さんの名前を出すとか。
日本でJJUG等でどれだけ発表してきたかの経歴も書くので、そういったことがあると通りやすい。
過去のプレゼンの資料や動画チェックがある。全部日本語で出したが通った。楽しそうに話してるやつだったので、ちゃんと話せる人だと思われたのだと思う。
ボソボソ小声で喋ってたらダメだと思う。

[伊藤さん]
テクノロジー系のプレゼンは用語が既に英語なので、動詞だけ英語にする感じでいいと思う。会話をするよりはプレゼンの方が楽。
JavaOneのセッションは日本のCCCに比べるとそんなにすごい内容でないことも多いので、スキルよりもマインドの問題。勢いでやってしまった方がいい。

[寺田さん]
会社として出る。楽天のように事例を持っている会社がどんなことをやっているかのノウハウがあると通りやすいと思う。 LambdaとかJigsawとかの単品の技術を話そうと思うと、本家に話す人がいっぱいいると思うので、事例やトラブルシューティングとかの方が通りやすいと思う。
参加して見る人はセッションをちゃんとみた方がいい。スピーカーの人はキャッチーなタイトルを付けたりするので、行ってみたらつまらなかったということがある。

[櫻庭さん]
締め切り間際に出すと絶対落ちる。本当でやろうと思うなら早く応募した方が絶対良い。

Q4.JavaOneのスピーカーになるとこんなメリットがあるよ!という話を教えて下さい

[谷本さん]
転職しやすくなるかも。よく話が来る。

[伊藤さん]
専用のパスがもらえる。結構いい。

[寺田さん]
チケットがタダになる。
スピーカ専用のエリアが使える。

Q5.来年JavaOneのスピーカーになりたい!と思っている皆さんへ最後に一言

[谷本さん]
3年くらい応募して落ちていたこともある。
今日出た話をまとめると2つで、コミュニティを盛り上げていきましょうと仕事頑張れだとおもう。聞くだけでやっている気にならず、参加してほしい。

[伊藤さん]
自分の仕事をしっかりやるのは大事。今年のJavaDayTokyoで初めて登壇したばっかりだが、仕事をしっかりやっていたおかげで出られたと思う。
今は出るつもりはなくても、常にアンテナを張っておくことは大事。

[寺田さん]
JavaOne、JJUGに限らず、日本には優秀な技術者が本当に多いので、ずっと聞いているひとも是非今度は発表してほしい。そうすればコミュニティも盛り上がるし、日本はこんなことやってるというのを世界に発信できる。

Java8 ラムダ式で再帰処理

Java

宮川さんときしださんがラムダ式で再起関数を実装する面白いエントリーを書かれていたので自分でも考えてみました。

不動点コンビネータを使ってラムダ式で再帰関数を定義する - 宮川拓の日記

Java8のラムダで再帰する - きしだのはてな

まず、クラス変数で定義するなら再帰は可能です。

public class Test {
    private static IntUnaryOperator fib;
    static {
        fib = (n -> n <= 1
                ? 1
                : (fib.applyAsInt(n - 2) + fib.applyAsInt(n - 1)));
    }

    public static void main(String[] args) throws Exception {
        IntStream.range(0, 10)
            .map(fib::applyAsInt)
            .forEach(System.out::println);
    }
}

main関数内でも定義できますが、この場合はstatic内がやはりいいかなと。
インスタンス変数ならコンストラクタで。

ただし1行で書くとエラーになります。

private static IntUnaryOperator fib =
        (n -> n <= 1
            ? 1
            : (fib.applyAsInt(n - 2) + fib.applyAsInt(n - 1)));
=> コンパイルエラー

他にはFunctionalInterfaceを用意して、パラメータで自分自身を渡すとか。

public class Test {
    public static void main(String[] args) throws Exception {
        Fibonacci fib = ((n, f) -> n <= 1
                ? 1
                : (f.apply(n - 2, f) + f.apply(n - 1, f)));

        IntStream.range(0, 10)
            .map(n -> fib.apply(n, fib))
            .forEach(System.out::println);
    }
}

@FunctionalInterface
interface Fibonacci {
    public int apply(int i, Fibonacci fib);
}

でもこれって再帰と呼んでいいのかどうか?(笑)

JavaOne 2014 サンフランシスコ報告会 Tokyo

Java

JavaOne 2014 サンフランシスコ報告会 Tokyoに行ってきました。

基調講演から振り返る JavaOne 2014

寺田 佳央さん

今年19回目
参加者数 9010名 年々増加している
スピーカー 615名中382名がOracle以外の人
アジアからの参加者は全体の5%
Peter Utzschneider が取りまとめ
今年1年かけたJavaのメッセージはCREATE THE FUTURE JAVA

Javaの継続的な進化

  • コミュニティ
    • OpenJDK
    • JCP
      JCP.next 進化の継続
    • Java User Group
      今年世界で約80のJUGが出来ている
  • テクノロジー
    • Java SE
    • Java Embedded
    • Java EE JSR366が承認
  • Oracle Stewardship
    • Java啓蒙活動
    • OTN
    • Java.net

今年JCP15周年のイベントが多く開催されている

Java8リリース後の現状

今年3月に出たばかりなのに、8か国で80冊以上の本が出ている。これはすごいこと。

Lambda & Stream APIとは

  • Java Language を近代化するための大きな一歩
  • Java Libraries を近代化するための大きな一歩
  • 過去最大のアップグレード

ゴールドマンサックスがJava8をエンタープライズで使用。
リリース前から既に把握していて、リリースに対応するためのコードを既に書いていた。
無名インナークラスをLambdaに変換してテストコードを9%削減できた(10.5万行→9.5万行)

高速化されている。
Fork/Joinの改良
高速なAtomic変数、並列処理ライブラリ

セキュリティ関連対策を実施
年4回定期的なパッチ提供
今後の予定
 2015/01/20
 2015/04/14
 2015/07/14
 2015/10/20

Java SE 8u20の新機能
Advanced Management Console(AMC) 1.0 (ただし契約締結者専用)

  • Java Applet、WebStartの利用状況収集
  • アクセス制限が可能
  • 特定アプリに対し、古いJREでの動作指定が可能

ちょっと触ってみたが、まだ設定が難しい。

Java Embedded

50万ダウンロード
業界全体で体制が整ってきている
多くの人がオンラインで学んでいる

Javaとモバイルのイノベーション
MobileApplicationFramework(有償)
 Javaを書けばiOS、Androidで動く
 標準技術で実装
 デバイスの差異も吸収
 Apache Cordovaでも使用可能

Java SEの将来

Java SE9

  • Project Jigsaw
  • HTTP 2.0
  • Lightweight JSON
  • Cloudに最適化したVM

JDK EnhancementProposal(Java SE9に含まれる予定の機能)
http://openjdk.java.net/jeps

JEP182 -source, -target オプションのルール変更
 JEPには無い
 過去のSEのバージョンでコンパイルするオプション
 Java8でも既に警告が出る
 Java9では指定不可になる
 古いバージョンでのコンパイルが出来なくなる

SE9以降の新しいプロジェクト

  • Project Valhalla
    • value型の追加
      参照型オブジェクトに比べメモリ、パフォーマンスを改善
    • ジェネリクスにおけるプリミティブ型
  • Project Panama
    • JVMとネイティブライブラリ間の相互接続を可能にする新機能

JavaSE7 公式アップデート終了(有償サポートはある)

Java EE の将来

常に業界トレンドを深く観察
ユーザーグループにアンケートを取って新機能を選定
HTML5/Web層の拡張
簡単開発
Cloud稼働用のインフラ

Java EE8 (JSR366)は満場一致で承認がおりた
これから開発が進んでいく

みなさんに積極的に参加してほしい
JUGで開発メンバーにフィードバックできるようになっている
http://glassfish.org/contribute

2016年にJavaEE8が出る予定

その他

IntelがJavaOneに参加
今後Javaへの最適化がされていくと思う

SnapCode
子供向け学習用IDE&RADツール

Oracle感謝祭は遊園地を貸し切って開催
エアロスミスのコンサートも

録画済みセッションを全て近日公開予定

来年はJava20周年
様々なイベントが企画されると思う

Java One 2015 San Franciscoは
2015/10/25 - 2015/10/29

Java コミュニティアップデート

鈴木 雄介さん(JJUGのリーダー)

OUGLS参加報告

Oracle User Group Leader Summit
世界中のオラクル製品ユーザーグループのリーダーが集まる場
JavaOneの直前に2日間開催

アイスブレイクとしてコミュニティの未来を考えて絵にしたり

何をするのか

  • 地域コミュニティの話し合い
  • 各コミュニティからの報告
  • ユーザーグループの成長について
    今年主なテーマはソーシャルメディアの利用
    ソーシャルメディアを利用してどうやってユーザーやスポンサーを集められるか
  • Chief Customer Officeの話
    ORACLEがいかに顧客の声に興味があるかを延々と話してた。

感想

  • コミュニティ運営は世界中で苦労がある
    東京は特異性がある
     世界でも東京のメンバー数は多い方
     イベントにこんなに集まってくれるのはすごい
  • 面白いアイデア
    動画配信やリモート講師
     日本はタイムゾーン的に海外とのリアルタイムは難しい
    子供向けイベント
  • (相変わらず)Javaは仲が良い
    夜はBBQが恒例
    他のOracleコミュニティに比べると仲が良い
    ビジネスカジュアルって書いてあるのに余裕でTシャツでくる

JJUG視点でのJavaOneの感想

サプライズはない

  • Oracle is not Sun.
    今年1月のサミットで言われた言葉
    予定通りのスケジュール(Sunにはできなかった)
    顧客の声を聞く
  • 個人的には歓迎
    Sun好きには不評ですが成熟期のJavaには必要
    Javaはコミュニティを通じて顧客の声を聞こうとしている
    いろんなところで気遣いを感じた

特にEEはコミュニティ重視

  • コミュニティサーベイはたぶん初めて
  • JCPに基づくプロセスを重視
  • とにかくユースケースを知りたがっている

これからのJJUG

JJUG CCC 2014
 11/15 @ベルサール西新宿
 Simon Ritter参戦

フィードバックください
@JJUB #jjug
members@java-users.jp

常に幹事募集中です!

Java アーキテクチャトレンド

鈴木 雄介さん(JJUGのリーダー)

Javaに閉じないアーキテクチャのトレンドの話
バズワード多めで話します
具体的な実装の話はしません

世の中の流れ

IoT

  • あらゆるものがネットに接続
  • デバイスの多様化と大量化
  • 経験の一体化

サービスへ

アプリケーション開発からサービス運営へ

  • アプリケーション開発
    仕様を定義
    開発者が作る
    基本的には閉じられた世界
  • サービス運営
    利用からフィードバック
    様々な人が関わる
    外的要因に影響される

企画、開発、運用が協力(リーンとかDevOpsとか)

アーキテクチャ

Microservices Architecture

  • 考え方
    • 固有のドメインに固有のサービスがある
    • サービス同士はAPIとメッセージを介して連携
  • SOAとの違い
    • SOA
      モノシリックなアプリケーションをサービス化
    • MSA
      サービスを小さなサービスで構成

Reactive

  • 日本語では反応的な
  • 特徴
    • イベント駆動
    • 容易な拡張
    • 障害体制が高い
    • 応答性が高い(エラーが出ても何かを返す)

JavaOneで紹介された製品

  • OSGi
    MSAかは微妙だけどモジュールは大事
  • Play+Akka
  • Spring Boot・Dropwizard
    EoDだけではない監視や障害対応機能
  • RabbitMQ
  • Closure はこれから
    まだかっこいい実装のOSSが無い

JavaOneで話されていた設計

  • DDD(Domain Driven Design)を出す人が大半
  • 変化の境界線を見つけることが大事
  • とはいえ、手探りでって印象
    カオスの淵

NoSQL

  • CAP定理
  • とはいえ、ACIDは重要
  • 正解がないので、個別のプロダクトの特徴を見極めるのが大事
    JavaOneではMongoDBが多かった気がする

なぜJavaなのか

Javaがオープンだから

  • 企業が求める安定性と挑戦が両立している
  • 両輪がフィードバックするのが理想的

安定や後方互換性もある
変化はゆっくり
常に試行錯誤し、新しいことをやる

サマリ

エンターブライズも楽しくなってきた

  • 大量だけでなく多様になっている点に注意
  • 常に変化する全体にどうアプローチするか

バズワードに注意

  • 製品を安易にくくらない(NoSQLとか)
  • 銀の弾丸はない

Java Embedded 関連のアップデート

大山 弘樹さん(@ooyama)

去年も今年もIoTとRaspberryPiが多い
RaspberryPiが売りたいんじゃないか(笑)

ME EmbeddedとSE Embeddedの2つがある
ハードをがっつり使いたいならME
MEにはJNIが無い

Java SE & JavaFX 関連のアップデート

櫻庭 祐一さん(@skrb)

Project Valhalla

Value Types

配列の(メモリ的な)要素が実態を指すポインタではなくて実態そのものを入れる

value lass Point {
  final int x;
  final int y;
}

Immutableなのでスレッドセーフ

Specialized Generics

ジェネリクスにプリミティブ型が使える
今までのジェネリクスはコンパイルしたら型の情報が消えるが、プリィティブ型を使うといろいろ問題があるのでこれから議論されていくだろう。

Project Panama

Foreign Function Interface

ネイティブコードをコールする際、Javaのメソッドを呼ぶかのように使える。
ネイティブで扱いづらかったものが統一して使えるようになる。
ヒープの使い方を再度見直して効率よく使えるようにする。

Data Layout Control と Arrays2.0

セッションで話がなかった

Project Sumatra

GPGPUの話で、去年盛り上がっていたが今年はいまいち。
AMDからはスピーカが出ていたが、Oracleから出てなかった。

Project Jigsaw

いまいち進んでいない印象。
モジュールの関連性を図にする予定だったがあきらめたっぽい?
最初いろいろやる予定だったが、今はシュリンクさせてなんとかSE9に乗るのではないか。
MLの流通量は上がってきている。

JVMのイメージファイルが作れるようになる。
必要なモジュールだけをまとめたもの。
exeファイルも作りやすくなるのではないか。

JavaFX

JavaFX 8u40で追加されるもの

  • Accessibility
    音声で読み上げてくれる
  • Dialog
  • 法線(SE9から?)
    3Dの面に対するベクトル
    今まではJavaFXが勝手に決めていた
    法線を自分で決められるようになる。

Java EE 関連のアップデート

上妻 宜人さん

Java EE8 テーマ

  • HTML5/Web層の拡張
  • かんたん開発
  • クラウド上でのインフラ

まだ作業中なので、仕様は変わる可能性がある。

Servlet4.0

HTTP/2対応

  • GoogleのSPDYプロトコルが原型
  • バイナリフレーム/ヘッダ圧縮/多重化
  • ヘッダの意味合い(GET/POST/200 OK など)は基本的に踏襲

ストリームによる多重化
StreamIDへのアクセス

サーバープッシュ

  • WebSocketを置き換えるものではない
  • 関連リソースをサーバープッシュ
    例えば、htmlの要求が来たら関連するjs,png,cssをプッシュする
  • 問題点についての解決策については話がなかった

Java SE9 でもHTTP/2に対応予定
新たなHTTPのAPIを追加。(HTTP/2に限らず1にも対応)

MVC1.0

アクションベースMVC
そもそも必要か、JAX-RSに入れるかの議論があったが、結果的に独立した仕様として検討がスタート

テンプレートは対象外
既にJSPとFaceletsがある

既存仕様との連携
 CDI, Bean Validation

JSF 2.3

CDI連携の強化

@javax.faces.bean.ManagedBeanの扱いの見直し

  • 非推奨ではなく @java.inject.Named と同様として扱う

EL式のキャッシュによる性能向上

マルチコンポーネントのバリデーション

JAX-RS 2.1

パフォーマンス向上

  • Non-Blocking I/O APIのサポート(主にサーバーサイド)
  • Reactiveプログラミングモデル(主にクライアントサイド)

SSE - Serer Send Eventのサポート

Java EE内連係の強化

  • JSON-Bとの連携
  • MVC1.0との連携

JSON-B 1.0

JSONとJavaオブジェクトのマッピング

  • JAXB(XML Binding)と同様に相互互換
  • 既存実装としてJackson data bindingなど

JavaとJSONでのプロパティ名を変えるにはアノテーションを使用。

JSON-P 1.1

JSON Processing

  • JavaEE7導入のJSON処理API
  • JSONを出力するためのJavaAPI

JavaEE8 - JSON Patch

  • JSONデータの一部を置き換える仕組み(RFC6902)
  • HTTP "PATCH" と組み合わせてJSONデータの差分更新に使う
    • "PUT"は対象URLリソース全体を置き換えることを示す
    • "POST"はリソースの新規作成に用途を絞る

CDI 2.0

非同期イベント機能の導入
通知する側が通知される側の完了を待たない。
受け側は通知を受け取ったことだけを返す。

仕様のモジュール分割

  • CDI仕様が肥大化してきて、Weld以外の安定実装が少ない

Java EE Management API 2.0

REST APIによる監視・デプロイの標準化

REST APIによる管理

REST APIによるアプリケーションのデプロイ

Java EE Secrity 1.0

JavaOneではセッションが無く、これから検討されていく

スコープを整理中

Schedule

2016/Q3 リリース


井上誠一郎さん

Java EE8

Apache TomEE, Java EE Web Profile

  • 読み方はトミー
  • TomcatベースのJava EE実装
  • Tomitribe社がバックについた

Project Avatar

  • TSA(Thin Server Architecture)
  • サーバーサイドJavaScript

Avatarのセッションは4つくらい

  • Avatar2.0
  • TSAの言及はほとんどなくなった
  • Node.js互換アピールに完全シフト
    Node.js on the JVM
    ~95% Node.js API compatibiliry
    many of the node-modules work

Nodes.jsとの違い

  • Nashornベース:Competes with Googl V8
  • マルチスレッド
  • スレッドごとにイベントループ

ロードマップ

  • 2015年 Avatar Commercial Support
  • 公開資料に書いてあった

Spring Framework

前はOracleがSpringを敵視してる感があったが、今回はそれほどでもない。
あくまで個人の印象。

Spring Framework4の特徴

  • embedded Webサーバー(Spring Boot)
  • message centric architecture
  • async processing

Spring Boot Actuator

ほとんどコードを書かなくてもWebアプリがモニタリング可能(REST API)

http://localhost:8080/health を叩いて死活監視

http://localhost:8080/info を叩くと管理ビーンのメソッドコール数の統計情報

Webサイトの手順に従ってやれば15分でできる。

Springは実用的
ドキュメントやMaven等のツールとの連携がやっぱりすごい。

まとめ

Java EEは進化を継続
AvatarはNode.js互換路線
Spring Frameworkに復活の印象(Spring Boot以降)

HeapStats の発表と出展を通して見えた JavaOne2014

高雄 慎二さん(NTT OSSセンタ)

JavaOneを情報発信の場として考えるきっかけになればいい。

展示ホール出展

世界のユーザーに直接リーチ出来ることに魅力を感じて参加
150名以上が来訪
通訳の人もいたが忙しい時は通訳してる暇がないので直接対応

出展までの流れ

5月 申込フォームをDLしてメールで送信
費用は$7500
2名までJavaOne参加のフルチケットがつく
チケット無しの展示員は何人でもOK

6月 ExhibitorKitが届く
展示に必要なレンタル物品を注文
電源のレンタルも必要(別業者)

9月 展示物を用意
手荷物で直接運搬
チラシは必須。忘れたので現地で印刷

出展のメリット

世界の関連製品と肩を並べて比較される
世界のターゲットユーザの人々に直接リーチできる
他の会社から一緒にやろうよとか言われた
バッチスキャナの威力
 名刺交換する暇がなかったが、気軽に顧客情報を得た

注意点

他のブースでExhibitorKitの既製品を使ってるところはほとんどなかった
文字の多いパネルは良し悪しあり
細かいトラブルはあるので、ゆとりが必要
 注文したディスプレイが届かずに夜中まで待ったり

HeapStats発表

出席者

予約 63名
実際 約20名
国籍 Japan、USA、フィンランド等

Speakerのメリット

世界中の人に直接語り掛ける経験
反応が直接わかる
展示よりも長時間深い話ができる
参加登録が2名まで無料
Speaker専用の部屋がある(らしい)

発表までの流れ

Call For Proposals 3/4 - 4/15
採否通知 5中 - 6中
Speaker Portalからいろいろ登録
 発表資料の登録はぎりぎりでもOK ~9/28

Call For Proposals

Titleは短めに
Abstractは公開される
Summaryは選考用?
Video 過去のプレゼン実績の動画記録
 そんなに難しく考えずに、動画をとって送ればいいと思う

英語は?

日常の仕事で英会派はほとんどしない
英語ドキュメントはそれなりに読む
ネイティブチェックは依頼(展示パネルのみ)
 発表資料はぎりぎりまで作っていたので
現地の通訳を1名依頼

まとめ

参加者との距離が格段に近くなる
世界の中での自分の立ち位置が見える感覚
技術(Java)に国境なし
BOF(birds of a feather)は初めての発表の場としてちょうどよい

JJUG CCC 2014 Spring

JJUG CCC 2014 Springに行ってきました。

寝坊したり予定あったりで、結局聞けたのは1つだけ。
それすらも最後までいられませんでしたが。。。

Java トラブルに備えよう

上妻 宜人さん(JJUG)

OutOfMemoryError

GCログの出力

Java起動オプションにあらかじめ設定しておく
-XXloggc 出力先の指定(ファイル名に時分秒をつけた方が良い。再起動時に削除されない)
-XX:+PrintGCDetails 詳細情報の出力
-XX:+PrintGCDateStamps 日時を読みやすいフォーマットで出力

JDK7(8?)から、ログが自動でローテートできるオプションが追加された

GCViewerでログをグラフ化する

ヒープダンプ

コマンドラインで取得する方法
→ヒープサイズが大きいと数秒間フリーズする

エラー時に自動取得(Java起動オプション)
-XX:HeapDumpOnOutOfMemoryError

解析ではEclipseMemoryAnalyzerを使ってる

クラスヒストグラム

コマンドを打つと、ヒープを多く占めているクラスをテキストで取得できる
ヒープダンプに比べると負荷が少ない

jdk7,8 : jcmd GC.class_histgram

突出型のOOM

エラーが出た瞬間のダンプのみを出力してくれるオプション
-XX+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=出力先

じわじわ型のOOM

なるべく軽い負荷で継続的なログがほしい

定期的なヒストグラムの収集がいい
HeapSatsというオープンソースのツールが定期取得&グラフ化をしてくれる

スローダウン/タイムアウト

スローダウン

アプリケーションが停止→再起動で対処
 →確実に迷宮入り

再起動前にスレッドダンプを取りましょう
 1.4.2 : kill -3
 JDK5 : jstack
 JDK7u4 : jcmd Thread.print

・可視化ツールその1「侍」
スレッドの状態を時系列に表示

・可視化ツールその2「ThreadLogic」
怪しいスレッドをマーキングしてくれる
最初にみるならこちらの方が良い

無限ループ
 HashMapへのマルチスレッドアクセス
 →ConcurrentHashMapに変換する

原因がよくわからない場合

JDK標準のhprofプロファイラで調査

java -agentlib:hprof=CPU=samples,file=出力先

収集対象がアクティブなスレッドのみ
sleepやwaitによる遅延は検知できない

Solr4.x系で特殊文字が追加されてる

Solr Lucene

Solr(というかLucene)にクエリを投げる際は特殊文字をエスケープする必要がありますが、
4.x系から特殊文字に "/" が追加されてます。

そんなこともしらずに先日Solrをバージョンアップしたら見事はまりました orz

Solr3.6.2

Escaping Special Characters
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

Solr4.6.1

Escaping Special Characters
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

新機能でクエリに計算式が書けるみたいなことを聞いたことがあるのでその対応かな?
たしかスコアの計算式とか指定することができたようなできなかったような。。。

JJUG CCC 2013 Fall

Java

JJUG CCC 2013 Fallに行ってきました。

基調講演-1 Javaと未来のこととCCC

鈴木雄介さん (日本Javaユーザーグループ 会長) 資料

Javaの現在と未来

世界中でユーザーグループ(JUG)の活動が活発になってきている。アフリカとかでも

IoT時代に向けて

2015年 → 2020年
接続されるデバイス数 250億 → 500億
一人当たりのデバイス数 3.47 → 6.58

Beyond Java 8

  • Modular Platform(Jigsaw)
  • Unified Type System
  • Language Interoperability
  • Memory-efficient data structure
  • Java on GPUs(Sumatora)

Project Avatar

  • HTML5+Java EE
  • Thin Serer Architecture(TSA)

IoT(Internet of Things)から考える未来

ブラジャーもネットにつながる時代に。

インターネットに接続するもの

  • GPS
  • テレマティクス
  • スマートグリッド
  • 人体情報の測定(医療)
  • などなど

テクノロジーの6つの要素(ガートナー)

  1. テクノロジによる人間の能力の増大
  2. マシンによる人間の作業の代行
  3. 人とマシンのコラボレーション
  4. マシンによる人と環境の認識力の向上
  5. マシンへの人の理解の高まり
  6. より賢くなる人とマシン

プログラミング対象の変化

ユーザーがITを意識しなくてもよくなる。渋滞情報を自動で通知等

ユーザーがどのボタンを押したら何が起きるか
 →
周りで何が起きたらユーザーに何をすべきか

  • トリガーがシステムの外側にある
  • オープンな世界、無限の可能性
  • テストとは何か

「人間の判断」から「外部化された判断基準」

  • 使うこと/考えることの自動化

ITの作り方

  • いかに効率よくソフトウェアを作るか

現在

  • サービスを提供し、フィードバックをもらう
     アジャイル、DevOps、リーンスタートアップ
  • いかに早くサイクルを回すか

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

寺田佳央さん (日本オラクル)

JavaEE7

EE6からEE7になって以下の機能が追加された

  • Concurrency Utilities for EE(JSR-236)
  • Batch Application(JSR-352)
  • Java API for JSON(JSR-353)
  • Java API for WebSocket(JSR-356)

JavaEEにこれから触れる人は、EE6を勉強してから上記の差分を学ぶのが良いと思う。

Projecct Avatar

PCの電源が切れたのでメモとれず orz

JSR 310 “Date and Time API” への招待 2

蓮沼賢志さん (GlassFish Users Group Japan) 資料

秒について

昔19世紀近く使われていた秒の定義は正確ではなかった。(太陽の位置を元に算出された値)
現在は原子の特性を利用した正確な秒の定義が利用されている。(数億年に1秒ずれるかどうか)

世界標準時について

イギリスのグリニッジ天文台を通る経度を標準時(GMT)として定められた。
ただし、観測地点によってその位置がずれる。

そこで、観測地点に依存しない世界時(UT)が定義された。(1928年) さらに原子時計に基づく原子時(TAI)(1955)が定義された。

しかし、太陽の公転との関係でずれが生じてきたため、UTとTAIの間をとって協定世界時(UTC)(1972年)が定められた。

Javaのミリ秒は1970年を起点になっているが、UTCが定められたのはその後。
ほとんどのプログラムでは、その際に生じた誤差は無視している。

タイムゾーン

各地域のタイムゾーンはtz database(tzdb)で定義されている。
tzdbはたまに更新されているので、できるだけ最新を使うように。

Javaのクラス

java.util.Data
日付・時刻の表現のみに徹する

java.util.Calendar
Javaの国際化対応(JDK1.1)で導入
日付・時刻の作成・編集に用いる

java.time.* (JSR310)
JDK8から導入
Date/Calendar代替が当初の目標
日付・時刻を総合的に扱うフレームワーク
Date/Calendarを置き換えるもの

java.util.Dateの課題

  • フィールド操作が面倒
  • 年フィールド+1900が実際の年
  • 月が0から始まる
  • 日付部と時刻部が混在している
  • 日付演算が貧弱

java.util.Calendarの課題

  • フィールド操作が面倒
  • 月が0から始まる → 定数でお茶を濁す
  • 日付演算が貧弱(Dateよりはまし)

JDK8よりCalendar.Builderを導入して多少改善された。
new alendar.Builder().setDate(2013, NOVEMVER,9).~

それでも貧弱

JSR310 Date and Time API

  • Date、Calendar、DateFormat等を置き換えることが目的→失敗
  • ISO8601形式の日付。時刻表現
  • ImmutableかつスレッドセーフなAPI

デメリット

  • JSK8 APIの中でも最大規模→複雑
  • 既存APIとの相互運用はガン無視→後から多少改善された

その他

OffsetDateTime vs ZonedDateTime

  • OffsetDateTime - UTCからの時差のみ考慮(計算が早い)
  • ZonedDateTime - タイムゾーンを考慮

タイムゾーン ≠ UTCからの時差
タイムゾーンは以下も考慮している

  • 夏時間
  • 時差の改定(ごくまれ発生に)

Chronology(暦)も対応。和暦とか

JSR310とDate/Calendarの変換は無い!必要なら自前で!

ThreeTen backport
JSR310からJDK8依存の部分を取り除いてJDK7でも使えるようにしたOSSライブラリ
リリース前の勉強とかにでも。

徹底解説!Project Lambdaのすべて

bitter_foxさん (立命館大学 立命館コンピュータクラブ) 資料

ラムダ式は既に知っていることが多かったので殴り書き程度で。。。

ラムダ式の引数ではアンダーバー("_")は使用不可。
Javaでは違うが、多言語では特殊な意味を持つので、混乱を避けるため。
また、将来のために予約語とされている。

なぜいろいろと省略できるのか
縦に長くなった匿名クラスを、ラムダにしたことで横に長くならないため。

スコープの注意点
thisが表すものが匿名クラスと異なる。

BufferReaderのStreamは br.lines()

非終端操作 : filterやmap等のStreamを返すメソッド
終端操作 : foreach、reduce等のStreamを返さないメソッド
終端操作が呼ばれるまで非終端操作は行われない。

JavaOne 2013 サンフランシスコ報告会 Tokyo

JavaOne 2013 サンフランシスコ報告会 Tokyoに行ってきました。

Java SE のアップデート(櫻庭 祐一氏)

Nandini Ramani 副社長の話

JavaSE/ME統合自体は2011年に発表していること。
重要なのはNandiniがIoTを担ぎ出してきたこと。
→Oracleが力を入れている。

教育用にRaspberry Piはくる。
LEGO Mindstorm、Arduinoも若い人にはいいのでは。

JavaDayTokyoにはロードマップにJDK8.1と8.2があったが、今回は飛ばされている。
JDK8.1に書いてあったJMC 6が個人的に重要。JDK8に入ってくるかもしれないが、おそらく9ではないか。もしくはEE8

Brian Goetzの話

Java 並行処理プログラミングの本の作者

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Project Lambdaとは言っても

  • Lambda式
  • 型推論
  • Method Reference
  • Default Method
  • Stream

といろいろある。

Stream

注目すべきはStream。
マルチコアのためにStreamが重要。
Streamを実装するにも匿名クラスが面倒なのでLambda式が必要となった。

Streamは

  • 機能拡張版Iterator
  • 関数型言語の考えを導入

Stream自体は値を持たず、リストをなめていくだけ。

xxx.stream()
.filter(p->p.isXX())
.map(p->p.getXXX())
.redue(0, (x,y)->x+y);

の場合、実際のfilterとmapの処理はreduceの際に行われる。(処理遅延)
これによりパフォーマンスがかなりよくなっている。

Stephen Colebourne, Roger Riggsの話

Date&Time APIの話

Stephen ColebourneがDateとCarendarを嫌ってるので、全て置き換えたがっている。

Date/Calendarの置き換え
機能豊富/クラス大量
→いろいろ結局みんなZonedDateTimeを使うのではないか。

Alex Buckley, Joseph Darcyの話

Enhanced Metadataの話
要するにアノテーションのこと

SE8では、@Pathが複数書ける。

@Path("xxx"), @Path("yyy")
class XXX ...

いろんなところにアノテーションが入れられるようになった。
書けるようにはなっても、それをチェックするところがないから微妙。。。

NullをListに入れたくない場合

SE7
@NonNull List f;

SE8
List<@NonNull String> f;

John Rose, Gary Frost

Project Sumatraをやってる2人

Project Sumatra

GPGPU for Java
まだOracleとAMDの方向性が合ってない印象

Mark Reinholdの話

Project Jigsawをやっている人

Project Jigsaw

Javaをモジュール化しましょうという話。

jlinkというコマンドが新しくできた。
モジュールをリンクできる。

正直まだ微妙な感じ。

まとめ

JavaSE8

とにかくLambda
Date&TimeAPIもにぎわってた

JavaSE9

未だに曖昧模糊

JavaFX のアップデート(青江 崇氏)

JavaFXとは

モダンなGUIツールキット

  • FXMLの導入によるプレゼンとロジックの分離
  • アニメーション、エフェクト
  • CSSによるスタイリング
  • WebKitベースのブラウザコンポーネント

SE8からは標準コンポーネントに

FXML(HTMLっぽいやつ)の属性とJavaのプロパティが自動で紐付いたりする。

JavaFX8の新機能

  • 画面のテーマが新しくなった
    フラットデザイン風のとか
  • Lambdaを使用してコンパクトに書ける
  • 3Dを本格的に使えるようになった。これまでは限定的なサポートだった。
  • DatePickerの追加 Date&Time APIにも対抗
  • SwingNode
    JavaFxの上にSwingが乗せられるようになった
    SwingコンポーネントをSwingNodeでくるんで追加できる
  • 基本APIの強化
  • フルスクリーン機能の強化
  • 印刷APIの追加

などなど

JavaFXの向かう先

  • 採用事例が増え、ライブラリ、フレームワークも増えている
  • Windows、Mac、Linuxすべてで使えるGUIツールが減ってきている
    AdobeAirもLinuxを切り捨てたし、最近はAdobeがあまり力を入れていない
  • 組み込み機器向けGUI
  • IoT時代におけるGUI開発の主役になる可能性も

Java EE のアップデート(井上 誠一郎氏)

パーフェクトJavaの著者

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

  • 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
  • 出版社/メーカー: 技術評論社
  • 発売日: 2009/09/24
  • メディア: 大型本
  • 購入: 26人 クリック: 360回
  • この商品を含むブログ (35件) を見る

EE7の目玉機能

  • WebSocket
  • JSON標準API
  • Java Batch
  • Concurrency Utilities

CDI(Contexts and Dependency Injection)

  • DIの標準規格
  • JavaEE6で登場

JPA(Java Persistence API)

  • O/Rマッパーの標準規格
  • Hibernateも今ではJPA実装の一つ
  • JPA実装は独自実装を持つのが実情

JAX-RS

  • RESTfulなURLルーティングやHTTP処理の標準規格
  • アノテーションでURLとクラスやメソッドを対応づける
  • EE7のJAX-RS2.0で非同期APIとクライアントAPI追加

JavaOne2013のJavaEE概論

  • ProjectAvatarのオープンソース化が発表されたが、それほど盛り上がらず
  • EE全体的にも盛り上がらず
  • EEの扱いが軽い印象
  • MEにスポットライト

Java EEセッションのピックアップ

Java Caching

  • 12年かけてJCacheのスペックが纏まりそう
  • 今年の12月にスペック確定予定
  • javax.cacheパッケージのAPI
  • アノテーションはEE8とSpring4で実装予定
  • 実装:Ehcache、Oracle Coherence

JTA(Java Transaction Processing)

  • JTAが1.1から1.2に10年ぶりのバージョンアップ
  • CMT(コンテナによるトランザクション管理)がEJBの専売特許ではなくなる
  • CDI管理のBeanをCMT可能
  • 要はSpringの@Transactional

WebSocket

  • プログラマブルAPIとアノテーションAPIの両方あり
  • 同期処理APIと非同期処理APIの両方あり

Jersey 2 MVC

  • JerseyはJAX-RS規格の実装
  • JAX-RS自体はMVCではない
  • EEのMVCはJSFなので、JAX-RSがそこは踏み込めない
  • Jerseyは独自拡張でMVCを提供
  • Jersey MVCはSpring MVCと同じアーキテクチャ
  • ビュー処理のサポートテンプレートエンジン:JSP、Freemarker、Mustache

Spring

  • Spring Source社からPivotal社へ
  • ソースコードがGitHubへ
  • Spring4.0は、Java8およびJavaEE8対応
  • SpringのJdbcTemplateなどはJava8のLambdaと相性が良い
  • WebSocketやJava BatchでJavaEEと協力関係
  • Spring DataでNoSQLやSolrに対応
  • Spring for Hadoop
  • Spring XD(ストリームデータ処理)
  • WebSocket上にSTOMP(Simple(or Streaming) Text-Oriented Messaging Protocol)

業務システムエンジニアのためのHTML5勉強会#04 Web✕Java - HTML5で進化したWeb標準を、Java技術でどう扱うのか? -

Java HTML5 JavaEE7

業務システムエンジニアのためのHTML5勉強会#04 Web✕Java - HTML5で進化したWeb標準を、Java技術でどう扱うのか? - に行ってきました。

HTML5の話はあまりなくて、JJUG的な勉強会でしたがw、気になってたけど手を出してない技術の話をいっぱい聞くことが出来ました。
Tomcat、Struts、Seaser、Springあたりはもう時代遅れ的な話がちらほらあって、いろいろ変わってるんだなぁとか思ったり。

Java EE の概要と HTML 5 の取り組み

日本オラクル シニアJavaエバンジェリスト 寺田佳央 さん

Tomcat、Strutsやめよう運動をしてる。

Struts1.xはサポート終わる。
世界のトレンドではStruts1.x、2.x共に選ぶ人が減っている。

Struts、Spring、Hibernateはすべて作ってるところが違う。
システム納品後の瑕疵担保期間はいいが、それが終わったら誰が見るのか。
セキュリティアップデート等でどれかがバージョンアップしたら他との相性はだれが保障するのか。
ほとんどのエンドユーザはそんなことは理解しないで使っており、結果的に大きな保障問題に発展することがある。

Java EE6では必要なものがオールインワンですでに入っている。
脆弱性はパッチを当てればOK。
⇒独自技術から標準技術への移行

JavaEE7はJavaEE6と比べて注目度がとても高い。
ローンチ・イベントに世界から1万人超が参加。

Java EE6までは、アプリ内でスレッドを作るのが禁止されていた。
スレッドがアプリサーバーとは違う環境で動くようになっており、例えばWebアプリを停止してもスレッドが動き続けるので危険。
JavaEE7からは安全にスレッドが使用できるようになった。

Strutsから移行する人のためのJSF基礎

グロースエクスパートナーズ株式会社/JJUG幹事 久保 智 さん

JSFとは
2004にv1.0がリリース
Strutsの開発者が使用策定にかかわっている。

Ajax前提に作られているので、リッチなUIを作りやすい。
Strutsに骨子が似ているため、理解しやすい。

JavaScriptレスなAjaxを使用したUIが作成可能。
JSFはIE8ぐらいから動くが、プラグインを使用すると最新のブラウザでないと動かないことがあるので注意。

JSFの1.xと2.xは別物
1.x使うくらいならStrutsの方がまし。

managed-bean

StrutsではActionFormとActionで分かれていた入力値処理を1つに纏めた。
XMLによる設定ではなくアノテーションで指定。

XML+タグライブラリ

JSPと違い、Servletに変換されなくなった。
エラー時のスタックトレースにXHTMLの行数で表示される。

JSF Validator + Bean Validator

JSF Validator:バリデーションを画面に直接書く
Bean Validator:プロパティファイルに書く。アノテーションベースのエラーチェック

JavaプログラマのためのScalaプログラミング

ストーンシステム 代表 石黒尚久 さん

ScalaとJavaの違い

  • 文末のセミコロンは不要
  • publicはデフォルトなので不要。(予約語ですらない)
  • System.out. がデフォルトインポート済みなので不要
  • returnは書かない
  • getter/setterは不要。自動で作成される。
  • 変数定義が違う
    var data: int = 0 // 型が後にくる
    var data2 = 100 // int型がわかっているので省略可能
  • メソッドの書き方が違う
    表記上の省略がいくつかあるので、同じ定義でも書き方が何種類かある。
  • 引数にデフォルト値の指定が可能
  • ScalaはJavaよりも純粋なオブジェクト指向。プリミティブ型もオブジェクト

他にもいろいろ
Javaの冗長な記述を無くそうとしているのではないか。

石黒さんの書かれた本

速攻理解!JavaプログラマのためのScalaプログラミング

速攻理解!JavaプログラマのためのScalaプログラミング

JavaからScalaへ ~ScalaでWeb開発はこう変わる~

NTTデータ先端技術 竹添直樹 さん

Javaで生産性上げるのに限界を感じてScalaに取り組み始めた。

Javaアプリを移行したらコード量が40~50%削減。想像以上に減った。
スクリプト言語のようなFlexibilityとJavaのようなSafetyが特徴。

業務でも十分に使える言語

Play2

一番メジャーなフレームワーク

タイプセーフでWebSocketも簡単に使える。

ステートレスでサーバーサイドで値を持たない。セッションIDだけCookieに渡してデータはKVSとかに置いたり、クライアント側で管理したりする。
warにするプラグインがあるが、茨の道なのでやめたほうがいい。
ステートレスなので、既存システムをもってくるのには向いていない。

竹添さんの書かれた本

Scala逆引きレシピ (PROGRAMMER’S RECiPE)

Scala逆引きレシピ (PROGRAMMER’S RECiPE)

新宿鮫:第16回AWSもくもく勉強会 EclipseからElasticBeanstalkのTomcatへデプロイ

AWS Eclipse

新宿鮫:第16回AWSもくもく勉強会に参加しました。

今回はElasticBeanstalkを使って、EclipseからTomcatへデプロイしてみます。

AWS SDKの入ったEclipseの新規作成から AWS Java Web Project を選択

f:id:yuji0316:20130828204949p:plain

プロジェクト名は MokuMokuBeanstalk で。

f:id:yuji0316:20130828204950p:plain

プロジェクトができたら、右クリックして [Amazon Web サービス]-[Deploy to AWS Elastic Beanstalk...]

f:id:yuji0316:20130828204951p:plain

今回は 手動で新規サーバーを定義 を選択します。

f:id:yuji0316:20130828204952p:plain

なんかアプリケーション名と環境名を入れろと言われたので、適当に入力

f:id:yuji0316:20130828204953p:plain

追加情報は特になにも指定しません。
Beanstalkでは新たにEC2が作成されるので、ログインする必要あれば Key pair を指定しておく感じでしょうか。

f:id:yuji0316:20130828204954p:plain

リソースは既にMokuMokuBeanstalkが追加されていたのでそのまま完了ボタンを押下。
aws_web_testは昔ちょっといじったときのやつなので無視して下さいw

f:id:yuji0316:20130828204955p:plain

ぬーるーぽー!

f:id:yuji0316:20130828204956p:plain

実は昔いろいろ試したんですが、どうやら手動でサーバーを作るとこれが出るらしいです。
ただ、その時一緒にやっていた人はすんなりとできていたので、う~んなんででしょw
EclipseにSDK入れたのも結構前なので、最新版が出ていれば動くかもしれませんが、今回はパスでw
そのうちリベンジします。


気を取り直して、Management ConsoleからBeanstalkのサーバーをあらかじめ作成しておきます。

Tomcatサーバーを選択

f:id:yuji0316:20130828204957p:plain

頑張っていろいろ起動し初めて、3分程待つと完了します。

f:id:yuji0316:20130828204958p:plain

さて、Eclipseに戻りましょうw

さっき手動を選んだところを「既存のサーバーを選択」にします。

f:id:yuji0316:20130828204959p:plain

ここはさっきと同じで完了。

f:id:yuji0316:20130828205000p:plain

Eclipseのビューで何かの処理が開始します。

f:id:yuji0316:20130828205001p:plain

順番が前後しましたが、事前にJSPを↓のように書き換えてあります。

f:id:yuji0316:20130828205002p:plain

そして、起動が終わったら自動的にEclipse内にブラウザのタブが表れて、画面が表示されました。

f:id:yuji0316:20130828205003p:plain

もちろんChromeからも見られました。

f:id:yuji0316:20130828205004p:plain

Amazon Web Services クラウドデザインパターン実装ガイド

Amazon Web Services クラウドデザインパターン実装ガイド

Amazon Web Services クラウドデザインパターン 設計ガイド

Amazon Web Services クラウドデザインパターン 設計ガイド