オンプレ系インフラエンジニアがAzureを勉強する

いつか誰かの何かの役に立つと嬉しいな

【C#】指定したフォルダ配下でtxtファイルを探す方法

はじめに

新人さんのプログラミング指導で、課題を出してもただサンプルをコピペしてくるだけということはよくあると思います。

その段階から一歩先へはどう教育したらいいのかという問題をちらほら耳にするので、

自分がしてもらった教育の中でよかったと思う題材について書きます。

 

題材

下記の動作をするコンソールアプリの作成。

指定したフォルダの中にtxtファイルがあるかを確認する。

サブディレクトリがある場合は最下層まで確認する。

txtファイルが存在する場合はそのファイル名と作成日をJSON形式で出力する。

【実行結果イメージ】

f:id:mitsunooon:20200930012604p:plain

 

1回目に作ったもの

SearchOption.AllDirectoriesを使用する方法。

SearchOption.AllDirectoriesを利用すれば、現在のディレクトリとすべてのサブディレクトリを検索してくれます。

SearchOption 列挙型 (System.IO) | Microsoft Docs

これを使うとコードもシンプルで簡単になります。

 

抜粋

// SearchOption.AllDirectoriesを利用する方法
string[] names = Directory.GetFiles(args[0], "*.txt", SearchOption.AllDirectories);
if (names[0] != null)
{
foreach (string subnames in names)
{
var date = new FileInfo(subnames); // JSON化前にリスト化する
List<Items> texts = new List<Items>
{
new Items{ file = subnames , create_time = date.CreationTime.ToString()}
}; //JSON化
string json = JsonSerializer.Serialize(texts); //コンソール出力
Console.WriteLine(json);
}
}

全文

github.com

 

上記に対してもらったフィードバック

「上記の課題の成果からわかるのは、私が目的(やりたいこと)のための調べ物ができるということ。調べた内容を実装することができるということ。

ここまでではプログラミングとしての能力が鍛えられているとは言えないです。

できるだけ、SearchOptionのようなものは使わないで、ロジックを考えてください。」

 

これは私自身ずっと疑問だった指摘でした。

わからないことがあっても、大抵のことは調べればすぐに答えが得られます。

業務上はそれで十分な場合も多いと思います。

しかし、コードをコピペして使えるようにすることが「プログラミングをしている」ということなのか、このままの勉強方法で果たして業務で実装できるプログラマーになれるのか。

 

2回目に作ったもの

SearchOption.AllDirectoriesを使用しない方法。

いわゆる再帰処理です。

私はSearchOption.AllDirectoriesを使用しない方法を考え始めてから、再帰処理という言葉に行きつくまで時間がかかりました。

初めは探索アルゴリズムの考え方を調べたりしてました。

いまいちしっくりこなくて、求める挙動を整理するところから思考しました。

ひとつ目のディレクトリの中を検索し、txtファイル探す。

ディレクトリがあれば、その中に入りまたtxtファイルを探す…

ここで繰り返しが使えそうだ、その繰り返しはまとめられそうだ、回数の制限がわからないからどうしようか…みたいな考えを文字に起こしたり図に描いてみたりしました。

試行錯誤を繰り返した結果、再帰という言葉にたどり着きました。

 

抜粋

static void scan(string dir)
        {
            string[] subdirs = Directory.GetFiles(dir, "*.txt");//dirの中のtxtを探す
            try
            {
                foreach (string files in subdirs)
                {
                    //作成日を取得するための処理
                    var date = new FileInfo(files);

                    //取得した情報をAddItemに渡す
                    Texts txts = new Texts();
                    txts.AddItem(files, date.CreationTime.ToString());

                    // JSON化前にリスト化する
                    List texts = new List
                        {
                            new Items{ file = files , create_time = date.CreationTime.ToString()}
                        };

                    //JSON化
                    string json = JsonSerializer.Serialize(texts);
                    Console.WriteLine(json);

                }

                //ファイルを探し終わったらディレクトリを探して、filesに入れる。はじめのscan(args[0]);と同じ処理ルートになる
                foreach (string files in Directory.GetDirectories(dir))
                {
                    scan(files);
                }
            }
            catch
            {
                Console.WriteLine("探索中にエラーが発生しました。");
            }
        }

 

 全体

github.com

 

2回目に作ったものも、結果的には調べたことの実装に変わりないのですが、

コピペコーディングから脱する考え方の一端がつかめたような気がしました。

 

おわりに

ありがたいことに、世の中には便利な技術や情報が溢れています。

車輪の再発明のようなことは業務では求められないと思いますが、自分が納得して学習していく上では必要なことでもあるのかなと思います。

世の情報の恩恵にあずかりながらも、ちゃんと自分で思考する力を付けて、人並みのコーディング、プログラミングができるようになりたいです。

 

画像内の特定の文字をぼかすLogic Appsを作る

はじめに

ブログや登壇資料で毎回Azureのアカウント情報やサブスク情報をマスクするのが結構気を遣う作業で大変だな~画像投げたら自動で大事なところをマスクしてくれるbot作れないかな~と思ったので、挑戦してみました。
しかし、現時点では完璧に情報を認識してマスクするというところまでは至っておらず…
何ができてなくて、何をできるようにしないといけないのか整理するために今できているところまでを書き起こします。

 

 

参考サイト様

ASCII.jp:文字入り画像を送るとテキストに書き起こすLINEボットを作ろう (1/3)

ASCII.jp:人物写真の顔をAIが検出し、ぼかしてツイートするLogic Appsを作ろう (1/3)

メモ:Cloudmersive Image コネクターを利用して、画像の顔に自動でぼかしを入れる - MoreBeerMorePower

 

作りたいもの

Azure Portalの画面キャプチャを送ると、アカウント情報などにぼかし処理を施して画像を返信してくれるBot

 

今できていること

  • LINE BotにAzure Portalのキャプチャを送る。
  • Azure Portalの右上のアカウント情報をぼかす。
  • ぼかし処理をした画像をDropboxの指定のフォルダに格納する。

 

今できていないこと

  • 画像のサイズや範囲に寄らず、指定した情報を画像内で特定してぼかし処理ができる。
  • ぼかし処理した画像をbotの返信として送信できる。
  • botの媒体をLINEだけでなく他のツールでも使えるようにする。

 

Azure以外の事前準備

  • LINE Messaging APIの利用登録
  • Cloudmersiveの利用登録
  • Dropboxの利用登録

このあたりについては参考サイト様に丁寧な説明があります。

 

作成手順

全体図

f:id:mitsunooon:20200919154125j:plain

 

トリガーの作成

参考サイト様そのままです。
トリガーを[HTTP要求の受信時]にし、LINE botに画像を送信することをトリガーとします。

f:id:mitsunooon:20200919154504p:plain

 

透明画像の準備

事前にDropboxに1200×1200サイズの透明画像を格納しておきます。

透明画像はiPhoneアプリのibisPaintで用意しました。無料で使えますし、サイズ指定もわかりやすいです。

透明画像のサイズは大きければ大きいほうがいいだろうと思い、初めは無駄に大きいものにして失敗したので、ひとまず1200×1200で統一しておいたほうが無難そうです。

f:id:mitsunooon:20200919154555p:plain

 

コンテンツの取得

以降、[For each]内での処理になります。

LINEで送られてきた画像情報を取得します。

URI:concat('https://api.line.me/v2/bot/message/',items('For_each')?['message']?['id'],'/content')

f:id:mitsunooon:20200919154737p:plain

 

ぼかし処理をするための情報収集

ぼかし処理をするためには、ぼかしたい対象の範囲を座標で指定する必要があります。

アカウント情報の文字列の座標を取得するために、[Computer Vision API]の[Optical Character Recognition (OCR) to JSON]を使います。

f:id:mitsunooon:20200919155105j:plain

f:id:mitsunooon:20200919173826j:plain

 

このアクションを使うと、画像から認識した文字ごと位置エリアごとにJSONグループ、階層に分けてくれます。

[boundingBox]で対象の座標がわかります。今回はメールアドレスの部分の座標を使います。

座標の意味はこんな感じだと思います。

"boundingBox": "左上端のX座標, 左上端のY座標, 幅, 高さ"

f:id:mitsunooon:20200919155129p:plain

 

似たようなアクションで、[Computer Vision API]の[Optical Character Recognition (OCR) to Text]というものがあります。

これは認識した文字をテキストにしてくれます。

単純な画像の文字起こしならこの機能を使えば十分そうです。(やや日本語が怪しそうなところはありますが…

f:id:mitsunooon:20200919155828p:plain

 

ぼかしたい情報が画像内に入っているか判定する

今回はメールアドレスが入っていればぼかし処理をするようにしたいので、[Optical Character Recognition (OCR) to Text]で取得したテキスト内にメールアドレスのドメインがあるかを確認します。

f:id:mitsunooon:20200919155953j:plain

 

ぼかす範囲を切り抜くための座標指定

アクション名:Crop an image to a rectangular area

ぼかす範囲を切り抜くために座標指定します。

この座標は[Optical Character Recognition (OCR) to JSON]で取得したものを使います。アイコンの部分までぼかしにいれたいので、横幅を少し大きくしました。

今回は完全に座標を固定で入れていますが、将来的にはここを変数化したいです。

f:id:mitsunooon:20200919160257j:plain

 

対象範囲のぼかし処理

アクション名:Perform a guassian blur on the input image

ぼかし具合を設定します。

ぼかす大きさとかにじみ具合とか指定できます。参考サイト様のこの比率が滑らかでちょうどいいなと思っています。

f:id:mitsunooon:20200919160411j:plain

 

透明画像と合成する

アクション名:Composite two images together

ぼかし処理済みの画像と透明画像を合成します。

f:id:mitsunooon:20200919160555j:plain

 

合成するとこんな感じになります。

右側の真ん中に載るように指定しました。

f:id:mitsunooon:20200919160608j:plain

 

元画像と合成するための切り抜き

アクション名:Crop an image to a rectangular area

上記のぼかし処理済みの画像と元画像を合成したときに、対象位置がちゃんと重なるように切り抜いて調整する必要があります。

重ねる位置が極端に右上端であることと切り抜き範囲を座標で固定していることから、この辺りは参考サイト様そのままではなく少し調整しました。

(考え方ややってることはそんなに変わらないはず…

sub(div(variables('ciwidth'),2),div(158,2))
sub(div(variables('cihight'),2),div(25,2))
div(add(variables('ciwidth'),add(1650,1808)),2)
div(add(variables('cihight'),add(6,19)),2)

f:id:mitsunooon:20200919160815j:plain

 

切り抜いた結果がこんな感じです。

f:id:mitsunooon:20200919173138j:plain

 

元画像と合成する

アクション名:Composite two images together

元画像に先ほど切り抜いた画像を合成します。

結果、こんな感じの画像ができます。

狙い通りの位置がぼかされています。

f:id:mitsunooon:20200919161817p:plain

 

ぼかし処理済みの画像をDropboxに保存する

完成した画像はDropboxに保存します。

フロー上のCloudmersiveのアクション名が英語で分かりづらいので、画像処理の合間合間にこの処理(ファイルの作成)を挟むと、途中経過の画像が保存されて段階がわかりやすいです。

f:id:mitsunooon:20200919162006p:plain

 

おまけ:文字起こしした内容を返す

画像から文字起こしした内容をbotに変えさせたい場合は、任意の場所にこのアクションを入れるとできます。[Optical Character Recognition (OCR) to Text]で取得した内容を返すような形です。

f:id:mitsunooon:20200919162128p:plain

 

おわりに

「今できていないこと」にも記載したように、現状のフローだと、対象箇所をぼかすためにはいろいろと制限があります。(元の画像にブラウザのタブが入っていてはだめとか…

もう少し利便性があげられるように改修していきます。

正直、コードで書いてしまえば早いような気もしますが、Logic Appsを使いこなすために始めた題材なので、できるところまで粘ってみます。

 

Azure CLIで使用するサブスクリプションを変更する方法

はじめに

Azure CLIでリソースを作成するときに、使用するサブスクリプションを選択する方法をメモ程度に。
下記の公式サイトを自分用に整理したような感じです。

 

参考サイト

Azure CLI を使用して Azure サブスクリプションを管理する | Microsoft Docs

Azure Cloud Shell のクイックスタート - Bash | Microsoft Docs

Output formats for Azure CLI | Microsoft Docs

 

手順

1.自分が利用できるサブスクリプションを確認する

下記コマンドで自分が利用できるサブスクリプションが確認できます。

コマンド:az account list

f:id:mitsunooon:20200915153816j:plain

 

オプションで表示形式を指定することもできます。
デフォルトはJSON形式表示。yaml、tableなどが選べます。

オプション:--output

コマンド:az account list --output table

f:id:mitsunooon:20200915154109j:plain

 

2.現在の規定のサブスクリプションを確認する

確認方法①

上記コマンド結果から判断します。

IsDefaultがtrueになっているものが今のデフォルトのサブスクリプションです。

f:id:mitsunooon:20200915154125j:plain

 

確認方法②

下記コマンドを実行して、表示されたサブスクリプションが現在のデフォルトです。

コマンド:az account show

f:id:mitsunooon:20200915154147j:plain

 

3.デフォルトで使用するサブスクリプションを設定する

下記コマンドでデフォルトで使用するサブスクリプションの名前を指定して設定します。

コマンド:az account set --subscription 'my-subscription-name'

f:id:mitsunooon:20200915154216j:plain

コマンドが成功しても特に何も返ってこないので、2の確認方法で指定したサブスクリプションがデフォルトになったか確認します。

 

おまけ:リソース作成の時だけサブスクリプションを指定したいとき

サブスクリプション指定のオプションを付けます。

例:az vm create --subscription "My Demos" --resource-group MyGroup --name NewVM --image Ubuntu

 

APIの動作確認でよく使うツール3選

はじめに

Web APIを作ったときに動作確認のために使っているツール3種類についてのお話です。

各ツールで同じGETリクエストをするとそれぞれどんな風に結果を確認できるのか、
個人的に感じた使い勝手と使い方をメモ程度にという感じです。

 

使用するAPI

お天気情報APIのOpen Weather Mapを使います。
登録するだけでAPIキーが手に入り、無償で使えます。
今回はGETまたはPOSTで指定した郵便番号の天気を教えてくれる機能を使います。

Сurrent weather and forecast - OpenWeatherMap


リクエスト例)
http://api.openweathermap.org/data/2.5/weather?zip=100-0005,jp&units=metric&lang=ja&APPID=<個人のAPIキー>

 

Postman

GUIAPIテストができるツールです。
かなりメジャーな部類なので、詳しい使い方の情報はたくさんあります。

GETリクエストをするとこんな感じです。

返ってくるJSON形式も整形されていて分かりやすいです。

f:id:mitsunooon:20200828220017j:plain

 

今回の題材では不要ですが、

もしCookieの情報が必要だったり、POSTの時に引数を渡す必要があるときもGUIなので直感的に設定できます。

f:id:mitsunooon:20200828220816j:plain

f:id:mitsunooon:20200828220828j:plain

 

ひとつのAPIを手軽に確認したいときやCrome DevToolsに近い形で情報が見たいときなどに使ってます。

 

Visual Studio CodeのREST Client機能

Visual Studio Code拡張機能のひとつであるREST Clientを使います。

詳細は下記サイト様がわかりやすいです。

VS Code上でHTTPリクエストを送信し、VS Code上でレスポンスを確認できる「REST Client」拡張の紹介 - Qiita

f:id:mitsunooon:20200828220923j:plain

 

使い方としては、httpファイルをVS Codeで開きます。

[Send Request]ボタンをクリックすると、VS Code上でレスポンスが確認できます。

こちらもJSONが整形されていて見やすいですね。

f:id:mitsunooon:20200828221333j:plain

f:id:mitsunooon:20200828221342j:plain

 

###で区切ることができるので、 複数のリクエストをひとつのファイルにまとめることができます。

当然コメントも入れられます。変数設定もできます。引数も渡せます。

 

複数のAPIをテンポよく確認したいときやチームメンバー複数人でテストするときに使っています。

ただ、VS Code REST Client上だとエラーになるけどPostmanだと動く、というようなことがたまーにあるので、念のため Postmanも使えるようにはしています。

今回の題材のお天気APIを使う 簡単なhttpファイルはgithubにあげてます。

GitHub - kgnk-hkr/WeatherAPI_HTTPTest_http

 

curlコマンド

コマンドプロンプトで手軽に試せるcurlコマンドです。

黒い画面好きとしては一番馴染み深くとっつきやすいです。

f:id:mitsunooon:20200828221749j:plain

 

レスポンスによっては文字化け対策をする必要があります。

結果がUTF-8で返ってくるなら下記のコマンドを先に実行しておきます。

>chcp 65001

 

上記のままだと整形されていなくて非常に見づらいです。

これを避けるためにjqを使えるようにします。 

https://stedolan.github.io/jq/

 

上記よりjq-win64.exeをダウンロードしてきたらファイル名をjq.exeに変更して「C:\windows\system32」に格納します。

コマンド実行時に、末尾に「| jq」を付けます。

ただし、オプション-i、-Iとの併用はできないのでHTTPレスポンスヘッダーの取得結果も欲しい場合は工夫が必要です。

f:id:mitsunooon:20200828222140j:plain

 

Cookieの情報が必要な時はオプション-bを付けます。

参考サイト様

curl の -b, -c (--cookie, --cookie-jar) オプションが便利 - ryota-ka's blog

 例) curl -I -b test=AAAA -X GET  "https://localhost:5000/api"

 

その他の細々したオプションは下記サイト様がまとまっています。 

よく使うcurlコマンドのオプション - Qiita

 

問題はPOSTです。

引数をJSON形式で渡してリクエストを送ろうとするとBad Request地獄に落ちました。

文法は間違っていないのになぜなぜとなっていたところ、

下記サイト様で解決しました。本当にありがとうございました。 

Windows版curlでJSONをPOSTする際に困った話 - Qiita

私はWindows環境だったので、-dオプションの後ろの「"」を「¥"」に変更したらうまくいきました。

例) curl -i -X POST https://localhost:5000/api/ -H "Content-Type: application/json" -H "Accept: application/json" -d "{¥"test1¥":[{¥"test1¥": 0}], ¥"test2¥":1, ¥"test3¥":¥"aaa¥"}"


さらに、curlを使えば複数のAPIテストをbatファイルでまとめて実行できるしログもとれる! 素晴らしい。

(Postman、VSCodeでのログの取り方を知らないだけです。すみません。

今回の題材のお天気APIを使う簡単なbatファイルはgithubにあげてます。 (例外処理的なものは含んでいないのでお試し程度に…

GitHub - kgnk-hkr/WeatherAPI_HTTPtest_bat

 

おわりに

今回は普段私がAPI開発の時に動作確認に使っているツールのお話でした。

本当はそれぞれの使い方をもう少し掘り下げて3本立てにしたかったのですが、そこまでの理解度に至らず…

もう少し使いこなせるようになったらまた掘り下げます。

 

 

 

マイクラサーバーのアップデートとバックアップ

はじめに

以前、マイクラサーバーをAzure上に立てました。

Azureでマイクラサーバーをたてる - オンプレ系インフラエンジニアがAzureを勉強する

 

Minecraftというゲームはアップデートが頻繁にあり、
サーバー側もちゃんと最新版を適用しないと遊べなくなってしまいます。
(サーバーの期限が切れているなどのエラーが出ます。

今回は、マイクラサーバーのアップデートについて書いていきます。

さらにアップデートに失敗したときに復元できるようにしたいので、Azure Backupを使ったバックアップもやってみます。

先にアップデートについて書いてますが、本来であればバックアップ作業のほうが先です。
また、本当は詳しいパラメータや設定ファイルの説明などができたらよいのですが、

未だそこまで理解が及んでいないので、実際にアップデート作業をしてうまくいった例をふわっと紹介します。

 

参考サイト様

マイクラアップデート bedrock-server-1.11.0.23 | 大人の自由研究


アップデート対象

OS:Ubuntu 18.04
Minecraft:Bedrock Edition 1.16.1.02

 

用意するもの

アップデート資材

https://minecraft.azureedge.net/bin-linux/bedrock-server-1.16.20.03.zip

 

アップデート手順

イクラサーバーにSSHで接続し、stopコマンドで止めます。

f:id:mitsunooon:20200814220410p:plain

 

固有設定が入ってる必要そうなファイルをコピーしておきます。

初めてのアップデートの時は怖かったので、念のためマイクラ関係のファイルは全部コピーしました。

  • permissions.json
  • server.properties
  • whitelist.json

f:id:mitsunooon:20200814220446p:plain


wgetコマンドで最新のデータをダウンロードします。

f:id:mitsunooon:20200814224140p:plain

 

unzipで展開します。
All上書きします。

f:id:mitsunooon:20200814220745p:plain

 

コピーしておいた下記ファイルを戻します。

  • permissions.json
  • server.properties
  • whitelist.json

この時点でのファイル一覧はこんな感じです。

f:id:mitsunooon:20200814220846p:plain

 

screenコマンドでマイクラサーバー起動用の画面に入ります。

実行コマンドで起動させます。

f:id:mitsunooon:20200814220940p:plain

ちゃんとバージョンが変わっていますね。
ログイン確認してみても、ちゃんと同じワールドになっています。

 

イクラのアップデート自体の手順は以上になります。

 

バックアップ手順

今回せっかくマイクラサーバーをAzure上に立てているので、Azure Backupを設定してみたいと思います。

 

参考サイト様

Recovery Services コンテナーに Azure VM をバックアップする - Azure Backup | Microsoft Docs

  

Azure Backupの設定

Azure Backupを初めて使うのでコスト感が怖いのですが、下記を参考に控えめなバックアップ設定にしたいと思います。

料金 - クラウド バックアップ | Microsoft Azure


[仮想マシン]>[バックアップ]でバックアップを作成します。

f:id:mitsunooon:20200814222109j:plain

 

デフォルトはDailyですが、そこまでまめじゃなくていいので、Weeklyくらいにします。
バックアップポリシーは自分で作成し、後から変更することもできます。

データの保持期間が短いバージョンとか

f:id:mitsunooon:20200814222212j:plain

f:id:mitsunooon:20200814222228j:plain

バックアップ設定が作られるとリソースグループに[Recovery Services コンテナー]というのも同時に作られます。(新規作成を選択している場合)

 

早速バックアップを取得してみます。

[仮想マシン]>[バックアップ]>[今すぐバックアップ]を実行します。

f:id:mitsunooon:20200814222654j:plain

 

バックアップジョブから現在のステータスを確認することができます。

仮想マシンを起動したままのバックアップは時間がかかると思います。

f:id:mitsunooon:20200814222839p:plain


設定してからしばらくの期間、きちんとバックアップポリシーが動いていればこんな感じに表示されます。

f:id:mitsunooon:20200814222935p:plain

ちなみに、バックアップ取得時の仮想マシンの状態によって取得されるデータの種類が異なるようです。

私が実際にバックアップを取ってみて確認できたのは、仮想マシンをシャットダウンしている時のバックアップはクラッシュコンシステント、仮想マシンが起動している時のバックアップはファイルシステム整合性でした。

参考

Azure Backup で取得される Azure 仮想マシン バックアップの一貫性について | 焦げlog

 

幸いまだ復元しなければならないような事態には陥っていないですが、
テストで[VMの復元]をしたところ、VM自体は丸々復元されていたので大丈夫でないかと思っています。
復元の際の参考

Azure portal を使用して VM を復元する - Azure Backup | Microsoft Docs

 

おわりに

全体的にふわっとした検証結果で申し訳ないですが、上記手順で今のところ問題なく遊べているので、何かの参考になれば幸いです。

 

 

Bot Framework ComposerでLINEボットを作ったときにつまづいたところ

はじめに

Bot Framework ComposerというGUIBot Frameworkベースのチャットボットが作れるツールがあります。
これの公式チュートリアルで、郵便番号を送るとお天気を教えてくれるチャットボットが作れるようなので触ってみたいと思います。

せっかくチャットボットならば、ローカルで動かすだけではつまらないのでLINEで動くボットにします。

 

参考サイト様

Microsoft公式サイト チュートリアル

docs.microsoft.com

 

上記を日本語でわかりやすく書いてくださっている記事

qiita.com

 

LINEボットにするときに参考にさせていただいた記事

qiita.com

 

作成方法(つまづいたところ)

作成方法といっても、上記参考サイト様の通りにやれば作れてしまうので、
ここでは私が詰まったところについて書いていきます。

 

Azureのリソース作成

Composerで作ったチャットボットをLINEなどで使えるようにするにはAzure Bot Serviceを使う必要があります。
そのために必要なAzureのリソースは下記のコマンド一つで作成することができます。
参考資料:Publish a bot to Azure - Bot Composer | Microsoft Docs

node provisionComposer.js --subscriptionId=<YOUR AZURE SUBSCRIPTION ID> --name=<NAME OF YOUR RESOURCE GROUP> --appPassword=<APP PASSWORD> --environment=<NAME FOR ENVIRONMENT DEFAULT to dev>

 

しかしこれがこのままではうまくいかず…
下記のようなエラーが出ます。

f:id:mitsunooon:20200715220358j:plain

 

参考サイト様をたどった結果、上記のコマンドに--tenantIdのオプションを追加することで解決しました。
--tenantIdにはディレクトリIDをいれます。

node provisionComposer.js --subscriptionId=<YOUR AZURE SUBSCRIPTION ID> --name=<NAME OF YOUR RESOURCE GROUP> --appPassword=<APP PASSWORD> --environment=<NAME FOR ENVIRONMENT DEFAULT to dev> --tenantId=<ディレクトリID>

f:id:mitsunooon:20200715220640j:plain

f:id:mitsunooon:20200715220438j:plain

 

CosmosDBの無料プラン化

上記のコマンドでAzureリソースを作成すると、こんなラインナップのリソースが作られます。

f:id:mitsunooon:20200715220517j:plain

 

CosmosDBがありますね。
実はこのCosmosDBは有料プランです。恐ろしい!
しかも今は作成した後にプラン変更というものができないようです。
なので、無料プランにするには、上記のコマンドを実行する前に、設定ファイルにパラメータを一つ追加します。

参考資料:Create a free-tier Azure Cosmos DB account


Composerで作成したbotスクリプトの中に[template-with-preexisting-rg.json]というファイルがあります。
この中の下記の部分に一行追加します。

"enableFreeTier": true

f:id:mitsunooon:20200715220852j:plain

Functionsは使わないつもりでいますが、念のため[function-template-with-preexisting-rg.json]のファイルにも同様のパラメータを入れておきます。

これでAzureのリソース作成のコマンドを実行すれば、CosmosDBは無料プランになっています。
App Serviceなど他のリソースも無償プランにしておけばかなり低コストでbotを使うことができます。

 

ボットの更新

ボットを作った後も、機能の追加や修正で更新することがあると思います。
いざ更新後に公開しようとすると、アクセストークンが期限切れしていて、Publishに失敗することがあります。

f:id:mitsunooon:20200715221245j:plain

 

その場合には、下記のコマンドでアクセストークンを再発行します。

az account get-access-token

参考資料:Publish a bot to Azure - Bot Composer | Microsoft Docs

 

再発行したアクセストークンをpublish profileに書き直して保存すればOKです。

f:id:mitsunooon:20200715221350j:plain

f:id:mitsunooon:20200715221400j:plain

 

Bot analyticsを使う

せっかく作ったボットなので、アナリティクスが見たいです。
下記の項目を設定するだけで簡単に確認ができます。

  • Application Insights インストルメンテーション キー
  • Application Insights API キー
  • Application Insights アプリケーション ID

参考資料:

Bot analytics - Bot Service - Bot Service | Microsoft Docs

Application Insights keys - Bot Service - Bot Service | Microsoft Docs

 

●Application Insights インストルメンテーション キーの取得

[リソースグループ]>[Application Insights]>[インストルメンテーション キー]の部分になります。

f:id:mitsunooon:20200715221554j:plain


●Application Insights API キーの取得

[リソースグループ]>[Application Insights]>[APIアクセス]>[APIキーの作成]

f:id:mitsunooon:20200715221716j:plain

 

表示名を記入し、[利用統計情報の読み取り]にチェックを入れてキーを生成します。

f:id:mitsunooon:20200715221833j:plain
このAPIキーは生成直後しか確認できないのでしっかりコピーしておきます。

f:id:mitsunooon:20200715221846j:plain


●Application Insights アプリケーション ID

[リソースグループ]>[Application Insights]>[APIアクセス]>[アプリケーションID]の部分になります。

f:id:mitsunooon:20200715221631j:plain

 

上記3つを下記に設定します。
[ボット チャンネル登録]>[設定]>[分析]

f:id:mitsunooon:20200715221938j:plain

 

保存が終わり、しばらくすると[分析]のところでボットの利用状況が確認できます。

f:id:mitsunooon:20200715221951j:plain

完成品

作ったLINEボットのQRコードです。

「天気」と送ると郵便番号からお天気を教えてくれます。

ぜひ触ってみてください。

f:id:mitsunooon:20200715222344j:plain


おわりに

ComposerはGUIなので、直感的に作りやすいと思います。

Azure Bot Serviceとの連携もしやすいので、いろんなチャンネルで使えそうなのも魅力です。

LUISやQnAmakerなどの自然言語処理系との連携も簡単そうなので、挑戦してみたいです。

 

ちなみに、今回の内容は下記勉強会でお話した内容になります。

cogbot.connpass.com

くらでべさんのYouTubeチャンネルにアーカイブが上がると思いますので
ぜひそちらも見てみてください。
Composerだけでなく、TypeScriptやC#でのBot Frameworkの使い方が見れます!
デモがたくさんなのでおすすめです!

その時の資料です

www.slideshare.net

 

 

AZ-900を2回受験した話

はじめに

先日AZ-900を取得しました。
1回目は落ちて、2回目で取得しました。

 

そんなに難易度の高くない、入門編といわれている資格なので落ちた話をするのは大変恥ずかしいのですが、
どなたかの励ましになれば幸いです。

 

1回目と2回目でどういう勉強をしたのかを中心に書いていきます。

 

AZ-900とは

MCP試験(マイクロソフト認定プロフェッショナル試験)のひとつです。
その中でも、AZ-900はMicrosoft Azureの基礎編となる位置付けです。

Exam AZ-900: Microsoft Azure Fundamentals - Learn | Microsoft Docs

 

前提Azureスペック

・業務でAzureを触った経験は少しある。
・興味の向くまま自由に触ることがほとんど。


1回目の受験

勉強方法

Microsoftが提供している無料のFundamentals向けウェビナーを受講しました。
スケジュールが合わず、2日間のうち後半1日のみ受講しました。
MS Learnの下記モジュールをさらっと一周しました。

docs.microsoft.com

 

点数

667点/(合格700点)

 

全然惜しくない
普通に落ちてますね。
この時の習熟度としては、ワードを聞いたことがある、どのジャンルか、くらいのものでした。
上記レベルの理解度では全然ダメで、ちゃんと各サービスや機能がどういう特徴でどんな目的に合ったものなのかというのを理解していないといけませんでした。


2回目の受験

1回目の試験から日がたたないほうが良いと思い、2週間後に再受験しました。
再受験ポリシー的には24時間後には受けられたようです。

certification-exam-policies | Microsoft Docs

 

勉強方法

己の頭の足らなさは課金で補う主義なので、1回目の試験直後に下記テキストを買いました。

MS Learnの内容がより分かりやすくかみ砕かれているような感じで、とても良かったです。
これを毎晩寝る前に1章ずつ読みました。

4章くらいしかないので、何周か出来ました。
試験当日に巻末の模擬試験をやりました。

www.amazon.co.jp

 

1回目の試験の問題で正解が気になったものや書籍で解説されている機能の動きが知りたいときは実機を触って確認しました。

 

点数

780点/(合格700点)

 

めっちゃぎりぎりです。
2回目の受験で、出題形式もわかっているのにぎりぎりって…恥ずかしい!!
それでも2回目で何とか合格できてよかったです。。。


感想

確かに内容の難易度はそこまで高くない印象でしたが、
Azureのコアサービスについて網羅的に把握しておく必要がありました。
業務でAzureを触っていても、全く関わらない分野の内容は特に確認しておいたほうがよさそうです。

本来であれば、無料のウェビナーをしっかり受講しておけば、それだけでも十分合格できると思います。

試験対策用に勉強をして初めて知ることも多く、今までよりもAzure関連のドキュメントが読みやすくなったような気がします。
ようやくAzureに入門できたような気持ちです。

Microsoft認定資格としてはまだまだ上がありますので、入門編でこんなに躓いていては先が思いやられるのですが、機会があったら頑張ってみようと思います。