Java 8でJavaScript。スクリプトエンジンでNashornを試す
やや気が早いですが、Java 8のEarly Access版でお試し。
Nashornネタあまり出てこなそうなのでとりあえずスクリプトエンジンの復習です。
スクリプトエンジンはJava 6で導入された機能で、JavaのVM上でJavaScriptやRuby等のスクリプト言語が実行出来ます。特にJavaScriptはJDKの中に実行エンジンが含まれているため、追加のライブラリ不要で使えるのがポイントです。Java 7でインボークダイナミックという機能が導入されJavaの中でスクリプトがより効率よく実行出来るようになりました。そして、Java 8でそのJavaScriptの実装がRhinoからインボークダイナミックを使ったNashornに置き換わります。つまり、よりJavaの中でJavaScriptが効率的に実行出来るようになるという事です。
では、とりあえずmainメソッドにソース書いてみます。
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval("print(1+2);");
実行してみましょう。
3
わずか3行でJavaでJavaScriptが動きますね。
うーんやっぱりJavaでJavaScriptが動くのは不思議な感じ。
ちなみにengineのクラス名をSystem.outで出力してみると。
jdk.nashorn.api.scripting.NashornScriptEngine@6279cee3
確かにNashornになってます。
JavaからJavaScriptのfunctionを呼び出したい場合はScriptEngineクラスをInvocableにキャストすると呼び出せます。JavaScriptの「hoge」ファンクションをJavaから呼び出してみましょう。
engine.eval("function hoge(a,b){return a+b;}"); Invocable invocable = (Invocable) engine; Object object = invocable.invokeFunction("hoge", 1, 2); System.out.println(object); //3
キャストというのが少し微妙ですが、JavaからJavaScriptのfunctionが呼び出せて、JavaScriptからの戻り値もJavaで受け取る事ができます。
また、JavaScript内でJavaのクラスも扱えます。JavaScript内でLocalDateクラスを呼び出してみます。
engine.eval("print(Java.type('java.time.LocalDate').now());"); //2014-03-07
上記を実行すると今日の日付が出力されます。RhinoでimportPackage(またはimportClass)ファンクションを使用していましたが、Nashornは使用出来なくなっているので注意が必要です。どうしても互換性の為に使用する必要がある場合は、互換性スクリプトを事前に読み込む事で対応できます。
engine.eval("load('nashorn:mozilla_compat.js');importPackage(java.time);print(LocalDate.now());"); //2014-03-07
スクリプトエンジンはJavaの内部で簡易に記述出来るスクリプトが利用出来るほか、スクリプトで作成されたライブラリ資産がJavaで利用出来るようになるため、使い方によってはとても面白い事が出来ると思います。
Java 8の予習はお済みですか?
とうとう3/18のJava SE 8のリリースが近づいてきました。
去年あたりからJava界隈ではラムダ式などを中心としてJava SE 8の情報が出回っていますが、実際にはまだ触ってない人も多いのではないでしょうか。
少しでも慣れておく為にそろそろ準備運動でもしておいた方が良いかなと思います。
正式版ではありませんがEarly Access版がリリースされているので既にお試しで触ってみる事ができます。
JDK8 Early Access Releases
https://jdk8.java.net/download.html
IDEも対応は進んでいるようなのでリリース前にもかかわらず実際に試す環境は簡単に作れますね。地味にすごいことだと思います。
では、この辺り触っておいた方がいいよってところをあげてみます。
・ラムダ式
まあ皆さん一番触ってみたいのがラムダ式でしょう。
型が省略出来る辺りがJavaとしてはやや違和感がありますね。
クロージャーじゃないので外の変数書き換え出来ないよとか、
thisの参照も内部クラスの挙動とは差異があるようなので実際試してみると面白いと思います。
ラムダ式とセットでメソッド参照やインターフェースのデフォルト実装なんかも入っているのでその辺りも要確認です。
・Date & Time API
Date & Time APIは今までのjava.util.Dateとはかなり違う上に今後の利用頻度はかなり高くなると思うので積極的に触ってみておいた方がいいですね。
・Nashorn
Java内のJavaScript実装エンジンがRhinoからNashornに変わります。まあどっちもサイですが。
実際速度差とかを試すのはあれですけど、Javaのスクリプトエンジン試したこと無い人は一度試してみるのも良いと思います。
・Java FX
GUI環境としてSwingの代わりにJavaFXが標準ライブラリとなりますね。JavaFXのハンズオン資料とかあるので、興味がある人はそれを参考に触ってみると良いと思います。JavaFXでは無名クラスを多く使うのでラムダ式とはとても相性が良いと思います。
Java 8で追加される機能は他にもありますがこの辺りをみればわかるのかな。
http://openjdk.java.net/projects/jdk8/features
Java EEは仕様がリリースされるので実際に本番利用出来るまでに時間がかかりますが、Java SEは実装がリリースされるので、
会社への適用速度もEEよりはスムーズに進むんじゃないかと思っています。
リリース待ち遠しいですね。
退職します
1月31日をもちまして約14年勤めたアイエックス・ナレッジを退職することとなりました。
現職では、良き仕事、良き上司、良きチームメンバに恵まれ、とてもよい社会生活を過ごすことができました。とても感謝しています。
SI業務ではさまざまなお客さんと触れ合う機会がありますが、使用技術もさまざまで、楽な仕事からハードな仕事まで多種多様です。
その中で、私は入社当初から今まで多くの時間をJavaのフレームワーク開発に従事し、主にJavaEEを主軸とした先進的な開発に多く携わることができました。
とても良い環境に身を置かせて頂いたと思っています。
退職は初めての経験で、期待もあり不安もあります。今回の退職は会社に対して不満があったというわけではなく、自分がスキルアップしたいという思いからの決断です。
来月から新しい会社でスタートします。今のスキルを生かしつつ、これから得られる新しいスキルを吸収し、さらなる高みを目指したいと思います。
アジャイル開発がなぜ良いインターフェースに繋がるのか
最近アジャイル開発とウォータフォール開発を交互に行き来しているので、双方を比較する場面が多くあるのですが、アジャイルの優先順位順にアプリケーションを開発していくというプロセスがインターフェース設計に良い影響を与えているのだなと感じています。
ウォータフォール開発では必要な機能をすべて洗い出してから開発するので、多くのアプリケーションのインターフェースはよく使用する機能やあまり使わない機能も一律で並んでメニュー化されている事が多いと感じます。
逆にアジャイル開発では必要なものから開発していくので、一番使用する機能が前面に出てきてあまり使わない機能は階層の深いところに配置されることが多いと感じます。
どちらの方がシステム的に使いやすいのかというとやはりよく使用する機能へたどり着くパスが短い方が圧倒的に使いやすくなります。
ウォータフォールでもユーザの優先順位を意識したインターフェースが作れなくは無いと思いますが、優先順位をユーザがよくわかっていない場合も多く推測するにも限界があるように感じています。その点、自然と優先順位を考慮したインターフェース設計になるアジャイル開発は使いやすいシステムを作る上で大きなアドバンテージがあると思います。