2016年8月31日

[Identity Management, Security, Cloud] Introducing Oracle Identity Cloud Service: Secure, On-demand Identity

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

Oracle Identity Cloud Service(IDCS)をご案内できることを非常にうれしく思っています。包括的でセキュアかつオープンな、ハイブリッド型のアイデンティティ・サービスをOracle Cloudから提供することで、Identity and Access Managementにおけるリーダーシップがさらに拡張されることでしょう。従来のエンタープライズ・セキュリティおよびコンプライアンス・アーキテクチャは、クラウドへの移行を支援する、新興のユーザー・セントリック・アーキテクチャによって破壊されつつあります。IDCSは、ユーザーやアプリケーションがどこにあろうとも保護し、最新のエンタープライズ・セキュリティ基盤の重要な部分となるよう設計されたクラウド・ネイティブ・サービスです。

第1世代のIdentity-as-a-Service製品とは異なり、IDCSは、戦略的なハイブリッドソリューションの一環で、企業組織に対し、オンプレミス、クラウドアプリケーションを問わず、アクセスとガバナンスのための集中管理されたワークフローを提供します。IDCSは、Oracle Cloud上にホストされているため、地球規模かつスケーラブルです。論理的、物理的、およびデータセキュリティレベルで協力なセキュリティを継承します。そして、完全にオープンかつStandard-first、API-frstの思想に則って構築されており、相互接続性や互換性を確保しています。IDCSは、お客様が安全にOracleや3rdパーティのクラウドソリューションを採用するためのセキュリティサービスを提供するためのOracleの大規模投資のうちの一つです。クラウドの業務上重要なワークロードをこの先24ヶ月内に倍にするという、最新のForbes調査にもあるように、エンタープライズは引き続き迅速にアプリケーション・ワークロードをクラウドに移していきます。
Is All-Cloud Computing Inevitable? Analysts Suggest It Is
http://www.forbes.com/sites/joemckendrick/2016/07/05/is-all-cloud-computing-inevitable-analysts-suggest-it-is/#5368930e5b4f
IT部門はこのワークロード移動の加速の足を引っ張らないように追随していますが、2016年のCloud Security Spotlight Reportでは、アイデンティティ・アクセス管理の重要性を協調しています。資格証明や貧弱なアクセス管理ポリシーの誤用による機密データへの不正アクセスが、クラウドのアプリケーション・セキュリティに対する唯一最大の脅威です。
New Report Reveals Cloud Security Concerns Rise as Investment in Cloud Grows
http://www.businesswire.com/news/home/20160517005583/en/Report-Reveals-Cloud-Security-Concerns-Rise-Investment
市場は、これまでのオンプレミスのワークロードだけでなく、クラウドのワークロードにも対応できる、次世代のハイブリッド型アイデンティティ・アクセス管理ソリューションを求めています。そして、それが必要なのはまさに今なのです。William Gibsonの言葉を引用すれば、「the future is already here(未来はすでにここにある)」のです。私たちは、重要なこの時点でIDCSをお披露目できることに、非常に興奮しています。
IDCSは現在、ベータプログラムを終えようとしており、短期的にはGAのための準備中です。ぜひ以下のURLにある、2分間のビデオをご覧いただき、Oracle Identity Cloud Serviceのその他のリソースにアクセスしてください。
Identity Cloud Service (IDCS)
https://www.oracle.com/middleware/identity-management/identity-cloud-service.html
1個のエントリでIDCSのすばらしいメリットや機能を全て盛り込むことは不可能なので、明日以後数週間にわたるエントリで、詳細情報をご紹介する予定にしています。是非チェックしてください。

by Peter Barker(SVP of Identity Management and Security)

著者について

PeterはOracleのIdentity Management and SecurityのSenior Vice Presidentで、製品開発、製品管理のリーダーシップを含む、戦略、ビジョン、OracleのIdentity Managementビジネスの遂行全体に対して責任を持っています。

2016年8月29日

[Cloud] Orchestration vs CloudFormation

原文はこちら。
https://blogs.oracle.com/pshuff/entry/orchestration_vs_cloudformation

今日はOracle OrchestrationとAmazon CloudFormationを比較対照してみたいと思います。両者は同じ目的を持っており、インスタンスのプロビジョニング時に同じ操作をしますが、主要な違いは、操作方法とインスタンス作成時に必要な要素の定義方法です。数日前にWordPressインスタンスのプロビジョニングに必要な3個のファイルを見てきました。Oracle Orchestrationの情報は以下のドキュメントやチュートリアルにあります。
Oracle® Cloud Using Oracle Compute Cloud Service (IaaS)
Starting an Orchestration
https://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-3E6D0DE6-1A94-4C56-8153-1803D8DC0640.htm#STCSG-GUID-3E6D0DE6-1A94-4C56-8153-1803D8DC0640
Creating Oracle Compute Cloud Service Oracle Linux Instances Using an Orchestration
http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/compute-iaas/creating_instances_using_an_orchestration/creating_instances_using_an_orchestration.html
Amazon CloudFormation に関する情報は以下のホームページやチュートリアルにあります。
AWS CloudFormation
https://aws.amazon.com/jp/cloudformation/
AWS CloudFormation - Sample Solutions (US West (Oregon) Region]
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-applications-us-west-2.html
AWS CloudFormation - Sample Solutions[Asia Pacific (Tokyo) Region]
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-applications-ap-northeast-1.html
それでは、WordPressのサンプルでサービスのプロビジョニングに使われるJSONファイルを見ていきましょう。
WordPressのサンプル(US Oregon)
https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template
WordPressのサンプル(APAC Tokyo)
https://s3-ap-northeast-1.amazonaws.com/cloudformation-templates-ap-northeast-1/WordPress_Single_Instance.template
JSONファイルにとって重要なコンポーネントは以下のものです。
{"AWSTemplateFormatVersion": "2010-09-09",
    "Description": " ... ",
    "Parameters": { ... },
    "Mappings": { ... },
    "Resources": { ... },
    "Outputs": { ... }
}
以下のファイルを使って、S3でシンプルなストレージを作成することができます。
{
    "Resources": {
        "HelloBucket": {
            "Type": "AWS::S3::Bucket"
        }
    }
}
注意いただきたいのは、本当に必要なのは、リソースの定義だけである、ということです。リソースは”HelloBucket”というラベルを持ち、リソースは"AWS::S3::Bucket"と定義された要素から構成されています。なお、TypeはAWS固有のもので、この汎用的な定義の取得および別のプラットフォームへの移植はできません。S3は通常無限とも言えるストレージサイズを持っているため、どれぐらいのサイズをストレージに割り当てるべきかはわかりません。これは、数日前に見てきたストレージ作成とは根本的に異なります。その時は、storage_pool、ディスクサイズ、起動可能かどうか、どのイメージから起動するか、どのアカウントに関連付けられているか、といったインスタンスのプロパティを定義しなければなりませんでした。CloudFormationインタフェースは、ユーザインターフェイスに埋め込まれたアカウント情報を持つ、Webベースまたはコマンドラインベースのインタフェースから実行されるため、アカウント情報を前提としています。
少々複雑なインスタンスを定義することもできます。このインスタンスでは、コンテンツやOSを事前定義したAMIを参照します。また、セキュリティ・ポートを定義し、このインスタンスの接続キーを定義内で定めています。
{
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "SecurityGroups": [
                    {
                        "Ref": "InstanceSecurityGroup"
                    },
                    "MyExistingSecurityGroup"
                ],
                "KeyName": "mykey",
                "ImageId": "ami-7a11e213"
            }
        },
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "22",
                        "ToPort": "22",
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        }
    }
}
この例では、ami-7a11e213を使ってEC2インスタンスをプロビジョニングしようとしています。MyExistingSecurityGroupっとラベル済みのセキュリティ資格証明を使い、SSHアクセスのために22/tcpを開けます。AMIの特性を調べなければOSのバージョンが何なのかはわかりません。これはstorage要素とどのOSから起動するかを定義するOracle Orchestrationとは異なります。Amazon CloudFormationもOracle Orchestrationも、どちらもセキュリティグループを定義しますが、少々定義が異なります。とはいえ同じ効果を有します。
また、アプリケーションに特徴のいくつかを定義することができます。 CloudFormationの場合、次のパラメータを使用してWordPressを構成することができます。
"Parameters": {
    "KeyName": {
        "Description": "Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server",
        "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "WordPressUser": {
        "Default": "admin",
        "NoEcho": "true",
        "Description": "The WordPress database admin account user name",
        "Type": "String",
        "MinLength": "1",
        "MaxLength": "16",
        "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*"
    },
    "WebServerPort": {
        "Default": "8888",
        "Description": "TCP/IP port for the WordPress web server",
        "Type": "Number",
        "MinValue": "1",
        "MaxValue": "65535"
    }
},
アプリケーションに基づいて、これらのパラメータを定義し、起動時にオペレーティングシステムにパラメータが渡されることに注意してください。Oracle Orchestrationの場合、構成にパラメータを追加する際には異なる方法をとります。各アプリケーション用に定義したパラメータを持つのではなく、このようなカスタマイズは、起動時に実行されるPost Install Scriptを使って実施します。これらの設定は、スナップショットもしくは、システムの初期化方式に基づいた、Post Install Scriptを使って行うことができます。この機能は、Enterprise Managerを使って開始します。オンプレミスシステムで使用しているスクリプトをクラウドに変更やアップデートをせずに移植することができます。
まとめると、Amazon CloudFormation とOracle Orchestration は非常に似ています。システムを定義するために利用するコンポーネントは類似のことをします。AmazonはAWSで実行していることを前提としているため、事前定義済みのコンポーネントを手早く簡単に作成することができます。 残念ながら、この構成は別のクラウドプロバイダーやオンプレミスのソリューションに変換しません。Oracle Orchestrationの場合はより基本的なものですが、全てをスクラッチから作成し、システム定義のための基盤上に構築できるよう設計されています。CloudFormationにはGUIがあり、コンポーネントをデザイン・パレットにドラッグ&ドロップすると、JSONファイルを生成することができます。Oracleはちょっと異なるアプローチを取っており、Oracle Marketplaceを使って自動的にJSONファイルを生成します。コンポーネントをドラッグ&ドロップできるGUIの設計ツールはありませんが、貴社のデータセンターの構成を使い、Orchestration用のJSONファイルを生成するために使われるパラメータリストを生成するツールがあります。このエントリでどちらが優れているかとは言いませんが、主として、このツールとユーティリティでは対象となるオーディエンスや機能が違うことを指摘しています。残念ながら一方の構成を取ると、他方の構成に簡単にマッピングすることはできません。うまくいけば、いつか誰かがこれらのファイルを取得して変換ツールを作ることでしょう。

[Cloud] Orchestration 2.0 - creating an instance

原文はこちら。
https://blogs.oracle.com/pshuff/entry/orchestration_2_0_creating_an

今日はインスタンスの定義方法を見て、Oracle Orchestrationの評価を引き続き実施します。昨日はWordPressインスタンスをOracle Marketplaceのイメージから作成し、storage要素の構造の内部を見るところからはじめました。今日は、Computeインスタンスを記述する bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance.json ファイルを見ることで、引き続きBitnami WordPress instance のプロビジョニングを進めることにします。Bitnamiからのデフォルトインストールでは、このファイルを作成します。今回の例では、デフォルトではなくWordPress_4_5_3と呼ばれるインスタンスを作成し、ストレージのサイズも、Marketplaceが最小要件として推奨しているものにあわせ、デフォルトの10GBから60GBに変更しています。

bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance.json

orchestrationファイルを見ると、以下のような定義を確認できることでしょう。
{"relationships": [],
    "account": "/Compute-metcsgse00028/default",
    "description": "",
    "schedule": {
        "start_time": "2016-07-21T19:46:32Z",
        "stop_time": null
    },
    "oplans": [
        {
            "obj_type": "launchplan",
            "ha_policy": "active",
            "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance",
            "objects": [
                {
                    "instances": [
                        {
                            "networking": {
                                "eth0": {
                                    "seclists": [
                                        "/Compute-metcsgse00028/default/default"
                                    ],
                                    "nat": "ippool:/oracle/public/ippool"
                                }
                            },
                            "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012/b531af9b-e075-4a51-a867-449fd948d374",
                            "storage_attachments": [
                                {
                                    "volume": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
                                    "index": 1
                                }
                            ],
                            "boot_order": [
                                1
                            ],
                            "hostname": "a2d1e4.compute-metcsgse00028.oraclecloud.internal.",
                            "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012",
                            "shape": "oc3",
                            "attributes": {
                                "userdata": {},
                                "nimbula_orchestration": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance"
                            },
                            "imagelist": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                            "sshkeys": [
                                "/Compute-metcsgse00028/cloud.admin/2016"
                            ],
                            "tags": []
                        }
                    ]
                }
            ]
        }
    ],
    "user": "/Compute-metcsgse00028/cloud.admin",
    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance"
}
このファイルは以下のように省略できます。
{
    "relationships": [],
    "account": "/Compute-metcsgse00028/default",
    "description": "",
    "schedule": {…},
    "oplans": […],
    "user": "/Compute-metcsgse00028/cloud.admin",
    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage"
}
これはまさしくstorageの定義のものと類似していることに注目してください。違いは、oplansパラメータ・フィールドに現れています。instanceの定義の場合、obj_typeをlaunchplanとして定義します。このlaunchplanパラメータの詳細はドキュメントに記載されています。
Oracle® Cloud Using Oracle Compute Cloud Service (IaaS)
Object Type: Launch Plan
https://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-6F0236B7-97B0-48D1-B234-437AC0C61344.htm#GUID-6F0236B7-97B0-48D1-B234-437AC0C61344__LAUNCHPLANATTRIBUTES-5901680F
launchplanオブジェクト・タイプに必要なフィールドは、instanceパラメータです。その他のフィールドは全て任意項目です。instancesフィールドはドキュメントのインスタンスについて記載された箇所に詳細があります。
Oracle® Cloud Using Oracle Compute Cloud Service (IaaS)
Instance Attributes
https://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-6F0236B7-97B0-48D1-B234-437AC0C61344.htm#GUID-6F0236B7-97B0-48D1-B234-437AC0C61344__INSTANCEATTRIBUTES-9574D7F3
shapeパラメータが唯一必須のパラメータで、他のパラメータは任意です。今回のインスタンスのoplansフィールドは以下のようになっています。
"obj_type": "launchplan",
"ha_policy": "active",
"label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance",
"objects": [
    {
        "instances": [
            {
                "networking": {
                    "eth0": {
                        "seclists": [
                            "/Compute-metcsgse00028/default/default"
                        ],
                        "nat": "ippool:/oracle/public/ippool"
                    }
                },
                "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012/b531af9b-e075-4a51-a867-449fd948d374",
                "storage_attachments": [
                    {
                        "volume": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
                        "index": 1
                    }
                ],
                "boot_order": [
                    1
                ],
                "hostname": "a2d1e4.compute-metcsgse00028.oraclecloud.internal.",
                "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012",
                "shape": "oc3",
                "attributes": {
                    "userdata": {},
                    "nimbula_orchestration": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance"
                },
                "imagelist": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                "sshkeys": [
                    "/Compute-metcsgse00028/cloud.admin/2016"
                ],
                "tags": []
            }
        ]
    }
]
この定義では、オブジェクト・タイプはlaunchplanです。ha_policyは有効、つまりインスタンスが障害時には再起動します。ラベルはComputeインスタンスの名前です。Bitnamiがインストールするデフォルトのラベルは、"bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance" ですが、この例では、WordPress_4_5_3_instance としておきます。オブジェクト・パラメータは定義の中身を保持しています。必須のフィールドshapeがあり、これはoc3サイズのインスタンスとして今回のインスタンスを定義しています。名前(name)だけでなく、デフォルトのセキュリティ・リスト・アソシエーションを使ってネットワーク接続(network)も設定しています。デフォルトのセキュリティ・リストでは、SSHでLinuxインスタンスへ接続しアプリケーションを構成することを許可する22番ポートが開けられています。前回のエントリの通り、1個のストレージボリュームがアタッチされています。名前でボリュームをアタッチし、論理単位1で関連付けていることに注目してください。ブートローダにヒントを与えてブートファイルからこのイメージを起動するだけでなく、SSHキーをインスタンスに関連付けて、システムが立ち上がり、稼働したらログインできるように、オプションの属性も定義しています。このファイルの唯一の追加情報はこのシステムに到達するために使われるhostname(ホスト名)です。この例では、ホスト名としてa2d1e4.compute-metcsgse00028.oraclecloud.internalを使っています。これはOracle Cloud Serviceが提供するDNSサービスを通じて利用可能な内部ホスト名です。

bitnami-wordpress-4.5.3-0-linux-20160721144012_master.json

3個目のファイルはインスタンスにとってのマスタJSONファイルです。Bitnamiが作成する今回のインスタンス用のデフォルトのファイル名はbitnami-wordpress-4.5.3-0-linux-20160721144012_master.json です。このファイルにおける主要な違いは、oplan obj_typeがorchestrationであり、relationshipsエントリがnullではない、という点です。orchestrationというobj_typeは、Oracle Cloud Serviceに対し、このファイルはインスタンスおよびロード、起動方法を説明するために使われるファイルであることを伝えています。relationshipsパラメータは、起動時に参照が必要な2個のプランがあることを示しています。インスタンスを記述する "bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance" ファイルが必要で、このファイルは"bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage"に対して依存関係があります。ストレージファイルは、立ち上げおよびインスタンスの稼働に必要なディスクを定義します。複数のディスクがある場合には、複数の依存関係を並べます。このファイルの完全版は以下のようになっています。
{
    "relationships": [
        {
            "to_oplan": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
            "oplan": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance",
            "type": "depends"
        }
    ],
    "account": "/Compute-metcsgse00028/default",
    "description": "",
    "schedule": {
        "start_time": "2016-07-21T19:40:33Z",
        "stop_time": null
    },
    "oplans": [
        {
            "obj_type": "orchestration",
            "ha_policy": "",
            "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
            "objects": [
                {
                    "info": {
                        "errors": {}
                    },
                    "status": "ready",
                    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
                    "status_timestamp": "2016-07-21T19:45:16Z",
                    "uri": null
                }
            ]
        },
        {
            "obj_type": "orchestration",
            "ha_policy": "",
            "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance",
            "objects": [
                {
                    "info": {
                        "errors": {}
                    },
                    "status": "ready",
                    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_instance",
                    "status_timestamp": "2016-07-21T19:47:16Z",
                    "uri": null
                }
            ]
        }
    ],
    "user": "/Compute-metcsgse00028/cloud.admin",
    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_master"
}
これらの2個のファイルはインスタンスとストレージとインスタンス間の関係を定義しています。Computeコンソールの中でOrchestraionを見ると、オーケストレーションの表示、開始、削除、サイズ変更、ダウンロードができることがわかります。インスタンス実行中であれば、インスタンスを停止することができます。


オーケストレーションを表示すると、[download the json code](JSONコードのダウンロード)があり、デスクトップにJSONコードをダウンロードすることができます。インスタンスの削除機能は、Instanceタブからこのタブに移動しました。インスタンスを削除するには、Orchestrationタブでインスタンスを停止してから、インスタンスを構成するコンポーネントを削除する必要があります。Resize Instance(インスタンスのサイズ変更)だけはComputeインスタンスでのみ現れます。これを使えば、様々なシェイプにインスタンスを大きくしたり小さくすることができます。ストレージのサイズアップ、サイズダウンはできません。ストレージのサイズを大きくするには、orchestrationファイルを編集してサイズを変更する必要があります(現時点ではサイズダウンはサポートしていません)。重要なこととして、現時点ではこのUIでJSONファイルの編集はサポートされておりません。JSONファイルを編集する必要がある場合には、ダウンロードして自身のデスクトップで編集し、その後別の名前でアップロードする必要があります。アップロードはOrchestrationタブのUpload Orchestrationボタンを使って実施します。

昨日はストレージのオーケストレーションを構成するstorage JSONファイルを見てきました。今日はインスタンスを定義するinstanceおよびmasterオーケストレーションファイルを見てきました。これら3個のファイルは全てインスタンスおよびインスタンスの起動方法を定義する助けとなるものです。説明に使ったサンプルは、Linuxインスタンス上でPHPの使えるApache HTTP ServerとMySQLを作成するシンプルな例ですが、WordPressをこの構成上に載せ、インスタンスへのログイン、管理が可能になるようセキュリティポートを定義し、HTTP、HTTPSポートを通じて見ることができるようにしています。オーケストレーションを定義してしまえば、REST APIを使ってインスタンスの自動化(立ち上げ、停止など)を実施できます。インスタンスに障害が発生した場合には、スローされるエラーや例外をキャッチするためにEnterprise Managerのようなツールを使用して、再起動の機能を開始することができます。また、使用率が一定期間にわたって閾値を超えていれば、Enterprise Managerを使用してサービスの再構成や変更が可能です。Amazonの場合、これを実現するためにCloudFormationを使用していますが、これは、Amazon AWSサービスでのみ使えます。OracleはEnterprise Managerを使いますが、その理由は、これらのスクリプトや監視ツールはオンプレミスのサーバ、貴社データセンターで稼働する仮想インスタンス、Oracle Cloudもしくは他社のクラウドサービスで動作するComputeインスタンスのために使うことができるからです。

[Database, Hardware] Oracle Database Appliance X6-2S / X6-2M Support Oracle Database Standard Edition and Oracle Database Standard Edition One

原文はこちら。
https://blogs.oracle.com/ODA/entry/oracle_database_appliance_x6_2s

次のOracle Database Appliance software update (12.1.2.8) では、Oracle Database Appliance X6-2S /X6-2M上でのOracle Database 11g Standard Edition、Standard Edition One (release 11.2.0.4) のサポートを追加する予定です。これにより、Oracle Database Standard Edition (release 11.2.0.4)をODA X6-2S/X6-2Mにデプロイし、動作させることが可能になり、Oracle Database Standard Edition、Oracle Database Standard Edition One、Oracle Database Standard Edition 2のライセンスを活用することができるようになります。具体的な詳細は下表をご覧ください。

Databaseのバージョン プラットフォーム 必要なライセンス
Standard Edition/Standard Edition One (11.2.0.4) ODA X6-2S 1 x DB SE
または
1 x DB SE1
または
1 x DB SE2
Standard Edition/Standard Edition One (11.2.0.4) ODA X6-2M 2 x DB SE
または
2 x DB SE1
または
2 x DB SE2
Enterprise Edition (11.2.0.4 もしくは 12.1.0.2) ODA X6-2S
または
ODA X6-2M
または
ODA X5-2-HA
 (有効なコア数/2) x DB EE (オプションがあればオプションも)
Standard Edition 2 (12.1.0.2) ODA X6-2S 1 x DB SE2
Standard Edition 2 (12.1.0.2) ODA X6-2M 2 x DB SE2

よくある質問

Q: SE、もしくはSE1のライセンスを持っている場合、Oracle Database 12c Standard Editionを稼働させることができますか?
ライセンスをSE2に移行する必要があります。移行後、Oracle Database 12c Standard Edition 2を稼働させることができます。

Q: Oracle Database 11g Standard EditionをODA X6-2 S/X6-2M上で、SE Oneライセンスを使って稼働させることができますか?
はい。SEは最大搭載可能CPUソケット数4のサーバで稼働させることができます。SE1は最大搭載可能CPUソケット数2のサーバで稼働させることができます。そのため、ODA X6-2S/X6-2M はSE、SE1ライセンスのいずれの条件も満たします。

Q: Oracle Database 11g Standard Editionの新規ライセンスを購入することができますか?
はい、ただし、Oracle Database Standard Edition 2のライセンスを購入しなければなりません。これはOracle Database 11g Standard Editionだけでなく、Oracle Database 12c Standard Edition 2を稼働させることが可能なライセンスです。

Q: ODA X5-2でOracle Database Standard Editionを稼働させることはできますか?
いいえ、Standard Editionを稼働させることができるのはODA X6-2S/X6-2Mのみです。

Q: 11g Standard EditionはODAでの稼働をいつサポートする予定ですか? 
12.1.2.8 updateとともにサポートを開始する予定です。現時点では8月29日(PDT)のリリースを予定しています。

Q: Standard Edition (SE/SE1/SE2)のCapacity on Demand(システム規模に応じた支払い)ライセンスを利用することはできますか?
いいえ、X86サーバでソケット全体を無効化することはできません。

Q: ODAでOracle Standard Edition Real Application Clusters (SE RAC) を構成・実行できますか?
いいえ、SE RACはODA-X5-2のようなHA構成を必要とします。このプラットフォームはStandard Editionの実行対象ではありません。

2016年8月26日

[Cloud] Orchestration 2.0 - creating a storage element

原文はこちら。
https://blogs.oracle.com/pshuff/entry/orchestration_2_0_creating_a

このエントリでは、Oracle OrchestrationでBitnami WordPressインスタンスを使う例を見ていきます。まずはCloud Marketplaceでインスタンスをプロビジョニングします。
Oracle Cloud Marketplace
https://cloud.oracle.com/marketplace/ja_JP/
インストールするインスタンスは以下の場所で見つけることができます。このインスタンスはOracle Linux 6.7ベースです。
WordPress on OL 6.7
https://cloud.oracle.com/marketplace/ja_JP/listing/4980490?_afrLoop=11935810073563805&_afrWindowMode=0&_afrWindowId=1bzhjaylmt_21
このインスタンスの最小プロファイルは、OC3(1 OCPU、7.5 GB RAM)でローカルディスク60GBです。
[アプリケーションの入手]ボタンをクリックすると、Cloud Computeサービスへのインストールプロセスが始まります。[アプリケーションの入手]ボタンをクリックするとプロセスが始まり、Marketplaceから起動可能イメージをダウンロードし、任意のタイミングで新規インスタンスを作成できるイメージとして利用可能になります。デフォルトのサイズは10GBですが、MySQLとWordPressアプリケーションが適切に動作するよう、このインストール・イメージを60GBまで拡大する必要があります。


インスタンスの作成のために、コンピュート・コンソールへ移動し、インスタンスを作成します。プライベート・イメージを選択して、起動するためにダウンロードしたWordPress bitnamiインスタンスが使えるようにします。ネットワーク・セキュリティ・リストやSSHキー、インスタンス名を入力します。

デフォルトのディスクサイズは10GBです。今回はこのままにして、立ち上げ前に構成を
見なおすことにしましょう。

[作成]をクリックすると、クラウドコンソールは3個のオーケストレーションファイルを作成し、WordPressインスタンスを初期化します。最初に作成されたファイルはストレージを定義しています。このファイルは、デフォルトのままであれば、bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage.json と呼ばれるものです。この例では、WordPress_4_5_3_storage.jsonと呼ばれています。このファイルには、OSの立ち上げのために必要なストレージが以下のような形式で記述されています。
{
    "relationships": [],
    "account": "/Compute-metcsgse00028/default",
    "description": "",
    "schedule": {
        "start_time": "2016-07-21T19:40:35Z",
        "stop_time": "2016-07-21T21:50:02Z"
    },
    "oplans": [
        {
            "obj_type": "storage/volume",
            "ha_policy": "",
            "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
            "objects": [
                {
                    "managed": true,
                    "snapshot_id": null,
                    "snapshot_account": null,
                    "machineimage_name": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                    "status_timestamp": "2016-07-21T19:44:51Z",
                    "imagelist": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                    "writecache": false,
                    "size": "10737418240",
                    "storage_pool": "/compute-us2-z12/cheis01nas100-v1_multipath/storagepool/iscsi/latency_1",
                    "shared": false,
                    "status": "Online",
                    "description": "",
                    "tags": [],
                    "quota": null,
                    "properties": [
                        "/oracle/public/storage/default"
                    ],
                    "account": "/Compute-metcsgse00028/default",
                    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
                    "bootable": true,
                    "hypervisor": null,
                    "uri": null,
                    "imagelist_entry": 1,
                    "snapshot": null
                }
            ]
        }
    ],
    "user": "/Compute-metcsgse00028/cloud.admin",
    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage"
}
それでは、このファイルの詳細、構造を見ていくことにしましょう。子コンポーネントは無視して構造を分析しましょう。
{
    "relationships": [],
    "account": "/Compute-metcsgse00028/default",
    "description": "",
    "schedule": {…},
    "oplans": […],
    "user": "/Compute-metcsgse00028/cloud.admin",
    "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage"
}
このオブジェクトを定義する7つの要素があることに注意してください。

  1. relationship
    このファイルでは、これが構成の基礎であり、別のオブジェクトとの依存関係を持っていません。
  2. account
    accountは、オブジェクトの所有者および、オブジェクトに関連付けられたセキュリティを定義します。このオブジェクトにアクセスできる、もしくはデフォルトのラベルを使って、すべてのユーザーがアクセスできるようにすることが可能な固有のアカウントをアイデンティティ・ドメイン内で持っている可能性があります。
  3. description
    このオブジェクトには説明がありません。いつこの情報を作成したのか、いつディスクをプロビジョニングしたか、といった、より多くの情報を追加する可能性があります。これは有用なフィールドですが、Computeリソースを作成する上では重要なものではありません。 
  4. schedule
    いつオブジェクトが作成されたかを定義し、オブジェクトがいつ開始し、停止するのかを定義します。
  5. oplans
    oplansはオブジェクトを定義します。この時点では定義を隠していますが、この後詳細を見ていきます。
  6. user
    このユーザーは、オブジェクト作成者、オブジェクト所有者です。
  7. name
    オブジェクト名です。アイデンティティ・ドメイン、作成ユーザー、オブジェクト名から構成されています。この例では、nameは以下のようです。
    /Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage
    筆者の作業時点の例では、以下のようになります。
    /Compute-metcsgse00028/cloud.admin/WordPress_4_5_3_storage

oplansの詳細を見ていきましょう。以下のようにオブジェクトが定義されていることがわかります。
{
    "obj_type": "storage/volume",
    "ha_policy": "",
    "label": "bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
    "objects": […]
}
oplansは4個の要素から構成されており、ドキュメントに定義されています。これらのオブジェクトはha_policyを除いて全て必要です。最初の定義済みパラメータはobj_typeです。このパラメータは以下として定義されます。
  • Ip-reservation
  • Launchplan
  • Orchestration
  • Storage/volume
  • Secapplication
  • Seciplist
  • Seclist
  • Secrule
いま、この要素をstorage/volumeと定義します。labelパラメータに関連付けられた名前とobjectsパラメータで定義された特性を指定します。ha_policyはactiveもしくはmonitorとして定義することができます。activeを選択した場合、オブジェクトが削除、障害時に再起動されます。activeはobj_typeがlaunchplanの場合にのみ選択できます。launchplan、storage/volume、orchestrationといったobj_typeの監視のためのha_policyを設定することができます。オブジェクトに障害が発生した場合、エラーがスローされます。このエラーを監視ソフトウェアパッケージにスローすることができますが、オブジェクトは自動的に再起動したり、再作成したりはしません。その他の全てのオブジェクトでは、このha_policyはnoneもしくは空フィールドに設定しなければなりません。今回の例では、bitnamiが生成するデフォルトラベルではなく、labelとして“WordPress_4_5_3_storage”を設定しています。
objectsフィールドはドキュメンテーションで定義されています。この例ではstorage volumeオブジェクトを詳細に見ていきます。storageに必要なフィールドはname、size、propertiesです。オプションのフィールドは、description、bootable、tagsです。今回の例では、オブジェクト・パラメータを以下のように定義しています。
"objects": [
            {
                "managed": true,
                "snapshot_id": null,
                "snapshot_account": null,
                "machineimage_name": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                "status_timestamp": "2016-07-21T19:44:51Z",
                "imagelist": "/Compute-metcsgse00028/marketplace01-user@oracleads.com/bitnami-wordpress-4.5.3-0-linux-oel-6.7-x86_64",
                "writecache": false,
                "size": "10737418240",
                "storage_pool": "/compute-us2-z12/cheis01nas100-v1_multipath/storagepool/iscsi/latency_1",
                "shared": false,
                "status": "Online",
                "description": "",
                "tags": [],
                "quota": null,
                "properties": [
                    "/oracle/public/storage/default"
                ],
                "account": "/Compute-metcsgse00028/default",
                "name": "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage",
                "bootable": true,
                "hypervisor": null,
                "uri": null,
                "imagelist_entry": 1,
                "snapshot": null
            }
        ]
    }
] 
nameは "/Compute-metcsgse00028/cloud.admin/bitnami-wordpress-4.5.3-0-linux-_20160721144012_storage" です。注目していただきたいのは、このオブジェクト名はインスタンス・ドメイン、ストレージを作成したユーザー名、そしてストレージのラベルで構成されている、という点です。sizeはバイト単位で"10737418240"と定義しています。この値はOS用の10GBのディスクです。propertiesは [ "/oracle/public/storage/default" ] と定義されています。これはストレージをデフォルトストレージとして定義することを意味しています。通常データベースで使われる低レイテンシや高IOPSストレージが必要であれば
、defaultではなく別のレイテンシを選択することもできます。この説明における残りのフィールドは任意の項目です。bootable(起動可能)タグはこれが起動可能イメージかどうか、statusはこのストレージがアクティブ・モードなのか、スタンバイモードなのかを定義します。storage_poolはこのストレージ要素が専用にアタッチされたストレージではなく、Computeノードで利用可能なiSCSI論理ユニット番号(LUN)であることを定義していることにご注意ください。これらの全てのフィールドはOSを起動し、WordPressアプリケーションを実行するストレージを作成するために必要なものを定義しています。ストレージとして20GBのディスクにすることも、200GBのディスクにすることも簡単に定義することができます。ブロックストレージは50USD/TB/月の費用が発生することに注意することが重要です。次回は、このストレージを使ってインスタンスと関連付けることにしましょう。

[Cloud] 各国通貨で価格が表示されるようになりました

既にご存知かもしれませんが、各国の通貨でOracle Cloudの価格を確認できるようになっています。
以下ではJava Cloud Serviceの場合を例示しますが、他のサービスでも同じです。
まずは、ページにアクセスします。
Java Cloud Service(日本語)
https://cloud.oracle.com/ja_JP/java
試使用であれば、[試してみる]をクリックするところですが、今回は[価格]のタブをクリックします。


すると、以下のようなページが出てきます。
デフォルトはUSドルですね。


「表示する通貨を選択」のドロップダウンリストで通貨を選択しましょう。
他国の通貨もいろいろ選択できますが、日本円を選択してみます。


以下は日本円を選択した結果です。



[Cloud] Orchestration 2.0

原文はこちら。
https://blogs.oracle.com/pshuff/entry/orchestration_2_0

このエントリでは、Computeインスタンスのインストールおよびプロビジョニングの自動化の方法を紹介します。様々な方法、様々なツールや方法論を利用することができますが、こうしたツールの全ての根幹は、クラウドもしくは貴社データセンターで稼働するシステムの構成方法を定義することです。構成データには、Computeリソース、ネットワークリソース、ユーザー定義、パッケージ、プロセス、サービスが含まれます。こうした定義言語を使って1個のサービスだけでなく、サービスの集合も定義することができます。例えば、WordPressブログを定義したい場合、WordPressブログ・ソフトウェアを含む単一のサーバ、ブログソフトウェアを稼働するためのWebコンテナ、そして状態やユーザー情報をブログサーバ用に保持するための、通常はMySQLデータベースを定義することができます。マルチサイトのブログエントリの場合、通常、アプリケーション・サーバーからデータベースを分割し、データベースファイルのフェールオーバと、大量のユーザーとウェブへのリクエストを処理するため、フロントエンドに複数のWebコンテナを用いて高可用性構成を作成することができます。
文章でこのシステムを記述しようとすれば、比較的複雑で混乱することでしょう。例えば…
  • ディスクのメモリと20ギガバイトの8ギガバイトとシングルプロセッサのコンピュータ(8GBのRAMと20GBのディスク)上でWebコンテナを実行し、MySQLサーバを実行する、別のシングルプロセッサのコンピュータ(16GBのRAMと40GBのディスク)と接続しています。
  • WebコンテナはPHPがインストールされており、HTTPおよびHTTPSでリクエストを受け付ける必要があります。
  • Webコンテナは、WordPressのパッケージを実行し、データベース・インスタンスに接続して、ユーザー情報やWebページの情報を格納する必要があります。
  • どちらのシステムでも、Oracle Linux 6.7を利用しており、Webサービスやセキュアシェルを使ったWebサービスへのリモート・ログインするための機能以外の全てのポートはロックダウンされています。
  • また、Webコンテナやデータベース・インスタンスが割り当てられたプロセッサの80%以上を利用した場合の対策や、いずれかのサービスが停止、障害が発生した場合の対策を定義する必要があります…
様々な構成管理ツールを使って、ここまでで例示した内容を定義することができます。これらのツールのほとんどは、JSONを使って構成や起動方法、スケールの方法を表現します。このエントリでは、次の3種類のツール、Chef、Puppet、Orchestrationを取り上げます。

Puppet

PuppetはPuppet Labsが作成したパブリックドメイン・パッケージで、LinuxやWindows上で利用できます。詳細情報は以下のリンクからどうぞ。
Puppetは宣言的な言語を使ってシステム構成を表現します。これらのファイルをマニフェストと呼び、通常はJSON形式もしくはそれに類した形式で保存されています。Puppetでは、リソースは通常以下の形式で定義されます。
resource_type{
    ‘resource_title’: ensure: presentorabsent,
    attribute: one,
    attribute: two,
    attribute: n
}

Chef

Chefは、Chefと呼ばれる会社が2009年に最初のリリースを出した類似の構成ツールです。Chefより5年前にリリースされたPuppetと同様にシステム構成を表現できます。Chefに関する詳細情報は以下のリンクからどうぞ。
Chefは “recipies” (レシピ)を使って、アプリケーションの構成やシステム構成を表現します。Puppetよりもアプリケーションの構成に少し重点を置いています。典型的なChefの構成は全てを1個のJSONファイルに書くのではなく、複数のファイルから成り立っています。例えば、典型的なフォルダ構造は以下のようになっています。
attributes
    default.rb
  files
    default
    file.txt
  recipies
    default.rb
  templates
  default
    file.erb
    metadata.rb
rbファイルはRubyプログラミング言語の構文をサポートしているため、属性はちょっと異なる形で定義されます。
default[‘Linux’][‘version’]     = ‘6.7’
default[‘Linux’][package_name’] = ‘OEL_6_7’
default[‘Linux’][‘dir’]         = ‘/home/oracle’
rbファイルには条件制御構造も有しており、これを使うとIf-Then-ElseやCase選択でインストール先で構成を変更することができます。例えば、WebコンテナをWindowsもしくはLinux上で構成する場合、これらのレシピを全て1箇所に集め、必要に応じてアップデートすることができますし、OSの構成を1箇所のディレクトリに、アプリケーションの構成は別のファイルやディレクトリに集約することができます。そして構成ファイル間の依存性を作成することもできます。

Oracle Orchestrations

Oracleは第3の構成管理ツールであるOrchestrationsを使っています。これは利用、定義の点で、ChefよりはPuppetに近いものです。両者とも基盤としてJSONを使うため、Oracle OrchestrationsとAmazon CloudFormationのテンプレートが非常に類似しているのは自然なことです。オーケストレーションのドキュメントによると、Orchestrationでは属性とOracle Compute Cloud ServiceのComputeリソース、ネットワークリソース、ストレージリソースのコレクションの相互の依存性を定義します。
Oracle® Cloud Using Oracle Compute Cloud Service (IaaS)
About Orchestrations
https://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-1896C799-49A6-42B8-9813-7DE5695267FE.htm#STCSG-GUID-1896C799-49A6-42B8-9813-7DE5695267FE
オーケストレーションを使って仮想Computeトポロジー全体のプロビジョニングやライフサイクル・オペレーションを自動化することができます。以下はオーケストレーションファイルの例です。
{
    attribute: value,
    attribute: [
        {
            attribute: subvalue,
            attribute: subvalue
        }
    ]
}
Oracle Orchestrationについて説明した書籍はありませんが、テクノロジーの理解の助けとなるリンクがあります。Oracle Orchestrationは2回メジャーアップデートしており、Ver.2では、個々のサーバではなく、クラウドのシステムの自動化のためにデザインされています。
Amazon CloudFormation
Amazon CloudFormationは類似のテンプレートと構成ユーティリティを使います。必須の属性とオプションの属性が大きく異なります。CloudFormationに関する情報は以下のリンクからどうぞ。
Azure Runbooks

Microsoft Azureは根本的に異なるアプローチをとり、Windows PowerShellやPowerShell Workflowを必要とするRunbooksを使って構成や構成のためのパラメータを定義します。これらのツールは、Azure固有のものであり、オンプレミスシステムの場合とは動作が異なります。Azure固有の方法であるため、今回は取り上げませんでした。

まとめると、様々な方法でクラウドのサービス定義を作成でき、オンプレミスとクラウドのための構成を実現するツールは一つとしてありません。ツールを構成してこれを実現することはできますが、通常は全てのクラウドベンダーで使えるわけではありません。各クラウドベンダーには固有の実装があり、何が動作し、何が動作しないのかを比較するためには、Googleで「cloud orchestration tools comparison」と検索すれば、この課題を解決するパブリックドメインのツールや商用ツールのレビューを得ることができるでしょう。これらのツールは全て比較的最近のもので、まだ成熟していません。一つとして市場を独占し、他製品よりも多く採用されるツールはありません。後のエントリで、Oracle Orchestration定義の詳細に踏み込み、単一サーバでのWordPressのようなシステムと、複数サーバでの高可用性クラスタのようなシステムの構築を比較します。これらと同じ原則は、IaaSベースだけでなく、PaaSベースであってもE-Business Suite、PeopleSoft、JD Edwardsの構築に当てはめることができます。

2016年8月25日

[Cloud, Virtualization] Ravello cloud virtualization

原文はこちら。
https://blogs.oracle.com/pshuff/entry/ravello_cloud_virtualization

昨日、データセンターのベアメタルソリューションや仮想化ソリューションからクラウドベンダーへ移動するために欠かせないものに関する話をしました。
(訳注)「昨日」とは、以下のエントリをさしています。
uploading custom boot image for compute cloud
https://blogs.oracle.com/pshuff/entry/uploading_custom_boot_image_for
その中でわかったことは、難しいだけでなく作業が発生する、ということです。VMDKコードをAMI(Amazonの場合)、VHD(Microsoftの場合)、tar.gz(Oracleの場合)へ変換するツールがあるように、これが根本的な問題なのです。変換ツールがあるということは、単純にベアメタル・インストールやVMDKコードのバックアップを取って、アップロードして実行することができません。Javaは早い時期にこの問題に遭遇しました。CやC++のコード、バイナリをそのままMacやLinux、Windowsで動作させることはできませんでした。コードを再コンパイルする必要があり、うまくいけばlibcやlibc++ライブラリがOS間で互換性がありました。単純な再コンパイルで問題が解決する場合もありますが、多くの場合、条件コンパイルや異なるOSで動作させるために別のライブラリが必要でした。基本的な問題は、ネットワーク接続やディスクの読み書きのようなものが根本的に異なることでした。Windowsではバックスラッシュを使い、LinuxやMac OSではスラッシュを使います(訳注:Forward SlashとBack Slashの説明が違っていたので修正して訳しています)。ファイル名や長さも異なり、異なる文字を使うことができたりできなかったりします。残念なことにクラウドの世界でも同じことがあてはまります。仮想ネットワーク・インターフェースは全てのベンダーで同じではありません。ネットワーク・ストレージはiSCSIマウントやNFSマウント、もしくはREST APIだけでアクセスできる可能性があります。クラウド・ベンダー間でVirtual Computeの定義が異なるため、Javaが数十年前に行ったように、プログラミングのシムに似た仮想化のためのシムが必要になっています。Ravelloはこの主要な4クラウドベンダー間のギャップに入り、その差を埋めました。
Ravello Systemsは数年前にこの問題に取り組みはじめました。
Ravello Systems
http://ravellosystems.com/
VMwareからのVMDKディスクイメージを使って、クラウドベンダーをVMwareシステムのように仮想化するための3個のコンポーネントを作成しました。この3個のコンポーネントは、Nested Virtualization、Software Defined Networking、Virtual Storage Interfacesです。
HVX: High performance nested virtualization
https://www.ravellosystems.com/technology/nested-virtualization
HVX: Software defined networking (overlay network)
https://www.ravellosystems.com/technology/software-defined-network
HVX: Storage overlay (virtual storage interfaces)
https://www.ravellosystems.com/technology/storage-overlay
そのアイデアとは、ソリューションを構成する単一のシステムだけではなく、VMwareインスタンスのグループを作り、クラウドベンダーにそのままインポートする、というものでした。ユーザは、GUIを使ってインスタンス間のネットワークの関係をマッピングし、これらの仮想イメージをクラウドベンダーにデプロイしました。ソリューションの基本は、Ravello HVXハイパーバイザー・エミュレータを各インスタンスについてクラウドベンダーのコンピュート・インスタンスにデプロイしてからHVXインスタンス上にVMWare VMDKをデプロイしよう、というものでした。
HVX: Virtual infrastructure for the cloud
https://www.ravellosystems.com/technology/hvx
この結果、ストレージやネットワーク・インターフェースをGUIで作成した接続に従ってマッピングし、VMDKコードを変更しないまま実行できました。
仮想インスタンスをそのまま実行するというのはラジカルなコンセプトでした。非常にラジカルなので、OracleがRavello Systemsをこの春に買収し、組織の営業力を拡大しました。Ravelloが直面する3つの重要な課題は、顧客のデータセンター内で実行するワークロードの50%がクラウドへの移植がうまくいかないこと、これらのアプリケーションの多くはLayer 2 IPプロトコルを活用しており、通常ほとんどのクラウド環境では利用できないこと、そして異なるハードウェアベンダー上でのVMWareの実装は異なる仮想コードや構成を生成するため、任意のクラウドベンダーにマッピングすることが非常に困難である、ということです。一つ目の課題に対するソリューションは、VMware ESXおよびESXi環境を仮想化し、複数のクラウドベンダーのソリューション上に載せました。管理者がプロセッサを割り当てた場合、それはAWSにおけるスレッドもしくはAzureやOracleの場合のコアと同様なのでしょうか?ネットワークを割り当ててNAT構成を実施している場合、クラウドインフラストラクチャで可能なのでしょうか、それともHVXでエミュレートする必要があるのでしょうか。
ネストした仮想化エンジンは、VMwareに保存されたコードを変更せず、ネイティブに実行するように設計されています。クラウド・ベンダーのデバイスは、VMWareのデバイスや仮想デバイスとしてコードに公開されています。コンセプトは、異なるクラウドソリューション間の差異を最小化し、プロセッサとハイパーバイザーを、できるだけESXやESXiのように見せるようにすることでした。HVXでは、Binary Translationと呼ばれるテクノロジーを採用して、こうした仮想化拡張機能を必要としないハイパフォーマンスな仮想化を実装しています。仮想化拡張機能が利用可能な場合、イリュージョンを実装する最も簡単な方法は、"Trap and Emulate"を使うことです。TrapとEmulateは次のように動作します。ハイパーバイザーはプロセッサを構成してイリュージョンを壊す可能性がある命令(例えばハイパーバイザー自体のメモリにアクセスする)が「トラップ」を生成し、そのトラップがゲストOSに割り込み、ハイパーバイザーに制御を伝えます。その後、ハイパーバイザーは違反命令を調べ、安全な方法で命令をエミュレートした後に、ゲストは実行を継続することができます。HVXというRavelloのハイパーバイザーはバイナリ変換と呼ばれるテクノロジーを使っています。これはTrap-and-Emulateの方法とは異なり、バイナリ変換は仮想化拡張機能が利用できない場合でも動作します。
ピュアなL2アクセスは難しく、VLAN、ポートミラーリング、ブロードキャスト/マルチキャストは通常動作しませんが、Ravelloを使うと、単一の仮想マシンだけでなく、既存の複数の仮想マシンから構成されるアプリケーションも変更せずにクラウドで実行することができます。これを実現するために、Ravelloはアプリケーションの仮想マシン間の接続を仮想化するsoftware-defined networkを提供します。仮想ネットワークは完全にユーザーが定義でき、複数のサブネット、ルータ、そしてDHCP、DNSサーバ、ファイアウォールのような補助サービスを含むことができます。仮想ネットワークをデータセンターのネットワークと全く同じようにすることができます。仮想ネットワークのデータ・プレーンはHVX内に存在する完全な分散仮想スイッチと仮想ルータソフトウェアコンポーネントで形成されます。仮想マシンから送信されるネットワーク・パケットはインターセプトされ、スイッチに注入されます。スイッチは通常のネットワーク・スイッチとほぼ同じように動作します。各仮想ネットワークデバイス毎に、仮想スイッチが仮想ポートを作成します。この仮想ポートは接続されている仮想NICデバイスから出入りするパケットを処理します。
Ravelloのストレージ・オーバーレイ・ソリューションは、性能、永続性、セキュリティに重点を置いており、オブジェクトストレージや様々な種類のブロックデバイスといったネイティブクラウドストレージプリミティブを、ゲストVMが直接利用可能なローカルブロックデバイスに抽象化します。デバイスの種類やコントローラの種類から、PCIバス上の配置場所に至る全てが、同じままなので、ゲストVMにとっては、元のデータセンター・インフラストラクチャで動作しているのと同じように見えるのです。これにより、ゲストVMはオンプレミス環境で動作しているかのように、VMのストレージ構成を使って同様に実行することができます。クラウドストレージの抽象化(およびローカルブロックデバイスとしての提示)を使うと、HVXオーバーレイ・ネットワーキングの機能と組み合わて、様々なNASアプライアンスを動作させ、iSCSI、NFS、CIFS、SMBといったネットワークベースのプロトコルで利用することができます。こうしたブロックデバイスはハイパフォーマンスなcopy-on-writeファイルシステムによって支えられており、このおかげで複数の仮想マシンの増分スナップショット機能を実装することができています。
Ravelloチームが開発したハンズオンをたどり、Oracle Compute Cloudにオンサイトに展開されているPrimaveraをインポートする方法を示すことができました。ブロック図は以下のようです。全てのVMDKファイルをインポートし、GUIベースのアプリケーション構成ツールを使って、インスタンスを接続します。

インスタンスをインポートすれば、仮想スイッチ、仮想ゲートウェイ、仮想NICを追加し、パブリックIPアドレスを割り当て、VLANを構成に追加することによって、ネットワークインターフェースを構成することができます。

Ravelloは、クラウドベンダーでサポートされていない機能を定義することを可能にします。例えば、AmazonやMicrosoftは、レイヤ2ルーティングおよびマルチキャスト・ブロードキャスティングを許可していません。VMwareの場合は両方を許可しています。HVX層でこれらの呼び出しをトラップし、ネットワーク上の全てのホストへの接続を開いてTCPでのpingやマルチキャスト・ブロードキャストのようなことをして、各ホストにパケットを送信することによって、これらの機能をエミュレートします。まとめると、Ravelloでは、VMwareの既存の仮想化エンジンを受け取ることができます。そして、実質的に任意のクラウド・コンピューティング・エンジンにデプロイします。HVX hypervisorは、シムを提供し、さらにVMwareがクラウドベンダーに提供する機能を拡大します。レイヤ2ルーティング、VLANタギング、マルチキャスト/ブロードキャストパケットのような機能は、インスタンス間のHVX層を介してサポートされています。

2016年8月24日

[Java] Updates to “Moving to a Plugin-Free Web”

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

Java Platform Group Product Managementのブログで、最近の最も人気のある記事の一つが、2016年1月の「Moving to a Plugin-Free Web」です。
Moving to a Plugin-Free Web
https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free
https://orablogs-jp.blogspot.jp/2016/01/moving-to-plugin-free-web.html
暫定では、Oracle開発チームがJDK Enhancement Proposal(JEP 289:Deprecate the Applet API/アプレットAPIを非推奨)を、JDK 9での計画廃止ステップに関する技術的な詳細を付けて公開しています。
JEP 289: Deprecate the Applet API
http://openjdk.java.net/jeps/289
要するに、JEP 289ではApplet APIのクラスを取り除くのではなく、クラスに@Deprecatedアノテーションを追加することを提案しています。提案の実装は、JDK 9 Early Accessリリースに取り込まれており、ダウンロードしてテストすることができます。
JDK 9
http://openjdk.java.net/projects/jdk9/
Download JDK 9
http://jdk9.java.net/
また、ブラウザから標準ベースのプラグインのサポートを除去するタイムラインがアップデートされています。Flash、Silverlight、Javaやその他のプラグインベースのテクノロジーを埋め込めなくすることをApple SafariやMozilla Firefoxの開発者が発表しています。
Next Steps for Legacy Plug-ins
https://webkit.org/blog/6589/next-steps-for-legacy-plug-ins/
Reducing Adobe Flash Usage in Firefox
https://blog.mozilla.org/futurereleases/2016/07/20/reducing-adobe-flash-usage-in-firefox/
発表されたブラウザの変更の詳細および、そうした変更の実装、ロールアウトのタイムラインについては、各ベンダーのブログエントリを参照してください。

2016年8月23日

[Cloud] New features in the Oracle Compute Cloud

原文はこちら。
https://blogs.oracle.com/pshuff/entry/new_features_in_the_oracle

OracleはOracle Compute Cloud Serviceをアップデートし、3個の新機能を追加しました。
  • Oracle MarketplaceをCompute Cloudコンソールに統合し、カスタムソリューションのデプロイがより簡単になりました
  • Backup Servicesの機能を拡張し、Compute Instanceのスナップショット取得やスナップショットからのインスタンスの複製ができるようになりました
  • 既存の仮想マシンのOracle Cloudへのインポートが簡単になり、これらのイメージをPublic MarketplaceやPrivate Marketplaceで利用できるようになりました
Oracle Marketplaceからのイメージの取得については以前お伝えしました。
(訳注)ここで言っている「以前」とは、以下のエントリを指します。
Cloud Marketplace
https://blogs.oracle.com/pshuff/entry/cloud_marketplace
Cloud Marketplace part 2
https://blogs.oracle.com/pshuff/entry/cloud_marpetplace_part_2
以前はMarketplaceに移動して、プリファレンスを構成してアカウントとComputeアカウントを紐付け、Marketplaceでアプリケーションを取得し、Compute Cloudでインスタンスをプロビジョニングする必要がありましたが、今日からは、Compute Cloudのインスタンス作成メニューでMarketplaceからイメージを選択し、Compute Instanceにプロビジョニングするだけでよくなりました。この変更の結果、Marketplaceの利用に必要な数多くのステップが削減されるだけでなく、事前構成済みのソリューションをCompute Instanceでプロビジョニングしたり、Compute Instanceを設定したりすることが簡単になっています。

Private Imageの下のMarketplaceタブに注目してください。検索エンジンと並んでMarketplaceのインスタンスのリストが新規Compute Instanceのプロビジョニングに統合されています。
Compute Instanceには、数週間前に導入された[Monitor]タブと同様に[Backup]タブが追加されました。これを使うとインスタンス全体のスナップショットの取得、ブート可能イメージとしてのスナップショットの保存、スナップショットに基づいた新規インスタンスのプロビジョニングができるようになります。

これにより、事前定義済みインスタンスをデフォルトのOSやMarketplaceインスタンスからプロビジョニングし、カスタマイズし、スナップショットを取得すれば、カスタマイズ後に取得したスナップショットから新規インスタンスをプロビジョニングすることができます。

3個目の新機能は、利用者がVMwareインスタンスを直接Compute Cloudのプライベートイメージにインポートできる、というものです。この機能のリリースの目的は、利用者がVMDK形式のイメージをOracle Cloudにインポートし、ほとんど修正無しで(もしくは全く修正せずに)実行できるようにすることです。これには、事後に複数のインターフェースを構成するのではなく、インポート時に複数のネットワーク・インターフェースを定義することが含まれます。インポート時に利用者がネットワークドライバを変更する必要はなく、Ravelloチームの経験を活用し、VMwareの定義をOracle Compute Cloudの定義にOrchestrationを使って変換し。ネットワーク定義を作成してCompute Instanceをスタートできるようにプロビジョニングします。
まとめると、この3個の新機能が本日リリースされ、Oracle Compute Cloud Serviceの利用が簡単になりました。これはデータセンターからクラウドへスムーズにサービスを移行できるようにするための継続的なサービスの改善の一つです。こうした改善は今から9月のOracle OpenWorldまでの間に発表されるものと併せて、利用者がキャパシティの拡張、ディザスタ・リカバリ、開発・テスト用途のために、Oracle Public Cloudを自身のデータセンターの拡張として利用できるようにするためのものです。

2016年8月19日

[Mobile] Oracle MAF 2.3.2 Released

原文はこちら。
https://blogs.oracle.com/mobile/entry/oracle_maf_2_3_2

MAF 2.3.2がご利用いただけるようになりました。このリリースには、iOSプラットフォームでMAFをご利用のお客様には影響があるいくつかの極めて重要なアップデートが含まれており、皆様がこのリリースを速やかに取り込まれることを推奨します。いつも通り、このリリースをJDeveloperのアップデート・センターからダウンロードできます。このリリースで導入された主要な機能をご紹介します。

Support for IPv6 only networks on iOS

先頃Appleは、Apple AppStoreに出される全てのアプリケーションはIPv6のみのネットワークをサポートする必要がある、と発表しました。MAF 2.3.2から、MAFアプリケーションはAppleの要件に準拠し、IPv6のみのネットワークで利用可能です。このサポートを得るためには、開発者はMAF 2.3.2でアプリケーションを再ビルドするだけでよいのです。AppleがIPv6のみのネットワークでのサポートをアクティブに検証していることを確認していますので、Appleから却下されないようにするため、お客様がこのリリースにアップデートすることは重要なことです。


WKWebview Support for iOS

この機能を使うと開発者はAMXコンテントタイプでWKWebViewレンダリングエンジンを使うことができます。WKWebViewを利用すると、AMXページのレンダリングパフォーマンスが劇的に改善されることが期待できます。MAF 2.3.2以後で作成された新規アプリケーションでは、WKWebViewがデフォルトでAMXで利用されるようになっています。既存のアプリケーションを2.3.2へ移行する場合はオプトインの機能です。WWWebViewを有効化するには、開発者ガイドにある手順に従ってください。
Oracle® Mobile Application Framework Developing Mobile Applications with Oracle Mobile Application Framework 2.3.2
Configuring the Web View of Application Features with AMX Content on iOS
http://docs.oracle.com/middleware/maf232/mobile/develop-maf/GUID-6F391DA6-3D6F-4823-A732-28851AC9DCAF.htm#ADFMF-GUID-228ED288-27F0-4476-A996-8BB12EDC51C4
期待されるパフォーマンスの改善を考慮すると、アプリケーションでAMXベースの機能を使ってらっしゃる場合にはWKWebViewを使うことを強く推奨します。

Support for generating quick start page layouts for common mobile patterns 

人気のあるモバイルパターンに基づくレイアウトを使ってAMXページを作成することがこれまでよりも簡単になる、すばらしい機能です。新しいAMXページ作成ウィザードには40個以上のレイアウトパターンを備えているので、モバイルUIの作成をさくっと始めることができます。
Oracle® Mobile Application Framework Developing Mobile Applications with Oracle Mobile Application Framework 2.3.2
How to Create a MAF AMX Page
http://docs.oracle.com/middleware/maf232/mobile/develop-maf/GUID-7E7342BA-86AF-48DE-BC7D-BB2D0D437040.htm#ADFMF25134
このレイアウトパターンはOracle Mobile UXチームの研究に基づいています。

Built-in Federated Authentication Support for Oracle Mobile Cloud Service and Other Oracle PaaS services 

この機能を使うと、簡単な設定で(しかもコーディングなしで)、Oracle Mobile Cloud Serviceや他のPaaSサービスで利用可能なFederated Authenticationの機能を使って、MAFアプリケーションは認証できるようになります。MAFアプリケーションの設定の詳細については、以下の開発者ガイドをご覧ください。
Oracle® Mobile Application Framework Developing Mobile Applications with Oracle Mobile Application Framework 2.3.2
How to Configure Single Sign-On in a MAF Application
http://docs.oracle.com/middleware/maf232/mobile/develop-maf/GUID-3975EBAB-DB9E-4BC2-B814-619F30AF897D.htm#ADFMF24777
この機能は、トークンリレーサービスを呼び出す汎用的なFederationシナリオでも利用できます。

UI Component Enhancements

  • ButtonやImageコンポーネントでのインラインSVGのサポート
    この機能を使うと、開発者はAMX ImageコンポーネントやcommandButtonコンポーネントとともにSVGを使うことができ、CSSを使って簡単にスタイルを変更・調整することができます。
  • InputTextのコンテンツをクリアするためのアフォーダンス
  • Filmstripコンポーネントでのページネーション・オーバーフローのサポート 

Data Visualization Enhancements

  • 新しいグラフの設計時UIでは、グラフのさまざまなセクションにデータをバインドしながら、エンドユーザーが動的なグラフのサンプルを表示することができるようになりました。
  • ピクトチャートの設計時サポート
  • Oracle Mapsを使ったGeoMapでのルート表示をサポート
  • Chartコンポーネントに対する数多くの機能強化
    • 対数軸のサポート
    • カテゴリラベルのワードラップ
    • 一定間隔のグラフ軸のサポート
    • 矩形、星形マーカーのサポート
    • 境界幅の変更機能
    • ファンネルスライス・ラベルの無効化機能
    • 遅延グラフ系列の強調表示をサポート
    • 積み重ね棒グラフでバーの上に合計数を表示する機能
    • グラフ上でのズームやスクロール方向を指定する機能

2016年8月15日

[Java] Getting Started with Lambda Expressions

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

ラムダ式(lambda expressions)によってコードの行数がどれほど削減でき、メンテナンスが簡単になるのかをご覧ください。

「ラムダ式って何?」という質問への回答のために、システムの挙動を定義する式としてラムダのことを考えることができます。わずかなラムダ式の構文により、Javaプログラミング言語に対し簡潔で柔軟なコードを記述するための効率の良いツールをもたらします。
コードの行数を減らすことができるだけでなく、ラムダ式はモジュール性を持ち、ソフトウェアシステムに対し拡張性の特徴をもたらす関数型プログラミングのイディオムです。
ラムダ式の利用は、小さな、具体的なシステムの挙動を定義するために多大な構文を持つ匿名クラスを記述するよりもよい代替手段です。ラムダ式は特定のイベントでの実行アクションを記述するイベントハンドラを定義するためのリーンアプローチを提供します。ある典型的な例では、イベントハンドラをSwingフレームワークで必要としている場合、イベントハンドラインターフェースのための実装を提供する必要があります。フレームワークが関数型プログラミングの特徴に沿って設計されている場合にのみ、ラムダ式を活用することができます。

ラムダ式を理解するために、2つの微妙なニュアンスを理解する必要があります。
  • 関数型インターフェース(Functional interfaces)
    1個のメソッド定義だけを持つJavaインターフェース。このようなインターフェースの固有の性質により、1個のタスクのみ実行するメソッドを持つことができる。このインターフェースへの任意の参照は宣言された唯一のメソッドだけが処理する。
  • 式(Expressions)
    インターフェース実装を定義する方法。関数型インターフェースは抽象メソッドを持ち、式はメソッドが実施することを定義する。
では、Java関数型プログラミングの様々な特徴を見ていきましょう。

The Syntax of Functional Interfaces

Listing 1 から Listing 3 で、関数型インターフェースで利用可能な構文を示しています。
Listing 1. Interface definition 1
public interface Event {
   public void onEventOccurance();
}
Listing 2. Interface definition 2
public interface EventProcess {
   public void onEventOccuranceProcess(int i);
}
Listing 3. Interface definition 3
public interface EventResult {
   public int onEventOccuranceConfirm(int i);
}

The Syntax of Lambda Expressions


ラムダ式の構文は以下の3パートから構成されています。
  • 括弧()に囲まれたカンマ区切りのパラメータ・リスト
    メソッドへのパラメータが1個のみの場合、括弧を省略できる。
  • アロー演算子(->
    パラメータとラムダ式本体のセパレータ
  • ラムダ式本体
    1個のステートメントもしくはステートメント・ブロックを含む。1個のステートメントの場合、中括弧は不要だが、ステートメント・ブロックの場合は中括弧で囲む必要がある。
ラムダ式は匿名クラスとは異なり、辞書的にスコープを持ち、シャドーイング問題がない傾向にあります(シャドーイング問題については、Java Tutorialsをご覧ください)。
Shadowing
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html#shadowing
ラムダ式がアクセスする変数はfinalもしくは実際上finalであるべきゆえに、ラムダ式はシャドーイング問題から安全です。もし変数がこれらの条件を満足しない場合、コンパイル時にエラーが発生します。
ラムダ式の構文をListing 4からListing 7で示します。
Listing 4のラムダ式はListing 1の関数型インターフェース定義に対応しています。Listing1の onEventOccurance() メソッドはパラメータをとらないので、括弧の中身は空です。
Listing 4. Lambda expression 1
() -> System.out.println("event occurred : no argument syntax");
Listing 5のラムダ構文はListing 2の関数型インターフェース定義に対応しますが、Listing 2の onEventOccuranceProcess(int i) メソッドは1個のパラメータをとるため、構文でパラメータ名を宣言しています。インターフェースやラムダ式のパラメータ名は任意で、例えば iapなどをとることができます。名前は式とインターフェースで異なる場合があります。
Listing 5. Lambda expression 2
(i) -> System.out.println("event processed : one argument syntax"+ i);
Listing 6のラムダ構文もまたListing 2の関数型インターフェース定義に対応するものですが、こちらでは別の構文を示しています。
Listing 6. Lambda expression 3, which is an alternative to lambda expression 2
(i) -> {
  System.out.println("event processed : one argument syntax"+ i);
}
Listing 7のラムダ構文はListing 3の関数型インターフェース定義に対応するものです。Listing 3の onEventOccuranceConfirm(int i) メソッドは1個のパラメータをとるため、構文ではパラメータ名を宣言しています。パラメータ名は任意で、例えば iapなどをとることができます。Listing 7の実装は値を返します。 return ステートメントを含めない場合、ラムダ式がインターフェース契約に反するため、コンパイルエラーが発生します。
Listing 7. Lambda expression 4
(i) -> {
  i = i + 1;
  return i;
}

Invoking a Functional Interface


Javaクラスを見ていきましょう。このクラスは、ラムダ式を利用する関数型インターフェースメソッドを呼び出します。Listing 8のEventOrganizer クラスには関数型インターフェースをパラメータとして受け取り、メソッドを呼び出すメソッドがあります。
Listing 8. Class that invokes functional interface methods
package com.j2se8.samples.event;
 
import com.j2se8.samples.event.funct.Event;
import com.j2se8.samples.event.funct.EventProcess;
import com.j2se8.samples.event.funct.EventResult;
 
public class EventOrganizer {
  public void testEvent(Event event) {
    event.onEventOccurance();
  }
  public void testEventProcess( EventProcess eventProcess)  {
    eventProcess.onEventOccuranceProcess(1);
  }
  public void testEventResult( EventResult eventResult ) {
    int result = eventResult.onEventOccuranceConfirm(1);
    // printing the return value of the evaluated expression
    System.out.println("Print result value : " + result);
  }
}
Listing 9は、EventOrganizer オブジェクトを呼び出し、入力値の処理のためにラムダ式を渡すJavaクライアントを示しています。 この例では、ビジネスロジックをデータが存在する場所に渡していることがわかります。
Listing 9. Java client
package com.j2se8.samples.event;

public class EventClient {
  public static void main(String[] args) {
    EventOrganizer eventTester = new EventOrganizer();

    // calling no-argument functional interface
    eventTester.testEvent(() -> System.out.println("event occurred : no argument syntax"));

    // calling single-argument method of functional interface
    eventTester.testEventProcess((i) -> System.out.println("event processed : one argument syntax : " + i));

    // calling alternative single-argument method of functional interface syntax of omitting parentheses
    eventTester.testEventProcess(i -> System.out.println("event processed : one argument syntax : " + i));

    // calling alternative single-argument method of functional interface syntax of wrapping expression body with curly braces
    eventTester.testEventProcess((i) -> {
       System.out.println("event processed : one argument syntax : " + i);
    });

    // calling single-argument method of functional interface that returns the result
    eventTester.testEventResult((i) -> {
       i = i + 1;
       return i;
    });
  }
}

Rethinking the Way We Program


ラムダ式を使う場合、プログラムの書き方を再検討する必要に迫られます。むしろデータを保持し、どの操作が当該データに対して許されているかを定義するAPIメソッドを公開するJavaクラスを有しているといったほうがよいでしょう。操作のセマンティクスとロジックを、必要に基づいてこうしたメソッドに注入することができます。これにより、同じデータをさまざまな方法、様々な目的のために解釈し利用することができます。Listing 10でこの要点を理解することができることでしょう。

種々の処理目的のために異なるラムダ式を同じメソッドに渡すことができる様子を見ていきましょう。Listing 10ではEventDispatcherという名前のクラスを定義しており、このクラスは、必要に応じて登録、処理できる種々のイベントのリストを保持しています。

Listing 10. Program with lambda expression being sent to the same method
package com.j2se8.samples.event;

import java.util.ArrayList;
import java.util.List;
import com.j2se8.samples.event.funct.Event;
import com.j2se8.samples.event.funct.EventProcess;
import com.j2se8.samples.event.funct.EventResult;

public class EventDispatcher {    
  private List<Event> eventList = new ArrayList<Event>();
  private List<EventProcess> eventProcessList = new ArrayList<EventProcess>();  
  private List<EventResult> eventResultList = new ArrayList<EventResult>();    

  public void registerEventHandler(Event event) {
    eventList.add(event); 
  }    
  public void registerEventProcessHandler(EventProcess eventProcess) {
    eventProcessList.add(eventProcess);
  }
  public void registerEventResultHandler(EventResult eventResult) {
    eventResultList.add(eventResult);
  }
  public void dispatchEvent() {
    for (Event event : eventList) {
      event.onEventOccurance();
    }
  }

  public void processEvents() {
    int i = 1;
    for(EventProcess process : eventProcessList) {
      process.onEventOccuranceProcess(i++);
    }
  }

  public void compute() {
    final int i = 2;
    for(EventResult process : eventResultList) {
      int result = process.onEventOccuranceConfirm(i);
      System.out.println("return result : "+ result);
    }
  }
}

ではクライアント側を見ていきます(Listing 11)。このクライアントはイベントとして式を登録し、EventDispatcherを呼び出して登録された式に基づいて振る舞います。
Listing 11. Client that registers multiple expressions as events
package com.j2se8.samples.event;

import com.j2se8.samples.event.funct.Event;
import com.j2se8.samples.event.funct.EventProcess;
import com.j2se8.samples.event.funct.EventResult;

public class EventDispatcherClient {
  public static void main(String[] args) {
    EventDispatcher eventDispatcher = new EventDispatcher();

    // define no-argument functional interface
    Event event1 = () -> System.out.println("event 1 occurred : no argument syntax");
    Event event2 = () -> System.out.println("event 2 occurred : no argument syntax");

    // define single-argument method of functional interface
    EventProcess process1 = (i) -> System.out.println("event processed : one argument syntax : "+i);

    // define alternative single-argument method of functional interface syntax of omitting parentheses
    EventProcess process2 = i -> System.out.println("event processed : one argument syntax : "+i);

    // define alternative single-argument method of functional interface syntax of wrapping expression body with curly braces     
    EventProcess process3 = (i) -> {
      System.out.println("event processed : one argument syntax : "+i);
    };
  
    // define single-argument method of functional interface that returns the result
    EventResult result1 = (i) -> { 
      i = i + 2;
      return i;
    };
    EventResult result2 = (i) -> {
      i = i - 2;
      return i;
    };
    EventResult result3 = (i) -> {
      i = i * 2;
      return i;
    };
    EventResult result4 = (i) -> {
      i = i / 2;
      return i;
    };
    EventResult result5 = (i) -> {
      i = i % 2;
      return i;
    };

    // registering events     
    eventDispatcher.registerEventHandler(event1);
    eventDispatcher.registerEventHandler(event2);
    eventDispatcher.dispatchEvent();
    System.out.println("");

    // registering event processes     
    eventDispatcher.registerEventProcessHandler(process1);
    eventDispatcher.registerEventProcessHandler(process2);
    eventDispatcher.registerEventProcessHandler(process3);
    eventDispatcher.processEvents();
    System.out.println("");

    // registering result-based events     
    eventDispatcher.registerEventResultHandler(result1);
    eventDispatcher.registerEventResultHandler(result2);
    eventDispatcher.registerEventResultHandler(result3);
    eventDispatcher.registerEventResultHandler(result4);
    eventDispatcher.registerEventResultHandler(result5);
    eventDispatcher.compute();
  }
}

Conclusion

ラムダ式を独立して構築できること、呼び出し元のクラスから呼び出し先のクラスに注入することができることをご覧いただきました。上記の例でわかるように、ラムダ式はインタフェースの実装を提供します。それゆえ、ラムダ式は無名クラス以上に単純な実装として機能することができます。これにより、コード量が劇的に削減されるためメンテナンスしやすいコードになり、最小限の影響にとどめて変更を導入することができます。ラムダ式の構文は、Javaプログラマに非常に目新しいものゆえに、この構文が当たり前のものとなって、Javaコミュニティにラムダ式の詳細知識が蓄えられるまでは、プログラマにとって困惑のたねとなることでしょう。
ラムダ式はJava 8で導入された新機能で、主流のプログラミングになるまでには時間がかかることでしょう。しかし、このプログラミングアプローチは新たなプログラミング・スタイルを開き、プログラムの構築方法を変化させる可能性があります。このエントリで、ラムダ式の利用に関するいくつかの特徴を説明、紹介して参りましたが、まだまだたくさんありますので、是非ご自身でこのトピックを深めてください。

See Also

About the Author

Mohan BasavarajappaはInfosysのテクニカル・アーキテクトです。Java SE、Java EE、Oracle WebCenter ContentやOracle WebCenter Sitesのようなエンタープライズ・コンテンツ管理テクノロジーに興味関心を持っています。以前は、オープンソーステクノロジーを活用し、組織全体で再利用可能なライブラリを作成することで、生産性の向上と市場投入までの時間を短縮することを目的としたReuse Practitionerの役割を担っていました。オープンソースの愛好家であり、オープンソースフレームワークやライブラリの調査・探索が大好きな、アクティブなOracle Technology Networkメンバーです。
MOHAN BASAVARAJAPPAのプロフィール
https://community.oracle.com/people/Mohan+Basavarajappa?customTheme=java

2016年8月12日

[Java] JVM Language Summit Highlights

原文はこちら。
https://blogs.oracle.com/java/jvm-language-summit-highlights

先週、第9回JVM Language Summitがカリフォルニア州サンタクララで開催されました。この3日間のイベントには言語設計者、コンパイラ開発者、ツール開発者、ランタイムエンジニア、VMアーキテクトが参加し、現在および将来のJVMの開発、Java言語、JVM言語、異なるランタイムやVMに関してオープンにコラボレーションしました。今年のトピックはJDK 9、Java 9、Java 10のさらに先のリリース機能に関すること、そしてJVM言語やツールでした。全てのプレゼンテーションは録画されており、オンラインでご覧いただけます。
JVM Language Summit 2016 (YouTube Playlist)
https://www.youtube.com/playlist?list=PLX8CzqL3ArzUY6rQAQTwI_jKvqJxrRrP_
Welcome Sessionでは、開発部門のVice PresidentであるBernard Traversatが、120個の拡張機能(JEP)のうち、完了しているものが95個、10個が統合済み、10個が開発中で、開発チームにフィードバックするのに適切な時期である説明しています。最新のJDK 9早期アクセスリリースをダウンロードしてテストし、フィードバックを提供することができます。JDK 9リリースに関する一般的な情報は、以下のURLをご覧ください。
JDK 9 Project - JDK 9 Snapshots
https://jdk9.java.net/
JDK 9
http://openjdk.java.net/projects/jdk9/
Alex Buckleyは”Jigsaw Under the Hood”というJDK 9のセッションでプレゼンテーションしました。

Project Jigsaw Under the Hood

彼はこのプレゼンテーションの中で、モジュールシステムがJava言語とVMとどのように協調するのか、モジュールへの移行、モジュールシステムの機能、およびJDK9上で実行するための準備について説明しています。また、モジュールシステムについて理解するためにはJEP 261を読むことを強く推奨しています。
JEP 261: Module System
http://openjdk.java.net/jeps/261
Project Valhallaに関するセッションは、Brian Goetzの"Adventures in Parametric Polymorphism"、Maurizio Cimadamoreの"Valhalla Reflection"、Rémi ForaxとJefferson Mangueの"Valhalla Backport"という具合で多数ありました。

Adventures in Parametric Polymorphism


Valhalla Reflection


Valhalla Backport

JVMとネイティブコードの相互接続のためのプロジェクトであるProject Panamaについて、Mikael Vidstedt と Tobi Ajila の "Going Native"、Vladimir Ivanovの"Machine Code の2セッションで議論されました。

Going Native

Machine Code Snippets


他のセッションはScalaやKotlinのようなJVM言語に関するものです。全てのセッションはYouTubeのjavaチャネルからご覧いただけます。
JVM Language Summit 2016 (YouTube Playlist)
https://www.youtube.com/playlist?list=PLX8CzqL3ArzUY6rQAQTwI_jKvqJxrRrP_

2016年8月11日

[Java] An Inflatable SeqLock

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

以下の内容は、将来のJDKでの、Tupleという値タイプへのアトミックなアクセス方法の実装についてJohn Roleと議論したときにひらめいたものです。
John Rose @ Oracle
https://blogs.oracle.com/jrose/
基本的にはC++のatomic<POD>ファシリティに近いものを持ちます。
C++ Atomic Types and Operations
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2145.html
値タイプの読み取り(ロード)はアクセスの基本モードであることを期待されているので、SeqLocks(Sequential Lock)のようなものを使ってReaderが共有領域に書き込む必要がないようにしたいのです。
SeqLock
https://en.wikipedia.org/wiki/Seqlock
Process synchronization without long-term interlock
http://dx.doi.org/10.1145/800212.806505
しかし同時に、Writerにはクラシックなtest-and-set (TAS) シングルビットのSeqLockよりも洗練されたものを使ってほしいと考えています。
その目的のために、Inflatable SeqLockを使うことができるかもしれません。
davedice/InflatableSeqLock.cpp(Inflatable SeqLockの実装案)
https://gist.github.com/davedice/29178780e22be6ee67a8c21bc4cf5de5
各Tupleは、ワードサイズの、関連するInflatable SeqLockを持ちます。このSeqLockは書き込みのために下位2ビットを留保し、残りは通常のSeqLockバージョンフィールドとして利用します。Writerスレッドが待機している場合、フィールドの残りが待機中スレッドのスタックの先頭を指し示し、スタック上の最も古い要素が保持するバージョン番号が変化します。
この実装はTL2のようなソフトウェアトランザクショナルメモリの実装(STMs)を使うことももちろん可能でしょうが、オブジェクト内の一貫性を気にかける必要がない条件下では、ちょっとやり過ぎかな、と思います。
Software Transactional Memory -- Transactional Locking -- TL and TL2
https://blogs.oracle.com/dave/entry/software_transactional_memory_transactional_locking

2016年8月10日

[Cloud, Integration] Oracle SOA Cloud Service (SOA CS) 16.3.3 - Now Available

原文はこちら。
https://blogs.oracle.com/soaproactive/entry/oracle_soa_cloud_service_soa

SOA Suite Cloud Service (SOA CS) 16.3.3が利用可能になったことを報告できうれしく思っています。このリリースには、新たなサービスタイプである “Integration Analytics” が含まれています。このサービスタイプには、Real-Time Integration Business InsightとBAM(プレビュー版)が含まれます。

Integration Analyticsサービスタイプは、全ての既存Metered(従量制)、Non-Metered(非従量制、定額制)のSOA CSアカウント(試使用、契約済みアカウントを問いません)でご利用いただけます。既存のNon-Metered SOA CSアカウントで未使用のOCPUがあれば、すぐにこのサービスタイプを利用することができます。

SOA、Service Bus、B2Bの場合と同様に、Integration Analytics OCPUはSOA Cloud Service SKUをご利用ください。

Oracle Real-Time Integration Business Insightに関する詳細情報(概要動画、チュートリアル、試使用メディアなど)は、OTNのOracle Real-Time Integration Business Insightからどうぞ。
Real-Time Integration Business Insight Overview(日本語)
http://www.oracle.com/technetwork/jp/middleware/insight/overview/index.html
Real-Time Integration Business Insight Overview(英語)
http://www.oracle.com/technetwork/middleware/insight/overview/index.html

2016年8月9日

[Database, Support] OJVM patch: Standby-First patching, yes or no?

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

OJVMパッチという"wonderful"なトピックについて過去何度かブログを書いてきましたが、私をたたかないでください。弊社の幹部がこのエントリを認識していると思って間違いありません。
とにかく、過去数ヶ月でいただいた、OJVMパッチに関するいくつかの一般的な質問に対する回答をまとめたいと思います。

PSUやBPを適用する際に毎回OJVMパッチを適用する必要がありますか?

残念ながら、これは1回だけやって終わりというわけには行きません。毎回実施する必要があります。

データベースでOJVMを利用しているかどうかをどうやって判断すればよいのでしょうか?

以下のエントリで判断できるようにしようとしました。
https://blogs.oracle.com/UPGRADE/entry/jvm_java_in_the_database
でも、最善の方法は、使う予定がないのなら、OJVMを最初からインストールしないことです。後から削除するより後でインストールするほうがずっと簡単です。

OJVMパッチはローリングパッチ適用が可能ですか?それとも最初にstandby-firstパッチが可能でしょうか?

いいえ、残何ながら、OJVMパッチはRAC環境でローリングパッチ適用することはできませんし、standby-firstパッチ方式も使うことができません。
My Oracle Supportのサポート・ドキュメントに記載があります。
Oracle Recommended Patches -- "Oracle JavaVM Component Database PSU" (OJVM PSU) Patches (ドキュメントID 1929745.1)
https://support.oracle.com/rs?type=doc&id=1929745.1

Mitigation PatchはOJVMパッチのダウンタイムを避ける有効な方法でしょうか?

それはあなた次第ですね。ですが、OJVM Mitigation Patchが初耳ということであれば、再度、Oracle Recommended Patches -- "Oracle JavaVM Component Database PSU" (OJVM PSU) Patches (ドキュメントID 1929745.1)というMy Oracle Supportのサポート・ドキュメントをご覧ください。
For situations where the latest OJVM PSU cannot be installed immediately there is a "Mitigation Patch" that can be used. The "Mitigation Patch" is an interim solution to protect against all currently known (Jul 2015) Oracle JavaVM security vulnerabilities in the database until such time as the OJVM PSU can be installed. It can also be used to protect database versions no longer covered by error correction support.
The "Mitigation Patch":
  • is applicable only to database homes, not client nor Grid homes
  • is only applicable to databases that have JavaVM installed
  • has no dependency on the DB PSU (or equivalent) level
  • can be installed in a RAC Rolling manner
  • is a SQL only patch that needs to be installed and activated in each database
    • hence it can be installed standby first but it requires SQL steps to be executed to be effective, which cannot be done on a read only standby
  • affects use of Java and Java development in the database
  • has been reviewed for January 2015, April 2015, July 2015, October 2015, January 2016, April 2016 and July 2016 and provides mitigation against all currently known OJVM vulnerabilities
  • can be downloaded here: Patch:19721304
最新 OJVM PSU が即時に適用できない場合、"Mitigation Patch" を使用することができます。"Mitigation Patch" は OJVM PSU をインストールすることができるまでの間の、既知の Oracle JavaVM に対するセキュリティ脆弱性に対する一時的な解決策となります。すでに error correction support にてカバーされないバージョンのデータベースに対しても使用することが可能です。
"Mitigation Patch" は
  • データベースの ORACLE_HOME にのみ適用可能です。クライアントや Grid Home には適用できません。
  • JavaVM がインストールされているデータベースのみ適用可能です。
  • DB PSU (または PSU 相当のパッチ)  との依存性はありません。
  • RAC ローリング適用が可能です。
  • 各データベースでインストール、有効化する必要がある SQL のみのパッチです。
    • このため、スタンバイデータベースに先にインストールは可能ですが、有効化するには SQL を実行する手順が必要であり、READ ONLY のスタンバイデータベースでは先に有効にすることはできません。
  • データベース内の Java および Java development に影響があります。
  • January 2015 および April 2015 および July 2015および October 2015 および January 2016  に対して再調査され、現時点で既知のすべての OJVM 脆弱性に対する緩和策となります。
  • Patch:19721304からダウンロード可能です。
皆さんの疑問にお答え仕切れていないことは重々承知していますが、是非ためらわずにOracle SupportでService Requestを発行してください。

2016年8月8日

[Integration, Cloud] CI, DevOps and ALM for Oracle SOA Suite with Oracle Developer Cloud Service

原文はこちら。
https://blogs.oracle.com/shay/entry/ci_devops_and_alm_for

多数の開発者がJDeveloperを使ってOracle SOA Suiteでアプリケーションを開発していますが、このエントリでは、JDeveloperとOracle Developer Cloud Service(DevCS)を組み合わせて利用すると、開発とデリバリライフサイクルの全体を自動化できることをご紹介します。
Oracle Developer Cloud Service
https://cloud.oracle.com/ja_JP/developer_service
Developer Cloud Serviceのユニークな側面の一つとして、JDeveloperのインスタンスを有しており、ビルド環境で利用できる、というものがあります。この機能を使うと、Oracle SOA Suiteのアーティファクトを開発するお客様は、あたかも開発時に実行するのと同じ感じで、OJDeployメカニズムを活用して、継続的インテグレーションサイクル(Continuous Integration Cycle)の中でアプリケーションをパッケージングすることができます。
JDeveloper 12.2.1で追加されたDevCS統合機能を使うと、開発者はDevCSが提供するGitサーバとの統合だけではなく、DevCSタスク追跡システムと直接対話し、さらにコードの変更を特定のタスクに紐付けることができるようになっています。
この10分の動画で以下の内容をご紹介します。
  • Oracle SOA SuiteのアーティファクトのためのAntベースでのビルドを作成
  • Developer Cloud Serviceで継続的インテグレーションビルドを自動化し、Oracle SOA Suite用にパッケージング
  • SOAプロジェクトコードをGitとDeveloper Cloud Serviceで管理
  • JDeveloperからタスクを追跡し、Developer Cloud Serviceでアジャイル開発を監視

ところで、Mavenを使ってビルドの自動化をしたい場合も、完全に自動化可能であり、DevCSでサポートしています。以下の動画で実現方法をご紹介しています。
Soa Cloud Service + Developer Cloud Service: Integration
https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-developer-cloud-service/blog/2015/11/05/soa-cloud-service-developer-cloud-service-integration
DevCSプロジェクトの作成やGitリポジトリの作成、タスクの追跡やアジャイルチームボードの作成がどれほど迅速・簡単にできるかわからない場合は以下のエントリにある動画をご覧ください。
Using the Oracle Developer Cloud Service for Git version management for JDeveloper/ADF apps
https://blogs.oracle.com/shay/entry/using_the_oracle_developer_cloud
Agile Development with Oracle Developer Cloud Service and JDeveloper 12.2.1
thttps://blogs.oracle.com/shay/entry/agile_development_with_oracle_developer
開発者は、Oracle SOA Cloud Serviceへの全てのサブスクリプションを持っている場合にはDeveloper Cloud Serviceへのアクセスが可能であることにご注意ください。
以下の2個のantファイルは、この動画で使ったものです。
build.propertiesでアプリケーション名やプロジェクト名を現在取り組んでいるものにふさわしい名前に変更できます。
動画でわかるように、build.xmlは自動生成されるため、必要な行を追加するだけでよいのです。
<property environment="env" />
build.properties
oracle.commons=../../../../oracle_common/
oracle.commons=../../../../oracle_common/
install.dir=../../../..
oracle.home=${env.ORACLE_HOME_SOA_12_2_1}
oracle.jdeveloper.workspace.path=${env.WORKSPACE}/e2e-1201-composites.jws
middleware.home=${env.MIDDLEWARE_HOME_SOA_12_2_1}
workspace=${env.WORKSPACE}
oracle.jdeveloper.ant.library=${env.ORACLE_HOME_SOA_12_2_1}/jdev/lib/ant-jdeveloper.jar
oracle.jdeveloper.deploy.dir=${env.WORKSPACE}/ProcessOrder/deploy
oracle.jdeveloper.ojdeploy.path=${oracle.home}/jdev/bin/ojdeploy
javac.nowarn=off
oracle.jdeveloper.project.name=ProcessOrder
oracle.jdeveloper.deploy.outputfile=${env.WORKSPACE}/e2e-1201-composites/ProcessOrder/deploy/${profile.name}
output.dir=classes
javac.deprecation=off
oracle.jdeveloper.deploy.profile.name=*
javac.debug=on
build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--Ant buildfile generated by Oracle JDeveloper-->
<!--Generated Jul 25, 2016 5:11:09 PM-->
<project xmlns="antlib:org.apache.tools.ant" name="ProcessOrder" default="all" basedir=".">
 <property environment="env" /> 
 <property file="build.properties"/>
  <path id="library.SOA.Designtime">
    <pathelement location="${install.dir}/soa/plugins/jdeveloper/extensions/oracle.sca.modeler.jar"/>
  </path>
  <path id="library.SOA.Runtime">
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar"/>
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-api.jar"/>
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-core.jar"/>
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/edn.jar"/>
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar"/>
    <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fabric-common-api.jar"/>
  </path>
  <path id="library.BPEL.Runtime">
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar"/>
  </path>
  <path id="library.Mediator.Runtime">
    <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mediator_11.1.1/mediator_client.jar"/>
  </path>
  <path id="library.MDS.Runtime">
    <pathelement location="${oracle.commons}/modules/oracle.mds/mdsrt.jar"/>
  </path>
  <path id="library.BC4J.Service.Runtime">
    <pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc.jar"/>
    <pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc-share.jar"/>
    <pathelement location="${oracle.commons}/modules/commonj.sdo.backward.jar"/>
    <pathelement location="${oracle.commons}/modules/commonj.sdo.jar"/>
    <pathelement location="${oracle.commons}/modules/oracle.toplink/eclipselink.jar"/>
    <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.wsclient-impl.jar"/>
    <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.jrf-ws-api.jar"/>
    <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.web-common-schemas-impl.jar"/>
  </path>
  <path id="classpath">
    <path refid="library.SOA.Designtime"/>
    <path refid="library.SOA.Runtime"/>
    <path refid="library.BPEL.Runtime"/>
    <path refid="library.Mediator.Runtime"/>
    <path refid="library.MDS.Runtime"/>
    <path refid="library.BC4J.Service.Runtime"/>
  </path>
  <target name="init">
    <tstamp/>
    <mkdir dir="${output.dir}"/>
  </target>
  <target name="all" description="Build the project" depends="deploy,compile,copy"/>
  <target name="clean" description="Clean the project">
    <delete includeemptydirs="true" quiet="true">
      <fileset dir="${output.dir}" includes="**/*"/>
    </delete>
  </target>
  <target name="deploy" description="Deploy JDeveloper profiles" depends="init">
    <taskdef name="ojdeploy" classname="oracle.jdeveloper.deploy.ant.OJDeployAntTask" uri="oraclelib:OJDeployAntTask"
             classpath="${oracle.jdeveloper.ant.library}"/>
    <ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask" executable="${oracle.jdeveloper.ojdeploy.path}"
                  ora:buildscript="${oracle.jdeveloper.deploy.dir}/ojdeploy-build.xml"
                  ora:statuslog="${oracle.jdeveloper.deploy.dir}/ojdeploy-statuslog.xml">
      <ora:deploy>
        <ora:parameter name="workspace" value="${oracle.jdeveloper.workspace.path}"/>
        <ora:parameter name="project" value="${oracle.jdeveloper.project.name}"/>
        <ora:parameter name="profile" value="${oracle.jdeveloper.deploy.profile.name}"/>
        <ora:parameter name="nocompile" value="false"/>
        <ora:parameter name="outputfile" value="${oracle.jdeveloper.deploy.outputfile}"/>
      </ora:deploy>
    </ora:ojdeploy>
  </target>
  <target name="compile" description="Compile Java source files" depends="init">
    <javac destdir="${output.dir}" classpathref="classpath" debug="${javac.debug}" nowarn="${javac.nowarn}"
           deprecation="${javac.deprecation}" encoding="UTF8" source="1.8" target="1.8">
      <src path="SOA/SCA-INF/src"/>
    </javac>
  </target>
  <target name="copy" description="Copy files to output directory" depends="init">
    <patternset id="copy.patterns">
      <include name="**/*.GIF"/>
      <include name="**/*.JPEG"/>
      <include name="**/*.JPG"/>
      <include name="**/*.PNG"/>
      <include name="**/*.cpx"/>
      <include name="**/*.dcx"/>
      <include name="**/*.ejx"/>
      <include name="**/*.gif"/>
      <include name="**/*.ini"/>
      <include name="**/*.jpeg"/>
      <include name="**/*.jpg"/>
      <include name="**/*.png"/>
      <include name="**/*.properties"/>
      <include name="**/*.sva"/>
      <include name="**/*.tag"/>
      <include name="**/*.tld"/>
      <include name="**/*.wsdl"/>
      <include name="**/*.xcfg"/>
      <include name="**/*.xlf"/>
      <include name="**/*.xml"/>
      <include name="**/*.xsd"/>
      <include name="**/*.xsl"/>
      <include name="**/*.exm"/>
      <include name="**/*.xml"/>
      <exclude name="build.xml"/>
    </patternset>
    <copy todir="${output.dir}">
      <fileset dir="SOA/SCA-INF/src">
        <patternset refid="copy.patterns"/>
      </fileset>
      <fileset dir=".">
        <patternset refid="copy.patterns"/>
      </fileset>
    </copy>
  </target>
</project>

2016年8月3日

[Database] PDB unplug/plug/patch with PSUs or BPs

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

この質問は、Oracle Multitenant環境のアップグレードのテクニックを説明したエントリをご覧になった方が数日前にブログに投稿されたものです。
以下の質問をお寄せ下さいました。
12.1.0.2.1 から 12.1.0.2.5 へのアップグレードを計画中です。計画では、新しい 12.1.0.2.5 のOracle Homeを作成し、徐々にPDBを 12.1.0.2.1 から 12.1.0.2.5 へ移行することにしていますが、この手順で実施すべきでしょうか?やりたいことを説明したドキュメントはありますか?
幸運にもMOSドキュメントがあり、その中で手順を説明しています。
このドキュメントの中では、Unplug/Pluginの操作を詳細に説明していませんが、以下のエントリで説明しています。

2016年8月2日

[Java] Filters in RESTful Java

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

フィルタ(Filter)はJAX-RSフレームワークが提供する重要な機能の一つであり、RESTful Webサービスを開発する際には様々なコンテキストで利用されます。
フィルタを使ってリクエスト・エンティティやレスポンス・エンティティ、ヘッダ、その他のパラメータを変更します。この記事では、様々な種類のフィルタとその使い方を見ていきます。全てのコードサンプルはJerseyフレームワークをベースにしています。

[注意]
この記事のサンプルコードはGitHubからご利用いただけます。
RESTskol
https://github.com/cloudskol/restskol

Types of Filters

フィルタはサーバ(コンテナ)フィルタ、もう一つはクライアントフィルタという2種類の主要なカテゴリに分類されます。これらの2個のカテゴリはさらにリクエスト・フィルタやレスポンス・フィルタに分類されます(図1)。
f1.jpg
Figure 1. Types of filters

Container Filters

以下ではコンテナ・フィルタと利用可能なアノテーションをご紹介します。

Container Response Filters

レスポンス・ヘッダを変更したり、リソースメソッドを実行した後にパラメータを変更したりしたい場合に、コンテナ・レスポンス・フィルタを利用できます。利用するためには、ContainerResponseFilterインターフェースの実装を提供する必要があります(Listing 1)。
Listing 1. コンテナ・レスポンス・フィルタの例
public class RestSkolResponseFilter implements ContainerResponseFilter {
  @Override
  public void filter(ContainerRequestContext containerRequestContext,
           ContainerResponseContext containerResponseContext) throws IOException {
    containerResponseContext.getHeaders().add("X-Powered-By", "RESTSkol");
  }
}
これをプロバイダとしてリソース構成に登録する必要があります。上記の例では、X-Powered-Byと呼ばれるパラメータをレスポンスに注入しました(このサンプルはJersey Webサイトにインスパイアされました)。このように、レスポンスでよく使われるヘッダ値を簡単に注入することができます。

Container Request Filters

コンテナ・リクエスト・フィルタはリソースメソッドを実行する前に検証を強制する場合に有用です。そのため、コンテナ・リクエスト・フィルタはリソースメソッドの盾として振る舞います。任意の検証を強制することができ、その検証に失敗した場合、その時点でリソース実行を中止することができます。

Listing 2の例では、API Keyの検証をリソースメソッドの呼出しで強制しています。期待されるAPI Keyがこのリクエストヘッダにない場合、これ以後の呼出し実行は中止され、このレイヤでレスポンスを生成します。
Listing 2. Example container request filter
public class APIKeyCheckRequestFilter implements 
  ContainerRequestFilter { private static final String API_KEY = "X-API-KEY";

  @Override
  public void filter(ContainerRequestContext containerRequestContext) throws 
    IOException { final String apiKey = 
    containerRequestContext.getHeaders().getFirst(API_KEY); System.out.println("API KEY: " + apiKey);

    if (apiKey == null || apiKey.isEmpty()) { containerRequestContext
      .abortWith(
        Response
          .status(Response.Status.UNAUTHORIZED)
      .entity("Please provide a valid API Key")
      .build());
    }
  }
}

@PreMatching Annotation

デフォルトでは、適切なリクエスト・実行メソッドが見つかった後にコンテナ・リクエスト・フィルタ実装を実行します。なお、必要とされるリクエストメソッドを発見したり選択したりすることを制御することはできません。
この挙動を実現するため、コンテナ・リクエスト・フィルタのための @PreMatching アノテーションがあります。@PreMatching を使ってコンテナ・リクエスト・フィルタに注釈を付けた場合、リクエストメソッドに影響を及ぼすことができます。Listing 3の実装例では、  /books/v1 へのリクエストを the /books/v2 リソースに委任しています。これはリソース実装を廃止したいときに有用かもしれません。
Listing 3. Example of using the @PreMatching annotation
@PreMatching
public class PreMatchingFilter implements ContainerRequestFilter {
  @Override
  public void filter(ContainerRequestContext containerRequestContext) throws 
    IOException { final URI absolutePath = 
    containerRequestContext.getUriInfo().getAbsolutePath(); String path = 
    absolutePath.getPath();
    System.out.println("Path: " + path);

    if (path.contains("/books/v1")) {
      path = path.replace("/books/v1", "/books/v2");
    }

    System.out.println("After replaced Path: " + path);
    try {
      containerRequestContext.setRequestUri(new URI(path));
    } catch (URISyntaxException e) { 
        e.printStackTrace();
    }
  }
}

Client Filters

クライアント・フィルタではクライアント・リクエスト・フィルタとクライアント・レスポンス・フィルタの2種類が用意されています。これらのフィルタはクライアントAPI層にのみ適用します。つまり、Jersey(JAX-RS)クライアントAPIを使ってRESTエンドポイントを呼び出す場合、これらのフィルタをClient オブジェクトの一部として追加することができます。

Client Request Filters

このフィルタはフィルタのワークフロー開始点です。クライアント・リクエスト・フィルタがClientオブジェクトに登録されている場合、リクエストがサーバに送信される前にワークフローを開始します。そのため、クライアント層自身で何らかの検証を実施したい場合に、このフィルタを使うことができます。
Listing 4に示すクライアント・リクエスト・フィルタの目的は、PATCHメソッドを呼び出すときに検証する、というものです。検証を実施してサポートされないメソッドを使えないようにすることができます。この呼出しで検証に失敗した場合、リクエストを中止することができ、ワークフローが終了します。検証が成功した場合はサーバーレベルにリクエストを渡します。
Listing 4. Example client request filter
public class RestSkolClientRequestFilter implements ClientRequestFilter {
  private static final Logger logger = 
  LogManager.getLogger(RestSkolClientRequestFilter.class);

  @Override
  public void filter(ClientRequestContext clientRequestContext) throws IOException { 
    logger.info("Client request called");
    final String methodName = clientRequestContext.getMethod(); if 
    (methodName.equals("PATCH")) {
    clientRequestContext.abortWith( 
        Response.status(Response.Status.METHOD_NOT_ALLOWED)
          .entity("HTTP Patch is NOT supported")
          .build());
    }
  }
}

Client Response Filters

クライアント・レスポンス・フィルタはワークフローの最終ステップです。実行がサーバレベルで完了した後、サーバ層が成功のレスポンスもしくは失敗のレスポンスを生成し、クライアント層にこのレスポンスを渡します。クライアント・レスポンス・フィルタはレスポンスをサーバから受け取った際に実行されるもので、クライアント・レスポンス・フィルタのレベルで検証したり、レスポンスにさらにエンティティデータを注入したりすることができます。その後レスポンスを呼出し元に渡します。

How to Use Client Filters


既に述べたように、クライアント・フィルタ(リクエスト、レスポンスとも)をListing 5に示すようにClientオブジェクトに登録する必要があります。
Listing 5. Example of registering client filters
final Client client = ClientBuilder.newBuilder()
    .register(RestSkolClientRequestFilter.class)
    .register(RestSkolClientResponseFilter.class)
    .build();
その後、これらのクライアント・フィルタをメソッド呼び出し時に実行します。

Filter Execution Workflow and Output


図2はフィルタ実行パスのワークフロー(ステップ)全体を示しています。
f2.png
Figure 2. Steps in the filter execution path

以下の出力は、上記の全てのフィルタ実装が存在する場合の実行順序を示しています。ソースコードを書くにし、プロジェクトをローカルで実行して以下の出力を確認してください。図2で示した順序に出力が一致するはずです。
[INFO ] 2016-04-12 23:29:38.212 [main] RestSkolClientRequestFilter - Client request called
[INFO ] 2016-04-12 23:29:38.509 [http-bio-8080-exec-1] PreMatchingFilter - Pre matching container request filter
[INFO ] 2016-04-12 23:29:38.519 [http-bio-8080-exec-1] APIKeyCheckRequestFilter - Container request filter
[INFO ] 2016-04-12 23:29:38.530 [http-bio-8080-exec-1] RestSkolResponseFilter - Container response filter
[INFO ] 2016-04-12 23:29:38.935 [main] RestSkolClientResponseFilter - Client response filter

Conclusion

サンプルのソースコードは以下にあります。
RESTskol
https://github.com/cloudskol/restskol
詳細を知りたい方はご連絡ください(訳注:当然ながら著者にお願いします)。できる限りお答えしたいと考えています。

See Also

フィルタに関する詳細情報は、Jerseyのドキュメントをご覧ください。
Filters and Interceptors
https://jersey.java.net/documentation/latest/filters-and-interceptors.html

About the Author

ThamizharasuはインドのChennaiにすむJava開発者で、特にプログラミング、Java EEに夢中です。また、ThamizharasuはJSRアクティビティ(JSONB)に参加し、現在Madras Java User Groupのリーダーを務めています。自身のブログやTwitterでプログラミングやフレームワークを啓蒙しています。
Cloudskol - Digital School for Learning
http://cloudskol.com/