Slide 1

Slide 1 text

PHPόʔδϣϯΞοϓͱ ܾࡁϦϓϨΠεΛࢧ͑ͨ Ϣχοτςετ 2018/8/7 (Tue) ϨΨγʔίʔυվֵʂUT/CIͰWebαʔϏεͷٕज़తෛ࠴Λղফ͢ΔऔΓ૊Έ BASEגࣜձࣾ ౦ޱ࿨ᏻ @Khigashiguchi

Slide 2

Slide 2 text

ʮϨΨγʔίʔυʯͱ͸ IUUQTCBTFDPOOQBTTDPNFWFOU

Slide 3

Slide 3 text

–ϚΠέϧɾCɾϑΣβʔζஶʰϨΨγʔίʔυվળΨΠυʱ “ϨΨγʔίʔυͱ͸ɺ ୯ʹςετͷͳ͍ίʔυͰ͢ɻ” https://www.shoeisha.co.jp/book/detail/9784798116839

Slide 4

Slide 4 text

BASEʹͱͬͯͷ ʮϨΨγʔίʔυվֵʯ • ςετ͕ͳ͍ίʔυʹରͯ͠Ϣχοτςε τΛॻ͍͍ͯ͘

Slide 5

Slide 5 text

“ίʔυΛมߋ͢ΔͨΊʹ͸ɺςετΛ੔ උ͢Δඞཁ͕͋Δɻଟ͘ͷ৔߹͸ɺςε τΛ੔උ͢ΔͨΊʹ͸ɺίʔυΛมߋ͢ Δඞཁ͕͋Δɻ” ʢϨΨγʔίʔυͷδϨϯϚʣ –ʰϨΨγʔίʔυվળΨΠυʱ

Slide 6

Slide 6 text

BASEʹͱͬͯͷ ʮϨΨγʔίʔυվֵʯ • ςετ͕ͳ͍ίʔυʹରͯ͠Ϣχοτςε τΛॻ͍͍ͯ͘ • ʮϨΨγʔίʔυͷδϨϯϚʯʹటषཱ͘ ͪ޲͔͏

Slide 7

Slide 7 text

໨࣍ • ࣗݾ঺հ • BASEͷഎܠ • Ϣχοτςετͷʮ࢖͍ํʯ • Ϣχοτςετͷʮ՝୊ʯͱʮରࡦʯ • ͜Ε͔Βͷʮ՝୊ʯ • ·ͱΊ

Slide 8

Slide 8 text

ࣗݾ঺հ • ౦ޱ ࿨ᏻ @Khigashiguchi • BASE, Inc / BASE Product Division • Server Side EngineerʢPHP / Goʣ • Works • EίϚʔεϓϥοτϑΥʔϜ ʮBASEʯͷܾࡁྖҬ • PHP/CakePHPͷόʔδϣϯΞοϓ

Slide 9

Slide 9 text

PHPΧϯϑΝϨϯεؔ੢2018ʹͯɺ ςετʹ͍ͭͯͷʮݸਓతʯͷ࿩ IUUQTTQFBLFSEFDLDPNLIJHBTIJHVDIJUFTVUPXPTIVJUBLPUPLBOBJFOTJOJBLBUFTVUPXPTIV LFSVZPVOJOBSVNBUFZBUVUBLPUPBUQIQLBOIVBSFOTVHVBOYJ

Slide 10

Slide 10 text

BASEͷϛογϣϯͱࣄۀ Ձ஋ͷަ׵ΛΑΓγϯϓϧʹ͠ɺ ੈքதͷਓʑ͕࠷దͳܦࡁ׆ಈΛߦ͑ΔΑ͏ʹ͢Δ MISSION ແྉʗ؆୯ͳωοτγϣοϓ࡞੒ͷ࢓૊Έ ˍ ʮཉ͍͠ʯ͕ݟ͔ͭΔγϣοϐϯάΞϓϦ γϯϓϧͳΦϯϥΠϯܾࡁιϦϡʔγϣϯ ɾ QRίʔυͳͲγϯϓϧͳܾࡁखஈ ※PAYגࣜձࣾʢBASEגࣜձࣾ100%ࢠձࣾʣʹͯఏڙ

Slide 11

Slide 11 text

BASEࣄۀ - ֓ཁ ߪೖऀ޲͚ͷγϣοϓ͕ू·Δγϣοϐϯά Ϟʔϧɻ EίϚʔεϓϥοτϑΥʔϜʮBASEʯ EίϚʔεϓϥοτϑΥʔϜʮBASEʯ BASE͸ੈͷதͷʮՁ஋ͷަ׵ΛΑΓγϯϓϧʹʯ͢ΔͨΊͷ ECϓϥοτϑΥʔϜࣄۀͰ͢ ωοτγϣοϓ࡞੒αʔϏεʮBASEʯ γϣοϐϯάΞϓϦʮBASEʯ ళฮʗൢചऀ޲͚ͷγϯϓϧɾֹ݄ແྉͷ γϣοϓ࡞੒ιϦϡʔγϣϯɻ

Slide 12

Slide 12 text

BASEͷഎܠ

Slide 13

Slide 13 text

BASEͷഎܠ(~2017೥) • 6೥໨(2012೥ϦϦʔε) • ଟ͘ͷαʔϏεͰPHP5.3/CakePHP2.3Λ ར༻ • ςετ͕ॻ͔Ε͍ͯΔαʔϏε͕গͳ͔ͬ ͨ

Slide 14

Slide 14 text

ϨΨγʔࠀ෰ͷʮ͖͔͚ͬʯ • ςετΛॻ͘͜ͱʹΑͬͯɺΑΓ҆શʹγ εςϜΛѻ͍͍ͨϞνϕʔγϣϯ • ฤूͯ͠فΔʢEdit and Prayʣ • อޢͯ͠มߋ͢ΔʢCover and Modifyʣ • PHPόʔδϣϯΞοϓPJɾܾࡁؔ࿈PJͳ ͲʹΑΔϢχοτςετͷॆ࣮Խ • ʢܾࡁؔ࿈PJ=τʔΫϯܾࡁରԠɾܾࡁϦϓϨΠε… etcʣ

Slide 15

Slide 15 text

ʮPHPόʔδϣϯΞοϓʯ • 2016೥͔Β࢝·ͬͨPHPɾCakePHPͷ όʔδϣϯΞοϓσʔτ • PHP5.3 -> PHP7.1 • CakePHP2.3~2.10 -> CakePHP2.10(2.x ࠷৽) • 2018೥5݄ʹ׬ྃ

Slide 16

Slide 16 text

ৄ͘͠͸ɺʮBASEɹPHPΞοϓσʔτʯͰݕࡧ IUUQTEFWCMPHUIFCBTFJOFOUSZ

Slide 17

Slide 17 text

ʮܾࡁؔ࿈PJʯ • BASE͸ओʹҎԼ5ͭͷܾࡁํ๏ΛରԠ • ΫϨδοτΧʔυܾࡁɺίϯϏχܾࡁɾPay-easyɺۜ ߦৼࠐɺޙ෷͍ܾࡁɺΩϟϦΞܾࡁ • ද୊ͷʮܾࡁϦϓϨΠεʯ • = ޙ෷͍ܾࡁϦϓϨΠε IUUQTUIFCBTFJOQBZNFOUT

Slide 18

Slide 18 text

Ϣχοτςετͷʮ࢖͍ํʯ

Slide 19

Slide 19 text

PHPΞοϓσʔτ&ςετ • 50ສళฮͷϢʔβʔͷ͍ΔαʔϏεͷ PHPɾCakePHPͷόʔδϣϯΛ҆શʹ্͛ Δ • ςετΧόϨοδΛ্͛ͯɺอޢൣғΛ޿ ͛Δ • ControllerϨϕϧ͔Β޿ൣғͷΧόϨοδ Λर͏ 

Slide 20

Slide 20 text

ܾࡁϦϓϨΠε&ςετ • ηϯγςΟϒͳܾࡁʹରͯ͠Կࣄ΋ͳ҆͘ શʹ׬਱͢Δඞཁੑ • طଘίʔυͷৼΔ෣͍Λཧղ͢Δ • طଘͷৼΔ෣͍Λอޢ͢Δ • อޢ্ͨ͠ͰɺϦϑΝΫλϦϯάɾίʔυ ௥ՃΛߦ͏ɻ 

Slide 21

Slide 21 text

> طଘͷৼΔ෣͍Λอޢ͢Δ

Slide 22

Slide 22 text

ʮ࢓༷Խςετʯ • “characterization test” • ίʔυͷطଘͷৼΔ෣͍Λ໌Β͔ʹ͢Δς ετ • ॲཧ಺Ͱૢ࡞͢Δཁૉʹର͢Δ࣮ࢪ͍ͯ͠ ͘ • Viewʹηοτ͞ΕΔ஋ • Sessionͷ஋ • Dataͷొ࿥/ߋ৽ • FUD 

Slide 23

Slide 23 text

ʮௐࠪతϦϑΝΫλϦϯάʯ • “exploratory refactoring” • طଘίʔυʹର͢ΔཧղΛਂΊΔ • “ʮະ஌΁ͷڪΕʯΛࠀ෰͢Δ࠷ྑͷํ๏͸ɺͦͷ ίʔυʹඈͼࠐΜͰɺ͍͡Γ࢝ΊΔ͜ͱͩɻ” (ʰϨΨ γʔιϑτ΢ΣΞվળΨΠυʱ) • ཧղΛਂΊΔͨΊิॿͱͯ͠ʮ࢓༷Խςε τʯΛߦ͏ɻ  https://www.shoeisha.co.jp/book/detail/9784798145143

Slide 24

Slide 24 text

࢓༷Խςετͷखॱ 1. ςετίʔυͷதͰର৅ͷίʔυΛݺͼ ग़͢ 2. ࣦഊ͢ΔͱΘ͔͍ͬͯΔද໌Λॻ͘ 3. ࣦഊͨ݁͠Ռ͔Β࣮ࡍͷৼΔ෣͍Λ֬ೝ ͢Δ 4. ίʔυ͕࣮ݱ͢ΔৼΔ෣͍Λظ଴͢ΔΑ ͏ʹɺςετΛมߋ͢Δ 5. Ҏ্ͷखॱΛ܁Γฦ͢ 

Slide 25

Slide 25 text

࢓༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ => ‘post’] ); 1. ςετίʔυͷதͰର৅ͷίʔυΛݺͼग़͢ɻ

Slide 26

Slide 26 text

࢓༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ => ‘post’] ); $expected = []; $this->assertSame($expected, $this->vars); 2. ࣦഊ͢ΔͱΘ͔͍ͬͯΔද໌Λॻ͘

Slide 27

Slide 27 text

࢓༷ԽςετͷਐΊํʢྫʣ $ ./Console/cake test app —-stderr Controller/SampleController PHPUnit 5.7.27 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 19.32 seconds, Memory: 16.00MB There was 1 failure: --- Expected +++ Actual @@ @@ -Array &0 () +Array &0 ( ‘result’ => [‘success’] ) 3. ࣦഊͨ݁͠Ռ͔Β࣮ࡍͷৼΔ෣͍Λ֬ೝ͢Δ

Slide 28

Slide 28 text

࢓༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ => ‘post’] ); $expected = [ ‘result’ => [‘success’] ]; $this->assertSame($expected, $this->vars); 4. ίʔυ͕࣮ݱ͢ΔৼΔ෣͍Λظ଴͢ΔΑ͏ ʹɺςετΛมߋ͢Δ 5. Ҏ্ͷखॱΛ܁Γฦ͢

Slide 29

Slide 29 text

Ϣχοτςετͷ ʮ՝୊ʯͱʮରࡦʯ

Slide 30

Slide 30 text

Ϣχοτςετͷʮ՝୊ʯ • ςετ͠ʹ͍͘ίʔυ • ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ • ഁ୼͠΍͍͢ςετ

Slide 31

Slide 31 text

՝୊ ςετ͠ʹ͍͘ίʔυ

Slide 32

Slide 32 text

ςετ͠ʹ͍͘ίʔυ • ςετ͕ͳ͍ίʔυ͸ɺςετ͠ʹ͍͘ ίʔυͰ͋Δ͜ͱ͕ଟ͍ • ֎෦઀ଓΛؚΉ࣮૷ͱͷີ݁߹ • ܾࡁγεςϜɾAWS • ੹຿ͷେ͖͍ϝιου 

Slide 33

Slide 33 text

“ίʔυΛมߋ͢ΔͨΊʹ͸ɺςετΛ੔ උ͢Δඞཁ͕͋Δɻଟ͘ͷ৔߹͸ɺςε τΛ੔උ͢ΔͨΊʹ͸ɺίʔυΛมߋ͢ Δඞཁ͕͋Δɻ” ʢϨΨγʔίʔυͷδϨϯϚʣ –ʰϨΨγʔίʔυվળΨΠυʱ

Slide 34

Slide 34 text

ςετ͠ʹ͍͘ίʔυ • ςετ͕͔͚ΔΑ͏ʹॻ͖׵͑Δ • ີ݁߹ΛMockΛࠩ͠ࠐΊΔஈ֊·Ͱղফ ͢Δ • ςετ࣌ʹMockΛࠩ͠ࠐΉ • ֎෦࿈ܞͳͲΛؚΉςετΛߦ͏ࡍɺ֘ ౰ΫϥεΛMockʹஔ͖׵͑Δ • ֎෦࿈ܞͷৼΔ෣͍ΛMock͢Δ 

Slide 35

Slide 35 text

ີ݁߹Λղফ͢Δྫ // Before public function charge($order) { $manager = new PaymentManager(); $result = $manager->charge($order); // ܾࡁγεςϜʹ௨஌ } PaymentManagerͱີ݁߹ɺ Mock΁ͷࠩ͠ସ͕͑೉͍͠ɻ

Slide 36

Slide 36 text

ີ݁߹Λղফ͢Δྫ // After public function __construct($PaymentManager = null) { $this->manager = $PaymentManager ?? new PaymentManager(); } public function charge($order) { $result = $this->manager->charge($order); // ܾࡁγεςϜʹ௨஌ } Constructor Injection ίϯετϥΫλͷҾ਺Ͱ౉ͤΔΑ͏ʹ͢Δ ͜ͱͰɺMock΁ͷࠩ͠ସ͑Λ༰қʹ͢Δɻ

Slide 37

Slide 37 text

PHPUnitͰͷMock // mock objectΛ࡞Δ $mock = $this->getMockBuilder(Sample::class) ->setMethods(['update']) ->getMock(); // mock objectͷϝιουͷظ଴஋ͱฦ͢஋Λఆٛ $mock->expects($this->once()) ->method('update') ->with($this->equalTo(‘param1')) ->will($this->returnValue(true); // Constructor injection͢Δ৔߹ $target = new Target($mock); IUUQTQIQVOJUEFNBOVBMFOUFTUEPVCMFTIUNM ৄࡉ͸ɺʮPHPUnit mockʯͰݕࡧ

Slide 38

Slide 38 text

ςετ͠ʹ͍͘ίʔυͷน • ςετ͠ʹ͍͘ίʔυͷղফʹ͕͔͔࣌ؒ Δ৔߹ • ີ݁߹Λղ͘ͷʹେ͖ͳϦϑΝΫλϦϯάΛཁ͢Δ • ґଘ͍ͯ͠ΔΫϥεͷதͰɺ࣮ࡍʹ֎෦௨৴Λߦ͏ίʔ υΛؚΉͱ͍ͬͨ৔߹ • ςετ͠ʹ͍͘Օॴʹରͯ͠Ͳ͏खΛೖΕ Δ͔ɻ • runkitΛ׆༻ͯ͠ςετΛॻ͘ 

Slide 39

Slide 39 text

runkit • runkit֦ுϞδϡʔϧ • ఆ਺ɾϢʔβʔఆٛؔ਺ ͓ΑͼϢʔβʔఆ ٛΫϥεΛมߋ͢ΔػೳΛఏڙ  IUUQQIQOFUNBOVBMKBJOUSPSVOLJUQIQ

Slide 40

Slide 40 text

runkitΛ༻͍ͨςετ // ର৅ؔ਺ఆٛΛॻ͖׵͑Δ $val = <<<_XML__ success __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’); runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετର৅ίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖׵͑ͨؔ਺ఆٛΛ΋ͱʹ໭͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); ؔ਺ఆٛͷόοΫΞοϓΛऔΓɺظ଴͢ΔϨεϙ ϯε($val)Λฦ͢Α͏ʹ࠶ఆٛ͢Δɻ

Slide 41

Slide 41 text

runkitΛ༻͍ͨςετ // ର৅ؔ਺ఆٛΛॻ͖׵͑Δ $val = <<<_XML__ success __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’); runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετର৅ίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖׵͑ͨؔ਺ఆٛΛ΋ͱʹ໭͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); ςετର৅ίʔυΛ࣮ߦ

Slide 42

Slide 42 text

runkitΛ༻͍ͨςετ // ର৅ؔ਺ఆٛΛॻ͖׵͑Δ $val = <<<_XML__ success __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’); runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετର৅ίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖׵͑ͨؔ਺ఆٛΛ΋ͱʹ໭͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); όοΫΞοϓΛऔ͍ͬͯͨ΋ͱ΋ͱͷؔ਺ఆٛʹ ࠶ఆٛ͠௚͢ɻ

Slide 43

Slide 43 text

ৄ͘͠͸ɺ@kunit͞ΜͷQiitaهࣄΛࢀর IUUQTRJJUBDPNLVOJUJUFNTDBBEFFDG

Slide 44

Slide 44 text

՝୊ ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ

Slide 45

Slide 45 text

–ΫϦεɾόʔνϟϧஶʰϨΨγʔιϑτ΢ΣΞվળΨΠυʱ “ίʔυ͕ϨΨγʔʹʢͱ͍͏ͷ͸ɺେ ͬ͟ͺʹݴͬͯɺอक͕ࠔ೉ʹʣͳΔʹ ͸ɺଟ͘ͷཧ༝͕͋Γ·͕͢ɺ΄ͱΜͲ ͷݪҼ͸ɺٕज़Ͱ͸ͳ͘ਓؒʹؔ܎ͯ͠ ͍·͢ɻ” https://www.shoeisha.co.jp/book/detail/9784798145143

Slide 46

Slide 46 text

ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ • ςετΛॻ͘ਓɾॻ͔ͳ͍ਓʹ૚͕෼͔Ε ͍ͯ͘ • ςετΛॻ͍ͨ͜ͱ͕ͳ͍ͱɺ࠷ॳͷҰา ͕౿Έग़ͮ͠Β͘ɺτϥϒϧγϡʔςΟϯ άʹ΋͕͔͔࣌ؒΔɻ • ςετ͕ͳ͍ίʔυ͕૿͍͑ͯ͘ 

Slide 47

Slide 47 text

ରࡦɿςετΛॻ͘োนΛԼ͛Δ • Ϣχοτςετʹ͍ͭͯͷ஌ݟڞ༗ • ࣾ಺ϢχοτςετϋϯζΦϯͷ։࠵ • ςετʹ͍ͭͯฉ͘slack channel • CakePHPࣗମͷBug Fix • ςετΛॻ͖΍͍͢࢓૊ΈΛ࡞Δ 

Slide 48

Slide 48 text

Ϣχοτςετʹ͍ͭͯͷ஌ݟڞ༗  ʮࠔͬͨ͜ͱɺղܾͨ͜͠ͱʯΛυΩϡϝϯτͰڞ༗

Slide 49

Slide 49 text

ࣾ಺ϢχοτςετϋϯζΦϯ by @tenkoma 

Slide 50

Slide 50 text

CakePHPࣗମͷBugFix  IUUQTEFWCMPHUIFCBTFJOFOUSZ CakePHPຊମ΁ͷContribute

Slide 51

Slide 51 text

ςετΛॻ͖΍͍͢࢓૊Έ • શϨϙδτϦ༻ͷςετεΠʔτϓϥάΠϯ • ϑΟΫενϟػߏΛ֦ு • άϩʔόϧม਺؅ཧ • PHPUnit7.xܥػೳͷόοΫϙʔτ • ʮassertSameͷdiff͕ݟ΍͘͢͢ΔʯͳͲ 

Slide 52

Slide 52 text

ৄ͘͠͸ɺʮBASEɹPHPΧϯϑΝϨϯε෱Ԭʯ Ͱݕࡧ IUUQTEFWCMPHUIFCBTFJOFOUSZ

Slide 53

Slide 53 text

՝୊ ഁ୼͠΍͍͢ςετ

Slide 54

Slide 54 text

ഁ୼͠΍͍͢ςετ • ςετέʔεͷ਺͕૿͑Δʹ࿈Εͯɺʮ৮ͬ ͍ͯͳ͍Օॴͷςετ͕མͪΔʯέʔεͷ૿ Ճɻ • ମݧͱͯ͠ɺʮςετ͕ো֐෺ʯʹͳΔ 

Slide 55

Slide 55 text

ഁ୼͠΍͍͢ςετ • ֎෦ཁҼͷมԽʹӨڹ͞ΕΔςετ • ϥϯμϜʹࣦഊ͢Δςετ • FixtureͷมԽʹහײʹམͪΔςετ • …etc 

Slide 56

Slide 56 text

֎෦ཁҼͷมԽʹӨڹ͞ΕΔςετ // test༻CloudSearchʹ઀ଓ͢Δ $search = CloudSearchWrapper::factory(); $search->conditions() ->keyword(‘test’, ‘title’) ->sort(‘list_order asc’); // test༻CloudSearchʹσʔλొ࿥ $search->documentBatch($this->addJson()); // σʔλొ࿥͞ΕΔ·Ͱ͙͢ʹݕࡧͰ͖ͳ͍ͷͰɺ଴ͭ sleep(3); // ݕࡧ࣮ߦ $result = $search->search($search->conditions()->query());  ωοτϫʔΫঢ়گʹґଘͯ͠མͪΔ

Slide 57

Slide 57 text

ϥϯμϜʹࣦഊ͢Δςετ $val = mt_rand(0, 100); $result = $this->Sample->exec($val); $this->assertTrue($result);  “0”͕ग़ͨͱ͖͚ͩམͪΔ

Slide 58

Slide 58 text

FixtureͷมԽʹහײʹམͪΔςετ $data = [‘name’ => ‘hogehoge’]; $result = $this->Sample->saveSample($data); $expected = [ ‘id’ => 1, ‘name’ => ‘hogehoge’, ]; $data = ClassRegistry::init(‘Sample’)->find(‘first’, [ ‘conditions’ => [‘name’ => ‘hogehoge’] ]; $this->assertSame($expected, $data);  Sample modelʹରԠ͢ΔϑΟΫενϟʹɺ ϨίʔυΛೖΕΔͱɺ ɹsave࣌ͷid͕auto increment͞ΕམͪΔ

Slide 59

Slide 59 text

ഁ୼͠ʹ͍͘ςετ΁ • ςετʹର͢Δ஌ݟ͕ཷ·͖͍ͬͯͯΔ • ίʔυϨϏϡʔʹͯɺܦݧࡁΈͷʮഁ୼͠ ΍͍͢ςετʯ͕ฆΕ͍ͯͳ͍͔Λ֬ೝ͢ Δ 

Slide 60

Slide 60 text

͜Ε͔Βͷ՝୊

Slide 61

Slide 61 text

͜Ε͔Βͷ՝୊ • ࢓༷ԽςετͷϦϑΝΫλϦϯά • ഁ୼͠ʹ͍͘ςετΛॻ͍͍ͯ͘

Slide 62

Slide 62 text

࢓༷ԽςετͷϦϑΝΫλϦϯά • ࠓճͷ࢓༷ԽςετͰ͸ɺʮطଘͷৼΔ෣͍ʯΛ޿͍ ൣғͰอޢͨ͠ • ޿͍͕Ώ͑ʹɺςετ͕ର৅Ϋϥε͔Βԕ͍৔ॴ͕ݪҼ Ͱམͪͨࡍɺಛఆ͕೉͍͠ • “ςετ͕ςετର৅͔Β཭ΕΕ͹཭ΕΔ΄Ͳɺςετͷࣦഊ͕ԿΛҙ ຯ͢Δ͔ͷ൑அ͕೉͘͠ͳΓ·͢ɻ”ʢʰϨΨγʔίʔυվળΨΠ υʱʣ • ςετ΋ϝϯςφϯεର৅ͱͯ͠खΛೖΕଓ͚Δඞཁੑ

Slide 63

Slide 63 text

ഁ୼͠ʹ͍͘ςετΛॻ͍͍ͯ ͘ • ςετᴈ໌ظ͸ςετ͕গͳ͍࣌ظ • ʮͱʹ͔͘ςετΛॻ͘ʯ͜ͱʹར఺ • ςετέʔε͕૿͖͑ͯͨ • ഁ୼͠ʹ͍͘ςετΛॻ͍ͯɺϝϯςφϯε ੑΛ͍͋͛ͯ͘

Slide 64

Slide 64 text

·ͱΊ

Slide 65

Slide 65 text

·ͱΊ • ςετͷͳ͍ίʔυʹରͯ͠ςετΛॻ͍ͯ ͍ͬͨ • طଘͷίʔυΛอޢ͢ΔͨΊͷ࢓༷Խςετ Λߦͬͨ • ٻΊΒΕΔςετίʔυ͕ঢ়گʹΑͬͯҟͳ Δɺܧଓతͳϝϯςφϯε͕ඞཁɻ

Slide 66

Slide 66 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·͠ ͨɻ BASEגࣜձࣾ ౦ޱ࿨ᏻ @Khigashiguchi