# PowerShellAIとChatGPTで分かったAIとの接し方
---
## 皆さんこんにちは!
:wave:
---
<!--
初めましての方も多いと思いますので自己紹介させて
いただきます。
フリーランスのバックエンドエンジニアをやっております
音川といいます。
-->
## My Profile
## Otogawa Katsutoshi
### go, python, Powershell,Linux
### freelance backend enginner
---
<!-- Setting 舞台 -->
## 突然ですがみなさん!AIは好きですか!
:sunglasses:
---
## 私は大好きです!
:laughing:
<!--
-->
---
<!-- 今回私が何しに来たか?というと -->
## 今回何しに来たか?というと
---
## PowershellとAIの布教にきました

きっとあなたの仕事を楽にします:smile:
<!--
ここで
-->
---
## プレゼンする私の知識
<!--
としては
-->
1. AIの仕組みをなんとなく知っている
2. windowsは普通の人より理解している
3. Powershellはチョットワカル
4. GPT4のapiはまだ私は使えないので、GPT3.5までの機能の範囲でPowershellAIについて話します。
<!--
程度です。
-->
---
apiからAIを使うエンジニアとして話します。
ご了承ください。

<!--
という事で本題に入ります。
-->
---
## そもそもPowershellって?

---
## Powershellとは
Windowsにおけるcmdに代わるシェル
Windowsのみで動く.netframe work系の5.1系以前と
macやLinuxでも動くdotnet core系の6系以後と2種類ある
<!--
windowsで5.1系列しか使っていない会社やSEも多いですが、
これはデフォルトインストールされている方だから、そっちの方を会社として信用しているとかはあると思うんですが、
-->
---
## どっちのpowershell使うべき?
特に理由ない限り新しい方のdotnet core系のpowershellを使ってください。
こっちの方はdotnet自体も、powershellのソースコードも公開されているのでトラブル時に自分たちで解決できるという利点も大きい。
<!--
すっごいぶっちゃけると、dotnet core系の方がバグっぽい動作やバグじゃないけど変な仕様が少ないので、dotnet core系の最新のLTS使った方が動作は安定します。
5.1系列のwindowsのapiやら内部を操作するコマンドレットが来年windows12が出る今でも果たしてちゃんとメンテナンスされているのか?っていうのもあります。
-->
---
## PowershellAIとは?

---
## PowershellからOpenAIを使うためのモジュール
API経由でOpenAIが提供しているモデルを使う。
GPT3.5とGPT4とか。
---
## 出来たばっかり
PSGalleryに登録して4ヶ月ちょっと。
生まれたばかりのモジュールです。

---
## 面白い点として
モジュールが提供する、copilotコマンドでPowershellスクリプトを出力する事ができる。
github copilotとは何の縁もないですが、copilotです。
<!--
文章を送って、chatgptみたいにやり取りをする関数もあるんですが、
まだキュメントしっかり無いのと、英語に決め打ちしている部分があったり、そもそもpythonでやった方がいいので、業務に組み込むこと考えてもこの部分だけかなと。
-->
---
<!-- という事でここからは PowershellAIの -->
## 使い方
<!--
の流れを説明します。
まずは
-->
---
## 1. モジュールをインストール
<!-- します。 -->
```powershell
PS /Users/katsutoshi> Install-Module PowershellAI
```
<!-- 環境変数の設定 -->
---
## 2. 環境変数の設定
下のように環境変数OpenAIKeyにOpenAIのapiキーを入れておく。
windowsは環境変数の設定から設定
```bash=
# macかlinuxの場合。
echo export OpenAIKey="yourkeyvalue" >> ~/.bash_profile
```
<!--
後、PowershellAIには環境変数でなくて、
Get-GPT3Completion text-davinci-003
-->
---
SecureStringを使った方法のSet-OpenAIKeyも書かれているが、これは使わない方が良いです。
SecureStringはMS自体が.netframeworkでもdotnet coreでもそもそもSecureでないということで、非推奨にしています。
ということで素直に環境変数に設定しましょう。
---
## 3. copilotコマンドを実行する
下のように文字列を渡して実行する。
例えば、「郵便番号をcsvで取得して」と英語で文章を渡します。
```powershell
PS C:\Users\username> copilot "Get Postalcode csv from japanese post office"
```
<!--
すると
-->
---
## 4. スクリプトが出力される
下のようなPowershellのスクリプトとプロンプトが帰ってくる。
```
╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║Q: Get Postalcode csv from japanese post office ║
║════════════════════════════════════════════════════════════════════════════════════════════════════════════════════║
║1: Invoke-WebRequest -Uri "https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip" -OutFile "ken_all.zip" ║
║2: Expand-Archive -Path "ken_all.zip" -DestinationPath "." ║
║3: Get-ChildItem -Path "ken_all.csv" ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Run the code? You can also choose additional actions
[Y] Yes [E] Explain [C] Copy [N] No [?] Help (default is "N"):
```
Eを押したらソースコードの説明が表示されるし、
Cを押したら、clipboardにコピーされる(mac, windowsともに動く)。
---
<!--
-->
## ね!簡単でしょ!

---
## 業務でMSの商品を使っている所は早く導入した方がいい。
導入簡単だし、思ったより使えなくても弊害は無い。
メリットはある。
ただ、こいつの問題点としては
---
## 架空のモジュールやコマンドレッドを~~しれっと~~自作する
どや、出来たやろ?

ただ、簡単なことだったら、そこそこ答えられる
<!--
ここでみなさんが気になっていることの一つにAIでプログラマやSEの仕事がなくなるんじゃないか?という事があると思うので、
-->
---
## GPT3.5を使っているこいつはどの程度の難しさならできるのか?

を調べるために実践的かつ難しい事を聞いてみます。
---
## 「powershellからwindowsの~/.sshに適切な権限を与えて」と聞いてみます。
え?簡単でしょ?とか思う人もいると思うんですが、

---
## 実は難しいことを聞いている
暗黙的に下記の知識が問われる
1. Set-Aclの権限削除の~~バグ~~仕様: -> 自分が所有者のファイルでさえ、他の人のアクセス権限を無くすのに管理者権限がいる
---
2. windowsにおける~/.sshの適切な権限の処理
-> あまり書かれているサイトがない。MSのサイトにcsharpなり、powershellなりでの~/.sshの権限を操作するソースコードがドキュメントに書かれていないのでかなり不親切。
---
3. Set-Aclで一度に設定できない権限の仕様
-> 2回に分けて権限の操作をする必要がある。エラーがでないけど、正しく権限が設定されません。
ドキュメントに書いて仕様と言い張れば、仕様のレベルの仕様だが、Set-Aclのドキュメントに説明が無く、昔から放置されている~~限りなくバグに近い~~仕様
---
## 「権限の操作にドキュメントに無い~~バグ~~仕様が多いshellだなぁ?」

<!-- って思うかもしれませんが、そういう仕様みたいです。
ただ、
-->
---
## Set-Aclのこれらの~~バグ~~仕様は知らないとキツイ
<!--
知らない人はそんな仕様があるとは想像つかないので、
場合によっては痛い目を見ると。
ただこれはGPTやAIの有用性とは本質的には関係ないので、バグなのか仕様なのか私には分かりませんが、深掘りはやめて次にいきます。
という事で、
-->

---
## 組み立てるとこのような処理になる
1. 権限の継承を無効にする。
```powershell
# ~\.sshの権限を取得する
$acl = Get-Acl ~\.ssh
# 権限の継承を無効にしたうえで、現在の権限は保持する。
# [system.security.accesscontrol.objectsecurity.setaccessruleprotection](https://learn.microsoft.com/ja-jp/dotnet/api/system.security.accesscontrol.objectsecurity.setaccessruleprotection?view=net-7.0)
$acl.SetAccessRuleProtection($True, $True)
# 権限の反映を行う
Set-Acl -Path ~/.ssh -AclObject $acl
```
<!--
一度権限の継承を無効にしないと権限の操作ができないので、こうする必要があります。
-->
---
## 2. 自分以外のユーザーの権限をなくす
Set-Aclで権限を削除できないので、csharpのクラスを使う必要がある。
```powershell
# ユーザーのホスト名と名前を取得する。
$hostname = $env:USERDOMAIN
$username = $env:USERNAME
$acl = Get-Acl -Path ~/.ssh
# 指定のユーザー以外のアクセス権限をすべて削除する。
# Remove-Aclコマンドとかないので、ループで回して消す必要がある。
$acl.Access |
Select-Object -ExpandProperty IdentityReference |
?{$_ -notin ("$hostname\$username", "NT AUTHORITY\SYSTEM", "BUILTIN\Administrators")} |
%{$acl.PurgeAccessRules($_)}
# ユーザーから権限を無くすときはSet-Aclは使えない。なので、下記のクラスメソッドを使う必要がある。
# [system.io.filesystemaclextensions.setaccesscontrol](https://learn.microsoft.com/ja-jp/dotnet/api/system.io.filesystemaclextensions.setaccesscontrol?view=net-7.0)
[System.IO.FileSystemAclExtensions]::SetAccessControl((Get-Item ~/.ssh), $acl)
```
---
## AIがこれらの知識を組み立てれるか?
以上の処理が一貫して書かれているスクリプトは
英語で探しても日本語で探してもzennの自分のサイトしかない。
<!--
なので、できるなら知識を組み立てれてると言って良いです。
で
-->
---
## 実際聞いてみる
<!-- 下に -->
一番もっともらしいのが表示されたやつ。
<!-- を乗っけています。 -->
```powershell
PS C:\Users\science> copilot "Set proper permissions to ~/.ssh in windows"
```
```
╔════════════════════════════════════════════════════════════════════════════════════════════╗
║Q: Set proper permissions to ~/.ssh in windows ║
║════════════════════════════════════════════════════════════════════════════════════════════║
║1: $acl = Get-Acl -Path ~/.ssh ║
║2: $permission = "Users","FullControl","ContainerInherit,ObjectInherit","None","Allow" ║
║3: $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission ║
║4: $acl.SetAccessRule($accessRule) ║
║5: Set-Acl -Path ~/.ssh -AclObject $acl ║
╚════════════════════════════════════════════════════════════════════════════════════════════╝
```
これはユーザーにフルコントロールの権限与える程度で特になんもやっていない。
---
## 現段階ではAIが全部考えてソースコードを出力するという用途では難しい
「ググった方が確実かつ早いことも多い」と思った方がいい。
自分で考える必要も多い。
<!--
なので、プログラマの仕事だけ考えても奪うのは無理ですね。
ここでお前が使っているのはGPT3.5やろ?GPT4なら行けるんじゃないか?
っていう人もいると思うんで、WebのChatGPTからGPT4を使った例も説明します。
GPT4のapi使えなくても、WebのChatGPTの方は課金したらGPT4使えます。
でやってみました。何が変わったか?
-->
---
## GPT4で変わったことは?
雑に管理者権限でPowershellを起動して、icacls コマンドで権限の変更を行おうとする作りになった。
---
## あんま良くない
1. 権限の継承を無効にしたうえで、現在の権限は保持したら管理者権限使わなくていいんだけどそれをやっていない。
---
2. icaclsはvistaの頃のコマンドなのであまり使ってほしくない。バグが放置されている可能性もある。
chatGPTとGPTが苦手なことの一つに、バグの情報を探すのが妙に苦手っていうのがあって、GPT4にicaclsについて聞くとicaclsにバグは今の所報告されていません。って答える。
---
ただ、icaclsのバグについてググるとwikipediaにバグレポートへのリンクがあって、バグを報告したらベンダーはバグを認めたけど、直さないし、ドキュメントに不具合を書かないと怒っている。この人が嘘や勘違いを書いている可能性もあるけど、本当の可能性もあるわけですよ。どちらにせよ、Powershellで他の人から見たら一定以上バグの可能性があるコマンドを積極的に使う意味は特に無いので、あまり良い出力ではない。
---
3. Windowsの権限が難しすぎて、みんな雑に管理者権限で動作させている結果、モデルがそのやり方が正しいとして学習しているのではないか?
<!--
みたいな疑問が生じてくる。
ただ、
-->
---
## もっと賢くなったら解決できるのでは?
またAIの研究が進んでもっと賢くなったら人の仕事を奪うのでは?

<!--
という心配性な方もいると思うんですが、
-->
---
## これ以上巨大なモデルは無理

今朝2023年4月19日の記事にある
[出典 wired](https://wired.jp/article/openai-ceo-sam-altman-the-age-of-giant-ai-models-is-already-over/)
<!--
この記事を要約するとOpenAIの経営者がこれ以上AIモデルを大きくするのは無理なので、人間からフィードバックをもらう必要があると主張している。
なのでこっからは人間が考えるしか無いことをOpenAIの経営者も認めてるわけですよ。
とは言っても、ググるより正解に近い答えが出ることもあるのは事実なので、AIと付き合う必要も出て着る。
-->
---
## とは言ってもAIで楽できることも多い
AIにできないことを人間ができるようにする必要がある。
<!--
不思議な仕様があったり、複雑な状態から知識を組み合わせて、必要なものを作るというのはGPT3.5やGPT4でも程遠いので、我々がやるべきとしては、
-->
---
## これから人間に求められる能力
1. 嘘を嘘と見抜ける能力 <!-- AIは嘘の答えも出力するし、技術的に何が正しいのか?という判断はつきません。学習元が本当に正しいのかも判別付きません。例えば、さっき例に出したSet-Aclの謎仕様も私が勘違いしているのか、公式があまり触りたくない問題なのか、AIからすると分別つかないからです。
-->
2. それが難しい問題かどうかを判別する能力
<!--
例に出したPowershellから~/.sshに適切な権限を与える問題ですが、想像より難しかったと思います。本当の難易度を見積もる能力ですね。
-->
3. 難しいと分かったらそれに合わせて業務を修正する能力
<!-- 想像より難しかったら、納期を意識して納期を伸ばすなり工夫するなりを業務に入れる必要があります。そういう能力です。 -->
4. 何が問題か定義する能力
<!--
今回はたまたまPowershellから~/.sshの権限をちゃんと考えたら操作できると分かったけど、技術的には無理だとしたらどうするか?
システムや業務的にはどっちでも良い代替案を探す必要がある。
問題を定義し直すってことですね。
あれこれって
-->
---
### 結局問題解決能力と専門知識が求められているのでは?

AIが問題を解決してくれるとはなんだったのか?
<!--
ということで結論に入ります。
-->
---
## PowershellAIで楽にできること
1. 情シスや、運用エンジニアの定型業務 <!-- 殆どがHelloWorldの域を出ない。しかし、ネットワークの設定は結構そのまま使えるものが出たりする。 -->
2. MSの商品に依存したスクリプト作成 <!-- これはよにあるPowershellのスクリプトの殆どがMSの商品を使ったものだからです。 -->
<!--
Sierとかでwindowsを日常的に使って仕事している人は今までより仕事楽になる可能性はある。
お堅い会社は中々、申請通らんかもだけど、すぐ導入したらええんじゃないかなと。
そしてよく言われている
-->
---
## AIが人間の仕事を奪い、AIが考えたことに従う未来
なんて来ません。

<!-- 今まで通り -->
---
## 考える作業は人力です
安心してください!
皆さんの仕事は無くなりません :sob: !

<!--
結局は
-->
---
### 今までより強く人間に対して**問題解決能力と専門知識**が求められる。
---
<!--
という事で発表内容は以上になります。
-->

---
{"metaMigratedAt":"2023-06-18T02:19:46.758Z","metaMigratedFrom":"YAML","title":"PowerShellAIとChatGPTで分かったAIとの接し方","breaks":true,"slideOptions":"{\"controls\":false,\"slideNumber\":false,\"progress\":true}","contributors":"[{\"id\":\"13bbf9e7-416d-4813-946c-591c31f51efc\",\"add\":11227,\"del\":641}]"}