Archive for 8月, 2016

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

Java EE の戦略アップデート (2016/08/09 : JCP Executive Committee)

2016/08/09 JCP の Executive Committee のミーティング (Executive Committee Meeting Minutes for August 9 2016) がありOracle の Java EE/WebLogic 系製品の責任者 (Oracle Group Vice President ) である Anil Gaur さんから、今後の Java EE の戦略に対する説明がされたようです。
※ Anil さんは、元 Sun で Java EE/GlassFish の開発チームをまとめていた方。

要約すると
* エンタープライズのプログラミング・スタイルが変わっている。
* 旧来のアプリケーション・サーバでは、複数のアプリが同一 アプリ上 アプリケーション・サーバで動いていたが、今は単一のサービスやアプリが、それ専用のモジュール化された実行環境でクラウド上にデプロイされている、Java EE をこうした次世代のアプリ開発に対応できるようにしたい。
* 新しいプログラミング・モデルは、大規模にスケールする分散アプリを構築するためにリアクティブ・スタイルのプログラミングを取り入れ疎結合化する必要がある。
* また、HTTP/2, 設定、状態管理、Eventual Consistency(結果整合性)、マルチテナンシー、O-Auth, OpenID Connect 対応にも注目している
* 現在は、Java EE の一部の大規模ベンダーに相談しているが、今後 Java Champion や Java ユーザ・グループにも相談する予定。

以降 EC メンバーとの Q&A
[Q] Werner Keil
Java SE プラットフォームは、今後リリース・サイクルを早めることを計画していると聞いていますが、このリリース・サイクルは Java EE にも当てはまりますか?
[A] Anil
Java SE とは切り離して考えてほしい。いくつかの機能は Java SE 8 をベースにするだろうし、Java SE 9 に依存する部分もあるでしょう。

[Q] Martijn Verburg
Microprofile.io のチームとコラボレートする計画はありますか?
[A] Anil
2つの計画が一緒になる事を期待したいと思います。Oracle は Red Hat にこの件について話し合いを持ちました。しかし現時点では明確な答えはありません。

[Q] Alex Blewitt
クラウド・ベースのプロビジョニングについて質問をします。クレディ・スイスは、非常に機密性の高いデータを持っているため、”クラウドではなくオンプレミスで実行したい

[A] Anil
Java EE 8 は後方互換性を壊すのではなく、オンプレミスでも動作するでしょう。今までと同様に、専門家グループがより広いコミュニティからのフィードバックを元に、リリースに関して最終的な範囲やパッケージングを決定するでしょう。

[Q] Mark Little
私は、Red Hat が Oracle と話し合いを持った事を確認しています。そして Red Hat は Microprofile.io でプロトタイプを実装する際に Oracle と協業したいと言っていました。

その他、Steve Wallin、Bruno Souza、Matt Schuetze などから追加の質問、意見が寄せられてました。詳しくは、下記原文をご参照。

以降、該当部分の原文を抜粋

Java EE strategy
Anil Gaur, Oracle Group Vice President with responsibility for Java EE and WebLogic Server, gave a brief verbal presentation on Oracle’s Java EE strategy. He noted that enterprise programming styles are changing – more and more applications are distributed in nature and get deployed in cloud environments. Rather than traditional appservers that typically run multiple applications, apps are now distributed and deployed in the Cloud via modular runtimes dedicated to a single application or service.

We would like the future of Java EE to be viable to next generation of applications. These apps are composed and deployed differently in cloud and require flexibility, reliability and scale. The platform needs a new programming model that’s geared towards reactive style programming for building large-scale distributed applications that are loosely coupled. In addition, we would like to see HTTP/2, Config, State management, Eventual Consistency, Multi-tenancy, O-Auth and OpenID Connect get included in the platform. Oracle is talking to large Java EE vendors, and will soon consult with members of the community such as Java Champions and Java User Groups. He then asked for questions.
Werner Keil said that we had heard that Java SE would transition to faster release cycles. Would this also be reflected in Java EE? Anil replied that they intended to decouple from Java SE as best they could. Some features would be based on Java SE8 while others would depend on Java SE9.

Martijn Verburg asked whether there were plans to collaborate with the Microprofile.io team. Anil responded that he would like to see the two efforts come together. Oracle has spoken to RedHat about this but there is no definitive answer yet.

Alex Blewitt asked about cloud-based provisioning, noting that Credit Suissse has some very sensitive data and would therefore want to run on-premise instead of “in the cloud”. Anil responded that Java EE8 will not break backward compatibility and noted that it will be possible to run Java EE8 on-premise. As always, the Expert Group will decide the final scope and packaging of the release with input from broader community.

Mark Little confirmed that RedHat has spoken to Oracle, and said that he hoped that they could collaborate, perhaps by prototyping at Microprofile.io.

Steve Wallin said that IBM has also had discussions with Oracle. He asked whether Oracle was considering a completely new platform. Anil responded that he doesn’t want to pre-judge this; the community must decide. Steve asked what was missing from the current platform, noting that IBM has been able to deliver rapid deployment based on the existing platform. He thanked Anil for coming to speak to the EC.

Bruno Souza said that Java EE has historically been very open and participative – more so than other platforms – and consequently had been very good for the JCP. Going quiet for a year was very unhealthy and had damaged Java. He hoped that this would not happen again.

Anil said he understood. Oracle intends to work with the community and the JCP. They want to deliver something that developers will find useful and exciting.
Werner Keil asked when Java EE8 would be released. Anil said that the planned date will change, but he doesn’t yet have the details. He expects to be able to say at JavaOne.

Bruno asked whether Java User Groups and the Adopt-a-JSR program could help. Anil said he would welcome such community involvement.

Matt Schuetze asked what the high-level message is. Anil said that Java EE will continue to evolve. Some features will be more revolutionary, but exactly how things will be packaged has not yet been decided.
Werner Keil noted that java.net is being decommissioned and asked where Java EE projects will be hosted. Anil agreed that they would be impacted by this change and that they are evaluating alternatives.

There being no further questions, Patrick thanked Anil for coming to talk to the EC. Anil responded that he expected to reach out to many EC members in the coming weeks.

2016年8月17日 at 1:17 午後

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 午前


Java Champion & Evangelist

Translate

ご注意

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

カレンダー

2016年8月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

clustermap

ブログ統計情報

  • 1,288,541 hits

Feeds

アーカイブ