github copilot事始め

# まずは登録をしよう

このページに全て書いてあるので割愛。
海外の住所入力フォームに戸惑ったので参考ページを貼っておきます。

https://docs.github.com/ja/copilot/quickstart

https://english-club.jp/blog/english-address/

# vscodeのプラグインを入れよう　

vscodeを起動して Extensions から GitHub Colilot をインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/394427be-b8a0-7811-eab0-146324a46154.png)

しばらくすると右下にこのようなポップアップが表示されるので、`Sign in to GitHub`ボタンをクリックしてサインイン。
ポップアップが出ない時は左下の人マークから`Sign in with GitHub ....`をクリックでもサインイン出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/d355273b-59f2-4486-41bd-03a3695d97ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/a43d3d41-7c75-0e4d-50e5-20dac00e265e.png)

vscode左下にgithub copilotのアイコンが表示されていれば準備完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/894f4c1d-8276-ea65-8b6b-2d174a8f3fc4.png)

# 実際に使ってみよう

## コメントして自動でコードを生成してもらう

サンプルとして、k-meansアルゴリズムでクラスタリングしてみた。
k-means.pyファイルを作成し、冒頭にコメントを記載。
その後はtabを押してcopilotの提案を受け入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/47086ee2-24e2-b314-d6f4-656881f365d7.png)

生成されたコードがこちら。

``` python 
# 2次元空間上の点をk-meansアルゴリズムでクラスタリングするプログラム
# 結果は色分けして表示する

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 乱数を固定値で初期化
np.random.seed(0)

# 2次元空間上にランダムに点を生成
X = np.random.randn(100, 2)

# k-meansアルゴリズムでクラスタリング
km = KMeans(n_clusters=3, init='random', n_init=10, max_iter=300, tol=1e-04, random_state=0)
y_km = km.fit_predict(X)

# クラスタリング結果を表示
plt.scatter(X[y_km==0, 0], X[y_km==0, 1], s=50, c='lightgreen', marker='s', label='cluster 1')
plt.scatter(X[y_km==1, 0], X[y_km==1, 1], s=50, c='orange', marker='o', label='cluster 2')
plt.scatter(X[y_km==2, 0], X[y_km==2, 1], s=50, c='lightblue', marker='v', label='cluster 3')
plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=250, marker='*', c='red', label='centroids')
plt.legend()
plt.grid()
plt.show()
```

結果はこちら。
完璧！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/89f9fcb2-775c-395c-f37b-ca0fb3ed3d18.png)

補足：　copilot君が考え中は右下のcopilotのアイコンがくるくる回る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/0ddf525a-5c24-54ad-85ab-2770c4a59136.png)

## コードのドキュメントを書いてもらう

このコードの説明を書いてもらう。

``` python
def fizzbuzz(num):
    if num % 3 == 0 and num % 5 == 0:
        return "FizzBuzz"
    elif num % 3 == 0:
        return "Fizz"
    elif num % 5 == 0:
        return "Buzz"
    else:
        return num
```


ドキュメントを書いてほしい関数を選択して、`/doc` を入力すると、いい感じに描いてくれる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/080d68fd-d38e-bf23-e719-5c5273a2decc.png)

## テストを書いてもらう

テストを書いてほしい関数を選択して　`/test`を入力すると、別ファイルにテストコードを書いてくれる。

```python
# BEGIN: 8f7e6d5c7b3a
import unittest
from fizzbuzz import fizzbuzz

class TestFizzBuzz(unittest.TestCase):
    def test_fizz(self):
        self.assertEqual(fizzbuzz(3), "Fizz")
        self.assertEqual(fizzbuzz(6), "Fizz")
        self.assertEqual(fizzbuzz(9), "Fizz")
    
    def test_buzz(self):
        self.assertEqual(fizzbuzz(5), "Buzz")
        self.assertEqual(fizzbuzz(10), "Buzz")
        self.assertEqual(fizzbuzz(20), "Buzz")
    
    def test_fizzbuzz(self):
        self.assertEqual(fizzbuzz(15), "FizzBuzz")
        self.assertEqual(fizzbuzz(30), "FizzBuzz")
        self.assertEqual(fizzbuzz(45), "FizzBuzz")
    
    def test_number(self):
        self.assertEqual(fizzbuzz(1), 1)
        self.assertEqual(fizzbuzz(7), 7)
        self.assertEqual(fizzbuzz(13), 13)

if __name__ == '__main__':
    unittest.main()
# END: 8f7e6d5c7b3a
```

ちゃんとできてる。

# まとめ

+ コード生成力は高い印象を受けた
+ 日本語は弱め？
+ ただコードが書ける人は淘汰されて行くのだろう。。。