ページ

2014-06-14

Haswell Refreshで新しいPCを組んだ

KVMでVMをいくつもホストしている自宅のPCが壊れてしまった(といってもおそらくファンだけなのだけど)ので、ケースを捨てるのはたいへんだという理由で中身を入れ替えることにした。備忘の意味で構成を記録しておく。

CPUとHDD以外の部品は秋葉原のツクモの店員さんに相談しながら決めた。アキバのPCショップの店員さんの知識は信じられないくらいマニアックでおもしろいので、荷物は重くなるけれど、通販はしないことにしている。

CPU
Core i7 4790S (Haswell Refresh)
M/B
GIGABYTE GA-Z87X-UD3H
Memory
CFD ELIXIR W3U1600HQ-8GC11 (8GBx2)
HDD
ST3000DM001 x2
電源
Corsair HX650 CP-9020030-JP (650W)
CPU Cooler
Thermalright TRUE Spirit 120M(BW)


ATXマシンを作るのは壊れたこのマシンを作ったとき以来で、壊れたマシンを作ったのはPhenom初代なのでPhenom IIが出る2008年より前、つまり4年以上前になる。そしてずっとAMDでやってきたので、Intelに戻ってきたのはCoppermine以来、つまり10年以上前、下手すると15年くらい前。時が経つのはおそろしい…

このPCを新しいVMの親玉にすべくOpenStackを調べているのだけど、どうもそんなチープな世界を想定したプロダクトではないらしく、おそろしく仰々しい。見ていると時代の進化を追えておもしろいのだけど、たぶん本番はもっとローレベルなものになるはず。

2014-06-03

PSCmdletでもasync/awaitを使いたい

PowerShellコマンドレットをC#で作ること自体は簡単で、単にSystem.Management.Automationアセンブリを参照してCmdletかPSCmdletクラスを継承したクラスを含むクラスライブラリを作るだけなのだけど(このへんを参照→How to Write a Simple Cmdlet) うっかりasync/awaitしたあとにWriteObjectでオブジェクトを出力しようとしたりすると、以下のように怒られてしまう。

Get-SampleCmdlet : WriteObject メソッドと WriteError メソッドは、BeginProcessingメソッド、ProcessRecord メソッド、および EndProcessing メソッドの上書きの外側から呼び出すことはできず、同じスレッド内からだけ呼び出すことができます。コマンドレットで呼び出しが正しく作成されていることを確認するか、または Microsoft カスタマー サポート サービスにお問い合わせください。

Microsoft カスタマー サポート サービスにお問い合わせしたらこんなことも教えてくれるの?と思うところだけど、まぁこういう状況ではSynchronizationContextを提供してあげればよくね?ということでオレオレSynchronizationContextを準備して提供するようにしたのがこのAwaitablePSCmdletクラス

使い方は簡単で、PSCmdletクラスの代わりにこのAwaitablePSCmdletクラスを継承して、BeginProcessing/ProcessRecord/EndProcessingの代わりにAsyncをつけたBeginProcessingAsync/ProcessRecordAsync/EndProcessingAsyncを実装すればいいだけ。
例えばこんな感じ。


本当はStopProcessingにCancellationTokenまわりとか実装しないといけないのだろうけど、たぶんあとは微調整できるレベルだと思うので、必要に応じて。