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
8.7k
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
12k
仮想関数テーブルと型クラスを見比べる
tarao
1
1.2k
ジョブキューシステムFireworqのアーキテクチャ設計と運用時のベストプラクティス
tarao
1
4.3k
計算ファースト vs. 型ファースト / Computation First vs. Type First
tarao
4
21k
Percolatorを用いたカテゴリ分類
tarao
0
2.9k
Other Decks in Programming
See All in Programming
Composing an API the *right* way (Droidcon Berlin 2024)
zsmb
1
450
OpenAI/Gemini APIを使って EPUBを翻訳するCLIツールをつくってみた
tomiyan
0
790
Xcode 16のPreviewModifierと@Previewableを活用した効率的なプレビュー方法の考察
ojun9
2
160
CSC307 Lecture 12
javiergs
PRO
0
220
DynamoDB コスト最適化っぽいことの基本 with Terraform
kuro_kurorrr
2
250
CSC307 Lecture 08
javiergs
PRO
0
330
Play Billing Library 7.0.0 変更点まとめ@potatotips#88
kako351
0
160
ドメイン駆動設計の実践
masuda220
PRO
19
5.2k
DMMプラットフォームにおけるTiDBの導入から運用まで
pospome
7
3k
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
1
410
社内 LT 会を発足し、アウトプット文化を醸成させるために考えたこと・やったこと / Starting internal LT meetings and fostering an output culture
mackey0225
3
120
Featured
See All Featured
Happy Clients
brianwarren
94
6.6k
Designing for humans not robots
tammielis
247
25k
Designing for Performance
lara
604
67k
Building an army of robots
kneath
301
42k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.9k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
Practical Orchestrator
shlominoach
185
10k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
353
29k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
662
120k
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
Music & Morning Musume
bryan
43
5.9k
Building Effective Engineering Teams - LeadDev
addyosmani
47
2.2k
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ϲ݄͔͚ͯશιʔείʔυΛಡΉ ▶ ݁ՌΛεϓϨουγʔτʹ·ͱΊΔ ▶ υϝΠϯ͕ࣝνʔϜϝϯόʔʹߦ͖Δ
ϓϩδΣΫτͷऩଋ ਐߦཧ ▶ Δ͜ͱͷ૯ྔ (είʔϓ) ܾ·͍ͬͯΔ ▶ ΥʔλʔϑΥʔϧత ▶ ༷Λཧͯ͠ॏཁͷ͍ػೳΛഇࢭ
▶ ରίετͰ༏ઌ͚ͮ ▶ ΞδϟΠϧత
·ͱΊ ▶ ͍·ྑ͍ͱࢥ͑ΔͷΛͨΓલʹ࡞Δ ▶ কདྷͬͱΑ͘͢Δ͜ͱΛߟ͑Δ ▶ ͍·ྑ͍ͱߟ͍͑ͯΔཧ༝Λड͚ܧ͙ ▶ ෦తʹࣺͯΒΕΔΑ͏ʹ͢Δ ▶
ϨΨγʔίʔυͷߟݹֶؾ߹͍