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.5k
機械学習プロジェクトを頑健にする施策 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
6.1k
pfm
takahiko03
0
1.1k
機械学習チームにおけるソフトウェアエンジニア〜役割、キャリア /devsum-2018-summer
takahiko03
8
11k
Cookiecutter Template for Data Scientists Working in Docker Containers
takahiko03
2
2.3k
Cookiecutter for ML experiments with Docker
takahiko03
0
1.1k
日本語の表記ゆれ 解決方法の検討と実装
takahiko03
2
2.1k
Other Decks in Programming
See All in Programming
Quine, Polyglot, 良いコード
qnighy
4
650
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
120
受け取る人から提供する人になるということ
little_rubyist
0
250
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
240
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
CSC509 Lecture 13
javiergs
PRO
0
110
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.7k
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
240
Featured
See All Featured
How to Ace a Technical Interview
jacobian
276
23k
Adopting Sorbet at Scale
ufuk
73
9.1k
Embracing the Ebb and Flow
colly
84
4.5k
How GitHub (no longer) Works
holman
310
140k
Facilitating Awesome Meetings
lara
50
6.1k
Practical Orchestrator
shlominoach
186
10k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
Fireside Chat
paigeccino
34
3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
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 ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠