Posts filed under ‘Microsoft Azure’

皆んな大好き 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 AM

Microsoft Cognitive サービスによる OCR 解析


マイクロソフトの Cognitive サービスには OCR (光学式文字認識:画像に含まれる文字列をテキストデータとして抽出) の機能があります。現在はプレビュー版としてこの機能が提供されています。
Cognitive Services : Computer Vision API – v1.0 OCR

● Java のサンプル・アプリケーションについて
JAX-RS Client API を使って、Java の OCR サンプルを作り下記に公開しました。ご興味ある方はお試しください。
https://github.com/yoshioterada/OCR-Sample-of-Cognitive-Service

※ 本プログラムをお試しいただくためには、Subscription ID を入手して頂く必要があります。コチラ(Cognitive Services Computer Vision)より「Get started for free」のボタンを押し「Computer Vision – Preview 5,000 transactions per month, 20 per minute. 」にチェックし「Subscribe」ボタンを押して「Subscription ID」を入手してください。入手した ID を、プログラム中の SUBSCRIPTION_ID に記載してください。

画像は、以下の3種類の方法で指定できます。

1. 画像が置かれている URI を指定
2. ローカル・ディレクトリを含む絶対パスでファイル名を指定
3. 画像の byte[] を指定

public class Main {

    private final static String SUBSCRIPTION_ID = "*******************************************";

    public static void main(String argv[]) {
        OCRService service = new OCRService(SUBSCRIPTION_ID);

        // GET the result of OCR from specified URI
        String pictURI = "http://businessnetwork.jp/Portals/0/SP2016/PSTN/img/1604_microsoft_top.jpg";
        Optional<OCRResponseJSONBody> result = service.getOCRAnalysisResult(pictURI);
        result.ifPresent(resultBody -> service.printOCRResult(resultBody));
        
        //GET the result of OCR from the local file
        try {
            Optional<OCRResponseJSONBody> result2 = service.getOCRAnalysisResult(Paths.get("/Users/terada/Downloads/aaa.jpeg"));
            result2.ifPresent(resultBody -> service.printOCRResult(resultBody));
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

下記に、本プログラムを利用した解析結果の例をご紹介します。

●解析結果例1
まず、解析結果として、とてもうまくいった例をご紹介します。例として、sansan さんのサンプル名刺を利用させていただきました。

解析したらこんな結果が得られました。完全に一致していますね!!

Cognitive-OCR1//embedr.flickr.com/assets/client-code.js

●解析結果例2
次に私の名刺を解析しました(メールと電話番号だけ伏せさせてください)。
Cognitive-OCR3//embedr.flickr.com/assets/client-code.js
その結果、こうなりました。
Cognitive-OCR2//embedr.flickr.com/assets/client-code.js
「Microsoft」が「Mi(「0S0升」、「Blog」が「引log」になっています。どうやら、現時点で日本語と英語がまざると、日本語解析が英語解析より優先度強くはたらき、ローマ字に似た日本語の文字を当てはめるみたいです。例えば「@yoshioterada」が「yoshiote「ada」と解析された場合もあります。

●日英がまざる場合の現時点の回避策

現時点では(ワークアラウンドとして)、日本語解析と英語解析を2度実行し有効な文字列を抽出するのが良いのではないかと思っています。

実際に、OCR 処理用の REST URL は下記になります。
https://api.projectoxford.ai/vision/v1.0/ocr?language=en&detectOrientation=true&#8221;

ここで引数に language を指定しますが、language=en,language=ja で、それぞれ英語か日本語の解析を切り替えます。日英両方を含む場合、現時点のワークアラウンドとして、”en” と “ja” の2回解析し、取得結果から意味的に有効な方を使うというのも良いかもしれません。

実際に、language=en を指定し、英語解析で名刺を解析させると、下記のように「Mi(「0S0升」と解析されていた箇所も正しく「Microsoft」と、そして「Blog」も正しく解析できていました。

Cognitive-OCR4//embedr.flickr.com/assets/client-code.js

REST の呼び出し結果(JSON)を確認すると1文字ずつ文字を抽出し認識しているようです。1行単位(つまり文字の前後関係)では解析はしていないので、1行を抜き出し本当に意味のある正しい文字列になっているかどうかを判定するような処理を入れれば精度はあがるのではないかと思います。(例えば「Mi(「0S0升」や「引log」のように1行中に1バイト文字と2バイト文字が混合しているなどはおかしい可能性が高いです。あと o(オー) と 0(ゼロ) も間違える場合があります。さらに l(エル), I(大文字のアイ), 1(イチ)も同様です。 怪しい場合には Bing の検索 API で探すという手もありかもしれません。)

こちらについては、Java に限らずどの言語を利用しても同じ結果が得られると想定しますので、本国の開発チームには多言語対応への課題としてフィードバックしたいと思っています。

まだプレビュー版ですが、1月辺り 5,000 処理、もしくは1分間辺り 20 処理までは無料でご利用いただけます。どうぞお試し版(プレビュー)としてご利用ください。

2016年8月5日 at 8:00 AM

日本で 2 人目の Java Champion になりました


Java Champion

2016 年 7 月 1 日、 櫻庭祐一 さんに続いて、日本で 2 人目の Java Champion になりました。Java Champion のコミュニティ・サイトにも正式に、下記の通り名前が記載されました。

Java Champion は現在、世界で約 400 名位存在します。
Java Champion の bio 一覧はこちら

Java Champion になるためには、こちらに記載されている基準に従い、既存の Java Champion からのノミネーションと、他の Champion からの投票結果により可否がきまります。
※ Microsoft MVP の場合、Microsoft が承認しますが、Java Champion の場合は既存の Champion が選考します。

基準を一部抜粋します。

  • Java Champions are leaders
  • Java Champions are technical luminaries
  • Java Champions are independent-minded and credible
  • Java Champions are involved with some really cool applications of Java
    Technology or some humanitarian or educational effort.
  • Java Champions are able to evangelize or influence other developers

今回、私は Sun Microsystems 時代からエバンジェリスト仲間として大変お世話になった、Arun Gupta 氏 (現 Couchbase で Developer Advocacy の VP) にノミネートいただき投票結果の末なることができました。

Microsoft の社員としては、おそらく Neal Gafter 氏 (Java SE の元開発者 & Java Puzzlers の著者としても有名 ) に次ぐ2人目?!ではないかと思います。
ご参考:InfoQ : Javaの未来についてのNeal Gafter氏とのディスカッション

現在、Neal 氏は Visual Studio の開発を中心にご担当されていらっしゃいますので、Microsoft で Java の情報発信をしている社員(エバンジェリスト)が Java Champion になるのは、おそらく私が初めてではないかと思います。

日本の櫻庭祐一さんをはじめ、世界の名だたる先輩 Java Champion の名を汚さないように、New Java Champion として今後も継続して Java を応援しながらコミュニティ活動を継続したいと思います。そして、マイクロソフトの Java エバンジェリストとして、クラウド環境 (Microsoft Azure) における Java の活用で、開発者の皆様に有益な情報をお届けるように今後も精進していきたいと思います。

皆様、ぜひ今後ともどうぞよろしくお願いします。

2016年7月8日 at 8:00 AM

MySQL on Docker with UTF-8 CHARSET


ちょっとした自分用メモです。
以前、デモで MySQL の Docker コンテナを作成した際、オフィシャルの Docker イメージを利用した場合、たとえ、下記を /etc/mysql/conf.d/charset.cnf に指定しても作成した DB のテーブルが latin1 になってしまう問題にあいました。

     [mysqld]'; 
      skip-character-set-client-handshake
      character-set-server=utf8
      collation-server=utf8_general_ci
      init-connect = SET NAMES utf8
      [client]
      default-character-set=utf8

そこで、docker-entrypoint.sh を追記して、DB 作成時に明示的に utf8 を渡すように変更しました。
(docker-entrypoint.sh の追記箇所)

# 前略
# 引数で書く所をファイル中に記載
DATADIR="/var/lib/mysql"
MYSQL_ROOT_PASSWORD="supersecret"
MYSQL_DATABASE="artist-db"
MYSQL_USER="mysql"
MYSQL_PASSWORD="mysql"
MYSQL_CHARSET="utf8"

# 中略 
                if [ "$MYSQL_DATABASE" ]; then
                        echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ${MYSQL_CHARSET:+CHARACTER SET $MYSQL_CHARSET} ;" >> "$tempSqlFile"
                fi
# 後略

これで、Docker コンテナの MySQL で UTF-8 を扱えるようになるかと思います。

MySQL 用の Dockerfile

FROM mysql:5.7

RUN { \
      echo '[mysqld]'; \
      echo 'skip-character-set-client-handshake'; \
      echo 'character-set-server=utf8'; \
      echo 'collation-server=utf8_general_ci'; \
      echo 'init-connect = SET NAMES utf8'; \
      echo '[client]'; \
      echo 'default-character-set=utf8'; \
    } > /etc/mysql/conf.d/charset.cnf

COPY ./docker-entrypoint.sh /tmp/entrypoint.sh
COPY ./start-up.sh /tmp/start-up.sh
RUN chmod a+x /tmp/entrypoint.sh
RUN chmod a+x /tmp/start-up.sh

ENTRYPOINT ["/tmp/start-up.sh"]
EXPOSE 3306
CMD ["mysqld"]

DB を作成するためのスクリプトファイル(docker-entrypoint.sh)

#!/bin/bash
set -e

# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then
        set -- mysqld "$@"
fi
# 引数で書く所をファイル中に記載
DATADIR="/var/lib/mysql"
MYSQL_ROOT_PASSWORD="supersecret"
MYSQL_DATABASE="artist-db"
MYSQL_USER="mysql"
MYSQL_PASSWORD="mysql"
MYSQL_CHARSET="utf8"

if [ "$1" = 'mysqld' ]; then
        # read DATADIR from the MySQL config
        DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
        if [ ! -d "$DATADIR/mysql" ]; then
                if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
                        echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
                        echo >&2 '  Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
                        exit 1
                fi
                
                echo 'Initializing database'
                mysqld --initialize-insecure=on --datadir="$DATADIR"
                echo 'Database initialized'
                
                # These statements _must_ be on individual lines, and _must_ end with
                # semicolons (no line breaks or comments are permitted).
                # TODO proper SQL escaping on ALL the things D:
                
                tempSqlFile='/tmp/mysql-first-time.sql'
                cat > "$tempSqlFile" <<-EOSQL
                        -- What's done in this file shouldn't be replicated
                        --  or products like mysql-fabric won't work
                        SET @@SESSION.SQL_LOG_BIN=0;
                        
                        DELETE FROM mysql.user ;
                        CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
                        GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
                        DROP DATABASE IF EXISTS test ;
                EOSQL
                
                if [ "$MYSQL_DATABASE" ]; then
                        echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ${MYSQL_CHARSET:+CHARACTER SET $MYSQL_CHARSET} ;" >> "$tempSqlFile"
                fi
                
                if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
                        echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$tempSqlFile"
                        
                        if [ "$MYSQL_DATABASE" ]; then
                                echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" >> "$tempSqlFile"
                        fi
                fi
                
                echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile"
                
                set -- "$@" --init-file="$tempSqlFile"
        fi
        
        chown -R mysql:mysql "$DATADIR"
fi

exec "$@"

MySQL の起動用スクリプト(start-up.sh)

#!/usr/bin/env bash
/tmp/entrypoint.sh mysqld --datadir=/var/lib/mysql --user=mysql 

ファイルを作成したのち、Dockerfile を保存している場所で下記のコマンドを実行して Docker イメージを作成

$ docker build -t tyoshio2002/mysql:5.7 .

作成した Docker イメージを起動

$ docker run -d -p 3306:3306 tyoshio2002/mysql:5.7

で MySQL を起動できるかと思います。

※ オフィシャルのイメージに対して、文字コードを指定できるようにしてほしいというリクエストが多数上がっているので、オフィシャル側で対応してほしいですね。他に良い方法をご存知の方がいらっしゃったら教えてください。

2016年3月7日 at 2:02 PM 2件のコメント

WebSocket ハンズオンと Java on Microsoft Azure について


この記事は Java EE Advent Calendar 2015 の12/22分の記事です。
昨日は、emag@github さんのWildFly Swarm 周遊でした。
明日は、@HirofumiIwasakiさんです。

マイクロソフトに転職してはやいもので5ヶ月が過ぎ、やっと会社にも同僚にも慣れてまいりました。Java EE の Advent Calendar ということで Java EE に関連した内容をお届けします。

内容は、Azure 上で WebSocket のアプリケーション開発のハンズオン・ラボの資料です。当初、ブログにまとめようと思いましたが、ページ数がかさむのでラボの資料は、下記の PDF にまとめました。また、このハンズオンは、学生(専門学校の皆様や大学生)も理解していただけるよう記載した内容ですので、社会人の皆様でも、はじめて WebSocket を学ぶ方には有効ではないかと思います。ぜひ下記のハンズオンをお試しいただき、Java EE 7 の WebSocket を Azure 上でお楽しみください。

SlideShare : SlideShare からも直接ご覧いただけます。(PDF のダウンロードも可能)
Docs.com : Docs.com からもご覧いただけます。(PDFのダウンロードも可能)

最後に
今年は、Java 業界を驚かせてしまったり、お騒がせしましたが、みなさま本当にありがとうございました。Java の 20 周年を皆様と一緒に過ごすことができたのは心より幸せでした。そして、マイクロソフトに転職しても Java のエバンジェリストができて、今なによりも幸せです。マイクロソフトに入社して、今年は少し様子見をしていた所もあります。しかし来年は、もっと積極的にやっていく予定ですので、会社が変わってもどうぞ皆様、これからもよろしくお願いします。

皆様、良いお年を!!
Have a good Merry Christmas and a happy New Year !!

2015年12月22日 at 1:36 PM 1件のコメント

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 PM 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://couger.hatenablog.com/entry/2015/09/06/213104
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 PM

過去の投稿


Java Champion & Evangelist

ご注意

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

カレンダー

2017年2月
« 10月    
 12345
6789101112
13141516171819
20212223242526
2728  

カテゴリー

Twitter

  • @masanobuimai (^_^) たぶんあそこは違う!!(^_^) 8 hours ago
  • @masanobuimai ごめんなさい。 8 hours ago
  • 今日、久々にキレてしまった。(T_T) 大人気ない自分に半生。 理由は分かってる。対応してくれたあの方が悪かったわけではなく、あのバックエンドシステムが全く顧客志向になってないだけなんだけど。 でも未だにこんな融通のきかないシステム運用してて大丈夫? 9 hours ago
  • RT @superriver: ちょまどさんのキャリアはとても面白い。趣味でやってたプログラミングと絵描き、大学の英文、バイトの塾講師などが全部つながって大きな影響力を出せる状態になっている。本人も含めそんなこと考えていなかったに違いない。発掘した砂金プロデューサーの手腕もすご… 15 hours ago
  • ちょっと古いけど。 1 day ago

clustermap

ブログ統計情報

  • 923,761 hits

Feeds