11月 262016
 

先日 GitHub で他の方のソースコードをみている時にこの機能を知りましたので、同じように知らない人が居ればと思い紹介。

Splatting とは

公式にはこのように書いてありました。

スプラッティングは、パラメーター値のコレクションをまとめてコマンドに渡す手法です。Windows PowerShell はコレクションのそれぞれの値をコマンドのパラメーターに関連付けます。スプラットされたパラメーター値は、名前付きスプラッティング変数に格納されます。名前つきスプラッティング変数は普通の変数のように見えますが、ドル記号 ($) の代わりにアットマーク (@) で始まります。アットマークは Windows PowerShell に対して、引数が単一の値ではなくコレクションとして渡されることを伝えます。

スプラッティングはコマンドを短くし、読みやすくします。スプラッティング値は別のコマンドの呼び出しで再利用できます。また、スプラッティングを利用して、パラメーター値を $PSBoundParameters 自動変数から他のスクリプトや関数に渡すことができます。

記法

Windows PowerShell 3.0 以降では、コマンドの全パラメーターを次のように表せるそうです。

よく使いそうな例

可読性が良くなるので使っているという事もありますが、例えば自作の関数で引数が多いときや、条件によって動作を変える時に使い始めています。

次の関数は、引数で Param1, Param2, Param3 に数値を渡すと足し算の練習?をして、-Exec スイッチを入れると実際に足し算を行う関数です。

例えば、時分秒を合計して、日付が奇数なら -Exec スイッチを付けるとする

ダラダラ書いてみた例

Splatting を使って書いてみた例

11月 202016
 

Microsoft Cognitive Services を使って何かやってみようと思い、散歩しながら考えた結果、Google Custom API を使って画像を検索して、その画像の表情を Microsoft Cognitive Services で取得して割合を確認した時の備忘録です。

画像を集める

まずは Google Custom Search API の準備を行います。 私は以前 Hubot で遊んでいる時に設定したことがあるのですが、全然覚えていなかったので、備忘録として詳しめに書きます。

1. プロジェクトを作ります(Google Custom Search API の準備)

  • 1-1. 「IAM と管理」の「全てのプロジェクト」 から、[プロジェクトの作成] をクリックします。

  • 1-2. 新しいプロジェクト名を入力します(少し時間がかかります)

  • 1-3. 画面が切り替わった後、[Custom Search API] をクリックします

  • 1-4. [有効にする] をクリックします

  • 1-5. [認証情報に進む] をクリックします

  • 1-6. 必要な認証情報の種類を「Custom Search API」に選択して、[必要な認証情報] をクリックします

  • 1-7. API キーをコピーしてメモ帳とかに貼り付けておいて、[完了] をクリックします

2. Custom Search Engine を作成します(Google Custom Search API の準備)

  • 2-1. CSE(Custom Search Engine)https://cse.google.com/cse/all の画面から [Add] をクリックする

  • 2-2. 検索するサイトに「www.google.co.jp/*」、言語を「日本語」と選択して [作成] をクリックします

  • 2-3. [コントロールパネル] をクリックします

  • 2-4. [検索エンジンID] をクリックして、表示された検索エンジン ID をメモ帳とかに貼り付けておきます

  • 2-5. 「画像検索」をオンに、検索するサイトを「追加したサイトを重視して、ウェブ全体を検索する」に選択します

3. Google Custom API を PowerShell で叩いてみる

早速 API を叩いて画像の URL を取得します。

一度に 10 件の URL を取得できます。

つまり上記の例では、恐らく $links 内に misono の写真の URL が 10 個ゲットできているはず… (ゴクリ

画像から表情データを収集する

Microsoft Cognitive Services の Emotion API を使って表情データを取得していきます。

4. Microsoft Cognitive Services を使う準備

下記記事が判りやすいです。ありがとうございます!

5. Microsoft Cognitive Services の Emotion API で情報を取得

実行した結果はこのようになりました

Excel でグラフ化する

数値だけみても、自然な表情か喜んでいる写真が多いのが判りますが、折角ですので手元の Excel でグラフ化してみたいと思います。

過去、COM を使ったり(PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい)、ClosedXML を使ったりして(PowerShell で ClosedXML を使って Excel ファイルを作成する) Excel ファイルを作っていましたが、今回は NetOffice を使ってグラフ作成を試してみたいと思います。

6. NetOffice の準備

  • NetOffice のダウンロードと展開
    CodePlex からダウンロードします

    ダウンロード後、適当な場所に展開します。私は今回 C ドライブ直下に展開しました。

  • ダウンロードしたライブラリにはセキュリティの観点からブロックが施されています ので 、ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します

  • しかし、今回の方法だと .NET 2.0 ~ からのバイナリやドキュメント、ソースコードまで丸ごと入っていて、圧縮された状態で 150MB 程度、展開すると 950MB 程度になりましたので、NuGet が入っている環境なら NuGet から NetOffice.Excel を指定してインストールしたほうが良いかもしれません(未確認)。
    ■ 参考

7. 取得したデータを Excel に保存してグラフで表示する

本手順では、$xls.Visible = $true として Excel を表示させるようにしています。

コマンドを流すと一つ一つ Excel が動作すること確認でき、なかなか楽しいです。

是非、下記のコマンドをコピペでいいので一行づつ PowerShell で実行して頂けたらと思います。

上記コマンドの実行結果は次になりました。


顔文字だと判りにくい… (おい)

考察

粗々ですが一通り試したいことはできました! Emotion API を使えば、ネットから笑顔の misono の写真を取得するという俺得なプログラムが書けそうです。

また、自分が写った過去の写真を Emotion API にかけることで、人生で一番楽しかった時が判るかもしれません(これは怖い)

今回初めて NetOffice を使ってみたのですが、Excel だけではなく、PowerPoint や Word も扱えるようですので、又何かあったら使ってみたいと思います。

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月 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

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

参考