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
10年でどう変わった? はてなブックマークでのPerlの使い方
Search
INA Lintaro
November 03, 2019
Programming
10
9k
10年でどう変わった? はてなブックマークでのPerlの使い方
2019-11-03 YAPC::Nagoya::Tiny 2019
https://yapcjapan.connpass.com/event/146727/
INA Lintaro
November 03, 2019
Tweet
Share
More Decks by INA Lintaro
See All by INA Lintaro
record4s --- Extensible Records for Scala 3, and Domain Modeling with Structural Types
tarao
2
15k
仮想関数テーブルと型クラスを見比べる
tarao
1
1.4k
ジョブキューシステムFireworqのアーキテクチャ設計と運用時のベストプラクティス
tarao
1
4.8k
計算ファースト vs. 型ファースト / Computation First vs. Type First
tarao
4
21k
Percolatorを用いたカテゴリ分類
tarao
0
3.1k
Other Decks in Programming
See All in Programming
Outline View in SwiftUI
1024jp
1
330
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
340
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
Jakarta EE meets AI
ivargrimstad
0
130
RubyLSPのマルチバイト文字対応
notfounds
0
120
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
flutterkaigi_2024.pdf
kyoheig3
0
150
subpath importsで始めるモック生活
10tera
0
310
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Statistics for Hackers
jakevdp
796
220k
Facilitating Awesome Meetings
lara
50
6.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Embracing the Ebb and Flow
colly
84
4.5k
Writing Fast Ruby
sferik
627
61k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Transcript
10ͰͲ͏มΘͬͨ? ͯͳϒοΫϚʔΫͰͷ Perlͷ͍ํ ҏಸ ྛଠ id:tarao @oarat 2019-11-03 YAPC::Nagoya::Tiny
ࣗݾհ ໊લ ɹ ͍ ͳ ҏಸ ɹ ɹ ΓΜͨΖ͏ ྛଠ
ɹ (id:tarao @oarat) 2008-08 ͯͳΠϯλʔϯ (ϒοΫϚʔΫνʔϜ) 2008-10 ͯͳΞϧόΠτ (ϒοΫϚʔΫνʔϜ) 2010-04 ຊֶज़ৼڵձ ಛผݚڀһ (DC1) 2013-04 ͯͳਖ਼ࣾһ 2013-12 ϒοΫϚʔΫνʔϜ (ޙʹςοΫϦʔυ) ▶ ͍͜͠ͱ୲ ▶ ݕࡧٕज़, ػցֶश ▶ ຊདྷͷઐܕཧ ▶ Scala
None
ͯͳϒοΫϚʔΫͷྺ࢙ 2005 ϦϦʔε 2008 ίʔυϕʔεͷϦϥΠτ (DB ͦͷ··) 2013
σβΠϯͷΈϦχϡʔΞϧ 2015 ϑϧϦϥΠτϓϩδΣΫτ։࢝ 2019 ϑϧϦϥΠτྃ (DB ؚΊͯ͢৽)
ϑϧϦϥΠτ։࢝ ▶ ͯͳϒοΫϚʔΫ in Scala. Scala ؔ Summit 2015.
چγεςϜߏ
چγεςϜͰͷࠔΓͲ͜Ζ ▶ ։ൃͷԼ ▶ ίʔυϕʔε͕ڊେ͔ͭࠞಱ .pm 400,000 ߦ / .t
270,000 ߦ / .html 70,000 ߦ / 30+ gitmodules ▶ ϦϑΝΫλϦϯά͕͍͔ͭͳ͍ ▶ ύϑΥʔϚϯε্ͷ ▶ શҬʹӨڹ͢Δ࠶ઃܭ͕ଟඞཁ ▶ αʔόίετͷ૿େ (σΟϨΫλʔ) ཷ·ͬͨύϑΥʔϚϯε issue ͥΜͿΔͱ ͲΕ͘Β͍͔͔Δ? (ΤϯδχΞ) ... ͏·͍ͬͯ͘ 3 ͱ͔Ͱ͔͢Ͷ
৽γεςϜߏ
ϑϧϦϥΠτͷޮՌ ▶ ϨεϙϯελΠϜେ෯্ ▶ αʔόݮ ▶ ϦϦʔεස 1/week → 1/day
▶ ༷ͷཧ
ࠔ͍ͬͯͨͱ͜Ζ ৽γεςϜͰͲ͏ͳͬͨ?
ϚΠΫϩαʔϏεઓུ ࠔ͍ͬͯͨ ▶ ڊେͳϞϊϦε ▶ ෦తͳஔ͖͕͑ࠔ ▶ ੜαʔϏεͷͨΊͷ༷ʑͳίʔυ͕ࠞ͟Δ ▶ ୯Ұݴޠ
▶ Perl Ͱػցֶश͚ͬ͜͏͍ͨΜ... ▶ ඇಉظॲཧ...
ϚΠΫϩαʔϏεઓུ Ͳ͏ͳͬͨ ▶ ௨৴ํ๏ ▶ جຊతʹ HTTP Ͱ JSON ΛΓͱΓ
▶ جຊతʹಉظత ▶ Ͳ͜Ͱ͚Δ͔ ▶ ڥք͚ͮΒΕͨίϯςΩετ ▶ ࠶ར༻ੑ ▶ ݴޠͷҧ͍ ▶ ϦϦʔεαΠΫϧͷҧ͍ ▶ ݴޠબ Scala, Perl, Go, Python ▶ ༻్ʹ߹Θͤͯ࠷దʹબ ▶ ͱͱࣾϚϧνϦϯΨϧͳਓ͕ଟ͍
ݴޠબ Scala ▶ ΞϓϦέʔγϣϯͷίΞͱͳΔόοΫΤϯυ ▶ υϝΠϯϞσϧΛ͏·͘දݱ͍ͨ͠ ▶ Ϗϡʔ෦ΑΓߋ৽ස͕͍ Perl ▶
BFF (Ϗϡʔ෦) ▶ σβΠφ৮ΔͷͰίϯύΠϧΛͪͨ͘ͳ͍ ▶ ༏ઌͰ׳Ε͍ͯΔ/ॻ͚Δਓ͕ଟ͍ͷ ▶ ߋ৽ස͕ߴ͍
ݴޠબ Go ▶ ඇಉظॲཧΛܹ͘͠ඞཁͱ͢Δͱ͜Ζ ▶ ࣮ߦ༏ઌͳͱ͜Ζ ▶ ͳΔ͘ػೳΛখ͘͞࡞Δ Python ▶
ػցֶश͢Δͱ͜Ζ ▶ ։ൃαΠΫϧ͕ଞͱશ͘ҧ͏
δϣϒΩϡʔ ࠔ͍ͬͯͨ ▶ TheSchwartz + WorkerManager (Perl) ▶ ॏ͍δϣϒʹϦιʔεΛ༗͞Ε͕ͪ ▶
δϣϒ͕ཷ·Γ͗͢ΔͱΩϡʔ͕٧·Δ ▶ Scala Ͱ͑ͳ͍ / ݴޠΛ·ͨ͛ͳ͍ ▶ ϫʔΧڥΛյͯ͠͠·͍͕ͪ ▶ ίʔυϕʔεڞ௨ ▶ ڥηοτΞοϓ͕·Δ͖ΓҟͳΔ ▶ ಈ࡞֬ೝ/खͰδϣϒೖ͕͍ͨΜ
δϣϒΩϡʔ Ͳ͏ͳͬͨ: HTTP ϕʔεͷδϣϒΩϡʔΛ৽ ▶ Fireworq (Go) ▶ Ωϡʔͷॲཧʹઐ೦ ▶
ෳΩϡʔΛఆٛՄೳ (ॏ͍δϣϒΛִ) ▶ ಉ࣌ଓϫʔΧΛಈతʹઃఆՄೳ ▶ ϫʔΧ௨ৗͷ HTTP όοΫΤϯυ (࣮ߦ༰қ) ▶ Go ͱ MySQL Λ༻͍ͨδϣϒΩϡʔγεςϜΛ࡞Δͱ͖ʹߟ͑ͨ͜ͱ Ώ͏͏͖ϒϩά. 2014-12-04.
τϥϯβΫγϣϯ ࠔ͍ͬͯͨ ▶ τϥϯβΫγϣϯॲཧΛ͍ͯ͠ͳ͔ͬͨ ▶ ࠷ॳ 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 ]); }
τϥϯβΫγϣϯ Ͳ͏ͳͬͨ ▶ খ͍͞୯ҐͰͨΓલʹτϥϯβΫγϣϯ ▶ େ͖͍୯ҐͰ݁Ռ߹ੑΛલఏͱ͢Δ ▶ UI ͳͲͦΕલఏͰߟ͑Δ “
ͻͱͭͷํ๏ͱͯ͠ɺ࣮ߦͨ͠ίϚϯυͷύϥϝʔλͱͯ͠ ͨ͠σʔλΛɺϢʔβʔΠϯλʔϑΣΠεʹҰ࣌తʹදࣔͤ͞Δ Α͏ͳઃܭ͕͋ΔɻଟগτϦοΩʔ͕ͩɺ࠷ऴతʹΫΤϦϞσϧ ʹө͞ΕΔͰ͋Ζ͏σʔλΛɺϢʔβʔ͕͙͢ʹݟΒΕΔΑ͏ ʹͳΔɻίϚϯυͷ࣮ߦ͕ޭͨ͠ͱ͖ʹɺ࣮ߦલͷݹ͍σʔλ ΛͲ͏ͯ͠ݟͤͨ͘ͳ͍ͷͳΒɺ͓ͦΒ͘͜Ε͕།Ұͷํ๏ͩ Ζ͏ɻ ▶ ࣮ફυϝΠϯۦಈઃܭ 4.6 ίϚϯυΫΤϦ (CQRS) - ΫΤϦϞσϧͰͷ݁Ռ߹ੑͷѻ͍
ɹ υϝΠϯۦಈઃܭ DDD ɹ — ϨΠϠʔ ࠔ͍ͬͯͨ ▶ ϑΝ οτϞσϧ,
ϑΝ οτίϯτϩʔϥ ▶ ʮΞϓϦέʔγϣϯʯͷׂ͕͙͙ͪ Ͳ͏ͳͬͨ (ओʹ Scala ଆ) ▶ ΫϦʔϯΞʔΩςΫνϟͳͲΛલఏʹΞϨϯδ ▶ ΞϓϦέʔγϣϯͱԿ͔Λ͔ͳΓٞ ▶ ࢦΛυΩϡϝϯτԽ ▶ Perl ଆͷ͚ํେࡶ
ɹ υϝΠϯۦಈઃܭ DDD ɹ — ɹ υϝΠϯΦϒδΣΫτ DO ɹ ࠔ͍ͬͯͨ
— ϑΝ οτϞσϧ ▶ 1 ͭͷΤϯςΟςΟͷΫϥε͕ 5000 ߦऑ ▶ ϝιου͕ͲΜͳ෭࡞༻Λى͔͜͢Θ͔Βͳ͍ Ͳ͏ͳͬͨ — DO ؆ܿʹ ▶ ݪଇͱͯ͠ෆม (ॻ͖͚͑ͨΕίϐʔ) ▶ (Scala) case class ▶ (Perl) Class::Accessor::Lite (::Lazy) ▶ ϑΟʔϧυͷՃ? ▶ (Scala) ަࠩܕͰ (ࣅඇ) ֦ுՄೳϨίʔυ ▶ (Perl) Class::Mix Ͱಈతܧঝ (Scala ͷަࠩܕͰ͍ͬͯΔ͜ͱͷಈత൛)
ɹ υϝΠϯΦϒδΣΫτ 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);
ɹ υϝΠϯΦϒδΣΫτ 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)]);
ɹ υϝΠϯۦಈઃܭ DDD ɹ — จԽͷܧঝ ࠔ͍ͬͯͨ id:naoya ᐌ͘ “
υϝΠϯϩδοΫΛ App::* ʹ࣮͠ͳ͍͜ ͱɻ͋͘·ͰϩδοΫجຊ Service::* ͔ MoCo::* ▶ Կ͕υϝΠϯϩδοΫͰԿ͕ͦ͏Ͱͳ͍͔? ▶ νʔϜͰٞͰ͖͍ͯͳ͔ͬͨ ▶ ͕ͯݴ͍͑ͦͷͷ͕ࣦΘΕ... ▶ Ͳ͜·Ͱ͕υϝΠϯϩδοΫ͔ᐆດͩͬͨΓ ▶ App::*͕ϏϡʔͷͨΊ͚ͩʹͳͬͯͨΓ ▶ ίϯτϩʔϥͰυϝΠϯૢ࡞͍ͯͨ͠Γ
ɹ υϝΠϯۦಈઃܭ DDD ɹ — จԽͷܧঝ Ͳ͏ͳͬͨ ▶ ࣾษڧձͷ։࠵ ▶
νϡʔτϦΞϧతͳυΩϡϝϯτΛ֦ॆ ▶ ԿΛͲ͜ʹॻ͔͘ͷࢦΛఏڙ ▶ νʔϜͷಋೖࢿྉͱͯ͠ಡΉ ▶ ʑυϝΠϯϞσϧ͕ద͔Ͳ͏͔ٞ ▶ ϢϏΩλεݴޠͱͷဃʹ͍ͭͯٞ (ຊདྷͷ DDD ͷత)
ް͍FW͔Βͷ٫ ࠔ͍ͬͯͨ — ް͍ϑϨʔϜϫʔΫ ▶ Ridge (WAF) ▶ Ruby on
Rails ͷ ActionPack ϦεϖΫτ ▶ DBIx::MoCo (ORM) ▶ Ruby on Rails ͷ ActiveRecord ϦεϖΫτ ▶ ࣾͰͷར༻ࣄྫ͕ͩΜͩΜݮগ ▶ ࣝऀ͕ݮͬͯݟ͕ͳ͘ͳΔ ▶ ϝϯς͍ͨΜʹ ▶ ͩΜͩΜ͔Β֎Εͨར༻͕૿Ճ “ ڍಈ͕ҙຯෆ໌ ϚδΧϧͳ͜ͱΓ͕ͪ ▶ ΅͘ͷ͔Μ͕͍͖͑ͨ͞ΐ͏ͷ͏͐Ϳ͋Γ͚ʔ͠ΐΜ;ΕʔΉΘʔ͘ id:cho45. YAPC Asia 2011.
ް͍FW͔Βͷ٫ ࠔ͍ͬͯͨ — WAF ▶ Ridge ▶ ҉ͷσΟεύονϧʔϧ (ྫ) /user/add.confirm
→ Engine::User::Add->confirm ▶ ςϯϓϨʔτ͚ͩஔ͍ͯ༗ޮ ▶ ࡉ͔ͳมଇϧʔϧ (.json → json ) ▶ ͲͷΤϯυϙΠϯτ͕༗ޮͳͷ͔͍͠ ▶ before filter, after filter ▶ DRY ͷͨΊͷΜΓػೳͱͯ͠ཚ༻ ▶ ύεͷॻ͖͑ʹ͏ύλʔϯ... ▶ ΞΧϯτج൫ͷϞδϡʔϧ͕͜ΕΛܧঝ...
ް͍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 ͕ੜ͑Δ
ް͍FW͔Βͷ٫ ࠔ͍ͬͯͨ — ORM ▶ DBIx::MoCo ▶ มߋηογϣϯྃ࣌ʹ·ͱΊͯॻ͖ग़͠ ▶ ͕ͩଈॻ͖ग़͢->save
͕ݺΕ͕ͪ ▶ ΠϯελϯεΩϟ ογϡͷΈ͕͋Δ ▶ ͕ͩΩϟ ογϡճආ൛ϝιου͕ݺΕ͕ͪ ▶ τϦΨͷΈͰϋϚΓ͕ͪ ▶ Ͳ͜Ͱ DB ΞΫηε͕Δͷ͔Θ͔Γʹ͍͘ ▶ N+1 ΫΤϦ ▶ ͔Ώ͍ͱ͜Ζʹख͕ಧ͔ͣੜΫΤϦॻ͖͕ͪ
ް͍FW͔Βͷ٫ Ͳ͏ͳͬͨ — ORM Θͳ͍ ▶ (Scala) Slick ▶ (Perl)
DBIx::Handler + Scope::Container ▶ ΫΤϦੜͰॻ͘ ▶ N+1 ΫΤϦʹର͢Δ݁ ▶ has-a ؔΛ 1 ͚݅ͩҾ͘ϝιου͕Α͘ͳ͍ ▶ ෳ݅Ҿ͘ϝιου͔͠ͳ͚Ε΄΅ແ ˞શମͷॻ͖ํͷελΠϧʹΑΓ·͢
Perlͷόʔδϣϯ ࠔ͍ͬͯͨ ▶ 5.8 ▶ ͳ͔ͳ্͔͛ΒΕͳ͔ͬͨ ▶ ͦͦ CentOS 5
/ mod perl / yum ڥ ▶ Plack Խ / cpanfile Խ / Docker Խ → ࣦഊ Ͳ͏ͳͬͨ ▶ 5.2x ▶ ً͕͍ͯͯ͢ݟ͑Δ...
ͦͷଞ ▶ Ϟδϡʔϧͷಈతϩʔυͷ͍ͤͰϋϚΔ ▶ → ͳΔ͘Βͳ͍ ▶ σουίʔυ͕ଟ͔ͬͨ ▶ →
͋ͱͰ͘͢͝ࠔΔͷͰফ͢, ͍·͙͢! ▶ Elasticsearch ͷόʔδϣϯ্͛ΒΕͳ͍ ▶ API ͕มΘΔͱै͕͍ͨΜ ▶ ݕূ͕͍ͨ͘͢͝Μ ▶ → Scala ΫϥΠΞϯτܕ͖ͳͷͰ҆৺ ▶ Twitter ߘͷจࣈ੍ݶ ▶ Perl Ͱ࠶ݱ͢Δͷඇৗʹ͍͠ ▶ → Scala ͔Βެࣜ Java ύοέʔδΛར༻
ϓϩδΣΫτΛͲ͏ਐΊ͔ͨ
ਐΊํ 1. PoC ϑΣʔζ 2. ࣾϦϦʔε 3. ஈ֊తͳຊ൪ϦϦʔε 4. ϓϩδΣΫτͷऩଋ
ɹ ֓ ೦ ࣮ ূ PoC ɹϑΣʔζ (2015ʙ) ઃܭ ▶
DB εΩʔϚͱجຊΞʔΩςΫνϟͷૉҊ ▶ ϨϏϡʔ ▶ CTO ▶ νʔϑΤϯδχΞ ▶ Πϯϑϥ෦ ▶ چγεςϜࣝऀ ࣮ ▶ ࣺͯΔͭΓͷԾ࣮Λ։࢝ ▶ ྑ͍ϓϥΫςΟεΛࡧ ▶ ͜͜·ͰͰͨ͠Α͏ͳΓํΛ΄΅֬ఆ ▶ ͏·͍ͬͨͨ͘Ί͚͖ͬΐࣺͯͣ͘ʹར༻
ࣾϦϦʔε (ʙ2016) ▶ جຊػೳ͕ͻͱ௨Γಈ͘ঢ়ଶ·Ͱ࣮ ▶ ϒοΫϚʔΫͰ͖Δ ▶ ࣗͷϒοΫϚʔΫҰཡ͕ݟΒΕΔ ▶ ίϝϯτҰཡ͕ݟΒΕΔ
▶ ਓؾΤϯτϦҰཡ͕ݟΒΕΔ ▶ ͬͯΈΔ ▶ σʔλਅͬ৽ ▶ ઐ༻ϒοΫϚʔΫϨοτΛ࡞ ▶ ࣾάϧʔϓΣΞͳͲͰར༻ͯ͠ΈΔ ▶ ։ൃํࣜ: ී௨ͷ৽ن։ൃͷΞδϟΠϧͱಉ͡
ஈ֊తͳຊ൪ϦϦʔε (ʙ2018) ϦϦʔεઓུ ▶ ໘͝ͱʹ৽γεςϜʹΓସ͑ ▶ ·ͣࢀরܥͷΈΛରͱ͢Δ σʔλಉظ ▶ σʔλ৽چ྆ํʹμϒϧϥΠτ
▶ ໘Ͱඞཁͳσʔλ͝ͱʹҠߦ ▶ ΦϯϥΠϯಉظ։࢝ → όονҠߦ
ϓϩδΣΫτͷऩଋ (ʙ2019) ΓͷΓସ͑ ▶ API ͷΈͷػೳ ▶ ඇಉظॲཧͷΈͰΘΕΔॲཧ ▶ ߋ৽ܥ
શΓସ͑ ▶ چϦιʔε͝ͱʹશґଘؔΛચ͍ग़͠ ▶ ΤϯυϙΠϯτ ˠ ΤϯςΟςΟ/Ϧιʔε ▶ ґଘؔΛసஔ ▶ ֤Ϧιʔε issue ʹ࣮ issue Λྻڍ ▶ ґଘ͕ͳ͘ͳͬͨچϦιʔε͔Βॱ࣍ఫୀ
ϓϩδΣΫτͷऩଋ ચ͍ग़͠࡞ۀ ▶ 2ʙ3ϲ݄͔͚ͯશιʔείʔυΛಡΉ ▶ ݁ՌΛεϓϨουγʔτʹ·ͱΊΔ ▶ υϝΠϯ͕ࣝνʔϜϝϯόʔʹߦ͖Δ
ϓϩδΣΫτͷऩଋ ਐߦཧ ▶ Δ͜ͱͷ૯ྔ (είʔϓ) ܾ·͍ͬͯΔ ▶ ΥʔλʔϑΥʔϧత ▶ ༷Λཧͯ͠ॏཁͷ͍ػೳΛഇࢭ
▶ ରίετͰ༏ઌ͚ͮ ▶ ΞδϟΠϧత
·ͱΊ ▶ ͍·ྑ͍ͱࢥ͑ΔͷΛͨΓલʹ࡞Δ ▶ কདྷͬͱΑ͘͢Δ͜ͱΛߟ͑Δ ▶ ͍·ྑ͍ͱߟ͍͑ͯΔཧ༝Λड͚ܧ͙ ▶ ෦తʹࣺͯΒΕΔΑ͏ʹ͢Δ ▶
ϨΨγʔίʔυͷߟݹֶؾ߹͍