Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくった/fukuokago14_flagen
monochromegane
October 25, 2019
Programming
0
1.4k
コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくった/fukuokago14_flagen
Fukuoka.go#14+Umeda.go
https://fukuokago.connpass.com/event/146447/
monochromegane
October 25, 2019
Tweet
Share
More Decks by monochromegane
See All by monochromegane
迅速な学習機構を用いて逐次適応性を損なうことなく非線形性を扱う文脈付き多腕バンディット手法/extreme_neural_linear_bandits
monochromegane
0
230
再帰化への認知的転回/the-turn-to-recursive-system
monochromegane
0
310
仮想的な探索を用いて文脈や時間の経過による番狂わせにも迅速に追従する多腕バンディット手法/wi2_lkf_bandits
monochromegane
0
320
Synapse: 文脈と時間経過に応じて推薦手法の選択を最適化するメタ推薦システム/smash21-synapse
monochromegane
0
240
なめらかなシステムと運用維持の未来/dicomo2021-coherently-fittable-system
monochromegane
1
9.5k
go:embedでExplainable Binaryを作る/fukoukago17_go_code_embedding
monochromegane
2
180
非定常な多腕バンディット問題において効率的に変化を察知する方式の検討/wsa8_predictive_exploratory_model
monochromegane
0
2.2k
変化検出と要約データ構造を用いた利用者の嗜好の変化に迅速に追従する多腕バンディット手法/iots2020-adaptive-linear-mab
monochromegane
0
620
嗜好伝達コミュニケーションの効率化を目指した伝達方式の検討/wsa7_local_preference
monochromegane
0
2.6k
Other Decks in Programming
See All in Programming
Becoming an Android Librarian (Android World Wide 2023 Jan)
skydoves
2
220
Hasura の Relationship と権限管理
karszawa
0
180
ITエンジニア特化型Q&Aサイトteratailを 言語、DB、クラウドなど フルリプレイスした話
leveragestech
0
440
Remote SSHで行うVS Codeリモートホスト開発とトラブルシューティング
smt7174
1
510
42tokyo-born2beroot-review
love42
0
120
データドリブンな組織の不正検知
fkubota
0
300
Rによる大規模データの処理
s_uryu
2
640
AWSとCPUのムフフな関係
cmdemura
0
480
Writing Greener Java Applications
hollycummins
0
360
ECS Service Connectでマイクロサービスを繋いでみた
xblood
0
740
Azure Functionsをサクッと開発、サクッとデプロイ/vscodeconf2023-baba
nina01
1
350
(新米)エンジニアリングマネージャーのしごと #RSGT2023
murabayashi
9
5.9k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Pencils Down: Stop Designing & Start Developing
hursman
114
10k
The MySQL Ecosystem @ GitHub 2015
samlambert
240
11k
VelocityConf: Rendering Performance Case Studies
addyosmani
317
22k
The Art of Programming - Codeland 2020
erikaheidi
36
11k
No one is an island. Learnings from fostering a developers community.
thoeni
12
1.5k
Rails Girls Zürich Keynote
gr2m
87
12k
Music & Morning Musume
bryan
37
4.6k
It's Worth the Effort
3n
177
26k
Designing for humans not robots
tammielis
245
24k
What's new in Ruby 2.0
geeforr
336
30k
The Cult of Friendly URLs
andyhume
69
5.1k
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