Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自作 CLI ツールのワークフローとそれを支える技術 / the workflow of my...
Search
ktr
May 29, 2018
Technology
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自作 CLI ツールのワークフローとそれを支える技術 / the workflow of my CLI tool and technologies which supports it
ktr
May 29, 2018
More Decks by ktr
See All by ktr
詳解 MCP Go SDK / MCP Go SDK
ktr_0731
3
630
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
610
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.6k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
11k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
440
Designing libraries in Go way
ktr_0731
6
1.6k
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
250
Fuzzy finder as a Go library
ktr_0731
3
6.3k
Other Decks in Technology
See All in Technology
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
330
SONiCの統計情報を取得したい
sonic
0
240
人材育成分科会.pdf
_awache
4
300
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
120
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.3k
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.1k
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
550
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.3k
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
280
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
Kiro Ambassador を目指す話
k_adachi_01
0
110
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Speed Design
sergeychernyshev
33
1.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
320
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
It's Worth the Effort
3n
188
29k
Practical Orchestrator
shlominoach
191
11k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
440
Exploring anti-patterns in Rails
aemeredith
3
420
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
610
Transcript
at u-aizu LT spring ࣗ࡞ CLI πʔϧͷϫʔΫϑϩʔͱ ͦΕΛࢧ͑Δٕज़
!LUS@ LUSɺΩλϩʔ ձେֶT XIPBNJ
!LUS@ LUSɺΩλϩʔ ձେֶT ແ৬ XIPBNJ
None
None
None
$-*πʔϧͷ ϝϯςφϯεͷ
w ΞοϓσʔτΛ͑Δखஈ͕ͳ͍ w खಈͰ ܧଓతʹϦϦʔε͢Δίετ ϝϯςφαΠυ
w ࠷৽͔Ͳ͏͔͔Βͳ͍ w Ξοϓσʔτ͕खؒ ϢʔβαΠυ
w (PQIFSɺαʔόΤϯδχΞҎ֎ Ϣʔβͱͯ͠ఆ w ࠷దͳΠϯετʔϧํ๏Λఏڙ͍ͨ͠ LUSFWBOT
w ϢʔβΠϯετʔϧํ๏ΛબΜͰΠϯετʔϧ w ϢʔβΞοϓσʔτΛߦ͏͔ΛબͿ͚ͩ w ΞοϓσʔτΛ֬ೝͤ͞ͳ͍ w Ξοϓσʔτํ๏Λߟ͑ͤ͞ͳ͍ ΄Μͱ͏ʹඞཁͳ͜ͱ
˞ Ҏ߱ͷϑϩʔ(PϓϩδΣΫτΛ લఏͱ͍ͯ͠·͢
$* SFQPTJUPSZ (JU)VC3FMFBTFT )PNFCSFXGPSNVMB commit fire create VTFS update
NBJOUBJOFS OFXWFSTJPO bump
w ϓϩδΣΫτͷόʔδϣχϯά w $*ͱ࿈ܞͨ͠ϏϧυɺϦϦʔε w πʔϧͷࣗಈతͳΞοϓσʔτ $* SFQPTJUPSZ (JU)VC3FMFBTFT )PNFCSFXGPSNVMB
commit fire create VTFS update NBJOUBJOFS OFXWFSTJPO bump
$* SFQPTJUPSZ (JU)VC3FMFBTFT )PNFCSFXGPSNVMB commit fire create VTFS update
NBJOUBJOFS OFXWFSTJPO bump LUSHPTFNWFS
ηϚϯςΟοΫόʔδϣχϯά cmd/bumpʹΑΔߋ৽ LUSHPTFNWFS var v = semver.MustParse("0.3.1") $ bump patch
main.go package main ... var v = semver.MustParse("0.3.2") CLI main.go
"45ม͠ɺόʔδϣϯΛ୳͢ ͜ͱͰɺ҆શʹॻ͖͕͑Մೳ LUSHPTFNWFS *ast.CallExpr { . Fun: *ast.SelectorExpr { .
. X: *ast.Ident { . . . NamePos: meta.go:10:12 . . . Name: "semver" . . } . . Sel: *ast.Ident { . . . NamePos: meta.go:10:19 . . . Name: "MustParse" . . } . } . Lparen: meta.go:10:28 . Args: []ast.Expr (len = 1) { . . 0: *ast.BasicLit { . . . ValuePos: meta.go:10:29 . . . Kind: STRING . . . Value: "\"0.3.1\"" . . } . } . Ellipsis: - . Rparen: meta.go:10:36 }
NJUDIFMMIHPYUDOLTNHIS $* SFQPTJUPSZ (JU)VC3FMFBTFT )PNFCSFXGPSNVMB commit fire create VTFS
update NBJOUBJOFS OFXWFSTJPO bump
ෳϓϥοτϑΥʔϜ͚ʹϏϧυ (JU)VC3FMFBTFTͷ NJUDIFMMIHPY UDOLTNHIS mitchellh/gox gox -osarch "$OSARCH" . for
f in *; do mv "$f" evans tar cvzf "$f.tar.gz" evans rm -f evans done tcnksm/ghr git tag "$VERSION" git push origin "$VERSION" ghr "$VERSION" pkg
LUSHPVQEBUFS $* SFQPTJUPSZ (JU)VC3FMFBTFT )PNFCSFXGPSNVMB commit fire create VTFS
update NBJOUBJOFS OFXWFSTJPO bump
w ࣗಈΞοϓσʔτ༻ϥΠϒϥϦ w ҙͷखஈ .FBOT ͰΞοϓσʔτ͕Մೳ LUSHPVQEBUFS
var current = semver.MustParse("0.2.0") func main() { means, _ :=
updater.NewMeans( github.GitHubReleaseMeans("ktr0731", "evans", nil), ) u := updater.New(current, means) updatable, new, _ := u.Updatable(context.Background()) if updatable { _ = u.Update(context.Background()) fmt.Printf("updated: %s ! %s\n", current, new) } }
var current = semver.MustParse("0.2.0") func main() { means, _ :=
updater.SelectAvailableMeansFrom( context.Background(), brew.HomebrewMeans("ktr0731/evans", "evans"), github.GitHubReleaseMeans("ktr0731", "evans", nil), ) u := updater.New(current, means) updatable, new, _ := u.Updatable(context.Background()) if updatable { _ = u.Update(context.Background()) fmt.Printf("updated: %s ! %s\n", current, new) } }
$-*Ϟʔυ 3&1-Ϟʔυ autoUpdate USVF ΞοϓσʔτΛ ߦΘͳ͍ ϓϩϯϓτඇදࣔ ඇಉظΞοϓσʔτ autoUpdate GBMTF
ΞοϓσʔτΛ ߦΘͳ͍ ϓϩϯϓτදࣔ ಉظΞοϓσʔτ
None
w HPTFNWFSʹΑΔόʔδϣχϯά w HPYHISʹΑΔϏϧυɺϦϦʔε w HPVQEBUFSʹΑΓɺΞοϓσʔτखॱʹ ؔ͢ΔࣝΛϢʔβ͔Βશʹ ·ͱΊ
w IUUQTNPUFNFOIBUFOBCMPHDPNFOUSZ HPHPCVNQWFSTJPOJOH w IUUQTEFFFFUDPNXSJUJOHHIS w IUUQTTZGNIBUFOBCMPHDPNFOUSZ ࢀߟ
w (P-PHPJT$PQZSJHIU5IF(P"VUIPST "MMSJHIUTSFTFSWFE $PQZSJHIU