2013年11月30日

[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

2013年11月29日

[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上でのイベント処理の問題を修正するための正しい道を進んでいるようです。この短い動画を公開したくてうずうずしています。この修正はまだリポジトリにプッシュしていません。

2013年11月28日

[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

2013年11月27日

[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のインタビューに答えています。ラムダ式の実装に非常に時間がかかった理由、そしてラムダ式が開発者に与える影響について語っています。

2013年11月26日

[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コミュニティ全体が初日にすばらしいリリースを入手できるようになるのです。」

2013年11月24日

[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

2013年11月23日

[JavaScript, Mobile] How to Deploy and Debug AngularJS on the Android Device

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

新しいAndroid、Android 4 (Ice Cream Sandwich) を購入し、(エミュレータではなく)実際のAndroidデバイスにNetBeans IDEからAngularJSアプリケーションをChrome Browserにデプロイし、デバイス上でアプリケーションをデバッグして整えました。つまり、エミュレータではなくAndroid自身のChromeブラウザで実施した、ということです。
Introducing Android 4.0
http://www.android.com/about/ice-cream-sandwich/
NetBeans IDEのHTML/JavaScript/CSSアプリケーションを右クリックして実行します。ツールバーでドロップダウンし、USBでコンピュータとつながっているAndroidデバイスのChromeブラウザにデプロイしたいアプリケーションを指定します。USBデバッグのスイッチをONにしておきましょう。もしくは、プロジェクトプロパティダイアログを使ってプロジェクト毎に実施しましょう。これで必要な作業は終了です。NetBeans IDEがアプリケーションをAndroidデバイスのChromeブラウザにデプロイします。デバイスであれエミュレータであれ、たった1クリックだけです。Androidデバイス上のアプリケーションはエミュレータのアプリケーションを見るよりもずっと素敵だと申し上げなければなりません。さらに、ずっと高速でもあります。Genymotionよりも高速でさえあります。
YouTube: Dream Team = Genymotion, Cordova, and NetBeans IDE
https://blogs.oracle.com/geertjan/entry/youtube_dream_team_genymotion_cordova
こちらがデバイスにデプロイしたアプリケーションです(もちろんAngularJSです。AngularJSはHTML/JavaScript/CSSの将来像であると思わずにはいられないのです。本当にすばらしい)。新しいNetBeansプラグインとして統合されているDroid@Screenを使っているため見ることができます。ここでご覧頂いているように、NetBeans IDEに直接組み込まれるように仕上げました。
Droid@Screen
http://droid-at-screen.ribomation.com/Droid@Screen - plugin detail
http://plugins.netbeans.org/plugin/51818/?show=true

Droid@Screen (上図はNetBeans IDEにプラグインとして組み込まれたもの、下図は別のアプリケーションとしての図)はAndroidデバイスに接続すると、(例えば、コンファレンスで)モノをグループに見せる時に、手に持っているデバイス上に出ているものを手軽に見せることができます。

ここでも、エミュレータをご覧にただいるわけではないことにご注意下さい。そうではなく、Androidデバイス上で見ているものの1対1の投影をご覧頂いているのです。つまり、物理的宇宙で質量と存在感を持つ、同じ実際のデバイスです。現実の世界で購入したものです。

そして、すぐ一つ上のスクリーンショットで、Droid@Screenでご覧頂けるように、Androidデバイスで描画されている、ブラウザのDOMウィンドウの特定のアイテム上にマウスがあることがわかります。非常にクールです。マウスを上下に動かすと、IDEにライブでDOMが表示され、現在選択されている項目が手の中のAndroidデバイスの背後にあるIDEで見ることができます。また、Androidにデプロイされたアプリケーションを見たり、色などをIDEで調整したり、すぐにAndroid上で変更を確認したりできます。それは、IDEに保存した内容で、IDEからAndroid上のブラウザを更新させるからです。

続いて上図では、JavaScript、つまり作成したAngularJSのコードをステップ実行できる様子をご覧頂いていますが、このようにAndroidで起こっている描画をDroid@Screenを目で見て確認できます。コンファレンスやプレゼンテーションでは、実際のAndroidデバイス上に描画されるものを表示する目的でご覧になることでしょう。
ここまでご覧いただいた内容は全て今すぐ始めることができます。しかも無料です。NetBeans IDE 7.4をダウンロードしインストールしていれば、ね。
NetBeans IDE 7.4 ダウンロード
https://netbeans.org/downloads/
この内容の詳細を含めて、来週のアムステルダムで開催されるDroidConで披露する予定です。この件については操縦にYouTubeに動画もUpする予定です。
DroidCon NL 2013
http://www.droidcon.nl/

2013年11月21日

[Java] New book: RESTful Java with JAX-RS 2.0

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

Bill Burkeの RESTful Java with JAX-RS は、JAX-RSについて語る際には思い出す書籍です。数年前O'Reillyから動物本の一つとして出版されました。
The Animal Menagerie
http://oreilly.com/animals.html
Billは長きにわたりJBossのコントリビュータで、JAX-RS 2.0 ExpertグループのRed Hatの代表でもあります。
JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services
http://jcp.org/en/jsr/detail?id=339
O'Reillyはこのたび、この本の改訂版を出版し、その中で新しいJAX-RS 2.0の機能を含めました。
My new book! RESTful Java with JAX-RS 2.0 (Bill the Plumber)
http://bill.burkecentral.com/2013/11/12/my-new-book-restful-java-with-jax-rs-2-0/
RESTful Java with JAX-RS 2.0 はJAX-RS 2.0 クライアントAPI、非同期クライアント/サーバーAPI、FilterやInterceptorといった重要な追加仕様を取り扱う章を新たに設けています。
RESTful Java with JAX-RS 2.0, 2nd Edition
Designing and Developing Distributed Web Services
http://shop.oreilly.com/product/0636920028925.do
さらに、新版では、ParamConverter、UriBuilder拡張などのそれほど大きくないJAX-RS 2.0のアップデートも取り扱っています。


[訳注]
AmazonではKindle版が発売されていますね。書籍版は2013年11月26日発売予定のようです。

[JavaOne] More JavaOne Sessions Online

原文はこちら。
https://blogs.oracle.com/javaone/entry/more_javaone_sessions_online

オンラインでご覧いただけるJavaOneセッションの個数が増えました。HadoopからM2M、Minecraftにいたるまで、これらのセッションで最高の技術情報を入手できることでしょう。先頃公開されたもののうちでお気に入りなのは、Markus EiseleによるThe Seven Deadly Sins of Java EE Projectsです。
JavaOne sessions
http://www.oracle.com/javaone/sessions/index.html
JavaOneモバイルアプリケーションをParleysからダウンロードし、JavaOneセッションをオンライン、オフラインのどちらででも閲覧することができます。
JavaOne 2013 (for iPad)
https://itunes.apple.com/us/app/javaone-2013/id734548444JavaOne 2013 (for Android)
https://play.google.com/store/apps/details?id=com.parleys.android.javaone2013
年末までに新たなコンテンツを展開する予定ですので、最新のコンテンツをチェックしておいて下さい。すべて無料で、Oracleが提供しています。

[訳注]
以前オンラインコンテンツをご紹介したエントリはこちら。
http://orablogs-jp.blogspot.jp/2013/10/javaone-2013-sessions-online.htmlhttps://blogs.oracle.com/javaone/entry/javaone_2013_sessions_online

2013年11月20日

[Java] JDK 7u45, AWS Issue 123 and JAXP00010001

原文はこちら。
https://blogs.oracle.com/joew/entry/jdk_7u45_aws_issue_123

github [1]やJava Technology & XML Forum[2]で報告されているような問題に直面した場合には、パッチが次回のアップデートで出てくる前の現時点では、JDK-8028111 [3]に投稿されている回避策が有用でしょう。
この問題は、GitHubのレポートスレッドで議論されている通り、新しいXMLSecurityManagerが誤って各ドキュメント毎のパースではなく、プロセス全体にカウンターを適用していたというものです。しかし、XMLSecurityManagerで上限を無効にするという回避策はお勧めできません。その理由は、まず、他の保護も同様に無効になるでしょうし、2つめには、XMLSecurityManagerは、JDKの内部で利用されるものであり、将来変更される可能性があるためです。上限を無効にしたい場合には、システムプロパティのjdk.xml.entityExpansionLimitを0にするほうがよいでしょう。

JAXP Tutorial[4]で説明しているように、上限を変更する方法には3個あります。例えば、次の設定でentityExpansionLimitを500,000に増加させることができます。
inputFactory.setProperty(JDK_ENTITY_EXPANSION_LIMIT, "500000");
ここで、
JDK_ENTITY_EXPANSION_LIMIT = "http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit"
です。
適切な上限を見積もる上で、getEntityCountInfoは有用かもしれません。詳細はJAXP Tutorial[4]を参照してください。

そして次の設定は、jdk.xml.entityExpansionLimitに0を設定するのと同じ効果があります:
inputFactory.setProperty(JDK_ENTITY_EXPANSION_LIMIT、"0");
コード変更を必要とする以外は、XMLSecurityManagerの設定の場合と同じです。コード変更が可能であれば、JDK-8028111(ファクトリのリフレッシュ)で記載されている2番目の回避策のほうがよりよいでしょう。理由は処理を続行できるようにしながら、全ての保護を無効にする必要がないからです。

[1] Exceptions on SQS result kill the http-client in the SDK
https://github.com/aws/aws-sdk-java/issues/123
[2] StAX XMLInputFactory cannot create more than 64000 readers [JDK 1.7.0_45]
https://forums.oracle.com/thread/2594170
[3] XML readers share the same entity expansion counter
https://bugs.openjdk.java.net/browse/JDK-8028111
[4] Using the Limits (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/jaxp/limits/using.html

[Linux] Extending Your Use of DTrace on Oracle Linux

原文はこちら。
https://blogs.oracle.com/OTNGarage/entry/doing_more_with_dtrace_on

Oracle Linux上でのDtraceの利用に関する新しい記事を発行しました。まだOracle Linuxで使えるDTraceをご存知ない方は以下でご紹介する2個の記事から当たってみるのはいかがでしょうか。

Blog: Trying Out DTrace (Wim Coekaerts)
https://blogs.oracle.com/wim/entry/trying_out_dtrace

2011年10月にWim CoekaertsがDTrace on Oracle Linuxのプレビュー版を利用する際に必要な手順と利用方法の簡単な例をご紹介しました。

Blog: How to Get Started Using DTrace on Oracle Linux (Rick Ramsey)
https://blogs.oracle.com/OTNGarage/entry/how_to_get_started_using

2013年1月、DTrace on Linuxを利用し始める上で役に立つ最近利用可能になったリソースをご紹介しました。これらにはBrendan Greggの動画インタビュー、Oracle Linuxで利用可能なDTraceプローブを見つける方法、技術記事、書籍などが含まれています。

New Article: How to Set Up DTrace to Detect PHP Scripting Problems on Oracle Linux (Christopher Jones)
http://www.oracle.com/technetwork/articles/servers-storage-admin/php-dtrace-linux-2062229.html

Christopher JonesがOTN技術記事を発表しました。この記事ではDTraceをセットアップし、Oracle LinuxでのPHPスクリプトの問題を検出する方法を紹介しています。Oracle Linuxの正しいバージョンのインストール方法、PHP、Oracle DatabaseのOCI8エクステンションのインストール方法、PHPプローブの検証方法、PHP OCI8とDTraceの利用開始方法を紹介しています。

[Java, JavaScript] AngularJS Meets Java EE 7!

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

AngularJSを使ってJava EE 7 RESTful Webサービスが公開しているデータを閲覧するという簡単なデモをご紹介しましょう。
AngularJS
http://angularjs.org/

2013年11月19日

[Virtualization] Oracle VM Integrated from Application to Disk

原文はこちら。
https://blogs.oracle.com/virtualization/entry/oracle_vm1

タイムリーにITサービスを提供することはスタック全体のインテグレーションを必要とします。これはサーバーやOS間だけのことではありません。Oracle VMはテクノロジースタックの全レイヤー、アプリケーションからディスクまで統合されています。
Oracle VMのこうした完全かつコスト効率のよい、x86およびSPARCアーキテクチャ向けのソリューションを活用する方法を学ぶため、対応するトレーニングコースの受講をご検討下さい。
これらのコースは、ライブバーチャルイベントでの受講もしくはトレーニングセンターでの受講を選択できます。以下は各コースのトレーニングセンターでの講習スケジュールです。

Oracle VM Administration: Oracle VM Server for x86
 Location
 Date
 Delivery Language
 Prague, Czech Republic
 24 March 2014
Czech 
 Paris, France
 26 February 2014
 French
 Rome, Italy
 22 April 2014
 Italian 
 Riga, Latvia
 3 February 2014
  Latvian 
 Oslo, Norway
 9 December 2013
 English
 Warsaw, Poland
 12 February 2014
 Polish
 Porto, Portugal
 4 December 2013
 European Portuguese
 Ljubljana, Slovenia
 25 November 2013
 Slovenian
 Istanbul, Turkey
 23 December 2013
 Turkish
 Cairo, Egypt
 1 December 2013
 Arabic
 Johannesburg, South Africa
23 December 2013 
 English
 Singapore
 27 November 2013
 English
 Melbourne, Australia
 12 February 2014
 English
 Sydney, Australia
 25 November 2013
 English
 Montreal, Canada
 18 February 2014
  English 
 Ontario, Canada
 18 February 2014
 English
 Toronto, Canada
 27 May 2014
 English
 Phoenix, AZ, United States
 18 February 2014
  English 
 Sacramento, CA, United States
 18 February 2014
 English
 San Francisco, CA, United States
 18 February 2014
 English
 San Jose, CA, United States
 18 February 2014
 English
 Denver, CO, United States
 22 January 2014
 English
 Roseville, MN, United States
 9 December 2013
  English 
 Edison, NJ, United States
 18 February 2014
 English
 Columbus, OH, United States
  3 February 2014  
 English 
 King of Prussia, PA, United States
 18 February 2014
 English 
 Reston, VA, United States
 26 March 2014
English 

Oracle VM Server for SPARC: Installation and Configuration
 Location
 Date
 Delivery Language
 Prague, Czech Republic
 2 December 2013
Czech 
 Utrecht, Netherlands
 9 December 2013
Dutch
 Madrid, Spain
 27 March 2014
Spanish 
 Dubai, United Arab Emirates 
 5 February 2014
English
Cairo, Egypt 
 22 December 2013
 Arabic
 Tokyo, Japan
 6 February 2014
 Japanese
 Causeway Bay, Hong Kong
 24 February 2014
 English 
 Petaling Jaya, Malaysia
 23 December 2013
 English
 Melbourne, Australia
 30 January 2014
 English
 Sydney, Australia
 10 February 2014
 English
 Auckland, New Zealand
21 November 2013  
 English
 Toronto, Canada
 25 November 2013
  English 
 Santo Domingo, Puerto Rico
2 December 2013  
 Spanish
 Phoenix, AZ, United States
2 December 2013  
 English
 San Jose, CA, United States
 2 December 2013
 English

これらのトレーニングコースの詳細や、イベント登録、イベント開催リクエストをお求めの方は、以下のリンクからServer Virtualizationをクリックして下さい。
Oracle Virtualization 研修
http://education.oracle.com/virtualization

2013年11月18日

[Big Data, Coherence] Hadoop MapReduce and Coherence - A Perfect Match

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

Hadoop MapReduce (M/R)は、HDFSクラスタ上で大規模データセットを並列・分散アルゴリズムを使って処理するための最も人気のあるプログラミングモデルです。
Hadoop MapReduce(リンクはチュートリアル)
http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html
Coherenceは業界をリードするインメモリデータグリッドです。Hadoopはバッチで処理できる、(テラバイト以上のデータを扱うような)大規模な処理操作に対して強みを発揮するのに対し、Coherenceは、よりリアルタイムの処理が必要で、かつデータ量が小さい場合には、データ保持においてHDFSよりも強みを発揮します。

そんなわけで、Hadoop M/Rについて詳しくなろうと思ったのですが、両者を組み合わせるのはそれほど難しくないはず、と認識しました。以下で提示するソリューションは、標準的なHadoop M/R APIを使って、あたかもHDFSクラスタ上に保存されているかのようにCoherenceデータグリッドに格納されているデータを処理する、というものです。HadoopのWordCountサンプルだと以下のようになります。
import com.oracle.coherence.mapreduce.JobClient;
    ... 

    JobConf conf = new JobConf(WordCount.class);
    conf.setJobName("coherence-wordcount");
    conf.setOutputKeyClass(Text.class);     
    conf.setOutputValueClass(IntWritable.class);

    conf.setMapperClass(Map.class);
    conf.setCombinerClass(Reduce.class);
    conf.setReducerClass(Reduce.class);     

    conf.setInputFormat(CoherenceInputFormat.class);
    conf.setOutputFormat(CoherenceOutputFormat.class);
    CoherenceInputFormat.setInputPaths(conf,new Path("coherence://wordcount-Input");
    CoherenceOutputFormat.setOutputPath(conf,new Path("coherence://wordcount-Result"));
    RunningJob job =  JobClient.runJob(conf);
元のHadoopサンプルから変更したのは、CoherenceInputFormatとCoherenceInputFormatクラスを使い、入出力パスをHDFSではなくCoherenceキャッシュにした、という点だけです。その他は全て、ユーザー定義のMapクラス、Reduceクラスを含めて、Hadoop M/R APIと同じです。このM/Rジョブを実行するために、Hadoopクラスタを構築・実行する必要はありません。必要なものはCoherenceクラスタです。

Under the Hood

まず、Entry ProcessorsとAggregatorsはmapperとreducerを実装する上で自然な選択のように見えますが、両者には結果を導くために一つのメンバー/スレッドを必要としますので、mapper/aggregatorの結果セットが一つのメンバーヒープにフィットできる場合に限って、このソリューションを適用することができます(詳しくは、Christiona FeldeのCoherenceとM/Rに関するすばらしいエントリをご覧下さい)。
Oracle® Coherence Developer's Guide Release 3.7.1
Performing Transactions
Using Entry Processors for Data Concurrency
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_transactionslocks.htm#BEIJCGDF
Processing Data In a CacheData Grid Aggrigation
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_processcache.htm#CHDFFFEI

Oracle® Coherence開発者ガイド リリース3.7.1
トランザクションの実行
データの同時実行性のための入力プロセッサの使用方法
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/api_transactionslocks.htm#BEIJCGDF
データ・グリッドの集計
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/api_processcache.htm#CHDFFFEI

Oracle Coherence and MapReduce (Blog of Christion Felde)
http://blog.cfelde.com/2012/12/oracle-coherence-and-mapreduce/
この制限を回避するため、このソリューションでは分散起動サービス(Distributed Invocation Services)をメンバーアフィニティと共に利用し、MapperとReducer機能を実装します。
Oracle® Coherence Developer's Guide Release 3.7.1
Processing Data In a Cache
Node-Based Execution
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_processcache.htm#CHDGJJEI

Oracle® Coherence開発者ガイド リリース3.7.1
キャッシュ内のデータの処理
ノードベースの実行
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/api_processcache.htm#CHDGJJEI
これにより、2個の起動サービスとCoherenceキャッシュ上のいくつかのHadoopインターフェースの実装だけが問題になりました。
Fig-1
Fig-1

JobClient

Hadoopでは、JobClientはユーザーのジョブがクラスタと対話するための主要なインターフェースです。JobClientはジョブの発行、進捗の追跡といった機能を提供します。通常ユーザーはアプリケーションを作成し、ジョブの様々な側面をJobConfを使って設定し、JobClientを使ってジョブを発行し、その進捗を監視します。
JobConf (Apache Hadoop Main 2.2.0 API)
https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapred/JobConf.html
このソリューションはJobClient Hadoopクラスの独自実装を提供します。Mapフェーズの入力データは既にCoherence InputCacheに格納されていることを想定しています。JobClientはその作業をMapperサービスとReducerサービスの実行を調整するRunningJobクラスに委譲します。Mapper、Reducerとも、JobInfo Coherenceキャッシュを通じて進捗やステータス情報を通信します。

MapperService

MapperServiceはCoherence非同期実行サービス(Coherence Async InvocationService)として実装されています。これはCoherenceクラスタの全てのストレージが有効なメンバー上で動作します。データ処理の現場で実装するためには、MapperServiceを実行する各メンバーは、CoherenceRecordReaderを使って、そのメンバーに格納されているInputCacheエントリのみを処理します。MemberPartitionsListenerを使って、クラスタメンバー毎のParitionSetの経過を追跡し、PartitionFilterを使って関連するローカルエントリのみを取り出します。
<distributed-scheme>
    <scheme-name>dist-default</scheme-name>
    <partition-listener>
        <class-name>com.oracle.coherence.mapreduce.listeners.MemberPartitionsListener</class-name>
    </partition-listener>
Fig-2
MapperServiceは、マルチスレッド化されており、各スレッドがMapperTaskを実行し、そのメンバーに格納されているエントリのサブセットを処理します。MapperTaskはユーザー定義された、各InputCacheエントリに対応するMapクラスを実行し、HadoopのOutputCollectorのCoherenceベースの実装に渡します。OutputCollectorはメモリ内のMapperクラスが送出したエントリをバッファリングし、事前に定義されたサイズに達すると、MapperOutputCacheにバッファフラッシュします。

このMapperOutputCacheは、同じ送出されたキーを持つ全てのエントリが同じパーティションに格納されるようにPartition Affiinyを使って構成します。Partition Affiinyを持つことで、Reducerを実行する前にサイドデータをシャッフルする必要がありません。

OutputCollectorは、MapperUniqueKeysCacheに送出された各々の一意なキーに対するエントリも作成します。MapperCacheと同様に、マスタエントリやMapperCacheエントリに関連する全てのエントリが同じCoherenceパーティションに格納されるよう、MapperUniqueKeysCacheは同じ関連キーで定義されたPartition Affinityを持っています。

ユーザ定義のCombineクラスをジョブに設定すると、OutputCollectorはMapperCacheへバッファをフラッシュする前にローカルでCombineクラスを適用します。これにより、reducerが処理するエントリの個数が減ります。

ReducerService

ReducerServiceははCoherence非同期実行サービス(Coherence Async InvocationService)として実装されています。これはCoherenceクラスタの全てのストレージが有効なメンバー上で動作します。サービスの各インスタンスは、サービスインスタンスを実行するメンバーにローカルに格納された中間キャッシュエントリを削減するだけです。

ReducerServiceはMapperがMapperUniqueKeyCacheに送出した一意なキーのリストを反復処理します。各々の一意なキーについて、KeyAssiciatedFilterを使い、同じ一意のキーを持つ全てのMapperOutputCacheエントリを発見します。結果セットをHadoop OutputCollectorクラスのCoherenceベースの実装と共にユーザー定義したReduceクラスに渡します。その後、ReduceクラスはOutputCollectorを使い、(透過的に)結果をCoherenceのResultCacheに送出します。
Fig-3

Installing the demo

デモソリューションを2個用意しました。一つはWordCount、もう一つはStandardDeviationです。サンプルを実行する方法は以下の通りです。
  1. ソリューションをダウンロードしZipファイルを展開します。
  2. ソリューションには全ての依存関係のあるjarファイルがlibディレクトリに入っています(hadoop、coherenceなど)。
  3. setEnv.cmdを編集し、関連する環境変数を変更します。
  4. cache-server.cmd scriptスクリプトを実行し、1個以上のCoherenceキャッシュサーバーを立ち上げます。

WordCount Sample

WordCountは最も有名なMapReduceのサンプルです。このサンプルはまず、テキストの約100,000行をキャッシュに取り込みます。Mapperは行をトークンに分割し、キーとして単語、値として1を持つキー・バリューのペアを送出します。Reducerは同じ単語について全ての1を集約します。
サンプルを実行するには、run-wordcount.cmdを実行します。
2013-11-13 23:27:10.868/16.038 Oracle Coherence GE 3.7.1.1  <Info> (thread=Invocation:InvocationService, member=5):  CoherenceMapReduce:JobId=1660803 JobClient:ReducerObserver - Member 1  Completed :  Machine=MBENOLIE-IL Process=8148
Job Completed
**** Job Summary:
**** Job Id: 1660803
**** Job Name: wordcount
**** Mapper ****
------------Input Cache Size: 100000
------------Duration: 4036 ms
**** Reducer ****
------------Intermediate Cache Size: 162164
------------Unique Entries Size: 11108
------------Duration: 3964 ms

Standard Deviation Sample

Standard Deviationサンプルは、これも有名なサンプルの一つで、MapReduceを使い、図4の式に基づいてサンプルの標準偏差を計算します。
Fig-4
Fig-4

サンプルの各値に対して、MapperはX(値そのもの)、X2、そして数1の三個からなる値を送出します。Reducer/Combinerは送出された値を足しあわせ、N、sum(X2)、(sum(X))2の結果エントリを作成します。
サンプルを実行するには、run-stddev.cmdスクリプトを実行します。次のような出力が出てきます。
2013-11-13 23:44:55.818/6.953 Oracle Coherence GE 3.7.1.1 (thread=Invocat ion:InvocationService, member=6): CoherenceMapReduce:JobId=114742004 JobClient:R educerObserver - Member 1 Completed :  Machine=MBENOLIE-IL Process=8148
Final Calculation : entries in outputcache=3 
Count = 20000.0 
Sum = 1327351.1950964248 
Sum of Sqrt = 8.83890996020529E7 
Job Completed 
Standard deviation= 3.8474319265580275 
**** Job Summary: 
**** Job Id: 114742004 
**** Job Name: StandardDeviation 
**** Mapper ****
------------Input Cache Size: 20000
------------Duration: 313 ms
**** Reducer **** 
------------Intermediate Cache Size: 60
------------Unique Entries Size: 3 
------------Duration: 51 ms

Tracking the M/R jobs 

非常に原始的なコンソールを提供しています。console-mapreduce.cmdスクリプトを実行してコンソールを起動します。このコンソールを使い、ジョブの進行状況を追跡し、ジョブの結果(つまり数えた単語のリスト)を表示することができます。

Summary

既存のM/Rアセットを維持しつつ、開発者に最も適切なデータストアの選択の自由を提供して、既存の強力なCoherenceの機能を活用して、ソリューションはCoherenceインメモリ・データ・グリッドのリアルタイム/Fast Dataの性質と、人気のあるHadoop MapReduce APIを結びつけています。

2013年11月17日

[Java, Security] Security Resource Center

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

このたび、Java Security Resource CenterをOTN上に立ち上げました。
Java Security Resource Center
http://www.oracle.com/technetwork/java/javase/overview/security-2043272.html

このページの目的は、Javaコミュニティの皆様のためにセキュリティに関連する情報を集約することにあります。このリソースセンターは特定のテクニカルな機能に対するものではありません。機能は様々で、暗号(Cryptography)といったドキュメントの章で取り上げられるものです。
Java Cryptography Architecture (JCA) Reference Guide
http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/CryptoSpec.html
このリソースセンターでは、機能と人がうまくやっていく方法を議論しながら、「セキュリティはみんなの責任」という方向に焦点を当てています。
Cyber Security is Everyone’s Responsibility
https://www.fbi.gov/washingtondc/news-and-outreach/stories/cyber-security-is-everyones-responsibility
The resource center focuses more towards "security is everyone's responsibility" in discussing how features and people work together.
最初に追加したアイテムは、RIAのチェックリストです。これを使って開発者や管理者が以前から発表されていた、Java 7 Update 51(2014年1月)での変更に対応することができます。
Java RIA security checklist
http://www.oracle.com/technetwork/java/javase/overview/ria-checklist-2055184.html
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

[Java, Security] Self-signed certificates for a known community

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

先頃発表した、Java 7 Update 51(2014年1月)で計画されている変更が確定し、デフォルトのセキュリティスライダーを操作するには、コードの署名とPermissionというManifest属性を必要とするようになります。
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
Securing Software Distribution with Digital Code Signing
https://casecurity.org/2013/10/16/securing-software-distribution-with-digital-code-signing/
コード署名は、業界で推奨されている一般的な方法で、コンピュータが実行するコードが、作成者のコードと同じことを判断するのに有用です。
このエントリは、パブリックな認証局の関与がない、自己署名証明書を利用する必要があるユーザーを支援するために記載しています。

The role of self-signed certificates within a known community

既知のコミュニティ内で自己署名証明書をまだ使用することができます。自己署名とCAから購入した証明書の違いは、自己署名の場合は、それが有効であることを示すために、自己署名証明書をインポートする必要があるのに対し、認証局(Certificate Authorities)は既にデフォルトで信頼されている、というところにあります。

これは、私の証明書が私のものであると信頼してくれる既知のコミュニティでは有効ですが、実際に連絡できないとか、私の証明書を信頼する必要があるシステムを知ることができないところへはスケールしません。多くの異なる要件や頻繁なチェックを通っているため、パブリックな認証局は既に広く信頼されています。
CA/Browser Forumドキュメントページ
https://www.cabforum.org/documents.html
例えば、大学の学生でメーリングリストやWebページで公開証明書を共有する大学生、イントラネットに発行する会社員、エンドユーザに証明書を展開するシステム管理者などを考えてみましょう。展開を自動化するので、管理されたマシンを使うと楽になりますが、これは必須ではありません。要は、単に人々があなたの証明書を信頼してインポートすることなのです。

How to distribute self-signed certificates for a known community

自己署名証明書をに配布し、ユーザーがその自己署名証明書を信頼するにはいくつか手順があります。
  1. 署名のために公開/秘密鍵のペアを作成する
  2. あなたのパブリック証明書を他者のためにエクスポートする
  3. あなたの証明書を、あなたを信頼するマシンにインポートする
  4. 異なるマシンで動作することを検証する

Creating a public/private key pair for signing

公開/秘密鍵のペアを持つことで、アイテムに自分で署名し、認証局に証明書署名要求(CSR)を認証局に発行することができます。

キーペアを作成するための手順に従って、あなたの公開・秘密鍵のペアを作成します。
Generate Keys (The Java Tutorial)
http://docs.oracle.com/javase/tutorial/security/toolsign/step3.html
確認した全ての認証局で類似の手順を提供していましたが、利用したコマンドを以下にまとめておきます。
  1. キーペアを生成します。
    keytool -genkeypair -alias erikcostlow -keyalg EC -keysize 571 -validity 730 -keystore javakeystore_keepsecret.jks
    • このファイルに適切なパスワードを指定します。
    • エイリアス "erikcostlow" は筆者の名前で、覚えやすいものです。あなたの名前として"mykey"のようなものに置き換えましょう。
    • キーアルゴリズムとしてEC(楕円曲線)、キーサイズとして571を指定するとキーが強固になります。
    • 全ての鍵に有効期限を設定すべきです。2年もしくは730日が適切かつ妥当な長さでしょう。ほとんどのパブリック認証局では1年から5年間としています。
    • 鍵をjavakeystore_keepsecret.jksに配置しましょう。このファイルには秘密鍵が含まれており、共有してはいけません。誰か他人がこれらの秘密鍵を入手すた場合、あなたの署名になりすますことができます。自動化されたクラウドバックアップシステムと秘密鍵ストアには是非注意して下さい。
  2. 全ての質問に回答します。上記で指定した"-validity"の日付の間これらの回答が有効なので、正しい回答をすることが重要です。
    What is your first and last name?
      [Unknown]:  First Last
    What is the name of your organizational unit?
      [Unknown]:  Line of Business
    What is the name of your organization?
      [Unknown]:  MyCompany
    What is the name of your City or Locality?
      [Unknown]:  City Name
    What is the name of your State or Province?
      [Unknown]:  CA
    What is the two-letter country code for this unit?
      [Unknown]:  US
    Is CN=First Last, OU=Line of Business, O=MyCompany, L=City, ST=CA, C=US correct?
      [no]:  yes
    Enter key password for <erikcostlow>
            (RETURN if same as keystore password):
  3. 成果物を検証します。
    keytool -list -keystore javakeystore_keepsecret.jks
    これで新しいキーペアが出来ました。

Exporting your public certificate for others

公開鍵インフラストラクチャは2個のシンプルなコンセプトに依拠しています。公開鍵は公開してもよいが、秘密鍵は秘匿しなければならない、というものです。公開証明書をエクスポートすることで、証明書をインポートしてあなたを信頼しようとする他者と共有することができます。
Export the Public Key Certificate (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/security/toolsign/step5.html
keytool -exportcert -keystore javakeystore_keepsecret.jks -alias erikcostlow -file erikcostlow.cer
これを検証するために、ほとんどのOSで.cerファイルをダブルクリックして開くことができます。証明書作成時に入力した情報が表示されるはずです。

これは他者と共有することになるファイルです。この証明書を使ってあなたからのこの証明書で署名されたアーティファクトを証明しようとします。直接マシンを管理しないのであれば、既知のコミュニティ仲間が信頼するはずの場所、例えばイントラネットのページなどに証明書ファイルを配置すべきです。

Import the certificate onto machines that should trust you

証明書を信頼するためには、既知のネットワークに入っている人があなたの証明書をキーストアにインポートする必要があります。最初の手順は証明書が本当にあなたのものであることを検証することですが、これは任意の方法、例えばメール、電話、あるいは直接確認、などの方法で実施できます。既知のネットワークでは通常このような方法が可能です。

正しいキーストアを判断するには…
Deployment Configuration File and Properties
http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/properties.html
  • 個々人のユーザーが別のユーザーを信頼する場合、正しいファイルはユーザーディレクトリ内にあります。
  • (例)USER_HOME\AppData\LocalLow\Sun\Java\Deployment\security\trusted.certs
  • システム全体にインストールする場合、Javaの認証局はJAVA_HOMEです。
  • (例)C:\Program Files\Java\jre8\lib\security\cacerts
    なお、cacertsのデフォルトパスワードはkeytoolのドキュメントに記載がある通り、"changeit"です。
    keytool - Key and Certificate Management Tool http://docs.oracle.com/javase/7/docs/technotes/tools/windows/keytool.html
MacやLinuxのファイルパスは上記リンクに含まれています。
キーストアへの証明書のインポート手順に従って下さい。
Import the Certificate as a Trusted Certificate (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html
keytool -importcert -keystore THEKEYSTOREFROMABOVE -alias erikcostlow -file erikcostlow.cer
この場合、覚えやすいので、まだエイリアスとして自分の名前を使っています。貴社の名前のエイリアスを使うこともできます。

Scaling distribution of the import

多くのマシン間で証明書を適用する最も簡単な方法は、単に.certファイルやcacertsファイルをマシンに配置することです。これを実施する場合、人々は自分のマシンのこのファイルに加えた全ての変更に気を付けて下さい。
  • 信頼済み.certs: ユーザーディレクトリに発行する場合、ユーザーが直近で更新してから追加した鍵をあなたのファイルが上書きします。
  • CACerts: ファイルの上書きよりは、インストール先のマシン各々でimportコマンドを再実行するのが一番です。アップグレードの間同じcacertsファイルを変更しないだけであれば、追加・削除される任意のCAを上書きします。再度インポートすれば変更に追随します。
パスワードをコマンドラインで指定する -storepass という引数があります。セキュアなシステムでは、管理者は通常、リダイレクション演算子を使ってパスワードを隠しますが、その内容や説明はこのエントリの範囲外です。

Verify work on a different machine

検証とは、あなたが署名している証明書を追加した後に、署名済みのアーティファクトが適切に信頼されていることを確認するため、クライアントマシン上でチェックする方法です。多くの人はデプロイメント・ルールセットを使って始めました。
Introducing Deployment Rule Sets
https://blogs.oracle.com/java-platform-group/entry/introducing_deployment_rule_sets
デプロイメント・ルールセットを以下のようにして検証することができます。
  1. デプロイメント・ルールセットを秘密鍵を保存するコンピュータ上に作成し、署名します。
  2. 署名している証明書をインポートした別のマシンにデプロイメント・ルールセットをコピーします。
  3. Javaコントロールパネルのセキュリティ・タブでデプロイメント・ルールセットが表示されることを確認します。

個別のJARファイルや複数のJARファイルの検証

証明書チェーンをjarsignerコマンドでテストできます。
jarsigner -verify filename.jar
出力に"jar verified"と出ない場合には、以下のコマンドを発行して理由を確認して下さい。
jarsigner -verify -verbose -certs filename.jar
“CertPath not validated”という言葉に対する出力をチェックして下さい。

[Java] MOXy is the New Default JSON-Binding Provider in GlassFish 4

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

JAX-RS 2、JSON-P、Java EE 7について話す際に、驚くほどの多くの方がGlassFishとJerseyはJSONバインディングをサポートしておらず、低レベルのJSONプロセッシングのみをサポートしていると思い込んでらっしゃるようですが、実際のところは、Java EE 7は(JSON-Pを通じて)JSONプロセッシングを標準化しましたが、JSONバインディングAPIはまだ標準化していない、というのが正しいのです(こうした標準化されたAPIはJava EE 8での非常に強い検討事項であり、JSON-Pの成果を基にして構築されるはずですが)。対して、Jerseyは人気のあるJAX-RSの参照実装ですが、これはMOXy、JacksonおよびJettison(今ではもちろんのことJSON-Pもサポートしています)を通じてJSONバインディングを長きにわたり、強力にサポートしています。実は、GlassFish/Jerseyでは、デフォルトのJSONバインディングプロバイダはMOXyです。MOXyについて詳しくないのであれば、このMOXyはEclipseLink(JPAの参照実装)の一部である非常に興味深いプロジェクトで、JAXBアノテーションをJSONに変換してくれます。コードがメインになっているブログエントリで、Oracle EclipseLinkチームのBlaise DoughanがGlassFishでJAX-RSと共にMOXyを利用する方法を詳細に説明しています。
MOXy is the New Default JSON-Binding Provider in GlassFish 4 (Java XML and JSON Binding)
http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html
JerseyのJSONサポートに関する詳細は、以下のドキュメントをどうぞ。
Jersey 2.4.1 User Guide
Chapter 8. Support for Common Media Type Representations
8.1. JSON
https://jersey.java.net/documentation/latest/media.html#json

2013年11月16日

[Java, Security] OAuth with Jersey 2

原文はこちら。
https://blogs.oracle.com/mira/entry/oauth_support_in_jersey_2

Jersey 2.3でOAuthのサポートが追加されました。OAuthのサポートについては、サンプルつきで以下のドキュメントで説明があります。
Jersey 2.4.1 User Guide
Security > OAuth Support
https://jersey.java.net/documentation/latest/security.html#d0e9038
OAuth 1 をJersey 1.xから移行しました。OAuth 1用のサーバーAPIをあまり変更せず、利用方法の基本原則はJersey 1.xと同様にしています。APIでは認可フローとOAuth 1認可ヘッダー(OAuth1署名を含む)を使う認証をサポートします。アクセストークンやリクエストトークン、利用者の資格証明を管理するOAuth1Providerのご自身の実装を登録することができます。実装はトークン作成ならびにトークンの保存(例えばデータベースへ保存)の責務を負います。残りはJerseyがやってくれます。
クライアントAPIは、認可フロー(ユーザー認可プロセス)の実行方法が大きく変わりました。認可フローはもはやクライアントフィルタに含まれず、スタンドアロンのツールに分離されています。API変更の理由は、クライアントがWebアプリケーションである場合に認可フローを簡単に利用できるようにするためでした。以前のAPIでは、クライアントフィルタから例外を送出し、ユーザーコードがその例外を処理し、ユーザーをリダイレクトして再度リクエスト(認可フローを終了させるフィルタを再度呼び出すリクエスト)を呼び出す、ということによってのみユーザーのリダイレクトが可能でした。現在ではフィルタを使ってOAuth署名をAuthorizationヘッダーに追加するだけで、認可フローは完全に分離されています。このことにより、様々なユーザーが何度も一つのクライアントインスタンスを再利用して認可フローを実行することができます。さらに、認可フローのAPIは認可プロセス内で例外の送出、捕獲を必要としません。
OAuthサポートを使ってTwitterに接続するOAuth 1クライアントのサンプルをチェックしてください。
oauth-client-twitter
https://github.com/jersey/jersey/tree/master/examples/oauth-client-twitter
Jersey 2でのOAuth 2 のサポートは現在クライアント用のみ実装されています(このエントリ執筆時現在のバージョンは2.4.1)。The API for OAuth 2クライアントをサポートするAPIは、Jersey 2でのOAuth 1クライアントをサポートするものと類似しています。

OAuth 2 APIの使用例です。
Auth2CodeGrantFlow flow = OAuth2ClientSupport
                .authorizationCodeGrantFlowBuilder(clientId, authUri, accessTokenUri)
                .scope("contact")
                .build(); 
認可フローは OAuth2ClientSupport という静的メソッド(OAuth 2クライアントAPIへアクセスするためのメインクラス)を使って構築されています。クライアントアプリケーションの資格証明(clientId)と認可フロー時に使うURIをを渡す必要があります。これらのパラメータは全てサービスプロバイダが発行します。サービスプロバイダはユーザーの同意を得てアクセスしたい当事者です。
これで、 flow オブジェクトを使い、認可URIを生成して、認可フローを開始することができます。
String finalAuthorizationUri = flow.start();
finalAuthorizationUri とはユーザーをリダイレクトする先のURIです。これにはクエリパラメータが含まれており、その一つがclientIdです。ここで、ユーザーを認可URIにリダイレクトする必要があります。アプリケーションをサーバー上で利用する場合は、flow オブジェクトを(キャッシュに)格納し、ユーザーリクエストに対しHTTPのステータス303を返す必要があります。その際、認可URIを location ヘッダーに入れておく必要があります。ユーザーをサービスプロバイダにリダイレクトし、ユーザーにアプリケーションへ権限を付与するかどうかを尋ねるページを表示します。承認後、ユーザーをアプリケーションにリダイレクトします。code と state パラメータをリクエストから取り出し、これらを使って認可を終了します。
TokenResult result = flow.finish(code, state);
このメソッドは、内部でTokenResultに返されるサービスプロバイダからアクセストークンを要求し、その後最終的に、リクエスト内のAuthorizationヘッダーにあるこのトークンを使って、サービスプロバイダにクライアントアプリケーションを認証させることができます(JerseyはOAuth 2認可ヘッダを追加するフィルタを提供します)。
Jerseyには、OAuth 2のクライアントサポートを使用し、WebアプリケーションでGoogleアカウントからタスクを取得するという、OAuth 2サンプルが含まれています。
oauth2-client-google-webapp
https://github.com/jersey/jersey/tree/master/examples/oauth2-client-google-webapp
JerseyでOAuthサポートを試すには、Jerseyのドキュメントで手順を確認して下さい。
Jersey 2.4.1 User Guide
Security > OAuth Support
https://jersey.java.net/documentation/latest/security.html#d0e9038

[ODI, Data Integration] OWB to ODI Migration Utility released.

原文はこちら。
https://blogs.oracle.com/warehousebuilder/entry/owb_to_odi_migration_utility

待望のOWBからODIへの移行ユーティリティがリリースされました。

この移行ユーティリティはコマンドラインのツールで、OWB 11.2.0.4の設計時メタデータをODI 12cへ移行することができます。このツールはOWB 11gR2(11.2.0.4)の環境に対するパッチ(17547241)として提供されます。

Linux (x86-64)の移行のみをサポートします。以下の要件に適合することを確認する必要があります。
  • OWB 11.2.0.4がインストールされていること(OWB 11.2.0.4+パッチ#17547241)
  • ODI 12.1.2.0.0がインストールされていること(ODI 12.1.2.0.0+パッチ#17053768)
ODIはOracleの異機種間のデータ統合を実現するための戦略製品です。多くのOracle Databaseをご利用のお客様がOWBに対し多大な投資をされていますので、OracleはOWB 11gR2(11.2.0.4)からODI 12c(12.1.2)への段階的な移行をサポートします。

ODI 12cではOWB 11gR2のコンセプトやオブジェクトと対向するODI 12cのそれらとのより簡単なマッピングを提供します。移行ユーティリティでは多くのOWBオブジェクトやマッピングをODIのオブジェクトやマッピングに自動的に変換します。このユーティリティに関する詳細情報は以下のリンクからどうぞ。
Migrating From Oracle Warehouse Builder to Oracle Data Integrator
http://docs.oracle.com/middleware/1212/odi/ODIMG/index.html

2013年11月14日

[FMW, SOA, Database] Best Practices for SOA 11g Multi Data Center Active – Active Deployment – White Paper

原文はこちら。
https://blogs.oracle.com/soacommunity/entry/best_practices_for_soa_11g

高可用性のためのベストプラクティス

このホワイトペーパーでは、複数拠点でOracle Fusion Middleware 11g SOAシステムを停止から守るために推奨されるActive-Active構成のソリューションを説明しています(SOA Active-Active災害復旧ソリューションやSOAマルチデータセンターActive-Active展開とも呼ばれます)。このホワイトペーパーでは、推奨するトポロジを設定するための必要な設定手順と、このような構成のパフォーマンスとフェイルオーバの影響に関するガイダンスをご紹介します。
ホワイトペーパーは以下のリンクからどうぞ。
Best Practices for Oracle Fusion Middleware SOA 11g Multi Data Center Active- Active Deployment
Oracle Maximum Availability Architecture White Paper
http://www.oracle.com/technetwork/database/availability/fmw11gsoamultidc-aa-1998491.pdf

2013年11月13日

[Big Data] Big Data Appliance X4-2 Release Announcement

原文はこちら。
https://blogs.oracle.com/datawarehousing/entry/big_data_appliance_x4_2

本日第3世代のBig Data Applianceのリリースを発表しました。
Oracle Announces Oracle Big Data Appliance X4-2; Serves as Co-Founder of Apache Sentry
http://www.oracle.com/us/corporate/press/2054822

Software Focus

第3世代Big Data Applianceの注力ポイントは以下の通りです。
  • 包括的にしてオープン
    Big Data Applianceには全てのCloudera Softwareが含まれています。これにはBack-up and Disaster Recovery (BDR)、Search、Impala、Navigatorならびに以前含んでいたCDH, HBase、Cloudera Managerなどといったコンポーネント、そしてOracle NoSQL Database(CEもしくはEE)が含まれます。
  • より低いTCOゆえの、DIYでのHadoopシステム
  • シンプルに運用しながらも、企業のためのオープンプラットフォームを提供
  • 新たなAudit VaultやDatabase Firewallソフトウェア、Apache Sentry、Kerberosを標準で構成済み、といった包括的なセキュリティ

Hardware Update

手始めにさくっとハードウェアの違いを確認しましょう(なんと価格は据え置きです!)。下表はノードごとの旧(X3-2)ハードウェアとの比較です。
Big Data Appliance X3-2 Big Data Appliance X4-2
CPU 2 x 8-Core Intel® Xeon® E5-2660 (2.2 GHz) 2 x 8-Core Intel® Xeon® E5-2650 V2 (2.6 GHz)
Memory 64GB 64GB
Disk 12 x 3TB High Capacity SAS 12 x 4TB High Capacity SAS
InfiniBand 40Gb/sec 40Gb/sec
Ethernet 10Gb/sec 10Gb/sec
環境に関する全ての詳細情報やその他の有用な情報は、データシートをご確認下さい。
ORACLE BIG DATA APPLIANCE X4-2 (データシート)
http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/1883358.pdf
前世代に比べてより大きなディスクが備わっており、BDA X4-2では33%容量が増えており、しかもより高速なCPUが追加されています。BDAのメモリは1ノードあたり512GBまで拡張可能で、各ノード単位で拡張できます。例えば、NamedNodes用とかHBaseリージョンサーバー、NoSQL Databaseノード用、なんて感じです。

Software Details

ソフトウェアの詳細や現在のバージョン(注意:BDAはClouderaおよびその他のソフトウェアの3ヶ月毎のアップデートサイクルに従います)の詳細です。
Big Data Appliance 2.2 Software Stack Big Data Appliance 2.3 Software Stack
Linux
Oracle Linux 5.8 with UEK 1
Oracle Linux 6.4 with UEK 2
JDK
JDK 6
JDK 7
Cloudera CDH
CDH 4.3
CDH 4.4
Cloudera Manager
CM 4.6
CM 4.7
そして、冒頭で言ったように、他のすべてのClouderaのコンポーネントは、現在ではOracle Big Data Appliaceの価格に含まれていることを理解することが重要です。これらのソフトウェアは完全にOracleがサポートし、すべてのBDAのお客様が利用できます。
詳細は以下のリンクをどうぞ。