Slide 1

Slide 1 text

Play2/ScalaͰυϝΠϯۦಈઃܭΛར༻ͨ͠ େن໛WebΞϓϦέʔγϣϯͷ εΫϥϜ։ൃͷצॴ גࣜձࣾυϫϯΰ χίχίੜ์ૹ ٢ଜ ૯Ұ࿠ (@sifue)

Slide 2

Slide 2 text

٢ଜ ૯Ұ࿠ (@sifue) • ݩʑ͸ɺ੡଄ۀͷۀ຿վֵΛϝ Πϯͱ͢ΔγεςϜίϯαϧ ςΟϯάͰಇ͘SE • झຯ͸ήʔϜ࣮گ (࠷ۙ͸FF14) ͱϓϩάϥϛϯά • ޷͖ͳݴޠ͸Java • 2012೥4݄ɺझຯͷήʔϜ࣮گ ΍ήʔϜ༻πʔϧ։ൃ͕ߴͯ͡ υϫϯΰ΁

Slide 3

Slide 3 text

ࠓ೔͸χίχίੜ์ૹΛScalaͰॻ͖௚͍ͯ͠Δ࿩

Slide 4

Slide 4 text

ͦ΋ͦ΋ͳͥॻ͖௚͞Ͷ͹ ͳΒͳ͔ͬͨͷ͔ʁ

Slide 5

Slide 5 text

2012೥12݄

Slide 6

Slide 6 text

ίʔυͷٕज़తෛ࠴ • PHPͷίʔυߦ਺ 300ສߦʹର͠ • ίϐʔˍϖʔετ਺1ສϲॴ • જࡏతෆ۩߹਺(PMDܯࠂ஋)͕ 4500ϲॴ • ॥؀తෳࡶ౓600௒ϝιου͕͍͘ ͭ΋ଘࡏ • IDEαϙʔτ͕Ͱ͖ͳ͍จࣈྻͷϦ ϑϨΫγϣϯͷଟ͍ɺgrepෆೳͳ PHPͷίʔυ

Slide 7

Slide 7 text

॥؀తෳࡶ౓600௒ϝιου͸ ྫ͑ΔͳΒऴ൫ͷδΣϯΨ • ਓྨͷӳ஌Λ݁ूͯ͠΋ෆ۩ ߹ΛೖΕͣʹෆ۩߹վम͢Δ ͜ͱ͕ࠔ೉ͳϨϕϧ • ࠓ΋ղফ͞Ε͍ͯͳ͍ • ෆ۩߹मਖ਼Λ͢Δ਺ΑΓ΋ͦ ΕʹΑͬͯൃݱ͢Δෆ۩߹ͷ ํ͕ଟ͘ͳͬͯ͠·͏ͱ͍ ͏ɺ·͞ʹෛ࠴ ॥؀తෳ ࡶ౓ ෳࡶ͞ͷঢ়ଶ όάࠞೖ֬཰ 10ҎԼ 30ҎԼ 50ҎԼ 75Ҏ্ ඇৗʹྑ͍ߏ଄ 25.00% ߏ଄తͳϦεΫ ͋Γ 40.00% ςετෆՄೳ 75.00% ͍͔ͳΔมߋ΋ ޡमਖ਼ΛੜΉ 98.00%

Slide 8

Slide 8 text

ͳͥ͜ͷΑ͏ͳࣄʹ ͳͬͯ͠·ͬͨͷ͔ʁ • اըͷཁ݅ͱక੾༏ઌͰɺιϑτ΢ΣΞͷ಺෦඼࣭΍ ϓϩηε඼࣭Λૄ͔ʹ͢Δ։ൃମ੍ • ଟ͘ͷਓһ͕௥Ճ͞Ε͍͕ͯͨɺࠜຊमਖ਼ΛڪΕΔ༨ ΓύονϫʔΫతͳमਖ਼͕ଟ࣮͘ࢪ͞Εͨ • ݁Ռɺίϐϖ͹͔Γͷ1ສߦͷΫϥε΍4000ߦͷϝ ιου͕ੜ·Εɺ300ສߦͷ͍ͨΔॴʹ҉໧ͷӨڹൣ ғΛ࣋ͭίʔυϕʔεʹͳͬͨ

Slide 9

Slide 9 text

͜ͷΑ͏ͳঢ়گʹରͯ͠ ଧͪग़ͨ͠ۓٸରԠ

Slide 10

Slide 10 text

1. ֤ਓͷλεΫΛݟ͑Δঢ়گʹͯ͠ɺޮ཰Α͘Ϧιʔ εΛ഑෼Ͱ͖ΔΑ͏ʹ͢Δ 2. ͍Βͳ͍ػೳΛ࡟ͬͯอकίετΛԼ͛Δ 3. ΧʔϘʔΠݸਓ։ൃ͔ΒΞδϟΠϧ։ൃମ੍΁Ҡߦ ͯ͠νʔϜͷར఺Λ׆͔ͤΔΑ͏ʹ͢Δ 4. ௕ظҊ݅ɺಥൃରԠɺվળ׆ಈͷ3ͭͷνʔϜʹ෼ ׂ͠ɺ҆ఆͯ͠վળ׆ಈΛߦ͑ΔΑ͏ʹ͢Δ

Slide 11

Slide 11 text

3ϲ݄ؒͷରԠͷ݁Ռ 1. େن໛ͳো֐ͱٳ೔ग़͕ࣾݮͬͨ 2. ίʔυߦ਺ͷ૿Ճ͕ࢭ·ͬͨ 3. ϝϯόʔ͕ٳΜͰ΋νʔϜ͕ճΔΑ͏ʹͳͬͨ 4. ཭৬͕ݮͬͨ

Slide 12

Slide 12 text

ͱ͸͍͑ɺطʹऴ൫ͷδΣϯΨʹ ͸ݱঢ়ҡ͕࣋ਫ਼Ұഋͩͬͨ

Slide 13

Slide 13 text

ͦͯ͠ɺχίੜΛॻ͖௚͢ χίੜ2ϓϩδΣΫτ͕ൃ଍

Slide 14

Slide 14 text

໨త͸ܧଓతͳେن໛഑৴ʹ଱͑ΒΕΔΑ ͏ʹ͢ΔͨΊҎԼͷੑೳΛ୲อ͢Δ͜ͱ 1. εέʔϥϏϦςΟ 2. ҆ఆੑɾϑΥʔϧττϨϥϯτੑ 3. อकੑͱ֦ுੑ 4. ύϑΥʔϚϯε Ҏ্ͷॱ൪ͷ༏ઌॱҐͰ໨ඪΛઃఆ͢Δ͜ͱͱͳͬͨɻࠓͷઃܭͰ ͸αʔόʔΛ଍͢ͷʹେ͖ͳγεςϜมߋίετ͕ඞཁͰ͋Γɺࠓ ޙ༰қʹεέʔϧΞ΢τͰ͖Δ͜ͱʹओ؟Λ͓͍ͨɻ

Slide 15

Slide 15 text

2013೥4݄ʹ4ਓͰϓϩδΣΫτελʔτ ࠨ୺͕୲౰෦௕ͷླ໦ܓҰ͞Μɺӈ4ਓ͕ϝϯόʔ

Slide 16

Slide 16 text

εϞʔϧελʔτ/εϞʔϧϦϦʔε ϓϩτλΠϓ։ൃ׬͔ྃΒ࣮ࡍͷϦϦʔε·ͰΛ6ϲ݄Ҏ಺ʹઃఆ͠ɺཁ݅ΛߜΔ ͨΊʹɺཁ݅ͷগͳ͍޿ࠂܕαΠζͷϓϨΠϠʔͱͯ͠։ൃ͢Δ͜ͱʹͨ͠

Slide 17

Slide 17 text

ϓϩτλΠϓ࡞੒Λ͠ͳ͕Βৗʹͦ͜·Ͱ ͷ੒ՌΛ̎िؒʹҰ౓γϣʔέʔεͰ঺հ • ৗʹશͯͷؔ܎ऀ͕ϓϩδΣΫτͷ͜͜·Ͱͷ੒ՌΛ֬ ೝͰ͖Δγϣʔέʔε؀ڥΛ࡞੒ɻ্ͷεϥΠυ͸ͨͩ ͷֆ͕ͩɺ࣮ࡍʹ6݄ʹಈ͘΋ͷΛͦ͜Ͱ঺հͨ͠ɻ

Slide 18

Slide 18 text

݁Ռ10݄தʹ͸ແࣄɺ ޿ࠂܕϓϨΠϠʔͷϦϦʔε੒ޭ • ه೦͢΂͖࠷ॳͷ൪૊͸νϯΞφΰͰͨ͠

Slide 19

Slide 19 text

࠷ऴతʹϝϯόʔ͸13໊·Ͱ૿͑ɺ 12݄ͷ೥຤ಛผ൪૊Λੜ2Ͱ࣮ࢪ • େن໛ͷ઀ଓ͕૝ఆ͞Εͨ೥຤ͷখྛ޾ࢠ͞ΜͷΧ΢ϯτμ΢ϯ൪૊Ͱ ੜ2ͷϓϨΠϠʔΛར༻ͨ͠์ૹΛ࣮ࢪɺແࣄ੒ޭʹऴΘΔ

Slide 20

Slide 20 text

ࠓ೔ͷ͓࿩͸͔͜͜Βɺ ͜ͷϓϩδΣΫτͷཪଆΛ঺հ͠·͢ɻ

Slide 21

Slide 21 text

Play2/ScalaͰͷ େن໛WebΞϓϦέʔγϣϯ։ൃ

Slide 22

Slide 22 text

ͳͥScalaΛબ୒ͨ͠ͷ͔ʁ

Slide 23

Slide 23 text

• Java, Scala, PHP, Ruby͔Βͷબ୒ • อकੑͷ؍఺͔Β੩తܕ෇͚ͷݴޠΛ࢖͍͔ͨͬͨ • ύϑΥʔϚϯεͷݒ೦͸ϓϩτλΠϓ࡞੒ޙʹ൑அ͢ Δ͜ͱʹ • ޾͍ϓϩτλΠϓΛ࡞ͬͨϝϯόʔ͸શһJava/Ruby/ؔ ਺ܕݴޠͳͲͷܦݧ͕͋ΓɺScalaʹ఍߅͸ͳ͔ͬͨ • ͨͩ͠ɺ్த͔ΒՃΘͬͨPHP͔͠΍ͬͯ͜ͳ͔ͬͨϝ ϯόʔ͕ScalaΛ΍Δʹ͋ͨͬͯ͸ਏ͍໘͕͋ͬͨ

Slide 24

Slide 24 text

PHP͔͠΍ͬͯ͜ͳ͔ͬͨϝϯόʔ͕ ScalaΛ΍Δʹ͋ͨͬͯωοΫʹͳΔ஌ࣝ 1. ΞϧΰϦζϜͱσʔλߏ଄ 2. ७ਮؔ਺ܕϓϩάϥϛϯά 3. valͱvar 4. implicit 5. ฒߦϓϩάϥϛϯάͷ஌ࣝ 6. JVMͱJavaϥΠϒϥϦͷ࢓૊Έ

Slide 25

Slide 25 text

1.ΞϧΰϦζϜͱσʔλߏ଄ • PHP͸ຊ౰ʹૉ੖Β͍͠ݴޠͰɺجຊશͯͷίϨΫγϣϯΛ arrayͰѻ͏ͨΊɺσʔλߏ଄౳ʹৄ͍͠ඞཁ͕ͳ͔ͬͨ • ࠓ·ͰPHPͷarray͔͠࢖Θͳ͔ͬͨਓʹɺScalaͰ഑ྻͱ࿈ ݁ϦετͱπϦʔηοτͱϋογϡϚοϓ…·ͨ͜ΕΒͷෆ มɺՄมɺฒߦίϨΫγϣϯΛ࢖͍෼͚ͤ͞Δͷ͸೉͍͠ • ରࡦͱͯ͠ϓϩάϥϛϯάίϯςετνϟϨϯδϒοΫΛར ༻ͯ͠ษڧձΛ։࠵ɻ൒೥Ͱ20໊ʹ࣮ࢪͨ͠ɻ

Slide 26

Slide 26 text

ϓϩάϥϛϯάίϯςετνϟϨϯ δϒοΫॳڃฤͷษڧձ • ୈ1ճ ࠶ؼؔ਺ͱਂ͞༏ઌ୳ࡧ • ୈ2ճ ελοΫͱΩϡʔͱ෯༏ઌ୳ࡧ • ୈ3ճ ᩦཉ๏ • ୈ4ճ ಈతܭը๏ͱϝϞԽ • ୈ5ճ ϓϥΠΦϦςΟʔΩϡʔ • ୈ6ճ Union-Find໦ • ୈ7ճ μΠΫετϥ๏

Slide 27

Slide 27 text

2. ७ਮؔ਺ܕϓϩάϥϛϯά • ແཧʹద༻͠ͳ͍ • ίʔυࣗମ΋΄ͱΜͲ͜ͷελΠϧͰॻ͔Ε͓ͯΒͣɺ ϕλʔJavaͱͯ͠ར༻͍ͯ͠Δଆ໘͕ڧ͍ • ࢖͏෼ʹ͸؆ܿʹ͔͚Δ͜ͱ΋͋Γศར

Slide 28

Slide 28 text

3. valͱvar • valΛపఈ • ՄมίϨΫγϣϯ΋جຊతʹ࢖Θͳ͍ • పఈ͔ͨ͠ΒͱݴͬͯͦΜͳʹࠔΔ͜ͱ͸ͳ͍ • αʔόʔͰϝϞϦϦʔΫ͕ൃੜͤͣૉ੖Β͍͠

Slide 29

Slide 29 text

4. implicit • ϥΠϒϥϦ૚Λআ͍ͯ͸ۃྗར༻͠ͳ͍ • ಛʹimplicit converterΛΨϦΨϦ࢖ͬͨ෦෼͕ෛ࠴ʹͳΓ ΍͍͢ • ͻͱ͙ͭΒ͍ͳΒྑ͍͕3~4ݸಡΈग़ͨ͠Γɺείʔϓ ͝ͱʹҧ͏ίϯόʔλʔݺͼ࢝ΊΔͱେม… • ৑௕ͳهड़͸ݮΒͤͯྑ͍͕ɺଟ͘ͷ஋͕implicitͩͱpull requestͰͷίʔυϨϏϡʔͰΘ͔Γʹ͘͘ͳΔ

Slide 30

Slide 30 text

5. ฒߦϓϩάϥϛϯάͷ஌ࣝ • ActorͷτϥϒϧղܾʹͲ͏ͯ͠΋ඞཁʹͳΔ • ࠓ΋՝୊ͰɺࠓޙɺJavaฒߦॲཧϓϩάϥϛ ϯάͷษڧձΛ։࠵͍ͨ͠ • ࣮ࡍ͸ActorΛ७ਮͳ෼ࢄίϯϐϡʔςΟϯ άͷϑϨʔϜϫʔΫͱͯ͠͸࢖Θͣɺϫʔ ΧʔεϨουύλʔϯΛ࢖͏ϥΠϒϥϦͱ͠ ͯ࢖͍ͬͯΔଆ໘͕ڧ͍

Slide 31

Slide 31 text

6. JVMͱJavaϥΠϒϥϦͷ࢓૊Έ • ۀ຿ͷதͰগֶͣͭ͠΂͹OK • νʔϜʹ1ਓ͸JavaͷΤΩεύʔτ͕͍Ε͹͍࣋ͬͯͳ ͯ͘΋େৎ෉

Slide 32

Slide 32 text

ϓϩτλΠϓ։ൃͰ໛ࡧͨ͠ χίੜ2ͷΞʔΩςΫνϟ

Slide 33

Slide 33 text

ΠϯϑϥϝϯόʔʹσΠϦʔελϯ υΞοϓʹࢀՃͯ͠΋Βͬͨ • ΍͸Γίϛϡχέʔγϣϯ͕ॏཁ • ࠷ॳ͔ΒΠϯϑϥͷ੍໿ͳͲΛࡉ͔֬͘ೝ͍ͯͨ͘͠Ίʹ ίϛϡχέʔγϣϯίετΛ෷ͬͨ • υϫϯΰͰ͸Πϯϑϥӡ༻ͱΞϓϦ։ൃͰ෦ॺ͕෼͔Εͯ ͓Γݱࡏ͸੮Λۙ͘ʹ͢Δ౳ͷӡ༻΋͞Ε͍ͯΔ • σεΫϨϏϡʔΛ࣮ࢪ͢Δࡍʹ΋ؾܰʹΠϯϑϥϝϯόʔ ݺ΂ͯॿ͔͍ͬͯΔ

Slide 34

Slide 34 text

Ϋϥ΢υͰ͸ͳ͘ΦϯϓϨϛεͱ͍͏બ୒ • IOύϑΥʔϚϯε • අ༻ • ࣾ಺ํ਑ͱͯ͠ • ͕ͩੈͷதͷྲྀΕతʹWebͷߏஙʹΫϥ΢υΛར༻ͨ͠Γ͢ ΔΑ͏ʹͳ͓ͬͯΓɺσʔληϯλʔ΍େن໛WebͷΠϯϑ ϥߏஙʹؔ͢Δϊ΢ϋ΢͕ϨΞʹͳΓɺਓࡐҭ੒ɺਓࡐ֬อ ͕՝୊ʹͳ͍ͬͯΔ

Slide 35

Slide 35 text

DBͷਫฏ෼ׂͱਨ௚෼ׂ • DBʹ͸MySQLΛར༻ • ਫฏ෼ׂ • 64bitͷIDͷதʹγϟʔυID(12bit)΍σʔλλΠϓID(10bit)ͳ ͲΛ૊ΈࠐΜͰɺDBͷγϟʔσΟϯά͕༰қʹͳΔΑ͏ʹ͠ ͍ͯΔ • InstagramͷIDઃܭɺPinterestͷIDઃܭɺTwitterͷsnowflake ͳͲΛࢀߟʹͨ͠ • ਨ௚෼ׂ͸ɺαΠζ͕খ͘͞γϟʔσΟϯά͕ෆཁͳڞ༗DBʹ ͷΈద༻͍ͯ͠Δ

Slide 36

Slide 36 text

̎ͭͷΩϟογϡ தԝredisͱϩʔΧϧredis • ΩϟογϡͰར༻͢ΔϩʔΧϧredis܈ͱதԝͰෳ਺ͷwebΠϯε λϯε͔Βར༻͢Δ଎͍σʔλετΞͱͯ͠ͷதԝredis܈ͱͷ࢖ ͍෼͚ɻͨͩதԝredis͸σʔλ࠷খԽͷͨΊ޻෉͍ͯ͠Δɻ web redis redis redis redis twemproxy redis

Slide 37

Slide 37 text

৑௕Խํ๏ • MySQL͸MHAͰ৑௕Խ • ౰ॳɺGTIDΛ༻͍ͨํ๏΋໛ࡧ͕ͨ͠ϑΣΠϧΦʔόʔͷμ ΢ϯλΠϜ͕MHAͷํ͕୹͔ͬͨͨΊ • ӡ༻ͱͯ͠͸ɺVIPΛར༻ͯ͠੾Γସ͑ͯରԠ • redis͸SentinelͰ৑௕Խ • தԝredisͷΈ • Ϛελʔঢ֨ͷࡍʹશͯͷσʔλͷίϐʔ͕૸ΔͷͰμ΢ϯ λΠϜΛগͳ͘͢ΔͨΊʹσʔλΛখ͘͢͞Δ޻෉͕ඞཁ

Slide 38

Slide 38 text

֎෦؀ڥ͔ΒෛՙΛ෼཭͢Δ ΞϓϦέʔγϣϯߏ੒ web༻ websocket༻ όον༻ ؅ཧπʔϧ༻ ֎෦Ϧιʔεதܧ༻ σʔλ ετΞ ΫϥΠ Ξϯτ ഑৴ܥ ϝοηʔδαʔόʔ • ߴෛՙ࣌͸ɺweb͔websokcet͕ඇৗʹॏ͘ͳΔͨΊͦͷଞ ͷػೳΛͰ͖Δ͚ͩಀ͢ߏ੒ͱͳ͍ͬͯΔ

Slide 39

Slide 39 text

websocketΞϓϦ̍ΠϯελϯεͰɺ 5ສϢʔβʔͷࢹௌ؅ཧΛ࣮ݱ • nginxͱNettyαʔόʔͰඇಉظIOΛར༻͢Δ͜ͱͰ࠷େ઀ଓ਺͕վળ • REST API͔ΒWebsocketΛར༻͢Δ͜ͱʹΑͬͯ઀ଓίετ͕௿ݮ • ݁ՌɺCPUόΠϯυͷ෦෼Ͱ͸طଘͷੜ์ૹͷ4ഒͷޮ཰Λ࣮ݱ • ύϑΥʔϚϯεଌఆํ๏ • gatling͕ૉ੖Β͍͠ετϨεπʔϧɺϨϙʔτ͕៉ྷ • ͨͩ͠websocket෦෼͸ϓϥάΠϯͷύϑΥʔϚϯε͕ग़ͣɺ݁ہ node.jsͰετϨεπʔϧΛࣗ࡞ɻnode.jsૉ੖Β͍͠ɻ

Slide 40

Slide 40 text

υϝΠϯۦಈઃܭͷಋೖ

Slide 41

Slide 41 text

χίੜ2ͰDDDΛ͢Δʹ͋ͨͬͯ ࠷௿ݶపఈͨ͜͠ͱ 1. ϢϏΩλεݴޠ 2. ϞσϧΛ࢖ͬͯٞ࿦͢Δͱ͍͏͜ͱ 3. ϨΠϠʔυΞʔΩςΫνϟ 4. ਖ਼͍͠ϞδϡʔϧԽΛߦ͍ɺมߋ࣌ʹಡ· ͳ͖Ό͍͚ͳ͍ίʔυΛݮΒ͢ 1. ίΞͷৠཹ 2. ൚༻αϒυϝΠϯͷ෼཭ 5. ΤϯςΟςΟͱ஋ΦϒδΣΫτͷ࢖͍෼͚ UI૚ ΞϓϦέʔγϣϯ૚ υϝΠϯ૚ Πϯϑϥ૚ ґଘํ޲ ґଘํ޲ ґଘํ޲ ਤ: ϨΠϠʔυΞʔΩςΫνϟ ※ DDD: Domain-Driven Design

Slide 42

Slide 42 text

Play2/Scala͸DDDΛ࣮ફ͢Δʹ͸ ͱͯ΋ྑ͍ϑϨʔϜϫʔΫ • CoC͕͖ͭ͘ͳ͘޷͖উखϑΥϧμ͕۷ΕΔ • ϚϧνϓϩδΣΫτػೳͰαϒϞδϡʔϧͷґଘؔ܎Λ࡞ΕɺϨΠϠʔ υΞʔΩςΫνϟͷڧ੍Ͱ͖Δ • υϝΠϯ૚ɺΠϯϑϥ૚͸playʹґଘ͠ͳ͍ͨͩͷjar • case class͕ΤϯςΟςΟͱ஋ΦϒδΣΫτͷ࡞੒ͷίετΛԼ͛Δ • ྫ͑͹ɺΠϯϑϥ૚ORMͷϚοϐϯάΫϥεͱυϝΠϯ૚ͷΤϯςΟ ςΟΛ෼͚Δ͜ͱͳͲ͕ۤʹͳΒͳ͍ɻ • play2ΛࣺͯΒΕΔΑ͏ʹ։ൃ͢Δ͜ͱ͕Մೳɻ ※ CoC:ʮઃఆΑΓن໿ʯʢCoC:Convention over Configurationʣ

Slide 43

Slide 43 text

ͱ͸ݴ͑ɺυϝΠϯۦಈઃܭ͕ࣗ ಋೖϋʔυϧ͕ߴ͍

Slide 44

Slide 44 text

ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ʹೖΔલʹϝϯόʔʹಡΜͰ΋Β͍͍ͨຊ

Slide 45

Slide 45 text

ଟ͍͠ɺͲΕ΋஋ஈ͕ߴ͍ʂ खʹೖΓʹ͍͘΋ͷ΋͋Δ...

Slide 46

Slide 46 text

࢓ํ͕ͳ͍͔Βࣾ಺Ͱߨशձ

Slide 47

Slide 47 text

ͦΜͳ࣌ͷڧ͍ຯํ

Slide 48

Slide 48 text

Youtubeʹ্͕͍ͬͯΔDevLoveͰ ౎ݩ͞Μ͕DDDΛղઆͨ࣌͠ͷϜʔϏʔ • ࣾ಺Ͱ͜ΕΛݟΔ্өձ͕3౓։͔ΕΔ΄Ͳૉ੖Β͍͠ө૾ (42෼) • http://youtu.be/FNEfk-dlIKU

Slide 49

Slide 49 text

͕ͩϢϏΩλεݴޠͷৢ੒ʹ͸ɺ೔ʑϞσϧ΍֓ ೦ʹ͍ͭͯاըɺΠϯϑϥΛަ͑ͯͷٞ࿦͕ඞཁ • ͍ۙ࠲੮ͱࡶஊ • ձٞମ΋ॏཁ • σΠϦʔελϯυΞοϓ • γϣʔέʔε • ೔ʑࡉ͔֬͘ೝɺٞ࿦

Slide 50

Slide 50 text

DDDΛ࣮ફ͢ΔՁ஋ͱ͸

Slide 51

Slide 51 text

DDDͰ͸ͳ͍ίʔυͷྫ • StreamModel.class.phpͷٞ࿦͸೉͍͠... (1ສߦ) ൪૊Ͱ͋Γ ൪૊Λ࡞Δ΋ͷͰ͋Γ ൪૊Λίϐʔͨ͠Γߋ৽ͨ͠ΓόοΫΞοϓΛͱͬͨΓ͢Δ΋ͷͰ͋Γ ετϦʔϜͰ͋Γ ੜ์ૹͰ͋Γ λΠϜγϑτͰ͋Γ λΠϜγϑτ༧໿ͷϦετΛݟΕΔ΋ͷͰ͋Γ ϝοηʔδαʔόʔΛׂΓ౰ͯΔ΋ͷͰ͋Γ ଟࠃ੶ԽΛ͢Δ΋ͷͰ͋Γ Ωϟογϡͱͷ௨৴Λ͢Δ΋ͷͰ͋Γ DBͱͷ௨৴Λ͢Δ΋ͷͰ͋Γ

Slide 52

Slide 52 text

ਆΫϥεʹ͍ͭͯͷٞ࿦͸೉͍͠ It’s difficult to talk about a “God class”. ?

Slide 53

Slide 53 text

ϢϏΩλεݴޠ͕ಋೖ͞ΕΔͱɺ ෳ਺ͷνʔϜͰڞ௨ͷݴޠΛ࢖ͬͯձ࿩͕Ͱ͖Δ • ετʔϦʔͷ಺༰ʹ͍ͭͯɺνʔϜ಺ɺνʔϜؔ܎ऀͱͷٞ࿦͕͠΍͘͢ͳΔ • ݁Ռͱͯ͠ɺγεςϜ಺ͷ࡞Γʹ͍ͭͯͷνʔϜશମͱཧղ౓͕ߴ·Δ • Programͱ͍͏Ϋϥε͸൪૊Ͱ͋Δ͚ͩͰ͋Δ • Streamͱ͍͏Ϋϥε͕ετϦʔϜͰ͋Δ͚ͩͰ͋Δ • Liveͱ͍͏Ϋϥε͕ੜ์ૹͰ͋Δ͚ͩͰ͋Δ • ੜ์ૹ͕͏·͘࡞Εͳ͍ͱ͔ɺετϦʔϜׂ͕Γ౰ͯΒΕͳ͍ͱ͔ͦΕ͕ ίʔυ্ͷͲ͜ͷ͸ͳ͔͠Θ͔Γ΍͍͢ • ແ࿦ϢϏΩλεݴޠ͕Ͱ͖Δࡍʹ͸௚઀ɺ·ͨ͸IRCͰ͔ͬ͠Γ૬ஊ͢Δඞཁ ͋Γ

Slide 54

Slide 54 text

ίʔυͱීஈཁ݅ʹ͍ͭͯ࿩͍ͯ͠Δݴޠͷ ဃ཭͕গͳ͘ͳΓɺϦϑΝΫλੑೳ͕͕͋Δ • ͨͩ͠ɺυϝΠϯ૚͚ͩ • υϝΠϯ૚΁ͷϏδωεϩδοΫͷू໿ʹର͢Δҙ͕ࣝࠜ෇͘ • ݁ՌɺϏδωεϩδοΫͷมߋͷϦϑΝΫλʹڧ͘ͳΔ • Կ౓͔ੜ์ૹͷ഑৴Πϯϑϥ΍ϝοηʔδαʔόʔͷར༻ͷཁ͕݅มΘ Δ౓ʹϦϑΝΫλϦϯάΛߦ͕ͬͨɺ໰୊ͳ͘ߦ͑ͨ • աڈ͸͜͏͍͏͜ͱΛ΍Ζ͏ͱͨ͠ࡍɺ͍Ζ͍Ζͳ৔ॴʹϏδωεϩ δοΫ͕ඈͼՐ͍ͯͯ͠ɺେ࢓ࣄɺσάϨ΋ଟ͔ͬͨ • ͨͩɺ͏͔ͬΓ͢ΔͱϏδωεϩδοΫ͕υϝΠϯ૚͔Βಀ͛ͯɺΞϓϦ έʔγϣϯ૚΍Πϯϑϥ૚ʹߦ͖͕ͪͳͷͰɺίʔυϨϏϡʔɺઃܭϨ ϏϡʔͰͷೖ೦ͳ؂ࢹͱܧଓతͳϦϑΝΫλϦϯά͕ඞཁͰ͋Δ

Slide 55

Slide 55 text

ΞϓϦέʔγϣϯͷӡ༻ͱ νʔϜ։ൃ

Slide 56

Slide 56 text

CapistranoʹΑΔσϓϩΠ • PlayͷઃఆͷςϯϓϨʔτԽΛerbͱymlͰ࣮ݱ • ͍ΖΜͳΠϯελϯεʹಉ͜͡ͱΛॻ͘ઃఆʹ༗ޮ • ઃఆϓϩύςΟ͕഑ྻʹରԠ͍ͯ͠ͳ͍͕ɺ਺Λಈత ʹม͑Δඞཁ͕͋Δઃఆʹ༗ޮ • capistrano΁ͷॲཧͷू໿ • minaʹ͠Α͏ͱ͕ͨ͠෼ࢄσϓϩΠػೳ͕ͳͯ͘அ೦ • ଞʹྑ͍෺͕͋Ε͹Ҡߦ͍ͨ͠ͱߟ͍͑ͯΔ

Slide 57

Slide 57 text

ίʔυن໿ͱͯ͠ͷ Scala Guide/ Effective Scala • Effective ScalaΛकΒͤΔScalastyleΛ࡞ͬͯgithubͰެ։த • https://github.com/dwango/scalastyle • CPD (Copy and Paste Detector)ʹΑΔίϐϖνΣοΫ΋࣮ࢪ

Slide 58

Slide 58 text

։ൃ؀ڥ͸ IntelliJ IDEA Ultimateʹ౷Ұ • ࡉ͔͍࡞Γ͜Έ΍҆ఆੑ͕ྑ͍ • ձ͕ࣾνʔϜϝϯόʔʹಋೖ • ཧ࿦্͸ͲΜͳιϑτ΢ΣΞͰ΋ϝϞாͰ͸࡞ΕΔ͕… • ։ൃ؀ڥΛ౷Ұ͢Δ͜ͱͰɺ؀ڥߏஙυΩϡϝϯτͳͲΛߴ ඼࣭ʹͰ͖Δྑ͕͋͞Δ • vimmerʹ΋޷ධͳideavim͕͋Δ

Slide 59

Slide 59 text

JenkinsͷCI/CDӡ༻ • ϝΠϯδϣϒ͸ɺϏϧυɺςετɺϝτϦΫεɺύοέʔ δ࡞੒ɺࣗಈσϓϩΠΛ͍ͯ͠Δ • Github:eʹ͓͚ΔϓϧϦΫΤετݩͷϒϥϯνͷࣗಈ νΣοΫ΋͍ͯ͠Δɻࣦഊͯ͠Δͱܯࠂ͕…

Slide 60

Slide 60 text

CI/CDͷ੒Ռ • ݱࡏ͸5ສߦͰɺScala ॏෳίʔυ0ɺscalastyleܯࠂ0ɺࣗ ಈςετͰͷߦϕʔείʔυΧόϨοδ52% • ͱ͸͍͑Ͳɺ਺஋ΛৗʹΑ͘อͪଓ͚Δʹ͸Ϧʔμʔ΍ CIͷϝϯςφʔͷܒ໤׆ಈ͕ॏཁ • ݕূظؒͷେ෯ͳ޻਺࡟ݮ • ݕূظؒʹࣗಈϏϧυɺࣗಈςετɺࣗಈσϓϩΠͷ޻਺ ࡟ݮޮՌ͕Θ͔Γ΍͍͢ɻϏϧυ৬ਓͱσϓϩΠ৬ਓΛͳ ͤ͘Δ͜ͱ͸େ͖͍ɻ

Slide 61

Slide 61 text

Play2/Scala։ൃͷ೉఺ 1. sbt͕஗͗͢Δ • proxyΛ࡞ͬͨΓɺྑ͍ϚγϯΛ࢖͏͙Β͍͔͠ͳ͍ 2. Play2ͷscalaςϯϓϨʔτ͕ɺίϯύΠϧ஗͘ɺจ๏͕σβΠφʔ ʹ΍͘͞͠ͳ͍࢓༷ • GroovyςϯϓϨʔτͰ࡞੒ɻ github/dwangoͰϑΥʔΫͨ͠΋ ͷΛެ։த 3. ςετͰࠔΔobjectͱtraitͱؔ਺Ҿ਺ • specs2ͷmockitoͷ੍໿ɻobjectͷϞοΫ࡞Εͳ͍ɺtrait͸mixin ͕ඞཁɺδΣωϦΫεύϥϝʔλʔ͕෇͍ͨؔ਺Ҿ਺ͷϝιου Λ֦ுͰ͖ͳ͍ɻ

Slide 62

Slide 62 text

εΫϥϜͷಋೖ

Slide 63

Slide 63 text

ࣗ਎ͷ΢ΥʔλʔϑΥʔϧ։ൃͱΞδϟ Πϧ։ൃͷϓϩδΣΫτϚωʔδϟܦݧ 1. աڈ4౓ͷϑΥʔλʔϑΥʔϧ։ൃͱɺେࣦഊͷܦݧ • ཁٻ͕มߋ͞Εͯ͠·͏ͱ஍ࠈ • ෆ֬ఆཁૉʹରԠ͢ΔͨΊͷόοϑΝॏཁ • ࠷ޙͷ͠Θدͤ͸඼࣭ʹ 2. ཁ͕݅֬ఆͰ͖ͳ͍ɺ·ͨɺཁٻͷ༏ઌॱҐ͕೔ʑมΘΔ৔߹ • ΞδϟΠϧͱεΫϥϜͷߟ͕͑ྑ͍ • ೔ʑมΘΔνʔϜͷ໨ඪ΁ͷॊೈͳରԠ͕ඞཁͳWeb։ൃ

Slide 64

Slide 64 text

ΞδϟΠϧಋೖ·Ͱͷେม͞ • ΈΜͳΨϯτνϟʔτ͕Θ͔Γ΍ͯ͘͢޷͖ɺͱ͍͏໰୊ • ܒ໤׆ಈ͸΍͸ΓϑΣΠετΡϑΣΠε (εϥΠυ࡞ͬͨΓ) • ࣮ࡍͷݱ৔ʹ͋ΔϚωδϝϯτ໰୊ͷࠜຊ͸ɺΞδϟΠϧͱ͔ ΢ΥʔλʔϑΥʔϧͱ͔ؔ܎ͳ͍͜ͱ͕ଟ͍ • ໰୊ͷൃݟɺ໨త΍໨ඪͷઃఆΛ͠ɺνʔϜͰͷPDCAͷ࣮ߦ ͕Ͱ͖͍ͯΕ͹ྑ͍ͷ͕ͩͦΕ͕Ͱ͖ͯͳ͍͜ͱ΋͋Δ • ΧʔϘʔΠ։ൃʹ΋ྑ͕͋͞ΔͷͰڧཁ͠ͳ͍΄͏͕ྑ͍͜ͱ΋ • ਐḿ֬ೝ͕ߴίετͰɺυΩϡϝϯτ͸࢒Βͳ͍͕ɺݸਓͷ ύϑΥʔϚϯεΛҾ͖ग़ͤΔ

Slide 65

Slide 65 text

εΫϥϜ͸ϦʔμʔΛҭͯΔͷʹ ૉ੖Β͍͠։ൃख๏ • ձٞମ͕ݻఆ • JIRA/GreenHopperͳͲͷαϙʔτπʔϧ • ॻ੶͕ॆ࣮͍ͯ͠Δ • ϓϥϯχϯάϙʔΧʔͰͷݟੵ΋Γ͕ɺεΫϥϜϚελʔΛݽཱ ͤ͞ͳ͍ • શһ͕શͯͷ๧ࢠΛ͔ͿΔͷͰஈ֊తʹεΫϥϜϚελʔʹͤ͞ Δ͜ͱ͕Մೳ ਤ: GreenHopperͷը໘

Slide 66

Slide 66 text

ͱ͸͍͑ɺεΫϥϜϚελʔͱͯ͠ͷجૅ ஌ࣝ͸ඞཁͰผ్࠲ֶͷߨ࠲Λ։͍͍ͯΔ • ϚωδϝϯτΛ௨ͯ͡ϝϯόʔΛ׆͔͢ɺͱ͍͏υϥο Χʔͷߟ͑ํ͸ɺΞδϟΠϧͱ૬ੑ͕ྑ͍ ର৅ ڭՊॻ ϝϯόʔٴͼεΫϥϜϚελʔ εΫϥϜϚελʔ εΫϥϜϚελʔ ΞδϟΠϧαϜϥΠ ΞδϟΠϧͳݟੵ΋Γ υϥοΧʔͷϚωδϝϯτ

Slide 67

Slide 67 text

εΫϥϜ։ൃͷ՝୊ • ίχϡχέʔγϣϯίετ͕ͱʹ͔͘ߴ͍ͷͰີͳίϛϡχέʔγϣϯ͕ෛ ୲ʹͳΒͳ͍࢓૊Έ͕ඞཁ • ϝϯόʔͷཁ݅ఆٛͷೳྗ͕਎ʹ͖ͭʹ͍͘ • ཁ݅ఆٛͱ͍͏࢓ࣄ͕ετʔϦʔͷ؅ཧͱͯ͠؆ུԽ͞Ε͍ͯΔ൓໘ɺ ֊૚Խ͕ෆे෼ͩͬͨΓൈ͚࿙Ε͕ൃੜ͠΍͍͢ • ཁٻ΍ཁ͕݅ਂ͍ίϯςΩετ෇͖ͷυΩϡϝϯτʹ·ͱ·Δ͜ͱ͕গͳ͍ ͨΊ(ετʔϦʔ͸୹͍จॻ)ɺϢʔβʔͷཁٻͷཧղʹ͸ݸʑ౒ྗ͕ඞཁ • ཁٻ͕೔ʑมΘΔͷͰϦονͳυΩϡϝϯςʔγϣϯ͕มߋ࣌ʹෛ࠴ʹͳΓ ͕ͪ • ୔ࢁͷ๧ࢠΛ͔ͿΕΔਓ΄Ͳଟ๩ʹͳΓ͕ͪ

Slide 68

Slide 68 text

χίੜͰͷεΫϥϜͰ ॏࢹ͍ͯ͠Δ͜ͱ

Slide 69

Slide 69 text

Ϣʔβʔͷཁٻཧղʹରͯ͠ ࣌ؒΛ͔͚Δ • ετʔϦʔͷ࿙Ε΍എܠʹ͋ΔϢʔβʔཁ݅ͷݟམ ͱ͠Λ๷ࢭ͢ΔͨΊ • ۩ମྫ: • ϢʔβʔΠϯλϏϡʔ • twitterͷϞχλʔ • ཁ๬ܝࣔ൘΍ෆ۩߹ܝࣔ൘ͷ಺༰ͷڞ༗ • ௒ձٞ΁ͷελοϑͰͷࢀՃ

Slide 70

Slide 70 text

ετʔϦʔͷϙΠϯτ਺Λ େମ2~3೔Ҏ಺ͰऴΘΔྔʹ͍ͯ͠Δ • 1εϓϦϯτͰୡ੒ϙΠϯτ͕0ͱ͍͏ঢ়گ͸ɺݸਓʹ γϣοΫ͕େ͖͍ • ແ࿦ɺݸʑਓͷϙΠϯτ਺Λ͓͓ͬͽΒʹग़ͨ͠ΓධՁ ͢Δ͜ͱ͸ͳ͍͚ΕͲ΋...

Slide 71

Slide 71 text

ΈΜͳͰ͓՛ࢠΛ৯΂ͨΓɺҰॹʹ ήʔϜΛ΍ͬͨΓ͢ΔΑ͏৺͕͚͍ͯΔ • ີͳίϛϡχέʔγϣϯͷετϨεΛͰ͖Δ͚ͩݮΒ͢ • ۩ମྫ: • ͓՛ࢠਆࣾ • ϘʔυήʔϜɺωτή • Ͱ͖Δ͚ͩIRC (ࣾ಺νϟοτ) Ͱࡁ·͢ • ΄Μͱ͸୭ͱ΋ϑΣΠεɾτΡɾϑΣΠεͷίϛϡχέʔ γϣϯΛऔΒͣ։ൃ͍͍ͯͨ͠ਓ΋͍ΔͷͰ...·ͩ՝୊

Slide 72

Slide 72 text

εΫϥϜϚελʔ͕ৗʹϓϨΠϯά ϚωʔδϟʔͰ͋ΕΔΑ͏ʹ͢Δ • ετʔϦʔͷཧղ΍෼ׂͷͨΊʹٕज़എܠͷ஌͕ࣝॏ ཁɺͰ͖Δ͚࣮ͩ૷ػձ͕͋ΔΑ͏ʹ͢Δ • ઐ೚εΫϥϜϚελʔ͕ඞཁͳ΄Ͳͷେ͖͗͢ΔνʔϜ ʹ͠ͳ͍ɻ໨҆͸4~7໊ɻ

Slide 73

Slide 73 text

ΏͱΓΛ࣋ͬͨ։ൃܭը • 1εϓϦϯτͷ໨ඪϙΠϯτΛΪϦΪϦʹ͢ΔͱνʔϜ ͕ർฐ͢Δ • ༨༟ͷͳ͍εέδϡʔϧ͸ୡ੒͞Εͳ͍

Slide 74

Slide 74 text

اըͱ૬ஊ͢Δͱ͖ʹ͸ɺෆ֬ఆͳ ࣌ظͱ༏ઌॱҐͱҰॹʹ࣋ͪࠐΉ • ʮ2ʙ3εϓϦϯτ಺ʹ͸։ൃ׬ྃ͢ΔΑ͏ͳ༏ઌॱҐ෇ ͚ʹͳ͍ͬͯΔ͕Ͳ͏͢Δ͔ʁʯͱ͍͏Α͏ͳ࣋ͪࠐΈ ํΛ͢ΔΑ͏ʹ৺͕͚Δ • ॏཁ౓Ͱ͸ͳ͘ৗʹཁ݅ͷ༏ઌॱҐͰٞ࿦͢Δ

Slide 75

Slide 75 text

ΠϯϑϥνʔϜ΍ଞνʔϜͱͷڞಉ ࡞ۀ͸߹ྲྀόοϑΝΛߟྀ͢Δ • ετʔϦʔͷ߹ྲྀʹ͸໰୊͕͖ͭ΋ͷɺόοϑΝͷͳ͍ ͷίϥϘϨʔγϣϯ͸ۃྗ͠ͳ͍ • ݟੵ΋Γͷࡍʹݟམͱ͕ͪ͠ͳίϛϡχέʔγϣϯίε τ΍ཁ݅࿙ΕͷൃݟͳͲͷϦεΫ΋Ճຯ͠ͳͯ͘͸͍͚ ͳ͍

Slide 76

Slide 76 text

χίੜͰͷεΫϥϜͰ ॏࢹ͍ͯ͠Δ͜ͱ 1. Ϣʔβʔཧղʹରͯ࣌ؒ͠Λ͔͚Δ 2. ετʔϦʔͷϙΠϯτ਺Λେମ2~3೔Ҏ಺ͰऴΘΔྔʹ͍ͯ͠Δ 3. ΈΜͳͰ͓՛ࢠΛ৯΂ͨΓɺҰॹʹήʔϜΛ΍ͬͨΓ͢ΔΑ͏৺͕͚ ͍ͯΔ 4. εΫϥϜϚελʔ͕ৗʹϓϨΠϯάϚωʔδϟʔͰ͋ΕΔΑ͏ʹ͢Δ 5. ΏͱΓΛ࣋ͬͨ։ൃܭը 6. اըͱ૬ஊ͢Δͱ͖ʹ͸ɺෆ֬ఆͳ࣌ظͱ༏ઌॱҐͱҰॹʹ࣋ͪࠐΉ 7. ΠϯϑϥνʔϜ΍ଞνʔϜͱͷڞಉ࡞ۀ͸߹ྲྀόοϑΝΛߟྀ͢Δ

Slide 77

Slide 77 text

·ͱΊ • Play2/Scala͸େن໛WebαΠτͰ΋े෼௨༻͢Δ • Scala͸ྑ͍ݴޠ͕ͩ͋Δఔ౓ͷٕज़ྗΛཁٻ͢Δ • Play2/ScalaͱυϝΠϯۦಈઃܭʹΑΔ։ൃ͸૬ੑ͕ྑ͍ • υϝΠϯۦಈઃܭ͸อकੑʹߩݙ͢Δ • εΫϥϜ։ൃ͸ϦʔμʔΛҭ੒͢Δͷʹྑ͍։ൃख๏

Slide 78

Slide 78 text

Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 79

Slide 79 text

࣭ٙԠ౴