しばたテックブログ

気分で書いている技術ブログです。

PowerShell温故知新、Monad Technology Blogについて

PowerShell Advent Calendar 2016 最終日のエントリになります。

qiita.com

Monad Technology Blog

Monadといっても、

モナドは単なる自己関手の圏におけるモノイド対象だよ。

なヤツではなくて、PowerShell開発時のコードネームのことです。*1*2

blogs.msdn.microsoft.com

Monad Technology BlogWindows 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のオブジェクトをラップしている点、NotePropertyScriptPropertyなどのプロパティの拡張について触れています。

PowerShell BlogになってからもPSObjectついて触れている記事はほとんど無く*3、おそらくこのエントリが公式としては唯一の記事じゃないかと思います。
そういう意味でかなり貴重なエントリです。

2. Duplicate Files (Part 1~2)

Duplicate Files – Monad

Duplicate Files 2 – Monad

ファイルの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でいうところのprintfecho > /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

Days till Xmas – Monad

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は基本管理者向けですが、管理者以外の開発者、スクリプト書き(初心者・上級者)といった人たちのニーズも満たす様に設計されています。
その具体的な内容として、

  1. Raw .NET access
  2. Enhanced .NET access
  3. Command access

を挙げており、それぞれ、

  1. Raw .NET access

    • C#やVB.NETに慣れている開発者向けに.NET Frameworkの機能に直接アクセスできる様にしている
  2. Enhanced .NET access

    • [xml][array][regex][scriptblock][hashtable]といった構文で.NET Frameworkの型に簡易にアクセスできる様にしている
       (文中では明記されていないがスクリプト書き向けと思われます)
  3. 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

Monad (AKA PowerShell): Introducing the MSH Command Shell and Language

*1:なお、このMoandの語源に関しては哲学のモナド(単子論)に由来しており、私の知る限り、関数型言語や圏論のモナドとは関係していません。関数型言語や圏論のモナドも語源は哲学のモナドに由来するそうなので、100%無関係と断じにくいところですが、同じ語源を持つ以上のつながりは無いと思われます。

*2:https://technet.microsoft.com/en-us/library/2005.11.scripting.aspx

*3:あるんですかね?

*4:つまりMonadの開発を始める時ですね