みやみや

11月 042016
 

経緯

Microsoft から対抗 Slack と噂されていたサービスが発表されました。

普段仕事で Office365 を使っている私にとっては、Microsoft Teams はとてもワクワクするサービスですね。

早速ですが Microsft Teams に PowerShell から投稿してみることを試してみました。

検証環境

  • Windows 10 Pro
  • PowerShell 5.0

手順

  • チャネル名の右にある点々をクリックして、コネクタをクリックします

  • Incoming Webhook を探して 追加 をクリックします

  • 名前やアイコンを設定します

  • スクロールして 作成 をクリックします

  • URL が表示されますので、コピーしてテキストエディタにでも貼り付けておきます

  • チャネルの画面に戻ると 3 で付けた名前とアイコンの何者かが参加しています

  • Hello World

    1万年と2000年前から使われるこのフレーズを使います。
    下記コマンドを PowerShell から入力すると画像のように投稿されると思います。

  • Office 356 Connectors API を使って少しリッチな投稿を試す
    成功するとこのような感じで表示されます。
    Office 356 Connectors API は今回始めて使ったのですが楽しいですね。

参考 URL

10月 232016
 

Excel マクロはタスクスケジューラで実行できるのか

PowerShell でログ収集・精査をして、確認用の Excel に保存する。
「Excel が自分自身でやれよ」と考えてしまい、「そもそも Excel のマクロをタスクスケジューラーから実行できるのかな?」というところから確認してみようと思い試してみました。

体調崩していて暇ですし、ただ試すだけでは面白味にかけたので、ついでに簡易的なパフォーマンスログ取得を行なってみます。「パフォーマンスモニター使えば?」と思われる方もいるでしょうが、楽しくやっているのでそっとしておいて下さい^^;

数カ月ぶりにマクロを触ると作り方等をすっかり忘れていたので、個人的な備忘録としても、私が分かる範囲で少し詳しめに書いてみたいと思います。ご指摘があれば優しくお願い致します。

やること

  • Excel マクロで、CPU、Memory、Disk の状態を取得する
  • Excel マクロをタスクスケジューラーで実行する

検証環境

  • Windows10 Pro
  • Excel 2016

1. マクロ有効ブックの作成

ちなみに作成後のファイルはこちらになります
手っ取り早く試してみたい方は、上記ファイルを使い、 2. タスクスケジューラーへの設定 から読むことをおすすめします。

1-1. 下準備

マクロを作る前に

  1. 上部メニューの ファイル をクリック
  2. 左部メニューの オプション をクリック
  3. Excel のオプションウィンドウ、左部メニュー リボンのユーザー設定 をクリック
  4. 中央部の左リストから 開発 を選択し、 追加 >> ボタンをクリック、その後 OK ボタンをクリック
    開発をする時には、「開発」のリボンを表示した方が便利です。

データ用シートの作成

マクロから行っても良いのですが、1 回しか行わないので手作業で作りました。

  • cpu シート
    書式設定
    A 名前 文字列
    B 使用率 数値
    C 取得日時 ユーザー定義、 yyyy/m/d hh:mm:ss
  • memory シート
    書式設定
    A タイプ 文字列
    B 空き容量 数値
    C 全体容量 数値
    D 取得日時 ユーザー定義、 yyyy/m/d hh:mm:ss
  • シート
    書式設定
    A タイプ 文字列
    B 空き容量 数値
    C 全体容量 数値
    D 取得日時 ユーザー定義、 yyyy/m/d hh:mm:ss

まずはマクロなしの素の Excel ファイルとして保存しました。
ここで作成された Excel ファイルはこちらになります >> performance.xlsx

1-2. マクロを組む

「開発」リボンから、Visual Basic
をクリックすると次のようなウィンドウが開きます。

左のウィンドウにある ThisWorkbook をダブルクリックして、その中にマクロを記述していきます。
今回私が書いたコードはこちらになります >> ThisWorkbook.vbs

需要があるか判りませんが少し説明をしてみます。


Const DISK_NAME = 1
  :
Const CPU_CREATEDAT = 3

最初に各シートで使う列を定数(Const)で宣言しています。

もしソースコード上で列を表す数値を直接書いていると変更に弱くなります(例えば列を入れ替えた時にプログラムの変更箇所が多い等)ので、予め定数として宣言しておきます。

Dim Wmi As Object
今回は CPU、Memory、Disk の各情報を WMI(Windows Management Instrumentation)経由で取得しますので、オブジェクト型として Wmi を定義しています。

Dim CreatedAt As Date
CreatedAt はマクロの実行時間を記録するために使用します。


ファイル(ブック)を開いた時にマクロを自動実行するメソッドです。

Application.WindowState = xlMinimized
起動時に最小化します。

Call Logging
Logging サブルーチンを呼び出しています。


Logging サブルーチンでは、次の処理を呼び出しています。

  1. 初期化処理
  2. CPU 情報の取得とシートへのセット
  3. Memory 情報の取得とシートへのセット
  4. Disk 情報の取得とシートへのセット
  5. 終了処理

Application.DisplayAlerts = False
このような警告メッセージを出さないようにしています。
alert.png

Set Wmi = GetObject( _
“winmgmts:{impersonationLevel=impersonate}!\.\root\cimv2” _
)

WMI をローカルコンピューター(動作させる PC)の root\cimv2 名前空間に接続しています。
VBA で複数行に分けて書きたい時には、上記のように _ (アンダースコア)でつなげます。


終了処理となります。

Set Wmi = Nothing
Wmi オブジェクトの破棄を行います。

ThisWorkbook.Save
ファイルの保存を行います。

If Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close
End If

他の Excel ファイルが開かれていない時に Excel の終了(Application.Quit)、他に開いている Excel がある時には今のファイルだけ閉じています(ThisWorkbook.Close)。


SetInfoForCpu は CPU 情報の取得とシートへのセットを行っています。

Row = Sheet.Cells(Rows.Count, CPU_NAME).End(xlUp).Row + 1
データを記録できる行を取得するため、「データのある次の行」を Row にセットしています。

その後 WMI から取得したデータを Cell にセットしていき、最後に使用したオブジェクトを破棄しています。


SetInfoForMemory は Memory 情報の取得とシートへのセットを行っています。
Memory には「物理メモリ」と「仮想メモリ(swap)」があり、物理メモリを PhysicalMemory、仮想メモリを VirtualMemory としてデータをセットしています。


Disk 情報の取得とシートへのセットは CPU と Memory の時とほぼ同じです。

1-3. マクロの保存

名前をつけて保存を行い、ファイルの種類を Excel マクロ有効ブック(*.xlsm) を選択して保存します。
ここで作成された Excel ファイルはこちらになります >> performance.xlsm

2. タスクスケジューラーへの設定

タスクスケジューラーへの設定を試みましたが上手く動いてくれず、調べると全く同じ状態でブログに情報を載せてくださっている方がいました。ありがとうございます!

これらを踏まえて設定していきます。

2-1. タスクスケジューラの起動

タスクスケジューラを起動します。
Cortana に「タスク」と入力したら出てくると思います。

2-2. 設定

  • 操作の タスクの作成 をクリックします。

 

  • 任意の名前を入力
  • ユーザーがログオンしているときのみ実行する を選択

 

  • 設定を 1 回
  • 繰り返し間隔を任意の間隔で入力
  • 継続時間は無期限を選択

 

  • プログラム/スクリプトに次の値を入力
    “C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE”
  • 引数の追加(オプション) に次の値を入力
    <マクロ有効ブックの絶対パス> /e

    • 例: C:\Users\hoge\Desktop\performance.xlsm /e

    /e を付けることで、Excel の起動画面が表示されません。

設定は以上ですので、OK でタスクの作成を完了させて下さい。

3. 実行

テスト実行する時には、登録したタスクを右クリックして「実行する」を選択すると実行されます。
その際、 初回の実行の時にマクロの警告がでますので許可してください。

今回作成したマクロは、起動すると自動で実行して閉じてしまいますので、中のデータを確認する時はマクロが動かないように開く必要があります。

  1. Excel を開く (ファイルをダブルクリックではない)
  2. ファイルを開く時に Shift ボタンを押しながら開く

10-1.png

10-2.png

考察

Windows Server 2008 R2 ですんなり上手く行っていたタスクスケジューラの設定が、Windows 10 で動作が変わっていることに気付くのに 2 時間かかってハマりました。

実際に使う時には、グラフ化しやすいようにデータを取った方が良いですね。

10月 042016
 

経緯

PowerShell 楽しいし、あまり深く考えずに「パフォーマンスモニターを PowerShell でやってみよう」という感じです。

気力が続けば、ここから Excel 出力してグラフ化(Excel 苦手だけど)まで行きたいと思います。

概要設計

  • CPU
  • Memory
  • Disk

上記 3 つの情報を定期的にログに落とす

ココではまずはテキストに TAB 区切りでログを落とすことにする。TAB 区切りは Excel に噛ますのが楽なので採用した。

CPU 情報の設計と取得

CPU 情報の条件としては次の内容で検討

  • CPU 全体、コアごと等の情報を取得できる
  • 使用率は 42.2% のように小数点以下も取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

name(一意の名前) <TAB> persent(使用率) <TAB> get_datetime(取得日時)

Memory の設計と取得

Memory 情報の条件としては次の内容で検討

  • 物理メモリ、仮想メモリ(swap)の情報を取得できる
  • 全体の容量と使用している容量(又は空き容量)を取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

name(Physical or Virtual) <TAB> free(空き容量) <TAB> total(全体容量) <TAB> get_datetime(取得日時)

Disk の設計と取得

Disk 情報の条件としては次の内容で検討

  • 接続されている物理ディスクの情報を取得できる
  • 全体の容量と使用している容量(又は空き容量)を取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

name(Device ID) <TAB> free(空き容量) <TAB> total(全体容量) <TAB> get_datetime(取得日時)

考察

仕様とデータの設計、データの取得までをサーッと作りました。

このままでも Windows タスクスケジューラーに設定してテキストファイルを吐き続けられますが、それでは面白みに欠けるので次回は Excel ファイルに吐くところを作ってみたいと思います。

9月 302016
 

経緯

PowerShell v2.0 の環境でリリース物のチェックが捗らなかったので、勢いに任せて作りました。
恐らく世界で 100 万人ぐらいの人が同じのを作っていることでしょう(てきとー

一応使い方

  • GitHub: miyamiya/mypss の右にある Clone or download をクリックして zip ファイルをダウンロードします。
  • ダウンロードしたライブラリにはセキュリティの観点からブロックが施されています ので 、ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します
  • zip ファイルを解凍します
  • Get-Md5sum のディレクトリを $Env:PSModulePath で表示される何れかのディレクトリに配置します
    よくあるのは、 C:\Users\ユーザー名\Documents\WindowsPowerShell\Modules に配置

実行

9月 192016
 

先輩が、アプリケーションでエラーが発生したら、Windows のイベントログにエラーを吐く仕組みをサーバーに仕込んでいたので、随時イベントログを見なくても気づけるように音を鳴らそうとお酒を飲みながら思い立った。

Beep 音でレベルアップを知らせる

憂鬱な音だと嬉しくないので、レベルアップする事にした。

これを C:\levelup\levelup.ps1 として保存した。

雑だけど気にしないで次に行く。

特定のログが吐かれたらレベルアップする設定

イベントを察知するとレベルが上がるタスクを作成する。

当初は、タスクスケジューラーにイベントを登録してフィルターで実装しようと思ったのだが、Windows の XPath 1.0 の実装が微妙すぎてできなかった。何故 contains を省いたのか理解に苦しむところ。

そこで、タスクスケジューラーはエラーイベントを感知したら levelup.ps1 をキックさせるだけにして、PowerShell で最新のエラーメッセージに misono が居ることを検知したらレベルアップすることにする。


  1. 「ファイル名を指定して実行」に taskschd.msc と入力して OK ボタンを押し、タスクスケジューラーを起動する。
  2. タスクの作成をクリック
  3. 「全般」タブを設定
  4. 「トリガー」タブの新規ボタンをクリック
  5. タスクの開始を「イベント時」に選択、フィルターの種類を「カスタム」に選択し、 新しいイベント フィルターボタンをクリックする
  6. イベントレベルを「エラー」にチェックをいれ、イベントログを「アプリケーション」に設定、イベントソースを「hoge」に設定
  7. 編集が終わったら OK ボタンをして、タスクの作成ウィンドウまで戻る
  8. 「操作」タブに移り、新規ボタンをクリック
  9. 「プログラム/スクリプト」に PowerShell を、「引数の追加」に先ほど作った levelup.ps1 を指定する
  • プログラム/スクリプト
    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

  • 引数の追加
    -WindowStyle Hidden -command “C:\levelup\levelup.ps1”

    1. OK ボタン押していきウィンドウを閉じる

Beep 音でレベルアップを知らせる

C:\levelup\levelup.ps1 を編集します。

検証

テストでイベントログにエラーログを出力します。

レベルアップができれば成功です。

考察

XPath が私の知っている XPath ではなかったのでドハマリしてしまいましたが、結論から言うとシンプルに書けた気がします。

どこにあるか判らないサーバー室ですが、突如鳴り響くレベルアップ音とか楽しみです。

9月 182016
 

PowerShell を使って DB にあんなことやこんなことを試してみたかった。ちょっとだけだよ。

Visual Studio 2015 を試している時に「LocalDB」とかいう文字列を見た覚えがあったので、調べて実際に試してみた備忘録。

MicrosoftSQL Server 2016 Express LocalDB とは

公式より引用

Microsoft SQL Server 2016 Express LocalDB の実行モードは、開発者を対象とした SQL Server Express の実行モードです。

LocalDB インストールによって、 SQL Server データベース エンジンの開始に最低限必要なファイルがコピーされます。 LocalDB のインストール後に、特殊な接続文字列を使用して接続を開始できます。 接続時に、必要な SQL Server インフラストラクチャが自動的に作成および開始されるため、複雑な構成タスクを行わなくてもアプリケーションでデータベースを使用できます。 開発者ツールによって、開発者は SQL Server データベース エンジンを使用して Transact-SQL コードを記述してテストすることができ、SQL Server の完全なサーバー インスタンスを管理する必要はありません。

乱暴に要約すると、開発者向けで必要最小限の SQL Server ということかな。
便利っぽい気がする。

インストール等は参考サイトに載っているので割愛。Visual Studio をインストールしている人は気がついたらインストールされていたりしないかな? 自分がこのパターンです ^^;

SqlLocalDB を扱うには、SqlLocalDB ユーティリティ (SqlLocalDB.exe) を利用します。

SqlLocalDB とは

MicrosoftSQL Server 2016 Express LocalDB のインスタンスを作成するには、SqlLocalDB ユーティリティを使用します。 SqlLocalDB ユーティリティ (SqlLocalDB.exe) は、ユーザーおよび開発者が SQL Server Express LocalDB のインスタンスを作成および管理できるようにするシンプルなコマンド ライン ツールです。

SqlLocalDB を使用して LocalDB を利用する

SqlLocalDB ユーティリティを使用して、LocalDB を操作してみます。

PowerShell を起動

まずは PowerShell を管理者モードで起動します。

インスタンスを作成する

新しいインスタンス misono を作成してみます。

インスタンス情報を取得する

ユーザー所有のインスタンス情報を取得します。

作成されているだけで嬉しくなる名前にして良かったです。

詳細な情報を取得するときには、引数にインスタンス名を指定します。

インスタンスを起動する

状態が停止しているので起動します。

状態を確認してみます。

状態が実行中に変わりました。

sqlcmd で接続してみる

私の環境では sqlcmd へパスが通っていませんでしたので、次のコマンドでとりあえずパスを通しました。

sqlcmd で LocalDB へ接続してみます。

データベース一覧を取得するコマンドを流してみます

データベースを作成する

データファイルやトランザクションログファイルを指定せずにデータベース miyamiya を作成します。

再度データベース一覧を取得してみます。

データベース一覧を取得するコマンドを流してみます

sqlcmd から抜ける

PowerShell で Create Table を流してみる

インスタンス misono のデータベース miyamiya に PowerShell から接続する

PowerShell で Insert を流してみる

PowerShell で select を流してみる

考察

少し試したい時に手軽で良さそうな感じがする

参考

9月 102016
 

.NET Framework の CTS (Common Type System) で扱えると何処かでみた(ソース忘れた)ので、まずはそこから調べていたけど、PowerShell.com に判りやすい一覧表があった。

ついでなので、最大値と最小値も調べてみた。

type FullName MinValue MaxValue
[array] System.Array
[bool] System.Boolean
[byte] System.Byte 0 255
[char] System.Char
[datetime] System.DateTime 0001/01/01 0:00:00 9999/12/31 23:59:59
[decimal] System.Decimal -79228162514264337593543950335 79228162514264337593543950335
[double] System.Double -1.79769313486232E+308 1.79769313486232E+308
[guid] System.Guid
[hashtable] System.Collections.Hashtable
[int16] System.Int16 -32768 32767
[int32], [int] System.Int32 -2147483648 2147483647
[int64], [long] System.Int64 -9223372036854775808 9223372036854775807
[nullable] System.Nullable
[psobject] System.Management.Automation.PSObject
[regex] System.Text.RegularExpressions.Regex
[sbyte] System.SByte -128 127
[scriptblock] System.Management.Automation.ScriptBlock
[single], [float] System.Single -3.402823E+38 3.402823E+38
[string] System.String
[switch] System.Management.Automation.SwitchParameter
[timespan] System.TimeSpan -10675199.02:48:05.4775808 10675199.02:48:05.4775807
[type] System.Type
[uint16] System.UInt16 0 65535
[uint32] System.UInt32 0 4294967295
[uint64] System.UInt64 0 18446744073709551615
[xml] System.Xml.XmlDocument

調査のためのサンプルコード

参考

8月 222016
 

経緯

先日、「PowerShell で画像の回転、リサイズを行う」として ブログQiita に投稿したのですが、最近 PowerShell が楽しくなってきているので、練習がてら使い道不明な自己満足ライブラリを書いてみました。多分、更新はしないと思いますが^^;

イメージ的には、PowerShell で ImageMagick の convert ぽいのを実装する感じです。

実際に試してみると画像がコロコロ動いて楽しいので、PowerShell って面白いじゃん?って人が増えて欲しいなw

準備

  • GitHub: miyamiya/mypss の右にある Clone or download をクリックして zip ファイルをダウンロードします。
  • ダウンロードしたライブラリにはセキュリティの観点からブロックが施されていますので 、ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します
  • zip ファイルを解凍します
  • 処理を行う画像ファイルを用意します
    今回は before.png という、画像サイズが 400 x 200 の画像ファイルを用意しました

  • 今回の例ではこれらを C:\mypss に保存しているものとして進めます

PowerShell の起動

まずは、PowerShell を起動しましょう。PowerShell ISE でも構いません。

Windows マーク(メニューボタン?)を右クリックしてファイル名を指定して実行、powershell と入力して OK を押すと起動します。

Get-Draw の読み込み

PowerShell に次のコマンドを打って読み込みます。

前述の通り、今回の例では C:\mypss に保存してあるので、そのディレクトリに移動してから読み込みを行います。

オブジェクトの作成

画像ファイルを利用してオブジェクトを作成します。

画像を回転させます

例として時計回りに 90 度回転させます。

rotate メソッドは 90, 180, 270 の引数で、それぞれの角度を回転させることができ、NONE を渡すことで回転を止める事が可能です。

  • rotate メソッドの例

一旦保存して確認してみます

回転できました

画像を水平方向に反転させます

flip メソッドは X で水平方向に反転、 Y で垂直方向に反転、 XY で水平&垂直方向に反転し、NONE を渡すことで反転を止めることが可能です。

  • flip メソッドの例

一旦保存して確認してみます

反転できました

リサイズします

今回の画像は 200 x 100 ですが、50 % にリサイズします。

resize メソッドは、パーセンテージ指定とピクセル指定が可能です。

  • resize メソッドの例

一旦保存して確認してみます

リサイズできました

画像ファイルの形式を変更する

png 形式から gif 形式に変更します。

引数で取れるのは .NET Framework の ImageFormat クラスで利用可能な、 bmp , emf , exif , gif , ico , jpg , png , tiff , wmf の形式となります。

※本メソッドを利用しなくても、save メソッドの引数で指定したファイルの拡張子で自動判定されます

一旦保存して確認してみます

gif ファイルができました

イメージを拡大または回転するときのアルゴリズムを変更します

このライブラリではデフォルトで NearestNeighbor(最近傍補間) になっているので、Low(低品質補間) に変更します。

引数で取れるのは .NET Framework の InterpolationMode 列挙体で利用可能な、 Bicubic , Bilinear , Default , High , HighQualityBicubic , HighQualityBilinear , Low , NearestNeighbor の方式となります。

一旦保存して確認してみます

あまり違いが判らない… ですね><

応用: 右クリックメニューに入れる

応用は思い浮かばなかったのですが、例えばこういうことができますね。

以前、「PowerShell のコマンドを右クリックメニューに入れる」として行ったのと組み合わせるとこういうことができます。

  1. regedit を起動する
  2. [HKEY_CLASSES_ROOT]-[*]-[shell] を右クリックして [新規]-[キー]を選択
  3. キーに任意の名前(ここでは「画像リサイズ幅640」)をつける(右クリックした時のメニュー名になる)
  4. 3 で作ったキーを右クリックして [新規]-[キー]を選択、名前を command にする
  5. 4 で作ったキー command をクリックして、右のウィンドウにある (規定)をダブルクリックする
  6. 文字列の編集ウィンドウが開くので、値のデータに次のコードを入れる
    ps1
    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -WindowStyle Hidden -command "({& ('C:\mypss\Get-Draw.ps1'); $draw = Get-Draw -File '%1'; $draw.resize.Invoke(640); $draw.save.Invoke();}).Invoke()"
  7. 文字列の編集ウィンドウを閉じる

7 まで終わったら、画像ファイルを右クリックすると 「画像リサイズ幅640」 と表示されると思います

「画像リサイズ幅640」 を選択すると同じディレクトリに同じファイル名に「(1)」が付いたファイルができていると思います。