よしたく blog

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

分析関数について

業務で分析関数を使うことがあったが、今まで簡単な 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

Power BIで行レベルセキュリティ(RLS)を設定する

Power BIにて、「同じレポートを見せたいが、表示するデータは変えたい」といったことがある。例えば、北海道の営業部と沖縄の営業部で同じ形のレポートを表示したいが、データは北海道と沖縄のものにしたいということになる。もちろん最終的には、北海道と沖縄で表示されているデータは違うので、拠点ごとに別のレポートを作成したとしても同じ結果が得られる。

しかし、管理の視点でいうと、各拠点ごとにレポートを作成されると大変なことになる。例に出した、北海道と沖縄に続いて東京と大阪が入ってきたとしたら管理するレポートは4つになる。エリアマネージャーのような役割を持っている人だと、これが拠点ごとに増えていくイメージになる。このレポートが増えていく現状を、データの行レベルで管理していく機能が行レベルセキュリティ(RLS)になる。

今回は行レベルセキュリティ(RLS)を設定してみる。

サンプルデータを読み込む

まずはPowerBIを起動して、サンプルデータを取得する。 「サンプルデータを取得する」をクリックする。 f:id:yoshitaku_jp:20210123084055p:plain

「サンプルデータを読み込む」をクリックする。

f:id:yoshitaku_jp:20210123084122p:plain

「financials」にチェックを入れ、「読み込む」をクリックする。

f:id:yoshitaku_jp:20210123084149p:plain

一番右に表示されている「フィールド」に読み込んだ「financials」が表示されていれば、正常に読み込めている。

f:id:yoshitaku_jp:20210123084341p:plain

ここでは「積み上げ横棒グラフ」を選択する。

f:id:yoshitaku_jp:20210123085438p:plain

軸に「Country」、値に「Sales」を設定するとグラフが表示される。今は行レベルセキュリティ(RLS)の設定をしていないのですべて表示されている。

f:id:yoshitaku_jp:20210123085635p:plain

ロールを設定する

今は「レポート」の画面にいるので、「モデル」に移動する。

f:id:yoshitaku_jp:20210123090108p:plain

「ロールの管理」をクリックする。

f:id:yoshitaku_jp:20210123090211p:plain

ロールの管理を作成する。 次の値を入力し、保存する。

ロール テーブル テーブルフィルターのDAX
Europe financials [Country] in {"France","Germany"}

f:id:yoshitaku_jp:20210123090741p:plain

f:id:yoshitaku_jp:20210123090816p:plain

表示方法を使用すると、ロールごとの表示をプレビューのような形で確認することができる。 表示方法をクリックして、さきほど作成した「Europe」ロールにチェックを入れOKをクリックする。

f:id:yoshitaku_jp:20210123091046p:plain

f:id:yoshitaku_jp:20210123091213p:plain

設定すると現在の表示がEuropeロールであることが明示される。とても親切で嬉しい。

f:id:yoshitaku_jp:20210123091231p:plain

これでレポートの画面に戻ると、表示されている値が絞られていることがわかる

f:id:yoshitaku_jp:20210123091626p:plain

レポートを発行する

レポート画面から「発行」をクリックし、Power BI Serviceにレポートを発行する。「Power BIで RLS.pbix(保存したときのファイル名)を開く」をクリックするとブラウザが立ち上がる。

f:id:yoshitaku_jp:20210123094519p:plain

レポートが表示されるが、マイワークスペースに移動し、先ほど作成したレポートがあることを確認する。 f:id:yoshitaku_jp:20210123095014p:plain

「データセット」の右にある「・・・」をクリックし、セキュリティをクリックする

f:id:yoshitaku_jp:20210123095038p:plain

Power BI Desktopで作成した「Europe」ロールを確認できる。 このロールに対応したメンバーを追加し、設定が完了となる。

f:id:yoshitaku_jp:20210123095147p:plain

まとめ

今回はPower BIにて行レベルセキュリティを設定する方法を自身で実施しまとめた。 実施したところ、Power BI Desktopでロールの外側となる部分を設定し、Power BI Serviceでユーザ追加などの中身を設定していくイメージを持った。 ユーザ情報をローカルに持ってくることはないので、このような実装順序になることは当然のような気もするが、初見ではPower BI Desktopで全部できると思っていたので確認できてよかった。

まだまだ日本語のドキュメントだったり、解説したエントリが少ないので参考になれば幸いです。

参考

docs.microsoft.com

qiita.com

qiita.com

frogwell.co.jp

NFCタグを使って、iPhoneをより便利に使う

今回は NFC タグを使って iPhone のショートカットを実行し、iPhone をより便利に使うようにしてみる。

NFC の正式名称は「Near Field Communication」で、近距離無線通信規格の 1 つになる。 近距離の範囲は 10cm ほどで、NFC ではないが交通系電子マネーで支払うときのようなイメージを持ってもらえば大丈夫だ。 USB のように種類はあるが、運転免許証やマイナンバーカード、パスポートなどでも使われている。

NFC タグにはシールタイプがあり、10 枚入り 1000 円と手頃に入手が可能となっている。

https://www.amazon.co.jp/dp/B00GXSGL5G/www.amazon.co.jp

早速設定する

iPhone からショートカットを起動する。

f:id:yoshitaku_jp:20210116101039p:plain

右上の「+」ボタンをタップする。

f:id:yoshitaku_jp:20210116101106p:plain

個人用オートメーションを作成をタップする。

f:id:yoshitaku_jp:20210116101115p:plain

真ん中ぐらいまでスクロールすると NFC があるのでタップする。

f:id:yoshitaku_jp:20210116101123p:plain

NFC タグの「スキャン」をタップする。

f:id:yoshitaku_jp:20210116101131p:plain

このタイミングで、NFC タグをスキャンする。 タグの名前をつける案内も出るので、名前をつける。 今回は天気予報とした。

f:id:yoshitaku_jp:20210116101138p:plain f:id:yoshitaku_jp:20210116101146p:plain

タグを読み込む部分は上記で終わり、ここからはタグにかざしたとき、実行してほしい処理を設定する。 今回は検索バーに天気予報と入力し、天気アプリをタップする。

f:id:yoshitaku_jp:20210116101155p:plainf:id:yoshitaku_jp:20210116101203p:plain

天気アプリで行えることの一覧が出現する。 今回は「現在の天気を取得」をタップした。 そして、「次へ」をタップする。

f:id:yoshitaku_jp:20210116101211p:plain f:id:yoshitaku_jp:20210116101219p:plain

すべての設定が完了して、最後の確認画面となる。 一番下の「実行前に尋ねる」をオフにして、右上の完了をタップする。

f:id:yoshitaku_jp:20210116101226p:plain

以上で設定は完了となる。

まとめ

NFC タグのシールタイプを使って iPhone のショートカットを設定した。 現在 2 枚のシールを使って、解説した天気予報と、省電力モードになるものを設定している。 まだ使い始めで模索中だが NFC タグならではの設定を見つけていければと思っている。

その他の自動化記事

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com