Published at gocon 2018 spring
Ϋϩʔϥʔ࣮ͰֶͿGoKatsuya Kawabe2018/4/15() @ GoCon 2018 Spring1
View Slide
ࣗݾհ ɹ2•Name := ෦উ•Twitter := @KKawabe108•GitHub := @Bo0km4n✦ ॴଐ- ࣳӜۀେֶେֶӃ ిؾిࢠใֶઐ߈ M1- גࣜձࣾ3-shake (Πϯλʔϯ)✦ ීஈͷ׆ಈ- 3-shakeͰDMPͷόοΫΤϯυΛgoͰΨϦΨϦॻ͍ͯ·͢- ࠷ۙझຯͰ8086ͷσΟεΞηϯϒϥΛgoͰ࣮ͨ͠Γ
LTͷྲྀΕ ɹ31. LTͷఆରऀ2. Ϋϩʔϥʔͷ༷3. ֶΔ͜ͱ4. σϞ5. ·ͱΊ
ରऀ4GoΛֶΜͰΈ͍͚ͨͲ͍͖ͳΓOSSΛ৮Δͷ࠳ંͦ͠͏ɻɻɻͱΓ͋͑ͣԿ͔࡞ͬͯGoͷײ֮Λ௫Έ͍͚ͨͲΞΠσΟΞ͕͔ͳ͍ɻɻɻGoΛֶͼ͍ͨܟ伲ͳΤϯδχΞՃ͑ͯ…৽ਓϓϩάϥϜͷڭҭΛ୲͏ϕςϥϯΤϯδχΞ
Ϋϩʔϥʔͷ࣮ͱ͍͏͓5ڭतֶੜɾ৽͍͠ϓϩάϥϛϯάݴޠͷษڧɾ৽ਓֶੜͷϕϯνϚʔΫʹͳΔΫϩʔϥʔ࡞Γͳ͍͞Ϋϩʔϥʔͷ༷
6Ϋϩʔϥͷ༷WebϖʔδͷURLΛࢦఆͯ͠ϖʔδΛϩʔΧϧʹอଘɻϩʔΧϧͰhtmlΛ։͍ͯݟͨΛ࠶ݱ͢Δ
Ϋϩʔϥ࣮ͷྲྀΕ Ϋϩʔϥʔͷ༷7̍ஈ֊ URLΛࢦఆͯ̍͠ϖʔδͷΈΫϩʔϦϯά͢Δ̎ஈ֊ ֊Λࢦఆͯ̍͠ϖʔδͷϦϯΫઌ͔Β࠶ؼతʹΫϩʔϦϯά͢Δ̏ஈ֊ ͜ΕΒͷॲཧΛฒྻԽ͠ɺߴԽ͢Δ
8̍ஈ֊ ̍ϖʔδͷΈΫϩʔϦϯά͢Δ
̍ஈ֊9HTMLύʔαϥΠϒϥϦΛ༻͍ͯɺࢦఆͨ͠WebϖʔδΛϩʔΧϧʹอଘͯ͠ݟͨΛ࠶ݱ͢Δɻhtml, javascript, css, imgϑΝΠϧΛμϯϩʔυ※ htmlͷύεΛϩʔΧϧͷύεʹॻ͖͑ΔΫϩʔϥʔͷ༷ͭ·Γ…
̍ஈ֊10Ϋϩʔϥʔͷ༷ReplaceύεΛFQDNʹඥ͚ͮͯμϯϩʔυ͢Δ
11̎ஈ֊֊Λࢦఆͯ̍͠ϖʔδͷϦϯΫઌ͔Β࠶ؼతʹΫϩʔϦϯά͢Δ
̎ஈ֊12$ go run main.go -root https://golang.org/doc/ -depth 2Root (Depth 0)Depth 1Depth 2rootͷhtmlʹషΒΕ͍ͯΔϦϯΫͷϖʔδΛΫϩʔϧ͢ΔىͱͳΔϖʔδhttps://golang.org/docΫϩʔϧ͢Δਂ̎͞Ϋϩʔϥʔͷ༷
13̏ஈ֊ ͜ΕΒͷॲཧΛฒྻԽͯ͠ߴԽΛܭΔ
̏ஈ֊ Ϋϩʔϥͷ༷14cpus := runtime.NumCPU()runtime.GOMAXPROCS(cpus)c := make(chan bool, cpus)for i := 0; i < ֊; i++ {var wg sync.WaitGroupfor _, p := range webϖʔδͷྻ {c <- truewg.Add(1)go func(p Page) {defer func() { <-c }()// ΫϩʔϦϯάwg.Done()}(p)}wg.Wait()}goroutineΛ༻͍Δ͜ͱͰൺֱత؆୯ʹฒྻॲཧΛ࣮Ͱ͖Δ※ go func()ͷॲཧ͕͍ܰͱΉ͠Ζ͘ͳΔՄೳੑ͋Δ※ ੜ͢Δgoroutineͷ੍ޚ͠ͳ͍ͱΫϩʔϧ͢Δϖʔδ͕ଟ͍߹panic͢Δ͜ͱ͋Δ͔͠͠
ֶΔ͜ͱ• GoͰͷιϑτΣΞઃܭ(ύοέʔδߏମ, ΠϯλʔϑΣʔε)• จࣈྻॲཧ (ύεपΓͰ݁ߏటष͍ॲཧΛ͢Δඞཁ͕͋Δ)• ඇಉظॲཧ (goroutineͷجຊతͳ͍ํ)• ϑΝΠϧೖग़ྗ15
σϞ16
·ͱΊ17Go binaryGoroutineGoroutineGoroutineWeb Page Web PageWeb PageHTMLImgCssJSHTMLImgCssJS HTMLImgCssJSDownloadDownloadDownload
·ͱΊ• ࠓճ࣮ͨ͠Ϋϩʔϥʔ https://github.com/Bo0km4n/avarusʹ͋Γ·͢• ߦ600ߦ͙Β͍Ͱ͓खܰͰ͢(Ͱݴ͑Ұि͙ؒΒ͍ʁ)• ଞͷݴޠΛֶͿࡍʹ༗ޮͩͱࢥ͍·͢• ੋඇ͓Ջͳ࣌ʹଉൈ͖ʹͰ࣮ͯ͠Έ͍ͯͩ͘͞ʂʂ18
19Have a good Golang life!!!Thank you for listening.