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
my new error
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
sadnessOjisan
March 19, 2023
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
my new error
sadnessOjisan
March 19, 2023
More Decks by sadnessOjisan
See All by sadnessOjisan
Cloudflare Workers で Rust 選ぶ理由 is 何?
sadnessojisan
1
59
AIエージェントが動かないときの原因とその対処
sadnessojisan
2
130
React のルーター事情
sadnessojisan
1
620
PHPこそ OpenTelemetry が嬉しい
sadnessojisan
2
450
TypeScript、上達の瞬間
sadnessojisan
53
19k
フロントエンド・オブザーバビリティを支える要素技術を学ぼう
sadnessojisan
2
980
疎通2024
sadnessojisan
5
1.7k
BasicBasic認証
sadnessojisan
5
4.9k
ISUCON入門以前_ISUNARABE_LT#1
sadnessojisan
21
6.5k
Other Decks in Programming
See All in Programming
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Vite+ Unified Toolchain for the Web
naokihaba
0
170
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
630
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
480
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
170
The NotImplementedError Problem in Ruby
koic
1
660
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
640
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.9k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
460
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
510
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Documentation Writing (for coders)
carmenintech
77
5.4k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Rails Girls Zürich Keynote
gr2m
96
14k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Leo the Paperboy
mayatellez
7
1.8k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Transcript
My New Error… It is my new era. 1 Nikkei
Inc. Yuta Ide(@sadnessOjisan) YAPC::Kyoto 2023
ࣗݾհ { “໊લ”: “Yuta Ide”, “ॴଐ”: “ຊܦࡁ৽ฉࣾ”, “ࣄ”: [“Frontend”, “CDN
Edge”, “BFF Server”] } 2
3
4
ࢲͱ Try Catch • 2022/10/01 - 2022/12/31 ͷ̏ϲ݄ؒɺΞϥʔτࢹͷࣄ ͚ͩΛ͢Δ •
ࢲͷνʔϜ̏̌ݸ͍ۙϨϙδτϦ͕Քಇ͍ͯ͠ΔϚΠΫϩαʔϏεڥͰɺ ֤αʔϏε͕ग़ྗ͢ΔΤϥʔϩά͕ Slack ʹ࿈ܞ͞ΕΔ • ΤϥʔϋϯυϦϯά͕ෆेͳαʔϏε͔Βͷग़ྗʹ·͞ΕΔ 5
Nikkei Tech Talk Ͱͷհ • Nikkei Tech Talk ܦͷΤϯδχΞ৫ ͷษڧձ
• #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓΈΛհ 6 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena
Nikkei Tech Talk Ͱͷհ • Nikkei Tech Talk ܦͷΤϯδχΞ৫ ͷษڧձ
• #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓΈΛհ 7 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena ΦΦΧϛ
ΦΦΧϛগͷରॲΛհͨ͠ • લऀෆࡏͰՔಇதͷαʔϏε܈͕SlackͷΞϥʔτνϟϯωϧΛຒΊਚ͘͠ ͍ͯͨ • ۓٸͷ͍Τϥʔ͕ଟ͘ɺʮͲ͏ͤۓٸ͍͔Βݟͳ͍͍ͯ͘ʯͱ͍ ͏ΦΦΧϛগ͕ਂࠁͩͬͨ • ̏ϲ݄͔͚ͯमਖ਼ͨۤ͠ಆͷه͕ઌͷεϥΠυ •
Ξϥʔτͷऩू • Ξϥʔτϩά͕Ͳ͔͜Βൃ͍ͯ͠Δ͔ίʔυϨϕϧͰ͍͔͚Δ • ΞϥʔτͷઃఆΛݟ͢ 8
ݸਓϒϩάͰͷհ - My new error… - • ʮ͜͏͍͏ΤϥʔϋϯυϦϯάΛ͢Ε ࢹ͍͢͠ʯͱ͍ͬͨςΫχοΫͷ հ
• Result • Custom Error • Error Cause • Sentry 9 https://blog.ojisan.io/my-new-error/
ݸਓϒϩάͰͷհ - Sentry SDK શཧղ - • Sentry SDKͷΈʹ͍ͭͯ •
Sentry ઃఆ߲͕ͱͯଟ͍͕ɺ Sentry ͷΈΛΕԿΛઃఆ͖͢ ͔͢͜͠ݟ͑ͯ͘Δ 10 https://blog.ojisan.io/sentry-sdk-kanzen-rikai/
ࠓͷొஃͰ͍ͨ͜͠ͱ • Nikkei Tech Talk: ෛ࠴ฦࡁ׆ಈͰͷΞϥʔτվળͷటष͍औΓΈΛհ • ϒϩά: ΤϥʔϋϯυϦϯάͷͨΊͷཧٕज़తͳςΫχοΫΛհ •
YAPC: ཧΛݱ࣮ͷطଘͷΞϓϦέʔγϣϯʹద༻͢Δ࣮ફʹϑΥʔΧε 11
ܦͰԿ͕ى͖͍͔ͯͨ 12
զʑͳͥΞϓϦέʔγϣϯࢹΛ͍ͨ͠ͷ͔ • োʹؾ͖͍ͮͨ • જࡏతͳোʹؾ͖͍ͮͨ 13
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ 14
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ 15
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
16
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ 17
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͍͢͠ 18
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͍͢͠ • Kibana: ݕࡧɺϏδϡΞϥΠζ 19
πʔϧʹΑΔใ൙ཞ • πʔϧͷׂ͕ඃ͍ͬͯΔ • Datadog cloud monitoring ΞϥʔτͰ͖Δ •
ͱ͍͑ɺతΛܾΊ͍ͯΔͷͰ͋Εݸผʹ͞·͟·ͳπʔϧΛಋೖ͢ Δ͜ͱࣗମྑ͍ͱ͞Ε͍ͯΔ • ͔͠͠ɺͦͷલఏͷڞ༗͕ෆेͩͱใ൙ཞ͕ൃੜ͢Δ • ʮ͜͏͍͏ো͕ى͖ͨͱ͖ԿΛݟΕ͍͍Ͱ͔͢ʁʯ 20
ܦͰͷোࢹ • Ξϥʔτͷߑਫ • ΦΦΧϛগ • ΞϥʔτΛಡΜͰԿͷΞϥʔτ͔͔Βͳ͍ • ͰΔ͖ϩάΞϥʔτ͕ग़͍ͯͳ͍ πʔϧಋೖ͞Ε͍ͯΔ͕ޮՌ͕ൃش͞Ε͍ͯͳ͍
21
ͳͥࢹ্͕ख͍͔͘ͳ͍͔ • ࣮ͷ: πʔϧͷྗΛൃشͰ͖͍ͯͳ͍ • ৫ͷ: ӡ༻ϧʔςΟϯͷઃܭ͕Ͱ͖͍ͯͳ͍ • ՔಇϦιʔεͷௐ •
ผҊ݅ͱͷ༏ઌॱҐͷௐ 22
ͳͥࢹ্͕ख͍͔͘ͳ͍͔ • ࣮ͷ: πʔϧͷྗΛൃشͰ͖͍ͯͳ͍ • ৫ͷ: ӡ༻ϧʔςΟϯͷઃܭ͕Ͱ͖͍ͯͳ͍ • ՔಇϦιʔεͷௐ •
ผҊ݅ͱͷ༏ઌॱҐͷௐ 23 ·࣮ͣͷʹऔΓΉ
ΤϥʔϋϯυϦϯάΛΕͳ͍ͨΊʹResultܕͷಋೖ • JS Ͱྫ֎ͷཧ try catch Ͱߦ ͏ • ͔͠͠Ͳͷ͕ؔྫ֎Λ͛Δ͔
ΛΒͳ͍ͱ try Λ͚Εͳ͍ • νʔϜ։ൃϥΠϒϥϦͷར༻ͳ Ͳɺ͕ࣗ࡞͍ͬͯͳ͍ίʔυΛ ݺͼग़͢ͱ͖ʹ͚ͭΕ͕ൃੜ͢ Δ 24
ΤϥʔϋϯυϦϯάΛΕͳ͍ͨΊʹResultܕͷಋೖ • ޭɾࣦഊΛ Result ͱ͍͏ܕͰද ݱ • type Result<T, E>
= { _tag: “success”, val: T} | {_tag: “err”, val: E } • TS ڥͰݺͼग़͠ଆʹޭ͔ࣦ ഊ͔ͷ֬ೝΛڧ੍ͤ͞ΒΕΔͷ ͰɺΤϥʔϋϯυϦϯάͷ͠Ε Λ͛Δ 25
Result ܕʹৼΓΔ͜ͱຊʹଥͳͷ͔ • ΦϒδΣΫτͷੜͱݕূਖ਼ৗܥʹ͓͍ͯʢແࢹͰ͖Δ΄ͲʹඍʑͨΔ ͷ͚ͩͲʣແବͳίετͰͳ͍͔ • ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ Result ͕ ग़ͯ͘ΔͷͰͳ͍͔
• const a = [1]; const b = a[0]; ઈରʹ͕ೖ͍ͬͯΔ b Λ number ͱ͍ͯ͠ ͨͯ͘ܕ্Ͱ undefined, ྫ֎Λ͛ͨ͘ͳΒͳ͍Ͱ͔͢ʁ • ͦͦݴޠػೳͰͳ͍ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰ ͳ͍͔ 26
ϝϦοτʹΛ͚ͯ Resultܕ ͷಋೖͱ౿ΈΔ • ܦͷಛੑ্SSR͕ඞਢͰɺ෦తͳࢴ໘ੜʹ ࣦഊͨ͠ͱ͖ʹରԠ͍͢͠ • ৽ฉهࣄͷೖߘͱͯࣗ༝͕ߴ͘ɺΞϓϦ έʔγϣϯͷͲ͔͜Βྫ֎͕ඈΜͰ͘Δͷ͔༧ଌ Ͱ͖ͳ͍
• ༗ࣝऀʢRustaceanʣʹΑΔϋϯζΦϯ߈ུΨΠ υͷڞ༗ • Fastly C@E ͷಋೖͰ Rust ʹ׳Εͳ͍ͱ͍͚ͳ͍ • ଞνʔϜʹScalaͱKotlinͷൊ͕͋ΓɺResultܕࣗ ମʹର͢Δݟ͋Δ 27 https://hack.nikkei.com/blog/advent20221201/
ҰԠσϝϦοτʹΛ͚Δͱ • ΦϒδΣΫτͷੜͱݕূਖ਼ৗܥʹ͓͍ͯʢແࢹͰ͖Δ΄ͲʹඍʑͨΔͷ͚ͩ ͲʣແବͳίετͰͳ͍͔ => ແࢹɺύϑΥʔϚϯε͕ʹͳΔͳΒݦࡏԽ͔ͯ͠Βରࡦ͢Δ • ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ Result
͕ग़ͯ͘Δͷ Ͱͳ͍͔ => ։ൃऀ͕ઈରʹ҆શͱ͍ͬͯΔͷͰ͋Εྫ֎Λ͛ΔɻྻʹΛ٧Ίͨޙʹऔ Γग़ͯͦ͠ͷͷ࣮ࡏΛݕূʢܕݕࠪ௨ͨ͢Ίʹʣͨ͠ͱ͖ɺྫ֎্͕͕ΔΘ͚͕ͳ͍ • ͦͦݴޠػೳͰͳ͍ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰͳ͍͔ • ؆୯ͳίϯϏωʔλ͚ͩΛ͏Α͏ʹ͠ɺ࠷ѱΘͣʹ۪ͳίʔυΛॻ͍ͯڐ༰ • functional programming ʹد͍ͤͨΘ͚Ͱͳ͍ 28
ResultܕΛಋೖ͢ΔʹίϯϏωʔλඞཁ • ResultͷΛ͏ͨΊʹຖճ Result Λ֎͢ඞཁ͕͋ΔɻϝϯυΫαΠ • map: Result ͷ val
ʹؔΛద༻Ͱ͖Δɻmap(Result<T, E>, T->U) Result<U , E> ͱͳΔɻmap(getUserResult, (user) => encUserId(user)); • flatMap: Result ͷ val ʹ Result Λฦؔ͢Λద༻Ͱ͖ΔɻResult<T, Result<T, E>> ͕ Result<T, E> ͱͳΔɻflatMap(getUserResult, (user) => getBoughtItemsByUser(user)); • Result Λฦؔ͢ಉ࢜ͷ߹͕༰қʹͳΓɺResultΛͨ͘͞ΜͬͯϢʔ βʔͷॻ͖ຯมΘΒͳ͍ɻ 29
ίϯϏωʔλͷ࣮ΛϥΠϒϥϦʹͤΔ • ίϯϏωʔλΛࣗୡͰ༻ҙ͢ΔͷେมͳͷͰ 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<T>` and `Result<T, E>`. • Rust ͷυΩϡϝϯτͰֶΔ͜ͱ͕େ͖ͳΞυόϯςʔδ 30
Τϥʔʹ໊લΛׂΓৼΔ • SentryͰ Issue ͷλΠτϧ͕ҰཡͰදࣔͰ ͖ɺͦͷλΠτϧͰूܭͰ͖Δ • λΠτϧͷཻωʔϛϯά͕େࣄ • λΠτϧ
Error.prototype.name Ͱ੍ޚͰ͖Δ • new Error(‘msg’).name = “MyError” • ͱ͢ΔͷΊΜͲ͍͘͞ͷͰɺͦͷ໊લΛ࣋ͬ ͨ Custom Error Λఆ͓ٛͯ͘͠ͷ͕ৗ 31 ԿͷΤϥʔ͔͔Βͳ͍ʂ
σόοά͍͢͠ϝλใΛϝοηʔδʹೖΕΔ • SentryͰ Error.prototype.message ͷ༰͕ ϩάʹݱΕΔ • ΤϥʔΛੳ͢Δͱ͖ͷώϯτΛ message ʹ
ೖΕ͓ͯ͘ • ݺͼग़͞ΕΔؔͷҾ • ϢʔβʔτʔΫϯݸਓใͳͲग़ྗ͠ͳ ͍Α͏ʹҙ • SentryʹݶΒͣʮϩάʹग़ྗ͖͢Կ͔ʯ Λҙࣝ͢Δͱྑ͍ 32 ԿͷΤϥʔ͔͔Βͳ͍ʂ
ϩάϨϕϧΛ͍͚Δ • Sentry log, warn, error ͱ͍ͬͨϩάϨϕϧͷ͍͚͕Ͱ͖ΔɻϑΟϧλͯ͠ݕࡧ͠ ͨΓɺϨϕϧ͝ͱʹΞϥʔτΛઃఆͰ͖Δɻ • ͳΜͰ͔ΜͰΤϥʔʹͤͣɺϩάϨϕϧΛ͍͚ΔͱΦΦΧϛগΛݮΒͤΔ
• error: ҟৗ͕ى͖ͨͱ͖ʹ͏ • warn: ݺΕͯخ͘͠ͳ͍ॲཧ͕ݺΕͨͱ͖ʹ͏ɻdeprecated ͳ API ΛݺΕͨ ࣌retryͷ࣮ߦͳͲ • Info: ϨεϙϯεͳͲͰ֬ೝͰ͖ͳͯ͘ʹݟ͑ΔܗͰ֬ೝͰ͖ͳ͍͕ɺ࣮ߦ͞Εͨܗ Λ͢ͱ͖ʹ͏ɻಛघͳΤϯυϙΠϯτͷݺͼग़͠application cache͕miss͠ ͨͱ͖ͳͲ 33
ϩΨʔͷϥούʔΛ࡞Δ • console.log, info, warn, error Λͦͷ··Θ ͳ͍ • ΫϥυڥͰ
sentry ҰॹʹݺΕΔΑ ͏ͳϥούʔؔΛ࡞Δ 34
ΫϥΠΞϯταΠυͷΤϥʔग़͢ • ͜Ε·ͰΫϥΠΞϯταΠυͷΤϥʔΞϥʔτͯ͠ग़͍ͯ͠ͳ͔ͬͨ • ΫϥΠΞϯταΠυͷΤϥʔϊΠζʹͳΓ͍͢ • Ϣʔβʔ͕ݍ֎ʹͳͬͨͱ͖ • αϙʔτ֎ͷσόΠεɾOSΛ͍ͬͯΔ߹ʢಛʹ WebView)
• ํͳ͘ى͖Δ Hydration Error 35
ϊΠζͷ੍Λ͍ͨ͠ • ΞϥʔτUI͔Β ignore Ͱ͖Δ • ͔͠͠ҟͳΔURL͔Βಉ͡Τϥʔ͕ग़ͨ߹ɺҟͳΔΤϥʔͱͯ͠ѻΘΕͯ ignore ͯ͠৽͘͠ಉ͡Τϥʔ͕௨͞ΕΔ •
ͦͦ Sentry ʹૹΒͳ͍Α͏ʹ͍ͨ͠ɻinit ͷ option Ͱ͋Δఔ੍ޚͰ͖ Δɻhttps://docs.sentry.io/platforms/javascript/configuration/filtering/ • ignoreErrors: send ͠ͳ͍ΤϥʔΛએݴͰ͖Δ • denyUrls: ֎෦ϞδϡʔϧʹΑΔΤϥʔΛsend͠ͳ͍ 36
ιʔεϚοϓΛग़ྗ͢Δ • SentryͰ source map Λૹ৴͢Δ͜ͱͰ minify ͞ΕͨίʔυͷΤϥʔΛɺਓ ͕ؒಡΊΔܗʹͯ͘͠ΕΔ •
Sentry͕Ϗϧυπʔϧ͚ϓϥάΠϯΛఏڙ͓ͯ͠ΓɺͦΕΛར༻͢Δ͜ͱͰ sourcemap Λૹ৴Ͱ͖Δ • webpack, nextjs • sentry-cli ͷઃఆ͕ඞཁ • Source map Λૹ৴ޙɺͭ·ΓϏϧυޙσϓϩΠલͷλΠϛϯάͰιʔε ίʔυ͔Β sourcemap Λফ͢͜ͱΛਪ 37
Error Cause Λ͏ • ྫ֎Λcatchͯ͠٧Ί͢ͱͦͷྫ֎ ใ͕ࣦΘΕͯ͠·͏ • catch અͰΧελϜΤϥʔΛ࡞ͬͯ Result.Error
Λ࡞Δͱ͖ʹɺݩͷΤ ϥʔ͕ࣦΘΕͯ͠·͏͕͋ͬͨ • Error.prototype.cause Λ͏͜ͱ ͰɺݩͷΤϥʔΛ৽͍͠Τϥʔʹੵ ΊΔ 38
Node.js ΛΞοϓσʔτ͢Δ • Error Cause ES2022, Node.js 16.9 ͔Βͷػೳ
• ࣌ฐࣾͷଟ͘ͷ Node.js ͷόʔδϣϯ 16.9ະຬ • 16, 18 ͷΞοϓσʔτ࡞ۀΛνʔϜϝΠτ͕Ξϥʔτվળͱฒߦͯ͠ߦ͏ • gyp-error ͱᛀΊͬ͜͢Δຖ 39
୭͕͜ͷ࡞ۀΛ࣮ߦ͔ͨ͠ ʮஈ֊తʹߦ͑ͦ͏ͳ͜ͱ͔͚ͬͨͲɺ۩ମతʹͲ͏ਐΊͨͷ͔ʁʯ ʮΒͳ͍ΑΓͬͨํ͕Ϛγͷਫ਼ਆͰɺͰ͖Δͱ͜Ζ͔Βίπίπͱɺ։ൃ Λ̏ϲ݄ࢭΊͯ༗ࢤ͕ؤுΓ·ͨ͠ɻ࡞ۀΛੵΈ্͛ΒΕΔ͜ͱ͕͍Ͱ͢ɻʯ ࠶ݱੑͳͯ͘͢Έ·ͤΜɾɾɾ 40
ʮ࠷ۙΞϓϦέʔγϣϯ։ൃͤͣʹͣͬͱSentryΛݟΔࣄͯ͠ΔΜͩΑͶʯ ʮਏͦ͏ʯ 41
Ξϥʔτվળͱָ͍ͯ͠ࣄͰ͢ • ΞϥʔτͷൃੜݯΛḷ͍ͬͯ͘͜ͱͰͦͷΞϓϦέʔγϣϯͷཧղ͕ਂ· ΔɻΦϯϘʔσΟϯάλεΫͱͯ͠ྑ͍ ͱࢥ͏ɻ • ΞϓϦέʔγϣϯͱͯ͠ɺαʔϏεͱͯ͠ɺγεςϜͱͯ͠ɺ৫ͱͯ͠Ͳ͏ ͋Δ͖͔Λߟ͑Δ͖͔͚ͬɻࣗͷࢹ࠲͕มΘͬͨΑ͍͖͔͚ͬɻͱͯ Ͱ͖ͨͱࢥ͏ 42
ΤϥʔվળɺΞϥʔτվળྑ͍ͧʂ Ζ͏ʂʂʂʂʂʂʂʂʂ 43