Slide 1

Slide 1 text

A philosophy of software design (ޙ൒) 2022/6/22 @ MoneyForward ษڧձ

Slide 2

Slide 2 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa

Slide 3

Slide 3 text

A philosophy of software design • 2018೥ʹॳ൛͕ϦϦʔε͞Ε • 2020೥ʹୈೋ൛͕ϦϦʔε͞Εͨ • ๜୊Ͱ͍͏ͱʮιϑτ΢ΣΞઃܭͷ఩ֶʯ https://www.amazon.co.jp/dp/B07N1XLQ7D/

Slide 4

Slide 4 text

A philosophy of software design • ஶऀ͸δϣϯɾΦʔελʔϋ΢τ͞Μ • Stanford େֶͷίϯϐϡʔλαΠΤϯεڭत • Sprite OS (OS), Tcl.Tk(ϓϩάϥϛϯάݴޠ), RAMCloud (Ϋϥ΢υγεςϜ) ͳͲͳͲɺ੍ ࡞෺ଟ਺ https://web.stanford.edu/~ouster/cgi-bin/ home.php

Slide 5

Slide 5 text

A philosophy of software design લ൒·ͱΊ • Tactical Programming ͸΍ΊΑ͏ • Strategic Programming Λਪ঑ • ෳࡶ͞͸ґଘͱᐆດ͔͞Βى͖Δ • ෳࡶ͞͸มߋ૿େɺೝ஌ෛՙɺΑ͘஌Βͳ͍͜ͱΛ૿Ճͤ͞Δ • Strategic Programming ͸͜ΕΒΛߟ͑௚ͨ͢ΊͷҰॿͱͳΔ΋ͷ • ౤ࢿϚΠϯυͰߟ͑ͯϓϩάϥϛϯά͢Δ • ԿͳΒೋճઃܭͯ͠ΈΖɺͦ͏͢Ε͹ྑ͍ઃܭ͕Ͱ͖ΔΑ͏ʹͳΔ

Slide 6

Slide 6 text

ޙ൒͸࣮ફΑΓ

Slide 7

Slide 7 text

ίϝϯτʹ͍ͭͯ

Slide 8

Slide 8 text

ʮྑ͍ίʔυͳΒίϝϯτ͍Βͳ ͍ΑͶʯ ʮίϝϯτͬͯॻ͘ͷ͔͔࣌ؒΔ ΑͶʯ ʮͦΕʹίϝϯτݹ͘ͳΔΑͶʯ

Slide 9

Slide 9 text

ίϝϯτ͍Βͳ͍ΑͶ

Slide 10

Slide 10 text

Slide 11

Slide 11 text

ίϝϯτʹ͍ͭͯ • ʮΑ͘ઃܭ͞Ε͍ͯΔ࣮૷ʹ͸ίϝϯτ͸ཁ Βͳ͍ʯ • ͜Ε͸ʮʮʮ؁͍᠘ʯʯʯͰ͋Δ • ʮΞΠεΫϦʔϜ͸࣮͸݈߁ʹྑ͍ʯͱݴΘ ΕͯΔͷͱҰॹͩͱ͍͏ओு

Slide 12

Slide 12 text

ίϝϯτʹ͍ͭͯ • ίϝϯτͰ͔͠දݱͰ͖ͳ͍΋ͷ΋͋Δ • ίʔυͷཧղΛॿ͚ΔΑ͏ͳίϝϯτ͸ઈରॏ ཁ • Ͳ͏ͤॻ͘ͱͯ͠΋શମͷ͏ͪ10%ఔ౓͔ͩΒ ॻ͍ͨ΄͏͕ྑ͍ • ίϝϯτ͕ݹ͘ͳΔʁؾ͍ͮͨΒ௚ͤ͹͍͍

Slide 13

Slide 13 text

ίϝϯτʹ͍ͭͯ • ίϝϯτͰ͔͠දݱͰ͖ͳ͍΋ͷ΋͋Δ • ίʔυͷཧղΛॿ͚ΔΑ͏ͳίϝϯτ͸ઈରॏ ཁ • Ͳ͏ͤॻ͘ͱͯ͠΋શମͷ͏ͪ10%ఔ౓͔ͩΒ ॻ͍ͨ΄͏͕ྑ͍ • ίϝϯτ͕ݹ͘ͳΔʁؾ͍ͮͨΒ௚ͤ͹͍͍ ετϩϯάελΠϧ

Slide 14

Slide 14 text

͡Ό͋Ͳ͏͍͏ίϝϯτΛॻ ͚͹͍͍ͷ͔

Slide 15

Slide 15 text

͡Ό͋Ͳ͏͍͏ίϝϯτΛॻ͘ ͷ͕ྑ͍ͷ͔ • ίʔυن໿ͱಉ͘͡ίϝϯτʹ΋ن໿Λ࡞Ζ ͏ • Don't Repeat the Code ͷݪଇΛकΖ͏ • ΠϯλϑΣʔεͷίϝϯτͱ࣮૷ͷίϝϯτ ͸෼͚Α͏

Slide 16

Slide 16 text

ίϝϯτن໿ • ίϝϯτʹ΋Ұ؏ੑ͕ͳ͍ͱ͍͚ͳ͍ • ͬͪ͜ͷϞδϡʔϧʹ͸ίϝϯτ͕͋Δ͚Ͳɺ ͬͪ͜ʹ͸ͳ͍Έ͍ͨͳҰ؏ੑ͕อͨΕ͍ͯͳ͍ ͱζϧζϧָͳํʹྲྀΕͯॻ͔Εͳ͘ͳΔ • ಛʹݴޠʹυΩϡϝϯςʔγϣϯͷπʔϧ͕෇͍ ͍ͯΔ΋ͷ΋͋Δɻͦͷ৔߹͸πʔϧͷن໿ʹඞ ͣै͏ʢྫ: Javadoc, godoc, Doxygenʣɻ

Slide 17

Slide 17 text

Don't Repeat the Code ͷݪଇ • ίʔυʹॻ͍ͯ͋Δ͜ͱΛͨͩͦͷ··ίϝ ϯτʹॻ͘͜ͱΛ͠ͳ͍ // Add a horizontal scroll bar hScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); add(hScrollBar, BorderLayout.SOUTH); // Add a vertical scroll bar vScrollBar = new JScrollBar(JScrollBar.VERTICAL); add(vScrollBar, BorderLayout.EAST); // Initialize the caret-position related values caretX = 0; caretY = 0; caretMemX = null;

Slide 18

Slide 18 text

Don't Repeat the Code ͷݪଇ • ίʔυʹॻ͍ͯ͋Δ͜ͱΛͨͩͦͷ··ίϝ ϯτʹॻ͘͜ͱΛ͠ͳ͍ // Add a horizontal scroll bar hScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); add(hScrollBar, BorderLayout.SOUTH); // Add a vertical scroll bar vScrollBar = new JScrollBar(JScrollBar.VERTICAL); add(vScrollBar, BorderLayout.EAST); // Initialize the caret-position related values caretX = 0; caretY = 0; caretMemX = null; ͜͏͍͏ίʔυΛݟͨΒٯʹո͠Ή

Slide 19

Slide 19 text

ΠϯλϑΣʔεͷίϝϯτ • ࢖ΘΕํͷ࣮ྫ • ࢖͏্Ͱͷ஫ҙࣄ߲ • ந৅Խ͞ΕͯΔσβΠϯͷৄࡉΛॻ͘ ʢLinkedListͰ࣮૷͞Ε͍ͯΔ౳ʣ

Slide 20

Slide 20 text

ΠϯλϑΣʔεͷίϝϯτ • ࢖͍ํ΍࢖͏্Ͱͷ஫ҙࣄ߲͕ॻ͍ͯ͋Δ /* HTTP ͷαʔόͱΫϥΠΞϯτͷ࣮૷Λఏڙ͢ΔΠϯλϑΣʔε Get, Head, Post ͳͲͷ HTTP ϦΫΤετΛૹΔ৔߹ɺԼهͷํ๏ͰૹΔ resp, err := http.Get("http://example.com/") ... listenAndServeؔ਺Λ࣮ߦͨ͠ࡍʹطʹಉ͡ϙʔτΛlisten͍ͯͨ͠৔߹ FatalΤϥʔͱͳΓɺىಈʹࣦഊ͢Δɻ */

Slide 21

Slide 21 text

࣮૷ͷίϝϯτ • Կނ͜͏͔ͨ͠ʢWhyʣ • ԿΛ͍ͯ͠Δ͔ͷ୺తઆ໌ʢWhatʣ • (Don't Repeat the Code ʹͳΒͳ͍Α͏ʹ)

Slide 22

Slide 22 text

࣮૷ͷίϝϯτ • ΤϥʔճආͷͨΊͷϫʔΫΞϥ΢ϯυ (Why) try { } catch(e) { // ຊདྷ͜͜ͰΩϟον͢Δ΂͖Ͱ͸ͳ͍͕ϥΠϒϥϦ͕ xxx Error Λ // throw ͢ΔͨΊɺҰ࣌తʹΩϟον͠ɺਖ਼ৗॲཧʹ໭͢ɻ // ຊମ΁ͷ Issue 12345 ͕औΓࠐ·ΕͨΒຊॲཧ͸ෆཁ }

Slide 23

Slide 23 text

࣮૷ͷίϝϯτ • ҰൃͰԿ΍ͬͯΔ͔Θ͔Βͳ͍࣌ͷղઆ // ೋ࣍ݩ഑ྻͷ֤഑ྻ͝ͱͷฏۉ஋ΛऔΔ let mut averages = vec![]; for col in 0..len { let mut sum = 0; for row in 0..nums[col].len() { sum += nums[col][row]; } averages.push(sum / nums[col].len()); }

Slide 24

Slide 24 text

ΈΜͳ͕࢖͏Α͏ͳϞδϡʔϧͳ ΒURLΛίϝϯτʹॻ͘ͷ΋͋Γ /* xxx ϩάͷਖ਼نԽΛߦ͏ؔ਺ log.format("%s", foobarbaz); σβΠϯͷৄࡉ͸ԼهͷURLΛࢀর͢Δ͜ͱ https://example.com/foobarbaz */

Slide 25

Slide 25 text

ίϝϯτ͍ͭॻ͔͘࿦૪ • Ͱ͖Ε͹ΠϯλϑΣʔεͷίϝϯτ͸࣮૷લʹ ͪΌΜͱॻ͘ͷ͕๬·͍͠ͱͷ͜ͱ • ந৅Խ͢ΔͨΊͷσβΠϯϓϩηεͷҰ෦ͩͱ ଊ͑ͯ࠷ॳʹ΍Δ΂͖ • ࣮૷ͨ͠ΒมΘΔ͔Β΍Γͨ͘ͳ͍ͱ͍͏ਓ͸ σβΠϯϓϩηε͕ෆे෼ͳͷͩͱ੾ΓࣺͯΔ

Slide 26

Slide 26 text

ίϝϯτ͍ͭॻ͔͘࿦૪ • ޙʹ׳Ε͹ͳΔ΄Ͳਏ͘ͳΔΜ͔ͩΒࠓॻ͜͏ • චऀ͸ίϝϯτΛॻ͍ͯΔͱ͖͕Ұ൪ָ͍࣌ͩ͠ͱࢥ͍ͬͯ Δͱͷ͜ͱ • ୺తͰ໌շͳίϝϯτ͕ॻ͚ͨ ≒ ઃܭ͕͏·͘ݴͬͯΔূڌ • ٯʹ্ख͘ίϝϯτ͕ॻ͚ͳ͍ͱ͍͏͜ͱ͸ઃܭ͕͏·͘ ߦͬͯͳ͍ͷ͔΋͠Εͳ͍ • ͜͏͍͏ࢥ͍Λ࣋ͪͳ͕ΒίϝϯτΛָ͠ΜͰॻ͖·͠ΐ͏

Slide 27

Slide 27 text

ίϝϯτ͍ͭॻ͔͘࿦૪ • ޙʹ׳Ε͹ͳΔ΄Ͳਏ͘ͳΔΜ͔ͩΒࠓॻ͜͏ • චऀ͸ίϝϯτΛॻ͍ͯΔͱ͖͕Ұ൪ָ͍࣌ͩ͠ͱࢥ͍ͬͯ Δͱͷ͜ͱ • ୺తͰ໌շͳίϝϯτ͕ॻ͚ͨ ≒ ઃܭ͕͏·͘ݴͬͯΔূڌ • ٯʹ্ख͘ίϝϯτ͕ॻ͚ͳ͍ͱ͍͏͜ͱ͸ઃܭ͕͏·͘ ߦͬͯͳ͍ͷ͔΋͠Εͳ͍ • ͜͏͍͏ࢥ͍Λ࣋ͪͳ͕ΒίϝϯτΛָ͠ΜͰॻ͖·͠ΐ͏

Slide 28

Slide 28 text

໊લ෇͚ʹ͍ͭͯ

Slide 29

Slide 29 text

໊લ෇͚େࣄ • චऀ͕ੲͱ͋Δ஋ʹ block ͱ͍͏ม਺Λ෇͚ͨ • ͦͷϒϩοΫ͸ϋʔυσΟεΫͷ෺ཧϒϩοΫͷҙ ຯͰ෇͚͍ͯͨɻ • ͔͠͠ɺଞͷॴͰ͸࿦ཧϒϩοΫʹ΋ಉ͡ม਺ block ͕͍͍ͭͯͨɻ • ͜ΕʹΑΓɺΑ͘Θ͔Βͳ͍όά͕ੜ·Ε͍ͯͨ

Slide 30

Slide 30 text

ؓ࿩ٳ୊ • ෺ཧϒϩοΫͱ࿦ཧϒϩοΫ • ෺ཧϒϩοΫ͸σΟεΫίϯτϩʔϥ͕ಡΈ ॻ͖͢Δ࣌ͷϒϩοΫͷ͜ͱ • ࿦ཧϒϩοΫ͸ͦΕΒΛ·ͱΊͨܗͰΧʔ ωϧ͕ѻ͏ϑΝΠϧಡΈॻ͖ͷࡍͷϒϩοΫ

Slide 31

Slide 31 text

໊લ෇͚େࣄ • ྑ໊͍લ͸ਖ਼֬͞ͱҰ؏ੑΛ࣋ͭ • Ұ؏ੑ • ಉ͡ҙຯͷ΋ͷʹಉ໊͡લ͕͍͍ͭͯΔ͜ͱ • ҧ͏ҙຯͷ΋ͷʹಉ໊͡લ͕͍͍ͭͯͳ͍͜ ͱʢblockͷྫ͸͜ͷ৚݅ҧ൓ʣ

Slide 32

Slide 32 text

໊લ෇͚େࣄ • ਖ਼֬͞ • ҙຯ͕े෼ʹڱ͍ํ͕ྑ͍ • ᐆດͰ޿͍ҙຯ͕औΕͯ͠·͏ͱਖ਼͕֬͞ ࣦΘΕΔ • blockͷྫ͸ҙຯ͕ᐆດͩͬͨ

Slide 33

Slide 33 text

໊લ෇͚େࣄ • ͡Ό͋΋ͷ͘͢͝௕͍ͱΑ͍ͷ͔ͱ͍͏ͱͦ ͏Ͱ͸ͳ͍ • ಡΉଆ͕ཧղͰ͖Δ͔ʁΛ࠷ॳʹߟ͑Δ • ॻ͘ଆͷ౎߹Ͱ͍͖ͳΓΘʔͬͱॻ͘ͷ͸μ ϝɺಡΉଆͷ໨ઢͰߟ͑Δඞཁ͕͋Δ

Slide 34

Slide 34 text

ͪͳΈʹҰจࣈม਺ʹ͍ͭͯ • iͱ͔jͱ͔͸ϧʔϓͷม਺ͳΒ΋͸΍ڞ௨ೝࣝͳͷͰ ࢖͍͍ͬͯ • ͨͩ Go ͸จԽతʹ୹͍ม਺Λ޷Ή͕ɺಡΉଆ͕ͦΕ Ͱे෼ʹཧղͰ͖Δ͔ʁΛߟ͑Δ΂͖Ͱ͋Δͱචऀ͸ ओு͢Δ • ॻ͘ଆͷ౎߹Ͱ1จࣈͷม਺ʹ͢ΔͷͰ͸ͳ͘ɺಡΉ ଆ΋͜ΕͰཧղͰ͖Δͱࢥ͏ͳΒՄೳͩͱ͍͏ཧ࿦

Slide 35

Slide 35 text

طଘίʔυΛमਖ਼͢Δ࣌

Slide 36

Slide 36 text

طଘίʔυͷमਖ਼ • ࠷ॳ͔Βਖ਼͍͠σβΠϯͷ΋ͷ͸ଘࡏ͠ͳ͍ • ண࣮ʹमਖ਼͍ͯ͘͠ඞཁ͕͋Δ • adhoc ʹ tactical ͳίʔυΛॻ͘ͷͰ͸ͳ͘ɺ strategic ʹ ઃܭΛͪΌΜͱ͠ͳ͕ΒίʔυΛॻ͖ɺͦΕΛܧଓ͢Δ • ίʔυίϝϯτ΋ͳΔ΂ͪ͘ΌΜͱॻ͘ • ίϝϯτ͸ந৅Խͨ͠΋ͷ΋༻ҙ͠ɺσβΠϯυΩϡϝϯτ ͳͲʹ΋൓ө͓͖ͯ͠ɺͲ͔͜ΒͰ΋ݟΕΔΑ͏ʹ͓ͯ͘͠

Slide 37

Slide 37 text

ίʔυΛ໌շʹͤΑ

Slide 38

Slide 38 text

ίʔυΛ໌շʹͤΑ • ໌շ͞ΛอͭͨΊͷςΫχοΫ • ඞཁͳ৘ใ͚ͩʹߜͬͨίʔυΛॻ͘ • ίʔυن໿ΛकΔ • ॏཁͳ৘ใΛϋΠϥΠτ͢Δ

Slide 39

Slide 39 text

ίʔυΛ໌շʹͤΑ • ඞཁͳ৘ใ͚ͩʹߜͬͨίʔυΛॻ͘ • ୯Ұ੹຿ͷݪଇ • ৑௕ͰෳࡶͳॲཧΛ͠ͳ͍͜ͱʢKeep It Simpleʣ • ந৅Խ΍ϨΞέʔεͷߟྀΛߜΔ

Slide 40

Slide 40 text

ίʔυΛ໌շʹͤΑ • ίʔυن໿ΛकΔ • ۭന΍վߦΛͪΌΜͱकΔ • ίϝϯτ͕ඞཁͳՕॴʹ͸ͪΌΜͱೖΕΔ • ݱ୅ͳΒ linter / formatter ͕උΘͬͯΔݴ ޠ΋͋ΔͷͰɺͦΕͰ΋͋Γ

Slide 41

Slide 41 text

ίʔυΛ໌շʹͤΑ • ॏཁͳ৘ใʹϋΠϥΠτ͢Δ • ίϝϯτΛॻ͘ • Ϡό͍ͱ͖͸Ϡό͍͜ͱ͕ҰൃͰΘ͔ΔΑ͏ͳ໋໊ʹ͢Δ • dangelouslySetInnerHTML • SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

Slide 42

Slide 42 text

ιϑτ΢ΣΞτϨϯυͱͷൺֱ

Slide 43

Slide 43 text

͜Ε·ͰͷτϨϯυͱ͜ͷຊͱ ͷཱͪҐஔൺֱ • ޙ൒ͷҰ൪໘ന͍ճ • ͜Ε·Ͱग़͖ͯͨιϑτ΢ΣΞͷτϨϯυʹରͯࣗ͠ ෼ͷཱ৔Λ໌֬ʹ͢ΔՕॴ • ͳΜͱͳ͘ޙॻ͖ίϝϯτײ͕͋ͬͯҰ൪޷͖ͳՕॴ • ٯʹஶऀͷओ؍తͳ෦෼ͳͷͰɺ࿩൒෼ʹฉ͍͓ͯ͘ ͷ͕ྑͦ͞͏

Slide 44

Slide 44 text

ΦϒδΣΫτࢦ޲ϓϩάϥϛϯά

Slide 45

Slide 45 text

ΦϒδΣΫτࢦ޲ϓϩάϥϛϯ ά • ෳࡶ͞ղফͷͨΊʹੜ·Εͨͱ͞Ε͍ͯΔ͕ຊ࣭త ʹෳࡶ͞ͷղফ͸อূͯ͘͠Εͳ͍ͱࠅධ͍ͯ͠Δ • ෳࡶͳ࣮૷͕Ӆṭ͞ΕΔͱ͍͏ΑΓ΋ෳࡶͳ··ʹ ͳΔ • ಛʹܧঝ͸ෳࡶ͞ΛӅṭͰ͖ͣɺ಺෦ͷঢ়ଶ͕ݟ͑ ΔΑ͏ʹͳΔݴޠ͕ଟ͍ɺ݁Ռ࣮૷͕ΑΓෳࡶʹͳ Δ

Slide 46

Slide 46 text

ΞδϟΠϧ։ൃ

Slide 47

Slide 47 text

ΞδϟΠϧ։ൃ • εέδϡʔϧΛࡉ͔͘੾ͬͯΠςϨʔγϣϯΛճͯ͠։ ൃ͢Δ෦෼͸ධՁ͍ͯ͠Δ • ҰํͰػೳʹ஫໨͞Ε͍͗ͯ͢Δ • ந৅Խͨ͠ઃܭΛ͢Δ࣌ؒΛอূͯ͘͠ΕΔΘ͚Ͱ͸ͳ ͍ • Ή͠Ζ࣮૷͢Δํʹ༠ಋ͞Ε͕ͪͳͷͰ݁Ռ tactical programming ʹͳΓ͕ͪ

Slide 48

Slide 48 text

Ϣχοτςετ

Slide 49

Slide 49 text

Ϣχοτςετ • ࣗ෼ͷΠϯλϑΣʔεΛςετͨ͠ΓɺϦ ϑΝΫλϦϯάΛॿ͚ͯ͘ΕΔͱ͍͏ҙຯͰ ߴ͘ධՁ͍ͯ͠Δ • ͔͠͠ɺςετۦಈ։ൃɺಛʹςετϑΝʔε τͳߟ͑ํʹؔͯ͠͸࠷ॳ͔Βࡉ෦Λදݱ͠ Α͏ͱ͍͗ͯͯ͢͠ɺߴϨϕϧͳઃܭͷݟ௚ ͠ʹͳΓʹ͍͘ͱ͍͏఺Λ൷൑͍ͯ͠Δ

Slide 50

Slide 50 text

σβΠϯύλʔϯ

Slide 51

Slide 51 text

σβΠϯύλʔϯ • σβΠϯΛύλʔϯԽͯ͠ݴޠԽͨ͜͠ͱ͸ߴ͘ධՁ ͍ͯ͠Δ • ҰํͰɺશͯΛύλʔϯʹ͸ΊΑ͏ͱͯ͠͠·͏ਓͨ ͕ͪଟ͘ͳΔࣄΛݒ೦͍ͯ͠Δ • ύλʔϯ͸ແཧʹ࢖͏΋ͷͰ͸ͳ͍ɻ • ϋϚΔ΋ͷ͕͋ͬͨΒ࢖͑͹Α͍͠ɺϋϚΒͳ͍ͳΒ ແཧʹ࢖Θͳͯ͘Α͍ɻ

Slide 52

Slide 52 text

ιϑτ΢ΣΞτϨϯυ • ৽͍͠τϨϯυ͕͋ͬͨΒɺ·ͣҎԼͷࣄΛߟ͑ͯ΄ ͍͠ • ιϑτ΢ΣΞ։ൃͷෳࡶ͞ΛͲ͏΍ͬͯղফ͠Α͏ ͱ͍ͯ͠Δͷ͔ • Ͳ͕͜લͷτϨϯυͱൺֱͯ͠ྑ͘ͳΔͷ͔ • ࣗ෼ͷߟ͑ํΛ͜Ε·ͰͷτϨϯυͱൺ্ֱͨ͠ Ͱਂ͘ߟ͑Δ͜ͱ

Slide 53

Slide 53 text

࠷ޙʹ

Slide 54

Slide 54 text

චऀ͕఻͍͑ͨ͜ͱ • σβΠϯͷೳྗͱ͸ʮԿ͕ॏཁͰԿ͕ॏཁ͡Όͳ͍ ͔Λऔࣺબ୒Ͱ͖ΔೳྗʯͰ͋Δ • ؒҧ͑Δ͜ͱ͸୭Ͱ΋͋ΔɺͰ΋ͦΕΛͪΌΜͱݟ ௚͢͜ͱɺ޿͘ਂ͘ߟ͑ͯࣗ෼Ͱऔࣺબ୒͢Δ͜ͱ • ͦΕ͕ͦ͜ྑ͍ιϑτ΢ΣΞΤϯδχΞʹͳΔϓϩ ηεͰ͋Γɺྑ͍σβΠϯೳྗΛ਎ʹ͚ͭΔํ๏Ͱ ͋Δ

Slide 55

Slide 55 text

·ͱΊ • ίϝϯτΛͪΌΜͱॻ͜͏ • ໋໊͸Ұ؏ੑ͕͋ͬͯਖ਼֬ʹ • ίʔυن໿ʹैͬͯ໌շͳίʔυΛॻ͘ • ιϑτ΢ΣΞτϨϯυΛࣗ෼ͷߟ͑ͱൺֱ͠Α͏ • ࣗ෼Ͱߟ͑ͯࣗ෼ͰৼΓฦΔɺͦͷ্Ͱऔࣺબ୒͕ Ͱ͖ΔΑ͏ʹͳΖ͏