$30 off During Our Annual Pro Sale. View Details »

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

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

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

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

# セッション概要

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

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

Takahashi Ikki

January 26, 2019
Tweet

More Decks by Takahashi Ikki

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 1. ࣗݾ঺հ
    • ߴڮ Ұٍ
    • Ԭࢁࡏॅ
    • גࣜձࣾΦϛΧϨ WebΤϯδχΞ
    • ೔ຊPostgreSQLϢʔβʔձ
    தࠃࢧ෦௕
    • ڇλϯห౰ɾɾ޷͖...
    4

    View Slide

  5. גࣜձࣾΦϛΧϨ
    શࠃ35,000݅ͷࠗ׆ύʔςΟΛ
    ܝࡌͨ͠ϙʔλϧαΠτ
    30ສਓڧͷձһͷํʑʹ͝ར༻௖͍ͯ
    ͍·͢ɻ
    ࠗ׆ͱݴ͑͹ΦϛΧϨʂ
    \\ ݁ࠗ͸͍͍ͧʂʂ //
    5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. ΦϛΧϨͷݱঢ়
    • νϟοτπʔϧ͸ Slackɻ
    • ଞڌ఺ؒͰ࢓ࣄΛͯ͠ΔͷͰجຊతʹςΩετϕʔεͰ
    ίϛϡχέʔγϣϯΛ͢Δɻ
    • ྡʹډͯ΋ɺجຊతʹ͸νϟοτͰ࿩͢ɻ
    • ձٞ౳͸SlackͷϏσΦձٞ SlackίʔϧͰߦ͏ɻ
    11

    View Slide

  12. ͦΜͳձࣾʹೖࣾͨ͠
    12

    View Slide

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

    View Slide

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

    View Slide

  15. લ৬ͷจԽ
    • ࣗࣾαʔϏε࡞੒ͷձࣾ
    • ࣾһ͸100໊ఔɺେ൒͸ӦۀͰ։ൃ෦ୂ͸30໊ɻ
    (಺20໊͘Β͍͕ςελʔ)
    • جຊతʹ্௕͔Βͷτοϓμ΢ϯܗࣜͰҙࢥܾఆ
    • ݄ΠνͰϦϦʔεεέδϡʔϧ͕૊·ΕΔɻ
    • ࢓༷มߋ౳΋਺िؒ୯ҐͰଞ෦ॺͱଧͪ߹Θܾͤͯఆɻ
    15

    View Slide

  16. લ৬ͱͷൺֱ
    • ϦϦʔεαΠΫϧͷҧ͍ɻ
    • ίϛϡχέʔγϣϯͷ׆ൃ͞ɻ
    • ϑΟδϏϦػೳͷνϟϨϯδɻ
    • ݸਓͷࡋྔͷଟ͞ɻ
    16

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. ϑΟδϏϦػೳͷνϟϨϯδɻ
    • ϑΟδϏϦ(࣮ݧత)ͳػೳͷνϟϨϯδ͕
    ඇৗʹଟ͘ߦΘΕͯΔɻ
    (໪࿦ɺWebαʔϏεͷ੒௕ʹ͸͔ܽͤͳ͍࿩͔΋͠Εͳ͍)
    • ֤ΤϯδχΞʹ਺ࣈΛݟΔश׳Ͱ͋ͬͨΓ
    ϑΟδϏϦػೳΛ୔ࢁߦ͍ͬͯΔͷͰ
    ඇৗʹҙݟΛग़͠΍͍͢؀ڥʹͳ͍ͬͯΔɻ
    20

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. ৺ཧత҆શੑ͕ҭͭ
    24

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. Slackͷbotͱֆจࣈ
    31

    View Slide

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

    View Slide

  33. ձ࿩Bot
    • hubot Ͱ࣮૷͞Ε͍ͯΔɻ
    • ౤ߘͨ͠จࣈྻʹରԠ͢ΔจࣈྻΛฦͯ͘͠ΕΔɻ
    "u => řőőő" ͱܾ·Γ͖ͬͨจݴͷύλʔϯɺ
    "otu => śŨŜƀŧŒƃ or ͓ർΕ༷Ͱͨͬ͠" ͱ
    ෳ਺ύλʔϯ͔ΒϥϯμϜͰฦͯ͘͠ΕΔύλʔϯɺ
    ͭ͘͏ => ͜ΕͰ΋ҿΉ͕ྑ͍ ͬͯϋΠϘʔϧͷը૾Λ
    ฦͯ͘͠ΕͨΓͱ͔ɻ
    33

    View Slide

  34. ձ࿩BotͷԸܙ
    • ࠷୹1จࣈͰେ͖ͳϦΞΫγϣϯ͕ग़དྷΔɻ
    ੝Γ্͕ͬͯΔΑ͏ʹݟ͑Δɻ
    • ύλʔϯ͕ແ਺ʹ͋ΔͷͰ͍ͭ΋৽઱ɻ
    • ֆจࣈ΋ಉ༷
    34

    View Slide

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

    View Slide

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

    View Slide

  37. ΦϛΧϨ࠷ߴ
    37

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. ࣮ࡍʹνϟϨϯδͨ͠ࣄྫ
    43

    View Slide

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

    View Slide

  45. BotͷΧελϚΠζ΍ΧελϜֆจࣈͷ࡞੒ΛߦͬͯΈͨɻ
    • ʮͭ͘͏ʯ ͱ͍͏จࣈྻʹରͯ͠
    ͓ञͷࣸਅΛૹͬͯΈΔΑ͏ͳbotΛ࡞ͬͯΈͨΓɾɾ(স)
    • ʮyoroʯ ͬͯଧͬͨΒࣾ௕ͷޱบͷ
    ΑΖ͘͠ѩय! ͬͯݴ༿Λग़͢Α͏ʹͯ͠ΈͨΓɻɻ(স)
    • ৽ೖࣾһ͕ೖ͖ͬͯͨλΠϛϯάͰͦͷਓͷ
    ΞΠίϯͱ͔χοΫωʔϜͷֆจࣈΛ࡞ͬͨΓɻɻ(স)
    45

    View Slide

  46. ࣮ફͨ݁͠Ռ
    • ࡶͳίϛϡχέʔγϣϯʹ໾ཱͭΑ͏ʹͳͬͨɻ
    • ಉ͡ݴ༿ʹରͯ͠όϦΤʔγϣϯ͕͏·Εͨɻ
    46

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  53. ఆظతʹSDKΛୟ͘
    --------------------------------------------------
    [plugin.checks.೚ҙͷ໊લ]
    command = "php /path/to/check_rds_log.php"
    check_interval = 5
    --------------------------------------------------
    • MackerelͷઃఆʹΑͬͯɺ5෼ʹҰճࢦఆͨ͠ίϚϯυΛ࣮
    ߦͯ͘͠ΕΔɻ
    53

    View Slide

  54. طʹಡΜͩ෼͸ඈ͹͢ɻ
    • SDKͷؔ਺ͷҾ਺ʹ Marker ͱݺ͹ΕΔɺߦͱରԠ͢Δ஋͕
    ͋ͬͯɺ਺஋Ͱ؅ཧ͞Ε͍ͯΔɻ
    • SDKͷؔ਺ΛݺΜͩλΠϛϯάͰ ϨεϙϯεͷMakerΛ
    .jsonϑΝΠϧʹ֨ೲͯ͠؅ཧ͢Δࣄʹͨ͠ɻ
    54

    View Slide

  55. ΤϥʔΛݟ͚ͭͨ࣌ʹ௨஌Λඈ͹͢ɻ
    • MackerelͷcheckϓϥάΠϯ͸ ίϚϯυ಺ͷϓϩάϥϜͰ
    ҎԼͰऴྃͤ͞ΔࣄͰ ҟৗΛݕ஌ͤ͞Δࣄ͕ग़དྷ·͢ɻ
    exit(1) ... WARNING
    exit(2) ... CRITICAL
    • MackerelଆͷઃఆͰ WARNINGͷ࣌ͷৼΔ෣͍ͱͯ͠
    Slackʹ௨஌͢Δ Λ࢓ࠐΜͰରԠɻ
    55

    View Slide

  56. PHPίϚϯυͷΤϥʔͷ൑ఆϩδοΫ
    • ":ERROR:" ͱ͍͏จࣈྻ͕͋Δ͔Ͳ͏͔ɻ (ײ֒ਂ͍)
    • :ERROR: ͕͋Ε͹1~2ߦԼΛߋʹௐࠪͯ͠
    :DETAIL: ͱ͔ :CONTEXT: ͕͋Ε͹Ұॹʹरͬͯ͘Δɻ
    => τϦΨʔͷ໊લͱ͔ߦΛҰॹʹऔͬͯ͜ΕΔɻ
    56

    View Slide

  57. ࣮ફͨ݁͠Ռ
    • 5෼αΠΫϧͱ͔Ͱৗʹ؂ࢹ͕ൃੜ͍ͯ͠ΔͷͰศརɻ
    noticeʹདྷͯͳ͍ = τϦΨʔ͕Մಈதɺͱ൑அग़དྷΔͷͰ
    ৺ཧతͳෆ͕҆ݮͬͨɻ
    • ෭࢈෺ͱͯ͠τϦΨʔͷϩάʹ ":ERROR:" ͱ͍͏จࣈΛ
    ࢓ࠐΉࣄͰDebugʹ໾ཱͭࣄ͕෼͔ͬͨɻ
    57

    View Slide

  58. νʔϜ։ൃΛΑΓԁ׈ʹ͢Δҝͷऔ૊
    ൃੜ͍ͯͨ͠໰୊
    • GithubͷΧϯόϯͰϨϏϡʔ଴ͪΛ؅ཧ͍ͯ͠Δ
    ͕ɺGithubͷϖʔδʹఆظతʹߦͬͯݟͳ͍ͱ͍͚
    ͳ͍ɻ(SlackͰґཔ͸ͯ͠΋ྲྀΕ͕ͪ)
    • ͦͷ݁ՌɺϨϏϡϫʔ͕ภΔɻ
    طʹܗ੒͞ΕͯͨจԽ
    • Slack্Ͱhubot͕ಋೖ͞Ε͍ͯͯ
    จࣈྻʹରԠͨ͠ಈ࡞Λͤ͞Δɻ
    ྫɿ kintai ͱଧͭͱ ۈଵγεςϜͷ
    ϦϯΫ͕౤ߘ͞ΕΔɻ
    58

    View Slide

  59. νʔϜ։ൃΛΑΓԁ׈ʹ͢Δҝͷऔ૊
    SlackʹbotΛಋೖͨ͠ɻ
    Slack ʹ ʰreviewʱ ͱ౤ߘ͢Δͱ
    bot ͕ GithubͷProjects͔Β
    ϨϏϡʔ଴ͪ ʹͳ͍ͬͯΔissue/PRΛ
    औಘͯ͠Ұཡͱͯ͠ग़ྗ͢Δɻ
    \\ ͳΜͱɺPHP੡ //
    59

    View Slide

  60. ࡞੒࢓༷
    Github Projects ͷ API Λୟ͍ͯऔಘ.
    ϦϑΝϨϯεɿ https://developer.github.com/v3/projects/
    GithubυϝΠϯͰݴ͍ද͢ͱ
    "ΦϛΧϨ"ϓϩδΣΫτʢΧϯόϯʣͷதͷ
    "ϨϏϡʔґཔ"ͱ͍͏ΧϥϜ͔Β
    "ϓϧϦΫ"ʢΧʔυʣҰཡΛऔಘ͢Δ
    60

    View Slide

  61. Github Projects ͷ API Λୟ͍ͯऔಘ.
    • "ΦϛΧϨ"ϓϩδΣΫτͷproject_idΛऔಘ͢Δ
    • "ϨϏϡʔґཔ"ΧϥϜͷcolumn_idΛऔಘ͢Δɻ
    • GET /projects/columns/:column_id/cards Λୟ͘ɻ
    61

    View Slide

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

    View Slide

  63. GET /projects/columns/:column_id/cards Λୟ͘ɻ
    :colmn_id => औಘͨ͠ϨϏϡʔґཔͷcolumn_idΛηοτɻ
    ΧϥϜ಺ͷΧʔυͷϦετ͕ฦΔͷͰͦΕΛऔಘ͢Δɻ
    ※ Ϩεϙϯεʹ͸ϓϧϦΫຊମͷURL΍λΠτϧؚ͕·Ε͍ͯͳ͍ͷͰ
    ඞཁͳ৔߹͸ɺϨεϙϯε಺ͷ content_urlʹରͯ͠
    ࠶౓GETͰϦΫΤετΛߦ͏ɻ
    1+N(Χʔυͷ਺) ճϦΫΤετ͕౤͛ΒΕΔͷͰɺ
    ϨϏϡʔͷཷ·Γঢ়گ΍ཁ݅ʹԠͯ͡ௐ੔͢Δɻ
    63

    View Slide

  64. ࣮ફͨ݁͠Ռ
    • ϨϏϡʔ଴ͪͷϦετΛ Slack͔Β֬ೝग़དྷΔɻ
    => Θ͟Θ͟ɺGithubʹݟʹߦ͔ͳͯ͘΋ྑ͍ɻ
    • ϨϏϡʔ଴ͪ࢒ͷঢ়گ͕ࣗ෼ൃ৴Ͱແͯ͘΋ɺ֬ೝग़དྷΔɻ
    => ଞͷਓ͕reviewΛୟ͍ͨͱ͖ʹҰॹʹϨϏϡʔ͢Δɻ
    => ϨϏϡϫʔͷݻఆԽΛগ͠ղফɻ
    64

    View Slide

  65. KPIͳͲ਺ࣈͷूܭΛվળ͢Δऔ૊
    ൃੜ͍ͯͨ͠໰୊
    • ຖ೔৬ਓ͕ूܭͷSQLΛ࣮ߦͯ͠εϓϨουγʔτ΁هड़ɻ
    • ͦͷਓ͕ٳΜͩͱ͖ʹ ਺஋͕௥͑ͳ͍ɻ
    • ࿈ٳ໌͚ͷೖྗ͕ΊͪΌͪ͘Ό໘౗͍͘͞ɻ
    طʹܗ੒͞ΕͯͨจԽ
    • ຖேɾ೔ৗతʹSlackΛݟΔɻ
    • ਺ࣈ͸ εϓϨουγʔτʹ·ͱΊͯάϥϑԽͳͲΛߦ͍ͬͯΔɻ
    65

    View Slide

  66. KPIͳͲ਺ࣈͷूܭΛվળ͢Δऔ૊
    • ूܭόονΛ࡞੒ͨ͠ɻ
    • Slackʹຖேɺࡢ೔ͷ਺஋Λूܭͯ͠౤ߘ͢ΔΑ͏ʹͨ͠ɻ
    \\ P...Python੡... //
    66

    View Slide

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

    View Slide

  68. ࣮ફͨ݁͠Ռ
    • SQLΛ౎౓࣮ߦ͢Δඞཁ͕ແ͘ͳͬͨɻ
    • ࢦඪͷ਺஋ͷूܭํ๏΍݁Ռ͕ڞ༗஌ʹͳͬͨɻ
    (ूܭόονΛಡΉࣄͰ෼͔Δ)
    68

    View Slide

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

    View Slide

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

    View Slide

  71. 4. ·ͱΊ
    71

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  77. ղܾ͢Δͷ͕೉ͦ͠͏ɾɾ
    77

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide