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

SpringOne2015-KeynoteSession(初日)のまとめ

本日より、ワシントンD.Cにて開催されている、SpringOneカンファレンスに参加させて頂いています。
f:id:takahiro-f:20150914194048j:plain

SpringOne

初日は、Keynoteのみの実施でしたが、聴きながら自分が感じたことを整理することも兼ねて、ブログにまとめさせて頂きます。

KeyNoteのテーマ

今年のSpringOneのテーマとして、 "Get Cloud Native" が掲げられていました。
皆さんは、Springのテーマとしてしっくりきましたか?
これを見て、「やばい、これがテーマだとするとうちは結構ビハインドしてる、、」と思いました汗

KeyNoteセッションの中でも、下記のような表現で、
"Cloud Nativeになることの恩恵"についてアピールがされていました。

  • Transforming with Spring Cloud.
  • Cloud native application(Pivotal Cloud Foundary) wave.

CloudとSpring、Springに関連するOSS(Netflixなど)を利用して
今までにない速度で効率的に開発を進められることが強調されていました。

Springとは何か

みなさんは、

"Spring" という言葉を聞いてどのようなイメージを思い浮かべますか?
"Springって何ですか?" という問いかけに対してどのような答えをお持ちでしょうか?

SpringはJavaフレームワークの一つ

という答えをお持ちの方もいらっしゃると思います。
自分自身もSpring Bootを理解するまで、その回答でした。

その答え自体が完全に間違っているわけでは無いですが、
この数年のSpringの進歩に伴い、回答として適切では無くなってきています。
あと1,2年後には、その回答自体あまり出てこなくなるのでは、と想像しています。

上で出てきた、Spring Cloud・Pivotal Cloud Foundary共に、
既存のJavaフレームワークの領域に留まる話しではありません。

Sessionの中で印象にのこっていた表現としてはSpringは今


  • Pivotal Cloud foundry(cloud native)
  • Spring cloud(coordination) + with(Netflix | OSS)
  • Spring boot(configuration)
  • Spring framework/io(application)


f:id:takahiro-f:20150914190604j:plain
f:id:takahiro-f:20150914195240j:plain

こういった役割があるといった表現です。

Spring frameworkJavaフレームワークとして"application"の実装において、様々な恩恵を授けてくれます。
Spring bootは、framworkの機能に加え、
auto configulation、embedded tomcat、依存性の自動解決など、
今まで開発者が時間を取られていた、"configulation"の部分をサポートしてくれます。
そして、Spring cloudとNetflixのoss(eurekaなど)を連携することで複数のサーバで動作する複数のアプリケーションの"coordination"を
強力にサポートしてくれます。
そして、Pivotal cloud fondary(PaaS)というクラウド基盤を土台にして様々なソフトウェア(例えばDB)と連携して、
より一層素早く、管理しやすいアプリケーションを作ることができます。
この全てをもって、Springです。

Springは単なるフレームワークではなく、

アプリケーションのためのプラットフォームになりつつある(それを目指している)
と改めてこの図をみて実感しました。
必ずしもSpringを使う上でその全てを使わないといけないわけではありません。
しかし、もしも今SpringをJavaフレームワークの一つという目線で見ているのであれば、
上の図にある機能を公式サイトから是非一度見てみてください。
今までと違ったアプローチで、あなたのアプリケーションの改善の糸口が見つかるかもしれません。

Springの採択について

実際にSpringが採択されて、使われている会社の一例として、中国のAribabaが紹介されていました。
AribabaがJavaフレームワークとしてSpringに統一することに決めたというようなスライドが出ていました(一瞬でしたのでうる覚えです

フレームワーク単体で動かしていると、無理に全部のフレームワークを統一する必要が無いと感じるかもしれませんが、
Spring Cloud Configなどの恩恵を受けるためには、フレームワークを統一していくことは大きな意味を持っています。
逆に1,2個のアプリ(Springを使っている)しかSpringを使ってい無い状態では、Cloud configの良さも半減してしまいます。

Spring Bootについて

Spring Bootのダウンロード数は順調に推移していて,この1年で5倍程度に推移したそうです。
自分の身の回りをみても、Spring bootが出てから、Springの話が出る頻度は明らかに増したと思います。

Spring4.3/5.0について

カンファレンスのテーマ自体はフレームワークに焦点をあてていませんが、
Keynoteの中ではもちろんSpring Frameworkの最新動向についても触れられていました。

直近で予定されている4.3へのアップデート概要、および翌年の2Qリリースが予定されているSpring5.0についても触れられていました。
ここで注目しておきたいのは、Spring5.0はJava8をBaselineとしている(Java8じゃないと使えないよ)ことです。
アプリケーションをJava8で動かすようにしておかないと、Spring5に移行できないですよ。と。
Java6->Java7への諸般の事情による停滞がありましたが、以降は2年ごとにJavaはメジャーバージョンアップしていきます。
常に安心して最新のJavaへアップデートできるような環境を用意し、最新のフレームワークを試せる環境を用意したいです。

また、今回のカンファレンスでいくつかセッションが取り上げられている、"Reactive Programming"についても触れられていました。
Spring5.0では明確にサポートしていくそうです。
自分自身Reactive Programmingをまだきちんと理解できていませんが、
アプリケーションのクラス構成が変わりそうですね。

Spring Framework 4.3

  • refinements in the core deoendency injection model
  • a richer set of convenience annotations(pre-composed)

Spring Framework 5.0 (Q2 2016)

  • Java 8 Baseline
  • JDK 9 support
  • HTTP/2

Cloud native workshopの開催

pivotalがcloud native applicationのhands on sessionを開催して、
テーマであるget cloud nativeを促進してくれるみたいです。
日本でもやってくれるのかな、、、
http://pivotal.io/cloud-native-workshop

Junitのサポート

PivotalはJunitのサポートを公式に行うそうです。
(エンジニアとお金のサポート)
f:id:takahiro-f:20150914194947j:plain

主にjunit5においてLamnda式に対応することを目的するそうですが、
詳細な情報は下記から確認できます。
また、どなたでも寄付出来るので、junitヘビーユーザーの皆さんは是非。

http://junit.org/junit-lambda.html

Live coding

他のカンファレンスと明確に違うのは、Live codingの時間が多く取られていることです。
Springの各機能にできる限りふれつつ、限られた時間で動くものを作り上げていきます。
おそらく、かなり準備してきたのだろうと思われます。
大きなセッションほどKeyNoteは退屈してしまう時間があったりしますが、
SpringOneではLiveCodingを行うことで、大半のエンジニアが非常に関心を持って、
話を聞いていました。
今までの海外カンファレンスの中で、一番身になったKeyNoteでした。

まとめ

KeynoteからLive Codingをしてアプリケーションを動かしたりしていることからも、
Springは簡単にすぐ動くアプリケーションを作ることができる。
ということをKeynoteから全力でアピールしているなと感じて、以降のセッションへのモチベーションが高まりました。
加えて刺激を受けたのが、比較的長いLiveCodingでミスなく(よく本番でライブコーディングしていると、意図していないExceptionが不意に起きちゃったりするのです)
完了していることです。

すぐに動くものを作れるのがSpringの強みで、自分もそこに魅力を感じてるんだなと再認識しました。

追記

2015/09/17 junitのパートを追加

Memo(English) - JavaDayTokyo - JDT62 - "goldman sucks approach for Java(ゴールドマンサックスのJavaへの取り組み)"

I attended Java day tokyo 2015.
and this time i would like to share short report for
JDT62 - "goldman sucks approach for Java(ゴールドマンサックスのJavaへの取り組み)".

you can see slide from here(Japanese)
http://www.goldmansachs.com/gs-collections/presentations/2015-04-08_JavaDayTokyo.pdf


Agenda is mainly separated 3 part.
0.Organization
1.OpenJDK
2.GS Collection.
(will try to use GS collection later.)

0.Organization

What kind of system they created?

  • trading
  • accounting
  • platform
  • infrastructure

Concept

  • Build solutions to complex problems
  • Self-manufacture.

Question

  • What is the percentage of engineer in the GS?
    • 25%(higher than expected!!)
  • focused on development department

Goldman Sucks <-> Java

  • 1998 Start internal evaluation(社内評価)
  • 2000 Start to use java for internal tools.
  • 2004 Create their own library(old product of GS collection)
  • 2012
    • Become JCP executive committee
    • Publish GS collection as a open source.
  • 2013
    • Selected OCA
    • Start to contribute OpenJDK

JSR contributed by Goldman Sucks.

  • JSR-107:JCACHE
  • JSR-335:Lambda
  • JSR-351:Java Identity API

Scale of Goldman Sucks development.

engineer

  • over 3,000 in global.
  • 24/7 development
  • 125,000 process / hour
  • huge application(heap size is over 150GB)
  • opensoruce-nization/contribution
  • use OpenJDK

1.OpenJDK

Why they use OpenJDK?

  • Can access source code.
  • Modify problem and find problem cause by own.
  • Judge the improvement point earlier.
  • Security issue
  • Confirm development process of JDK
  • Bug database

Usage of OpenJDK

  • Trouble shooting(Could modify source code)
  • Research newly function in OpenJDK

2.GS-Collections

https://github.com/goldmansachs/gs-collections

  • Their Open Source framework.(2004~)
  • One of biggest their own library for improving java collection implementation.
  • Already supported Java8!!

※ more detail of GS-collections will write another entry.

GS-Collections kata

https://github.com/goldmansachs/gs-collections-kata

  • For learning usage of GS-Collections.
  • Pass test code one by one.
  • Over 1,500 Java engineer in GS use this training project.

My Feed Back

Keep

  • GS's engineer(of course not all of member) may learn core technology of Java.
  • They have pride for "speed"(e.g) Memory usage of Unified set)
  • They maybe have team for assessing new feature/technology
  • They have sense of ownership for resolving problem.(One of the biggest example is they are using OpenJDK)
  • I'm surprised that GS-collections already supported Java8(Lambda).
    • Internal library support latest version is really important for keeping good development environment.

Considering

  • Once created core-library(GS-collection) and they already use this library for many applications.
    • Thats why they must use this library continuously.
    • Compared to Java collections, GS-collections always must be better.
    • Because huge cost is need for abolish GS-collections(but its not problem, its one of their high level challenge).
  • Definitely GS-collections is useful. even though it, it is little bit difficult to use this library in large company(individual is no problem).
    • Learning cost is high, i guess. and if java8's stream statement and GS-collections statement is mixed in one application,its obviously not good code. use GS-Collections in all of collections implementation, this library make huge benefit.
    • But GS is good working place for creating such kind of library by their own.

Try

  • Create internal training shikumi such kind of GS-Collections kata.
  • Internal library should support latest version(e.g.Java8).

The Design Sprintのトレーニングセッションに参加してきました。

先日、機会をいただいて、Google Venturesが提唱している、
The Design SprintというDevelopment Process(開発手法)のトレーニングセッションに参加してきました。

The Design Sprintは、

【新しいプロダクト・アプリ・Webサイト・機能を考える】

際に、

【 個人 】でアイデアを考える・プロトタイプを考える
【 皆 】でフィードバックする、分岐する、検証する

ことを繰り返します。

そのサイクルの中でアイデア・プロトタイプを具体化・洗練していきます。
最終的にプロトタイプを実際に使ってもらう・プレゼンしていくという所まで持っていきます。

Google Venturesでは、投資先のスタートアップの機能のブラッシュアップなどを行う際に、
この手法を利用しているようです。

最近日本に上陸したブルーボトルコーヒーもこの手法を利用して、オンラインでの販売方法のアイデアを練ったようです。

The design sprintのWebサイトでは、5日間という期間で、
このサイクルを行うと書いてあります。
実際には、2日間で行ったり、と様々な期間で行うことがあるそうです。
今回は、2-3時間程度という短い時間の中で、
大まかな流れをグループワーク形式で実践してきました。
僕のチームは5人で実施しました。

やったこと(概要)

※あくまで、ワークショップの中でやったことで、実際のDesignSprintとは異なります。

1.今回のスプリントの対象プロダクト・アプリの説明を受ける
2.メンバー同士の紹介を行う

5人ほど、様々な職種の特徴が書かれたカードを渡される

3.この人が価値を置いていること、求めていることを考える(個人)
4.1人選び、その人のニーズや価値観の認識をチーム皆で共有する
5.その人のために、実際に作ってみたい機能を考える(個人)
6.意見交換しながら、価値があるアイデアを投票によって決める
7.紙にその機能が使われる象徴的なシーンを考える(個人)
8.みんなでフィードバックしながら、これだというシーンを1つ選ぶ
9.そのアプリ・機能の名前を決定する
10.UIの絵コンテを考える(個人)
11.説明しつつ、フィードバックをうける
12.プロトタイプのUIを検討する
13.プレゼンする

やったこと(詳細)

1.

今回のスプリントの対象プロダクト・アプリの説明を受ける
メンバー同士の紹介を行う

ここは今回の研修で一番時間の制約上使えなかったことだと思います。

ただ、今回のテーマになるアプリ・製品・機能について、
どういったことを大切にしているかということを説明していただきました。

・製品・機能コンセプト
・デザインコンセプト
・サンプル
などを説明してもらいました。

実際にDesign Sprintを行う際も
メンバーは何かしらの組織や、プロジェクトに属している状況で行われることが多いと思います。
ここで大切なのは、可能性を狭める(こういうことは出来ません)とかを共有するわけではなく、
大きなレベルでのコンセプトや、大切にしていることの共有、課題の共有ということになるでしょう。

その後で、各チームメンバーの紹介を行いました。
実際は職種毎に持っている知識や問題点の共有を行うのだと思います。

参考(The First Step In A Design Challenge: Build Team Understanding(英語))

本当は、ここでもう少し話が出来ればよかったんですが、
研修では時間の都合上あまり時間がとれませんでした。

1-2.ペルソナの定義

5人ほど、様々な職種の特徴が書かれたカードを渡される
1人選び、その人のニーズや価値観の認識を共有する

次にペルソナを考える所からグループワークを開始しました。
これはいわゆるDesign Sprintを始める為の前準備のようなものだと思います。

http://www.gv.com/sprint/

に記載している「Set the stage」に該当する作業の一つだと思います。

今回は最初に6人の異なる職種、趣味を持つ人のカードが配られました。
その中から1人選び、その人の

1.必要としていること
2.求めていること(こういうのがあったらいいな
3.一番価値を置いていること(価値観

は何かということをまず個人で考えます。(5-10分)
ここで出すアイデアは具体的なアプリの機能にとらわれる必要はありません。

・自分の経験を共有することを必要としている
・旅行のサポートをしてくれるものがあったらいいな
・実体験に価値を置いている
・子供とのコミュニケーション
・おいしいレストランが知りたい
など

個人で考えた後で、みんなの考えをシェアします。
その後で、どのペルソナがいいと思ったか、というのを投票で決めます。
(時間が短いのもあったと思うんですが、ここでは議論せずにスパっと決めました)

ペルソナについて
http://smmlab.jp/?p=20107
http://itpro.nikkeibp.co.jp/article/Keyword/20080124/291960/

2.

その人の為に実際に作ってみたい機能を考える(個人)
意見交換しながら、価値があるアイデアを投票によって決める

ペルソナが決まった所で、いよいよアイデアを練る作業に移行していきます。
まずは、ペルソナを元に、この人にあったらいいな、、という機能を個人でたくさん考えます。(10分)
イデアを付箋に次々と貼っていきます。
(ここでは実現の可能性などは一旦置いておいて、とにかくたくさんのアイデアを出すことにフォーカスします)

10分でアイデアを出した後で、

ホワイトボードに書いたグラフに1人2,3個ずつ順番にアイデアを説明しつつ、プロットしていきます。(10分)
(2,3個ずつにするのは一人がずっと話続けない為)

f:id:takahiro-f:20150207205427p:plain

x軸、y軸はそれぞれ下記を表しています。
X軸 : Complexity(複雑さ)
Y軸 : Value(ユーザへの価値)

ちなみに、これは相対評価なので、意見が出るたびに、それぞれの付箋の位置がずれたりするようです。
一通り、出た後で、一人2枚のシールが渡されました。

それぞれが気に入ったアイデアにシールを貼っていきます。
(どうしてもこれ!というのがあれば、一つのアイデアに2つシールを貼ってもいいそうです。)

そして、投票の結果、これだ!というのを一つチームで決めました。
傾向としては、やはり【 難しいけど、価値が高い 】 という所に投票が集まりました。
一方で技術的に難しくなくとも、盲点だった点や、価値の点でやはりこっちがいいということで、
比較的難しくないながらも価値が高いアイデアにもある程度投票が集まりました。

そうして、一つのアイデアが選ばれました。

3.

紙にその機能が使われる象徴的なシーンを考える(個人)
みんなでフィードバックしながら、これだというシーンを1つ選ぶ
そのアプリ・機能の名前を決定する

次に、紙を8等分におって、
考えたアイデアが使われている代表的なシーンを8つ絵コンテ的なものを書きます。(個人で5-10分)

f:id:takahiro-f:20150207205437p:plain

ここで、大切になのは、考えたアイデアがユーザにどんな体験をもたらすものなのか、考えるということです。

特に、Googleのサイトでは多いのですが、サービスを紹介するサイトで、
「機能の紹介をするのではなく、象徴的な体験を紹介する」
ことが多いということを聞いて、なるほどなと思いました。
特にandroid関連のプロダクトは徹底されているように感じます。

https://www.google.co.jp/intl/ja/drive/
http://www.android.com/auto/
http://www.android.com/wear/

今回の研修の中で、一番悩んだのがこのフローでした。
以外と、実際使っている象徴的なシーンが、ビビっと出てこなかったりします。

書いた後は、一個一個のシーンをそれぞれが説明していきます。
その後で、このアプリをどんなシーンで使って欲しいのかというのを考えて、象徴的なシーンを一つ投票で選びます。
それと同時に、アプリの名前をこのタイミングで今回は決定しました。

どんな時に、どんな風に使ってもらうか

というのは、コンセプトそのものです。
たしかに、このタイミングで名前を決めるのも理にかなっているなと思いました。

4.

UIの絵コンテを考える(個人)
説明しつつ、フィードバックをうける

さて、実現したいアイデア、象徴的な利用シーン、アプリ・機能名
が決まったので、次はUIイメージを描いていきます。
先ほどと同じような紙に、UIを描いていきます。(個人で10分)

次にそれぞれがUIのコンセプトについて説明をしていきます。(10分程度)
ここではどんどんFBしていきます。が、基本的にはポジティブフィードバックで、
どこがいいのかというのを探していく感じでした。

5.

プロトタイプのUIを検討する
プレゼンする

その後、最終的なUIをどうするか、みんなでまとめる作業に入っていきます。(5-10分程度)
ここでは、ある程度みんなの意見をハイブリットしていきました、特に意識していたわけではなく、
自然とそうなっていったという感じです。

そうして出来たプロトタイプを、他のチームのメンバーに向けて発表していきます。
今回は1チーム1分という非常に短い発表時間でしたが、これは時間の制約も大きかったと思います。


振り返り

まず、今回は1日完結のワークショップということも書いてあり、
上のワークショップと実際のDesign Sprintでは異なる点も多くあります。

そんな中でも今回の機会を通じて一番面白いと思ったことは、


【 個人作業とフィードバックを短いサイクルで繰り返す 】
【 ニーズの共通認識がある 】

ことです。これは、個人のアイデアを洗練させてく上で、非常にいいやり方だと思いました。

【 個人作業とフィードバックを短いサイクルで繰り返す 】

フィードバックと個人のアイデア出しの感覚が長いと、改善のステップはやりにくくなります。
長いサイクルの場合は、改善というよりは、ちゃぶ台返し(やりなおし)するか自分の意見を押し通すかのパターンになることがおおいです。
また、長い時間考え抜いた個人のアイデアに対して、短い時間のフィードバックで直す場合は、
色々納得できないなと思うことがおおいです(絶対俺のアイデアの方がいいのにといか

それに対して、短い時間でアイデアを考え、FBして、段々と考えていくことが、 具体化 されていく。
という今回のDesign Sprintの流れでは、自然と個々人の考えの中で価値があると感じたものが残り、改善、洗練されていきます。
また、万が一、自分のアイデアが選ばれなくても、すぐに挽回のチャンスが来るんですw
自分の意見が選ばれなかったら興味を失うタイプの人も比較的多いと思うのすが、この手法だと、
常に自分のアイデアを考えるフェーズがやってきます。

そのため、一人で考えるのが好きだという僕のようなタイプでも、
議論がやりやすかったなと感じました。

【 ニーズの共通認識がある 】

これも、アイデアを出す上で非常に重要だなと思いました。
最初にペルソナを定義し、この人が価値を置いていること、という部分で共通の認識をもってからアイデアを出し合います。
そのため、「いやいやそんな機能全然いらねーし」みたいなことはなかったし、そもそもニーズの想定が違かった
なんてことで意見がぶれることも無かったです。
このおかげで、どの機能が有益か、ということに集中して作業が出来たと感じました。

この先

まずは、The Design Sprint自体に興味が出たので、まずはこの記事をちゃんと読んでみようと思いました。
僕はエンジニアですが、エンジニア内でアイデアを出す際にも、
プロトタイプを考えることを【 個人作業とフィードバックを短いサイクルで繰り返す 】という手法は、
使えるなと感じました。
早速取り入れていけたらなと。

Nashornのセッションに出だけど、色々分からないのでScript Engineのお勉強1

まえがき

JavaDayTokyo2014 一発目のセッションでは、今まで気になりつつも、触る事が出来ていない、
Nashorn(ナスホーン、ナショーン)のセッションを聴講してきました。
話を聞いてみて、面白いなと思ったものの、

これは実際使ってみないと実感が湧かない(特に実際使うという場面において)

と思いましたので、この記事はセッションのFBも踏まえつつ、「Nashorn試してみた」的なエントリーとの
ハイブリットな投稿になると思います。実際、セッションの冒頭でもNashorn使ってみた人?というアンケートがありましたが、
手を挙げていた人は1割にも満たなかったので、Java8の新機能としてfeatureされつつも、
なかなかまだ実際に使っている人は少ない、という所でしょうか。
自分もその中の一人なので、まずは「Script Engineって何? Nashornって何?」という所から初めていきます。
※ので、結果的にセッション内容のFBに本気記事ではほとんど触れません。

Nashornとは

  • 新しいScript Engineです。
  • Script Engineとは、いわゆるScript言語を実行するEngineです。つまり、JavaにおけるScript Engineは、

Javaからスクリプト言語を呼び出したり(あるいはその逆)の機能を提供するものになります。

ここで一つ注意しておくべきことは、スクリプトエンジン自体は、新しい機能では無いという点です。
Script Engine自体は上記のリンク先にあるように,Java6から提供されています。
なので、新しいScript Engineの一つとして、NashornがJava8から追加されたということですね。

  • Nashornがでる前にデフォルトのEngineとして提供されていたものは、Rhinoという、Mozillaが提供しているスクリプトエンジンでした。

まずはScriptEngine動かす(java8だとデフォルトでNashornを動かす)。

ということで、なんとなくNashorn及びScript Engineのイメージもついたところで、実際に関数を実行してみます。

これ自体はめちゃくちゃ簡単で、すぐに動かせました。
というか、動かし方事態は、Rhinoの時と基本的に全く同じなので、
ScriptEngineに関連する記事はすぐ見つけられました。
で、すぐHello worldが出せました。
使っているEngine名を確認するとNashornと出ているので、無事Nashornが使えていることも確認できます。

        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine engine = scriptEngineManager.getEngineByName("js");
        System.out.println(engine.getFactory().getEngineName());
        try {
            engine.eval("print('HelloWorld!')");
        } catch (ScriptException e) {
            e.printStackTrace();
        }

        //出力
        Oracle Nashorn // Engineの名前はOracle Nashornってことなのかな
        HelloWorld! // printってのがとりあえず標準出力を出す為に提供されているらしい

よしよし。
ところで、
色んなサイトをみると、すぐみんなこのprintって関数使ってHelloWorldやってるんですが、

printって何?

ってなりませんでしたか?僕はなりましたw
で、中身出してみたら、また色々と・・・w
printの中身については別途記事で書きます。

ちなみにprintの中身は下です。
色々気になりますよね?w

function print() {
    var writer = context != null? context.writer : engine.context.writer;
    if (! (writer instanceof java.io.PrintWriter)) {
        writer = new java.io.PrintWriter(writer);
    }
    
    var buf = new java.lang.StringBuilder();
    for (var i = 0; i < arguments.length; i++) {
        if (i != 0) {
            buf.append(' ');
        }
        buf.append(String(arguments[i]));
    }
    writer.println(buf.toString());
}

ともあれ、printという関数はScript Engineにおいて、標準出力として使用できるみたいいです。
もちろん、普通にJavaScriptを書いて動かせます。関数を動かすなど。

        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine engine = scriptEngineManager.getEngineByName("js");
        try {
            engine.eval("function hello() {print('Hello World!')}");
            Invocable invocable = (Invocable)engine;
            Object obj = invocable.invokeFunction("hello");
        } catch (ScriptException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        出力 : Hello World!

Invokeしてキャストしてるところがなぁ。。というのはありつつ。
IDEでこの関数を読み取ってくれるなら嬉しいですが、実行時エラーになってしまうのが嫌ではありますね。
引数入れて関数呼ぶのも出来ます。
そして、面白いと思ったのは、変数の引き渡しもできます。

引き渡し

            Integer i = 241;
            engine.put("key",i);
            System.out.println(engine.eval("typeof(key);"));
            System.out.println(engine.eval("key"));

            出力 :
            number
       241

色々対応してるみたいで

js java
Number Double,Integer,Long,....
String String
Boolean Boolean
未定義 Singleton Object
Object Map

↑こんな感じ

まずはJavaからJavascriptを呼び出すことにおいて、基本的なことは一通りできそうです。
色々やれること、勉強することがありそうです。まずはここまで。

JavaDayTokyo2014 基調講演(JavaSE8) レポート

JavaDayTokyo2014

本日開催された、Oracle社主催のJavaDayTokyo2014に参加してきました。
Openingの基調講演の序盤(どれだけ序盤なんだw)のイベントレポートをします!

f:id:takahiro-f:20140522100421j:plain

今年で2回目の開催となるJava Day Tokyoに参加してきました。
毎年会社に参加させてもらっていて、大変感謝していますw

本日のイベントはJava SE8のロンチイベントとも位置づけられ、
Java SE8の話を中心に、Javaの最新の情報を得ることが出来ます。

f:id:takahiro-f:20140522101629j:plain

Java Day Tokyo 2014の規模は、

  • 22 Sessions
  • 2000 Registrants

22のセッション、2000名を超える参加者が集まる

国内のJavaカンファレンスとしては最大規模のものになります。
恒例として、カンファレンスは基調講演から始まります。
下記に基調講演のレポートの一番初めに話があった、
JavaSE8についての発表のレポートを記載します!

Java8日本語document公開!

でもその前に。
これは最初にサプライズ?発表がありました。
Java8の日本語ドキュメントがついに公開されたようです。
やっぱり母国語のドキュメントがあるのは助かりますね。

http://docs.oracle.com/javase/jp/8/

f:id:takahiro-f:20140522102036j:plain

JavaSE8のリリースについて

今年も、Nandini Ramaniさんが発表されました。

f:id:takahiro-f:20140522100716j:plain

様々なセッションで繰り返し述べられていますが,

  • Java8になって、SEとMEの差分はほぼ無くなり、一つのJavaとしてひとくくりに出来るようになってきた。

(さらっとλの所が少し違うとか言ってたのが気になりましたw,ME使ったこと無いので分かっていませんが。)
f:id:takahiro-f:20140522101318j:plain
f:id:takahiro-f:20140522101435j:plain

  • IoT(Internet of things)というキーワードが繰り返し述べられていました。最近のキーワード。
  • 同じく組み込みの話を意識して、compact profileについても取り上げていました。

f:id:takahiro-f:20140522101917j:plain

Java SE8の新機能の3本の柱

Java SE8の新機能の3本の柱として、下記を挙げていました。
Lambda expressions,Default methods, Stream API
Oracleでは、Java8の一つの大きな目的として、

並列処理のような複雑な処理を、より簡潔に、より簡単に作れること。

を挙げています。
そこに結びつくのが、Stream APIであり、
Stream APIを実装するにあたって、前者2つの機能が必要であったという話です。

Lambda expressionはそこだけ取れば、expressionと言われるように、あくまで表現の話です。
Lambda expressionのおかげで、無名クラス、を使う障壁が減り、
Javaは関数型プログラムの第一歩を踏み出すことができました。

Lambdaが何かということは、
日本語でも既に数多くのブログで有識者の皆様が沢山記事を書いて下さっています。
興味ある方は、調べてみてみてください。

今本当になんとなく、なんとなくだけど分かって貰う為に一言で書くならば、

ラムダ式 (引数) -> 処理

と言っておきます。(全ての真実ではないですが、読んでなんとなく意味を分かる為の表現です)

    Function<String,String> sample = (s) -> "your argument is " + s ; //(引数) -> 処理
    System.out.println(sample.apply("test"));

出力:your argument is test

Default methodは大きな変更で、
既存のインタフェースの概念を変える可能性を持っています。
今まで、実装を持てなかったインタフェースが実装を持てるようになるということで、
インタフェースの継承の概念が変わってきます。

public interface DefaultMethodInterface {
    default public void show(){
        System.out.println("this is default method of show()"); //インターフェースに実装が出来る!
    }
}

そしてその2つを利用してStream APIが出来ました。
そのStream APIを駆使することで、
並列処理を簡潔に実装でき、よりパフォーマンスの良い実装ができます。

        Integer max = students.stream()
                .filter(s -> s.getGradYear() == 2011)
                .map(s -> s.getScore())
                .reduce(0, Math::max);
        System.out.println("max score is " + max);

        //並列
        Integer max = students.parallelStream()
                .filter(s -> s.getGradYear() == 2011)
                .map(s -> s.getScore())
                .reduce(0, Math::max);
        System.out.println("max score is " + max);

最初にJava8が発表されたときは、確かにLamndaに脚光が浴びていて(今でも浴びていますが)
自分が全然何がなんだか分かっていないこともあって、Lambdaを理解することがJava8を理解する上でもメインと思っていた時もありました。
ただ、実際にOpenJDKを使って、Lambdaを使ってみると、
「これは自分のアプリケーションだとどういう所で使うんだろう」
「どう使うんだろう」
という疑問が湧いてくると思います。(自分はそうでした。)
そのとき、やっとこの流れが理解することができました。

Java8 ≒ Lambda expression

ともしも感じている人がいたら。

「何のためのLambdaなのか」

ということを考えると、理解が深まると思います。(自分もまだ全然理解が足りていませんが)

Nashorn

次に、Nashornの話もありました。
Nashornも今回比較的注目を集めている機能で、
新しいJavascriptエンジンを示しています。
(※今までもRhinoというエンジンがありました)

今回からJavascriptがちゃんとバイトコードになる。
という点を強調されていました。
Nashornについては、JavaDayTokyoでNashornがテーマになった講演に参加する為、
そちらのFBで詳しくまとめようと思います。

今後のJava

また、Java6 - Java7で5年もの歳月があった為、
少し気が早いかの印象すら覚えますが、
Java9で機能として含まれると言われている、
Project sumatraについても少し話しがありました。

実際、Java9のOpenJDKは既にあり、BugFixが始まっていると。
そして何より、2年後にはもうJava9が出ます。
Java8を実際のアプリケーションで使い知識を貯めていく一方で、
Java9の最新情報もこれからはキャッチしていく必要があるなと改めて感じました!

f:id:takahiro-f:20140522102242j:plain

Java Fan Meeting 2014 event report.

まえがき

Java Fan Meeting 2014というイベントに参加してきました。
イベントレポートを書きました。かなり殴り書きですが、、、w

ここ2年ほど、サンフランシスコで行われている
JavaOneに参加させて頂き、
その経緯でOracleの寺田さんと繋がって,FBで情報を頂いたので、参加させて頂きました。
また、来週に実施されるJava Day Tokyoやそのハンズオンセッションも参加する予定なので、
その準備運動も兼ね。

今回が初めてとのことですが、
OracleJavaの若い方向けのイベントを行うというのも面白い試みですね。
(僕は今27歳なので、あんまり若いといっていいのかどうか不明ですが笑)

また、20名程度の小規模な会でしたので、落ち着いて話が聞けました。

コンテンツは、

  • 0.Dukeの名前覚えてね(割愛)
  • 1.伊藤さんからの挨拶
  • 2.寺田さんからJava Day Tokyoに繋がる色々(メインコンテンツ)
  • 3.懇親会

という構成でした。開始時間も19:30からとやや遅めでしたので、少し短めですかね。

伊藤さんからの挨拶

Java Day Tokyoと同じように、伊藤さんからご挨拶がありました。
若手の小規模イベントながら、こういった方も来てくれるんですね。
ちょっとびっくりしました(いい意味で)

短いお話でしたが、実は少し気になった言葉があります。

「日本には日本のJavaのはやり方がある」

という言葉。どういうことだろうか。気になりました。

寺田さんからJava Day Tokyoに繋がる色々

今回は、若手向けのイベント、初心者歓迎のイベントということもありまして、
Javaの歴史を振り返る所から話がスタートしました。
でも、その前に発表PCのNetBeansが落ちましたwww
一番のハイライトw

最初はJavaの歴史について説明がありました。
僕はここら辺の知識が全くないので、面白かったです。
1990年にJavaがGreen Projectという社内プロジェクトから始まったとか、そんなこともちゃんと知りませんでした。
ごめんなさいw

下記いくつか話の中でピックアップして所感を書いておきます

2011年 SE7

SwingはJava7からメンテナンスモードに入って、JavaFXに移行した。(からSwing使ってないでFX使ってね)

これを聞いて思ったのは、会社のプロダクトでも、
JDKのバージョンがあがってもコードが古いってのはちょこちょこあったなーということ。
JDKのバージョンが上がったとしても、それに合った最適なコードがかけなければバージョンアップの恩恵は完全には受けれないという話。(が頭によぎりました)

Javaの3つのやめましょう

1つ目は同意。同意しかないw
この前の脆弱性の話もありますしね。

2つ目。
議論すればそれだけで記事になりそうなので、細かいことはいいませんが、
これはケースバイケースだとは思う。
お金の話もあるし。
でも、それを鑑みてもGlassFishWebLogicの方がいいよっていうのはOracleとして当たり前。

3つ目。
Eclipseはたしかに好きではない。特に年一回しかメジャーアップデートしないため、
Java8の対応が他のIDE(NetBeans,IntelliJ)に比べて格段に遅いので、
Java8の色々な機能を試すという点でも候補に上がりようがなかった。
社内勉強会のDEMOは全部IntelliJでやった。勉強会も。
今度の新バージョンで対応はするけど、まだまだ足りない所もきっとある。
Java8が使われだしたら、今までEclipse使っていたのが他のIDEに移る可能性は否めない。

Java8から劇的にコードがかわる

これは本当にそう思う。別に今までのコードが動かなくなる訳ではない。
ただ、スタンダートな書き方、というのがかなり変わる。
Java8ならこう書ける。というのが多い。
(λ式絡みをはじめとして)

ここについていけるかどうかは、Javaのエンジニアとしては一つの分かれ目だと思う。
つか逆パターンですが、Java8からJava使い始めた人が、もし古いバージョン触るってことになったらまじで嫌なんだろーなー
といらぬ妄想

色々なデバイスでJavaが使われるようになる

f:id:takahiro-f:20140516200016j:plain

f:id:takahiro-f:20140516200250j:plain
raspberry piとかね

これは個人的な感想ですが、
Java系のカンファレンス行くと、今のトレンドは組み込み系なのかなーと感じることは多々ある。
そして、今自分はWebサービスしか作ってない。
もっと組み込み系とかにも目を向けて、何か作っていかないと視野が狭まりそう。
ビジネスチャンスを逃しそう。そんな気がする。
今はまだ、組み込み系が爆発的に流行るという所までは来てない。
でも、近い将来、そういったタイミングは必ず来るである事は容易に想像出来る。

下記メモ程度ですが。

  • GitHub/StackOverFlowではJavaが一番多い(たしかによくみる)
  • Java8でちゃんとコード書けばCPU256個だって使い切れるんだぜ
  • 詳細は記載しませんが(Java Day Tokyoで見れます)デモ面白かったです

とかとか。

懇親会

あんまりこういうの行く機会なかったから変な緊張はあったけど、楽しかったです。
後は、やっと寺田さんと直接お話しました。初対面w
大学生でこの話を聞くために北海道から来た方とかなんかもいて、凄いなーと思いました。
応援したくなる。

ちょっと前までは懇親会では、上の人から、色々話しを聞くのが楽しいよなーと思っていたのが、
今では若い人たちと話すのも凄く楽しいです。年をとった証拠だけど、大事なことw
Oracleの新卒の方も結構いらっしゃいました。せっかくだからもう少し話せば良かったな。

所感

Java Fan Meetingということもあって、
コードベースの話はほとんどありませんでしたが、
今一度Javaに目を向ける機会と、来週のJava Day Tokyoに向けた自分の意識付けには良かったなと思います。
あとは懇親会とか、他の参加者やOracleの方とお話出来る機会があったことが良かったです。
といことで、来週のカンファレンスで色々話し聞いてくるぞー

Fans:Fans

Start coding Java8(early access) simple 3 step.

Impressed JavaOne2013

1.download & install Java8(early access)

You can download Java8 early access version from here.
https://jdk8.java.net/download.html

2.choose IDE

You can use NetBeans or IntelliJ for coding by Java8.
Now, Eclipse doesn't support Java8 yet.

NetBeans
http://bits.netbeans.org/dev/nightly/latest/

IntelliJ(Community version is free)
http://www.jetbrains.com/idea/download/

3.(IntteliJ)Using java8 in IDE

Create new project
f:id:takahiro-f:20131124004402p:plain

Add jdk8(Project SDK) you installed.
f:id:takahiro-f:20131124004416p:plain

Here is the default java path(mac).

ls -ltr /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/java
-rwxrwxr-x  1 root  wheel  99296  6 14 06:57 /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/java

Create Java class.
f:id:takahiro-f:20131124004433p:plain

Let's Cording.