しばたテックブログ

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

「PowerShell実践ガイドブック」という本が発売されます

はい、宣伝です。

TL;DR;

ぎたぱそ先生が今月末にPowerShell Core 6.0の本を出版されます。
私もレビュアーとしてお手伝いしたので皆さんぜひ買ってくださいね。

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

「PowerShell実践ガイドブック」について

ぎたぱそ先生ことMVPの吉崎さんが「PowerShell実践ガイドブック」というタイトルのPowerShell Core 6.0を中心にPowerShellを解説する本を出版されます。

book.mynavi.jp

この本(以後本書と記載します)の内容についてはご本人のブログを見ていただくのが良いでしょう。

tech.guitarrapc.com

大変光栄なことに私にレビューの依頼があり、主にPowerShell Core 6.0の新機能や書籍の内容がPowerShellとして正しいかといった点を指摘、議論させていただきました。
私の他にも6名のレビュアーが様々な観点から本書をレビューしています。

僅かですが本書の内容に貢献できたことは嬉しくあり、また、私自身が新たな知識を得た部分もあり大変勉強となる良い経験ができました。

本エントリで改めてお礼申し上げます。
ありがとうございました。

そして出版おめでとうございます。

書評

レビュアーとして関わった以上べた褒めして終わりたいのですが、そこは抑えてできるだけ冷静に本書を評価したいと思います。

私の評価を一言でいうと、

本書は"PowerShell"というツールを学ぶには最適である、が、あなたを完全に満足させることは無いかもしれない。

です。

最適な点

本書は、発売される2018年5月末時点において、日本語で販売されている書籍の中では間違いなく一番詳細にPowerShellを解説しており、PowerShellの挙動や仕様を学ぶには最適な本であると断言できます。
その解説も丁寧で、PowerShellというツールの挙動や仕様を正しくおさえることでやりたいことを実践していくというスタンスになっています。

類似の書籍としては、かつて日本語版も出版されていた「PowerShell in Action」がありますが*1、吉崎さん自身も先述のブログで記載してる通り、

Windows PowerShell イン アクション も Windows PowerShell クックブックも何度か推薦するぐらい素晴らしい良著で私の大好きな本です。
 
PowerShell実践ガイドブックは、この2冊と明確に立ち位置が違います。
* PowerShell Core (現時点の最新である PowerShell 6.0) をメインとした内容になっている
* 体系的な基本機能も網羅しているが、常に実践を意識した内容になっている
* 実際にPowerShellを使うにあたっての操作や直面する課題を対象にしている

といった点が異なり、ある意味規格書*2に近いPowerShell in Actionより手に取りやすく読みやすい内容となっています。

PowerShell Core 6.0

また、本書は最新リリースであるPowerShell Core 6.0を想定環境として書かれていますが、バージョンに依らないPowerShellの機能にきちんと触れているので過去バージョンのPowerShellを扱っている方にとっても有用であり、特に問題を感じることなく読めるでしょう。

もちろんPowerShell Core 6.0の新機能について知りたい方にとっても、

  • 3章 3.2 リモーティング
  • 4章 4.9 クラス
  • 5章 5.4 .NETの相互運用
  • その他いくつかのコラム

あたりの内容は参考になると思います。

ただし、本書は機能の解説書ではないのでPowerShell Core 6.0の新機能一覧といったものはありません。
一覧が知りたければ、Docsにある

や本ブログの

を見てください。

本書はこれら一覧の理解を助けるものだと考えて頂ければ良いでしょう。

完全に満足させることは無いかもしれない、とは?

これはある意味本書の宿命的な部分であり、仕方ないのですが、書かないわけにはいかないので書きます。

本書は読者に

  • これからPowerShellを触ってみたい方(初学者)
  • システム管理者
  • 開発者

の三者を想定しています。

PowerShellはこのうちの「システム管理者」を想定して生まれたツールなのですが、現実には「開発者」やITリテラシーのさほど高くない「初学者」であるオフィスワーカーな方も使うことがごく普通にあります。
なのでこの想定自体は至極真っ当なのですが、はっきり言って間口が広い、あまりにも広い。

本書ではこの間口の広さに対応するために、最初の1~2章までは「初学者」にもわかる様に丁寧な記述を心掛け、以降の章では要求されるリテラシーが上がる構成となっています。
とはいえ、対象を絞らない万人に向く構成というのはあるわけが無く、読者のレベル感によって「最初の章の説明が冗長すぎる」逆に「後半の章の前提知識が難しすぎる」といったギャップが出てしまう可能性は残念ながらあると思っています。

ただ、想定読者と実際の読者のレベルのギャップというのは本書に限らずどの技術書でも出てしまう問題だと思います。
もしかしたら私が気にしすぎているだけかもしれません。

本書は間口の広い書籍であり、どの層の読者が読んでも得るものがあると断言できるのですが、その逆にどの層の読者にも満たされない部分が残ってしまうのではないかと危惧しており、それが「あなたを完全に満足させることは無いかもしれない」と言った理由になります。

ただしこの点については、

この本は過去の「PowerShellを触り始めた直後の自分」がほしかった本でもあり、今の自分が幅広い利用者を想定して書き出せる限界ギリギリを絞りました。

と言われている様に、できるだけ幅広い層に届く様にと敢えて意図した選択であることは補足しておきます。

本書はガイドブックでもあります。
もしこの様なギャップを感じることがあれば、読者自身のレベル感に応じて必要な部分をつまんで読み進めるのが良いでしょう。

個人的な一押しポイント

あと、私が個人的にお勧めできるポイントを紹介します。

  • 2章 2.8 パイプライン
  • 2章 2.9 フォーマッティング
  • 4章 4.5 スコープ

の内容は、わかりやすい解説がこれまでの書籍やWEB上でも少なかったので、本書の解説がきっと役に立つと思います。
特にスコープに関しては私自身体系立ててまとめることが出来ていなかった部分があり、本書をレビューしたことで理解を深めることができました。
加えて、

  • 5章 5.1 実世界のPowerShell
  • 5章 5.2 困ったときに

は本書のタイトル通り実践に即したものですのできっと読者の役に立つと思います。

最後に

ちょっとネガティブなことも書きましたが、本書はPowerShellを学ぶ上で間違いなく役に立ちます。

本ブログをご覧になる方はPowerShellに興味がある方が多いと思いますので、ぜひ一度は本書を手に取ってみて欲しいですし、できれば買って頂けると嬉しいです。


PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

*1:残念ながら日本語版(初版)は絶版です...

*2:PowerShell in Actionの著者であるBruce PayetteさんはPowerShell Teamの人でありPowerShell founderの一人です

Azure Cloud Shell内のPowerShellの今後について

元ネタはこちら。

azure.microsoft.com

Azure Cloud Shell内のPowerShell

Azureポータル内で使えるCloud Shellですが、現在は

  • Bash
  • PowerShell (プレビュー)

の二種類選択することができます。
それぞれの実行基盤は

  • Bash : Linux Container (Ubuntu)
  • PowerShell : Windows Server Container (Server Core)

とコンテナになっており、各コンテナにおいてPowerShellは次の様に利用できます。
本エントリでは便宜上これらのコンテナを、Bashコンテナ、PowerShellコンテナと呼称します。(正式な名称ではありませんのでご注意ください)

Bashコンテナ内のPowerShell

コンテナ起動時のシェルはBash(現時点では4.3.48)。
BashからPowerShell Core 6.0(現時点では6.0.2)を呼び出し可能。

PowerShellコンテナ内のPowerShell

コンテナ起動時のシェルはWindows PowerShell 5.1
PowerShellコンソールから新たにPowerShell Core 6.0(現時点では6.0.2)を呼び出し可能。

Azure Cloud Shell内のPowerShellの今後

現状を踏まえた上で、先述のAzure BlogではAzure Cloud Shell内のPowerShellを以下の様に変更するとしています。

  • Faster startup time
  • PowerShell Core 6 as the default experience
  • Running on a Linux container
  • Persistent Tool Settings

この中で重要なのは

  • PowerShell Core 6 as the default experience
  • Running on a Linux container

の2点です。

Linux Container(Bashコンテナ)への統合

一度でもCloud Shellを利用したことがある方はわかると思いますが、ブログ内で

We are well-aware that the startup time of PowerShell in Azure Cloud Shell is well below the user’s expectation.

と触れられている様にPowerShellコンテナの起動速度ははっきり言って遅いです。

For past couple of months, the team has been working hard to make significant improvements in this area

と起動時間の改善をしている様ですが、後述の

To ensure the best command-line tools experience while using Azure Cloud Shell, the PowerShell experience will be switching to a Linux container running PowerShell Core 6.

にある様にBashコンテナに統合することで根本的な解決を図る見込みです。
(文章としては一貫性のあるツールエクスペリエンスのためとされていますが、パフォーマンスの問題が根底にあることは行間を読めば自ずと見えてくるかと思います...)

ただし、明確に「PowerShellコンテナを廃止する」とは言っていないので、今後どの様にCloud Shellが変わっていくのかは注視していきたいです。

この統合に対して、Clould Shellでの操作はAzureの管理が基本であり、PowerShell上であればOSの違いは意識する必要が無くコンテナ統合による影響は軽微かと思います。

ちなみに、Cloud Shell内のユーザーデータの保存先であるCloud Driveは両方のコンテナで共用なので、仮にPowerShellコンテナが廃止されてもユーザーデータがロストすることは無いと明記されています。

PowerShell 6.0をデフォルトに

前項のコンテナ統合もあり、クロスプラットフォームであるPowerShell Core 6.0がデフォルトになるのは自明であり、そして真っ当でしょう。
PowerShell Coreは半期リリースで随時更新されますのでCloud Shellの様なプラットフォームには最適です。

ただ、現状AzureRM.Netcoreモジュールはプレビューバージョンです。
いつGAするかに関してはまるで情報が無く今後を見守るしかない感じです。

最後に

とりあえずこんな感じです。
多くはいないと思いますが、現時点でPowerShellコンテナを使ってAzureを管理している方はPoweShell Coreへの移行を視野に入れておくと良いでしょう。

IISにMDwikiをホストする

小規模でお手軽な、できれば「Markdownで文章書いてアップして終わり」くらいお手軽なWikiサーバーが欲しくなり、いろいろ探してみたところMDwikiが良さそうだったので導入して試してみました。

github.com

IISにMDwikiをホストする

このMDwikiは基本的にはローカル環境での利用が想定されている様ですが、IISでホストする手順も公式に用意されています。

環境構築はこの手順に従うだけですが、本エントリでは私自身の備忘も兼ねて少し補足を入れながら説明していきます。
また本エントリの手順をまとめたものをGistに上げています。

導入環境

最新のWindows Updateを適用したWindows Server 2016で行います。
手順自体は簡単ですので、Windows Server 2012 R2など他のバージョンでも問題なく導入できるでしょう。

サイトはデフォルトのDefault Web Siteを使う想定です。

IISのインストール

Install-WindowsFeatureでIISの機能を追加します。
MDwikiは静的なサイトですのでASP.NETなどの機能は無くても構いません。

本エントリではWEBサーバーの機能とIIS 管理コンソールを追加しておきます。

# IISのインストール
Install-WindowsFeature Web-WebServer, Web-Mgmt-Console

IISの設定変更

MDwikiをIISでホストするにはMarkdownファイル(拡張子.md)に対するMIMEの設定を変更する必要があります。
公式の手順にある様に管理コンソールからGUIで行っても構いませんが、ここではAdd-WebConfigurationで設定します。

$SITE_PATH = 'MACHINE/WEBROOT/APPHOST/Default Web Site'

# MIME設定の変更
$mime = Get-WebConfiguration -PSPath $SITE_PATH -Filter system.webServer/staticContent/mimeMap | Where-Object { $_.fileExtension -eq '.md' }
if($null -eq $mime) {
    Add-WebConfiguration -PSPath $SITE_PATH -Filter system.webServer/staticContent -Value @{fileExtension='.md'; mimeType='text/x-markdown'}
}

MDwikiのダウンロードとインストール

MDwikiは公開しているサイトのルートにmdwiki-latest.html(mdwiki-latest-debug.html)に配置するだけでインストールできます。
ここではInvoke-WebRequestを使ってindex.htmlという名前で保存します。

$SITE_ROOT = 'C:\inetpub\wwwroot'

# なぜかVer.0.6.2だとデバッグ版でしか動かない
#Invoke-WebRequest -Uri http://dynalon.github.io/mdwiki/mdwiki-latest.html -OutFile (Join-Path $SITE_ROOT 'index.html')
Invoke-WebRequest -Uri http://dynalon.github.io/mdwiki/mdwiki-latest-debug.html -OutFile (Join-Path $SITE_ROOT 'index.html')

上記コメントにも記載していますが、現在の最新版であるVer.0.6.2ではリリース版であるmdwiki-latest.htmlだと上手く動作しなかったため、デバッグ版であるmdwiki-latest-debug.htmlをダウンロードする様にしています。

初期ファイル

MDwikiのインストール自体はこれで完了ですが、最低限Wikiを動作させるには以下のファイルを作っておく必要があります。

  • index.md : ルートとなるMarkdownファイル
  • navigation.md : Wikiのページ上部にあるメニューを定義するファイル
  • config.json : MDwiki本体の設定ファイル

設定の詳細はドキュメントを参照してください。

今回は以下のスクリプトで各ファイルを生成します。

# その他最低限の初期ファイルを追加
@"
My MDwiki Website
----------------
### Hello World!
"@ | Set-Content -LiteralPath (Join-Path $SITE_ROOT 'index.md') -Encoding UTF8
@"
# My MDwiki
[gimmick:theme](flatly)
[Top](index.md)
[gimmick:themechooser](Choose theme)
"@ | Set-Content -LiteralPath (Join-Path $SITE_ROOT 'navigation.md')  -Encoding UTF8
@"
{
  "title": "My MDwiki"
}
"@ | Set-Content -LiteralPath (Join-Path $SITE_ROOT 'config.json')  -Encoding UTF8

なお各ファイルのエンコーディングは必ずUTF-8にしてください。

ここまで実行すると下図の様にWikiが動作するはずです。

f:id:stknohg:20180517183210p:plain

MDwikiの運用について

導入したMDwikiの運用について気になった点や、現在こんな運用をしているという点を紹介します。

IE対応

今回イントラネットにWikiを公開したのですが、IEでアクセスする場合、イントラネット内だとIEの互換モードでレンダリングを行おうとして表示に失敗してしまいました。
このためindex.htmlのヘッダに以下の記述を追記して互換モードをオフにする様にカスタマイズすることで対処しています。

<meta http-equiv="X-UA-Compatible" content="IE=edge" >

ギミック

MDwiki独自の機能としてギミックと呼ばれる機能があり、このうちAlertsギミックは便利でよく使っています。

シンタックスハイライト

現在のバージョンではコードのシンタックスハイライト機能にバグがあり、特定の言語に対するシンタックスハイライトを使うとブラウザがフリーズしてしまいます。

私もいろいろ試してみましたが、コードのシンタックスハイライト機能は一切使わないのが良いと判断して運用しています。
(とても残念ですが仕方ない...)

コンテンツの更新

コンテンツであるMarkdownの更新はいろいろな方法で可能ですが、私はサイトのルートディレクトリを共有フォルダにしてMarkdownファイルを直接メンテナンスする方式を採りました。
かなりの暴挙なのですが、小規模であることとお手軽さを考慮してこうしました。実際めちゃくちゃ楽です。

バックアップ

MDwikiのバックアップはコンテンツを丸ごとコピーするだけで良いので非常に楽です。
環境依存な部分が多いのでスクリプトは公開しませんが、サイトのルートディレクトリをCompress-ArchiveでまるっとZip圧縮してバックアップ先に保存する運用をしています。

MDwikiの今後について

ちょっと理由は不明なのですが、去年の年末よりMDwikiのGitHubの更新が途絶えておりプロジェクトの今後に不安がよぎります。

ツール自体は現状でも便利に利用できますが長期の運用を検討しているのであれば少し様子を見た方が良いかもしれません。
いっそのことフォークして完全に自前で更新していくのもアリでしょう。

最後に

ざっとMDwikiの導入と運用について説明しました。
プロジェクトの今後に少し不安がよぎるものの、お手軽に導入、運用できるのでとりあえず試してみると良いでしょう。