機械学習プロジェクトを頑健にする施策 ML Ops Study #2

機械学習プロジェクトを頑健にする施策 ML Ops Study #2

70c7641a3ae1099ab76137b6ba09f6f5?s=128

Takahiko Ito

May 29, 2018
Tweet

Transcript

  1. ػցֶशϓϩδΣΫτΛؤ݈ʹ͢Δࢪࡦ ϫʔΫϑϩʔɺԾ૝Խɺ ඼࣭޲্ɺ஌ࣝҠৡ etc ҏ౻ܟ඙

  2. ࣗݾ঺հ • ιϑτ΢ΣΞΤϯδχΞ • ത࢜ʢ޻ֶʣ • TwitterΞΧ΢ϯτ: takahi_i • Φʔϓϯιʔεɿ

    RedPen 2
  3. ຊ೔ͷτϐοΫ • ػցֶशϓϩδΣΫτ͕੬͘ͳͬͯΏ͘ݪҼͱ औΓ૊ΜͰ͍Δରॲ๏ʹ͍ͭͯ঺հ • ஫ɿ͍͔ͭ͘ͷϓϩδΣΫτͰͷऔΓ૊Έ • NOTE: ػցֶशͷϞσϧΛσϓϩΠ͢Δ෦෼͸ ѻΘͳ͍

    3
  4. ػցֶशϓϩδΣΫτͷεςʔ δ ୳ࡧతͳ࣮ݧ ίʔυ੔ཧ Ϟσϧͷ σϓϩΠ ̏ͭͷεςʔδʢ୳ࡧతͳ࣮ݧɺεΫϦϓτ ԽɺσϓϩΠʣ͔ΒͳΔ 4 ϥΠϒϥϦԽ

    ϦϑΝΫλϦϯά ςετɺLinter CI όονεΫϦϓτɺ ίϯτϩʔϥ௥Ճɺ CD Jupyter Notebook
  5. ࠓճѻ͏ൣғ ຊൃදͰѻ͏τϐοΫ ୳ࡧతͳ࣮ݧ ίʔυ੔ཧ Ϟσϧͷ σϓϩΠ 5 ϥΠϒϥϦԽ ϦϑΝΫλϦϯά ςετɺLinter

    CI όονεΫϦϓτɺ αʔϏεԽɺ CD ࣮ݧˠίʔυ੔ཧ͔ΒϓϩδΣΫτͷؤ݈ԽΛ ҙࣝ͢Δ Jupyter Notebook
  6. ίʔυ੔ཧεςʔδ • Jupyter Notebook ͰಘΒΕ࣮ͨݧ݁ՌΛϥΠϒϥϦ ԽɺεΫϦϓτʹ͢Δ • ࣮ࢪऀɿϦαʔνϟɺ΋͘͠͸Ҿ͖ܧ͙ιϑτ΢Σ ΞΤϯδχΞ •

    த్൒୺ͳίʔυ੔ཧ → ϓϩδΣΫτ͕੬͘ 6
  7. ੬͍ػցֶशϓϩδΣΫτ • ػցֶशͷਫ਼౓͕མ͍ͪͯΔ͕ɺͩΕ΋ཧղͰ ͖ͳ͍ • ࡞ͬͨਓ͕ࣙΊͯ͠·͕ͬͨɺͲ͏΍͍ͬͯͨ ͷ͔Θ͔Βͳ͍ 7

  8. ػցֶशΛར༻ͨ͠αʔϏε ͷ೉͠͞ • ΞϧΰϦζϜͷ೉͠͞✕ΤϯδχΞϦϯάͷ೉͠͞ 㱺྆ํͰ͖ͳ͍ͱ͏·͍͔͘ͳ͍ • ϓϩδΣΫτͷ։͔࢝ΒΤϯδχΞϦϯάͷجຊΛ कͬͯҰาͣͭؤ݈ʹ • جຊɿ؀ڥݻఆʢԾ૝ԽʣɺϫʔΫϑϩʔ؅ཧɺϦ

    ϑΝΫλϦϯάɺςετɺCIɺϖΞϓϩɺ etc 8
  9. ػցֶशϓϩδΣΫτɿ੬͞ ͷݪҼ ػցֶशϓϩδΣΫτ͸ҎԼͷ఺͔Β੬͘ͳͬͯ Ώ͘ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ

    9
  10. ػցֶशϓϩδΣΫτͷ੬͞ ҎԼɺ֤໰୊ͱରॲํ๏ʹ͍ͭͯղઆ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ 10

  11. ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ 11

  12. ػցֶशϨϙδτϦ͋Δ͋Δ GitHubʹ͋Δػցֶशք۾ͷϦϙδτϦʹ͍ͭͯͷ Tweet ಺੡Ͱ΋OSSͰ΋ɺ͜ͷΑ͏ͳঢ়ଶͷϨϙδτϦΛαʔ ϏεʹಋೖͰ͖ͳ͍ɻɻɻ 12

  13. ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ ໰୊͸̎ͭʹ෼ྨ͞ΕΔ 1.εΫϦϓτͷ࣮ߦॱং͕෼͔Βͳ͍ 2.εΫϦϓτ͕ґଘ͢Δ؀ڥ͕෼͔Βͳ͍ 13

  14. ࣮ߦॱং͕Θ͔Βͳ͍ • ঢ়گɿεΫϦϓτ͕ෳ਺༻ҙ͞Ε͍ͯΔ • ໰୊ • ֶशσʔλ͕Ͳ͜ʹଘࡏ͢Δͷ͔Θ͔Βͳ͍ • Ͳͷॱ൪Ͱ࣮ߦ͢Ε͹Α͍ͷ͔෼͔Βͳ͍ 14

  15. ղܾํ๏ɿϫʔΫϑϩʔΛ؅ ཧ͢Δ • ϑϩʔΛ؅ཧͰ͖ΔπʔϧΛϦϙδτϦʹಋೖ ͢Δɿmake΍Luigi • εΫϦϓτͷ࣮ߦॱং΍ґଘؔ܎΋هड़Ͱ͖Δ • ϝϦοτɿCIɺCDಋೖ΋γϯϓϧʹ 15

  16. εΫϦϓτΛ࣮ߦ͢Δ؀ڥ͕ ࡞Εͳ͍ • ػցֶशΛѻ͏εΫϦϓτ͸ଟ਺ͷϥΠϒϥϦ ʹґଘ • PythonϥΠϒϥϦ͚ͩͰͳ͘ɺଞͷݴޠͰهड़ ͞Εͨπʔϧʹґଘ͢ΔʢMeCabͳͲʣ • ֤εςʔδ͝ͱʹҟͳΔ؀ڥʢܭࢉػʣͰಈ࡞

    ͢ΔͷͰϙʔλϏϦςΟ͕ॏཁ 16
  17. ໰୊ɿલͷεςʔδͰಈ͍ͯ ͍࣮ͨݧ͕ಈ࡞͠ͳ͍ 17 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ

    kubernetes ECS ίʔυ੔ཧ σϓϩΠ εςʔδ͝ͱʹಈ࡞؀ڥΛ ࡞Δίετ͕େ͖͍ɻ →ϞσϧͷվྑαΠΫϧ͕ճΒͳ͍(TдT)
  18. ղܾํ๏ɿDocker Λಋೖ • ܰྔͳԾ૝Խ؀ڥ • PythonϥΠϒϥϦҎ֎ͷɺґଘ͢Δ؀ڥ΋ Dockerfile ʹهड़Ͱ͖Δ • ؀ڥͷϙʔλϏϦςΟ͕޲্

    18
  19. DockerͰ؀ڥΛԾ૝Խ 19 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes

    ECS ίʔυ੔ཧ σϓϩΠ ࣮ݧஈ֊͔ΒҰ؏ͯ͠Dockerίϯς φ্Ͱ࡞ۀɻಈ࡞͠ͳ͍εςʔδ͕ ग़ͳ͍Α͏ʹ
  20. ͔͠͠ɺɺDocker͸ɺɺ • ίϚϯυ͕௕͍ɻɻɻɻ(TдT) • ϙʔτϑΥϫʔυɺϑΝΠϧϚ΢ϯτΛࢦఆ • ࣮ݧεςʔδ͔Β Docker Ͱ࡞ۀ͢Δؾ͕ى͜Β ͳ͍ɻɻɻ

    20
  21. Docker ίϚϯυ • Docker Πϝʔδͷ࡞੒ • docker build -t ml-image

    -f ./docker/Dockerfile . • Dockerίϯςφͷ࡞੒ • docker run -it -v `pwd`:/work -p 8888:8888 — name ml-image ml-container • ͞Βʹɺ࡟আɺ࠶ੜੑ etc … 21
  22. ͦ͜Ͱ ( *´ůшʆ) Šŕťž 22

  23. ղܾํ๏ɿCookiecutter Docker Science • Docker؀ڥͰͷ࣮ݧʙσϓϩΠ·ͰΛα ϙʔτ͢ΔCookiecutterςϯϓϨʔτΛͭ͘ Γ·ͨ͠ • ΦʔϓϯιʔεϓϩδΣΫτ •

    URL: https://docker-science.github.io/ • Cookiecutter: ϓϩδΣΫτͷςϯϓϨʔτ ੜ੒πʔϧ 23
  24. ػೳɿCookicutter Docker Science • ΤϯδχΞϦϯάೳྗͷߴ͘ͳ͍ϝϯόͰ΋DockerΛѻ͍΍͘͢ • DockerͷίϚϯυΛ make λʔήοτͰӅṭ •

    ϙʔτϑΥϫʔυɺϑΝΠϧϚ΢ϯτઃఆɺίϯςφ࡞Γ௚͠ etc … • ࣮ݧ͔Β੔ཧɺσϓϩΠ·ͰΛҙࣝͨ͠σΟϨΫτϦߏ੒Λग़ྗ • σΟϨΫτϦߏ੒ͷڞ௨ԽʹΑΓϓϩδΣΫτͷݟ௨͠ • Cookiecutter Data Science ͷߏ੒Λࢀߟʹͨ͠ 24
  25. ϑΝΠϧɺσΟϨΫτϦߏ੒ ͷ౷Ұ 25 make init Ͱ S3͔ΒσʔλΛμ ΢ϯϩʔυ ֶशεΫ Ϧϓτ͕ओྗ͢ΔϞσ

    ϧΛอ࣋ ࣮ݧ༻ͷϊʔτϒο ΫΛอ࣋ ίʔυ੔ཧ࣌ʹ࡞ ΒΕΔϝιουɺΫϥε Λอ࣋ ϓϩδΣΫτͷϫʔ ΫϑϩʔΛ௥ه
  26. Cookiecutter Docker Science ͷ ࢖͍ํʢϓϩδΣΫτੜ੒ʣ $cookiecutter git@github.com:docker-science/cookiecutter-docker-science.git project_name [project_name]: image-classification

    project_slug [image_classification]: jupyter_host_port [8888]: description [Please Input a short description]: Classify images into several categories data_source [Please Input data source in S3]: s3://research-data/food-images 26
  27. Demo: Cookiecutter Docker Science • ϓϩδΣΫτͷੜ੒ • https://asciinema.org/a/ 6XV9dNixtzfUwWdoqLj7HG7 A2

    • Docker image / container ίϯς φ࡞੒ • https://asciinema.org/a/ 06CcXPubAj3RSiMSTy3CZDrfG • Jupyter Notebook Λ্ཱͪ͛Δ 27
  28. Cookiecutter Docker Science Λར༻ ࣮ͯ͠ݧஈ֊͔ΒԾ૝Խ؀ڥͰ࡞ۀ 28 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI

    όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes ECS ίʔυ੔ཧ σϓϩΠ ͢΂ͯͷεςʔδͰԾ૝؀ڥ γʔϜϨεʹεςʔδΛҠಈͰ͖Δ
  29. ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ 29

  30. ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ঢ়گɿͳΜ͔ಈ࡞͍ͯ͠ΔΑ͏͕ͩɺϞσϧΛੜ੒͍ͯ͠Δίʔ υ͕ཧղͰ͖ͳ͍ • ྫɿJupyter Notebook Λͦͷ··ίϐϖͨ͠εΫϦϓτ • ػցֶशΞϧΰϦζϜ͸೉͍͠㱺ίʔυ͕੔ཧ͞Ε͍ͳ͍ͱ΋ͬ

    ͱ೉͍͠ • ରॲɿιϑτ΢ΣΞΤϯδχΞϦϯάͰҰൠతͳίʔυ඼࣭ͷ ޲্ࢪࡦΛಋೖ • ϦϑΝΫλϦϯάɺςετɺCI etc 30
  31. ϦϑΝΫλϦϯά • ϓϩάϥϜͷ֎෦͔Βݟͨಈ࡞Λม͑ͣʹιʔε ίʔυͷ಺෦ߏ଄Λ੔ཧ͢ΔʢWikipedia ΑΓʣ • ෳࡶʹͳΓ͕ͪͳػցֶशͷॲཧΛ੔ཧ͢Δ • ॴײɿGitHub ΍

    Qiita Ͱެ։͞Ε͍ͯΔػցֶ शίʔυΛΈΔͱɺίʔυ੔ཧ͕ͳ͞Ε͍ͯΔ ΋ͷ͕গͳ͍ʢଞ෼໺ͷίʔυͱൺֱʣɻ 31
  32. ϦϑΝΫλϦϯά߲໨ ॳาతͳ੔ཧͰ΋ಡΈ΍͕͢͞޲্͢ΔʢςετɺCIɺCD΁ͷ෍ੴʣ • ؔ਺ͷ௕͞ • ม਺ͷείʔϓ • ؔ਺͕औΔҾ਺ͷ਺ • ϚδοΫφϯόʔͷఆ਺΁ͷஔ͖׵͑

    • ಉ͡ॲཧΛҰՕॴʹ·ͱΊΔ • ਂ͍ωετ෦෼Λؔ਺ͱͯ͠நग़͢Δ 32
  33. ؔ਺ͷ௕͞ • ؔ਺͕௕͍ͱཧղ͢Δͷ͕೉͘͠ͳΔ • ͻͲ͍εΫϦϓτͩͱ͢΂͕ͯϝΠϯؔ਺ • ॲཧͷ಺༰ຖʹؔ਺ͱͯ͠நग़͢Δ 33

  34. ม਺ͷείʔϓ • είʔϓɿม਺͕ར༻Ͱ͖Δڑ཭ • είʔϓ͸୹͘ɺͦͯ͠୹͘ • άϩʔόϧม਺͸ϩʔΧϧม਺ʹஔ͖׵͑Δ • ॲཧΛ௨ͯ͡ར༻͢Δม਺͸Πϯελϯεม਺ ʹ͢Δ

    34
  35. ؔ਺ͷҾ਺ • ػցֶशͷΞϧΰϦζϜ͸ύϥϝλ͕ଟ͍ˠؔ਺ͷ Ҿ਺͕ଟ͘ͳΓ͕ͪ • Ҿ਺ͷ਺͕ଟ͍ͱॲཧ͕௥͍ͮΒ͍ • ݮΒͤͳ͍͔ݕ౼͢Δ • Ҿ਺ΛΦϒδΣΫτͱͯ͠·ͱΊΔ

    • Կ౓΋ར༻͞ΕΔˠΠϯελϯεม਺ʹ 35
  36. ॲཧΛҰՕॴʹ·ͱΊΔ • ಉ͡Α͏ͳॲཧΛ͍ͯ͠ΔՕॴΛҰͭʹ·ͱΊ Δ • ྫɿσʔλͷม׵͸τϨʔχϯάͰ΋ςετͰ ΋ར༻͢Δ 36

  37. ਂ͍ωετΛආ͚Δ • for ϧʔϓɺif จ͕ωετ͍ͯ͠ΔͱྲྀΕ͕͔ͭ Έʹ͍͘ • ੵۃతʹؔ਺Λநग़͢Δ • ΤσΟλͷػೳΛ࢖͏ͱγϣʔτΧοτͰαΫο

    ͱͰ͖Δ 37
  38. ࣗಈςετ • ςετɿೖྗʹରͯ͠ظ଴ͨ͠Ξ΢τϓοτʹͳͬ ͍ͯΔ͔Λݕূ͢Δίʔυ • ࠷௿ݶɿલॲཧɺEnd-to-Endͷςετ͸ॻ͘ 38

  39. ςετͷԸܙ • ςετ=࢓༷ • υΩϡϝϯτΛॻ͍ͯ΋࣌ؒͱͱ΋ʹᴥᴪ͕ੜ· ΕΔ • CIͰಈ࡞͢Δςετʹ͸ᴥᴪ͕ͳ͍ • ॻ͍͓͍ͯͯ͋͛ΔͱɺҾ͖ܧ͙ਓͷཧղΛॿ͚Δ

    • ςετ͕ແ͍ίʔυΛमਖ਼͢Δͷ͸ڪා 39
  40. ͦͷ΄͔ • linter ಋೖ • logger ಋೖ • CIಋೖ •

    υΩϡϝϯτʢSphinxʣ • ࣮ݧͨ͠಺༰ͳͲΛ·ͱΊΔ • etc … 40
  41. ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ 41

  42. ͜Ε·ͰͷରࡦͰίʔυ͸େ ෼ؤ݈ʹͳͬͨ ͔͠͠ɺ·ͩ໰୊͕͋Δɻɻɻ ୭͕੔ཧ͢Δͷ͔ɻɻɻ 42

  43. ࣮ݧͨ͠ਓ͔Βίʔυ͕཭ΕΔ • ঢ়گɿ࣮ݧϨϙδτϦΛผͷਓ͕੔ཧʢ΋͘͠ ͸ॻ͖௚͠ʣ • ѱӨڹɿ࠶࣮ݧ͠ʹ͘͘ͳΔɺকདྷͷमਖ਼ίε τ • ϓϩδΣΫτ͸ཚ๫ͳ෼ۀʹΑͬͯ੬͘ͳΔ •

    ίʔυ͕ؤ݈Ͱ΋ϓϩδΣΫτͱͯ͠͸੬͍ 43
  44. ొ৔ϝϯόʔ ίʔυ੔ཧΛ̎ͭͷλΠϓͷϝϯόʔ Ͱ͓͜ͳ͏ʢ஫ɿݫີʹ෼͔Ε͍ͯΔ Θ͚Ͱ͸͋Γ·ͤΜʣ ϦαʔνϟدΓɿ࣮ݧͨ͠ਓɻػցֶ शΛར༻ͨ͠ϞσϦϯά͕ಘҙ ʢιϑτ΢ΤΞʣΤϯδχΞدΓɿι ϑτ΢ΣΞ։ൃ͕ಘҙ 44

  45. Ξϯνύλʔϯɿίʔυ੔ཧ ʹ͓͚Δ෼ۀ ୳ࡧతͳ࣮ݧ ίʔυ੔ཧ Ϟσϧͷ σϓϩΠ Ϧαʔνϟ͕ݕূ࣮ͨ͠ݧ಺༰ΛΤϯδχΞ͕੔ཧ • ϥΠϒϥϦԽɺςετ௥ՃɺϦϑΝΫλϦϯά etc

    45
  46. ྑ͘ͳ͍࡞ۀϑϩʔɿίʔυ ੔ཧ ʮΤϯδχΞ͕ػցֶशϓϩδΣΫτ༻ͷϨϙδτϦʹ ௚઀ίϛοτʯɺ΋͘͠͸ʮผϨϙδτϦΛ࡞ͬͯ࡞ۀʯ 46 CIઃఆɺϦϑΝΫλϦϯά ςετɺLinterɺLogger ͷಋೖ ػցֶशϓϩδΣΫτ ϨϙδτϦ

    ίϛοτ௥Ճ
  47. ෼ۀͷ݁Ռ • Ϧαʔνϟɿॻ͖௚͞Ε͍ͯΔͷͰ੔ཧ͞Εͨ ίʔυ͕ཧղͰ͖ͳ͍ • ΤϯδχΞɿॲཧͷཧղ͕଍Γͳ͍ɻ࣮ݧͷৄ ࡉΛཧղͰ͖͍ͯͳ͍ • ϦαʔνϟɺΤϯδχΞͱ΋ʹϓϩδΣΫτʹର ͢Δཧղɺ੹೚͕த్൒୺

    47
  48. ঢ়گ෼ੳɿ෼ۀʹΑΔ໰୊ 48 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes

    ECS ίʔυ੔ཧ σϓϩΠ ৽͍࣮͠ݧ݁Ռ͕ͰΔͨͼʹ ϦαʔνϟˠΤϯδχΞͷόέπ ϦϨʔ͕ൃੜ
  49. ঢ়گ෼ੳɿ෼ۀʹΑΔ໰୊ 49 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes

    ECS ίʔυ੔ཧ σϓϩΠ ίʔυ੔ཧޙͷεΫϦϓτΛϦαʔ νϟ͕ཧղͰ͖ͳ͍ 㱺վྑαΠΫϧΛճͤͳ͍ɻɻɻ
  50. ݱঢ়Λ੔ཧ • ࣮ݧͨ͠ਓʢϦαʔνϟʣͷखͷಧ͔ͳ͍ॴͰίʔυΛ मਖ਼͢ΔͱϓϩδΣΫτ͸ࢮ͵ • ر๬ɿ࣮ݧͰར༻ͨ͠ίʔυʢσʔλม׵ॲཧͳͲʣʴ ϞσϧΛͦͷ··σϓϩΠ͍ͨ͠ 㱺͔͠͠ɺා͍ͷͰίʔυ͸੔ཧʢՄಡੑ΍ؤ݈ੑ޲ ্ʣ͔ͯ͠ΒϓϩμΫγϣϯʹಋೖ͍ͨ͠ 50

  51. Ξϓϩʔν ࣮ݧͨ͠ਓ͕ࣗ਎Ͱίʔυ੔ཧ͢ΔʢBeyond the Boundaryʣ 51

  52. ίʔυ੔ཧΛϖΞͰऔΓ૊Ή • ίʔυ੔ཧ࣌ʹϦαʔνϟɺΤϯδχΞͷϖΞΛ࡞Δ • ஌ݟΛڞ༗ͭͭ͠ϖΞͰίʔυ੔ཧ • ίετ͸ߴ͘ͳ͍ɿ͍͍ͤͥ਺ඦʙઍߦͷεΫϦϓτ 52 ୳ࡧతͳ࣮ݧ ίʔυ੔ཧ

    Ϟσϧͷ σϓϩΠ
  53. ࡞ۀϑϩʔɿίʔυ੔ཧ ʮΤϯδχΞ͕Pull RequestΛ࡞Γʯɺʮ࣮ݧͨ͠ ਓ͕ϨϏϡʔ͢Δʯ 53 CIઃఆɺϦϑΝΫλϦϯά ςετɺLinterɺLogger ͷಋೖ ϨϏϡʔˍϚʔδ ϓϧϦΫΤετͷ࡞੒

  54. ஫ҙ఺ • ϓϩδΣΫτͷඒ͠͞ͱ࣮ݧ͠΍͢͞ͷόϥϯεΛऔΔ • ࣮ݧͨ͠ਓ͕࣮ݧΛܧଓͰ͖ΔൣғͰमਖ਼ • ࣮ݧͨ͠ਓ͕ཧղͰ͖ͳ͍मਖ਼͸Ϛʔδ͠ͳ͍ • ϓϧϦΫΤετͷཻ౓͸খ͘͞ •

    େ͖͍ͱཧղ͠ʹ͍͘ • ίϛοτΛ੔ܗͯ͠Θ͔Γ΍͘͢ʢιϑτ΢ΣΞΤϯδχΞ ͷ࿹ͷݟͤͲ͜Ζʣ 54
  55. ԸܙɿϖΞͰίʔυ੔ཧ • ϨϏϡʔͨ͠ίʔυͳͷͰ࣮ݧΛγʔϜϨεʹ࠶։Ͱ ͖Δʢਫ਼౓޲্΁ʣ • ͢΂ͯͷϝϯόʹΤϯδχΞϦϯάͷجૅతͳ஌ݟΛ ڞ༗Ͱ͖ΔʢςετɺCIɺLinterɺϦϑΝΫλϦϯά etc ʣ →

    ࣗ਎Ͱίʔυ੔ཧͭͭ͠αΠΫϧΛճ͢ → কདྷͷमਖ਼ίετݮ 55
  56. ·ͱΊ ػցֶशϓϩδΣΫτ͕੬͘ͳͬͯΏ͘ݪҼͱऔ Γ૊ΜͰ͍Δࢪࡦʹ͍ͭͯղઆͨ͠ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕཭Ε 56

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