Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オミカレを支えるチーム開発 ~プロダクトを支える文化~/phpconference-sendai2019-omicale

オミカレを支えるチーム開発 ~プロダクトを支える文化~/phpconference-sendai2019-omicale

2019-01-26 に開催された PHPカンファレンス仙台2019の資料です。

株式会社オミカレとしてランチセッションを行いました。

# セッション概要

オミカレはこの秋、会員登録総数30万人を突破したサービスで、日々数多くの改善が行われております。
運用開始から約7年の経験から、もの凄いスピードについていく為に「変化に強いチーム、改善していく文化」が作り上げられています。

このセッションでは この春転職してきた自分が感じたオミカレの組織・文化作りとはどういったものかというという事と
その組織をより良くする為に自分が行った取組についてお話させて頂きます。

F891bc57aad1b6bdbf344358e7fec3cc?s=128

Takahashi Ikki

January 26, 2019
Tweet

Transcript

  1. ΦϛΧϨΛࢧ͑ΔνʔϜ։ൃ ~ ϓϩμΫτΛࢧ͑ΔจԽ ~ 2019-01-26 PHPΧϯϑΝϨϯεઋ୆2019 1

  2. ஫ҙࣄ߲ • εϥΠυ͸ެ։͠·͢ɻ • ࣭໰ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β #phpconsen ΁ ͓ئ͍க͠·͢ɻ 2

  3. ͓͠ͳ͕͖ 1. ࣗݾ঺հ 2. ΦϛΧϨͷจԽ 3. จԽΛΑΓྑ͘͢Δҝͷऔ૊ 4. ·ͱΊ 3

  4. 1. ࣗݾ঺հ • ߴڮ Ұٍ • Ԭࢁࡏॅ • גࣜձࣾΦϛΧϨ WebΤϯδχΞ

    • ೔ຊPostgreSQLϢʔβʔձ தࠃࢧ෦௕ • ڇλϯห౰ɾɾ޷͖... 4
  5. גࣜձࣾΦϛΧϨ શࠃ35,000݅ͷࠗ׆ύʔςΟΛ ܝࡌͨ͠ϙʔλϧαΠτ 30ສਓڧͷձһͷํʑʹ͝ར༻௖͍ͯ ͍·͢ɻ ࠗ׆ͱݴ͑͹ΦϛΧϨʂ \\ ݁ࠗ͸͍͍ͧʂʂ // 5

  6. ʮΦϛΧϨΛࢧ͑ΔνʔϜ։ൃʯ • 2018೥5݄ʹΦϛΧϨʹJOIN • લ৬ͷจԽͱͷҧ͍ • νʔϜ։ൃΛΑΓ΍Γ΍͘͢͢Δҝͷऔ૊ ...Λ ϓϨΠϠʔͷ؍఺ ͔Β

    6
  7. Ϛωʔδϟʔ໨ઢͷ࿩ ฐࣾCTO ીࠜ(@soudai1025) ͕ PHPΧϯϑΝϨϯεͰطʹ͓࿩Λ ͓ͯ͠Γ·͢ɻ ڵຯ͕͋Δํ͸ͪ͜ΒΛͲ͏ͧɻ https://speakerdeck.com/soudai/ proper-problem 7

  8. 2. ΦϛΧϨͷจԽ 8

  9. Ϛωʔδϟʔ໨ઢͷ࿩Λཁ໿ • ྑ͍૊৫͸ྑ͍จԽΛɺྑ͍จԽ͸ྑ͍νʔϜΛɺ ྑ͍νʔϜ͸ྑ͍αʔϏεΛ࡞ΕΔɻ • ద੾ͳ໰୊Λఏڙ͠ɺͦͷνϟϨϯδΛධՁ͢ΔࣄͰ ਓ͸ҭͪɺͦΕ͸૊৫ΛҭͯΔɻ ΊͬͪΌ͍͍࿩ͳͷͰੋඇݟͯ΄͍͠ɻ 9

  10. ΦϛΧϨͷݱঢ় • ౦ژɾԬࢁͷ2ڌ఺Ͱ։ൃΛߦ͍ͬͯΔɻ • ΤϯδχΞ෦ୂ͸౦ژ໊̑ɺԬࢁ3໊ͷܭ8ਓ • ͦͷଞ αϙʔτରԠ΍ϚʔέςΟϯάΛ୲౰͢Δ CRT͕10໊લޙ •

    ͍ΘΏΔελʔτΞοϓاۀ 10
  11. ΦϛΧϨͷݱঢ় • νϟοτπʔϧ͸ Slackɻ • ଞڌ఺ؒͰ࢓ࣄΛͯ͠ΔͷͰجຊతʹςΩετϕʔεͰ ίϛϡχέʔγϣϯΛ͢Δɻ • ྡʹډͯ΋ɺجຊతʹ͸νϟοτͰ࿩͢ɻ •

    ձٞ౳͸SlackͷϏσΦձٞ SlackίʔϧͰߦ͏ɻ 11
  12. ͦΜͳձࣾʹೖࣾͨ͠ 12

  13. ͦ͜ʹ͸7೥༨Γͷظؒ αʔϏεΛࢧ͑ଓ͚͖ͯͨจԽ͕͋ͬͨ 13

  14. લ৬ͷจԽΛܰ͘঺հ 14

  15. લ৬ͷจԽ • ࣗࣾαʔϏε࡞੒ͷձࣾ • ࣾһ͸100໊ఔɺେ൒͸ӦۀͰ։ൃ෦ୂ͸30໊ɻ (಺20໊͘Β͍͕ςελʔ) • جຊతʹ্௕͔Βͷτοϓμ΢ϯܗࣜͰҙࢥܾఆ • ݄ΠνͰϦϦʔεεέδϡʔϧ͕૊·ΕΔɻ

    • ࢓༷มߋ౳΋਺िؒ୯ҐͰଞ෦ॺͱଧͪ߹Θܾͤͯఆɻ 15
  16. લ৬ͱͷൺֱ • ϦϦʔεαΠΫϧͷҧ͍ɻ • ίϛϡχέʔγϣϯͷ׆ൃ͞ɻ • ϑΟδϏϦػೳͷνϟϨϯδɻ • ݸਓͷࡋྔͷଟ͞ɻ 16

  17. ϦϦʔεαΠΫϧͷҧ͍ • ϦϦʔεͷ଎౓͕ͱͯ΋଎͍ɻ • 1ϓϧϦΫɺ1ϦϦʔεͷܗࣜͷҝ Ϛʔδ͞Ε࣍ୈଈϦϦʔεͱͳͬͯΔɻ • ̍೔ʹ਺10ػೳ͕ϦϦʔε͞ΕΔࣄ΋͋Δɻ • ϦϦʔε͕ߴ଎ͳҝɺҙࢥܾఆ͕ඇৗʹ଎͍ɻ

    17
  18. ίϛϡχέʔγϣϯͷ׆ൃ͞ɻ • ίϛϡχέʔγϣϯ͸SlackͰ͓͜ͳΕΔ͕ SlackͰͷձ࿩͕ඇৗʹ׆ൃʹߦΘΕ͍ͯΔɻ • ύʔτφʔ͞Μᐌ͘ʮνϟοτͷྲྀ଎͕଎͍Ͷʯ ๻໨ઢɿTwitterͱ͔ʹൺ΂Δͱશવ஗͍ɻ 18

  19. ίϛϡχέʔγϣϯͷ׆ൃ͞ɻ • ʮ׆ൃʯͰ͋Δࣄͱ͍͏ఆٛ͸தʑந৅తͰ͸͋Δ͕ɺ ΤϯδχΞͷ෼ใ͕ඇৗʹ༗ޮʹ࢖ΘΕ͍ͯΔɻ ͱ͍͏఺ͩͱࢥͬͯΔɻ • ʮXXXXػೳ͕ग़དྷͨʯͬͯ෼ใʹॻ͘ͱ ֆจࣈͰϦΞΫγϣϯͯ͘͠ΕͨΓ ·ͨ͸৭ΜͳίϝϯτΛ͘ΕΔɻ •

    ʮXXXXͬͯ಺༰ͰࠔͬͯΔʯͬͯᄁ͘ͱ ͦΕ͸͜Μͳײ͡Ͱղܾ͢Δͷ͕ྑ͍ΑɺͱΞυόΠεΛ͘ΕΔɻ 19
  20. ϑΟδϏϦػೳͷνϟϨϯδɻ • ϑΟδϏϦ(࣮ݧత)ͳػೳͷνϟϨϯδ͕ ඇৗʹଟ͘ߦΘΕͯΔɻ (໪࿦ɺWebαʔϏεͷ੒௕ʹ͸͔ܽͤͳ͍࿩͔΋͠Εͳ͍) • ֤ΤϯδχΞʹ਺ࣈΛݟΔश׳Ͱ͋ͬͨΓ ϑΟδϏϦػೳΛ୔ࢁߦ͍ͬͯΔͷͰ ඇৗʹҙݟΛग़͠΍͍͢؀ڥʹͳ͍ͬͯΔɻ 20

  21. ݸਓͷࡋྔͷଟ͞ • ͜ͷลΓ͸Ϛωʔδϟʔ໨ઢͷ࿩ͰCTO͕࿩Λ͍͕ͯͨ͠ɺ ֤ΤϯδχΞ΁ͷࡋྔ͕ඇৗʹଟׂ͘Γ౰ͯΒΕͯΔɻ • ࡋྔͷௐ੔ʹ͍ͭͯ͸݄Ұͷ1on1Ͱ͋ͬͨΓͰ λεΫͷཻ౓Λௐ੔͠ͳ͕Β੒௕͍͚ͯ͠Δ౔୆͕͋Δɻ 21

  22. ΦϛΧϨͷจԽΛࢧ͑Δ΋ͷ 22

  23. ίϛϡχέʔγϣϯͷ׆ൃ͞ • ʮ৽ػೳ͕ϦϦʔε͞ΕͨʂʯʹϦΞΫγϣϯ͕΋Β͑Δɻ ※ ͦΕ΋ΤϯδχΞ͚ͩͰͳ͘ ϏδωεαΠυ͔Β΋ɻ => "ঝೝཉٻ"͕ຬͨ͞ΕΔɻ • ʮXXXX্͕ख͍͔͘ͳ͍ɻʯ࣌ʹΞυόΠε͕΋Β͑Δɻ

    => "૬ஊ΁ͷϋʔυϧ"͕Լ͕Δɻ 23
  24. ৺ཧత҆શੑ͕ҭͭ 24

  25. ৺ཧత҆શੑͱ͸ https://speakerdeck.com/cobasparxxx/xin-li-de-an-quan-xing-falseyu-tefang 25

  26. ৺ཧత҆શੑͱ͸ "৺ཧత҆શੑͱ͸ɺରਓؔ܎ʹ͓͍ͯϦεΫ͋ΔߦಈΛऔͬͨ ࣌ͷޮՌʹର͢Δݸਓͷೝ஌ͷ࢓ํɺͭ·Γʮແ஌ɺແೳɺω ΨςΟϒɺअຐͩͱࢥΘΕΔՄೳੑͷ͋ΔߦಈΛͯ͠΋ɺ͜ͷ νʔϜͳΒେৎ෉ͩʯͱ৴͡ΒΕΔ͔Ͳ͏͔Λҙຯ͠·͢ɻ" -- ৺ཧత҆શੑͷҭͯํ https://speakerdeck.com/cobasparxxx/xin-li-de-an-quan-xing-falseyu-tefang 26

  27. ΦϛΧϨͷจԽ ৺ཧత҆શੑͷߴ͍νʔϜ࡞Γ͕ߦΘΕ͍ͯΔɻ • ৺ཧత҆શੑͷߴ͞ʹΑͬͯ ϓϨΠϠʔ͔Β૊৫΁ͷϘτϜΞοϓ͕ ߦ͍΍͍͢จԽ͕͋Δɻ • ͦΕ͸ྑ͍૊৫Λ࡞Δ͠αʔϏεͷ੒௕Λࢧ͍͑ͯ͘ ྑ͍νʔϜΛ࡞͍ͬͯ͘ɻ 27

  28. ΦϛΧϨͷจԽΛࢧ͑Δ "ٕज़" 28

  29. ʮ໰୊͸ٕज़ͱ࢓૊ΈͰղܾ͍ͯ͘͠ʯ 29

  30. ৺ཧత҆શੑΛҭͯΔ "ٕज़" 30

  31. Slackͷbotͱֆจࣈ 31

  32. Slackͷձ࿩bot Slackͷֆจࣈ 32

  33. ձ࿩Bot • hubot Ͱ࣮૷͞Ε͍ͯΔɻ • ౤ߘͨ͠จࣈྻʹରԠ͢ΔจࣈྻΛฦͯ͘͠ΕΔɻ "u => řőőő" ͱܾ·Γ͖ͬͨจݴͷύλʔϯɺ

    "otu => śŨŜƀŧŒƃ or ͓ർΕ༷Ͱͨͬ͠" ͱ ෳ਺ύλʔϯ͔ΒϥϯμϜͰฦͯ͘͠ΕΔύλʔϯɺ ͭ͘͏ => ͜ΕͰ΋ҿΉ͕ྑ͍ ͬͯϋΠϘʔϧͷը૾Λ ฦͯ͘͠ΕͨΓͱ͔ɻ 33
  34. ձ࿩BotͷԸܙ • ࠷୹1จࣈͰେ͖ͳϦΞΫγϣϯ͕ग़དྷΔɻ ੝Γ্͕ͬͯΔΑ͏ʹݟ͑Δɻ • ύλʔϯ͕ແ਺ʹ͋ΔͷͰ͍ͭ΋৽઱ɻ • ֆจࣈ΋ಉ༷ 34

  35. hubotʹ͍ͭͯ • ຊମ͸JavaScriptɺ ΤϯδχΞͳΒ୭Ͱ΋৮ΕΔ৔ॴͰ؅ཧ͞ΕͯΔͷͰ ࣗ༝ʹฤूग़དྷΔɻ • ֆจࣈ΋ಉ͡Ͱ୭Ͱ΋ࣗ༝ʹֆจࣈͷ௥Ճ͕ग़དྷΔɻ => ࣗ෼͕௥Ճͨ͠΋ͷΛ࢖ͬͯ͘ΕΔͷͰঝೝཉٻͷϧʔϓ 35

  36. ΦϛΧϨͷจԽ • ίϛϡχέʔγϣϯͷ׆ൃ͞ʹΑͬͯ ৺ཧత҆શੑ͕୲อ͞Εɺݸʑͷϝϯόʔ͸ ΑΓྑ͍૊৫Λ࡞Δҝʹಈ͖΍͍͢ɻ • ࿩޷͖͕ू·͍ͬͯΔͷͰ͸ແͯ͘ hubot΍ֆจࣈͳͲͷίϛϡχέʔγϣϯ͕ ׆ൃʹͳΔΑ͏ͳٕज़ʹΑͬͯ׆ൃ͞Λ࡞Γ্͛ͯΔɻ 36

  37. ΦϛΧϨ࠷ߴ 37

  38. ͱ͸͍͑ɺ՝୊΋͋Δ 38

  39. ΦϛΧϨͷ՝୊ • ଎౓ʹରͯ͠ϨϏϡʔ͕ண͍ͯͳͯ͘ ϨϏϡʔ଴ͪͷ··ϓϧϦΫΤετ͕࢒ͬͯ͠·͍ͬͯͨɻ • ػೳΛͲΜͲΜϦϦʔε͍ͯ͘͠ࣄͰ όάʹؾ෇͖͖Εͳ͍ࣄ͕͋Δɻ • ਺஋ͷ෼ੳج൫ͷ࢓૊Έ͕࡞੒͞Ε͖ͬͯͳ͔ͬͨΓ͢Δɻ 39

  40. ʮ໰୊͸ٕज़΍࢓૊ΈͰղܾ͢Δʯ 40

  41. 3. จԽΛΑΓྑ͘͢Δҝͷऔ૊ 41

  42. ʮ໰୊͸ٕज़΍࢓૊ΈͰղܾ͢Δʯ ࠓͷจԽΛ࠷େݶʹ׆༻ͯ͠ νʔϜͷ໰୊Λղܾ͍ͯ͘͠ɻ • ίϛϡχέʔγϣϯ͸ Slack ΁ɻ • υΩϡϝϯτ͸ esa

    ΁ɻ • λεΫ͸ Backlog ΁ɻ • ਺ࣈ͸ εϓϨουγʔτ ΁ɻ 42
  43. ࣮ࡍʹνϟϨϯδͨ͠ࣄྫ 43

  44. ίϛϡχέʔγϣϯΛΑΓԁ׈ʹ͢Δҝͷऔ૊ ൃੜ͍ͯͨ͠໰୊ • ʲ՝୊ʳ νʔϜ͕౦ژɾԬࢁʹډΔͷͰ SlackͰίϛϡχέʔγϣϯΛऔΒͳ͍ͱ ֤ڌ఺ؒͰ૬खͷ͜ͱ͕Θ͔Βͳ͍ɻ طʹܗ੒͞ΕͯͨจԽ • ίϛϡχέʔγϣϯΛԁ׈ʹ͢Δҝͷ

    bot ͕ಋೖ͞Εͯͨ 44
  45. BotͷΧελϚΠζ΍ΧελϜֆจࣈͷ࡞੒ΛߦͬͯΈͨɻ • ʮͭ͘͏ʯ ͱ͍͏จࣈྻʹରͯ͠ ͓ञͷࣸਅΛૹͬͯΈΔΑ͏ͳbotΛ࡞ͬͯΈͨΓɾɾ(স) • ʮyoroʯ ͬͯଧͬͨΒࣾ௕ͷޱบͷ ΑΖ͘͠ѩय! ͬͯݴ༿Λग़͢Α͏ʹͯ͠ΈͨΓɻɻ(স)

    • ৽ೖࣾһ͕ೖ͖ͬͯͨλΠϛϯάͰͦͷਓͷ ΞΠίϯͱ͔χοΫωʔϜͷֆจࣈΛ࡞ͬͨΓɻɻ(স) 45
  46. ࣮ફͨ݁͠Ռ • ࡶͳίϛϡχέʔγϣϯʹ໾ཱͭΑ͏ʹͳͬͨɻ • ಉ͡ݴ༿ʹରͯ͠όϦΤʔγϣϯ͕͏·Εͨɻ 46

  47. ΫϦςΟΧϧύεͱͳΔ؂ࢹ͸SlackʹूΊΔɻ ൃੜ͍ͯͨ͠໰୊ • ʲ՝୊ʳ MySQL͔ΒPostgreSQL΁ͷτϦΨʔΛ࢖ͬͨҠߦͰ τϦΨʔΤϥʔ͸ΫϦςΟΧϧύεͱͳΔͷͰɺ؂ࢹΛ͢Δඞཁ͕͋Δɻ • ϝʔϥʔΛීஈ͔Β্ཱͪ͛ͯͳ͍ͷͰɺΤϥʔ௨஌Λϝʔϧʹدͤͯ΋ݟͳ͍ɻ طʹܗ੒͞ΕͯͨจԽ •

    Τϥʔ৘ใ͸Slackͷ #notice νϟϯωϧʹूΊΔɻ 47
  48. PostgreSQLͷτϦΨʔΤϥʔͷ؂ࢹΛSlack΁ɻ PostgreSQLͷΤϥʔϩάΛఆظతʹ؂ࢹͯ͠ Τϥʔ৘ใ͕͋ͬͨΒSlackʹ௨஌͢ΔϓϩάϥϜΛ࡞੒ͯ͠ ΫϦςΟΧϧύεͱͳΔΤϥʔΛ ૉૣ֬͘ೝग़དྷΔΑ͏ʹͨ͠ɻ \\ ͳΜͱɺPHP੡ // 48

  49. ࡞੒࢓༷ https://dev.classmethod.jp/cloud/aws/amazon-rds-logs-download-tips/ 49

  50. ཁ໿͢Δͱ... • RDSͷϩά͸ AWS SDKͷؔ਺Λ࢖ͬͯશߦऔಘग़དྷΔɻ • ؔ਺ʹ͸औಘ։࢝ҐஔΛࢦఆग़དྷΔɻ ͭ·ΓɺطʹಡΜͩҐஔΛඈ͹ͨ͠ঢ়ଶͰॲཧग़དྷΔɻ 50

  51. ඞཁͳཁ݅ • ఆظతʹSDKΛୟ͍ͯϩάΛϙʔϦϯά͢Δɻ • લճͷ෼ੳҐஔΛ͓͍֮͑ͯͯલճͷ෼ੳ෼͸ඈ͹͢ɻ • ΤϥʔΛݟ͚ͭͨ࣌ʹSlack΁௨஌͢Δɻ 51

  52. ఆظతʹSDKΛୟ͘ ؂ࢹ͸MackerelʹدͤΔจԽ͕طʹ͋ͬͨͷͰ࠾༻. 52

  53. ఆظతʹSDKΛୟ͘ -------------------------------------------------- [plugin.checks.೚ҙͷ໊લ] command = "php /path/to/check_rds_log.php" check_interval = 5

    -------------------------------------------------- • MackerelͷઃఆʹΑͬͯɺ5෼ʹҰճࢦఆͨ͠ίϚϯυΛ࣮ ߦͯ͘͠ΕΔɻ 53
  54. طʹಡΜͩ෼͸ඈ͹͢ɻ • SDKͷؔ਺ͷҾ਺ʹ Marker ͱݺ͹ΕΔɺߦͱରԠ͢Δ஋͕ ͋ͬͯɺ਺஋Ͱ؅ཧ͞Ε͍ͯΔɻ • SDKͷؔ਺ΛݺΜͩλΠϛϯάͰ ϨεϙϯεͷMakerΛ .jsonϑΝΠϧʹ֨ೲͯ͠؅ཧ͢Δࣄʹͨ͠ɻ

    54
  55. ΤϥʔΛݟ͚ͭͨ࣌ʹ௨஌Λඈ͹͢ɻ • MackerelͷcheckϓϥάΠϯ͸ ίϚϯυ಺ͷϓϩάϥϜͰ ҎԼͰऴྃͤ͞ΔࣄͰ ҟৗΛݕ஌ͤ͞Δࣄ͕ग़དྷ·͢ɻ exit(1) ... WARNING exit(2)

    ... CRITICAL • MackerelଆͷઃఆͰ WARNINGͷ࣌ͷৼΔ෣͍ͱͯ͠ Slackʹ௨஌͢Δ Λ࢓ࠐΜͰରԠɻ 55
  56. PHPίϚϯυͷΤϥʔͷ൑ఆϩδοΫ • ":ERROR:" ͱ͍͏จࣈྻ͕͋Δ͔Ͳ͏͔ɻ (ײ֒ਂ͍) • :ERROR: ͕͋Ε͹1~2ߦԼΛߋʹௐࠪͯ͠ :DETAIL: ͱ͔

    :CONTEXT: ͕͋Ε͹Ұॹʹरͬͯ͘Δɻ => τϦΨʔͷ໊લͱ͔ߦΛҰॹʹऔͬͯ͜ΕΔɻ 56
  57. ࣮ફͨ݁͠Ռ • 5෼αΠΫϧͱ͔Ͱৗʹ؂ࢹ͕ൃੜ͍ͯ͠ΔͷͰศརɻ noticeʹདྷͯͳ͍ = τϦΨʔ͕Մಈதɺͱ൑அग़དྷΔͷͰ ৺ཧతͳෆ͕҆ݮͬͨɻ • ෭࢈෺ͱͯ͠τϦΨʔͷϩάʹ ":ERROR:"

    ͱ͍͏จࣈΛ ࢓ࠐΉࣄͰDebugʹ໾ཱͭࣄ͕෼͔ͬͨɻ 57
  58. νʔϜ։ൃΛΑΓԁ׈ʹ͢Δҝͷऔ૊ ൃੜ͍ͯͨ͠໰୊ • GithubͷΧϯόϯͰϨϏϡʔ଴ͪΛ؅ཧ͍ͯ͠Δ ͕ɺGithubͷϖʔδʹఆظతʹߦͬͯݟͳ͍ͱ͍͚ ͳ͍ɻ(SlackͰґཔ͸ͯ͠΋ྲྀΕ͕ͪ) • ͦͷ݁ՌɺϨϏϡϫʔ͕ภΔɻ طʹܗ੒͞ΕͯͨจԽ •

    Slack্Ͱhubot͕ಋೖ͞Ε͍ͯͯ จࣈྻʹରԠͨ͠ಈ࡞Λͤ͞Δɻ ྫɿ kintai ͱଧͭͱ ۈଵγεςϜͷ ϦϯΫ͕౤ߘ͞ΕΔɻ 58
  59. νʔϜ։ൃΛΑΓԁ׈ʹ͢Δҝͷऔ૊ SlackʹbotΛಋೖͨ͠ɻ Slack ʹ ʰreviewʱ ͱ౤ߘ͢Δͱ bot ͕ GithubͷProjects͔Β ϨϏϡʔ଴ͪ

    ʹͳ͍ͬͯΔissue/PRΛ औಘͯ͠Ұཡͱͯ͠ग़ྗ͢Δɻ \\ ͳΜͱɺPHP੡ // 59
  60. ࡞੒࢓༷ Github Projects ͷ API Λୟ͍ͯऔಘ. ϦϑΝϨϯεɿ https://developer.github.com/v3/projects/ GithubυϝΠϯͰݴ͍ද͢ͱ "ΦϛΧϨ"ϓϩδΣΫτʢΧϯόϯʣͷதͷ

    "ϨϏϡʔґཔ"ͱ͍͏ΧϥϜ͔Β "ϓϧϦΫ"ʢΧʔυʣҰཡΛऔಘ͢Δ 60
  61. Github Projects ͷ API Λୟ͍ͯऔಘ. • "ΦϛΧϨ"ϓϩδΣΫτͷproject_idΛऔಘ͢Δ • "ϨϏϡʔґཔ"ΧϥϜͷcolumn_idΛऔಘ͢Δɻ •

    GET /projects/columns/:column_id/cards Λୟ͘ɻ 61
  62. "ΦϛΧϨ"ͷproject_idͷऔಘ มΘΒͳ͍ͷͰఆ਺Ͱ࣋ͭɻ GET /repos/:owner/:repo/projects Λୟ͘ͱ ϓϩδΣΫτͷϦετ͕ฦΔͷͰ֘౰ͷIDΛ୳͢ɻ "ϨϏϡʔґཔ"ͷcolumn_idͷऔಘ มΘΒͳ͍ͷͰఆ਺Ͱ࣋ͭɻ GET /projects/:project_id/columns

    Λୟ͘ͱ ϓϩδΣΫτ಺ͷΧϥϜͷϦετ͕ฦΔͷͰ֘౰ͷIDΛ୳͢ɻ 62
  63. GET /projects/columns/:column_id/cards Λୟ͘ɻ :colmn_id => औಘͨ͠ϨϏϡʔґཔͷcolumn_idΛηοτɻ ΧϥϜ಺ͷΧʔυͷϦετ͕ฦΔͷͰͦΕΛऔಘ͢Δɻ ※ Ϩεϙϯεʹ͸ϓϧϦΫຊମͷURL΍λΠτϧؚ͕·Ε͍ͯͳ͍ͷͰ ඞཁͳ৔߹͸ɺϨεϙϯε಺ͷ

    content_urlʹରͯ͠ ࠶౓GETͰϦΫΤετΛߦ͏ɻ 1+N(Χʔυͷ਺) ճϦΫΤετ͕౤͛ΒΕΔͷͰɺ ϨϏϡʔͷཷ·Γঢ়گ΍ཁ݅ʹԠͯ͡ௐ੔͢Δɻ 63
  64. ࣮ફͨ݁͠Ռ • ϨϏϡʔ଴ͪͷϦετΛ Slack͔Β֬ೝग़དྷΔɻ => Θ͟Θ͟ɺGithubʹݟʹߦ͔ͳͯ͘΋ྑ͍ɻ • ϨϏϡʔ଴ͪ࢒ͷঢ়گ͕ࣗ෼ൃ৴Ͱແͯ͘΋ɺ֬ೝग़དྷΔɻ => ଞͷਓ͕reviewΛୟ͍ͨͱ͖ʹҰॹʹϨϏϡʔ͢Δɻ

    => ϨϏϡϫʔͷݻఆԽΛগ͠ղফɻ 64
  65. KPIͳͲ਺ࣈͷूܭΛվળ͢Δऔ૊ ൃੜ͍ͯͨ͠໰୊ • ຖ೔৬ਓ͕ूܭͷSQLΛ࣮ߦͯ͠εϓϨουγʔτ΁هड़ɻ • ͦͷਓ͕ٳΜͩͱ͖ʹ ਺஋͕௥͑ͳ͍ɻ • ࿈ٳ໌͚ͷೖྗ͕ΊͪΌͪ͘Ό໘౗͍͘͞ɻ طʹܗ੒͞ΕͯͨจԽ

    • ຖேɾ೔ৗతʹSlackΛݟΔɻ • ਺ࣈ͸ εϓϨουγʔτʹ·ͱΊͯάϥϑԽͳͲΛߦ͍ͬͯΔɻ 65
  66. KPIͳͲ਺ࣈͷूܭΛվળ͢Δऔ૊ • ूܭόονΛ࡞੒ͨ͠ɻ • Slackʹຖேɺࡢ೔ͷ਺஋Λूܭͯ͠౤ߘ͢ΔΑ͏ʹͨ͠ɻ \\ P...Python੡... // 66

  67. ࡞੒࢓༷ DjangoͰຖேఆࠁʹcronΛಈ͔ͯ͠ɺ ݁ՌΛSlack΁ूΊΔΑ͏ʹͨ͠ɻ ※ ࠓޙɺεϓϨουγʔτʹPost͢ΔࣄΛ૝ఆͯ͠ ҎԼͷΑ͏ͳ഑ྻΛ࡞Δͷ͸ࣙΊ·͠ΐ͏ɻ [ 0 => '2019-01-25ͷhoge஋͸99Ͱ͢ɻ',

    1 => '2019-01-26ͷhoge஋͸84Ͱ͢ɻ', 2 => '2019-01-27ͷhoge஋͸101Ͱ͢ɻ' ] 67
  68. ࣮ફͨ݁͠Ռ • SQLΛ౎౓࣮ߦ͢Δඞཁ͕ແ͘ͳͬͨɻ • ࢦඪͷ਺஋ͷूܭํ๏΍݁Ռ͕ڞ༗஌ʹͳͬͨɻ (ूܭόονΛಡΉࣄͰ෼͔Δ) 68

  69. ͪΐͬͱؤுͬͨ݁Ռ... • Slack͕Τϥʔ௨஌͕ݟΕΔͪΐͬͱศརͳπʔϧʹͳΓ • Slack͕ϨϏϡʔΛݟΕΔͪΐͬͱศརͳπʔϧʹͳΓ • Slack͕ຖேͷ਺஋Λ௥͑Δͪΐͬͱศརͳπʔϧʹͳͬͨɻ 69

  70. ͪΐͬͱؤுͬͨ݁Ռ... • ࣗ෼ͷ࡞ͬͨπʔϧΛ࢖ͬͯ͘ΕΔ ΤϯυϢʔβʔʢϝϯόʔʣͱ Ұॹʹ࢓ࣄग़དྷΔ࠷ߴͷ؀ڥ͕खʹೖͬͨ(աݴ) • औΓ׶͑ͣ࡞ͬͯΈͨΒ৭ΜͳΞυόΠεΛ௖͚Δɻ • ঝೝཉٻͷຬͨ͞Ε۩߹͕΍͹͔ͬͨ 70

  71. 4. ·ͱΊ 71

  72. ࢲͷ΍ͬͨ͜ͱ • Τϥʔ؂ࢹͷ௨஌ΛSlack΁ूΊͨɺ͚ͩɻ • ϨϏϡʔΛSlackܦ༝ͰݟΕΔΑ͏ʹͨ͠ɺ͚ͩɻ • ຖேͷSQL࣮ߦΛόονԽͨ͠ɺ͚ͩɻ 72

  73. ͿͬͪΌ͚େͨ͠ࣄͯ͠ͳ͍ɾɾস 73

  74. ͍ͭ΋࢖ͬͯΔπʔϧΛ ͪΐͬͱศརʹ͚ͨͩ͠ 74

  75. Կނ΍͔ͬͨɻ • ϝϯόʔͷҰһͷࣗ෼͕ࠔ͔ͬͯͨΒɻ • ͦͯͦ͠Ε͸ଞͷϝϯόʔʹ΋ಉ͡Α͏ʹ ࠔΓࣄͱͯ߱͠Γֻ͔ͬͯདྷΔͱࢥ͍ͬͯΔ͔Βɻ • ͦͷ໰୊ʹཱͪ޲͔͏ؾ࣋ͪͱՋ͕͚͋ͬͨͩɻ 75

  76. ղܾ͢Δ໰୊ • ͦͯ͠ɺ໰୊ͷղܾ΍ͦͷ໰୊ͷղܾํ๏͸ ೔ࠒͷϝϯόʔͱͷର࿩΍ SlackͷͭͿ΍͖ͳͲ͔Βੜ·ΕΔࣄ͕ଟ͔ͬͨɻ • ΦϛΧϨͷίϛϡχέʔγϣϯจԽͷதͰͷ ͪΐͬͱͨ͠ձ࿩͔Β໰୊͸ੜ·Εͯ ؾ෇͍ͨͱ͖ʹղܾ͍͚ͯͨ͠ɻ •

    ຖ೔ςΩετ1ߦ͚ͩͰ΋ࡶͳίϛϡχέʔγϣϯ͢Δͷ͕ ͱͯ΋େࣄͩͱײ͡Δɻ 76
  77. ղܾ͢Δͷ͕೉ͦ͠͏ɾɾ 77

  78. ໰୊ͱͷ޲͖߹͍ํ • ໰୊Λ100఺ຬ఺Ͱղܾ͢Δඞཁ͸ͳ͍ɻ • ࠓɺࣗ෼ͷ࣋ͬͯΔεΩϧͰղܾ͢Ε͹ྑ͍ɻ • ʮͪΐͬͱϚγʹͳͬͨʯ͸େ੒ޭɻ • ʮखΛಈ͔ͨ͠ऀ͚͕ͩੈքΛม͑Δɻʯ 78

  79. ໰୊ͱ޲͖߹ͬͨ݁Ռ • ࣗ෼ͷखʹΑͬͯղܾͨ͠໰୊͕͋Γ ͦΕʹΑͬͯ ͋Γ͕ͱ͏ ͕ੜ·Ε લΑΓձࣾͷࣄΛ޷͖ʹͳΔࣄ͕ग़དྷͨɻ 79

  80. ਎ۙʹډΔɺେখ༷ʑͳ໰୊Λղܾͨ͠ਓʹ ੋඇʮఱ࠽ʂʯͱݴ͍ͬͯ͋͛ͯͩ͘͞ 80

  81. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 81