Slide 1

Slide 1 text

ΫϦʔϯΞʔΩςΫνϟͷ ߟ͑ํʹ΋ͱͮ͘ Laravel ͱͷ෇͖߹͍͔ͨ PHP Conference Okinawa 2019 @okashoi WILLGATE, Inc.

Slide 2

Slide 2 text

͸͡Ίʹ • εϥΠυ͸ެ։ࡁΈͰ͢ • ࣸਅ౳΋׻ܴͰ͢ 🙆 • ײ૝ɾϑΟʔυόοΫ౳͓଴͍ͪͯ͠·͢ʂ • ϋογϡλά #phpconokinawa 2

Slide 3

Slide 3 text

͸͡Ίʹ 
 ※͜ͷൃද͸ 2019/09/21 ։࠵ͷ
 ʮPHP ΧϯϑΝϨϯε๺ւಓ 2019ʯ
 Ͱͷൃදͱಉ͡಺༰Ͱ͢ɻ 3

Slide 4

Slide 4 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 4

Slide 5

Slide 5 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 5

Slide 6

Slide 6 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 6

Slide 7

Slide 7 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 7

Slide 8

Slide 8 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 8

Slide 9

Slide 9 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 9

Slide 10

Slide 10 text

͜ͷτʔΫͷΊ͟͢ͱ͜Ζ🏁 ҎԼͷ͜ͱΛ஌ͬͯ΋Β͏ • ΫϦʔϯΞʔΩςΫνϟͷίΞͱͳΔߟ͑ํ • Laravel ͱͷڞଘͤ͞ํ ͦͯ͠ɺগ͠Ͱ΋ࠓޙͷ։ൃʹ׆͔ͯ͠΋Β͏ 10

Slide 11

Slide 11 text

͜ͷτʔΫͰ࿩͞ͳ͍͜ͱ🙅 • ʰΫϦʔϯΞʔΩςΫνϟʱʹग़ͯ͘Δ֓೦ ͷৄࡉͳղઆ • Laravel ͷػೳͷղઆ • ۩ମతͳ࣮૷Ϩϕϧͷ͓࿩ 11

Slide 12

Slide 12 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 12

Slide 13

Slide 13 text

ݪయʢ2012೥ʣ ”The Clean Architecture - The Clean Code Blog”, https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html 13

Slide 14

Slide 14 text

ॻ੶ 14 2017 ೥ॳ൛ൃߦ 2018 ೥ॳ൛ൃߦ

Slide 15

Slide 15 text

ΫϦʔϯΞʔΩςΫνϟͷਤ ग़యɿ”The Clean Architecture - The Clean Code Blog”, https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html 15

Slide 16

Slide 16 text

ΫϦʔϯΞʔΩςΫνϟͷਤ • ΫϦʔϯΞʔΩςΫνϟʹ͍ͭͯௐ΂Δͱ
 ·ͣ໨ʹ͢Δਤ • ຊτʔΫͰ͸֤૚ͷৄࡉͳղઆ͸͠ͳ͍ • ͜ͷਤʹ஧࣮ʹ࣮૷͑͢͞Ε͹Α͍ɺͱ͍͏ Θ͚Ͱ͸ͳ͍ 16

Slide 17

Slide 17 text

ԿΛ໨తͱ͍ͯ͠Δ͔ʁ • ಠཱ։ൃՄೳ • ಠཱσϓϩΠՄೳʢ˞ʣ • ςετՄೳ ※ PHP ։ൃʹ͓͍ͯ͸Πϝʔδ͠ʹ͍͔͘΋ 17

Slide 18

Slide 18 text

“ιϑτ΢ΣΞΞʔΩςΫνϟͷ໨త͸ɺ
 ٻΊΒΕΔγεςϜΛߏஙɾอक͢ΔͨΊʹ ඞཁͳਓࡐΛ࠷খݶʹ཈͑Δ͜ͱͰ͋Δɻ” 18

Slide 19

Slide 19 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 19

Slide 20

Slide 20 text

ίΞͱͳΔߟ͑ํ ʮॏཁͳ΋ͷʯΛʮࠣࡉͳ΋ͷʯʹґଘͤ͞ͳ͍ 20

Slide 21

Slide 21 text

ॏཁͳ΋ͷʁ 21 σʔλϕʔε ϑϨʔϜϫʔΫ ςετ 6* 8FC 03.

Slide 22

Slide 22 text

ॏཁͳ΋ͷʁ 22 σʔλϕʔε ϑϨʔϜϫʔΫ ςετ 6* 8FC 03. 🙅 ⾠͋͘·ͰΫϦʔϯΞʔΩςΫνϟͷจ຺ͷ࿩

Slide 23

Slide 23 text

ॏཁͳ΋ͷʁ ॏཁͳ΋ͷ͸ʮϏδωεϧʔϧʯ 23

Slide 24

Slide 24 text

ΫϦʔϯΞʔΩςΫνϟͷਤ 24

Slide 25

Slide 25 text

ॏཁͳ΋ͷʁ ॏཁͳ΋ͷ͸ʮϏδωεϧʔϧʯ • ΤϯςΟςΟʢEnterprise Business Rulesʣ • ࠷ॏཁϏδωεϧʔϧ • ΞϓϦέʔγϣϯ͕ଘࡏ͠ͳͯ͘΋ݱ࣮ੈքʹଘࡏ͢Δ • ϢʔεέʔεʢApplication Business Rulesʣ • ΞϓϦέʔγϣϯݻ༗ͷϏδωεϧʔϧ 25

Slide 26

Slide 26 text

ࢀߟɿ https://little-hands.hatenablog.com/entry/2019/07/26/ domain-knowledge 26

Slide 27

Slide 27 text

ίΞͱͳΔߟ͑ํ ʮॏཁͳ΋ͷʯΛʮࠣࡉͳ΋ͷʯʹґଘͤ͞ͳ͍ 27

Slide 28

Slide 28 text

ίΞͱͳΔߟ͑ํ ʮॏཁͳ΋ͷʯΛʮࠣࡉͳ΋ͷʯʹґଘͤ͞ͳ͍ 28 ɹɹ ↑ Ͳ͏΍ͬͯʁ

Slide 29

Slide 29 text

ґଘؔ܎ٯస 29

Slide 30

Slide 30 text

యܕతͳґଘؔ܎ͷίʔυ package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 30 package bar; class Bar { function process() { // do something... } }

Slide 31

Slide 31 text

యܕతͳґଘؔ܎ͷίʔυ package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 31 package bar; class Bar { function process() { // do something... } } foo ͔Β bar ͷॲཧΛݺͼग़͢ = ॲཧͷํ޲ foo → bar

Slide 32

Slide 32 text

యܕతͳґଘؔ܎ͷίʔυ package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 32 package bar; class Bar { function process() { // do something... } } foo ͕ bar ͷ͜ͱΛ஌͍ͬͯΔ = ґଘͷํ޲ foo → bar

Slide 33

Slide 33 text

యܕతͳґଘؔ܎ͷίʔυ package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 33 package bar; class Bar { function process() { // do something... } } ॲཧͷํ޲ foo → bar ґଘͷํ޲ foo → bar

Slide 34

Slide 34 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 34 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }

Slide 35

Slide 35 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 35 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }

Slide 36

Slide 36 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 36 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } foo ͔Β bar ͷॲཧΛݺͼग़͢ = ॲཧͷํ޲ foo → bar

Slide 37

Slide 37 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 37 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } bar ͕ foo ͷ͜ͱΛ஌͍ͬͯΔ = ґଘͷํ޲ foo ← bar

Slide 38

Slide 38 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 38 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } ॲཧͷํ޲ foo → bar ґଘͷํ޲ foo ← bar

Slide 39

Slide 39 text

= ґଘͷํ޲͸ࣗ༝ʹܾΊΒΕΔ ʢॲཧͷํ޲ʹӨڹ͠ͳ͍ʣ 39

Slide 40

Slide 40 text

“ιϑτ΢ΣΞΞʔΩςΫτ͸ɺ
 γεςϜʹ͋Δ͢΂ͯͷιʔείʔυͷ
 ґଘؔ܎ͷํ޲Λઈରతʹ੍ޚͰ͖Δ” 40

Slide 41

Slide 41 text

Կ͕خ͍͠ͷ͔ʁ • Ұൠ࿦ͱͯ͠ɺԿ͔Λมߋͨ͠ͱ͖
 ͦΕʹґଘ͍ͯ͠Δ΋ͷશͯʹӨڹ͕ٴͿ ➡ มߋ͕ى͜Γʹ͍͘΋ͷʹґଘ͢ΔΑ͏ʹ
 ઃܭ͢Δ͜ͱͰӨڹΛখ͘͞ཹΊΒΕΔ 41

Slide 42

Slide 42 text

ίΞͱͳΔߟ͑ํ ʮॏཁͳ΋ͷʯΛʮࠣࡉͳ΋ͷʯʹґଘͤ͞ͳ͍ 42 σʔλϕʔεɾ UIɾϑϨʔϜϫʔΫͳͲ ༰қʹมߋͰ͖Δ Ϗδωεϧʔϧ มߋ͕ى͜Γʹ͍͘

Slide 43

Slide 43 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 43

Slide 44

Slide 44 text

Laravel Λ࢖͏ಈػ • DIʢґଘੑͷ஫ೖʣͷͨΊͷڧྗͳ͘͠Έ • ศརͳίϯϙʔωϯτ܊ʢEloquent ͳͲʣ 44

Slide 45

Slide 45 text

Laravel ͱͷ෇͖߹͍͔ͨ • খ͍͞ύοέʔδ୯Ґʹ෼ׂͯ͠։ൃ
 Service Provider ͰͦΕΒΛ౷߹͢Δ • Laravel ͷػೳΛ࢖͏৔߹͸
 ϏδωεϧʔϧΑΓ΋֎ଆͷ૚Ͱ࢖͏ 45

Slide 46

Slide 46 text

Laravel ͱͷ෇͖߹͍͔ͨ • খ͍͞ύοέʔδ୯Ґʹ෼ׂͯ͠։ൃ
 Service Provider ͰͦΕΒΛ౷߹͢Δ • Laravel ͷػೳΛ࢖͏৔߹͸
 ϏδωεϧʔϧΑΓ΋֎ଆͷ૚Ͱ࢖͏ 46

Slide 47

Slide 47 text

ࢀߟεϥΠυ@Laravel JP Conference 2019 https://speakerdeck.com/mikakane/laravel-package- development 47

Slide 48

Slide 48 text

σΟϨΫτϦߏ੒ 48 packages ҎԼʹ
 ύοέʔδΛ࡞ͬͯΏ͘

Slide 49

Slide 49 text

Service Provider • ΠϯλʔϑΣʔεͱ࣮૷ͷΫϥεΛ݁ͼ͚ͭΔ • Πϝʔδɿن֨ʹଇͬͯ࡞ΒΕͨ෦඼Λ૊Έཱͯͯ
 Ұͭͷ੡඼Λ࡞Δ • ن֨ = ΠϯλʔϑΣʔε • ੡඼ = ΞϓϦέʔγϣϯ 49

Slide 50

Slide 50 text

Service Provider ΠϯλʔϑΣʔεͱ۩৅ΫϥεΛ݁ͼ͚ͭΔ 50 class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->bind(IdProvider::class, AutoIncrementTaskIdProvider::class); $this->app->bind(TaskRepositoryInterface::class, TaskRepository::class); }

Slide 51

Slide 51 text

Service Container ΠϯλʔϑΣʔεͰܕએݴΛ͢Δ͕
 ࣮ࡍʹ͸۩৅ΫϥεͷΠϯελϯε͕౉͞ΕΔ 51 /** * Interactor constructor. * @param IdProvider $idProvider * @param TaskRepository $taskRepository * @param NormalOutputBoundary $normalOutputBoundary */ public function __construct(IdProvider $idProvider, TaskRepository $taskRepository, … { $this->idProvider = $idProvider; $this->taskRepository = $taskRepository; $this->normalOutputBoundary = $normalOutputBoundary; }

Slide 52

Slide 52 text

Laravel ͱͷ෇͖߹͍͔ͨ • খ͍͞ύοέʔδ୯Ґʹ෼ׂͯ͠։ൃ
 Service Provider ͰͦΕΒΛ౷߹͢Δ • Laravel ͷػೳΛ࢖͏৔߹͸
 ϏδωεϧʔϧΑΓ΋֎ଆͷ૚Ͱ࢖͏ 52

Slide 53

Slide 53 text

Clean Architecture ΋͏ͻͱͭͷਤ ग़యɿʰClean Architecture ୡਓʹֶͿιϑτ΢ΣΞͷߏ଄ͱઃܭʱ ʢKindle ൛ɺ ҐஔNo. 3228/6016ʣ 53

Slide 54

Slide 54 text

ΤϯςΟςΟ 54

Slide 55

Slide 55 text

ΤϯςΟςΟ 55

Slide 56

Slide 56 text

࠷ॳʹΤϯςΟςΟΛநग़ • ΞϓϦέʔγϣϯʹґΒͳ͍ϧʔϧΛݟग़͢ • ػೳҰཡͰ͸ͳ͍ TODO ؅ཧΞϓϦͷྫɿ ʮλεΫΛ࡞੒Ͱ͖ΔʯʮλεΫ໊ΛมߋͰ͖Δʯ ʮλεΫ͸ඞͣλεΫIDͱλεΫ໊Λ࣋ͭʯ
 ɹʮணख೔ʹաڈͷ೔෇ΛೳಈతʹઃఆͰ͖ͳ͍ʯ 56

Slide 57

Slide 57 text

ΤϯςΟςΟͷ࣮૷ • நग़ͨ͠ϏδωεϧʔϧΛ࣮૷Ͱදݱ͢Δ • ϑϨʔϜϫʔΫ΍σʔλϕʔε౳ʹґଘͤ͞ͳ͍ • POPOʢPlain Old PHP ObjectʣͰॻ͘ ➡ ґଘ͢Δ΋ͷ͕ແ͍ͷͰಠཱͯ͠։ൃՄೳ 57

Slide 58

Slide 58 text

ϑϨʔϜϫʔΫʹґଘͤ͞ͳ͍ PHP ૊ΈࠐΈͷΫϥεఔ౓ʹͱͲΊΔ 58

Slide 59

Slide 59 text

Ϣʔεέʔε 59

Slide 60

Slide 60 text

Ϣʔεέʔε 60

Slide 61

Slide 61 text

Ϣʔεέʔεͷ࣮૷ • ΞϓϦέʔγϣϯݻ༗ͷϏδωεϧʔϧ • ΞϓϦέʔγϣϯͷʮػೳʯͱ΋
 ݴ͍͔͑ΒΕΔ • ೖग़ྗͷσʔλ͸ഔମ΍σʔλϕʔεʹ
 ґଘ͠ͳ͍ܗʹ͢Δ 61

Slide 62

Slide 62 text

σʔλϕʔε౳ʹґଘͤ͞ͳ͍ ग़ྗ΍σʔλૢ࡞ͷΠϯλʔϑΣʔεΛఆٛ 62

Slide 63

Slide 63 text

σʔλϕʔε 63

Slide 64

Slide 64 text

WebʗUI 64

Slide 65

Slide 65 text

σʔλϕʔεʗWebʗUI ಉ৺ԁͷ֎ଆ 65

Slide 66

Slide 66 text

σʔλϕʔεʗWebʗUI • ϢʔεέʔεͰఆٛͨ͠ΠϯλʔϑΣʔεΛ࣮૷ • ͜ͷ͋ͨΓ͸ϑϨʔϜϫʔΫʹґଘͤͯ͞΋🙆 • Eloquent ౳Λ࢖͏ͳΒ͜͜Ͱ࢖͏ 66

Slide 67

Slide 67 text

$task->name()->value(), 'note' => $task->note()->value(), ]); ΠϯλʔϑΣʔεͷ࣮૷ ϢʔεέʔεͰఆٛͨ͠ΠϯλʔϑΣʔεΛ࣮૷ 67

Slide 68

Slide 68 text

$task->name()->value(), 'note' => $task->note()->value(), ]); ΠϯλʔϑΣʔεͷ࣮૷ Eloquent ౳͸͜͜Ͱ࢖ͬͯྑ͍ 68

Slide 69

Slide 69 text

“ϑϨʔϜϫʔΫΛ࢖͏͜ͱ͸໰୊ͳ͍ɻ
 ͨͩ͠ɺ݁߹͠ͳ͍͜ͱ͕େ੾ͩɻ
 ϑϨʔϜϫʔΫͱ͸Ұఆͷڑ཭Λอͭ͜ͱɻ
 ϑϨʔϜϫʔΫ͸ɺΞʔΩςΫνϟͷ
 ԁͷ֎ଆʹ͋Δ΋ͷͱͯ͠ѻ͓͏ɻ” 69

Slide 70

Slide 70 text

ࢀߟɿαϯϓϧίʔυʢWIPʣ https://github.com/okashoi/laravel-clean- architecture • ͋͘·ͰʮҰྫʯͰ͋Δ͜ͱʹཹҙ • ͜ͷܗ͕ઈରతͳ౴͑Ͱ͸ͳ͍ • ࠓޙɺεϥΠυͷ಺༰ͱมΘΔՄೳੑ΋͋Δ 70

Slide 71

Slide 71 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • Laravel ͱͷ෇͖߹͍͔ͨʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 71

Slide 72

Slide 72 text

ίΞͱͳΔߟ͑ํ ʮॏཁͳ΋ͷʯΛʮࠣࡉͳ΋ͷʯʹґଘͤ͞ͳ͍ 72 σʔλϕʔεɾ UIɾϑϨʔϜϫʔΫͳͲ ༰қʹมߋͰ͖Δ Ϗδωεϧʔϧ มߋ͕ى͜Γʹ͍͘

Slide 73

Slide 73 text

ґଘؔ܎ٯసͨ͠ίʔυ package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 73 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }

Slide 74

Slide 74 text

Laravel ͱͷ෇͖߹͍͔ͨ • খ͍͞ύοέʔδ୯Ґʹ෼ׂͯ͠։ൃ
 Service Provider ͰͦΕΒΛ౷߹͢Δ • Laravel ͷػೳΛ࢖͏৔߹͸
 ϏδωεϧʔϧΑΓ΋֎ଆͷ૚Ͱ࢖͏ 74

Slide 75

Slide 75 text

໨࣍ • ͜ͷτʔΫͷΊ͟͢ͱ͜Ζʢ2 ෼ʣ • ΫϦʔϯΞʔΩςΫνϟͷ֓ཁʢ3 ෼ʣ • ίΞͱͳΔߟ͑ํʢ5 ෼ʣ • ۩ମతͳίʔυྫʢ10 ෼ʣ • ·ͱΊʢ3 ෼ʣ • ࣗݾ঺հʢ2 ෼ʣ 75

Slide 76

Slide 76 text

ࣗݾ঺հ Ԭా ਖ਼ฏ / ͓͔͠ΐ͍ @okashoi @okashoi ΞʔΩςΫτ ݉ ٕज़޿ใ 76

Slide 77

Slide 77 text

ࣗݾ঺հ ίϛϡχςΟ׆ಈ • Hacker’s GATE ӡӦ 77

Slide 78

Slide 78 text

ࣗݾ঺հ ίϛϡχςΟ׆ಈ • एख΋ͷͮ͘Γूஂ Oysters ϝϯόʔ 78

Slide 79

Slide 79 text

ࣗݾ঺հ ίϛϡχςΟ׆ಈ • Laravel.shibuya 79

Slide 80

Slide 80 text

ࣗݾ঺հ ίϛϡχςΟ׆ಈ • Laravel Shibuya Radio ΋ެ։ͯ͠·͢ʂ 80

Slide 81

Slide 81 text

ࣗݾ঺հ ίϛϡχςΟ׆ಈ • Laravel JP Conference 2020 ίΞελοϑ 81 https://conference2020.laravel.jp/

Slide 82

Slide 82 text

ࣗݾ঺հ Ԭా ਖ਼ฏ / ͓͔͠ΐ͍ @okashoi @okashoi ΞʔΩςΫτ ݉ ٕज़޿ใ 82 ࠙਌ձ౳Ͱ͓࿩͠·͠ΐ͏😄