ChatGPTに適当に指示してRubyプログラムを書いてもらう

## はじめに

[ChatGPT](https://openai.com/blog/chatgpt/)というAIチャットが昨年暮れから話題ですね。
なにか質問すると、まるで人間のように的確な受け答えをしてくれる有能なAIです。

最近だとGoogle社内で、ChatGPTの台頭にCodeRedを宣言したという記事も出てましたね。

記事： [ChatGPTのリリースでGoogleは「コードレッド」を宣言、AIチャットボットが検索ビジネスにもたらす脅威に対応するためにチームを再割り当て](https://gigazine.net/news/20221223-google-code-red-against-chatgpt/)

一方でChatGPTはプログラムコードも書けるということなので、適当に指示を出してどのていど良い感じのコードを書いてくれるのか、Rubyで試してみました。

## 手始めに簡単なプログラムを
とりあえず簡単なプログラムを書いてみてもらいました。

![スクリーンショット 2023-01-19 10.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/dd32ad11-de8b-56cd-d9ac-efd1f030fc7d.png)

なんと解説付き。しかも動くぞこいつ。あと「ハローワールド」ってカタカナで入力した指示を英語（Hello World!）に直してくれた。
気が利いてるけど、なんかバカにされた気分。

### ユニットテストも書いてもらおう

コーディングするならユニットテストも書くよね。書いてもらおう。

![スクリーンショット 2023-01-19 10.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/9ffbd174-e763-21fd-a075-c834fb83f87c.png)

「さっきのプログラム」という、ものすごく雑な要求を出してみたら、ちゃんと意図を汲んでくれた。AI怖い。

![スクリーンショット 2023-01-19 10.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/ee73421c-1df7-906c-511a-c5d232f57778.png)

実行方法まで教えてくれた...じゃあテストしてみるか。
![スクリーンショット 2023-01-19 13.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/4c6c71ec-31b0-c7f2-f4cc-c3898bb753f8.png)
通ったわ。

## 阿部寛のホームページのデータを取得して保存するプログラムを作ってもらおう

![スクリーンショット 2023-01-19 11.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/21f3c6b1-a583-f12f-5a3a-b21165805762.png)

いや怖いって。「阿部寛の公式サイト」という、ものすごく適当な指示なのにちゃんと汲んでくれた。有能...!!
と思ったら阿部寛の公式サイトのURLが違う。さらっと間違えてる。無能か。

阿部寛の公式サイトURLを正しいもので置き換えたら、ちゃんと動きました。コードは正しい。

### 生のTCPソケットを使ってもらおう

![スクリーンショット 2023-01-19 11.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/a5aadaa0-cadf-816c-594c-04859f09b1c9.png)

「生のTCPソケット」とか通じるんか...

![スクリーンショット 2023-01-19 11.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/fd0d10a6-a82f-362a-5286-caa858b5d263.png)

例によって阿部寛の公式サイトのURLが間違ってるけど、そこさえ治せば動くはず...!

```
% ruby abehiroshi2.rb 
Traceback (most recent call last):
abehiroshi2.rb:9:in `<main>': undefined method `URI' for main:Object (NoMethodError)
```

エラーやんけ。URIをrequireしてなくて `NoMethodError` 。
直してもらうか。

例によって、あえて雑に指示。
![スクリーンショット 2023-01-19 11.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/98059538-8c00-1643-cc5b-52000ec36aa3.png)

（長くて画像だと荒くなっちゃうので、ChatGPTの出力をそのまま貼る）
```ruby
require 'socket'
require 'uri'

url = "https://abehiroshi.com" # URL間違い（筆者追加コメント）

# URLからホスト名とポート番号を取得
uri = URI(url)
host = uri.host
port = uri.port || 80

# TCPソケットを作成し、サーバーに接続
socket = TCPSocket.new(host, port)

# HTTPリクエストを送信
socket.puts "GET #{uri.request_uri} HTTP/1.1"
socket.puts "Host: #{host}"
socket.puts "Connection: close"
socket.puts ""

# HTTPレスポンスを受信
response = ""
while (line = socket.gets)
  response += line
end

# TCPソケットを閉じる
socket.close

# レスポンスからHTMLを取得
html = response.split("\r\n\r\n", 2)[1]

# HTMLをファイルに保存
File.open("abehiroshi.html", "w") do |file|
  file.write(html)
end

```
裏に人でもおるんとちゃうか。

ただ、例によって阿部寛のURLが間違ってる...
直せ直せ！ やりなおしだ！
![スクリーンショット 2023-01-19 11.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/add05ebc-e80a-9a75-0ed2-bd304bd54669.png)

```ruby
require 'socket'
require 'uri'

url = "http://abehiroshi.la.coocan.jp/"

# URLからホスト名とポート番号を取得
uri = URI(url)
host = uri.host
port = uri.port || 80

# TCPソケットを作成し、サーバーに接続
socket = TCPSocket.new(host, port)

# HTTPリクエストを送信
socket.puts "GET #{uri.request_uri} HTTP/1.1"
socket.puts "Host: #{host}"
socket.puts "Connection: close"
socket.puts ""

# HTTPレスポンスを受信
response = ""
while (line = socket.gets)
  response += line
end

# TCPソケットを閉じる
socket.close

# レスポンスからHTMLを取得
html = response.split("\r\n\r\n", 2)[1]

# HTMLをファイルに保存
File.open("abehiroshi.html", "w") do |file|
  file.write(html)
end

```


丁寧な謝罪からの正しいコード！ 有能...!
HTTPプロトコルの `Connection: close` もちゃんとつけて、ちゃんとソケットが閉じるようにしてくれてるところが嬉しい。

## Railsでお天気アプリを作ってもらおう
![スクリーンショット 2023-01-19 14.24.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/1f850043-dcb8-a945-3635-385a41fdb30e.png)


ちゃちゃっと書いてもらおうじゃないの。
![スクリーンショット 2023-01-19 13.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/7f3b41de-857a-0e83-0fa8-1018e2c28586.png)
![スクリーンショット 2023-01-19 13.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/96e3f92a-c074-b263-66c4-0721092f11fb.png)
![スクリーンショット 2023-01-19 13.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/f34fb147-0083-9897-108f-91de309a99e0.png)
![スクリーンショット 2023-01-19 13.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/73190752-c219-b6ec-0885-54587f71f46f.png)


すごい。もう簡単なアプリならChatGPTさんに雛形作ってもらってそこから必要なところだけ変更とかでいけるんじゃないか。...それは言い過ぎか。

### 表示を日本語にして欲しいんだが


![スクリーンショット 2023-01-19 13.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/5ead09cd-30b4-faa3-07bc-df9c98a500a8.png)
（途中は同じ）
![スクリーンショット 2023-01-19 13.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/2e54a36e-cd59-7cae-2064-1254b3881c77.png)

わかってんなオイ。Viewだけ日本語にしてくれた。まじか。

... ほんとに裏に人がおらんよな？ 

AIの指示通りOpenWeatherのAPIキーで置き換えて、ブラウザで開いてみるか。
![スクリーンショット 2023-01-19 13.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/8ad29c9f-7cec-034a-a41f-accf513fb98c.png)

動いた...たしかに今日は曇りがちでした。



## まとめ
ChatGPTすごいを通り越して怖いですね。けっこう雑に指示してると思うんですが、ちゃんと意図を汲んで修正してくれます。

あと、ひとつ前で作ったプログラムに対して「〜〜して」って指示すると、ちゃんとひとつ前のプログラムを修正するのすごいな〜って感動しました。人間の感覚的には当たり前かもしれんけど、ここまでの流れをストーリーで認識してるってことですよね？ 

まだ複雑な要件は無理だと思うけど、こういう感じで過去の指示の内容をストーリーとして認識してくれてたら、自社特有の事情とかシステム構成とかもいずれは理解して、その共有認識をもとに人間がAIに指示を出せば、なんかいい感じのプログラムを作ってくれる未来が来るかもしれないと思いました。

あーおもしろかった！