jedipunkz 🚀 のブログ

SRE になるために孊んでいくブログです

[Go 再孊習] Go の interface を理解する

Go の再孊習をしおいる最䞭なのですが、孊習圓初 Go Interface は「なんずなく分かるが䜿いこなせない」ずいう感芚を持っおいたした。自分のコヌドでも䜿っおいるのですが、どのようなパタヌンで䜿えるのかを網矅的には知っおいない状態だったのでこれを機に調べおみたした。この蚘事では基本的な定矩から実務でよく登堎するパタヌンたでをサンプルコヌドず共に敎理したした。 コヌドは以䞋のレポゞトリにありたす。 https://github.com/jedipunkz/go-tips interface ずは interface はメ゜ッドのシグネチャの集合を定矩する型です。ある型が interface に定矩されたメ゜ッドをすべお持っおいれば、自動的にその interface を満たしたす。 この蚭蚈により、既存のコヌドを倉曎せずに埌から interface に適合させるこずができたす。 パタヌン1: 基本的な interface 最もシンプルな interface の定矩ず利甚です。Shape interface を定矩し、Circle ず Rectangle がそれを実装したす。 䜿い所 図圢の面積や呚長を蚈算する凊理を曞く堎合、Circle や Rectangle ごずに別々の関数を甚意するず、新しい図圢が増えるたびに呌び出し偎の修正が必芁になりたす。Shape interface を定矩しお関数が Shape を受け取るようにするず、新しい図圢を远加しおも既存の関数はそのたた䜿え、拡匵が容易になりたす。 package main import ( "fmt" "math" ) // Shape むンタヌフェヌスを定矩する // メ゜ッドセットを持぀型はこのむンタヌフェヌスを満たす type Shape interface { Area() float64 Perimeter() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius } func (c Circle) Perimeter() float64 { return 2 * math.Pi * c.Radius } type Rectangle struct { Width, Height float64 } func (r Rectangle) Area() float64 { return r.Width * r.Height } func (r Rectangle) Perimeter() float64 { return 2 * (r.Width + r.Height) } // むンタヌフェヌス型を匕数に取るこずで、どの Shape 実装でも受け付ける func printShapeInfo(s Shape) { fmt.Printf("面積: %.2f, 呚長: %.2f\n", s.Area(), s.Perimeter()) } func main() { c := Circle{Radius: 5} r := Rectangle{Width: 4, Height: 6} fmt.Print("Circle: ") printShapeInfo(c) fmt.Print("Rectangle: ") printShapeInfo(r) } printShapeInfo は Shape を受け取るだけで、Circle か Rectangle かを意識したせん。新たに Triangle を远加したずしおも、Area() ず Perimeter() を実装するだけで既存コヌドの倉曎なく動きたす。 ...

2026-04-13 Â· 5 分 Â· jedipunkz

[Go 再孊習] Go の goroutine ず channel を理解する

再び Go の孊習を再開しおいお、以前理解が曖昧だった点を重点的に孊び盎しおいたす。そのうちの1぀ goroutine, channel に぀いお蚘事にしょうず思いたす。 Go の䞊行凊理は goroutine ず channel ずいう2぀の仕組みを䞭心に蚭蚈されおいたす。channel を通じおデヌタをやり取りするこずで安党な䞊行凊理を実珟できたす。この蚘事ではサンプルコヌドを亀えお解説したす。 コヌドは以䞋のレポゞトリにありたす。 https://github.com/jedipunkz/go-tips goroutine ずは goroutine は Go のランタむムが管理する軜量なスレッドです。go キヌワヌドを぀けお関数を呌び出すだけで䞊行実行できたす。 通垞の関数呌び出しは呌び出し元が凊理完了を埅ちたすが、go を぀けるず呌び出し元はすぐに次の凊理ぞ進み、関数は別の goroutine で䞊行しお動きたす。 channel ずは channel は goroutine 間でデヌタを安党にやり取りするためのパむプです。make(chan T) で䜜成し、<- 挔算子で送受信したす。 送信: ch <- value 受信: value := <-ch channel を䜿うず goroutine 間で双方向にデヌタをやり取りできたす。 channel にはバッファなしずバッファありの2皮類がありたす。バッファなし channel は送受信が揃うたでブロックするため、goroutine 間の同期点ずしお機胜したす。バッファあり channel はバッファに空きがある限り送信偎はブロックせず先ぞ進めたす。 パタヌン1: 基本的な channel の䜿い方 たずは最もシンプルなパタヌンです。producer goroutine が倀を送信し、main goroutine が受信したす。 䜿い所 Web から耇数のファむルをダりンロヌドしお DB に保存するような凊理を考えるず、ネットワヌク埅ちや DB ぞの曞き蟌み埅ちがほずんどで CPU はほが遊んでいたす。こういった I/O バりンドな凊理では、1件ず぀順番に凊理するより goroutine ず channel でパむプラむン化するほうが効率的です。たずえば「URL リストを読み蟌む goroutine」ず「その URL から HTTP GET する goroutine」を分離し、channel で぀なぐこずで取埗ず埌続凊理を䞊行しお進められたす。 ...

2026-04-04 Â· 5 分 Â· jedipunkz

耇数の Claude Code ゚ヌゞェントを1぀のタヌミナルから起動・監芖するツヌルを䜜った

jedipunkz です。 背景 Claude Code を日垞的に䜿う䞭で、耇数の゚ヌゞェントを同時に動かしたいずいうシヌンが増えおきたした。䟋えば耇数の独立したタスクを䞊列で走らせたいずき、それぞれの゚ヌゞェントが今どんな状態にあるかをタヌミナル1぀で把握したいず思っおいたした。 幟぀かのアプロヌチに぀いお 以前Zellij を䜿っお Claude Code のマルチ゚ヌゞェント䞊列・盎列実行環境を䜜った ずいう蚘事を曞いたのですが、これは1぀のレポゞトリに察しお耇数の機胜開発・リファクタ・その他修正を䞊列でそれぞれ別の Claude Code で行い最終的にそれぞれの git worktree 䞊の差分をマヌゞする統合管理 Claude Code を実珟するものでした。これは Claude Code 玔正の機胜 Sub Agents ずは異なり耇数の Claude Code をオヌケストレヌションするモノずしお利甚しおいたのですが、察象が1぀のレポゞトリに限定されるこず、たた最終的にそれぞれの差分をマヌゞするのであれば Sub Agents で事足りる事も倚くなっおきおいたした。 それに察しお最近の芁件ずしおは䞋蚘のように倉化しおきたした。 耇数のレポゞトリの修正を行いたい それぞれの゚ヌゞェントのオヌケストレヌションよりも、それぞれの可芖化ず管理をしたい そこで Go で ax ずいうツヌルを䜜りたした。 リポゞトリはこちらです: https://github.com/jedipunkz/ax ax ずは ax は「1぀のタヌミナルから耇数の Claude Code ゚ヌゞェントを起動・監芖する」ためのCLI ツヌルです。 䞻な機胜は以䞋の通りです。 ax agent で゚ヌゞェントを起動git リポゞトリ内では自動で git worktree を䜜成 ax dash で TUI ダッシュボヌドを開き、党゚ヌゞェントの状態をリアルタむムで確認 バックグラりンドのデヌモンプロセスが Unix ドメむン゜ケット経由で゚ヌゞェントず TUI 間の状態を管理 スクリヌンショット 衚瀺は䞋蚘のようになりたす。vim キヌバむンドで移動出来たす。 ...

2026-03-14 Â· 2 分 Â· jedipunkz

Zellij を䜿っお Claude Code のマルチ゚ヌゞェント䞊列・盎列実行環境を䜜った

jedipunkz🚀 です。 Claude Code を日垞的に䜿う䞭で、倧きなタスクを耇数の独立したサブタスクに分けお䞊列凊理させたいずいうニヌズが出おきたした。䟋えばコヌドのリファクタリングずテスト远加を同時に進めたり、耇数ファむルぞの独立した修正を䞊行しお行ったりずいったケヌスです。 2026幎2月に Claude Code Agent Teams ずいう機胜が出おきたのですが、あくたでも1぀のタスクの䞭で耇数のサブ゚ヌゞェントを皌働させるものだったので自分ずしおは期埅しおいたものず若干異なりたした。やりたいのは芪 Claude Code のプロンプトから指瀺を出しお耇数のタスクを行っおくれる子 Claude Code のオヌケストレヌションでした。 そこで、Zellij の Pane 管理ず git worktree を組み合わせお、芪 Claude Code が耇数の子゚ヌゞェントを Zellij Pane ずしお起動しタスクを䞊列・盎列実行させる SKILL「zellij-swarm」を䜜りたした。この蚘事ではその仕組みず䜿い方を玹介したす。 SKILL は以䞋に眮いおいたす: https://github.com/jedipunkz/dotfiles/tree/main/.claude/skills/zellij-swarm 抂芁 芪 Claude Code に察しお「swarm で〜しお」ず自然蚀語で指瀺を出すず、タスクを耇数のサブタスクに分解し、それぞれを別々の Zellij Pane で動く子 Claude Code ゚ヌゞェントずしお起動するオヌケストレヌションの仕組みです。 各゚ヌゞェントは独立した git worktree 䞊で䜜業し、完了埌に芪゚ヌゞェントが各ブランチをマヌゞしお Git worktree の埌片付けたで行いたす。 タスク間に䟝存関係がある堎合は フェヌズ に分割しお察応したす。同䞀フェヌズ内の゚ヌゞェントは䞊列実行、フェヌズ間は盎列実行です。 実行フロヌの構造 パタヌン 1: 䞊列のみ (䟝存関係なし) タスク A ず B が互いに独立しおいる堎合、1 フェヌズで䞊列実行しお終了したす。 [agent-a] ─┐ ├─ run-phase.sh ── merge [agent-b] ─┘ |-------| phase 1 パタヌン 2: 䞊列 → 盎列 (フェヌズ制埡) タスク C がタスク A・B の結果に䟝存する堎合、2 フェヌズに分けたす。Phase 1 完了・マヌゞ埌に Phase 2 が起動するため、C は A・B の成果を匕き継いだ状態で䜜業できたす。 ...

2026-02-21 Â· 3 分 Â· jedipunkz

コマンド・ブランチ怜玢を行う Fish Plugin を Go で䜜った話

jedipunkz です。 今回は自䜜した Fish シェルの Plugin である fuzz.fish を玹介したす。 fuzz.fish は Fish Shell のコマンド履歎ず Git ブランチをむンクリメンタルサヌチできる Fish Plugin [です。Go ず charmbracelet/bubbletea を䜿っお TUI を実装しおおり、Fisher でむンストヌルするず自動的にバむナリがビルドされたす。 ゜ヌスコヌド https://github.com/jedipunkz/fuzz.fish スクリヌンショット ちょっず芋た感じわかりにくいですがコマンド怜玢ずブランチ怜玢に察応しおいたす。 開発動機 幟぀か小さなツヌルはこれたでも䜜っおきたしたが利甚する機䌚が枛るずメンテナンスも怠りがちなこずに気が付き、自分自身がよく䜿うツヌルを䜜ろうず思ったのがきっかけです。 そしお普段から Fish をシェルずしお䜿っおいたすがコマンド履歎怜玢や Git ブランチの切り替えをより効率的に出来れば䜕より自分にずっお䟿利なツヌルになる予感がありたした。。既存のツヌルもありたすが、以䞋の点を満たすものを䜜りたいず考えたした。 䞻な機胜 fuzz.fish は以䞋の機胜を持っおいたす。今埌も远加しおいく予定です。 コマンド履歎ず Git ブランチ怜玢を1぀のツヌルで切り替えられる コマンド履歎怜玢時にそのコマンドを実行した前埌のコマンドの衚瀺・時間情報も付け加えお衚瀺 Fisher でシンプルにむンストヌルできる Go で実装しお高速に動䜜䞔぀ Fish スクリプト単䜓では実珟出来ない機胜远加に備える むンストヌル方法 ※ 事前に Go がロヌカルにむンストヌルされおいる必芁がありたす。 ※ むンストヌル時に自動的に GitHub から゜ヌスをクロヌンし、Go でバむナリをビルドしたす。 Fisher を䜿っおむンストヌルしたす。 fisher install jedipunkz/fuzz.fish 䜿い方 コマンド履歎怜玢 (Ctrl+R) 基本的な䜿い方です。Fish プロンプトで Ctrl+R を抌すずコマンド履歎のファゞヌ怜玢が起動したす。 ...

2026-01-17 Â· 1 分 Â· jedipunkz

Discord サヌバ運営を補助する Go 実装のボット開発

自分は Discord サヌバの運営を行っおいるのですがその運営の補助をしおもらうためにボット開発を行っおいたす。Go で Discord ボットを開発しメンバヌ数の掚移やログ分析を行うシステムを構築しおいる話ずたたその他幟぀か機胜をもっおいお日々の䜜業の効率化を図っおいたす。この蚘事ではそのボットの玹介をさせお頂きたす。 ※ 以前の蚘事 https://jedipunkz.github.io/post/discord-exporter/ の内容を含んでいたす システム構成 このシステムは以䞋の3぀の䞻芁コンポヌネントで構成されおいたす。 Discord ボット(padawan) - Go 補の Discord ボット discord-exporter - Go 実装の Discord サヌバメトリクス収集甚 Prometheus Exporter 分析基盀 - DuckDB を甚いた構造化ログの分析コンテナ 構成図は䞋蚘になりたす。Prometheus Exporter は Discord API から情報を取埗し Prometheus Server にメトリクスを提䟛。Prometheus Server はそのメトリクスをポヌリングしストレヌゞにデヌタを蓄積。Grafana はそれをデヌタ゜ヌスずしお参照。padawan は Go 実装のボットで Discord API やその他ゲヌム甚 API 等を参照し機胜提䟛。ボットず隣接しおある DuckDB コンテナはボットのログを分析するための Go 実装の CLI を備える。 構成の詳现 ボットの構成 padawan ず名前のボットずそのボットのログを分析する DuckDB コンテナで構成されおいたす。 # padawan/docker-compose.yaml services: padawan: build: context: . dockerfile: Dockerfile volumes: - ./data:/root/data - ./logs:/logs restart: always duckdb: build: context: . dockerfile: Dockerfile.duckdb volumes: - ./logs:/logs:ro restart: "no" profiles: - tools discord-exporter の構成 Go 実装の Discord API から情報を収集する Exporter を䞭心ずし Grafana, Prometheus Server を構成ずしおも持っおいたす。 ...

2025-12-30 Â· 5 分 Â· jedipunkz

Claude Code から OpenCode ぞ移行した話

jedipunkz🚀 です。 最近、AI コヌディングアシスタントずしお䜿っおいた Claude Code から OpenCode に移行したした。この蚘事では OpenCode の優れた機胜ず、なぜ移行を決めたのかの決めおを玹介したす。 泚蚘 (2025-12-28) OpenCode プロゞェクトは、2024幎7月に開発元の Charm 瀟による買収ず運営方針を巡っお、コントリビュヌタヌ間で論争が発生したした。その埌、Charm 版は Crush ずしおリブランドされ、珟圚の OpenCode は SST 組織によっお https://github.com/sst/opencode で開発が継続されおいたす。䞡プロゞェクトは珟圚も別々のツヌルずしお存圚しおおり、この蚘事では SST 版の OpenCode に぀いお玹介しおいたす。 OpenCode ずは OpenCode は、タヌミナルベヌスのオヌプン゜ヌス AI コヌディング゚ヌゞェントです。75以䞊の LLM プロバむダヌをサポヌトし、高床にカスタマむズ可胜なむンタヌフェヌスを提䟛したす。 公匏サむト: https://opencode.ai/ 公匏ドキュメント: https://opencode.ai/docs GitHub: https://github.com/opencode-ai/opencode Claude Code から移行した理由 1. 日本語入力 Claude Code では、日本語入力の倉換䞭に文字が暪にずれる珟象が頻繁に発生し、非垞にストレスでした。 OpenCode では、この問題が発生せず日本語入力が自然に行えたす。地味ですが䞀番自分にずっお倧きいメリットだったかもしれたせん。 2. 柔軟なキヌバむンド蚭定 OpenCode の最倧の魅力は、キヌバむンドを自由にカスタマむズできる点です。 日本語入力 Claude Code では、日本語入力の倉換䞭に文字が暪にずれる珟象が頻繁に発生し、非垞にストレスでした。 OpenCode では、この問題が発生せず、日本語入力が自然に行えたす。TUITerminal User Interfaceの実装が優れおおり、IME ずの盞性も良奜です。 Emacs 颚のキヌバむンドをサポヌト Emacs 颚のキヌバむンドが蚭定出来る点は自分にずっおは倧きかったです。蚭定せずずも自然に Emacs 颚にバむンドされおいるキヌもありたす。 Ctrl-a: 行頭に移動 Ctrl-e: 行末に移動 Ctrl-h: 䞀文字削陀 Ctrl-k: カヌ゜ル䜍眮から行末たで削陀 Ctrl-f, Ctrl-b: 前埌に移動 "keybinds": { "input_backspace": "backspace,shift+backspace,ctrl+h", "input_delete_to_line_end": "ctrl+k" }, Enter ず Ctrl-Enter を䜿い分け可胜 特に䟿利なのが、改行ずメッセヌゞ送信を分離できる点です ...

2025-12-28 Â· 4 分 Â· jedipunkz

Conftest OPA で Terraform コヌド開発に制玄を蚭ける

こんにちは。jedipunkz🚀 です。 Conftest ず Open Policy Agent (OPA) を䜿った Terraform のポリシヌ怜蚌を行ったのでそれを蚘事にしたいず思いたす。ポリシを曞くこずで Terraform コヌドに制玄を加え、セキュリティ芁件(䟋えば暗号化芁件やポヌト開攟芁件等) を満たしたりベストプラクティスにそったむンフラを構築できたす。毎回レビュヌで人にチェックさせるよりも確実に制玄を守れるようになるのでおすすめです。 この蚘事では、Conftest ず OPA を䜿っお、Terraform コヌドに自動的にポリシヌチェックを適甚する方法をチュヌトリアル圢匏で解説したす。 1. Conftest 抂芁ず基本チュヌトリアル 1.1 Conftest ずは Conftest は、構造化された蚭定デヌタに察しおポリシヌをテストするためのツヌルです。Open Policy Agent (OPA) の Rego 蚀語を䜿甚しおポリシヌを蚘述し、さたざたな蚭定ファむルを怜蚌できたす。 Conftest の特城 汎甚性が高い Terraform.tf、tfplan.json KubernetesYAML、JSON Dockerfile その他の JSON/YAML ファむル シンプルで軜量 単䞀のバむナリで動䜜 倖郚䟝存なし CI/CD に簡単に統合可胜 OPA の Rego 蚀語を採甚 宣蚀的なポリシヌ蚘述 匷力なパタヌンマッチング テスト可胜なポリシヌコヌド なぜ Conftest が必芁なのか 埓来のむンフラ管理では、以䞋のような課題がありたした。 レビュヌで毎回同じ指摘「暗号化を有効にしおください」など 人的ミスによるセキュリティホヌル 環境間での蚭定の䞍敎合 コンプラむアンス違反の芋萜ずし Conftest を䜿うこずで、これらの課題を解決できたす。 ポリシヌをコヌドで自動チェック デプロむ前に問題を怜出 䞀貫したガバナンスの実珟 レビュヌ負荷の軜枛 1.2 セットアップ 1.2.1 Conftest のむンストヌル macOS の堎合 ...

2025-12-07 Â· 10 分 Â· jedipunkz