ぽぽろん研究所のサムシング

twitter:@poporon_labもよろしく

ChatGPTプログラミング【2023/03/27】

こんにちは、ぽぽろん研究所です。

起きた瞬間に日曜日という日が半分以上終わっていました。きっと私のお布団には重力制御装置が埋め込まれていて、空間が歪むことで時間の流れがおかしくなっていると考察します。これで私の怠惰が原因ではないことを証明できました。完璧です。

日曜日は半分蒸発しましたが、半分健在です。これは私の日曜日が致命傷で済んだということです。残りの半分で何かをしようと思いChatGPTを使ってみました。ChatGPTは適当にチャットして遊んだ程度でそれ以外何もしていませんでした。(決して友達がいないからAIとチャットしたわけじゃないんだからね。)ChatGPTでプログラムがかけること自体は知っていたのですが、この機能を有効に使ったことがありませんでした。ので、今回はChatGPTでサクサク作れることを実感してみようと思います。
今回はたまたま偶然目の前に転がっていたESP32を使ってキーボード操作のなにかを作ろうと思います。ESP32はWi-Fiが入っているのでこの機能を使って、PC間で文字列のやり取りをするためのサムシングを作ろうと思います。

作るもののイメージ
というわけで、ChatGPTにWi-Fi経由で文字を入力するプログラムを出力してもらいました。以下が結果です。

import board
import busio
import socketpool
import adafruit_requests as requests
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS

# WiFiアクセスポイント設定
wifi.radio.connect("<SSID>", "<PASSWORD>")
print("IPアドレス:", wifi.radio.ipv4_address)

# USB HIDキーボードオブジェクト
keyboard = Keyboard()

# キーボードレイアウトオブジェクト
keyboard_layout = KeyboardLayoutUS(keyboard)

# ソケットプール
pool = socketpool.SocketPool(wifi.radio)

# サーバーソケット
server_socket = socketpool.Socket(pool, socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((wifi.radio.ipv4_address, 8080))
server_socket.listen(1)

# ソケットからデータを取得してキーボードに入力
while True:
    # 接続待ち
    client_socket, client_address = server_socket.accept()
    print("接続されました:", client_address)

    # データを受信
    data = client_socket.recv(1024)

    # 受信したデータをキーボードに入力
    keyboard_layout.write(data)

    # クライアントソケットを閉じる
    client_socket.close()

動かしてみた結果エラーが多発しました。私がAdafruitのライブラリを入れていなかった部分もありましたが、ソースにも色々エラーがありました。一部関数が存在しなかったり、引数を間違っていたりなどいろいろです。そのことを指摘したところChatGPTはCircuitPythonをやめてMicroPythonの使用を推奨してきたりと一筋縄では行きませんでした。
諸々のエラーを手動で解消したあとのソースが以下です。なお、まだ作り込みが甘いので動作としては不安定です。

import board
import busio
import socketpool
import adafruit_requests as requests
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
import wifi
import usb_hid

# WiFiアクセスポイント設定
wifi.radio.connect("<SSID>", "<PASSWORD>")
print("IPアドレス:", wifi.radio.ipv4_address)

# USB HIDキーボードオブジェクト
keyboard = Keyboard(usb_hid.devices)

# キーボードレイアウトオブジェクト
keyboard_layout = KeyboardLayoutUS(keyboard)

# ソケットプール
pool = socketpool.SocketPool(wifi.radio)

# サーバーソケット
server_socket = pool.socket(socketpool.SocketPool.AF_INET, socketpool.SocketPool.SOCK_STREAM)
server_socket.bind((str(wifi.radio.ipv4_address), 8080))
server_socket.listen(1)

# ソケットからデータを取得してキーボードに入力
buf_size = 1024
buf = bytearray(buf_size)
while True:
    # 接続待ち
    client_socket, client_address = server_socket.accept()
    print("接続されました:", client_address)

    # データを受信
    data_size = client_socket.recv_into(buf,buf_size)
    data = buf[0:data_size].decode()

    # 受信したデータをキーボードに入力
    keyboard_layout.write(data)

    # クライアントソケットを閉じる
    client_socket.close()

使ってみて思ったことは、ChatGPTだけで戦うのはまだ難しいかなという感じです。大枠としては吐き出してくれるのですが、そのまま使えるかどうかは別と思いました。特に類似する関数に対して弱く、似たような関数があるとメジャーなものに引っ張られてしまっているように見えました。最終的に人の手で修正を入れると考えると最低限の知識は必要なように思いました。
一方でほぼ完成しているプログラムを出してくれるので、一から関数を調べる必要がなく、必要な部分だけを調べればすぐ動かせるのはメリットのように思いました。今回は初めてAdafruitのWi-FiライブラリやKeyboardライブラリなどを使いましたが、Wi-Fiのソケット初期化と受信部分、Keyboardの初期化部分以外調べずに動かせたのでお手軽スタートだったと思います。普通なら複数のサイトをグルグル回ってWi-Fiの接続方法から、サーバの立ち上げ、Keyboardの動かし方などたくさん調べることがあると思うのですが、今回は半分以下まで減らせたと思います。ChatGPTすごいです。

これを使いこなせるようにならないと将来的に駆逐されるのは私ですね。クソ雑魚ナメクジプログラマなぞ一瞬で灰になってしまいます。AIが私を養ってくれるならそれでもいいのですが。。。AIが嫁でもいいかもしれないです。

それでは、また次回。