Quantcast
Channel: Oracle Blogs 日本語のまとめ
Viewing all 760 articles
Browse latest View live

[Java] Further Updates to 'Moving to a Plugin-Free Web'

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

Java Appletを立ち上げるために必要とする、標準ベースのNPAPIプラグインをサポートするテクノロジーを、ブラウザベンダーがサポートしない方向のため、およそ1年前、JDK 9でJava Browser Plug-inを非推奨(deprecated)にする計画を発表するエントリを記載しました。
Moving to a Plugin-Free Web
https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free
[Java] Moving to a Plugin-Free Web
https://orablogs-jp.blogspot.jp/2016/01/moving-to-plugin-free-web.html
これ以後、Oracleの開発チームは、JDK 9での非推奨化の流れ(案)に関する技術的な詳細を付けて、JDK Enhancement Proposal (JEP 289: Deprecate the Applet API) を発行しました。
JEP 289: Deprecate the Applet API
http://openjdk.java.net/jeps/289
さらに、Apple SafariとMozilla Firefoxの開発者から、ブラウザからの標準ベースのプラグインのサポート廃止(Javaおよびその他のプラグインベーステクノロジーの埋め込みができなくなる)に関するタイムラインのアップデートが発表されました。
Updates to “Moving to a Plugin-Free Web”
https://blogs.oracle.com/java-platform-group/entry/updates_to_moving_to_a
[Java] Updates to “Moving to a Plugin-Free Web”
https://orablogs-jp.blogspot.jp/2016/08/updates-to-moving-to-plugin-free-web.html
彼らが発表したタイムラインによれば、Mozilla Firefox 52(2017年3月リリース)で、32ビット版Mozilla Firefoxは標準ベースのプラグインサポートに必要なAPIを提供しなくなります。
RapidRelease/Calendar MozillaWiki
https://wiki.mozilla.org/RapidRelease/Calendar
Windows 64ビット版のMozilla Firefoxは、Javaを含むほとんどのNPAPIベースのプラグインをサポートしません。
Firefox 64-bit for Windows Available
https://blog.mozilla.org/futurereleases/2015/12/15/firefox-64-bit-for-windows-available/
Mozillaは、大規模に展開するために拡張サポートが必要な組織向けに、拡張サポートリリース(ESR)バージョンのFirefoxを提供しています。
Mozilla Firefox ESR Overview
https://www.mozilla.org/en-US/firefox/organizations/faq/
32ビット版Mozilla Firefox 52 ESRのみ、引き続き、Java Appletを起動するために必要な、標準ベースのプラグインをサポートするテクノロジーに対するサポートを提供する予定ですが、Firefoxの一般バージョンとESRをサーバーサイドで区別する方法がないことにご注意ください。開発者がサーバーサイドでチェックする実装を入れるのではなく、影響を受けるユーザーが、ESRリリースを使用しているかどうか(「ヘルプメニュー - >バージョン情報」からFirefox 52でESRの文字を探す)を調べる方法を必要とするかもしれません。

Mozillaはおよそ1年間はFirefox ESR Releaseをメンテナンスします。開発者および32ビット版Mozilla FirefoxでJavaプラグインテクノロジーを使っているユーザーの方々は、異なるソリューションへの移行を検討する必要があります。

様々な移行方法に関する背景や情報の詳細は、以下のURLの短編ホワイトペーパーにまとめられていますので、ご一読ください。
Migrating from Java Applets to plugin-free Java technologies
http://www.oracle.com/technetwork/java/javase/migratingfromapplets-2872444.pdf

[Database] DBMS_QOPATCH does not work in PDBs (right now)

$
0
0
原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/dbms_qopatch_does_not_work

以下のエントリにコメントをくれたMurthyと、最終的にER(Enhancement Request)になったSR(Service Request)を起票してくれたSimCorpのJeannette Hollandに感謝します。
How to find out if a PSU has been applied? DBMS_QOPATCH
https://blogs.oracle.com/UPGRADE/entry/dbms_qopatch_datapatch_and_other

DBMS_QOPATCH in Multitenant

DBMS_QOPATCHはCDB$ROOT内で実行した場合に限り、インストール済みのパッチに関する有用な情報を取得できます。このデザインはOracle Database 12.1のセキュリティ上の理由によるものです。PDBにインストールされたパッチを確認する必要がある場合にも情報を取得することができます。

Testcase

JannetteのSRからテストケースを拝借しました。
SQL> COLUMN NAME FORMAT A8
SQL>
SQL> SELECT NAME, CON_ID, DBID, CON_UID, GUID FROM V$CONTAINERS ORDER BY CON_ID;

NAME     CON_ID DBID       CON_UID    GUID
-------- ------ ---------- ---------- ------------------
CDB$ROOT      1 3424772713 1          47C8525C0DFE49...
PDB$SEED      2 3983775695 3983775695 E6204BB1F6EB4F...
MYPDB1        3 7270044002 7270044002 B975668B860049...
MYPDB2        4 1943363979 1943363979 BCD7AAFAF3F641...
PDBで実行してみると……
ALTER SESSION SET container = myPDB;

Session altered.

SQL> select * from OPATCH_XML_INV ;
ERROR:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04080: directory object OPATCH_LOG_DIR not found


no rows selected

SQL> select dbms_qopatch.get_opatch_install_info from dual;
ERROR:
ORA-20001: Latest xml inventory is not loaded into table
ORA-06512: at "SYS.DBMS_QOPATCH", line 1986
ORA-06512: at "SYS.DBMS_QOPATCH", line 133
CDBで実行してみると……
SQL> ALTER SESSION SET container = cdb$root;

Session altered.

SQL> select * from OPATCH_XML_INV ;

XML_INVENTORY
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<InventoryInstance>


SQL> select dbms_qopatch.get_opatch_install_info from dual;

GET_OPATCH_INSTALL_INFO
--------------------------------------------------------------------------------
<oracleHome><UId>OracleHome-2d1c0910-36ac-429b-98db-96a353d423b6</UId><targetTyp

Solution

Oracle Database 12.1.0.2の場合、現時点で有効な解決策はありません。また、この挙動はドキュメントに記載されていないようです。結果として起票されたSRがEnhancement Requestとなりました。Oracle Database 12.1.0.2のPDBでは、以下の回避策がお役に立つかもしれませんが、DBMSのパッケージを呼び出すAPIを使うため、面倒でしかも簡単ではありません。
select patch_id, patch_uid, version, action, action_time, status, description from dba_registry_sqlpatch;
Oracle Database 12.2.0.1でテストしたところ、期待通りに動作してくれました。
SQL> create pluggable database PDB3 admin user adm identified by adm file_name_convert=( '/u02/oradata/CDB2/pdbseed', '/u02/oradata/CDB2/pdb3');

Pluggable database created.

SQL> alter pluggable database pdb3 open;

Pluggable database altered.

SQL> alter session set container=pdb3;

Session altered.

SQL> select dbms_qopatch.get_opatch_install_info from dual;

GET_OPATCH_INSTALL_INFO
--------------------------------------------------------------------------------
<oracleHome><UId>OracleHome-3cb04a3a-3999-4767-86f1-bc845cab158e</UId><targetTyp

SQL>   select * from OPATCH_XML_INV ;

XML_INVENTORY
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Inv
entoryInstance> <ora

SQL> select xmltransform(dbms_qopatch.get_opatch_lsinventory, dbms_qopatch.get_opatch_xslt) from dual;

XMLTRANSFORM(DBMS_QOPATCH.GET_OPATCH_LSINVENTORY,DBMS_QOPATCH.GET_OPATCH_XSLT)
--------------------------------------------------------------------------------

Oracle Querayable Patch Interface 1.0
-----------------------------------------


SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB3                           READ WRITE NO

[Database] Announcement: Oracle Database 12c Release 2 on Exadata and SuperCluster

$
0
0
原文はこちら。
https://blogs.oracle.com/exadata/entry/announcement_oracle_database_12c_release

この10日はExadataにとって非常にわくわくさせるものでした。まず、30個以上の機能や強化ポイントを含むExadata Software 12.2.1.10をリリースしました。つづいてSoftware-in-SiliconのパワーがExadataシステムで利用できるようになった、Exadata SL6をローンチしました。そして、ExadataおよびSuperCluster用のオンプレミス版Oracle Database 12c Release 2をリリースします。

Oracle Database 12c Release 2では、Oracle Databaseの全ての面が強化されています。いくつかの特徴を見ていきましょう。
Oracle MultitenantはApplication Containerのサポートを強化します。MultitenantユーザーはCPUやI/Oリソースに加え、Pluggable Databaseのメモリリソースを管理することができるようになりました。Database In-Memoryは、より高速なJoinを可能にします。In-MemoryユーザーはJSONデータのインメモリクエリを実行できるようになりました。In-Memoryフォーマットをストレージに永続化することで、より高速な再起動を可能にしています。このリリースでは、既存の暗号化されていない表領域をインポート、エクスポートする必要なく、表領域をオンラインで暗号化できるため、データベースをよりセキュアにすることができます。Oracle Database 12c Release 2では、待望のOracle Native Shardingが導入されました。データベースの安全性、可用性、高速性、管理性が向上し、Developer Friendlyならしめる数多くの機能が搭載されています。

Oracle Database 12c Release 2の更なる差別化要素として、Exadataプラットフォームがあります。Exadataのユニークなリソース管理機能やI/O最適化機能上に構築された、以下の2機能はExadataおよびSuperClusterでだけご利用いただけます。
  • Active Data GuardスタンバイデータベースでのIn-Memory処理
  • 1Container Databaseあたり252個を超えるPluggable Databaseのサポート
このリリースでは、多くのユニークなExadataの機能、例えば階層型スナップショット、圧縮インデックスのSmart Scanオフロード、XMLオペレータのSmart Scanの機能強化、End-to-EndのI/Oレイテンシキャッピング、拡張されたdistance clusterなどがサポートされています。詳細は、スライド、Webcast、以前のエントリをご覧ください。
Exadata Software 12.2.1.1.0
The Best Database Cloud Pla1orm
Just Got Be6er!
http://www.oracle.com/technetwork/database/exadata/exadatasoftware-12211-3521134.pdf
Exadata 12.2.1.1.0: The Best Database Cloud Platform Just Got Better
https://blogs.oracle.com/exadata/entry/exadata_12_2_1_1
Oracle Database 12c Release 2を最大限に活用するには、データベースを12c Release 2にアップグレードする前に、最新のExadata Softwareリリース12.2.1.10にアップグレードすることをお薦めします。Exadata Software 12.2.1.1.0では、Oracle Database 12c Release 2のSmart Scan機能をサポートしており、OSDC (Oracle Software Delivery Cloud) 経由で入手できます。
Oracle Software Delivery Cloud
https://edelivery.oracle.com/osdc/faces/Home.jspx
Exadata、SuperCluster以外のプラットフォーム用Oracle Database 12c Release 2のリリーススケジュールは、以下のサポートドキュメントをご覧ください。
Release Schedule of Current Database Releases (Doc ID 742060.1)
https://support.oracle.com/rs?type=doc&id=742060.1

[Java] Gear up for Java SE 9

$
0
0
原文はこちら。
https://blogs.oracle.com/java/gear-up-for-java-se-9

ご存知のように、Java SE 9はfeature completeに達し、Ramp Downプロセスがスタートしました。これはモジュールシステムがJavaプラットフォームに導入されるという、重要なリリースになることでしょう。リリースは2017年7月を予定しています。現在、今月リリースされた早期ドラフトレビュー仕様がご覧いただけます。
JSR 379: JavaTM SE 9 Release Contents
https://www.jcp.org/en/jsr/detail?id=379
今すぐあなたのコードがJDK 9で動作することを確認してください。願わくば、この情報を既にご覧になっていることを期待します。

JavaアーキテクトのAlan Batemanは、昨年のJavaOneで「Prepare for JDK 9」というセッションで講演しました。このセッションでは、非推奨プロセス(deprecation process)、カプセル化(encapsulation)、非サポートのAPI、コードのテスト方法などを説明しました。

彼のセッションに追加して、彼が言及していたJEPおよびツールについて詳細に知っておく必要があるでしょう。
以前のリリースと同様、このリリースでも後方互換性の確保は重要と考えています。これまでのように、APIが非推奨になった時点で通知システムが作動します。このJEP 277(Enhanced Deprecation)で、このプロセス、ステータス、APIの意図する処分について説明しています。
JEP 277: Enhanced Deprecation
http://openjdk.java.net/jeps/277
ほとんどの内部APIがデフォルトでアクセスできなくなりますが、重要な、幅広く利用されている内部APIは、サポートされる代替APIができるまでアクセスできます。ほとんどの内部APIのカプセル化について説明するJEP 260(Encapsulate Most Internal APIs)では、引き続きアクセスできる重要な内部APIを説明しています。
JEP 260: Encapsulate Most Internal APIs
http://openjdk.java.net/jeps/260
例えばこのようなAPIを使っている3rdパーティライブラリに依存している場合、ご利用のアプリケーションがJDKの内部APIを利用していることがわからない可能性があります。そのような場合には、Jdeps(Java dependency analysis tool:Java依存性分析ツール)を使ってこうしたAPIを識別してください。このツールは、置換候補があれば、候補の提案もしてくれます。詳細は、Jdepsのページを参照してください。
Java Dependency Analysis Tool
Jdepshttps://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
強調してもしすぎることはないので、JDK早期アクセスリリースを使ってアプリケーションをテストしてください。Java 9早期アクセスリリースを今すぐダウンロードしましょう。
JDK™ 9 Early Access Releases
https://jdk9.java.net/download/access
Key links to bookmark:
Related Blogs:

[Java] Filter Incoming Serialization Data - a little of JDK 9 goodness available now in current release families

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

JDK 9向けに開発されている新機能の一つが、JEP 290:Filter Incoming Serialization Dataです。この機能がJDK 8、7、6にバックポートされました。
JEP 290: Filter Incoming Serialization Data
http://openjdk.java.net/jeps/290
(訳注)
JDK 7、JDK 6はJava SEに対するサポート契約をOracleと締結されている方のみご利用いただけます。

着信シリアライズデータのフィルタリング方法として、オブジェクトのシリアル化に対する保護ならびに堅牢化のための層をもう一つ追加します。このフィルタリングメカニズムを使用することにより、開発者はアプリケーションがデシリアライズ可能なクラスを制限できます。ほとんどのセキュリティ機能と同様に、この新機能は現在のセキュア・コーディングのプラクティスを置き換えるものではなく、こうしたプラクティスに追加することを目的としています。
Secure Coding Guidelines for Java SE
http://www.oracle.com/technetwork/java/seccodeguide-139067.html
この機能はJDK 9の早期アクセスリリースでご利用いただけますが、現在のバージョンの利用者にもこの機能を使ってもらいたい、ということで、2017年1月のCritical Patch Update(8u121、7u131、6u141)に対しても導入されました。
Jan 2017 Critical Patch Update
http://www.oracle.com/technetwork/security-advisory/cpujan2017-2881727.html(英語)
http://www.oracle.com/technetwork/jp/topics/ojkbcpujan2017-3454417-ja.html(日本語)
詳細は、対応するリリースのリリースノートをご覧ください。
JDK Release Notes
http://www.oracle.com/technetwork/java/javase/jdk-relnotes-index-2162236.html

[Java] Early Access documentation for Oracle JDK 9 has been released

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

Oracle JDK 9早期アクセスリリースのドキュメントが本日リリースされました。
是非チェックしてください。
Oracle JDK 9 Documentation Early Access
http://docs.oracle.com/javase/9/
このドキュメントにはアップデートされた開発者ガイド、移行アシスタンス、このリリースでの新機能リストが含まれています。
JDK 9早期アクセスリリースは以下のURLからダウンロードできます。
JDK™ 9 Early Access Releases
https://jdk9.java.net/download/

[Database] Updated In-Memory Advisor Now Available

$
0
0
原文はこちら。
https://blogs.oracle.com/In-Memory/entry/updated_in_memory_advisor_available

Oracle Database In-Memory Advisorがアップデートされました。ドキュメントも同時に更新されています。詳細は、My Oracle Supportの以下のドキュメントをご覧ください。
Oracle Database In-Memory Advisor (Doc ID 1965343.1)
https://support.oracle.com/rs?type=doc&id=1965343.1
このアップデートには以下のものが含まれています。
  • スキーマやオブジェクト名などの属性によって、メモリ上に配置されると考えられるオブジェクトをフィルタリングできるようになりました
  • Oracle Database 12c Release 2を包括的にサポートします
  • Oracle Database 12c Release 2で導入されたマルチテナント・データベースでの機能強化されたPDBレベルのAWRデータをサポートします
  • 不具合の修正ならびに拡張性の強化

[Database] Client Certification for Oracle Database 12.1.0.2/12.2.0.1

$
0
0
原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/client_certification_for_oracle_database

先日Oracle Database 12.2.0.1に対するクライアントの動作保証に関する質問を受けました。
この質問に回答する内容が、My Oracle Supportの以下のドキュメントです。
Client / Server Interoperability Support Matrix for Different Oracle Versions (ドキュメントID 207303.1)
https://support.oracle.com/rs?type=doc&id=207303.1
このドキュメントではOracle Database 9.2にまでさかのぼって、クライアントの互換性を取り扱っており、非常に役に立つリソースです。
Client Certification Oracle Database
忘れないでいただきたいのは、時として、クライアントソフトウェアにもパッチが必要になることがある、ということです。定期的にメールをやりとりしているお客様はDatabaseをOracle Database 12.1.0.2にアップグレードしたばかりでしたが、すでに最新のJDBCクライアントを使っているにもかかわらず、JDBCクライアントでたびたび奇妙なエラーを見かけました。

以下のメッセージと共に、ORA-904, ORA-923 and ORA-920が発生していました。
oracle.jdbc.driver.OracleParameterMetaDataParser.computeBasicInfo(OracleParameterMetaDataParser.java:277)
結局JDBCクライアントにもパッチが必要だったということがわかりました。つまり、12.1.0.2クライアントに対し、マージパッチ #21623553 を当てる必要があったのです。
パッチ21623553: MERGE REQUEST ON TOP OF 12.1.0.2.0 FOR BUGS 21185279 21455135
https://support.oracle.com/rs?type=patch&id=21623553
このマージパッチは、別の有用な修正と共に、JDBCクライアント向けマージパッチ #24012252 として統合されました。
パッチ24012252: MERGE REQUEST ON TOP OF 12.1.0.2.0 FOR BUGS 22603057 20362778 23345279
https://support.oracle.com/rs?type=patch&id=24012252 
パッチ適用後、エラーは出なくなりました。JDBCクライアントへの推奨パッチは、以下のMy Oracle Supportのドキュメントをご覧ください。
Recommended patches on JDBC 12.1.0.2.0 version (ドキュメントID 2227214.1)
https://support.oracle.com/rs?type=doc&id=2227214.1
さらに言えば、OTNから簡単にダウンロードできデプロイできるInstant Clientの存在もお忘れなく。
Oracle Instant Client Downloads
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
Oracle Instant Client Download OTN

[Java] Automating The Creation of JDK9 Reduced Runtime Images in NetBeans

$
0
0
原文はこちら。
https://blogs.oracle.com/jtc/entry/automating_the_creation_of_jdk9

JDK9の次期リリースでは、Java SEプラットフォームはモノリシックな構造に変わって、一連のモジュールを組み合わせて構築されます。
JDK 9 Project
https://jdk9.java.net/
この大きな変化に伴い、開発者は自身のアプリケーションをモジュール化することができ、さらに、アプリケーションを実行するために必要なモジュールだけを使ってランタイムイメージを作成することができます。この大規模な進化について多くの記事が出ていますし、これからも出てくることでしょう。今日は、カスタムランタイムイメージを作成する機能と、NetBeansなどの統合開発環境でその作成方法を自動化する方法について説明します。
NetBeans IDE
https://netbeans.org/
最初に、早期アクセス版JDK9と、それに対応する早期アクセスJDK9対応 NetBeansをダウンロードして、始めることにしましょう。
JDK™ 9 Early Access Releases
https://jdk9.java.net/download/
NetBeans IDE Nightly Build ダウンロード
http://bits.netbeans.org/download/trunk/nightly/latest/
このレシピでは、SimpleAppという非常に単純なJDK9アプリケーションを作成し、Java Logging APIを使用してメッセージをログに記録します。
Package java.util.logging
http://download.java.net/java/jdk9/docs/api/java/util/logging/package-summary.html
すべてのJava 9プログラムでは、java.baseというモジュールを使用する必要があります。このプログラムでロギングメソッドを呼び出すためには、java.loggingと呼ばれる追加のモジュールを取り込む必要があります。以下はNetBeansプロジェクトとソースコードの例です。

NetBeansでこのプログラムを実行すると、出力ウィンドウに以下のような表示が現れます。

このプログラムをモジュール化するために、まずモジュールの依存性を識別する必要があります。JDK 9のユーティリティjdepsを使って、以下のようにこの作業を実行することができます。

最初に、jdeps -versionを呼び出し、JDK 9版のjdepsを使っていることを確認します。続いて、NetBeansで作成した SimpleApp.jar に対して jdeps -s を呼び出し、モジュール依存性を取得します。この例では、作成したプログラムには2個のモジュールが必要です。前述の通り、全てのJava 9アプリケーションはデフォルトで java.base というモジュールが必要です。さらに、今回のプログラムではモジュール java.logging のメソッドを呼ぶため、 java.logging にも依存します。
この情報を基に、SimpleAppプロジェクトを右クリックし、New->Java Module Info...を選択してNetBeansプロジェクト内にファイル module-info.java を作成します。

作成した後、module-info.javaはSimpleAppのデフォルトパッケージになります。モジュール仕様は最初は空で、以下のように2個のrequiresと、1個のexportsを追加します。

module-info.java を適切に設定したのち、 SimpleApp をビルドします。NetBeansはコンパイル済みの module-info.class をSimpleApp.jarに追加し、モジュールのJarファイルにします。
ゲームの少し早い段階ですが、JDK9のjlinkユーティリティを使用してランタイムイメージを構築する機能が、現時点でNetBeansには欠けているように見えるので、この機能を提供するようNetBeansをカスタマイズしてみましょう。より洗練されたソリューションは間違いありません。この機能を使えば、実際に実行されるJavaコマンドを出力することで、デバッグを支援することができます。
まず、SimpleAppのNetBeans project.propertiesファイルを探して編集します。 このファイルはNetBeansの[ファイル]タブをクリックすると、プロジェクトのファイルシステムビューが表示されます。 nbproject ディレクトリの下に、project.propertiesファイルがあります。 project.propertiesをダブルクリックすると、そのファイルを編集用に開くことができます。

以下のテキストを projects.properties ファイルの最後に追加します。
#
# Added to support creation of modular jar and jlink image.
# Change this property to match your JDK9 location
#
jdk9.basedir=C:\\Users\\jtconnor\\jdk-9
#
modular.jar.command=${jdk9.basedir}\\bin\\jar.exe
modular.jar.file=${dist.dir}\\${application.title}.jar
#
modular.jar.arg1=--verbose
modular.jar.arg2=--update
modular.jar.arg3=--file
modular.jar.arg4=${modular.jar.file}
modular.jar.arg5=--main-class
modular.jar.arg6=${main.class}
modular.jar.arg7=--module-version
modular.jar.arg8=1.0
modular.jar.arg9=-C
modular.jar.arg10=${build.dir}\\classes
modular.jar.arg11=module-info.class
modular.jar.args.concatenated=${modular.jar.arg1} ${modular.jar.arg2} ${modular.jar.arg3} ${modular.jar.arg4} ${modular.jar.arg5} ${modular.jar.arg6} ${modular.jar.arg7} ${modular.jar.arg8} ${modular.jar.arg9} ${modular.jar.arg10} ${modular.jar.arg11}
#
jlink.command=${jdk9.basedir}\\bin\\jlink.exe
jlink.module.dependency1=${modular.jar.file}
jlink.module.dependency2=${jdk9.basedir}\\jmods
jlink.module.path=${jlink.module.dependency1};${jlink.module.dependency2}
jlink.image.dir=${dist.dir}\\jimage
#
jlink.arg1=--module-path
jlink.arg2=${jlink.module.path}
jlink.arg3=--add-modules
jlink.arg4=${application.title}
jlink.arg5=--output
jlink.arg6=${jlink.image.dir}
jlink.arg7=--compress=2
jlink.args.concatenated=${jlink.arg1} ${jlink.arg2} ${jlink.arg3} ${jlink.arg4} ${jlink.arg5} ${jlink.arg6} ${jlink.arg7}
まぁ悪くないですね。基本的には、JDK9のjarユーティリティとjlinkユーティリティを実行するためのコマンドライン引数を設定することです。この設定では、モジュールのjarやランタイムイメージ作成に失敗した場合のデバッグがより簡単にできるはずです。1点、重要なポイントとして、jdk9.basedirプロパティを適切に設定する必要があります。
#
# Added to support creation of modular jar and jlink image.
# Change this property to match your JDK9 location
#
jdk9.basedir=C:\\Users\\jtconnor\\jdk-9  <-- ここをご自身のJDK 9の場所に変更してください!
この手順が完了したら、SimpleAppのビルドファイル(build.xml)を変更しましょう。その前に、このファイルはFileタブのSimpleApp/ディレクトリにあります。build.xmlをダブルクリックしてファイルを編集します。

ファイルを開き、最終行に移動します。追加のantタスクを</project>の前に以下のように配置します。

以下は追加するテキストです。
<target name="-post-jar" depends="-do-modular-jar,-do-jlink">
    </target>
   
    <target name="-do-modular-jar">
        <echo message="Updating ${dist.jar} to be a modular jar."/>
        <echo message="Executing: ${modular.jar.command} ${modular.jar.args.concatenated}"/>
        <exec executable="${modular.jar.command}">
            <arg value="${modular.jar.arg1}"/>
            <arg value="${modular.jar.arg2}"/>
            <arg value="${modular.jar.arg3}"/>
            <arg value="${modular.jar.arg4}"/>
            <arg value="${modular.jar.arg5}"/>
            <arg value="${modular.jar.arg6}"/>
            <arg value="${modular.jar.arg7}"/>
            <arg value="${modular.jar.arg8}"/>
            <arg value="${modular.jar.arg9}"/>
            <arg value="${modular.jar.arg10}"/>
            <arg value="${modular.jar.arg11}"/>
        </exec>
    </target>
   
    <target name="-do-jlink">
        <echo message="Creating jlink image in ${jlink.image.dir}/."/>
        <echo message="Executing: ${jlink.command} ${jlink.args.concatenated}"/>
        <exec executable="${jlink.command}">
            <arg value="${jlink.arg1}"/>
            <arg value="${jlink.arg2}"/>
            <arg value="${jlink.arg3}"/>
            <arg value="${jlink.arg4}"/>
            <arg value="${jlink.arg5}"/>
            <arg value="${jlink.arg6}"/>
            <arg value="${jlink.arg7}"/>
        </exec>
    </target>
SimpleAppプロジェクトの変更が完了しました。NetBeansでSimpleAppを "Clean and Build"すると、追加したantタスクが実行されます。以下はNetBeansの出力ウインドウに現れた出力例です。

最後に、ビルドされたものとカスタムランタイムイメージの実行方法を見てみましょう。 以下のスクリーンショットでは、NetBeansによって構築されたSimpleAppのdistディレクトリを調べています。SimpleApp.jar(モジュールjarファイル)とjimage ディレクトリ(カスタムランタイムイメージ)の2つのエントリがあることがわかります。続いて、JDK9ランタイムであることを示すためにjimage ディレクトリでjava -versionを実行し、java -list-modulesを実行して、このランタイムに含まれるモジュールを表示します。ここでは、3個のみ現れますが、本格的なJDK9ランタイムの場合は、通常90個前後現れます。そして最後のコマンドでは、SimpleAppアプリケーションがjimage/ ランタイムからどのように実行されるかを示しています。

上記の例はWindowsプラットフォームの場合です。LinuxやMacで実施したい場合には、project.propertiesファイルを適宜変更する必要があります。このエントリがJava 9の新機能のいくつかの理解に役立つことを願っています。

[Java] Creating Custom JDK9 Runtime Images

$
0
0
原文はこちら。
https://blogs.oracle.com/jtc/entry/creating_custom_jdk9_runtime_images

JDK9の新機能、つまりカスタムランタイムイメージを作成する機能を利用する方法の概要については、以下のYouTube動画をご覧ください。

この動画の補遺として、最近公開したブログで、NetBeansプロジェクト内でランタイムイメージの作成自動化について説明しています。詳細は以下のエントリをご覧ください。
Automating the Creation of JDK9 Reduced Runtime Images
https://blogs.oracle.com/jtc/entry/automating_the_creation_of_jdk9
信じられないのですが、このブログを始めてから10年経ち、75件のエントリを投稿しました!

[Java] Plans for 2017 and Beyond

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

2017年も約2ヶ月が過ぎ、ほとんどの人が新年の抱負を忘れているかもしれませんが、Java Community Process(JCPプログラム)はそんなことはありません。 2017年が本格的に動き出すにつれて、自身のビジョンと優先事項を共有したいと考えています。自身はJCPプログラムに16年以上関わっており、現在JCP議長を務めています。この立場で奉仕できることを光栄に思っていますし、長年にわたり力を入れているJava Communityとの仕事を続けていくことに夢中になっています。Java開発者は、Javaテクノロジ成功の主な理由の1つのみならず、この惑星の最高の人々でもあります。リーダーや世界を駆け回る国際的なスピーカーといった様々な役割をJCPプログラムの中で務めてきたので、訪問国に関係なく、Java開発者コミュニティの寛大さ、優しさ、知性に驚かされ、共感しています。コミュニティであることこそが、何年もJCPプログラムで仕事を続けてきた理由です。
非常に技術的なコミュニティであっても、基本的には「人」であることが、はっきりと分かりました。この理念を念頭に置いて、私たちはコミュニティからのJCPプログラムへの参加を引き続き拡大する予定で、2016年の会員増強の成功の勢いを足がかりにします。2016年5月以来、300名以上の新会員がJCPプログラムに加わりました。
Java Community Process (JCP) version 2.10 with a focus on broadening JCP Membership takes effect 12 May
https://jcp.org/en/press/news/JCP_210_JSR364
JSR 364の完成に伴ってメンバーシップを拡大しました。このJSR 364は企業、個人開発者、Javaユーザーグループ(JUG)からのJCPメンバーシップを拡大する目的で策定され、結果JCPプログラムの最新バージョンJCP 2.10ができました。
JSR 364: Broadening JCP Membership
https://jcp.org/en/jsr/detail?id=364
JCP 2.10: Process Document
https://jcp.org/en/procedures/jcp2
2017年には、年間のJCP Award、Star Spec Leadの認知、グローバルAdoptionプログラム(Adopt-a-JSRとAdopt OpenJDK)を通じて、コミュニティ内のリーダーシップを引き続き讃えていきます。
JCP Program and Industry Awards
https://jcp.org/en/press/news/awards/awards_main
Star Spec Lead Program
https://jcp.org/en/press/news/star
JAVA COMMUNITY PROCESS
https://community.oracle.com/community/java/jcp 
JCPプログラムの力仕事は、Java Specification Requests(JSR)のコミュニティ開発を通じて起こります。Javaプラットフォームを発展させるJSRと、プラットフォームの最新版、Java Standard Edition(Java SE)9およびJava Enterprise Edition(Java EE)8を完成させる作業は年間を通じて継続します。
JSR 379: JavaTM SE 9 Release Contents
https://jcp.org/en/jsr/detail?id=379
JSR 366: Java Platform, Enterprise Edition 8 (Java EE 8) Specification
https://jcp.org/en/jsr/detail?id=366
さらに、ECメンバーであるGoldman Sachsがロンドンで開催したJCP Executive Committee(EC)とのFace-to-Faceミーティングでの議論の後、JCP ECがJCPプログラムで改善できる領域が以下の3個あることを確認しています。
  • JCPとOpenJDKの関係
    2グループ間のやりとりを合理化して改善できる領域を調査
  • Java MEの将来
    組み込みおよびIoT関連領域における技術的およびビジネスマーケットの要求の両方を定義
  • JCP.Nextの作業を通じたJCPのさらなる変革
    JCPプログラム内で共同開発を改善できる分野を特定
これらが来年注力する領域です。JCPミーティングのサマリーとJCP_orgのtwitterフィードでの議論をフォローしてください。私の個人的なTwitterアカウント@heathervcでも見つけることができます。
JCP EXECUTIVE COMMITTEE MEETING MATERIALS
https://jcp.org/en/resources/EC_summaries
JCP.org@Twitter
https://twitter.com/jcp_org
Heather VanCura@Twitter
https://twitter.com/heathervc
これらのアイテムについては、一年を通して議論を深めていきます。2017年もその先も、Java開発者コミュニティと協力していくことを楽しみにしています。

[Linux, Docker] Put Your Containers on a Diet with Oracle Linux

$
0
0
原文はこちら。
https://blogs.oracle.com/developers/put-your-containers-on-a-diet-with-oracle-linux

最小のコンテナが最良だってこと、皆さんご存知ですよね?
Oracleは、ビジネスアプリケーションにとって最も効率的なプラットフォームを有することの重要性を認識しています。そして、そうしたアプリケーションのミッションクリティカルデリバリに最良のプラットフォームがOracle Linuxであると信じています。
Oracle Linux
https://www.oracle.com/linux/index.html
効率とセキュリティを確保する一つの方法として、できる限りコンテナに余分なものを入れないことがあります。Oracle Linuxイメージは今でも巨大ではありませんが、多くの必須ではないコンポーネントをできる限り取り除いてかなりサイズを小さくすることに成功しました。

Introducing the new Oracle Linux slim images for Docker

新しいベースイメージである、Oracle Linux 7-slim Docker Imageを導入しました。このイメージはわずか114MBです。
Oracle Linux 7-slim Docker image
https://hub.docker.com/_/oraclelinux/
確かに、Alpineほど小さくありませんが、他の主要なディストリビューションの中では最小のBaseイメージです。どれほど小さいかを是非グラフの数値でご確認ください。

このイメージは本当に小さく、テキストエディタすら入っていません。すべてのものを取り除いて、あなたのコンテナのためにできるだけ小さなイメージに仕立てました(したがって、攻撃される可能性も最小です)。しかし、yumは有効になっていて動作するので、実行したいサービスに必要なパッケージは簡単に入手できます。

Let's take the slim image for a spin

新しいスリム・イメージから独自のコンテナを構築するのは、DockerfileFROM:oraclelinux:7-slimを指定するだけです。公式のOracle LinuxイメージはすべてDocker Hubに公開されており、誰でも自由にダウンロード、配布、使用することができます。また、すべてのイメージでOracle Yum Serverからアップデートを取得できるため、コンテナ構築時に最新のセキュリティ修正および更新を適用できます。 さらに、OracleはCVE (Common Vulnerabilities and Exposures) がリリースされるたびにこれらのイメージを更新しますので、アップデートのほとんどは我々が実施します。

では、slim imageを拡張し、最新のPHPリリースを提供するSoftware CollectionをインストールするDockerfile の例を見てみましょう。
このイメージのビルドの結果、Docker Hubから入手できる公式PHP 7.0 CLIイメージよりもおよそ130MBほど小さいコンテナが作成されます。
イメージサイズの比較
1php-ol7-slim7.0ed603c8d47a0 235.4 MB
2php7.06c38128f3482363 MB

So where to from here?

まだGitHub上の公式Oracle Dockerfilesをチェックされていない場合には、是非チェックしてください。
oracle/docker-images
https://github.com/oracle/docker-images
Oracleのプロダクト・チームは、Database、WebLogic Server、Javaなどといった、利用可能なOracle製品のサンプルDockerfilesを数多く提供しています。独自のイメージを作成したくない場合は、Oracle Container Registryからイメージを取得するだけで、すぐに作業を開始できます。
Oracle Container Registry
https://container-registry.oracle.com/
Software Collections for Oracle Linuxリポジトリを有効化すれば、Oracle Linuxでサポートする全ての言語やサーバーソフトウェアの最新版を取得することができます。
Software Collection Library 2.3 for Oracle® Linux
http://docs.oracle.com/cd/E52668_01/E59096/html/index.html
Software Collections でご利用いただける全てのコンテンツは既存のOracle Linux Premier Supportサブスクリプションの対象です。

他のOracle開発者とDockerについて会話したい場合には、Oracle Technology NetworkにDocker and containersという専用コミュニティを用意していますので、そちらへどうぞ。
Containersスペース
https://community.oracle.com/community/server_&_storage_systems/containers

[Java] Java EE 8 - February recap

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

2月は1年で最も短い月ですが、それにもかかわらず、Java EE 8にとっては動きの多い月でした。以下に直近の活動および関連するアップデートをまとめておきます。

Java EE 8 platformのスケジュールが以下のようにアップデートされました。
  • Public Review - Apr/May 2017
  • Proposed Final Draft - June 2017
  • Final Release - July 2017(!)
[jsr366-experts] Java EE 8 schedule
https://java.net/projects/javaee-spec/lists/jsr366-experts/archive/2017-02/message/0
JSR 366: Java Platform, Enterprise Edition 8 (Java EE 8) Specification
https://jcp.org/en/jsr/detail?id=366
CDI 2.0のPublic Review期間がほぼ終わろう(訳注:3月2日までです)としていますので、JSR 365Expert Groupへのフィードバックがある方は今すぐお願いします。
CDI 2.0 is in public review
http://www.cdi-spec.org/news/2017/02/01/CDI_2_is_in_public_review/
JAX-RS 2.1 Early Draftはほぼ準備が完了しています。まもなくスタートします。以下のURLでちょっとのぞき見できます。
[jax-rs-spec users] JAX-RS 2.1 EDR
https://java.net/projects/jax-rs-spec/lists/users/archive/2017-02/message/84
このドラフトでは、Server-Sent Event APIが大幅に変更されています。詳細は、以下のURLをチェックしてください。
[jax-rs-spec users] Server-Sent Events API proposal​ - update
https://java.net/projects/jax-rs-spec/lists/users/archive/2017-02/message/46
JAX-RS 2.1 m04
https://github.com/jax-rs/api/releases/tag/2.1-m04
Bean Validation 2.0 Expert GroupはEarly Draftをリリースしました。
JSR 380: Bean Validation 2.0
https://jcp.org/en/jsr/detail?id=380
Bean Validation 2.0 Early Draft 1 is Out
http://beanvalidation.org/news/2017/02/14/bean-validation-2-0-early-draft-released/
Bean Validation 2.0について詳細を知りたい方は、このJBoss Community Asylumのエピソードを聞いてください。
Podcast #43 - Validating Beans 2.0
http://jbosscommunityasylum.libsyn.com/podcast-43-validating-beans-20
Servlet 4.0はrenewal ballotをパスしました。その間にServlet Expert GroupはEarly Draftに向けて作業を進めています。
JSR 369: JavaTM Servlet 4.0 Specification
https://www.jcp.org/en/jsr/detail?id=369
Servlet Specification: users@servlet-spec.java.net: Archive
https://java.net/projects/servlet-spec/lists/users/archive/2017-02/
Security API Expert Groupもまた、Early Draftの準備に忙しい状態です。
JSR 375: JavaTM EE Security API
https://www.jcp.org/en/jsr/detail?id=375
[jsr375-experts] Comments on Current Spec Content (take 3)
https://java.net/projects/javaee-security-spec/lists/jsr375-experts/archive/2017-02/message/3
また、Java EE 8にむけJPA Maintenance Releaseを行う意向があることも発表されました。
[jpa-spec users] [jsr338-experts] Re: EE8 and JPA
https://java.net/projects/jpa-spec/lists/users/archive/2017-02/message/2
JSF 2.3とJSON-P 1.1はPublic Review Ballot期間に入っています。これはつまりこの2個の仕様は完成に近付いていることを意味します。
JSR 372: JavaServer Faces (JSF 2.3) Specification
https://jcp.org/en/jsr/detail?id=372
JSR 374: JavaTM API for JSON Processing 1.1
https://jcp.org/en/jsr/detail?id=374
最後に、もし何か貢献したいと思ってらっしゃるのであれば、先頃JCPがホストした2nd Adopt-A-JSRというWebcastを是非ご覧ください。

[Database] Oracle Database 12.2.0.1 on-prem is now available, too

$
0
0
原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/oracle_database_12_2_01

オンプレミス版Oracle Database 12.2.0.1はこれまでExadata と SuperCluster 用だけが利用できていましたが、とうとうLinux x86-64、SPARC Solarisおよび Intel Solaris用も ダウンロードできるようになりました。 その他のプラットフォームに対応したリリースの予定は、My Oracle Supportの以下のドキュメントをご覧ください。
Release Schedule of Current Database Releases (Doc ID 742060.1)
https://support.oracle.com/rs?type=doc&id=742060.1
Oracle Software Delivery CloudとOTNからダウンロードできます。
Oracle Software Delivery Cloud
https://edelivery.oracle.com/
OTN
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

[Integration] Integration Adapters - New Certification Matrix

$
0
0
Oracle SOA Suite、Oracle SOA Cloud Service (SOACS)、Oracle Integration Cloud Service (ICS) とIntegration Adapterの組み合わせでの動作保証マトリックスが公開されています。Oracle Technology Network (OTN)のページからご利用いただけます。

ご覧いただくとわかる通り、どのAdapterがどのバージョンのSOA Suite/SOACS/ICSで利用できるのか、がわかるようになっています。 この資料はAdapterの追加やSOA Suite/SOACS/ICSの更新の都度、アップデートされていきます。

[Cloud] DMN is introduced in PCS 17.1.3 as a preview mode

$
0
0
2017年2月のアップデート (17.1.3) で、Oracle Process Cloud Service (PCS) にDMN (Decision Model and Notation) を使ったDecision Modelの作成・実行機能がPreview Modeとして追加されました。PCSではDMN 1.1をサポートしており、FEEL(Friendly Enough Expression Language)を使って簡単かつ直感的にDecison Modelingできます。
Decision Model And Notation
http://www.omg.org/spec/DMN/
PCSで簡単なDecision Modelを作成する流れを以下にまとめておきます。今回は、気温と降水確率から、外出時に必要な持ち物を判断する、という(いかにもサンプルらしい)Decision Modelを作成します。

1. DMN編集機能の有効化

まず、最初にPreview機能を有効化する必要があります。Process Workspaceに管理者としてログインし、管理>UIのカスタマイズで、「Enable DMN in Composer」にチェックを入れ、[保存]をクリックします。dmn00
この設定後、Process ComposerでDMNの作成・編集ができるようになります。

2. Decision Modelの作成

Composerでは、[作成]をクリックし、[New Decision Model]をクリックします。

dmn01

Decision Modelの名前を指定し、[作成]をクリックします。今回はSampleDMNとしました。

dmn02

Decision Model編集画面はこんな感じです。

dmn03

Decisionsの右端にある+をクリックして、Decisionを作成します。Empty Logic、Decision Table、Expression、If-Then-Else、Function、Context、Relation、Listの8種類から選択できます。Emptyを選んで後から変更することもできます。

dmn04

ひとまず、3種類のDecisionを作成しました。いずれもEmpty Logicを選択しています。なお、一番上にあるDecisionは最終結果を出すためのDecisionで、その他のDecisionは結果判定の支援をするDecisionという扱いです(赤枠の矢印がそれを意味しています)。Decisionの順序にはご注意ください。もし最終結果を出すDecisionが一番上にない場合は、ドラッグ&ドロップでDecisionを入れ替えることができます。

dmn05

2. 入力データの作成

右端のINPUT DATAを展開し、データ型を作成します。

dmn06

気温(Temperature)と降水確率(Precipitation)をまとめたデータ型を作成します。

dmn07

データ型を作成したら、先ほど作成したデータ型に基づいて入力データ(データ・オブジェクト)を作成します。

dmn08

Decisionの種類を変更してみます。RainというDecisionでは、数式による判断をさせたいので、Expressionを指定します。

dmn09

式をEnter Expressionとの表示があるフィールドに指定します。ここでは、Forecast.Precipitation>80としておきます。つまり、降水確率80%を超えるか否かで判断しよう、というわけです。

dmn10

TemperatureというDecisionでは、If-Then-Elseを使うことにします。条件を指定するフィールドでは、入力データの候補が表示されるので、Typoを避けることができるようになっています。ここでは、18℃を上回るか否かで[暖かい]もしくは[寒い]を判断するようにしています。

dmn11

最終結果を出すWhat to bringというDecisionでは、Decision Tableを使うことにします。Temperature、Rainの各Decisionの結果を基にして、持ち物を決定します。判定結果のための結果データを作成するため、Enter Allowed Valuesをクリックします。

dmn12

Config typeでList of Textを選択し、値として、傘、レインコート、オーバーコート、何もいらない、を追加し、[OK]をクリックします。

dmn13

Temperature、RainというDecision出力結果を条件に加えます。一つのDecisionは既にフィールドがあるので、[Enter Expression]にTemperatureを指定します。

dmn14-2

もう一つのDecisionを追加するには、右端上部にある追加のアイコンをクリックします。下図のスクリーンショットでわかるように、列を前に入れるか、後ろに入れるかを選択できます。

dmn14-1

各Decisionの結果を指定すると、What to bringというDecision Tableは以下のようになります。

dmn14

これでひとまずDecision Modelの作成は完了です。

3. テスト

作成したDecision Modelをテストできます。右上の▶をクリックすると、テストデータを指定できる画面が現れますので、ここでTemperatureに18、Precipitationに70を指定し、[Start Test]をクリックして実行してみます。

dmn15

降水確率が70%で、気温が18度の場合は、オーバーコートが必要、という結果が出ました(実際には降水確率が70%だったら傘は必須だとは思いますが、RainというDecisionでこのように設定したので仕方ありません…)。

dmn16

各Decisionの結果も見ることができます。

dmn17dmn18

動作確認が完了したので、以後でBPMNから呼び出せるよう、サービスを作成します。

4. サービスの作成

左側のSERVICESを展開し、+をクリックしてサービスを作成します。

dmn19

名前を指定し、OKをクリックします。今回はWhatToBringServiceとしておきます。

dmn20

サービスを呼び出すための入力データと判断結果を出すDecisionをドラッグ&ドロップで指定します。

dmn21

入力条件と出力結果を紐付けることができたので、これでデプロイできるようになりました。[デプロイ]をクリックして、スナップショット名、バージョンを指定し、[デプロイ]をクリックしてデプロイします。

dmn22

Decision Modelのデプロイまで完了したので、BPMNプロセスから呼び出せるようにします。

5. BPMNプロセスの作成

BPMNプロセスの作成は特別変わったことをするわけではありませんが、これまでのビジネスルールのアクティビティとはアクティビティが異なることにご注意ください。今回は下図の右側のアクティビティを使います。

dmn23-1

今回は、入力フォームに気温と降水確率を指定したら、Decisionが判断し、その結果をフォームに表示する、というシンプルなアプリケーションです。

dmn24

デシジョン・アクティビティへのデプロイ済みのデシジョン・モデルの割り付けは、アクティビティの右側に現れるアイコンをクリックして[プロパティを開く]を選択し、Decision ModelとDecision Serviceを選択します。Decision Modelが見つからない場合には、+をクリックして追加します。

dmn26

Decision Serviceとのデータ・アソシエーションで注意する点は、Decisionによる判断結果が、下図のようにDecisionからはinterpretationという要素に含まれている、ということです。

DMN27.png

全てのデータ・アソシエーションが完了したら、デプロイします。デプロイはテストモードでも本番モードでもかまいません。

6. 実行

Workspaceから試してみましょう。今回は気温を12(℃)、降水確率を85(%)として[送信]をクリックします。

dmn28

[タスク]をクリックして、結果が返ってきていることを確認し、フォームを開きます。

dmn29

12℃、85%なので、レインコートが必要だ、という判断が返ってきていることがわかります。

dmn30

[Java] Reactive-Functional Fun on the Blockchain with web3j

$
0
0
原文はこちら。
https://community.oracle.com/docs/DOC-1011373

著者(Conor Svensson)について
Conor Svensson (@conors10) はweb3jというEthereumブロックチェーンとアプリケーションを統合するJavaライブラリの作者です。以前はcoHomeとHuffleというスタートアップの共同創業者で、その後、OtheraでCTOを務め、Otheraのブロックチェーン貸与プラットフォームおよび交換プラットフォームを構築しています。
coHome
https://www.cohome.co/
Huffle Home Loans
https://www.huffle.com.au/
Othera Group
https://www.othera.com.au/
また、Sydney Java User Groupの主催者の一人であり、よくスピーカーとして登場します。彼はテクノロジーとファイナンスに関するブログを書いており、ディスプレイの前にいないときは地元シドニーのMaroubraというビーチでサーフィンを楽しんでいます。

Java Magazine 2017年1/2月号で、ブロックチェーンテクノロジのEthereumを使って、その上でJavaアプリケーションを作成するためにweb3jの利用に関する入門記事を寄稿しています。
Java Magazine 2017年1月/2月号
http://www.javamagazine.mozaicreader.com/JanFeb2017/Default/36/0#&pageSet=36&page=0&contentItem=0
Ethereum Project
https://www.ethereum.org/
web3j - Lightweight Ethereum Java and Android integration library
https://web3j.io/
この記事では、web3jのreactive-functional APIを使用して、パブリックなEthereumブロックチェーンで発生するイベントを見る方法について説明します。

ここで記載したコードは全て以下のGitHubにUpしてあります。
web3j/examples
https://github.com/web3j/examples/tree/master/rx

Background

過去1年間、テクノロジーとFinancialの報道ではブロックチェーンとその破壊的な可能性でもちきりでした。ブロックチェーンは分散型の不変(Immutable)のデータストアです。不変ゆえに、データはブロックチェーンに追加することしかできません。これは、ブロックにグループ化されたトランザクションを使って実現されています。そのため、データはブロックチェーンの最後に追加されます。
f1.png
Figure 1. ブロックチェーンの構造
ブロックチェーンに存在するデータの状態は、以前発生したトランザクションやイベントを再生して構築されるため、分散イベントログのように考えることができます。ブロックチェーンは、完全に分散化されており、インターネットのような信頼できないパブリック環境で潜在的に関連のないノードに格納されます。さまざまなブロックチェーンテクノロジが存在しています中で、Ethereumは特にパブリックなブロックチェーン技術として生まれました。

ブロックチェーン技術の詳細については、Java Magazineの記事を参照してください)。
Scala: Deeply Functional, Purely Object-Oriented
http://www.javamagazine.mozaicreader.com/JanFeb2017/Default/47/0#&pageSet=36&page=0

Getting Started with Ethereum

分散化されたEthereumネットワークは、Ethereumネットワークのピア(Peer)を形成するクライアントから構成されています。ネットワークと対話するためには、これらの一つのクライアントにアクセスする必要があります。一番簡単な方法は、自身でクライアントを実行することです。2個の主要なクライアントは、GethとParityです。
ethereum/go-ethereum - Building Ethereum
https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum
ethcore/parity - Setup
https://github.com/ethcore/parity/wiki/Setup
クライアントをインストール後、以下のようにしてクライアントを起動できます。
# Geth:
$ geth --fast --cache=512 --rpcapi personal,db,eth,net,web3 --rpc --testnet

# Parity:
$ parity --chain testnet
クライアントは他のノードを見つけて接続し、testnetブロックチェーンのローカルコピーの同期を開始します。mainnetとtestnetという、2個のパブリックなEthereumブロックチェーンがあり、それぞれ本番環境、テスト環境に相当します。

The web3j Library

クライアントを実行したので、Ethereumブロックチェーン上でクライアントと連携する、軽量なJavaライブラリのweb3jを使うと、Ethereumブロックチェーンと対話を始めるのは簡単です。web3jについて詳細を知りたい方は、以下のURLをご覧ください。
web3j - Lightweight Ethereum Java and Android integration library
https://web3j.io

Figure 2. web3jはJavaアプリケーションのためにEthereumブロックチェーンへの統合レイヤーを提供する
プロジェクトにweb3jを取り込むには、以下のように依存性をpom.xmlに追加します。
<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>core</artifactId>
  <version>2.0.0</version>
</dependency>
Androidで作成しようとしているのであれば、 core-androidを使ってください。

New Block Subscriptions

数行のコードで、Ethereumブロックチェーンに接続し、新しいブロックがブロックチェーンに追加されたことの通知を受けることができます。
Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
Subscription subscription = web3j.blockObservable(false)
.subscribe( block -> {
System.out.println( "Sweet, block number "
+ block.getBlock().getNumber()
+ " has just been created" );
},
Throwable::printStackTrace );
TimeUnit.MINUTES.sleep(2);
subscription.unsubscribe();
blockObservable は、新しいブロックがEthereumブロックチェーンに追加される都度、ブロックオブジェクトをサブスクライバーに送信します。

プログラムの残りの部分とは異なる実行スレッドで非同期にサブスクリプションは実行するため、サブスクリプションにはsleepステートメントを含める必要があります。

各ブロックのトランザクション数の詳細と、ブロックを一意に識別するブロックハッシュ、前のブロックの親ハッシュをそれぞれ提供するために、この例に書き込みます。

この例を10ブロックに制限し、ラッチを使用して10ブロックが放出されるのを待ちます。
CountDownLatch countDownLatch = new CountDownLatch(1);
System.out.println("Waiting for " + COUNT + " transactions...");
Subscription subscription = web3j.blockObservable(true)
.take(COUNT)
.subscribe( ethBlock -> {
EthBlock.Block block = ethBlock.getBlock();
LocalDateTime timestamp = Instant.ofEpochSecond( block.getTimestamp()
.longValueExact())
.atZone(ZoneId.of("UTC"))
.toLocalDateTime();
int transactionCount = block.getTransactions().size();
String hash = block.getHash();
String parentHash = block.getParentHash();
System.out.println( timestamp + " Tx count: " +
transactionCount + ", Hash: " +
hash + ", Parent hash: " +
parentHash );
countDownLatch.countDown();
},
Throwable::printStackTrace);
subscription.unsubscribe();
コードを実行すると、直近にEthereumブロックチェーンに追加された10個のブロックの詳細を確認できます。
2016-12-22T00:27:11 Tx count: 3, Hash: 0xbed93a59bcd30c0f11e155109a5dbff3e56a5354e90e514108917c1f54c4182d, Parent hash: 0x74f8bffd8734833a2fbaad0d9e48eb6206ee25dc9c55425cf1edca9dfe45aa06
2016-12-22T00:27:44 Tx count: 2, Hash: 0xb147a4ca79bc7c5e767ee92be648a9fd23ee15ec64f764b3f2dc8a4cb7229a50, Parent hash: 0xbed93a59bcd30c0f11e155109a5dbff3e56a5354e90e514108917c1f54c4182d
2016-12-22T00:27:51 Tx count: 1, Hash: 0xa2d8d3572592470e30b7fb504ce504444b1ea1208035f1545c85fc824a882e1b, Parent hash: 0xb147a4ca79bc7c5e767ee92be648a9fd23ee15ec64f764b3f2dc8a4cb7229a50
2016-12-22T00:28:09 Tx count: 2, Hash: 0xf4d4a7d7a2202f8c64e72b47947adb5ae419f2bdadabec9386cb9d4a27cd7ef8, Parent hash: 0xa2d8d3572592470e30b7fb504ce504444b1ea1208035f1545c85fc824a882e1b
2016-12-22T00:28:17 Tx count: 2, Hash: 0x43dc1da772b3f5aea3388fb4ddf14c188753646de4971b62e90b903774c5c2bc, Parent hash: 0xf4d4a7d7a2202f8c64e72b47947adb5ae419f2bdadabec9386cb9d4a27cd7ef8
2016-12-22T00:28:22 Tx count: 1, Hash: 0x80d03ac26a3aba27d01beecb530b9055dd28b199a52bcc53704c8e418ba437fa, Parent hash: 0x43dc1da772b3f5aea3388fb4ddf14c188753646de4971b62e90b903774c5c2bc
2016-12-22T00:28:27 Tx count: 0, Hash: 0x897af69eafa47c2951379780a40ee47fc3383959197419a4feadc59d1d2b2c13, Parent hash: 0x80d03ac26a3aba27d01beecb530b9055dd28b199a52bcc53704c8e418ba437fa
2016-12-22T00:28:28 Tx count: 0, Hash: 0xf12762e30caa3d0f1c6c7deb7fff93cd00727565575b8b35a7466ca75ba112e6, Parent hash: 0x897af69eafa47c2951379780a40ee47fc3383959197419a4feadc59d1d2b2c13
2016-12-22T00:28:43 Tx count: 1, Hash: 0x3754841b596ad15b17b37dd6293db77ebb672743918877dcf92e47407a2153e5, Parent hash: 0xf12762e30caa3d0f1c6c7deb7fff93cd00727565575b8b35a7466ca75ba112e6
2016-12-22T00:28:49 Tx count: 2, Hash: 0x6613c62dfd05761b3794658d341c1dab95f19db1e2bebd8cf091861c1ae88cd4, Parent hash: 0x3754841b596ad15b17b37dd6293db77ebb672743918877dcf92e47407a2153e5

Functional Composition

RxJavaのObservableを使っているので、簡単に機能を追加できます。
Observable
http://reactivex.io/documentation/observable.html
例えば、ブロックチェーンに書き込まれた新しいトランザクション全て通知するObservableを作成する場合、 blockObservable() を再度利用し、ブロックに含まれているトランザクションのリストを展開し、flatMapIterable()メソッドを使ってこれらのトランザクションを個別に通知することができます。
web3j.blockObservable(true)
.flatMapIterable( ethBlock -> (List) ethBlock.getBlock()
.getTransactions());
今回は、パラメータとして true を渡しています。これはブロックとそれらのブロックに含まれている全てのトランザクションの詳細を要求することを意味しています。

web3jはすでにweb3j.transactionObservable()でこの構成を実装済みです。
web3j/web3j - JsonRpc2_0Rx.java
https://github.com/web3j/web3j/blob/master/src/main/java/org/web3j/protocol/rx/JsonRpc2_0Rx.java#L66

Counting Ether

Ethereumには、Etherという名前の独自のcryptocurrency(仮想通貨)があり、Bitcoinと同様に考えることができます。Etherを使ってネットワーク上で発生する取引への支払いをします。これらの取引では、Etherをある人から他の人に転送することもできます。取引に関連するEtherの詳細はEthereumのtransactionの value フィールドに含まれています。

以前のセクションで作成したトランザクション Observable を使い、簡単にリアルタイムでブロックチェーンから情報を取得し始めることができます。例えば、指定したブロックの個数で発生した取引の総額を取得する場合、以下のように利用することができます。
CountDownLatch countDownLatch = new CountDownLatch(COUNT);

System.out.println("Waiting for " + COUNT + " transactions...");
Observable<BigInteger> transactionValue = web3j.transactionObservable()
.take(COUNT)
.map(Transaction::getValue)
.reduce(BigInteger.ZERO, BigInteger::add);

Subscription subscription = transactionValue.subscribe(total -> {
System.out.println( "Transaction value: " + Convert.fromWei( new BigDecimal(total), Convert.Unit.ETHER) + " Ether");
countDownLatch.countDown();
},
Throwable::printStackTrace);

countDownLatch.await(10, TimeUnit.MINUTES);
subscription.unsubscribe();
上記コードを実行すると、以下のような結果を得ることができます。
Transaction value: 5.011 Ether (5011000000000000000 Wei)
ここでは、発行された各トランザクションの値を取得し、reduce()メソッドを使用してそれらを合計していますが、reduce関数が最終結果を提供するために、有限ストリームを扱う必要があることに注意してください。
Reduce
http://reactivex.io/documentation/operators/reduce.html
また、すべてのトランザクションがEtherの移転になるわけではないので、トランザクション値として0を受け取っても驚かないでください。

Etherは数多くの異なる単位があり、Weiはその中で最も細かいものです。1 Weiは10e-18 Etherです。ConvertメソッドはWeiの値をトランザクションからEtherに変換します。

Further Observables

他のobservableも利用できます。例えば、まだブロックにグループ化されておらず、ブロックチェーンに追加されていない、保留中のトランザクションの詳細を取得するには、次のようにします。
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
    ...
});
また、web3jは全てのEthereum API呼び出しのためのobservableも提供しています。以下は、Ethereumクライアントのバージョンを取得する簡単な例です。
Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
web3j.web3ClientVersion().observable().subscribe(x -> {
    System.out.println(x.getWeb3ClientVersion());
});
上記コードの実行例です。
Client is running version:     Geth/v1.5.4-stable-b70acf3c/darwin/go1.7.3
利用可能なAPI呼び出しのリストは、interface Ethereumをご覧ください。
Interface Ethereum
https://github.com/web3j/web3j/blob/master/src/main/java/org/web3j/protocol/core/Ethereum.java
web3jでサブスクライブ可能な追加のイベントタイプがあります。詳細は以下のURLをご覧ください。
Filters and Events
https://docs.web3j.io/filters.html

Conclusion

reactive-functional APIを使ってEthereumブロックチェーンへの問合せを実行するweb3jの機能の概要を説明してきました。web3jやEthereumの詳細を知りたい方は、以下のURLをご覧ください。たくさんのリソースがあります。
web3j - Lightweight Ethereum Java and Android integration library
https://web3j.io

[Java] JAX-RS 2.1 Server Sent Events

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

このブログの通常の書き方に比べて、このエントリのほうがより良い言葉(そして文法的に正しい)だとすれば、それは以下の文章がSantiagoが作成したJAX-RS 2.1仕様の一部だからです。

この章に対するフィードバックは、users@jax-rs-spec.java.netまでご連絡ください。

Server Sent Events

Server-sent events (SSE) は元々、HTML5の中でW3Cが導入した仕様ですが、現在ではWHATWGがメンテナンスしています。
HTML Standard / Server-sent events
https://html.spec.whatwg.org/#server-sent-events
これはサーバからクライアントへの1方向のチャネルを確立する方法を提供します。接続は長時間にわたり続きます。サーバから送信される複数のイベントのために再利用されますが、これはHTTPプロトコルを基にしています。クライアントは特別なメディアタイプ(text/event-stream)をHTTP HeaderのAcceptで指定することで、SSE接続の開通をリクエストします。
イベントは構造化され、イベント、データ、ID、リトライ、およびコメントといういくつかのフィールドが含まれています。SSEは、イベントフィールドがトピックに対応するメッセージングプロトコルであり、idフィールドを使用してイベントの順序を検証し、連続性を保証することができます。コネクションが何らかの理由で中断された場合、IDをリクエストヘッダーに入れて、サーバーに対し過去のイベントを再実行させることができます。ただしこれは、すべての実装でサポートされているわけではない、オプションの動作です。イベントペイロードはデータフィールドで運ばれ、テキスト形式でなければなりません。 リトライは再接続を制御するために使用されます。コメントは一般的な目的のフィールドであり、接続を維持するためにも使用できます。

Client API

SSE用のJAX-RSクライアントAPIは、HTML5の対応するJavaScript APIに触発されたものですが、異なる言語の使用やJava 9からFlow APIをサポートしたいという願望に由来する変更を伴いました。しかしながら、そのバージョンのJavaの依存性の導入はありませんでした。
Reactive Programming with JDK 9 Flow API
https://community.oracle.com/docs/DOC-1006738[Java] Reactive Programming with JDK 9 Flow API
https://orablogs-jp.blogspot.jp/2016/10/reactive-programming-with-jdk-9-flow-api.html

クライアントAPIへのエントリポイントは、SseEventSource型です。これは、JAX-RS APIの他のクラスと同様のビルダーを提供します。SseEventSourceは、リソースの場所を使ってすでに構成済みのWebTargetから作成されます。SseEventSourceはWebTargetの機能を複製せず、SSEのための必要なロジックのみを追加します。

以下は、SSE接続を開いてちょっとの間メッセージを読む例です。
try (final SseEventSource eventSource = SseEventSource.target(target).build()) {
    eventSource.subscribe(System.out::println);
    eventSource.open();
    Thread.sleep(500); // consume events for 500 ms.
} catch (InterruptedException e) {
    // ...
この例でわかるように、SseEventSourceはAutoCloseableを実装しています。 ソースを開く前に、クライアントはイベント・ストリームをサブスクライブし、各イベントを単に出力するイベント・コンシューマーを登録します。onSubscribe、onComplete、onErrorといった他のライフサイクルイベントのためのハンドラもサポートされていますが、簡単にするためにonEventのみを上記の例で示しています。

Server API

JAX-RS SSEサーバーAPIを使って、接続を受け入れ、1個以上のクライアント(サブスクライバ)に対しイベントを送信します。SseEventSinkを挿入し、text/event-streamメディアタイプを生成するリソースメソッドは、SSEリソースメソッドです。

以下の例は、SSE接続を受け入れ、接続を閉じる前にエグゼキュータ・スレッドを使用して3つのイベントを送信しています。
@GET
@Path("eventStream")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void eventStream(@Context SseEventSink eventSink, @Context Sse sse) {
    executor.execute(() -> {
        try(SseEventSink sink = eventSink) {
            eventSink.onNext(sse.newEvent("event1"));
            eventSink.onNext(sse.newEvent("event2"));
            eventSink.onNext(sse.newEvent("event3"));
            eventSink.close();
        } catch (IOException e) {
        // handle exception
        }
    });
}
SSEリソースメソッドは、着信接続を表すオブジェクト(この場合はSseEventSink)がリソースメソッドに注入されるという点で、非同期処理の場合と同様のパターンに従います。
上記の例では、イベントとブロードキャスタのファクトリメソッドを提供するSse型も挿入しています。SseEventSourceと同様に、インターフェースSseEventSinkもauto-closeableであるため、上記のtry-with-resourcesステートメントを使用することに注意してください。

Broadcasting

アプリケーションは、同時に複数のクライアントへイベントを送信する必要があるかもしれませんが、こうしたアクションは、JAX-RSでブロードキャストと呼ばれます。1つのSseBroadcasterに対し、複数のSseEventSinkを登録(またはサブスクライブ)することができます。そのため、すべてのSseBroadcasterは、Java 9 Flow APIで定義された意味でのパブリッシャーでもあり、Flow.Publisher<T>と同じメソッドをサポートしますが、Java 9への依存を避けるために直接インターフェースを拡張しません。より正確には、SseBroadcasterはFlow.Publisher<OutboundSseEvent>を実装します。

挿入されたSseインスタンスでnewBroadcasterというメソッドを呼び出すことによってのみbroadcasterを作成することができます。SseBroadcasterのライフサイクルとスコープはアプリケーションによって完全に管理されます(JAX-RSランタイムが管理するわけではありません)。以下の例は、broadcasterの利用方法を紹介しています。リソースクラスの@Singletonアノテーションに着目してください。
@Path("/")
@Singleton
public class SseResource {
    private final Sse sse;
    private final SseBroadcaster sseBroadcaster;
    
    public SseResource(@Context Sse sse) {
        this.sse = sse;
        this.sseBroadcaster = sse.newBroadcaster();
    }

    @GET
    @Path("subscribe")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public void subscribe(@Context SseEventSink eventSink) {
        eventSink.onNext(sse.newEvent("welcome!"));
        sseBroadcaster.subscribe(eventSink);
    }

    @POST
    @Path("broadcast")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void broadcast(@FormParam("event") String event) {
        sseBroadcaster.broadcast(sse.newEvent(event));
    }
}

Environment

SseEventSourceクラスは、RuntimeDelegateに基づく既存のJAX-RSメカニズムを使用して、サービス名javax.ws.rs.sse.SseEventSource.Builderを使用する実装を検索します。 javax.ws.rs.sseの大部分の型はスレッドセーフです。 スレッドセーフの詳細については、Javadocを参照してください。

[Database] Upgrade to Oracle Database 12.2 - New MOS Notes

$
0
0
原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/upgrade_to_oracle_database_121

Oracle Database 12.2.0.1へのアップグレードに関する有用なドキュメントがMy Oracle SupportにUpされています。
Complete Checklist for Manual Upgrades to Non-CDB Oracle Database 12c Release 2 (12.2) (Doc ID 2173141.1)
https://support.oracle.com/rs?type=doc&id=2173141.1
Complete checklist for Manual Upgrade for Multitenant Architecture Oracle Databases from 12.1.x.x to 12.2..x.x (Doc ID 2173144.1)
https://support.oracle.com/rs?type=doc&id=2173144.1
Complete Checklist for Upgrading to Oracle Database 12c Release 2 (12.2) using DBUA (Doc ID 2189854.1)
https://support.oracle.com/rs?type=doc&id=2189854.1
さらに、定期的に既知の問題やアラートのチェックをしてください。現時点ではドキュメントにコンテンツは挙がっていませんが。ドキュメント自体は既に存在しています。
12.2.0.1 Base Release - Availability and Known Issues (Doc ID 2239820.1)
https://support.oracle.com/rs?type=doc&id=2239820.1

[Database, Support] Oracle Database 12.2 - Lifetime Support Policy updated

$
0
0
原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/oracle_database_12_2_lifetime

オンプレミス用Oracle Database 12cR2が一般提供されたことを受けて、テクノロジー製品のOracle Lifetime Support Policyのブローシャもアップデートされました。
Oracle Lifetime Support Policy - Oracle technology products
http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf
この表とパンフレットは、パッチセットとベースリリースを区別しないことに注意してください。 たとえば、Oracle 11gR2 (11.2)について説明している行では...

  • Oracle Database 11.2.0.3が2015年8月27日以降のバグ修正サポートから外れたとは言っていない
  • Extended SupportはOracle Database 11.2.0.4のみに適用される

これらの詳細については、表の下に記載されているMOS Note 742060.1を参照してください(この情報がこのエントリに含まれていない理由は筆者に尋ねないでください。SRを開いてOracle Supportに問い合わせてください)。
Release Schedule of Current Database Releases (Doc ID 742060.1)
https://support.oracle.com/rs?type=doc&id=742060.1
最も重要な、以下のサポートドキュメントはまだ更新されていませんが、こちらもまもなく更新されることでしょう。
Oracle Database (RDBMS) Releases Support Status Summary (Doc ID 161818.1)
https://support.oracle.com/rs?type=doc&id=161818.1
Viewing all 760 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>