Azure Web App に FTP でデプロイする

Azure Web App にアプリケーションをデプロイする方法については、
これまでは主に、Visual Studio Team Services との CIGitHub との CI など、
ソース管理システムから自動的にデプロイする方法について書いてきましたが、
ソース管理システムと連携させない方法としては主に FTP を利用することになります。

FTP を利用するためには、Azure の管理ポータルで、
作成済みの Web App に対して [設定] – [デプロイ資格情報] と進んで、ユーザー名とパスワードを入力して [保存] をクリックします。

image

注意点として、ユーザー名はグローバルに一意でなければなりません (他の開発者と同じ名前を使用できません)。
また、サブスクリプション内のすべての Web App にもこのアカウントが設定されます。

これで、FTP を使うための準備ができました。
FTP の URI とユーザー名は Web App のトップに表示されています。

image

 

[FTPS ホスト名] の部分をコピーして、エクスプローラーでアクセスします。
ユーザー名もコピーできます。

image

これで、FTPS でアクセスできました。

image

あとは、wwwroot にアプリケーションをコピーすればデプロイは完了です。

image

 

また、Web App の [設定] – [アプリケーション設定] – [仮想アプリケーションとディレクトリ] で仮想アプリケーションを設定できます。
つまり、wwwroot 以外の物理ディレクトリも URL に関連付けることができます。

image

FTP でデプロイ:

image

ブラウザーでアクセス:

image

ちなみに、Monaco にアクセスすると既定の URL は /dev/wwwroot/ ですが、
ここを書き換えると wwwroot 以外も編集できるようになります。

image

 

ディスクの容量については、Free プランでは 1GB までです。
その他のプランの場合は、価格 – App Service を参照してください。

広告
カテゴリー: クラウド. タグ: , . 2 Comments »

Azure Table の検索条件を LINQ で指定する

Azure Storage の SDK (Windows Azure Storage) を利用して .NET のクライアントから Table のデータを取得する際に、
検索条件を指定しようとすると、通常の実装では次のようなコードになり少し複雑です。
この例では、フィルター条件を 2 つ指定しています。


var query = new TableQuery<Person>()
    .Where(TableQuery.CombineFilters(
        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "2015"),
        TableOperators.And,
        TableQuery.GenerateFilterConditionForInt("Age", QueryComparisons.LessThan, 20)));

var result = PeopleTable.ExecuteQuery(query).ToArray();


ここで、Person  は TableEntity を継承したクラスで、PeopleTable は CloudTable 型のオブジェクトです。

結局、上記の Where メソッドに渡されるのは、

(PartitionKey eq ‘2015’) and (Age lt 20)

という文字列になります。
これなら string.Format メソッドでもよいのではないのかという気もしますが、
プログラミングのミスを防ぐためには、フィルターや射影などの検索条件は LINQ で指定したいところです。

検索条件を LINQ で指定する方法として TableServiceContext クラスを使う方法もあるようですが、
現在は Obsolete 属性が指定されており、非推奨となっています。

とはいえ、自力で IQueryable<T> を実装するのも骨が折れるので、
ここでは簡易的に、TableQuery<T> の拡張メソッドとして Select および Where メソッドを実装していきます。
ラムダ式で指定された検索条件を式ツリーとして受け取って解析し、動的にクエリを生成します。

このような TableHelper クラスを実装することで、Azure Table の検索条件を LINQ で指定できるようになります。
ただし、文字列の不等式については、String クラスの演算子として不等号が定義されていないため、

p.LastName >= "W"

と書くことができず、

p.LastName.CompareTo("W") >= 0

のようにせざるを得ませんでした。

 

作成したサンプル
ExpressionsConsole (GitHub)

バージョン情報
Windows Azure Storage 6.0.0

参照
Windows Azure Storage
Expression<TDelegate> クラス
TableQuery<TElement> Class

Windows Azure Storage Extensions
テーブル サービスに対する LINQ クエリの作成 (古い形式)
TableServiceContext Class (古い形式)

Azure Event Hubs で送受信

あるアプリケーションから別のアプリケーションへデータを送信する方法として、
Microsoft Azure のイベント ハブ (Event Hubs) を利用できます。
イベント ハブは、小さいデータを短い間隔で送るというシナリオに向いています。
また、イベント ハブは文字通りハブとして機能し、送信側と受信側を多対多とすることができます。

今回は、基本的には公式のチュートリアルである Event Hubs の使用の方法をもとにして実装していきます。
(そのため、重複する内容は割愛することがあります。)

まず、Azure の管理ポータルでイベント ハブとストレージを作成します。
ストレージは、受信のための構成を保存しておく場所になるようです。

サービス バスの名前空間を sakapon-event-201508-ns、イベント ハブの名前を sakapon-event-201508 としました。

イベント ハブ

共有アクセス ポリシーには、SendRule と ReceiveRule を定義しておきます。

イベント ハブ

 

続いて、Visual Studio でプロジェクトを作成します。
今回は、送信側も受信側も WPF アプリケーションとして作成しました。

プロジェクトを作成したら、NuGet で、送信側には WindowsAzure.ServiceBus を、
受信側には Microsoft.Azure.ServiceBus.EventProcessorHost をインストールします。
このとき、App.config には接続文字列などの設定のためのテンプレートが追加されます。

以下、送信側および受信側の実装について説明します。

 

送信側の実装

まず、App.config の appSettings に、キーが Microsoft.ServiceBus.ConnectionString のエントリが生成されているので、
そこに SendRule に対応する接続文字列を指定します。

App.config

EventHubClient オブジェクトを初期化するときに、
サービス バスの名前空間ではなく、イベント ハブの名前を指定します。
特殊な指定方法ですが、これで接続文字列が .config ファイルから読み込まれます。

あとは、送りたいメッセージをバイナリ データ (byte[] や Stream) に変換して、
Send または SendAsync メソッドに渡すだけです。
複数の属性値を持つオブジェクトを送信するには、JSON などにシリアライズするとよいでしょう。

 

受信側の実装

送信側のときと同様、App.config に、ReceiveRule に対応する接続文字列を設定します。
なお、イベント ハブのほかに、ストレージの接続文字列も設定します。

EventProcessorHost オブジェクトを初期化するには接続文字列が必要になりますが、
送信側のときとは異なり、.config ファイルから透過的に読み込む機能はないため、明示的に接続文字列を取得しています。

App.config

通知されたイベントを実際に処理するクラスとして、IEventProcessor インターフェイスを実装したクラスを作成しなければなりません。
パーティション 1 つにつき、そのインスタンスが 1 つ生成されます。

ここでは StaticEventProcessor クラスを作成しましたが、
内部的に既定のコンストラクターが呼び出されて初期化されるため、外からデリゲートを渡すのが難しい構造です。
実装がややこしくなるため、この SDK には改良の余地があるように思えます。

 

さて、上記の実装をもとに、送信側の WPF アプリケーション (SenderWpf) をマウスなどでドラッグして移動させると
受信側の WPF アプリケーション (ReceiverWpf) が自動的に同じ座標に追従するというサンプルを作成しました。
完全なソースコードは EventHubsSample – GitHub にあります。

Event Hubs - sync apps

なお、その他の注意点は以下の通りです。

  • イベントの到着の順序は保証されません。
    (上のサンプルで非連続な動作があるのはそのためです。)
  • PartitionContext や EventData は一意の SequenceNumber を持ちますが、
    これらはパーティションの中で一意であって、コンシューマー グループ全体で一意になるわけではありません。
    したがって、メッセージに一意性を持たせるには、ID や時刻を含めて送信する必要があります。
  • それぞれのデータは、コンシューマー グループ 1 つにつき 1 回だけ配信されます。
    同じコンシューマー グループに設定したアプリケーションを 2 つ起動すると、
    受信するデータが半分ずつ程度に分散してしまいます。
    コンシューマー グループを追加することにより、送信側と受信側を多対多にすることができます。
  • PartitionContext.CheckpointAsync メソッドにより、イベントを受信したことを記録します。
    これが呼び出されないと、また同じイベントが通知されます。
    また、送信側が稼働しているのに受信側が稼働していない場合もデータは蓄積されているため、
    次に受信側を起動したときに大量に押し寄せてくることがあります。

 

作成したサンプル
EventHubsSample (GitHub)

バージョン情報
.NET Framework 4.5
WindowsAzure.ServiceBus 3.0.1
Microsoft.Azure.ServiceBus.EventProcessorHost 2.0.2

参照
Event Hubs の使用

カテゴリー: クラウド. タグ: , . Leave a Comment »

「クラウドではじめる機械学習 Azure ML でらくらく体験」書評

6 月に発売された書籍「クラウドではじめる機械学習 Azure ML でらくらく体験」を献本していただき、
書評を書くことになりました。

Azure Machine Learning の登場により、機械学習の専門の開発者でなくても、機械学習を Web で利用できるようになりました。
本書では機械学習の仕組みと Azure Machine Learning の手順が示されており、
実際のデータで機械学習を試しながら身に付けることができます。

クラウドではじめる機械学習 Azure ML でらくらく体験
クラウドではじめる機械学習 Azure ML でらくらく体験

 

主な章の構成

  • Chapter 3: 機械学習で実現できること
    • 機械学習とは何かを知るための概要
    • おそらく、多くの読者がまず知りたい部分
  • Chapter 4~7: 機械学習の各手法 (回帰、クラスタリングなど) についての理論と実践
    • 数学をベースとした、機械学習の仕組みの説明
    • Azure Machine Learning で各手法を使うための手順
  • Chapter 8: Web サービス化
    • 任意のアプリケーションから呼び出して使うには、機械学習の Web サービス化が必要
    • 主にソフトウェア開発者向け

 

本書の特徴

機械学習の各手法の理論について、数学をベースとした説明がなされているため、
アルゴリズムの選択やチューニングの指針の理解が深まり、応用範囲が広がるでしょう。
例えば、「線形回帰」と「ベイズ線形回帰」の違いや使い分けについて理解できるようになります。

 

対象となる読者

「難しそう」という先入観で機械学習に手を出せなかった人におすすめします。
想定されるロールは次のような感じでしょうか。

  • ソフトウェア開発者
  • データ分析者 (開発者とは限らない)

本書には、数学の知識があまりない人でも理解できるようにと義務教育レベルからの数学の解説があります。
しかし、機械学習の仕組みを理解するには数学 (とくに確率統計) への慣れが必要であり、さすがに無理を感じます。
数学の経験を持つ人でも機械学習を机上だけで理解するのは難しく、理論と実践の反復が必要になると思います。

とはいえ、とりあえず手順通りに実行してみればだんだん理解できるようになるのかもしれません。

 

不足を感じる部分

Azure Machine Learning についての説明がところどころ十分ではないように見えます。
例えば次の内容についてです。

  • データ型、カテゴリ、ラベルなど
  • Web Service Parameters

必要に応じて公式ドキュメントを参照するとよいでしょう。

 

Azure Machine Learning 自体のよいところ

Azure Machine Learning は Web 上のサービスとして提供されており、
しかもドラッグ アンド ドロップを中心とした GUI でモデリングができるため、
ワークフローを短時間で構築できて学習効率が高いです。

また、任意のアプリケーションから機械学習を利用できるようにするためには、
ワークフローを Web サービスとして発行する必要がありますが、ボタン 1 つで発行できるようになっています。

処理をカスタマイズしたい場合は、R や Python で処理を記述することもできます。

Azure と Visual Studio Online (Git) で継続的インテグレーション

(追記:この記事の改訂版→ Azure と VSTS で継続的デプロイ (2017) )

以前に Windows Azure と Visual Studio Online で継続的インテグレーションというのを書きましたが、
今回は、リポジトリの種類として TFVC ではなく Git を使ってみます。

Visual Studio Online (Git) に Web アプリケーションのソース コードをコミットすると、
自動的にビルドが開始して Azure Web アプリにデプロイされる、という
継続的インテグレーション (Continuous Integration, CI) を構成するための手順について記述します。

 

■ ソリューションをコミットする

まず、Visual Studio Online で Git のチーム プロジェクトを作成しておきます。
Visual Studio でソリューションのみを作成して、Visual Studio Online にコミット・プッシュします。
ソリューションを作成する手順は後でもかまいませんが、
ここで作成しておくと、ビルド定義にソリューションへのパスが自動で含まれるようになります。

image

 

■ Azure Web アプリを作成する

Microsoft Azure の管理ポータルで、新規の Web アプリを作成します。[カスタム作成] を選択します。

image

作成する Web アプリの URL を入力し、[ソース管理から発行] をオンにします。

image

ソースコードのリポジトリの種類を指定します。
[Visual Studio Online] を選択します。

image

Visual Studio Online の URL を指定します。
[今すぐ承認] をクリックすると Visual Studio Online 側の承認画面が表示されるので、[Accept] をクリックします。

image

リポジトリ名 (チーム プロジェクト名) を選択して、右下の ✓ をクリックすれば Web アプリが作成されます。

image

このとき同時に、Visual Studio Online にビルド定義が作成されます。
なお、ソース管理システムと連携されていない Web アプリにあとから連携を追加することもできます。

 

■ ビルド定義を編集する

Visual Studio で、先ほど作成されたビルド定義を編集します。
既定では、ビルド定義は「(サイト名)_CD」という名前で作成されています。
この名前を変更しても、デプロイ構成には影響ありません。

image

[全般] の [キューの処理] が [有効] に設定されていることを確認します。

image

ビルドのトリガーは、既定で [継続的インテグレーション] に設定されています。
この設定のときでも、ビルドのメニューから手動で開始することもできます。

image

ソースの場所は、分岐まで指定できます。
本番用 (Production) とテスト用 (Staging) の環境を用意したい場合は、
それぞれの Azure Web アプリを作成し、それぞれを master と開発用の分岐に関連付けるなどするとよいでしょう。

image

ビルドの出力場所は既定で [ビルド出力をサーバーにコピーする] に設定されています。

image

ターゲットのソリューションまたはプロジェクトを [2. Build] – [Projects] で指定します。
Release ビルドにするには、[2. Build] – [Configurations] で、Release 用の構成を追加します。

image

なお、ビルド定義と Azure Web アプリは、[Windows Azure Deployment Environment] の値で関連付けられています。

image

 

■ Web アプリケーションをコミットする

Web アプリケーションを作成します。
ここでは例として、[ASP.NET Web アプリケーション] を選択し、テンプレートから [MVC] を選択します。

image

これらのファイルを Visual Studio Online にコミット・プッシュします。
すると、ビルドが自動的に開始され、Azure Web アプリに初回のビルドがデプロイされます。

Visual Studio Online での表示:

image

Azure Web アプリでの表示:

image

 

ビルドおよびデプロイに成功すると、Web アプリが実行されるようになります。

image

ビルド定義で [ビルド出力をサーバーにコピーする] に設定されている場合、
ビルドの実行ログの [Download drop as zip] でデプロイされたビルド一式を取得できます。

image

Monaco で配置フォルダーを覗いてみると、BuildInfo.config というファイルが作成されています。
これにより、現在デプロイされているビルドの情報を確認することができます。

image

 

以上で、継続的インテグレーションが構成されました。
その後も、ソース コードをコミットするたびに自動的にビルドおよびデプロイが実施されます。

過去のバージョンを選択して再デプロイすることもできます。

image

 

バージョン情報
Visual Studio 2013

参照
Visual Studio Online と Git を使用した Azure への継続的な配信
Windows Azure と Visual Studio Online で継続的インテグレーション (1)
Azure と GitHub で継続的インテグレーション

Azure Machine Learning で色のクラスタリング (3)

前回の Azure Machine Learning で色のクラスタリング (2) では、
学習済みのクラスタリング モデルを利用して、新たなデータをクラスターに割り当てる方法を示しました。

この学習済みのクラスタリング モデルは、保存して再利用することができます。
[Train Clustering Model] の出力の左側の ○ を右クリックして、
[Save as Trained Model] をクリックします。

image

名前を付けます。

image

これで保存ができました。

image

Experiment 上で [Trained Models] から選択できるようになります。

image

 

では次に、この保存した学習済みクラスタリング モデルを Web サービス化してみましょう。
学習済みモデルに [Assign to Clusters] を接続します。

image

さて、上の図のようにモデリングして、
最終的に ColorData.csv の部分を Web サービスの入力に差し替えればよいはずなのですが、
なぜかこの入力データの部分の行数が少ないと、
結果の Assignments がすべて行数未満の数値になってしまうという現象が発生しています。
(2 行のときは、0 または 1 にしかならない。)

image

 

仕方がないので、次の図のように、ダミーのデータを 10 件用意しておき、
入力データに追加して Assign to Clusters を通し、Execute R Script で削除するようにしました。

image

後方の 10 件を削除するための R のスクリプトは次の通りです。

[Prepare Web service] をクリックします。

image

すると、Web サービスの入力および出力を示す青色のモジュールが追加されます。
次の図のように線を接続します。

image

この状態で実行します。
完了すると、ボタンが [Publish Web service] に変わるので、これをクリックします。

image

 

これで、Web サービスが発行されました。

image

HTTP ベースのインターフェイスの説明をはじめとして、ヘルプ ページが自動的に生成されます。
API を呼び出すための Excel ファイルまで用意されています。

image

[Test] をクリックして、API のテストをしてみましょう。
必要な情報を入力して実行します (今回は色相だけ入力すれば十分です)。

image

結果は下の部分に表示されます。

image

 

さらに、C# のコンソール アプリケーションから API を呼び出してみましょう。
サンプル コードがヘルプ ページ上に生成されているので、これをコピーして使います。

image

NuGet で Microsoft.AspNet.WebApi.Client をインストールして、API キーを設定します。
あとは入力データを設定します (今回は色相だけ入力すれば十分です)。

image

実行します。
運が良ければ 1 秒程度で結果が返ってきますが、運が悪いと 20 秒くらいかかることもあります。

image

試してみた操作はこれで以上です。

 

まとめ・注意点

  • Machine Learning を利用するにあたり、.NET の知識は必要ありません。
    (Machine Learning 単体では、.NET とは直接関係ありません。)
  • クラスタリングはアルゴリズムの選定で迷うところがないので、とりあえずデータさえあればできるという印象です。
  • まったく同一のデータ ファイルおよびアルゴリズムで実行すれば結果は同じになりますが、
    評価に関係ない列の値が変わるだけで結果が変わることがあります。
  • 現在の Machine Learning は、米国中南部リージョンでのみ提供されています。

 

前回: Azure Machine Learning で色のクラスタリング (2)

作成したサンプル
Clustering Colors 4: Web service API (Azure ML Gallery)
AzureMLSample (GitHub)

Azure Machine Learning で色のクラスタリング (2)

前回の Azure Machine Learning で色のクラスタリング (1) では、
色データを色相でクラスタリングし、その結果をストレージに出力するところまで完了しました。

image

このクラスタリングの結果 (ColorData-Hue-10.csv) を WPF で視覚化したものがこちらです。
(全体のソースコードは GitHub の AzureMLSample にあります。)
クラスター数はもう少し大きめでよかったかもしれません。

image

 

いろいろ評価条件を変えてクラスタリングを試してみましょう。
次の図のように、先ほどのモデルの右側に、同様のモジュールを 3 種類追加します。
モジュールを複数選択して、コピー アンド ペーストすると速いです。

image

追加した 3 系統では、次のようにパラメーターを設定します。

(i)
クラスター数: 20
対象列: R, G, B
出力ファイル名: ColorData-RGB-20.csv

(ii)
クラスター数: 20
対象列: Hue, Saturation, Brightness
出力ファイル名: ColorData-HSB-20.csv

(iii)
クラスター数: 20
対象列: R, G, B, Hue, Saturation, Brightness
出力ファイル名: ColorData-All-20.csv

 

また、全列の値のスケールを合わせるため、[Normalize Data] を追加しています。
スケールを合わせないと、値の範囲の大きさにより列ごとに重みが変わります。
[Transformation method] で [MinMax] を選択すれば、0 から 1 までの範囲の値に線形変換されます。

image

 

実行して結果を見てみましょう。
全体的に、色相以外の彩度および明度の特徴も出ています。

(i) R, G, B

image

(ii) Hue, Saturation, Brightness

image

(iii) R, G, B, Hue, Saturation, Brightness

image

 

次に、学習済みのクラスタリング モデルを使って、新たな色データを各クラスターに振り分けてみましょう。

新たな色データとして、NIPPON COLORS – 日本の伝統色に記載されているものを利用します。
最初の ColorData.csv と同じようにデータを準備します。

image

この色データ (ColorData-JP.csv) をデータセットとしてアップロードし、
色相でクラスタリングしたときの Experiment を次のように変更します。

image

[Assign to Clusters] は、新たな入力データを学習済みのクラスターに振り分けるためのものです。
プロパティの対象列で Hue を選択します。

image

実行結果はこの通りです。
最初の ColorData-Hue-10.csv と同様のクラスターに色が振り分けられています。

image

 

次回は Web サービス化についてです。

前回: Azure Machine Learning で色のクラスタリング (1)
次回: Azure Machine Learning で色のクラスタリング (3)

作成したサンプル
Clustering Colors 2: by various features (Azure ML Gallery)
Clustering Colors 3: Assign new data to clusters (Azure ML Gallery)
AzureMLSample (GitHub)

参照
NIPPON COLORS – 日本の伝統色