よしたく blog

ほぼ週刊で記事を書いています

Azure: DP-200: Implementing an Azure Data Solutionに合格した

2021/03/30 に Azure の資格試験、「DP-200: Implementing an Azure Data Solution」に合格した。

この試験の受験者は、Azure データ サービスを使用するデータ ソリューションを実装するためのデータ要件を、ビジネス関係者と協力して特定および満たす Microsoft Azure データ エンジニアです。Azure データ エンジニアは、データ ストレージ サービスのプロビジョニング、ストリーミング データとバッチ データの取り込み、データの変換、セキュリティ要件の実装、データ保持ポリシーの実装、パフォーマンスボトルネックの特定、外部データ ソースへのアクセスなど、データ関連の実装タスクを担当します。この試験の受講希望者のの方は、下記 Azure サービスを使用するデータソリューションを実装できる必要があります: Azure Cosmos DB、Azure Synapse Analytics (前の Azure SQL DW)、Azure Data Factory、Azure Stream Analytics、Azure Databricks そして、Azure Blob storage。

https://docs.microsoft.com/ja-jp/learn/certifications/exams/dp-200 概要より引用

とあるように、Azure 上で提供されているリソースでデータ分析基盤の実装が中心に問題が出題される。

DP-201も同じ日の午後に受けて合格し、2枚抜きしてきた。 はっきり言って疲れるのでおすすめはしない。

yoshitaku-jp.hatenablog.com

問題の範囲

公式サイトによると、次のような範囲と割合で出題される。 個人的には、試験を終えた後に「あの問題がこのカテゴリか〜」と気がつくことはないので、まんべんなく準備することが大事になるかもしれない。

問題の範囲 出題の割合
データストレージソリューションの実装 40-45%
データ処理法の管理と開発 25-30%
データソリューションの監視と最適化 30-35%

「実装」を問う問題の中には、「想定される結果がほしいときに、Stream Analytics で実装される分析関数は 「LAG」「LEAD」「hoge 」ではどれか」を選択する問題もあった。

英語にはなるが、より詳しい出題範囲が乗っている PDF が提供されているのでこちらも目を通すのが良さそう。

https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE3Vzx2

問題の形式

ベンダーの試験を受けたのが、数年前の Oracle Bronze と半年ほど前の Microsoft AZ-104 のみで問題の形式に慣れなかった。 AZ-104 が Microsoft 試験の初回だったけど記憶にないので、同じような感じだったか明言ができない。

問題数としては 40-50 問ほどになる。 すべての問題に共通しているのが選択問題ということがある。記述はなかった。 しかし問題の出され方に特徴があり、あとから見直せる問題と、見直せない問題がある。 見直せる問題は単発の問題になり、見直せない問題は要件定義があるケーススタディ問題だった。 ケーススタディ問題は 2 つあり、その中で 4,5 問ほど問われた。つまりケーススタディ全体の問題数としては 10 問ほどになる。 そこに単発の問題が 30-40 問で、「問題数としては 40-50 問ほどになる。」が構成される。

見直せない問題は、問題文も読めなくなるのでとても不安になるが自信を持って答えよう。 単発問題はあとから見直せるので、わからないところもササッと答えて、他の問題を見た結果思い出されたら戻ってこれるようにしておこう。

勉強教材

MS Learn

ゼロから始める人は MS Learn で概要を把握するのがいいと思う。 なかなか知られていないが Microsoft の勉強教材は結構良いのが揃っている。 下記ページの下部に、対象の勉強資材が乗っている。

docs.microsoft.com

mstep

mstep も Microsoft の勉強教材となる。こちらは少し試験に特化されている。

partner.microsoft.com

Udemy

より試験勉強の問題に特化したい場合は外部のサービスもある。

www.udemy.com

まとめ

とここまで紹介しておいて、この試験と DP-201 は 2021/06/30 に終了となる。 少し期間を開けて DP-203 を受けるのが良いかも知れない。

この試験の最新版 DP-203 は 2021 年 2 月 23 日に可能となります。2021 年 6 月 30 日に終了となるまでこの試験を受けることができます。注:試験は中部標準時の23時 59 分に終了致します。

yoshitaku-jp.hatenablog.com

Azure: Logic AppからTeamsへ通知を送る

Azure上の処理を結果をTeamsに送信したい要件がよくあり、すぐに案内ができるように手順をまとめておく。

Logic Appを作成する

AzureからLogic Appリソースを選択し、作成をおこなう。

f:id:yoshitaku_jp:20210328114141p:plain

リソース作成時のパラメータは特殊なものはないので、「サブスクリプション」「リソースグループ」「リージョン」が作成したい場所になっているか確認、またロジックアプリ名を記述し作成する。今回は「test-la」とした。

f:id:yoshitaku_jp:20210328114305p:plain

Logic App デザイナーで処理を作成する

次にLogic App デザイナーで処理を作成する。初回起動だとデザイナーがすぐに表示されることが可能性がある。下記の画像のようにリソースの詳細ページが開かれたときは、赤枠の場所をクリックすることでデザイナーの画面を表示する事ができる。

f:id:yoshitaku_jp:20210328115702p:plain

デザイナーは次のような画面となっている。

f:id:yoshitaku_jp:20210328115925p:plain

Logic Appには「トリガー」と「アクション」がある。この2つは何が起きたらの「トリガー」部分と、何をするの「アクション」部分で構成されている。

「トリガー」部分はよく使われる例にもあがっている通り、次のようなものがある。

  • メッセージがService Bus キューで受信されたとき
  • HTTP要求の受信時
  • 新しいツイータが投稿されたら
  • Event Gridのリソースイベントが発生するとき

今回の「アクション」部分は「Teamsへ通知を送る」となる。ブログ内では「トリガー」部分は「メッセージがService Bus キューで受信されたとき」で進めていく。

Service BusとLogic Appを接続する

Logic AppからどのService Busを確認するかや、接続設定したときの名前などを決定する。

「bus2teams」(Bus to Teams)などわかりやすい名前をつけて進めていく。

f:id:yoshitaku_jp:20210328131856p:plain

Teamsへ通知をする

Teamsへの通知はいくつか方法があるので紹介する。

Microsoft Teams

「アクション」の中にMicrosoft Teamsがあるので、こちらを選択するのが最も簡単にできる。

しかし、2019年からプレビューとついていて、2021年になっても外れていないので、そこだけ注意が必要となる。

f:id:yoshitaku_jp:20210328133728p:plain

実際に設定すると、個人のTeamsアカウントでログインし、GUIで設定していく。

メッセージもこの画面上から装飾し設定できるのですぐに実装することができる。

f:id:yoshitaku_jp:20210328134431p:plain

f:id:yoshitaku_jp:20210328134621p:plain

HTTP

次はHTTPで送信する方法になる。 こちらは送信先TeamsチャンネルのURLを取得し、そこに送信する方法になる。

Teamsで「コネクタ」を選択し、Incoming webhooksを選択する。作成が完了するとURLが発行されるのでメモしておく。

f:id:yoshitaku_jp:20210328135319p:plain

f:id:yoshitaku_jp:20210328135419p:plain

Logic Appでの作業に戻り、「アクション」でHTTPを選択する。

f:id:yoshitaku_jp:20210328140210p:plain

今回の設定値は次のようにする。

名称 値2
方法 POST
URI Teams Web Hookでメモした値
ヘッダー Content-type application/json
本文 {
"text": "Hello World"
}

Teams上では次のように表示される。

f:id:yoshitaku_jp:20210328142429p:plain

本文の設定がJson形式でおこなうため柔軟にできる反面、カスタマイズする部分が多くなればドキュメントを見なければならなくなりコストが増えることが懸念される。

docs.microsoft.com

Teamsのメールアドレスにメールを送信

メールを送信する形で通知をおこなうこともできる。まだ検証をしていないので詳しくは別の機会にするが、Logic AppでTeamsログインが出来ず、コネクタでIncoming webhooksが使えないときに使うことが想定される。

まとめ

Logic AppからTeamsへ通知を送る方法をまとめた。 Teamsへの送信部分は3種類あり、適切な場面で適切なものを選択できればいいと思う。

分析関数について

業務で分析関数を使うことがあったが、今まで簡単な SQL しか触ったことがなかったので苦労した。 調べた中で整理を兼ねて、複数回に渡りまとめておく。

分析関数を一言でいうと、入力された値を集計し、各行に値を返すものとされている。 集計の動作を聞くと、SUM や AVG といった集計関数が思い出されると思う。 しかし分析関数は、集計関数が入力された値を集計し 全体で 1 つの値を返しているのに対し、各行に値を返している点で違う。

分析関数のメリットについては、問い合わせ速度の工場と、開発作業の効率化がある。 分析関数を使うことで、複雑な処理を記述しなくなるようになり、SQL 文を簡単に書くことができる。 簡単に書けることで読むタイミングでも理解がしやすい、複雑な処理がなくなるので処理パフォーマンスも上がるようになる。

yoshitaku-jp.hatenablog.com

SSMS: 「変更の保存が許可されていません。」エラーを回避する

SQL Server Management Studio(以下SSMS)で、「変更の保存が許可されていません。おこなった変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。」というエラーが出た。

最初はテーブル側の権限設定が足りないと思っていたが、SSMS側で回避できることもわかり、そのやり方をメモしておく。

発生したタイミング

まずは、自分が発生したタイミングについて書く。 まずは最初にテーブルを作成した。

f:id:yoshitaku_jp:20210314120738p:plain

次にデータ型を変更する必要が出てきたため、変更を実施し保存しようとした。

f:id:yoshitaku_jp:20210314121549p:plain

しかし、その後「変更の保存が許可されていません。おこなった変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。」エラーが発生した。

f:id:yoshitaku_jp:20210314121610p:plain

解決するための設定

まずはタブから「ツール」->「オプション」をクリックする。

f:id:yoshitaku_jp:20210314121654p:plain

「オプション」のウィンドウで、「デザイナ」に移動する。その後「テーブルの再作成を必要とする変更を保存できないようにする」にチェックをする。 これで完了となる。

f:id:yoshitaku_jp:20210314121650p:plain

注意するべきところ

今回は調査段階での部分だったので良かったが、SSMS側で変更を制御していた部分をゆるくすることでもあるので、テーブル操作については引き続き注意してやっていきたい。

Power BIでカスタムアイコンを設定する

Power BI でカスタムアイコンを設定する方法を調べた。 今回は、icooon-mono.com で公開されている矢印アイコンを設定してみる。

icooon-mono.com

準備

アイコンを用意する

まずは設定したいアイコンを用意する。 icooon-mono.com で公開されている以下の 3 つを設定対象としてみた。 「48px」の「JPG」形式でダウンロードする。

アイコンを Base64エンコーディングする

Power BI へは JSON ファイルで設定を読み込ませる必要があり、そのため画像データを Base64エンコードする。 エンコードは下記のサイトを使用した。

lab.syncer.jp

画像を選択すると、右側にエンコード結果が表示される。 この値をコピーする。

f:id:yoshitaku_jp:20210303184458p:plain

インポート用 JSON ファイルを準備する。

インポート用 JSON ファイルをPBI-CustomIconTheme.jsonで作成する。

ファイルの中身は、下記となる。 エンコーディングした値は非常に長くなるので省略したが、<エンコーディングした値>に置き換えて保存をしておく。

{
    "name": "PBI-CustomIcon",
    "icons": {
        "1": {"description": "1", "url": "<エンコーディングした値>" }
        ,"2": {"description": "2", "url": "<エンコーディングした値>"}
        ,"3": {"description": "3", "url": "<エンコーディングした値>"}
    }
}

インポート

PowerBI を起動する。 「表示」タブ->「テーマ」->「テーマを参照」をクリックする。

f:id:yoshitaku_jp:20210303184516p:plain

エクスプローラーが起動するので、PBI-CustomIconTheme.jsonを選択する。

正常にインストールが完了すると、ポップアップが表示される。

f:id:yoshitaku_jp:20210303184527p:plain

確認

カスタムアイコンの確認をおこなう。

「データ」に移動し、「データの入力」をクリックする。

f:id:yoshitaku_jp:20210303184540p:plain

「テーブルの作成」が起動する。今回はカスタムアイコンの確認なので、このまま「読み込み」をクリックする。

f:id:yoshitaku_jp:20210303184550p:plain

「フィールド」で、作成したテーブルの列を選択する。 その後「視覚化」でテーブルを選択する。 次に「書式」を選択し、「条件書式」を広げる。 最後に「アイコン」を「オン」にする。

f:id:yoshitaku_jp:20210303184601p:plain

「アイコン」を「オン」にすると、列に対する書式設定画面が表示される。

f:id:yoshitaku_jp:20210303184612p:plain

現在設定されているアイコンを選択すると、他の候補のアイコンが表示される。 その中に、今回設定した矢印のアイコンが表示されているのが確認できる。

f:id:yoshitaku_jp:20210303184625p:plain

まとめ

Power BI でカスタムアイコンを設定する方法を学んだ。 すでに用意されているアイコンの種類も豊富だが、オリジナルなものも取り込めて表現の幅が広がりそう。 Power BI の中に取り込む手順が GUI でササッとできるものではなかったので記事にした。 参考になれば!

FC Pythonでサッカーのデータ分析を学ぶ -パスマップ編-

「FC Python でサッカーのデータ分析を学ぶことができる。 コンテンツは英語しかないが簡単な内容であり、1 つ 1 つのコンテンツも短いので翻訳サイトを使いながらでも進めることはできる。 これが無料で展開されているのはありがたい! 今回はパスの表現を学んだのでまとめる。

fcpython.com

作るもののイメージ

今回は次のようなサッカーのピッチと 3 本のパスを描く。

「FC Pythonのページとしては下記のページを参考にした。

f:id:yoshitaku_jp:20210227120608p:plain

開発環境

検証で使う開発環境は手軽に始められる Google Colaboratory を使用する。

colab.research.google.com

ライブラリ

ライブラリは次のものを使用する。

  • pandas
  • numpy
  • matplotlib

実際に作成する

ピッチを描く

まずはピッチを描いてみる。 直線 1 本ずつ組み合わせて描いていく形になる。 最後にセンターサークルで円を描いている。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Arc

%matplotlib inline

fig=plt.figure()
ax=fig.add_subplot(1,1,1)

# ゴールライン、タッチライン
plt.plot([0,0],[0,90], color="black")
plt.plot([0,130],[90,90], color="black")
plt.plot([130,130],[90,0], color="black")
plt.plot([130,0],[0,0], color="black")

# センターライン
plt.plot([65,65],[0,90], color="black")

#左ペナルティエリア
plt.plot([16.5,16.5],[65,25],color="black")
plt.plot([0,16.5],[65,65],color="black")
plt.plot([16.5,0],[25,25],color="black")

#右ペナルティエリア
plt.plot([130,113.5],[65,65],color="black")
plt.plot([113.5,113.5],[65,25],color="black")
plt.plot([113.5,130],[25,25],color="black")

#左ゴールエリア
plt.plot([0,5.5],[54,54],color="black")
plt.plot([5.5,5.5],[54,36],color="black")
plt.plot([5.5,0.5],[36,36],color="black")

#右ゴールエリア
plt.plot([130,124.5],[54,54],color="black")
plt.plot([124.5,124.5],[54,36],color="black")
plt.plot([124.5,130],[36,36],color="black")

#センターサークル
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

plt.show()

plt.show()を実行するとピッチが表示される。

f:id:yoshitaku_jp:20210227120701p:plain

パスを描く

次はパスを描く。 パスを描くと言っても大げさなものではなく、こちらも直線で表現する。 今回のパスのイメージは、次の 3 本を想定している。

  1. ボランチからバックパス
  2. ボランチから逆サイドへの展開
  3. ボランチから縦パス

まずは 1 のボランチからのバックパスを表現する。 ピッチを描いたコードの最下部に追加をする。

#センターサークル (これより上は省略)
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

#追加部分ここから
data = pd.DataFrame(np.array([[45, 25, 60, 45]]),
                   columns=['Xstart', 'Xend', 'Ystart', 'Yend'])

plt.plot([int(data["Xstart"][0]),int(data["Xend"][0])],
            [int(data["Ystart"][0]),int(data["Yend"][0])],
            color="blue")
plt.plot(int(data["Xstart"][0]),int(data["Ystart"][0]),"o", color="green")
#追加部分ここまで

plt.show()

これでボランチからのバックパスを表現できた。 青の線の端に緑の点があるが、これはパスの始点を想定している。

f:id:yoshitaku_jp:20210227120812p:plain

ボランチからバックパス」、「ボランチから逆サイドへの展開」「ボランチから縦パス」を表現するために、データを追加する。 また、途中の処理もループに変更する。

#センターサークル (これより上は省略)
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

#追加部分ここから

data = pd.DataFrame(np.array([[45, 25, 60, 45],[55, 90, 65, 30],[60, 120, 50, 70]]),
                   columns=['Xstart', 'Xend', 'Ystart', 'Yend'])

for i in range(len(data)):
    plt.plot([int(data["Xstart"][i]),int(data["Xend"][i])],
             [int(data["Ystart"][i]),int(data["Yend"][i])],
             color="blue")
    plt.plot(int(data["Xstart"][i]),int(data["Ystart"][i]),"o", color="green")
#追加部分ここまで


plt.show()

f:id:yoshitaku_jp:20210227120906p:plain

まとめ

「FC Python のコンテンツを通してパスマップの描き方を学ぶことができた。 「FC Python には他にも Python を使ったサッカーの分析を学べるコンテンツが揃っている。 サッカーのデータ分析の知見はなかなか見かけないのでどんどん使いこなしていくぞ!!

fcpython.com

リセットCSSについてまとめた

Web デザインの本を読んでいるときにリセット CSS という単語を見つけました。 初めて見聞きした言葉だったので簡単にまとめておきます。

リセット CSS とは

リセット CSS は、ブラウザに設定されているデフォルトの CSS を上書きするための CSS です。 実はブラウザごとにデフォルトの CSS を持っており、これらをそのままにしておくとデザインを組み立てたときにブラウザごとでばらつきが出てしまいます。 デザインを統一するためにブラウザごとで持っている CSS を打ち消すための CSS がリセット CSS になります。

メリット・デメリット

何かを導入すると必ずメリットデメリットが発生しますが、基本的にはブラウザ間で違うデザインが表示されることを防げるのでメリットが上回っている気がします。 デメリットは管理するファイルが増えたり、導入する作業が発生するぐらいでしょうか。

  HTML5 Doctor Reset CSS

リセット CSS にはいくつか種類があります。 ブラウザごとの CSS を打ち消したあとは、過度に装飾しない限りでは個別で味を出している感じでしょうか。 自分が使っているものは HTML5 Doctor Reset CSS です。 見出しとなる h1 系からはじまり、ほとんどのものがリセットされます。 0 に近いところから実装していくには良さそうです。

html5doctor.com

VS CodeでSCSSを監視して自動コンパイルしてくれる「Live Sass Compiler」

スクランナーの「gulp」を毎回実行するのがめんどくさいと感じ調べたところ、VS Codeの拡張に「Live Sass Compiler」があったので試した。 gulpも設定をおこなえば自動でコンパイルをしてくれるが、VS Codeにインストールするだけでやってくれるので「Live Sass Compiler」のほうがお手軽だった。

「Live Sass Compiler」はVS Codeの拡張から検索してインストールするだけになる。

f:id:yoshitaku_jp:20210214133114p:plain

実行も簡単でVS Codeの右下から「Watch Sass」をクリックするだけになる。

f:id:yoshitaku_jp:20210214134224p:plain

VS Codeの出力が開いて「Watching...」と表示されていて、また「Watch Sass」の部分も「Watching...」に変化している。

f:id:yoshitaku_jp:20210214134333p:plain

この状態でSCSSファイルを編集し保存をすると自動でCSSに変換してくれる。

簡単な通知にLINE Notifyが良かった

個人で簡単なアプリを作成したときにも、通知を欲しい場面がある。 そんなときの通知先にはいくつかの候補先があるが、今回使った LINE Notify がよかった。 やりかたも簡単なので紹介しておく。

設定方法

まずは LINE Notify にアクセスし、ログインをおこなう。 ちなみに、安全なログインのため PIN が表示され、普段使っている LINE アプリの方で認証が必要なので準備しておくことが必要。

https://notify-bot.line.me/ja/

f:id:yoshitaku_jp:20210207120516p:plain

マイページからアクセストークンを発行する

まずはマイページに移動する。

f:id:yoshitaku_jp:20210207121219p:plain

トークンを発行する」でトークンを発行できる。

f:id:yoshitaku_jp:20210207121631p:plain

ここでは、「トークン名」と「通知を送信する場所」を指定する。 通知を送信する場所は、個人だったりグループチャットを選べる。 ここは用途で選んでもらえばいいかと。

f:id:yoshitaku_jp:20210207121751p:plain

発行するとトークンがでてくるので、保存しておく。

f:id:yoshitaku_jp:20210207121903p:plain

GAS から送信してみる

Google Apps Script から LINE に送信してみる。 簡易的なものかつ GAS のブラウザ上からおこなったので、var などは目をつむる...。

function myFunction() {
  var TOKEN = "あなたのトークンを入れてください"
  var messageText = "ここにはメッセージが入ります。";
  var options = {
      method: "post",
      headers: {
          Authorization: "Bearer " + TOKEN
      },
      payload: {
          message: messageText
      }
  };
  var url = "https://notify-api.line.me/api/notify";
  UrlFetchApp.fetch(url, options);
}

結果的には次のようなメッセージが来る。

f:id:yoshitaku_jp:20210207120443p:plain

まとめ

今回は LINE Notify を紹介した。 以前の記事に LINE Notify を使ったことを紹介していたが、実際に解説した記事となる。

yoshitaku-jp.hatenablog.com

個人的な通知用途だと LINE を日常的に利用していることもあり、LINE Notify は手軽に受け取れるのが良かった。 以前は個人 Slack を立てていたこともありそちらに送っていたが、様々な連携を外してからはオーバースペックであると感じていたので代替手段が見つかってよかった。

1 つデメリットがあるとすれば、PC を触っている時はスマホで LINE を見ない可能性があり、その際は通知を見逃すことがある。 なので、生活スタイルを考えたときに重要度の高い通知には向かないかもしれない。 自分は Apple Watch を使用していて、通知が手元で確認できるので、その点がカバーはできている。

SQL DatabaseにADユーザを登録する前に設定する項目

SQL DatabaseにADユーザを登録する作業を頼まれたときに、ハマったのでメモ。

SQL DatabaseにADユーザを登録する際、登録作業を実施するユーザがサーバのActive Directory管理者である必要がある。 この作業はAzureの画面上からすぐに実施することができる。

サーバの画面の左側から「Active Directory管理者」をクリックする。 f:id:yoshitaku_jp:20210131102319p:plain

Azure上にログインしているユーザを「Active Directory管理者」に設定する。

f:id:yoshitaku_jp:20210131102825p:plain

その後、Active Directory管理者ユーザでSQLを使って追加作業をおこなっていく。

実際の作業はこちらにまとまっているのでリンクの形で紹介する。

qiita.com

参考記事

docs.microsoft.com