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 インストールだけに比べると煩雑
7月 172016
 

経緯

この 2 ヶ月、仕事で結構 PowerShell でスクリプトを作っている。
毎回テキトーにログ出していたらログの使い勝手が悪いので、ログ出力をユーザー定義関数として作ったが、状態を持てないのでなんかダサかった。

ログファイルのパスをグローバル変数にするとか色々考えていたけど、ふと、「スクリプトブロックを使ったらなんか上手くいくんじゃね?」と思い、車輪の再発明になるのだろうが自作してみた。後悔はしていない。

Claas を使うという事も一瞬頭を過ぎったが、PowerShell 5.0 を仕事で使うのはまだ先になりそうなのですぐに使えるほうを選んだ。

結果(使用方法)

コード

上記のコードはコメントを削っている。最新のコードは GitHub 参照。

考察

結構理想に近い結果になったし、PowerShell 触り始めて 2 ヶ月、PowerShell と少し仲良くなれた気がする。

PowerShell のバージョンを指定して、2.0 でも動いたので、割と使える気がしているので、まずは仕事で使ってみようかな。

参考

6月 252016
 

経緯

お仕事で Windows を使うようになり 1 ヶ月、 報告用 Excel に記述するのも面倒になり、PowerShell である程度作ってしまおうという気になってきていて、他の人にも同じような気持ちになって欲しいので、「お?簡単そうじゃね?」と思ってもらうために書いてみました。

サンプルコードをコピペで感覚をつかめると思いますので、少しでも興味持つ人が増えてくれると嬉しいです。

環境

  • Windows 10
  • PowerShell 5.0
  • Excel 2016

PowerShell の起動

まずは、PowerShell を起動しましょう。
PowerShell ISE ではなく、PowerShell を起動してください。

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

Continue reading »

6月 222016
 

PowerShell で配列の扱い方でスピードが変わるらしい
あまり細かいことは良いから、実感が欲しかったので下記コードでテスト

検証コード

+= を使った

Add を使った

Continue reading »