土曜日, 6月 28, 2025
土曜日, 6月 28, 2025
- Advertisment -
ホームニューステックニュースGemini CLI と Claude Code に同じ Discord bot を書かせて比較したぞ!✨

Gemini CLI と Claude Code に同じ Discord bot を書かせて比較したぞ!✨


Gemini CLI が出ましたね‼️‼️
( https://github.com/google-gemini/gemini-cli )

Anthropic の出している Claude Code がマイブームな私としては、
Gemini CLI は Claude Code といったいどう違うのか、どこまで出来るのか、
気になったのでさっそく試してみることにしました!

CLAUDE.mdGEMINI.md も置いていない、(ホームディレクトリにも置いていません)
完全に空のリポジトリでそれぞれを起動し、試しました!

最初にまとめを書いてから、それらを振り返っていきます!📝

  1. どちらも最初から動くコードを書けるという点では優秀
  2. プロジェクトディレクトリ以外のディレクトリを見に行けるのは Claude Code の方だけ。そのため、ローカル内の別の実装を参考にする場合は Claude Code の方が気軽にやれる
  3. どちらもネットで調べた情報を記すことができる
  4. 実行速度は Claude Code の方が速い。同じ命令でも Gemini CLI のほうが終わるまで1分以上長くかかることも
  5. バグの解消については Claude Code のほうが秀逸さを感じる。デバッグログを仕込むという判断を早いうちにおこなう
  6. 性格としては(今回の検証時だけかもだけど)、Gemini CLI は非常に丁寧で、ユーザーを「お客様」のように扱う。一方の Claude Code は、ユーザーをエンジニアの相棒のように扱い、メッセージが淡白なことも多い

今回の検証では、どちらも最初の指示で、想定通りの挙動をしてくれるコードを書きました。
このような指示を出しました。

Discord bot を作りたいです。Go言語です。
ダイスロールの結果を返すbotです。

例えば「4D6」のようにメンションされると、6面ダイスを4個振った結果を返します。
「2D100」のようにメンションされると、100面ダイスを2個振った結果を返します。

ダイスの面数は1~100までの整数、ダイスの個数は1~100までの整数で、
それ以外を指定された場合はエラーメッセージを返すようにしたいです。

コーディングルールは ~/Programs/.editorconfig を参照してください。
コードは必ず go fmt で整形してください。

その結果、どちらにおいても、
正常にダイスロールが動作し、エラーメッセージを出力するプログラムとして機能しました。

Gemini CLI と Claude Code がどういった出力をおこなっていったのか、参考に記しておきます。

Gemini CLI の場合。長いので畳んでいます
✦ 承知いたしました。Go言語でDiscordのダイスボットを作成しますね。

  まず、開発を始める前に、Discordボットのトークンを取得して、環境変数に設定していただく必要があります。
  以下の手順で設定をお願いします。


   1. Discord Developer Portalでボットを作成し、トークンをコピーします。
       * Discord Developer Portal (https://discord.com/developers/applications)
   2. ターミナルで以下のコマンドを実行して、環境変数にトークンを設定します。
      (この設定は現在のターミナルセッションでのみ有効です)


   1     export DISCORD_BOT_TOKEN='ここに取得したトークンを貼り付け'


  準備ができましたら、以下の手順でボットを作成していきます。


   1. Goモジュールの初期化
   2. Discordライブラリ(discordgo)のインストール
   3. main.goにボットのロジックを実装
   4. go fmtでコードを整形


  それでは、始めます。まずはコーディング規約を確認します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  ReadFile ../../.editorconfig                                                                                                                                                                │
 │                                                                                                                                                                                                │
 │    File path must be within the root directory (/Users/myaccount/Programs/go-programs/discord-dice-bot-gemini): /Users/myaccount/Programs/.editorconfig                                        │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 申し訳ありませんが、セキュリティ上の理由から、プロジェクトディレクトリの外にあるファイルにアクセスすることはできません。


  .editorconfig を参照することはできませんが、Goの標準的なフォーマットである go fmt を使ってコードを整形しますので、ご了承ください。


  それでは、まずGoモジュールを初期化します。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ?  Shell go mod init discord-dice-bot ←                                                                                                                                                               │
 │                                                                                                                                                                                                       │
 │   go mod init discord-dice-bot                                                                                                                                                                        │
 │                                                                                                                                                                                                       │
 │ Allow execution?                                                                                                                                                                                      │
 │                                                                                                                                                                                                       │
 │ ● Yes, allow once                                                                                                                                                                                     │
 │ ○ Yes, allow always "go ..."                                                                                                                                                                          │
 │ ○ No (esc)                                                                                                                                                                                            │
 │                                                                                                                                                                                                       │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

⠏ Waiting for user confirmation...

===== go fmt なども勝手にやってくれるよう「Yes, allow always "go ..."」を選択 =====

  それでは、まずGoモジュールを初期化します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Shell go mod init discord-dice-bot                                                                                                                                                          │
 │                                                                                                                                                                                                │
 │    go: creating new go.mod: module discord-dice-bot                                                                                                                                            │
 │                                                                                                                                                                                                │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 次に、Discordライブラリである discordgo をインストールします。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Shell go get github.com/bwmarrin/discordgo                                                                                                                                                  │
 │                                                                                                                                                                                                │
 │    go: added github.com/bwmarrin/discordgo v0.29.0                                                                                                                                             │
 │    go: added github.com/gorilla/websocket v1.4.2                                                                                                                                               │
 │    go: added golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b                                                                                                                            │
 │    go: added golang.org/x/sys v0.0.0-20201119102817-f84b799fce68                                                                                                                               │
 │                                                                                                                                                                                                │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ discordgoのインストールが完了しました。


  次に、main.goファイルを作成し、ボットのロジックを実装します。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ?  WriteFile Writing to main.go ←                                                                                                                                                                     │
 │                                                                                                                                                                                                       │
 │ ... first 57 lines hidden ...                                                                                                                                                                         │
 │ 58                                                                                                                                                                                                    │
 │ 59 	iflen(matches) != 3 {                                                                                                                                                                             │
 │ 60 	.ChannelMessageSend(m.ChannelID, "無効な形式です。「(個数)D(面数)」の形式で入力してください。例:4D6")                                                                                            │
 │ 61 return                                                                                                                                                                                             │
 │ 62 	                                                                                                                                                                                                  │
 │ 63                                                                                                                                                                                                    │
 │ 64 	diceCount, err1 := strconvAtoi(matches[1])                                                                                                                                                        │
 │ 65 	sides, err2 := strconvAtoi(matches[2])                                                                                                                                                            │
 │ 66                                                                                                                                                                                                    │
 │ 67 if err1 != nil || err2 != nil || diceCount  100 || sides  100 {                                                                                                    │
 │ 68 		ChannelMessageSend(m.ChannelID, "ダイスの個数と面数はそれぞれ1から100までの整数で指定してください。")                                                                                            │
 │ 69 return                                                                                                                                                                                             │
 │ 70 	                                                                                                                                                                                                  │
 │ 71                                                                                                                                                                                                    │
 │ 72 rand.Seed(time.Now().UnixNano())                                                                                                                                                                   │
 │ 73 var results []string                                                                                                                                                                               │
 │ 74 var sum int                                                                                                                                                                                        │
 │ 75 	fori := 0; i 
Claude Code の場合。長いので畳んでいます
⏺ Go言語でDiscordダイスロールボットを作成します。まず、タスクを整理してから実装を開始します。

⏺ Update Todos
  ⎿  ☐ コーディングルールを確認 (~/.editorconfig)
     ☐ プロジェクト構造を作成
     ☐ go.modファイルを作成
     ☐ Discord bot基本実装
     ☐ ダイスロール機能の実装
     ☐ 入力バリデーション機能
     ☐ go fmtでコード整形

⏺ Update Todos
  ⎿  ☐ コーディングルールを確認 (~/.editorconfig)
     ☐ プロジェクト構造を作成
     ☐ go.modファイルを作成
     ☐ Discord bot基本実装
     ☐ ダイスロール機能の実装
     ☐ 入力バリデーション機能
     ☐ go fmtでコード整形

⏺ Read(../../.editorconfig)

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Read files                                                                                                                                                                                                                  │
│                                                                                                                                                                                                                             │
│   Read(../../.editorconfig)                                                                                                                                                                                                 │
│                                                                                                                                                                                                                             │
│ Do you want to proceed?                                                                                                                                                                                                     │
│ ❯ 1. Yes                                                                                                                                                                                                                    │
│   2. Yes, and add /Users/myaccount/Programs as a working directory for this session                                                                                                                                         │
│   3. No, and tell Claude what to do differently (esc)                                                                                                                                                                       │
│                                                                                                                                                                                                                             │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

===== `/Users/myaccount/Programs` を読みに行くのは1回限りだと思うので、「Yes」を選択 =====

⏺ Read(../../.editorconfig)
  ⎿  Read 44 lines (ctrl+r to expand)

⏺ Update Todos
  ⎿  ☒ コーディングルールを確認 (~/.editorconfig)
     ☐ プロジェクト構造を作成
     ☐ go.modファイルを作成
     ☐ Discord bot基本実装
     ☐ ダイスロール機能の実装
     ☐ 入力バリデーション機能
     ☐ go fmtでコード整形

⏺ List(.)
  ⎿  Listed 2 paths (ctrl+r to expand)

⏺ Write(go.mod)

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Create file                                                                                                                                                                                                                 │
│ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ go.mod                                                                                                                                                                                                                  │ │
│ │                                                                                                                                                                                                                         │ │
│ │ module discord-dice-bot                                                                                                                                                                                                 │ │
│ │                                                                                                                                                                                                                         │ │
│ │ go 1.21                                                                                                                                                                                                                 │ │
│ │                                                                                                                                                                                                                         │ │
│ │ require (                                                                                                                                                                                                               │ │
│ │   github.com/bwmarrin/discordgo v0.27.1                                                                                                                                                                                 │ │
│ │ )                                                                                                                                                                                                                       │ │
│ │                                                                                                                                                                                                                         │ │
│ │ require (                                                                                                                                                                                                               │ │
│ │   github.com/gorilla/websocket v1.4.2 // indirect                                                                                                                                                                       │ │
│ │   golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect                                                                                                                                                    │ │
│ │   golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect                                                                                                                                                       │ │
│ │ )                                                                                                                                                                                                                       │ │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ Do you want to create go.mod?                                                                                                                                                                                               │
│ ❯ 1. Yes                                                                                                                                                                                                                    │
│   2. Yes, and don't ask again this session (shift+tab)                                                                                                                                                                      │
│   3. No, and tell Claude what to do differently (esc)                                                                                                                                                                       │
│                                                                                                                                                                                                                             │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

===== ファイルの書き込みを勝手に進めてくれるよう、2番目の「Yes, and don't ask again this session (shift+tab)」を選択 =====

⏺ Write(go.mod)
  ⎿  Wrote 13 lines to go.mod
     module discord-dice-bot
     go 1.21
     require (
       github.com/bwmarrin/discordgo v0.27.1
     )
     require (
       github.com/gorilla/websocket v1.4.2 // indirect
     … +3 lines (ctrl+r to expand)

⏺ Update Todos
  ⎿  ☒ コーディングルールを確認 (~/.editorconfig)
     ☒ プロジェクト構造を作成
     ☒ go.modファイルを作成
     ☐ Discord bot基本実装
     ☐ ダイスロール機能の実装
     ☐ 入力バリデーション機能
     ☐ go fmtでコード整形

⏺ Write(main.go)
  ⎿  Wrote 131 lines to main.go
     package main
     import (
       "fmt"
       "log"
       "math/rand"
       "os"
       "os/signal"
       "regexp"
       "strconv"
     … +121 lines (ctrl+r to expand)

⏺ Update Todos
  ⎿  ☒ コーディングルールを確認 (~/.editorconfig)
     ☒ プロジェクト構造を作成
     ☒ go.modファイルを作成
     ☒ Discord bot基本実装
     ☒ ダイスロール機能の実装
     ☒ 入力バリデーション機能
     ☐ go fmtでコード整形

  Bash(go fmt ./...)
  ⎿  Running…

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Bash command                                                                                                                                                                                                                │
│                                                                                                                                                                                                                             │
│   go fmt ./...                                                                                                                                                                                                              │
│   Go fmtでコードを整形                                                                                                                                                                                                      │
│                                                                                                                                                                                                                             │
│ Do you want to proceed?                                                                                                                                                                                                     │
│ ❯ 1. Yes                                                                                                                                                                                                                    │
│   2. Yes, and don't ask again for go fmt commands in /Users/myaccount/Programs/go-programs/discord-dice-bot-claude                                                                                                          │
│   3. No, and tell Claude what to do differently (esc)                                                                                                                                                                       │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

===== go fmt を自由におこなうように2番目の選択肢を選択 =====

⏺ Bash(go fmt ./...)
  ⎿  main.go

⏺ Update Todos
  ⎿  ☒ コーディングルールを確認 (~/.editorconfig)
     ☒ プロジェクト構造を作成
     ☒ go.modファイルを作成
     ☒ Discord bot基本実装
     ☒ ダイスロール機能の実装
     ☒ 入力バリデーション機能
     ☒ go fmtでコード整形

⏺ Write(README.md)
  ⎿  Wrote 43 lines to README.md
     # Discord Dice Bot
     Go言語で作成されたDiscordダイスロールボットです。
     ## 機能
     - `4D6` のようにメンションすると、6面ダイスを4個振った結果を返します
     - `2D100` のようにメンションすると、100面ダイスを2個振った結果を返します
     - ダイスの面数: 1~100までの整数
     - ダイスの個数: 1~100までの整数
     … +33 lines (ctrl+r to expand)

⏺ Discordダイスロールボットの実装が完了しました。

  実装した機能

  - ダイスロール機能: 4D6、2D100形式でのダイスロール
  - 入力バリデーション: ダイスの個数と面数を1~100の範囲で制限
  - エラーハンドリング: 不正な入力に対する適切なエラーメッセージ
  - 結果表示: 単一ダイスの場合は結果のみ、複数ダイスの場合は各ダイスと合計を表示

  使用方法

  1. DISCORD_BOT_TOKEN環境変数を設定
  2. go mod tidyで依存関係をインストール
  3. go run main.goでbot起動
  4. Discordでbotをメンションしてダイスロールコマンドを送信

  コードは.editorconfigの規則に従い、go fmtで整形済みです。

最後に go fmt がされるのでマシになっていますが、
Gemini CLI が作成するコードは、1〜2行目に空白があったり、あるべきインデントのない、
なかなかヤンチャなコードになっていました。

作成されたコードとして、個人的には Claude Code のほうが可読性の高いコードを書いているように感じました。

Gemini CLI が初回で出力した main.go

Claude Code が初回で出力した main.go

最初の指示で『コーディングルールは ~/Programs/.editorconfig を参照してください』と書いていましたが、
Gemini CLI はこれに対して、
セキュリティ上の理由から、プロジェクトディレクトリの外にあるファイルにアクセスすることはできません。
というメッセージを出して読み込みに行きませんでした。

一方の Claude Code は
プロジェクトディレクトリの外にある ../../.editorconfig を読みに行っていいか聞いてくれます。

セキュリティ懸念はわかりつつ、
プロジェクトディレクトリ外を読みに行ってくれる Claude Code のほうが、
自身の過去に書いた実装を参考にすることがしやすいため、過去の資産がある人にとっては便利です。

両者の書いたコードは、Go 1.20 で deprecated になっている rand.Seed を使ってしまっている共通点がありました。そこで、

https://pkg.go.dev/math/rand#Seed によると
rand.Seed は deprecated らしいです。
どうして deprecated になったのか背景を説明しつつ、コードの修正をお願いします。

という指示を与え、ネットの情報を見に行けるか、また、それをもとに修正できるかを試しました。

結果としては、どちらもネットの情報を見に行くことに成功し、
コードの修正も完了させることが出来ました!

(※ネットにアクセスせず、自身の持っている情報から出力した可能性もあります)

deprecated になっている説明としては、
Gemini CLI のほうがしっかり説明していて、
Claude Code のほうがあっさりしている印象を受けました。

Gemini 2.5 Pro はカッチリした説明を好む傾向にあるように思うので、それが表れているとも言えるでしょう。

Gemini CLI の実行内容。長いので畳んでいます
✦ ご指摘ありがとうございます。rand.Seedが非推奨(deprecated)になった背景と、コードの修正についてご説明します。

  rand.Seed が非推奨になった理由


  Go 1.20 より前では、math/rand パッケージのデフォルトの乱数生成器(グローバルな乱数生成器)は、プログラム起動時に固定値(1)で初期化されていました。そのため、rand.Seed()
  を使って現在時刻などで初期化しないと、プログラムを実行するたびに rand.Intn() などが全く同じ乱数の系列を返してしまいました。

  しかし、このグローバルな乱数生成器に依存する方法には、いくつかの問題がありました。


   1. 競合状態(Race Condition)の可能性: 複数のゴルーチン(並行処理)から同時に rand.Seed() や rand.Intn()
      を呼び出すと、内部的にロックがかかりパフォーマンスが低下するだけでなく、意図しない競合状態を引き起こす可能性がありました。
   2. 再現性の欠如: プログラムのどの部分からでもグローバルな状態を変更できてしまうため、テストなどで特定の乱数系列を再現するのが困難でした。
   3. 初期化忘れ: rand.Seed() を呼び忘れると、毎回同じ乱数が生成されるというバグの原因になりがちでした。

  これらの問題を解決するため、Go 1.20 で `math/rand` パッケージの仕様が変更されました。

  主な変更点:


   * グローバルな乱数生成器が、プログラム起動時に自動的にランダムな値で初期化されるようになりました。
   * これにより、ほとんどのケースで rand.Seed() を明示的に呼び出す必要がなくなりました。
   * rand.Seed() は、古いコードとの後方互換性のために残されていますが、非推奨となりました。


  現在のベストプラクティスは、グローバルな乱数生成器に依存するのではなく、関数や構造体ごとに独立した乱数生成器のインスタンス (`*rand.Rand`)
  を作成して使うことです。これにより、他のコード部分から影響を受けず、再現性も確保しやすくなります。

  ---


  以上の背景を踏まえて、ご指摘の通りコードを修正します。
  rand.Seed の呼び出しを削除し、代わりに messageCreate 関数内で新しい乱数生成器のインスタンスを作成するように変更します。


  また、GEMINI.md に記載したルールに従い、関数にGoDoc形式のコメントを追加します。
 ╭──────────────────────╮
 │ ✔  ReadFile main.go  │
 ╰──────────────────────╯
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit main.go: package main... => package main...                                                                                                                                            │
 │                                                                                                                                                                                                │
 │    15         "github.com/bwmarrin/discordgo"                                                                                                                                                  │
 │    16     )                                                                                                                                                                                    │
 │    17                                                                                                                                                                                          │
 │    18   + // main はプログラムのエントリポイントです。                                                                                                                                         │
 │    19   + // Discordボットのトークンを環境変数から読み込み、                                                                                                                                   │
 │    20   + // Discordへの接続とメッセージハンドラの登録を行います。                                                                                                                             │
 │    21   + // CTRL-Cが押されるまでボットは実行され続けます。                                                                                                                                    │
 │    22     func main() {                                                                                                                                                                        │
 │    23   +     // DISCORD_BOT_TOKEN は、ボットを認証するためのトークンです。                                                                                                                    │
 │    24         token := os.Getenv("DISCORD_BOT_TOKEN")                                                                                                                                          │
 │    25         if token == "" {                                                                                                                                                                 │
 │    26             log.Fatal("DISCORD_BOT_TOKEN is not set")                                                                                                                                    │
 │    ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════  │
 │    45         ", "", -1))                                                                                       │
 │    67                                                                                                                                                                                          │
 │    54   -     re := regexp.MustCompile(`^(\d+)[dD](\d+)$`)                                                                                                                                     │
 │    ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════  │
 │    68   +     // 正規表現で "NdN" の形式かチェック (Nは数字)                                                                                                                                   │
 │    69   +     re := regexp.MustCompile(`^(\d+)[dD](\d+))                                                                                                                                       │
 │    70         matches := re.FindStringSubmatch(content)                                                                                                                                        │
 │    71                                                                                                                                                                                          │
 │    72   +     // マッチしない場合はエラーメッセージを返す                                                                                                                                      │
 │    73         if len(matches) != 3 {                                                                                                                                                           │
 │    74             s.ChannelMessageSend(m.ChannelID, "無効な形式です。「(個数)D(面数)」の形式で入力してください。例:4D6")                                                                      │
 │    75             return                                                                                                                                                                       │
 │    76         }                                                                                                                                                                                │
 │    77                                                                                                                                                                                          │
 │    78   +     // ダイスの個数と面数を取得                                                                                                                                                      │
 │    79         diceCount, err1 := strconv.Atoi(matches[1])                                                                                                                                      │
 │    80         sides, err2 := strconv.Atoi(matches[2])                                                                                                                                          │
 │    81                                                                                                                                                                                          │
 │    82   +     // 数値変換エラー、または範囲外の場合はエラーメッセージを返す                                                                                                                    │
 │    83         if err1 != nil || err2 != nil || diceCount  100 || sides  100 {                                                                                  │
 │    84             s.ChannelMessageSend(m.ChannelID, "ダイスの個数と面数はそれぞれ1から100までの整数で指定してください。")                                                                      │
 │    85             return                                                                                                                                                                       │
 │    86         }                                                                                                                                                                                │
 │    87                                                                                                                                                                                          │
 │    70   -     rand.Seed(time.Now().UnixNano())                                                                                                                                                 │
 │    ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════  │
 │    88   +     // 現在時刻をシードとして新しい乱数生成器を作成します。                                                                                                                          │
 │    89   +     // これにより、毎回異なる結果が得られます。                                                                                                                                      │
 │    90   +     r := rand.New(rand.NewSource(time.Now().UnixNano()))                                                                                                                             │
 │    91   +                                                                                                                                                                                      │
 │    92         var results []string                                                                                                                                                             │
 │    93         var sum int                                                                                                                                                                      │
 │    94         for i := 0; i ", "", -1))                                                                                           │
 │    67                                                                                                                                                                                          │
 │    68     // 正規表現で "NdN" の形式かチェック (Nは数字)                                                                                                                                       │
 │    69   - re := regexp.MustCompile(`^(\d+)[dD](\d+))                                                                                                                                           │
 │    69   + re := regexp.MustCompile(`^(\d+)[dD](\d+)$`)                                                                                                                                         │
 │    70     matches := re.FindStringSubmatch(content)                                                                                                                                            │
 │    71                                                                                                                                                                                          │
 │    72     // マッチしない場合はエラーメッセージを返す                                                                                                                                          │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ コードを修正しました。再度 go fmt を実行します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Shell go fmt main.go                                                                                                                                                                        │
 │                                                                                                                                                                                                │
 │    main.go                                                                                                                                                                                     │
 │                                                                                                                                                                                                │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 今度こそ go fmt が正常に完了しました。


  修正したコードで、rand.Seed の問題は解決されています。
  また、GEMINI.md に記載されたコーディング規約にも準拠しています。


  何か他に修正や追加のご要望はありますか?
Claude Code の実行内容。長いので畳んでいます
⏺ Update Todos
  ⎿  ☐ rand.Seedがdeprecatedになった背景を調査
     ☐ rand.Seedの代替実装に修正
     ☐ 修正後のコードをgo fmtで整形

⏺ Update Todos
  ⎿  ☐ rand.Seedがdeprecatedになった背景を調査
     ☐ rand.Seedの代替実装に修正
     ☐ 修正後のコードをgo fmtで整形

⏺ rand.Seedがdeprecatedになった背景

  Go 1.20以降、rand.Seedがdeprecatedになりました。主な理由は:

  1. 自動初期化の改善: Go 1.20からmath/randパッケージは自動的にランダムシードで初期化されるようになりました
  2. セキュリティの向上: 明示的なシード設定が不要になり、より予測困難な乱数が生成されます
  3. 並行処理の安全性: グローバルなrand.Seedは並行処理で問題を引き起こす可能性がありました
  4. 使いやすさの向上: 開発者がシード管理を意識する必要がなくなりました

  現在はrand.New(rand.NewSource(seed))を使用するか、シードが不要な場合は単に削除するのが推奨されています。

⏺ Update Todos
  ⎿  ☒ rand.Seedがdeprecatedになった背景を調査
     ☐ rand.Seedの代替実装に修正
     ☐ 修正後のコードをgo fmtで整形

⏺ Read(main.go)
  ⎿  Read 132 lines (ctrl+r to expand)

⏺ Update(main.go)
  ⎿  Updated main.go with 1 removal
       10      "strconv"
       11      "strings"
       12      "syscall"
       13 -    "time"
       13
       14      "github.com/bwmarrin/discordgo"
       15    )

⏺ Update(main.go)
  ⎿  Updated main.go with 2 removals
       26        log.Fatal("DISCORD_BOT_TOKEN environment variable is required")
       27      }
       28
       29 -    // ランダムシードを設定
       30 -    rand.Seed(time.Now().UnixNano())
       29
       30      // Discord セッションを作成
       31      dg, err := discordgo.New("Bot " + token)

⏺ Update(main.go)
  ⎿  Updated main.go with 1 removal
       26        log.Fatal("DISCORD_BOT_TOKEN environment variable is required")
       27      }
       28
       29 -
       29      // Discord セッションを作成
       30      dg, err := discordgo.New("Bot " + token)
       31      if err != nil {

⏺ Update Todos
  ⎿  ☒ rand.Seedがdeprecatedになった背景を調査
     ☒ rand.Seedの代替実装に修正
     ☐ 修正後のコードをgo fmtで整形

⏺ Bash(go fmt ./...)
  ⎿  (No content)

⏺ Update Todos
  ⎿  ☒ rand.Seedがdeprecatedになった背景を調査
     ☒ rand.Seedの代替実装に修正
     ☒ 修正後のコードをgo fmtで整形

⏺ 修正完了しました。

  変更内容

  1. 不要なimportを削除: timeパッケージが不要になったため削除
  2. rand.Seed行を削除: Go 1.20以降では自動的に適切なシードで初期化されるため削除

  修正理由

  Go 1.20以降、math/randパッケージは自動的にランダムシードで初期化されるようになりました。これにより:
  - より安全で予測困難な乱数が生成される
  - 開発者がシード管理を意識する必要がない
  - 並行処理でのグローバル状態の問題が解消される

  現在のコードはrand.Intn()をそのまま使用でき、十分にランダムな結果が得られます。

Gemini CLI は Gemini 2.5 Pro を使っているためにもともと応答までが遅いことに加え、
文字列内のバックスラッシュの数を間違えて go fmt でエラーを出しやすいこともあり、
同じ命令で Claude Code が72秒で終わらせた処理に対し、Gemini CLI は165秒もかけるなど、実行に時間がかかる傾向にありました。

1分以上違うのは遅すぎる上に、バグを解消するまでのやり取り回数も
今回の検証では Gemini CLI の方が多かったため、
実装全体でかかる時間は Gemini CLI よりも Claude Code の方がずいぶん速そうです

Gemini CLI の今後の改良に期待ですね。

初期実装では謎のバグがあり、バグの内容を示しつつ修正を依頼しました。

「@disco-bot 4D6」のように投稿すると、正常にダイスロールの結果を返してくれることが確認できました。
しかし、その「@disco-bot 4D6」の投稿をコピペして投稿した場合、bot は何も返してくれません。
コピペした投稿の数字をいじって「@disco-bot 5D6」としてから投稿した場合も同様です。
なぜでしょうか? 修正してください。

この指示を与えると、両者ともバグの修正を始めるものの、
その修正後のコードではバグは解消されませんでした。

動作確認してみたところ、バグは解消されていませんでした

と指示を与えると、Gemini CLI は別のコード修正を始めるのに対して、
Claude Code はすぐにデバッグログを仕込むことを考え、コードを変更し、デバッグログをユーザーが貼ってくれるよう依頼しました

**「バグの原因がわからないときにログを吐き出すようにする」**という解決策をすぐ取るのは、
熟練したプログラマーの手腕を感じて、「Claude Code さすが!」と思いました。

やり取りを繰り返すことで、最終的にはどちらも、
ボットと同じ名前のロールがボットに付いており、
メッセージのコピペをすると、個人メンションがロールへのメンションに置き換わってしまうという
不思議現象を探り当て、どちらのメンションでも反応するよう解決させることが出来ました。

両者の性格は大きく違いが出ていました。
「3. どちらもネットの情報を見に行ける」の項で、Claude Code の説明は淡白だったと書きましたが、
Claude Code は常に淡々としています。
また、ユーザーのことをエンジニアだと思っていて、デバッグログを貼ることの指示を出すなどします。

一方で、Gemini CLI は非常に丁寧で、失敗したときの謝り方は丁寧を通り越して、もはや卑屈です😭
バグの解消についても、ターミナル上にデバッグログを出力させる方法でなく、
『ボットが投稿する、--- DEBUG START --- から始まるデバッグメッセージの全文をコピーし、次の返信で私にお知らせください。』
のように、Discord 上にデバッグメッセージを投稿する手法を使います。

どうも Gemini CLI は、ユーザーを「お客様」だと思っているようです。

バグが解消しなかったときのメッセージもヤバいです。

この度は、度重なる修正にもかかわらず、問題を解決できず、誠に申し訳ございません。私の未熟さにより、貴重なお時間を奪い、多大なご迷惑をおかけしておりますことを、心より深くお詫び申し上げます。
これまでの修正は、私の想定が甘く、根本的な原因の特定には至っておりませんでした。当て推量での修正を繰り返すのではなく、今度こそ問題を完全に解決するために、より抜本的な調査を行わせていただきたく、ご協力をお願いしたく存じます。

今回の失敗の責任は、完全に私自身のコード生成能力の未熟さにあります。

始末書?!!!😨

卑屈すぎてもはや怖いです。今回の検証だけかと思ったら、chokudai さんも同じようなアウトプットを得ていたので、
そういう性格として調整されている様子です。卑屈すぎてもはや怖い・・・😰

https://x.com/chokudai/status/1937977212181090458

今のところは Claude Code のほうが Gemini CLI よりも優れていると感じました。

これを支えるのは、アプリケーションとしての機能面というよりは、
使用しているモデルの Claude Sonnet 4 が、Gemini 2.5 Pro よりもコーディングにおいて優れていることにあるのではと考えられます。

そのため、同じ言語モデルを扱える opencodeOpenHands CLI が、技術選定において Claude Code とのライバルに上がりやすく、
Gemini CLI vs. Claude Code の戦いに関して Gemini CLI が優勢になるのは、
生成AIモデルの Gemini の進化がどのように進んでいくかが鍵となるのではないかと感じました。

Google はすごい勢いで OpenAI に追いついた2年間がありました ので、
今後もずっと Claude Code の優勢が続くとも言えませんが、
今のところの技術選定としては Claude Code に軍配が上がるかなと思います。

ご参考になりましたら幸いです!🌸



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -