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
コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくっ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
monochromegane
October 25, 2019
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくった/fukuokago14_flagen
Fukuoka.go#14+Umeda.go
https://fukuokago.connpass.com/event/146447/
monochromegane
October 25, 2019
More Decks by monochromegane
See All by monochromegane
適応的スパムフィルタのための軽量な類似メッセージカウンタ / jsai2026-adaptive-spam-filter
monochromegane
0
4.2k
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
3
800
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
580
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
260
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
410
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
25k
ベクトル検索システムの気持ち
monochromegane
38
13k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
310
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
370
Other Decks in Programming
See All in Programming
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
340
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.7k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
250
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
380
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
3.4k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
790
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
470
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
130
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
210
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Visualization
eitanlees
152
17k
Thoughts on Productivity
jonyablonski
76
5.2k
Mind Mapping
helmedeiros
PRO
1
280
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Ruling the World: When Life Gets Gamed
codingconduct
0
270
Making Projects Easy
brettharned
120
6.7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
310
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Transcript
ࡾ༔հ / Pepabo R&D Institute, GMO Pepabo, Inc. 2019.10.25 Fukuoka.go#14+Umeda.go
ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ ΔίʔυΛίϚϯυϥΠϯΦϓγϣϯ ͔Βੜ͢ΔπʔϧΛͭͬͨ͘
1SJODJQBMFOHJOFFS :VTVLF.*:",&!NPOPDISPNFHBOF 1FQBCP3%*OTUJUVUF (.01FQBCP *OD IUUQTCMPHNPOPDISPNFHBOFDPN
GopherCon 2019 3 :VTVLF.JZBLF 0QUJNJ[BUJPOGPS/VNCFSPGHPSPVUJOFT6TJOH'FFECBDL$POUSPM (PQIFS$PO.BSSJPUU.BSRVJT4BO%JFHP.BSJOB $BMJGPSOJB +VMZ
1. ͡Ίʹ 2. ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ΔίʔυΛίϚϯ υϥΠϯΦϓγϣϯ͔Βੜ͢Δ 3. ·ͱΊ 4 ࣍
1. ͡Ίʹ
• ίϚϯυϥΠϯϓϩάϥϜͷڍಈΛ࣮ߦ࣌ʹมߋͤ͞ΔͨΊʹ֎෦͔ΒҾ ΦϓγϣϯΛࢦఆ͢Δ • ୯ͳΔจࣈྻͰ͋ΔͨΊɺίϚϯυϥΠϯϓϩάϥϜͰ͜ΕΒͷղੳॲཧΛ ߦ͍ɺ෦ͷมͱ֨ೲ͢Δ • ࠷୯७ͳͷͰ͋Εɺۭന۠Γ (cp src
dest) • Ґஔ͕ҙຯΛ͕࣋ͭ׳श͋ΕͲɺ͜ͷؔੑ໌֬Ͱͳ͍ • Ґஔʹґଘ͠ͳ͍Φϓγϣϯܗࣜ (cp -r, head -n 10…) • ϢʔβϑϨϯυϦʔͰ͋Δ͕ղੳॲཧෳࡶʹͳΔ 6 ίϚϯυϥΠϯҾͱΦϓγϣϯ
• ίϚϯυϥΠϯΦϓγϣϯͷղੳॲཧݴޠඪ४ͷͷϥΠϒϥϦ͔Βͨ͘ ͞Μఏڙ͞Ε͍ͯΔʢflag, getopts, argparse, optparse…ʣ • શ෦Λ֮͑Δͷ͍͠ͷͰɺݴޠϥΠϒϥϦ͝ͱʹυΩϡϝϯτΛࢀর͠ ͳ͕Β࣮͢Δ •
Ͳ͏͕͔͔ͯ࣌ؒ͠Δ • ఆܕॲཧͰ͋Δ͜ͱ͔Βɺߟ͑͏ΔύλʔϯΛهड़ͨ͠ϘΠϥʔςϯϓϨʔτ Λ४උ͢Δ • ൚༻తͳϘΠϥʔςϯϓϨʔτͲ͏ͯ͠ฤूՕॴ͕ଟ͘ͳΔʢΦϓγϣ ϯ໊ɺม໊ɺσϑΥϧτ…ʣ 7 ίϚϯυϥΠϯΦϓγϣϯ
8 ίϚϯυϥΠϯΦϓγϣϯղੳͷ՝ͷཧ $ mycli --dist erlang -e k/l --lambda 1.5
-k 1 -v 1. ίϚϯυϥΠϯΦϓγϣϯͷܗࣜΛݕ౼͢Δ 2. ࣮͢Δ 1. υΩϡϝϯτͷࢀরͱ࣮ 2. ϘΠϥʔςϯϓϨʔτͷίϐʔͱฤू 3. ຊདྷͷॲཧͷ࣮
9 ίϚϯυϥΠϯΦϓγϣϯղੳͷ՝ͷཧ $ mycli --dist erlang -e k/l --lambda 1.5
-k 1 -v 1. ίϚϯυϥΠϯΦϓγϣϯͷܗࣜΛݕ౼͢Δ 2. ࣮͢Δ 1. υΩϡϝϯτͷࢀরͱ࣮ 2. ϘΠϥʔςϯϓϨʔτͷίϐʔͱฤू 3. ຊདྷͷॲཧͷ࣮ ͜͜ͷ࣌ؒΛݶΓͳ͘ θϩʹ͚͍ۙͮͨ
2. ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ΔίʔυΛ ίϚϯυϥΠϯΦϓγϣϯ͔Βੜ͢Δ
• A command line option parser generator (Flag-gen). • https://github.com/monochromegane/flagen
• ࣮ࡍʹ͏ࡍͷίϚϯυϥΠϯΦϓγϣϯ͔ΒɺʮͦͷʯίϚϯυϥΠϯΦϓ γϣϯΛղੳ͢ΔϘΠϥʔςϯϓϨʔτΛੜ͢Δ • ͍ํΛࢥ͍ු͔Δͱ࣮͕Ͱ͖͍ͯΔʂʂ 11 flagen
Usage $ flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS... 12 • ςϯϓϨʔτͱ࣮ࡍʹ͏࣌ͷίϚϯυϥΠϯΦϓγϣϯΛ͚ͩ͢ • ϓϦηοτͷςϯϓϨʔτͱͯ͠ɺGoɺRubyɺPythonɺShellΛఏڙ
• ϑΝΠϧύεΛࢦఆ͢ΕಠࣗςϯϓϨʔτར༻Մೳʢޙड़ʣ
Example of Go (preset template) 13 $ flagen go --dist
erlang -e k/l --lambda 1.5 -k 1 -v var ( dist string e string lambda float64 k int v bool ) func init() { flag.StringVar(&dist, "dist", "erlang", "usage of dist") flag.StringVar(&e, "e", "k/l", "usage of e") flag.Float64Var(&lambda, "lambda", 1.5, "usage of lambda") flag.IntVar(&k, "k", 1, "usage of k") flag.BoolVar(&v, "v", false, "usage of v") } ίϚϯυϥΠϯΦϓγϣϯ໊͔Βม໊Λੜ ίϚϯυϥΠϯΦϓγϣϯ͔ΒܕΛਪଌ ࣮ࡍʹ༻͢ΔίϚϯυϥΠϯΦϓγϣϯ͔Β ίϚϯυϥΠϯͷղੳॲཧΛੜ
Example of Python (preset template) 14 $ flagen py --dist
erlang -e k/l --lambda 1.5 -k 1 -v import argparse parser = argparse.ArgumentParser() parser.add_argument("--dist", default="erlang", help="Help of dist") parser.add_argument("-e", default="k/l", help="Help of e") parser.add_argument("--lambda", type=float, default=1.5, help="Help of lambda") parser.add_argument("-k", type=int, default=1, help="Help of k") parser.add_argument("-v", action="store_false", help="Help of v") args = parser.parse_args() ϋϚΓ͕ͪͳ1ZUIPOͷCPPMͷσϑΥϧτͷઃఆ ϘΠϥʔςϯϓϨʔτͳͷͰେৎ
Example of Ruby (preset template) 15 $ flagen rb --dist
erlang -e k/l --lambda 1.5 -k 1 -v require 'optparse' opts = { dist: 'erlang', e: 'k/l', lambda: 1.5, k: 1, v: false, } OptionParser.new do |op| op.on('--dist [VALUE]', 'Desc of dist') {|v| opts[:dist] = v } op.on('-e [VALUE]', 'Desc of e') {|v| opts[:e] = v } op.on('--lambda [VALUE]', 'Desc of lambda') {|v| opts[:lambda] = v.to_f } op.on('-k [VALUE]', 'Desc of k') {|v| opts[:k] = v.to_i } op.on('-v', 'Desc of v') {|v| opts[:v] = v } op.parse!(ARGV) end
Example of Shell (preset template) 16 $ flagen sh --dist
erlang -e k/l --lambda 1.5 -k 1 -v E="k/l" K="1" V="FALSE" while getopts e:k:v OPT do case $OPT in "e" ) E="$OPTARG";; "k" ) K="$OPTARG";; "v" ) V="TRUE";; esac done shift `expr $OPTIND - 1` HFUPQUTҰจࣈͷҾ͚ͩѻ͑ΔͷͰ͍Φϓγϣϯແࢹ
• ͪΖΜflagenಠࣗςϯϓϨʔτ͑Δ • ςϯϓϨʔτGoͷtext/templateΛͬͯॲཧ • `.Flags`ʹΦϓγϣϯͷղੳ݁Ռ • NameͱValueΛ࣋ͭ • Value͞ΒʹTypeͱGetΛ࣋ͭ
• `.Args`ʹΓͷҾ 17 Template
Template
Template {{ range $flag := .Flags -}} {{ $flag.Name }}={{
$flag.Value.Get}}({{ $flag.Value.Type }}) {{ end }} 19 $ flagen my.tmpl --dist erlang -e k/l --lambda 1.5 -k 1 -v dist=erlang(string) e=k/l(string) lambda=1.5(float) k=1(int) v=false(bool)
Template (Functions) {{ range $flag := .Flags -}} {{ ToCamel
$flag.Name }}={{ $flag.Value.Get}} {{ end }} 20 Dist=erlang E=k/l Lambda=1.5 K=1 V=false
Collaboration
• flagenΛΤσΟλͱ࿈ܞ͢Δ • ྫ͑VimͰҎԼʹΑΓɺΧʔιϧҐஔʹ݁ՌΛૠೖ͢Δ͜ͱ͕Ͱ͖Δɻ ʢಈతͳίʔυεχϖοτͱͯ͠ͷར༻ʣ 22 Collaboration :r!flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS...
• flagenΛࣗલͷϘΠϥʔςϯϓϨʔτπʔϧͱ࿈ܞ͢Δ • πʔϧ͕GoͰ͋ΕɺflagenΛϥΠϒϥϦͱͯ͠ར༻͢Δ͜ͱ͕Ͱ͖Δ 23 Collaboration tmpl, err := flagen.NewTemplate(args[0])
if err != nil { return err } return tmpl.Execute(outStream, args[1:]) ςϯϓϨʔτΛࢦఆ ग़ྗઌͱ ίϚϯυϥΠϯΦϓγϣϯΛࢦఆ 4FFBMTP<(PEPD> IUUQTHPEPDPSHHJUIVCDPNNPOPDISPNFHBOFqBHFO
Workaround
• ᐆດͳϑϥά • flagenΦϓγϣϯʹ͕ࢦఆ͞Ε͍ͯͳ͍ͱ͖ʹboolͩͱݟͳͨ͢Ίɺ boolϑϥάͰऴΘͬͯҾ͕͋Δ߹ʹஅ͕͔ͭͳ͍ • ఆͲ͓Γʹ͢ΔͨΊʹͱͯ͠true or falseΛड͚औΔ͜ͱΛ໌ࣔ͢Δ 25
Workarounds - Ambiguous flag $ flagen TEMPLATE --bool-flag arg1 $ flagen TEMPLATE --bool-flag=false arg1
Implementation of template
• ExampleςετΛ༻ҙͯ͠ग़ྗ݁ՌΛςετ͢Δ͠ • Godocʹྫ͕ग़ྗ͞ΕΔͷͰศར • ग़ྗ༗ແͷΓ͚ with action͕ศར 27 ςϯϓϨʔτͷ࣮
3. ·ͱΊ
• ༷ʑͳ࣮͕ఏڙ͞Ε͍ͯΔίϚϯυϥΠϯΦϓγϣϯͷղੳॲཧΛར༻ܗࣜ ͔Βಈతʹੜ͢ΔδΣωϨʔλʔͱͯ͠flagenΛͭͬͨ͘ • ͍͔ͭ͘ͷݴޠͷςϯϓϨʔτΛ༻ҙͯ͠ΤσΟλͱ࿈ܞͤ͞Δ͜ͱͰCLI։ ൃͷޮ͕վળͨ͠ • flagenࣗମͷΦϓγϣϯͱͯ͠prefixͳͲΛఏڙ͢Εߏମͱͷ૬ੑΑ͘ ͳΓͦ͏ (hoge.nameͷΑ͏ͳ͍ํ)
• ςϯϓϨʔτՃͷϓϧϦΫΤετΠγϡʔͳͲ͓͍ͪͯ͠·͢ • https://github.com/monochromegane/flagen 29 ·ͱΊ
None