Amazon Q を使用するまで

経緯

遅ればせながら、個人でバイブコーディングするとしたらどういう方法が良いか……ということで、プログラミング支援AIサービス関係について調べてみました。

ざっと見た感じですと、 Amazon Q Developer (旧 AWS CodeWhisperer), Codeium (Codeium Windsurf), llama.vscode, Continue 辺りが手軽に試せそうな雰囲気に感じられました。

Continue は自前で環境を作らないといけないのでお手軽感が薄いですが、逆に他はクラウドなのでデータの流出等を気にしないといけないのでトレードオフといいますか……。

ベンダーの知名度なども鑑みて、とりあえずならば Amazon Q Developer が最も検証しやすそうと感じました。

準備・設定

まずは VSCode から拡張機能で Amazon Q を検索、インストールします。

インストールが完了するとサイドバーにロゴが出現するので、そのロゴをクリックします。

「Personal account」を選択して「Continue」ボタンをクリック
「Personal account」を選択して「Continue」ボタンをクリック

今回は検証なので「Personal account」を選択して「Continue」ボタンをクリックします。

外部サイトを開く許可を求められるので開く
外部サイトを開く許可を求められるので開く

外部サイトを開く許可を求められるので開きます。

「Sign up with Builder ID」ボタンをクリックしてアカウント作成へ
「Sign up with Builder ID」ボタンをクリックしてアカウント作成へ

しかし、サインアップ画面が分かりづらかったため https://builder.aws.com/start へ直接アクセスしました。

「Sign up with Builder ID」ボタンをクリックしてアカウント作成へ進みます。

ちなみに AWS Builder ID はクレジットカードなどの登録なしで AWSアカウント が作成できる個人向けのアカウント (無論、機能制限はある) とのことです。

ID、パスワードを決めてアカウント作成 (サインアップ) します。

VSCode へのアクセスを許可するかどうか求められたので許可
VSCode へのアクセスを許可するかどうか求められたので許可

VSCode 側で Amazon Q がずっとリクエスト完了待機していたからか、 VSCode へのアクセスを許可するかどうか求められたので許可します。

許可完了
許可完了

許可完了です。

サインインもできていることを確認
サインインもできていることを確認

サインインもできていることが確認できました。

VSCode 上でも Amazon Q のチャットができるようになった
VSCode 上でも Amazon Q のチャットができるようになった

VSCode 上でも Amazon Q のチャットができるようになりました。

検証

試しに以下の内容をチャットに聞いてみました。

以下の正規表現を用いて、変則的な Syslog のフォーマットを解析する PHP のコードを記述してください。
特に、 Priority から Facility と Severity を逆算する部分は、正規表現中の `<([\d]{1,3})>` の部分の値を使用してください。

```
"([\d]{4}\/[\d]{2}\/[\d]{2}\s[\d]{2}:[\d]{2}:[\d]{2}\s\+[\d]{4})","<([\d]{1,3})>((\[[\w\d\s\-:]+\])\s([\w\d\s\-_\.\(\)]+:\s[\w\d\s\-_\.\(\)]+:\s([\w\d\s\-_\.\(\):]+))|(\[[\w\d\s\-:]+\])\s([\w\d\s\-_\.\(\)]+:\s[\w\d\s\-_\.\(\)=,:\[\]]+))"
```

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

コード (syslog_parser.php)

<?php

function parseSyslog($logLine) {
    $pattern = '/"([\d]{4}\/[\d]{2}\/[\d]{2}\s[\d]{2}:[\d]{2}:[\d]{2}\s\+[\d]{4})","<([\d]{1,3})>((\[[\w\d\s\-:]+\])\s([\w\d\s\-_\.\(\)]+:\s[\w\d\s\-_\.\(\)]+:\s([\w\d\s\-_\.\(\):]+))|(\[[\w\d\s\-:]+\])\s([\w\d\s\-_\.\(\)]+:\s[\w\d\s\-_\.\(\)=,:\[\]]+))"/';

    if (preg_match($pattern, $logLine, $matches)) {
        $timestamp = $matches[1];
        $priority = (int)$matches[2];

        // Priority から Facility と Severity を逆算
        $facility = $priority >> 3;
        $severity = $priority & 7;

        $message = isset($matches[3]) ? $matches[3] : '';

        return [
            'timestamp' => $timestamp,
            'priority' => $priority,
            'facility' => $facility,
            'severity' => $severity,
            'message' => $message
        ];
    }

    return false;
}

// 使用例
$sampleLog = '"2024/01/15 10:30:45 +0900","<134>[kernel: network] eth0: link up: 1000Mbps full duplex"';
$result = parseSyslog($sampleLog);

if ($result) {
    echo "Timestamp: " . $result['timestamp'] . "\n";
    echo "Priority: " . $result['priority'] . "\n";
    echo "Facility: " . $result['facility'] . "\n";
    echo "Severity: " . $result['severity'] . "\n";
    echo "Message: " . $result['message'] . "\n";
}

?>

実行した結果は以下の通りです。

サンプルコードの実行結果
サンプルコードの実行結果
> php .\syslog_parser.php
Timestamp: 2024/01/15 10:30:45 +0900
Priority: 134
Facility: 16
Severity: 6
Message: [kernel: network] eth0: link up: 1000Mbps full duplex

おお……ちゃんと <> で囲まれた数値を Syslog の Priority として、 Severity と Facility を計算 ( Priority = Facility * 8 + Severity )して出力していますね……賢い……。

コア部分(今回は解析処理、特に正規表現)はこちらで組んだものだったので、後は入出力・UI的な肉付けの部分だけだったのですが、ちゃんと使えますね。

使い捨てのスニペットレベルや、本来処理させたいメイン部分ではなく今回のようなサブの部分を任せる、と言うのであれば行けるかもしれません。

参考

コーディングアシスタント比較

Amazon Q

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。