[Mobile, Database, FMW] Application ExpressとADF Mobileを使ってモバイルアプリケーションを作る

これは、JPOUG Advent Calendarの2013年12月22日のエントリです。昨日は @YDYSK さんのエントリでした。
【Oracle】【性能】SQL_ID指定でトレースを設定する方法
http://blog.livedoor.jp/y_db_y/archives/2013-12-21.html
今日はOracle製品に含まれる機能を使って、モバイルデバイスの機能を利用するモバイルアプリケーション(具体的には、簡単な日記アプリケーション)を作るお作法をまとめてみました。

必要なもの

  • Oracle Database + Oracle Database Application Express(以下、APEX)
  • Oracle JDeveloper 11.1.2.4
  • 各プラットフォームのSDK
APEX 4.2にはjQuery MobileのUIライブラリを含んでいるので、Responsive Designを持つWebアプリケーションを作ることができます。また、HTML5に対応したUIコントロールが使えたり、Canvasも使えたり、WebSocketで通信したり、なんてことも、もちろん可能です。
JDeveloper 11.1.2.4は、Oracleのモバイル向け開発フレームワークであるADF Mobileを開発するためのIDE(統合開発環境)です。このADF MobileがOSの違いを吸収し、Android、iOS上で動作するモバイルアプリケーションを作成することができます。UIの開発はJSF2ライクなADFを使って開発できますが、このエントリでは、APEXのUIを表示することにします。
なお、あみゅーさん(@amyu_san)がAndroidからJDBCでOracle Database 12cに接続したい、と仰有っていましたが、ADF MobileではJavaコードを実行することができますので、JDBCで接続するようなコードを書いてみる、なんてことも可能です。
Android と Oracle の仲直り(あみゅーの奮闘記)
http://orclemast.blog.fc2.com/blog-entry-315.html

(こっそり)
ロジ子としては、WebLogic ServerやGlassFishのようなアプリケーションサーバー、Coherenceのような分散キャッシュを使うことを推奨しますが、今回は「簡単に」作ることを意図しているので、このような構成にしています。実際に運用することを考慮すれば、セキュリティ要件も考慮する必要がありますので、「あー、こんな感じで作れるんだ」ぐらいに感じてもらえれば。

JDeveloper 11.1.2.4をダウンロード・インストールする

OTNからダウンロードするのですが、12cや11gR1 (11.1.1.7)用のJDeveloperではADF Mobileを使った開発ができませんので、ご注意ください。Mac OSXへのインストールはちょっと追加作業が必要なので、詳しくは以下のWikiを参考にして下さい。
Oracle ADF Mobile Mac Installation Guide
https://wikis.oracle.com/display/jdeveloperandadf/Oracle+ADF+Mobile+Mac+Installation+Guide

Android SDK、XCodeをインストールしておく

動作させたいプラットフォームのSDKを用意しておきましょう。動作保証済みのバージョンをお使い下さい。

APEXでMobile Webアプリケーションを作る

前述の通り、APEXにはモバイルWebアプリケーションを作成するための機能が備わっています。作り方はデスクトップWebアプリケーションと同じですが、UIのスキンをモバイルWebアプリケーション用に変更しましょう。あと、もう1点注意が必要な箇所があります。
日本語でAPEXを利用している場合、次のようなエラーが出てモバイルアプリケーションを作ることができない場合があります。スクリーンショットからもわかるように、日本語環境で作成すると、DISPLAY_NAMEが30Byteを超過してしまうというお粗末な例外が発生することがあります。これが発生する場合には、APEXを英語で利用し、アプリケーション作成ウィザードを進めてください。


モバイルデバイスの機能を使えるようにする

今回は、カメラで撮影した写真をデータベースにUpしたいのですが、ここで3つの方法があります。
  1. PhoneGap(Cordova)のライブラリをAPEXに組み込む
  2. ローカルHTMLのIFRAME内でAPEXのWebページを表示し、クロスドキュメントメッセージングを使ってイベントをADF Mobileに伝播する
  3. ADF MobileでリモートHTMLを表示し、www/js/base.jsライブラリを参照する<script>タグを使う
    1.はオーソドックスにPhonegap(Cordova)ライブラリをAPEXで利用できるようにする、というものです。この場合、Cordova.jsをそのままAPEXに組み込むため、初回のロードに時間がかかるというデメリットがあります。また、ライブラリはAndroid、iOSでモノが違うため、以下のような感じでUser Agentによってロードする対象を切り替える必要があります。
    <script>
    (function loadCordova() {
      
      //User Agentを小文字にして比較
      var uagent = navigator.userAgent.toLowerCase();
      
        if (uagent.search("android") > -1) {
           document.write('<script src="#WORKSPACE_IMAGES#cordova.android.js" type="text/javascript">' +
                          '<//script>');
        } else if (uagent.search("iphone") > -1) {
           document.write('<script type="text/javascript" ' +
                         'src="#WORKSPACE_IMAGES#cordova.ios.js">' +
                         '<//script>');
        }
       
    })();
    </script>
    2はローカルHTMLに対しイベントを発行し、その結果を受け取る、というものです。IFRAME内のWebアプリケーションからは以下の方法でメッセージを送信することができます。
    window.parent.postMessage({data: "yourData"}, "file://");
    iframe.parent.postMessage({data: "rad"}, "http://yourdomain.com"); 
    
    ローカルHTMLファイルには、イベントリスナーを登録しておき、メッセージを受け取ったあと、Cordova APIを呼べるようにしておきます。
    window.addEventListener("message", function(event) {
      // 期待する送信元からのイベントかどうかをチェックする
      if (event.origin == url) {
        // メッセージの処理コードを追加
      }
    }); 
    3は、リモートURLをadfmf-feature.xmlに登録、ホワイトリストを設定するというもので、カメラを使うためのJavaScriptコードはAPEXに記載します。具体的にはADF Mobileのドキュメントにも記載されています。一番設定の手間が少ないので、こちらを利用されることをお勧めします。
    Oracle® Fusion Middleware Oracle Application Development Frameworkモバイル開発者ガイド 11g リリース2 (11.1.2.4.0)
    リモートURL実装によるApache Cordovaへのアクセスの有効化の概要
    http://docs.oracle.com/cd/E48694_01/doc.111240/b70750/remoteurl.htm#BABCIBHE
    1〜3のいずれも、あとはCordova APIを呼び出すだけです(2はイベントリスナーを実装する必要がありますが)。例えばこんなJavaScriptを作り、ボタンにバインドすれば、デバイスのカメラで写真を撮ることができます。
    function capturePhoto() {
       // カメラで撮影した写真をBase64エンコードで読み出す
       navigator.camera.getPicture(onPhotoDataSuccess, onFail, {
          quality: 50,
          destinationType: destinationType.DATA_URL
       });}
    
    // 写真の読み取りに成功した場合
    function onPhotoDataSuccess(imageData) {
       // console.log(imageData);
      
       // イメージ要素を表示
       $("#smallImage").css("display", "block");
    
       // 撮影した写真を表示
       $("#smallImage").attr("src", "data:image/jpg;base64," + imageData);
      
       // イメージデータをコピー
       staticImg = imageData;
    }
    
    // 何かおかしなことが起きた場合
    function onFail(message) {
       alert('Failed because: ' + message);
       console.log('Failed because: ' + message);
    }
    
    その後、この写真をデータベースにアップロードすればいいですね。アップロードはAPEXのJavaScript APIを使ってもいいですし、プロシージャを作成してアップロードしてもよいでしょう。できたアプリはこんな感じです。


    いかがでしょうか。案外簡単にできそうでしょ。
    Oracleのツールだけでさらっとモバイルアプリを作ってみませんか。

    明日は、 sh2nd さんのエントリです。
    それでは、Happy Christmas!

    [FMW, SOA/BPM, WLS] Oracle SOA Black Belt Cheat Sheets (Free Download of the Year!)

    原文はこちら。
    https://blogs.oracle.com/fusionmiddleware/entry/free_download_of_the_year

    プレゼントの季節なので、今年最後のエントリのために、社内や世界各国のインプリパートナーが使っていて、もっともリクエストの多いチートシートをダウンロードできるようにしました。これらのチートシートをOracle SOA Black Beltトレーニングセッションのために作成しました。このBlack Beltトレーニングとは、Oracle SOA製品に熟達した人のみが参加可能な、より高度なハンズオン・ワークショップで、この中でエンジンの動きを深く知り、スケーラブルなソリューションを設計できるようになってもらうことを意図しています。もしこのワークショップに参加されたことがあったり、BPELエンジンをお使いの場合には、これらを便利なリソースとして役立つことを願っています。

    [訳注]
    Black Beltは文字通り柔道の黒帯なのですが、そのままBlack Beltとしています。

    この"black belt"ワークショップに関心があるなら、参加者によるブログをご覧ください。
    修了者には実際にblack beltをお渡ししています。

    Jürgen KressのSOA Communityのおかげです。
    SOA Community (@soacommunity)
    https://twitter.com/soacommunity
    SOA Community Blog
    http://soacommunity.wordpress.com/
    他の写真をご覧になりたい方は以下のリンクをご覧ください。
    #soablackbeltの検索結果
    https://twitter.com/search?q=%23soablackbelt&src=hash
    以下のリンクをクリックしてチートシートをダウンロードしてください。何かエラーが起きたり、このような資料をもっと見たいという方は、ぜひフィードバックください。

    素敵な休日をお過ごしください。また来年お会いしましょう。

    [Exa*] "Cannot allocate memory" message when accessing a Compute Node through SSH, despite ILOM shows available memory

    原文はこちら。
    https://blogs.oracle.com/csoto/entry/cannot_allocate_memory_message_when

    最近はまった問題で、
    • SSHでサーバーにアクセスした際に"Cannot allocate memory"というメッセージが返ってくる
    • でもILOMを見るとメモリは十分にある
    というものがありました。

    この問題は、ypserv ユーティリティに関連する既知のバグが原因です。
    ypserv bug fix and enhancement update
    http://rhn.redhat.com/errata/RHBA-2012-0205.html
    この問題は十分に空きメモリがあるにも関わらず、断片化しすぎているために2個の連続したページを割り当てることができない、というものです。

    以下のコマンドを使うことができます。
    # echo 3 > /proc/sys/vm/drop_caches
    これでメモリの断片化を解消し、fork() システムコールの呼び出しが成功する可能性があります。もしだめな場合は、システムの再起動が必要です。

    [WLS, Database] Interactive Posters

    原文はこちら。
    https://blogs.oracle.com/lindros/entry/interactive_posters

    Oracle製品のインタラクティブなQuick Referenceツールを生成するフレームワークを開発するチームのリーダーを務めていますが、こうしたQuick Referenceを愛情込めて「ポスター」と呼んでいます。このツールはまだ開発途上なのですが、人気のあるOracle製品、Oracle DatabaseとOracle WebLogic Serverのポスターを2個リリースしました。このツールを使うと、製品の代表的な構成のアーキテクチャをグラフィカルに確認しながら、ドリルダウンしてより詳細を知って頂けるようになっています。この中には関連するドキュメントや、Oracle Learning Libraryに掲載されている無料のオンライントレーニングのリンクも入っていますので、必要に応じて学習頂けるようになっています。
    Oracle Database 12c: Interactive Quick Reference
    http://apex.oracle.com/pls/apex/f?p=44785:24:15236261724947::NO:24:P24_CONTENT_ID%2CP24_PREV_PAGE:7795%2C1
    WebLogic Server 12c Interactive Quick Reference
    http://apex.oracle.com/pls/apex/f?p=44785:24:123475868199575::NO:24:P24_CONTENT_ID%2CP24_PREV_PAGE:7951%2C29
    現在他のOracle製品のポスターを制作中です。ご期待下さい。

    [訳注]
    こちらはOracle Database 12c。

    こちらはOracle WebLogic Server 12c。
    WebLogic Serverのポスターは、以前ご紹介した11g (10.3.6) のものと仕組みは同じです。
    [WLS] WebLogic Server 11gR1 Interactive Quick Reference
    http://orablogs-jp.blogspot.jp/2012/10/weblogic-server-11gr1-interactive-quick.html
    [WLS] WebLogic Server 11gR1 Interactive Quick Referenceの日本語版
    http://orablogs-jp.blogspot.jp/2012/11/weblogic-server-11gr1-interactive-quick.html
    [WLS] WebLogic Server 11gR1 Interactive Quick Reference日本語版がオンラインでも見られるようになりました
    http://orablogs-jp.blogspot.jp/2012/11/weblogic-server-11gr1-interactive-quick_15.html

    [JavaFX] NetBeans support for JavaFX for iOS is out!

    原文はこちら。
    https://blogs.oracle.com/jfxprg/entry/netbeans_support_for_javafx_for

    iOS向けのJavaFX開発が可能な基本的なNetBeans 7.4モジュールが準備でき、テストのためにリリースされました。このモジュールはMac OS環境を現時点ではターゲットとしていますが、iPackツールとの統合により、(このプロジェクトで使っているRoboVMが利用可能なプラットフォームに限定されますが)他のプラットフォームでも動作するようにする予定です。このモジュールには2個のテンプレートアプリケーションが含まれており、一つはよくあるHelloWorldで、もう一つはより複雑かつ素敵なアニメーション(GoldenFishと呼んでいます)付きのアプリケーションです。

    このモジュールは我々とNetBeansチームとのしっかりした協力関係の結果生まれました。このモジュールの詳細は以下のリンクからどうぞ。
    JavaFX for iOS Project Support - plugin detail
    http://plugins.netbeans.org/plugin/52156/javafx-for-ios-project-support
    心にとどめて頂きたいのですが、これは基本的なサポートしかしないモジュールです。まだまだ改善の余地があると思っています。


    [Java, Security] Closing the closed APIs

    原文はこちら。
    https://blogs.oracle.com/java-platform-group/entry/closing_the_closed_apis

    今年初め、WIREDが次のような記事を発表しました。
    Oracle Makes Java More Relevant Than Ever — For Free
    http://www.wired.com/wiredenterprise/2013/09/oracle_java/
    “Oracle has actually opened up Java even more — getting rid of some of the closed-door machinations that used to be part of the Java standards-making process.”
    (Javaの標準策定プロセスの中で使われた非公開の企みを取り除いたという点で、Oracleは実際にJavaをより一層開かれたものにした。)
    このオープン性はOpenJDKやJava Community Processから伝わってきます。様々な企業や開発者が協調してJavaプラットフォームの将来をガイドしようとしているのです。
    Javaのオープン化の中には、実際のJava言語仕様およびAPIの蚊帳の外にある、JDKの内部APIの進化に対処することが含まれています。
    Java SE Technical Documentation
    http://docs.oracle.com/javase/index.html
    Java™ Platform, Standard Edition 7 API Specification
    (英語)http://docs.oracle.com/javase/7/docs/api/
    (日本語)http://docs.oracle.com/javase/jp/7/api/
    開発者はsun.*パッケージのような内部パッケージを使うべきではありませんが、Javaの18年もの歴史にわたり、様々なアプリケーションがこうしたAPIを様々な理由で使ってきました。
    FAQ - Sun Packages : Why Developers Should Not Write Programs That Call 'sun' Packages
    http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html
    これらの実装固有の内部APIが変わると、課題が浮かび上がり、様々なJava実装間でのアプリケーションの移植性を減少させる可能性があります。コンポーネントライブラリを簡単に入手できることを考慮すれば、内部APIの利用を識別してその利用を軽減し、公開APIを利用するようにする必要があり、その方法を模索しています。
    What's Happening in the Land of Open Source Components (Sonatype Blog)
    http://blog.sonatype.com/people/2013/11/open-source-components/
    このエントリでは、これらの内部APIの取り扱いに関するトピックをとり上げます。
    • 内部APIの識別方法
    • 現在のターゲット:CORBAおよびApplets/SecurityManager
    • JDepsの詳細

    Approach in identifying internal APIs

    internal API(内部API)の定義は、Java実装が提供するパッケージもしくはクラスのうち、公開されたAPIセットにないものです。JDK8に向け準備を進めていますが、OpenJDKにはjdepsという新しいツールが含まれています。これはアプリケーションのJARファイルやバイトコード内で利用されている内部APIを発見できるものです。
    jdeps
    http://download.java.net/jdk8/docs/technotes/tools/windows/jdeps.html
    このツールを実行すると、どのコンポーネントで内部APIを使っているか、どの内部APIを使っているか、がわかります。
    jdepsを数多くのアプリケーションで実行し、内部APIの人気を把握し、影響を把握しようとしてきました。

    CORBA and Applets/SecurityManager

    Java 7 Update 51 (2014年1月)から、内部のドキュメント化されていないcom.sun.corba.seパッケージのAPIを制限APIリスト(restricted API list)に移動する予定です。これにより、以下の3条件すべてに適合するアプリケーションに影響があります。
    1. アプリケーションが制限されたパーミッションを利用している(つまりサンドボックス化されたRIAもしくは、SecurityManagerと共に使う場合)
    2. CORBAを使っている
    3. ドキュメント化されていない内部Sun API(com.sun.corba.se.*)を使っている
    内部API(com.sun.corba.se.*)を制限APIリストに移動させるという最初の試みは、今年の6月のOpenJDKメーリングリストにさかのぼります。
    RFR: 8000450: Restrict access to com/sun/corba/se/impl package
    http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/017673.html
    何度かのレビューを経て、10月によりよいパッチができました。
    8021257: com.sun.corba.se.** should be on restricted package list
    http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-October/022403.html
    Java 7 update 51から、内部CORBA APIは制限APIリストに入ります。これはこの内部APIを使っているRIAがある場合、アプリケーションのmanifestに"Permissions: all-permissions"というエントリを追加しなければならず、しかもサンドボックスを使えないということを意味します。アプリケーションがSecurityManagerを使ってきめ細かいパーミッションを指定しているならば、SecurityManagerで"accessClassInPackage.com.sun.corba.se"パーミッションを指定する必要があります。

    The Security Manager (The Java Tutorials)
    http://docs.oracle.com/javase/tutorial/essential/environment/security.html
    • コードやコンポーネントがこれらの内部CORBA APIを使っているかどうかを確認するためには、jdepsを使い、"com.sun.corba.se"という出力があるかどうか探します。
    • jdepsからの出力にドキュメント化されていない内部APIが利用されている旨の記載がある場合、次の2個の選択肢をとることができます。
      1. (推奨)ドキュメント化されていない内部APIの代わりに、javax.rmi.CORBAもしくはorg.omg.* APIを使うようにコードを書き換える。
        javax.rmi.CORBA
        http://docs.oracle.com/javase/7/docs/api/javax/rmi/CORBA/package-summary.html
        org.omg.*
        http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html
      2. "Permissions: all-permissions"というmanifestエントリをAppletで利用したり、SecurityManagerから、"accessClassInPackage.com.sun.corba.se"パーミッションを入手することで時間を稼ぐ。是非時間をとって、上記オプションAを選択するようにしてください。

    JDeps in detail

    OpenJDK 8ではjdepsというユーティリティを導入し、JARファイルをチェックし、内部APIを使っているJARファイルを識別し、見つかったAPIをリスト化しています。このツールは、「これらの内部クラスを使用していますか?」とか「もしそうなら、どれを使っていますか?」といったと質問に答えてくれます。jdepsを使用し、アプリケーションを確認するには、JDK8のプレビューリリースをダウンロードすればいいのです。JDK8上で実際にテストしたりアプリケーションを実行する必要はありません。JDK8なのは、たまたまjdepsユーティリティがある場所ということにすぎません。
    JDK™ 8 Early Access Releases
    https://jdk8.java.net/download.html
    ソースコードがなくてもjdepsをアプリケーションに対して実行できます。jdepsをアプリケーションに掛けるコマンドは以下のような感じです。
    jdk8/bin/jdeps -P -jdkinternals *.jar > your-application.jdeps.txt
    your-application.jdeps.txtには以下のように出力されます。
    your.package (Filename.jar)
          -> com.sun.corba.se            JDK internal API (rt.jar)

    [Cloud, Solaris] Oracle now Corporate Sponsor of the OpenStack™ Foundation

    原文はこちら。
    https://blogs.oracle.com/markusflierl/entry/oracle_now_corporate_sponsor_of

    OracleがOpenStack™ Foundationの企業スポンサーになったことを嬉しく思っています。私のチームは、OpenStack™がSolarisで動作するようにコードを完成させようとしています。当初の計画では、Nova Compute、Neutron NetworkおよびCinder Object Strage ModulesがSolarisで動くようにし、この変更をOpenStackの™の上流のコードベースに寄贈することです。これにより、お客様はOpenStack™を使用して、Solarisの安定性、効率性、パフォーマンス、拡張性およびセキュリティを最大限に活用しながら、Solarisベースのクラウドを管理することができます。最初に注力するところは、Solaris ZonesとKernel Zonesの管理の部分です。これは来年OpenStackと共にリリースされる予定になっています。

    2011年11月にOracle Solarisのリリース以後、4000以上のお客様が本番環境でご利用になり、SolarisベースのIaaS、PaaS、SaaSクラウドにて幅広いワークロードを実行されてきました。この中にはOracle Corporationも含みます。OracleはOracle SuperClusterベースのSolaris 11上で、E-Business SuiteのGlobal Single Instance(訳注:全世界で一つのE-Business Suiteのインスタンスを使っている、ということです)のようなミッションクリティカルなものを含め、様々なアプリケーションを実行しています。

    Oracle Solarisは、クラウドベースでの展開のために、業界最先端のセキュリティ、パフォーマンス、スケーラビリティおよび管理・監視の容易性を提供しており、これらの機能をつかうことで、お客様は最も重要・必要なエンタープライズアプリケーションをプライベートクラウドでもパブリッククラウドでも実行することができます。さらに、差別化されるテクノロジーを組み合わせ、クラウド基盤を提供するための、よりすぐれたソリューションをOracle Solarisは提供します。例えば
    • 優れた圧縮・重複除外、Copy-on-Write機能を持つZFS
    • DTraceによる監視
    • パッチのロールバックができるため、低リスクでシンプルなインフラストラクチャのライフサイクル管理が可能
    • オーバーヘッドのないZonesを使った仮想化
    詳細はプレスリリースをどうぞ。
    Oracle Sponsors OpenStack Foundation; Offers Customers Ability to Use OpenStack to Manage Oracle Cloud Products and Services
    http://www.oracle.com/us/corporate/press/2079843
    [訳注]
    その他関連記事はこちらからどうぞ。
    Oracle joins OpenStack Foundation (Under the Microscope)
    https://blogs.oracle.com/gman/entry/oracle_joins_openstack_foundation
    Oracle Joins OpenStack Foundation; Plans for Oracle Solaris Announced (Oracle Solaris blog)
    https://blogs.oracle.com/solaris/entry/solaris_and_openstack
    Oracle goes all in with OpenStack (ITworld)
    http://www.itworld.com/cloud-computing/386731/oracle-goes-all-openstack
    Oracle becomes sponsor of OpenStack Foundation (InfoWorld)
    http://www.infoworld.com/d/cloud-computing/oracle-becomes-sponsor-of-openstack-foundation-232426

    [Java] Java Mission Control and Flight Recorder Demo Series

    原文はこちら。
    https://blogs.oracle.com/javatraining/entry/java_mission_control_and_demo

    この数週間でJava Mission ControlとFlight Recorder 5.2の動画を作ってきました。ご存知かもしれませんが、Java 7 u40現在、Java Mission ControlおよびFlight RecorderはJDK 7に無料で含まれています。このデモではこれらの強力なツールの基本的な使い方をご紹介しています。

    Webチュートリアル版では、テキストノートやご自宅でデモを実施する上でのいくつかのコツが記載されています。Webチュートリアルは以下のリンクからどうぞ。
    Oracle Learning Library: Java Mission Control and Flight Recorder Demo Series
    http://apex.oracle.com/pls/apex/f?p=44785:24:11792473218501::NO::P24_CONTENT_ID,P24_PREV_PAGE:8738,1
    デモを見るだけでいいなら、YouTubeでどうぞ。プレイリストを用意しました。
    YouTube: Java Mission Control and Flight Recorder Demo Series
    http://www.youtube.com/playlist?list=PLKCk3OyNwIzsEVDq6zErLW7HSkY7aqdeT

    [Java] JSR 269 Maintenance Review for Java SE 8

    原文はこちら。
    https://blogs.oracle.com/darcy/entry/jsr_269_mr_for_java

    アノテーション処理API( javax.annotation.processing におけるAPIのプロセッサ固有の部分と javax.lang.model.* における言語モデルの部分の両方)は、Java SE 8の新しい言語機能をサポートするように更新されています。手続き上、提案された変更は、JSR269の2回目のメンテナンスレビュー(Maintenance Draft Review 2)で対応しています。
    メンテナンスレビューのページでまとめてあるように、Java SE 7に付属しているAPIのバージョンからの変更は3個のカテゴリに分かれています。
    JSR 269: Pluggable Annotation Processing API
    https://jcp.org/en/jsr/detail?id=269
    JSR-000269 Pluggable Annotation Processing API
    (Close of Maintenance Review 2: 20 December 2013)
    https://jcp.org/aboutJava/communityprocess/maintenance/jsr269/index2.html
    1. セマンティクスを変更せずに既存の仕様をクリーンナップ(欠落しているjavadocのタグなどを追加)
    2. Project Lambda (JSR 335)で作られた言語の変更をサポートするよう、APIを変更。これらには javax.lang.model.type.IntersectionTypejavax.lang.model.element.ExecutableElement.isDefault の追加を含む。
    3.  JSR 308, Annotations on Java Types.の下になされた言語の変更をサポートするよう、APIを変更。これらには、 javax.lang.model.AnnotatedConstruct や、 javax.annotation.processing.Processor のアップデートを含む。
    この小さな、repeating annotationsに関する言語の変更は、OpenJDKのメーリングリスト内で議論されていますが、これもまた提案された変更によってサポートされています。
    Repeating Annotations and Method Parameter Reflection
    http://cr.openjdk.java.net/~abuckley/8misc.pdf
    enhanced-metadata-spec-discuss -- Technical discussion related to JEPs 118 & 120(OpenJDKメーリングリスト)
    http://mail.openjdk.java.net/mailman/listinfo/enhanced-metadata-spec-discuss
    詳細な仕様の違いが確認いただけるようになっています。ぜひコメントいただく(訳注:原文のエントリのコメント欄です)か、メールでお知らせ下さい。
    仕様の違い
    http://jcp.org/aboutJava/communityprocess/maintenance/jsr269/Jsr269-1.7-1.8-specdiff.zip

    [Coherence, Java] New: VisualVM Plugin for Coherence - released through the Coherence Incubator

    原文はこちら。
    https://blogs.oracle.com/OracleCoherence/entry/coherence_jvisualvm_plugin_released_in

    新しいCoherence Incubator 12.1.0のリリースにあわせ、開発者向けのCoherence VisualVM plug-inがご利用いただけるようになったことを発表でき、わくわくしています。

    このコミュニティプラグインを使ってJMXを有効にしたCoherenceクラスタに接続すると、開発者は集約したCoherenceに関連する統計情報を確認することができます。情報を様々なCoherenceのMBeansから収集・集約し、表形式やグラフ形式で表示します。様々なサービスやキャッシュを選択し、それぞれについてより詳細のノードレベルの情報を表示させることも可能です。

    インストールし、MBeanサーバーが動いているCoherenceプロセスに接続すると、Coherenceというタブが追加されていることがわかります。このタブを選択すると、'Cluster Summary'タブが表示されます。

    Features

    Coherenceタブ内に表示されるタブ数は利用する機能によって変化しますが、以下のものを含んでいます。
    • Cluster Overview - Coherenceクラスタのハイレベルの情報(クラスタ名、バージョン、メンバーの個数、クラスタのStatusHAなど)を表示。全クラスタの利用可能なメモリサイズおよび使用メモリサイズ、パケットの発行・受信の成功率、Coherenceを実行しているマシンの平均負荷をグラフでサマリ表示。
    • Machines - Coherenceクラスタを構成する物理マシンのリストならびに、平均負荷やこれらのマシンで利用可能なメモリに関する情報を表示する。
    • Members - 個々のメンバーのパケット送受信の成功率、メモリおよび送信キューサイズといった、Coherenceメンバー/ノードの完全なリスト。
    • Services - パーティション数とstatusHA値を含む実行中のサービスに関する情報。サービスを選択すると、次回のデータ更新時にサービスの各ノードのスレッド詳細情報ならびにその情報をグラフ化して表示する。
    • Caches - キャッシュサイズ、メモリ使用量といった、任意のキャッシュに関する情報を表示する。メモリ使用量の正しい情報を表示するためには、バイナリ単位変換機能を利用する必要がある。キャッシュを選択した場合、次のデータ更新のタイミングで、サービスやキャッシュをホストしている各ノードの詳細情報を確認出来る。
    • Proxy Servers - クラスタがプロキシサーバーを実行している場合、このタブには、プロキシサーバーおよび各プロキシサーバとの合計接続数に関する情報を表示する。また、NameServiceを含める・除外して表示することもできる。
    • Coherence*Web - クラスタをCoherence*Web用に構成している場合、このタブはデプロイされたアプリケーションの個数、保存されたHTTPセッション数といった情報ならびに、その他のセッション取得に関する情報を表示する。
    Membersのタブの例を以下に示します。さまざまな画面に含まれている視覚的な手がかりを使って、潜在的な問題に対する注意を喚起していることがわかります。

    Servicesのタブ(下図)では、個々のサービスを選択し、スレッドの利用率のように詳細なメトリックを監視する方法を示しています。


    Getting the Plug-in

    最新のCoherence Incubator (12.1.0) のためのソースをホストしているGitHubからプラグインを入手することができます。
    GitHub for Coherence Incubator 12
    http://coherence-community.github.io/coherence-incubator/12.1.0/
    The Coherence Incubator  12.1.0
    https://java.net/projects/cohinc/
    このCoherence IncubatorはCommon Development and Distribution License (CDDL) ライセンスを使っています。
    Common Development and Distribution License (CDDL-1.0)
    http://opensource.org/licenses/cddl1.php
    プラグインのビルド方法やインストール方法が記載されているドキュメントは以下にあります。
    The JVisualVM Plug-In
    http://coherence-community.github.io/coherence-incubator/12.1.0/jvisualvm/index.html
    事前ビルド済みのNetBeans Module (NBM) はsearch.maven.orgから入手できますし、Incubatorのソースからビルドすることも可能です。
    Maven Central Repository
    http://search.maven.org/#search%7Cga%7C1%7Ccoherence-jvisualvm
    VisualVMツールはJDK 1.7をダウンロードするとご利用いただけます。もしくは以下のリンクからダウンロードいただけます。
    Visual VM
    http://visualvm.java.net
    CoherenceプラグインはJDK 7 Update 40以上で動作するように設計されています。

    クラスタが以前のバージョンのJavaで動作している場合、これまで通り、最新のJVisualVMを使ってリモートから接続し、統計情報を見ることができます。

    (注意)
    これは単一クラスタの情報を一度に確認するための開発者向けツールです。他の監視ツール(Oracle Enterprise Managerや他社製品など)はエンタープライズレベルの監視・管理、アラート発信に適したものです。

    [Java] ARM TechCon 2013: Oracle, ARM expand collaboration on servers, Internet of Things

    原文はこちら。
    https://blogs.oracle.com/henrik/entry/armtechcon2013

    Javaの情報をフォローされているならば、ARMベースのデバイスやサーバーに対し、過去数年間多大な投資をしてきたという事実を、既にご存知のことと思います。
    Oracle and ARM to tweak Java (PC World)
    http://www.pcworld.com/article/2044910/oracle-and-arm-to-tweak-java.html
    Freescale Collaborates with ARM and Oracle to Add New Vertical Segment Support for 'One Box' IoT Gateway Platform (WSJ)
    http://online.wsj.com/article/PR-CO-20131029-906155.html
    ARM, Oracle to Optimize Java for 64-Bit ARM-Based Servers (eWeek)
    http://www.eweek.com/servers/arm-oracle-to-optimize-java-for-64-bit-arm-based-servers/
    "java arm oracle news"でGoogle先生に尋ねてみた…
    http://lmgtfy.com/?q=java+arm+oracle+news

    このたび、ARM Cortex-Mマイクロコントローラ用Java ME Embeddedバイナリ、ARMアプリケーションプロセッサ用Java SE Embedded、ARMベースサーバー用にOracle JDKの移植をリリースしました。
    Java ME Embedded
    http://www.oracle.com/technetwork/java/embedded/downloads/javame/index.html
    Java SE Embedded
    http://www.oracle.com/technetwork/java/embedded/downloads/javase/index.html
    これにより、JavaがBeagleboard、Raspberri PIそしてLego Mindstorms/LeJOSコミュニティでご利用いただけるようになりました。我々は、BeagleBoard、Raspberry Pi、Lego Mindstorms/LeJOSでJavaが利用できるように取り組んできました。そしてコミュニティやJava User Groupと協力し、JavaがIoTデバイスのための素晴らしい開発環境であることを啓蒙してきました。
    Beagleboard.org > Oracle JDK
    http://beagleboard.org/project/java/
    Oracle Java on Raspberry Pi
    http://www.raspberrypi.org/archives/4920
    Running Java SE Embedded on Java for LEGO® Mindstorms® EV3
    http://www.oracle.com/technetwork/java/embedded/downloads/javase/javaseemeddedev3-1982511.html
    LEJOS : Java for LEGO Mindstorms
    http://www.lejos.org/
    いくつか例を挙げると、Freescale、Qualcomm、Gemalto M2M、SIMComとの商業関係を発表しました。
    Oracle Brews Java for the Internet of Things - Freescale Pours Java Into IoT Gateways
    http://www.eetimes.com/document.asp?doc_id=1319569
    Qualcomm Technologies, Inc. and Oracle Collaborate on Platform for Machine-to-Machine Applications
    http://www.qualcomm.com/media/releases/2012/10/03/qualcomm-technologies-inc-and-oracle-collaborate-platform-machine-machine
    Cinterion Launches M2M Solution with Oracle Java ME Embedded 3.2 for Secure Wireless Connectivity
    http://www.gemalto.com/php/pr_view.php?id=1383
    SIMCom Selects Oracle Java ME Embedded for  new Wireless Module SIM800
    http://wm.sim.com/articleen.aspx?id=1308
    ARMとFreescaleは、最近 Executive Committeeのメンバーとして選ばれ、JCPに参加しており、OracleとともにそのエコシステムでJavaを啓蒙するために活動してきました。
    Azul Systems and Twitter Elected to the JCP Executive Committee, VMware No Longer Represented
    http://www.infoq.com/news/2011/11/jcp-ec
    このような背景で、Nandini Ramani (Vice President, Java Platform, Oracle) は、TechCon 2013で"Enabling Compelling Services for IoT"というタイトル基調講演において、ARMとの協業を拡大することを発表しました。
    ARM® TechCon™ 2013
    http://www.armtechcon.com/keynote-speakers/#nandini-ramani
    発表をまとめると以下のような感じです。
    • ARMとOracleは協調してARM Sensinode通信スタック(CoAP、DTLS、6LoWPANベース)とOracleのJava ME、Java SE、ミドルウェア製品との相互接続性に取り組んでいます。
      ARM Acquires Sensinode Oy to Accelerate the Internet of Things and Support 30 Billion Connected Devices by 2020
      http://www.arm.com/ja/about/newsroom/arm-acquires-sensinode-oy-to-accelerate-the-internet-of-things-and-support-30-billion-connected.php
      Datagram Transport Layer Security Version 1.2
      http://tools.ietf.org/html/rfc6347
      Compression Format for IPv6 Datagrams over IEEE 802.15.4-Based Networks
      http://tools.ietf.org/html/rfc6282
    • ARMはOpenJDKにSensinode CoAPプロトコルエンジンを寄付し、COAPプロトコルを広範に採用してもらおうと考えています。そしてOracleと協働で、CoAPをサポートする関連するJava仕様を拡張しようとしています。 CoAP(Constrained Application Protocol)とは、IoTアプリケーションに適した低帯域幅の要求/応答プロトコルを提供するIETF仕様です。
      Constrained Application Protocol (CoAP) draft-ietf-core-coap-18
      http://tools.ietf.org/html/draft-ietf-core-coap
    • ARMはOracleおよびFreescaleと協力し、mbedハードウェア抽象化レイヤ(HAL)がJava ME Embeddedのための可搬性のあるレイヤとして動作できるようにしていく予定です。Oracleは、mbedをJava ME EmbeddedのTier-1プラットフォームとする予定です。時間が経つにつれ、この努力の結果、(ほとんどの場合Cortex-Mマイクロコントローラをベースとしている)任意のmbed対応プラットフォームが既製のJava ME Embeddedバイナリで動作するようになり、Java MEの範囲がIoTのエッジノードへと拡張します。
      mbed : Development Platform for Devices
      http://mbed.org/
    • Nandiniの基調講演で、 Oracleは、拡張の早期アクセスプログラムが先行し2015年に、 64ビットARMv8サーバ上で動作するLinux用のOracle JDKの移植するというロードマップを示しました。このバイナリが他のプラットフォームのOracle JDKと完全に同等の機能を持ち、同じくロイヤリティフリーライセンスの下で利用可能になることを期待しています。この作業が継続していますが、現在は Applied Microからのハードウェアが使えるようになったことで、その動きが加速しています。OracleはApplied Microと協力し、 ARMv8への移植およびApplied MicroのX-Gene製品に対するJavaの最適化を進めていきます。
      Applied Micro
      http://www.apm.com/
      Applied Micro X-Gene Family
      http://www.apm.com/products/data-center/x-gene-family/
    • OracleとARMは、 IoTのアーキテクチャで緊密に協力し、サーバおよびIoTデバイスの両方のために、Java on ARM(ARM上でのJavaの利用)の推進・啓蒙を進めます。
    これらの発表は、Javaの地位をARMのエコシステムにおいて第一級の市民として強化し、Internet of Thingsのための標準やオープンなエコシステムを推し進める上での共同作業をする、という私たちのコミットメントを知らせるものです。この分野活躍されていてまだ我々と接触されていない場合、もしくは関心があってもっと知りたいというのであれば、ぜひご連絡ください!

    [Database] Oracle SQL Developer Data Modeler v4.0 Is Now Available

    原文はこちら。
    http://www.thatjeffsmith.com/archive/2013/12/oracle-sql-developer-data-modeler-v4-0-is-now-available/

    タイトルが全てを物語っていますね。Version 4がご利用頂けるようになりました。
    製品に関する情報は以下のリンクからどうぞ。

    My Two Favorite New Features

    Comment Only Views

    技術に詳しくない人向けに、エンティティや表の概要だけを記述したダイアグラムを出力する必要がある場合、コメントと名前だけを表示したダイアグラムを出力することができます。文字通りなのですが、図を見てもらえばわかってもらえるのではないかと思います。
    Oracle SQL Developer Data Modeler 4 and Comment Display
    http://www.thatjeffsmith.com/archive/2013/10/oracle-sql-developer-data-modeler-4-and-comment-display/

    コメントだけです。コメントありますか?ありませんか?

    NOT Searches

    v3.3で新しく改善された検索機能はモデラーのための巨大なゲームチェンジャーでしたが、V4の検索機能に対し少々チューニングし、さらに便利になりました。どの表の列のコメントがブランクではないか、といったような質問をもらうことがありますが、こういった質問に対し、今では簡単に回答ができます。

    もしくは、機密情報やPII、改訂スキームに関しては、NULLでない列のプロパティを持つ任意の表を見てみたい、と思うかもしれませんが、その時にも、AdvancedもしくはNotフラグを使用して検索すると簡単です。

    advanced searchに切り替え、プロパティを選択し、"Not"のチェックボックスを選択しましょう。
    こうすると、選択したプロパティのうち、NULLもしくは定義されていない任意の列を表示します。
    では、やってみましょう!

    …こんな感じになります。

    その他のSQL Developer Data Modeler v4.0のエントリ

    [Database] Oracle Database 12c Storage Optimization Features Automate Data Management

    原文はこちら。
    https://blogs.oracle.com/databaseinsider/entry/oracle_database_12c_storage_optimization

    Karen Ambrose (Wellcome Trust Sanger InstituteのGreen InitiativeにおけるPrincipal DBA)が、大量のデータを生成する、幹細胞研究プロジェクトにおけるデータの増加の影響を説明しています。このデータは、経済的に管理され、かつ研究で必要とする人々が利用できることを保証しなければなりません。Oracle Database 12cのストレージ最適化機能がデータ管理の自動化に役立ち、性能向上ならびにWTSIのストレージ使用量を削減することにより、コストを削減している様子を知っていただけることでしょう。

    [Linux] PHP Examples in New "Oracle Linux 6 DTrace Tutorial"

    原文はこちら。
    https://blogs.oracle.com/opal/entry/php_examples_in_new_oracle

    同僚のGavin Boweが新しくOracle Linux 6 DTrace Tutorialをリリースしました。HTML、PDF、ePubの3形式でご利用頂けます。
    Oracle Linux 6 Documentation
    http://docs.oracle.com/cd/E37670_01/index.html
    第3章の"Tracing User-Space Applications"では、PHPのサンプルが掲載されています。

    [Java] iPack -The iOS Application Packager

    原文はこちら。
    https://blogs.oracle.com/jfxprg/entry/ipack_the_ios_application_packager

    iOSアプリケーションは、 .ipaというアーカイブファイルで配布されています。これらのファイルは通常のzipファイルで、この中にアプリケーションリソースは実行ファイルが含まれています。不正な変更から守り、ipaファイルのソースの識別を可能とするために、アーカイブの内容が署名されています。署名は.ipaアーカイブのアプリケーションの実行可能ファイルに含まれており、実行ファイルそのものと関連するリソースファイルを保護しています。AppleはiOSの実行ファイルに署名するためのネイティブのMac OSツールを提供しています(実際には、一般的なMach-Oコード署名ツールです)が、これらのツールは、一般的には他のプラットフォームで利用できません。JavaFXのベースのiOSアプリケーションのためのマルチプラットフォーム開発環境を提供するために、JavaにiOSの署名およびパッケージ機能を移植し、専用のiPackツールを作成しました。

    このiPackツールを様々なOSで.ipaパッケージを作成する最後の段で使うことができます。iPadで動作するJavaFXアプリケーションのための最終配布アーカイブを作成する際にプロトタイプをテストしました。なお、開発からパッケージングまでの全てをWindows 7で実施しました。

    ソースコード

    iPackツールのソースコードはOpenJFXプロジェクトのリポジトリにあります。
    <openjfx root>/rt/tools/ios/Maven/ipack
    
    iPackツールをビルドするには以下のコマンドを実行します。
    <openjfx root>/rt/tools/ios/Maven/ipack$ mvn package
    
    ビルドが完了したら、ツールを実行できます。
    java -jar <path to ipack.jar> <arguments>
    

    キーストアの署名


    ツールはjavaキーストアを使って署名する証明書と関連する秘密鍵を読み取ります。このようなキーストアを準備するため、JDKからキーツールを使うことができます。

    可能性のあるシナリオの一つとして、既存の秘密鍵と証明書をMac OSで使っているキーストアからインポートする、というものがあります。

    既存のキーストアの内容を表示し、ソースエイリアスを識別するには…
    keytool -list -keystore <src keystore>.p12 -storetype pkcs12 -storepass <src keystore password>
    
    Javaキーストアを作成し、キーストアに署名付き秘密鍵をインポートするには…
    keytool -importkeystore \
            -destkeystore <dst keystore> -deststorepass <dst keystore password> \
            -srckeystore <src keystore>.p12 -srcstorepass <src keystore password> -srcstoretype pkcs12 \
            -srcalias <src alias> -destalias <dst alias> -destkeypass <dst key password>
    
    別のシナリオとして、秘密/公開鍵のペアを直接Javaキーストアで生成し、このキーペアから証明書リクエストを作成する、というものがあります。Appleにリクエストを送信した後、証明書のレスポンスをJavaキーストアにインポートして、証明書の署名が完了します。

    両方のシナリオで、Javaキーストアに生成されるエイリアスには一つの証明書のみが含まれているはずです。以下のコマンドで確認することができます。
    keytool -list -v -keystore <ipack keystore> -storepass <keystore password>
    
    証明書チェーンの長さのエントリを見ると、その横にある数が1になっています。

    実行可能ファイルがMac OSで署名されている場合には、(CMSフォーマットの)署名には、AppleのルートCAまでの証明書チェーン全体が含まれていますが、iPackツールの場合、コマンドラインで指定されたエイリアス以下に格納されているチェーンだけを含んでいます。そのため、署名にチェーン全体が入るように、対応する完全な証明書チェーンを持つエイリアスでその証明書エントリを交換する必要があります。

    この対策のため、まず別のファイルにチェーンを作成する必要があります。Base64エンコードのPEMフォーマットの証明書を扱っている場合には、このようなチェーンを作成するのは簡単です。証明書チェーンをPEM証明書を連結して作成することができます。つまり、チェーンを単一ファイルに形成するというわけです。

    iOSの署名のために、我々のチェーンに以下の署名が必要です。
    • Apple Root CA
    • Apple Worldwide Developer Relations CA
    • 自分たちが署名している証明書(leaf certificate)
    バイナリのDERフォーマット(.der、.cer)からPEMフォーマットへ証明書を変換するには…
    keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert -file <certificate>.cer
    keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert -rfc -file <certificate>.pem
    
    署名した証明書をPEMフォーマットとしてエクスポートするには…
    keytool -exportcert -keystore <ipack keystore> -storepass <keystore password> -alias <signing alias> -rfc -file SigningCert.pem
    
    AppleIncRootCertificate.pem、AppleWWDRCA.pem、SigningCert.pemからチェーンを作成してから、以下のコマンドを使ってキーストアにインポートし直します。
    keytool -importcert -noprompt -keystore <ipack keystore> -storepass <keystore password> -alias <signing alias> -keypass <key password> -file SigningCertChain.pem
    
    まとめると、以下の例が完全な証明書チェーン置き換えプロセスです。
    keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert1 -file AppleIncRootCertificate.cer
    keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert1 -rfc -file AppleIncRootCertificate.pem
    keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert2 -file AppleWWDRCA.cer
    keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert2 -rfc -file AppleWWDRCA.pem
    keytool -exportcert -keystore ipack.ks -storepass keystorepwd -alias mycert -rfc -file SigningCert.pem
    cat SigningCert.pem AppleWWDRCA.pem AppleIncRootCertificate.pem >SigningCertChain.pem
    keytool -importcert -noprompt -keystore ipack.ks -storepass keystorepwd -alias mycert -keypass keypwd -file SigningCertChain.pem
    keytool -list -v -keystore ipack.ks -storepass keystorepwd
    

    使い方

    iPackツールを引数無しで起動すると、以下のように利用方法を表示します。
    Usage:
    
     ipack <archive> <signing opts> <application opts> [ <application opts> ... ]
    
    Signing options:
    
     -keystore <keystore>   keystore to use for signing
     -storepass <password>  keystore password
     -alias <alias>         alias for the signing certificate chain and
                            the associated private key
     -keypass <password>    password for the private key
    
    Application options:
    
     -basedir <directory>   base directory from which to derive relative paths
     -appdir <directory>    directory with the application executable and resources
     -appname <file>        name of the application executable
     -appid <id>            application identifier
    
    Example:
    
     ipack MyApplication.ipa -keystore ipack.ks -storepass keystorepwd
                             -alias mycert -keypass keypwd
                             -basedir mysources/MyApplication/dist
                             -appdir Payload/MyApplication.app
                             -appname MyApplication -appid com.myorg.MyApplication
    

    [Data Integration] In-Session Parallelism in ODI12c

    原文はこちら。
    https://blogs.oracle.com/dataintegration/entry/in_session_parallelism_in_odi12c

    (Ayush Ganeriwalの寄稿です)
    このエントリではODI 12cで導入された、新しいin-session parallelismを説明します。ODI 12cでは、各々が独立したマッピングの一部を並列実行できるようになりました。例えば、2個の独立したデータソースからデータをC$表へのロードを並列実行します。これらのオペレーションは各々独立しており、同時に実行できます。同様に、フロー制御やターゲットへのロードといった種々のユースケースで、このような並列実行を実現できます。ODI 12cは並行実行できるセッションタスクを自動的に識別し、並列実行のためのコードを生成します。マッピングのどの部分が並列実行されるのかを、ユーザーは視覚化して確認できます。必要であれば、業務要件にあわせてこの挙動を変更し、直列にタスクを実行することができます。

    デプロイメントプランでの並列処理の表示


    通常のデプロイメントプランは上図のようになっており、ここでファイルやリレーショナルデータストアからのデータをまずステージングエリアであるC$表にロードし、結合して、ターゲット表にロードします。ここで様々なソースストアや対応するC$表、結合コンポーネント、ターゲットデータストアは、実行単位や実行単位グループと呼ばれる個別の青と黄色の箱で構成されています。実行単位グループには一つ以上の実行単位が含まれており、これらの実行単位は互いに独立しており並行実行が可能です。実行単位にはオペレーションの組み合わせが含まれており、これらは順に実行する必要があります。上記の例では、SOURCE_GROUPには、それぞれが独立していて並列実行される2個の実行単位が含まれています。TARGET_GROUPには一つの実行単位が含まれており、並列実行できないことがわかります。

    並列処理はセッション内でどのように実行されるのか?

    ステップ内のセッションタスクは、ロードプランのステップ階層に類似した階層形式で生成されます。SerialタスクとParallelタスクという名前の2個の新しいタスクタイプが導入されています。これらはコンテナタスクで、一つ以上の子タスクを配下に持つことができます。名前からわかるように、シリアルコンテナタスクの子タスクはシリアルに実行できます。一方、並列コンテナタスクの子タスクは並列に実行できます。これらのコンテナタスクをお互いの入れ子にして、タスク階層内に複数のレベルをもたらすことができます。デプロイメントプランに従い、ODI 12cは、これらのシリアルならびにパラレルタスクの階層を生成し、セッションパラレル実行を実現します。以下はシリアルおよびパラレルタスク階層の一例です。


    マッピングセグメント(並列処理の候補)

    以下は、タスクが通常互いに独立しており同時実行できる一般的なマッピング部分の例です。
    1. ソースデータをステージングエリアにロードする
    2. データを複数のターゲット表にロードする
    3. I$表でフローコントロールを実行する
    これらは一般的な並行処理の候補エリアで、マッピングフロー次第では、並行処理できる他のエリアがあってもかまいません。上記の一般的な並列処理の候補の一つを例を見て、デプロイメントプランを微調整するとどのように振る舞いが変わるか見ていきましょう。

    ソースデータをステージングエリアにロード

    このマッピングではファイルとDBを結合し、ターゲット表にロードしています、ODIは次のデプロイメントプランを生成し、ソースをステージングエリアの コレクタ表(C$表)に並行ロードして結合し、シーケンシャルに実行する関連するタスクをターゲットで呼び出しています。


    デプロイメントプランを持つマッピング実行時にタスク階層を以下のように生成します。ここで以下のタスクセットが並列コンテナタスクで構成されていることがわかります。
    1. 各データソースに対応するC$表を削除・再作成するためのLKMのタスク
    2. 各C$表にデータをロードするLKMタスク


    これらのC$表を並列ロードせずにシーケンシャルにロードしたい場合には、実行単位を実行単位グループからドラッグ&ドロップして、デプロイメントプランを変更すればよいのです。これはつまり、各ソースデータセットが、全ての実行単位が直列で実行するように指定した別の実行単位グループを作成することになります。

    タスク階層を実行すると、以下のように全てのタスクが直列実行していることがわかります。


    並列タスクのスレッド構成

    ODI 12cランタイムはセッションの各並列タスクに対し、 個別のスレッドを生成します。これは、たくさんの並列化マッピングを実行すると数多くのスレッドがシステムリソースを使い切ってしまう可能性があることを意味します。ODIでは、物理エージェントの設定で、このような並列スレッドの個数を制御する2レベルの設定を提供しています。一つは、エージェント内のスレッドの最大数を制御するもの、もう一つはセッション内の最大スレッド数を制御するものです。新しいスレッドがこれらのスレッドの設定に応じて生成される場合にのみ、並列タスクを開始するため、これらの値は、十分に大きなレベルにしておく必要があります。


    並列タスクのための接続管理

    並列タスクの各々が個別のスレッドで実行されるので、任意の非トランザクショナルな動作のための共通コネクションで、並列タスクを実行してはいけません。それゆえ、だから、非トランザクショナルな操作を実行する場合、並列タスクが各々並列タスク用の接続を接続プールから取得します。そのため、複雑な並列マッピングの場合、並列処理のレベルに応じて、接続プールのサイズを適切に設定する必要があります。
    もう一つの注意すべきポイントは、各並列タスクが新しい自動コミット接続を取得するため、タスクが終了すると接続を閉じます。つまり、接続の開始・終了時時にOnConnect/OnDisconnectタスクが実行されます。それゆえ、並列タスクを持つマッピングに対し、複数のOnConnect/ OnDisconnectのタスクエントリが表示されることがあります。


    このような並列処理では、各々の並列タスクは、以前のタスクで実行されたすべてのオペレーションを知らない新しい接続を取得するため、任意の並列タスクは、以前のタスクで行われたデータベース接続内の任意の変化を頼ることはできません。

    トランザクション接続で実行されるオペレーションに対し、並列タスクは十分な柔軟性を持っておらず、一つずつオペレーションを実行する必要があります。このようなトランザクショナルな接続に対し、同期を維持して 唯一の並列実行がその接続でオペレーションを実行するようにしています。したがって、そのようなトランザクションに並列タスクを参加させると、同期のための余分なロック・アンロックが原因で、実際に性能が低下することがあります。

    まとめ

    ODI 12cはマッピング部分に並列処理を使うことで性能を向上させることができます。それは自動的にマッピング内で並列化可能な部分を識別するだけでなく、特殊な業務要件のために直列実行を実現するための柔軟性も持ち合わせています。このような並列処理の結果、パフォーマンスが向上しますが、さらに高いレベルの並列処理のために、接続プールとスレッド数をチューニングすることができます。

    より最新のOracle Data Integrationニュースを知りたい方は、@ORCLGoldenGate と @nmadhu2k3 のTweetをフォローして下さい。

    [Java] Optimized WebSocket broadcast

    原文はこちら。
    https://blogs.oracle.com/PavelBucek/entry/optimized_websocket_broadcast

    ブロードキャストはWebSocketのサーバーサイドのコードで最もよく使われるユースケースの一つです。そのため、WebSocket API for Javaの現行バージョンのユーザビリティを評価し、改善すべき点などを提案しようと考えています。

    ご注意頂きたいのは、このエントリはその目的から実験的なものだ、ということです。このエントリで述べるTyrusの機能を使うことはできますが、警告なしに変更される可能性があります。

    ブロードキャストについて語るにあたって、その定義をしましょう。メッセージをブロードキャストするとは、メッセージを接続している全てのクライアントに対し送信することを意味します。おわかりですよね?よくあるWebSocketのサンプルアプリケーションはチャットです(Tyrusも例外ではなく、./samples/chatにあります)が、まさにそのように動作します。クライアントがメッセージをサーバーのエンドポイントに送信すると、メッセージを全てのクライアントに再送信するため、全てのクライアントがメッセージを見ることができる、というわけです。

    認証・認可を無視した場合、サーバー側の実装は以下のように短くなります。
    @OnMessage
    public void onMessage(Session s, String m) throws IOException {
      for (Session session : s.getOpenSessions()) {
        session.getBasicRemote().sendText(m);
       }
    }
    
    これで十分動作しますし、期待通りの機能を提供します。基礎となるコードは接続された全てのクライアント向けのメッセージを処理する必要があります。そのため、送信対象のDataFrarmeをn回作成することになります(nは接続クライアントの個数を意味します)。現在のところ、全ては一つのデータフレームの作成に必要な処理時間に依存します。このオペレーションはそれほど高コストなものではありませんが、実際には多数回呼び出す必要があるにボトルネックになります。もう一つの重要な事実として、WebSocketの接続はステートレスゆえ、一度作成されたデータフレームを必要なだけ多くのクライアントに送信することができます。そのため、つまるところ、特にメッセージが全ての接続クライアントに対して同じである場合、データフレームを複数回作成する必要はないのです。

    WebSocket APIではコンシューマがデータフレームレベルのメッセージにアクセスすることを許しておらず、既に構築されたデータフレームを送信する手段も提供していません。この内容は仕様の次バージョンに取り込まれるかもしれません…が、今はできないのでしょうか?

    Tyrus (1.3以後)をお使いなら、同じユースケースの最適化版を試すことができます。
    @OnMessage
    public void onMessage(Session s, String m) {
      ((TyrusSession) s).broadcast(m);
    }
    org.glassfish.tyrus.core
    Class TyrusSession
    broadcast
    https://tyrus.java.net/apidocs/1.3/org/glassfish/tyrus/core/TyrusSession.html#broadcast%28java.lang.String%29 
    このようにすれば、データフレームを1回だけ作成してサーバー側のリソースを節約し、さらにクライアントはブロードキャストされたメッセージをより短期間に受信することでしょう。"broadcast"メソッドはMap<Session, Future<?>>を返します。この戻り値をどのメッセージがすでに送信されたか否かといった情報を取得するために使います。コールバック付きのバージョンはまだ利用できませんが、今後追加されるかもしれません(この機能が欲しいなら、users@tyrus.java.netにコメントを送って下さい)。

    Tyrusのブロードキャストを使った際の性能向上を確認する正確な計測結果はありませんが、特に接続しているクライアント個数が多い場合には特に著しいものになると思われます。
    (JDK8ユーザーへの注意:この最初のシナリオは、fork/joinフレームワークを使っても改善することができますが、現在のところ、TyrusはJava SE 7と使うことになっているので、このエントリでは意図して無視しています。)
    ご質問があれば、是非users at tyrus.java.netへお寄せ下さい。

    そしていつも通り、関連リンクを掲載しておきます。

    [Applications] Oracle’s Roadmap for Oracle Policy Automation Cloud Service Innovation - Live Webcast

    原文はこちら。
    https://blogs.oracle.com/emeapartnercrmod/entry/oracle_s_roadmap_for_oracle

    Oracle Policy Automation Agent Cloud ServiceとOracle Policy Automation Web Cloud Serviceの最新のイノベーションが、コンプライアンスをシンプルにしつつも、お客様に対しパーソナライズされたポリシー駆動の資格決定の提供にお役に立つところを知って頂きたいと思っています。

    是非2013年12月4日(水)13時(PST)、16時(EST)、22時(CET)からのWebcastに参加し、Oracle Policy Automationの最新のアップデートとロードマップがどのように皆様のお役に立つかを知って頂きたく思います。
    (訳注)日本時間では、2013年12月5日(木)6時からの開催です。
    • 戦略的なポリシー自動化のアプローチで利益を最大化するには
    • 最新のアップデートでシンプルな法令遵守のしくみを作るには
    • Oracle RightNow Cloud Serviceとの完全な統合を通じて、クロスチャネルで一貫性を担保するには
    ポリシーの管理を合理化して顧客に一貫性のある正確な意思決定を提供しつつ、同時にコンプライアンスのコストを削減するための方法を知るチャンスをお見逃しなく。
    登録はこちらからどうぞ。
    http://eventreg.oracle.com/profile/web/index.cfm?PKWebId=0x337265a9f&source=evite

    [OEPE] Distribution of GlassFish plugin for Eclipse

    原文はこちら。
    https://blogs.oracle.com/piotrik/entry/distribution_of_glassfish_plugin_for

    先週、GlassFishプラグインをjava.netのアップデートサイトから削除することを書きました。ひょっとするとあまり良くない言葉を使って記載していたかもしれません。というのも、Twitterでの反応によれば、多くの人がEclipse用のGlassFishプラグインが今後サポートがなくなるような印象を持たれたようだからです。これは意図とは違うので、エントリを書き直し、オリジナルのエントリを削除して誤解を招かないようにしました。
    Removing GlassFish plugin for Eclipse from java.net
    https://blogs.oracle.com/piotrik/entry/removing_glassfish_plugin_for_eclipse
    http://orablogs-jp.blogspot.jp/2013/11/removing-glassfish-plugin-for-eclipse.html
    GlassFishプラグインがOEPEチームに移管されてほぼ1年経ちました。直近のエントリで述べたように、これはOEPEチームの経験豊富なEclipseプラグインの開発者によるプラグインの開発でより品質をもたらすためになされたものです。また、OEPEは配布チャネルの量より質に注力したいので、プラグインを配布している3箇所のチャネルのうち一つを閉じたのであり、プラグインが廃止されるわけではありません。このことは前回のエントリでも明確だったと思っています。前年あったサポートは現在、そして今後も続きます。

    このプラグインは現在もOTNのOEPEサイトならびにEclipse Marketplaceからご利用頂けます。この問題がこれでよりクリアになることを願っています。そして混乱をさせてしまい申し訳ありません。
    Oracle Enterprise Pack for Eclipse
    http://www.oracle.com/technetwork/developer-tools/eclipse/overview/index.html
    GlassFish Tools for Kepler
    http://marketplace.eclipse.org/content/glassfish-tools-kepler#.UpilhY1JPfd

    [OEPE] Removing GlassFish plugin for Eclipse from java.net

    原文はこちら。
    https://blogs.oracle.com/piotrik/entry/removing_glassfish_plugin_for_eclipse

    (注意)
    プラグインに関する更新されたメッセージは以下のエントリをチェックして下さい。
    Distribution of GlassFish plugin for Eclipse
    http://blogs.oracle.com/piotrik/entry/distribution_of_glassfish_plugin_for
    先ほどのエントリに記載したように、公式バージョンのEclipseのGlassFishプラグインはOEPE製品の一部として配布されていますが、java.netではバグ修正ならびに機能強化を施した開発者ビルドを提供してきました。しかし今や、このチャネルを面倒見るためのリソースがありませんので、チャネルを終了することにしました。今後はOEPE OTNサイトで入手可能なGlassFishプラグインの公式バージョンのみになります。
    Oracle Enterprise Pack for Eclipse
    http://www.oracle.com/technetwork/developer-tools/eclipse/overview/index.html
    将来的には、OEPE OTNサイトの一部としてプラグインの非公式リリースのチャネルができるかもしれません。開発中に公開され利用可能になるGlassFishの新バージョンをサポートするために必要になると思っています。

    [JavaFX] JavaFX on Android multitouch and gestures support

    原文はこちら。
    https://blogs.oracle.com/jfxprg/entry/javafx_on_android_multitouch_and

    今週は短めに。とうとう、dalvik上でのイベント処理の問題を修正するための正しい道を進んでいるようです。この短い動画を公開したくてうずうずしています。この修正はまだリポジトリにプッシュしていません。

    [Linux] Oracle Linux 6.5

    原文はこちら。
    https://blogs.oracle.com/wim/entry/oracle_linux_6_5

    Oracle Linux 6.5(以下、OL6.5)がULN(Unbreakable Linux Network)とPublic Yumサーバーにアップロードされました。OL6.5にはLinux 3.8ベースのUEKr3(Unbreakable Enterprise Kernel)と2.6.32ベースカーネルが同梱されています。
    Unbreakable Linux Network
    http://linux.oracle.com
    Public Yum Server
    http://public-yum.oracle.com/repo/OracleLinux/OL6
    ISOイメージはMy Oracle Supportからダウンロードできます。また、E-Deliveryからのダウンロードは12月初旬頃から可能になる予定です。
    My Oracle Support
    http://support.oracle.com
    E-Delivery (Oracle Software Delivery Cloud - Oracle Linux and Oracle VM)
    http://edelivery.oracle.com/linux
    ISOイメージをパブリックな外部ミラーサイトにミラーリングしています。その一つは筆者の有する以下のサイトです。
    ISOイメージのミラーサイトの一つ…
    http://mirrors.wimmekes.net/pub/iso/
    リリースノートは以下のリンクからどうぞ。
    Oracle® Linux
    Release Notes for Release 6 Update 5
    https://oss.oracle.com/el6/docs/RELEASE-NOTES-U5-en.html

    [Hardware] Don't Miss the Oracle SuperCluster M6-32 Launch WebCast on December 4!

    原文はこちら。
    https://blogs.oracle.com/hardware/entry/oracle_supercluster_m6_32_launch


    Announcing oracle’s most powerful Engineered System for Oracle Database, database-as-a-Service and database and application consolidation

    2013年12月4日、Oracle SuperCluster M6-32という、インメモリOracle Databaseのパフォーマンスを要求されるお客様、Database as a Serviceやアプリケーション集約・統合をなさるお客様に適した、OracleでもっともパワフルなEngineered Systemを理解していただくためのお客様向けWebcastを開催します。
    OracleのJuan Loaiza(Senior Vice President, Oracle Exadata Development)、Ganesh Ramamurthy(Vice President, Oracle SuperCluster Development)、Michael Palmeter(Senior Director of Engineered Systems Product Management)がホストとなるこのWebcastでは、Oracle SuperCluster M6-32 がOracle Databaseの集約統合、Database-as-a-Service、インメモリアプリケーションの性能の最大化やミッションクリティカルなビジネスアプリケーションの集約統合に理想的である理由をご説明します。

    Ultimate In-memory database performance, Platform-as-a-Service and consolidation

    この新しいOracle SuperCluster M6-32は、Engineered Systemの中でも最高レベルの可用性、拡張性、信頼性を備え、インメモリデータベースやアプリケーションの前例のないパフォーマンスを叩き出します。OracleのExadata Storage ServerテクノロジーやSPARCプロセッサ、シリコンネットワーク、高度にセキュアな仮想化、標準で提供されるプラットフォームおよびdatabase-as-a-service管理を組み合わせ、Oracle SuperCluster M6-32 はこれまでの中で最高のOracleのEngineered Systemのビジョンを具現化しています。

    このWebcastに参加いただき、Oracle SuperCluster M6-32が皆様のお役にたつことをぜひ知っていただきたく思います。
    • 標準的なシステムに比べ、新しいインメモリアプリケーションやレガシーアプリケーション、Oracle Databaseで10倍から最大20倍性能が向上。その理由は…
      • 最大384コアと32TBもの高性能なメモリを、Oracleがこれまで開発してきたもっともパワフルかつ柔軟なシステムデザインに従って活用しています。
      • 最適なOracle Databaseの性能および効率のための完全なExadataテクノロジーを組み合わせています。
    • 限りなくオーバーヘッドがゼロに近い仮想化機能を備え、マルチテナント対応を実現します。
    • Platform-as-a-ServiceおよびDatabase-as-a-Service管理機能が標準で備わっています。

    開催日時

    2013年12月4日(水) 8時(PST)、11時(EST)、17時(CET)、16時(GMT)
    2013年12月5日(木) 1時(JST)

    時間

    Q&Aを含めて30分程度

    登録はこちらからどうぞ。
    https://event.on24.com/eventRegistration/EventLobbyServlet?target=registration.jsp&eventid=720514&sessionid=1&key=05E9E4F08BA8DE5DEB220C1CD934D432&partnerref=eblast1&sourcepage=register

    [Java] Jersey 2.x Tracing support

    原文はこちら。
    https://blogs.oracle.com/theaquarium/entry/jersey_2_x_tracing_capabilities

    Jerseyは完全にJSR 339に準拠している、JAX-RS 2.0の参照実装です。
    [訳注]
    厳密に言うと、Jersey 2.xがJAX-RS 2.0に対応した参照実装ですが、ここでは表現を原文に合わせています。
    Jersey - RESTful Web Services in Java
    https://jersey.java.net/
    JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services
    http://www.jcp.org/en/jsr/detail?id=339
    Jerseyチームは仕様の範囲を超える仕様や機能をJerseyに追加していますが、その中で、ある機能が標準化の対象になるかもしれません。クライアントAPIがその好例です。JAX-RS 1.xでは、Jerseyならびにその他の実装には個々の実装独自のクライアントAPIを備えています。JAX-RS 2.0では、クライアントAPIを標準化し、現在では仕様に加えられています。そのため、実装において、仕様に含まれる(まだ入っていない?)機能を入れることは珍しいことではありません。こうした拡張機能は、他の実装との差別化を図る手段です。

    TracingはJersey 1.xでは利用可能だった機能ですが、この機能がJersey 2.x (2.3以降)にポートされました。JerseyのTracing機能を使うと簡単にサーバー側のリクエスト処理パイプラインを診断できます。JersesyチームのLibor Kramolišが、Tracing機能の使い方について、詳細な情報をブログにUpしています。
    Jersey 2 - Tracing support (Yet Another Tech Blog)
    http://yatel.kramolis.cz/2013/11/jersey-2-tracing-support.html

    [Java] Brian Goetz Offers a View Into Lambda Development

    原文はこちら。
    https://blogs.oracle.com/java/entry/brian_goetz_offers_a_view

    Devoxx基調講演のあと、Java Chief Language ArchitectであるBrian GoetzがOTNのインタビューに答えています。ラムダ式の実装に非常に時間がかかった理由、そしてラムダ式が開発者に与える影響について語っています。

    [Support] Internet Explorer 7 (IE7) De-Supported as Certified Browser

    原文はこちら。
    https://blogs.oracle.com/proactivesupportIDM/entry/internet_explorer_7_ie7_de

    2014年4月4日から、My Oracle Support (support.oracle.com) およびCloud Support Portalで動作保証されたブラウザから外れ、Internet Explorer 7 (IE7)がサポート対象外になります。 これはお客様ならびにOracle社員に影響します。お客様にはIE7に関する変更のお知らせが届きますので、より高いバージョンのブラウザへ移行してくださいますよう、お願いします。

    お手数ですが、現時点でIE7をお使いであれば、ブラウザのバージョンアップをお願いします。My Oracle Supportで動作保証済みのサポートされているブラウザは、以下のリンクでご確認下さい。
    My Oracle Support Release 6.7
    Supported Browsers
    http://docs.oracle.com/cd/E25290_01/doc.60/e25224/registration.htm#MOSHP1467
    [注意]
    My Oracle SupportならびにCloud Support PortalでのIE11の動作確認が終了していないため、IE11へアップグレードされないことを推奨します。IE11のサポート開始は2014年1月31日を予定しています。

    [Java, Security] Upcoming Exception Site List in 7u51

    原文はこちら。
    https://blogs.oracle.com/java-platform-group/entry/upcoming_exception_site_list_in

    昨年来、多くの新しいセキュリティ関連の機能が実装されてきました。
    One Year of Security Enhancements in the JRE
    Aurelio Garcia-Ribeyro (Senior Group Product Manager, Oracle)
    https://oracleus.activeevents.com/2013/connect/fileDownload/session/FAD6825EC4D708FF5BC5FC3DCC891BDB/CON7799_AGarciaRibeyro.pdf 
    これらの機能の多くはAppletやWeb Startアプリケーション(RIA)のためのブラウザプラグインに関連するものでした。多くのエンドユーザーやソフトウェアベンダーが、環境およびアプリケーション利用時の設定方法を尋ねてきました。
    Exception Site List(例外サイトリスト)はエンドユーザーがアプリケーションホワイトリストを管理し、以前発表したセキュリティ要件にタイムリーに追随できないRIAを継続して使うための方法です。
    New security requirements for RIAs in 7u51 (January 2014)
    https://blogs.oracle.com/java-platform-group/entry/new_security_requirements_for_rias
    http://orablogs-jp.blogspot.jp/2013/11/new-security-requirements-for-rias-in.html
    Exception Site Listは、継続してRIAを利用する手段を提供しますが、ユーザーに対する全ての警告を取り除くことを意図しているものではありません。エンドユーザーはこれを使ったとしても重要なプロンプトを見ることになりますが、そうしたプロンプトはブロックしません。

    Comparison to Deployment Rule Set

    Exception Site Listは、RIAのホワイトリストを作成し、システム管理者への要求を減らします。
     Exception Site List Deployment Rule Set
     導入時期  Java 7 update 51
    (January 2014年1月)
    Java 7 update 40
    (2013年9月)
     対象 エンドユーザー システム管理者
    形式 プレーンテキスト 署名済みJARファイル
    両者が競合する場合どちらが優先するか Deployment Rule Setを優先
    標準ポリシーの適用のために、システム管理者はException Site Listの利用を別のコントロールパネル設定でロックダウンすることができます。

    Adding a site to the Exception Site List

    エンドユーザーはException Site ListにJavaコントロールパネルからアクセスすることができます。
    1. ブラウザを使っていつも使っているRIAにアクセスします。
    2. URLをアドレスバーからコピーします。
      このときディレクトリパスの/までを選択し、ファイル名は選択しないで下さい。
      • OK: https://www.example.com/someApplication/
      • NG: https://www.example.com/someApplication/filename.html
    3. Javaコントロールパネルを開きます。
      • Windows/Mac - システムコントロールパネルでJavaを選択します。
      • Linux/Solaris - javacplコマンドを実行します。
    4. セキュリティタブを選択します。
    5. 下部の"Manage Site List"(サイトリストの管理)ボタンをクリックします。
    6. 新しい画面が開きます。
      Screenshot of Exception Site List
    7. Add(追加)ボタンをクリックします。
      Screenshot of adding an exception site
      • OK: https://www.example.com/someApplication/
      • NG: https://www.example.com/someApplication/filename.html
    8. OKをクリックすると、画面が閉じます。暗号化されていないプロトコル(httpやfileなど)を使うと別のプロンプトが現れる場合があります。暗号化されたプロトコルを選択することで潜在的な中間者攻撃(Man In The Middle Attack)を防ぎます。
      Man In The Middle Attack (Back Track Linux)
      http://back-track-linux.blogspot.com/2012/11/man-in-middle-attack.html
    9. コントロールパネルに戻り、OKをクリックして画面を閉じます。
    10. ブラウザでWebページをリロードしてRIAを立ち上げます。

    Scaling distribution of the Exception Site List

    Exception Site Listがエンドユーザーが自身のException Site Listを管理する目的で用意されているとはいえ、ほとんどのソフトウェア設定の変更は自動化することができます。
    Exception Site Listを管理するファイルは、デプロイメント設定に記載されているように、ユーザーがデプロイした場所に格納されています。
    Deployment Configuration File and Properties
    http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/properties.html
    筆者のWindows 7の環境では、この場所は以下になっています。C:\Users\ecostlow\AppData\LocalLow\Sun\Java\Deployment\security\exception.sites
    フォーマットは1行ごとに1サイトです。

    Sample customer support note

    変更が導入されると、テクニカルサポートの担当者に対し詳細を尋ねるのが常なのですが、ダウンロード可能で、ちょっと調整してこの変更についてみなさまのお客様とお話する上で役立ててもらえるような、そんなテクニカルサポートノートを作成しているところです。本質的にはこのエントリの抜粋版で、How-toメッセージを強調したものです。

    [Java] Want JDK8 to be Great?

    原文はこちら。
    https://blogs.oracle.com/java/entry/want_jdk8_to_be_great

    JDK 8をすばらしいものにしたいですが?Dukeは、問題を発見するため「あなた」の力が必要です。JDK 8 B116 EAビルドがダウンロード・テストできるようになりました。
    JDK™ 8 Early Access Releases
    8 Build b117
    https://jdk8.java.net/download.html
    Java 8の開発が終了に近づくにつれ、テストや問題のレポートが必要です。そのため、是非皆様のCIビルドにJVMとしてEAビルドを追加し、アプリケーションを実行したり、ラムダ式と戯れてみて下さい。
    詳細情報やリソースは以下のURLからどうぞ。
    Adopt OpenJDK
    http://adoptopenjdk.java.net
    Java ChampionのMartijn Verburgはこのように言いました。「ラムダを早期に素晴らしいものにしたいなら、Java 8を今テストしましょう。そうすれば、『本当に』Javaコミュニティ全体が初日にすばらしいリリースを入手できるようになるのです。」

    [NetBeans, JavaScript] How to Forget Android Emulators Forever!

    原文はこちら。
    https://blogs.oracle.com/geertjan/entry/how_to_forget_android_emulators

    もうAndroidエミュレータを使う必要はありません。その代わり、CSSのスタイリングやJavaScriptのデバッグなどで、直接コードとデバイスのAndroidで直接やりとりできるのです。

    上の動画は僅かに2分30秒程度のもので、小さなAngularJSアプリケーションをサンプルとして使って、NetBeans IDE 7.4のすばらしいAndroid CSSスタイリング機能やJavaScriptのデバッグ機能をご紹介しています。

    [Java, JavaFX] JavaFX Integration Strategies

    原文はこちら。
    http://www.oracle.com/technetwork/articles/java/javafxinteg-2062777.html

    With lambda式と非同期通信のサポートにより、JavaFXはバックエンドサービスの新たな連携の可能性をもたらします。

    分断されたアプリケーションを企業内で見つけることはそうそうないでしょう。エンタープライズデスクトップアプリケーションは、アプリケーションサーバが公開する一つ以上のバックエンドサービスのデータをレンダリングし、操作します。古いSwingとJ2EEの時台は、通信は、一方向かつ同期型でした。 JavaFXとJava EE 6およびJava EE 7では、新たな同期、非同期、プッシュ、プル型といった様々なの連係戦略が導入されています。この記事では、JavaFXアプリケーションを使用してJava EEサービスを統合することに焦点を当てます。

    JavaFX Is Java

    JavaFXはJavaです。そのため、Swingアプリケーションのために使っているベストプラクティスはJavaFXに適用できます。バックエンドサービスとの統合はプロトコルにも技術にも依存しません。
    サービスには様々な設定(IPアドレス、ポート番号、プロパティファイル)が含まれています。APIのメソッドは、 java.rmi.RemoteException のようなプロトコル固有の例外をスローするため、無関係な詳細情報でプレゼンテーションロジックを汚すことがあります。プロプライエタリなサービスを囲む薄いラッパーは実装の詳細を隠蔽し、より意味のあるインターフェースを公開します。これは古典的なGoF(Gang of Four)のAdapterパターンです。
    Adapterパターン
    http://en.wikipedia.org/wiki/Adapter_pattern
    http://ja.wikipedia.org/wiki/Adapter_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

    Revival of the Business Delegate

    J2EEクライアントはバックエンドとの通信において、その昔はRMI-IIOP、その後はJAX-RPCやJAX-WSに大きく依存していました。どちらのAPIとも、厳密にチェックされた例外を使い、特定のテクノロジーに結びついています。プレゼンテーションロジックをプロトコルから分離する上で、Business Delegateパターンが必要でした。
    Core J2EE Patterns - Business Delegate
    http://www.oracle.com/technetwork/java/businessdelegate-137562.html
    "Use a Business Delegate to reduce coupling between presentation-tier clients and business services. The Business Delegate hides the underlying implementation details of the business service, such as lookup and access details of the EJB architecture."
    (Business Delegateを使って、プレゼンテーション層クライアントとビジネスサービス間の結合を減らします。Business Delegateは、EJBアーキテクチャの詳細の検索やアクセスのような、基盤となるビジネスサービスの実装の詳細を隠蔽します)
    Business Delegateはデフォルトケースでは実際のプロキシ、テスト環境ではMockオブジェクトを作成するファクトリを用いてよく拡張されました。最近のMockライブラリ、例えばMockitoを使うと、Business Delegateを直接Mockにすることができます。
    mockito - simpler & better mocking
    http://code.google.com/p/mockito/
    JavaFXおよびJava EEコンテキストにおけるBusiness Delegateを、実装の詳細を隠蔽し、JavaFXに対し使い勝手のよいインターフェースを公開するアダプタPOJOとして実装することができます。
    Figure 1
    Figure 1

    First Request, Then Response

    ブロッキングリクエストをアプリケーションサーバーに送信し、データの到着を待つというのは、最もシンプルなバックエンドとの統合方法です。Business Delegateはバックエンドと通信するサービスになります(コード1)。
    コード1
    import javax.json.JsonObject;
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.WebTarget;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    public class MethodMonitoring {
     
        private Client client;
    
        public void init() {
            this.client = ClientBuilder.newClient();
        }
        public MethodsStatistics getMethodStatistics(String application, String ejbName) {
            final String uri = getUri();
            WebTarget target = this.client.target(uri);
            Response response = target.
                    resolveTemplate("application", application).
                    resolveTemplate("ejb", ejbName).
                    request(MediaType.APPLICATION_JSON).get(Response.class);
            if (response.getStatus() == 204) {
                return null;
            }
            return new MethodsStatistics(response.readEntity(JsonObject.class));
        }
     }
    
    MethodMonitoring クラスは実装、テストが簡単で、プレゼンテーション層と統合が可能です。 getMethodStatistics メソッドは潜在的に無制限の時間ブロックすることが可能であるため、UIリスナー・メソッドからの同期呼び出しを使ってUIが応答しないようになります。

    Asynchronous Integration

    幸いにして、JAX-RS 2.0 APIでは非同期・コールバックベースの通信モデルもサポートしています。ブロッキングの代わりに、 getMethodStatistics メソッドはリクエストを開始し、コールバックを登録します(コード2)
    コード2
    import javax.json.JsonObject;
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.InvocationCallback;
    import javax.ws.rs.client.WebTarget;
    import javax.ws.rs.core.MediaType;
    import java.util.function.Consumer;
    
    public class MethodMonitoring {
        private Client client;
    
        @PostConstruct
        public void init() {
            this.client = ClientBuilder.newClient();
        }
    
        public void getMethodStatistics(Consumer<MethodsStatistics> consumer, Consumer<Throwable> error, 
        String application, String ejbName) {
            final String uri = getUri();
            WebTarget target = this.client.target(uri);
            target.
                    resolveTemplate("application", application).
                    resolveTemplate("ejb", ejbName).
                    request(MediaType.APPLICATION_JSON).async().get(new InvocationCallback<JsonObject>() {
                @Override
                public void completed(JsonObject jsonObject) {
                    consumer.accept(new MethodsStatistics(jsonObject));
                }
    
                @Override
                public void failed(Throwable throwable) {
                    error.accept(throwable);
                }
            });
        }
    }
    
    コールバックは返ってくる JsonObject をドメインオブジェクトに変換し、それを java.util.function.Consumer の実装に渡します。Business Delegateの実装はまだJavaFX APIから独立しており、Java 8の java.util.function.Consumer をコールバックとして利用します。Java 7では、任意のカスタムインターフェースやクラスをコールバックとして使うこことができますが、Java 8ではJavaFXのpresenterを劇的に簡素化することができます(コード3)。
    コード3
    ...
          this.methodMonitoring.getMethodStatistics(s -> onArrival(s), 
            t -> System.err.println(t), this.monitoredApplication, ejb);
    ...
        void onArrival(MethodsStatistics statistics) {
            Platform.runLater(() -> {
                this.methodStatistics.clear();
                this.methodStatistics.addAll(statistics.all());
            }
            );
        }
    
     java.util.function.Consumer をlambda式として実装することができます。これにより、コード量を大きく削減できます。JavaFXはシングルスレッドのUIツールキットゆえ、非同期でマルチスレッドからアクセスすることはできません。
     java.lang.Runnable インターフェースのlambda実装を Platform.runLater メソッドに渡し、後の実行のためにイベントキューに追加しています。Javadocには以下のような記述があります。
    "Run the specified Runnable on the JavaFX Application Thread at some unspecified time in the future. This method, which may be called from any thread, will post the Runnable to an event queue and then return immediately to the caller. The Runnables are executed in the order they are posted. A runnable passed into the runLater method will be executed before any Runnable passed into a subsequent call to runLater."
    (将来のある時間に、JavaFXアプリケーションのスレッドで指定されたRunnableを実行します。任意のスレッドから呼び出される可能性があるこのメソッドは、イベントキューにRunnableをエンキューし、呼び出し元にすぐに戻ります。RunnableはQueueに入った順序で実行されます。runLaterメソッドに渡されたRunnableは、runLaterへの後続の呼び出しに渡されたRunnableの前に実行されます)
    Platform#runLater メソッドは長時間実行するタスクには適切ではありません。非同期スレッドからのJavaFX UIコンポーネントのアップデートのためだけに使うべきです。

    Tasks for Real Work

    Platform.runLater は「重労働」の実装を目的としているのではなく、JavaFXノードの高速なアップデートを目的としています。長時間実行されるメソッドの非同期呼び出しは、スレッドの作成が必要で、これをJavaFXの javafx.concurrent.Task クラスでネイティブにサポートしています。 TaskWorker および EventTarget インターフェースを実体化し、 java.util.concurrent.FutureTask クラスから継承するため、JavaのスレッドとJavaFXのイベント機構の間のブリッジと見なすことができます。 Task を直接 普通の Runnable として Thread が利用することも、 Callable として ExecutorService に渡すこともできます。どちらの場合も、非同期実行の機能を持たない同期Java EE API、例えばIIOPをBusiness Delegteで最初にラップできます。
    コード4
    public class SnapshotFetcher{ 
    ...
        public Snapshot getSnapshot() {
            return fetchFromServerSynchronously();
        }
    ...
    
    次に、ブロッキングBusiness Delegateメソッドを Task でラップすると、ようやく非同期実行が可能になります。
    コード5
    Task<Snapshot> task = new Task<Snapshot>() {
                @Override
                protected Snapshot call() throws Exception {
                    SnapshotFetcher fetcher = new SnapshotFetcher();
                    return fetcher.getSnapshot();
            };
    
    TaskRunnable であり Future なので、直接 Thread が実行することも、 Executor に渡すこともできます。JavaFXはシームレスにバインド可能なプロパティを使用してUIとスレッドを統合する javafx.concurrent.Service クラスが付属しています。
    Service は、実際には Task ファクトリです。
    コード6
    import javafx.concurrent.Service;
    import javafx.concurrent.Task;
    import org.lightview.model.Snapshot;
    
    public class SnapshotProvider extends Service<Snapshot> {
      @Override
        protected Task<Snapshot> createTask() {
            return new Task<Snapshot>() {
                @Override
                protected Snapshot call() throws Exception {
                    SnapshotFetcher fetcher = new SnapshotFetcher();
                    return fetcher.getSnapshot();
                };
            };
        }
    }
    
    Service の状態だけでなく Task の実行結果も、バインド可能なJavaFXプロパティとして利用可能です。
    コード7
    this.service = new SnapshotProvider();
            service.start();
            service.valueProperty().addListener(
                    (observable,old,newValue) ->{
                    //process new value
                        });
    
    Task クラスは、同期型レガシーリソースの非同期統合、または単にクライアント側で長時間実行プロセスを起動するための便利な手段です。

    Blocking for Asynchronicity

    Cometとロング・ポーリングはブラウザを用いてHTTPベースのプッシュ通信のシミュレーションのための美しくないHackです。
    Comet
    http://en.wikipedia.org/wiki/Comet_%28programming%29
    HTTPはリクエストーレスポンスプロトコルゆえ、レスポンスはリクエストに対する回答として送信することができます。そのため、最初のリクエストがないのにHTTPを介してブラウザにデータをプッシュすることはできません。ロングポーリングの通信スタイルは実装が簡単です。ブラウザは、サーバーがブロックしている接続を開始します。サーバはブロッキング通信を使ってデータをブラウザに送信し、直ちに接続を閉じます。ブラウザはデータを処理し、サーバを使って後続のブロッキング接続を再開します。何も伝えることがない場合、サーバはブラウザに対しリクエスト204を送信します。
    それゆえ、HTTP通信に限定されずに、JavaFXアプリケーションはスタンドアロンJavaアプリケーションとして企業内に展開されますが、多くの場合、RESTエンドポイントは、HTML5のクライアント用に利用可能であり、JavaFXアプリケーションが直接再利用することも可能です。RESTおよびJSONは、HTML5クライアントやJavaアプリケーション、そして低レベルデバイスとの通信のための新しい最小公分母になっています。
    JavaFXアプリケーションは直接ロングポーリングに参加することができ、HTML5クライアントと同じ方法で通知することができます。同期通信とロング・ポーリングの唯一の違いは、ブロッキング呼び出しを繰り返し開始する点です。定期的なポーリングを直接 javafx.concurrent.Service で実装できます。実行の成功・失敗にかかわらず、サービスをリセットし、その後再起動します。
    コード8
    javafx.concurrent.Service service = ...;
        void registerRestarting() {
            service.stateProperty().addListener((observable,oldState,newState) -> {
                    if (newState.equals(Worker.State.SUCCEEDED) ||
                            newState.equals(Worker.State.FAILED)) {
                        service.reset();
                        service.start();
                }
            });
        }
    

    Push Integration

    プッシュ通信は、リクエスト部分のないリクエスト・レスポンス型の通信スタイルです。アプリケーション·サーバーは、いつでもデータをプッシュすることができます。Java Message Service(JMS)やWebSocket、メモリ·グリッドは、fire-and-forgetスタイルの通知メカニズムを備えており、簡単にJavaFXと統合することができます。
    JSR 356はJava EE 7に含まれるWebSocketプロトコルを実装しており、JavaクライアントAPIを備えています。WebSocket仕様では双方向バイナリプロトコルを導入し、UIクライアントとの統合にぴったり適しています。
    JSR 356: JavaTM API for WebSocket
    http://www.jcp.org/en/jsr/detail?id=356
    WebSocketメッセージはバイナリもしくはテキストをとることができ、コード9のようにEndpoint サブクラスを使ってメッセージを受信します。
    コード9
    import javafx.application.Platform;
    import javafx.beans.property.SimpleObjectProperty;
    import javax.websocket.Endpoint;
    import javax.websocket.EndpointConfig;
    import javax.websocket.MessageHandler;
    import javax.websocket.Session;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Unmarshaller;
    import java.io.StringReader;
    
    public class SnapshotEndpoint extends Endpoint {
    
        private SimpleObjectProperty<Snapshot> snapshot;
        private final Unmarshaller unmarshaller;
        private JAXBContext jaxb;
    
        public SnapshotEndpoint() {
            try {
                this.jaxb = JAXBContext.newInstance(Snapshot.class);
                this.unmarshaller = jaxb.createUnmarshaller();
    
            } catch (JAXBException e) {}
            this.snapshot = new SimpleObjectProperty<>();
        }
    
        @Override
        public void onOpen(Session session, EndpointConfig ec) {
            session.addMessageHandler(new MessageHandler.Whole<String>() {
                @Override
                public void onMessage(String message) {
                    final Snapshot current = deserialize(message);
                    Platform.runLater(() ->
                            snapshot.set(current));
                }
            });
        }
        Snapshot deserialize(String message) {
            try {
                return (Snapshot) unmarshaller.unmarshal(new StringReader(message));
            } catch (JAXBException e) {}
        }
    }
    
    SnapshotEndpoint クラスは文字列のメッセージを受け取り、Java Architecture for XML Binding (JAXB) APIを使って変換します。
    JSR 222: JavaTM Architecture for XML Binding (JAXB) 2.0
    http://jcp.org/en/jsr/detail?id=222
    Snapshot ドメインオブジェクトはアノテーションの付いたPOJOです。
    コード10
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Snapshot {
     //...arbitrary fields
        private long id;
    }
    
    JSR 356 APIは拡張機能をサポートしているため、シリアル化と逆シリアル化を専用のクラスに分解することができます。また、我々は、JAXBに限定していないので、JSONやシリアライズといった任意の利用可能なオブジェクト表現を利用できます。 SnapshotEndpoint はWebSocketの専用スレッドによってクライアント側で実行されるので、メッセージを使ってUIだけを更新することはできません。Platform.runLater メソッドを使い、メッセージを適切にWebSocketからJavaFXのスレッドに渡します。
    Endpoint は、実際の通信のみを担当しています。さらに、WebSocketのコンテナは、専用クラスに実装されているものに対する初期設定と初期化が必要です。
    コード11
    public class SnapshotSocketListener {
        private SnapshotEndpoint endpoint;
        private Session session;
    
        public SnapshotSocketListener() {
            this.endpoint = new SnapshotEndpoint();
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            ClientEndpointConfig config = ClientEndpointConfig.Builder.create().build();
            String uri = "ws://localhost:8080/lightfish/snapshots/";
            try {
                session = container.
                connectToServer(this.endpoint, config, URI.create(uri));
            } catch (DeploymentException | IOException e) {
                throw new IllegalStateException("Cannot connect to WebSocket: ", e);
            }
        }
    
        public ReadOnlyObjectProperty<Snapshot> snapshotProperty() {
            return endpoint.snapshotProperty();
        }
    
        @PreDestroy
        public void disconnect() {
            try {
                session.close();
            } catch (IOException e) {
            }
        }
    }
    
    これまでのところ、我々はほとんどJavaFXの統合機能を使用していません。その代わりに、様々な統合のスタイルに焦点を当ててきました。しかし、JavaFXのプロパティを使うと、同期および非同期の統合が、特に興味深いものになります。

    Integration the JavaFX Way

    javafx.beans.property.ObjectPropertyObject インスタンスをラップしており、バインド可能です。関心のあるクライアントがリスナーとして登録したり、直接プロパティにバインドしたりすると、ラップされたインスタンスが置き換わった場合に通知を受け取ることができます(Java Magazineの記事"JavaFX Data Binding for Enterprise Applications"の"Binding for Narrow Interfaces"の章を参照してください)。
    JavaFX Data Binding for Enterprise Applications
    http://www.oraclejavamagazine-digital.com/javamagazine/20130910?pg=53&pm=1&u1=texterity&linkImageSrc=/javamagazine/20130910/data/imgpages/tn/0053_rzzace.gif/%20-%20pg53#pg53
    通信プロトコルや同期・非同期に関係なく、レスポンスは、UIが表示するドメインオブジェクトを伝達します。ObjectPropertyを使って、UIは直接値とバインドすることができ、データ到着時には自動的に通知を受け取ることができます。プレゼンターは直接ObjectPropertyにバインドするので、追加の管理手法は不要です。
    コード12
    this.snapshotSocketListener.snapshotProperty().
            addListener((o, oldValue, newValue) -> {
                snapshots.add(newValue);
                onSnapshotArrival(newValue);
            });
    
    バインド可能な ObjectProperty を使うと、大幅にシンプルになり、インターフェイスが顕著に「狭く」なります。バインディングをアウトバウンド通信に適用することもできます。プレゼンターは、ドメインオブジェクトもしくはモデルの状態を変更すると、サービス(Business Delegate)の通知を引き起こします。アウトバウンド通信は、UIスレッドとの同期は不要です。非同期操作も直接UIスレッドから実行することができ、長時間実行する操作を javafx.concurrent.Service でラップすることも、Business Delegate内で非同期実行することもできます。しかし、すべてのUI操作がドメインオブジェクトの状態を変更するわけではありません。「保存」や「リフレッシュ」といった簡単なユーザーアクションをBusiness delegateメソッド呼び出しに直接変換することができます。

    One Step Further for Responsiveness and Simplicity

    JavaFXのUIはイベント駆動で非同期です。また、JAX-RS 2.0や、JMS、WebSocketなどのJava EE 7 APIは非同期機能を有しています。JavaFXを非同期のJava EE 7 APIと一緒に使うと、大幅にコードがシンプルになります。すべてのBusiness Delegateの操作は、UIあるいはBusiness Delegate自体をブロックせずに非同期に実行することができます。インタラクションパターンは、通信プロトコル非依存であり、すべての非同期Java EE 7 APIで一貫して適用できます。

    リクエストは、 "fire-and-forget"方式でサーバーに送信されます。応答を待つのではなく、コールバックメソッドを応答処理のために登録します。コールバックは、データを受信し、ドメインオブジェクトを移入し、 Platform.runLater メソッド内の ObjectProperty#set を使って現在のドメインオブジェクトを置き換えます。ドメインオブジェクトへの変更は、プレゼンターに伝達されます。このとき、任意の関心のあるビューに対する変更をマルチキャストで通知します。
    完全非同期通信にすると、大幅に必要なコードの量を減らすことができます。データバインディングを伴う双方向fire-and-forgetアプローチを使用すると、サーバ側での一時的なモデルとマスタ状態との間でデータの同期が不要になります。すべてのアクションは、直接Business Delegateに渡され、アプリケーションサーバからのすべてのレスポンスによって直接UIが更新されます。
    また、完全非同期のインタラクションにすると、ユーザーエクスペリエンス(UX)を大幅に改善することができます。サーバー側のインタラクションがどれほど高コストであったとしても、UIがブロックされることはありません。

    結論

    一見すると、バックエンドサービスとのJavaFXの統合はSwingに非常に似ています。 Platform#runLaterjavax.swing.SwingUtilities#invokeLater と同等であり、 javafx.concurrent.Service の目的と javax.swing.SwingWorker は類似しています。

    近代的なJava EE7 APIやJavaFXデータ・バインディング("JavaFX Data Binding for Enterprise Applications"をご覧下さい)、FXMLとScene Builderを使った制御機能の反転("Integrating JavaFX Scene Builder into Enterprise Applications"をご覧下さい)を使うと、大幅にプレゼンテーションロジックを簡素化し、マルチビューデスクトップアプリケーションを実装するための一貫したアプローチを導入することができます。
    JavaFX Data Binding for Enterprise Applications
    http://www.oraclejavamagazine-digital.com/javamagazine/20130910?pg=53&pm=1&u1=texterity&linkImageSrc=/javamagazine/20130910/data/imgpages/tn/0053_rzzace.gif/#pg53
    Integrating JavaFX Scene Builder into Enterprise Applications
    http://www.oraclejavamagazine-digital.com/javamagazine/20130506/?pg=75&pm=1&u1=friend%20-%20pg75#pg75 
    Java EE 6およびJava EE 7ベースのバックエンドシステムであれば、プレゼンテーション層だけでなく、サーバーサイドでも継続して非同期通信のスタイルを利用することができます。

    参考資料

    著者について

    コンサルタントである著者のAdam Bienは、Java EE 6、Java EE 7、EJB 3.x、JAX-RS、JPA 2.x JSRのExpert Groupメンバーです。
    Adam Bien's Blog
    http://www.adam-bien.com/roller/abien/ 
    JDK 1.0の頃からJavaテクノロジーに関わり、Servlet/EJB 1.0を経て、現在はJava SEおよびJava EEプロジェクトのアーキテクトであり、開発者です。Java FX、J2EE、Java EEに関する書籍を執筆しており、Real World Java EE Patterns - Rethinking Best PracticesとReal World Java EE Night Hacks - Dissecting the Business Tierの著者でもあります。
    Real World Java EE Patterns—Rethinking Best Practices
    http://realworldpatterns.com/
    Real World Java EE Night Hacks—Dissecting the Business Tier
    http://press.adam-bien.com/real-world-java-ee-night-hacks-dissecting-the-business-tier.htm
    AdamはJava Championにして、Top Java Ambassador 2012、JavaOne 2009、2011、2012 Rock Starでもあります。Adamはミュンヘン空港でのJava EEワークショップを時々開催しています。
    Java EE Workshops with Adam Bien at MUC Airport
    http://airhacks.com