Slide 1

Slide 1 text

My New Error… It is my new era. 1 Nikkei Inc. Yuta Ide(@sadnessOjisan) YAPC::Kyoto 2023

Slide 2

Slide 2 text

ࣗݾ঺հ { “໊લ”: “Yuta Ide”, “ॴଐ”: “೔ຊܦࡁ৽ฉࣾ”, “࢓ࣄ”: [“Frontend”, “CDN Edge”, “BFF Server”] } 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

ࢲͱ Try Catch • 2022/10/01 - 2022/12/31 ͷ̏ϲ݄ؒɺΞϥʔτ؂ࢹͷ࢓ࣄ ͚ͩΛ͢Δ • ࢲͷνʔϜ͸̏̌ݸ͍ۙϨϙδτϦ͕Քಇ͍ͯ͠ΔϚΠΫϩαʔϏε؀ڥͰɺ ֤αʔϏε͕ग़ྗ͢ΔΤϥʔϩά͕ Slack ʹ࿈ܞ͞ΕΔ • ΤϥʔϋϯυϦϯά͕ෆे෼ͳαʔϏε͔Βͷग़ྗʹ೰·͞ΕΔ 5

Slide 6

Slide 6 text

Nikkei Tech Talk Ͱͷ঺հ • Nikkei Tech Talk ͸೔ܦͷΤϯδχΞ૊৫ ͷษڧձ • #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓ૊ΈΛ঺հ 6 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena

Slide 7

Slide 7 text

Nikkei Tech Talk Ͱͷ঺հ • Nikkei Tech Talk ͸೔ܦͷΤϯδχΞ૊৫ ͷษڧձ • #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓ૊ΈΛ঺հ 7 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena ΦΦΧϛ

Slide 8

Slide 8 text

ΦΦΧϛগ೥໰୊΁ͷରॲΛ঺հͨ͠ • લ೚ऀෆࡏͰՔಇதͷαʔϏε܈͕SlackͷΞϥʔτνϟϯωϧΛຒΊਚ͘͠ ͍ͯͨ • ۓٸ౓ͷ௿͍Τϥʔ͕ଟ͘ɺʮͲ͏ͤۓٸ౓௿͍͔Βݟͳ͍͍ͯ͘΍ʯͱ͍ ͏ΦΦΧϛগ೥໰୊͕ਂࠁͩͬͨ • ̏ϲ݄͔͚ͯमਖ਼ͨۤ͠ಆͷه࿥͕ઌͷεϥΠυ • Ξϥʔτͷऩू • Ξϥʔτϩά͕Ͳ͔͜Βൃ͍ͯ͠Δ͔ίʔυϨϕϧͰ௥͍͔͚Δ • ΞϥʔτͷઃఆΛݟ௚͢ 8

Slide 9

Slide 9 text

ݸਓϒϩάͰͷ঺հ - My new error… - • ʮ͜͏͍͏ΤϥʔϋϯυϦϯάΛ͢Ε͹ ؂ࢹ͠΍͍͢ʯͱ͍ͬͨςΫχοΫͷ঺ հ • Result • Custom Error • Error Cause • Sentry 9 https://blog.ojisan.io/my-new-error/

Slide 10

Slide 10 text

ݸਓϒϩάͰͷ঺հ - Sentry SDK ׬શཧղ - • Sentry SDKͷ࢓૊Έʹ͍ͭͯ • Sentry ͸ઃఆ߲໨͕ͱͯ΋ଟ͍͕ɺ Sentry ͷ࢓૊ΈΛ஌Ε͹ԿΛઃఆ͢΂͖ ͔͢͜͠ݟ͑ͯ͘Δ 10 https://blog.ojisan.io/sentry-sdk-kanzen-rikai/

Slide 11

Slide 11 text

ࠓ೔ͷొஃͰ࿩͍ͨ͜͠ͱ • Nikkei Tech Talk: ෛ࠴ฦࡁ׆ಈͰͷΞϥʔτվળͷటष͍औΓ૊ΈΛ঺հ • ϒϩά: ΤϥʔϋϯυϦϯάͷͨΊͷཧ૝࿦΍ٕज़తͳςΫχοΫΛ঺հ • YAPC: ཧ૝࿦Λݱ࣮ͷطଘͷΞϓϦέʔγϣϯʹద༻͢Δ࣮ફʹϑΥʔΧε 11

Slide 12

Slide 12 text

೔ܦͰ͸Կ͕ى͖͍͔ͯͨ 12

Slide 13

Slide 13 text

զʑ͸ͳͥΞϓϦέʔγϣϯ؂ࢹΛ͍ͨ͠ͷ͔ • ো֐ʹؾ͖͍ͮͨ • જࡏతͳো֐ʹؾ͖͍ͮͨ 13

Slide 14

Slide 14 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ 14

Slide 15

Slide 15 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗ؂ࢹ 15

Slide 16

Slide 16 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗ؂ࢹ • Sentry: ϩΪϯάɺΞϥʔτ 16

Slide 17

Slide 17 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗ؂ࢹ • Sentry: ϩΪϯάɺΞϥʔτ • GCP / AWS: උ͑෇͚ͷϩάج൫ 17

Slide 18

Slide 18 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗ؂ࢹ • Sentry: ϩΪϯάɺΞϥʔτ • GCP / AWS: උ͑෇͚ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͠΍͍͢ 18

Slide 19

Slide 19 text

Ͳ͏͍͏πʔϧΛ࢖͑͹͍͍ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗ؂ࢹ • Sentry: ϩΪϯάɺΞϥʔτ • GCP / AWS: උ͑෇͚ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͠΍͍͢ • Kibana: ݕࡧɺϏδϡΞϥΠζ 19

Slide 20

Slide 20 text

πʔϧʹΑΔ৘ใ൙ཞ • πʔϧͷ໾ׂ͕ඃ͍ͬͯΔ • Datadog ΋ cloud monitoring ΋ΞϥʔτͰ͖Δ • ͱ͸͍͑ɺ໨తΛܾΊ͍ͯΔͷͰ͋Ε͹ݸผʹ͞·͟·ͳπʔϧΛಋೖ͢ Δ͜ͱࣗମ͸ྑ͍ͱ͞Ε͍ͯΔ • ͔͠͠ɺͦͷલఏͷڞ༗͕ෆे෼ͩͱ৘ใ൙ཞ͕ൃੜ͢Δ • ʮ͜͏͍͏ো֐͕ى͖ͨͱ͖͸ԿΛݟΕ͹͍͍Ͱ͔͢ʁʯ 20

Slide 21

Slide 21 text

೔ܦͰͷো֐؂ࢹ • Ξϥʔτͷߑਫ • ΦΦΧϛগ೥໰୊ • ΞϥʔτΛಡΜͰ΋ԿͷΞϥʔτ͔෼͔Βͳ͍ • ͰΔ΂͖ϩά΍Ξϥʔτ͕ग़͍ͯͳ͍ πʔϧ͸ಋೖ͞Ε͍ͯΔ͕ޮՌ͕ൃش͞Ε͍ͯͳ͍ 21

Slide 22

Slide 22 text

ͳͥ؂ࢹ্͕ख͍͔͘ͳ͍͔ • ࣮૷ͷ໰୊: πʔϧͷྗΛൃشͰ͖͍ͯͳ͍ • ૊৫ͷ໰୊: ӡ༻΍ϧʔςΟϯͷઃܭ͕Ͱ͖͍ͯͳ͍ • ՔಇϦιʔεͷௐ੔ • ผҊ݅ͱͷ༏ઌॱҐͷௐ੔ 22

Slide 23

Slide 23 text

ͳͥ؂ࢹ্͕ख͍͔͘ͳ͍͔ • ࣮૷ͷ໰୊: πʔϧͷྗΛൃشͰ͖͍ͯͳ͍ • ૊৫ͷ໰୊: ӡ༻΍ϧʔςΟϯͷઃܭ͕Ͱ͖͍ͯͳ͍ • ՔಇϦιʔεͷௐ੔ • ผҊ݅ͱͷ༏ઌॱҐͷௐ੔ 23 ·࣮ͣ૷ͷ໰୊ʹऔΓ૊Ή

Slide 24

Slide 24 text

ΤϥʔϋϯυϦϯάΛ๨Εͳ͍ͨΊʹResultܕͷಋೖ • JS Ͱ͸ྫ֎ͷ؅ཧ͸ try catch Ͱߦ ͏ • ͔͠͠Ͳͷؔ਺͕ྫ֎Λ౤͛Δ͔ Λ஌Βͳ͍ͱ try Λ෇͚Εͳ͍ • νʔϜ։ൃ΍ϥΠϒϥϦͷར༻ͳ Ͳɺࣗ෼͕࡞͍ͬͯͳ͍ίʔυΛ ݺͼग़͢ͱ͖ʹ͚ͭ๨Ε͕ൃੜ͢ Δ 24

Slide 25

Slide 25 text

ΤϥʔϋϯυϦϯάΛ๨Εͳ͍ͨΊʹResultܕͷಋೖ • ੒ޭɾࣦഊΛ Result ͱ͍͏ܕͰද ݱ • type Result = { _tag: “success”, val: T} | {_tag: “err”, val: E } • TS ؀ڥͰ͸ݺͼग़͠ଆʹ੒ޭ͔ࣦ ഊ͔ͷ֬ೝΛڧ੍ͤ͞ΒΕΔͷ ͰɺΤϥʔϋϯυϦϯάͷ͠๨Ε Λ๷͛Δ 25

Slide 26

Slide 26 text

Result ܕʹৼΓ੾Δ͜ͱ͸ຊ౰ʹଥ౰ͳͷ͔ • ΦϒδΣΫτͷੜ੒ͱݕূ͸ਖ਼ৗܥʹ͓͍ͯ͸ʢແࢹͰ͖Δ΄ͲʹඍʑͨΔ ΋ͷ͚ͩͲʣແବͳίετͰ͸ͳ͍͔ • ഑ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ΋ Result ͕ ग़ͯ͘ΔͷͰ͸ͳ͍͔ • const a = [1]; const b = a[0]; ઈରʹ஋͕ೖ͍ͬͯΔ b Λ number ͱͯ͠࢖͍ ͨͯ͘΋ܕ্Ͱ͸ undefined, ྫ֎Λ౤͛ͨ͘ͳΒͳ͍Ͱ͔͢ʁ • ͦ΋ͦ΋ݴޠػೳͰͳ͍΋ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰ͸ ͳ͍͔ 26

Slide 27

Slide 27 text

ϝϦοτʹ໨Λ޲͚ͯ Resultܕ ͷಋೖ΁ͱ౿Έ੾Δ • ೔ܦͷಛੑ্SSR͕ඞਢͰɺ෦෼తͳࢴ໘ੜ੒ʹ ࣦഊͨ͠ͱ͖ʹରԠ͠΍͍͢ • ৽ฉهࣄͷೖߘ͸ͱͯ΋ࣗ༝౓͕ߴ͘ɺΞϓϦ έʔγϣϯͷͲ͔͜Βྫ֎͕ඈΜͰ͘Δͷ͔༧ଌ Ͱ͖ͳ͍ • ༗ࣝऀʢRustaceanʣʹΑΔϋϯζΦϯ΍߈ུΨΠ υͷڞ༗ • Fastly C@E ͷಋೖͰ Rust ʹ׳Εͳ͍ͱ͍͚ͳ͍ • ଞνʔϜʹScalaͱKotlinͷ೿ൊ͕͋ΓɺResultܕࣗ ମʹର͢Δ஌ݟ͸͋Δ 27 https://hack.nikkei.com/blog/advent20221201/

Slide 28

Slide 28 text

ҰԠσϝϦοτʹ΋໨Λ޲͚Δͱ • ΦϒδΣΫτͷੜ੒ͱݕূ͸ਖ਼ৗܥʹ͓͍ͯ͸ʢແࢹͰ͖Δ΄ͲʹඍʑͨΔ΋ͷ͚ͩ ͲʣແବͳίετͰ͸ͳ͍͔ 
 => ແࢹɺύϑΥʔϚϯε͕໰୊ʹͳΔͳΒݦࡏԽ͔ͯ͠Βରࡦ͢Δ • ഑ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ΋ Result ͕ग़ͯ͘Δͷ Ͱ͸ͳ͍͔ 
 => ։ൃऀ͕ઈରʹ҆શͱ஌͍ͬͯΔͷͰ͋Ε͹ྫ֎Λ౤͛Δɻ഑ྻʹ஋Λ٧Ίͨޙʹऔ Γग़ͯͦ͠ͷ஋ͷ࣮ࡏΛݕূʢܕݕࠪ௨ͨ͢Ίʹʣͨ͠ͱ͖ɺྫ֎্͕͕ΔΘ͚͕ͳ͍ • ͦ΋ͦ΋ݴޠػೳͰͳ͍΋ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰ͸ͳ͍͔ • ؆୯ͳίϯϏωʔλ͚ͩΛ࢖͏Α͏ʹ͠ɺ࠷ѱ࢖Θͣʹ۪௚ͳίʔυΛॻ͍ͯ΋ڐ༰ • functional programming ʹد͍ͤͨΘ͚Ͱ͸ͳ͍ 28

Slide 29

Slide 29 text

ResultܕΛಋೖ͢Δʹ͸ίϯϏωʔλ΋ඞཁ • Resultͷ஋Λ࢖͏ͨΊʹ͸ຖճ Result Λ֎͢ඞཁ͕͋ΔɻϝϯυΫαΠ • map: Result ͷ val ʹؔ਺Λద༻Ͱ͖Δɻmap(Result, T->U) ͸ Result ͱͳΔɻmap(getUserResult, (user) => encUserId(user)); • flatMap: Result ͷ val ʹ Result Λฦؔ͢਺Λద༻Ͱ͖ΔɻResult> ͕ Result ͱͳΔɻflatMap(getUserResult, (user) => getBoughtItemsByUser(user)); • Result Λฦؔ͢਺ಉ࢜ͷ߹੒͕༰қʹͳΓɺResultΛͨ͘͞Μ࢖ͬͯ΋Ϣʔ βʔͷॻ͖ຯ͸มΘΒͳ͍ɻ 29

Slide 30

Slide 30 text

ίϯϏωʔλͷ࣮૷ΛϥΠϒϥϦʹ೚ͤΔ • ίϯϏωʔλΛࣗ෼ୡͰ༻ҙ͢Δͷ͸େมͳͷͰ option-t ͱ͍͏ϥΠϒϥϦ Λ࠾༻ • https://github.com/option-t/option-t • A toolkit of Nullable/Option/Result type implementation in ECMAScript. Their APIs are inspired by Rust's `Option` and `Result`. • Rust ͷυΩϡϝϯτͰֶ΂Δ͜ͱ͕େ͖ͳΞυόϯςʔδ 30

Slide 31

Slide 31 text

Τϥʔʹ໊લΛׂΓৼΔ • SentryͰ͸ Issue ͷλΠτϧ͕ҰཡͰදࣔͰ ͖ɺͦͷλΠτϧͰूܭͰ͖Δ • λΠτϧͷཻ౓΍ωʔϛϯά͕େࣄ • λΠτϧ͸ Error.prototype.name Ͱ੍ޚͰ͖Δ • new Error(‘msg’).name = “MyError” • ͱ͢Δͷ͸ΊΜͲ͍͘͞ͷͰɺͦͷ໊લΛ࣋ͬ ͨ Custom Error Λఆ͓ٛͯ͘͠ͷ͕ৗ౟ 31 ԿͷΤϥʔ͔෼͔Βͳ͍ʂ

Slide 32

Slide 32 text

σόοά͠΍͍͢ϝλ৘ใΛϝοηʔδʹೖΕΔ • SentryͰ͸ Error.prototype.message ͷ಺༰͕ ϩάʹݱΕΔ • ΤϥʔΛ෼ੳ͢Δͱ͖ͷώϯτΛ message ʹ ೖΕ͓ͯ͘ • ݺͼग़͞ΕΔؔ਺ͷҾ਺ • ϢʔβʔτʔΫϯ΍ݸਓ৘ใͳͲ͸ग़ྗ͠ͳ ͍Α͏ʹ஫ҙ • SentryʹݶΒͣʮϩάʹग़ྗ͢΂͖͸Կ͔ʯ Λҙࣝ͢Δͱྑ͍ 32 ԿͷΤϥʔ͔෼͔Βͳ͍ʂ

Slide 33

Slide 33 text

ϩάϨϕϧΛ࢖͍෼͚Δ • Sentry͸ log, warn, error ͱ͍ͬͨϩάϨϕϧͷ࢖͍෼͚͕Ͱ͖ΔɻϑΟϧλͯ͠ݕࡧ͠ ͨΓɺϨϕϧ͝ͱʹΞϥʔτΛઃఆͰ͖Δɻ • ͳΜͰ΋͔ΜͰ΋ΤϥʔʹͤͣɺϩάϨϕϧΛ࢖͍෼͚ΔͱΦΦΧϛগ೥໰୊ΛݮΒͤΔ • error: ҟৗ͕ى͖ͨͱ͖ʹ࢖͏ • warn: ݺ͹Εͯخ͘͠ͳ͍ॲཧ͕ݺ͹Εͨͱ͖ʹ࢖͏ɻdeprecated ͳ API Λݺ͹Εͨ ࣌΍retryͷ࣮ߦͳͲ • Info: ϨεϙϯεͳͲͰ֬ೝͰ͖ͳͯ͘໨ʹݟ͑ΔܗͰ֬ೝͰ͖ͳ͍͕ɺ࣮ߦ͞Εͨܗ ੻Λ࢒͢ͱ͖ʹ࢖͏ɻಛघͳΤϯυϙΠϯτͷݺͼग़͠΍application cache͕miss͠ ͨͱ͖ͳͲ 33

Slide 34

Slide 34 text

ϩΨʔͷϥούʔΛ࡞Δ • console.log, info, warn, error Λͦͷ··࢖Θ ͳ͍ • Ϋϥ΢υ؀ڥͰ͸ sentry ΋Ұॹʹݺ͹ΕΔΑ ͏ͳϥούʔؔ਺Λ࡞Δ 34

Slide 35

Slide 35 text

ΫϥΠΞϯταΠυͷΤϥʔ΋ग़͢ • ͜Ε·ͰΫϥΠΞϯταΠυͷΤϥʔ͸Ξϥʔτͯ͠ग़͍ͯ͠ͳ͔ͬͨ • ΫϥΠΞϯταΠυͷΤϥʔ͸ϊΠζʹͳΓ΍͍͢ • Ϣʔβʔ͕ݍ֎ʹͳͬͨͱ͖ • αϙʔτ֎ͷσόΠεɾOSΛ࢖͍ͬͯΔ৔߹ʢಛʹ WebView) • ࢓ํͳ͘ى͖Δ Hydration Error 35

Slide 36

Slide 36 text

ϊΠζͷ཈੍Λ͍ͨ͠ • Ξϥʔτ͸UI͔Β ignore Ͱ͖Δ • ͔͠͠ҟͳΔURL͔Βಉ͡Τϥʔ͕ग़ͨ৔߹ɺҟͳΔΤϥʔͱͯ͠ѻΘΕͯ ignore ͯ͠΋৽͘͠ಉ͡Τϥʔ͕௨஌͞ΕΔ • ͦ΋ͦ΋ Sentry ʹૹΒͳ͍Α͏ʹ͍ͨ͠ɻinit ͷ option Ͱ͋Δఔ౓੍ޚͰ͖ Δɻhttps://docs.sentry.io/platforms/javascript/configuration/filtering/ • ignoreErrors: send ͠ͳ͍ΤϥʔΛએݴͰ͖Δ • denyUrls: ֎෦ϞδϡʔϧʹΑΔΤϥʔΛsend͠ͳ͍ 36

Slide 37

Slide 37 text

ιʔεϚοϓΛग़ྗ͢Δ • SentryͰ͸ source map Λૹ৴͢Δ͜ͱͰ minify ͞ΕͨίʔυͷΤϥʔΛɺਓ ͕ؒಡΊΔܗʹͯ͘͠ΕΔ • Sentry͕Ϗϧυπʔϧ޲͚ϓϥάΠϯΛఏڙ͓ͯ͠ΓɺͦΕΛར༻͢Δ͜ͱͰ sourcemap Λૹ৴Ͱ͖Δ • webpack, nextjs • sentry-cli ͷઃఆ͕ඞཁ • Source map Λૹ৴ޙɺͭ·ΓϏϧυޙσϓϩΠલͷλΠϛϯάͰιʔε ίʔυ͔Β sourcemap Λফ͢͜ͱΛਪ঑ 37

Slide 38

Slide 38 text

Error Cause Λ࢖͏ • ྫ֎Λcatchͯ͠٧Ί௚͢ͱͦͷྫ֎ ৘ใ͕ࣦΘΕͯ͠·͏ • catch અͰΧελϜΤϥʔΛ࡞ͬͯ Result.Error Λ࡞Δͱ͖ʹɺݩͷΤ ϥʔ͕ࣦΘΕͯ͠·͏໰୊͕͋ͬͨ • Error.prototype.cause Λ࢖͏͜ͱ ͰɺݩͷΤϥʔΛ৽͍͠Τϥʔʹੵ ΊΔ 38

Slide 39

Slide 39 text

Node.js ΛΞοϓσʔτ͢Δ • Error Cause ͸ ES2022, Node.js 16.9 ͔Βͷػೳ • ౰࣌ฐࣾͷଟ͘ͷ Node.js ͷόʔδϣϯ͸ 16.9ະຬ • 16, 18 ΁ͷΞοϓσʔτ࡞ۀΛνʔϜϝΠτ͕Ξϥʔτվળͱฒߦͯ͠ߦ͏ • gyp-error ͱᛀΊͬ͜͢Δຖ೔ 39

Slide 40

Slide 40 text

୭͕͜ͷ࡞ۀΛ࣮ߦ͔ͨ͠ ʮஈ֊తʹߦ͑ͦ͏ͳ͜ͱ͸෼͔͚ͬͨͲɺ۩ମతʹͲ͏ਐΊͨͷ͔ʁʯ ʮ΍Βͳ͍ΑΓ΍ͬͨํ͕Ϛγͷਫ਼ਆͰɺͰ͖Δͱ͜Ζ͔Βίπίπͱɺ։ൃ Λ̏ϲ݄ࢭΊͯ༗ࢤ͕ؤுΓ·ͨ͠ɻ࡞ۀΛੵΈ্͛ΒΕΔ͜ͱ͕޾͍Ͱ͢ɻʯ ࠶ݱੑͳͯ͘͢Έ·ͤΜɾɾɾ 40

Slide 41

Slide 41 text

ʮ࠷ۙΞϓϦέʔγϣϯ։ൃͤͣʹͣͬͱSentryΛݟΔ࢓ࣄͯ͠ΔΜͩΑͶʯ ʮਏͦ͏ʯ 41

Slide 42

Slide 42 text

Ξϥʔτվળ͸ͱͯ΋ָ͍͠࢓ࣄͰ͢ • ΞϥʔτͷൃੜݯΛḷ͍ͬͯ͘͜ͱͰͦͷΞϓϦέʔγϣϯ΁ͷཧղ͕ਂ· ΔɻΦϯϘʔσΟϯάλεΫͱͯ͠΋ྑ͍ ͱࢥ͏ɻ • ΞϓϦέʔγϣϯͱͯ͠ɺαʔϏεͱͯ͠ɺγεςϜͱͯ͠ɺ૊৫ͱͯ͠Ͳ͏ ͋Δ΂͖͔Λߟ͑Δ͖͔͚ͬɻࣗ෼ͷࢹ࠲͕มΘͬͨΑ͍͖͔͚ͬɻͱͯ΋੒ ௕Ͱ͖ͨͱࢥ͏ 42

Slide 43

Slide 43 text

ΤϥʔվળɺΞϥʔτվળ͸ྑ͍ͧʂ ΍Ζ͏ʂʂʂʂʂʂʂʂʂ 43