Bitkey Inc. Connect ProductNoriki TakahashiαΫοͱ࡞Δ੩తղੳπʔϧ-import ͷґଘ੍ޚπʔϧΛ࡞Δ-
View Slide
Outline221. ࣗݾհ2. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ3. ܗੜπʔϧ: skeleton4. ੩తղੳ༻ύοέʔδ: analysis5. ύοέʔδґଘ੍ޚπʔϧ࣮6. ·ͱΊ
1. ࣗݾհ3● ∁ڮయੜ(Noriki Takahashi)○ Twitter: @norinoriki0○ GitHub: nrnrk● גࣜձࣾBitkey○ bitkey platform ͱ͍͏"ΧΪ"ͷϓϥοτϑΥʔϜͷ։ൃ● Go Ͱ GKE ্Ͱಈ͘APIαʔόʔͷ։ൃͳͲΛ͍ͯ͠·͢● झຯ: ֶɾཧֶ○ zk-SNARKs ͷֶతͳଆ໘ΛטΈࡅ͘هࣄΛॻ͍ͨΓͯ͠·͢
1. ࣗݾհ4● ∁ڮయੜ(Noriki Takahashi)○ Twitter: @norinoriki0○ GitHub: nrnrk● גࣜձࣾBitkey○ bitkey platform ͱ͍͏"ΧΪ"ͷϓϥοτϑΥʔϜͷ։ൃ● Go Ͱ GKE ্Ͱಈ͘APIαʔόʔͷ։ൃͳͲΛ͍ͯ͠·͢● झຯ: ֶɾཧֶ○ zk-SNARKs ͷֶతͳଆ໘ΛטΈࡅ͘هࣄΛॻ͍ͨΓͯ͠·͢
1. ࣗݾհ5
ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ66
772. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫ
882. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫgo.mod ϑΝΠϧϨϙδτϦʹҰͭ→ Go Module ͕1ͭͷϞϊϨϙ
992. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫ͍ΘΏΔϥΠϒϥϦؔߏମͳͲ͕ೖ͍ͬͯΔϞϊϨϙͷଞͷύοέʔδ͔Βར༻͞ΕΔ͜ͱΛఆ
10102. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫ֤छαʔϏεHTTPαʔόʔgRPCαʔόʔͳͲଞ͔Β import ͞Εͯ΄͘͠ͳ͍
11112. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫࠔΔ͜ͱҙਤ͠ͳ͍ґଘ͕͋ͬͯϏϧυ͕௨Δྫ: serviceB → serviceA
12122. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏͍͔ͭ͋͘Δ
13132. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶃ internal ύοέʔδΛར༻serviceA,B,C ͦΕͧΕͷύοέʔδͰެ։ͨ͘͠ͳ͍ύοέʔδ internal ͷதʹೖΕΔ
14142. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶃ internal ύοέʔδΛར༻serviceA,B,C ͦΕͧΕͷύοέʔδͰެ։ͨ͘͠ͳ͍ύοέʔδ internal ͷதʹೖΕΔ→ ڞ௨ར༻͢ΔͷϥΠϒϥϦͱͯ͠Γग़͢ͷͰɺશ෦ internal ͷதʹೖΕΔ͜ͱʹ...
15152. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶄ Go Module ͷׂserviceA,B,C ҎԼʹ go.mod Λ͓͍ͯผͷϞδϡʔϧͱΈͳ͢
16162. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶄ Go Module ͷׂserviceA,B,C ҎԼʹ go.mod Λ͓͍ͯผͷϞδϡʔϧͱΈͳ͢→ ཧ͕ࡶʹͳΔͷͰආ͚͍ͨ
17172. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶃɺᶄඪ४తͳํ๏͕ͩɺզʑʹϑΟοτ͠ͳ͍...
18182. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶅ linter Ͱ੍ޚύοέʔδؒͷґଘΛνΣοΫͯ͠CIͳͲͰ੍ޚͰ͖ΔΑ͏ʹ͢Δ
19192. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ● Go ͷϞϊϨϙͷҰྫղܾํ๏ᶅ linter Ͱ੍ޚύοέʔδؒͷґଘΛνΣοΫͯ͠CIͳͲͰ੍ޚͰ͖ΔΑ͏ʹ͢Δ→ ͪΐͬͱअಓͬΆ͍͕ɺࠓճ͜ΕΛࢼ͢
ґଘੑΛνΣοΫ͢ΔΑ͏ͳlinter Λ୳ͦ͏20202. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
͏ʔΜɺɺɺͳ͍21212. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
ࣗ࡞ linter Ͱ͍͔͘...22222. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
Ͱ੩తղੳ͔ɺͳΜ͔େมͦ͏ͩͳ23232. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
ͱࢥͬͪΌ͍·ͨ͠24242. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
͕ɺ͔͠͠25252. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
࣮ࡍʹͬͯΈΔͱ݁ߏ؆୯ʂ26262. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
skeleton (ܗੜπʔϧ)४ެࣜͷ analysis ύοέʔδͷ͓͔͛Ͱ؆୯ʹαΫοͱ࡞Εͨ27272. ϞϊϨϙ։ൃͰؾʹͳΔ͜ͱ
ܗੜπʔϧ: skeleton2828
● skeletonGoͷ੩తղੳπʔϧͷͨΊͷܗΛੜͯ͘͠ΕΔπʔϧԼهίϚϯυͰΠϯετʔϧͰ͖·͢go install github.com/gostaticanalysis/skeleton/[email protected]3. ܗੜπʔϧ: skeleton29
● skeleton303. ܗੜπʔϧ: skeleton
● skeleton31module ໊Λࢦఆͯ͠ܗ(εέϧτϯ)Λੜ3. ܗੜπʔϧ: skeleton
● skeleton32ίϚϯυ࣮ߦ༻ͷϩδοΫ͓ܾ·ΓͷϩδοΫ͕͋Δ3. ܗੜπʔϧ: skeleton
● skeleton33ղੳ༻ͷϩδοΫΛఆٛ࠷ݶ͜͜ʹϩδοΫΛॻ͚ͩ͘ͰOK3. ܗੜπʔϧ: skeleton
● skeleton34୯ମςετ3. ܗੜπʔϧ: skeleton
● skeleton35୯ମςετ༻ͷσʔλ੩తղੳͳͷͰςετ༻σʔλ = ιʔείʔυ3. ܗੜπʔϧ: skeleton
੩తղੳ༻ύοέʔδ: analysis3636
● analysis ύοέʔδ○ ੩తղੳ༻ͷ"४ެࣜ"ύοέʔδ (golang.org/x/tools/go/analysis)■ → ੩తղੳʹ͓͚ΔϝΠϯͷϩδοΫ͚ͩʹूதͰ͖Δ4. ੩తղੳ༻ύοέʔδ: analysis37
● analysis ύοέʔδ○ ੩తղੳ༻ͷ"४ެࣜ"ύοέʔδ (golang.org/x/tools/go/analysis)■ → ੩తղੳʹ͓͚ΔϝΠϯͷϩδοΫ͚ͩʹूதͰ͖Δ○ ಛ■ Analyzer ߏମͰ੩తղੳͷ݁Ռͷ࠶ར༻͕؆୯ʹ4. ੩తղੳ༻ύοέʔδ: analysis38
● analysis ύοέʔδ○ ੩తղੳ༻ͷ"४ެࣜ"ύοέʔδ (golang.org/x/tools/go/analysis)■ → ੩తղੳʹ͓͚ΔϝΠϯͷϩδοΫ͚ͩʹूதͰ͖Δ○ ಛ■ Analyzer ߏମͰ੩తղੳͷ݁Ռͷ࠶ར༻͕؆୯ʹ○ ઌఔͷ skeleton Ͱੜ͞ΕͨίʔυͰΘΕ͍ͯΔ4. ੩తղੳ༻ύοέʔδ: analysis39
● Analyzer ߏମ(࠶ར༻ͳ͠ͷ࠷γϯϓϧͳྫ)4. ੩తղੳ༻ύοέʔδ: analysis40mylinter.go
● Analyzer ߏମ(࠶ར༻ͳ͠ͷ࠷γϯϓϧͳྫ)4. ੩తղੳ༻ύοέʔδ: analysis41analyzer ͷ໊শ(≒ linter ͷ໊শ)mylinter.go
● Analyzer ߏମ(࠶ར༻ͳ͠ͷ࠷γϯϓϧͳྫ)4. ੩తղੳ༻ύοέʔδ: analysis42υΩϡϝϯτanalyzer ʹ͍ͭͯͷઆ໌mylinter.go
● Analyzer ߏମ(࠶ར༻ͳ͠ͷ࠷γϯϓϧͳྫ)4. ੩తղੳ༻ύοέʔδ: analysis43ղੳ༻ϩδοΫ→ ࠷ݶɺ͜͜ʹϩδοΫॻ͚ͩ͘ͰOKmylinter.go
● Analyzer ߏମ ͷ࠶ར༻● Analyzer ߏମΛఆٛ͢Δࡍʹɺଞͷ Analyzer Λར༻͢Δ͜ͱ͕Ͱ͖Δ4. ੩తղੳ༻ύοέʔδ: analysis44
● Analyzer ߏମ ͷ࠶ར༻● Analyzer ߏମΛఆٛ͢Δࡍʹɺଞͷ Analyzer Λར༻͢Δ͜ͱ͕Ͱ͖Δ● ྫ: golang.org/x/tools/go/analysis/passes/inspect.Analyzer Λ༻͍ͯϊʔυͷϑΟϧλϦϯά4. ੩తղੳ༻ύοέʔδ: analysis45
● Analyzer ߏମ ͷ࠶ར༻● Analyzer ߏମΛఆٛ͢Δࡍʹɺଞͷ Analyzer Λར༻͢Δ͜ͱ͕Ͱ͖Δ● ྫ: golang.org/x/tools/go/analysis/passes/inspect.Analyzer Λ༻͍ͯϊʔυͷϑΟϧλϦϯά4. ੩తղੳ༻ύοέʔδ: analysis46Analyzer ͷ࠶ར༻ͷ؆୯ͳྫͱͯ͠ɺࣝผࢠ͕ "gopher" ͱͳ͍ͬͯΔͷΛݟ͚ͭΔ࣮ྫΛݟͯΈΔ→ ࣍ͷεϥΠυ ※ skeleton ͔Βੜ͞ΕΔαϯϓϧ
4. ੩తղੳ༻ύοέʔδ: analysis47
4. ੩తղੳ༻ύοέʔδ: analysis48mylinter.go
4. ੩తղੳ༻ύοέʔδ: analysis49࠶ར༻͢Δ AnalyzerΛఆٛ͜͜ͰɺAST ݕࠪ༻ͷ Analyzer Λར༻golang.org/x/tools/go/analysis/passes/inspectmylinter.go
4. ੩తղੳ༻ύοέʔδ: analysis50run ͷதͰinspect.Analyzer ͷग़ྗ͢Δ݁ՌΛར༻mylinter.go
4. ੩తղੳ༻ύοέʔδ: analysis51ast.Ident (Identifier =ࣝผࢠ) ͷΈʹߜΔͨΊͷϑΟϧλmylinter.go
4. ੩తղੳ༻ύοέʔδ: analysis52inspect Λར༻ͯ͠ast.Ident ͷΈʹߜͬͯॲཧ͢Δଞͷ AST ͷϊʔυ͕དྷͨͱ͖ͷॲཧΛॻ͔ͳͯ͘ྑ͍ʂmylinter.go
4. ੩తղੳ༻ύοέʔδ: analysis53ಠࣗͷϩδοΫ͚ͩ͜͜analysis ύοέʔδΛ͏͜ͱͰ͜͜ʹ͚ͩूத͢Δ͜ͱ͕Ͱ͖Δmylinter.go
● [༨ஊ] inspect Analyzer ͷఆٛ4. ੩తղੳ༻ύοέʔδ: analysis54
● [༨ஊ] inspect Analyzer ͷఆٛ4. ੩తղੳ༻ύοέʔδ: analysis55͜͜Ͱ࠶ར༻͢Δ݁ՌͷܕΛఆٛ
ύοέʔδґଘ੍ޚπʔϧ࣮5656
● ύοέʔδґଘ੍ޚπʔϧ(banimport)࣮○ ࣮ݱ͍ͨ͜͠ͱ■ ύοέʔδؒͷґଘΛ੍ޚ͍ͨ͠5. ύοέʔδґଘ੍ޚπʔϧ࣮57
● ύοέʔδґଘ੍ޚπʔϧ(banimport)࣮○ ࣮ݱ͍ͨ͜͠ͱ■ ύοέʔδؒͷґଘΛ੍ޚ͍ͨ͠○ ༷■ ېࢭ͢Δґଘ͕͋ͬͨΒՕॴΛಛఆͯ͠ΤϥʔΛฦ͢■ ઃఆϑΝΠϧ (.banimport.json)● ېࢭ͢Δґଘͷjsonఆٛ5. ύοέʔδґଘ੍ޚπʔϧ࣮58
● ᶃ skeleton Ͱܗ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮59
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮60
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮61ςετσʔλ࡞→ ࠓճෳͷύοέʔδͷґଘؔͷςετ͕͍ͨ͠ͷͰߏΛগ͠มߋ
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮62෦ʹෳͷύοέʔδ͕͋Δ͜ͷ·ͱ·ΓΛҰͭͷσʔληοτͱ͢Δ
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮63͜Ε svca, svcb, svcc ͔Βར༻͞ΕͯOK
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮64͜͜ͷؒͰґଘΛ࣋ͨͳ͍Α͏ͳϧʔϧʹ͢Δ
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮65testdata/src/a/srcb/main.gotestdata/src/a/srcc/main.go
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮66svcb → svcc ʹґଘΛ͓ͨͤͯ͘→ ͜ΕΤϥʔͱͯ͠ݕग़͢Δtestdata/src/a/srcb/main.gotestdata/src/a/srcc/main.go
● ᶄ ςετ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮67ίϝϯτͰϝοηʔδͷظΛهࡌ// want ← analysistest ύοέʔδ͕ղऍtestdata/src/a/srcb/main.gotestdata/src/a/srcc/main.go
● ᶄ ςετ࡞: ઃఆϑΝΠϧ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮68ઃఆϑΝΠϧΛ࡞Ͳͷύοέʔδ͔ΒͲͷύοέʔδʹґଘΛ࣋ͨͳ͍Α͏ʹ͢Δ͔Λઃఆ.banimport.json
● ᶄ ςετ࡞: ઃఆϑΝΠϧ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮69svca ͔Β svcb, sbcc ʹґଘΛ࣋ͨͳ͍Α͏ʹ͢Δ.banimport.json
● ᶄ ςετ࡞: ઃఆϑΝΠϧ࡞5. ύοέʔδґଘ੍ޚπʔϧ࣮70svca, svcb, svcc ૬ޓʹґଘΛ͍͚࣋ͬͯͳ͍.banimport.json
● ᶄ ςετ࡞: ςετͷ࣮ߦ5. ύοέʔδґଘ੍ޚπʔϧ࣮71ςετͷ࣮ߦ
5. ύοέʔδґଘ੍ޚπʔϧ࣮72banimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮73ςετͷσʔληοτΛϧʔϓ (b, c ͷςετσʔλՃ)banimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮74analysistest ͷσϑΥϧτͷ testadata ύεbanimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮75import ͷґଘېࢭͷઃఆϑΝΠϧͷಡΈࠐΈbanimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮76import ͷґଘېࢭͷઃఆΛϑϥάͱͯ͢͠(࣍ͷᶅ࣮ Ͱհ)banimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮77ςετσʔλΛࢦఆ࣮ͯ͠ߦbanimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮78ςετΛߦ͏ Analyzer Λࢦఆbanimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮79ղੳ͢ΔରͷύοέʔδΛࢦఆbanimport_test.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮80testdata ͷதͰظ(want)Λॻ͘ͷͰ͜͜ͷϩδοΫεοΩϦʂbanimport_test.go
● ᶅ ࣮5. ύοέʔδґଘ੍ޚπʔϧ࣮81ϝΠϯͱͳΔϩδοΫΛॻ͘
5. ύοέʔδґଘ੍ޚπʔϧ࣮82banimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮83Analyzer ͷఆٛimport ͔͠ݟͳ͍ͷͰґଘͳ͠banimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮84ϑϥάҾͷఆٛflags ύοέʔδͱಉͷܗͰఆٛՄೳbanimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮85run ؔϝΠϯͷॲཧΛߦ͏ؔ→ ࣍ͷεϥΠυbanimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮86banimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮87ઃఆ jsonͷύʔεbanimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮88֤ϑΝΠϧͷimport ఆٛͷΈॲཧ͢Δbanimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮89import ͷύεΛऔಘ※ จࣈྻϦςϥϧ͕ Valueʹೖ͍ͬͯΔͷͰ Unquote͕ඞཁbanimport.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮90ېࢭ͢Δґଘ͕ݟ͔ͭͬͨ߹ɺϝοηʔδΛग़͢banimport.go
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮91
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮92
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮93
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮94
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮95
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮96
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮97
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮98ग़ྗ݁Ռ
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮99ग़ྗ݁Ռ
● ᶆ ಈ࡞֬ೝ5. ύοέʔδґଘ੍ޚπʔϧ࣮100ग़ྗ݁Ռtestdata/src/a/srcb/main.go
5. ύοέʔδґଘ੍ޚπʔϧ࣮ϞϊϨϙͰύοέʔδґଘͷ੍ޚ͕Ͱ͖ΔΑ͏ʹͳͬͨʂʂ
5. ύοέʔδґଘ੍ޚπʔϧ࣮skeleton Λ͑αΫοͱ࡞ΕΔʂ
5. ύοέʔδґଘ੍ޚπʔϧ࣮ͪ͜Βhttps://github.com/nrnrk/banimport
·ͱΊ104104
● ·ͱΊ○ skeleton ΛͬͯαΫοͱ੩తղੳπʔϧ͕࡞ΕΔʂ○ ϞϊϨϙͳͲͰύοέʔδؒͷґଘΛ੍ޚ͍ͨ͠߹■ ͞Βʹɺinternal ύοέʔδͷར༻Ϟδϡʔϧͷׂ͕ϑΟοτ͠ͳ͍߹■ → banimport Λͬͯύοέʔδؒͷґଘ੍ޚΛࢼ͢Ձ͋Γʂ■ CI ͳͲʹΈࠐΉͱޡͬͨ import ͕͛Δ○ ͦͷଞ■ skeleton ͷຊޠ README■ Go ͷ AST ͷೖతͳ༰ʹ͍ͭͯͷաڈͷൃද (એ)1056. ·ͱΊ