Slide 1

Slide 1 text

ࡾ୐༔հ / Pepabo R&D Institute, GMO Pepabo, Inc. 2019.10.25 Fukuoka.go#14+Umeda.go ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ ΔίʔυΛίϚϯυϥΠϯΦϓγϣϯ ͔Βੜ੒͢ΔπʔϧΛͭͬͨ͘

Slide 2

Slide 2 text

1SJODJQBMFOHJOFFS :VTVLF.*:",&!NPOPDISPNFHBOF 1FQBCP3%*OTUJUVUF (.01FQBCP *OD IUUQTCMPHNPOPDISPNFHBOFDPN

Slide 3

Slide 3 text

GopherCon 2019 3 :VTVLF.JZBLF 0QUJNJ[BUJPOGPS/VNCFSPGHPSPVUJOFT6TJOH'FFECBDL$POUSPM (PQIFS$PO.BSSJPUU.BSRVJT4BO%JFHP.BSJOB $BMJGPSOJB +VMZ

Slide 4

Slide 4 text

1. ͸͡Ίʹ 2. ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ΔίʔυΛίϚϯ υϥΠϯΦϓγϣϯ͔Βੜ੒͢Δ 3. ·ͱΊ 4 ໨࣍

Slide 5

Slide 5 text

1. ͸͡Ίʹ

Slide 6

Slide 6 text

• ίϚϯυϥΠϯϓϩάϥϜͷڍಈΛ࣮ߦ࣌ʹมߋͤ͞ΔͨΊʹ֎෦͔ΒҾ਺΍ ΦϓγϣϯΛࢦఆ͢Δ • ୯ͳΔจࣈྻͰ͋ΔͨΊɺίϚϯυϥΠϯϓϩάϥϜͰ͸͜ΕΒͷղੳॲཧΛ ߦ͍ɺ಺෦ͷม਺΁ͱ֨ೲ͢Δ • ࠷΋୯७ͳ΋ͷͰ͋Ε͹ɺۭന۠੾Γ (cp src dest) • Ґஔ͕ҙຯΛ͕࣋ͭ׳श͸͋ΕͲɺ͜ͷؔ܎ੑ͸໌֬Ͱ͸ͳ͍ • Ґஔʹґଘ͠ͳ͍Φϓγϣϯܗࣜ (cp -r, head -n 10…) • ϢʔβϑϨϯυϦʔͰ͋Δ͕ղੳॲཧ͸΍΍ෳࡶʹͳΔ 6 ίϚϯυϥΠϯҾ਺ͱΦϓγϣϯ

Slide 7

Slide 7 text

• ίϚϯυϥΠϯΦϓγϣϯͷղੳॲཧ͸ݴޠඪ४ͷ΋ͷ΍ϥΠϒϥϦ͔Βͨ͘ ͞Μఏڙ͞Ε͍ͯΔʢflag, getopts, argparse, optparse…ʣ • શ෦Λ֮͑Δͷ͸೉͍͠ͷͰɺݴޠ΍ϥΠϒϥϦ͝ͱʹυΩϡϝϯτΛࢀর͠ ͳ͕Β࣮૷͢Δ • Ͳ͏ͯ͠΋͕͔͔࣌ؒΔ • ఆܕॲཧͰ͋Δ͜ͱ͔Βɺߟ͑͏ΔύλʔϯΛهड़ͨ͠ϘΠϥʔςϯϓϨʔτ Λ४උ͢Δ • ൚༻తͳϘΠϥʔςϯϓϨʔτ͸Ͳ͏ͯ͠΋ฤूՕॴ͕ଟ͘ͳΔʢΦϓγϣ ϯ໊ɺม਺໊ɺσϑΥϧτ஋…ʣ 7 ίϚϯυϥΠϯΦϓγϣϯ

Slide 8

Slide 8 text

8 ίϚϯυϥΠϯΦϓγϣϯղੳͷ՝୊ͷ੔ཧ $ mycli --dist erlang -e k/l --lambda 1.5 -k 1 -v 1. ίϚϯυϥΠϯΦϓγϣϯͷܗࣜΛݕ౼͢Δ 2. ࣮૷͢Δ 1. υΩϡϝϯτͷࢀরͱ࣮૷ 2. ϘΠϥʔςϯϓϨʔτͷίϐʔͱฤू 3. ຊདྷͷॲཧͷ࣮૷

Slide 9

Slide 9 text

9 ίϚϯυϥΠϯΦϓγϣϯղੳͷ՝୊ͷ੔ཧ $ mycli --dist erlang -e k/l --lambda 1.5 -k 1 -v 1. ίϚϯυϥΠϯΦϓγϣϯͷܗࣜΛݕ౼͢Δ 2. ࣮૷͢Δ 1. υΩϡϝϯτͷࢀরͱ࣮૷ 2. ϘΠϥʔςϯϓϨʔτͷίϐʔͱฤू 3. ຊདྷͷॲཧͷ࣮૷ ͜͜ͷ࣌ؒΛݶΓͳ͘ θϩʹ͚͍ۙͮͨ

Slide 10

Slide 10 text

2. ίϚϯυϥΠϯΦϓγϣϯΛύʔε͢ΔίʔυΛ ίϚϯυϥΠϯΦϓγϣϯ͔Βੜ੒͢Δ

Slide 11

Slide 11 text

• A command line option parser generator (Flag-gen). • https://github.com/monochromegane/flagen • ࣮ࡍʹ࢖͏ࡍͷίϚϯυϥΠϯΦϓγϣϯ͔ΒɺʮͦͷʯίϚϯυϥΠϯΦϓ γϣϯΛղੳ͢ΔϘΠϥʔςϯϓϨʔτΛੜ੒͢Δ • ࢖͍ํΛࢥ͍ු͔΂Δͱ࣮૷͕Ͱ͖͍ͯΔʂʂ 11 flagen

Slide 12

Slide 12 text

Usage $ flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS... 12 • ςϯϓϨʔτͱ࣮ࡍʹ࢖͏࣌ͷίϚϯυϥΠϯΦϓγϣϯΛ౉͚ͩ͢ • ϓϦηοτͷςϯϓϨʔτͱͯ͠ɺGoɺRubyɺPythonɺShellΛఏڙ • ϑΝΠϧύεΛࢦఆ͢Ε͹ಠࣗςϯϓϨʔτ΋ར༻Մೳʢޙड़ʣ

Slide 13

Slide 13 text

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") } ίϚϯυϥΠϯΦϓγϣϯ໊͔Βม਺໊Λੜ੒ ίϚϯυϥΠϯΦϓγϣϯ஋͔ΒܕΛਪଌ ࣮ࡍʹ࢖༻͢ΔίϚϯυϥΠϯΦϓγϣϯ͔Β ίϚϯυϥΠϯͷղੳॲཧΛੜ੒

Slide 14

Slide 14 text

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ͷσϑΥϧτ஋ͷઃఆ΋ ϘΠϥʔςϯϓϨʔτͳͷͰେৎ෉

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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͸ҰจࣈͷҾ਺͚ͩѻ͑ΔͷͰ௕͍Φϓγϣϯ͸ແࢹ

Slide 17

Slide 17 text

• ΋ͪΖΜflagen͸ಠࣗςϯϓϨʔτ΋࢖͑Δ • ςϯϓϨʔτ͸Goͷtext/templateΛ࢖ͬͯॲཧ • `.Flags`ʹΦϓγϣϯͷղੳ݁Ռ • NameͱValueΛ࣋ͭ • Value͸͞ΒʹTypeͱGetΛ࣋ͭ • `.Args`ʹ࢒ΓͷҾ਺ 17 Template

Slide 18

Slide 18 text

Template

Slide 19

Slide 19 text

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)

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Collaboration

Slide 22

Slide 22 text

• flagenΛΤσΟλͱ࿈ܞ͢Δ • ྫ͑͹VimͰ͸ҎԼʹΑΓɺΧʔιϧҐஔʹ݁ՌΛૠೖ͢Δ͜ͱ͕Ͱ͖Δɻ ʢಈతͳίʔυεχϖοτͱͯ͠ͷར༻ʣ 22 Collaboration :r!flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS...

Slide 23

Slide 23 text

• 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

Slide 24

Slide 24 text

Workaround

Slide 25

Slide 25 text

• ᐆດͳϑϥά • flagen͸Φϓγϣϯʹ஋͕ࢦఆ͞Ε͍ͯͳ͍ͱ͖ʹboolͩͱݟͳͨ͢Ίɺ boolϑϥάͰऴΘͬͯҾ਺͕͋Δ৔߹ʹ൑அ͕͔ͭͳ͍ • ૝ఆͲ͓Γʹ͢ΔͨΊʹ͸஋ͱͯ͠true or falseΛड͚औΔ͜ͱΛ໌ࣔ͢Δ 25 Workarounds - Ambiguous flag $ flagen TEMPLATE --bool-flag arg1 $ flagen TEMPLATE --bool-flag=false arg1

Slide 26

Slide 26 text

Implementation of template

Slide 27

Slide 27 text

• ExampleςετΛ༻ҙͯ͠ग़ྗ݁ՌΛςετ͢Δ΂͠ • Godocʹྫ͕ग़ྗ͞ΕΔͷͰศར • ग़ྗ༗ແͷ੾Γ෼͚͸ with action͕ศར 27 ςϯϓϨʔτͷ࣮૷

Slide 28

Slide 28 text

3. ·ͱΊ

Slide 29

Slide 29 text

• ༷ʑͳ࣮૷͕ఏڙ͞Ε͍ͯΔίϚϯυϥΠϯΦϓγϣϯͷղੳॲཧΛར༻ܗࣜ ͔Βಈతʹੜ੒͢ΔδΣωϨʔλʔͱͯ͠flagenΛͭͬͨ͘ • ͍͔ͭ͘ͷݴޠͷςϯϓϨʔτΛ༻ҙͯ͠ΤσΟλͱ࿈ܞͤ͞Δ͜ͱͰCLI։ ൃͷޮ཰͕վળͨ͠ • flagenࣗମͷΦϓγϣϯͱͯ͠prefixͳͲΛఏڙ͢Ε͹ߏ଄ମͱͷ૬ੑ΋Α͘ ͳΓͦ͏ (hoge.nameͷΑ͏ͳ࢖͍ํ) • ςϯϓϨʔτ௥ՃͷϓϧϦΫΤετ΍ΠγϡʔͳͲ͓଴͍ͪͯ͠·͢ • https://github.com/monochromegane/flagen 29 ·ͱΊ

Slide 30

Slide 30 text

No content