Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
機械学習プロジェクトを頑健にする施策 ML Ops Study #2
Search
Takahiko Ito
May 29, 2018
Programming
12
4.3k
機械学習プロジェクトを頑健にする施策 ML Ops Study #2
https://ml-ops.connpass.com/event/83919/
Takahiko Ito
May 29, 2018
Tweet
Share
More Decks by Takahiko Ito
See All by Takahiko Ito
Elasticsearch における類似度ベクトル検索のベストプラクティスを求めて/es-vector-search
takahiko03
9
5.7k
pfm
takahiko03
0
990
機械学習チームにおけるソフトウェアエンジニア〜役割、キャリア /devsum-2018-summer
takahiko03
8
11k
Cookiecutter Template for Data Scientists Working in Docker Containers
takahiko03
2
2.1k
Cookiecutter for ML experiments with Docker
takahiko03
0
1k
日本語の表記ゆれ 解決方法の検討と実装
takahiko03
2
2k
Other Decks in Programming
See All in Programming
Elm Form Validation
bkuhlmann
0
500
甘い香りに誘われてVanilla Extractを1年間運用してみた
miyahkun
1
110
Changed Rules: Architectures with Lightweight Stores
manfredsteyer
PRO
0
230
9年開発を牽引して見えてきた、共通化すべきものと個別でつくるもの ~プログラム言語~
shinout
1
640
AWS Application Composerで始める、 サーバーレスなデータ基盤構築 / 20240406-jawsug-hokuriku-shinkansen
kasacchiful
1
250
educure_カリキュラム生操作マニュアル.pdf
linew_official
0
460
Ruby GitHub Packages
bkuhlmann
0
620
Rubyでたのしむクリエイティブコーディング/Enjoy Creative coding with Ruby
chobishiba
1
160
pixivアプリでマルチモジュールを実現するまで
gatosyocora
1
130
OpenTelemetry のサービスという概念について
azukiazusa1
2
1.1k
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
430
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Featured
See All Featured
A designer walks into a library…
pauljervisheath
199
23k
What's new in Ruby 2.0
geeforr
337
31k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
6
990
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
9
8.3k
Agile that works and the tools we love
rasmusluckow
324
20k
Code Review Best Practice
trishagee
54
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
18
1.7k
Learning to Love Humans: Emotional Interface Design
aarron
266
39k
A Modern Web Designer's Workflow
chriscoyier
689
190k
How to Ace a Technical Interview
jacobian
272
22k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
20
1.6k
Transcript
ػցֶशϓϩδΣΫτΛؤ݈ʹ͢Δࢪࡦ ϫʔΫϑϩʔɺԾԽɺ ্࣭ɺࣝҠৡ etc ҏ౻ܟ
ࣗݾհ • ιϑτΣΞΤϯδχΞ • ത࢜ʢֶʣ • TwitterΞΧϯτ: takahi_i • Φʔϓϯιʔεɿ
RedPen 2
ຊͷτϐοΫ • ػցֶशϓϩδΣΫτ͕੬͘ͳͬͯΏ͘ݪҼͱ औΓΜͰ͍Δରॲ๏ʹ͍ͭͯհ • ɿ͍͔ͭ͘ͷϓϩδΣΫτͰͷऔΓΈ • NOTE: ػցֶशͷϞσϧΛσϓϩΠ͢Δ෦ ѻΘͳ͍
3
ػցֶशϓϩδΣΫτͷεςʔ δ ୳ࡧతͳ࣮ݧ ίʔυཧ Ϟσϧͷ σϓϩΠ ̏ͭͷεςʔδʢ୳ࡧతͳ࣮ݧɺεΫϦϓτ ԽɺσϓϩΠʣ͔ΒͳΔ 4 ϥΠϒϥϦԽ
ϦϑΝΫλϦϯά ςετɺLinter CI όονεΫϦϓτɺ ίϯτϩʔϥՃɺ CD Jupyter Notebook
ࠓճѻ͏ൣғ ຊൃදͰѻ͏τϐοΫ ୳ࡧతͳ࣮ݧ ίʔυཧ Ϟσϧͷ σϓϩΠ 5 ϥΠϒϥϦԽ ϦϑΝΫλϦϯά ςετɺLinter
CI όονεΫϦϓτɺ αʔϏεԽɺ CD ࣮ݧˠίʔυཧ͔ΒϓϩδΣΫτͷؤ݈ԽΛ ҙࣝ͢Δ Jupyter Notebook
ίʔυཧεςʔδ • Jupyter Notebook ͰಘΒΕ࣮ͨݧ݁ՌΛϥΠϒϥϦ ԽɺεΫϦϓτʹ͢Δ • ࣮ࢪऀɿϦαʔνϟɺ͘͠Ҿ͖ܧ͙ιϑτΣ ΞΤϯδχΞ •
த్ͳίʔυཧ → ϓϩδΣΫτ͕੬͘ 6
੬͍ػցֶशϓϩδΣΫτ • ػցֶशͷਫ਼͕མ͍ͪͯΔ͕ɺͩΕཧղͰ ͖ͳ͍ • ࡞ͬͨਓ͕ࣙΊͯ͠·͕ͬͨɺͲ͏͍ͬͯͨ ͷ͔Θ͔Βͳ͍ 7
ػցֶशΛར༻ͨ͠αʔϏε ͷ͠͞ • ΞϧΰϦζϜͷ͠͞✕ΤϯδχΞϦϯάͷ͠͞ 㱺྆ํͰ͖ͳ͍ͱ͏·͍͔͘ͳ͍ • ϓϩδΣΫτͷ։͔࢝ΒΤϯδχΞϦϯάͷجຊΛ कͬͯҰาͣͭؤ݈ʹ • جຊɿڥݻఆʢԾԽʣɺϫʔΫϑϩʔཧɺϦ
ϑΝΫλϦϯάɺςετɺCIɺϖΞϓϩɺ etc 8
ػցֶशϓϩδΣΫτɿ੬͞ ͷݪҼ ػցֶशϓϩδΣΫτҎԼͷ͔Β੬͘ͳͬͯ Ώ͘ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ
9
ػցֶशϓϩδΣΫτͷ੬͞ ҎԼɺ֤ͱରॲํ๏ʹ͍ͭͯղઆ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ 10
ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ 11
ػցֶशϨϙδτϦ͋Δ͋Δ GitHubʹ͋Δػցֶशք۾ͷϦϙδτϦʹ͍ͭͯͷ Tweet ͰOSSͰɺ͜ͷΑ͏ͳঢ়ଶͷϨϙδτϦΛαʔ ϏεʹಋೖͰ͖ͳ͍ɻɻɻ 12
࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ ̎ͭʹྨ͞ΕΔ 1.εΫϦϓτͷ࣮ߦॱং͕͔Βͳ͍ 2.εΫϦϓτ͕ґଘ͢Δڥ͕͔Βͳ͍ 13
࣮ߦॱং͕Θ͔Βͳ͍ • ঢ়گɿεΫϦϓτ͕ෳ༻ҙ͞Ε͍ͯΔ • • ֶशσʔλ͕Ͳ͜ʹଘࡏ͢Δͷ͔Θ͔Βͳ͍ • Ͳͷॱ൪Ͱ࣮ߦ͢ΕΑ͍ͷ͔͔Βͳ͍ 14
ղܾํ๏ɿϫʔΫϑϩʔΛ ཧ͢Δ • ϑϩʔΛཧͰ͖ΔπʔϧΛϦϙδτϦʹಋೖ ͢ΔɿmakeLuigi • εΫϦϓτͷ࣮ߦॱংґଘؔهड़Ͱ͖Δ • ϝϦοτɿCIɺCDಋೖγϯϓϧʹ 15
εΫϦϓτΛ࣮ߦ͢Δڥ͕ ࡞Εͳ͍ • ػցֶशΛѻ͏εΫϦϓτଟͷϥΠϒϥϦ ʹґଘ • PythonϥΠϒϥϦ͚ͩͰͳ͘ɺଞͷݴޠͰهड़ ͞Εͨπʔϧʹґଘ͢ΔʢMeCabͳͲʣ • ֤εςʔδ͝ͱʹҟͳΔڥʢܭࢉػʣͰಈ࡞
͢ΔͷͰϙʔλϏϦςΟ͕ॏཁ 16
ɿલͷεςʔδͰಈ͍ͯ ͍࣮ͨݧ͕ಈ࡞͠ͳ͍ 17 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ
kubernetes ECS ίʔυཧ σϓϩΠ εςʔδ͝ͱʹಈ࡞ڥΛ ࡞Δίετ͕େ͖͍ɻ →ϞσϧͷվྑαΠΫϧ͕ճΒͳ͍(TдT)
ղܾํ๏ɿDocker Λಋೖ • ܰྔͳԾԽڥ • PythonϥΠϒϥϦҎ֎ͷɺґଘ͢Δڥ Dockerfile ʹهड़Ͱ͖Δ • ڥͷϙʔλϏϦςΟ্͕
18
DockerͰڥΛԾԽ 19 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes
ECS ίʔυཧ σϓϩΠ ࣮ݧஈ֊͔ΒҰ؏ͯ͠Dockerίϯς φ্Ͱ࡞ۀɻಈ࡞͠ͳ͍εςʔδ͕ ग़ͳ͍Α͏ʹ
͔͠͠ɺɺDockerɺɺ • ίϚϯυ͕͍ɻɻɻɻ(TдT) • ϙʔτϑΥϫʔυɺϑΝΠϧϚϯτΛࢦఆ • ࣮ݧεςʔδ͔Β Docker Ͱ࡞ۀ͢Δؾ͕ى͜Β ͳ͍ɻɻɻ
20
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
ղܾํ๏ɿCookiecutter Docker Science • DockerڥͰͷ࣮ݧʙσϓϩΠ·ͰΛα ϙʔτ͢ΔCookiecutterςϯϓϨʔτΛͭ͘ Γ·ͨ͠ • ΦʔϓϯιʔεϓϩδΣΫτ •
URL: https://docker-science.github.io/ • Cookiecutter: ϓϩδΣΫτͷςϯϓϨʔτ ੜπʔϧ 23
ػೳɿCookicutter Docker Science • ΤϯδχΞϦϯάೳྗͷߴ͘ͳ͍ϝϯόͰDockerΛѻ͍͘͢ • DockerͷίϚϯυΛ make λʔήοτͰӅṭ •
ϙʔτϑΥϫʔυɺϑΝΠϧϚϯτઃఆɺίϯςφ࡞Γ͠ etc … • ࣮ݧ͔ΒཧɺσϓϩΠ·ͰΛҙࣝͨ͠σΟϨΫτϦߏΛग़ྗ • σΟϨΫτϦߏͷڞ௨ԽʹΑΓϓϩδΣΫτͷݟ௨͠ • Cookiecutter Data Science ͷߏΛࢀߟʹͨ͠ 24
ϑΝΠϧɺσΟϨΫτϦߏ ͷ౷Ұ 25 make init Ͱ S3͔ΒσʔλΛμ ϯϩʔυ ֶशεΫ Ϧϓτ͕ओྗ͢ΔϞσ
ϧΛอ࣋ ࣮ݧ༻ͷϊʔτϒο ΫΛอ࣋ ίʔυཧ࣌ʹ࡞ ΒΕΔϝιουɺΫϥε Λอ࣋ ϓϩδΣΫτͷϫʔ ΫϑϩʔΛه
Cookiecutter Docker Science ͷ ͍ํʢϓϩδΣΫτੜʣ $cookiecutter
[email protected]
: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
Demo: Cookiecutter Docker Science • ϓϩδΣΫτͷੜ • https://asciinema.org/a/ 6XV9dNixtzfUwWdoqLj7HG7 A2
• Docker image / container ίϯς φ࡞ • https://asciinema.org/a/ 06CcXPubAj3RSiMSTy3CZDrfG • Jupyter Notebook Λ্ཱͪ͛Δ 27
Cookiecutter Docker Science Λར༻ ࣮ͯ͠ݧஈ֊͔ΒԾԽڥͰ࡞ۀ 28 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI
όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes ECS ίʔυཧ σϓϩΠ ͯ͢ͷεςʔδͰԾڥ γʔϜϨεʹεςʔδΛҠಈͰ͖Δ
ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ 29
࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ঢ়گɿͳΜ͔ಈ࡞͍ͯ͠ΔΑ͏͕ͩɺϞσϧΛੜ͍ͯ͠Δίʔ υ͕ཧղͰ͖ͳ͍ • ྫɿJupyter Notebook Λͦͷ··ίϐϖͨ͠εΫϦϓτ • ػցֶशΞϧΰϦζϜ͍͠㱺ίʔυ͕ཧ͞Ε͍ͳ͍ͱͬ
ͱ͍͠ • ରॲɿιϑτΣΞΤϯδχΞϦϯάͰҰൠతͳίʔυ࣭ͷ ্ࢪࡦΛಋೖ • ϦϑΝΫλϦϯάɺςετɺCI etc 30
ϦϑΝΫλϦϯά • ϓϩάϥϜͷ֎෦͔Βݟͨಈ࡞Λม͑ͣʹιʔε ίʔυͷ෦ߏΛཧ͢ΔʢWikipedia ΑΓʣ • ෳࡶʹͳΓ͕ͪͳػցֶशͷॲཧΛཧ͢Δ • ॴײɿGitHub
Qiita Ͱެ։͞Ε͍ͯΔػցֶ शίʔυΛΈΔͱɺίʔυཧ͕ͳ͞Ε͍ͯΔ ͷ͕গͳ͍ʢଞͷίʔυͱൺֱʣɻ 31
ϦϑΝΫλϦϯά߲ ॳาతͳཧͰಡΈ্͕͢͢͞ΔʢςετɺCIɺCDͷੴʣ • ؔͷ͞ • มͷείʔϓ • ͕ؔऔΔҾͷ • ϚδοΫφϯόʔͷఆͷஔ͖͑
• ಉ͡ॲཧΛҰՕॴʹ·ͱΊΔ • ਂ͍ωετ෦Λؔͱͯ͠நग़͢Δ 32
ؔͷ͞ • ͕͍ؔͱཧղ͢Δͷ͕͘͠ͳΔ • ͻͲ͍εΫϦϓτͩͱ͕ͯ͢ϝΠϯؔ • ॲཧͷ༰ຖʹؔͱͯ͠நग़͢Δ 33
มͷείʔϓ • είʔϓɿม͕ར༻Ͱ͖Δڑ • είʔϓ͘ɺͦͯ͘͠ • άϩʔόϧมϩʔΧϧมʹஔ͖͑Δ • ॲཧΛ௨ͯ͡ར༻͢ΔมΠϯελϯεม ʹ͢Δ
34
ؔͷҾ • ػցֶशͷΞϧΰϦζϜύϥϝλ͕ଟ͍ˠؔͷ Ҿ͕ଟ͘ͳΓ͕ͪ • Ҿͷ͕ଟ͍ͱॲཧ͕͍ͮΒ͍ • ݮΒͤͳ͍͔ݕ౼͢Δ • ҾΛΦϒδΣΫτͱͯ͠·ͱΊΔ
• Կར༻͞ΕΔˠΠϯελϯεมʹ 35
ॲཧΛҰՕॴʹ·ͱΊΔ • ಉ͡Α͏ͳॲཧΛ͍ͯ͠ΔՕॴΛҰͭʹ·ͱΊ Δ • ྫɿσʔλͷมτϨʔχϯάͰςετͰ ར༻͢Δ 36
ਂ͍ωετΛආ͚Δ • for ϧʔϓɺif จ͕ωετ͍ͯ͠ΔͱྲྀΕ͕͔ͭ Έʹ͍͘ • ੵۃతʹؔΛநग़͢Δ • ΤσΟλͷػೳΛ͏ͱγϣʔτΧοτͰαΫο
ͱͰ͖Δ 37
ࣗಈςετ • ςετɿೖྗʹରͯ͠ظͨ͠Ξτϓοτʹͳͬ ͍ͯΔ͔Λݕূ͢Δίʔυ • ࠷ݶɿલॲཧɺEnd-to-Endͷςετॻ͘ 38
ςετͷԸܙ • ςετ=༷ • υΩϡϝϯτΛॻ͍ͯ࣌ؒͱͱʹᴥᴪ͕ੜ· ΕΔ • CIͰಈ࡞͢Δςετʹᴥᴪ͕ͳ͍ • ॻ͍͓͍ͯͯ͋͛ΔͱɺҾ͖ܧ͙ਓͷཧղΛॿ͚Δ
• ςετ͕ແ͍ίʔυΛमਖ਼͢Δͷڪා 39
ͦͷ΄͔ • linter ಋೖ • logger ಋೖ • CIಋೖ •
υΩϡϝϯτʢSphinxʣ • ࣮ݧͨ͠༰ͳͲΛ·ͱΊΔ • etc … 40
ػցֶशϓϩδΣΫτͷ੬͞ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ 41
͜Ε·ͰͷରࡦͰίʔυେ ؤ݈ʹͳͬͨ ͔͠͠ɺ·͕ͩ͋Δɻɻɻ ୭͕ཧ͢Δͷ͔ɻɻɻ 42
࣮ݧͨ͠ਓ͔Βίʔυ͕ΕΔ • ঢ়گɿ࣮ݧϨϙδτϦΛผͷਓ͕ཧʢ͘͠ ॻ͖͠ʣ • ѱӨڹɿ࠶࣮ݧ͠ʹ͘͘ͳΔɺকདྷͷमਖ਼ίε τ • ϓϩδΣΫτཚͳۀʹΑͬͯ੬͘ͳΔ •
ίʔυ͕ؤ݈ͰϓϩδΣΫτͱͯ͠੬͍ 43
ొϝϯόʔ ίʔυཧΛ̎ͭͷλΠϓͷϝϯόʔ Ͱ͓͜ͳ͏ʢɿݫີʹ͔Ε͍ͯΔ Θ͚Ͱ͋Γ·ͤΜʣ ϦαʔνϟدΓɿ࣮ݧͨ͠ਓɻػցֶ शΛར༻ͨ͠ϞσϦϯά͕ಘҙ ʢιϑτΤΞʣΤϯδχΞدΓɿι ϑτΣΞ։ൃ͕ಘҙ 44
Ξϯνύλʔϯɿίʔυཧ ʹ͓͚Δۀ ୳ࡧతͳ࣮ݧ ίʔυཧ Ϟσϧͷ σϓϩΠ Ϧαʔνϟ͕ݕূ࣮ͨ͠ݧ༰ΛΤϯδχΞ͕ཧ • ϥΠϒϥϦԽɺςετՃɺϦϑΝΫλϦϯά etc
45
ྑ͘ͳ͍࡞ۀϑϩʔɿίʔυ ཧ ʮΤϯδχΞ͕ػցֶशϓϩδΣΫτ༻ͷϨϙδτϦʹ ίϛοτʯɺ͘͠ʮผϨϙδτϦΛ࡞ͬͯ࡞ۀʯ 46 CIઃఆɺϦϑΝΫλϦϯά ςετɺLinterɺLogger ͷಋೖ ػցֶशϓϩδΣΫτ ϨϙδτϦ
ίϛοτՃ
ۀͷ݁Ռ • Ϧαʔνϟɿॻ͖͞Ε͍ͯΔͷͰཧ͞Εͨ ίʔυ͕ཧղͰ͖ͳ͍ • ΤϯδχΞɿॲཧͷཧղ͕Γͳ͍ɻ࣮ݧͷৄ ࡉΛཧղͰ͖͍ͯͳ͍ • ϦαʔνϟɺΤϯδχΞͱʹϓϩδΣΫτʹର ͢Δཧղɺ͕த్
47
ঢ়گੳɿۀʹΑΔ 48 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes
ECS ίʔυཧ σϓϩΠ ৽͍࣮͠ݧ݁Ռ͕ͰΔͨͼʹ ϦαʔνϟˠΤϯδχΞͷόέπ ϦϨʔ͕ൃੜ
ঢ়گੳɿۀʹΑΔ 49 ࣮ݧ ςετɺlintɺϦϑΝΫλ ϦϯάɺϥΠϒϥϦԽɺ CI όονεΫϦϓτɺ CDɺαʔϏε Ϟσϧվྑ kubernetes
ECS ίʔυཧ σϓϩΠ ίʔυཧޙͷεΫϦϓτΛϦαʔ νϟ͕ཧղͰ͖ͳ͍ 㱺վྑαΠΫϧΛճͤͳ͍ɻɻɻ
ݱঢ়Λཧ • ࣮ݧͨ͠ਓʢϦαʔνϟʣͷखͷಧ͔ͳ͍ॴͰίʔυΛ मਖ਼͢ΔͱϓϩδΣΫτࢮ͵ • رɿ࣮ݧͰར༻ͨ͠ίʔυʢσʔλมॲཧͳͲʣʴ ϞσϧΛͦͷ··σϓϩΠ͍ͨ͠ 㱺͔͠͠ɺා͍ͷͰίʔυཧʢՄಡੑؤ݈ੑ ্ʣ͔ͯ͠ΒϓϩμΫγϣϯʹಋೖ͍ͨ͠ 50
Ξϓϩʔν ࣮ݧͨ͠ਓ͕ࣗͰίʔυཧ͢ΔʢBeyond the Boundaryʣ 51
ίʔυཧΛϖΞͰऔΓΉ • ίʔυཧ࣌ʹϦαʔνϟɺΤϯδχΞͷϖΞΛ࡞Δ • ݟΛڞ༗ͭͭ͠ϖΞͰίʔυཧ • ίετߴ͘ͳ͍ɿ͍͍ͤͥඦʙઍߦͷεΫϦϓτ 52 ୳ࡧతͳ࣮ݧ ίʔυཧ
Ϟσϧͷ σϓϩΠ
࡞ۀϑϩʔɿίʔυཧ ʮΤϯδχΞ͕Pull RequestΛ࡞Γʯɺʮ࣮ݧͨ͠ ਓ͕ϨϏϡʔ͢Δʯ 53 CIઃఆɺϦϑΝΫλϦϯά ςετɺLinterɺLogger ͷಋೖ ϨϏϡʔˍϚʔδ ϓϧϦΫΤετͷ࡞
ҙ • ϓϩδΣΫτͷඒ͠͞ͱ࣮ݧ͢͠͞ͷόϥϯεΛऔΔ • ࣮ݧͨ͠ਓ͕࣮ݧΛܧଓͰ͖ΔൣғͰमਖ਼ • ࣮ݧͨ͠ਓ͕ཧղͰ͖ͳ͍मਖ਼Ϛʔδ͠ͳ͍ • ϓϧϦΫΤετͷཻখ͘͞ •
େ͖͍ͱཧղ͠ʹ͍͘ • ίϛοτΛܗͯ͠Θ͔Γ͘͢ʢιϑτΣΞΤϯδχΞ ͷͷݟͤͲ͜Ζʣ 54
ԸܙɿϖΞͰίʔυཧ • ϨϏϡʔͨ͠ίʔυͳͷͰ࣮ݧΛγʔϜϨεʹ࠶։Ͱ ͖Δʢਫ਼্ʣ • ͯ͢ͷϝϯόʹΤϯδχΞϦϯάͷجૅతͳݟΛ ڞ༗Ͱ͖ΔʢςετɺCIɺLinterɺϦϑΝΫλϦϯά etc ʣ →
ࣗͰίʔυཧͭͭ͠αΠΫϧΛճ͢ → কདྷͷमਖ਼ίετݮ 55
·ͱΊ ػցֶशϓϩδΣΫτ͕੬͘ͳͬͯΏ͘ݪҼͱऔ ΓΜͰ͍Δࢪࡦʹ͍ͭͯղઆͨ͠ • ࣮ݧεΫϦϓτ͕ಈ͔ͳ͍ • ࣮ݧεΫϦϓτ͕ཧղͰ͖ͳ͍ • ࣮ݧͨ͠ਓ͔Βίʔυ͕Ε 56
57 ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠