PowerShell Advent Calendar 2016 最終日のエントリになります。
Monad Technology Blog
Monadといっても、
モナドは単なる自己関手の圏におけるモノイド対象だよ。
なヤツではなくて、PowerShell開発時のコードネームのことです。*1*2
Monad Technology BlogはWindows PowerShell Blogの前身で2005年にMonad(現PowerShell)のベータ版が出てから2006年に正式名称がPowerShellに変わるまで更新され、以降はWindows PowerShell Blogが後を引き継ぐことになりました。(当時はPowerShellに全然興味が無くこのあたりの事情を全く知らないのが悔やまれます...orz)
一応Monad Technology Blogの内容はすべてWindows PowerShell Blogに移行されており、PowerShell Blogの最初の方を確認すると同じ内容の記事が転載されています。(ただし日付は全て2006/04/25に更新されています)
で、このMonad Technology Blogの何が嬉しいかというと、Monadのベータ版からPowerShell 1.0のリリースに至るまでの時期に書かれたものであるため、PowerShellの基本的な部分やPowerShellの思想や意図に関する内容が多いという点になります。
PowerShellの思想に関するドキュメントはかなり少なく、自分の知る限りではMonado Manifesto(pdf)(詳細は後述)くらいしか見つけることができず、このブログは私としては宝の山に思えてなりません。
本エントリのタイトル通り、温故知新、当時のブログの内容から得るものは結構多いです。
独断と偏見によるエントリ紹介
Monad Technology Blogは全120エントリなので、読めるなら全部読むべきと言いたいのですが、流石にそれは厳しいので私がざっと見た感じでお勧めできるものを適当に紹介していきます。
掲載順は時系列順です。
1. Introduction to MshObject
Introduction to MshObject – Monad
事実上の最初のエントリになります。
最初からかなりコアな内容であり、Monad(PowerShell)の中心であるMshObject
(現在のPSObject
)についての概要となっています。
MshObject
(PSObject
)が実際の.NETのオブジェクトをラップしている点、NoteProperty
やScriptProperty
などのプロパティの拡張について触れています。
PowerShell BlogになってからもPSObject
ついて触れている記事はほとんど無く*3、おそらくこのエントリが公式としては唯一の記事じゃないかと思います。
そういう意味でかなり貴重なエントリです。
2. Duplicate Files (Part 1~2)
ファイルのMD5ハッシュを取れば重複チェックができますよ、そのためにGet-MD5
という関数が簡単につくれますよ、といった感じの内容です。
これはずばりPowerShell 4.0で導入されたGet-FileHash
そのままの内容ですね。
このエントリが公開された2005年時点でコンセプト自体はあったのがわかり面白いです。
3. Debugging Monad Scripts, Part 3: Write-Host
Debugging Monad Scripts, Part 3: Write-Host – Monad
Write-Host
についての内容です。
Write-Host
は出力に影響せず、Unixでいうところのprintf
やecho > /dev/tty
に相当するとこの時点ではっきり明言されています。
4. PINVOKE or accessing WIN32 APIs
PINVOKE or accessing WIN32 APIs – Monad
C#のコードを動的にコンパイルしてPowerShellから利用可能にするという内容です。
Add-Type
が導入されたのはPowerShell 2.0からですが、その原型は最初から構想にあった様です。
5. Monad portal in Script Center.
Monad portal in Script Center. – Monad
スクリプトセンターの話です。
http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx は今はスクリプトセンターにリダイレクトされています。
6. Using Monad for logon scripts
Using Monad for logon scripts – Monad
Monad(PowerShell) Scriptをログオンスクリプトに組み込む方法について書かれています。
この時点で既にスクリプトに対してファイルの関連付けをする気が無いことを明確にしているのが興味深いです。
7. Single Shell vs Custom Shell
Single Shell vs Custom Shell – Monad
PowerShellのソースコードにもちょっと名前の出てくるSingle Shellについてです。
正直この機能については謎です。
おそらく今だと独自ホストを作るあたりの機能に相当するものだと思っているのですがよくわかりません...
わかる方がいたらぜひ教えてください。
8. Days till Xmas
function tillXmas () { $now = [DateTime]::Now [Datetime](“12/25/” + $now.Year) – $Now }
メリークリスマス!
9. Monad breaking change announcement: Approved verb names enforcement.
Monad breaking change announcement: Approved verb names enforcement. – Monad
非推奨の動詞を使うコマンドレットには、動詞に__
というプレフィックスを強制する(例 __Play-Nice
など)変更をした様です。
当然ですが今のPowerShellにこの様な制約はありません。
コメント欄の荒れっぷりからわかる様に反対多数で取りやめになったのでしょう。
10. Verb-Noun vs Noun-Verb
Verb-Noun vs Noun-Verb – Monad
コマンドレットの命名規則を動詞-名詞
にするか名詞-動詞
にするかの議論のなかで動詞-名詞
を選んだ理由についての内容です。
11. How does Match-String with with Pipelines of objects?
How does Match-String with with Pipelines of objects? – Monad
このブログの Select-Stringは具体的に何を検索しているのか? - しばたテックブログ や Out-Stringを使ってSelect-Stringをより便利に使う - しばたテックブログ そのままの内容です。
まさかPowerShellリリース以前に同じ情報があるとは思いもしませんでした。
PowerShellを学び始めたころのエントリで結構労力をかけて書いたもので、自力で学習してきたことが間違ってなかったのは嬉しいですが、できれば初めからこのエントリを知りたかったですね...
12. Why did you do that? $VAR/ {} / Weak Intellisense
Why did you do that? $VAR/ {} / Weak Intellisense – Monad
PowerShellの言語設計に関するはなしです。
変数の$
はシェルスクリプトから採用してる点、C#との親和性をとるために{}
スタイルを採用したことなどが書かれています。
13. Comparative Examples in MSH and KSH
Comparative Examples in MSH and KSH – Monad
MSH(=Monad Shell)とKSHのスタイルの違いについて例示している内容です。
14. Exposing the Power of .NET in a Admin-friendly way
Exposing the Power of .NET in a Admin-friendly way – Monad
このエントリではMonad(PowerShell)が誰に向けたものかについて触れられています。
PowerShellは基本管理者向けですが、管理者以外の開発者、スクリプト書き(初心者・上級者)といった人たちのニーズも満たす様に設計されています。
その具体的な内容として、
- Raw .NET access
- Enhanced .NET access
- Command access
を挙げており、それぞれ、
Raw .NET access
- C#やVB.NETに慣れている開発者向けに.NET Frameworkの機能に直接アクセスできる様にしている
Enhanced .NET access
[xml]
、[array]
、[regex]
、[scriptblock]
、[hashtable]
といった構文で.NET Frameworkの型に簡易にアクセスできる様にしている
(文中では明記されていないがスクリプト書き向けと思われます)
Command access
- システム管理者向けにコマンド(cmdlet)による管理ができる様にしている
といった内容となっています。
15. Windows PowerShell (Monad) Has Arrived
Windows PowerShell (Monad) Has Arrived – Monad
最後にMonadからPowerShellに正式名称が変わったことをアナウンスする内容になっています。
このエントリでMonad Technology Blogとしては最後となりPowerShell Blogにその後を引き継いでます。
Monad Manifesto
最後に最初で少し触れたMonado Manifesto(pdf)について書いておきます。
この文書は当時のチーフアーキテクトであり、PowerShellの父とも称されるJeffrey Snoverさんによって2002年*4に書かれたもので、Monad(PowerShell)の基本構成や思想、対象とする問題領域などについて書かれたものになります。
文書の脚注に
This is not a Windows PowerShell whitepaper nor is it an accurate description of how V1.0 works.
This is a version of the original Monad Manifesto which articulated the long term vision and started the development effort which became PowerShell.
とある様に、Monad(PowerShell)開発時の文書なので、いまのPowerShellとすべてが一致するわけではありませんが、PowerShellの基本思想を学ぶのに非常に役立つものとなっています。
全16ページとボリュームもそれほど多くないので一読することをお勧めします。
あと、当時を振り返る以下のブログエントリも面白いのでお勧めです。
Monad Manifesto | Jeffrey Snover's blog

Monad (AKA PowerShell): Introducing the MSH Command Shell and Language
- 作者: Andy Oakley
- 出版社/メーカー: O'Reilly Media
- 発売日: 2009/02/09
- メディア: Kindle版
- この商品を含むブログを見る
*1:なお、このMoandの語源に関しては哲学のモナド(単子論)に由来しており、私の知る限り、関数型言語や圏論のモナドとは関係していません。関数型言語や圏論のモナドも語源は哲学のモナドに由来するそうなので、100%無関係と断じにくいところですが、同じ語源を持つ以上のつながりは無いと思われます。
*2:https://technet.microsoft.com/en-us/library/2005.11.scripting.aspx
*3:あるんですかね?
*4:つまりMonadの開発を始める時ですね