2013年12月22日

[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!

    2013年12月20日

    [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
    以下のリンクをクリックしてチートシートをダウンロードしてください。何かエラーが起きたり、このような資料をもっと見たいという方は、ぜひフィードバックください。

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

    2013年12月19日

    [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() システムコールの呼び出しが成功する可能性があります。もしだめな場合は、システムの再起動が必要です。

    2013年12月15日

    [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

    2013年12月14日

    [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
    心にとどめて頂きたいのですが、これは基本的なサポートしかしないモジュールです。まだまだ改善の余地があると思っています。


    2013年12月13日

    [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)

    2013年12月11日

    [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

    2013年12月10日

    [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

    2013年12月9日

    [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

    2013年12月6日

    [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や他社製品など)はエンタープライズレベルの監視・管理、アラート発信に適したものです。

    2013年12月5日

    [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のための標準やオープンなエコシステムを推し進める上での共同作業をする、という私たちのコミットメントを知らせるものです。この分野活躍されていてまだ我々と接触されていない場合、もしくは関心があってもっと知りたいというのであれば、ぜひご連絡ください!

    2013年12月4日

    [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のエントリ

    2013年12月3日

    [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のサンプルが掲載されています。

    2013年12月2日

    [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へお寄せ下さい。

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