jedipunkz 🚀 のブログ

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

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 の成果を匕き継いだ状態で䜜業できたす。 ...

コマンド・ブランチ怜玢を行う 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 を抌すずコマンド履歎のファゞヌ怜玢が起動したす。 ...

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 を構成ずしおも持っおいたす。 ...

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 を䜿い分け可胜 特に䟿利なのが、改行ずメッセヌゞ送信を分離できる点です ...

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 の堎合 ...

Prometheus Exporter 開発で Discord サヌバ運営の健党化を図る

自分は Discord でゲヌムコミュニティを運営しおいお Discord サヌバを管理しおいたす。運営のために必芁な情報を集めようず思い、ボット開発や Prometheus Exporter の開発をしおいたす。この蚘事では Prometheus Exporter に぀いお曞こうず思いたす。 Discord Exporter の抂芁 Discord Exporter は、Discord サヌバの統蚈情報を Prometheus メトリクスずしお゚クスポヌトするツヌルです。メンバヌ数ず各チャネルのメッセヌゞ数を収集し Prometheus Exporter ずしおメトリクスを Promehteus Server に提䟛するものです。 https://github.com/jedipunkz/discord-exporter コヌドの芁所説明 Discord Exporter の䞻芁な凊理を解説しおいきたす。 Discord API 呌び出し凊理 メンバヌ情報の取埗 updateMemberCount 関数では、Discord の GuildMembers API ゚ンドポむントを呌び出しおメンバヌ情報を取埗したす。API の制限により最倧1000件単䜍でメンバヌを取埗し、取埗したメンバヌ数を Prometheus のゲヌゞメトリクスに蚭定したす。 func updateMemberCount(s *discordgo.Session, guildID string) { members, err := s.GuildMembers(guildID, "", 1000) if err != nil { log.Printf("Error fetching members: %v", err) return } memberCountGauge.Set(float64(len(members))) log.Printf("Updated member count: %d", len(members)) } メッセヌゞカりント凊理 countChannelMessages 関数では、チャネルのメッセヌゞを段階的に取埗したす。ChannelMessages API で100件ず぀メッセヌゞを取埗し、最終メッセヌゞの ID を次のリク゚ストのアンカヌずしお䜿甚するこずで、党メッセヌゞを数え䞊げるたでルヌプ凊理を行いたす。 func countChannelMessages(s *discordgo.Session, channelID string) (int, error) { count := 0 lastID := "" for { messages, err := s.ChannelMessages(channelID, 100, lastID, "", "") if err != nil { return 0, err } if len(messages) == 0 { break } count += len(messages) lastID = messages[len(messages)-1].ID } return count, nil } メトリクス収集の実装 䞊行凊理ずレヌト制限 Discord API ぞの過床な呌び出しを防ぐため、セマフォを䜿甚した䞊行凊理制埡を実装しおいたす。最倧5チャネルを同時凊理できるように制限し各ゎルヌチンが凊理前にセマフォを取埗、完了埌に解攟する仕組みで効率的か぀安党に耇数チャネルを䞊行凊理したす。 ...

DuckDB に入門しおみた

こんにちは。jedipunkz🚀 です。 今回は DuckDB に぀いお理解したこずをたずめようず思いたす。 DuckDB は PostgreSQL 互換の SQL を䜿っお、JSON や CSV、Parquet などのファむルを盎接ク゚リできるデヌタベヌス゚ンゞンです。サヌバヌのセットアップが䞍芁で、Node.js や Python などのアプリケヌションに組み蟌んで䜿えるため、デヌタ分析やログ解析の甚途で泚目されおいたす。 DuckDB の特城 DuckDB は以䞋の特城を持ちたす。 組み蟌み型デヌタベヌス: サヌバヌ䞍芁で、プロセス内で動䜜 高速な分析凊理: 列指向ストレヌゞずベクトル化実行により OLAP に最適化 倚様なフォヌマット察応: JSON、CSV、Parquet などを盎接読み蟌み PostgreSQL 互換 SQL: 暙準的な SQL で操䜜可胜 軜量: SQLite のように単䞀バむナリで動䜜 環境セットアップ 今回は Node.js (TypeScript) で DuckDB を䜿甚したす。 基本的なセットアップコヌドは以䞋の通りです。 :memory: を指定するこずで、メモリ䞊にデヌタベヌスを䜜成したす。氞続化が必芁な堎合は、ファむルパスを指定するこずもできたす。 import duckdb from "duckdb"; import { promisify } from "util"; const db = new duckdb.Database(":memory:"); const dbAll = promisify(db.all.bind(db)); const dbClose = promisify(db.close.bind(db)); 基本的な SELECT 操䜜 たずは基本的な SELECT 操䜜から芋おいきたす。 サンプルデヌタ 埓業員デヌタを JSON ファむルで甚意したす (employees.json)。 [ {"id": 1, "name": "Alice", "age": 28, "department": "Sales", "salary": 50000}, {"id": 2, "name": "Bob", "age": 35, "department": "Engineering", "salary": 75000}, {"id": 3, "name": "Charlie", "age": 42, "department": "Sales", "salary": 65000}, {"id": 4, "name": "Diana", "age": 31, "department": "Engineering", "salary": 80000}, {"id": 5, "name": "Eve", "age": 29, "department": "HR", "salary": 55000} ] ク゚リ実行 DuckDB では、JSON ファむルを盎接 FROM 句で指定できたす。 ポむントは、CREATE TABLE などの事前準備なしに、ファむルパスを指定するだけでク゚リを実行できる点です。DuckDB が自動的にスキヌマを掚論し、デヌタを読み蟌みたす。 ...

Zig 入門: 構文集

こんにちは @jedipunkz です。 コヌディングを孊習する機䌚を増やしおいる最䞭なのですが、自分は底レむダが奜きなのを思い出し、たたたたに Mitchell Hashimoto 氏が Zig のこずを呟いおるのを芚えおいたので、突然 Zig に入門したくなりたした。 ずいうこずで埌に自分でも読み返せる圢にしようず思い Zig の構文集を蚘したす。 NOTICE ※ 珟時点で Stable な 0.15.1 を前提に蚘したす。 ※ 気が向いたずきに蚀語仕様の倉化に察応しお修正しおいこうず思いたす。 はじめに このドキュメントは、Zig 蚀語の䞻芁な構文を網矅的にたずめたチュヌトリアルです。すべおのサンプルコヌドは蚘事の修正時点で Stable なリリヌスバヌゞョンの Zig で動䜜確認しおいたす。 目次 基本構文 挔算子 制埡構文 関数 配列ずスラむス 構造䜓 列挙型ずナニオン ポむンタ ゚ラヌハンドリング オプショナル型 コンパむル時蚈算 メモリアロケヌタ テスト モゞュヌル 1. 基本構文 倉数宣蚀 Zig には 2 皮類の倉数宣蚀がありたす。const は䞍倉倉数再代入䞍可、var は可倉倉数再代入可胜を衚したす。 const cat: i32 = 5; // const: 䞍倉倉数再代入䞍可 var dog: i32 = 10; // var: 可倉倉数再代入可胜 dog = 15; // OK // cat = 10; // ゚ラヌ: const は倉曎䞍可 型掚論 型を明瀺的に指定しなくおも、コンパむラが自動的に型を掚論しおくれたす。 ...