Blogger Syntax Highliter

Saturday, May 19, 2012

Windows Azure Marketplace の Microsoft Translator API を使ってみる

1年前ぐらいからMicrosoft Translator APIにはお世話になりっぱなしなのですが、Bing AppIDを使ったAPI利用が2012年8月までとなり、それ以降もAPIを使い続けるには少しプログラムを修正しないといけないようです。では、どのような変更を行わないといけないか、新規にアプリケーションを登録するところからみてみます。

はじめに Windows Azure Marketplace と Access Token

Microsoft Translator APIは翻訳を提供するサービスです。このサービスを利用すると自分のアプリケーションで翻訳機能を利用することができます。このサービスはWebサービスとして提供されていてHTTP通信が可能なプラットフォームであれば利用することができます。もちろんWebアプリ(サーバサイド、クライアントサイド)やLinux、Windows、iOSなどでも利用できます。利用するにはWindows Azure MarketplaceでLiveIDの登録とアプリケーションの登録を行います。

今まではBing APIからAppIDを取得して、そのAppIDをAPI呼び出しに使用していましたが、Azure DataMarketから取得した Access Token を使ったAPI呼び出しに変更されました。では、Windows Azure Marketplaceへの登録から始めてみましょう。

1. Azure Marketplace で Microsoft Translator の利用登録

Windows Azure Marketplace(以下のURL)でMicrosoft Translator APIのサブスクリプション登録を行います。Bing AppIDを利用していたころは、翻訳文字数による制限は書かれていませんでしたが、Windows Azure Marketでは翻訳文字数によって料金がかかるようです。今回はお金のかからないプラン「2,000,000文字/月」を選択してみます。

https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb

Azure

2. Azure DataMarketにアプリケーションを登録

つぎに、Azure DataMarket(以下のURL)に自分が作成しているアプリケーションの登録を行います。この登録はAPIを利用するために重要な作業です。この登録で取得する「顧客の秘密」(英語だとClient Secret)と、「クライアントID」(英語だとClient ID)はAPIで使用します。

https://datamarket.azure.com/developer/applications

develop02

項目名から何を記入したらよいのかわからないと思いますので、以下に記入内容を書いておきます。

クライアントID Azure DataMarketで管理するユニークなアプリケーションのID。アプリケーションのログインIDみたいな感じですね。 例:kentaapplication
名前 人間がわかりやすいアプリケーションの名前です。 例: Kenta’s Application
顧客の秘密 自動で生成されますので、書き換えないでください。Client Secretとなり、Access Tokenを取得する際に使います。 例: A90eqOP776O2fmjOrVog8f90I6jc9uAL1UAp0twj278=
リダイレクトURL Microsoft Translator APIでは使用しませんが、必修フィールドとなっていますので、適当なURLを記入します。 例: https://kentablog.cluscore.com
説明 アプリケーションの説明を書きます。記入しなくてもよいです。 例: It’s my application

 

3.アプリケーションでの利用方法 その1Access Tokenを取得する

アプリケーションから Microsoft Translator API を利用する方法です。Microsoft Translatorは、AJAX向けインタフェース、HTTP向けインタフェース、SOAP向けインタフェースを持ちます。HTTPとSOAPでアクセスするにはAccess Tokenが必要になりますので、先にトークンサービスからAccess Tokenを取得する方法を紹介します。

Access Token はDataMarket のトークンサービスに HTTP POST リクエストを送信することにより取得します。

トークンサービスURL

https://datamarket.accesscontrol.windows.net/v2/OAuth2-13

トークン要求入力パラメータ―

client_id Azure DataMarketに登録した、クライアントID
client_secret Azure DataMarketで得られた、顧客の秘密
scope Microsoft Translator APIを使用するので、値を http://api.microsofttranslator.com にする
grant_type Microsoft Translator APIで使用する場合は、値を“client_credentials”にする

 

トークン要求出力パラメータ―

access_token Microsoft Translator APIにアクセスするためのAccess Token
token_type Access Tokenのフォーマット
expires_in Access Tokenが有効な秒数
scope このトークンが有効なドメインスコープ。Microsoft Translatorの場合は、http://api.microsofttranslator.com

上記に従ったHTTP POSTリクエストを作成すればよいのですが、お手本があるのでそちらを参照します。以下のMSDNのC#サンプロコードから、 AdmAccessToken クラスと AdmAuthentication クラスをコピーして、AdmAuthentication.cs に保存して利用します。

http://msdn.microsoft.com/en-us/library/hh454950.aspx

[DataContract]
public class AdmAccessToken
{
    ....
}

public class AdmAuthentication
{
    ....
    public AdmAuthentication(string clientId, string clientSecret)
    {
        ....
    }
     public AdmAccessToken GetAccessToken()
    {
        ....
    }
     private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
    {
        ....
    }
}

Access Tokenを取得した後は、APIに渡すためにAuthentication Headerを作成します。Authrization Headerは、トークンサービスから取得したAccess Token文字列の前に”Bearer “を追加した文字列になります。


string authorizationHeader = “Bearer“ + “ “ + accessToken;

上記のコードを使うと以下のようになります。


var admAuth = new AdmAuthentication("kentaapplication", "A90eqOP776O2fmjOrVog8f90I6jc9uAL1UAp0twj278=");
admToken = admAuth.GetAccessToken();
authenticationHeaderValue = "Bearer " + admToken.access_token;


Access Tokenは10分間有効なので定期的に新しいAccess Tokenを取得する必要があります。


アプリケーションでの利用 その2Microsoft Translator APIを使ってみる


Access Token を取得できるようになったので、いよいよ Microsoft Translator API を使ってみます。API は AJAX、SOAP、HTTP の3つのインタフェースを持ちますが、ここでは SOAP と HTTP インターフェースを紹介します。


SOAPインタフェース

VisualStudio2010 で.NETを利用したアプリケーションを書いている人にとっては、すごく便利なインタフェースです。手順としては、「ソリューションエクスプローラー」の「プロジェクト」のコンテキストメニューより、「サービス参照の追加」を選択します。「アドレス」に以下のURLを記入して「移動」ボタンをクリックするとMicrosoft Translator API を Webサービスから取得してきますので、「名前空間」に自分の好きなクラス名を入力して「OK」をクリックするだけでMicrosoft Translator のクラスが作成されます。


APIを使うときは、以下のようにメソッドを呼び出すだけです。第一引数AppIDにAccess Tokenを取得した時に作成したAuthentication Headerを入力します・


var translator = new MyTranslator.LanguageServiceClient();
var url = translator.Speak(authenticationHeaderValue , "こんにちは", "ja", "audio/wma", "MinSize");


HTTPインタフェース


HTTPのインタフェースは多くのプラットフォームで利用できる便利なインタフェースです。libcurlとかを使えばCでも利用することができると思いますし、PHPやJavaなどのでHTTPを使った方が便利だと思います。だけど今回はC#で。


string uri = "http://api.microsofttranslator.com/v2/Http.svc/Speak";
uri = uri + string.Format("?text={0}&language={1}&format={2}&option={3}",
    HttpUtility.UrlEncode("こんにちは"),
    "ja",
    HttpUtility.UrlEncode("audio/wav"),
    "MinSize");
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Headers.Add("Authorization", authenticationHeaderValue);
WebResponse response = null;
try
{
    response = httpWebRequest.GetResponse();
    using (Stream stream = response.GetResponseStream())
    {
        using (SoundPlayer player = new SoundPlayer(stream))
        {
            player.PlaySync();
        }
    }
}


SOAPの時はURLが出力されましたが、HTTPの場合は音声データを取得できます。


まとめ


Microsoft Translator APIは、Bing AppIDを必要とするとき同じAPI引数となっていますが、Windows Azure DataMarketでは、AppIDではなくAccess Tokenが含まれたAuthenticator HeaderによりAPIの利用が可能となります。Bing AppIDを利用している他のAPIもWindows Azure Marketplaceに移行するようですので、今回の例と同じようにAccess Tokenを取得して利用することができると思います。


Windows Azure Marketplace で提供されている Microsoft Translator を含め、自分のアプリケーションに利用すると便利なサービスが沢山あるので、どんどん使いたいですね。クラウドって素晴らしい。


参考サイト


Obtaining an Access Token


http://msdn.microsoft.com/en-us/library/hh454950.aspx


Microsoft Translator Developer Offerings


http://www.microsofttranslator.com/dev/

Friday, May 11, 2012

Windows Azureが使用しているIPv4アドレスレンジ

 Windows Azureが使用しているIPアドレスレンジが以下のサイトで公開されていますね。Windows Azureはサービス単位でグローバルIPv4アドレスが振られるため、インスタンス毎にグローバルIPアドレスが振られるクラウドサービスと比べると少ないIPv4アドレスレンジとなるはずです。

http://www.microsoft.com/en-us/download/details.aspx?id=29840

細かく切られているCIDRも結構持ってますね。IPv4の払い出しが終了しているので苦労がわかります。地域によってバラつきがあるんですね。

以下は、2012年5月11日時点のIPv4アドレス(足りない気がするけど。)

(内部のネットワーク構成はわかりませんので、ブロードキャストアドレスとネットワークアドレスも数えています)

地域チイキ ネットワーク IPスウ 合計ゴウケイIPスウ
North Europe 213.199.160.0/20 4,096 30,976
213.199.184.0/21 2,048
94.245.112.0/20 4,096
94.245.88.0/21 2,048
94.245.104.0/21 2,048
65.52.64.0/20 4,096
65.52.224.0/22 1,024
65.52.228.0/22 1,024
65.52.248.0/21 2,048
157.55.3.0/24 256
168.63.32.0/19 8,192
West Europe 94.245.97.0/24 256 19,168
65.52.128.0/19 8,192
213.199.128.0/21 2,048
213.199.180.112/28 16
213.199.180.32/28 16
213.199.180.96/28 16
213.199.180.192/26 64
213.199.183.0/24 256
157.55.8.128/28 16
157.55.8.144/28 16
157.55.8.160/28 16
157.55.8.64/26 64
168.63.0.0/19 8,192
East Asia 111.221.64.0/22 1,024 17,856
207.46.72.0/26 64
207.46.89.16/28 16
207.46.95.32/27 32
207.46.77.224/28 16
65.52.160.0/19 8,192
207.46.87.0/24 256
207.46.67.160/27 32
207.46.67.192/27 32
168.63.128.0/19 8,192
South East Asia 207.46.48.0/20 4,096 22,528
111.221.16.0/21 2,048
111.221.80.0/20 4,096
111.221.96.0/20 4,096
168.63.160.0/19 8,192
South Central US 65.55.80.0/20 4,096 48,176
65.54.48.0/21 2,048
65.55.64.0/20 4,096
70.37.48.0/20 4,096
70.37.64.0/18 16,384
65.52.32.0/21 2,048
70.37.160.0/21 2,048
157.55.176.0/20 4,096
157.55.103.48/28 16
157.55.192.0/22 1,024
157.55.103.32/28 16
157.55.196.0/22 1,024
157.55.200.0/22 1,024
157.55.153.224/28 16
157.55.80.0/22 1,024
157.55.84.0/22 1,024
North Central US 207.46.192.0/20 4,096 45,936
65.52.0.0/19 8,192
65.52.192.0/19 8,192
65.52.48.0/20 4,096
209.240.220.0/23 512
65.52.106.240/28 16
65.52.106.16/28 16
65.52.107.0/28 16
65.52.106.224/28 16
65.52.106.32/27 32
65.52.106.64/27 32
65.52.106.160/27 32
65.52.106.192/27 32
65.52.106.96/27 32
65.52.106.128/27 32
157.55.136.0/21 2,048
157.55.160.0/20 4,096
157.55.60.224/28 16
157.55.24.0/21 2,048
157.55.208.0/21 2,048
157.55.60.240/28 16
157.55.151.0/28 16
157.55.216.0/22 1,024
157.55.220.0/22 1,024
157.55.73.32/28 16
157.56.8.0/22 1,024
157.56.12.0/22 1,024
157.56.24.160/28 16
65.52.232.0/22 1,024
65.52.236.0/22 1,024
157.56.24.176/28 16
65.52.240.0/22 1,024
65.52.244.0/22 1,024
157.56.24.192/28 16
157.56.28.0/22 1,024
157.55.252.0/22 1,024

Friday, May 4, 2012

Windows Azure Blob Storage でバックアップされるデーターのコピー数

 2011年秋頃のWindows AzureのアップデートでAzure StorageのGeo-Replication(地域間の自動バックアップ)が行われるようになりましたが、もともとAzure Storageは同一地域内で異なるFault Domainに3つのコピーを持っていたので(プライマリデータ含)他の地域を合わせて3+1つのコピーとなるのか?それとも3+3つのコピーを持つことになるのか?すごく気になったので調べてみました。

 3+3つのコピーを行っていたらAzure側では今までのストレージ容量の2倍の投資が必要なるので気になりますが、答えは以下のブログに書かれていました。

How many copies of your blob is stored in Windows Azure Blob Storage?

http://blogs.msdn.com/b/avkashchauhan/archive/2012/02/09/how-many-copies-of-your-blob-is-stored-in-windows-azure-blob-storage.aspx

 なんと!3+3で6つのコピーを持っていたのです。ということは、私たちが1GB利用していると思っても実際は2GB以上のストレージリソースを利用していたのです。ディスクサイズはErasure Storageを使っているので、1つの地域で単純に3倍ではないようです(@masayhさんからコメントいただき修正しました)。しかも、利用金額は今までの3つのバックアップと同じです!

GeoReplication

Geo-Replicationの概要に関しては、以下のブログが参考になります。

Introducing Geo-replication for Windows Azure Storage

http://blogs.msdn.com/b/windowsazurestorage/archive/2011/09/15/introducing-geo-replication-for-windows-azure-storage.aspx

Now Available: Geo-Replication and new Blob, Table and Queue features for Windows Azure Storage

http://blogs.msdn.com/b/windowsazure/archive/2011/09/16/geo-replication-and-new-blob-table-and-queue-features-for-windows-azure-storage.aspx

日本語だと以下のブログが参考になります。

Windows AzureのGeo-Replication機能について理解を深める

http://www.sigmact.com/tips/azure_georeplication.html

昨年の震災などのように地域全体の建物が崩壊することもあるため、Fault Domainによる3つのコピーでは少し不安でしたが、Geo-Replicationされた3つのコピーが追加されることで十分安心になりました。Windows Azureでは、ストレージのDNS名に地域を示す文字が書かれていないこともあり、他の地域に自動で切り替わっても違和感なくDNSホスト名を利用し続けることができます。アプリケーション開発者にとっても非常に便利な機能ですね。