Posts tagged ‘Java’

Java on Azure Day 2023 開催のお知らせ

皆様この度、日本マイクロソフト株式会社主催の Java 技術カンファレンス「Java on Azure Day 2023」の開催が決まりました。

COVID-19 以降、様々なテクノロジー・カンファレンスがオンライン化され、Java on Azure Day も過去2回はオンラインで開催しました。しかし今回は、完全なオフラインの対面イベントとして開催します。(現時点でオンライン配信の予定はございません)

2年前は当たり前だった対面形式のイベントを思い出し、対面だからこそ得られる体験、そして直接お会いして交流する喜びをもう一度取り戻したいと考えています。

  • 対面形式で行う生セッション (オンラインとは違う生セッションの緊張感)
  • エキスパートと直接会話、相談、問い合わせ、フィードバックができる
  • 新しい人と人との出会いや繋がり、新しいネットワーク作り

現時点では、まだセッションのリストは公開していませんが、徐々にセッションの内容も決まってきています。もうすぐでセッション・リストを公開する予定ですが、豪華なスピーカーの皆様に、各技術の最新動向や詳細についてご登壇いただく予定でございます。純粋な Java の最新技術から、Java on Azure に関する最新動向、さらにはマイクロソフトのパートナー企業の動向まで、たった1日で様々な技術を学べます。

全セッション終了後に、参加者の皆様にご参加いただく事が可能なネットワーク・パーティも用意しています。この2年間ネットワーク経由でしか会えなかった方々と直接お会いできるチャンスの他、初めて対面イベントに参加される方も新しい人脈を作ることのできる貴重な機会です。

ぜひ、この久しぶりに開催するオフラインの対面イベントにお越しください。

どうぞ宜しくお願いします。

寺田

2023年3月3日 at 10:17 午前

Azure Spring Cloud の環境構築方法のご紹介

本ブログエントリは、Microsoft Azure Advent Calendar の 20日目の内容です。
昨日は @mstakaha1113 さんによる 「AzureでIoT系のサービスをサラッと(?)使ってみよう」でした。
明日は @hoisjp さんです。

Pivotal と Microsoft は 2019/10/8 オースティンで開催された SpringOne Platform 2019 Azure Spring Cloud というサービスを発表しました。


(SpringOne 2019 における Azure Spring Cloud の発表内容)

Azure Spring Cloud の特徴


Azure Spring Cloud は Microsoft と Pivotal が共同開発した Spring Cloud アプリケーションの開発・運用に特化した環境で、これを利用した場合、アプリケーションの運用・管理コストを大幅に軽減してくれます。

実際の実行環境は Azure Kubernets Service (AKS) ですが、Kubernetes 環境を全く意識することなく、本来必要となる複雑な管理操作を完全に隠蔽しています。実際 Kubernetes コマンドを直接実行する事はできません。その為、おそらく多くの方が Kubernetes 上で動作している事に気づかないかもしれません。

筆者は Kubernetes による Java アプリケーションの開発・運用も経験をしていますが、Kubernetes 上での開発・運用に比べて、特にインフラ面の管理コストが大幅に削減できると考えています。
通常 Kubernetes 上で Java アプリケーションを動作させるためには、コンテナを強く意識したビルド・プロセス、リリース・プロセスが必要です (コンテナのビルド、コンテナレジストリへの Push、YAML の生成、k8s への適用など)。

# Build the Source Code
$ mvn clean package

# Build the Container Image
$ docker build -t $DOCKER_IMAGE:$VERSION . -f Dockerfile
$ docker tag $DOCKER_IMAGE:$VERSION $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION

# Push the image to Container Registry
$ docker push $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION

# Create and Modify the  Deployment YAML file

# Apply to the Kubernetes
kubectl apply --record -f deployment.yaml

上記以外にも、Kuberenes 自身のメンテナンスやパッチ適用、クラスタ自身の運用管理を行わなければなりません。

しかし、Azure Spring Cloud を利用すると Pivotal Build Service という機能を完全統合しているため、アプリケーション開発者は、ソースコードの開発により集中できるようになります。具体的には開発者はソースコードの開発に集中し、コンテナのビルドや YAML ファイルの生成は不要で、コマンドを2、3回実行するだけで簡単にアプリケーションをデプロイできるようになります。デプロイに関しても最初から Blue-Green デプロイの機能を持つため、最新のビルドは Staging 環境にデプロイし、動作確認したのち、本番環境と切り替えるといった操作も容易に実現できます。
さらに、既存の Azure の Managed Service (現時点では Cosmos DB, MySQL, Redis) とのサービス・バインディングの機能も持つ為、JDBC などの接続情報を容易に作成することもできとても便利です。

上記以外にも多くの機能を持つ Azure Spring Cloud ですが、筆者は比較的小規模〜中規模のマイクロサービス提供をしたい場合、今後有用な選択肢になると考えています。



実際の操作イメージを掴む為、下記のデモ動画をご覧ください。

下記動画のデモ内容


  1. デモアプリケーションのご紹介 (PetStore)
  2. Azure DataBase for MySQL の動作確認
  3. Visual Studio Code を利用した Spring Boot アプリの実装のご紹介
  4. ソースコードのビルド
  5. Azure Spring Cloud アプリの作成
  6. Azure Spring Cloud アプリから Managed MySQL へのバインド
  7. CPU, Memory, インスタンスなどのスケール機能のご紹介
  8. Spring Boot アプリケーションを Azure Spring Cloud アプリへデプロイ
  9. Log Analytics による、アプリケーション・ログの確認
  10. アプリケーションの動作確認
  11. 分散トレーシング機能のご紹介 (Application Insights を利用)
  12. ブルー・グリーン・デプロイ機能の検証
      ソースコード修正→ビルド→ステージング環境へのデプロイ
  13. ステージング・アプリと本番アプリの切り替え
  14. GitHub Actions を利用した CI/CD の構築


(GUI で Azure Spring Cloud と MySQL を接続する環境構築方法)

※ ご注意:本デモ動画は筆者のプレゼン時に操作時の待ち時間を短縮するため、操作待ちの箇所をカット(編集)しています。実際には、本デモ動画よりも所用時間が長くなることをご理解ください。

NeXTSTEP :Azure Spring Cloud 構築の事前準備 (CLI 版)

以降のエントリーでは、上記 GUI (動画ビデオ) で環境構築した内容と、ほぼ同等の内容を CLI (コマンドライン)だけで構築する方法について紹介します。

CLI で環境構築する場合は別途、Log AnalyticsApplication Insights の連携などを自ら行う必要がある為、まずはこれらを作成するところから始めます。

1. Azure へのログインと Spring Cloud 用エクステンションの追加


まず、Azure CLI を利用するために az login コマンドでログインをしましょう。そして次に、Azure Spring Cloud を操作するために、az extension コマンドでエクステンションを追加してください。

$  az login
$  az extension add --name spring-cloud

2. 環境変数の設定


次に、各種リソースの名前などを可変で変更しやすくするため、さらに入力ミスを極力減らす目的で、下記の環境変数を設定してください。

$  export RESOURCE_GROUP=Spring-Cloud-Services
$  export SPRING_CLOUD_SVC_NAME=spring-cloud-services-jp
$  export LOCATION=southeastasia
$  export APP_INSIGHTS_NAME=spring-clouds-appinsights
$  export MYSQL_NAME=mysql4springcloud
$  export MYSQL_USERNAME=terada
$  export MYSQL_PASSWORD=whelp90-OCRs
$  export MYSQL_DB_NAME=petstoredb
$  export SPRING_CLOUD_APP_NAME=petstore-app
$  export SPRING_CLOUD_APP_NEW_VERSION_NAME=petstore-app-new-version

上記の環境変数名のそれぞれの意味を下記に記載します。適宜ご自身の環境に応じて上記の環境変数の値は変更してください。

環境変数名 説明
RESOURCE_GROUP リソースグループ名
SPRING_CLOUD_SVC_NAME Azure Spring Cloud のサービス名
LOCATION リソースを配置するリージョンの場所
APP_INSIGHTS_NAME Application Insights の名前
MYSQL_NAME MySQL の名前
MYSQL_USERNAME MySQL のログイン・ユーザ名
MYSQL_PAAWORD MySQL のユーザ・パスワード
MYSQL_DB_NAME MySQL のデータベース名
SPRING_CLOUD_APP_NAME Azure Spring Cloud のデプロイするアプリケーション名
CLOUD_APP_NEW_VERSION_NAME Azure Spring Cloud のステージング環境に配備するアプリケーション名

3. Azure リソースグループの作成


それでは早速、Azure Spring Cloud をインストールするリソース・グループを作成します。下記のコマンドを実行してください。

$  az group create \
     --location $LOCATION \
     --name $RESOURCE_GROUP

4. Application Insights のインストール


リソース・グループを作成した後、Application Insights をインストールしてください。Application Insights をインストールする事で、Azure Spring Cloud から分散トレーシング機能を利用できるようになります。

$ az resource create \
     --resource-group $RESOURCE_GROUP \
     --resource-type "Microsoft.Insights/components" \
     --name $APP_INSIGHTS_NAME \
     --location $LOCATION \
     --properties '{"Application_Type":"web"}'

上記コマンドを実行した結果が、JSON 形式で出力されます。出力結果の中に、下記のような InstrumentationKey が表示されます。
後の設定で利用するため、この値をコピーして保存しておいてください。

    "InstrumentationKey": "d25f6639-****-****-****-f1b******b41",

5. Log Analytics Workspace のインストール

次に、Log Analytics Workspace をインストールします。下記の defaultValue の値をご自身の環境にあわせて修正して deploy_logworkspacetemplate.json というファイル名で保存してください。

{
"$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "workspaceName": {
        "type": "String",
 		"defaultValue": "workspace-name(適宜名前を修正してください)", 
 		"metadata": {
          "description": "Specifies the name of the workspace."
        }
    },
    "location": {
        "type": "String",
 		"allowedValues": [
 		  "eastus",
                  "southeastasia",
 		  "westus"
 		],
 		"defaultValue": "southeastasia",
 		"metadata": {
 		  "description": "Specifies the location in which to create the workspace."
 		}
    },
    "sku": {
        "type": "String",
 		"allowedValues": [
          "Standalone",
          "PerNode",
 	      "PerGB2018"
        ],
 		"defaultValue": "PerGB2018",
         "metadata": {
        "description": "Specifies the service tier of the workspace: Standalone, PerNode, Per-GB"
 	}
      }
},
"resources": [
    {
        "type": "Microsoft.OperationalInsights/workspaces",
        "name": "[parameters('workspaceName')]",
        "apiVersion": "2015-11-01-preview",
        "location": "[parameters('location')]",
        "properties": {
            "sku": {
                "Name": "[parameters('sku')]"
            },
            "features": {
                "searchVersion": 1
            }
        }
      }
   ]
}

上記の JSON を deploy_logworkspacetemplate.json ファイルに保存したのち、下記のコマンドを実行し Log Analytics の Workspace を作成してください。

$ az group deployment create \
     --resource-group $RESOURCE_GROUP \
     --name spring-cloud-log-analytics-workspace \
     --template-file deploy_logworkspacetemplate.json

6. Azure Database for MySQL のインストールと検証用 DB の作成

最後の準備事項として、下記のコマンドを実行して Azure Database for MySQL をインストールします。

※ ご注意:今回の MySQL の作成方法は検証目的で作成しています。本番環境用ではないためご注意ください。

$ az mysql server create \
     -l $LOCATION \
     -g $RESOURCE_GROUP \
     -n $MYSQL_NAME \
     -u $MYSQL_USERNAME \
     -p $MYSQL_PASSWORD \
     --sku-name GP_Gen5_2

MySQL を作成した直後は Firewall の設定により全てのクライアントからのリクエストを受け付けられなくなっています。そこで Firewall の設定を行い MySQL に接続できるようにします。ここでは、Azure 内の IP アドレス (0.0.0.0) からだけ MySQL に接続をできるようにしています。

※ ご注意:本来は個別に接続可能な IP アドレスを設定してください。

$ az mysql server firewall-rule create \
     -g $RESOURCE_GROUP \
     -s $MYSQL_NAME \
     -n allowfrominternal \
     --start-ip-address 0.0.0.0 \
     --end-ip-address 0.0.0.0

上記の設定で、Azure 内のネットワークからは MySQL に接続できるようになります。たとえばコマンドの実行環境が Cloud Shell などを利用している場合、これで接続ができるようになるかと想定します。

一方、MySQL への接続が外部のネットワークからの場合、0.0.0.0 の部分を変更し個別に接続可能な IP アドレスを指定してください。管理ポータルを利用すると簡単にクライアントの IP アドレスを入手し登録する事もできます。MySQL の「Connection Security」より「Add ClientIP」というボタンを押下するとご自身の IP アドレスが自動的に取得できます。「Save」ボタンを押下してご自身のパソコンなどからアクセスできるように設定してください。


Firewall 設定が完了すると、mysql コマンドを利用して MySQL に接続ができるようになります。下記のコマンドでは日本語入力に対応する設定や、データベースの作成、さらにはテーブル作成やデータをインサートを行なっています。 ( catalog.sql は後述する git clone で入手できます)

$ mysql -u $MYSQL_USERNAME@$MYSQL_NAME \
     -h $MYSQL_NAME.mysql.database.azure.com -p

mysql> show databases;
mysql> show variables like "char%";
mysql> set character_set_database=utf8mb4;
mysql> set character_set_server=utf8mb4;
mysql> create database petstoredb default character set utf8mb4;
mysql> use petstoredb;
mysql> source ./catalog.sql
mysql> select * from item;

CLI 版:Azure Spring Cloud の環境構築

7. Azure Spring Cloud の構築

上記の準備を完了することで、Azure Spring Cloud を便利に利用できるための環境が整いました。そこで、ここから実際に Azure Spring Cloud のサービスを作っていきます。リソース・グループ内に Azure Spring Cloud のサービスを作成してください。

$ az spring-cloud create \
     -n $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

8.Azure Spring Cloud と Log Analytics の連携

Azure Spring Cloud のサービスを作成したのち、Log Analytics WorkSpace と連携するための設定を行ってください。
大変残念ながら、この連携の設定は現時点で Azure 管理ポータルからしかできません。
管理ポータルから Azure Spring Cloud を選択し、「Monitoring」→「Diagnostics settings」を選択してください。

次に「+ Add diagnostic setting」を押下し「Name」に適切な名前を入力してください。

次に「Send to Log Analytics」にチェックし「Subscription」と「Log Analytics workspace」から、準備段階で作成したワークスペース名を選択してください。log, metrics の全項目にチェックし「Save」ボタンを押下してください。

以上で、デプロイしたアプリケーションのログなどが Log Analytics 経由で参照できるようになります。

9. Azure Spring Cloud 上に新規アプリの作成

Azure Spring Cloud のサービスを作成したので、次にサービス内に Spring Boot/Spring Cloud のマイクロサービス・アプリケーションをデプロイします。

$ az spring-cloud app create \
     -n $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

10. MySQL へのバインドを作成

次に、Azure Spring Cloud から MySQL を利用できるようにバインド設定を行います。GUI からバインドを作成する際は、GUI からサブスクリプションを選択しその中に含まれる MySQL を選択することで容易にバインド情報を作成できますが、CLI からバインドを行うためにはまず MySQL の ID を取得しなければなりません。そこで、MySQL の ID を取得するために、下記のコマンドを実行して取得してください。ここで、「“id”: “/subscriptions/***」 ではじまる行の内 「/databases/petstoredb」 より前の部分を MySQL の リソース ID (–resource-id) として利用します。

$ az mysql db show \
     --name $MYSQL_DB_NAME \
     -g $RESOURCE_GROUP \
     --server-name $MYSQL_NAME
{
  "charset": "utf8mb4",
  "collation": "utf8mb4_general_ci",
  "id": "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud/databases/petstoredb",
  "name": "petstoredb",
  "resourceGroup": "Spring-Cloud-Env",
  "type": "Microsoft.DBforMySQL/servers/databases"
}

取得した リソース ID を指定して MySQL のバインドを作成してください。

$ az spring-cloud app binding mysql add \
     --app $SPRING_CLOUD_APP_NAME \
     --resource-id "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud" \
     --database-name $MYSQL_DB_NAME \
     --name "mysql-binding"  \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --username $MYSQL_USERNAME@$MYSQL_NAME \
     --key $MYSQL_PASSWORD

バインドが完了すると Azure Portal 上では下記のような内容を確認できます。

11. サンプル・ソースコードの入手

次に、GitHub よりサンプルのソースコードやデータ、設定ファイルなどを入手してください。

$ git clone https://github.com/yoshioterada/Azure-Spring-Cloud-with-MySQL-Sample

ディレクトリ構成は下記のようになっています。

├── catalog.sql (MySQL に挿入するデータ)
├── deploy_logworkspacetemplate.json (Log Analytics Workspace を作成するためのJSON)
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── yoshio3
    │   │           └── demo
    │   │               ├── CatItemRepository.java (Repository クラス)
    │   │               ├── DemoApplication.java  (Main クラス)
    │   │               ├── Item.java   (JPA Entity クラス)
    │   │               └── PetItemController.java (REST API 実装クラス)
    │   └── resources
    │       ├── AI-Agent.xml
    │       ├── application.properties
    │       ├── log4j2.xml
    │       ├── static
    │       │   ├── css
    │       │   │   ├── new-design.css  (新デザイン)
    │       │   │   └── old-design.css  (旧デザイン)
    │       │   └── images
    │       └── templates
    │           └── index.html   ( Web ページ ThymeLeaf )
    └── test
        └── java
            └── com
                └── yoshio3
                    └── demo
                        └── DemoApplicationTests.java

12. ソースコードのビルドとアプリのデプロイ

入手したソースコードを mvn コマンドでビルドしてください。ビルドが完了すると target ディレクトリ配下に demo-0.0.1-SNAPSHOT.jar ができます。

$ mvn clean package -DskipTests
$ ls target/
classes
demo-0.0.1-SNAPSHOT.jar
demo-0.0.1-SNAPSHOT.jar.original
generated-sources
generated-test-sources
maven-archiver
maven-status
test-classes

ビルドの成果物である demo-0.0.1-SNAPSHOT.jar を Azure Spring Cloud のアプリに対してデプロイします。

この時、事前準備で作成した Application Insights の InstrumentationKey を環境変数 (–env “azure.application-insights.instrumentation-key=) に設定します。これにより Java で実装した Application Insights を動作できます。デプロイには少し時間がかかりますので、しばらくお待ちください。

$ az spring-cloud app deploy \
     -n $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --instance-count 2 --memory 2 \
     --runtime-version Java_8  \
     --env "azure.application-insights.instrumentation-key=********-****-****-****-************" \
     --jar-path ./target/demo-0.0.1-SNAPSHOT.jar --version 1 

13. 外部から接続可能な Public URL を作成

デプロイ時に Public URL の公開オプションを指定せずにデプロイすると下記のように 「Test Endpoint」しか作成されません。

GUI からは「Assign domain」のボタンを押下するだけで容易に Public URL を付加する事ができますが、CLI では下記のコマンドを実行することで Public からアクセス可能な URL を作成できます。

$ az spring-cloud app update \
     -n $SPRING_CLOUD_APP_NAME  \
     -s $SPRING_CLOUD_SVC_NAME  \
     -g $RESOURCE_GROUP \
     --is-public true

作成された URL を確認するために、下記のコマンドを実行してください。”url” の行に URL が表示されます。

$ az spring-cloud app show \
     -n $SPRING_CLOUD_APP_NAME  \
     -s $SPRING_CLOUD_SVC_NAME  \
     -g $RESOURCE_GROUP

    ........ (中略)

    "url": "https://spring-cloud-services-******-********-***.azuremicroservices.io"
  },
  "resourceGroup": "Spring-Cloud-Env",
  "type": "Microsoft.AppPlatform/Spring/apps"
}

14. 動作確認

上記の URL に対して curl コマンド、もしくは Web ブラウザを利用してアクセスしてみてください。

$ curl https://spring-cloud-services-******-********-***.azuremicroservices.io/cats

15. 新バージョンをステージングへデプロイ

上記で一通りアプリケーションのデプロイはできるようになりましたが、さらにアプリケーションを更新して、Blue-Green デプロイの機能も試してみましょう。
アプリケーションの一部を更新して新バージョンを作成します。
ここではわかりやすくするため、デザインを変更してみましょう。index.html を開き、CSS を “old-design.css” から “new-design.css” に修正して、さらに <H1>Hello Java<H1> の行も追加します。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Springboot</title>
    <meta charset="utf-8" />
    <link th:href="@{/css/new-design.css}" rel="stylesheet" type="text/css"></link>
</head>
<body>
<H1>Hello Java</H1>

編集が終わったのち、新しいバージョンを作るために再度 mvn コマンドでソースコードをビルドします。

$ mvn clean package -DskipTests

今回は、アプリケーションを Staging 環境にデプロイするため、下記のコマンドを実行します。–name で新規バージョンにつける名前を指定します。

(ご注意:上記で実行した az spring-cloud app deploy コマンドとは違います)

$ az spring-cloud app deployment create \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --name $SPRING_CLOUD_APP_NEW_VERSION_NAME \
     --version 2 \
     --app $SPRING_CLOUD_APP_NAME \
     --jar-path target/demo-0.0.1-SNAPSHOT.jar

16. 本番とステージングのアプリの入れ替え

上記で、Staging 環境に新しいバージョンがデプロイされましたが、新バージョンを本番環境に適用するためには、旧バージョンから新バージョンにリクエストの振り先を変える必要があります。そこで、振り先を新バージョンに変更するために下記のコマンドを実行してください。

$ az spring-cloud app set-deployment \
     --deployment $SPRING_CLOUD_APP_NEW_VERSION_NAME \
     --name $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

このようにして簡単にバージョンの切り替えも可能です。

17. GitHub Actions による CI/CD

さらに、下記にのような GitHub Actions のワークフローを作成(.github/workflows/main.yaml)することで、GitHub に対してソースコードを Push する度に、ソースコードのビルドからデプロイまでを自動化することもできます。

このワークフローを作成する上で注意したポイントは、Staging にすでにアプリケーションがデプロイされている場合、上書きできずエラーになるため、一旦既存のデプロイ済みのアプリケーションを削除して追加しています。また、ソースコードリビジョンとデプロイ名を一致させるために、環境変数に Git のリビジョン番号などを代入し、それを名前に付加するようにしています。

name: Build and deploy on Azure Spring Cloud

on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Get Year Month Day 
      run: echo ::set-env name=DATE::$(date '+%Y%m%d-%H%M%S')
    - name: Get the Git Revision Number
      run: echo ::set-env name=GIT_SHORT_VERSION::$(git rev-parse --short HEAD)
    - name: Build with Maven
      run: mvn package -DskipTests -Pcloud
    - name: Login to Azure Spring Cloud
      uses: azure/actions/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    - name: Install Azure Spring Cloud extension
      run: az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl
    - name: Get Un Active Service Name 
      run: echo ::set-env name=UNACTIVE_SERVICE::$(az spring-cloud app deployment list -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app  -o json |  jq -c '.[]| [.name, .properties.active]' | grep false | awk -F'["]' '{print $2}')
    - name: Delete UnActive Service 
      run: az spring-cloud app deployment delete -n ${{env.UNACTIVE_SERVICE}} -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app
    - name: Deploy to Azure Spring Cloud
      run: az spring-cloud app deployment create -g Spring-Cloud-Services -s spring-cloud-services-jp --name green-${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --version ${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --app petstore-app --jar-path target/demo-0.0.1-SNAPSHOT.jar

以上、で GUI でデモした内容とほぼ同等の内容を CLI だけで実施しましたが、自動化設定を行う際には本内容が必要になる場合もあるかと想定します。本エントリを少しでもお役に立てていただければ誠に幸いです。

その他の参考情報

Azure Spring Cloud は 2019 年 10 月に発表されたばかりのサービスで、現時点ではまだ Preview 版になります。しかしながら現状でも便利な機能が含まれるため、ぜひ多くの皆様にお試しいただければ誠に幸いです。また、本紙の都合上取り上げなかった機能に関しても下記のようなドキュメントから参照していただく事ができます。

Azure Spring Cloud
Azure Spring Cloud のドキュメント
その他 Spring on Azure に関する情報
Azure Spring Cloud のご紹介

また、Microsoft MVP である@setoazusaさんも、12/19 に「Azure Spring CloudでBlue-Green Deploy」というエントリーを投稿してくださっているようです。こちらも合わせてご覧ください。

さいごに

Azure Spring Cloud の正式リリース(GA) は来年 2020 年の Q2 あたりを予定しています。ご興味のある方はぜひ、お早めにお試しいただきぜひ使用感に関してフィードバックをいただければ誠に幸いです。
より多くのフィードバックをいただき改善していくことでさらに良くなってまいりますので、ぜひ多くの皆様お試しください。
ご協力のほどどうぞよろしくお願いします。

2019年12月20日 at 12:22 午前

最近の Microsoft の Java 事情とインタビュー記事の日本語化

はじめに:最近の Microsoft における Java について


この記事の本題に入る前に、マイクロソフトの Java 活動にとって、とても嬉しい情報を共有いたします。私が入社したのは約2年半前になります。その際私以外にグローバルで Java on Azure に関する啓蒙活動をしている方は一人 (Brian Benz) しかいませんでした。そして私の入社から2年半を経て、この直近数ヶ月の間に 3 人もの Java 関連の方々がマイクロソフトに入社してきてくださいました。その内二人は元オラクルで、一人は、TomEE を提供する Tomitribe から入ってきてくださいました。

Bruno Borges (Developer Advocate)
Jonathan Giles (Developer Advocate)
Theresa Nguyen (Sr. Product Marketing Manager)

この中で、Bruno Borges は去年の JavaOne San Francisco で基調講演にも登壇したブラジル人で、オラクル時代から Java のコミュニティとの関係が強く、様々なカンファレンスなどで登壇しています。一時期ブラジルにいる頃 Java EE エバンジェリストをしていたこともあったように記憶しています。そして彼はマイクロソフトで Java の Developer Advocate チームを率いるという話を聞いています。

また、Jonathan は私同様 Sun Microsystems 出身で、彼はエンジニアリングチームに所属し、JavaOne のコンテンツ選定委員 (CFP で応募されたコンテンツを選定する側) を務めたり、JavaOne の優秀なスピーカーにだけ与えられる称号 Java Rock Star の称号も持っています。さらに昨年 Duke’s Choice Award なども受賞している、ガチの Java エンジニアです。

最後に、Java 専門のプロダクトマネージャとして最近入社されたのは、TomEE (Tomcat をベースとした Java EE コンテナ) を提供する Tomitribeで Vice President を務めていた方が入社してきてくださいました。

いずれの方も、グローバルでは Java 開発者コミュニティーから認知度の高い、Java コミュニティに精通する方ばかりです。Jonathan はJava SDK の API 実装においても Java らしい実装のレビューなどに多大な貢献が期待されますし、Bruno にはグローバルの Java コミュニティに対して、幅広くコンタクトしてくれると思いますので、ますます Java on Azure の拡大に期待が持てる、そんなハイアリングとなりました。前述した Brian と共に、この 4 名と一緒に Java on Azure の啓蒙活動を続けていく事をとても楽しみにしています。

下記のエントリの内容は、先日上記の Jonathan Giles からインタビューを受けましたので、インタビュー内容 (オリジナルの英語) を日本語化した内容を記載します。

Jonathan Giles からのインタビューの日本語訳


今日から Azure で Java を利用、または開発している方々とのインタビューシリーズを開始しています。 すでに他にも何名ものインタビューを企画しているため、これをシリーズ化したいと考えています。私からインタビューを受けたい方は、私にご連絡ください。

最初のインタビューは、Java チャンピオンであり、JUG リーダーでもある寺田 佳央さんです。彼は日本マイクロソフトで働く Java エバンジェリストで、私と彼は Sun Microsystems と Oracle で共に働いていたので、以前から彼の事を知っていました。 寺田さんは Java に長くそして深く関わっていますので、彼とのインタビューを喜んでいます。どうぞ読者の皆様もお楽しみください。

こんにちは寺田さん – みなさんに自己紹介をしていただけないでしょうか?


このような素晴らしい機会を与えていただきありがとうございます。 私は 2015年7月から日本 マイクロソフト でJava Evangelist として働いています。また Japan Java Users Group の幹事メンバーの一人でもあります。

マイクロソフトに入社する前は、日本 Sun Microsystems で GlassFish エバンジェリストとして働いていました。 Oracle による Sun の買収後、日本 Oracle で Java/Java EE のエバンジェリストとして5年間働いていました。 日本 Oracle での私の仕事は、JavaOne Tokyo、Java Day Day Tokyo、Java ユーザーズ・グループのイベントなど、日本の多くの Java 関連のイベントで、企画、運営・管理、登壇などをしていました。そして、マイクロソフト入社後 2016 年 7 月、私は Java チャンピオンになりました。

あなたはしばらくの間マイクロソフトで勤めているんですね。私はちょうど 12 月にマイクロソフトに入社したばかりなので、私よりもとても長いですね。私たちは二人とも比較的にた経歴を持っています。私もSun Microsystems と Oracle で勤めていましたが、私は開発のエンジニアリング・チームに所属していました。
私はあなたにマイクロソフトにおける Java の印象について聞きたいです。そして Java に関して時間がたつにつれてマイクロソフトがどのように変わったのか教えていただけないでしょうか?

マイクロソフト入社前、私の経歴が Unix と Java に携わる事が多かったため、マイクロソフトで働くことを全く想像していませんでした。しかし、現在マイクロソフトはクラウドプラットフォームの企業になっています。そこで .NET や Windows、Office 製品だけでなく、Unix やその他のプログラミング言語も強く推進しています。 すでに Azure のシステムの 30% 以上が Linux 上で稼働しており、これらのシステムでは多くの顧客が Azure 上で Java を使用しています 。 たとえば、 Pivotal Cloud FoundryService FarbricOpenShiftKubernetes などがあります。Java 開発者が Azure でサービスを実行するための選択肢はたくさんあります 。

日本を拠点とするマイクロソフトのJavaエバンジェリストとしての日々どのような事をされているのですか?


最近は、Java のエバンジェリストとして、お客様のために多くの HackFest を開催しています。HackFest ではお客様が実際にビジネスをされている上でかかえる課題について直接改善してまいります。 お客様と NDA を締結した上で、お客様のソースコードにアクセスし、改善のためのアドバイスや直接ソースコードを編集する事もあります。いままでの経験を活かして、Azure におけるシステム運用方法や、アーキテクチャ設計に関するアドバイスなどを行います。

たとえば、最近ハックフェストを実施したとあるお客様では、オンプレミスで運用されている既存の Java Web アプリケーションを Azure 上のコンテナに移行したいと考えていらっしゃいました。当初、お客様は Kubernetes についてよくご存知ではなかったのですが、 HackFest を通じて Azure Container Service (AKS) の構築方法や、操作方法について情報を提供し、結果として、わずか5日間で既存のシステムを AKS に移行することができました。2日間で Lift & Shift し、残りの 3 日間で、ソースコードに手を加え、例えば Serverless の Azure Functions 等も試され、アプリケーションのモダナイズを行いました。HackFest では開発の視点だけでなく、運用的な観点からも助言しています。 その結果、そのお客様はこの HackFest の成果に非常に満足されていました。

この HackFest は、Azure をご利用される世界中の Java 開発者も利用できます。 読者のみなさまの中で Azure 上で Java を利用し、それを有効活用したい、そのために私のような Java エバンジェリストと緊密に会話したい場合は、私に連絡するか、各国に存在するエバンジェリストに HackFest についてお問い合わせください(※ 実際には HackFest を実施するためには利用可能なテクノロジー領域に条件があります)。 また私自身、マイクロソフトのグローバル組織に所属していますので、HackFest への参加のご要望をいただいた場合、国を問わず、北米、ヨーロッパ、ブラジルなど世界中のさまざまな場所に参加できるかもしれません。

Azure は Java(または Kotlin、Scala などの JVM 上の言語)を基盤とする開発者や組織に適していますか?


はい、Azure は Java 開発者にとって適しています。多くのサービスで Java SDK が用意され、開発は頻繁に行われています。 また一部のサービスでは SDK が存在しないものもありますが、Azure では多くのサービスが RESTful インターフェイスを提供しているため、任意のプログラミング言語からこれらのサービスにアクセスできるようになっています。たとえば、Office 365 をご利用されている場合は、REST 呼び出しで Office 365 を操作することも可能です。

おそらく、マイクロソフトであなたはいくつかのクールなデモやチュートリアルを時間をかけて作成してきたと思います。読者が興味をもちそうなプロジェクトや GitHub のレポジトリについてご紹介いただけないでしょうか?

すべてのデモやプロジェクトを公開しているわけではありませんが、私は GitHub リポジトリに多くのデモとサンプルをアップロードしています。

最新のデモには、多くの面白い最新技術を含んでいます(スライドはこちら)。 1回のデモに含めた Azure の技術要素として下記を含んでいます。

Azure の Bot Framework を利用して Slack からメッセージの送受信を行うチャット・ボットを作成しています。このチャット・ボットの処理の実装には、Serverless の「Azure Functions for Java」を利用しています。Slack から k8s の「アカウントサービスのポッド数を増やしてください」という質問を投げかけると、Azure Functions は LUIS を呼び出して、文を解析しどの意図(入力内容を判定)が最も適切かを判断します。その結果、Kubernetes 上で稼働するアカウントサービスのポッド数を増やします。

仮に「顧客サービスのポッド数を減らしてください」と入力すると、Kubernetes の「顧客サービス」は減少します。 このように、私はチャットボットから Azure のKubernetes を操作できるようにしています。

さらに Microsoft Translator のデモも行なっています。上記のチャット・ボットではテキストでの入力を行いましたが、このデモでは音声入力を行います。 たとえば、Microsoft Translator に対して「アカウントサービスのポッド数を増やしてください」または「顧客サービスのポッド数を減らしてください」と言葉で語りかけると、Azure 上の Kubernetes のポッド数が増減します。

上記のすべてを Java で実装し、Java 開発者が利用できる多くの Azure サービスを利用しています。

エバンジェリスト(または私のようなクラウド・デベロッパー・アドボケイト)は、開発者や利用者などとの対外的な会話と、社内開発チームとの会話のバランスをとることが重要です。 私はすべてのデベロッパー・アドボケイトがこの範囲で異なる優先順位を持っていると思います。私自身は、ドキュメント、APIの改善など、開発者の経験を向上させることに重点を置いています。あなたは、この範囲においてどこに優先順位を置いて仕事をなさっていますか?

私は開発者やお客様と直接会話をするのが好きです。もちろん、私は API を変更したりドキュメントを改善する必要がある場所を見つけることが多いので、必要に応じてやっています。ただ、まだ多くのお客様が CI/CD、マイクロサービス、Cognitive ServicesAzure FunctionsMicrosoft TranslatorIoTPowerBI などの利点についてご存知ないので、これらの技術を Java 開発者の皆様やお客様にその利点や利用方法や実装方法について紹介していきたいです。

昨今 Azure は非常に多くのサービスを提供し、その多くは本当に素晴らしいサービスです。 あなたが今より詳細に調査していることは特にありますか、全体的にあなたの好きなサービスは何ですか?

これはとても難しい質問です。なぜなら、マイクロソフトの技術と世界的な技術トレンドは以前と比べとても速く変化しているためです。 ちょうど今私が上で紹介したデモンストレーションは、現時点で私が好きな、そしてお勧めの技術から構成しています しかし、上記に取り上げた Kubernetes だけでなく、Pivotal Cloud FoundryOpenshift も非常に面白いです。

特に、お客様が巨大なデータセンターを所有されている場合は、 Azure Stack の利用をご検討いただくことをお勧めします。Pivotal Cloud Foundry も Azure Stack 上で動作します。運用における管理コストを削減したい場合、Azure Stack は選択肢の 1 つになります。

マイクロソフトは歴史的に Java の非サポートで知られていますが、最近はマイクロソフトが真にオープンソースに舵をきり大きな進歩を遂げたと思います。Java エンジニアと会話をしてAzure を紹介するとき、参加者の皆様の印象は如何でしょうか?

約2年半前、私は日本マイクロソフトに加わりました。当時すでに一部の開発者やエンジニアの中で、マイクロソフトの変化に気づいている方がいらっしゃいました。 しかしこの2年間で、私はマイクロソフトの印象がさらに変化していると感じています。私はお客様やコミュニティのメンバーとコミュニケーションをとるとき、ほとんどの人から肯定的なフィードバックをいただいています。

特に、AI 技術の観点でマイクロソフトについて多くの肯定的なフィードバックをいただいています。 build 2016 のカンファレンスで AI プロトタイプを発表したSatya Nadella の発表を見たとき、私は本当に感銘を受け、私の周りのすべてのJava開発者にビデオを共有しました。このビデオは、我々が将来を想像すると、エンジニアが世界を変える方法を示しました。本当に素晴らしい内容でした!Cognitive Services のすべてを Java アプリケーションから利用できることも重要です。

初めて他のエンジニアに Cognitive Services のデモンストレーションを行った際、多くの開発者が私もこれを試したいと言いました。 私はこの技術が世界を変えることができると思っていましたが、この技術が会社の将来をも変えることができると私は考えました。

インタビューのお時間をとっていただきありがとうございました。最後に、他にコミュニティの皆様にメッセージがあれば頂けないでしょうか?

私は過去2年間、マイクロソフトで働いており、多くのツール、テクノロジ、サービスが Java 開発者にとって利用できることを理解してきました。たとえばプログラマの皆様にとっては、Visual Studio Team Services(VSTS)はソースコード管理や運用を行うために、ぜひご利用いただきたいサービスです。CI/CD におけるビルドとデプロイのパイプラインを使用することができます。もちろん開発チームに応じて Jenkins のような他の CI/CDツール をご利用されたい場合もあるでしょう、この場合にも、VSTSからそれらのツールにアクセスできるようになっています。

またコンテナ技術をご利用されたい場合は、Web App for Container, Azure Container Service(AKS)Azure Container Instance(ACI)Pivotal Cloud FoundryOpenShift などのご利用のニーズに応じてコンテナ環境を構築できます。さらに、IoT、BigData、NoSQLなどをご利用したい場合は、マイクロソフトは、それらのサービスを提供しています。

私は、エンジニアが想像することができれば、エンジニアが世界を変えることができると信じています!そして私は、そのような素晴らしい Java の開発者の皆様とともに時間を過ごしたいと思います。 私は Java が大好きです!

2018年2月22日 at 8:30 午前 1件のコメント

Azure Functions for Java Preview Release

この度、San Francisco で開催された JavaOne 2017 で、Microsoft は Azure Functions の Java 版を Preview 版として公開しました。本エントリーでは、ちょとだけ試してみましたので、その内容をご紹介します。

Mac OS/X の環境で Azure Functions を動作させるためには下記の環境が必要です。環境が整っていない場合、インストール・実行が正しくできない場合があります。必要な環境にご注意ください。

Azure Functions のローカル実行環境のインストール
Local Execution Environment Install

$ sudo npm i -g azure-functions-core-tools@core --unsafe-perm
Password:

> azure-functions-core-tools@2.0.1-beta.18 uninstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/uninstall.js

deleting /Users/tyoshio2002/.azurefunctions/bin
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/func -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azfun -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azurefunctions -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js

> azure-functions-core-tools@2.0.1-beta.18 postinstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/install.js

+ azure-functions-core-tools@2.0.1-beta.18
updated 1 package in 112.93s

次に、Maven コマンドで Azure Functions のプロジェクトを作成します。

$ mvn archetype:generate -DgroupId=com.yoshio3  -DinteractiveMode=false  -DartifactId=AzureFunctionTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2
[INFO] Parameter: package, Value: com.yoshio3
[INFO] Parameter: groupId, Value: com.yoshio3
[INFO] Parameter: artifactId, Value: AzureFunctionTest
[INFO] Parameter: packageName, Value: com.yoshio3
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2/AzureFunctionTest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.258 s
[INFO] Finished at: 2017-10-28T13:24:07+09:00
[INFO] Final Memory: 15M/223M
[INFO] ------------------------------------------------------------------------

プロンプト無しで Maven プロジェクトを作成したい場合の実行例:

mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DgroupId=com.yoshio3 -DartifactId=Java-Azure-Functions -Dversion=1.0-SNAPSHOT -Dpackage=com.yoshio3 -DappName=Java-Azure-Functions -DappRegion=westus2

デフォルトで Hello World のコードが生成されます。

package yoshio3.com;

import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.ExecutionContext;
import java.util.logging.Level;

/**
 * Hello function with HTTP Trigger.
 */
public class Function {
    @FunctionName("hello")
    public String hello(@HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) String req,
                        ExecutionContext context) {
        return String.format("Hello, %s!", req);
    }

このサンプル・コードをビルドします。

$ mvn clean package
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ azure-functions-test ---
[INFO] Deleting /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ azure-functions-test ---
[INFO] Surefire report directory: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Running yoshio3.com.FunctionTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ azure-functions-test ---
[INFO] Building jar: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions-test-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:package (package-functions) @ azure-functions-test ---
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
[INFO] 
[INFO] Step 1 of 6: Searching for Azure Function entry points
[INFO] Reflections took 101 ms to scan 1 urls, producing 1 keys and 2 values 
[INFO] 2 Azure Function entry point(s) found.
[INFO] 
[INFO] Step 2 of 6: Generating Azure Function configurations
[INFO] Generation done.
[INFO] 
[INFO] Step 3 of 6: Validating generated configurations
[INFO] Validation done.
[INFO] 
[INFO] Step 4 of 6: Saving empty host.json
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json
[INFO] 
[INFO] Step 5 of 6: Saving configurations to function.json
[INFO] Starting processing function: Timer
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/Timer/function.json
[INFO] Starting processing function: hello
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/hello/function.json
[INFO] 
[INFO] Step 6 of 6: Copying JARs to staging directory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Copied successfully.
[INFO] Successfully built Azure Functions.
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:copy-resources (copy-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.243 s
[INFO] Finished at: 2017-10-06T12:01:07-07:00
[INFO] Final Memory: 39M/564M
[INFO] ------------------------------------------------------------------------

ローカルで実行します。

$ mvn azure-functions:run
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:run (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 09:13, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 09:14, 1: Configuration file has been successfully found as resource
[INFO] Azure Functions stage directory found at: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Azure Functions Core Tools found.
[INFO] Starting running Azure Functions...

                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

[2017/10/06 16:14:30] Reading host configuration file '/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json'
[2017/10/06 16:14:31] Host configuration file read:
[2017/10/06 16:14:31] {
[2017/10/06 16:14:31] }
[2017/10/06 16:14:31] 
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Start Process: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java  -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 "/Users/tyoshio2002/.azurefunctions/bin/workers/Java/azure-functions-java-worker.jar" --host 127.0.0.1 --port 56034 --workerId c26685f3-cbd5-4bff-bbea-d3e9e00d08ed --requestId 4270cbeb-361f-422a-872a-c0ec946199c5
[2017/10/06 16:14:32] Generating 1 job function(s)
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[2017/10/06 16:14:32] Starting Host (HostId=yoshionomacbookpro-1392184404, Version=2.0.11308.0, ProcessId=65522, Debug=False, Attempt=0)
Listening on http://localhost:7071/
Hit CTRL-C to exit...

Http Functions:

	hello: http://localhost:7071/api/hello

info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Listening for transport dt_socket at address: 5005
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Microsoft Azure Functions Java Runtime [build 1.1-SNAPSHOT]
[2017/10/06 16:14:32] Found the following functions:
[2017/10/06 16:14:32] Host.Functions.hello
[2017/10/06 16:14:32] 
[2017/10/06 16:14:32] Job host started
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      [INFO] {com.microsoft.azure.webjobs.script.handler.MessageHandler.handle}: message generated by "class com.microsoft.azure.webjobs.script.rpc.messages.StartStream$Builder"
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Worker initialized
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      94978bb8-3f21-47c7-961d-5d9caecc0136 - "/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/azure-functions-test-1.0-SNAPSHOT.jar"::"yoshio3.com.Function.hello" loaded
[2017/10/06 16:16:27] Function started (Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Function "94978bb8-3f21-47c7-961d-5d9caecc0136" executed
[2017/10/06 16:16:27] Function completed (Success, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce, Duration=444ms)
[2017/10/06 16:16:27] Executed 'Functions.hello' (Succeeded, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)

起動が完了したら、curl コマンドなどでアクセスしてみてください。

$ curl http://localhost:7071/api/hello -d "Java World"
Hello, Java World!

上記は、簡単な Hello World ですが他のトリガーを利用する場合は、下記のように local.settings.json ファイルに、AzureWebJobsStorage のアクセスキーを入力する必要があります。どうご注意ください。

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=fileup;AccountKey=*******;EndpointSuffix=core.windows.net",
    "AzureWebJobsDashboard": ""
  }
}

たとえば、タイマーをトリガーに何らかの処理をしたい場合、下記のようなコードを書きます。

    @FunctionName("Timer")
    public String functionHandler(@TimerTrigger(name = "timerInfo", schedule = "*/30 * * * * *") String timerInfo, final ExecutionContext executionContext) {
        executionContext.getLogger().log(Level.INFO, "Timer trigger input: {0}", timerInfo);
        return "From timer: \"" + timerInfo + "\"";
    } 

ローカルで検証が終わったので、Microsoft Azure へデプロイします。

$ mvn azure-functions:deploy
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:deploy (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
[INFO] Starting deploying to Function App function-test-java...
[INFO] Authenticate with Azure CLI 2.0
[INFO] --> POST https://login.microsoftonline.com/********-****-****-****-**********/oauth2/token
[INFO] 1178-byte body:
client_id=04b07795*******
[INFO] --> END POST
[INFO] <-- 200 OK https://login.microsoftonline.com/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/token (833 ms, 2907-byte body)
[INFO] Cache-Control: no-cache, no-store
[INFO] Content-Length: 2907
[INFO] Content-Type: application/json; charset=utf-8
[INFO] Date: Fri, 06 Oct 2017 19:31:31 GMT
[INFO] Expires: -1
[INFO] P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
[INFO] Pragma: no-cache
[INFO] Server: Microsoft-IIS/8.5
[INFO] Set-Cookie: esctx=AQABAAAAAAABlDrqfEFlSaui6xnRjX5E6ugjSSC5bAEQSJ1V_VvTv2HB9o-5-******;; domain=.login.microsoftonline.com; path=/; secure; HttpOnly, x-ms-gateway-slice=004; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
[INFO] Strict-Transport-Security: max-age=31536000; includeSubDomains
[INFO] X-Content-Type-Options: nosniff
[INFO] x-ms-request-id: 4813f784-046f-414e-8d9e-29a4e43e3c00
[INFO] X-Powered-By: ASP.NET
[INFO] 2907-byte body:
{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3599","ext_expires_in":"0","expires_on":"1507321891","not_before":"1507317991","resource":"https://management.core.windows.net/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhIQnlLVS0wRHFBcU1aaDZaRlBkMlZXYU90ZyIsImtpZCI6IkhIQnlLVS*********
[INFO] <-- END HTTP
[INFO] Target Function App does not exist. Creating a new Function App ...
[INFO] Successfully created Function App function-test-java
[INFO] 
[INFO] Step 1 of 4: Creating ZIP package...
[INFO] Successfully saved ZIP package at /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java.zip
[INFO] 
[INFO] Step 2 of 4: Uploading ZIP package to Azure Storage...
[INFO] Successfully uploaded ZIP package to https://d0a43c4e4c4a435d9f25.blob.core.windows.net/java-functions-deployment-packages/function-test-java.20171006123210784.zip
[INFO] 
[INFO] Step 3 of 4: Deploying Function App with package...
[INFO] Azure Resource Manager read/write per hour limit reached. Will retry in: 5 seconds
[INFO] Successfully deployed Function App with package.
[INFO] 
[INFO] Step 4 of 4: Deleting deployment package from Azure Storage...
[INFO] Successfully deleted deployment package function-test-java.20171006123210784.zip
[INFO] Successfully deployed Function App at https://function-test-java.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:01 min
[INFO] Finished at: 2017-10-06T12:33:00-07:00
[INFO] Final Memory: 42M/488M
[INFO] ------------------------------------------------------------------------

デプロイが完了したのち、Azure の Portal 画面を確認して正しくデプロイされている事、そしてアクセスするための URL を確認します。

Azure にデプロイした URL へアクセスしてみます。

$ curl https://function-test-java.azurewebsites.net/api/hello -d "Java World"
Hello, Java World!

ローカルで実行したのと同様に、正しく実行する事ができました。
より詳細な情報は、Azure Functions Java developer guide
に記載されています。

ぜひ、みなさまお試しください!!

2017年10月7日 at 4:46 午前

2017年度版:Java サーバの利用状況のアンケートのお願い

サーバ・サイド Java の開発・運用に携わっていらっしゃる方に質問がございます。現在、サーバ・サイドのJava 開発環境もしくは本番環境で、どのサーバ (Webコンテナ、アプリケーション・サーバ)をご利用いただいているか理解したいと考えております。そこで、大変恐れ入りますが下記のアンケートにご協力いただけないでしょうか。

昨年 (2016年) は、669名の方にご協力いただきました。ご協力誠にありがとうございました。
2016年版:Java サーバ利用状況アンケート結果の公開

今年のアンケートの締め切りは 7/12(水) 18:00 までとさせていただきます。
昨年も1週間のアンケート期間だったため、公平をきすためにも同じ1週間で実施いたします。また、速報は同日開催する「関ジャバのナイトセミナー」で発表します。

複数ご回答いただいてもかまいません。個人情報は取得しませんし、この結果を売買に使うことも決してありません。利用状況について正しく把握することで、現在のサーバ・サイドのトレンドについて理解できるとともに、結果を本ブログで公開することで他の皆様にも有用な情報になるのではないかと想定しております。締め切り後に、再利用可能な結果(順位、投票数、パーセント)として公開します。

また、上記で「組み込みコンテナ(実行可能 jar)に移行済み」と回答した方のうち、どのフレームワークへ移行したかを教えていただけないでしょうか?移行していない場合は、下記にはお答えいただかなくて結構です。

本データは、日本全体における利用状況の実データにはならないと思いますし、市場調査会社がだす結果とは異なると思いますが、それでも Java コミュニティ参加者や、本ブログをご覧いただいている皆様の近辺のデータを集めることができるのではないかと想定しております。また、昨年のデータとの比較もできるかと思います。この1年で日本の状況は変わっているのでしょうか?とても楽しみにしています。

※ これは#てらだよしお 個人的なお願い事であり、所属企業や団体からの問い合わせではないことをご理解いただければ誠に幸いです。

2017年7月5日 at 8:00 午前

皆んな大好き Excel !! Excel REST API Java サンプルアプリケーション

2016 年 8 月初旬 Office 365 の Excel REST API が正式にリリースしました。
アナウンス:「Announcing the general availability of the Microsoft Excel API to expand the power of Office 365

上記により、Graph API と呼ばれる REST API を使用して、Office 365 の OneDrive に存在する Excel ファイルを操作できるようになります。
Excel 操作用の Graph API

※ REST API で利用できるため、プログラミング言語を問わず任意の言語で操作ができるようになっていますので、Java 以外のプログラミング言語でもどうぞお試しください。

今回、私は上記の REST API を利用して Java のサンプル・コードを作成しました。
サンプル・コード:「GitHub : Office-365-Excel-REST-API-for-Java」
またサンプル・コードがどのように動作するのかをわかりやすくするため、サンプル・アプリケーションのデモ動画も撮りましたので、どうぞ下記のデモ動画もご覧ください。

今回作成したサンプル・アプリケーションは Java EE 7 のアプリケーションとして作成しました。そこで、Java EE 準拠のアプリケーション・サーバであれば、いずれの環境でも動作します。私は、Payara Server 4.1.1.162 (GlassFish) で動作確認をしていますが、少しの変更を行うだけで、アプリケーション・サーバではなく、Servlet Container(Tomcat/Jetty) でも動かすことができます。

追記:
Office 365 を無料でお試しいただく為の設定手順 (ステップ・バイ・ステップの画面ダンプ) や Tomcat 用の設定方法に関しては 「GitHub : README.md もしくは README-4-Tomcat.md」に記載しています。

アプリケーションの実装の詳細
このサンプル・アプリケーションは Java EE 7 で実装しています。

まず、GUI (フロントエンド) のビュー・テクノロジーとして JavaServer Faces (PirmeFaces) を利用しています。しかし、フロント技術はこのサンプルでは重要でありません。慣れ親しんだフロント・テクノロジーをご利用ください。

実際の、Excel 操作の要は、com.yoshio3.restclient パッケージ配下で実装しています。
特に com.yoshio3.restclient.services サービスが重要で、Excel REST API で用意されている各種機能(REST 呼び出し)をラッピングしたメソッドを実装しています。
また、Excel REST API のリクエスト・ボディ、もしくはレスポンス・ボディに含む JSON のデータは、すべて com.yoshio3.restclient.jaxb.entities パッケージ配下のクラスにマッピングしています。例えば、Excel のワーク・シートやテーブルを取得した際に取得できる情報はすべて com.yoshio3.restclient.jaxb.entities.excel パッケージに含まれています。このマッピングした Java オブジェクトを操作することで、実際の JSON データを意識せずにプログラムができます。

また、Office 365 に接続するためには、Azure Active Directory で認証を行う必要があります。今までは、「Microsoft Azure Active Directory Authentication Library (ADAL) for Java」を利用してきました。しかし、今回 Azure AD で認証を行うために必要最低限の軽量な Servlet Filter (AzureADAuthServletFilter) を独自に実装しました。

Servlet Filter : AzureADAuthServletFilter.java
アクセス・トークン:AccessToken.java
Auth サービス: OAuth2Service.java

まだ一部実装が足りない部分(TODO)はありますが、Azure AD の認証のフローをご理解頂く上で、このサーブレット・フィルタはご参考いただけるのではないかと思います。また、Servlet Filter なので認可はできませんが、Tomcat/Jetty のような Servlet Container でも動作します。認可が必要な方は、以前作成した「Azure AD 認証・認可サンプル」をご参照ください。

Java ユーザの皆様も、Office 365 の OneDrive に存在する Excel ファイルを直接 Java から操作してみませんか?

Have fan Excel with Java !!

2016年8月31日 at 8:00 午前

Microsoft Azure IoT Hub with Java

Microsoft Azure の IoT Hub が Java でも利用できるということで試しました。Microsoft Azure の IoT Hub に関する詳細な説明はこちらをご参照ください。

Azure IoT Hub とは
IoT Hub と Event Hubs の比較

私がはまったのは1点で、「Device ID」をどうやって作るかという点でしたが、そこも下記にくわしく手順を記載します。

1. 最初に、Microsoft Azure の管理ポータルにアクセスし、新規から IoT Hub を作成します。
  Microsoft Azure の管理ポータルへアクセス

「参照 >」から「IoT Hub プレビュー」を選択します。

「新規」ボタンを押下すると、下記の画面が表示されますので「Name」に名前を入力し、利用する規模に応じて価格やプランを選択してください。

次に、リソース・グループ名を新規に作成し、ロケーションとして「東アジア」を選択し最後に「作成」ボタンを押下してください。

2. Windows 環境で DeviceExplorer をインストール
Azure IoT SDKsのサイトにアクセスし、DeviceExplorer のインストーラを入手してください。Windows 環境用に用意されている「SetupDeviceExplorer.msi」をダウンロードします (このリンクから入手できる版は 2015-11-30 版です、最新版はAzure IoT SDKsから入手してください)。

ファイルを入手後、入手したファイル(インストーラ)をクリックしてインストーラを起動してください。

次に、インストール場所や利用者を指定し「Next >」ボタンを押下します。

確認画面が表示されますので、「Next>」ボタンを押下します。

ユーザアカウント制御の確認画面が表示されますので、「はい(Y)」を押下してインストールをはじめてください。

インストールが完了すると下記の画面が表示されますので「Close」ボタンを押下してください。

インストールが完了すると Windows 10 の場合、メニューから「最新追加されたもの」の欄から実行できることを確認できます。

3. Device Explorer から Device ID と接続用文字列を作成

メニューから DeviceExplorer を起動してください。起動すると下記の画面が表示されます。

ここで、DeviceExplorer から Microsoft Azure の IoT Hub に接続し操作できるように、Azure 上で接続用の情報を確認し取得します。Microsoft Azure の管理ポータルに接続し、作成した IoT Hub のサービスを参照してください。

IoT Hub サービスを参照すると「Settings」というボタンがあるので押下します。

「Settings」ボタンを押下すると「Shared access policies」のリンクがあるので選択してください。

「Shared access policies」の POLICY から「iothubowner」を選択してください。
選択すると「Connection string—primary key」の欄があります。記載内容をクリップ・ボードへコピーできるようにコピー・ボタンが右端に用意されていますので、これをクリックしてコピーしてください。

クリップ・ボードへ文字列がコピーされると「コピー済み」と表示されます。

文字列をコピーしたのち、Device Explorer に戻り、文字列を貼り付けてください。

文字列をコピーしたのち、「Update」ボタンを押下してください。正しく設定が更新されると「Settings updated successfully」という画面が表示されます。

続いて、Device Explorer のタブから「Management」を選択し「Create」ボタンを押下してください。

ボタンを押すと、下記の画面が表示されますので、「Device ID」欄にデバイス固有の名前を入力し「Create」ボタンを押下してください。(Primary Key,Secondary Keyは自動的にキーの文字列が入力されています。)

ボタンを押下すると下記の画面が表示されますので「Done」ボタンを押下してください。

デバイス ID を作成すると一覧に1行が追加されます。ここで、追加された行をマウスで右クリックしてください。すると、選択メニューが表示されますので、「Copy connection string for selected device」を選択して接続用の文字列をコピーしてください。

コピーして作成された、接続用の文字列の例は下記のような文字列です。この文字列は後からのプログラム内で記述する必要があります。そこで、この文字列を一時的にテキストファイルなどに保管しておいてください。

HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************

※ 補足:Device Explorer の詳しい使い方は下記に記載されていますので、こちらもご確認ください。
How to use Device Explorer for IoT Hub devices

4. Microsoft Azure IoT Hub サンプルコードの作成

それでは、プログラムを組むための環境設定や準備が整いましたので、実際にプログラムを書いてみましょう。本サンプル・アプリケーションは、基本的にこちらに記載されている内容を実際に動作させた物です。
※ 本記事の目的は、IoT Hub の設定方法を説明するのがメインのため、コードの詳細にまでは触れず、MS 社員のどなたかが作成したコードをそのまま記載しています。しかし、この一連の設定ができると色々と面白いことができるので、まずは基本的な手順を理解してください。

Maven の pom ファイルは下記のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yoshio3</groupId>
    <artifactId>Azure-IoT-Hub</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure.iothub-java-client</groupId>
            <artifactId>iothub-java-client</artifactId>
            <version>1.0.0-preview.7</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>${project.artifactId}-${project.version}</finalName>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.yoshio3.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Java のサンプル・ソースコードはこちらになります。

package com.yoshio3;

import com.microsoft.azure.iothub.DeviceClient;
import com.microsoft.azure.iothub.IotHubClientProtocol;
import com.microsoft.azure.iothub.Message;
import com.microsoft.azure.iothub.IotHubStatusCode;
import com.microsoft.azure.iothub.IotHubEventCallback;
import com.microsoft.azure.iothub.IotHubMessageResult;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Scanner;


public class Main {

    protected static class EventCallback
            implements IotHubEventCallback {

        @Override
        public void execute(IotHubStatusCode status, Object context) {
            Integer i = (Integer) context;
            System.out.println("IoT Hub responded to message " + i.toString()
                    + " with status " + status.name());
        }
    }

    protected static class MessageCallback
            implements com.microsoft.azure.iothub.MessageCallback {

        @Override
        public IotHubMessageResult execute(Message msg,
                Object context) {
            System.out.println(
                    "Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));

            return IotHubMessageResult.COMPLETE;
        }
    }

    public static void main(String... args) throws IOException, URISyntaxException {
        //Device Explorer で作成してコピーした接続用の文字列をここに記載
        String connString = "HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************";


        IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS;

        DeviceClient client = new DeviceClient(connString, protocol);

        MessageCallback messageCallback = new MessageCallback();
        client.setMessageCallback(messageCallback, null);
        client.open();

        for (int i = 0; i < 10; ++i) {
            String msgStr = "Event Message " + Integer.toString(i);
            try {
                Message msg = new Message(msgStr);
                msg.setProperty("messageCount", Integer.toString(i));
                System.out.println(msgStr);
                EventCallback eventCallback = new EventCallback();
                client.sendEventAsync(msg, eventCallback, i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println("Press any key to exit...");
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();

        client.close();
    }
}

念のため、Maven プロジェクトは Git Hub にもあげておきます。上記をベースに、Microsoft Azure IoT Hub Java Client 1.0.0-preview.7 API を参照しながらプログラムを作ってみてください。

5. デバイスでプログラム実行
プログラムをビルド後、下記のコマンドを IoT デバイス上で実行してください。

# java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar

実行すると、下記のようなメッセージが表示されます。

$ java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass
警告: unable to load org.bouncycastle.openssl.PEMReader
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass
警告: unable to load org.bouncycastle.openssl.PasswordFinder
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory
警告: unable to load bouncycastle provider
Event Message 0
Event Message 1
Event Message 2
Event Message 3
Event Message 4
Event Message 5
Event Message 6
Event Message 7
Event Message 8
Event Message 9
Press any key to exit…
IoT Hub responded to message 5 with status OK_EMPTY
IoT Hub responded to message 4 with status OK_EMPTY
IoT Hub responded to message 7 with status OK_EMPTY
IoT Hub responded to message 2 with status OK_EMPTY
IoT Hub responded to message 3 with status OK_EMPTY
IoT Hub responded to message 6 with status OK_EMPTY
IoT Hub responded to message 1 with status OK_EMPTY
IoT Hub responded to message 9 with status OK_EMPTY
IoT Hub responded to message 0 with status OK_EMPTY
IoT Hub responded to message 8 with status OK_EMPTY


参考:
Microsoft Azure IoT device SDK for Java

IoT Kit ハンズオン トレーニング 初めの一歩モノの接続からデータ分析まで by @embedded_george

最後に、今回は実戦的なアプリまでは作成しませんでしたが、上記をベースに Raspberry Pi や LEGO Mindstorms 上にプログラムを配置し、Azure 上にデータを配信したり、Azure から各種デバイスを操作したりできるようになりますね。

Let’s enjoy IoT with Java on Azure !!

2015年12月15日 at 5:24 午後 1件のコメント

Microsoft Java DevOps ハッカソン@JJUG CCC 2015


JJUG CCC 2015 Fall が2015年 11月 28日 (土) にベルサール新宿グランド(東京都新宿区西新宿8-17-3 住友不動産新宿グランドタワー) で開催されます。

今回、日本マイクロソフト株式会社は JJUG CCC にプラチナ・スポンサーとして参加し、Java の開発者と運用者による DevOps ハッカソンを2日間で実施します。このハッカソンは過去2度程実施していますが、いずれの参加者も参加してよかった他の方にもぜひお勧めしたいといわれている、とても有意義なハッカソンです(下記の参加レポートをご参照)。
みなさま、Microsoft Azure のプラットフォーム上で、 Jenkins や今はやりの Docker などを利用して 継続的インテグレーションやデリバリ(CI や CD)を体感してみませんか?今回は、JJUG との共催という事で、開発者は Java デベロッパーのみなさまが対象となります。

参加のご登録はコチラから
 ■ 開発者の方はコチラ
 ■ インフラ技術者の方はコチラ

( ※ 参加可能な人数に限りがあるため、JJUG CCC の参加登録とは別途、登録サイトをご用意しています。JJUG CCC の参加登録はコチラから行ってください。)



ご案内文
DevOps はソフトウエアデリバリのライフサイクルを早める考え方で、短期間で開発、 運用を繰り返し、一日に5 回以上新しいサービスをリリースする企業も出てくるなど、DevOps のビジネス価値、効果は昨今たいへん注目されています。      

しかし DevOps が何を指すのかは人やベンダーによって言うことがまちまちで、その多くはツールのみの話に終始していますが、ツールは DevOps の要素のひとつであり、実際は人、プロセス、さまざまな要素が関係します。      

アプリケーション開発者、そしてインフラ技術者でチームを構成し、DevOps のプラクティスを適用して、Infrastructure as Code の自動化技術を使いながら本物のDevOps が体験できるイベントを企画しました。

ぜひ奮ってご参加ください。


過去に開催した DevOps ハッカソンの参加レポートは下記にリンクしています。
● メディアの記事
http://codezine.jp/article/detail/8944
http://www.atmarkit.co.jp/ait/articles/1509/10/news168.html

● 参加者のブログ
http://heartbeats.jp/hbblog/2015/09/microsoft-devops-hackathon.html

http://blog.modd.com/entry/2015/09/07/151421
http://changesworlds.com/2015/09/devops-hackathon-day-2-done/
http://newscentral.exsees.com/item/2e7e6c6899c626e2baddb7cdeaaed62d-d28352a527a1d995287ddd23891859aa

参加のご登録はコチラから
 ■ 開発者の方はコチラ
 ■ インフラ技術者の方はコチラ

2015年11月6日 at 2:48 午後

Time to move on…

ついに、この日がやってきました。本日がオラクルにおける Java エバンジェリスト活動の最終日になりました。Sun からオラクルと、継続してご指導ご支援頂きました皆様、そして全国の Java コミュニティの皆様に、心から厚く御礼を申し上げます。

今後、引き続き Java コミュニティの皆様と交流を持たせていただくのは、日本オラクルの伊藤 敬さんです。
Twitter : @itakash

2001年 8月にSun Microsystems に中途入社し、早いもので14年の月日が流れました。外資系企業という出入りが多い環境の中、自身これだけよく長く続いたと思っています。Sun 時代に GlassFish という製品にめぐり会い、プリセールス兼 Java エバンジェリストとしてエバンジェリスト活動を開始しました。当時は関東を中心とした活動だったため、Sun 時代の私をご存知ない方も多いのではないかと思います。

日本全国のJavaの開発者の皆様と交流を持つようになったのは、2010年のオラクル統合後です。このオラクルでの5年間を振り返ると、今までの人生の中で最も充実し、成長させてくれた5年間だったのではないかと感じています。

活動当初は、会社の統合前後からの Java に対する情報不足、さらに最新版がしばらくリリースされていなかったこと等から、多くの開発者の皆様が Java の将来に対し不安を持っていた時期でした。この時は、皆様の前に立って話するのがとても怖かったことを、今でも昨日のことのように覚えています。当時、「Java は大丈夫です、これからも続けて進化していきます!!」といったメッセージをお届けしましたが、この言葉に「本当だろうか?!」と疑問を持たれる方もいらっしゃたのではないかと思います。

あれから5年が経過し、今ではあえて「Java は大丈夫です!!」といったメッセージを出さなくても、オラクルが Java を大切にし、オラクルの元で Java が着実に進化していることを、そして未来があることを誰しもがご理解いただいているのではないかと思います。実際オラクルになって、Java SE 7, Java EE 7, Java SE 8 をリリースし、今後も Java SE 9, Java EE 8 のリリースが予定されています。今後も Java は皆様のニーズに応え、新機能をどんどんと組みこんでいき Java Platform はさらに素晴らしい物になっていくでしょう。

私が活動を行ってきた上で、何よりも幸運だったのは、Sun 時代から Java を愛してやまない諸先輩方や数多くの友人に支えていただいたことでした。そして、日本全国の Java 開発者の皆様と親交を深めることができた事も何より幸せでした。

今日にいたるまで、私の活動を全面的に支えてくださったのは、まぎれもなく日本全国の Java コミュニティの皆様です。

JavaOne Tokyo 2012 でTwitterのハッシュタグ「#てらだよしおがんばれ」が生まれ、夜の懇親会で参加者の皆様から「胴上げ」までしていただいたことは一生忘れる事ができません。おそらく、胴上げまでしていただいたエバンジェリストは日本でも私が初めてなのではないでしょうか?

こうした事が、その後の活動にどれだけ勇気づけてくれたか計り知れません。そして、皆様のご支援がなければ今日までやってこれませんでした。

今年の Java Day Tokyo 2015 で Java の 20 周年を皆様と一緒に祝うことができ、とても幸せでした。ご参加いただいた皆様、ご登壇者の皆様、関係者の皆様、すべての皆様に心より感謝しています。

Java の 20 周年イベントを終え、そしてオラクルでの生活も5年 (Sun から14年) を終え、私にとって節目となる今年、新たな道、そして新たなチャレンジしたいと考えたことを、どうぞご理解頂けないでしょうか。

決して、会社や Java に対してネガティブな感情を持っての決断ではないことを、ご理解頂けないでしょうか。たとえ私が退職しても今後もオラクルは引き続き Java を大切にしますし、Java に対して投資を行っていきます。どうぞ、今後もJava の事を変わらずご支援いただき、安心してご利用頂けますよう宜しくお願いします。

最後に、
来週月曜日から新しい会社で働きます。新しい会社名や理由は入社後改めてご報告しますが、とても楽しみにしています。私の新しいチャレンジに対し、引き止めて頂きつつも、最後に理解を示してくださった上司に対して、今ここで改めて心より感謝の気持ちを述べたいと思います。そして、最後に温かく送り出していただいたオラクルの同僚・友人にも改めて感謝したいと思います。

私のエンジニア人生は、ずっと Java と共にありましたし、私を育ててくれたのも Java です。会社が変わっても私は Java のファンでいつづけたいと思います。そして今後は皆様と共に、外の世界から Java を応援し何らかの形で関わりたいと思います。

Sun Microsystems から Oracle まで、
お世話になったすべての皆様、本当にありがとうございました。
I Love Java.
Yoshio Terada
Oracle Java Evangelist.








2015/07/11 更新分

Twitter で頂いたメッセージ一覧(Togetter)
 #てらだよしお 退職エントリのまとめ

FaceBook で頂いたメッセージへのリンク1

FaceBook で頂いたメッセージへのリンク2

Twitter の Tweet メッセージ

2015年7月10日 at 1:00 午後 1件のコメント

JavaOne 2014 基調講演レポート

Java の将来にとって Java コミュニティは重要
(※ 文言、内容等修正をする可能性があります。)

●「Java とコミュニティ」
2014 年 9 月 28 日、JavaOne San Francisco 2014 ストラテジー・キーノートを皮切りにはじまりました。

今年の JavaOne は昨年よりも来場者が増加し、モスコーンセンターに世界中から非常に多くの Java 開発者が集まりました。基調講演を取りまとめたのは昨年に引き続き Java Product Management Vice President の  Peter Utzschneider で今年の JavaOne のテーマ “CREATE THE FUTURE” (未来を創る) を発表しました。

Peter は冒頭で、JavaOne は開発者による開発者のためのイベントとして位置づけ、このイベントは、Java コミュニティからのフィードバックを受けて、昨年以上により良いイベントにするために様々な趣向を取り入れ実際に実現していると説明しました。

例えば、社外の方々も含むコンテンツ選定委員の絶え間ない努力のおかげで、500 以上のセッションを選定しラインナップしています。

また今や JavaOne には必要不可欠となった毎年恒例のイベントとなった Geek Bike Ride も JavaOne 開催に先駆け、土曜日に開催されました。この Geek Bike Ride は世界中の開発者とよりよい交流を持つ事ができる貴重なイベントですので、今年参加できなかった方も是非来年に参加してくださいと Peter 自らが話をしていました。また、展示会場においても様々なイベントやショーケース、参加型のイベントなども用意している事を紹介しました。


さらに、今年のテーマは“CREATE THE FUTURE” (未来を創る) ですが、まさに将来を担うのは子供であり、今の子供達が将来 Java の開発者になるため、子供達に対するプログラミング教育の重要性を説き、JavaOne に先駆け子供向けのイベントを開催しました。元々は Devoxx というヨーロッパに存在する Java コミュニティが立ち上げた自らの子供達に Java を教えるイベントでしたが、その取り組みが世界的に評価され今や世界各国で Devoxx4kids というイベントが開催されています。JavaOne 前日に開催された Devoxx4Kids に実際に参加された子供達が壇上に招かれ、実際にイベントで取り組んだ内容を紹介しました。


また、Peter は Java の将来を創っていく上で欠かせないのは Java コミュニティの力で、Java の開発者に Java のコミュニティに参加する事の重要性を紹介し、実際に行われてきたコミュニティの活発な活動例や創造性、情熱などを紹介しました。一つ目はドイツの例でドイツに存在する 22 の JUG が共同でイベントを開催し2日間のイベントを成功におさまた事や、ロンドンの Java コミュニティでは Java SE 8 のLambda 式を勉強するための新しいツールを作成中で、もうすぐリリースされる事を紹介した他、Java のユーザ・グループとしてはロンドン、ブラジルに続き3つめとなりますが、モロッコの Java コミュニティがJCP のメンバーに参加した事も発表しました。

また、JCP に関連した内容として JCP は今年で生誕 15 周年を迎える記念の年で、Java の継続的な成長と成功のために標準化が重要である事、そして継続して技術革新をおこなうために開発者自らが標準化に対する積極的の重要性を伝えました。JCP の生誕 15 周年を祝うイベントも JavaOne 期間中に開催することも述べました。

今、世界規模で驚くほど Java のコミュニティが新規に立ち上げられており、昨年の
JavaOne から1年間で 80 以上のコミュニティが作られていることを紹介しました。
Peter はオラクルにとって Java コミュニティはとても重要で、コミュニティに対する投資は継続し、開発者との交流を大切にし、コミュニティを通じて次の Java を作りたい、Java の開発者と新たな関係を構築したいと語りました。

●「Java SE の現状と今後」
Peter は引き続き Java SE を紹介するために、Java Platform Development の
Vice President である Georges Saab を壇上に招きました。

Java SE 8 は世界中のコミュニティから長い間期待されていた機能が含まれており、
正式リリース後、様々なメディアで取り上げられ、統合開発環境もいち早く
対応し素晴らしい反応を得ている事を紹介しました。また中でもリリース以降
すでに、8 カ国語で 80 以上の Java 8 に関連した書籍が出版されている事をあげ、
OpenJDK や JCP における透明性の開発の結果、いち早く情報が得られる事、
そしてコミュニティ・メンバーの多大なる努力のおかげと伝えました。

Java SE 8 は近代的なプログラミング手法(関数型プログラミングやコレクションに対する一括処理など)を取り入れ、それ以外にも JavaFX, JavaScript エンジン、サブセットを提供するプロファイル等も取り入れたため、かつてない程の Java に対する変更が加わっているものである事を紹介しました。

また、パフォーマンスに関しても様々な箇所で大幅に改善しているため、Java SE 7 に比べ 40 % のパフォーマンス改善が見込まれ、運用面においても大きな利点が得られる点を言及しました。さらに、Java にとってセキュリティは非常に需要であるため、継続的に四半期に一度セキュリティのアップデートを提供することを紹介した他、

また、エンタープライズ領域で Java を使用する場合に、 Mission Control,
Advanced Management Console といった機能、さらにはサポート契約に
ついても紹介しました。

最後に、今後のロードマップとして Java SE 8 のアップデート予定、さらには
次期 Java SE 9 のリリース計画についても紹介し、Java SE 8 の利用を
呼びかけ、Java SE 9 もアーリ・アクセス版を試してフィードバックを提供して
欲しいこと伝え壇上をさりました。

●「Java Embedded の適用領域の拡大」

Java Embedded 1年間の急速な普及

ー 1年間で 50万ダウンロード
ー 20 以上のデバイスへのポーティング
ー 業界全体でのコラボレーション
ー オンライン学習サイトへ 83カ国 2400 以上の登録

Peter は引き続き、Java Embedded 関連の紹介を始めました。Embedded の領域で Java ME の CDC は Java SE のコンパクト・プロファイルに置き換えられ、組み込みの分野においても標準の Java SE の API の殆どが共通的に使えるようになっておりツール等も共通で使える事を紹介しました。そして Java SE との差分はデバイスに対するアクセスのような限定的な物となっていることを紹介し、今では Java の開発者は、組み込みのデバイスからデスクトップ、さらにはサーバ・サイドのアプリケーション開発まで同じ文法で同じライブラリを使用することができるようになっており同じ Java のスキルで開発者の幅が広がっている点について紹介しました。
Java SE Embedded 8 では Compact Profile で Mission Control, Flight Recorder 等が利用できる点を紹介し 8 月にリリースした Java SE Embedded Update 6 ではパフォーマンス改善などもおこなっている点を紹介しました。

また、新しく Java Embedded に関する新しいプロダクトのリリースも発表しました。

Java ME Embedded 8.1 EA リリース
基調講演であらたに、Java ME Embedded 8.1 のアーリ・アクセスをリリースした事を発表しました。
Oracle Java ME Embedded 8.1 Early Access Downloads

これは、ARM Cortex M3/M4 マイクロコントローラや、mbed を含む Freescale FRDM k64 ボードのサポートなどが含まれます。

Java とモバイルに置けるイノベーション
ー Oracle Mobile Application Framework
ー Java Card
ー RoboVM
ー Java for Trusted Execution Environment

Java はモバイル分野でも大幅な進歩をしていますが、Oracle の Mobile Application Framework はクロス・プラットフォーム・アプリケーションの開発が可能になっています。

Peter は IoT Device のアーキテクトである Jasper Potts と Richard Bair を壇上に招き入れ、Java Embedded で作成した車の制御アプリケーションのデモを行いました。これは車を模したボードで、車のペダルを踏むと速度表示パネルに速度がリアルタイムで表示され、タッチデバイスに表示される地図に位置情報を示し、地図をタッチしてを操作したりできるようになっています。さらには温度の測定、光度の測定など、各種センサーからの情報をリアルタイムに取得し、それらの情報をもとに車を制御したり、クラウド上にデータを送信したりする事ができるようになっています。
サーバ・サイドは Java EE 7 のアプリケーション・サーバを使用し、車とサーバ間は WebSocket の通信を行っています。これら全てが Java で実装されており、次世代の車でできる一部を参加者はみることができました。


●「活気のある Java EE」

続いて、Peter は Cloud Application Foundation の Senior Vice President である
Cameron Purdy を会場に招き入れ、Java EE の説明を Cameron に譲りました。

Java EE 6 に準拠するアプリケーション・サーバは 20 超え、Java EE 7 準拠のサーバも各社が積極的に対応をすすめています。また、Java コミュニティからも Adopt-A-JSR プログラムを通じて将来の Java EE の為に、積極的な貢献を頂いています。さらに開発環境においても著名な統合開発環境におけるJava EE 7 のサポートを提供し開発生産性が大幅向上する他、高品質なアプリケーションを作成するために、Hudson, Maven, Arquillian 等を使用する事ができます。

また、GlassFish に関しても商用サポートの打ち切りは行いましたが、Java EE の参照実装の基礎として GlassFish に対しては継続して投資を行っています。

また、最近次のバージョンである Java EE 8 に関する JSR が JSR-366 として JCP に登録され、最初の投票が行われましたが、Java EE 8 に関する投票は満場一致で承認されました。
Java EE 8 に含まれる機能は、世界中の Java EE の開発にアンケートを実施し、必要とする機能に関してフィードバックを頂いた後に検討した結果を踏まえた内容となっています。

Java EE 8 に含まれる機能例
ー JSON Binding
ー Java Message Service 2.1
ー Servlet 4.0
ー Model View Controller
など

Java EE 8 の議論はまだ始まったばかりですが、Java EE 8 は 2016 年の秋リリースの予定で現在進行しています。
最後に Cameron は Java コミュニティの参加社に Adopt-A-JSR というJavaコミュニティが将来の Java を創るために貢献できるプロジェクトをご紹介し参加を呼びかけました。

●「Duke Choice Award & Java EE コミュニティ・パーティ」
基調講演と同日「Duke Choice Award」の授賞式や、Java EE コミュニティの
パーティ等がありました。Duke Choice Award は今年で 13 年目という事もあり
13組の受賞者が発表されています。また、授賞式の後は、世界中の Java EE のコミュニティメンバーがあつまるパーティもあり、多くの日本人が海外のエンジニア達と交流をもっていました。

[Duke Choice Award]





[Java EE Community Party]


●「まとめ」
今年の JavaOne 基調講演では、最新の Java 情報に精通する開発者にとっては既知の内容が多く含まれていましたが、それは JCP の改革によるものです。Java の開発は現在全てオープンな場でディスカッションが行われ、プロセスを進めています。その為事前に得られる情報が多くなっているのも事実です。
一方で、この Java の透明性によって、開発者はいち早く事前に情報を収集する事が可能なため、今のような製品がリリースされた直後から大量の書籍や情報を入手できるようになっています。
JavaOne には1週間で 500 以上のセッションが存在し、Java に関する様々な情報を入手できます。また、Java の仕様を決める方や世界のエキスパートと直接意見交換ができる貴重な場ですので、そういった国際交流を持つ事も JavaOne の一つの楽しみ方かと思います。

Let’s Enjoy JavaOne !!

PS.
最後に、Peter が話をしていましたが来年の JavaOne は Java 生誕 20 周年の記念の年となります。来年の JavaOne はさらに色々な趣向をこらした内容を用意する予定ですので、来年もぜひご参加ください!!と申しておりました。

2014年9月30日 at 8:01 午後

Older Posts


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

clustermap

ブログ統計情報

  • 1,288,954 hits

Feeds

アーカイブ