$30 off During Our Annual Pro Sale. View Details »

10年でどう変わった? はてなブックマークでのPerlの使い方

INA Lintaro
November 03, 2019

10年でどう変わった? はてなブックマークでのPerlの使い方

2019-11-03 YAPC::Nagoya::Tiny 2019
https://yapcjapan.connpass.com/event/146727/

INA Lintaro

November 03, 2019
Tweet

More Decks by INA Lintaro

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. View Slide

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

    View Slide

  5. ϑϧϦϥΠτ։࢝

    ͸ͯͳϒοΫϚʔΫ in Scala.
    Scala ؔ੢ Summit 2015.

    View Slide

  6. چγεςϜߏ੒

    View Slide

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

    View Slide

  8. ৽γεςϜߏ੒

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. τϥϯβΫγϣϯ
    ࠔ͍ͬͯͨ
    ▶ τϥϯβΫγϣϯॲཧΛ͍ͯ͠ͳ͔ͬͨ
    ▶ ࠷ॳ͸ 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 ]); }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. ɹ
    υϝΠϯΦϒδΣΫτ
    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);

    View Slide

  22. ɹ
    υϝΠϯΦϒδΣΫτ
    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)]);

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. ް͍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 ͕ੜ͑Δ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide