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
コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくっ...
Search
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
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
270
適応的スパムフィルタのための軽量な類似メッセージカウンタ / jsai2026-adaptive-spam-filter
monochromegane
0
5.7k
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
3
920
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
810
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
310
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
570
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
50k
ベクトル検索システムの気持ち
monochromegane
38
13k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
340
Other Decks in Programming
See All in Programming
SREの越境 / SRE Collaboration
y0hgi
2
290
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
420
カツオ、ご期待ください
suneo3476
0
130
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
410
iOSDCのペンライトを自動制御したい!
akkeylab
0
320
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
230
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
260
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
180
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
520
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
210
すこし踏み込む CancellationToken
htkym
2
1.5k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
1
110
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
690
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
240
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Believing is Seeing
oripsolob
1
230
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
500
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
Facilitating Awesome Meetings
lara
57
7.2k
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