Powershellでいろいろな形式の設定ファイルを読み込む(*.properties, *.xml, *.json, *.csv)

主題の通り、Powershellを使用した設定ファイルの読み込んで変数に格納して使う方法のメモ。 日本語でググってもまとまった情報がないのでまとめる。

環境

PS C:\> #OSのVersion
PS C:\> "$((get-wmiobject win32_operatingsystem).caption) ($((get-wmiobject win32_operatingsystem).version))"
Microsoft Windows 10 Pro (10.0.10586)

PS C:\> #Powershellのバージョン
PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  122   

設定ファイルの読み込み方

propertiesファイル

key=valueな形式のファイルから値を読み取る場合にはConvertFrom-StringDataコマンドレットを利用する*1

PS C:\> #設定ファイル($confPath)のファイルを読み込み、連想配列に変換する
PS C:\> $conf = Get-Content $confPath -Raw | ConvertFrom-StringData

PS C:\> #設定ファイル($confPath)の内容が連想配列(Hashtable)に格納されていることを確認する
PS C:\> $conf.GetType()

IsPublic IsSerial Name                                     BaseType                               
-------- -------- ----                                     --------                               
True     True     Hashtable                                System.Object                          



PS C:\> #keyに対応する値の取り出し
PS C:\> $conf.key
value

PS C:\> #key名に'.'が入っているときはエスケープする
PS C:\> $conf.'hoge.key'
value

XMLファイル

XMLファイルから値を読み取る場合にはxml型にキャストする。*2 *3

PS C:\> #変数をxml型に指定してファイルを読み込む
PS C:\> [xml]$conf = Get-Content $confPath

PS C:\> #型を確認するとXmlDocument型に格納されている
PS C:\> $conf.GetType()

IsPublic IsSerial Name                                     BaseType                               
-------- -------- ----                                     --------                               
True     False    XmlDocument                              System.Xml.XmlNode   

PS C:\> #読んでみる
PS C:\> $conf.catalog

book                       
----                       
{book, book, book, book...}


PS C:\> #配列要素は以下のようにアクセス可能
PS C:\> $conf.catalog.book[0].id
bk101

PS C:\> #こんな書き方でも読み込める
PS C:\> $conf = [xml](Get-Content $confPath)

参考

JSONファイル

JSON形式のファイルから値を読み取る場合にはConvertFrom-Jsonコマンドレットを利用する*4

以下のような設定ファイルがあったとする。

{ "Address": 0, "AddressFamily": 2, "ScopeId": null, "IsIPv6Multicast": false, "IsIPv6LinkLocal": false, "IsIPv6SiteLocal": false, "IsIPv6Teredo": false, "IsIPv4MappedToIPv6": false, "IPAddressToString": "0.0.0.0" }

PowerShell で JSON をファイル入出力 する - tech.guitarrapc.cóm

上記の読み込みは以下のように書ける

PS C:\> #ConvertFrom-JsonでJsonを変数に格納する
PS C:\> $conf = Get-Content $confPath | ConvertFrom-Json

PS C:\> #型を調べてみると、PSCustomObject型で格納される。
PS C:\> $conf.GetType()

IsPublic IsSerial Name                                     BaseType                                                          
-------- -------- ----                                     --------                                                          
True     False    PSCustomObject                           System.Object                                                     



PS C:\> #値へのアクセスはPowershellでよくある感じでOK
PS C:\> $conf.Address
0

CSVファイル

CSV形式のファイルから値を読み取る場合にはConvertFrom-Csvコマンドレットを利用する*5 以下のような設定ファイルがあったとする

value1-1,value2-1,value3-1
value1-2,value2-2,value3-2

上記の読み込みは以下のように書ける

PS C:\> #値の読み込み
PS C:\> $conf = Get-Content $confPath | ConvertFrom-Csv -Header "name1","name2","name3"

PS C:\> #Objectの配列に値が格納される。
PS C:\> $conf.GetType()

IsPublic IsSerial Name                                     BaseType                               
-------- -------- ----                                     --------                               
True     True     Object[]                                 System.Array  

PS C:\> #特定列のみ取り出す。
PS C:\> $conf.name1
value1-1
value1-2

PS C:\> #特定行のみ取り出す。
PS C:\> $conf[0]

name1    name2    name3   
-----    -----    -----   
value1-1 value2-1 value3-1


PS C:\> #特定の値へのアクセス
PS C:\> $conf[0].name1
value1-1

Delimiterパラメーターで区切り記号を指定したりできる また、Headerパラメーターを指定しない場合は一行目がヘッダとして扱われる。

※Import-Csvというコマンドもあるが、個人的にConvertFrom*でそろえたほうがシェルが読みやすいと思うのでこちらを推奨。

その他

整理してみた感想は以下の通り。

  • シェルの設定ファイル程度であればPropetiesファイルが直感的にかけて楽そう*6

  • JSONCSVXMLは、内容を構造化できるので、設定ファイルというよりはデータを扱うために使うとよさそう。

*1:互換性確認はしていないがpowershell -v 1 でもコマンドは存在する

*2:powershell -v 1 しても動く

*3:使用したxmlはMSのサンプル サンプル XML ファイル (books.xml)

*4:互換性確認はしていないがpowershell -v 3 以降でコマンドは存在する

*5:互換性確認はしていないがpowershell -v 1 以降でコマンドは存在する

*6:複雑な設定が必要ならXMLという手もあるが、そんな複雑なシェルは作るべきではないと思う。JSONCSVはコメントが入れられないのでダメ

Amazonビデオが‘7031エラーで再生できない with カスペルスキー

上記の方がおっしゃる通り、カスペルスキーのネット決済保護と競合していると思われ、一時開放すると使用できるようになる。

マネー・ショート 華麗なる大逆転

公開終了が近いレイトショーで鑑賞。

とても興味深い映画だったが、おもしいか、と言われると少し悩む。何とも言えない気分になる映画。

2007年のサブプライムローン住宅ローン危機をいち早く予見して、経済が崩壊する方に賭け、でかい空売り*1を仕掛けた人々の話。

ストーリー自体は周りが誰も信じない中、苦しみながらも自分の判断を信じて最後に勝利を掴むというもの。

劇中で描かれているモブの投資家、銀行家は最初は鼻で笑っていたが、最後には自身がしこんだMBS(Mortgage-backed securities 不動産担保証券)とCDO(Collateralized Debt Obligation 債務担保証券)というクソのせいで火だるまになる。自分の間違いを全く信じておらず、金しか見ないで、さも立派な仕事をしている面をしている彼らを見ると、観ていると金融屋が嫌いになると思う。

また、主役達もCDS(Credit default swap)を使って賭けには勝ったものの、単純に喜べるようなことでもなく、起こった事の大きさに圧倒されてしまう。この描かれ方は確かにそうなるだろうとは思うのだが、映画として2時間積み上げてきたものをどこにやってよいのか、私には正直わからなかった。 ただ、ベン・リカードが言ったように、もうけが出ている裏では国民の生活が犠牲になっている、ということなのだろうとは思う。

下記が原作らしいので、暇があれば読んでみるのも面白いかもしれない。

余談ではあるが、この邦題をつけた方は本当に映画を観たのだろうか。「華麗なる大逆転」はどこにもないと思うのだが……

関連

*1:原題はまさにそのまま「The Big Short」

瀧本哲史『戦略がすべて』(2015)

戦略がすべて (新潮新書)

戦略がすべて (新潮新書)

評判が良いようだったので読んでみた。内容としてはあまり求めていたものではなかった。

著者によるこの本の位置づけは、以下の一文が表していると思う。

本書は時事評論の形を借りた「戦略的思考」を磨くためのケースブックである。 p244

そしてこの本でいう戦略は以下の通り。

戦略を考えるというのは、今までの競争をまったく違う視点で評価し、各人の強み・弱みを分析して、他の人とは全く違う努力の仕方やチップの張り方をすることなのだ。 p245

これは間違っていないとは思うのだけれど、本の内容そのものは、ずいぶんふわっとしていてあまり戦略っぽくない印象を受けた。

それぞれのケーススタディにイマイチ目的というか、一本通った筋のようなものを感じられなかった*1。なんというか、おもしろいエッセイの域を出ていないというか。

基本のないままにケーススタディを繰り返しても、それはただがむしゃらに頑張っているだけのように思う。以前読書メモを書いた世界を変えたいなら一度武器を捨ててしまおう。 - mk_55's diaryのように、戦略とは何かを定義してから、この本に書いてある各論を定義に沿って進めたほうが面白かったと思う。

*1:個々の論には納得できるものも多いけれど。

bashで文字列を切り出す

お仕事で大変つらいスクリプトを見たので、備忘まで。

物自体はほぼ以下のページみたいな感じ。 逆引きシェルスクリプト/シェルスクリプトで文字列操作のleft, rightを作ってみた - Linuxと過ごす

わざわざ文字列を切り出すためだけのために数十行以上の関数を書くか、という話はともかく、この方法では性能がでない。

exprみたいなたいして性能もでないコマンドを使っているうえに、そもそもこのコードだとforkで子プロセスが生成される。一度や二度ならさほどでもないけれど、繰り返し実行すると馬鹿にならない時間がかかる。つらい。

bashならせめてパラメータ展開を使ってほしかった。 シェル変数展開のまとめ | OpenGroove

bashの機能なので子プロセスは生成されず早い。 手元で検証したら、1万回ループさせて、前者が20min、後者が1sぐらいで済んだので性能は段違いである。

『ソフトウェアエンジニアのための ITインフラ監視[実践]入門 』(斎藤 祐一郎)

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)を読みました。

ITインフラに対する監視の考え方が簡単にまとまっている本。

本としては考え方から説明しておりよくできていて、システムの監視という観点の本がない中では*1、現状ではITインフラ監視の入門書の唯一の選択肢だと思う。

ただ、どうも7章でSaaSのMackerelを監視サーバーとして監視をしてみる、というところに重きを置きれすぎていたように感じた。例を入れるべきは他のより抽象的な考え方の章で、7章は別の本に席を譲るべきだった思う。 また、タイトルからはもう少しつっこんだ技術の話(SNMPの仕組みとか)も期待していたのだけに少し残念ではあった。*2

とはいえ技術一辺倒ではなく、システム全体を考えながらITインフラの監視を扱った書籍は類を見ないので、とりあえず関連業務をする方は買って損はないでしょう。

著者について

他の書評等

その他

*1:どうしてもZabbix等、特定製品に偏っている

*2:これは私の業務と著者のいるWeb系では想定しているシステムの形態が異なることによるもので、本の良し悪しとは別の話ではある。