Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Blog::kobaken

prove t/foo/bar/baz.t

ClaudeでPerlのコードを生成する / きのこカンファレンスの前夜祭で登壇しました

きのこカンファレンスの前夜祭で、 わいとんさんと、Perlの生きのこりと題して、登壇しました。内容は、1990年頃のPerlCGIから、2025年現在までの歴史を駆け上がり、ClaudeでPerlのコードを生成する内容です。貴重な機会をいただき、ありがとうございました!

ここではClaudeによるPerlコード生成に関して、落ち穂拾いしたいと思います。

speakerdeck.com

github.com


Claudeは、Anthropic社によって開発された生成AIツールです。登壇では、Claude Desktopを利用して、インターネット掲示板に更新、削除のAPIを生やすデモをしました。プロンプトは以下の通りです。(正確には、この用意したプロンプトと違ったプロンプトを投げていたことに登壇後に気づき、焦りました😇 本来お見せしたかったものを共有します。)

このプロンプトを投げ込むと期待通り、自分の好みのスタイルでインターネット掲示板に更新、削除のAPIを生やすことができます。

## 重要
- あなたは、ユーザーから与えられた役割でふるまい、問題解決を行う責務があります。
- どの役割であっても、次のふるまいが期待されます。
    1. 問題を整理し、問題の認識をユーザーと揃える
    2. 問題解決の段取りをユーザーに提示する
    3. 結果のサマリーを報告する
    4. **重要** 2回試行錯誤して解決できない場合、ユーザーに相談する

## 言語
- 全てのやりとりは、プロンプトで利用された言語を用いてください。

## 前提知識
`filesystem` または `fetch` を利用して、次の内容を**必ず**理解して、作業を開始してください。
* 開発者の役割について https://github.com/kfly8/myai/blob/main/role/developer.md
* Perlについて https://github.com/kfly8/myai/blob/main/knowledge/perl.md

---

上記の指示に従い、次を行ってください。
- 役割: 開発者
- 作業ディレクトリ: /Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server
- やること:
  - /Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server を参考にして、BBSのAPIサーバーを作成してください。
  - 既存のAPI仕様は、/Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server/openapi.yaml に記載されています。
  - これに、次のAPIを追加してください。
    - PUT /api/post/:id
    - DELETE /api/post/:id

この再現には、作業ディレクトリのファイル編集やインターネット検索の能力が必要です。技術的には、MCP(Model Context Protocol)の設定が必要です。MCPとは大規模言語モデル(LLM)に複雑なことを指せるプロトコルで、感覚的には、LLMが頭脳だとしたら、MCPはLLMに手足を生やす技術です。Claude Desktopにはこんな設定をしています。→ myai/claude_desktop_config.json at main · kfly8/myai · GitHub

あと、Claude Desktopは、従量課金ではなく定額固定料金なのも嬉しいところです。もちろん無料プランもあるので気軽に試せるんじゃないかと思います。


プロンプトの解説を簡単にします。

プロンプトの前半は、システムプロンプトとして使いまわしていて、仕事の基本的な進め方、役割、技術知識を与えています。

今回の掲示板にAPIを生やす仕事では、次のような開発者の役割を与えています。役割を設定する狙いは、出力の精度を上げたいのはもちろんですが、指示をしたユーザーが確認しやすい状況を作ることも狙っています。

## 開発者

- あなたは経験豊富なシニアソフトエンジニアです
- ユーザーの要求を理解し、それを実装する責務があります

### 期待するふるまい

- 業務知識や規約を作業ディレクトリから探して理解する
- 作業用のブランチを用意する
- ユーザー要求に応じたユニットテストを書く
- ユニットテストを通すコードを書く
- 関連するドキュメントを更新する

システムプロンプトで与えた技術知識は、LLMが既にだいたいの知識を持っているので、主に自分好みのコーディングスタイルを伝えました。同じ結果を得るのにいろんな書き方があるので、その中でどれが良いか、どれが良くないか指示します。例えば、Perlに制約を与えるために、strict, warningsプラグマではなく、v5.40 を利用するように明記しました。

AIに自分の好みを一発で指示できないので、期待と違う出力が出てきたら都度知識のドキュメントを調整します。高速で新人のオンボーディングの改善を回している感覚です。

## コーディングスタイル

- プラグマは、v5.40を利用する
- utf8を利用する
- subroutine signaturesを利用する
- パッケージの最後の行に1;の記載は不要

// Good
package MyModule;
use v5.40;
use utf8;

sub add($x, $y) {
    return $x + $y;
}

// Bad
package MyModule;
use strict;
use warnings;
use utf8;

sub add {
    my ($x, $y) = @_;
    return $x + $y;
}

1;

ユーザープロンプトに関しては、役割と作業ディレクトリといった基本的な期待と仕事内容を伝えました。BBSにAPIを生やす程度であれば、上記のようなシステムプロンプトが無くてもやってくれますが、出力精度向上、確認のしやすさのためにシステムプロンプトは利用しています。

- 役割: 開発者
- 作業ディレクトリ: /Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server
  - /Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server を参考にして、BBSのAPIサーバーを作成してください。
  - 既存のAPI仕様は、/Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server/openapi.yaml に記載されています。
  - これに、次のAPIを追加してください。
    - PUT /api/post/:id
    - DELETE /api/post/:id

そんなこんなで、こんなアウトプットが出てきました。

まず、問題の整理をしてもらっています。

了解しました。開発者の役割に基づいて、BBSのAPIサーバーを拡張し、PUT /api/post/:id と DELETE /api/post/:id の機能を追加します。まずは前提知識を確認し、問題を整理していきます。

View result from fetch from fetch (local)
{
  `url`: `https://github.com/kfly8/myai/blob/main/role/developer.md`
}
(中略:前提知識を取得している)
---

これで問題の概要をつかむことができました。では、問題を整理していきます。

## 問題の整理

1. BBSのAPIサーバーを拡張する必要があります
2. 既存のAPIは /api/post への GET と POST リクエストを処理
3. 新たに追加すべきAPIは:
  - PUT /api/post/:id - 投稿更新
  - DELETE /api/post/:id - 投稿削除
4. サーバーはMojolicious::Liteで実装され、OpenAPI仕様に準拠

## 作業の段取り

1. 作業ブランチを作成する
2. OpenAPI仕様(openapi.yaml)にPUTとDELETEの定義を追加する
3. Database.pmにupdate_postとdelete_post機能を実装する
4. bbs.psgiにPUTとDELETEのルートハンドラを追加する

次はガンガン作業をしています。

それでは順番に作業を進めていきましょう。

## 1. 作業ブランチの作成

View result from run_command from mcp-server-commands (local)
{
  `command`: `cd /Users/kfly8/src/github.com/kfly8/kinoko2025/step8-SSR/api-server && git checkout -b add-update-delete-api`
}

## 2. OpenAPI仕様にPUTとDELETEの定義を追加
まずはOpenAPI仕様に新たなエンドポイントの定義を追加します。

(中略:openapi.yamlを更新した)

先ほど作成した OpenAPI 仕様をファイルに保存します。

## 3. Database.pmにupdate_postとdelete_post機能を実装

Database.pmを更新して、投稿の更新と削除のメソッドを追加します。
(中略:lib/Kinoko/Database.pmを編集した)

4. bbs.psgiにPUTとDELETEのルートハンドラを追加
次に、bbs.psgiを更新して新しいルートハンドラを追加します。

(中略:bbs.psgiを編集した)

最後に作業報告です。

## サマリー
### 1. 問題の整理

- BBSのAPIサーバーを拡張する必要がありました
- 新たに追加するAPIは:
  - PUT /api/post/:id - 投稿更新API
  - DELETE /api/post/:id - 投稿削除API

### 2. 実装内容

1. OpenAPI仕様を更新
   - /api/post/{id} エンドポイントを定義
   - PUT, DELETEメソッドの仕様を追加
   - エラーレスポンスや成功レスポンスの定義を追加
2. Database.pmに機能追加
   - update_post メソッドを実装:投稿の更新機能
   - delete_post メソッドを実装:投稿の削除機能
3. bbs.psgiにルートハンドラを追加
   - PUT /api/post/:id ハンドラの実装
   - DELETE /api/post/:id ハンドラの実装
   - 404エラーの適切な処理

### 3. 実装のポイント

- 存在しない投稿へのリクエストには404エラーを返す
- 投稿更新時は、提供されたフィールドのみを更新する
- 投稿削除後は成功メッセージを返す
- すべての機能は既存のデータベース層と連携

### 4. 技術的詳細

- Mojolicious::Liteフレームワークを利用
- OpenAPI仕様に準拠したAPI設計
- Mojo::SQLiteでデータベース操作

これにより、BBSアプリケーションは投稿の作成・取得だけでなく、更新・削除も可能な完全なCRUD機能を備えたAPIサーバーとなりました。

はい!


1990年から歴史を辿ると、変わってきたもの、変わってないもの色々ありますが、 こういったAIも楽しんで、生き残っていきたいですね!

宣伝

YAPC::Fukuokaも楽しみですね!

blog.yapcjapan.org