[Java] JSR 269 Maintenance Review for Java SE 9

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

Java SE 7、Java SE 8の時にもあったように、Java SE 9において、JSR 269(Annotation Processing API)はメンテナンスレビュー(Maintenance Review、MR)が進んでいます。
JSR 269 Maintenance Review
https://blogs.oracle.com/darcy/entry/jsr_269_maintenance_review
JSR 269 Maintenance Review for Java SE 8
https://blogs.oracle.com/darcy/entry/jsr_269_mr_for_java
JSR 269: Pluggable Annotation Processing API
https://jcp.org/en/jsr/detail?id=269
javax.lang.model.*における言語構造としてだけでなく、Filerなどにおけるjavax.annotation.processingでの別のインタラクション・ポイントとしても、API変更のほとんどはプラットフォームへのモジュール追加をサポートします。
JSR 376: JavaTM Platform Module System
https://jcp.org/en/jsr/detail?id=376
アノテーションの繰返しのサポートを改善するために、ちょっとしたAPIの変更も行われました。 API変更の詳細なサマリは、MR資料に含まれています。
JSR 269 MR summary
https://jcp.org/aboutJava/communityprocess/maintenance/jsr269/summary-2017-02-28.html
APIの変更は、既存のプロセッサーのソースやバイナリリンケージ、および実行時の動作と大きく互換性がありように意図されています。ただし、JDK 9で実行している場合は、既存のプロセッサーが正常に動作することを確認する際に便利です。JDK 9早期アクセスバイナリーは以下のURLからダウンロードできます。
JDK 9 Project
https://jdk9.java.net/
是非JDK 9でプロセッサーを実行した体験を(原文の)コメント欄やメールでご連絡ください。API変更に関するフィードバックは以下のメーリングリストに対してお送りください。
compiler-dev -- Technical discussion about the development of the Java compiler (javac)
http://mail.openjdk.java.net/mailman/listinfo/compiler-dev

[Java] Malthusian Locks

原文はこちら。
https://blogs.oracle.com/dave/entry/malthusian_locks1

Malthusian LocksについてEuroSys 2017で発表します。
Malthusian Locks
https://blogs.oracle.com/dave/resource/eurosys17-dice.pdf
EuroSys 2017
http://eurosys2017.org/
上記PDFは抜粋で、arxivにもUpされています。
Malthusian Locks
https://arxiv.org/abs/1511.06035

Abstract:

モダンなマルチスレッド環境で動作するアプリケーションは時としてオーバースレッド(スレッド過多)の場合があります。スレッドが多すぎる場合、パフォーマンスの改善が見込めないどころか、スケーラビリティが壊れてパフォーマンスが低下する原因になることがあります。また、利用可能なCPUコアに比べて準備されているスレッドが少ない場合にも発生する可能性があります。こういったソフトウェアにはロック競合が多いこともあります。一定期間内にロックを循環する個別のスレッドの数を意図的に制限するためロック許可ポリシーを変更することによって、このようなロックの存在を利用します。具体的には、ロックが(継続的に保持されて)飽和状態となるために必要なスレッド数よりも多くのスレッドが循環している場合、筆者の考える手法では、余分なスレッドの一部を選択して取り除きます。ロック競合に陥っている場合、メモリ管理におけるスワッピングの概念を借りて、同時実行制限(CR、 concurrency restriction)を課します。結果として決まる入場順は、確かに短期的には不公平ではありますが、定期的に不動態化されたスレッドと、アクティブに循環しているスレッド間でシフトすることで、明示的に長期的な公平性を提供します。具体的には、無制限のバイパスや欠乏を許す、よくあるtest-and-setテストに比べ、スループットが影響をうけない、もしくは改善され、そして不公平が制限されます。パイプラインやプロセッサ、キャッシュといった共有リソースの競合の減少によって、並行性の制限が結果として全体的なリソース消費を削減し、システム全体の負荷容量を向上させる可能性があります。

[Java] Additional details on GlassFish 5 Promoted Build 3

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

Java EE 8の進展に伴い、GlassFishはここ数ヶ月の間に活動を開始しましたGlassFish 5のNightly Buildの安定化後、GlassFishの週次プロモーションプロセスを復活させました。その後時間がかかりましたが、週次Promoted buildのGlassFish-5,0-b03をリリースしました。
GlassFish 5.0 Promoted Build
http://download.oracle.com/glassfish/5.0/promoted/index.html
是非お試しいただき、フィードバックをしてください。
GlassFish 5を実行する上で必要なJDKバージョンの要件はJDK 8u121です。

以下のコンポーネント統合され、このビルドに含まれています。
  • JSF 2.3.0-m11
  • Jersey 2.26-b02
  • JAX-RS 2.1-m03
  • HK2 2.5.0-b33
  • Grizzly 2.3.29
  • Grizzly NPM 1.7
  • Jboss Logging 3.3.0.Final
  • Tyrus 1.13.1
  • Jackson 2.8.4
  • JSTL 1.2.5-b03
  • Servlet 4.0.0-b03

Servlet 4.0 Update

Webコンテナで多くの進捗がありました。

Issue ID or Commit RevisionSummary
r64700Integrate javax.servlet:javax.servlet-api:4.0.0-b03
SERVLET_SPEC-73Add API for Servlet Mapping
SERVLET_SPEC-161
implemented by GLASSFISH-21688
Allow encoding to be set from deployment descriptor
r64338Updates schema files for Servlet 4.0
SERVLET_SPEC-16
implemented by GLASSFISH-21666
Allow setting the jsp-file programmatically
SERVLET_SPEC-134Updates for spec and impl of server push
SERVLET_SPEC-137
implemented by GLASSFISH-21673
Allow setting the default context-path without resorting to container specific config

修正済みのBug

以下のバグはこのビルドで対応済みです。
Issue IdSummary
GLASSFISH-21677Need to remove -Xbootclasspath from domain.xml
GLASSFISH-21671Switch appserver build to source=1.8 and target=1.8
GLASSFISH-21656list-jms-resources fails if operand is clustered instance
GLASSFISH-21655rollback of create-jms-resource fails when resource has already existed
GLASSFISH-21650countopenconnections is not counted at the request to http-listener-2 of the cluster
GLASSFISH-21649countqueued1minuteaverage does not count the value for one minute
GLASSFISH-21648corethreads and maxthreads are always zero
GLASSFISH-21646countbytesreceived and countbytestransmitted count the value of requests to admin-listener
GLASSFISH-21645maxopenconnections of HttpServiceStatsProvider is always the same.
GLASSFISH-21644Not able to deploy app with cdi validator support
GLASSFISH-21642access-logging-bad-requests web devtests fails in Hudson
GLASSFISH-21640JMS message in server.log is logged only message key.
GLASSFISH-21639difficult maintained log messages
GLASSFISH-21591[GF-JDK9] JDK internal API sun.misc.URLClassPath used in com.sun.appserv.ClassLoaderUtil
GLASSFISH-21589Problems with resource deletion if all resource targets are deleted
GLASSFISH-21585The list of JVM options is lost empty when an invalid option is added.
GLASSFISH-21584A new property cannot be added in "Cluster System Properties" page.
GLASSFISH-21580WebappClassLoader is not thread safe
GLASSFISH-21579asadmin list-file-groups exits successfully although user doesn't exist
GLASSFISH-21576javamail debug log is not logged.
GLASSFISH-21574asadmin deploy --precompilejsp doesn't check compilerSourceVM and compilerTargetVM in glassfish-web.xml
GLASSFISH-21573Server log messages are unexpectedly trimmed if the message starts with or ends with spaces.
GLASSFISH-21572AS-WEB-GLUE-00078 is logged to the server.log although both tls11-enabled and tls12-enabled are true.
GLASSFISH-21560"asadmin list-logger-levels" does not list java.util.logging.ConsoleHandler
GLASSFISH-21546password alias is not updated until restart the process.
GLASSFISH-21542Update jboss.logging
GLASSFISH-21522NullPointerException during WebDirContext.lookupFromJars
GLASSFISH-21515Possible null pointer dereference
GLASSFISH-21505JDK9 - Unable to launch the Application Client Container
GLASSFISH-21494Double checked locking problem
GLASSFISH-21479Glassfish 4.1 won't start with JDK 9 build jdk9-b95 (and later)
GLASSFISH-21376There is a "null" in the log name
GLASSFISH-21276A number of monitor mbeans are broken
GLASSFISH-21272JDBC Monitoring MBeans not working in JConsole
GLASSFISH-20917a wrong implementation for web-fragment.xml with <distributable/> issue
GLASSFISH-20858Message "Invalid Url Pattern" contains placeholder, while it obviously must contain the invalid pattern

[Database] Python cx_Oracle 5.3 for Oracle Database Released

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

本日、Oracle Database用の非常に人気のあるPythonインタフェースであるcx_Oracle 5.3のリリースを発表できうれしく思います。バイナリとソースはPyPiを使って通常通りインストールできます。
Python interface to Oracle (Python Package Index)
https://pypi.python.org/pypi/cx_Oracle/
Installation
https://github.com/oracle/python-cx_Oracle#installation
cx_Oracle 5.3は、Python v2.7、およびv3.4以上で動作します。cx_OracleはOracle 11gR2、12cR1、および12cR2クライアント・ライブラリとともに使用することができ、複数のOracle Databaseバージョンに接続できます。Oracle Databaseの標準的なクライアント・サーバー・バージョンの互換性により、古いデータベースと新しいデータベースの両方に接続できます。たとえば、Oracle Database 11gR2クライアント・ライブラリを使うとOracle Database 10gR2以降に接続できます。
今回のリリースでは、ソースコードリポジトリとホームページをGitHubに移行しました。 ユーザー文書はreadthedocsに残しています。cx_Oracleメーリングリストも引き続き同じ環境ですが、質問や問題についてはGitHubに移行しています。
ソースコード(Python interface to Oracle Database)
https://github.com/oracle/python-cx_Oracle
ホームページ
https://oracle.github.io/python-cx_Oracle/index.html
Documentation
http://cx-oracle.readthedocs.io/en/latest/index.html
cx-oracle-users メーリングリスト
https://lists.sourceforge.net/lists/listinfo/cx-oracle-users
GitHub Issues
https://github.com/oracle/python-cx_Oracle/issues

The New cx_Oracle 5.3

Anthony TuiningaがOracleに加わって以来、cx_Oracleの改善を加える作業に取り組んできました。(彼は次の大きなリリースのための基礎となる作業もしていますが、これについてはこの記事の後半で説明します)。みなさんがcx_Oracle 5.3に感銘を受けるであろうと考えています。昨年のOracle OpenWorldでは、Anthonyがいくつかの変更について話し、よいフィードバックをたくさんいただきました。昨年のOpenWorldでのプレゼンテーションは以下のURLでチェックしてください。
Python and Oracle Database: Tips, Tricks, and the Best New Features [CON6543]
https://oracle.rainfocus.com/scripts/catalog/oow16.jsp?search=CON6543&showEnrolled=false&search.event=oracleopenworld
これは大きなアップデートです。一部はOracle Database 12cの機能に固有の変更ではありますが(リリース・ノートを参照してください)、たとえ古いデータベースを利用されている場合でも、このアップデートでアプリケーションの性能がよくなることがわかるでしょう。そして、Oracle Database 12cR2にアップグレード中、もしくはその予定がありますか?Oracle Database Cloudを使用してOracle Database 12cR2にすぐにアクセスできることをお忘れなく。
Release Note
http://cx-oracle.readthedocs.io/en/5.3/releasenotes.html#version-5-3-march-2017
Oracle Database Software Downloads
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
Oracle Database Cloud Service
https://cloud.oracle.com/ja_JP/database

Key New Features

Other New Features

Changes from cx_Oracle 5.2

以前のリリースで廃止対象のものとした発表に沿い、以下のアイテムがcx_Oracle 5.3で利用できなくなりました。
  • maxlength という変数属性は使えなくなりました。その代わりにbufferSizeを使ってください。
  • allocelems という変数属性は使えなくなりました。その代わりに numElements を使ってください。
  • UNICODEFIXED_UNICODELONG_UNICODE 型は使えなくなりました。その代わりに NCHARFIXED_NCHARLONG_NCHAR を使ってください。
  • OCI 関数のコールバックはサポートされなくなりました。

Future Deprecation Announcements

将来リリース予定のcx_Oracle 6では、以下のアイテムが廃止される予定です。
  • cx_Oracle.connect()twophasemoduleaction、そしてclientinfoの引数が廃止され、cx_Oracle 6では使えなくなる予定です。その代わりに新しいアプリケーション・コンテキスト(application context)を利用してください。
  • カーソル属性numbersAsStringsが廃止され、cx_Oracle 6では使えなくなる予定です。その代わりにOUTPUT型ハンドラ(output type handler)を利用してください。

Things you could already do in cx_Oracle 5.2

上記のcx_Oracle 5.3のすべての新機能は、これまでに積み上げたデータベースサポートの上に成り立っています。以前のリリースで既に使用可能な高度な機能は次のとおりです。
  • SQLおよびPL/SQLの実行
  • 豊富なデータ型のサポート
  • 大規模な結果セットの取得
  • REF CURSOR
  • PL/SQL配列のバインド
  • ラージオブジェクト(CLOB、BLOB)
  • トランザクション管理
  • セッション・プーリング
  • データベース常駐接続プーリング(DRCP)
  • 特権接続とデータベースの起動・停止
  • 外部認証
  • Continuous Query Notification
  • 行プリフェッチ
  • クライアントの結果キャッシュ
  • End-to-Endのトレース
  • Oracle Database 高可用性機能

A future cx_Oracle 6

先ほど、みなさんがcx_Oracle 5.3に感銘を受けるだろうと書きましたが、Anthonyはより良いものを目指し、すでにcx_Oracle 6を見据えています。昨年Anthonyは、cx_Oracleが使用されるような、一般的なOracle Call Interface (OCI)機能の利用を簡素化し標準化するオープンソースのCライブラリである、ODPI-Cに熱心にとりくんできました。ODPI-Cは最近Githubで公開されました。cx_Oracleのソースコードからわかるように、cx_OracleコードのマスターブランチはODPI-Cを使用するようにアップデートされています。この将来のリリースの現状をテストしたい場合は、GitHubからバンドルをダウンロードしてビルドしてください。ユーザーに見える範囲での変更に関する(これまでの)リリースノートは以下のURLにあります。
Oracle Database Programming Interface for Drivers and Applications (ODPI)
https://github.com/oracle/odpi
Release notes (6.x releases)
https://github.com/oracle/python-cx_Oracle/blob/master/doc/src/releasenotes.rst

Summary

cx_OracleをOracleの傘下に移すことで、Anthonyはcx_Oracleに注力する時間が増え、結果としてすべての開発者にとってデータベースへのアクセスが向上しました。
全体的に、cx_OracleはOracle Databaseのための最も包括的で人気のあるスクリプト言語ドライバで、cx_OracleはOracleクライアント・ライブラリやOracle Databaseに組み込まれた優れた機能を活用しますし、もちろん、cx_Oracleを使うPythonアプリケーションは、ネットワーク・データの暗号化などのOracle Net機能を利用することができます。
cx_Oracle 5.3は、Oracle Databaseの優れた機能をサポートする大きなリリースです。 是非チェックしてください。

cx_Oracle Resources

cx_Oracle
https://oracle.github.io/python-cx_Oracle/index.html
Documentation
http://cx-oracle.readthedocs.io/en/latest/index.html
cx-oracle-users メーリングリスト
https://lists.sourceforge.net/lists/listinfo/cx-oracle-users
GitHub Issues
https://github.com/oracle/python-cx_Oracle/issues
Python interface to Oracle Database
https://github.com/oracle/python-cx_Oracle

[Java] An update on GlassFish 5

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

参照実装(Reference Implementation)は全てのJSRにとって重要な部分であり、このことはJava EEにとっては特にその通りです。種々のJava EE 8に関連するJSRが進展するにつれて、オープンソースのJava EE 8参照実装であるGlassFish 5の取り組みを強化することが重要になっています。そして今日、最初のGlassFish 5 Promotedビルド(GlassFish-5.0-b03)を発行し、Java EE 8の重要なマイルストンをむかえました。
Promoted build of GlassFish 5
http://download.oracle.com/glassfish/5.0/promoted/index.html
実はGlassFish 5のビルドとして2種類リリースしています。一つは nightly 、そしてもう一つは promoted で、両方ともFull ProfileとWeb Profileがあります。
まだまだ早期段階で、まだまだ開発中ということは明白です。種々の仕様で、それぞれの参照実装(例えばJAX-RSだとJersey、Bean ValidationだとHibernate Validatorなど)があるだけでなく、それぞれの仕様のTCKもあります。それゆえ、全てのGlassFish 5 promoteビルドがJava EE 8 CTSを全てパスしているとはまだ言ってはいません(というか言えない)。
Q: Are there compatibility tests for the Java EE platform? (Java EE FAQ)
http://www.oracle.com/technetwork/java/javaee/javaee-faq-jsp-135209.html#compatibilitytests
また、以下に述べるビルドサイクルは、ビルドの実状に応じて変化する可能性があることも言及しておかねばなりません。例えば、ビルドが壊れていると、遅延したり、スキップされたりすることがあります。

Java EE 8はJava SE 8以上をベースにしているため、Java SE 8をGlassFish 5のベースラインJDKとして使用していますが、GlassFish F5の最終的なリリースではJava SE 9もサポートする予定です。そのため、今週のPromotedビルドはJava SE 9では動作しませんが、それは一時的なものです。

Nightlyビルドは最新のPromotedビルドの数日先のものになることが常ですが、コミュニティの皆様には、是非Promotedビルドを使っていただきたく思っています。そのため、GlassFish 5の最新のPromotedビルドをテストすることで是非支援ください。何か問題を発見した場合には、以下を参考にして、該当するGlassFishコンポーネントに対するチケットを発行してください。
Components
https://java.net/jira/browse/GLASSFISH/?selectedTab=com.atlassian.jira.jira-projects-plugin:components-panel
そして、問題が特定のコンポーネント(例えばJersey)にあると確信できるのであれば、直接当該コンポーネントに対する問題として知らせてもらえるとなお効率がよいです。

GlassFish 5はJava EE 8 Platform仕様(JSR 366)がファイナライズされたおよそ6週間後にリリースする予定になっています。
JSR 366: Java Platform, Enterprise Edition 8 (Java EE 8) Specification
https://jcp.org/en/jsr/detail?id=366
現時点では、仕様策定完了は7月を目指しており、結果としてリリース日は8月もしくは9月頃になると見込んでいます。このスケジュールは変更の可能性がありますが、これが現時点の見通しです。
[jsr366-experts] Java EE 8 schedule
https://java.net/projects/javaee-spec/lists/jsr366-experts/archive/2017-02/message/0

[Database] Property Graph Query Language (PGQL) support has been added to Oracle Database 12.2.0.1!

原文はこちら。
https://blogs.oracle.com/oraclespatial/entry/property_graph_query_language_pgql

Oracle Database 12c Release 2 (12.2.0.1)で、Oracle Spatial and Graphの既存のProperty Graph機能にProperty Graph Query Language (PGQL) のサポートを追加するパッチがリリースされました。ダウンロードにはMy Oracle Supportの契約が必要です。
Patch 25640325: MISSING PGQL FUNCTION IN ORACLE DATABASE RELEASE 12.2.0.1
https://support.oracle.com/rs?type=patch&id=25640325
PGQLはSQLのような宣言型言語で、これを使って、頂点と辺、ならびに頂点と辺のプロパティへの制約から構成されるグラフクエリパターンを表現することができます。
このパッチを貴社のデータベースインスタンスに適用すると、以下のGroovy/Javaベースのクイックテストを実行して、動作方法を確認できます。
cd $ORACLE_HOME/md/property_graph/dal/groovy
sh ./gremlin-opg-rdbms.sh 

--------------------------------

opg-oracledb> // It is very likely that you need to customize JdbcURL, Username, and Password in the following graph config setting.
opg-oracledb> // 
opg-oracledb> cfg = GraphConfigBuilder.forPropertyGraphRdbms().setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:orcl")
                    .setUsername("scott").setPassword("tiger")
                    .setName("connections") .setMaxNumConnections(8)
                    .setLoadEdgeLabel(false) .addVertexProperty("name", PropertyType.STRING, "default_name")
                    .addEdgeProperty("cost", PropertyType.DOUBLE, "1000000")
                    .build(); 

opg-oracledb> opg = OraclePropertyGraph.getInstance(cfg);

opg-oracledb> opg.clearRepository();     // start from scratch

opg-oracledb> opgdl=OraclePropertyGraphDataLoader.getInstance();

opg-oracledb> vfile="../../data/connections.opv"  // vertex flat file
==>../../data/connections.opv
opg-oracledb> efile="../../data/connections.ope"  // edge flat file
==>../../data/connections.ope
opg-oracledb> opgdl.loadData(opg, vfile, efile, 2, 10000, true, null);
==>null

opg-oracledb> opg.countVertices()
==>78
opg-oracledb> opg.countEdges()
==>164

opg-oracledb> // Create an in memory analytics session and analyst

opg-oracledb> session=Pgx.createSession("session_ID_1");

opg-oracledb> analyst=session.createAnalyst();
opg-oracledb> 
opg-oracledb> // Read graph data from database into memory

opg-oracledb> pgxGraph = session.readGraphWithProperties(opg.getConfig());
==>PgxGraph[name=connections,N=78,E=164,created=1488415009543]

opg-oracledb> pgxResultSet = pgxGraph.queryPgql("SELECT n,m WHERE (n) -> (m)")
==>PgqlResultSetImpl[graph=connections,numResults=164]

opg-oracledb> pgxResultSet.print(10);
+------------------------------------+
| n                | m               |
+------------------------------------+
| PgxVertex[ID=2]  | PgxVertex[ID=1] |
| PgxVertex[ID=3]  | PgxVertex[ID=1] |
| PgxVertex[ID=6]  | PgxVertex[ID=1] |
| PgxVertex[ID=7]  | PgxVertex[ID=1] |
| PgxVertex[ID=8]  | PgxVertex[ID=1] |
| PgxVertex[ID=9]  | PgxVertex[ID=1] |
| PgxVertex[ID=10] | PgxVertex[ID=1] |
| PgxVertex[ID=11] | PgxVertex[ID=1] |
| PgxVertex[ID=12] | PgxVertex[ID=1] |
| PgxVertex[ID=19] | PgxVertex[ID=1] |
+------------------------------------+

[Linux] Now available: Oracle Linux Vagrant Box

原文はこちら。
https://blogs.oracle.com/linux/entry/now_available_oracle_linux_vagrant

Vagrantは仮想マシンベースの環境を管理するためのツールです。
Vagrant
https://vagrantup.com/
でもなぜVagrantを使うのでしょう。Linuxで動作するコードを開発しているけれども、macOSやWindowsマシンを使ってお気に入りのブラウザ、エディタ、デバッガ、開発ツールを使う場合に、Vagrantは構成や依存性を開発マシンから分離して自由に使えるLinux環境を作成するための一環したワークフローを提供します。 
Vagrant Boxは事前ビルド済みのベースイメージで、Vagrantにインポートできます。Oracle Linux 7.3をVagrant Boxにパッケージングしました。このすぐに使えるパッケージを利用するには、Oracle VM VirtualBoxとVagrantをインストールしておく必要があります。もしまだであれば、以下からダウンロードできます。
これらのインストールが完了したら、以下のコマンドを使ってOracle Linux Boxをダウンロードし、起動することができます。
mkdir ol73; cd ol73
vagrant box add --name ol73 http://yum.oracle.com/boxes/oraclelinux/ol73/ol73.box
vagrant init ol73
vagrant up
vagrant ssh
この後、Oracle Linuxの環境にログインすれば、使えるようになります。作業ディレクトリは上記で作成済み(ol73)なので、これを仮想マシンに共有フォルダとして /vagrant にマウントすれば、Oracle LinuxゲストVMでそうしたファイルにアクセス、コンパイル、実行しながら、ホスト側で開発ツールやエディタを利用してコードや他のファイルを編集できます。

Linuxのゲスト環境が不要になったら、以下のコマンドで削除できます。
vagrant destroy
今回リリースしたOracle LinuxのVagrant Boxは以下のような高レベルなスペックです。
  • ダウンロードサイズ:378 MB
  • 2 vCPUs
  • 2048 MB RAM
  • Oracle Linux 7.3 +Unbreakable Enterprise Kernel 4.1.12-61.1.28.el7uek.x86_64 
  • 最小パッケージセットをインストール済み
  • VirtualBox guest additions 5.1.12インストール済み
  • rootボリューム:12 GBの割り当て
  • Swap:4 GB の割り当て 
  • ルートファイルシステム:XFS
  • Oracle Yumサーバー(yum.oracle.com)の構成済み
将来もっと多くのOracle Linux Boxがリリースされる予定ですので、以下のURLをチェックしてください。思うところがありましたら、(原文の)コメント欄にどうぞ。
Oracle Linux Vagrant Boxes
http://yum.oracle.com/boxes
(訳注)
上記URLにも記載がありますが、利用にあたってお金は不要ですが、サポートはありませんので、お問い合わせはOTNのOracle Linux Community Forumにお願いします。
Oracle Linux Community Forum
https://community.oracle.com/community/server_&_storage_systems/linux/oracle_linux 

[Cloud] 'Upping' the Convenience Factor - Edit Files Directly from the Web

原文はこちら。
https://blogs.oracle.com/webcenter/entry/upping_the_convenience_factor_edit

このエントリは、Marc-Andre Houle(Principal Manager, Product Management, Oracle Cloud Services)によるものです。

Product Managerとして、定期的に社内外の人たちとコラボレーションしていますが、その中で、筆者に共有されたファイルのレビュー、編集、アップデートを依頼されることがあります。Oracle Content and Experience Cloudのすばらしいところは、簡単に共有されたものに対して協同作業がいつでもどこからでも可能、というところです。

とはいえ、ファイルやフォルダをローカルマシンと同期していなければどうでしょうか。もしくは、アクセスできないフォルダ内のファイルのリンクを送ってこられて、そのファイルを編集しなければならないとしたらどうでしょうか。Oracle Content and Experience Cloudを使うと、そんな場合も簡単に対応できます。それでは例をあげて紹介します。

Amyはレポートを作成しており、筆者に情報を追加してもらいたい、と考えているものとよくあるのは、Amyが関連する会話でいくつかコメントや注釈をファイルに追加し、関係するコメントに対し筆者にフラグを立てたのち、筆者にメールで通知が届いたり筆者のマシン上でポップアップが現れ、ファイルをチェックして編集する、という流れです。

他のみんなと同じように、電子メールを読んだり、通知を見てから最初にやることは、そのリンクをクリックすることです。 それはもちろん、ブラウザを起動してクラウド上のファイルへアクセスすることを意味します。そこから、私はAmyのフラグをクリアし、彼女のコメントを読んで、それぞれに返信し、自分の注釈を追加することができます。

この時点で、ファイルを編集する必要があります。 そのファイルをローカルで同期させた場合は、WindowsエクスプローラまたはMac Finderでそのファイルに移動できます。 しかし、「編集」ボタンをクリックすると、Oracle Content and Experience Cloudは私のためにすばらしいことをしてくれます。

初めて「編集」機能を使用すると、Desktop Sync Clientをインストールする必要があると警告されますが、すでにインストールされている場合は、もしその時点で実行されていなくてもクライアントが自動的に起動します。

編集したいファイルがローカルマシンにダウンロードされ、ダウンロードの進行状況が表示されます。 背後では、一時的なフォルダがマシン上にローカルに作成され、そのファイルがそのフォルダにダウンロードされます。



Desktop Sync Clientは、編集対象のファイルのデフォルトアプリケーションを自動的に起動します。例えば、.docx ファイルであればMicrosoft Wordで、.pptxファイルであれば、Microsoft PowerPointで開きます。

編集が完了したら、保存したり閉じたりすることができますが、このときに自動的にクラウドに同期されます。バージョニングも自動的に行われるので、編集の結果、当該ファイルに対する新しいバージョンとして登録されます。

ブラウザに戻ると、先ほど編集した新バージョンがUpされていますので、その後、関連する会話にコメントを投稿し、Amyにフラグを立てて、自分が変更したことを知らせることも簡単です。その結果、Amyは変更された旨の通知を受け取ることができます。

Oracle Content and Experience Cloudをまだ使ってらっしゃいませんか?もしそうなら、以下のURLから無料トライアルをリクエストして、いつでも、どこでも、どんなデバイスでもコンテンツやソーシャル・コラボレーションをどのように推進できるかをご自身で体感して確認されることを強くお奨めします。
Content and Experience
https://cloud.oracle.com/ja_JP/content
「Oracle Content and Experience Cloudとは何?」とお尋ねになるかもしれません。今後数週間で、さらに詳しい話を耳にされると思いますので、ご期待ください。でも、Oracle Documents Cloud Serviceのことを知っているなら、すでにご存知かと...。

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

原文はこちら。
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

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

原文はこちら。
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

[Java] JAX-RS 2.1 Server Sent Events

原文はこちら。
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を参照してください。

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

原文はこちら。
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

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

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

[Integration] Integration Adapters - New Certification Matrix

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の更新の都度、アップデートされていきます。

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

原文はこちら。
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

[Java] Java EE 8 - February recap

原文はこちら。
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を是非ご覧ください。