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)」が付いたファイルができていると思います。

8月 162016
 

経緯

スマホで取った写真の解像度が大きいので、SNS へのアップ前に自力で小さくしようと思ったら GIMP 立ち上げて… 面倒だったので、PowerShell でやってみました

画像の回転

RotateFlipType 列挙体と意味

反転 回転(全て時計回り)
Rotate270FlipNone なし 270 度
Rotate180FlipNone なし 180 度
Rotate90FlipNone なし 90 度
RotateNoneFlipNone なし なし
Rotate270FlipX 水平 270 度
Rotate180FlipX 水平 180 度
Rotate90FlipX 水平 90 度
RotateNoneFlipX 水平 なし
Rotate270FlipY 垂直 270 度
Rotate180FlipY 垂直 180 度
Rotate90FlipY 垂直 90 度
RotateNoneFlipY 垂直 なし
Rotate270FlipXY 水平&垂直 270 度
Rotate180FlipXY 水平&垂直 180 度
Rotate90FlipXY 水平&垂直 90 度
RotateNoneFlipXY 水平&垂直 なし

回転の例

デスクトップの hoge.jpg を時計回りに 90 度回転させて hoge_turn90.jpg として保存する例

画像のリサイズ

縮小の例

デスクトップの hoge.jpg を 幅と高さを 50% にして hoge_resize.jpg として保存する例

参考

8月 042016
 

経緯

先に書いたブログ PowerShell で ClosedXML を使って Excel ファイルを作成する にて、「動作が軽快」と書きましたが体感でしかなかったので、単純に 多くのセルにデータを入れたら速度に差がでるか? というのを試してみたいと思います。

しかし、単純な比較といいなが色々と勉強しながらでした。

特に、一括で貼り付ける方法は「速い」というブログ等は多く目にしましたが、実際にどのようなコードで検証して何と比べて速いのかがまとまっているのは私には見つけられませんでしたので、個人的には今回のサンプルコードがとても大切です。

環境

  • VAIO-Z
    • CPU: Core i7-5557U 3.10 GHz (最大3.40 GHz)
    • Mem: 16GB
    • Storage: 第二世代 ハイスピードSSD(PCI Express x 4 (20 Gb/s))
  • Windows 10
  • PowerShell 5.0
  • ClosedXML 0.76.0
  • Microsoft Open XML Format SDK
  • MS Office 2016

計測方法

Measure-Command を利用して計測する

検証項目と結果

一つのシートで、100 X 100 のセルに下記のパターンでデータを入れていく

No. 試験内容 COM Object ClosedXML
1. セル 1 つづつ 10,000 回、データを入れる(装飾なし) 30.4542562 sec 0.699596 sec
2. セル 1 つづつ 10,000 回、文字色を赤、フォントの大きさを 15 のデータを入れる 136.3952091 sec 0.913028 sec
3. 1 行(100 セル) づつ 100 行分、データを入れる(装飾なし) 2.0920194 sec 0.6800917 sec
4. 1 行(100 セル) づつ 100 行分、文字色を赤、フォントの大きさを 15 のデータを入れる 6.8155114 sec 0.8739652 sec
5. 10,000 のセルに一括でデータを入れる(装飾なし) 1.5663538 sec 0.6527399 sec
6. 10,000 のセルに一括で、文字色を赤、フォントの大きさを 15 のデータを入れる 2.1558577 sec 0.8357458 sec
  • 今回検証に使ったコードは GitHub においてあります

考察

xls 縛りとかがないのなら、ClosedXML を使ったほうがよいなというのが私の感想です。

また、少し面倒に感じますが、配列に入れて一気に貼り付けるほうが圧倒的に速いですので、設計段階からこの考えを取り入れていきたいです。

7月 312016
 

経緯

以前 PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい としてブログを書いたことがあります。

その時の方法では、 Excel がインストールされている必要がありましたが、ClosedXML というライブラリを使うと Excel がインストールされていなくても Excel のファイルを作れることを知りましたので、少し試してみたいと思います。

環境

  • Windows 10
  • PowerShell 5.0
  • ClosedXML 0.76.0
  • Microsoft Open XML Format SDK

作業ディレクトリ

作業ディレクトリをデスクトップに作りました。

ClosedXML の準備

まずはサイトでダウンロードします。 zip 形式でダウンロードできます。

ダウンロードしたライブラリにはセキュリティの観点からブロックが施されていますので、解除をして解凍します。

ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します。

その後、zip ファイルから ClosedXML.dll を取得して、作業ディレクトリに保存します。

Microsoft Open XML Format SDK の準備

ClosedXML のドキュメントページ からも DLL を直接ダウンロードできますが、今回は
Microsoft のサイトから Microsoft Open XML Format SDK をダウンロードします。

ダウンロードページの例

今回私は 2.0 をインストールしてみましたが、私の環境では、msi を実行すると、 C:\Program Files (x86)\Open XML SDK\V2.0\lib に配置されました。

Office のバージョンと関係があるようです。

MS Office Open XML Format SDK
Office 2007 SDK 1.0
Office 2010 SDK 2.0
Office 2013 以降 SDK 2.5

ClosedXML 公式で配布されていたのは、2.0 と 2.5 でした。

Hello world

早速 Hello world を書いてみます。

結果はこうなりました

考察

とても簡単でしたし、動作がとても軽快で驚きました。以前の方法だと、何らかの理由で COM オブジェクトの破棄ができなかった時は、Excel のプロセスが残ってしまうという事がありましたが、その危険性もなさそうです。

気がついたメリット・デメリットは下記の通りです。

メリット

  • 動作が軽快
  • Excel が入っていないマシンでも実行できる 重要
  • オブジェクトの破棄に気を配る必要がない

デメリット

  • xls 形式のファイルは扱えない
  • 環境構築が Excel インストールだけに比べると煩雑