Slide 1

Slide 1 text

10೥ͰͲ͏มΘͬͨ? ͸ͯͳϒοΫϚʔΫͰͷ Perlͷ࢖͍ํ ҏಸ ྛଠ࿠ id:tarao @oarat 2019-11-03 YAPC::Nagoya::Tiny

Slide 2

Slide 2 text

ࣗݾ঺հ ໊લ ɹ ͍ ͳ ҏಸ ɹ ɹ ΓΜͨΖ͏ ྛଠ࿠ ɹ (id:tarao @oarat) 2008-08 ͸ͯͳΠϯλʔϯ (ϒοΫϚʔΫνʔϜ) 2008-10 ͸ͯͳΞϧόΠτ (ϒοΫϚʔΫνʔϜ) 2010-04 ೔ຊֶज़ৼڵձ ಛผݚڀһ (DC1) 2013-04 ͸ͯͳਖ਼ࣾһ 2013-12 ϒοΫϚʔΫνʔϜ (ޙʹςοΫϦʔυ) ▶ ೉͍͜͠ͱ୲౰ ▶ ݕࡧٕज़, ػցֶश ▶ ຊདྷͷઐ໳͸ܕཧ࿦ ▶ Scala

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

͸ͯͳϒοΫϚʔΫͷྺ࢙ 2005 ೥ ϦϦʔε 2008 ೥ ίʔυϕʔεͷϦϥΠτ (DB ͸ͦͷ··) 2013 ೥ σβΠϯͷΈϦχϡʔΞϧ 2015 ೥ ϑϧϦϥΠτϓϩδΣΫτ։࢝ 2019 ೥ ϑϧϦϥΠτ׬ྃ (DB ΋ؚΊ͢΂ͯ࡮৽)

Slide 5

Slide 5 text

ϑϧϦϥΠτ։࢝ ▶ ͸ͯͳϒοΫϚʔΫ in Scala. Scala ؔ੢ Summit 2015.

Slide 6

Slide 6 text

چγεςϜߏ੒

Slide 7

Slide 7 text

چγεςϜͰͷࠔΓͲ͜Ζ ▶ ։ൃ଎౓ͷ௿Լ ▶ ίʔυϕʔε͕ڊେ͔ͭࠞಱ .pm 400,000 ߦ / .t 270,000 ߦ / .html 70,000 ߦ / 30+ gitmodules ▶ ϦϑΝΫλϦϯά͕௥͍͔ͭͳ͍ ▶ ύϑΥʔϚϯε্ͷ໰୊ ▶ શҬʹӨڹ͢Δ࠶ઃܭ͕ଟ਺ඞཁ ▶ αʔόίετͷ૿େ (σΟϨΫλʔ) ཷ·ͬͨύϑΥʔϚϯε issue ͥΜͿ΍Δͱ ͲΕ͘Β͍͔͔Δ? (ΤϯδχΞ) ... ͏·͍ͬͯ͘ 3 ೥ͱ͔Ͱ͔͢Ͷ

Slide 8

Slide 8 text

৽γεςϜߏ੒

Slide 9

Slide 9 text

ϑϧϦϥΠτͷޮՌ ▶ ϨεϙϯελΠϜେ෯޲্ ▶ αʔό୆਺൒ݮ ▶ ϦϦʔεස౓ 1/week → 1/day ▶ ࢓༷ͷ੔ཧ

Slide 10

Slide 10 text

ࠔ͍ͬͯͨͱ͜Ζ͸ ৽γεςϜͰ͸Ͳ͏ͳͬͨ?

Slide 11

Slide 11 text

ϚΠΫϩαʔϏεઓུ ࠔ͍ͬͯͨ ▶ ڊେͳϞϊϦε ▶ ෦෼తͳஔ͖׵͕͑ࠔ೉ ▶ ೿ੜαʔϏεͷͨΊͷ༷ʑͳίʔυ͕ࠞ͟Δ ▶ ୯Ұݴޠ ▶ Perl Ͱػցֶश͚ͬ͜͏͍ͨ΁Μ... ▶ ඇಉظॲཧ...

Slide 12

Slide 12 text

ϚΠΫϩαʔϏεઓུ Ͳ͏ͳͬͨ ▶ ௨৴ํ๏ ▶ جຊతʹ HTTP Ͱ JSON Λ΍ΓͱΓ ▶ جຊతʹ͸ಉظత ▶ Ͳ͜Ͱ෼͚Δ͔ ▶ ڥք͚ͮΒΕͨίϯςΩετ ▶ ࠶ར༻ੑ ▶ ݴޠͷҧ͍ ▶ ϦϦʔεαΠΫϧͷҧ͍ ▶ ݴޠબ୒ Scala, Perl, Go, Python ▶ ༻్ʹ߹Θͤͯ࠷దʹબ୒ ▶ ΋ͱ΋ͱࣾ಺͸ϚϧνϦϯΨϧͳਓ͕ଟ͍

Slide 13

Slide 13 text

ݴޠબ୒ Scala ▶ ΞϓϦέʔγϣϯͷίΞͱͳΔόοΫΤϯυ ▶ υϝΠϯϞσϧΛ͏·͘දݱ͍ͨ͠ ▶ Ϗϡʔ෦෼ΑΓ͸ߋ৽ස౓͕௿͍ Perl ▶ BFF (Ϗϡʔ෦෼) ▶ σβΠφ΋৮ΔͷͰίϯύΠϧΛ଴ͪͨ͘ͳ͍ ▶ ଎౓༏ઌͰ׳Ε͍ͯΔ/ॻ͚Δਓ͕ଟ͍΋ͷ ▶ ߋ৽ස౓͕ߴ͍

Slide 14

Slide 14 text

ݴޠબ୒ Go ▶ ඇಉظॲཧΛܹ͘͠ඞཁͱ͢Δͱ͜Ζ ▶ ࣮ߦ଎౓༏ઌͳͱ͜Ζ ▶ ͳΔ΂͘ػೳΛখ͘͞࡞Δ Python ▶ ػցֶश͢Δͱ͜Ζ ▶ ։ൃαΠΫϧ͕ଞͱશ͘ҧ͏

Slide 15

Slide 15 text

δϣϒΩϡʔ ࠔ͍ͬͯͨ ▶ TheSchwartz + WorkerManager (Perl) ▶ ॏ͍δϣϒʹϦιʔεΛ઎༗͞Ε͕ͪ ▶ δϣϒ͕ཷ·Γ͗͢ΔͱΩϡʔ͕٧·Δ ▶ Scala Ͱ࢖͑ͳ͍ / ݴޠΛ·ͨ͛ͳ͍ ▶ ϫʔΧ؀ڥΛյͯ͠͠·͍͕ͪ ▶ ίʔυϕʔε͸ڞ௨ ▶ ؀ڥηοτΞοϓ͕·Δ͖ΓҟͳΔ ▶ ಈ࡞֬ೝ/खͰδϣϒ౤ೖ͕͍ͨ΁Μ

Slide 16

Slide 16 text

δϣϒΩϡʔ Ͳ͏ͳͬͨ: HTTP ϕʔεͷδϣϒΩϡʔΛ৽଄ ▶ Fireworq (Go) ▶ Ωϡʔͷॲཧʹઐ೦ ▶ ෳ਺ΩϡʔΛఆٛՄೳ (ॏ͍δϣϒΛִ཭) ▶ ಉ࣌઀ଓϫʔΧ਺ΛಈతʹઃఆՄೳ ▶ ϫʔΧ͸௨ৗͷ HTTP όοΫΤϯυ (࣮ߦ༰қ) ▶ Go ͱ MySQL Λ༻͍ͨδϣϒΩϡʔγεςϜΛ࡞Δͱ͖ʹߟ͑ͨ͜ͱ Ώ͏͏͖ϒϩά. 2014-12-04.

Slide 17

Slide 17 text

τϥϯβΫγϣϯ ࠔ͍ͬͯͨ ▶ τϥϯβΫγϣϯॲཧΛ͍ͯ͠ͳ͔ͬͨ ▶ ࠷ॳ͸ MyISAM ͩͬͨͷͰ... ▶ ෆ੔߹͕ى͖Δ͜ͱ΋͋ͬͨ ▶ JSON Λڝ߹ͯ͠ॻ͖ࠐΜͰ ϑΟʔϧυ͕ফ͑Δͱ͔... sub write_key_value { # ˞໛ࣜతͳίʔυ my ($db, $obj id, $field, $value) = @ ; my $row = $db->select_row(qq{ SELECT * FROM some_table WHERE id = ? }, [ $obj id ]); my $json = $row->{json} ? decode json $row->{json} : {}; $json->{$field} = $value; # ॻ͖ࠐΉϑΟʔϧυ͸͍Ζ͍Ζ $db->query(qq{ UPDATE some_table SET json = ? WHERE id = ? }, [ encode json $json, $obj id ]); }

Slide 18

Slide 18 text

τϥϯβΫγϣϯ Ͳ͏ͳͬͨ ▶ খ͍͞୯ҐͰ͸౰ͨΓલʹτϥϯβΫγϣϯ ▶ େ͖͍୯ҐͰ͸݁Ռ੔߹ੑΛલఏͱ͢Δ ▶ UI ͳͲ΋ͦΕલఏͰߟ͑Δ “ ͻͱͭͷํ๏ͱͯ͠͸ɺ࣮ߦͨ͠ίϚϯυͷύϥϝʔλͱͯ͠౉ ͨ͠σʔλΛɺϢʔβʔΠϯλʔϑΣΠεʹҰ࣌తʹදࣔͤ͞Δ Α͏ͳઃܭ͕͋ΔɻଟগτϦοΩʔ͕ͩɺ࠷ऴతʹΫΤϦϞσϧ ʹ൓ө͞ΕΔͰ͋Ζ͏σʔλΛɺϢʔβʔ͕͙͢ʹݟΒΕΔΑ͏ ʹͳΔɻίϚϯυͷ࣮ߦ͕੒ޭͨ͠ͱ͖ʹɺ࣮ߦલͷݹ͍σʔλ ΛͲ͏ͯ͠΋ݟͤͨ͘ͳ͍ͷͳΒɺ͓ͦΒ͘͜Ε͕།Ұͷํ๏ͩ Ζ͏ɻ ▶ ࣮ફυϝΠϯۦಈઃܭ 4.6 ίϚϯυΫΤϦ੹຿෼཭ (CQRS) - ΫΤϦϞσϧͰͷ݁Ռ੔߹ੑͷѻ͍

Slide 19

Slide 19 text

ɹ υϝΠϯۦಈઃܭ DDD ɹ — ϨΠϠʔ ࠔ͍ͬͯͨ ▶ ϑΝ οτϞσϧ, ϑΝ οτίϯτϩʔϥ ▶ ʮΞϓϦέʔγϣϯ૚ʯͷ໾ׂ͕͙ͪ͸͙ Ͳ͏ͳͬͨ (ओʹ Scala ଆ) ▶ ΫϦʔϯΞʔΩςΫνϟͳͲΛલఏʹΞϨϯδ ▶ ΞϓϦέʔγϣϯ૚ͱ͸Կ͔Λ͔ͳΓٞ࿦ ▶ ࢦ਑ΛυΩϡϝϯτԽ ▶ Perl ଆͷ෼͚ํ͸େࡶ೺

Slide 20

Slide 20 text

ɹ υϝΠϯۦಈઃܭ DDD ɹ — ɹ υϝΠϯΦϒδΣΫτ DO ɹ ࠔ͍ͬͯͨ — ϑΝ οτϞσϧ ▶ 1 ͭͷΤϯςΟςΟͷΫϥε͕ 5000 ߦऑ ▶ ϝιου͕ͲΜͳ෭࡞༻Λى͔͜͢Θ͔Βͳ͍ Ͳ͏ͳͬͨ — DO ͸؆ܿʹ ▶ ݪଇͱͯ͠ෆม (ॻ͖׵͚͑ͨΕ͹ίϐʔ) ▶ (Scala) case class ▶ (Perl) Class::Accessor::Lite (::Lazy) ▶ ϑΟʔϧυͷ௥Ճ͸? ▶ (Scala) ަࠩܕͰ (ࣅඇ) ֦ுՄೳϨίʔυ ▶ (Perl) Class::Mix Ͱಈతܧঝ (Scala ͷަࠩܕͰ΍͍ͬͯΔ͜ͱͷಈత൛)

Slide 21

Slide 21 text

ɹ υϝΠϯΦϒδΣΫτ DO ɹʹϑΟʔϧυ௥Ճ? ͲΜͳͱ͖? ▶ Կ͔ࢠཁૉΛՃ͑ͨ΋ͷʹݴٴ͍ͨ͠ͱ͖ ▶ ࢠཁૉΛՃ͑ͨͱ͖͚ͩࢀরͰ͖ͯ΄͍͠ ྫ my $car = Car->new(...); my $car_with_engine = $car->with_engine($engine); give_me_engine($car_with_engine->engine); my $car_with_bumper = $car->with_bumper($bumper); give_me_bumper($car_with_bumper->bumper); #give_me_engine($car_with_bumper->engine); # Τϥʔʹ͍ͨ͠ my $car_with_engine_and_bumper = $car->with_engine($engine)->with_bumper($bumper); give_me_engine($car_with_engine->engine); give_me_bumper($car_with_bumper->bumper);

Slide 22

Slide 22 text

ɹ υϝΠϯΦϒδΣΫτ DO ɹʹϑΟʔϧυ௥Ճ? package Class::Extensible; use Class::Mix qw(mix_class); sub import { my $package = caller; *{"${package}::clone_with"} = sub { # Class::Mix ͰΫϥεΛ߹੒͢Δίʔυ # ׬શͳίʔυ: https://git.io/JeuHU } } package Car; use Class::Accessor::Lite (new => 1); use Class::Extensible qw(clone_with); sub with_engine { $_[0]->clone_with(’WithEngine’, engine => $_[1]); } package Car::WithEngine; use parent qw(Car); use Class::Accessor::Lite (new => 1, ro => [qw(engine)]);

Slide 23

Slide 23 text

ɹ υϝΠϯۦಈઃܭ DDD ɹ — จԽͷܧঝ ࠔ͍ͬͯͨ id:naoya ᐌ͘ “ υϝΠϯϩδοΫΛ App::* ʹ࣮૷͠ͳ͍͜ ͱɻ͋͘·ͰϩδοΫ͸جຊ Service::* ͔ MoCo::* ΁ ▶ Կ͕υϝΠϯϩδοΫͰԿ͕ͦ͏Ͱͳ͍͔? ▶ νʔϜͰٞ࿦Ͱ͖͍ͯͳ͔ͬͨ ▶ ΍͕ͯݴ͍఻͑ͦͷ΋ͷ͕ࣦΘΕ... ▶ Ͳ͜·Ͱ͕υϝΠϯϩδοΫ͔ᐆດͩͬͨΓ ▶ App::*͕ϏϡʔͷͨΊ͚ͩʹͳͬͯͨΓ ▶ ίϯτϩʔϥͰυϝΠϯૢ࡞͍ͯͨ͠Γ

Slide 24

Slide 24 text

ɹ υϝΠϯۦಈઃܭ DDD ɹ — จԽͷܧঝ Ͳ͏ͳͬͨ ▶ ࣾ಺ษڧձͷ։࠵ ▶ νϡʔτϦΞϧతͳυΩϡϝϯτΛ֦ॆ ▶ ԿΛͲ͜ʹॻ͔͘ͷࢦ਑Λఏڙ ▶ νʔϜ΁ͷಋೖࢿྉͱͯ͠ಡΉ ▶ ೔ʑυϝΠϯϞσϧ͕ద੾͔Ͳ͏͔ٞ࿦ ▶ ϢϏΩλεݴޠͱͷဃ཭ʹ͍ͭͯ΋ٞ࿦ (ຊདྷͷ DDD ͷ໨త)

Slide 25

Slide 25 text

ް͍FW͔Βͷ୤٫ ࠔ͍ͬͯͨ — ް͍಺੡ϑϨʔϜϫʔΫ ▶ Ridge (WAF) ▶ Ruby on Rails ͷ ActionPack ϦεϖΫτ ▶ DBIx::MoCo (ORM) ▶ Ruby on Rails ͷ ActiveRecord ϦεϖΫτ ▶ ࣾ಺Ͱͷར༻ࣄྫ͕ͩΜͩΜݮগ ▶ ࣝऀ͕ݮͬͯ஌ݟ͕ͳ͘ͳΔ ▶ ϝϯς΋͍ͨ΁Μʹ ▶ ͩΜͩΜ࿮͔Β֎Εͨར༻͕૿Ճ “ ڍಈ͕ҙຯෆ໌ ϚδΧϧͳ͜ͱ΍Γ͕ͪ ▶ ΅͘ͷ͔Μ͕͍͖͑ͨ͞ΐ͏ͷ͏͐Ϳ͋΀Γ͚ʔ͠ΐΜ;ΕʔΉΘʔ͘ id:cho45. YAPC Asia 2011.

Slide 26

Slide 26 text

ް͍FW͔Βͷ୤٫ ࠔ͍ͬͯͨ — WAF ▶ Ridge ▶ ҉໧ͷσΟεύονϧʔϧ (ྫ) /user/add.confirm → Engine::User::Add->confirm ▶ ςϯϓϨʔτ͚ͩஔ͍ͯ΋༗ޮ ▶ ࡉ͔ͳมଇϧʔϧ (.json → json ౳) ▶ ͲͷΤϯυϙΠϯτ͕༗ޮͳͷ͔೉͍͠ ▶ before filter, after filter ▶ DRY ͷͨΊͷ΂ΜΓػೳͱͯ͠ཚ༻ ▶ ύεͷॻ͖׵͑ʹ࢖͏ύλʔϯ΋... ▶ ΞΧ΢ϯτج൫ͷϞδϡʔϧ͕͜ΕΛܧঝ...

Slide 27

Slide 27 text

ް͍FW͔Βͷ୤٫ Ͳ͏ͳͬͨ — WAF ▶ Plack + Router::Simple + ͘͝؆୯ͳ DSL ▶ ͢΂ͯͷϧʔςΟϯάΛ໌ࣔతʹॻ͘ GET "/{user name:$HATENA ID RE}/add" => require_login => "User" => "add"; GET "/entry/panel/" => session => "Entry::Panel" => "panel"; ▶ ύε͝ͱͷ Plack::Middleware తͳ΋ͷ ▶ ྫ => require login ະϩάΠϯ͸ 302 ▶ ίϯςΩετΦϒδΣΫτʹ Role::Tiny ▶ ྫ => session ϝιου->visitor ͕ੜ͑Δ

Slide 28

Slide 28 text

ް͍FW͔Βͷ୤٫ ࠔ͍ͬͯͨ — ORM ▶ DBIx::MoCo ▶ มߋ͸ηογϣϯ׬ྃ࣌ʹ·ͱΊͯॻ͖ग़͠ ▶ ͕ͩଈॻ͖ग़͢->save ͕ݺ͹Ε͕ͪ ▶ ΠϯελϯεΩϟ ογϡͷ࢓૊Έ͕͋Δ ▶ ͕ͩΩϟ ογϡճආ൛ϝιου͕ݺ͹Ε͕ͪ ▶ τϦΨͷ࢓૊ΈͰϋϚΓ͕ͪ ▶ Ͳ͜Ͱ DB ΞΫηε͕૸Δͷ͔Θ͔Γʹ͍͘ ▶ N+1 ΫΤϦ໰୊ ▶ ͔Ώ͍ͱ͜Ζʹख͕ಧ͔ͣੜΫΤϦॻ͖͕ͪ

Slide 29

Slide 29 text

ް͍FW͔Βͷ୤٫ Ͳ͏ͳͬͨ — ORM ͸࢖Θͳ͍ ▶ (Scala) Slick ▶ (Perl) DBIx::Handler + Scope::Container ▶ ΫΤϦ͸ੜͰॻ͘ ▶ N+1 ΫΤϦ໰୊ʹର͢Δ݁࿦ ▶ has-a ؔ܎Λ 1 ͚݅ͩҾ͘ϝιου͕Α͘ͳ͍ ▶ ෳ਺݅Ҿ͘ϝιου͔͠ͳ͚Ε͹΄΅ແ໰୊ ˞શମͷॻ͖ํͷελΠϧʹ΋ΑΓ·͢

Slide 30

Slide 30 text

Perlͷόʔδϣϯ ࠔ͍ͬͯͨ ▶ 5.8 ▶ ͳ͔ͳ্͔͛ΒΕͳ͔ͬͨ ▶ ͦ΋ͦ΋ CentOS 5 / mod perl / yum ؀ڥ ▶ Plack Խ / cpanfile Խ / Docker Խ → ࣦഊ Ͳ͏ͳͬͨ ▶ 5.2x ▶ ͢΂ً͕͍ͯͯݟ͑Δ...

Slide 31

Slide 31 text

ͦͷଞ ▶ Ϟδϡʔϧͷಈతϩʔυͷ͍ͤͰϋϚΔ ▶ → ͳΔ΂͘΍Βͳ͍ ▶ σουίʔυ͕ଟ͔ͬͨ ▶ → ͋ͱͰ͘͢͝ࠔΔͷͰফ͢, ͍·͙͢! ▶ Elasticsearch ͷόʔδϣϯ্͛ΒΕͳ͍ ▶ API ͕มΘΔͱ௥ै͕͍ͨ΁Μ ▶ ݕূ͕͍ͨ͘͢͝΁Μ ▶ → Scala ΫϥΠΞϯτ͸ܕ෇͖ͳͷͰ҆৺ ▶ Twitter ౤ߘͷจࣈ਺੍ݶ ▶ Perl Ͱ࠶ݱ͢Δͷ͸ඇৗʹ೉͍͠ ▶ → Scala ͔Βެࣜ Java ύοέʔδΛར༻

Slide 32

Slide 32 text

ϓϩδΣΫτΛͲ͏ਐΊ͔ͨ

Slide 33

Slide 33 text

ਐΊํ 1. PoC ϑΣʔζ 2. ࣾ಺ϦϦʔε 3. ஈ֊తͳຊ൪ϦϦʔε 4. ϓϩδΣΫτͷऩଋ

Slide 34

Slide 34 text

ɹ ֓ ೦ ࣮ ূ PoC ɹϑΣʔζ (2015ʙ) ઃܭ ▶ DB εΩʔϚͱجຊΞʔΩςΫνϟͷૉҊ ▶ ϨϏϡʔ ▶ CTO ▶ νʔϑΤϯδχΞ ▶ Πϯϑϥ෦௕ ▶ چγεςϜࣝऀ ࣮૷ ▶ ࣺͯΔͭ΋ΓͷԾ࣮૷Λ։࢝ ▶ ྑ͍ϓϥΫςΟεΛ໛ࡧ ▶ ͜͜·ͰͰ࿩ͨ͠Α͏ͳ΍ΓํΛ΄΅֬ఆ ▶ ͏·͍ͬͨͨ͘Ί͚͖ͬΐࣺͯͣ͘ʹར༻

Slide 35

Slide 35 text

ࣾ಺ϦϦʔε (ʙ2016) ▶ جຊػೳ͕ͻͱ௨Γಈ͘ঢ়ଶ·Ͱ࣮૷ ▶ ϒοΫϚʔΫͰ͖Δ ▶ ࣗ෼ͷϒοΫϚʔΫҰཡ͕ݟΒΕΔ ▶ ίϝϯτҰཡ͕ݟΒΕΔ ▶ ਓؾΤϯτϦҰཡ͕ݟΒΕΔ ▶ ࢖ͬͯΈΔ ▶ σʔλ͸ਅͬ৽ ▶ ઐ༻ϒοΫϚʔΫϨοτΛ࡞੒ ▶ ࣾ಺άϧʔϓ΢ΣΞͳͲͰར༻ͯ͠ΈΔ ▶ ։ൃํࣜ: ී௨ͷ৽ن։ൃͷΞδϟΠϧͱಉ͡

Slide 36

Slide 36 text

ஈ֊తͳຊ൪ϦϦʔε (ʙ2018) ϦϦʔεઓུ ▶ ໘͝ͱʹ৽γεςϜʹ੾Γସ͑ ▶ ·ͣ͸ࢀরܥͷΈΛର৅ͱ͢Δ σʔλಉظ ▶ σʔλ͸৽چ྆ํʹμϒϧϥΠτ ▶ ໘Ͱඞཁͳσʔλ͝ͱʹҠߦ ▶ ΦϯϥΠϯಉظ։࢝ → όονҠߦ

Slide 37

Slide 37 text

ϓϩδΣΫτͷऩଋ (ʙ2019) ࢒Γͷ੾Γସ͑ ▶ API ͷΈͷػೳ ▶ ඇಉظॲཧͷΈͰ࢖ΘΕΔॲཧ ▶ ߋ৽ܥ ׬શ੾Γସ͑ ▶ چϦιʔε͝ͱʹશґଘؔ܎Λચ͍ग़͠ ▶ ΤϯυϙΠϯτ౳ ˠ ΤϯςΟςΟ/Ϧιʔε ▶ ґଘؔ܎Λసஔ ▶ ֤Ϧιʔε issue ʹ࣮૷ issue Λྻڍ ▶ ґଘ͕ͳ͘ͳͬͨچϦιʔε͔Βॱ࣍ఫୀ

Slide 38

Slide 38 text

ϓϩδΣΫτͷऩଋ ચ͍ग़͠࡞ۀ ▶ 2ʙ3ϲ݄͔͚ͯશιʔείʔυΛಡΉ ▶ ݁ՌΛεϓϨουγʔτʹ·ͱΊΔ ▶ υϝΠϯ஌͕ࣝνʔϜϝϯόʔʹߦ͖౉Δ

Slide 39

Slide 39 text

ϓϩδΣΫτͷऩଋ ਐߦ؅ཧ ▶ ΍Δ͜ͱͷ૯ྔ (είʔϓ) ͸ܾ·͍ͬͯΔ ▶ ΢ΥʔλʔϑΥʔϧత ▶ ࢓༷Λ੔ཧͯ͠ॏཁ౓ͷ௿͍ػೳΛഇࢭ ▶ ରίετͰ༏ઌ౓͚ͮ ▶ ΞδϟΠϧత

Slide 40

Slide 40 text

·ͱΊ ▶ ͍·ྑ͍ͱࢥ͑Δ΋ͷΛ౰ͨΓલʹ࡞Δ ▶ কདྷ΋ͬͱΑ͘͢Δ͜ͱΛߟ͑Δ ▶ ͍·ྑ͍ͱߟ͍͑ͯΔཧ༝Λड͚ܧ͙ ▶ ෦෼తʹࣺͯΒΕΔΑ͏ʹ͢Δ ▶ ϨΨγʔίʔυͷߟݹֶ͸ؾ߹͍