ChatGPTによる「ノンコーディング」プログラミングの経験

　前回、はじめてのぼくの投稿である「FlaskアプリのPythonanywhereへのデプロイ」
https://qiita.com/tkoji3744/items/2f605cef3348d650f7dd
には、新しいエンジニアの知識はそこにはなく、「ChatGPTが役に立った」ということしかなかった。

　だが、思うに、「pythonのフレームワーク、bottle/flask/djangoでつくったファイルは簡単にlocalでみれるが、いざデプロイするのはかなりやっかい（挑戦しないほうがいいくらい）」とは、どんな専門記事にも書かれることはない。それはいわゆる「挑戦」なのだから、「挑戦しないほうがいい」と書かないのは当然のことかもしれない。だが、力のない独学者には、伝えるべき情報だと思う。「Pythonで作ったゲームはWEBでは遊べない」などと書くと、「そんなことはない。やろうと思えばできる」と言われるだろうが、実際は、将棋やオセロや囲碁のようにゆっくり画面遷移するもの以外（例えばシューティングゲーム）はWEB公開に向いていない。初学者には、こういう一見ネガティブともいえる指摘をした記事も「役に立つ」、ということは実は盲点ではないか？あれもできる、これもできる、だけではよくないのではないか？

　今回もひきつづき、ChatGPTによる「ノンコーディング」プログラミングの報告をする。
　とはいえ、ぼくの場合、ChatGPTが答えやすいようなアルゴリズムを意識しながら、などのテクニックは使えない。ただ、プログラムに無茶詳しくて、こちらの（失礼な）要求に、ちっとも嫌がらずにつきあってくれる、たよりがいのある隣にいる先生とまさにChatしながら作っていった。「一回のやりとりでつくる」には、特別な聞き方が必要なのだろう。だが、ぼくは、そんな知識さえなく、なんども「ChatGPTへのダメ出し」と質問をくりかえしながら、自分ひとりでは不可能なことをやり遂げることができた。
　ぼくには、自分のもつエンジニア能力以上の課題を勝手につくり、その結果、当然のことながらずっと課題の解決ができずにいる悪い傾向があるのだ。そんなぼくが、このChatGPTによって、救われた気持ちになったことが、「FlaskアプリのPythonanywhereへのデプロイ」以外にも、いくつかある。

（１）ぼくは、pythonでリバーシの作成をした本を購入して持っている。読むとなんとなくわかるような気がする。でも、一から自分でプログラムをつくることなど、とても読んだだけではできなかった。ところで、その本には「人vsコンピューター」「コンピューターvsコンピューター」のプログラムは載っていたが、「人vs人」のプロフラムは載っていなかった。

User
　（その本の、「人vsコンピューター」の全プログラムコードをコピペ後）これを、人間とコンピューターでなく、二人の人間がクリックするものにかえれますか？
ChatGPT
　はい、プレイヤー対プレイヤーのリバーシゲームに変更することは可能です。以下は、コードを変更してプレイヤー同士でゲームをプレイできるようにする手順です。
　コンピュータの思考ルーチンを削除: このゲームでは、コンピュータの思考ルーチンが存在しますが、プレイヤー同士の対戦には不要です。コードからコンピュータの思考部分を削除します。
　クリックイベントの処理を変更: クリックイベントを処理する部分を変更し、プレイヤー1とプレイヤー2が交互にクリックして石を打つようにします。
　以下は、コードの変更例です：

User
  全文でお願いします 

  ChatGPTでつくられた、「人vs人」のプログラムをみると、ぼくの力だけではとても書き換えることができないような代物だった。

  そして、特筆すべきことは（以下のすべてのケースで同じだが）ChatGPTがつくるプログラムは、期待通りのものでなくても「必ず動いた」。つまり、デバッグは全く不要なのである。それは、ChatGPTが人間とは違うのだ、ということを感じさせるには十分だった。

（２）よく、WEB等で作成例が解説されポピュラーな「電卓作成プログラム」は「電卓プログラムを作ってください」とこちらが１行書いただけで、ChatGPTはそれ風の解説までつけてあっというまに返答をだしてきた。Pythonのtkinkerを使って、PySimpleGUIを使って、あるいはJavaScriptで。いずれも、あっというまに。しかも「デバッグ」不要で。

（３）次にあまり、ポピュラーではない、カシオの電卓で最近復刻されたという：　https://kakakumag.com/houseware/?id=11983
懐かしの「電卓デジタルインベーダーゲーム」例　https://akebi.jp/gamecalc/
をpythonでつくりたいと思った。そして、ぼくはコーディングすることなく、何回かのやりとりで修正してもらいながら、そのプログラムを得た。そして、そのくりかえしの修正の過程にでてきたプログラムの中で、動かなかったものはひとつもなかった。すべてデバッグ不要だった。

User
 デジタルインベーダーというのは以下のとおりです。横並びに８つの桝をおいたような画面。一番右側の桝に、まずランダムに数字が出現。それから何秒かおき（ゲームのステージとともに、間隔が短くなる）に、新しく一番右側に、またランダムに数字が出現。そのとき、最初の数字はひとつ左へ移動。これを８回繰り返す前（つまり、７つの桝に数字がすべてならぶときまで）に、+ボタン、あるいは、-ボタン、をおして、先頭（つまり数字の列の一番左）の数字を、一番左の桝に表示しenter 。数字の列の先頭（一番左）と、このenterされた数字が一致すれば、その数字の列の先頭の数字は消える。８回すぎると、ゲームオーバー。何回かこれをくりかえし、ゲーム時間の長さを競う（長くゲームできた者の価値）。これだけの記述で、pygame をつかったpythonでプログラムが書けるか？挑戦しませんか？

 ChatGPTで、最後にできあがったのは、このような感じ。
　（上はPyGame、下がPySimpleGUI)
 
 ![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/37df0946-653d-a772-942e-052c1b67ddfc.jpeg)
![無題2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/8a22297f-1c5b-d607-6736-88d1ca8473db.jpeg)

（４）ずっと気になっていた、撮った写真から位置情報をとりだして、そこの場所を地図上に表示する、というアプリも容易に作れた。
　（位置情報がはいってない写真は、「位置情報なし」と表示）
 ![無題3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/ea5a4009-5fea-9fb3-3fb5-b3184533386d.jpeg)

（５）そして、決定的に嬉しかったこと。それは、２０年前、「ペプチド研究」をしていたころ、共同研究者だった某大学の情報工学科の院生につくってもらったアプリの復刻。その研究から遠ざかったこともあって、いつもまにか、そのアプリは行先不明。昔懐かしくて、独力で再現しようと思ったがままならず。それが、上記の経験をふまえ、ChatGPTの助けを借りて、一気に完成できたことに、少し救われたような気持にさえなった。
![無題4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/3a7d2c2b-0043-605f-90d9-e9fde02706ce.jpeg)

　専門的なので、理解がむずかしいかもしれないが一応説明。タンパク質は２０種のアミノ酸と順列組み合わせ。その立体構造や結合のしくみは、今でもシュミレーションだけでは不十分で、正確には、結晶をつくりそのX線解析をしなければならない。しかし、ある研究者が、簡易法として、「ある連続するアミノ酸：それぞれ、固有の疎水スコア、をもつ　例　６個のアミノ酸、個数は任意」の平均疎水度がやや高く、その疎水モーメントが高い場所が、結合部位の可能性が高いことを提唱。　　　https://www.pnas.org/doi/epdf/10.1073/pnas.83.8.2295
 　今では、忘れられてしまっているが、２０年前は、そう古くはない考え方だった。
 　アプリは、アミノ酸配列を入力後、任意の長さ（ここでは６個）で、先頭から一つずつずらし切り出し、その平均疎水度と疎水モーメントを計算（今回は、Eisenberg 疎水score、を使ったが他の疎水スコアでも計算可能）。結果は、Excelファイルに出力。あとは、Excelのフィルター操作で条件にあう配列を選定、というものだ。

  この考えは、タンパク質の他分子との結合部位の予測には大雑把すぎるかもしれない。だが、これに、陽電価の高いアミノ酸も考慮することで、タンパク質内に潜む、抗菌あるいは抗ウイルスペプチドの候補を予言するためには、今でも役に立つと考えている。
  これについては、また、別の機会で、報告したいと思う。

  いずれにせよ、以上、ぼくが経験したChatGPTによる「ノンコーディング」プログラミングの報告でした。