PowerShell KoansでPowerShellの学習をしてみる

各種プログラミング言語でKoanと呼ばれる学習リソースをみかける事があります。

Koanは禅の[Koan](https://en.wikipedia.org/wiki/Koan)に由来して、このような○○はどうなるかと問われてそれを回答していく学習リソースを全般的にkoanと呼ばれるようです。

この呼び方の文化はrubyが発祥？　かと思われますが、今現在は色々な所からいろいろな言語のKoanが提供されています。

PowerShellでもそんなKoanを提供しているモジュールが存在しているので、今回はこのモジュールをインストールして学習してみます。

## ドキュメント

[vexx32/PSKoans](https://github.com/vexx32/PSKoans)

## 今回実施する環境

- PowerShell 7.3.0-preview.5
- PSKoans 0.67.1

## PSKoansインストールの前提条件

バージョン`0.67.1`現在のPSKoansでは依存モジュールとして`Pester (= 4.10.1)`となっているため、環境によってはインストール時に`Pester`モジュールの注意がでてきます。

このような場合では事前にPesterを更新する必要があります。

PowerShell 5.1　と PowerShell 6以上では下記のコマンドでpesterをインストールします（ドキュメントより）

```PowerSHell
# PS 5.1 (upgrade to latest Pester)
Install-Module Pester -Force -SkipPublisherCheck -Scope CurrentUser -MinimumVersion 5.0.2

# PS 6.0+ (Install Pester under current user)
Install-Module Pester -Scope CurrentUser -MinimumVersion 5.0.2
```

`Pester`はPowerShell 5以降に標準でインストールされるようになったテストフレームワーク。

## PSKoansのインストール

PSKoansは[PowerShell Gallery/PSKoans](https://www.powershellgallery.com/packages/PSKoans)で公開されているモジュールとなるためため。

ここからインストールするのが一番手軽です。

```PowerShell
Install-Module PSKoans -Scope CurrentUser
```

ドキュメントにもある通り、今回はCurrentUserスコープにモジュールをインストールしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/bbe8139d-9942-fcc9-82af-a7cfec4b8df0.png)

## 問題を解いてみる

PSKoansでは、コマンドレットを実行すると、これはなんぞやという問い掛けが記載されたスクリプトが提供されるので、これを更新してテストを通していきます。

スクリプトの修正後にテストを実施して、テストが通過すれば問題クリアとなります。

まずは最初の問題を`Show-Karma`コマンドレットで表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2aca4b1b-4a52-803d-9601-61c4b51a74e0.png)

`Describing "Equality" has damaged your karma.`がはじまりました。

今回の問題では`AboutAssertions`が0/4となっており、この4つを通過させる必要があります。

`Show-Karma -Meditate`コマンドレットで関連付けられたエディタで問題が表示されるので、ここから問題を修正します。

本記事の端末では`vscode`で`AboutAsserions.Koans.ps1`が開きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7a0fa94c-9edc-d68f-6c55-2788b994d9fb.png)

Getting Startedに記載がありますが、 PSKoansは問題文を読み、(__ / ____ / $____ / '____')で記載されている部分を修正して、先に進んでいきます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/01dbd8d4-16aa-2784-fb10-c3901563a1aa.png)

まず最初に、`$____`となっている部分がありました。これが ` | Should -Be $true`となっているので`$____`が`$true`になるように更新します。
（なお`Should -Be`となる構文はPowerShellテストフレームワークであるPesterの構文）

[Pester / Should](https://pester.dev/docs/commands/Should)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/db4ac1c5-d1f5-f275-ac45-c77d82884638.png)

`$____`となっている部分を`$true`に更新しました。（問題が簡単すぎてそのまんまですが）

訂正をしたのでコンソールに戻り`Show-Karma`コマンドレットを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6d65a2cf-da9b-ed01-7f55-c128dc900a1b.png)

`AboutAssertions`が`1/4`になり、一つ進んだ事がわかります。

最初の問題なので、さくっと訂正。
`Should -Be`で記載されている値になるように、訂正箇所を書き換えていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/626572a0-3e82-4864-6719-1691c41800bb.png)

変更後、`Show-Karma`を実行してみると先程の`Describing "Equality" has damaged your karma.`から`Describing "Booleans" has damaged your karma.`に進んだ事がわかります。

`Show-Karma -Meditate`コマンドレットを実行すると、次の問題に進みます。（AboutBooleans.Koans.ps1）が開く。

## Get-PSKoanでトピックを確認してみる

PSKoanで提供されているトピックは`Get-PSKoan`コマンドレットから確認する事ができます。

さきほど実施したAboutAssertions 101の他にも色々とトピックスが用意されている事がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/bb762832-8ec6-9fdf-610d-3da7786f6765.png)

## 変更した内容をリセットしてみる

スクリプトを色々と編集していて、リセットしたい場合は`Reset-PSKoan`コマンドレットを実行します。

引数を付けずに実行すると、すべてのトピックに対してリセットするか聞かれるので。
実行する場合は、`-Topic`オプションでリセットしたい対象のトピックを指定するのがよいかと思います。

```PowerShell
# 一番最初の問題（AboutAssertions）をリセットする場合
Get-PSKoan -Topic AboutAssertions
```

## 総評

PSKoansの問題を解いていくと、提示された問題はどう動くのだろう？　といった疑問や。
PowerShellにこういった書き方があるのかといった気づきが得られます。

やはり手を動かしながら、テストを満たすようにスクリプトを書き換えるのは学びがあります。

ただし、このモジュール。

対象となるのは　PowerShellをある程度さわった事ある　かつ　テストフレームワークであるPesterの理解が多少は必要となるハードルの高さがあるかと思います。

ハードルの高さはありますが、youtubeにPowerShell Koansを実際に解いている動画もいくつか上がっているので、ここらへんを参照すればどういうすすめていくものかイメージはできるかと思います。