しばたテックブログ

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

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の開発を始める時ですね

メリクリ

🎄メリクリ🎄

f:id:stknohg:20161224104222p:plain

なにこれ?

bannerコマンドのPowerShell版を作ってみました。

以前シェル芸人たちの間でbannerコマンドが流行ったことがありまして、
(下記リンク参照)

togetter.com

その際に@mattnさんがgobannerというGo言語のbanner実装を作りました。

github.com

で、その実装方法に感銘を受けて、PowerShell版を作ってみたのがコレになります。
実はモノ自体は結構前に作っていて、公開するタイミングを失ってしばらく寝かせていたのですが、今なら良いかなーと思い公開することにしました。

PSBanner

ソースコードはGitHubに上げています。

github.com

インストールはPowerShell Galleryから可能です。

Install-Module -Name PSBanner -Scope CurrentUser

なお、実装の都合*1、Windowsのみでの動作となります。
動作確認はPowerShell 5.1で行っていますが、おそらくPowerShell 2.0以降であれば動くはずです。

基本的な使い方

Write-Bannerコマンドに好きな文字列を食わせてください。
-FontNameパラメーターで表示フォントを、-FontSizeパラメーターでフォントサイズを指定できます。

使用可能なフォント名はGet-FontFamiliesコマンドで取得可能です。

コード例はGitHubに載せているのでそちらを見ていただければと思います。

実装について

基本方針はgobannerの実装を参考にしています。
内部的に指定されたフォントでBitmapを描画し、不透明なドットを#に置き換えるというものです。

一度見てしまうと単純なやり方に思えますが、最初に見たときは「よくこんなこと思いつくなぁ!」と本当に驚きました。

gobannerに対して、フォントの指定は名称で可能なのと、Screen Widthはコンソールバッファの値を使う様に変えています。
あとPowerShellでは文字列以外のオブジェクトの入力もあるため、その辺に対する処理もちょっと入っています。

補足

本エントリはPowerShell Advent Calendar 2016 21日目の代理投稿になります。

*1:System.Drawing.*なクラスを使っているため、System.Drawing.dllのないPowerShell Coreでは動作させることができません

CLR/H #103 ~ クリスマス オブ ザ デッド ~ でPowerShellをふりかえりました

先日、通称カソウ化デイことCLR/H #103 ~ クリスマス オブ ザ デッド ~で「PowerShell 10年間ふりかえり」というタイトルでPowerShellについてお話させていただきました。

clrh.connpass.com

本エントリはPowerShell Advent Calendar 2016 18日目のエントリも兼ねています。

セッション内容について

セッション資料

セッション資料はこちらになります。

30分のセッションでしたが、かなり駆け足で進めてしまったためお聞き苦しいところが多々あったかと思います。
申し訳ありません。精進します。

1. PowerShell 10年間ふりかえり

最初はPowerShellの歴史と機能を追いかける感じの内容にしました。

歴史についてはPowerShell 2.0からですが、最初に新しいOSに標準で組み込まれ、その後他のOSに対してWindows Management Framework(WMF)を提供するというかたちになっています。
このため正確なリリース日を追いかけるのが少し面倒で、資料によってはOSのRTMをもってPowerShellのリリースとしてるものも存在しています。

そして、各バージョンにおける機能の詳細については参考資料に上げたサイト(一部このブログのエントリも交じってますが...)を見て頂く方が良いかと思います。

2. これからのPowerShell

PowerShellはOSSになり、GitterやSlackのチャネルもでき、RFCも募集する様になり情報がオープンになりました。
セッション中では一応予測を立てましたが、正直なところを言うと、実際に生の情報に触れてみるほうが下手な予想より余程役に立つと思っております。

ですので、ぜひ実際にGitHubにアクセスして新しいPowerShellを試す、IssueやGitter、Slackに参加してみてください。
(わたしもできる限りでがんばります...)

PowerShell

github.com

Gitter

gitter.im

Slack

http://slack.poshcode.org/slack.poshcode.org

PowerShell RFC

github.com

3. 誰のためのPowerShell

最後はポエム要素ありと注意書き入れた様に、割と個人的な想いについて述べています。

PowerShellがオープンソース・クロスプラットフォーム化したのと同時に「PowerShell for every system!」という標語が挙げられました。
実際にこれからは色々なプラットフォーム上でPowerShellが動き標語の通りになると思います。
ただ、プラットフォームを選ばなくなったからといってみんなが使うべきものなのか、「PowerShell for everyone」になるだろうか、という疑問がここで言いたいことの原点になります。

この点に関してはPowerShell TeamやMicrosoftとしての思惑もあるでしょうし、人によって答えは変わるかと思いますが、私はPowerShellは万人向けでないと考えています。

理由としては、今のところPowerShellはサーバー管理や自動化といった目的に特化したツールであるという点になります。
目的に特化しているので目的外の利用をしようとすると割とすぐハマりますし、ハマる以上は万人向けではないと思います。
PowerShellの機能自体はかなり強力なので目的外であっても無理をすれば大抵のことはできてしまいます。
頑張れば何でもできるという点をとれば万人向けと言えるかもしれません、が、私としてはそれは無理筋だろうと考えています。

しかしながら、PowerShellは万人向けでないと言いましたが、目的に合わない人はPowerShellに触れるべきではないとまで言う気はありません。

PowerShellは(バージョンを問わなければ)大抵のWindowsに標準で搭載されており、だれでもすぐに使うことが出来ます。
LinuxやMacであってもパッケージ管理ツールから簡単にインストールできる様になりました。

使ってみないと目的に合っているか分からないこともあると(むしろそっちの方が多いかと) 思います。

個人的な想いとしては万人にPowerShellに気軽に触れてほしいと考えています。

ちょっと触れてみて、目的に合えばそのまま使ってほしいですし、合わないと思えば無理をせずにすぐにほかのツール(代替はたくさんあります)に切り替えれば良いと思います。

(補足)PowerShell と Bash

PowerShellの代替のひとつであり、PowerShellとよく比較されるBash on Ubuntu on Windowsについても軽く触れました。
細かい内容については以前に発表したLTの内容をベースとしているので、以下のリンクから内容を確認していただければと思います。

stknohg.hatenablog.jp

(補足)PowerShell と コマンドプロンプト

こちらに関してはかなり誤報が広まってるのであえてセッションに混ぜました。
細かい話はこちらをみてください。

stknohg.hatenablog.jp

最後に

拙い発表でしたが言いたいことは言えたので満足はしています。

他の方のセッションやLTもどれも面白いものばかりで、カソウ化デイ、本当に楽しかったです。