Powershellで湯婆婆を世界中から即時召喚できるようにした

# あらすじ

[湯婆婆シリーズ](https://qiita.com/torifukukaiou/items/c8361231cdc56e493245)が流行っているらしいです。
「[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)」が元ネタです。
Powershellのものが無いようですね。便乗してみましょう。

***だれにでもインストールできる[湯婆婆](https://www.powershellgallery.com/packages/psyubaba)***です。

※この記事を参考にすると、あなたの編み出した呪文を世界中に広めることが出来るかもしれません。
※[湯婆婆](https://ja.wikipedia.org/wiki/%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97#%E6%B9%AF%E5%A9%86%E5%A9%86%E3%81%A8%E3%81%9D%E3%81%AE%E9%96%A2%E4%BF%82%E8%80%85)とは[千と千尋の神隠し](https://ja.wikipedia.org/wiki/%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97)に登場する魔女です。

#%E6%B9%AF%E5%A9%86%E5%A9%86%E3%81%A8%E3%81%9D%E3%81%AE%E9%96%A2%E4%BF%82%E8%80%85)とは[千と千尋の神隠し](https://ja.wikipedia.org/wiki/%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97)に登場する魔女です。

## 湯婆婆のインストール

Powershell上に下記１行をコピペして実行します。
これであなたのコンソールにも湯婆婆がやってきます。
楽しみですね！！

```posh:pwsh
Install-Module -Name psyubaba
```

インストールしようとすると、以下のように聞かれます。

```posh:pwsh
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"):
```

- 「湯婆婆なんて恐ろしくて信頼できない」という慎重な人は、「L」を入力して終了してください。
- 「どんな奴なのか**湯婆婆を試してやろう**じゃないか！」という度胸のある人は「A」を入力してください。
- 「気になるけど**湯婆婆はキープで！**」という優柔不断なあなたは、「S」を入力してください。

※あなたのPCがインターネットに接続してないと窮屈すぎて湯婆婆が入ってくれません。
※[PSGallery](https://www.powershellgallery.com/)は[Microsoft](https://www.microsoft.com/)が運営するサイトですが、
湯婆婆が起こす問題に関してMicrosoftが責任を取ることは出来かねると思われます。
湯婆婆の取り扱いには充分ご注意ください。

## 湯婆婆の起動

インストールしたら、この呪文で湯婆婆を起動します。

```posh:pwsh
Start-Yubaba
```

## 古い湯婆婆をインストール

`0.0.1`の部分は好きな湯婆婆のバージョンを指定してください。

```posh:pwsh
Install-Module -Name psyubaba -RequiredVersion 0.0.1
```

## 湯婆婆の更新

もし、古い湯婆婆をインストールした後に、
最新の湯婆婆を使いたくなったら、この呪文を唱えてください。

```posh:pwsh
Install-Module -Name psyubaba -Force
```
古い湯婆婆は消滅し、最新の湯婆婆が手に入ります。

## 湯婆婆の排除

もし、湯婆婆が必要なくなったら、
この呪文を唱えてください。

```posh:pwsh
Uninstall-Module -Name psyubaba
```

# 湯婆婆の中身

psm1ファイルが湯婆婆の本体です。
ここに湯婆婆の脳内構造が記録されています。

```posh:psyubaba.psm1
function Start-Yubaba {

    Write-Host("契約書だよ。そこに名前を書きな。")

    $keiyakusho=Read-Host
    $name=$keiyakusho

    Write-Host("フン。"+$name +"というのかい。贅沢な名だねぇ。")

    $newNameIndex = Get-Random(($name).Length)
    $newName = $name.Substring($newNameIndex, 1)

    Write-Host("今からお前の名前は"+$newName+"だ。いいかい、"+$newName+"だよ。分かったら返事をするんだ、"+$newName+"!!")
}
```

psd1ファイルには湯婆婆のメタ情報が記録されています。
湯婆婆のステータスとでも言うべきでしょうか。

```posh:psyubaba.psd1
#

#

#

#

#

#

#

@{
ModuleVersion = '0.0.2'
GUID = '5e3c7502-ecaa-4fcd-b8b4-7962d81821ba'
Author = 'shortarrow'
CompanyName = 'shortarrow'
Copyright = '(c) shortarrow. All rights reserved.'
Description = 'yubaba'
NestedModules = @('psyubaba.psm1')
FunctionsToExport = @('Start-Yubaba')
VariablesToExport = '*'
PrivateData = @{
    PSData = @{
        Tags = @('yubaba','湯婆婆','🍄','ghibli')
        LicenseUri = 'https://github.com/ShortArrow/PSYubaba'
        ProjectUri = 'https://github.com/ShortArrow/PSYubaba'
    } # End of PSData hashtable

} # End of PSData hashtable

}
```

※湯婆婆の中身をまじまじと眺めたい人は、下記の呪文をPowershell上で唱えてください。

```posh:pwsh
$env:PSModulePath
```
これで、最初に出てくる場所に湯婆婆が格納されています。

# 吉田さん問題

湯婆婆は、**吉**田さんに対しては強いですが、

```:output
契約書だよ。そこに名前を書きな。
吉田
フン。吉田というのかい。贅沢な名だねぇ。
今からお前の名前は吉だ。いいかい、吉だよ。分かったら返事をするんだ、吉!!
```

**𠮷**田さんに弱いらしいです。
もうタジタジ・・・。

```:output
契約書だよ。そこに名前を書きな。
��田
フン。��というのかい。贅沢な名だねぇ。
今からお前の名前は��。いいかい、��よ。分かったら返事をするんだ、、�!�!!
```

# 湯婆婆がクラッシュする

契約書にサインしないと湯婆婆は激オコです。

```:output
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
Get-Random: C:\Users\take\Documents\PowerShell\Modules\psyubaba\0.0.2\psyubaba.psm1:10
Line |
  10 |      $newNameIndex = Get-Random(($name).Length)
     |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The Minimum value (0) cannot be greater than or equal to the Maximum value (0).

MethodInvocationException: C:\Users\take\Documents\PowerShell\Modules\psyubaba\0.0.2\psyubaba.psm1:11
Line |
  11 |      $newName = $name.Substring($newNameIndex, 1)
     |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within
     | the string. (Parameter 'length')"

今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!
```
※おそらく「[おばあちゃんダメここにはお父さんもお母さんもいないもん。](https://kakiokoshi.hatenablog.com/entry/2017/01/22/214718)」と言うと許してくれます。

# 湯婆婆の開発にあたり参考にした情報

- PSSushiBar🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣
    - [はじめてのPowerShellモジュール公開](https://blog.shibata.tech/entry/2016/12/03/001019)
    - 🍣が流れる記事が流行ったことがあります
    - 懐かしいですね
    - [PowerShell のモジュール詳解とモジュールへのコマンドレット配置手法を考える](https://tech.guitarrapc.com/entry/2013/12/03/014013#Windows-PowerShell-Module-Concepts)

#Windows-PowerShell-Module-Concepts)

## .Net Core SDK

「.Net Core SDK」をインストールしていないと、以下のようなエラーメッセージが出ました。

```
 Failed to generate the compressed file for module '/usr/local/bin/dotnet failed to pack: error
```

「[Dotnet failed to pack' error when trying to publish a powershell module to local repository](https://stackoverflow.com/questions/59248123/dotnet-failed-to-pack-error-when-trying-to-publish-a-powershell-module-to-loca)」によれば、dotnet sdk が必要とのこと。

- [インストール手順](https://docs.microsoft.com/ja-jp/dotnet/core/sdk)
- [ダウンロード](https://dotnet.microsoft.com/download/)

## 開発環境のWindows表示言語

Windows OS のユーザーインターフェースの設定が日本語表示になっていると

```
@PublishPSArtifactUtility_Param　Failed to generate the compressed file for module 'Cannot index into a null array.'.
```

みたいなエラーメッセージが出てアップロードできませんでした。

[Failed to generate the compressed file for module 'Cannot index into a null array'.](https://github.com/PowerShell/PowerShellGetv2/issues/606)によれば、WindowsのUIの表示言語を変更すればよいとのことでした。

実際にやってみたのが下記画像です。この直後にPCを再起動したらアップロードできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/a970ec8a-9e4e-aa21-2daf-5ae1fce4eb35.png)

# 湯婆婆スマッシュ？

現在、[PSGallery](https://www.powershellgallery.com/)の上部には下記のような表示があります。

`
We are working on fixing the broken package statistics page
`
>日本語訳：壊れたパッケージの統計ページの修正に取り組んでいます。

もしかすると、私が湯婆婆を召喚する呪文をアップロードしてしまったからでしょうか？
PSGallery内で湯婆婆スマッシュが炸裂したのかもしれませんね。

※ちなみに類義語として[ラルフ](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A5%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5#%E4%B8%BB%E8%A6%81%E4%BA%BA%E7%89%A9)スマッシュや[ハルク](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%AB%E3%82%AF_(%E3%83%9E%E3%83%BC%E3%83%99%E3%83%AB%E3%83%BB%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF))スマッシュがあるらしいです。

ぜひ参考にしてみてください。


# やって良かったこと

- 湯婆婆のありがたみを知ることが出来た
- モジュールを公開する手順を理解できた

モジュール公開を試すモチベーションが無かったのですが、
湯婆婆のおかげで重い腰を上げることが出来ました。
今後はもっと便利なモジュールを公開してOSS貢献しようと思います。

難しい単語を使うと、
「[ゲーミフィケーション](https://www.jgamifa.jp/)した」というらしいです。
@Nemesis さんに感謝です。

# 開発環境

- Windows 10
- Powershell 7

**Excelsior!**