AIコーディング 2026.04.18
Claude Codeの使い方|5つの実践テクニック&よくあるエラー対処法
テクニック1: タスクを明確に分割する
❌ 悪い例(大きすぎる1つのリクエスト):
「ECサイトを作ってください。商品一覧・カート・決済・管理画面が必要です」
✅ 良い例(段階的なリクエスト):
Step 1: 「Prismaのスキーマ(Product・Cart・Order)だけ作ってください」
Step 2: 「GET /api/products エンドポイントだけ実装してください」
Step 3: 「商品一覧のUIコンポーネントだけ作ってください」
各ステップが完了したらgitでコミットしてから次のステップに進む。
テクニック2: CLAUDE.mdで制約を明示する
# プロジェクト概要
Next.js 14 + TypeScript + Prisma + PostgreSQLのECサイト
# コーディングルール
- `any` 型を使わない。不明な型は `unknown`
- Server Actionsには必ず認証チェックを先に書く
- 全入力はZodでバリデーションする
- `<img>` → `next/image`、`<a>` → `next/link` を使う
# 禁止操作
- `git push --force` は実行しない
- `.env`ファイルにシークレットを直書きしない
- `prisma db push` は開発初期のみ(本番は migrate dev を使う)
テクニック3: トークン使用量を可視化する
# token_tracker.py
# Claude Codeのトークン消費を記録してコストを把握する
import anthropic
from datetime import date
import json
from pathlib import Path
client = anthropic.Anthropic()
SONNET_PRICE = (3.00, 15.00) # $/1M tokens (input, output)
log_file = Path(".token_log.json")
def ask_with_tracking(prompt: str, context_files: list[str] = []) -> str:
"""質問してトークン消費を記録する"""
messages = [{"role": "user", "content": prompt}]
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
messages=messages
)
inp = response.usage.input_tokens
out = response.usage.output_tokens
cost = (inp * SONNET_PRICE[0] + out * SONNET_PRICE[1]) / 1_000_000
log = json.loads(log_file.read_text()) if log_file.exists() else {"total_cost": 0, "sessions": []}
log["total_cost"] += cost
log["sessions"].append({
"date": str(date.today()),
"tokens": inp + out,
"cost_usd": round(cost, 5)
})
log_file.write_text(json.dumps(log, indent=2))
print(f"今回: ${cost:.5f} | 累計: ${log['total_cost']:.3f}")
return response.content[0].text
テクニック4: .claudeignoreで不要ファイルを除外する
# .claudeignore
# これを設定しないと node_modules が全部コンテキストに入り
# トークンが無駄になる(最重要設定)
node_modules/
.next/
dist/
build/
.git/
*.lock
*.log
coverage/
.env*
*.min.js
*.min.css
public/fonts/
テクニック5: よくあるエラーの対処法
# error_recovery.py
# Claude Code でよくあるエラーのパターンと回避策
from anthropic import Anthropic, APIStatusError, APITimeoutError, RateLimitError
import time
client = Anthropic()
def resilient_request(prompt: str, max_retries: int = 3) -> str:
"""エラー時に自動リトライする安全なリクエスト関数"""
for attempt in range(max_retries):
try:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
except RateLimitError:
wait = 60 * (attempt + 1)
print(f"レート制限: {wait}秒待機して再試行 ({attempt+1}/{max_retries})")
time.sleep(wait)
except APITimeoutError:
print(f"タイムアウト: プロンプトを短くして再試行してください")
# タイムアウト時はリトライせず短縮版で再試行を促す
raise ValueError("プロンプトが長すぎます。タスクを分割してください")
except APIStatusError as e:
if e.status_code == 529: # Overloaded
time.sleep(30)
else:
raise
raise RuntimeError(f"{max_retries}回試行しましたが失敗しました")
# 使用例
try:
result = resilient_request("Pythonでバイナリサーチを実装してください")
print(result)
except ValueError as e:
print(f"対処法: {e}")