2016年7月17日日曜日

【Microsott HoloLens + Cognitive Services】撮影したイメージをCognitiveServicesへ、というスクリプト

HoloLens、楽しそうですよね。
https://www.microsoft.com/microsoft-hololens/en-us

ということで、Azureと連携したものを作ってみるのですが、せっかくなのでCognitiveServicesを使ってみます。
https://azure.microsoft.com/ja-jp/services/cognitive-services/

開発環境はこちらを見て構築します。
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

どうしても日本語が好きな人は、世界のやまささんのブログを参考に。
セッティング方法自体はあってます。
http://blog.nnasaki.com/entry/2016/04/02/105956

今回は、HoloLensについているカメラの画像を撮影して、それをCognitive Services の Emotion API で解析してJSONを受け取るものを作ります。
なお、すべてのコーディングはUnity側で行っています。

細かいセッティングなどは後日詳細を説明しますが、C#入門2週間の私が困ったスクリプトについてを今回はかいつまんで。

Cognitive Services のSDKはすでに公開されているので、これを使おうと思ったのですが...
https://github.com/Microsoft/Cognitive-emotion-windows

Unityでうまくコンパイルできなかったので、WWWクラスで直接 REST API を叩きます。
そのC#スクリプトはこちら。
using UnityEngine;
using System.Collections;

// ここから下5行を追加で読み込み
using System.Collections.Generic;
using System.Text;
using System.IO;
using UnityEngine.UI;
using System;

public class CapScreen : MonoBehaviour {

    public WebCamTexture webcam;
    public Texture2D texture;

    public Text res;

  // Use this for initialization
  void Start () {

        // カメラからの画像を取得開始
        WebCamDevice[] devices = WebCamTexture.devices;
        if (devices.Length > 0)
        {
            webcam = new WebCamTexture(devices[0].name, 320, 240, 10);
            webcam.Play();
        }
    }

    // Update is called once per frame
    void Update() {
    }

    // onClock event
    public void OnClick () {

        // カメラより画像をキャプチャ
        Color32[] pixels = webcam.GetPixels32();
        if (texture) Destroy(texture);
        texture = new Texture2D(webcam.width, webcam.height);
        texture.SetPixels32(pixels);

        // Cognitive Services Emotion API をコール
        StartCoroutine(WaitForRes());
    }

    // WWWクラスを使って Emotion API を呼び出す関数
    IEnumerator WaitForRes()
    {
        // 画像をJPEGとして取り出す
        Byte[] bytes = texture.EncodeToJPG();

        // Emotion REST API


        string url = "https://api.projectoxford.ai/emotion/v1.0/recognize";

        // リクエストヘッダー
        Dictionary header = new Dictionary();
        header.Add("Content-Type", "application/octet-stream");
        header.Add("Ocp-Apim-Subscription-Key", "自身のサブスクリプションキー");

        // リクエストする
        WWW www = new WWW(url, bytes, header);

        // 非同期なのでレスポンスを待つ
        yield return www;

        // エラーじゃなければ解析結果のJSONを取得
        if (www.error == null)
        {
            res.text = www.text;
        }
    }
}

次に続きます。


2016年7月4日月曜日

【Microsoft Azure】ついでにロックされたストレージのリソースをazure-cliで解放する

これは消せなくなったストレージを消すための備忘録。

リースがロックされているBLOBを解放。
$ azure storage blob lease break -a ストレージアカウント名 -k "アクセスキー" コンテナ名 BLOB名

リソースがロックされているコンテナを解放。
$ azure storage container lease break -a ストレージアカウント名 -k "アクセスキー" コンテナ名

【Microsoft Azure】今更ながらクラシックな仮想マシンをリソースマネージャーへ移行 with azure-cli

以前作った仮想マシンを、いい加減リソースマネージャーに移行しようと思い、今更ながらazure-cliでの手順をまとめてみましょう。

まず、方針はこんな感じ。

・リソースグループの作成
・リソースグループに新しいストレージアカウントとコンテナを作成
・クラシックなストレージから作成したストレージにVHDをコピー
・仮想ネットワーク、仮想NIC(セキュリティ)、パブリックIPを作成
・コピーしたVHDから仮想マシンを作成

まずは事前にログインして、該当するサブスクリプションをセットしておきます。
$ azure login
$ azure account list
$ azure account set サブスクリプションID

忘れずにARMモードにします。
$ azure config mode arm

リソースグループを東日本リージョンに作成します。
$ azure group create リソースグループ名 JapanEast

ストレージアカウントを追加して、コンテナを作成します。
とりあえずLRSで東日本リージョンに作ります。
$ azure storage account create --resource-group リソースグループ名 --sku-name LRS --location JapanEast --kind storage ストレージアカウント名

コンテナを作成するために、アクセスキーを確認します。
表示されたリストのkey1を使ってコンテナを作成します。
アクセスキーは念のため「"」で囲んでいます。
$ azure storage account keys list --resource-group リソースグループ名 ストレージアカウント名
$ azure storage container create -a ストレージアカウント名 -k "アクセスキー" コンテナ名

既存の古いストレージからVHDをコピーします。
$ azure storage blob copy start -a 古いストレージアカウント名 -k "古いアクセスキー" --dest-account-name 新しいストレージアカウント名 --dest-account-key "新しいアクセスキー" "既存VHDのURI" コンテナ名

仮想ネットワーク、仮想ネットワークインターフェースなどを東日本リージョンに作成します。
$ azure network vnet create リソースグループ名 仮想ネットワーク名 JapanEast
$ azure network vnet subnet create -a 10.0.0.0/24 リソースグループ名 仮想ネットワーク名 サブネット名
$ azure network public-ip create リソースグループ名 パブリックIPアドレス名 JapanEast
$ azure network nsg create リソースグループ名 セキュリティグループ名 JapanEast
$ azure network nic create --subnet-name サブネット名 --subnet-vnet-name 仮想ネットワーク名 --network-security-group-name セキュリティグループ名 --public-ip-name パブリックIPアドレス名 リソースグループ名 仮想NIC名 JapanEast

最後にVHDから仮想マシンを作成します。
$ azure vm create -d コピーしたVHDのURI --nic-name 仮想NIC名 --vnet-name 仮想ネットワーク名 --public-ip-name パブリックIPアドレス名 リソースグループ名 仮想マシン名 JapanEast Linux

といろいろやってみたところ、マイグレーションのツールがGAしたようで...
https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-cli-migration-classic-resource-manager/

2016年6月4日土曜日

【Deep Learning】白黒写真に自動的に色をつけるツールを実行してみよう

ディープラーニングを用いて、白黒写真に自動的に色をつける技術が確立されたとのこと。
https://www.waseda.jp/culture/archives/news/2016/06/01/2299/

この発表と共に、その成果がgithubで公開されているので、手元のMacOSX El Capitanで動かしてみることにします。
環境がUbuntu14.0.4とありますが、無視してMacOSXでやっちゃいます。
(ほんとはラズパイでやりたかったのですが、ARMだとちょっと問題があってできてないです...)

なお、ライセンスがCreativeCommonsで非商用利用に限るようなので、そのつもりで。

このツールは、Torchをベースにluaで書かれています。
もしかして頑張ればFlashAirで動いたりして...

まずは準備として、libjpegとlibpngをソースから入れておきます。
当然、開発ツールは必須です。
$ tar zxvf jpegsrc.v8b.tar.gz
$ cd jpeg-8b/
$ ./configure
$ make
$ sudo make install
$ make clean
$ cd ..
$ tar zxvf libpng-1.6.21.tar.gz
$ cd libpng-1.6.21
$ ./configure
$ make
$ sudo make install
$ cd ..

次はTorchの導入です。動作に必要なluaも一緒に入ります。
インストールの間に、.bashrcにPATHを追加してくれるので、インストール終了後にsourceしてあげましょう。
$ git clone https://github.com/torch/distro.git ~/torch --recursive
$ cd ~/torch
$ bash install-deps
$ bash install.sh
$ source ~/.bashrc

MacOSXの場合は、.bash_profileに「~/torch/install/bin」へパスを通す設定を自分で追加してsourceしてください。

インストールが終わったら、「th」を実行するとTorchが動くはずです。
$ th

  ______             __   |  Torch7                                         
 /_  __/__  ________/ /   |  Scientific computing for Lua. 
  / / / _ \/ __/ __/ _ \  |  Type ? for help                                
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch         
                          |  http://torch.ch                  
th>


次は、luarocksを使って必要なモジュールの追加です。
$ luarocks install image
$ luarocks install nn
$ luarocks install nngraph

そして、色をつけるツールをインストール。
$ git clone https://github.com/satoshiiizuka/siggraph2016_colorization.git
$ cd siggraph2016_colorization
$ ./download_model.sh

適当な白黒画像で実践してみましょう。普通に変換できました。
$ th colorize.lua test.jpg test_color.jpg

2016年4月22日金曜日

【Microsoft Azure】Azure Container Service がGAしたので改めてやってみる

試してみたらすぐにGA(一般供用開始)しましたね、ACS。
https://azure.microsoft.com/ja-jp/services/container-service/

ということで、ARMテンプレートを変更しなくても良くなったので、再度手順を確認しましょう。

ポータルからさくっと作れますので、スクリーンショットを交えて。
まずは「NEW」→「Containers」→「Azure Container Service」と選択。
















文章を下の「Create」をどうぞ。



















Dockerホスト(Ubuntu 14.04.4 LTSです!)のユーザー名、ログインのためのRSA公開鍵、サブスクリプション、リソース、ロケーションを入力して「OK」















オーケストレーションツールを「DC/OS(Mesos)」と「Swarm」から選んで「OK」
※今回はSwarmを選択してみた
















ACSの設定です。
エージェント数(コンテナホストのVM数ですね)、エージェントの仮想マシンのサイズ(デフォルトはStandard_D2)、マスターの数(冗長構成なら3以上)、DNSプレフィックスを入力して「OK」
















内容を確認して「OK」












料金などの注意事項を読んでから「Create」でACS構築開始












とにかく待つ


















できあがる










「Resource Groups」からリソースを選び、デプロイ履歴を確認。
「Outputs」の中に、MASTERFQDN、SSHMASTER0(ssh接続時のコマンド)、AGENTFQDN(実際のWebアプリのURI)があるので確認。

















SSHでつないで、dockerコマンドでプロセスを見る。
$ ssh xxx@xxxmgmt.japaneast.cloudapp.azure.com -A -p 2200
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Apr 22 04:20:31 UTC 2016

  System load:  0.43              Processes:              138
  Usage of /:   5.7% of 28.80GB   Users logged in:        0
  Memory usage: 3%                IP address for eth0:    172.16.0.5
  Swap usage:   0%                IP address for docker0: 172.17.0.1

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
0d9a7203292a        yeasy/simple-web    "/bin/sh -c 'python i"   26 seconds ago      Up 24 seconds       0.0.0.0:32771->80/tcp                                                                                                                xxx_web_1
822c18291112        swarm:1.1.0         "/swarm manage --repl"   11 minutes ago      Up 9 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
618799d9ffee        progrium/consul     "/bin/start -server -"   11 minutes ago      Up 9 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1


以下の内容でdocker-compose.ymlを作成。
$ vi docker-compose.yml 
web:
  image: "yeasy/simple-web"
  ports:
    - "80"
  restart: "always"

docker-composeコマンドでデプロイ。そしてスケール。
$ docker-compose up -d
xxx_web_1 is up-to-date

$ docker-compose scale web=5
Creating and starting 2 ... done
Creating and starting 3 ... done
Creating and starting 4 ... done
Creating and starting 5 ... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
3e30842b5e74        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32774->80/tcp                                                                                                                xxx_web_5
96776a5764b5        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32773->80/tcp                                                                                                                xxx_web_4
f858be340919        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32775->80/tcp                                                                                                                xxx_web_2
57943899efc4        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 4 seconds        0.0.0.0:32772->80/tcp                                                                                                                xxx_web_3
0d9a7203292a        yeasy/simple-web    "/bin/sh -c 'python i"   51 seconds ago      Up 49 seconds       0.0.0.0:32771->80/tcp                                                                                                                xxx_web_1
822c18291112        swarm:1.1.0         "/swarm manage --repl"   11 minutes ago      Up 9 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
618799d9ffee        progrium/consul     "/bin/start -server -"   11 minutes ago      Up 9 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

気になる点は、仮想マシンのスケールセットのCapacityに変更がない(でも問題なくdockerでスケールできてる)ことでしょうか?
仮想マシンもスケールしてました。

これで気楽に(お金は気にしてねw)DockerでDevOpsに入門してねー。

追記:Webアプリに繋がらんのでちょっと調べてみなければ...


2016年4月15日金曜日

【Microsoft Azure】Azure Container Service の agent の数を増やしたい

前回の投稿で設定したDockerコンテナですが、そのままではひとつ難点があります。
スケールする場合のエージェントの数が増やせないのです。

仮想マシンのスケールセット(以下VMSS)を利用しているので、本来であればポータルから変更したいところですが、今はまだできません。
VMSSについてはこちら。
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machine-scale-sets-windows-create/

見てる限りでは、VMSSのcapacityを変更できれば、Docker側から設定した数を上限にスケールできそうです。
今回はこれを変更するために、Azure Resource Explorer を使います。
https://resources.azure.com/

まずAzure Resource Explorerに、ポータルにログインしているブラウザでアクセスします。
このときに、右上の「Read/Write」をクリックして読み書き可能にする必要があります。







次は、左ペインのメニューを、
subscription→ACSのサブスクリプション→resourceGroups→ACSのリソース→Microsoft.Compute→virtualMachineScaleSets→該当するScaleSet
の順に選択します。

ScaleSetのリソースは、こんな感じで表示されます。
















「EDIT」をクリックして、「sku」の中の「capacity」を1から3に変更します。
変更したら「PUT」を押します。
















capacityが3に変更されました。
















ポータルで見てみましょう。
「仮想マシンのスケールセット」を探してみましょう。
こんな風に3に変わっていると思います。










容量(capacity)が3になったので、docker-compose でスケールしてみましょう。
azureuser@xxx:~$  docker-compose scale web=3
Creating and starting 2 ... done
Creating and starting 3 ... done
azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
242e38975a34        yeasy/simple-web    "/bin/sh -c 'python i"   5 seconds ago       Up 4 seconds        0.0.0.0:32770->80/tcp                                                                                                                azureuser_web_3
e27e1035774c        yeasy/simple-web    "/bin/sh -c 'python i"   5 seconds ago       Up 4 seconds        0.0.0.0:32769->80/tcp                                                                                                                azureuser_web_2
ae8a0ea43b50        yeasy/simple-web    "/bin/sh -c 'python i"   45 minutes ago      Up 45 minutes       0.0.0.0:32768->80/tcp                                                                                                                azureuser_web_1
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   About an hour ago   Up About an hour    0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   About an hour ago   Up About an hour    0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

前回の記事が1だったので、無事スケールできています。




















【Microsoft Azure】Azure Container Service で Docker と向き合う

いろいろあってDockerと向き合うことになったので、Azure でやるなら Azure Container Service(以下ACS) を使ってみようと。
https://azure.microsoft.com/ja-jp/services/container-service/

Apache Mesos または Docker Swarm のどちらかのオーケストレーションツールを使ってDockerコンテナを管理するっていうので、今回はDockerSwarmを選択。

構成などについては、こちらのドキュメントをまずは読んでください。
https://github.com/Azure/azure-quickstart-templates/blob/master/101-acs-swarm/docs/SwarmWalkthrough.md

ACSは、ポータルの「テンプレートからデプロイ」でARMテンプレートを使ってデプロイします。












こちらから「テンプレートのデプロイ」を選択します。



















ACSのテンプレートはgithubで公開されています。
https://github.com/Azure/azure-quickstart-templates/tree/master/101-acs-swarm (これはDockerSwarmのもの)

実際に使うARMテンプレートはこちら。これを
https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-acs-swarm/azuredeploy.json

「テンプレートの編集」を選んで















ACSのARMテンプレートを貼り付けて保存します。













次に、パラメーターをセットします。
とりあえず、DNSNAMEPREFIX(FQDNにつける識別用プレフィックス)とSSHRSAPUBLICKEY(SSHでアクセスする際のRSA公開鍵)を入力して「OK」を押します。

















リソースグループを選ぶなり作成するなりして、リージョンを決めます。
最後に、法律条項を確認して作成します。















デプロイが終わると、以下の2つのFQDNが決定します。

masterFQDN:{DNSNAMEPREFIX}mgmt.japaneast.cloudapp.azure.com
agentFQDN:  {DNSNAMEPREFIX}agents.japaneast.cloudapp.azure.com

masterへのssh接続は、以下のようにします。公開鍵が登録されているので、秘密鍵のパスフレーズでログイン出来ます。

$ ssh azureuser@{DNSNAMEPREFIX}mgmt.japaneast.cloudapp.azure.com -A -p 2200

Are you sure you want to continue connecting (yes/no)? yes
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Apr 15 08:28:32 UTC 2016

  System load: 0.15              Memory usage: 1%   Processes:       98
  Usage of /:  5.7% of 28.80GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   10 minutes ago      Up 8 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   10 minutes ago      Up 8 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

とりあえず動いています。
ここで簡単なWebアプリコンテナを動かしてみます。
以下の内容で、docker-compose.ymlというファイルを作成します。
web:
  image: "yeasy/simple-web"
  ports:
    - "80"
  restart: "always"

それから、docker-composeコマンドでコンテナをUPします。
docker ps コマンドで確認できます。
azureuser@xxx:~$ docker-compose up -d
Pulling web (yeasy/simple-web:latest)...
latest: Pulling from yeasy/simple-web
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
d1784d73276e: Pull complete
72e581645fc3: Pull complete
9709ddcc4d24: Pull complete
2d600f0ec235: Pull complete
de1491f1bbd4: Pull complete
4becc568d2ff: Pull complete
6aeb62f4b3fa: Pull complete
77144c15ca8f: Pull complete
811db2e8b100: Pull complete
Digest: sha256:35e52520b8f98a092af6ce10c9fdd3ca6ca77f0b79f9d652c29bdd5d17c1c7aa
Status: Downloaded newer image for yeasy/simple-web:latest
Creating azureuser_web_1
azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
ae8a0ea43b50        yeasy/simple-web    "/bin/sh -c 'python i"   23 seconds ago      Up 22 seconds       0.0.0.0:32768->80/tcp                                                                                                                azureuser_web_1
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   20 minutes ago      Up 19 minutes       0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   20 minutes ago      Up 19 minutes       0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1                                                                                                             containers_swarm_1

ブラウザから「{DNSNAMEPREFIX}agents.japaneast.cloudapp.azure.com」へアクセスするとWebアプリの画面が見えます。