2019年7月9日火曜日

【Microsoft Azure】 Azure Kinect Sensor SDK on Linux っていうか Ubuntu 18.04 にインストールしてみる

Azure Kineck DK が発売されたので、SDKを準備してみます@Ubuntu。

なお、Windowsでの準備はこちらのぶちぞーさんのブログをどうぞ。

SDKは現時点ではUbuntu18.04(bionic)のみ対応になります。
詳しくは公式ドキュメントをご覧ください。

SDKをインストールする前に、Microsoftのパッケージリポジトリを参照する必要があります。

リポジトリの設定から行いましょう。
なお、ここからはターミナルからコマンドを入力するスタイルで参ります。
面倒なので管理者権限で行なっていますが、良い子はsudoを使いましょうね。
# curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
# apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod   

64bit環境ではi386アーキテクチャをサポートしていない旨が表示されますが、問題ないので続けます。

準備ができたので、まず k4a-tools をインストールします。
このパッケージは Azure Kinect Viewer、Azure Kinect Recorder、Azure Kinect Firmware Tool が含まれます。
# apt install k4a-tools                                                         

インストールが終わったら、次は開発用のヘッダーを含むライブラリをインストールします。
# apt install libk4a1.1-dev                                                  

これでインストールは完了です。

ここからはデスクトップが必要になりますので、コマンドはデスクトップアプリのターミナルなどから入力します。

早速、Azure Kinect Viewer を起動してみましょう。
ターミナルで以下のコマンドを入力するとウィンドウが開きます。
# k4aviewer                                                                           














こちらも実機がないので、レコーディングされたデータを再生。



















Perfomance Counters も出ます。




















なお、Ubuntu 18.04 の OpenGL が古いのか、3D表示にすると「GLSL 4.30 is not supported.」で落ちます。
対応するには自前でOpenGLをコンパイルする必要がありますので、こちらを参考にコンパイルしてみてください。
#うちのグラボがしょぼいからかもしれないが…


一通り動きそうなので、実機を楽しみに待つことにします。

2018年10月2日火曜日

【Microsoft Azure】Azure IoT Hub と相性の良さそうなデバイスを独断と偏見で

IoTというとラズパイがまず出てくるようになって久しいですが、3になってからは消費電力も多く、実質省電力PCになってきているようです。
本来IoTデバイスに求められるのは、省電力でネットワーク接続ができることではないだろうかと思うのですがどうなんでしょう。

という訳で、Azuere Sphere も手元に届いたので、Azure IoTを利用する観点から、自分が関わったりしているものを含めて技適も通ってるもの3つをピックアップして独断と偏見で比較してみようかと思います。

デバイス
M5Stack(ESP32)
MT3620(Azure Sphere)
特徴
ディスプレイとバッテリーが一体化している。
セキュリティ確保を目的としたAzureSphereOSを搭載。
Wi-Fi機能をもち、Luaプログラムが実行できるSDカード。GPIOを利用してマイコンとして利用可能。
価格
4,490円(スイッチサイエンス)
9,800円(秋月)
4,410円(Amazon公式)
開発OS
Windows、MacOS、Linux
Windows
テキストファイルが扱えれば何でも
開発言語
Processing
C++
Lua
開発ツール
Arduino IDE
Visual Studio
テキストファイル
Azure IoT SDK
GitHubにある(←私が作ったw)
備考
基盤はケースに入っている。拡張センサーはGroveなどでも接続できる。
基盤むき出しの開発キット。実は Device Provisioning Service に対応している。
SDカードなのでGPIOピンへの接続は別途基盤が必要


なお、ESP32は開発用のESP-WROOT-32というパッケージだともっと安く買える(もちろん基盤むき出し)ので、頑張って探してみてもいいかもしれません。

Azure Sphere OS は手元にデバイスがあるのでいろいろいじってみてまとめたいと思います。
シリアルコンソールからログインできないのは若干面白みに欠けますが...

2018年8月16日木曜日

my bloody valentine 2018/08/15 ToyosuPIT @Tokyo, JAPAN

SET LIST


i only said
when you sleep
new you
new song 2
you never should
honey power
new song 1
cigarette in your bed
only tomorrow
only shallow
what you want
thorn
nothing much to lose
who sees you
to here knows when
slow
soon
wonder 2
feed me with your kiss
you made me realise


15日は2013年の東京国際フォーラム以来の単独ライブでした。
2008年のFujiRock以降だいたいの公演見てるので、今回も参戦。

ケヴィンがバーガンディーミストのJaguarとかHiWattのアンプ使ってたり。
なお、彼のギターに関してはこちらにFenderのインタビューがあります。

Jazzmasterレジェンド、ケヴィン・シールズとメインギター。

サポートのキーボード/ギターのJen Macroもいい感じで馴染んでます。
HURTLiNGというバンドをやってて、ボーカル/ギターです。
浮遊感あるバンドですので、一聴の価値ありです。

野太いビリンダコールに、ビリンダがたまに反応してたり。
Marshall2台+Vox(たぶんAC30)2台のアンプ鳴らしてあちらも轟音。
なお、途中弾いてたシンセはたぶんJunoか。

デビー姐さんが相変わらずのかっこよさでベース弾きまくり、コーラスも綺麗で。
RDとおそらくオーダーメイドのJaguarベースと、DevidedBy13のヘッド2台にMarshallのキャビ2台でこちらも強烈。
wonder2ではFender Jaguarを使用。

コルムさん、AbbyRoadの頃のジョージ・ハリスンみたいに見えました(個人的感想)が、プレイは相変わらずキース・ムーン。
前回はPremierだった気もしますが(ちょっと覚えてない)、今回はLudwigのブルースパークル。
wonder2のギターはデビーと同じくFender Jaguar。
それ用なのか小さなVoxのコンボも置いてあった。

新曲は2曲。
1曲はピストルズみたいなコード進行のパンクかと思いきや、真ん中でNothing Much To Loseのイントロみたいになったり。
もう1曲は6/8のゆったりした浮遊感のある感じ。
予告されてるEPの曲でしょうかね。

なお、20曲もやったのは驚きでした。
12〜14曲ぐらいかと思ってましたが、新曲とmbvの曲を加えて、今までのライブの定番も全てやるとこの曲数ってことでしょう。

個人的には new you のケヴィンが弾くトレモロサウンド(おそらくBOSSのPN2だと思われる揺れ方)が気持ち良い音でした。
思ったよりペダルが多くない印象でしたが、残念ながら足元を見れなかったので確認できず。

wonder2ではお約束の全員ギター。
最後は言わずもがなのNoisePitだけど、聞く側がすっかり慣れてきたせいかいい感じのサイズでケヴィン先生切り上げてたように見えましたw
なお、ノイズ終る時の「ケヴィンがデビーを見る→デビーがコルムと合わせてベースを高く構えて振り下ろす→曲に戻る」瞬間が大好きです。
曲の終わりに、ケヴィン先生最後のノイズをカマしてきたのが悪戯っぽくてツボでした。

17日のSonicManiaは90分ぐらいのようなので、また違うセットになるのでしょうか。
確認がてら次も行ってきます。

2018年6月12日火曜日

【Microsoft Azure】ESP-WROOM-32 から Azure IoT Hub に接続してみる

最近勝手にあらゆるデバイスを Azure IoT Hub に接続するキャンペーンをしています。
一応前提として、MacOSXでの日本語環境で開発します。

今回は、Espressif Systems の ESP-WROOM-32 という無線通信モジュールから接続してみます。
https://www.switch-science.com/catalog/3156/

ESP-WROOM-32は、Arduinoではないのですが、Arduino IDEで開発ができます。今回は開発キットである ESPr Developer 32 を使います。
https://www.switch-science.com/catalog/3210/

セットアップ方法については以下を参照してください。
http://trac.switch-science.com/wiki/esp32_setup

それでは、Arduino IDE から、Azure IoT Hub の GetStartedサンプルを使って接続してみます。

Arduino IDE を立ち上げて、ボードの設定をします。
「ツール>ボード>ESP32 Dev Module」を選択します。



次に、シリアルポートの設定を行います。
「ツール>シリアルポート>/dev/cu.SLAB_USBtoUART」を選択します。




設定が終わったら、サンプルからAzure IoT Arduinoのスケッチを開きます。
「ファイル>スケッチ例>ESP32 Azure IoT Arduino>GetStarted」を選択します。





開いたサンプルの中の、以下の4箇所の値を設定します。
・DEVICE_ID(9行目):IoT Hubで設定したデバイスID
・ssid(13行目):接続するWi-FiアクセスポイントのSSID
・password(14行目):Wi-Fiパスワード
・connectionString(19行目):IoT Hubで設定したデバイスの接続文字列

設定したら、コンパイルして書き込みます。
以下の「⇨」ボタンを押すとコンパイル、デバイスへの書き込みを行い、プログラムを実行します。



プログラムの実行状況を確認するために、ターミナルからデバイスへシリアル接続をして確認します。
screenコマンドを実行するとこんな感じになると思います。
{"deviceId":"esp32", "messageId":270, "Temperature":24.000000, "Humidity":87.800003}
Info: >>>IoTHubClient_LL_SendEventAsync accepted message for transmission to IoT Hub.
Info: >>>Confirmation[269] received for message tracking id = 269 with result = IOTHUB_CLIENT_CONFIRMATION_OK
Send Confirmation Callback finished.
{"deviceId":"esp32", "messageId":271, "Temperature":25.000000, "Humidity":57.700001}
Info: >>>IoTHubClient_LL_SendEventAsync accepted message for transmission to IoT Hub.
Info: >>>Confirmation[270] received for message tracking id = 270 with result = IOTHUB_CLIENT_CONFIRMATION_OK
Send Confirmation Callback finished.



確認できたら、「control+a」を押した後に「k」を押してシリアル接続を中止します。

2018年5月19日土曜日

【Microsoft Azure】OpenBlocks IoT で Azure IoT Edge を動かしてみる

OpenBlocks IoT が Azure IoT Edge に対応したので、早速試してみましょう。

OpenBlocks IoT に関してはこちらをご覧ください。
https://openblocks.plathome.co.jp/products/obs_iot/vx2/

事前に準備しておくことは、以下のとおりです。

・OpenBlocksの初期設定とネットワーク接続
・AzureでIoTHubを作成しておく

上記の設定が終わったら、IoT Edgeを使うための設定を行います。


IoTHub側ですが、ポータルにログインしてメニューより「IoT Edge (preview)」を選びます。
(本日はまだプレビュー状態です)


次はデバイスを追加します。右上にある「+ Add IoT Edge Device」をクリックします。



任意のデバイスID(半角英数)を入力したら追加します。(今回は「ob」としてみました)
なお、このデバイスIDはそれぞれのデバイスに割り当てるもので、識別子となります。


追加されると、一覧に表示されます。






IoT Hub の設定はここまでです。

次は、OpenBlocksの管理画面からAzure IoT Edgeを導入します。
基本的には「iotedgectl」コマンドとWebGUIツールがインストールされます。

設定したIPアドレスでWebの管理画面へ接続します。
ポート番号は880です。






「メンテナンス」タブを開いて「機能拡張」で Azure IoT Edge を追加します。
実行ボタンを押すと機能拡張をインストールします。数分かかります。


インストールが終わったら再起動します。




再起動後にログインして、「サービス」タブから「Azure IoT Edge」のリンクをクリックします。



Azure IoT Edge のセットアップをします。
基本的には「接続文字列」のみ設定します。



接続文字列は、IoT Edgeのデバイスのページにある「接続文字列」(特に問題なければプライマリー)をコピーしてきます。(右のコピーボタンをクリックします)





文字列をコピーしたら「実行」ボタンを押してセットアップします。
このあたりは、バックエンドで「iotedgectl setup」コマンドを実行しています。




セットアップが終わったら、IoT Edge のエージェントを実行します。
「Azure IoT Edge」タブの中の「Edge状況」の画面で、「起動」ボタンをクリックします。
バックエンドで「iotedgectl start」コマンドが実行されます。
数分かかります。




表示がかわります。




起動が終わり正常に接続されると、Azureポータルの IoT Edge のデバイスの画面の
「Edge Runtime Response」の表示が「Connected」になります。







2018年3月7日水曜日

【Microsoft Quantum】Q#をMacOSXで動かしてみようではないか

Q#は、Microsoftが開発した量子計算言語です。
詳しくは戸倉彩さんのブログで解説があります。

もちろん、私はMacOSXで動かすわけですが、なんとMac向けSDKもリリースされています。
オリジナルのドキュメントはこちらです。

なお、動作環境として、以下の説明があります。
・AVXを使うのでSandyBridge以降を使った方がいい(そうじゃなくても動くとは思うけど)
・いくつかのサンプルはUIの関連でnpmを使うよ
・Pythonは3.6以降

早速、最新のVisualStudioCode(以下VSCode)をこちらからダウンロードしてインストールします。
(同じ手順でLinuxでも使えます)

ダウンロードして解凍後、私はアプリケーションフォルダに移動して使っています。

ダウンロード後、起動して更新を確認します。
Q# Developer Kit は最新のVSCode(確認時には1.20.1)が必要です。

次に、Microsoft Quantum Development Kit for Visual Studio Code Extension をインストールします。
こちらのサイトからインストール作業をすすめます。










Install(赤で囲んだ部分)をクリックするとVSCodeが起動します。
以下の画面が表示されると思うので、インストールをクリックします。







インストール後、Q# Development Kit project template をインストールします。
ここから先はターミナルです。

$ dotnet new -i "Microsoft.Quantum.ProjectTemplates::0.2-*"

これで環境設定は終わりです。
このままgithubにあるチュートリアルのコードを実行してみましょう。

githubからプロジェクトをクローンします。

$ git clone https://github.com/Microsoft/Quantum.git

クローンしたプロジェクトに移動し、サンプルのTeleportationを実行してみます。

$ cd Quantum/
$ cd Samples/Teleportation/
$ dotnet run
Round 0: Sent True, got True.
Teleportation successful!!

Round 1: Sent True, got True.
Teleportation successful!!

Round 2: Sent False, got False.
Teleportation successful!!

Round 3: Sent False, got False.
Teleportation successful!!

Round 4: Sent False, got False.
Teleportation successful!!

Round 5: Sent False, got False.
Teleportation successful!!

Round 6: Sent True, got True.
Teleportation successful!!

Round 7: Sent False, got False.
Teleportation successful!!



Press Enter to continue...

なお、Teleportationは、実行するたびに実行結果が異なります。
Teleportationは量子テレポーテーションをシミュレーションしたものです。

案外簡単にできますので、ぜひ興味をもっていただきたいです。
なお、4月に勉強会を予定してます。こちらで発表する予定です。







2017年10月18日水曜日

【Microsoft Azure, DeepLearning】Gluon API を Azure Cloud Shell で使う

10/12に、AWSとマイクロソフトが深層学習ライブラリ「Gluon」を発表しました。
http://www.businesswire.com/news/home/20171012005742/en/AWS-Microsoft-Announce-Gluon-Making-Deep-Learning

Gluon API は、githubでプロジェクトが公開されています。
https://github.com/gluon-api/gluon-api

今のところApache MXNetをサポートしていますが、近いうちに Microsoft Cognitive Toolkit もサポート予定です。

Pythonが動作すれば動かせそうなので、ここはひとつ、Azure Cloud Shell で動かしてみましょう。(UbuntuだからもちろんVMでもオンプレでも同様に使えます)

まず、AzureポータルでCloudShellを起動します。
右上の「>_」をクリックすると、ページの下にターミナルが立ち上がります。



次に、pip3でMXNetと関連するパッケージを導入します。
なお、アクセス権の問題で「--user」をつけてコマンドを実行してください。

$ pip3 install mxnet --user

インストールが終わったら、手書き文字認識のデモを動かしてみます。
githubのチュートリアルは Jupyter Notebook用のファイルなので、以下のページのPythonコードをコピペしてCloudShellにコードを置きます。
以下のように実行すると、学習データをダウンロードして実行します。(実行結果のスコアは環境によって異なります)

$ python3 sample.py
Downloading /home/takeshi/.mxnet/datasets/train-images-idx3-ubyte.gz from http://data.mxnet.io/data/mnist/train-images-idx3-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/train-labels-idx1-ubyte.gz from http://data.mxnet.io/data/mnist/train-labels-idx1-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/t10k-images-idx3-ubyte.gz from http://data.mxnet.io/data/mnist/t10k-images-idx3-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/t10k-labels-idx1-ubyte.gz from http://data.mxnet.io/data/mnist/t10k-labels-idx1-ubyte.gz...
Epoch 0. Current Loss: 0.13201400637626648.
Epoch 1. Current Loss: 0.14284838736057281.
Epoch 2. Current Loss: 0.015998387709259987.
Epoch 3. Current Loss: 0.1412399709224701.
Epoch 4. Current Loss: 0.01220973301678896.
Epoch 5. Current Loss: 0.020301349461078644.
Epoch 6. Current Loss: 0.008270819671452045.
Epoch 7. Current Loss: 0.001500518061220646.
Epoch 8. Current Loss: 0.0009114982676692307.
Epoch 9. Current Loss: 0.006475736387073994.

ちょっとしたことがCloudShellで出来ちゃいました。

2017年8月18日金曜日

【Microsoft Azure】空耳で気になる曲を Azure Media Analytics で解析してみよう(Python3編)

Azure Media Analytics は、メディアサービスが提供する分析機能です。
https://docs.microsoft.com/ja-jp/azure/media-services/media-services-analytics-overview

さんざんいろんな人が試してるとは思いますが、もちろんWindowsは使わない方向で考えて、Pythonで以下のライブラリを使ってみました。

amspy
https://github.com/msleal/amspy

試したところ、Python3で動作し、REST API をラップしているようです。

では、まずはUbuntuへの導入方法を。

最初にライブラリを導入するための、Python3用setuptoolsとpipをaptでインストールします。

$ sudo apt install python3-pip python3-setuptools

次に、pipを最新版にして、ストレージに接続するための Azure SDK for Python をインストールします。

$ sudo pip3 install —upgrade pip
$ sudo pip3 install azure

githubより、amspyをクローンしてインストールします。

$ git clone https://github.com/msleal/amspy.git
$ cd amspy
$ sudo python3 setup.py install

次は、exampleを使って、Indexer v2 を使って解析する準備をします。
ポータルよりメディアサービスのアカウントキーとストレージのアカウントキーよりアクセス情報を確認して設定ファイルに保存します。

$ cd amspy/example
$ vi config.json

設定ファイルの中身はこのように設定します。
{
   "accountName": "メディアサービスのアカウント名",
   "accountKey": "メディアサービスの主キー",
   "sto_accountName": "ストレージ アカウント名",
   "sto_accountKey": "ストレージのキー",
   "logName": "log/indexer.txt",
   "logLevel": "DEBUG",
   "purgeLog": "Yes"
}

Indexer v2 のサンプルを設定します。

$ cd analytics/indexer_v2
$ vi indexerv2.json

今回は空耳なので、設定ファイルのLanguageを日本語(jaJP)にします。

{
  "version":"1.0",
  "Features":
    [
       {
       "Options": {
            "Formats":["WebVtt","ttml"],
            "Language":"jaJP",
            "Type":"RecoOptions"
       },
       "Type":"SpReco"
    }]
}

なお、空耳ということで今回は独断と偏見で Prince の Batdance にしました。
https://youtu.be/0wbtLYPTCug

さて、農協牛乳はどうなるのでしょうか?(再生時間で5:14のあたり)
本当はボーカルトラックだけ抜き出してやりたいところですが、大変なのでそのまま楽曲を解析します。

ファイルを置いて、プログラムを多少変更します。

$ mv /home/xxx/Batdance.mp3 .
$ vi indexer_v2.py

プログラムは、76行目を読み込むファイル名、ファイルの相対パスに変更します。

VIDEO_NAME = "Batdance.mp3"
VIDEO_PATH = "./Batdance.mp3"

また、最終行に以下の2行を追加すると、メディアサービスで使ったストレージを自動的に削除するのでお財布に優しいです。

response = amspy.delete_media_asset(access_token, asset_id)
response = amspy.delete_media_asset(access_token, output_asset_id)

では実行します。結果は、同じディレクトリのoutput以下に保存されます。

$ python3 indexer_v2.py
$ cat output/Batdance_aud_SpReco.vtt

中身をみてみましょう。

WEBVTT

00:00:03.200 --> 00:00:05.070
王への愛*にいる

00:00:06.150 --> 00:00:12.010
アプリ

00:00:47.350 --> 00:00:49.510
H 島

00:00:50.330 --> 00:00:53.360
H

00:01:05.540 --> 00:01:09.900
Pro キッズ店

00:01:24.720 --> 00:01:27.480
V

00:01:32.670 --> 00:01:35.350
アプリ

00:01:38.810 --> 00:01:40.070
V

00:02:42.860 --> 00:02:44.280
アピタ

00:02:45.800 --> 00:02:51.990
V

00:02:52.540 --> 00:02:54.520
V

00:03:04.500 --> 00:03:05.250
そうね

00:03:06.740 --> 00:03:10.640
ハイト保証ですからねやってるからな

00:03:11.400 --> 00:03:21.570
Z

00:03:27.170 --> 00:03:30.280
このパスタ

00:03:31.150 --> 00:03:43.680
プレステ零

00:03:46.660 --> 00:03:49.000
V

00:03:50.010 --> 00:03:51.450
果実は行くってなんです

00:03:53.010 --> 00:03:57.610
Pro

00:04:21.250 --> 00:04:26.050
ステージ v だよね

00:04:27.090 --> 00:04:29.480
V

00:04:30.610 --> 00:04:32.380
ええ

00:04:42.630 --> 00:04:45.360
で

00:04:53.890 --> 00:04:54.910
見つめるます

00:05:03.130 --> 00:05:04.170
V

00:05:06.740 --> 00:05:08.130
作品

00:05:53.780 --> 00:05:57.410
V

00:06:06.770 --> 00:06:08.020
V

00:06:09.110 --> 00:06:13.890
プラチナメンバー

農協牛乳はありませんでしたが、さらに謎な言葉が並んでいます...




(2017.08.19追記)
ついでに手元にあったコンテスト用のGetWildのボーカルトラックを解析してみたら、こんなことになってました。

00:00:00.090 --> 00:00:06.530
あぁスパルタは大変大きいり続けんだ
上がらんくらい army 発信いる犬系るんだ

00:00:07.360 --> 00:00:13.680
シンプルな種類に意味じゃなきゃ野生でも明日に怯えて言ってあげよう

00:00:14.780 --> 00:00:26.440
撃ち合点はまあペンはサーバーありサイン誰からのために行きらんだえるなら一
アーチは今まあちょいはサーバーある人に何も

00:00:27.360 --> 00:00:30.360
時間は食うわない

00:00:32.940 --> 00:00:59.270
ジャムはじゃあきっと売り電話解けない愛の parser ウォーターにて客はじゃあ
買うのマーチで優しいスターに甘えていたクーガーないがてっちゃんせんがけんいだけが
守られるものがどこかにあんうるさてっちゃんせんが一人でも傷ついた

00:00:59.310 --> 00:01:02.020
あ有名を取り戻すやを




2017年5月13日土曜日

【Microsoft Azure】PHP向けDocumentDBライブラリのCosmosDB対応できてます

Build2017でDocumentDBの後継であるAzure Cosmos DBが発表されました。
https://azure.microsoft.com/en-us/blog/azure-cosmos-db-microsofts-globally-distributed-multi-model-database-service/

Azure Cosmos DB の公開に合わせて、開発しているPHP向けDocumentDBライブラリも更新しました。

Cosomos DB を作成する際に、APIの選択を"SQL(DocumentDB)"にしてもらえば今まで通り使えます。





2017年4月23日日曜日

【Microsoft Azure】みんな大好きマストドンを Web App On Linux で簡単に動かそう(完結編)

Web App On Linux は、簡単に言えば単体のDockerコンテナを動かすサービスです。
最初からNode.jsとかPHPのイメージが提供されているので、Windowsベースの Web App と同じように、かつApacheをWebサーバーとして使えるのがメリットです。

今回マストドンを単体のdockerコンテナで動かすわけですが、大変な苦労をして作成したdockerコンテナイメージを Docker Hub で公開します。
https://hub.docker.com/r/cocteau666/mastodon/

苦労した点を列挙するとこんな感じです。

1.複数のサーバーをひとつのコンテナに立てる
本来なら1コンテナ1プロセスの思想で、必要ならオーケストレーションツールで複数のコンテナを使うのが正しいのですが、限られた環境なのであえてオールインワンにしてみました。
この問題を解決するためには、supervisordを使いました。

2.ホスト名を設定する
コンテナをrunしたらほぼ問題なく動くようになったのですが、Web App にデプロイ後にどうやってホスト名を追加するのが良いのか、いろいろ検討しました。
結局、ポータルのアプリケーション設定の中のアプリ設定(いわゆる環境変数)に、Railsで使う環境変数を上書きする形で設定するように落ち着きました。
手順は後ほど説明します。

それでは、このイメージを使って、Azureで簡単にマストドンを運用する手順を説明します。

Azure使ってない人はまず使えるようにしてくださいw
https://azure.microsoft.com/ja-jp/offers/ms-azr-0044p/

ポータルにログインしたら、「Web + モバイル」→「Web App On Linux」を選びます。



アプリ名(今回はmastodon0)を入力し、サブスクリプションを選択(デフォルトでも問題ないはず)、リソースグループを新規作成または既存のグループを選択(今回はdocker2というグループを新規作成)します。
App Service のプラン/場所は、プランは今のところ「B1 Basic」が5700円/月で一番安いです。場所はプレビューなので、West Europe、Southeast Asia、West USの3つから選びます。ご自身に近いところでどうぞ。
コンテナの構成は、イメージのソースは「Docker Hub」、リポジトリ アクセスは「パブリック」、イメージとオプションのタグは「cocteau666/mastodon:latest」をそれぞれ入力します。
ここまで入力したら左下の「作成」を押します。

出来上がったら、アプリの管理ポータルで環境変数を設定します。
左の一覧から「アプリケーション設定」を選び、真ん中あたりのアプリ設定に追加します。
キーが「LOCAL_DOMAIN」、値が今回のアプリのFQDN(mastodon0.azurewebsites.net)を入力して上の保存を押します。












保存したら左の一覧の「概要」を選び、上の「再起動」をクリックします。


10分程度たってから、アプリにアクセスします。(今回は https://mastodon0.azurewebsites.net/)
見えましたか?




























ここでアカウントを登録すると確認メールが来て、アカウントを有効化できると思います。

なお、簡単にできますが、多少注意点があります。

・データベースもオールインワンなので、再起動するとすべてのデータがなくなります...
・App Serviceのプランに応じてサーバーのディスクサイズが決まりますが、B1だと10GBであまり余裕がないかと。大きくしても50GBなので、ごく小規模での運用に限られるかと思います。

公開しているイメージを自分でカスタムして使うのもアリなので、データベースを外部に立てたり(PostgreSQLです)、Redisキャッシュサービス使ってみたり、いろいろできると思いますので、挑戦してみてください。


2017年4月14日金曜日

【Microsoft Azure】みんな大好きMastodonをAzureで動かそう #1

最近にわかに話題に上がってるMastodonは、アメリカのヘヴィメタルバンドではなく、Twitterに似たWebサービスです。
https://github.com/tootsuite/mastodon

サーバーがそれぞれ分散しているのが特徴で、私を含む大人たちはもしかしたらNiftyServeみたいなのを思い出すかもしれません。
もちろんオープンソースですので、Azureで動かしちゃいます。

今回の構築に必要なものは、こちら。

・Azure Container Service(以下ACS)
docker-composeコマンドでさくっとMastodonサーバーを構築するのにちょうどいいです。

・PostgreSQLとRedisを動かす仮想マシン
今後DBを分散するために、dockerコンテナの外に構築します。
Ubuntuでやってみましょう。

・SMTPサーバー
登録時のメールアドレス確認のためのメールサーバーです。
なんでもいいんですけど。

では、さっそくやってみましょう。

まずは最初に仮想マシンを作成します。
こちらを参考にして、ログインするところまで頑張ります。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/quick-create-portal

ログイン後、以下のようにPostgreSQLとRedisを設定していきます。
まずは管理者になってパッチを当てます。
# apt update
# apt -y upgrade

次はaptコマンドでPostgreSQLとRedisをインストールします。
# aot -y install redis-server redis-tools postgresql postgresql-contrib

ACSからRedisに繋がるように設定します。
# vi /etc/redis/redis.conf
redis.confの中の「bind 127.0.0.1」を「bind 0.0.0.0」に書き換えます。
なお、この状態だとすべてのサーバーからの接続を許可するので、そのまま放置するのはよろしくないです。

PostgreSQLへ、Mastodonで使用するデータベース(mastodon)とユーザー(mastsan)を追加します。この作業はpostgresユーザーで行います。
# su - postgres
$ createdb mastodon
$ psql
> create role mastsan login createdb password 'ログインパスワード文字列';
> \q
$ exit

ACSからPostgreSQLへのパスワードログインを許可します。
# vi /etc/postgresql/9.5/main/postgresql.conf
まずは、postgresql.confに「listen_addresses = '*'」を追加します。
これで他のサーバーからのログインができるようになります。

# vi /etc/postgresql/9.5/main/pg_hba.conf
pg_hba.confの最後に以下の行を追加します。
「host   all  mastosan  0.0.0.0/0   md5」
mastosanユーザーはパスワードでログイン可能です。

最後に、サービスを再起動して反映します。
# /etc/init.d/redis-server restart
# /etc/init.d/postgresql restart


次はACSの設定ですが、今回は構築してSSHトンネリングで起動を確認するまでをやってみます。

まず、AzureポータルからACSを作成します。
左の「+」から、「Containers」を選び、「Azure Container Service」をクリックします。


そのまま下の「OK」をクリックします。


Orchestratorは「Swarm」を選んで、リソースグループやロケーションを決めたら、「OK」をクリックします。



DNSのプレフィックスに今回「mastodon」を設定しました。
コンテナへのユーザーネームと、ログインに必要な公開鍵を貼り付けます。



今回コンテナを3つ動作させるので、Agent count は「3」にします。
Agent virtual machine size はヘタレなので「Standard A0」(ACSでは最小)を選択します。


登録内容を確認して「OK」をクリック。


デプロイが終わるのを待ちます...。


デプロイが終わったら、リソースグループの一覧から今回作成したもの(acstest)を探して表示します。
左のメニューに「Deployments」があるので、選んで表示された一番上(最新)のデプロイ内容を表示します。


そこにdockerホストへのアクセス情報が書かれています。
SSHMASTER0というキーに表示されている値をコピーして、sshでdockerホストへアクセスします。
今回は「ssh ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200」となります。


さて、ここからはdockerホストでの作業です。

ログインしてまずはgithubからMastodonをクローンします。
$ ssh ユーザー名@プレフィックmgmt.リージョン.cloudapp.azure.com -A -p 2200
$ git clone https://github.com/tootsuite/mastodon.git
$ cd mastodon

環境に合わせて、「.env.production」ファイルを編集します。
$ cp .env.production.sample .env.production
$ vi .env.production

今回使うRedis、PostgreSQL、SMTPの設定をします。以下の値を環境に合わせて設定しましょう。

--------------------------------------------------------------------------------------------
REDIS_HOST=Redisが動作しているホスト名
REDIS_PORT=6379
DB_HOST=PostgreSQLが動作しているホスト名
DB_USER=ユーザー名(今回はmastsan)
DB_NAME=データベース名(今回はmastodon)
DB_PASS=PostgreSQLにログインするパスワード
DB_PORT=5432

# Federation
LOCAL_DOMAIN=example.com
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=長い文字列
SECRET_KEY_BASE=長い文字列
OTP_SECRET=長い文字列

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=SMTPサーバー
SMTP_PORT=587
SMTP_LOGIN=ログイン名
SMTP_PASSWORD=パスワード
SMTP_FROM_ADDRESS=メールに設定するFromアドレス
--------------------------------------------------------------------------------------------

保存したら、docker-compse.ymlを変更して、RedisとPostgreSQLのコンテナを作成しないよう以下のように変更します。

$ vi docker-compose.yml
--------------------------------------------------------------------------------------------
version: '2'
services:

#  db:
#    restart: always
#    image: postgres:alpine
### Uncomment to enable DB persistance
#    volumes:
#      - ./postgres:/var/lib/postgresql/data

#  redis:
#    restart: always
#    image: redis:alpine
### Uncomment to enable REDIS persistance
#    volumes:
#      - ./redis:/data

  web:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/system:/mastodon/public/system

  streaming:
    restart: always
    build: .
    env_file: .env.production
    command: npm run start
    ports:
      - "4000:4000"
#    depends_on:
#      - db
#      - redis

  sidekiq:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/system:/mastodon/public/system
--------------------------------------------------------------------------------------------


あとはビルドしてコマンドから起動します。
途中で失敗する場合は、仮想マシンのRedisやPostgreSQLが起動していなかったりアクセスができない状態ではないか確認してみます。
$ docker-compose build
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
$ docker-compose up -d


ひとまず確認のため、ローカルホスト(私の場合はMacOS)からSSLトンネリングしてMastodonに接続できるか確認します。ローカルホストのポート30000/TCPに繋ぐとMastodonに接続するようにします。
$ ssh -fNL 30000:localhost:3000 ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200

ブラウザで「http://localhost:30000」へアクセスしてみましょう。
きっと見えてるはずw