📌

GitHub Copilot Chatを触って見ました

2024/01/26に公開

はじめに

vmstatを描画できるようにしようという話がすこしあったのでGitHub Copilotを使ったらどうなるのか検証してみました。

今回はVSCode上でGitHub Copilotを使っています。

ソースコード生成

まずはGitHub Copilot Chatを通じて欲しいプログラムを生成してもらいます。

■生成結果

import subprocess
import re
import matplotlib.pyplot as plt

def generate_vmstat_graph():
    # Run vmstat command and capture output
    output = subprocess.check_output(['vmstat', '1', '10']).decode('utf-8')

    # Extract metrics from output
    lines = output.strip().split('\n')
    headers = re.split(r'\s+', lines[1].strip())
    data = [re.split(r'\s+', line.strip()) for line in lines[2:]]

    # Convert metrics to numeric values
    metrics = {}
    for i, header in enumerate(headers):
        metrics[header] = [int(row[i]) for row in data]

    # Plot metrics
    plt.figure(figsize=(10, 6))
    for header, values in metrics.items():
        plt.plot(values, label=header)
    plt.legend()
    plt.xlabel('Time (seconds)')
    plt.ylabel('Value')
    plt.title('vmstat Metrics')
    plt.savefig('vmstat_graph.png')
    plt.show()

generate_vmstat_graph()

コードの説明

生成してもらったコードが何をしているのかわからないので説明してもらいます。
VSCodeでソースを選択して説明をしてもらいます。

■生成された説明

選択されたコードは、vmstatコマンドの出力を取得し、その結果をグラフ化するPythonスクリプトです。具体的な動作は以下の通りです。

まず、subprocess.check_output(['vmstat', '1', '10']).decode('utf-8')により、vmstatコマンドを実行し、その出力を取得します。ここで、vmstat 1 10は、1秒間隔で10回システムの状態を取得することを意味します。

次に、取得した出力を行ごとに分割し、各行をさらにスペースで分割してデータを抽出します。これにより、vmstatの出力がPythonのリストとして扱えるようになります。

その後、enumerate関数を使用して、各メトリクス(ヘッダー)とそれに対応する値を抽出し、辞書に格納します。この辞書では、ヘッダーがキー、対応する値のリストが値となります。ここで、int(row[i])を使用して、文字列形式の値を整数に変換しています。

最後に、matplotlibを使用して、取得した各メトリクスをグラフ化します。各メトリクスは別々のラインとしてプロットされ、legend関数により凡例が表示されます。また、xlabel、ylabel、title関数により、グラフの軸ラベルとタイトルが設定されます。最終的なグラフはvmstat_graph.pngという名前の画像ファイルとして保存され、show関数により画面に表示されます。

このスクリプトは、システムのパフォーマンスを視覚的に把握するためのツールとして役立ちます。

それっぽい説明が返ってきます。

動くのか確認

AWS Cloud Shallで動くかどうか実験します。
運良く今回のスクリプトは問題なく動きました。

生成された画像

全部の要素の値が混ざって見づらいですがそれっぽいものが完成しています。

感想

  • VS Code上でコードの生成や説明をしてもらえるのは嬉しい。
    • Webブラウザに遷移してコピペするという面倒くさい作業が不要になります。
  • 説明が日本語で出力してくれて助かる。
  • 生成したコードが一発で動作が正常に完了して驚いた。
    • 今回は一発で動きましたが、この記事を書く前にお試しで何回か生成したコードは動かなかったです。
    • Chatへの指示が良かったのかもしれません。

おまけ

コードの修正も依頼できるので、vmstatの要素を分解して行がしてくれるように依頼すると以下のようなコードとグラフの画像ができました。(ここの指示は何回か試行錯誤が必要でした。)

import subprocess
import re
import matplotlib.pyplot as plt

def generate_vmstat_graph():
    # Run vmstat command and capture output
    output = subprocess.check_output(['vmstat', '1', '10']).decode('utf-8')

    # Extract metrics from output
    lines = output.strip().split('\n')
    headers = re.split(r'\s+', lines[1].strip())
    data = [re.split(r'\s+', line.strip()) for line in lines[2:]]

    # Convert metrics to numeric values
    metrics = {}
    for i, header in enumerate(headers):
        metrics[header] = [int(row[i]) for row in data]

    # Plot metrics
    plt.figure(figsize=(10, 6))
    num_metrics = len(metrics)
    num_rows = num_metrics // 2 + num_metrics % 2
    num_cols = 2
    for i, (header, values) in enumerate(metrics.items()):
        plt.subplot(num_rows, num_cols, i+1)
        plt.plot(values)
        plt.title(header)
        plt.xlabel('Time (seconds)')
        plt.ylabel('Value')

    plt.tight_layout()
    plt.savefig('vmstat_graph.png')
    plt.show()

generate_vmstat_graph()

Discussion