Perl MongerのためのGoの始め方

Perl MongerのためのGoの始め方

Gotanda.pm #8
(2016-03-31 16:30) 37ページがおもいっきり間違っているので修正したものを後ほどUPします

F184d9a69a53293895f36730ca0b8289?s=128

karupanerura

March 30, 2016
Tweet

Transcript

  1. Perl MongerͷͨΊͷ Goͷ࢝Ίํ id:karupanerura Gotanda.pm #8

  2. About me • Kenta SATO (id:karupanerura) • Perl/Go/Swift/Kotlin/Java/Crystal/C99/etc.. • Gotanda.pm

    Author • Senior Engineer at Mobile Factory, Inc. • WebApp/iOS/Android/Operation/etc..
  3. ͓͜ͱΘΓ • ͝Γ͝Γॻ͍͍ͯΔਓ޲͚Ͱ͸͋Γ·ͤΜ • ஆ͔͍ϚαΧϦΛ͓ئ͍͠·͢ • Perlͱ͸Perl6Ͱ͸ͳ͘Perl5Λࢦ͠·͢ • Perl6ͱPerl5͸ผͷݴޠͰ͢ʢຊ౰ʹʣ

  4. ͓͜ͱΘΓ • ݪཧతͷઆ໌Λ͢ΔͨΊʹϕετϓϥΫςΟ ε͔Β֎Εͨઆ໌Λ͢Δ৔߹͕͋Γ·͢ • ӏವΈʹ۪ͯ͠௚ʹॻ͔ͳ͍Ͱ͍ͩ͘͞ • ͜ͷ఺ʹ͸ϚαΧϦΛ౤͛ͳ͍Ͱ͍ͩ͘͞ • ΍ΒΕͨΒٽ͖·͢ʢٽ͖·ͤΜʣ

  5. ݟͨ໨ͷҧ͍

  6. Perl

  7. Go

  8. ※৑ஊͰ͢

  9. ֶͿ

  10. PerlΛֶͿ • ެࣜͷυΩϡϝϯτ: perldoc perlintro • ఆ൪ͷॻ੶: ॳΊͯͷPerlɺխͳPerlೖ໳ • WEB+DB

    PRESS: Perl Hackers Hub • ษڧձ: Perlೖֶࣜ
  11. GoΛֶͿ • ެࣜͷυΩϡϝϯτ: A Tour of Go • ఆ൪ͷॻ੶: ϓϩάϥϛϯάݴޠGo

    (ະൃച) • WEB+DB PRESS: Vol.82 ͸͡ΊͯͷGo • ษڧձ: (ఆظ։࠵͞Ε͍ͯΔ΋ͷ͸ͳͦ͞͏)
  12. υΩϡϝϯτ

  13. PerlͷυΩϡϝϯτ(ಡΈํ) • perldocίϚϯυ͔ΒͥΜͿಡΊΔ • perldocͷυΩϡϝϯτ: perldoc perldoc • perlͷυΩϡϝϯτ: perldoc

    perl (໨࣍) • metacpan.org ΍ perldoc.jp ͳͲͰ΋ಡΊΔ
  14. GoͷυΩϡϝϯτ(ಡΈํ) • ݴޠͷυΩϡϝϯτ: https://golang.org/doc/ • ϞδϡʔϧͷυΩϡϝϯτ: godoc.org • godocίϚϯυͰ΋ಡΊΔ

  15. PerlͷυΩϡϝϯτ(ܗࣜ) • ׂͱࣗ༝ɺDESCRIPTION/SYNOPSIS͸ॏཁ • DESCRIPTION: Ϟδϡʔϧͷઆ໌ • SYNOPSIS: Ұ؏తͳαϯϓϧίʔυ •

    PODܗࣜͰॻ͔ΕΔ
  16. GoͷυΩϡϝϯτ(ܗࣜ) • ߏ଄ମ/ΠϯλʔϑΣʔε/ؔ਺ຖʹॻ͔ΕΔ • publicͳؔ਺ͳͲʹυΩϡϝϯτ͕ॻ͔Εͯ ͍ͳ͍ͱܯࠂ͕ग़Δ • ؔ਺͝ͱʹαϯϓϧίʔυ(Example)͕͋Δ • ίϝϯτͱͯ͠ιʔείʔυ಺ʹॻ͔ΕΔ

  17. ؀ڥ

  18. Perlͷ؀ڥ • ॲཧܥ͸perlͷΈ • ϚϧνOSαϙʔτ • ࣮ߦ؀ڥʹڧ͘ґଘ͢Δ • plenv΍CatronͳͲͰόʔδϣϯΛݻఆ͢Δ

  19. Goͷ؀ڥ • ॲཧܥ͸goͷΈ • ϚϧνOSαϙʔτ (ΫϩείϯύΠϧ΋༰қ) • Ϗϧυ؀ڥʹڧ͘ґଘ͢Δ • Ϗϧυ؀ڥͷόʔδϣϯ͕static

    link͞Εͨ όΠφϦ͕ੜ੒͞ΕΔ
  20. Πϯετʔϧ

  21. Perl ॲཧܥͷΠϯετʔϧ • anyenv install plenv • plenv install -l

    # όʔδϣϯ֬ೝ • plenv install 5.22.1 • plenv global 5.22.1 • plenv install-cpanm
  22. Perl ϞδϡʔϧͷΠϯετʔϧ • cpanm App::revealup • ςετ͕ϩʔΧϧͰ࣮ߦ͞ΕΔ • cpanm -n

    App::revealup • ςετͳ͠ • cpanm —install-deps . • ΧϨϯτͷґଘϞδϡʔϧΛΠϯετʔϧ
  23. Perl ؀ڥͷצॴ • ࣮ߦ؀ڥʹ߹Θͤͯॊೈʹ։ൃ؀ڥΛม͑Δ • OSʹΠϯετʔϧ͢ΔͱrootݖݶͰϞδϡʔ ϧΛΠϯετʔϧ͢Δඞཁ͕͋Δ • ύεͷࢦఆ͸Մೳ •

    Carton΍local::libͱซ༻͢Δख΋͋Δ
  24. Go ॲཧܥͷΠϯετʔϧ • OS X: brew install go • Debian/Ubuntu:

    apt-get install golang • binary: https://golang.org/dl/ • /usr/bin ͱ͔ʹී௨ʹΠϯετʔϧͰे෼
  25. Go ϞδϡʔϧͷΠϯετʔϧ • go get github.com/karupanerura/gostress • ΠϯετʔϧͷΈ • go

    get -t github.com/karupanerura/gostress • ςετͭͭ͠Πϯετʔϧ • go get -d . • ґଘϞδϡʔϧΛΠϯετʔϧ
  26. Go ؀ڥͷצॴ • ଟ༷ͳ࣮ߦ؀ڥΛߟ͑ͳͯ͘ྑ͍ • ࣮ߦ؀ڥͷόʔδϣϯΛؾʹ͠ͳͯ͘ྑ͍ • ඞཁ͕ग़ͨΒgoenvͳͲΛ࢖͏ͱྑ͍ • Ϟδϡʔϧ͸GOPATHҎԼʹΠϯετʔϧ

    • $HOME/go ͱ͔ʹ͠ͱ͚͹rootݖݶෆཁ
  27. ΤσΟλ

  28. PerlͷΤσΟλࣄ৘ • emacs • cperl-mode + flycheck + perl-completion •

    vim • vim-perl + quickrun + perlomni • ͘Θ͘͠ͳ͍
  29. GoͷΤσΟλࣄ৘ • emacs • go-mode + + flycheck + gocode

    • vim • vim-go + vim-godef + gocode • ͘Θ͘͠ͳ͍
  30. _ਓਓਓਓਓਓਓਓ_ > ๻΋஌Γ͍ͨ < ʉY^Y^Y^Y^Y^Y^Yʉ

  31. ݴޠ࢓༷

  32. ໊લۭؒ

  33. Perl ໊લۭؒ • package = ໊લۭؒ = Ϋϥε • private/publicͱ͍͏֓೦͸ແ͍

    • ໊લۭؒͷϨΩγΧϧείʔϓ͸࡞ΕΔ • privateͱͯ͠ѻ͍͍ͨαϒϧʔνϯͷ৔߹͸ ΞϯμʔείΞΛ໊લͷprefixʹ͢Δͷ͕׳श
  34. Perl ໊લۭؒ • ϑΝΠϧύεͱpackageʹڧ͍ؔ܎͕͋Δ • Foo::Bar = Foo/Bar.pm • ϩʔυ͢Δͱ͖͸use·ͨ͸requireΛ࢖͏

    • use Foo::Bar;
  35. Perl ໊લۭؒ • ଞͷύοέʔδʹ͸ϑϧωʔϜͰΞΫηε • Foo::Bar::baz() # Foo::Barͷbuz()Λ࣮ߦ • σʔλ(ϦϑΝϨϯε)ͱpackageΛඥ෇͚Δ͜

    ͱ͕Ͱ͖Δ(ޙड़)
  36. Go ໊લۭؒ • package = ύοέʔδ • ໊લͰউखʹΞΫηε੍ޚֻ͕͔Δ • খจࣈͰ࢝·Δ΋ͷ͸package

    • େจࣈͰ࢝·Δ΋ͷ͸public
  37. Go ໊લۭؒ • ϑΝΠϧύεͱpackageʹڧ͍ؔ܎͕͋Δ • = Foo/Bar.pm • ଞͷύοέʔδʹ͸ϑϧωʔϜͰΞΫηε •

    Foo::Bar::baz() # Foo::Barͷbuz()Λ࣮ߦ
  38. ܕ

  39. Perlͱܕ • ಈతܕ෇͚ݴޠʢίϯςΩετʹΑΔܕ෇͚ʣ • Scalar/Array/Hash ٴͼͦΕΒͷϦϑΝϨϯε • ଞͷಈతܕ෇͚ݴޠͱ͘Β΂ͯ΋ಛघ • ৄ͘͠ޠΔͱ60෼͘Β͍஻Εͯ͠·͏ͷͰ

    ࠓճ͸ৄ͍͠ݴٴΛ߇͑Δ(GoϝΠϯͳͷͰ)
  40. Perlͷσʔλܕ (Scalar) • ୯Ұͷ஋Λද͢σʔλܕ • ੔਺/࣮਺/จࣈྻ/ϦϑΝϨϯε͕ೖΔ • ਓؒʹͱͬͯ $age ͕จࣈྻ͔Ͳ͏͔͸ؔ৺֎

    • ίϯςΩετʹΑͬͯ͸ܾΊ͔͔ͯΓ͍ͨ • $age > 20 # ageΛ੔਺Ͱѻ͏ίϯςΩετ
  41. Perlͷσʔλܕ (Array/Hash) • ഑ྻ • ॱংΛ࣋ͭσʔλͷू߹ • ϋογϡ • ໊લΛ࣋ͭσʔλͷू߹

  42. Perlͷσʔλ (ϦϑΝϨϯε) • σʔλͷ࣮ମ΁ͷࢀর(CͷϙΠϯλʹ͍ۙ) • ϑΝΠϧγεςϜͰ͍͏ͱ͜ΖͷγϣʔτΧο τ΍γϯϘϦοΫϦϯΫ • ϦϑΝϨϯεɾΧ΢ϯτGC •

    ࣮ମ΁ͷࢀর͕ͳ͘ͳΔͱ࣮ମΛഁغ
  43. Goͱܕ • ڧ͍੩తܕ෇͚ݴޠ • ม਺΍ؔ਺(Ҿ਺/ฦΓ஋)ɺσʔλ͕ܕΛ࣋ͭ • ม਺ͱσʔλͷܕ͕Ұக͢Δඞཁ͕͋Δ • ม਺ͱؔ਺ͷܕ͕Ұக͢Δඞཁ͕͋Δ •

    ͱʹ͔͘ܕ͕Ұக͢Δඞཁ͕͋Δ
  44. Goͷσʔλܕ (جຊ) • ੔਺: int, int32, int64 • ࣮਺: float,

    float32, float64 • จࣈྻ: string
  45. Goͷσʔλܕ (array) • ॱংΛ࣋ͬͨσʔλͷू߹ • αΠζ10ͷจࣈྻͷ഑ྻ: [10]string • Ұ౓࡞ͬͨΒ֦ு͢Δ͜ͱ͸Ͱ͖ͳ͍

  46. Goͷσʔλܕ (slice) • ഑ྻͷҰ෦ΛεϥΠεͨ͠ࢀর • ෼͔Βͳ͍ਓ͸ϙΠϯλͷཧղ͕଍Γͳ͍ • ҎԼͷεϥΠυͷ39ϖʔδҎ߱Λࢀর͢΂͠ • http://www.slideshare.net/yasi_life/

    go-14075425
  47. Goͷσʔλܕ (map) • ໊લΛ࣋ͬͨσʔλͷू߹ • stringΛΩʔʹͨ͠੔਺ͷmap: map[string]int • αΠζ͸ؾʹ͠ͳͯ͘΋Α͠ͳʹͯ͘͠ΕΔ

  48. Goͷσʔλܕ (struct) • ୯ҰͷσʔλΛදݱ͢Δσʔλͷू߹ • Point{X: 1, Y: 1} Έ͍ͨͳϊϦͷΞϨ

    • ࣗ༝ʹఆٛͰ͖Δ • C++ͷstruct/classʹ͍ۙ (ޙड़)
  49. Goͷσʔλܕ (pointer) • σʔλͷ࣮ମ΁ͷࢀর(CͷϙΠϯλʹ͍ۙ) • PerlͷϦϑΝϨϯεͱಉ͡ • શͯͷσʔλܕ͸ϙΠϯλΛ࡞ΕΔ

  50. Goͷܕ (interface) • ಛఆͷؔ਺Λݺͼग़ͤΔܕΛࣔ͢ • duck typingΛࢧԉ͢Δ • ࣗ༝ʹఆٛͰ͖Δ •

    Javaͷinterfaceʹ͍͕ۙimplements͢Δඞཁ ͸ͳ͍
  51. ϝϞϦ؅ཧ

  52. PerlͷϝϞϦ؅ཧ • શ෦ώʔϓྖҬʹ࣋ͭ • ϝϞϦϓʔϧΛ࣋ͬͯಈతʹׂΓ౰ͯΔ • શͯͷσʔλ͸GCͰഁغ͞ΕΔ • ϦϑΝϨϯεΧ΢ϯτͳͷͰ॥؀ࢀরʹऑ͍

  53. GoͷϝϞϦ؅ཧ • ؔ਺಺͚ͩͰ࢖ΘΕΔ஋: ελοΫྖҬ • ؔ਺֎Ͱ΋࢖ΘΕΔ஋: ώʔϓྖҬ • ώʔϓྖҬͷσʔλ͸GCͰ؅ཧ͞ΕΔ •

    Mark & Sweep ͳͷͰ॥؀ࢀরʹڧ͍͕GC͞ ΕΔ΋ͷ͕ଟ͍ͱGC͕ॏ͘ͳΔ
  54. ؔ਺

  55. Perl ؔ਺ • αϒϧʔνϯ͕୅ସ • ԾҾ਺͸ແ͍ • @_Λద౰ʹ୅ೖͯ͠࢖͏ • ෳ਺ͷ஋Λฦ͢͜ͱ͕Ͱ͖Δ

  56. Go ؔ਺ • ԾҾ਺ͱฦΓ஋ͷܕΛ໌ࣔ͢Δඞཁ͕͋Δ • @_ Έ͍ͨͳ໺൮ͳ͜ͱ͸Ͱ͖ͳ͍ • ෳ਺ͷ஋Λฦ͢͜ͱ͕Ͱ͖Δ •

    ผʑͷม਺ͰશͯͷฦΓ஋Λड͚औΔ
  57. ϝιου

  58. Perl ϝιου • package(Ϋϥε)΍packageʹbless(ͻ΋෇͚) ͞ΕͨϦϑΝϨϯε(=Πϯελϯε)͔Βαϒ ϧʔνϯΛϝιουݺͼग़͠Ͱ͖Δ • ϝιουݺͼग़͢͠ΔͱαϒϧʔνϯͷୈҰ Ҿ਺ʹίϯςΩετͱͯ͠Ϋϥε΍Πϯελϯ ε͕౉͞ΕΔ

  59. Perl ϝιου • @PackageName::ISA ͕ܧঝύοέʔδ • ݟͨ໨ͷ௨Γଟॏܧঝ͕Մೳ • ϝιουݺͼग़͠Ͱ͸ܧঝΛḷͬͯ͘ΕΔ •

    ͜ͷ͔Β͘ΓΛblessͱ૊Έ߹ΘͤΔ͜ͱͰ OOP͕ՄೳʹͳΔ
  60. Perl ϝιου (ऄ଍) • AUTOLOAD • rubyͰ͍͏ͱ͜Ζͷmethod_missing • UNIVERSAL •

    rubyͰ͍͏ͱ͜ΖͷObjectΫϥε
  61. Go ϝιου • ࣗ෼ͷpackageͷσʔλܕʹ͸ϝιουͷΑ ͏ͳ΋ͷΛੜ΍͢͜ͱ͕Ͱ͖Δ • struct΍ͦͷϙΠϯλʹੜ΍͢ͷ͕Ұൠత • ଞͷݴޠͷΫϥεͷΠϯελϯεϝιουͬ Ά͘ͳΔ

  62. Go ϝιου (ऄ଍) • structͷmixin͸Մೳ͕࣮ͩଶ͸ͨͩͷҕৡ • ܧঝͰ͸ͳ͍ͷͰ௚ʹϝιου͸ݺ΂ͳ͍ • ҕৡͳͷͰcontext object͕ҟͳΔ͜ͱʹ

    • ܕ৘ใ΋isaͷؔ܎ʹͳΒͳ͍
  63. Go ϝιου (௒ऄ଍) • ੩తܕ෇͚ݴޠͳͷͰAUTOLOADͰ͖·ͤΜ • ͪͳΈʹCrystalͩͱmacroͰ࣮ݱ͍ͯ͠Δ • UNIVERSALΈ͍ͨͳ΍ͭ͸ͳ͍ͷʔʁ •

    ܧঝ͕ແ͍ͷͰ͓࡯͍ͩ͘͠͞ͳ
  64. લஔ͖ऴΘΓ

  65. ࣮༻తͳ࿩

  66. จࣈྻૢ࡞

  67. Perl ͷจࣈྻૢ࡞ • ਖ਼نදݱ·͡࠷ߴ·͡ศར!! • جຊతʹshell script༝དྷͷจԽͳͷͰ… • tr///ͱs///ͱ͔͋Ε͹͍͍ͩͨͳΜͱ͔ͳΔ •

    ͳΜͱ͔ͳΒͳ͍ͱ͜ΖͰuc/lcͱ͔Λ࢖͏
  68. Go ͷจࣈྻૢ࡞ • ίΞ͕αϙʔτ͢Δػೳ͸࠷খݶ • stringsύοέʔδͰ͍͍ͩͨͳΜͱ͔ͳΔ • ࠔͬͨΒ·ͣ͜͜Λௐ΂Α • ਖ਼نදݱΛؾܰʹ࢖͏ͱՄಡੑΛଛͳ͏

    • ਖ਼نදݱͷίʔυ͕Perlͱ͘Β΂ͯ৑௕
  69. ܕม׵

  70. Perl ͷܕม׵ • ίϯςΩετͰܕΛ໌ࣔ͢ΔͷͰσʔλͷܕ ม׵͕ͦ΋ͦ΋ෆཁ • ڧ͍ͯݴ͑͹ίϯςΩετຖʹ҉໧తʹܕ ม׵͕ى͍ͬͯ͜Δͷʹ͍͕ۙ͜Ε͸ݫີʹ ͸ਖ਼֬ͳදݱͰ͸ͳ͍

  71. Go ͷܕม׵ • ܕ͕ݫີͳͷͰܕม׵͍ͨ͜͠ͱ͕ଟ͍ • strconvύοέʔδͰ͍͍ͩͨͳΜͱ͔ͳΔ • ܕΩϟετ͸࠷ऴखஈͱ৺ಘΑ • interfaceΛ͏·͘׆༻͢Δͱଟ͘ͷ৔߹Ͱ͸

    ܕΩϟετͷඞཁੑ͕ͳ͘ͳΔ
  72. Τϥʔॲཧ

  73. Perl ͷΤϥʔॲཧ • ྫ֎ • eval BLOCK ͷதͰdie͢Δ • $@

    ʹdieʹ౉ͨ͠Scalar஋͕ೖΔ • ී௨
  74. Go ͷΤϥʔॲཧ • ฦΓ஋ͰerrorܕΛฦ͢ͷ͕෩श • result, err := strconv.Atoi(“unko”) •

    if err != nil { … } Ͱશ෦ͳΜͱ͔͢Δ • ෼ذॻ͖๨Εͯ΋ίϯύΠϥ͸ॿ͚ͯ͘ΕΜ
  75. Go ͷΤϥʔॲཧ • ະ࢖༻ͷม਺͕͋ΔͱίϯύΠϧΤϥʔ • ୯ҰͷείʔϓͰ୯ҰͷΤϥʔΛॲཧ͢Δ • ͢Δͱerrorܕͷ஋Λ࢖Θͳ͍ͱίϯύΠϧ Τϥʔ͕ൃੜ͢Δ •

    catch࿙Ε͕͋ΔͱίϯύΠϧΤϥʔ͢Δੈք
  76. ߏ଄ઃܭ ※ݸਓͷݟղͰ͢

  77. Perl ͷߏ଄ઃܭ • খ͍͞΋ͷ͸खଓ͖ͬΆ͘ΰϦΰϦͬͱॻ͘ • େ͖ͳ΋ͷ͸OOPΒ͘͠෼͚ͯॻ͘ • Webͱ͔ͩͱAmon2ͱ͔࢖ͬͯMVCͨ͠Γ • package(Ϋϥε)Ͱ͔ͬ͠ΓείʔϓΛ੾Δ

  78. Go ͷߏ଄ઃܭ • interfaceΛத৺ʹઃܭ͢Δ • ৼΔ෣͍Λड͚౉͍ͯ͘͠Πϝʔδ • ϙϦϞʔϑΟζϜతͳߟ͑ํ • ελοΫྖҬΛ͏·͘࢖͏Α͏ʹॻ͘ͱߴ଎

  79. Go ͷߏ଄ઃܭ • େ͖ͳ΋ͷΛ࡞Δͱ͖͸಺෦తʹpackageΛ ෼͚ΔͱΑͦ͞͏ • ૬ରύεͰύοέʔδΛϩʔυͰ͖ΔͷͰ ͦΕΛ͏·͘׆༻͢Δ • https://github.com/builderscon/octav

  80. ฒྻॲཧ ※ݸਓͷݟղͰ͢

  81. Perl ͷฒྻॲཧ • forkҰ୒ • threadͷΑ͏ͳ΋ͷ΋ͳ͘͸ͳ͍͕ΰϛ • ࢖ͬͯ͸ͳΒͳ͍ • ಉظ͸ϑΝΠϧΛ࢖ͬͨΓPIPEΛ࢖ͬͨΓ

  82. Perl ͷฒྻॲཧ • ͳΔ΂͘ϓϩηε͕࢖͍·ΘͤΔΑ͏ʹ͢Δ • ͭ·Γ͍ΘΏΔpre-forkࣜ • ϓϩηεؒͷಉظ͕ඞཁʹͳͬͨΒෛ͚ • Ͳ͏ͯ͠΋ඞཁͳΒPerlʹ͸޲͍ͯͳ͍ͱׂ

    Γ੾Δ͔AnyEventͳͲΛซ༻͢Δ
  83. Go ͷฒྻॲཧ • goroutineͱ͍͏εϨουͷΑ͏ͳ΋ͷ͕͋Δ • ʮฒྻͰಈ͍ͯ΋ྑ͍΋ͷʯΛ࡞ΔΠϝʔδ • Go͕͍͍͔Μ͡ʹεέδϡʔϦϯά͢Δ • جຊతʹ͸channelͰಉظΛऔΔ

  84. Go ͷฒྻॲཧ • ಉظͷίετΑΓฒྻԽͷϝϦοτ͕ߴ͚Ε ͹͕Μ͕ΜgoroutineΛ࡞Δͱྑͦ͞͏ • ಉظ͕සൟʹඞཁʹͳΔͳΒߟ͑ํΛม͑ ͯΈΔ • ϓϩηεͱҧͬͯؾܰʹࡴͤͳ͍఺ʹ͸஫ҙ

  85. ·ͱΊ

  86. ·ͱΊ • GoͱPerl͸ࣅ͍ͯΔʂ • ͱ·Ͱ͸ݴ͑ͳ͍͚Ͳͱ͖ͬͭ΍͍͢ͱࢥ͏ • Go΋Perl΋దࡐదॴͰ࢖͍͚ͬͯΔͱΑͦ͞͏ Ͱ͢Ͷ

  87. ͓ΘΓ

  88. ࣭໰·ͩ͋Ε͹Ͳ͏ͧ