tech.guitarrapc.cóm

Technical updates

WeatherHacks を触ってみる

Twitter を眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。

https://www.baku-dreameater.net/archives/8741#more-8741www.baku-dreameater.net

ただやるのでは楽しくないので、PowerShell との比較です。

目次

コードサンプル

素直だったので、てきとーにいきましょう。エラーハンドルはここではしていません。

4つ用意しました。

gist.github.com

WeatherHacks.cs

元との違いは HttpClient 使ってることぐらいです。サクッとデータ取るにはいいのです。

WeatherHacksClass.cs

JSON をいちいちパースするのがつらいので、普段はクラスとして一気にデシリアライズしています。

Visual Studio2013 以降は JSON String を貼り付けるときに、自動的にクラス変換する機能があります。そこで、適当に PowerShell や LINQPad で取得したJSONをクリップボードにコピーして、VS2015 で貼り付けるだけで クラスが生成できます。

あとは普通です。

WeatherHacksClass.ps1

PowerShell v5 の クラス構文で C# に近いコードの再現例です。

PowerShell では Invoke-RestMethod Cmdlet で超お手軽簡単にAPIを叩いてオブジェクトとして取得できます。が、そのままでは型が PSCustomObjectとなりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON String をクラスに自動変換する何かを書けばいいでしょう。

ちなみに PasteJSONasPowerShell はダメです。PSCustomObject にしちゃうのでこのケースでは意味を成しません。

ConvertToClass がいい感じでしょう。*1

WeatherHacksFunction.ps1

クラス構文がない PowerShell v4 では、C# クラスを Add-Type するか、妥協して PSCustomObject でどうぞ。

まとめ

API を一発叩くだけなら、PowerShell でもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するなら C# 一択です。

*1:Class 名が重複した場合の処理が入っていないのでIssueにあげてあります https://github.com/dfinke/ConvertToClass/issues/2

Event Tracing for Windows (ETW) の トレースプロバイダーリストを取得してみる

ネットワークキャプチャといえば、Wireshark や Microsoft Message Analyzer が定番です。今回、USB や Bluetooth のキャプチャもできることを教わりました。

USBなど の通信ログは ETW (Event Tracing for Windows) に流れてくるのでEtwStreamでログをキャプチャできることも教わりました。そこで今回は、USB キャプチャなど各種Windows のトレースプロバイダーをEtwStream でキャプチャするために必要なトレースプロバイダー一覧を取得してみましょう。

このプロバイダーさえ把握できれば、USBに限らず自分で任意のトレースイベントを EtwStream でキャプチャできますからね!

目次

USB キャプチャ

先にキャプチャの様子です。 それぞれ Twitter で教わりました。

Wireshark

Wireshark をダウンロードしてインストールすれば利用できます。

Wireshark · Download

詳細は Wikiやググると豊富にあるので参照しましょう。

USB

Microsoft Message Analyzer

次は Microsoft Message Analyzer です。Windows におけるGUIキャプチャで実質最強なのは Wireshark ではなくMicrosoft Message Analyzerなのは多くの人が同意できるのではないでしょうか。Wireshark とか何年も触ってません。

Microsoft Message AnalyzerもUSB キャプチャに対応しています。

ダウンロードしてインストールは Wireshark より簡単です。

https://www.microsoft.com/en-us/download/details.aspx?id=44226

Microsoft から詳細動画が公開されているので見てみるといいでしょう。

Universal Serial Bus (USB) - Windows drivers | Microsoft Learn

EtwStream

そして、私たち開発者にとって一番うれしいのが EtwStream でも見れることです。

github.com

USBに限らずネットワークキャプチャもそうですが、通信にかかわる膨大なログから「狙いを付けて絞りこんで加工してみる」というのは手間です。Wireshark や Microsoft Message Analyzer の独自クエリは大げさかつだるいのですよね。そのため、EtwStream のように、自在にRxでグルーピングなどが容易にできてプログラムに組み込めるのは強力な長所といえます。普段 Fiddler をお使いの開発者にとっても思ったことはあるのではないでしょうか。

ETW Trace Provider

さてEtwStream の.FromTraceEvent(string[] providerNameOrGuid) はとても強力ですが、どのトレースプロバイダーかワカラナイとそもそもトレースできません。そして、トレースプロバイダーの指定はGUID.... ということで、各種プロバイダーの一覧を取得しましょう。

3種類用意しました。

  • logman
  • Get-NetEventProvider : PowerShell 4.0 (Windows 8.1 / Windows Server 2012 R2) から利用可能
  • Get-EtwTraceProvider : PowerShell 5.0 (Windows 10) から利用可能

gist.github.com

ただ、Get-EtwTraceProvider は、Name もでず GUID も無効なものが混じっているのでちょっと怪しいです。logman や Get-NetEventProvider にいらない管理者権限も必要なので、正直使わないです。

まとめ

EtwStream + Rx 最高です。Have a happy ETW life。

パイプラインの処理を途中で打ち切る方法のPowerShell版

PowerShell の最大の特徴と言われた時に、おそらく掲げるべきはパイプラインだと思います。

それが、cmd や Linux/Unix シェルにおけるパイプラインと異なる挙動だったり、オブジェクトを伝搬するという性質も含めて良くも悪くも PowerShell を PowerShell 足らしめているのはパイプラインかなと。

さて、パイプラインが特徴の PowerShell ですが、問題がいくつかあります。その1つが、以下の記事にあるパイプラインの中断処理。

d.hatena.ne.jp

winscript.jp

今回は少しその辺をみてみましょう。

目次

StopUpstreamCommandsException

先に結論だけ書くと、Internal なクラスであっても System.Management.Automation.StopUpstreamCommandsException が一番楽ちんでしょう。

ということで、PowerShell版で書くなら雑にこんな感じで。あえて New-Object ではなく Add-Type しています。

gist.github.com

中で System.Collections.Queue を使ってるのはそれほどの意味はありません。入力されたオブジェクトをいいように扱うためです。なので、カウンタ変数を用意してでもお好きなようにやればいいと思います。

この方式なら、Cmdlet でも同様なので好きなように扱えるのもいいでしょう。

はじめは、ReferenceSource見て自分で実装するのでいいんじゃないかなと思いましたが、当然ながら面倒さが上回ったのでやめました。

仕様変更あったらどうしよう

そもそもその場合は、Select-Object も仕様変わります。もはやその時点で一緒かなと。

Select -Fist 1 の GetSteppablePipeline() でも PowerShell スクリプトならいいのですが、Cmdlet から PowerShell 関数呼ぶの悲しさしかないですし仕方ないのかなという妥協もあります。

Connect

ちなみにこの Internal Class なやつを Public にしてというリクエストはあります。ワークアラウンドに do{}while()Select-Object -First 1 の例もあります。

Bing

すでにPowerShell のフィードバックは、UserVoice に移っており、同フィードバックも転載されています。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087865-enable-users-to-stop-pipeline-making-stopupstreamcwindowsserver.uservoice.com

なので、Stop-Pipeline Cmdlet や StopUpstreamCommandsException のパブリック化がこれに基づきされてほしいですね。Vote しましょう。

End が実行されないのも、フィードバックすればいいと思います。End で何かしらするのはリソース破棄以外にもあり得るので、実際あってほしいでしょう。PowerShell Team の書くスクリプトの中にも Process{} 句で配列にまとめて End{} 句で出力するパターンもあるので。

余談

こういったパイプラインの制限というか、まだまだいけてないシーンはあって、たとえば foreach(){} | .... もそれです。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087667-make-the-foreach-statement-work-with-a-pipelinewindowsserver.uservoice.com

パイプラインの中断エラーを Write-Error で出せるようにとかもあります。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088492-option-to-output-a-pipeline-terminating-error-viawindowsserver.uservoice.com

昔記事にした | Out-Null の遅さなども。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088471-performance-of-out-null-drastically-worse-then-usiwindowsserver.uservoice.com

tech.guitarrapc.com

あとは、Where-Object などで {} 抜きで自動変数 $_ にアクセスしたいという例など。実際これほしいですよね。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088306--should-be-accessible-without-curly-brackets-witwindowsserver.uservoice.com

まとめ

リフレクション最高 (

2015年を振り返って

2014年はやりませんでしたが、やはり振り返りって大事だと思います。大晦日につき振り返ってみます。

tech.guitarrapc.com

目次

PowerShell

2015年は「PowerShell って現実にどういう利用シーンがあるのか」をインフラ以外のレイヤで考えたりした年でした。私にとってPowerShellって、ただのツールで自動化しやすかったりするだけなので、使えないシーンならすぱっと切り捨てます。別に PowerShell 最高じゃないし、使えないなってことも多いので。言語としてとらえた時に、「ロジックが制御しやすい」「わかりやすい」なんてまだまだ言えないですし。そういう意味で、PowerShell を使うシーン、落としどころ、何で使うのかを考え続けました。

PowerShell の依存低下

結果として、会社のインフラレイヤから PowerShell の依存を格段に減らしています。特に valentia を中心とした各サーバーの接続 (PUSH型) から、APIベースのPULL型接続に移行しています。もちろん AWS や Azure などのリソースをサクッと叩く部分では PowerShell は超有用です。しかし、こと 非同期、実行しっぱなし、イベントベースでの処理が加わると無しです。現実的な落としどころは、仕組みに乗っかった中でどこまで薄くできるかです。仕組みから作るのはやり過ぎだしよくないなと。その例として PowerShell で一番使える、使うべきは DSC と PackageManagement 、そして Cmdlet です。

PowerShell DSC

PowerShell DSC が 2013年11月の PowerShell 4.0 にリリースされてから、2014年はインフラ基盤の Configuration Management の中心にすえることに取り組みました。そして2015年は、DSC につきまとうリソース不足に対して積極的にリソースを作成し公開することで解消を図りました。会社で利用していて足りないものを網羅する勢いでそれなりの数をリリースしました。全部使っているので、変なバグはあまりないはずです。*1

github.com

リソース不足は、標準リソース、コミュニティのカスタムリソースを含めて現在でも付きまとっています。

github.com

github.com

今でも作成したリソースに該当する代替品はないように見受けられますし、それなりの数のユーザーにも使ってくれる人がいるなど役に立っているようで何よりです。

2016年は、AppVeyor での CI による自動テストまでは組んでおきたいところですね。Microsoft のリソースでやり取りもしていて、それなりに知見も得たのでまぁやりたいなと。

PackageManagement

今年は、WMF5.0 つまり PowerShell 5.0 が PPリリースということもあり機能が固まったとみて、PackageMangement(OneGet) の会社での利用も展開しました。*2Comuplues セッションで紹介したように、会社(グラニ)ではUnity の最新リリースを検知して OneGet で展開したり、何かしらのPCの構成はOneGet 経由にしています。やはり apt-get ライクな利用というのは楽なもので、特に NuGetを利用している人には違和感なく利用できているようで何よりです。とはいえ、結構バグというか挙動が不完全なので信頼性が根本で足りてないのは、OneGet頑張れ感あります。Azure WebApps + AzureAD で認証組んで展開とかもやってみたのですが、OneGet からの利用ではAzureAD認証でパッケージソース登録もできなくて残念な感じ半端ないんですけど..。

tech.guitarrapc.com

tech.guitarrapc.com

tech.guitarrapc.com

Cmdlet

Cmdlet は、私のPowerShell に対する1つの結論です。今後 PowerShell は、C# *3で書くことがほとんどだと思いますし、スクリプトを書いてもクラスベース構文が中心になると思います。単純なラッパーなどサクッとした記述なら別ですが、関数で頑張る努力は捨てるほうが健全だと思っています。Cmdlet を使うにあたって最大の問題である、継続デプロイ (Continuous Deploy : CD) したいときのファイルロック問題も解決したので待ったなしです。

tech.guitarrapc.com

2016年は Nano Server の展開が待っています。*4ようやく、コンテナが Windows に来るので革新が来るでしょう。楽しみですね。数年来待っていたこともあり、さっさと本番で利用します。

CSharp

今年はこれまで以上に C# への技術移行が進みました。これまでもちょこちょこ書いてはいたのですが、一気に中心言語としています。LinqPad起動回数 > PowerShell起動回数 なのがその例です。会社のデプロイ基盤をPULL型にしたり、OneGetの自動化、その他多くの面でC# が中心に変わりました。

デプロイ基盤のPULL型化

2年ぐらい考えてたのを、C# + LightNode でようやく実現に移した年でした。グラニのデプロイは現在 1秒未満です。*5コンセプトとしては、クックパッドの mamiya による デプロイと同じです。同じコンセプトのものを先に発表されてしまったので発表する気が失せたのですが。やはりみなさん同じ考え持つんですね、もっと早くやっておけばよかったです。はい。

speakerdeck.com

rubykaigi.org

github.com

社内の新デプロイ基盤は Serf を使いません、LightNode のクライアントコード自動生成で密にサーバー側コードと一体化できる、かつノードの協調保証を不要にしたためです。デプロイの改善に一番大事なのは、デプロイの細分化。つまり、配置と展開の分離です。

github.com

私の中では Serf は使いたくないです。Consul のコンセプトは好みですが、これもいかに使わず全ノードが相互につながらずサービスを形成できるかを考えています。これはコンテナも含めてですね。

SignalR なども手をだしましたが、あれはないですね。使えるシーンの柔軟性がないので、正直私の中ではあまり汎用性のある技術という感触ではありません。使えるシーンでは便利ですが、どうも使いにくいですね。

仕事

集中力が問われる一年でした。多くのことを同時並行にすることが多いのはこれまでもでしたが、かなり作業が多岐に渡ってしまい進捗どうですかが不満でした。よくないです。来年の課題は集中です。一方で、BigQuery へのロギングの集約などを含めて課題としていたことの多くに一定の成果を出したので、ようやく次のステップに集中して手を出す基盤となった一年になりました。

tech.guitarrapc.com

esa.io による、必要になったときに必要な知識を自分で得られる環境整備の効果は大きいので、使ってない人には使ってほしいです。ただの集合知ではない良さがあります。

esa.io

AWS を中心としていますが、GCPやAzureなどマルチクラウドしています。こうして使っていると、それぞれが得意としたり、目指している方向がてんでバラバラで面白いですね。特に アカウントのロール制御や認証方式に関しては差が大きく出ています。Aurora に関しては、日本最速レベルで本番を移行完了しており実例として使ってもらえているようで何よりです。

speakerdeck.com

www.slideshare.net

記事

ブログ記事は最低数だったです、時間が取れてない様がよく出ています。その分内容を濃くする努力をしましたどうだったんでしょう。アドベントカレンダーも PowerShell5.0 の内容で書かないとですね。

Build Insider にも連載記事を更新しました。もう少し色々紹介したいですが、どうしても書く時間が問題ですね。

www.buildinsider.net

来年

仕事面は、ゲームを出すです。他はなしで。

個人的には、もう少しインフラやそれ以外に Unity を取り入れたりしたいですね。C# に完全に技術基盤が移行しているので、PowerShell というより、C# を中心とした動きが強くなると思います。HoloLens に胸を躍らせる日々です。

*1:あればIssueなりPR いただけると

*2:実際に年内にリリースされたのでアタリかな。今は一時取り下げられてますが!

*3:F# わんちゃん

*4:たぶんきっと。Windows Server 2016 早く出てね。

*5:ELBなどの安全な処理があるため、実際は40秒程度ですがアプリのデプロイ自体は1秒未満まで極小化しました。

2015 年の人気記事ランキングを出してみた

今年のアクセスを Google Analytics から出してくれるサービスがアップデートされたとのことだったので、つかってみました。

blog.shibayan.jp

目次

ランキング

TOP10 を出してみましたが、PowerShell 記事ばかりですね。今年の記事は一番ブックマークされた記事でした。

順位 ページ 記事年度
1 tech.guitarrapc.com 2014
2 tech.guitarrapc.com 2014
3 tech.guitarrapc.com 2013
4 tech.guitarrapc.com 2013
5 tech.guitarrapc.com 2015
6 tech.guitarrapc.com 2013
7 tech.guitarrapc.com 2013
8 tech.guitarrapc.com 2013
9 tech.guitarrapc.com 2013
10 tech.guitarrapc.com 2013

まとめ

記事数が今年は一番少なかったのもあるのでしょうが、その分少しこれまでとは違う方向に進みました。

PowerShell 中心のブログだけに、PowerShell の記事にみなさんこられているようで。基礎的な内容が人気なのは悩ましいですね。