2015/07/01

6/27、兵庫県芦屋市で開催されたAsiyan Automation Alliance 2015でのセッション資料を公開します。

Asiyan Automation Alliance 2015はその名の通り、自動化をテーマにした勉強会で、みうみう氏を中心とした運営メンバーにより開催されました。実は前年もAsian Automation Alliance 2014として兵庫県尼崎市で開催されており、今回はその続編であったようです。

実は私は芦屋市在住なんですが、地元で開催されるIT系勉強会に参加するのも、登壇するのも初めてで、中々貴重な経験でした。(単なるダジャレかと思いましたが、芦屋市民センターでのIT勉強会の開催実績は他にもあるそうです)

ちなみにAAAには前回も参加したのですが、前回はPowerShellのセッションがないからという理由で「PowerShell「再」入門2014〜short version〜」という突撃LTをしてきました(この時の資料は上げてませんが、http://winscript.jp/powershell/275と大体同じです。)。

今回は、1セッションの時間を頂けたので、改めてPowerShellを中心としたMicrosoftの提供する最新の自動化手法についてご紹介しました。割と総集編的な内容としましたが、いかがでしたでしょうか。

オンプレのWindows ServerやMicrosoft Azureはもちろん、最近はLinuxなど他プラットフォームへの浸食(?)も目立つようになってきました。この辺りの情報は非Microsoftクラスタの方にも積極的に情報提供したいと思っていますし、いろいろ情報交換させていただきたいですね。

2015/02/15

オープンセミナー2015@広島で行った私のセッションのスライドを公開します。

今回のイベントではWindowsサーバーにかかわっている方が少ない感じでしたが、PowerShellとDSCを核とした、最近のMicrosoftやWindowsのインフラ周りってどうなん?という話が伝えられていたなら幸いです。

.NET Frameworkのオープンソース化が記憶に新しい所ですが、サーバー系でもOneGet、DSC for Linux等、Microsoftが関わるオープンソースのプロダクトも増えてきました。またAzure上で顕著な動きですが、Chef、Docker等の既存のOSSの積極的な採用も進んでいます。

このような状況ですので、かつてはMicrosoft系コミュニティとオープンソース系コミュニティでは何となく交流が薄かったと思うんですが、今後はより一層、両者の交流が盛んになっていくんじゃないかなあと個人的には思っています。

2014/03/27

去年12月、東京でJapan PowerShell User Group (JPPOSH)第一回PowerShell勉強会が開催されましたが、来たる4/12(土)13:30より、大阪でも「PowerShell勉強会@大阪」が開催されます!

場所は阿倍野市民学習センターで、阿倍野駅/天王寺駅/阿部野橋駅が最寄りとなります(あべのハルカスの近くですね)。なお、参加費として500円を集めさせていただきますので予めご了承ください。

セッション内容は以下のとおりです。

  1. 「PowerShell『再』入門2014」 by 牟田口
    バージョン1登場から8年目を迎えたPowerShellの現状をまとめ、2014年版のPowerShell入門セッションという形で行なおうと思います。これからPowerShellを扱われる方はもちろん、これまで利用されていた方にも2014年現在のPowerShellの立ち位置の再確認、最新バージョンの4.0新機能等、参考になる内容としたいと思っています。
  2. 「PowerShellをクライアントで活用」 by wakaさん
    サーバー管理用シェルとして登場したPowerShellではありますが、クライアントOSであるWindows 7、8、8.1にも標準搭載され、最初から使えるスクリプト環境としての側面もあります。今回の勉強会主催者でもあるwakaさんに、クライアントサイドでPowerShellを活用するセッションをしていただける予定です。
  3. 調整中(Active Directory/Azure系の予定) by ちゅきさん
    Windows Serverの要の機能といえばやはりActive Directoryですよね。そしてWindows Azure改めMicrosoft Azureというクラウド環境の重要性も増す一方です。Windows Serverにおいてはオンプレもクラウドも、管理にはPowerShellが不可欠です。今回、Microsoft MVP for Directory Servicesのちゅきさんに、ADを中心としたPowerShellによるWindows Server/Azureの管理方法についてセッションしていただける予定です。
  4. 「Windows における PowerShell での デプロイ - DSC と リモーティング」by ぎたぱそさん
    東京の謎社で日夜PowerShellを用いた運用業務に携わり、Twitterやブログで積極的にPowerShell情報を共有されておられるぎたぱそさんが来阪して、PowerShellによるデプロイについてのセッションをしてくださいます。PowerShell 4.0で登場したDSCについても実際の業務での使いどころ等を語っていただけるのではないかと思います。

まだまだ残席ございますので、お近くの方でご興味をお持ちの方は、ぜひとも4/12は基本から応用まで内容盛りだくさんのPowerShell勉強会@大阪へお越しくださいませ! 懇親会もありますよ!

2010/09/20

文字列を連結する際、+=演算子などを使うとループ回数によっては非常に時間がかかることがあります。これは+=演算子が実行されるたびに毎回string型の新しいインスタンスを生成しているからです。同じ文字列変数に対して+=演算子で文字列を追加していくループがある場合は、+=演算子の代わりにStringBuilderクラスを使うのが良いです。

たとえば、

$str=""
@("aaaa","bbbb","cccc","dddd")|
%{$str += $_}
$str

というようなコードと同様の結果を得るためには、

$sb=New-Object System.Text.StringBuilder
@("aaaa","bbbb","cccc","dddd")|
%{[void]$sb.Append($_)}
$sb.ToString()

のようにします。[void]にキャストしているのは、AppendメソッドがStringBuilderのインスタンスを返すため、それを表示させないようにするためです。結果はいずれも

aaaabbbbccccdddd

となり、文字列の連結が可能です。

このようにループ回数が少ない場合はそれほど所要時間に差はないのですが、数千の文字列を連結していく場合だと+=演算子を使うと非常に時間がかかります。どれくらい差が出るのか、スクリプトを書いて検証してみました。

function Measure-StringJoinCommand
{
    param([int]$itemCount)
    
    $randomStrs=@()
    @(1..$itemCount)|%{$randomStrs += Get-Random}
    $StringJoinTime=@()
    $StringBuilderTime=@()
    @(1..3)|
    %{
        $StringJoinTime +=
            (Measure-Command {
                $str=""
                $randomStrs|%{$str+=$_}
                $str
            }).Ticks
        $StringBuilderTime +=
            (Measure-Command {
                $sb=New-Object System.Text.StringBuilder
                $randomStrs|%{[void]$sb.Append($_)}
                $sb.ToString()
            }).Ticks
    }   
   
    $result=New-Object psobject
    $result|Add-Member -MemberType noteproperty -Name ElementCount -Value $itemCount
    $result|Add-Member -MemberType noteproperty -Name StringJoinTime -Value (($StringJoinTime|Measure-Object -Average).Average/10000)
    $result|Add-Member -MemberType noteproperty -Name StringBuilderTime -Value (($StringBuilderTime|Measure-Object -Average).Average/10000)
    $result|Add-Member -MemberType noteproperty -Name StringJoinTicksPerElement -Value (($StringJoinTime|Measure-Object -Average).Average/$itemCount)
    $result|Add-Member -MemberType noteproperty -Name StringBuilderTicksPerElement -Value (($StringBuilderTime|Measure-Object -Average).Average/$itemCount)
    $result 
}

@(100,300,500,800,1000,3000,5000,8000,10000,30000,50000,80000)|
    %{Measure-StringJoinCommand -itemCount $_}|
    Format-Table -Property `
        @{Label="Elements";Expression={$_.ElementCount.ToString("#,##0")};Width=8},
        @{Label="StringJoin(msec)";Expression={$_.StringJoinTime.ToString("#,##0")};Width=20},
        @{Label="StringBuilder(msec)";Expression={$_.StringBuilderTime.ToString("#,##0")};Width=20},
        @{Label="StringJoin(tick/element)";Expression={$_.StringJoinTicksPerElement.ToString("#,##0")};Width=30},
        @{Label="StringBuilder(tick/element)";Expression={$_.StringBuilderTicksPerElement.ToString("#,##0")};Width=30}

CPU=Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz,memory=3GB,Windows 7 x86での実行結果は次の通り

Elements StringJoin(msec)     StringBuilder(msec)  StringJoin(tick/element)       StringBuilder(tick/element)   
-------- ----------------     -------------------  ------------------------       ---------------------------   
100      8                    6                    830                            646                           
300      22                   22                   719                            746                           
500      36                   34                   718                            689                           
800      60                   55                   755                            690                           
1,000    86                   72                   857                            721                           
3,000    264                  192                  880                            638                           
5,000    573                  334                  1,146                          667                           
8,000    1,534                522                  1,917                          653                           
10,000   2,562                731                  2,562                          731                           
30,000   23,386               2,204                7,795                          735                           
50,000   60,805               3,730                12,161                         746                           
80,000   184,407              6,541                23,051                         818   

この表は左から、連結する文字列要素数(ループ回数)、+=演算子を使った場合の所要時間(ミリ秒)、StringBuilderを使った場合の所要時間(ミリ秒)、+=演算子を使った場合の1要素あたりの所要時間(tick=100ナノ秒)、StringBuilderを使った場合の1要素あたりの所要時間(tick=100ナノ秒)、です。なお1要素当たりの平均文字数は9文字程度です。また、測定は3回おこない平均値を取っています。

この表によるとループ回数が5000回程度であれば所要時間にさほど差違は見られませんが、それ以降は急激に+=演算子の所要時間が増えることが分かります。また、+=演算子はループが5000回より増えるとループ回数が増えれば増えるほど1要素あたりにかかる時間も増えるのに対し、StringBuilderの場合はほぼ一定です。

というわけで1ループあたりに追加する文字数とループ回数が少ない場合は+=演算子でもそれほど問題にはなりませんが、そうでない場合はStringBuilderを使うのが良さそうです。これらの値が増加する可能性がある場合は、最初からStringBuilderを使っておけば、ある日突然処理がめちゃくちゃ重くなる、という事態も避けられるでしょう。PowerShellでStringBuilderを使っているサンプルがネットにはあまり見当たらなかったのですが、PowerShellでも積極的に使うと幸せになれると思います。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2010/09/20/193089.aspx

2006/12/18

12/16、わんくま大阪勉強会#4でPowerShellのセッションをさせていただきました。
いろいろと拙いところがありましたが、ご静聴いただきありがとうございました。

いくつかフィードバックやご質問をいただきました。

・PPTに書いてること以外をしゃべってほしい
→資料だけを読まれる方のためにPPTだけを見ても分かるようにしたのですが、せっかく参加された方のためにもそれ以外のことをしゃべったほうがいいですね。今回は時間がなくてなかなか難しかったのですが次回は改善させていただきたいです。

・デモが少ないので増やしてほしい
→これも時間の関係で今回ちょっとしかやれなかったのですが、次回1/12(金)はたっぷりやれると思います。シェルを叩くだけでなくスクリプトをその場で書いていくのもいいですね(今回他の方のセッションを見て思ったのですが)。ネタを仕込んでおかなければ…。

・実際に使える実用的なスクリプトサンプルが見たい
→時間の関係でスクリプトに関してはほとんど取り上げられなかったのですが、これも次回きちっとやります。PowerShellならではのスクリプトを鋭意研究中です。あまり運用系のことがわからないので、「こんなスクリプトがあったら嬉しい」などのご意見をお待ちしております。メールやここのコメント欄などでいただきたいと思います。

・IronPythonとの住み分けは?
→申し訳ありませんが、まだIronPythonを弄るところまでは行っていません。おいおい、研究していきたいと思います。現時点では個人的にはPowerShellは運用系、IronPythonは開発系なのかなと思います。

・安定性は?
→少し重いというのがありますが、安定性はまずまずなんじゃないでしょうか。

・仕組みは?
→現時点では正直なところ、なぜ動作するのか?なぜ.NETのクラスが動的に呼び出せるのか?というところまでは追い切れていません。
Windows PowerShell in Actionという書籍に詳しい解説があるそうなので、これから読んで、みなさんにお伝えできたらいいなと思っています(購入してるのですが積読状態です(汗)。

あと中さんからエイリアスを使う上では注意が必要というコメントをいただきました。これまでのコマンドプロンプトと同名のエイリアスがあるが、それらを書くときは、オプションなどは従来とは異なるということを言っておかないと混乱する…ということですよね?>中さん
エイリアスはシェルを叩く際はデフォルトで定義されている分には積極的に使っていってもいいと思いますが(コマンドプロンプトと混同しないように、との前提が必要ですが)、スクリプトで使うときはあえてエイリアスを使うこともないかなぁと思います。
?や%などはエイリアスというか文法チックなので、こちらのほうが分かりやすいような気もします。
エイリアスとは少し離れますが、パイプを多用したスクリプトの分かりやすい記法というのも研究中です。PowerShellはやはりオブジェクトが渡るパイプが肝なので、スクリプトでも活用していきたいのですが、多用するとどうしても読みにくくなってしまいます。そのあたりをうまく解消できればいいですね。

次回(1/12(金))はまたよろしくお願いします。まだまだ勉強中なのでなかなか講演、執筆ともに拙かったり進捗が遅かったりして申し訳ありません。取り上げてほしいこと、スクリプトのネタなどがありましたらぜひフィードバックをお寄せください。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/12/18/51695.aspx

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter