[Java] Java 8: Hold the train

原文はこちら。
http://mreinhold.org/blog/hold-the-train

先週Java 8のリリースを遅らせて、Project Lambdaを完成させることを提案しました。これは、Javaプラットフォームのセキュリティに対してOracleが新たに注力していることに伴い遅れていたものです。
Java 8: Secure the train
http://mreinhold.org/blog/secure-the-train
http://orablogs-jp.blogspot.com/2013/04/java-8-secure-train.html
Project Lambda
http://openjdk.java.net/projects/lambda/
この提案に対し、このブログエントリのコメント欄やTwitterなど様々なところで反応してくれたみなさんに感謝します。フィードバックは概して好意的でした。当然ながら失望を帯びていたわけですが。本日現在、新たなプランでは、Java 8のリリース予定日は2014年3月18日です。

スケジュールのさらなる詳細情報はJDK 8 Projectページにあります。
JDK 8
http://openjdk.java.net/projects/jdk8/

[Database, Hardware] Oracle Exadata Recipes for Success – A Problem Solution Approach

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

Oracle Exadataに投資を考えている組織であれば、Oracle Exadata上のOracle Databaseをサポートすることで、性能や整理統合、ITインフラストラクチャのゴールに加え、日々の業務に与える変化にどのように対応するか、を理解する必要があります。
Oracle Exadata Recipes - A problem Solution Approachは、Oracle DatabaseのエキスパートであるJohn Clarkの新著です。Oracle Exadata環境のメンテナンスならびに最適化の方法を説明するだけでなく、記者にぴったり合うものをどうやって確認するかを説明しています。
Oracle Exadata Recipes: A Problem-Solution Approach [ペーパーバック]
(Amazon.jp)http://www.amazon.co.jp/Oracle-Exadata-Recipes-Problem-Solution-Approach/dp/1430249145
(Amazon.com)http://www.amazon.com/Oracle-Exadata-Recipes-Problem-Solution-Approach/dp/1430249145

Oracle Exadata Recipes: A Problem-Solution Approach [Kindle版]
(Amazon.jp)http://www.amazon.co.jp/Oracle-Exadata-Recipes-Problem-Solution-ebook/dp/B00AHD75KI
(Amazon.com)http://www.amazon.com/Oracle-Exadata-Recipes-Problem-Solution-ebook/dp/B00AHD75KI
分厚いマニュアルを読まずに、効果的な実証済みのソリューションを開発したい人向けにOracle Exadataレシピが書かれています。著者へのインタビューでこの本について語っていますので、聞いてみたい方は以下のリンクからどうぞ。

http://streaming.oracle.com/ebn/podcasts/media/20121117_Oracle_Exadata_042413.mp3

[Security, Identity Management, Cloud] Addressing the Top 5 Cloud Security Challenges

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

世界中の組織と会話していると、明らかなのは、ほとんどの組織がクラウドをコスト削減の最大の機会と考えている、ということです。すべての組織にとって、ビジネスの俊敏性、運用コストの削減、スケーラビリティ、パフォーマンスの向上、などなどの数多くのメリットをクラウドはもたらします。プライベート、パブリック、ハイブリッドといったクラウドの導入に伴い、利益も変わりますが、それと同じくリスクも変わってきます。
その後、オンプレミスからプライベートクラウド、ハイブリッドクラウド、そしてパブリッククラウドへと移行するにつれ、セキュリティポリシーに対するITのコントロールと可視性が低下するのです。

プライベートクラウドでは、パブリッククラウドで許可されていないネットワーク帯域幅の管理や最適化を実装することができるため、組織は高いセキュリティやデータのプライバシー、コンプライアンス、QoSをコントロールできるようになっています。しかし、多くの企業でそうであるように、特権アクセスとインサイダーの脅威からリスクが生じています。パブリッククラウドでは、クラウド·サービス·プロバイダーである外部の第三者によってポリシーが管理されます。パブリッククラウドの共有環境では、セキュリティとコンプライアンスの問題を引き起こす可能性があります。ハイブリッドクラウドは、その定義の通り、プライベートクラウドとパブリッククラウドの両方のリスクとメリットの両方をカプセル化しています。
この範囲を動いていくと、複数の場所でポリシーデータを複製するにつれ、セキュリティポリシーはますます断片化していきます。その結果、レイテンシも増加し、リスクが指数関数的に増大します。コンプライアンスやガバナンスの問題に加えて、セキュリティがクラウドの採用において最も大きな障壁であり続けているのは不思議ではありません。実際、2012年のInformationWeek Reportによる“Private Cloud Vision vs. Reality”(プライベートクラウドのビジョン vs 現実)は、組織の82%がパブリッククラウドを段階的に廃止もしくは利用しないことを決めた主要な理由の一つとして、セキュリティとデータプライバシーの問題がある、と伝えています。
では、セキュリティを危険にさらすことなく、クラウドを利用するには、どの領域に労力を集中するのが一番よいのでしょうか。最近のCSO Onlineによるチーフ·セキュリティ·オフィサーに対する調査の結果、クラウドへのセキュリティの懸念の上位5つは、モバイルデータアクセス、規制遵守とデータやアプリケーションへのアクセス管理、すなわち全てアイデンティティ管理に関連していることがわかりました。
クラウドにアプリケーションを移動する組織は、データセキュリティとアプリケーションのアクセスの領域に標準的なセキュリティフレームワークを提供して、オンプレミス環境とクラウド環境の間のギャップを埋める必要があります。しばしこの短いスクリーンキャストをご覧頂いて、クラウドの可能性に制限をかけずに、セキュリティリスクを管理し、ガバナンスの問題に対処する方法を知って頂ければと思います。

[Java] New documentation: Using Scene Builder with Java IDEs

原文はこちら。
https://blogs.oracle.com/thejavatutorials/entry/new_documentation_using_scene_builder

JavaFX Scene Builder 1.1の開発者プレビュー版ドキュメントである「Using JavaFX Scene Builder with Java IDEs」が新たにリリースされました。JavaFX2 Documentationのページからご利用いただけます。
Using JavaFX Scene Builder with Java IDEs
http://docs.oracle.com/javafx/scenebuilder/1/use_java_ides/jsbpub-use_java_ides.htm
JavaFX Documentation Home > JavaFX 2 Tutorials and Documentation
http://docs.oracle.com/javafx
It describes how you can use NetBeans IDEやEclipse、IntelliJ IDEAを使って簡単にJavaFXプロジェクトを作成したり、FXMLファイルをScene Builderで編集しアプリケーションのUIを構築する方法を説明しています。

最新のScene Builder 1.1開発者プレビュー版は以下のページからダウンロードできます。
JavaFX Scene Builder Developer Preview Download
http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html
システム要件やインストールの情報、新機能や修正された機能に関する情報はリリースノートをご覧下さい。
Scene Builder 1.1 Developer Preview Release Notes
http://docs.oracle.com/javafx/scenebuilder/1/release_notes_1-1/jsbpub-release_notes_1-1.htm

[Solaris] Ooops, incorrect Recommended patchset uploaded April 21/22

原文はこちら。
https://blogs.oracle.com/patch/entry/ooops_incorrect_recommended_patchset_uploaded

やっちまいました…。

ヒューマンエラーで、正しくないSolaris 10 SPARC用推奨パッチセットをMOS(My Oracle Support)に昨日、2013年4月21日18時54分(PDT)にアップロードしてしまいました。2013年4月20日のパッチセットではなく、2012年4月20日のパッチセットをUpしてしまいました…。
数時間のうちに正しいパッチセットがUpされるはずです。
この24時間以内にダウンロードしたSolaris 10 SPARC推奨パッチセットであれば、日付がパッチセットのREADMEにありますので、2012年でないことを確認して下さい。もし2012年のパッチセットをダウンロードしている場合は、MOSにアップロードが完了した本日以後に正しいバージョンをダウンロードして下さい。
ご不便をおかけしていることを深くお詫びいたします。

[Java] Hacking GlassFish 4 Builds

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

GlassFishにコードを寄与したいとか、楽しみのために(もしかすると利益のために)ハックしたいと思ったことはありませんか?特にGlassFishの4とJava EE7で。そんな場合の最初のステップは、GlassFishの4ソースコードをチェックアウトし、ローカルビルドを作ってみることです。 Java ChampionのPeter Pilgrimが手順を紹介しています。

最近のブログエントリで、PeterはGlassFish 4のソースコードをチェックアウトしてビルドしたアーティファクトを微調整し、ローカルビルドを実行して利用する方法を詳説しています。是非楽しんで下さい。
Build GlassFish 4.0 Snapshots Yourself (Peter Pilgrim :: Java Champion :: Enterprise Blog)
http://www.xenonique.co.uk/blog/?p=1088

[Java] Real-Time Topic Modeling of Microblogs

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

新しい記事がOTNのJavaページにUpされています。この記事のタイトルは“Real-Time Topic Modeling of Microblogs”で、インドのバンガロールにあるInfosys Limited Labs在籍のYogesh TewariとRajesh Kawadによるものです。この記事の中で、彼らが作った「アプリケーションに特有のマイクロブログやTweetの継続的なストリームからリアルタイムでトピックの抽出への挑戦」を探索しています。シンプルなTweetのテキストから、アプリケーションはTweetで説明された関連トピックを正確に提示し、Tweetのストリームから生成されたトピックに関するリアルタイム・タイムラインを提供するように設計されています。

彼らは、これがシンプルなタスクではないと説明しています。その理由はTweetが「言語資料と見なされており、最大140文字しかなく、第2にその簡潔さを考慮すれば、Tweetは有用な情報を提供しない可能性があったり、『スマイリー』や短縮URLのような様々なテキスト形式を含んだりする可能性があること、最後に、Tweetはリアルタイムに生成されるため」です。

YogeshとRajeshはLDA(latent Dirichlet allocation)をトピックモデルTweetに適用し、LDAの実装としてMachine Learning for Language Toolkit (MALLET) APIを使っています。これらは全てJava環境で動作します。LDAの実装はMALLET APIにカプセル化されており、ここでコマンドラインベースのJavaツールとして機能します。

彼らは以下のように言っています。
「我々の目標は、リアルタイムで必要な入力で呼び出すメソッドを持つ、LDAのロジックを実行する実際のJavaクラスです。Stormは、Javaで実装されたフリーでオープンソースの分散リアルタイム計算エンジンで、今回はこれを利用しました。これを分散モードで実行しています。Stormは非常にスケーラブルで、着信Tweetストリームを簡単に処理できます。Twitter4Jを使ってTweetを流しています。Tweetには有効なTwitterの認証が必要です。それゆえ、我々のタスクは、Tweetのストリームを取り込み、トピックのタイムラインを出力するトポロジーを設計することです。」
是非OTNの記事をご覧下さい。
Real-Time Topic Modeling of Microblogs (by Yogesh Tewari and Rajesh Kawad)
http://www.oracle.com/technetwork/articles/java/micro-1925135.html

[SOA/BPM] NEW - Oracle Human Workflow (HWF) Self-Study Course

原文はこちら。
https://blogs.oracle.com/SOA/entry/new_oracle_human_workflow_hwf

新しい自己学習コース、"Introduction to Human Workflow"がOracle Learning LibraryがUpされました。この自己学習コースの所要時間はおよそ20分です。以下のリンクから無料でアクセスできます。
Introduction to Human Workflow - Oracle Learning Library
http://apex.oracle.com/pls/apex/f?p=44785:24:0::::P24_CONTENT_ID,P24_PREV_PAGE:7279,1
Human Workflowを触ったことがない、中心となるボキャブラリーとコンセプトを理解したい方向けのコンテンツです。Human Workflowのできること、一番いい使い方の基礎をご理解頂けます。

この自己学習コースはHuman Workflowのシリーズの第一弾で、今後もコンテンツを追加していく予定です。

フィードバックをお待ちしております。

[WLS, Database] Migrating from Multi Data Source to Active GridLink

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/migrating_from_multi_data_source

Oracle DatabaseのRAC(Real Application Clusters)構成に接続するためのマルチデータソース(Multi data source, MDS)をWebLogic Serverでは2005年からサポートしています。Oracle RACの人気が上がるにつれ、MDSの利用も増えてきましたが、Active GridLink(Active GridLink, AGL)を2011年はじめに導入したことに伴い、MDSをお使いのお客様でAGLへ移行したいと考える方がいらっしゃいます。移行を自動化する機構はありませんが、移行そのものはそれほど難しいものではありません。

まず、アプリケーションの変更は不要です。標準的なアプリケーションはJNDIのMDSを調べ、MDSを使って接続を取得します。AGLにMDSと同じJNDI名を付けることで、JNDIからデータソース名を利用するアプリケーションではプロセスは全く同じです。

ただ一つ変更が必要なのは、構成の部分です。AGLはMDSとメンバーの汎用データソースからの情報を組み合わせ、一つのAGL記述子にまとめますが、RACクラスターのOracle Notification Service(ONS)の構成を追記する必要があります。多くの場合、ONSの情報はMDSで利用するのと同じホスト名で構成されており、追記が必要なのはポート番号だけです。ただ、SCANアドレスを使うと簡単にすることができます。

MDS記述子には多くの情報はありません。この記述子には汎用データソースのメンバーリストがあり、これを使って必要な残りの情報を取得する場所を見つけ出すことができます。MDS記述子にはJNDI名名がありますが、これは新しいAGL名にしてアプリケーションから透過的にする必要があります。MDSをAGLと一緒に利用したい場合、AGLに新しい名前を付ける必要がありますが、アプリケーションに対しても新しいJNDI名を利用するように変更する必要があります。アルゴリズムタイプについては心配する必要はありません。

メンバーの汎用データソースの各々が個々のURLを持っています。「Appendix B Oracle RACでのマルチ・データ・ソースの使用」に説明があるように、以下のような形式で記述します。
Oracle® Fusion Middleware Oracle WebLogic Server JDBCデータ・ソースの構成と管理 11gリリース1 (10.3.6)
B Oracle RACでのマルチ・データ・ソースの使用
http://docs.oracle.com/cd/E28389_01/web.1111/b60997/generic_oracle_rac.htm
Oracle® Fusion Middleware Oracle WebLogic Server JDBCデータ・ソースの構成と管理 12cリリース1 (12.1.1)
B Oracle RACでのマルチ・データ・ソースの使用
http://docs.oracle.com/cd/E28613_01/web.1211/b65892/generic_oracle_rac.htm
Oracle® Fusion Middleware Configuring and Managing JDBC Data Sources for Oracle WebLogic Server 11g Release 1 (10.3.6)
B Using Multi Data Sources with Oracle RAC
http://docs.oracle.com/cd/E28280_01/web.1111/e13737/generic_oracle_rac.htm
Oracle® Fusion Middleware Configuring and Managing JDBC Data Sources for Oracle WebLogic Server
12c Release 1 (12.1.1)
B Using Multi Data Sources with Oracle RAC
http://docs.oracle.com/cd/E24329_01/web.1211/e24367/generic_oracle_rac.htm
jdbc:oracle:thin:@(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=host1-vip)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=dbservice)(INSTANCE_NAME=inst1)))
各メンバーにはホストとポート番号のペアがあるはずです。同じサービスで異なるホストで同じポート番号を持つことが多いはずです。AGLのURLにはホストとポート番号のペアがあります。
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=host1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=host2-vip)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=dbservice)) 
複数のホストや仮想IP(VIP)アドレスを使うよりも、Oracle Single Client Access Name(SCAN)アドレスを使ったほうがよいでしょう。この場合、URLは以下のようになります。
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=scanaddress)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=dbservice))
かなりシンプルで、クラスター内のノードに変更に対し透過的です。このセクションではOracleのURLを書く完全な説明をするつもりはないので、Oracle RAC管理ガイドをご覧下さい。
[訳注]
ドキュメントへのリンクを追記しておきました。
Oracle® Real Application Clusters管理およびデプロイメント・ガイド 11g リリース2 (11.2)
http://docs.oracle.com/cd/E16338_01/rac.112/b56290/toc.htm
Oracle® Real Application Clusters Administration and Deployment Guide 11g Release 2 (11.2)
http://docs.oracle.com/cd/E11882_01/rac.112/e16795/toc.htm
MDSからAGLに置き換える場合、設定からMDSおよび汎用データソースを管理コンソールを使って削除し、単一のAGLデータソースを追加する必要があります。このプロセスはこの章のはじめに記載がありますが、MDSと同じJNDI名にし、汎用データソースがXAドライバー、もしくは非XAドライバーを使っていたか選択します。上述のように完全なURLを入力することができます。ユーザー名やパスワードはMDSメンバーのうちの一つ(できれば全て)のユーザー名・パスワードと同じであるべきです。[GridLinkデータベース接続のテスト]ページへ移動し、「すべてのリスナーをテスト」をクリックして、指定した新しいURLが正しく動作していることを確認しましょう。次のページでONS接続の情報を指定する必要があります。
“host1-vip:6200”とか、“scanaddress:6200”といった具合に、一つ以上のホスト名とポート番号のペアを指定しましょう。可能であれば、単一のSCANアドレスとポート番号を使いましょう。[FANの有効化]をチェックすることをお忘れなく。次のページで、ONS接続をテストします。これでデータソースのデプロイの準備が整いました。
Oracle® Fusion Middleware Oracle WebLogic Server JDBCデータ・ソースの構成と管理 11gリリース1 (10.3.6)
4 GridLinkデータ・ソースの使用
http://docs.oracle.com/cd/E28389_01/web.1111/b60997/gridlink_datasources.htm
Oracle® Fusion Middleware Oracle WebLogic Server JDBCデータ・ソースの構成と管理 12cリリース1 (12.1.1)
4 GridLinkデータ・ソースの使用
http://docs.oracle.com/cd/E28613_01/web.1211/b65892/gridlink_datasources.htm
Oracle® Fusion Middleware Configuring and Managing JDBC Data Sources for Oracle WebLogic Server 11g Release 1 (10.3.6)
4 Using GridLink Data Sources
http://docs.oracle.com/cd/E28280_01/web.1111/e13737/gridlink_datasources.htm
Oracle® Fusion Middleware Configuring and Managing JDBC Data Sources for Oracle WebLogic Server 12c Release 1 (12.1.1)
4 Using GridLink Data Sources
http://docs.oracle.com/cd/E24329_01/web.1211/e24367/gridlink_datasources.htm
作成フローで構成できないデータソースのパラメータがたくさんありますので、戻ってAGLデータソース構成を編集する必要があります。設定するパラメータは、一般にMDSメンバーのデータソースで使用していたパラメータに基づくべきです。できれば全て同じであることが望ましいのですが、そうでない場合には、正しい値を決定する必要があります。

[訳注]
Active GridLink for RACについては、以下のホワイトペーパーも参考にしてください。
Oracle WebLogic Server Active GridLink for Oracle Real Application Clusters(Oracle RAC)
http://www.oracle.com/technetwork/jp/middleware/weblogic/gridlink-rac-wp-1394921-ja.pdf

[Hardware, Database, WLS] WebLogic Server on Oracle Database Appliance - sizing and storage

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/weblogic_server_on_oracle_database1

Oracle Database Appliance上でWebLogic Serverを実行できるようになったことを発表して以来、たくさんの方から関心を寄せて頂き、また色々と質問を頂いています。この一連のトピックで、よく頂く質問や議論をご紹介する予定です。今日はWebLogic on ODAのサイジングならびにストレージに関する詳細を見ていきましょう。
Oracle Database Applianceでは、各VMがOracle Enterprise LinuxをOSとして動作しており、そこにアプリケーション、例えばWebLogic Serverをインストールしていきます。
下表は各VMでWebLogic ServerならびにOracle Traffic Directorに割り当てられているリソースをまとめたものです。
VM vCPU MEM JVM Heap
OTD管理サーバー 2 1 GB n/a
OTDサーバーインスタンス 2 4 GB n/a
WebLogic管理サーバー 2 2 GB 512 MB
WebLogic管理対象サーバー 2 6 GB 3 GB

ストレージについては、下表でDatabase Applianceの最新版(X3-2)の詳細をまとめています。
メモリ 512GB
CPUコア数 32
ハイパフォーマンスドライブ 18 TB Raw
SSDドライブ 800 GB
拡張ストレージシェルフ ハイパフォーマンス: 18TB Raw, SSD: 800 GB
IOPS 7K
IO帯域幅 5GB/s

WebLogic ServerとOracle Traffic Directorがデプロイされるユーザードメインのために、各ノードで250GBのローカルストレージをご利用頂けます。

[Security, FMW, SOA] .NET interoperability, Kerberos, SPNEGO, Id Propagation - All things Microsoft! - OWSM 11g - Revisited

原文はこちら。
https://blogs.oracle.com/owsm/entry/net_interoperability_kerberos_spnego_id1

以前のエントリで、Microsoft製品との相互運用性やKerberos、SPNEGO、NTLMなどのOWSMでのサポートについてお伝えしましたが、いくつか追記しておきます。
.NET interoperability, Kerberos, SPNEGO, Id Propagation - All things Microsoft! - OWSM 11g
https://blogs.oracle.com/owsm/entry/net_interoperability_kerberos_spnego_id
http://orablogs-jp.blogspot.jp/2012/08/net-interoperability-kerberos-spnego-id.html
SPNEGO support
以前のエントリでは、SPNEGOはOWSMでサポートされていないと説明していました。
PS6では、RESTセキュリティのサポートを導入したことに伴い、SPNEGOのサポートも追加されました。キードライバーはRESTサービスであり、RESTサービスの保護でしたが、HTTP/SOAPサービスのSPNEGOポリシーもまたサポートしています。
実は、お客様がご存知のことの一つに、RESTサービスを保護するために導入された多くのポリシーもまた、HTTP/SOAP Webサービスをサポートしています。
SPNEGOのサポートに関するドキュメントは以下にあります。
Oracle® Fusion Middleware Security and Administrator's Guide for Web Services 11g Release 1 (11.1.1.7)
B Predefined Policies
Authentication Only Policies
http://docs.oracle.com/cd/E28280_01/web.1111/b32511/policies.htm#CHDEJIIF
oracle/multi_token_rest_service_policy
http://docs.oracle.com/cd/E28280_01/web.1111/b32511/policies.htm#CJAIEDEG

Oracle® Fusion Middleware Security and Administrator's Guide for Web Services 11g Release 1 (11.1.1.7)
C Predefined Assertion Templates - oracle/http_spnego_token_client_template
http://docs.oracle.com/cd/E28280_01/web.1111/b32511/assertions.htm#CHDBICJC
[注意]
OWSMはNTLMをサポートしていません。

Interoperability with Microsoft environments

お客様から頂く質問の中で最も多いものの一つに、SAMLを使いMicrosoft製品とOracle製品の環境間でIDの伝播が可能かどうか、STS(secure token service)としてADFSを使いSAMLベースのID伝播が可能か、というものです。
PS6では、(Oracle STS、OpenSSO STSの動作保証に加えて)ADFSとの組み合わせでの動作検証をし、動作を保証しています。

Client side Kerberos support

多くの人が以前のエントリの図をご覧になって、OSBはクライアント側でKerberosをサポートしていないと考えてらっしゃるようですが、明確にしておきたいのは、実際には、以下のような構成では、これまでもKerberosポリシーをクライアント側でもサポートしている、ということです。

主要な制限として、以前のエントリでご紹介したように、Kerberosを複数のホップ間で利用できない、ということです。しかしながら、Webサービスクライアントを保護するためにKerberosポリシーを使うこと自体は可能です。

[Java] Oracle JDK 7u21 released with new security features

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

OracleはJavaのCritical Patch Updateをリリースしました。これにはJDK6とJDK7のアップデートが含まれています。CPUの詳細は以下のエントリに記載がありますし、またリリースノートにも記載されています。
Oracle Java SE Critical Patch Update Advisory - April 2013
http://www.oracle.com/technetwork/topics/security/javacpuapr2013-1928497.htmlApril 2013 Critical Patch Update for Java SE Released
https://blogs.oracle.com/security/entry/april_2013_critical_patch_update1
Update Release Notes - Java™ SE Development Kit 7, Update 21 (JDK 7u21)
http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.htmlUpdate Release Notes - Java™ SE Development Kit 6, Update 45 (JDK 6u45)
http://www.oracle.com/technetwork/java/javase/6u45-relnotes-1932876.html
JDK 7 Updateではセキュリティの改善を意図した数多くの機能強化が盛り込まれています。機能詳細はリリースノートをご覧下さい。このリリースは以下のサイトからダウンロードできます。
質問回答
JDK 6のアップデートもあるのですか?ええ、製品の商用ライフサイクルの期間は、Oracle Supportをご契約いただいているお客様であれば、My Oracle Supportを通じてJDK 6のアップデートをご利用いただけます(現時点では2016年12月を予定しています)。
Oracle Java SE Support Roadmap
http://www.oracle.com/technetwork/java/eol-135779.html
また、今回はパブリックアップデート終了日を過ぎたのに、JDK 6に対するアップデートを追加しましたが、これはこのCPUに含まれるセキュリティ修正を広くご利用頂くためです。
Java 6 End of Public Updates extended to February 2013
https://blogs.oracle.com/henrik/entry/java_6_eol_h_h
JDK 6のアップデートは今後も出るのですか?いいえ、JDK 6に対するパブリックアップデートは今後予定していません。6月に予定されている次のリリースでは、JDK 6u45はOracle Java Archiveに移動する予定になっています。
Critical Patch Updates, Security Alerts and Third Party Bulletin
http://www.oracle.com/technetwork/topics/security/alerts-086861.html
Oracle Java Archive
http://www.oracle.com/technetwork/java/archive-139210.html
Oracle JDKを無料で使いたいのですが、JDK 7に移行する方法を教えて下さい。この件は過去のエントリをご覧下さい。
Migrating from Java SE 6 to Java SE 7
https://blogs.oracle.com/henrik/entry/migrating_from_java_se_6
企業ITで今後もJDK 6を使う必要があります。Oracle JDK 6のサポートを継続する方法はありますか?Oracleのミドルウェアもしくはアプリケーションをお使いのお客様であれば、それらの製品で利用しているJDKのサポートはサポート契約に含まれています。その他の3rdパーティーアプリケーションで使う場合、Java SE Supportをご契約頂くと、JDKのサポート期間を延長することができます。
Oracle Java SE Support
http://www.oracle.com/us/technologies/java/standard-edition/support/overview/index.html
Java SE Supportの価格表は公開されていますか?はい、shop.oracle.comをご覧下さい。
2013年4月17日現在、デスクトップ1台あたり5USドル、サーバーの1プロセッサあたり250USドルです(いずれも1年間の金額)。大規模に必要な場合は弊社の営業におたずね下さい。

[Java] Java 8: Secure the train

原文はこちら。
http://mreinhold.org/blog/secure-the-train

Webブラウザ内で実行するJavaに関連するセキュリティの脆弱性が最近世間の注目を集めており、Oracleでは一連のCritical Patch Update(最新のCritical Patch Updateは今週はじめにリリース)でこうした問題に対応するためリソースを投入してきました。また、開発プロセスを見直し、新しいコードに対する精査のレベルを上げ、新しい脆弱性が入らないように改善しています。
Java SE 7 Update 21 Release and more
https://blogs.oracle.com/java/entry/java_se_7_update_21
http://orablogs-jp.blogspot.jp/2013/04/java-se-7-update-21-release-and-more.html
Javaプラットフォームのセキュリティを維持することは新機能開発よりも優先されるもので、こうした労力のために必然的にエンジニアはJava 8の開発のための時間が少なくなってきました。もともと1月をFeature-Completeターゲット(機能の完成目標)としていたのに、ある機能がMilestone 6(M6)に間に合わなかった理由の一つがこれです。
JDK 8 M6 status, and extending M7
http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-February/002066.html
今後、Oracleは、ペースを速めてセキュリティ問題を修正し続け、Javaのセキュリティモデルを強化し、新しいセキュリティ機能を導入することに尽力します。この作業には、多くのエンジニアの作業が必要で、Java 8から機能を落としたり、この段階でリリースの範囲を削減したりしても賄いきれません。

セキュリティにフォーカスするため、Java 8のスケジュール(9月上旬にGA版をリリース)はもはや達成できません。
JDK8
http://openjdk.java.net/projects/jdk8/

Status

以前書いたように、M6に間に合わなかった最も重要な作業はProject Lambdaという、このリリースの唯一の前に進める機能に関係しています。昨年末にLambdaのために言語とVMの変更を統合しましたが、すべての関係する可動部品とセキュリティの仕事の間にはstream APIと関連するコアライブラリの機能強化を仕上げるのに予想よりもちょっと時間がかかりました(JEP107と109)。現状では最善でも5月上旬までにこの作業が終了できる、つまり予定よりも3ヶ月遅れとみています。
JEP 107: Bulk Data Operations for Collections
http://openjdk.java.net/jeps/107
JEP 109: Enhance Core Libraries with Lambda
http://openjdk.java.net/jeps/109
M6に間に合わなかった別の機能はリリースのドライバではありませんので、理論的にはリリースからこうした機能を落とすことも可能ですが、Lambdaにもっと時間が必要な場合、それをしても意味がありません。

Alternatives

では、どうしたらいいでしょう?多くのオプションがありますが、それらのいくつかを見てみましょう。
9月上旬のGAリリースという、現在のスケジュールを維持するために、リリースからLambdaを落とす
Lambdaを削除すると、残りの機能は面白いけれども全体として、あまり魅力的ではありません。そんなわけで、今年Lambdaを落としてリリースしても、幅広く支持されないでしょう。これまでに提案した2年というサイクルを維持する場合、Lambda自体は2016年までご利用いただけないませんし、誰もそんなに長く待てないと思っています。
Lambdaは残すが、フィードバックやテストの時間を減らしてスケジュールを守る
品質を犠牲にしてスケジュールを守るならば、確実に過去の月並みな間違いを繰り返すことになるでしょう。これらの機能もしくはプラットフォーム全体が別の新しいものに置き換わるまで、数百万もの開発者が何年も自分たちの欠陥を回避しなければならない、と不完全な言語への変更とAPIの設計を仮想の石碑に刻むことになるでしょう。
1年以上遅らせて、以前リリースから落としたProject Jigsawを取り込む
Lambdaほぼ完成しているので、リリースを遅らせることは理にかなっていないと思っています。まして、Jigsawを仕上げるとおそらく1年以上の遅延になるでしょう。それは、OracleのJigsawチームの主要メンバーがセキュリティの問題に多くの時間を費やしているという、以前お伝えしたような理由のためです。

Hold the train

これが一番ましなオプションかな、と思っています。
Lambdaが完成するようにスケジュールを遅らせ、徹底的にレビューおよびテストした後にリリースする
我々は5月上旬までに残りの設計や開発の仕事を終えることができるならば、夏にビルドのテストおよび安定化が可能で、しっかりしたDeveloper Previewリリースを9月上旬にリリースできるはずです。

Java 8の新しいGAの日を決めるためにはもう少し計画策定が必要ですが、2014年の第1四半期にリリースできるんじゃないかな、と思っています。

これはつまり、現在のGA日である9月初旬から3ヶ月以上遅れるということです。この時点で、11月にGAリリースを準備できていることを確信していませんし、経験上、12月に主要なソフトウェアリリースを出荷しようとするのはほとんどの場合あまりよろしくないので、GAの日付を第一四半期としています。

このオプションは、Java 8のたくさんの新機能のための門戸を開かないでしょうし、既存の機能の範囲を際限なく拡大することもできないでしょう。選ばれた少数の追加機能(特にセキュリティに関連する分野)を追加する可能性がありますが、一般的には、この時間を使って、すでにできあがっている機能を安定化し磨き上げ、チューニングするので、新しい機能を追加しないでしょう。以前後者の道を選択してきましたが、長くひどいものです。
J2SE 1.2 (December 8, 1998)
http://en.wikipedia.org/wiki/Java_version_history#J2SE_1.2_.28December_8.2C_1998.29
これが最善のコースなのでしょうか。代替案よりはましだと思っていますが、提案を待っています。その間に、Java SE 8 Expert GroupおよびJDK8プロジェクトでの参照実装のコントリビュータ-に同じ質問をするつもりです。
Java SE 8 Platform Umbrella JSR (337)
http://openjdk.java.net/projects/jdk8/spec/

Features vs. schedule

以前このように主張しました。
「定期的かつリズミカルなリリースプロセスと緩く結合されているだけの、イノベーションの連続パイプラインとしてJava開発プロセスを構築することが最善だ」
主要な機能が当初予定していた列車に間に合わない場合、残念ではあるにせよ、それが世界の終わりではないですし、次の列車が到来するわけで、しかもその列車(リリース日)は予想された時間に出発するわけです。
Project Jigsaw: Late for the train: The Q&A
http://mreinhold.org/blog/late-for-the-train
これはよいポリシーだと今も思っていますが、このケースでこのポリシーを厳守すると、上記の最初のオプション、つまりLambdaをリリースから落としてスケジュールを守るというオプションを取ることを意味しますが、これを誰もが実際に望んでいることかというと非常に疑わしいと思っています。したがって、この一般的なポリシーに対する例外はありだと思っています。

上記の提案を採用いただけるならば、我々がコミットしたブラウザ関連のセキュリティ対策を完了した後、通常の2年間のリリースサイクルを再開して、2014年はじめにJava8、2016年はじめにJava9をリリースすることができるはずです。

[Data Integration] ODI - Integrating social data from Facebook Graph API in 0 to 60

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

データをプッシュするための技術に常に目を光らせていますが、今回はデータフローにFacebookのデータを統合する方法をご紹介するViewletです。一般的にはJSONでの連係のためのプリプロセッサを使用してデータを統合しています。

ジグソーパズルのピースがいくつかあるのですが、ODIはXMLドライバーを提供しております。これを使ってXMLデータをファイルやHTTP、FTPなどから読み出して処理します。ODI 11.1.1.7ではOracleの標準XMLスキーマ/パースコンポーネントを使っているので、この機能が改善されました。JSONからXMLへの変換は既にXMLベースのツールやユーティリティをお持ちなら便利な方法の一つでしょう。このユーティリティを使い、JSONデータをデータ統合フローに取り込み、プロセス内でデータの詳細を理解します(JSONをリバース・エンジニアリングしてスキーマを取得します)。これを利用し、TwitterやFacebook、GoogleやDatasiftといったアグリゲーターからのデータフィードのような、任意のJSONデータを統合することができます。

ぜひViewletをご覧になって下さい。

[Java] Maven projects with GlassFish 4.0 Embedded Plugin

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

Java Server Faces 2.2 (JSR 344)のように、すでにFinalになっているJava EE 7関連の仕様がありますが、Java EE 7やGlassFish 4.0のファイナルバージョンを待つ必要はありません。GlassFishは新しい機能に挑戦するための参照実装(Reference Implementation)なのです。
Java Server Faces Specification
http://javaserverfaces-spec-public.java.net/
JSR 344: JavaServerTM Faces 2.2
http://jcp.org/en/jsr/detail?id=344
MavenとGlassFish Embeddedとの統合についてブログエントリを書きました。この中で、ちょっとした手順を踏めば、Java EE 7アプリケーションを作成し、GlassFishをインストールせずにGlassFish Embedded 4.0を実行することができます。
GlassFish Embedded
http://embedded-glassfish.java.net/
このセットアップのいい点は、Finalバージョンが出た時点ですぐに使える、ということです。やるべきことは、依存性とPOM.xmlファイルのプラグインのバージョンを更新することです。さぁ、書を捨ててコーディングを始めましょう!

以下のエントリを読んで、Java EE 7を今日から始めましょう!
GlassFish 4 beta and Maven Embedded Plugin
https://blogs.oracle.com/brunoborges/entry/glassfish_4_beta_and_maven
http://orablogs-jp.blogspot.com/2013/04/glassfish-4-beta-and-maven-embedded.html

[Java] GlassFish 4 beta and Maven Embedded Plugin

原文はこちら。
https://blogs.oracle.com/brunoborges/entry/glassfish_4_beta_and_maven

お披露目前にJava EE 7を試す簡単な方法を探してらっしゃるのではないでしょうか。現在JSRがFinalになっているもの(JMS、Batch、JSONなど)は特にそうでしょう。ArunがすでにJava EE 7プロジェクトをMavenとともに使う件についてご紹介していますが、Mojo projectがCodehausで提供しているarchetypeからは一つ重要なものが抜けています。そう、Maven Plugin for GlassFish Embeddedです。
JMS 2, Bean Validation 1.1, JBatch, JSON-P Go Final!
https://blogs.oracle.com/theaquarium/entry/jms_2_bean_validation_1
Java EE 7 Maven Archetype - Available in NetBeans (TOTD #201)
https://blogs.oracle.com/arungupta/entry/java_ee_7_maven_archetype
Maven Embedded GlassFish Plugin
http://embedded-glassfish.java.net/nonav/plugindocs/3.1/plugin-info.html
GlassFish Embedded
http://embedded-glassfish.java.net/
このプラグインはすばらしい理由は、開発者はGlassFishをローカルにダウンロード、インストール、構成しなくてよい、という点です。やるべきことは、JDKとMavenをインストールするだけです。それから、ちゃんと動くものならどんなIDEでも選択できます(今はNetBeansで動かしていますが、Sublime Text 2も大好きです)。簡単な3ステップのコマンドでOKです。
  1. $ git clone http://myrepo/myproject
  2. $ cd myproject
  3. $ mvn embedded-glassfish:run
    ... ローカルリポジトリにダウンロードが完了するまで待ちましょう...
終わりました!MavenとJDK(あ、この場合はGitもですね)以外のインストールに依存しない、シンプルなプロジェクトです。それではEmbeddedプラグインを使う場合のpom.xmlの設定方法をご紹介しましょう。
  1. Arunがブログで書いていたように、Codehaus archetypeベースのプロジェクトを作成します。ブラウザの履歴のため、ここにコマンドラインをコピーしています(訳注:表現上改行を入れていますが、実際には1行でお願いします)。
    mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes 
        -DarchetypeArtifactId=webapp-javaee7
        -DarchetypeVersion=0.3-SNAPSHOT 
        -DarchetypeRepository=https://nexus.codehaus.org/content/repositories/snapshots/
        -DgroupId=org.glassfish
        -DartifactId=javaee7-sample 
        -Dversion=1.0-SNAPSHOT
        -Dpackage=org.glassfish.javaee7-sample 
        -Darchetype.interactive=false
        --batch-mode --update-snapshots archetype:generate
  2. pom.xmlを開き、<plugins>セクションの最後に移動します。
  3. 以下のpluginを<build><plugins>セクションに追記します。
  4. 
           org.glassfish.embedded
             maven-embedded-glassfish-plugin
             3.1.2.2
             
                target/${project.artifactId}-${project.version}
                8282
                ${project.artifactId}
             
             
               
               org.glassfish.main
               simple-glassfish-api
               4.0-b79
             
             
               org.glassfish.main.extras
               glassfish-embedded-all
               4.0-b83
             
           
         
    
  5. (2013年4月13日に更新)以下のpluginRepositoryの設定をPOMに記述するのを忘れないで下さい!
  6. 
            
                maven.java.net
                Java.net Repository for Maven
                https://maven.java.net/content/groups/promoted/
            
            
                maven2-repository.dev.java.net
               Java.net Repository for Maven
                http://download.java.net/maven/glassfish/
            
        
    
  7. 以下のMavenのコマンドを実行し、ブラウザでhttp://localhost:8282/javaee7-sampleを開きます。
  8. $ mvn package embedded-glassfish:run
プラグインの依存性を修正しなければならない理由は、GlassFish 4 promoted buildに対応したEmbedded Pluginがまだリリースされていないからです。すでに一部のあーティファクトはあるのですがね(b79用のsimple-glassfish-apiとか。バージョンが違うのは、b83がまだリリースされていないからです)。公式リリースのタイミングでプラグインがアップデートされることでしょう。

ところで、このEmbedded Pluginの設定で、Java Server Facesページを編集することができます。ブラウザの更新ボタンを押してみてください。Mavenのターゲットディレクトリに展開されたWARを指すよう構成されています。デザイナー向けの素晴らしいセットアップの仕組みですね。

お披露目前にJava EE 7のコーディングを楽しみましょう!

[Java] Java SE 7 Update 21 Release and more

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

Oracleは以下のJavaのアップデート3件をリリースしました。いくつかの重要なセキュリティ設定変更を含んでいますのでご注意下さい。
Java SE 7 Update 21
このリリースには新機能およびセキュリティ脆弱性に対する修正が含まれています(新しいServer JRE、WindowsプラットフォームのUninstall AppletとリンクしたJREインストーラ、セキュリティダイアログへの変更など)。全てのJava SE 7ユーザーがこのリリースにアップグレードすることをOracleは強く推奨します。
リリースノート
http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html
ダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Java SE 6 Update 45
このリリースにはセキュリティ脆弱性に対する修正が含まれています。
リリースノート
http://www.oracle.com/technetwork/java/javase/6u45-relnotes-1932876.html
ダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Java SE Embedded 7 Update 21
このリリースはJava Development Kit 7 Update 21 (JDK 7u21)をベースとして特定の機能を提供しています。組み込みシステムをサポートしています。
リリースノート
http://www.oracle.com/technetwork/java/javase/emb7u21-relnotes-1932887.html
ダウンロード
http://www.oracle.com/technetwork/java/embedded/downloads/javase/index.html

セキュリティの変更

セキュリティの修正に加え、Oracleはこのリリースで新しいセキュリティ機能を追加しています。これらは非常に重要です。
  • Server JRE (Server Java Runtime Environment)
    サーバーにJavaアプリケーションをデプロイするためのJREをこのバージョンで初めて利用できるようにしています。このバージョンには、サーバーアプリケーションで必要になることが多いJVM監視ツールが含まれています。しかしJavaプラグインとしてブラウザとの統合はなされていません。JDKベースですが、デプロイメント機能を持たないので、Solaris、Windows、Linuxプラットフォームで動作します。この製品の詳細は以下のリンクをご覧下さい。
    JDK 7 and JRE 7 Installation Guide
    http://docs.oracle.com/javase/7/docs/webnotes/install/index.html
  • Javaコントロールパネルのセキュリティ設定の変更
    このリリースで、カスタム設定がJavaコントロールパネル(JCP)のセキュリティスライダーから取り除かれました。Javaコントロールパネルで設定されたセキュリティレベルとユーザーの利用するJREのバージョン次第では、自己署名アプリケーションや署名のないアプリケーションを実行できない場合があります。のデフォルト設定では、全てのローカルのAppletがセキュアなJREで動作することが許可されます。ユーザーがセキュアでないJRE上で実行している場合、認定された認証局が発行した証明書で署名されたアプリケーションのみが実行可能です。詳細情報はJavaコントロールパネルのドキュメントのセキュリティの項をご覧下さい。
    Java Control Panel - Security
    http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/jcp.html#security
  • セキュリティダイアログの変更
    具体的に言えば、クライアントのブラウザ内で実行される全てのJavaコードはユーザーに対し操作を促すというものです。ダイアログメッセージはリスクの要素によって変わります。低リスクの場合はとても小さなダイアログを表示します。このダイアログには、同一ベンダーからの類似のダイアログを今後表示しないためのチェックボックスがあります。高リスクの場合、例えば署名のないjarを実行する場合、リスクが増大する可能性があるためユーザーの操作を必要とします。Java Source Blogの以下のエントリをご覧下さい。
    IMP: Your Java Applets and Web Start Applications Should Be Signed
    https://blogs.oracle.com/java/entry/imp_your_applets_and_web
    http://orablogs-jp.blogspot.com/2013/03/imp-your-java-applets-and-web-start.html
    開発者、ユーザーに役立つリソースをご紹介します。
  • RMIの変更
    このリリースから、RMIプロパティjava.rmi.server.useCodebaseOnlyがデフォルトでtrueになっています。以前のリリースではデフォルトでfalseでした。このデフォルト値の変更により、RMIベースのアプリケーションが予期せず終了する可能性があります。典型的な症状は、ネストしたjava.lang.ClassNotFoundExceptionを含むjava.rmi.UnmarshalExceptionが含まれるスタックトレースを出します。詳細はJava SE 7のRMI Enhancementsの項をご覧下さい。
    Java SE 7 Documents - Enhancements in JDK 7
    http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
  • JDK for Linux on ARM
    このリリースにはARM上でのLinux用JDKのサポートが含まれています。ARMv6およびARMv7へのサポートてんこ盛りで提供します。

[Java] Java EE 7 and JAX-RS 2.0

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

この記事はJava EE 7の新機能を紹介するものです。詳細はJava.netのJava EE Platform Specificationから情報を入手して下さい。
Java EE Platform Specification
http://java.net/projects/javaee-spec/pages/Home
サンプルコード (Zip)
ほとんどのJava EE 6アプリケーションでリモートAPIと自由選択を要件とする場合、多かれ少なかれJAX-RS 1.0仕様のRESTfulな趣を使っています。Java EE 7とJAX-RS 2.0により、種々の有用な機能がもたらされ、さらに開発が簡単になり、もっと洗練された、しかも効率的なJava SE/EE RESTfulアプリケーションを作成することができます。

Roast House

Roast HouseとはJavaフレンドリーではあるもののシンプルなJAX-RS 2.0のサンプルで、コーヒー豆を管理し、煎るサンプルです。 このroast house自体はCoffeeBeansResourceとして表現されています。"coffeebeans"というURIは、CoffeeBeansResourceを一意に識別します(コード1を参照)。
コード1
//...
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
@ApplicationScoped
@Path("coffeebeans")
public class CoffeeBeansResource {
    
    @Context
    ResourceContext rc;
    
    Map<String, Bean> bc;

    @PostConstruct
    public void init() {
        this.bc = new ConcurrentHashMap<>();
    }

    @GET
    public Collection<Bean> allBeans() {
        return bc.values();
    }

    @GET
    @Path("{id}")
    public Bean bean(@PathParam("id") String id) {
        return bc.get(id);
    }

    @POST
    public Response add(Bean bean) {
        if (bean != null) {
            bc.put(bean.getName(), bean);
        }
        final URI id = URI.create(bean.getName());
        return Response.created(id).build();
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") String id) {
        bc.remove(id);
    }
    
    @Path("/roaster/{id}")
    public RoasterResource roaster(){
        return this.rc.initResource(new RoasterResource());
    }
}
以前のJAX-RS仕様では、リソースは@Singleton もしくは @Stateless EJBとすることができます。さらに、すべてのルートリソースやプロバイダー、Applicationのサブクラスをmanaged beanもしくはCDI-managed beanとしてデプロイすることができます。@Providerアノテーションをつけたすべての拡張でInjectionも利用できます。これを使うと既存のコードとの統合が簡単になります。JAX-RS固有のコンポーネントをResourceContextを使ってサブリソースに注入することも可能です。
コード2
@Context
    ResourceContext rc;

    @Path("/roaster/{id}")
    public RoasterResource roaster(){
        return this.rc.initResource(new RoasterResource());
    }
興味深いことに、javax.ws.rs.container.ResourceContextを使うと、JAX-RSの情報を既存インスタンスに注入できるだけでなく、ResourceContext#getResource(Class<T> resourceClass)メソッドをもつリソースクラスにアクセスすることもできます。JAX-RSランタイムが現在のコンテキストからResourceContext#initResourceメソッドに渡されるインスタンスの注入ポイントを値で設定します。RoasterResourceクラス(コード3参照)のidというString型のフィールドは、親リソースのパスパラメータの値を受け取ります。
コード3
public class RoasterResource {

    @PathParam("id")
    private String id;

    @POST
    public void roast(@Suspended AsyncResponse ar, Bean bean) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
        }
        bean.setType(RoastType.DARK);
        bean.setName(id);
        bean.setBlend(bean.getBlend() + ": The dark side of the bean");
        Response response = Response.ok(bean).header("x-roast-id", id).build();
        ar.resume(response);
    }
}
javax.ws.rs.container.AsyncResponseというパラメータは、Servlet 3.0のjavax.servlet.AsyncContextクラスと類似しており、非同期リクエストの実行が可能です。上の例では、リクエストを処理時間の間遅延させ、AsyncResponse#resumeメソッドの呼び出しによりクライアントへレスポンスを返しています。roastメソッド自体は同期実行されるため、非同期実行による挙動は全く現れませんが、EJBの@javax.ejb.Asynchronous アノテーションと@Suspended AsyncResponseアノテーションの組み合わせを使うと、関心のあるクライアントの最終的な通知をする、業務ロジックを非同期で実行することができます。任意のJAX-RSルートリソースを@Stateless or @Singleton アノテーションで修飾することができ、事実上、EJBとして機能することができます(コード4を参照)。
コード4
import javax.ejb.Asynchronous;
import javax.ejb.Singleton;

@Stateless
@Path("roaster")
public class RoasterResource {

    @POST
    @Asynchronous
    public void roast(@Suspended AsyncResponse ar, Bean bean) {
    //heavy lifting
        Response response = Response.ok(bean).build();
        ar.resume(response);
    }
}
@Suspended AsyncResponse パラメータをもつ@Asynchronousリソースのメソッドをfire-and-forgetの一方向非同期型で実行します。リクエスト処理スレッドは即座に解放されますが、AsyncResponse によりは以前としてクライアントに対し便利なハンドルを提供します。時間のかかる作業が終わってから、結果をクライアントにタイミングよく返すことができます。通常の場合、JAX-RS固有の挙動を実際の業務ロジックから切り離したいと思うことでしょう。すべての業務ロジックは簡単に専用の境界のEJBに展開できますが、CDIのイベントを使うとこのfire-and-forgetの場合にずっとよく適合することができます。カスタムイベントクラスであるRoastRequestは処理対象の入力として(Beanクラスの)ペイロードをとり、結果の送信のためにAsyncResponseとります(コード5参照)。
コード5
public class RoastRequest {

    private Bean bean;
    private AsyncResponse ar;

    public RoastRequest(Bean bean, AsyncResponse ar) {
        this.bean = bean;
        this.ar = ar;
    }

    public Bean getBean() {
        return bean;
    }

    public void sendMessage(String result) {
        Response response = Response.ok(result).build();
        ar.resume(response);
    }

    public void errorHappened(Exception ex) {
        ar.resume(ex);
    }
}
CDIイベントは業務ロジックとJAX-RSのAPIを切り離すだけでなく、JAX-RSのコードを非常にシンプルにします(コード6参照)。
コード6
public class RoasterResource {

    @Inject
    Event<RoastRequest> roastListeners;

    @POST
    public void roast(@Suspended AsyncResponse ar, Bean bean) {
        roastListeners.fire(new RoastRequest(bean, ar));
    }
}
すべてのCDI managed beanやEJBはpublish-subscribe型のRoastRequestを受け取ることができ、同期・非同期とわず、簡単なvoid onRoastRequest(@Observes RoastRequest request){}というobserverメソッドを使ってペイロードを処理することができます。AsyncResponseクラスを使って、JAX-RS仕様はHTTPプロトコルでリアルタイムで情報をプッシュする簡単な方法を導入しています。クライアントの観点からすると、サーバーでの非同期リクエストは未だにブロックされているため同期型です。REST設計の立場からすれば、すべての長時間実行しているタスクは処理が完了した後に結果を入手する方法に関する追加情報とともに、HTTPステータスコード202で即座に返すべきでしょう。

The Return of Aspects

人気のあるREST APIは多くの場合、クライアントがメッセージのフィンガープリントを計算し、リクエストと一緒に送信する必要があります。サーバー側では、フィンガープリントを計算し、添付された情報と比較します。両方が一致しない場合、メッセージを拒否します。JAX-RSが出てきて、javax.ws.rs.ext.ReaderInterceptor javax.ws.rs.ext.WriterInterceptorの導入に伴い、トラフィックをクライアント側でもサーバ側でも傍受される可能性があります。サーバー上のReaderInterceptorインタフェースの実装はMessageBodyReader#readFromをラップしており、実際のシリアル化前に実行されます。
The PayloadVerifier はヘッダから署名を取り出し、ストリームからフィンガープリントを計算し、最終的にReaderInterceptorContext#proceedメソッドを呼び出します。このメソッドはチェーンの次のインターセプターもしくは MessageBodyReaderインスタンスを呼び出します(コード7参照)。
コード7
public class PayloadVerifier implements ReaderInterceptor{

    public static final String SIGNATURE_HEADER = "x-signature";

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext ric) throws IOException, 
    WebApplicationException {
        MultivaluedMap<String, String> headers = ric.getHeaders();
        String headerSignagure = headers.getFirst(SIGNATURE_HEADER);
        InputStream inputStream = ric.getInputStream();
        byte[] content = fetchBytes(inputStream);
        String payload = computeFingerprint(content);
        if (!payload.equals(headerSignagure)) {
            Response response = Response.status(Response.Status.BAD_REQUEST).header(
            SIGNATURE_HEADER, "Modified content").build();
            throw new WebApplicationException(response);
        }
        ByteArrayInputStream buffer = new ByteArrayInputStream(content);
        ric.setInputStream(buffer);
        return ric.proceed();
    }
    //...    
}
変更されたコンテンツは結果として異なるフィンガープリントになるため、BAD_REQUEST (400) というレスポンスコードとともにWebApplicationExceptionを例外として送出する原因になります。
すべてのフィンガープリントの計算や送出するリクエストの計算をWriterInterceptorの実装により簡単に自動化できます。WriterInterceptorの実装はMessageBodyWriter#writeToをラップしており、この実装はエンティティをシリアル化してストリームに投入する前に実行されます。フィンガープリントの計算については、送信中のエンティティの最終的な表現を必要とするので、バッファとしてのByteArrayOutputStreamに渡し、WriterInterceptorContext#proceed()メソッドを呼び出し、生のコンテンツを取り出してフィンガープリントを計算します(コード8参照)。
コード8
public class PayloadVerifier implements WriterInterceptor {
    public static final String SIGNATURE_HEADER = "x-signature";

   @Override
    public void aroundWriteTo(WriterInterceptorContext wic) throws IOException, 
WebApplicationException {
        OutputStream oos = wic.getOutputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        wic.setOutputStream(baos);
        wic.proceed();
        baos.flush();
        byte[] content = baos.toByteArray();
        MultivaluedMap<String, Object> headers = wic.getHeaders();
        headers.add(SIGNATURE_HEADER, computeFingerprint(content));
        oos.write(content);

    }
    //...
}
最終的に、計算された署名をリクエストにヘッダとして追加し、バッファを元のストリームに書き出します。その上で、リクエスト全体をクライアントに送信します。当然ながら、一つのクラスで同時に両方のインターフェースを実装することもできます。
コード9
import javax.ws.rs.ext.Provider;
@Provider
public class PayloadVerifier implements ReaderInterceptor, WriterInterceptor {
}
以前のJAX-RSリリースのように、カスタム拡張を自動的に発見し、@Providerアノテーションを使って登録します。MessageBodyWriterMessageBodyReaderインスタンスの傍受については、ReaderInterceptorWriterInterceptorの実装のみを@Providerアノテーションで修飾すればよく、追加の構成やAPIの呼び出しは不要です。

Request Interception

ContainerRequestFilterContainerResponseFilterの実装はエンティティの読み書き処理だけではなく、リクエスト全体を傍受します。両インターセプターの機能は、生のjavax.servlet.http.HttpServletRequestインスタンスに含まれている情報のロギングよりも、はるかに便利です。TrafficLoggerクラスはHttpServletRequestに含まれる情報をログに記録するだけでなく、特定のリクエストに一致するリソースに関する情報をトレースすることもできます(コード10参照)。
コード10
@Provider
public class TrafficLogger implements ContainerRequestFilter, ContainerResponseFilter {

    //ContainerRequestFilter
    public void filter(ContainerRequestContext requestContext) throws IOException {
        log(requestContext);
    }
    //ContainerResponseFilter
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext 
                                                 responseContext) throws IOException {
        log(responseContext);
    }

    void log(ContainerRequestContext requestContext) {
        SecurityContext securityContext = requestContext.getSecurityContext();
        String authentication = securityContext.getAuthenticationScheme();
        Principal userPrincipal = securityContext.getUserPrincipal();
        UriInfo uriInfo = requestContext.getUriInfo();
        String method = requestContext.getMethod();
        List<Object> matchedResources = uriInfo.getMatchedResources();
        //...
    }

    void log(ContainerResponseContext responseContext) {
        MultivaluedMap<String, String> stringHeaders = responseContext.getStringHeaders();
        Object entity = responseContext.getEntity();
    //...
    }
}
従って、登録されたContainerResponseFilterの実装はContainerResponseContextのインスタンスを取得して、サーバーが生成したデータにアクセスすることができます。ステータスコードとヘッダーの内容、例えばLocationヘッダーは簡単にアクセスできます。ContainerRequestContextContainerResponseContextはフィルターによって変更される可能性のある可変クラスです。
追加の構成をせずに、ContainerRequestFilterをHTTPーリソース照合フェーズの後で実行します。この時点ではもはや入ってくるリクエストを変更してリソースバインディングをカスタマイズすることはできません。リクエストとリソース間のバインディングに影響を与えたい場合には、ContainerRequestFilterを構成し、リソースバインディングフェーズの前に呼び出されるようにすればよいのです。javax.ws.rs.container.PreMatchingアノテーションで修飾されている任意のContainerRequestFilterをリソースバインディングの前に実行するので、HTTPリクエストコンテンツを所望のマッピングに微調整することができます。よくある@PreMatchingフィルターのユースケースではHTTP同士を調整し、ネットワーク基盤の制限を克服しています。PUTOPTIONSHEADDELETEのような、より「難解」なメソッドをファイアウォールでフィルタリングしたり、HTTPクライアントでサポートしなかったりする可能性があります。@PreMatching ContainerRequestFilter実装は所望のHTTP動詞が示しているヘッダーから情報を取り出し(例えば"X-HTTP-Method-Override")たり、POSTリクエストを実行中にPUTリクエストに変更したりすることが可能です(コード11参照)。
コード11
@Provider
@PreMatching
public class HttpMethodOverrideEnabler implements ContainerRequestFilter {

    public void filter(ContainerRequestContext requestContext) throws IOException {
        String override = requestContext.getHeaders()
                .getFirst("X-HTTP-Method-Override");
        if (override != null) {
            requestContext.setMethod(override);
        }
    }
}

Configuration

@Providerアノテーションで登録されているすべてのインターセプターおよびフィルターはすべてのリソースで利用できます。デプロイ時にサーバーは@Providerアノテーションのデプロイメント単位をスキャンし、アプリケーションがアクティベートされる前に自動的にすべての拡張を登録します。すべての拡張を専用のJARにパッケージし、オンデマンドでWAR( WEB-INF/libフォルダの中に)でデプロイします。JAX-RSランタイムはJARをスキャンし、自動的に拡張を登録します。自己完結型のJARの一時的なデプロイメントはよいのですが、きめ細かい拡張のパッケージングを必要とします。JARに含まれるすべての拡張をすぐにアクティベートすることになるでしょう。
JAX-RSでは選択的なリソースの装飾のためのバインディングアノテーションを導入しています。機構はCDIのqualifierに類似しています。javax.ws.rs.NameBindingメタアノテーションがついた任意のカスタムアノテーションを使ってインターセプト・ポイントを宣言することができます。
コード12
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Tracked {
}
Trackedアノテーションがついたすべてのインターセプターやフィルターをアプリケーションのクラスやメソッド、サブクラスに同じTrackedアノテーションをつけることで選択的にアクティベートすることができます。
コード13
@Tracked
@Provider
public class TrafficLogger implements ContainerRequestFilter, ContainerResponseFilter {
}
アプリケーション開発者はカスタムのNameBindingアノテーションを対応するフィルターやインターセプターとともにパッケージングして、選択的にリソースへ適用することができます。アノテーション駆動アプローチによりすばらしく柔軟性が増し、より粗いプラグインパッケージを使用できますが、バインディングはまだ静的です。インターセプターまたはフィルタチェーンを変更するには、アプリケーションの再コンパイルし、効果的に再デプロイする必要があります。
分野横断的な機能のグローバルおよびアノテーション駆動型の構成に加えて、JAX-RS2.0では動的な拡張登録のための新しいAPIを導入しました。 @Providerアノテーションを付けたjavax.ws.rs.container.DynamicFeatureインタフェースの実装をインターセプターやフィルタの動的な登録のためのフックとしてコンテナが利用しますので、再コンパイルが不要になります。LoggerRegistrationの拡張は、条件付きで事前定義されたシステムプロパティの有無を照会することによってPayloadVerifierインターセプターとTrafficLoggerフィルタを登録します(コード14参照)。
コード14
@Provider
public class LoggerRegistration implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        String debug = System.getProperty("jax-rs.traffic");
        if (debug != null) {
            context.register(new TrafficLogger());
        }
        String verification = System.getProperty("jax-rs.verification");
        if (verification != null) {
            context.register(new PayloadVerifier());
        }
    }
}  

The Client Side

JAX-RS 1.1仕様ではクライアントを考慮していませんでした。クライアントREST APIのプロプライエタリな実装、例えばRESTEasyやJerseyなどは(Java EEで実装されていないものであっても)任意のHTTPリソースと通信できましたが、クライアントコードは特定の実装に直接依存していました。JAX-RS 2.0では新たに標準化されたClient APIが導入されています。標準化されたブート処理を使うと、Service Provider Interface (SPI) は置き換え可能です。APIはいろいろな機能を有しており、大部分のRESTクライアントの独自実装に類似しています (コード15参照)。
コード15
import java.util.Collection;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class CoffeeBeansResourceTest {

    Client client;
    WebTarget root;

    @Before
    public void initClient() {
        this.client = ClientBuilder.newClient().register(PayloadVerifier.class);
        this.root = this.client.target("http://localhost:8080/roast-house/api/coffeebeans");
    }

    @Test
    public void crud() {
        Bean origin = new Bean("arabica", RoastType.DARK, "mexico");
        final String mediaType = MediaType.APPLICATION_XML;
        final Entity<Bean> entity = Entity.entity(origin, mediaType);
        Response response = this.root.request().post(entity, Response.class);
        assertThat(response.getStatus(), is(201));

        Bean result = this.root.path(origin.getName()).request(mediaType).get(Bean.class);
        assertThat(result, is(origin));
        Collection<Bean> allBeans = this.root.request().get(
new GenericType<Collection<Bean>>() {
        });
        assertThat(allBeans.size(), is(1));
        assertThat(allBeans, hasItem(origin));

        response = this.root.path(origin.getName()).request(mediaType).delete(Response.class);
        assertThat(response.getStatus(), is(204));

        response = this.root.path(origin.getName()).request(mediaType).get(Response.class);
        assertThat(response.getStatus(), is(204));
    }
//..
}
上記の統合テストでは、デフォルトのClientインスタンスを、パラメータなしのClientFactory.newClient()メソッドを使用して取得しています。ブートストラッププロセス自体はjavax.ws.rs.ext.RuntimeDelegateという内部抽象ファクトリで標準化されています。RuntimeDelegateの既存のインスタンスをClientFactoryに注入する(例えば、依存性注入フレームワークによって)か、ファイルMETA-INF/services/javax.ws.rs.ext.RuntimeDelegateファイルと${java.home}/lib/jaxrs.propertiesファイルのヒントを探し、最終的にはjavax.ws.rs.ext.RuntimeDelegateシステムプロパティを検索して取得します。発見できない場合にはデフォルト(Jersey)の実装では、初期化しようとします。
javax.ws.rs.client.Clientの主要な目的はjavax.ws.rs.client.WebTargetjavax.ws.rs.client.Invocationインスタンスにスムーズにアクセスできるようにすることです。WebTargetはJAX−RSリソースを表し、Invocationは発行を待つ、すぐ使えるリクエストです。WebTargetInvocationファクトリでもあります。
CoffeBeansResourceTest#crud()メソッドで、Beanオブジェクトはクライアントとサーバーの間で送受信されます。MediaType.APPLICATION_XMLを選択すると、XMLドキュメントでシリアル化されたDTOの送受信のためにほんの数個のJAXBアノテーションを必要とします。
コード16
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Bean {

    private String name;
    private RoastType type;
    private String blend;

}
サーバーの表記でマーシャリングがうまくいくためにクラスや属性の名前は一致する必要がありますが、DTOがバイナリ互換である必要はありません。上の例では、両Beanクラスを異なるパッケージに配置し、異なるメソッドを実装しています。所望のMediaTypeWebTarget#request()メソッドに渡します(このメソッドは同期Invocation.Builderクラスのインスタンスを返します)。HTTP動詞(GETPOSTPUTDELETEHEADOPTIONS, もしくはTRACE)にちなんで名付けられたメソッドの最後の呼び出しは同期リクエストを開始します。
この新しいクライアントAPIは非同期リソース呼び出しもサポートしています。先ほど述べたように、Invocationインスタンスはsubmissionからリクエストを分離します。非同期リクエストを連鎖した、(AsyncInvokerインスタンスを返す)async()メソッドの呼び出しにより開始することができます(コード17参照)。
コード17
@Test
    public void roasterFuture() throws Exception {
    //...
        Future<Response> future = this.root.path("roaster").path("roast-id").request().async().post(entity);
        Response response = future.get(5000, TimeUnit.SECONDS);
        Object result = response.getEntity();
        assertNotNull(result);
        assertThat(roasted.getBlend(),containsString("The dark side of the bean"));
    }
上の例での「疑似非同期」の通信スタイルにはそれほどメリットはありません。クライアントは依然としてブロックしレスポンス到着を待つ必要があるからです。しかしながら、Futureベースの呼び出しはバッチ処理において非常に有用です。クライアントは様々なリクエストを一度に発行、Futureインスタンスを収集し、後で処理することが可能です。

本当に非同期の実装はコールバックを登録することで可能です(コード18参照)。
コード18
@Test
    public void roasterAsync() throws InterruptedException {
    //...
        final Entity<Bean> entity = Entity.entity(origin, mediaType);
        this.root.path("roaster").path("roast-id").request().async().post(
entity, new InvocationCallback<Bean>() {
            public void completed(Bean rspns) {
            }

            public void failed(Throwable thrwbl) {
            }
        });
    }
Futureを返す各メソッドについて、対応するコールバックメソッドを利用することもできます。メソッド(上記の例ではpost())の最後のパラメータとしてInvocationCallbackインタフェースの実装を受け入れ、呼び出しに成功した場合にはペイロードを、失敗した場合には例外をそれぞれ非同期で通知します。

組み込みのテンプレート機構を使い、URIの構築を自動化・合理化できます。事前定義されたプレースホルダはリクエストの実行の直前に置き換えられ、WebTargetインスタンスを繰り返し生成して保存することができます。
コード19
@Test
    public void templating() throws Exception {
        String rootPath = this.root.getUri().getPath();
        URI uri = this.root.path("{0}/{last}").
                resolveTemplate("0", "hello").
                resolveTemplate("last", "REST").
                getUri();
        assertThat(uri.getPath(), is(rootPath + "/hello/REST"));
    }
小さいけれども重要なことですが、クライアント側では、拡張を初期化時に発見するのではなく、明示的にClientインスタンスのClientFactory.newClient().register(PayloadVerifier.class)を使って登録する必要があります。ただし、同じエンティティのインターセプターの実装をクライアントとサーバーで共有することができます。これにより、テストを簡単にし、潜在的なバグを削減し、生産性を向上します。すでに導入されているPayloadVerifierインターセプターも同様にクライアント側で変更せずに再利用できます。

まとめ: Java EE or Not?

興味深いことに、JAX-RSは本格的なアプリケーションサーバーを必要としません。特定のContext Typeを満たした後、JAX-RS2.0に準拠したAPIを使用すると、何でもすることができます。ただし、EJB3.2との組み合わせにより、非同期処理、プーリング(スロットル)、監視が可能になります。Servlet 3との緊密な統合により、AsyncContextのサポートを通じて@Suspendedのレスポンスの効率的な非同期処理が可能になり、CDIランタイムがイベント機能をもたらします。また、Bean Validationはよく統合されており、リソースパラメータの検証に使用することができます。他のJava EE7のAPIと一緒にJAX-RS2.0を使用すると、リモートシステムへオブジェクトを公開するための、最も便利(=構成不要)にして最も生産的(=再発明不要)な方法を入手することができます。

参考資料

著者について

Adam Bienはコンサルタントで、Java EE 6/7、EJB 3.x、JAX-RS、JPA 2.xのJSRのExpert Groupメンバーです。JDK 1.0のころからServlets/EJB 1.0を使ってJavaテクノロジーを扱う仕事をしており、今ではJava SEおよびJava EEプロジェクトのアーキテクト、開発者です。JavaFX、J2EE、Java EEに関する書籍を執筆しており、「Real World Java EE Pattrerns - Rethinking Best Practices」と「Real World Java EE Night Hacks」の著者でもあります。
Real World Java EE Patterns—Rethinking Best Practices
http://realworldpatterns.com/
Real World Java EE Night Hacks
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 6/7 Workshops @Airport Munich, Germany
http://airhacks.com/

Join the Conversation

Facebook、Twitter、Oracle Java BlogでのJavaコミュニティの会話に参加して下さい!
Facebook
https://www.facebook.com/ilovejava
Twitter
https://twitter.com/java
Oracle Java Blog
https://blogs.oracle.com/java/

[WLS] Oracle is #1 in the Application Server Market Segment for 2012

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/oracle_is_1_in_the

Gartnerが2013年3月に発表したレポート「Market Share: All Software Markets, Worldwide 2012」によると、Oracleは2012年のApplication Serverのマーケットセグメントのシェア第1位(ソフトウェア収入ベース)を獲得しました。

参考資料

(*) Source: Gartner, Inc. “Market Share, All Software Markets, Worldwide, 2012," March 29, 2013, By Colleen Graham, Joanne Correia, David Coyle, Christine Arcaris, Fabrizio Biscotti, Matthew Cheung, Ruggero Contu, Federico de Silva Leon, Yanna Dharmasthira, Tom Eid, Chad Eschinger, Bianca Granetto, Hai Hong Swinehart, Hideaki Horiuchi, Koji Motoyoshi, Yurika Nagashima, Chris Pang, Asheesh Raina, Dan Sommer, Bhavish Sood, Michael Warrilow, Laurie Wurster and Jie Zhang”

[Database, Big Data] Accessing a Hive Table from Oracle Database

原文はこちら。
https://blogs.oracle.com/bigdataconnectors/entry/accessing_a_hive_table_from

HiveはHDFSのデータを問い合わせるためのツールで、人気のあるツールです。Oracle SQL Connector for HDFSはversion 2.0でHive表から直接データを読み取ることができます。また、Oracle SQL Connector for HDFSのコマンドラインツールが非常に簡素化されました。Hive表とHiveデータベース名をHadoop構成プロパティとして指定しさえすれば、コネクターはHive表のデータにアクセスすることができます。
oracle.hadoop.exttab.sourceType=hive
oracle.hadoop.exttab.hive.tableName=<hive table name>
oracle.hadoop.exttab.hive.databaseName=<hive database name>
コマンドラインツールは外部表をOracle Databaseに作成します。Hive表のデータにアクセスするためにこの外部表に対し問い合わせます。データベースの他の表のように外部表に問い合わせることができるので、Oracle SQLの機能を使ってHive表に対して問い合わせることができます。

外部表の名前とデータベース接続情報もHadoop構成プロパティとして指定します。
hadoop jar $OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable
-D oracle.hadoop.exttab.sourceType=hive \
-D oracle.hadoop.exttab.hive.tableName=<hive table name> \
-D oracle.hadoop.exttab.hive.databaseName=<hive database name> \
-D oracle.hadoop.connection.url=<database connection url> \
-D oracle.hadoop.exttab.tableName=<external table name> \
….
-createTable
外部表を作成している間にHive表のデータ型は外部表のOracleのデータ型に自動的にマッピングされます。以下はマッピングの例です。
Hive Tinyint, Smallint, Int Oracle NUMBER
Hive Float, Double Oracle NUMBER (default precision)
Hive Decimal Oracle NUMBER
Hive Boolean Oracle VARCHAR2(5)
Hive String Oracle VARCHAR2(4000)
Hive Timestamp Oracle TIMESTAMP

[BPM] Do You Know the Risk of Shadow Processes?

原文はこちら。
https://blogs.oracle.com/bpm/entry/do_you_know_the_risk

[訳注]
このエントリでBPMはBPMSの意味で使っていますが、原文にあわせてそのままBPMと訳しています。

業務を実施するにあたり、会社で多くのアプリケーションを購入する必要があります。こうしたアプリケーションの手助けで企業が機能を果たすことになりますが、たいていの場合、従業員は複数のアプリケーションにアクセスしてend-to-endの機能や、我々が業務プロセスと呼んでいるものを実行しています。

例えばOrder Managementを考えてみます。注文を取り、完了するには、CRMシステム、Inventory Management、Fulfillment、Shipping、そしてAccountingのシステムにアクセスする必要があります。ほとんどの場合こうしたアプリケーションはスタンドアロン、もしくはせいぜいP2Pでの連係にすぎません。注文を処理している間にやるべきアクティビティはたくさんあるのですが、こうしたアプリケーションでは取り扱われていないアクティビティがあります。こうしたアクティビティのことをプロセス・ホワイトスペースと呼んでいます。通常こうしたアクティビティをメールや電話、メモ、表計算のワークシートなどを使ってカバーしています。これらは貴社の組織のshadow process(影のプロセス)というもので、ドキュメント化されていない、監査もされず、トレースできないアクティビティです。それゆえ、問題がどこにあるかおたずねになるかもしれません。問題はこれらの手作業によって組織の効率化を阻んでいるのです。上記の例では、注文の状態が任意の時点で可視性を担保していないため、時代遅れのレポートを使って業務を回すことになりがちです。お客様が注文の状況を尋ねて電話してきたら、従業員は複数のシステムにアクセスしてお客様に情報を提供する必要があります。これは時間の無駄であるとともに、従業員が古い、完全でない情報を基にして判断しなければならなくなってしまいます。
あるケースでは、すべての必要なアクティビティに対するトレーサビリティがとれないという理由で、コンプライアンスリスクにさらされる可能性もあります。手作業による手続きの場合、純利益に影響し、貴社や従業員に対して罰金や違約金が課せられ、コンプライアンスや監査のコストが高くなります。

BPMの主要な価値の一つは、こうしたプロセス・ホワイトスペースを埋め、貴社の業務をもっと効率化することにあります。この考えは既存システムやアプリケーションの置き換えではなく、アプリケーション(CRM、ERP、SCM)を活用し、End-to-Endで効率的なプロセスを定義してホワイトスペースを埋めるというものです。アプリケーションには最良のことをさせましょう。不自然なカスタマイズをCOTSアプリケーションに施して貴社の業務プロセスに適合させるなんてことはやめましょう。BPMを使ってアプリケーションを協調させ、カスタムの業務プロセスを作成しましょう。アプリケーションベースのBPMで実施するアクティビティは監査可能で、効率的であり、業務全体にわたって可視性を向上します。BPMを使って効率的なプロセスを貴社のアプリケーション上に構築することについて説明しているデモを是非ご覧下さい。

[BPM] Just in ‘Case’…

原文はこちら。
https://blogs.oracle.com/bpm/entry/just_in_case

  • 設計時に容易に決めきれないプロセスがある場合…
  • アドホックなアクティビティや担当者をプロセスに追加する必要がある場合…
  • 個々のアクティビティではなく、プロセスのマイルストンを監視したい場合…
  • ナレッジワーカーに対し、ガイド付きの手順を提供したい場合…
こういったケースすべてのために、Oracle BPM Suiteはこの新しいリリースでCase Managementの機能を追加したのです。
Oracle Unveils Enhancements to Oracle Business Process Management Suite
http://www.oracle.com/us/corporate/press/1929322
「Case Managementって何それおいしいの?」と思ってらっしゃるなら、Mark Fosterが説明してくれている以下のリンクをご覧下さい。
Case Management Part 1: An Introduction (Oracle Blogs / A-Team - SOA)
https://blogs.oracle.com/ateamsoab2b/entry/case_management_part_1_an
新しいOracle BPM SuiteとCase Managementに関してどう言っているかについて知りたいのなら、以下のリンクをどうぞ。
BPM WebcastCase Managementを含むOracle BPM Suiteの新機能について詳細を知りたい場合には、以下のWebcastに是非ご参加下さい。
Webcast New Directions with Business-Driven BPM
http://event.on24.com/r.htm?e=571640&s=1&k=7D7F921E367353D8FCF017DACB2E27C9
[訳注]
日本時間では、4月18日午前2時からです。

[Solaris] Solaris 11 SRU naming convention change

原文はこちら。
https://blogs.oracle.com/Solaris11Life/entry/solaris_11_sru_naming_convention

現在、Oracle SolarisののSRU(Support Repository Updates)で使う命名規則を、5桁のバージョンで分類するように調整しています。
例えば、Oracle Solaris 11.1.6.4.0の場合を考えます。
Oracle Solaris 11.1.6.4.0 Automated Installer ISO Image(サポート契約が必要です)
https://updates.oracle.com/download/16583996.html
各数字はRelease.Update.SRU.Build.Respinを表しています。上の例の場合、Oracle Solaris 11.1 SRU 6.4という意味です。
Oracle Solaris 10以前の場合、全てのバグ修正が、Solaris 11のソースツリー、つまり現在のSolaris11.1.x.y.zにに戻されています。
したがって、これらの同じSRUはOracle Solaris 11 11/11をインストールしたシステムに対する修正を入手する方法でもあります。Solaris 10カーネルパッチが以前リリースされたSolaris 10 Updateからの全てのコードを含んでいたのとまったく同じ方法です。
Solaris 10 Kernel PatchID Sequence
https://blogs.oracle.com/patch/entry/solaris_10_kernel_patchid_progression
以前のエントリで説明したように、例えばOracle Solaris 11 11/11 SRU 13.4からOracle Solaris 11.1.6.4.0といった具合に、システムを最新のSRUにアップデートすべきです。
Solaris 11 SRU / Update relationship explained, and blackout period on delivery of new bug fixes eliminatedhttps://blogs.oracle.com/Solaris11Life/entry/solaris_11_process_enhancement_no
ファイアウォール内でローカルのSolarisリポジトリを構成・維持している場合、Solaris 11.1と関心のある後続のSRUをご自身のリポジトリに追加すべきです。この理由は、SRUだけが以前リリースされたSolaris Updateに対する相対的な変更差分を含んでいるからです。
Solarisの長期にわたるバイナリ互換保証(Binary Compatibility Guarantee)がImage Packaging System(IPS)と相まって、スムーズなアップデート・エクスペリエンスを確保してくれることでしょう。

[Support] MOS Upgraded, Mobile search improved

原文はこちら。
https://blogs.oracle.com/supportportal/entry/mos_upgraded_mobile_search_improved

2013年4月5日に、MOS(My Oracle Support)がアップデートされtました。個人的には特にOracle Configuration Managerのパフォーマンスが向上したように思いますが、それは別の機会にご紹介することにします。
今回、Mobile My Oracle Support Version 6.5をリリースしましたが、このリリースでは検索しやすくなっています。以下で2つほど改善点をご紹介しましょう。

1. より簡単になった検索バー

Knowledge、SR、変更リクエスト(RFC)、詳細検索の間を簡単に移動するための見やすいクイックリンクを使って検索バーが再設計されました。すべての検索画面で同じLook and Feelになっています。

2. Oracle On Demandのお客様は変更リクエスト(RFC)の検索が可能

• RFCの詳細検索が追加され、RFC検索を保存することができます。
• RFCの番号の部分指定もしくは全部指定、サマリの文章でRFCを検索できます。
• ステータス、RFCの種類、サポートID、スケジュールされた開始、ターゲット、重大度などで検索できます。
New Advanced Search bar
RFC search

[Applications, Hardware] Oracle Applications running on Engineered Systems: whitepapers

原文はこちら。
https://blogs.oracle.com/exadatapartnercommunity/entry/oracle_applications_running_on_engineered

[訳注]
本記事は、以下のプレスリリースに関連しています。
Oracle Announces New In-Memory Applications and Faster Performance for All Oracle Applications on Oracle Engineered Systems (COLLABORATE ’13 – Denver, Co. – April 9, 2013)
http://www.oracle.com/us/corporate/press/1931761
Oracle In-Memory Applications
http://www.oracle.com/us/corporate/features/in-memory-apps/index.html

E-Business Suite、Siebel、Peoplesoft、JDE、Fusion AppsなどのOracle ApplicationをEngineered System上で実行することに関する新しいホワイトペーパーが出ました。アプリケーションやモジュールでの性能の改善例や推奨される方式などを知っていただけます。
Oracle Application on Engineered Systemsに関するホワイトペーパーの完全なリストは以下にあります。
Collaborate Resource Library
http://www.oracle.com/us/products/applications/collaborate-resource-library-1931221.html
いくつかのホワイトペーパーを以下でご紹介しましょう(訳注:いずれも英語です)。

Siebel
    E-Business Suite

      [Identity Management, Security] Oracle Unified Directory 11g R2 PS1 released

      原文はこちら。
      https://blogs.oracle.com/sduloutr/entry/oracle_unified_directory_11g_r2

      Oracle Identity and Access Management 11g R2 (11.1.2.1.0) がリリースされ、ダウンロードできるようになっています。メディアはOracle Software Delivery Cloud(OSDC、旧e-Delivery)からダウンロードできます。このリリースには以下の製品が含まれています。
      • Oracle Identity and Access Management
      • Oracle Entitlements Server Security Module
      • Oracle Access Manager OHS 11g WebGates
      • Oracle Access Manager IHS 7.0 WebGates
      • Oracle Access Manager Access SDK
      • Oracle Access Manager JBoss 5 Agent
      • Oracle Unified Directory
      • Oracle Enterprise Single Sign-On
      • Oracle Access Management Mobile and Social SDK
      OUDをダウンロードするには、OSDCから[Oracle Fusion Middleware]とインストール先のプラットフォームを選択します。その後、[Oracle Fusion Middleware Identity Management 11gR2 Media Pack]から[Oracle Unified DIrectory 11g (11.1.2.1.0)]を選択しましょう。

      ドキュメントは以下のリンクからどうぞ。
      Unified Directory 11g Release 2 (11.1.2.1.0)
      http://docs.oracle.com/cd/E37116_01/index.htm
      動作保証するハードウェア構成やソフトウェア構成は以下からご確認下さい。
      http://www.oracle.com/technetwork/middleware/id-mgmt/identity-accessmgmt-11gr2certmatrix-1714221.xls

      [SOA] Service Bus PS6 (11.1.1.7) available for download

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

      Oracle Service Bus (OSB) PS6がリリースされ、ダウンロードできるようになっています。主要な新機能や機能強化点は以下の通りです。

      • リソースのパッケージングのための新しい構成ツール、T2Pプラグイン
      • MTOM、SwAでのWS-Security
      • SFTPでのCipher Suite, Hash, Keyの指定
      • RESTfulサービスのためのOWSMポリシー
      • MQトランスポートによる、Native XA、およびタイムアウト
      • HTTPセッションアフィニティを考慮した負荷分散
      ダウンロードは詳細情報はOTNのOSBのページからどうぞ。
      Oracle Service Bus リリース・ダウンロード
      http://www.oracle.com/technetwork/jp/middleware/service-bus/downloads/index.html(日本語)
      Release Downloads for Oracle Service Bus
      http://www.oracle.com/technetwork/middleware/service-bus/downloads/index.html(英語)

      [Java] Java EE 7 Maven Archetype

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

      Mavenを使ってJava EEの開発をしている場合(前職のコンサルタント時代のお客様はJava EE/GlassFishをお使いでした)、Archetypesは非常に生産性を上げることができます。始めたばかりの段階では特にそうです。すでにJava EE 7のMaven Archetypeが以下のリポジトリにあることを聞いて喜んでいただけるのではないでしょうか(もちろん無料です)。
      Maven Archetype for Java EE 7
      https://nexus.codehaus.org/content/repositories/snapshots/
      Mavenのコマンドラインから以下のように直接利用することができます。
      mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes 
          -DarchetypeArtifactId=webapp-javaee7 
          -DarchetypeVersion=0.1-SNAPSHOT 
          -DarchetypeRepository=https://nexus.codehaus.org/content/repositories/snapshots/ 
          -DgroupId=your_group_id 
          -DartifactId=your_artifact_id 
          -Dversion=your_version
          -Dpackage=your_package
          -Darchetype.interactive=false 
          --batch-mode 
          --update-snapshots 
          archetype:generate
      
      NetBeansのほうがお好みであっても同じように、[サービス]タブの[Maven Repositories]で先ほどのリポジトリのURLを新しいリポジトリとして定義すれることで利用できます。[New Project] > [Maven] > [Project from Archetype]とたどり、"webapp-javaee7"を検索テキストボックスに入れて、"0.1-SNAPSHOT"を選択してから[Finish]をクリックします。

      どちらの方法でも、プロジェクトを生成すると、あなたはもちろん、POMとソースコードをニーズにあわせて微調整できます。かなり簡単なはずですよ。使い始める際に何かお手伝いが必要ならご連絡下さいね。

      [SOA] SOA Suite PS6 (11.1.1.7) available for download

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

      SOA Suite PS6がリリースされてダウンロードできるようになっています。新機能や改善点をまとめました。

      BPEL / INFRASTRUCTURE
      • パージ:TRS/Truncateによるデータ削除戦略
      • トークンやグローバル変数のサポート
      • オペレーションレベルでの冪等性の設定
      • リカバリタブからの中断・キャンセル
      • ダイナミック・パートナーリンクのための証明書の選択
      • 古いインスタンスをマーキングする方式の統一
      BUSINESS RULES
      • ルールの翻訳をサポート
      • 使い勝手の改善
      B2B / HEALTHCARE
      • インストールの簡素化
      • 新しい標準への対応
      • 性能の改善
      • 製品間の統合
      • UIの改善・強化
      EVENT PROCESSING
      • 製品名を「Complex Event Processing」から「Event Processing」に変更
      • ソリューション・パッケージングの変更
      • Big Dataとの統合
      • ユーザー定義が可能なCQLフォルトハンドラ
      • リストベースの集約
      • Eclipse Indigo (3.7.2)のサポート
      • 使い勝手の改善
      • 性能の向上
      BUSINESS ACTIVITY MONITORING
      • ODI 11gのサポート
      • BAM T2Pプラグイン(T2P:Test to Production:移行のためのプラグイン)
      • レポートの依存性を考慮したICommandによるエクスポート・インポートのサポート
      • 日付型プロンプトの機能強化
      SERVICE BUS
      • リソースのパッケージングのための新しい構成ツール、T2Pプラグイン
      • MTOM、SwAでのWS-Security
      • SFTPでのCipher Suite, Hash, Keyの指定
      • RESTfulサービスのためのOWSMポリシー
      • MQトランスポートによる、Native XA、およびタイムアウト
      • HTTPセッションアフィニティを考慮した負荷分散
      ADAPTERS
      • EBS Adapter - ビジネス・イベント・グループ、カスタム・コンカレント・プログラム、フレックスフィールド
      • Adapterの診断ダンプ
      • JMS Adapter - WLSのUOOのサポート
      • UMS Adapter – メールのサポート
      • MQ Adapter – CCDTやRFH2のサポート
      • NXSD - マルチバイト・ストリーミングのサポート
      • 動作保証する接続先の追加
        • DBAdapter/ProgressDB
        • JMS Adapter/SIBJMS
        • FTP Adapter/VMS
      • iWay Adapters - インストール体験の改善および新機能
      FOUNDATION PACK
      • Project Lifecycle WorkbenchやService Constructor(JDeveloperのプラグイン)を使って直接の統合をサポート
      • エラー時の再送ツール
      • Code Compliance Inspector (組み込み、設計時のルール検証:例えば WS-I BPに準拠しているか、FPのベストプラクティスに準拠しているか、など)
      • Webベースの変換マッパー(プレビュー機能)
      ENTERPRISE REPOSITORY
      • Code Compliance Inspector (OER内で発行されるレポートを集約)
      • Contracts Solution Pack
      • Harvestingの機能強化
      • BI Publisher 11gのサポート
      ダウンロードや詳細情報はOTNからどうぞ。
      Oracle SOA Suite リリース・ダウンロード
      http://www.oracle.com/technetwork/jp/middleware/soasuite/downloads/index.html(日本語)
      Release Downloads for Oracle SOA Suite
      http://www.oracle.com/technetwork/middleware/soasuite/downloads/index.html(英語)

      [SOA/BPM] NEW - Oracle Rules Self-Study Course

      原文はこちら。
      https://blogs.oracle.com/SOA/entry/new_oracle_rules_self_study

      "Introduction to Oracle Business Rules"という新しい自習コースが先頃Oracle Learning LibraryにUpされました。所要時間はおよそ20分で、無料でご利用頂けます。
      Introduction to Oracle Business Rules
      http://apex.oracle.com/pls/apex/f?p=44785:24:0::NO:24:P24_CONTENT_ID,P24_PREV_PAGE:6952,29


      このコースはOracle Business Rulesの初心者を対象としており、コンセプトや基礎となる中核語彙を知りたいと思っている方向けです。Oracle Business Rulesのディクショナリの要素を紹介し、Oracle Business Rules Engineの基礎を説明しています。

      数週間以内にHuman Workflow(HWF)の自習コースも同様にUpする予定です。

      フィードバックお待ちしています。

      [Java] JSR updates - Java EE 7 JSRs

      原文はこちら。
      https://blogs.oracle.com/jcp/entry/jsr_updates_java_ee_71

      最初のJava EE 7のJSRがJCP最終承認投票(JCP Final Approval Ballots / FAB)、JSRライフサイクルのJCP Executive Committee (EC)の最終投票を通過しました。次のマイルストンである最終リリースに進むことになります。
      JCP Procedures
      http://www.jcp.org/en/procedures/overview
      [訳注]
      Java EE 7のJSRは4グループに分かれています。
      詳細は以下のリンクをご覧下さい。
      http://java.net/projects/javaee-spec/pages/Home#Java_EE_7_Schedule
      今週後半は多くのJSRのアップデートが届く予定ですので、詳細情報をお待ち下さい。