Slide 1

Slide 1 text

Copyright © 2017 eureka, Inc. All rights reserved. PHP͔ΒGoϑϧεΫϥονͷઓޙೖࣾ૊͔Βݟͨɺ Pairsͷ։ൃʹ͍ͭͯ 2017/08/18 Τ΢ϨΧ x Ϋϥεϝιου ໷ͷ߹ಉษڧձ ~Goݴޠ։ൃͷ࣮ࡍͷͱ͜Ζ~ in େࡕ ӓҪ ༑྄

Slide 2

Slide 2 text

Copyright © 2017 eureka, Inc. All rights reserved. ࣗݾ঺հ 2 ೥݄ژ౎େֶཧֶ෦ೖֶ ೥݄ژ౎େֶେֶӃཧֶݚڀՊ෺ཧֶɾӉ஦෺ཧֶઐ߈म࢜՝ఔमྃ ೥݄גࣜձࣾγεςϜܭըݚڀॴೖࣾ $$ $  ೥݄ גࣜձࣾ౦ٸϋϯζϋϯζϥϘגࣜձࣾೖࣾ CBTI1)1  ೥݄גࣜձࣾΤ΢ϨΧೖࣾ (P 

Slide 3

Slide 3 text

Copyright © 2017 eureka, Inc. All rights reserved. 3 Pairs GoϑϧεΫϥονͰߦͬͨ͜ͱ - PHP(CodeIgniter2)͔ΒGo΁ͷΞϓϦέʔγϣϯίʔυͷஔ͖׵͑ - WAF͸౰ॳ࠾༻ͨ͠Revel͔Βឯ༨ۂં͋ΓGin΁ɻ - DBεΩʔϚͷݟ௚͠ͱશσʔλͷϚΠάϨʔγϣϯ - MySQL - DynamoDB - ύʔςΟγϣχϯάͷڪා - 2ͭͷϦϓϨʔεΛಉ࣌ʹ(׽Β͍͠)ɻ

Slide 4

Slide 4 text

Copyright © 2017 eureka, Inc. All rights reserved. 4 Pairs αʔόαΠυٕज़ελοΫ - Go(1.7) - Gin(WAF) - Circus(daemonize) - xorm(ORM) - logrus(log) - glide(vendoring) - MySQL on EC2 - Amazon Aurora - Amazon DynamoDB - Redis on Amazon ElastiCache - Google BigQuery(BI) - Sentry(error log tracking) - SemaphoreCI(CI) - etc…

Slide 5

Slide 5 text

͜ͷ1೥Ͱͷ஌ݟʹ͍ͭͯɺ֤࿦తʹɻ

Slide 6

Slide 6 text

Copyright © 2017 eureka, Inc. All rights reserved. 6 چίʔυ(PHP)ͱͷൺֱ - ίʔυϕʔε͸ґવͱͯ͠େ͖͍΋ͷͷ(਺ेສߦ)ɺಡΊΔɻ - PHP൛ͷUser Model ͸΍͹͔ͬͨɻಡΊͳ͍ɻ - ౰ͨΓલ͕ͩɺڧ͍੩తܕ෇͚ʹΑΔ҆৺ײɻ - IntelliJ(Gogland)ʹΑΔαϙʔτ΋͋Δɻ - ͕ͩࣾ಺ʹ΋Vimmer͕ଟ͍ɻ - લ৬Ͱ͸PHPΛॻ͍͍͕ͯͨɺPHP൛ͷίʔυΛݟͯ΋͜Εʹ͸ߩݙͰ͖ ͳ͍ؾ͕͢Δ……ͱࢥͬͨɻ - ະܦݧͷGoͷίʔυͷํ͕·ͩಡΊΔؾ͕ͨ͠ɻ

Slide 7

Slide 7 text

Copyright © 2017 eureka, Inc. All rights reserved. 7 ϒϥϯνઓུ - GitHub-Flow Λ࠾༻ - master ͕͍ͭͰ΋σϓϩΠՄೳͳঢ়ଶΛอͭ - Goʹशख़ͨ͠ਓ͕ଟ͘ͳ͔ͬͨɾٕྔ͕ࠩେ͖͔ͬͨ࣌͸ɺख़ୡऀͷ LGTM͕ग़Δ·ͰϚʔδෆՄͱ͍ͯͨ͠ɻ - શମతͳϨϕϧΞοϓʹΑΓఫഇɻ - ઃܭ͔Βࡉ͔͍Goͷ࢓༷෦෼(εϥΠεͷѻ͍ͱ͔)·Ͱ͕ͬͪΓݟ͍ͯ ͕ͨɺͩΜͩΜͱෆཁʹͳ͍ͬͯͬͨ

Slide 8

Slide 8 text

Copyright © 2017 eureka, Inc. All rights reserved. 8 Pairs ϝΠϯϦϙδτϦͷύοέʔδ֓ཁ - libs - αʔϏεͷϩδοΫ΍ΞϓϦέʔγϣϯͱແؔ࿈ɾؔ࿈ͷബ͍΋ͷ - core - config, i18n, log ͳͲɻ - pairscore - ෳ਺serviceڞ௨ͷϏδωεϩδοΫ΍DBؔ࿈(entity, repository)ɻ - image,aws/{s3,sns,sqs} ͳͲ - service/pairsmain - ΞϓϦέʔγϣϯݻ༗ͷϩδοΫ - service/pairsadmin - ؅ཧը໘ - service/pairsbatch - όον

Slide 9

Slide 9 text

Copyright © 2017 eureka, Inc. All rights reserved. 9 Pairs ϝΠϯϦϙδτϦͷύοέʔδ֓ཁ - લड़ͷύοέʔδߏ੒͸ϕετͳͷ͔ʁ - ͱ໰ΘΕΕ͹ɺվળͷ༨஍͕͋Δߏ੒ɻ - Ͳ͏Έͯ΋pairscore͕ɺྔతʹ΋֊૚తʹ΋fatʹͳΓ͕ͪɻ - ࣾ಺ͷଞϚΠΫϩαʔϏεͰ͸ɺDDDʹଇͬͨ΋ͷͳͲ͕͋Δɻ

Slide 10

Slide 10 text

Copyright © 2017 eureka, Inc. All rights reserved. 10 ύοέʔδߏ੒ͷࢦ਑ - ࠔͬͨΒެࣜɾඪ४ϥΠϒϥϦʹ໰͏ - Our CTO says too… - https://speakerdeck.com/kaneshin/go-package-guidelines

Slide 11

Slide 11 text

Copyright © 2017 eureka, Inc. All rights reserved. 11 ϑϨʔϜϫʔΫ͕GinͰ͋Δཧ༝ - ·ͣௐࠪͷ݁ՌRevelΛ࠾༻ͯ͠Έͨͱ͜Ζɺগͳ͘ͱ΋౰࣌ͷRevel͕࢖͍ ʹ͔ͬͨ͘ͱ͍͏ͷ͕͋Δ໛༷(͜ͷ͋ͨΓ͸఻ฉ) - Revel͸ϑϧελοΫͳϑϨʔϜϫʔΫͰɺٻΊ͍ͯͨػೳʹରͯ͠ඞཁҎ্ ʹڊେͰଟػೳͰ͋ͬͨͨΊɺ଎౓໘Ͱ΋ϚΠΫϩϑϨʔϜϫʔΫʹ܉഑͕ ্͕Δɻ - ౰࣌ͷબఆͰ͸Gin͕બ͹Εͨͱ͍͏͚ͩɻ - Revel to Gin ͷϦϓϨʔε͸1ϲ݄ͰߦΘΕͨΒ͍͠…… - ࠷ۙঃʑʹࣾ಺αʔϏε͕ϚΠΫϩαʔϏεԽ͞Ε͍ͯΔ͕ɺͦͷࡍ͸goji͕ Α͘࠾༻͞Ε͍ͯΔɻ

Slide 12

Slide 12 text

Copyright © 2017 eureka, Inc. All rights reserved. 12 Goʹ͓͚ΔϑϨʔϜϫʔΫબఆ - ͦ΋ͦ΋ɺϑϨʔϜϫʔΫ͍Βͳ͍ͷͰ͸࿦͕ࣾ಺ͷҰ෦Ͱ࿩୊ʹɻ - ࠷௿ݶͷϛυϧ΢ΣΞ͕͋Ε͹े෼Ͱ͸…… - github.com/urfave/negroni ͕ؾʹͳ͍ͬͯ·͢ɻ

Slide 13

Slide 13 text

Copyright © 2017 eureka, Inc. All rights reserved. 13 vendoring͸Ͳ͏͋Δ΂͖͔(ߟ͑ํ) - ͳΜͰ΋͔ΜͰ΋֎෦ϥΠϒϥϦΛ࢖͍ͬͯΔͱਏ͘ͳΔ - ΈΜͳ͍͖͍ͩͧ͢Μ͔Μ͚͍͘͡͝ - ෳ਺ͷϥΠϒϥϦ͕ผͷϥΠϒϥϦͷޓ׵ੑͷແ͍ผʑͷόʔδϣϯʹґଘ ͢Δͱ͔(͋Δ͋Δ) - খ͍͞ϥΠϒϥϦͰ͋Ε͹ɺ࣌ʹ͸ࣗΒͷϦϙδτϦʹऔΓࠐΜͰར༻͢Δ͜ ͱ΋ඞཁʹͳΔɻ - Go͸·ͩए͘ੵۃతͳΞοϓσʔτ͕ͳ͞Εɺਓޱ૿Ճ΋͜Ε͔Βͷݴޠͳͷ Ͱɺར༻͢ΔϥΠϒϥϦͷϥΠϑαΠΫϧʹରͯ͠ҙࣝతʹͳΔඞཁ͕͋Δɻ - ʮͦΕɺඪ४ϥΠϒϥϦͰΑ͘ͳ͍ʁʯͱৗʹߟ͑Δɻ

Slide 14

Slide 14 text

Copyright © 2017 eureka, Inc. All rights reserved. 14 vendoring͸Ͳ͏͋Δ΂͖͔(πʔϧ) - ެࣜʹΑΔvendoringπʔϧͱͯ͠dep͕ొ৔ͨ͠ - ͕ͩɺઃఆϑΝΠϧܗ͕ࣜมߋ͞ΕΔͳͲ͕͋ͬͨ͹͔ΓͳͷͰɺ༷ࢠ ݟɻ - ॾʑམͪண͍ͨΒɺ৽͘͠࡞Δ࣌͸͜Εʹ͢Δͷ͕ਖ਼͘͠ɺ࠷΋ָʹͳ Γͦ͏ɻ - ݱࡏ࢖༻தͷglide ΋ൺֱత୯७Ͱɺಛʹ໰୊ແ͘ಈ࡞͍ͯ͠Δɻݸਓత ʹ͸͜ͷ··Ͱ΋OKɻ

Slide 15

Slide 15 text

Copyright © 2017 eureka, Inc. All rights reserved. 15 GoͷόʔδϣϯΞοϓʹ͍ͭͯ - جຊతʹ͸ίϯύΠϧ͸௨ΔͷͰɺ୯ମςετ͕མͪΔΑ͏ʹͳΒͳ͚Ε ͹େৎ෉ɻ - ͕ͩɺͳ͔ͳ͔ϔϏʔͳ͜ͱ΋͋ͬͨ…… - ۩ମతʹ͸ɺGo1.5ҎԼ͔ΒGo1.6Ҏ্΁ͷΞοϓσʔτ࣌ɻ

Slide 16

Slide 16 text

Copyright © 2017 eureka, Inc. All rights reserved. 16 GoͷόʔδϣϯΞοϓʹ͍ͭͯ - https://golang.org/doc/go1.6 - map΁ͷಉ࣌ॻ͖ࠐΈ͕ൃੜͨ͠৔߹ɺpanicΛى͜͢Α͏ʹͳͬͨɻ - ී௨ʹߟ͑Ε͹ࢸۃ·ͬͱ͏ͳ࢓༷ʹͳͬͨͱ͍͑Δɻ - ར༻͍ͯ͠Δ֎෦ϥΠϒϥϦ(logger, ORM)͕όʔδϣϯ͕ݹ͘ɺ͜Εʹ ରͯ͠unsafeͰɺͦΕΒͷόʔδϣϯΞοϓରԠ΋ඞཁʹͳΓͳ͔ͳ͔ ͳ͜ͱʹɻ

Slide 17

Slide 17 text

Copyright © 2017 eureka, Inc. All rights reserved. 17 GoͷόʔδϣϯΞοϓʹ͍ͭͯ - ٯʹݴ͏ͱɺࠔ೉͸ͦ͏͍ͬͨͱ͜ΖʹہॴԽ͍ͯͯ͠ɺ஍ಓͳ࡞ۀͩͬ ͨɻ - -race ΦϓγϣϯΛ෇͚ͯڝ߹ঢ়ଶ͕ݕग़Ͱ͖ΔΑ͏ʹ࣮ͯ͠ߦͯ͠͸ ౰֘ՕॴΛݟ͚ͭͯ͸௚͠…… - ݱࡏ͸ 1.7 ͕ͩɺ͞ΒͳΔόʔδϣϯΞοϓͰ͸ಉ༷ͷࠔ೉͸ͳͦ͞͏ɻ - ࣮͸ผ͕݅ͪΐͬͱ͚ͩ͋Γ·͕͢……(ޱ಄ͷΈͰ)

Slide 18

Slide 18 text

Copyright © 2017 eureka, Inc. All rights reserved. 18 configʹ͍ͭͯ - godotenvΛར༻ͯ͠؀ڥม਺͔Βऔಘ - ઃఆͷΧςΰϦຖʹߏ଄ମΛ४උ͠ɺΞϓϦέʔγϣϯ͔Β͸ͦͷެ։ϝ ϯόΛ௨ͯ͠ར༻ɻ

Slide 19

Slide 19 text

Copyright © 2017 eureka, Inc. All rights reserved. 19 configʹ͍ͭͯ

Slide 20

Slide 20 text

Copyright © 2017 eureka, Inc. All rights reserved. 20 ϝϞϦΞϩέʔγϣϯ΍͹͍ - ϝϞϦΞϩέʔγϣϯ͕ଟ͍ͱɺ଎౓໘Ͱ༗རͳGo΋εΫϦϓτݴޠฒͷ ଎౓ʹͳΔέʔε΋ɻ - γεςϜͷϘτϧωοΫͱͳΔཁҼ͸΋ͪΖΜଞʹ΋͋Δ͕ɺ଎౓͕Ұͭ ͷ΢ϦͰ͋ΔGoͰ͜ΕΛݪҼͱ͢ΔύϑΥʔϚϯεྼԽ͸ͳΔ΂͘ආ͚ͨ ͍ɻ - ϕϯνϚʔΫΛॻ͘ɺpprofͳͲͷϓϩϑΝΠϦϯάπʔϧΛ࢖͏ͳͲ͠ ͯɺ࠷খԽ͢Δɻ - ςετͱͱ΋ʹϕϯνϚʔΫΛॻ͘ͷ͕࠷΋ָɻ

Slide 21

Slide 21 text

Copyright © 2017 eureka, Inc. All rights reserved. 21 ਖ਼نදݱ͕(ଟ͘ͷέʔεͰ)஗͍ - ͜ͷ݅ʹ͍ͭͯ͸2016೥຤ʹϒϩάΛॻ͖·ͨ͠ɻ - https://developers.eure.jp/tech/golang-regexp/ - ΞϧΰϦζϜ͸͍͍͚Ͳͳ͔ͥ஗͍ɻ - ͞Βʹਖ਼نදݱͷίϯύΠϧ଎౓͕஗͍ͨΊɺ͜ͷͨΊʹύοέʔδ௚ԼͰ ਖ਼نදݱΦϒδΣΫτΛ֬อͯ͠࢖͍ճ͢ͱɺ಺෦ͷഉଞ੍ޚʹΑΔ଎౓௿ ԼʹͿͪ౰ͨΔɻ - ެࣜʹ͋ΔΑ͏ʹɺregexp.Copy() ϝιουʹͯར༻ଆ͕ίϐʔͯ͠࢖͏ࣄ Ͱղܾɻ - ϦΞϧλΠϜͰ࢖ΘΕΔճ਺ͱՄಡੑͷόϥϯεΛऔͬͯɺstringsύοέʔδͷ ؔ਺Ͱ୅ସॲཧΛߦ͏ͷ͕ݱ࣮ղɻ

Slide 22

Slide 22 text

·ͱΊ

Slide 23

Slide 23 text

Copyright © 2017 eureka, Inc. All rights reserved. 23 ·ͱΊ - Go͸૝૾Ҏ্ʹΩϟονΞοϓ͠΍͍͢ݴޠͩͬͨ - as C/C++/C#/PHPܦݧऀ - vendoring(ύοέʔδϚωδϝϯτ)͸ɺΧλ͍πʔϧΛ࢖͍ͭͭɺґଘ͢ΔϥΠϒϥϦͷ ϥΠϑαΠΫϧ΋ߟ͑ͯར༻Λߟ͑Δɻ - ඪ४ϥΠϒϥϦͰࡁΉ΋ͷ͸ͦΕͰࡁ·͢͜ͱΛݕ౼ɻ - ύοέʔδߏ੒ʹ͍ͭͯ͸ϦϙδτϦͷαΠζʹΑΔ͕ɺඪ४ϥΠϒϥϦΛࢀߟʹ͢Δɻ - ී௨ͷεΫϦϓτݴޠͷϊϦͰॻ͘ͱࢥΘ͵ύϑΥʔϚϯεྼԽʹݟ෣ΘΕΔͷͰɺGoͷ ΍ΓํʹଇΔɻ - ͜Ε΋ެࣜͷ࢖͍ํΛ·ͣࢀߟʹ͢Δɻ - Pairs͕GoͰ׬શʹϦϓϨʔε͞Ε͍ͯͯຊ౰ʹྑ͔ͬͨɻ