🐒

Github Copilotを使ってみた

2023/02/23に公開

2023年はAI元年かもしれないということで、GitHub Copilotを導入してみた。
https://github.com/features/copilot

Visual Studio Codeに導入したが、導入方法は極めて簡単なので割愛する。

別途スクラップの方に書いているDenoでマストドンに投稿する簡単なスクリプトがある。
https://zenn.dev/masat/scraps/5e55b6a0d32a98

typescriptは、ほぼ初めてだし、自分自身プログラミングのセンスがあるわけでもないので、
自分のコードを校正したり、生成するのに手助けしてくれたりすると素晴らしいかもと導入した。
自分で書いたコードを再掲する。

import { login } from 'npm:masto';
import { parseFeed } from 'https://deno.land/x/rss/mod.ts';

//ランダムな整数を得る
function getRandomInt(max) {
  return Math.floor(Math.random() * max);
};

const masto = await login({
  url: 'mastodonインスタンスのURL',
  accessToken: 'アクセストークン',
});

//RSSを読み込む
const response = await fetch(
  'https://deno.com/feed',
);
const xml = await response.text();
const { entries } = await parseFeed(xml);

  //直近5件のうちの2件をランダムにtoot
for (let index = 0; index < 2; index++) {

  const randamnumber = getRandomInt(5);

  const title = entries[randamnumber].title.value;
  const link = entries[randamnumber].links[0].href;
  const toot = title + '\n' + link;  

  const s: mastodon.v1.Status = await masto.v1.statuses.create({
    status: toot,
    visibility: 'unlisted',
  });

}

これをコメントを残して、上から順にcopilotに提案してもらいつつ書き換えていった。
提案してもらう過程でコメントはよりわかりやすく?書き換えながら提案してもらった。
その結果は、以下の通り

//mastodonのAPIを使って、RSSのタイトルとリンクを投稿するbot
import { login } from 'npm:masto';
import { parseFeed } from 'https://deno.land/x/rss@0.5.7/mod.ts';

//ランダムな数を返す関数
function getRandomInt(max: number): number {
  return Math.floor(Math.random() * max);
}

//Mastodonにログイン
const masto: Mastodon = await login({
  url: 'mastodonインスタンスのURL',
  accessToken: 'アクセストークン',
});

//https://deno.com/feedからRSSを取得
const response: Response = await fetch(
  'https://deno.com/feed',
);

//RSSをパース
const { entries } = await parseFeed(await response.text());

//RSSのタイトルとリンクを取得してランダムに3件投稿
for (let i = 0; i < 3; i++) {
  const index: number = getRandomInt(entries.length);
  const title: string = entries[index].title.value;
  const link: string = entries[index].links[0].href;

  await masto.v1.statuses.create({
    status: title + '\n' + link,
    visibility: 'unlisted',
  });
}

//自分のタイムラインを取得して表示
const timeline: Mastodon.Status[] = await masto.v1.timelines.home.get();
console.log(timeline);

型も書いてくれて、よりわかりやすく、綺麗なコードになったように思う。
ただ全部提案のままではなくて、ところどころ自分で直す必要はあった。

・npmをimportする部分は、deno.landからmod.tsをimportするよう提案してくるが、それは失敗する(自分で書いた時も少しハマった部分)
・投稿する部分は、動かないコードを提案してくるので、自分で調べたメソッドに書き換えた。
・同じくタイムラインを取得する部分を追加したが、このコードは動かない。importしたライブラリを解析してくれたらいいのにと思う。せめてメソッドを一覧で提案してほしい。(参考のためそのままにしてある。あとで自分で調べます。)

使いこなすためには、コメントにやりたいことをわかりやすく書くこと(英語だとなお良い?)
が必要だと思います。
これでより早く綺麗なコードが書けそうです。自分でも実感する未来を感じる技術ですね。

Discussion

Hidden comment