# Azure Monitor による Kusto クエリの実行

## 収集されるデータの拡張
1. リソースにおける "診断の有効化"
+ Azure SQL Database

2. エージェントの追加
+ VM の場合、Azure Monitor でより詳細のログを収集するために、以下のような対応をとることができる。
- Log Analytics エージェントのインストール
- Log Analytics ワークスペースにデータを保存

3. 開発者による追加
+ 開発者は、Web アプリ、Azure Functions などで、カスタム コードを使って Azure Monitor にデータを送信することが可能。
+ データの送信には REST 形式のデータ コレクタ API 使う。.NET Framework、Node.js、Python などのさまざまな開発フレームワークと互換性をもつ。


## Kusto が使える場所
+ LogAnalytics
+ Azure Data Explorer

## KQL 実行例
```
Heartbeat
| summarize dcount(ComputerIP) by bin(TimeGenerated, 1h)
| render timechart
```

```
Heartbeat
| summarize arg_max(TimeGenerated, *) by ComputerIP
```

### セキュリティイベントテーブルから、10件を表示する。
```
SecurityEvent
| take 10
```

### セキュリティイベントテーブルから、最新の 10件を表示する。
```
SecurityEvent
| top 10 by TimeGenerated
```

### セキュリティイベントテーブルから、30 分以内に発生した、レベル 10 以上のレコードを表示する
```
SecurityEvent
| where TimeGenerated < ago(30m)
| where toint(Level) >= 10
```

### Event テーブルで、過去 24 時間の Application イベント ログを出力する
```
Event
| where EventLog == "Application"
| where TimeGenerated > ago(24h)
```
### 過去 3 週間に、毎週ハートビート イベントを生成したさまざまなコンピューターの数を表示します。 結果が横棒グラフとして表示されます。

```
Heartbeat
| where TimeGenerated >= startofweek(ago(21d))
| summarize dcount(Computer) by endofweek(TimeGenerated) | render barchart kind=default
```

PySimpleGUI: テーマの一覧の表示

PySimpleGUI には 150 を超えるテーマがあります。

そのテーマのサンプルを表示する便利な関数があります。

 

それが、以下です。

import PySimpleGUI as sg
sg.preview_all_look_and_feel_themes()

 

以下のような一覧が表示されます。分かりやすいです。

f:id:koreyakono:20210309233551p:plain

 

ちなみに以下を実行すると、現在選択されているテーマを表示します。

import PySimpleGUI as sg

# 現在選択されているテーマの名前
print(sg.theme())

 

利用可能なテーマの名前の一覧を表示するには、以下のようにします。

import PySimpleGUI as sg

# 利用可能なテーマの名前
print(sg.theme_list())

 

出力結果は以下の通りです。

['Black', 'BlueMono', 'BluePurple', 'BrightColors', 'BrownBlue', 'Dark', 'Dark2', 'DarkAmber', 'DarkBlack', 'DarkBlack1', 'DarkBlue', 'DarkBlue1', 'DarkBlue10', 'DarkBlue11', 'DarkBlue12', 'DarkBlue13', 'DarkBlue14', 'DarkBlue15', 'DarkBlue16', 'DarkBlue17', 'DarkBlue2', 'DarkBlue3', 'DarkBlue4', 'DarkBlue5', 'DarkBlue6', 'DarkBlue7', 'DarkBlue8', 'DarkBlue9', 'DarkBrown', 'DarkBrown1', 'DarkBrown2', 'DarkBrown3', 'DarkBrown4', 'DarkBrown5', 'DarkBrown6', 'DarkBrown7', 'DarkGreen', 'DarkGreen1', 'DarkGreen2', 'DarkGreen3', 'DarkGreen4', 'DarkGreen5', 'DarkGreen6', 'DarkGreen7', 'DarkGrey', 'DarkGrey1', 'DarkGrey10', 'DarkGrey11', 'DarkGrey12', 'DarkGrey13', 'DarkGrey14', 'DarkGrey2', 'DarkGrey3', 'DarkGrey4', 'DarkGrey5', 'DarkGrey6', 'DarkGrey7', 'DarkGrey8', 'DarkGrey9', 'DarkPurple', 'DarkPurple1', 'DarkPurple2', 'DarkPurple3', 'DarkPurple4', 'DarkPurple5', 'DarkPurple6', 'DarkPurple7', 'DarkRed', 'DarkRed1', 'DarkRed2', 'DarkTanBlue', 'DarkTeal', 'DarkTeal1', 'DarkTeal10', 'DarkTeal11', 'DarkTeal12', 'DarkTeal2', 'DarkTeal3', 'DarkTeal4', 'DarkTeal5', 'DarkTeal6', 'DarkTeal7', 'DarkTeal8', 'DarkTeal9', 'Default', 'Default1', 'DefaultNoMoreNagging', 'Green', 'GreenMono', 'GreenTan', 'HotDogStand', 'Kayak', 'LightBlue', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4', 'LightBlue5', 'LightBlue6', 'LightBlue7', 'LightBrown', 'LightBrown1', 'LightBrown10', 'LightBrown11', 'LightBrown12', 'LightBrown13', 'LightBrown2', 'LightBrown3', 'LightBrown4', 'LightBrown5', 'LightBrown6', 'LightBrown7', 'LightBrown8', 'LightBrown9', 'LightGray1', 'LightGreen', 'LightGreen1', 'LightGreen10', 'LightGreen2', 'LightGreen3', 'LightGreen4', 'LightGreen5', 'LightGreen6', 'LightGreen7', 'LightGreen8', 'LightGreen9', 'LightGrey', 'LightGrey1', 'LightGrey2', 'LightGrey3', 'LightGrey4', 'LightGrey5', 'LightGrey6', 'LightPurple', 'LightTeal', 'LightYellow', 'Material1', 'Material2', 'NeutralBlue', 'Purple', 'Python', 'Reddit', 'Reds', 'SandyBeach', 'SystemDefault', 'SystemDefault1', 'SystemDefaultForReal', 'Tan', 'TanBlue', 'TealMono', 'Topanga']

 

 

PyCharm: Terminal のシェルの変更

PyCharm のデフォルトのシェルは cmd.exe です。

これを PowerShell.exe に変更する手順です。

 

1.  [Files] - [Settings]

f:id:koreyakono:20210306150355p:plain

 

2. [Tools] - [Terminal]

f:id:koreyakono:20210306150526p:plain

 

3. "Shell path" に "PowerShell.exe" と入力し、[OK] を押します。

f:id:koreyakono:20210306143721p:plain

 

普段使用している PowerShell のプロファイルを読み込まないようにするためには、以下のコマンドを登録すると良いです。

 

PowerShell.exe -NoProfile

 

 

以上です。

 

 

PyCharm: パッケージをオフラインで追加する

前回、PyCharm のパッケージを GUI からインストールしました。GUI からのインストールは簡単で便利だったのですが、インターネットに接続している必要があります。

PyCharm: Pythonパッケージの追加 - あれやこれや

  

今回は予め資源をダウンロードしておき、オフラインでインストールをしてみたいと思います。

 

1. インストール用のパッケージを入手する

まずは、 PyPI で必要な資源をダウンロードします。

以下にアクセスします。

pypi.org

 

 以下のような画面が表示されます。検索欄にインストールしたいパッケージ名を入力し、検索をします。 今回の例では、PySimpleGUI を検索します。

f:id:koreyakono:20210304235649p:plain

 

検索結果から必要なパッケージのリンクをクリックします。今回の例では、"PySimlpeGUI 4.35.0" をクリックします。 

f:id:koreyakono:20210304235747p:plain

 

"PySimlpeGUI 4.35.0" のページが開きます。左の欄にある "Download files" をクリックします。

f:id:koreyakono:20210305000140p:plain

 

パッケージのダウンロード画面になりますので、パッケージをダウンロードします。

今回は、"PySimpleGUI-4.35.0-py3-none-any.whl" をダウンロードしました。

※ "PySimpleGUI-4.35.0.tar.gz" でもインストールは可能です。

f:id:koreyakono:20210305000351p:plain

 

2. パッケージをインストールする

 PyCharm を起動します。そして、赤枠部分にある "Terminal" をクリックします。

f:id:koreyakono:20210305000936p:plain

 

CLI が起動します。

f:id:koreyakono:20210305001055p:plain

 

 先ほどダウンロードした資源の格納されているディレクトリへ移動後、以下のコマンドを実行します。

pip install .\PySimpleGUI-4.35.0-py3-none-any.whl 

f:id:koreyakono:20210305001150p:plain

 

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

 

3. インストール状態の確認

"pip list" コマンドで確認するとこんな感じです。

f:id:koreyakono:20210306140932p:plain

 

GUI で確認すると、こんな感じです。

f:id:koreyakono:20210306141037p:plain

 

 

以上です。

PyCharm: Pythonパッケージの追加

PyCharm 環境にパッケージを追加する手順をまとめました。

今回は、Pillow を追加してみようと思います。

 

1.  パッケージがインストールされていないことを確認する

 まずは、Pillow が動作しないことを確認してみます。

パッケージでインポートしようとすると、エラーになります。当然です。

f:id:koreyakono:20210225161703p:plain

 

別の方法として、[File] - [Settings] - [Python Interpreter] をすると、インストールされているパッケージが表示されます。Pillow がインストールされていないので、表示されていません。

f:id:koreyakono:20210225161707p:plain

  

2.  パッケージのインストール

それでは、Pillow パッケージをインストールします。

1. [File] - [Settings] をクリックします。

f:id:koreyakono:20210225162329p:plain

 

2.  [Python Interpreter] から追加画面を表示します。

[Python Interpreter] を選択し、さらに、赤枠部分の "+" をクリックします。

f:id:koreyakono:20210225162852p:plain

 

3. パッケージ名を検索し、インストールをします。

 検索欄にパッケージ名を入力します。今回は "pillow" と入力します。

インストール対象 ("Pillow") を選択し、[Install Package] をクリックします。

f:id:koreyakono:20210225161711p:plain

  

4. インストールが完了すると、緑色で "installed successfully" と表示されます。

f:id:koreyakono:20210225161714p:plain

 

3. インストール確認

1. [Python Interpreter]  の画面に "Pillow" が表示されていることが分かります。 

f:id:koreyakono:20210225161717p:plain

  

2. スクリプトで import してみると、エラーが表示されなくなりました。

f:id:koreyakono:20210225161720p:plain

 

 

 

以上でございます。

タブで 2つの Frame の切り替えができるようにしようとしたら、Frame が2つ縦に並んでしまった件 (とりあえず解決)

タブを 2つ用意し、そのタブ毎にフレームを作成して、タブでフレームを切り替えられるようにしようとしたところ、こんな感じになってしまいました。

f:id:koreyakono:20210210220120p:plain

 

なんというか、Frame がタブに収まってないって感じです。

 

フレーム作成の共通の処理をするために BaseFrame というクラスを作成したのですが、このクラスに問題があるらしく、BaseFrame クラスを経由しなければうまくいく、というのが前回分かりました。

koreyakono.hatenadiary.jp

 

 

さて、問題の BaseFrame クラスですが、以下のようなものです。

class BaseFrame(tk.Frame):
def __init__(self, master):
frame_color = "lightskyblue"

# call constructor
super().__init__(master, relief="groove", bd=6)

self.base_frame = tk.Frame(master,
bg=frame_color,
relief="sunken", bd=5)
self.base_frame.grid()

# put label
self.r0c0_label = tk.Label(self.base_frame, font=("system"),
text="path: ", anchor="w", padx=1, width=10)
self.r0c0_label.grid(row=0, column=0, sticky="w")

# put entry
self.r0c0_entry = tk.Entry(self.base_frame, width=50, bd=2, font=("system"))
self.r0c0_entry.grid(row=0, column=0, columnspan=2, padx="60", sticky="w")

self.r1c0_button = tk.Button(self.base_frame, text="put button",
command=lambda obj=self.r0c0_entry:
run_script(obj)
)
self.r1c0_button.grid(row=1, column=0, pady=5, sticky="w")
 

 

Python のマニュアルを改めてみてみると、Frame クラスを継承したクラスのサンプルは以下のように記載されています。

class App(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

tkinter --- Tcl/Tk の Python インタフェース — Python 3.9.1 ドキュメント

 

 私との違いは、tk.Frame の生成のところです。Python のマニュアルは、tk.Frame  の __init__ を実行後、すぐ、self.pack() をしています。App は、tk.Frame を継承しているので、self 自体が tk.Frame なんですね。だから、self.pack() でよいのだということなのでしょう。

 

私の場合、BaseFrame(tk.Frame) の中で、さらに tk.Frame をインスタンス化していたので、この部分が冗長でした。そこで、BaseFrame(tk.Frame) の BaseFrame.base_frame 記述を self に置き換えることにしました。

 

ここの部分です。

self.base_frame = tk.Frame(master,
bg=frame_color,
relief="sunken", bd=5)
self.base_frame.grid()

 

以下のように直しました。

super().__init__(master, relief="groove", bg=frame_color, bd=5)

# 修正: tk.Frame を呼ぶ必要がない。なぜなら、tk.Frame を継承しているから。
# self.base_frame = tk.Frame(master,
# bg=frame_color,
# relief="sunken", bd=5)

# 自分自身を grid する
# self.base_frame.grid()
self.grid()

 

 

その結果、

  

 

うまく動作しました。

f:id:koreyakono:20210211103652p:plain

 

・修正後のコード

import tkinter as tk
import tkinter.ttk as ttk


class BaseFrame(tk.Frame):
def __init__(self, master, button_text=None):
frame_color = "lightskyblue"

# call constructor
super().__init__(master, relief="groove", bg=frame_color, bd=5)

# 修正: tk.Frame を呼ぶ必要がない。なぜなら、tk.Frame を継承しているから。
# self.base_frame = tk.Frame(master,
# bg=frame_color,
# relief="sunken", bd=5)

# 自分自身を grid する
# self.base_frame.grid()
self.grid()

# 以下、self.base_frame parent にしていた部分を self へ置き換える

# put label
self.r0c0_label = tk.Label(self, font=("system"),
text="path: ", anchor="w", padx=1, width=10)
self.r0c0_label.grid(row=0, column=0, sticky="w")

# put entry
self.r0c0_entry = tk.Entry(self, width=50, bd=2, font=("system"))
self.r0c0_entry.grid(row=0, column=0, columnspan=2, padx="60", sticky="w")

self.r1c0_button = tk.Button(self, text=button_text,
command=lambda obj=self.r0c0_entry:
run_script(obj)
)
self.r1c0_button.grid(row=1, column=0, pady=5, sticky="w")


def run_script(entry=None):
url = entry.get()
print(url)


class MainWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title("GUI")
self.root.attributes("-topmost", True)

# -----------------------------------
# Notebook を使ってタブを設定してみる
# -----------------------------------
notebook = ttk.Notebook(self.root)
notebook.grid(sticky="w")

# tab に表示する frame1 frame2 を生成する。
# タブの切り替えが分かるように button のテキストを変えられるようにする
self.frame1 = BaseFrame(master=self.root, button_text="button1")
self.frame2 = BaseFrame(master=self.root, button_text="button2")

# notebook に追加する
notebook.add(self.frame1, text="tab1")
notebook.add(self.frame2, text="tab2")

# 変更はここまで ------------------------

self.root.mainloop()


# start program
MainWindow()

if __name__ == '__main__':
pass

 

  

ちなみに、逆に  BaseFrame を呼び出す側で、notebook.add() に BaseFrame.base_frame を指定すればいいんじゃない ?  というのも思ったので、やってみると....

  

できました !     

f:id:koreyakono:20210211103335p:plain

  

・コード

import tkinter as tk
import tkinter.ttk as ttk


class BaseFrame(tk.Frame):
def __init__(self, master, button_text):
frame_color = "lightskyblue"

# call constructor
super().__init__(master, relief="groove", bd=6)

self.base_frame = tk.Frame(master,
bg=frame_color,
relief="sunken", bd=5)
self.base_frame.grid()

# put label
self.r0c0_label = tk.Label(self.base_frame, font=("system"),
text="path: ", anchor="w", padx=1, width=10)
self.r0c0_label.grid(row=0, column=0, sticky="w")

# put entry
self.r0c0_entry = tk.Entry(self.base_frame, width=50, bd=2, font=("system"))
self.r0c0_entry.grid(row=0, column=0, columnspan=2, padx="60", sticky="w")

self.r1c0_button = tk.Button(self.base_frame, text=button_text,
command=lambda obj=self.r0c0_entry:
run_script(obj)
)
self.r1c0_button.grid(row=1, column=0, pady=5, sticky="w")


def run_script(entry=None):
url = entry.get()
print(url)


class MainWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title("GUI")
self.root.attributes("-topmost", True)

# -----------------------------------
# Notebook を使ってタブを設定してみる
# -----------------------------------
notebook = ttk.Notebook(self.root)
notebook.grid(sticky="w")

# tab に表示する frame1 frame2 を生成する
self.frame1 = BaseFrame(master=self.root, button_text="b1")
self.frame2 = BaseFrame(master=self.root, button_text="b2")


# notebook に追加する
# 変更: 追加する対象を BaseFrame.base_frame にする
notebook.add(self.frame1.base_frame, text="tab1")
notebook.add(self.frame2.base_frame, text="tab2")

# 変更はここまで ------------------------

self.root.mainloop()


# start program
MainWindow()

if __name__ == '__main__':
pass

でも、こっちは階層が深くなって分かりにくい感じがします。

 

 

今日はここまでです。

PyCharm: メニューの文字の大きさを変更する

PyCharm のメニューの文字がちょっと小さく感じたので、大きくする方法を調べました。

対象は、以下の赤枠のところです。 

f:id:koreyakono:20210311221652p:plain



 

・手順 

 1. [File] - [Settings] を選択します。

f:id:koreyakono:20210224125611p:plain

 

2. [Appearance] を選択します。

デフォルトの文字のサイズは "12" になっています。

f:id:koreyakono:20210224125615p:plain

 

 3. 文字サイズの設定

"User custom font" の左側のチェックボックスにチェックを入れ、"Size" で文字サイズを入力します。"Apply" を押すと、文字の大きさが変わります。ちょうどよい大きさになったら、"OK" を押します。

f:id:koreyakono:20210224130123p:plain

 

4. メニューの文字が大きくなったことを確認します。

f:id:koreyakono:20210311221727p:plain

以上です。