自作サンプルコードの自筆記事を作成する時、ChatGPTを記事作成支援機能として利用する

#   はじめに

サンプルコードを自作して、自筆の記事を書こうとする時に、ChatGPTを記事作成の支援機能として利用してみる試みを記載します。

ChatGPTに、サンプルコードの説明を付ける作業を支援して貰い、記事作成の支援としてChatGPTを使う方法を模索します。

サンプルコードをChatGPTに与えて、要約・実行順・何が出来るか、等の質問に答えて貰い、その結果の良い部分を抜粋して記事を作成しています。

模索の結果、好ましい部分だけをかいつまんでつなげれば、十分支援機能として利用可能で、一から説明文を作り上げるよりも候補からかいつまむ方が楽でした。

#   サンプルコード

ここで用いるサンプルコードは、以前、Qiitaの記事として投稿した、Pythonでコンソール出力をテキストファイルに保存する、下記の記事内のサンプルコードを用いて、このサンプルコードの記事を改めて作成してみます。

記事: *他の.exeを起動して、コンソール出力をテキストファイルに保存する試行* (2020年12月30日に作成)

https://qiita.com/dl_from_scratch/items/5678db5008171c8d9c89

#   ChatGPT質問の外観

下図のように、ChatGPTに聞いてみます。次章以降に結果を記載します。

質問時のChatGPTの外観: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/45ff6673-cf88-5453-8a49-3269bd384b8e.png)
回答取得時のChatGPTの外観: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/9d53b3a6-bbe8-9f86-357c-ba05b375ba24.png)

#   ①サンプルコードに付け加える説明文の文章候補を生成

まずは、このサンプルコードに説明を付けて貰い、
自筆記事の中で、サンプルコードの前に置くための説明文を用意します。

##   試行1

ChatGPTに「コードの処理方法を説明」と聞いてみると、

ChatGPTの回答は、サンプルコードの前に加える説明文として利用できそうなレベルとなり、良好。要旨と関係のないコメント文は全て無視されていて、良好。
得られたChatGPTの生成文から、好ましい部分だけをかいつまんでつなげれば、十分支援機能として利用可。一から説明文を作り上げるよりも候補からかいつまむ方が断然楽。

**▼私(人間)**
下記のコードの処理方法を説明: 

```py
# -*- coding: utf-8 -*-

# subprocessで起動したプロセスのコンソール出力を取得・保存するには
# ref: https://www.it-swarm-ja.tech/ja/python/subprocesscall%EF%BC%88%EF%BC%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/968744582/

import subprocess

def main(): #   実行切替用
    run__main1()

# sec: コンソール出力を取得・保存

def run__main1():
    # 結果:
    # test.exeのコンソール出力保存可
    # test.batもコンソール出力保存可、.batも可
    
  # case: FAIL
    # subprocess.call("test.exe > res.log.txt")
    
  # case: Popen(.., stdout=..)を使用
    with open("res.log.txt", 'w') as file_log:
        proc = subprocess.Popen(
            ["test.bat"], 
            stdout=file_log, stderr=subprocess.PIPE) #   出力が必要な場合はstdout・stderr引数を利用
        proc.communicate() #   これで待機
    print("return code:", proc.returncode) #   DEBUG: 待機・終了確認用
  # case: end
    
    print("ended.")

# sec: entry

if __name__ == "__main__": main()
```

**▼ChatGPT(自動応答)**
このコードはPythonで書かれたプログラムで、外部プロセスを実行し、そのプロセスのコンソール出力を取得して保存する処理を行っています。

具体的な処理の説明は以下の通りです。

* run__main1関数: メインの処理が実行される関数です。

* subprocess.Popenを使用して、外部プロセスを起動します。このコードではtest.batを実行しています。subprocess.Popenは外部プロセスを実行するための関数であり、引数には実行するコマンドやコマンドライン引数などが指定されます。

* stdout引数を指定して、コンソール出力をファイルにリダイレクトして保存します。with open("res.log.txt", 'w') as file_logの部分は、res.log.txtというファイルを書き込みモードで開き、そのファイルオブジェクトをfile_logとして扱います。

* proc.communicate()を呼び出してプロセスの終了を待ちます。これは、外部プロセスが完了するまで待機するためのメソッドです。また、必要に応じてstdoutやstderrなどの出力を受け取ることもできますが、このコードでは行っていません。

* proc.returncodeを使用して、外部プロセスの終了コードを取得します。終了コードは通常、プロセスの実行が成功したかどうかを示す整数値です。

* 最後に、ended.というメッセージを表示して処理を終了します。

このプログラムは、test.batやtest.exeなどの外部プログラムを実行し、そのプログラムのコンソール出力をres.log.txtというファイルに保存します。また、プロセスの終了コードを確認することもできます。

##   試行2

サンプルコードの前に加える説明文は、あまり長いと好ましくないので、
もう少しコンパクトに、根幹部分だけに絞りたい、という条件を付けてみます。

ChatGPTの回答は、若干、短めになりましたが、やや長めの説明文となりました。

**▼私(人間)**
前記のコードの、根幹部分の処理方法だけを説明

**▼ChatGPT(自動応答)**
根幹部分の処理方法は、以下のようになります。

* subprocess.Popenを使用して、外部プロセスを起動します。このプロセスは、test.batというバッチファイルを実行するものです。

* with open("res.log.txt", 'w') as file_logを使用して、res.log.txtというファイルを書き込みモードで開きます。これにより、後続のプロセスのコンソール出力がこのファイルにリダイレクトされます。

* subprocess.Popenのstdout引数に、ファイルオブジェクト file_log を指定します。これにより、外部プロセスの標準出力がファイルに書き込まれます。

* proc.communicate()を呼び出して、外部プロセスの終了を待ちます。これにより、プロセスが完了するまで待機します。

* proc.returncodeを使用して、外部プロセスの終了コードを取得します。終了コードは、外部プロセスの実行が成功したかどうかを示す整数値です。

この部分の処理では、外部プロセスを起動し、そのプロセスのコンソール出力をファイルにリダイレクトして保存しています。プロセスの終了を待ち、終了コードを確認することで、プロセスの実行状態や成功/失敗の情報を取得します。

##   試行3

サンプルコードを自作した時に、重要動作となる部分にはコメントでポイントとなる説明を書いてあるので、自作のサンプルコードに付記したコメント部の内容を大いに反映するように条件を加えて、ChatGPTに聞いてみます。

ChatGPTの回答は、前回の試行2に比べると、若干、コメント部の言葉が増えており、より作者の意図を捉えた説明となり、良好。
説明文がやや長めなので、ChatGPTの生成文から、好ましい部分だけをかいつまんで、短い説明文となるようにつなげれば、十分支援機能として利用可。

**▼私(人間)**
前記のコードの、根幹部分の処理方法だけを説明、コメント部の内容を大いに反映

**▼ChatGPT(自動応答)**
このコードの根幹部分の処理は以下のようになります。

* subprocess.Popenを使用して、外部プロセスを実行します。このコードではtest.batというバッチファイルを実行しています。

* コンソール出力をファイルに保存するため、open関数を使用してres.log.txtというファイルを書き込みモードで開きます。

* subprocess.Popenの引数には、実行するコマンドや引数を指定します。stdout引数には、ファイルオブジェクトを指定して、外部プロセスの標準出力をファイルにリダイレクトします。stderr=subprocess.PIPEを指定することで、標準エラー出力は一時的にパイプに格納されます。

* proc.communicate()を呼び出して、外部プロセスの終了を待ちます。これにより、プロセスが完了するまで待機します。communicate()は、プロセスが標準出力と標準エラー出力を完全に出力し終えるまでブロックします。

* proc.returncodeを使用して、外部プロセスの終了コードを取得します。終了コードは、外部プロセスの実行が成功したかどうかを示す整数値です。通常、0は成功を示し、それ以外の値はエラーを示します。

* 最後に、"ended."というメッセージが表示されます。

この部分の処理では、外部プロセスを実行し、そのコンソール出力をファイルに保存します。プロセスの終了を待ち、終了コードを確認することで、プロセスの実行状態や成功/失敗の情報を取得します。

##   試行4

箇条書きの条件を加えて、ChatGPTに聞いてみます。

ChatGPTの回答は、かなり短く端的な表現にまとまり、より短い説明文がほしい場合に、良好。

**▼私(人間)**
前記のコードの、根幹部分の処理方法だけを説明、コメント部の内容を大いに反映、体言止めで箇条書き、5個以内

**▼ChatGPT(自動応答)**
このコードの根幹部分の処理は以下の通りです。

* subprocess.Popenで外部プロセスを起動。
* コンソール出力をファイルに保存。
* 外部プロセスの標準出力をファイルにリダイレクト。
* 標準エラー出力を一時的にパイプに格納。
* proc.communicate()でプロセスの終了を待機。

この処理では、外部プロセスを起動し、そのコンソール出力をファイルに保存します。プロセスの終了を待ち、終了コードを取得することで、プロセスの実行状態と結果を確認します。

##   試行5

前回の試行4と全く同じ質問内容で、ただ順序だけを変えて「コメント部の内容を大いに反映」を一番最後に書いて、ChatGPTに聞いてみます。

ChatGPTの回答は、箇条書き5個以内の条件を満たさなくなり、前回よりもやや長めの箇条書きの説明文となりました。一番最後に書いた「コメント部の内容を大いに反映」の条件を最も重視している模様で、これを重視したら「5個以内」の条件は満たせなくなったということでしょうか。一番最後に書いた条件を最も重視する優先度があるようです。

**▼私(人間)**
上記のコードの、根幹部分の処理方法だけを説明、体言止めで箇条書き、5個以内、コメント部の内容を大いに反映

**▼ChatGPT(自動応答)**
このコードの根幹部分の処理は以下の通りです。

* 外部プロセスを起動するためのsubprocess.Popenを使用。
* コンソール出力をファイルに保存するため、res.log.txtを開く。
* 外部プロセスの標準出力をファイルにリダイレクトするため、stdout引数を指定。
* 標準エラー出力を一時的にパイプに格納するため、stderr=subprocess.PIPEを指定。
* proc.communicate()を使用してプロセスの終了を待機。
* proc.returncodeを使用してプロセスの終了コードを取得。
* 最後に"ended."と表示される。

この部分の処理では、外部プロセスを起動し、そのプロセスのコンソール出力をファイルに保存します。プロセスの終了を待機し、終了コードを取得することで、プロセスの実行状態や結果を確認します。

##   ChatGPTの生成文からコードの説明文を作成 (※①)

上記で得られたChatGPTの生成文から、好ましい部分を手動でピックアップして、コードの説明文を作成してみると、

ChatGPTの生成文から好ましい部分をピックアップして整形:

* subprocess.Popenを使用して、外部プロセスを実行。
* subprocess.Popenのstdout引数には、ファイルオブジェクトを指定、外部プロセスの標準出力をファイルにリダイレクト。
* stderr=subprocess.PIPEを指定し、標準エラー出力をパイプに格納。
* proc.communicate()を呼び出して、外部プロセスの終了を待機。communicate()は、プロセスが標準出力と標準エラー出力を完全に出力し終えるまでブロック。


#   ②「はじめに」章の文章候補を生成

このサンプルコードの記事の「はじめに」章の内容を作成する時に、利用できそうな文章候補を生成してみます。

##   試行1

「はじめに」章には、記事内容の導入として、処理方法の概要を短い説明で表したものがほしいので、文字数の条件を加えて、ChatGPTに聞いてみます。

ChatGPTの回答は、概要を適切に表すようなものになり、記事内容の導入部分として利用可。

**▼私(人間)**
前記のコードの、根幹部分の処理方法だけを説明、200字以内

**▼ChatGPT(自動応答)**
このコードの根幹部分では、subprocess.Popenを使用して外部プロセスを起動し、test.batというバッチファイルを実行します。コンソール出力はres.log.txtというファイルにリダイレクトされ、proc.communicate()によってプロセスの終了を待ちます。最後に、proc.returncodeを使用して外部プロセスの終了コードを取得します。これにより、外部プロセスの実行状態と結果を確認できます。

##   試行2

「はじめに」章には、「何についての記事なのか」「何が出来るようになるのか」を短く記載したいので、下記のように「何が出来るようになるのかの説明」という条件を加えて、ChatGPTに聞いてみます。

ChatGPTの回答は、記事内容を読みたくなる魅力を表すようなものになり、記事内容の導入部分として利用可。

**▼私(人間)**
前記のコードで、何が出来るようになるのかの説明、200字以内

**▼ChatGPT(自動応答)**
このコードを使用することで、外部プロセスを起動し、そのプロセスのコンソール出力をファイルに保存することができます。これにより、外部プログラムの実行結果やエラーメッセージなどを取得し、後続の処理やデバッグに活用することができます。また、Popenを使用することで非同期的にプロセスを実行し、待機しながら出力をリダイレクトできます。このようなプロセスの制御と出力の取得は、自動化やバッチ処理、ログの取得など、様々なシナリオで役立つでしょう。

##   ChatGPTの生成文から「はじめに」章の文章を作成 (※②)

上記で得られたChatGPTの生成文から、好ましい部分を手動でピックアップして、「はじめに」章の内容を作成してみると、

ChatGPTの生成文から好ましい部分をピックアップして整形:

subprocess.Popenを使用して外部プロセスを起動し、コンソール出力をテキストファイルにリダイレクト、proc.communicate()によりプロセスの終了を待機するコードサンプル。
外部プログラムの実行結果やエラーメッセージなどを取得し、自動化やバッチ処理・ログの取得等に活用することが出来ます。

#   ③キーワード(タグ)の候補を作成

このサンプルコードの記事のキーワード(タグ)を決める時に、利用できそうな候補を生成してみます。

##   試行1

ChatGPTの回答は、そのままQiita記事のタグ名としては利用しにくい印象。結果を参考にして、タグぐらいは、自分で手動で付けることにします。

**▼私(人間)**
前記のコードの、根幹部分の処理に、キーワード(タグ)を付与、5個

**▼ChatGPT(自動応答)**
根幹部分の処理に関連するキーワードタグの候補は以下の通りです:

* subprocess.Popen
* 外部プロセス
* コンソール出力
* ファイルリダイレクト
* 終了コード

##   試行2

参考に、英字でも出力してみると、

**▼私(人間)**
前記のコードの、根幹部分の処理に、キーワード(タグ)を付与、英字専門用語、5個

**▼ChatGPT(自動応答)**
根幹部分の処理に関連するキーワード(タグ)の候補（英字専門用語）は以下の通りです:

* subprocess.Popen
* External process execution
* Console output redirection
* File manipulation
* Exit code retrieval

##   試行3

質問の仕方を変えて、「処理の流れ」を「キーワード」にする形で聞いてみると、

ChatGPTの回答は、このサンプルコードに目次を付けたようなものになりました。

**▼私(人間)**
上記のコードの、根幹部分の処理の流れを、汎用的なキーワードで箇条書き

**▼ChatGPT(自動応答)**
* 外部プロセスの起動と制御
* ファイルのオープンとリダイレクト
* プロセスの同期と待機
* 終了コードの取得と表示
* エントリーポイントの設定

これにより、外部プロセスの起動やファイルの操作、プロセスの同期待機、終了コードの取得と表示、そしてエントリーポイントの設定などの処理が行われます。

##   ChatGPTの生成文からキーワードを作成 (※③)

上記で得られたChatGPTの生成文から、好ましい部分を手動でピックアップして(若しくはヒントを得て自作)、記事に付与するキーワード(タグ)を作成してみると、

ChatGPTの生成文から好ましい部分をピックアップして整形:

キーワード: subprocess.Popen、外部プロセス実行、標準出力リダイレクト

#   最終的な記事を作成

前章までの、※①・※②・※③が付いた各章でまとめた結果をつなげて、得られたChatGPTの生成文から記事全体を作成すると、

**「はじめに」章:**

↓(※②)
subprocess.Popenを使用して外部プロセスを起動し、コンソール出力をテキストファイルにリダイレクト、proc.communicate()によりプロセスの終了を待機するコードサンプル。
外部プログラムの実行結果やエラーメッセージなどを取得し、自動化やバッチ処理・ログの取得等に活用することが出来ます。

↓(※③)
キーワード: subprocess.Popen、外部プロセス実行、標準出力リダイレクト

**「処理方法」章:**

* ↓(※①)
* subprocess.Popenを使用して、外部プロセスを実行。
* **subprocess.Popenのstdout引数には、ファイルオブジェクトを指定、外部プロセスの標準出力をファイルにリダイレクト**。
* stderr=subprocess.PIPEを指定し、標準エラー出力をパイプに格納。
* **proc.communicate()を呼び出して、外部プロセスの終了を待機**。communicate()は、プロセスが標準出力と標準エラー出力を完全に出力し終えるまでブロック。

**「サンプルコード」章:**

(ここにサンプルコードをそのまま貼付け、再掲は省略)

#   ChatGPTを使ってサンプルコードの記事を作成する方法まとめ

ChatGPTに、サンプルコードの説明を付ける作業を支援して貰い、記事作成の支援としてChatGPTを使う(前章までの試行の)手順をまとめると、

ChatGPTを使ってサンプルコードの記事を作成する方法まとめ: 

**①サンプルコードに付け加える説明文の文章候補を生成**
　↓
ChatGPTへ下記の形式で質問: 
* ChatGPTへの質問: 前記のコードの、根幹部分の処理方法だけを説明、コメント部の内容を大いに反映
* ChatGPTへの質問: 前記のコードの、根幹部分の処理方法だけを説明、コメント部の内容を大いに反映、体言止めで箇条書き、5個以内

　↓
得られたChatGPTの生成文から、好ましい部分を手動でピックアップして、コードの説明文を作成(※①)
　↓
**②「はじめに」章の文章候補を生成**
　↓
ChatGPTへ下記の形式で質問: 
* 前記のコードの、根幹部分の処理方法だけを説明、200字以内
* 前記のコードで、何が出来るようになるのかの説明、200字以内

　↓
得られたChatGPTの生成文から、好ましい部分を手動でピックアップして、「はじめに」章の内容を作成(※②)
　↓
**③キーワード(タグ)の候補を作成**
　↓
ChatGPTへ下記の形式で質問: 
* 前記のコードの、根幹部分の処理に、キーワード(タグ)を付与、5個

　↓
得られたChatGPTの生成文から、好ましい部分を手動でピックアップして、記事に付与するキーワード(タグ)を作成(※③)
　↓
**前記の、※①・※②・※③をつなげて、記事全体を作成**

「はじめに」章:

(※②)をここに配置

キーワード: (※③)をここに配置

「処理方法」章:

(※①)をここに配置

「サンプルコード」章:

(ここにサンプルコードをそのまま配置)


#   参考

##   ChatGPTの始め方

記事: 【無料】チャットGPTの始め方を解説！

https://www.minotake-gadget.net/chatgpt-howto/

##   ChatGPTバージョン

ChatGPT May 24 Version. Free Research Preview. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8927efa6-bc0d-3315-3b63-f6ae52077f15.png)

##   Phindを使ってサンプルコードの記事を作成

ChatGPTでなくPhindを記事作成の支援機能として利用してみる内容は、別途下記にあります。

https://qiita.com/dl_from_scratch/items/db0284aed09c3cbfd587