Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
alecthomas/kong はいいぞ / kamakura.go#7
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
FUJIWARA Shunichiro
December 13, 2024
Technology
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
alecthomas/kong はいいぞ / kamakura.go#7
https://kamakurago.connpass.com/event/336353/
FUJIWARA Shunichiro
December 13, 2024
More Decks by FUJIWARA Shunichiro
See All by FUJIWARA Shunichiro
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
610
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2.2k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
6.4k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
430
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
14k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
7k
alecthomas/kong はいいぞ
fujiwara3
7
2.7k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.9k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
5.8k
Other Decks in Technology
See All in Technology
公共分野での生成AI活用
toru_kubota
1
320
TSKaigi Sendai 2026 - tsgo時代のTypeScript Playgroundはどう動くか
teamlab
PRO
0
120
Bots in Kiro Crew (One point of contact for ongoing work) | Kiro: Zero to Hero 12
inariku
PRO
1
120
[JAWS Festa 2026]一番いい仕事は、請求書に現れない / jawsfesta2026
sh_fk2
2
440
evcc & Home Assistant
naltatis
0
500
Kiro CLI 入門 (ターミナルと CI で使う) | 目指せ Kiro マスター 03
inariku
PRO
2
120
Building Audio Plugin Ecosystem for Android in 2026
atsushieno
2
160
The future of architectural work
ufried
0
200
サボる子はいねぇがー!AgentCoreハーネスの脆弱性に学ぶ、エージェントの入力バリデーション
iwamot
PRO
5
320
コードレビューをなくして見えたもの
henteko
0
150
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
2
210
令和の今、あらためて IAM を考える。アクセスキーを「無くせない現実」との向き合い方
kazzpapa3
0
590
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
990
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
980
HDC tutorial
michielstock
2
1k
Six Lessons from altMBA
skipperchong
29
4.6k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
660
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.7k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
560
Transcript
alecthomas/kong はいいぞ 2024.12.13 kamakura.go #7 @fujiwara
自己紹介 @fujiwara (X, GitHub, Bluesky) 面白法人カヤック SREチーム ISUCON 優勝4回 /
運営5回 github.com/kayac/ecspresso github.com/fujiwara/lambroll
CLI flag parser、何を使ってますか? ChatGPT-4o にお勧めを聞いてみたらこんな感じ flag (標準) spf13/pflag spf13/cobra urfave/cli
alecthomas/kong 特に異存はないけど今日は alecthomas/kong をお勧めする話をします
https://github.com/alecthomas/kong
package main import "github.com/alecthomas/kong" var CLI struct { Rm struct
{ Force bool `help:"Force removal."` Recursive bool `help:"Recursively remove files."` Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` } `cmd:"" help:"Remove files."` Ls struct { Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` } `cmd:"" help:"List paths."` } func main() { ctx := kong.Parse(&CLI) switch ctx.Command() { case "rm <path>": case "ls": default: panic(ctx.Command()) } }
サブコマンドと引数を構造体に定義 var CLI struct { Rm struct { Force bool
`help:"Force removal."` Recursive bool `help:"Recursively remove files."` Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` } `cmd:"" help:"Remove files."` Ls struct { Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` } `cmd:"" help:"List paths."` } rm コマンドには --force , --recursive 、 paths (複数可)が引数 command rm --force --recursive foo bar ls コマンドには paths (複数可)が引数 command ls foo bar baz
定義した構造体を kong.Parse に渡して解析 func main() { ctx := kong.Parse(&CLI) //
このctxはcontext.Context**ではない**ので注意 switch ctx.Command() { case "rm <path>": case "ls": default: panic(ctx.Command()) } } 基本はこれだけ コマンドラインから渡された引数( os.Args )を解析して構造体に入れてくれる その後のコードは好きに書いていい
kong のいいところ 宣言的。サブコマンドまで含めて一目でオプションが把握できる map ( Foo map[string]int → --foo="x=1;y=2;z=3" )
slice ( Foo []string → --foo=x --foo=y ) struct tag でいろいろ設定できる required:"" (必須) default:"value" (デフォルト値の設定) short:"x" (短縮形 -x を生成) negatable:"" (bool型の否定形を生成 --limit → --no-limit ) enum:"a,b,c" (a,b,cいずれかの値を要求) env:"FOO" (環境変数FOOを読む) などなど コードの書き方を強要されない CLIフレームワークではない、パーサー
応用例 例えば Lambda 関数を Go で書く場合、設定値は環境変数から読む func main() { lambda.Start(handler)
} func handler(ctx context.Context) error { // ダメな例 s3Bucket := os.Getenv("BUCKET") if s3Bucket == "" { return errors.New("BUCKET is required") } // ... } 環境変数がないときにエラーになるのは「関数の実行時」 デプロイ直後には発覚しない、めったに通らないところにこれが埋まっていると…?
環境変数を読むのは kong に任せる var CLI struct { Bucket string `env:"BUCKET"
required:"" help:"S3 BUCKET"` LogLevel string `env:"LOG_LEVEL" default:"info" help:"Log level"` } func main() { ctx := kong.Parse(&CLI) // ここで CLI に値が入っている // 必須がなければエラー、デフォルト値も埋まっている lambda.Start(handler) } func handler(ctx context.Context) error { // ここでは CLI の値を使うだけ } こうしておけば、関数の初期化時に確実にエラーになる デフォルト値も設定できる
更に応用 fujiwara/lamblocal と組み合わせる var CLI struct { Bucket string `env:"BUCKET"
required:"" help:"S3 BUCKET"` LogLevel string `env:"LOG_LEVEL" default:"info" help:"Log level"` } func main() { ctx := kong.Parse(&CLI) lamblocal.Run(handler) } func handler(ctx context.Context, in Payload) (Response, error) { // ... } lamblocal: CLIでもLambdaでも動くコマンドを作れる(入出力はSTDIN/STDOUT) $ echo '{"key":"foobar"}' | go run main.go --s3-bucket foo {"result":"ok"}
まとめ alctehomas/kong はパーサー特化、便利なのでお勧めです 最近の fujiwara-ware はだいたい kong を使っています (ecspresso, lambroll
は alecthomas/kingpin から移行)