Slide 1

Slide 1 text

͋Δ೔
 
 ͱݴΘΕͨΒʁ ʙͭͷ+7.ݴޠͰ࡞ֶͬͯͿʙ ٕҭ$".1 !UPEPLS 8FCΤϯδχΞͳΒ
 8FCαʔόʔ͸࡞Ε·͢ΑͶ

Slide 2

Slide 2 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠

Slide 3

Slide 3 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ాॴ͘Μ͸8FCΤϯδχΞͩΑͶʁ

Slide 4

Slide 4 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ాॴ͘Μ͸8FCΤϯδχΞͩΑͶʁ ϋΠʂ

Slide 5

Slide 5 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ాॴ͘Μ͸8FCΤϯδχΞͩΑͶʁ 8FCΤϯδχΞͬͯ͞ɺ8FCΤϯδχΞ͡ΌΜʁ ϋΠʂ

Slide 6

Slide 6 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ాॴ͘Μ͸8FCΤϯδχΞͩΑͶʁ 8FCΤϯδχΞͬͯ͞ɺ8FCΤϯδχΞ͡ΌΜʁ 8FCαʔόʔ࡞Βͳ͍ͱʂʂʂ ϋΠʂ

Slide 7

Slide 7 text

഑ଐ͞Εͯ਺ϲ݄͕ܦͬͨ͋Δ೔ͷ͜ͱ ͋Δ೔ɺَڧ͍ઌഐΤϯδχΞ͕χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ాॴ͘Μ͸8FCΤϯδχΞͩΑͶʁ 8FCΤϯδχΞͬͯ͞ɺ8FCΤϯδχΞ͡ΌΜʁ 8FCαʔόʔ࡞Βͳ͍ͱʂʂʂ ϋΠʂ ΞοɺϋΠ

Slide 8

Slide 8 text

͓࿩͢͠Δ͜ͱ w 8FCαʔόʔͬͯԿͯ͠Δͷʁ w 4DBMB $MPKVSFʹ͍ͭͯ w 8FCαʔόʔΛ࡞Γͳ͕Βͭͷ+7.ݴޠΛֶ΅͏ w ͬ͘͟ΓΞʔΩςΫνϟ w ֤ݴޠͰ࣮૷ͯ͠ΈΔ w 4PDLFUͷѻ͍ w ਖ਼نදݱ w จࣈྻͷѻ͍ w Ϧιʔεͷ؅ཧ w ฒྻॲཧ w 8FCαʔόʔΛ࡞ͬͯɺԿΛಘͨʁ

Slide 9

Slide 9 text

͜͏ͯ͠
 8FCαʔόʔΛ࡞Δ೔ʑ͕
 ࢝·ͬͨ

Slide 10

Slide 10 text

ͱ͸͍͑

Slide 11

Slide 11 text

8FCαʔόʔͬͯԿͯ͠Δͷʁ

Slide 12

Slide 12 text

8FCαʔόʔ͕΍͍ͬͯΔ͜ͱ w ΫϥΠΞϯτ͔Βͷ઀ଓΛ଴ͪड͚Δ w ΫϥΠΞϯτ͔ΒૹΒΕ͖ͯͨ)551ϦΫΤετΛύʔε͢Δ w ϦΫΤετʹج͍ͮͯ)551ϨεϙϯεΛੜ੒͢Δ w ΫϥΠΞϯτʹϨεϙϯεΛฦ͢

Slide 13

Slide 13 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠

Slide 14

Slide 14 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ ʢʮ)551Θ͔Γ΍͘͢ʯͰݕࡧͱʣ

Slide 15

Slide 15 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ 8FCΤϯδχΞͳΒҰ࣍৘ใʹ౰ͨΒͳ͍ͱʂ ʢʮ)551Θ͔Γ΍͘͢ʯͰݕࡧͱʣ

Slide 16

Slide 16 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ 8FCΤϯδχΞͳΒҰ࣍৘ใʹ౰ͨΒͳ͍ͱʂ 3'$Λಡ΋͏ͥʂʂʂ ʢʮ)551Θ͔Γ΍͘͢ʯͰݕࡧͱʣ

Slide 17

Slide 17 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ 8FCΤϯδχΞͳΒҰ࣍৘ใʹ౰ͨΒͳ͍ͱʂ 3'$Λಡ΋͏ͥʂʂʂ ʢʮ)551Θ͔Γ΍͘͢ʯͰݕࡧͱʣ ΞοɺϋΠ

Slide 18

Slide 18 text

)551ͷن֨Λཧղ͠Α͏ ௐ΂෺Λ͍ͯ͠Δͱɺ·ͨͯ͠΋َڧ͍ઌഐΤϯδχΞ͕
 χίχί͠ͳ͕Β࿩͔͚͖ͯͨ͠ 8FCΤϯδχΞͳΒҰ࣍৘ใʹ౰ͨΒͳ͍ͱʂ 3'$Λಡ΋͏ͥʂʂʂ ʢʮ)551Θ͔Γ΍͘͢ʯͰݕࡧͱʣ ΞοɺϋΠ ʢ3'$JTԿʣ

Slide 19

Slide 19 text

3'$ʢ3FRVFTU'PS$PNNFOUTʣ w *&5'ʹΑΔٕज़࢓༷ͷอଘɺެ։ܗࣜ w ϓϩτίϧ΍ϑΝΠϧϑΥʔϚοτͳͲ͕த৺ w )551͸3'$d

Slide 20

Slide 20 text

IUUQTUPPMTJFUGPSHIUNMSGD

Slide 21

Slide 21 text

IUUQIUUQXHPSH

Slide 22

Slide 22 text

؆қͳ࣮૷ͳΒ਺ඦߦఔ౓👍

Slide 23

Slide 23 text

1ZUIPOͷ4JNQMF)5514FSWFS w 1ZUIPOͷ4JNQMF)5514FSWFSͷڍಈΛࢀߟʹ͢Δͷ΋ྑ͍ w ܥ w ܥ $ python -m SimpleHTTPServer $ python -m http.server

Slide 24

Slide 24 text

w 4DBMB w +BWB w 1ZUIPO w $MPKVSF w $PNNPO-JTQ w &MJYJS w %BSU

Slide 25

Slide 25 text

w 4DBMB w +BWB w 1ZUIPO w $MPKVSF w $PNNPO-JTQ w &MJYJS w %BSU

Slide 26

Slide 26 text

8FCαʔόʔΛ࡞Γͳ͕Β ͭͷ+7.ݴޠΛֶ΅͏ʂ

Slide 27

Slide 27 text

4DBMB$MPKVSF

Slide 28

Slide 28 text

4DBMB

Slide 29

Slide 29 text

4DBMB w +BWBͱͷ૬ޓӡ༻ੑ w γʔϜϨεͳݺͼग़͠ɺ+BWBඪ४ϥΠϒϥϦͷ࠶ར༻ w ؆ܿੑ w লུՄೳͳߏจɺܕਪ࿦ɺڧྗͳඪ४ϥΠϒϥϦ w ந৅౓ͷߴ͍ίʔυɺ৽੍͍͠ޚߏจΛఆٛͰ͖Δදݱྗ w 8IBUͷڧௐɺ)PXͷӅณ w ੩తܕ෇͚ w ݕূՄೳੑɺϦϑΝΫλͷ͠΍͢͞ɺυΩϡϝϯτੑ

Slide 30

Slide 30 text

IUUQTXXXMJIBPZJDPNQPTU'SPN'JSTU1SJODJQMFT8IZ4DBMBIUNM

Slide 31

Slide 31 text

"$PNQJMFE-BOHVBHFUIBUGFFMT%ZOBNJD requests.post( "https://api.github.com/repos/lihaoyi/test/issues", data = ujson.Obj("title" -> "hello"), headers = Map("Authorization" -> s"token $token") )

Slide 32

Slide 32 text

4DBMBܕͷදݱྗ // `@`͔Β࢝·ͬͯ3จࣈҎ্16จࣈҎ಺ɺ@admin΍@Admin͸ڐ༰͠ͳ͍ type UserIdRule = StartsWith["@"] And MinSize[3] And MaxSize[16] And Not[MatchesRegex["(?i)@admin"]] val userId1: String Refined UserIdRule = "@todokr" // ҎԼ͸ίϯύΠϧΤϥʔ val userId2: String Refined UserIdRule = "@admin" val userId3: String Refined UserIdRule = "todokr" val userId4: String Refined UserIdRule = "@uryyyyyyyyyyyyyy"

Slide 33

Slide 33 text

IUUQTFOHJOFFSJOHWJTJPOBMJODCMPHTDBMBSFpOFEOFXUZQF

Slide 34

Slide 34 text

$MPKVSF

Slide 35

Slide 35 text

$MPKVSF w -JTQ w จ๏͕গͳ͍ɺσʔλͱͯ͠ͷίʔυ w ؔ਺ܕϓϩάϥϛϯάͷͨΊͷݴޠ w ୈҰڃؔ਺ɺΠϛϡʔλϒϧͳσʔλߏ଄ɺ࠶ؼతͳϧʔϓ w +BWBͱͷ૬ޓӡ༻ੑ w ฒߦॲཧͷͨΊʹઃܭ w 3&1-Λ׆͔ͨ͠ΠϯλϥΫςΟϒΠϯΫϦϝϯλϧͳ։ൃ

Slide 36

Slide 36 text

ϙʔϧɾάϨΞϜ 7JBXFC૑ۀऀ :$PNCJOBUPS૑ઃऀ IUUQTVQMPBEXJLJNFEJBPSHXJLJQFEJB DPNNPOTFF1BVMHSBIBN@YKQH

Slide 37

Slide 37 text

-JTQͰྑ͍ϓϩάϥϜ͕ॻ͚ΔͳΒɺ࢖͏΂͖ͳΜͩɻ ͦ͏Ͱͳ͍ͳΒ͍͍ͬͨԿͷ໾ʹཱͭ ϙʔϧɾάϨΞϜ 7JBXFC૑ۀऀ :$PNCJOBUPS૑ઃऀ IUUQTVQMPBEXJLJNFEJBPSHXJLJQFEJB DPNNPOTFF1BVMHSBIBN@YKQH

Slide 38

Slide 38 text

ී௨ͷౕΒͷ্Λߦ͚ɻ -JTQͰྑ͍ϓϩάϥϜ͕ॻ͚ΔͳΒɺ࢖͏΂͖ͳΜͩɻ ͦ͏Ͱͳ͍ͳΒ͍͍ͬͨԿͷ໾ʹཱͭ ϙʔϧɾάϨΞϜ 7JBXFC૑ۀऀ :$PNCJOBUPS૑ઃऀ IUUQTVQMPBEXJLJNFEJBPSHXJLJQFEJB DPNNPOTFF1BVMHSBIBN@YKQH

Slide 39

Slide 39 text

ී௨ͷౕΒͷ্Λߦ͚ɻ -JTQͰྑ͍ϓϩάϥϜ͕ॻ͚ΔͳΒɺ࢖͏΂͖ͳΜͩɻ ͦ͏Ͱͳ͍ͳΒ͍͍ͬͨԿͷ໾ʹཱͭ :BIPPʹച٫ ϙʔϧɾάϨΞϜ 7JBXFC૑ۀऀ :$PNCJOBUPS૑ઃऀ IUUQTVQMPBEXJLJNFEJBPSHXJLJQFEJB DPNNPOTFF1BVMHSBIBN@YKQH

Slide 40

Slide 40 text

ී௨ͷౕΒͷ্Λߦ͚ɻ -JTQͰྑ͍ϓϩάϥϜ͕ॻ͚ΔͳΒɺ࢖͏΂͖ͳΜͩɻ ͦ͏Ͱͳ͍ͳΒ͍͍ͬͨԿͷ໾ʹཱͭ Θͨ͠ ී௨ͷϓϩάϥϚ -JTQͰ΢ΣϒαʔϏεΛͭ͘Δͱ :BIPPʹԯԁͰങͬͯ΋Β͑Δʂʂʂ :BIPPʹച٫ ϙʔϧɾάϨΞϜ 7JBXFC૑ۀऀ :$PNCJOBUPS૑ઃऀ IUUQTVQMPBEXJLJNFEJBPSHXJLJQFEJB DPNNPOTFF1BVMHSBIBN@YKQH

Slide 41

Slide 41 text

ίϯηϓτ͕໘ന͍ w ঢ়ଶʹ͍ͭͯͷߟ͑ํɺ*EFOUJUZ 4UBUF 7BMVFͷ෼཭ w γϯϓϧ͞ʹ͍ͭͯ ͍Ζ͍Ζܹࢗత

Slide 42

Slide 42 text

IUUQTKBQBODMPKVSJBOTHJUIVCJPDMPKVSFTJUFKBBCPVUSBUJPOBMF

Slide 43

Slide 43 text

IUUQTKBQBODMPKVSJBOTHJUIVCJPDMPKVSFTJUFKBBCPVUSBUJPOBMF

Slide 44

Slide 44 text

IUUQTFFETJODPNKBTJNQMJDJUZNBUUFST

Slide 45

Slide 45 text

IUUQCPYPGQBQFSTIBUFOBCMPHDPNFOUSZTJNQMF@NBEF@FBTZ

Slide 46

Slide 46 text

-JTQͷγϯλοΫε ׅހͷ࢝·Γ͔ΒऴΘΓ·Ͱ͕୯Ґ (ԿΒ͔ͷॲཧ ॲཧͷର৅ͳͲ…)

Slide 47

Slide 47 text

$MPKVSF͸Χοίͷछྨ͕ଟ͘ɺಡΈ΍͍͢ ͨͱ͑͹ؔ਺ͷҾ਺ $PNNPO-JTQ 4DIFNF $MPKVSF (defun square (x) (* x x)) (define (square x) (* x x)) (defn square [x] (* x x))

Slide 48

Slide 48 text

😌 େৎ෉

Slide 49

Slide 49 text

😌 ৴͍ͯͩ͘͡͞

Slide 50

Slide 50 text

جຊจ๏Ͱ΢ΥʔϛϯάΞοϓ

Slide 51

Slide 51 text

࢛ଇԋࢉ

Slide 52

Slide 52 text

࢛ଇԋࢉ 12 + 40 10 - 1 2 * 3 5 / 2 +BWB 4DBMB

Slide 53

Slide 53 text

࢛ଇԋࢉ 12 + 40 10 - 1 2 * 3 5 / 2 +BWB 4DBMB (+ 12 40) (- 10 1) (* 2 3) (/ 5 2) ; -> 5/2 ෼਺Λѻ͏Ratioܕ $MPKVSF

Slide 54

Slide 54 text

ม਺એݴ

Slide 55

Slide 55 text

ม਺એݴ int x = 10; +BWB

Slide 56

Slide 56 text

ม਺એݴ int x = 10; +BWB val x = 10 val x: Int = 10 4DBMB

Slide 57

Slide 57 text

ม਺એݴ int x = 10; +BWB val x = 10 val x: Int = 10 4DBMB (def x 10) (let [y 10] (+ y 3)) ; y͸letͷׅހ಺͚ͩͰࢀরͰ͖Δ $MPKVSF

Slide 58

Slide 58 text

ϝιουɾؔ਺એݴ

Slide 59

Slide 59 text

ϝιουɾؔ਺એݴ public int f(int x) { return x + 1; } +BWB

Slide 60

Slide 60 text

ϝιουɾؔ਺એݴ public int f(int x) { return x + 1; } +BWB def f(x: Int) = x + 1 4DBMB

Slide 61

Slide 61 text

ϝιουɾؔ਺એݴ public int f(int x) { return x + 1; } +BWB (defn f [x] (+ x 1)) $MPKVSF def f(x: Int) = x + 1 4DBMB

Slide 62

Slide 62 text

👍

Slide 63

Slide 63 text

ࠓճ༻ҙ࣮ͨ͠૷ w ىಈ͠ɺMPDBMIPTUͷಛఆͷϙʔτͰ)551ϦΫΤετΛ଴ͪड͚Δ w ରԠ͢Δ)551ϦΫΤετϝιου͸(&5ͷΈ
 ͦΕҎ֎ͷϝιου΋(&5ͱΈͳ͢ w QVCMJDσΟϨΫτϦΑΓ্ͷ֊૚΁ͷϦΫΤετʹ͸
 'PSCJEEFOΛฦ͢ w Ϧιʔεͷ.*.&͸֎෦ϑΝΠϧͰઃఆͰ͖Δ w ϦΫΤετΛϒϩοΫ͠ͳ͍ʢϚϧνεϨουʣ w ,FFQ"MJWF͸͠ͳ͍ɻίωΫγϣϯ͸౎౓DMPTF͢Δ w )551$BDIF͸͠ͳ͍ɻ͸ฦ͞ͳ͍

Slide 64

Slide 64 text

IUUQTHJUIVCDPNUPEPLSTJNQMFIUUQTFSWFS

Slide 65

Slide 65 text

ͭ͘Γʹ͍ͭͯͬ͘͟Γͱ ᵓᴷᴷ.JNF%FUFDUPSKBWB ᵓᴷᴷ3FRVFTUKBWB ᵓᴷᴷ3FRVFTU)BOEMFSKBWB ᵓᴷᴷ3FRVFTU1BSTFSKBWB ᵓᴷᴷ3FTQPOTFKBWB ᵓᴷᴷ4JNQMF+BWB)UUQ4FSWFSKBWB ᵋᴷᴷ8PSLFS5ISFBEKBWB 8FCαʔόʔΞϓϦέʔγϣϯ 3FRVFTU *OQVU4USFBN 3FTQPOTF 0VUQVU4USFBN )551ϦΫΤετͷύʔε ϦΫΤετʹԠͨ͡
 Ϩεϙϯεͷੜ੒ )551Ϩεϙϯεͷฦ٫

Slide 66

Slide 66 text

ͭ͘Γʹ͍ͭͯͬ͘͟Γͱ ᵓᴷᴷ.JNF%FUFDUPSKBWB ᵓᴷᴷ3FRVFTUKBWB ᵓᴷᴷ3FRVFTU)BOEMFSKBWB ᵓᴷᴷ3FRVFTU1BSTFSKBWB ᵓᴷᴷ3FTQPOTFKBWB ᵓᴷᴷ4JNQMF+BWB)UUQ4FSWFSKBWB ᵋᴷᴷ8PSLFS5ISFBEKBWB 8FCαʔόʔΞϓϦέʔγϣϯ 3FRVFTU *OQVU4USFBN 3FTQPOTF 0VUQVU4USFBN )551ϦΫΤετͷύʔε ϦΫΤετʹԠͨ͡
 Ϩεϙϯεͷੜ੒ )551Ϩεϙϯεͷฦ٫

Slide 67

Slide 67 text

ͭ͘Γʹ͍ͭͯͬ͘͟Γͱ ᵓᴷᴷ.JNF%FUFDUPSKBWB ᵓᴷᴷ3FRVFTUKBWB ᵓᴷᴷ3FRVFTU)BOEMFSKBWB ᵓᴷᴷ3FRVFTU1BSTFSKBWB ᵓᴷᴷ3FTQPOTFKBWB ᵓᴷᴷ4JNQMF+BWB)UUQ4FSWFSKBWB ᵋᴷᴷ8PSLFS5ISFBEKBWB 8FCαʔόʔΞϓϦέʔγϣϯ 3FRVFTU *OQVU4USFBN 3FTQPOTF 0VUQVU4USFBN )551ϦΫΤετͷύʔε ϦΫΤετʹԠͨ͡
 Ϩεϙϯεͷੜ੒ )551Ϩεϙϯεͷฦ٫

Slide 68

Slide 68 text

ͭ͘Γʹ͍ͭͯͬ͘͟Γͱ ᵓᴷᴷ.JNF%FUFDUPSKBWB ᵓᴷᴷ3FRVFTUKBWB ᵓᴷᴷ3FRVFTU)BOEMFSKBWB ᵓᴷᴷ3FRVFTU1BSTFSKBWB ᵓᴷᴷ3FTQPOTFKBWB ᵓᴷᴷ4JNQMF+BWB)UUQ4FSWFSKBWB ᵋᴷᴷ8PSLFS5ISFBEKBWB 8FCαʔόʔΞϓϦέʔγϣϯ 3FRVFTU *OQVU4USFBN 3FTQPOTF 0VUQVU4USFBN )551ϦΫΤετͷύʔε ϦΫΤετʹԠͨ͡
 Ϩεϙϯεͷੜ੒ )551Ϩεϙϯεͷฦ٫

Slide 69

Slide 69 text

ͭ͘Γʹ͍ͭͯͬ͘͟Γͱ ᵓᴷᴷ.JNF%FUFDUPSKBWB ᵓᴷᴷ3FRVFTUKBWB ᵓᴷᴷ3FRVFTU)BOEMFSKBWB ᵓᴷᴷ3FRVFTU1BSTFSKBWB ᵓᴷᴷ3FTQPOTFKBWB ᵓᴷᴷ4JNQMF+BWB)UUQ4FSWFSKBWB ᵋᴷᴷ8PSLFS5ISFBEKBWB 8FCαʔόʔΞϓϦέʔγϣϯ 3FRVFTU *OQVU4USFBN 3FTQPOTF 0VUQVU4USFBN )551ϦΫΤετͷύʔε ϦΫΤετʹԠͨ͡
 Ϩεϙϯεͷੜ੒ )551Ϩεϙϯεͷฦ٫

Slide 70

Slide 70 text

֤ݴޠͰ΍ͬͯΈΔ w 4PDLFUͷѻ͍ w ਖ਼نදݱ w จࣈྻͷѻ͍ w Ϧιʔεͷ։์ w ฒߦॲཧ

Slide 71

Slide 71 text

4PDLFUͷѻ͍

Slide 72

Slide 72 text

4PDLFU

Slide 73

Slide 73 text

4PDLFU w ௨৴ʹ͓͚ΔΤϯυϙΠϯτΛදݱͨ͠σʔλϞσϧ ֤ΤϯυϙΠϯτΛࣝผ͢Δ̎ͭͷ஋ɺ
 ͢ͳΘͪ*1ΞυϨεͱϙʔτ൪߸͸ɺ
 ଟ͘ͷ৔߹ιέοτ TPDLFU ͱݺ͹ΕΔɻ ʮ6/*9ωοτϫʔΫϓϩάϥϛϯάʯIUUQTXXXTFTIPQDPNQSPEVDUEFUBJM

Slide 74

Slide 74 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ

Slide 75

Slide 75 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ αʔόʔιέοτ

Slide 76

Slide 76 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ αʔόʔιέοτ ΫϥΠΞϯτιέοτ

Slide 77

Slide 77 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ αʔόʔιέοτ ΫϥΠΞϯτιέοτ ઀ଓཁٻ

Slide 78

Slide 78 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ αʔόʔιέοτ ΫϥΠΞϯτιέοτ ઀ଓ

Slide 79

Slide 79 text

4PDLFU௨৴ͷ໛ࣜਤ ΫϥΠΞϯτ αʔόʔ αʔόʔιέοτ ΫϥΠΞϯτιέοτ 😂 😂

Slide 80

Slide 80 text

4PDLFUͷѻ͍ // αʔόʔιέοτͷੜ੒ ServerSocket serverSocket = new ServerSocket(8080); while (true) { // ઀ଓΛ଴ͪड͚Δɻ઀ଓ͞ΕΔ·ͰϒϩοΫɻ Socket socket = serverSocket.accept(); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); ... } ιέοτͷੜ੒ͱ઀ଓͷ଴ͪड͚

Slide 81

Slide 81 text

4PDLFUͷѻ͍ // αʔόʔιέοτͷੜ੒ val serverSocket = new ServerSocket(8080) while (true) { // ઀ଓΛ଴ͪड͚Δɻ઀ଓ͞ΕΔ·ͰϒϩοΫ val socket = serverSocket.accept val in = s.getInputStream val out = s.getOutputStream ... } ιέοτͷੜ੒ͱ઀ଓͷ଴ͪड͚

Slide 82

Slide 82 text

4PDLFUͷѻ͍ (let [server-socket (new ServerSocket 8080)] (while true (let [socket (.accept server-socket) in (.getInputStream socket) out (.getOutputStream socket)] ...))) ιέοτͷੜ੒ͱ઀ଓͷ଴ͪड͚

Slide 83

Slide 83 text

4PDLFUͷѻ͍ʹֶ͍ͭͯΜͩ͜ͱ w 4FSWFS4PDLFUΦϒδΣΫτΛੜ੒͠ɺ
 ΫϥΠΞϯτ͔Βͷ઀ଓΛBDDFQUͰ଴ͪड͚Δ w 4PDLFUΦϒδΣΫτʢΫϥΠΞϯτιέοτʣ͔Β
 *O0VUQVU4USFBN͕औಘͰ͖Δ w *OQVU4USFBN͔Β)551ϦΫΤετΛ3FBE͠ɺ
 0VUQVU4USFBNʹ)551ϨεϙϯεΛ8SJUF͢Δ

Slide 84

Slide 84 text

ਖ਼نදݱ

Slide 85

Slide 85 text

ਖ਼نදݱ w 4PDLFUͷ*OQVU4USFBNΛҰߦಡΉ
 ˠSFRVFTUMJOF w ֤ཁૉΛநग़͍ͨ͠

Slide 86

Slide 86 text

ਖ਼نදݱ w 4PDLFUͷ*OQVU4USFBNΛҰߦಡΉ
 ˠSFRVFTUMJOF w ֤ཁૉΛநग़͍ͨ͠

Slide 87

Slide 87 text

ਖ਼نදݱ w 4PDLFUͷ*OQVU4USFBNΛҰߦಡΉ
 ˠSFRVFTUMJOF w ֤ཁૉΛநग़͍ͨ͠

Slide 88

Slide 88 text

໊લ෇͖άϧʔϓ

Slide 89

Slide 89 text

໊લ෇͖άϧʔϓ w ਖ਼نදݱͷάϧʔϓʹ໊લΛ෇͚Δ͜ͱ͕Ͱ͖Δ w άϧʔϓͷॱং͕มΘͬͨͱͯ͠΋औΓग़͢ॲཧ͸ͦͷ··Ͱྑ͍ import java.util.regex.*; String regex = "(?\\d+)/(?\\d+)/(?\\d+)"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher("2017/11/18"); if (m.find()) { System.out.println(m.group("year")); // 2017 System.out.println(m.group("month")); // 11 System.out.println(m.group("day")); // 18 }

Slide 90

Slide 90 text

public static Pattern requestLinePattern = Pattern.compile("(?.*) (?.*?) (?.*?)"); public Request fromInputStream(InputStream in){ BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String requestLine = reader.readLine(); Matcher matcher = requestLinePattern.matcher(requestLine); if (!matcher.find()) return null; String method = matcher.group("method"); String targetPath = matcher.group("path"); String httpVersion = matcher.group("version"); return new Request(method, targetPath, httpVersion); } ໊લ෇͖άϧʔϓ ϦΫΤετϥΠϯͷ֤ཁૉʹ໊લΛ෇͚ͯநग़

Slide 91

Slide 91 text

ύλʔϯϚον S

Slide 92

Slide 92 text

ύλʔϯϚον w +BWBͷTXJUDIจʹࣅ͍ͯΔ͕ɺΑΓॊೈͰڧྗ w ஋ʹҰக͢Δ͔͚ͩͰͳ͘ɺܕ΍ߏ଄Ͱ෼ذͤ͞Δ͜ͱ͕Ͱ͖Δ 0 match { case 0 => "Zero" // "Zero" case _ => "Other" } List(1, 2, 3) match { case List(_, x, _) => x // 2 case _ => -1 } 1 match { x: Int => s"$x͸Int" // 1͸Int x: String => s"$x͸String" x => s"$x͸???" }

Slide 93

Slide 93 text

ύλʔϯϚον w ਖ਼نදݱΦϒδΣΫτʹରͯ͠΋Ϛονͤ͞Δ͜ͱ͕Ͱ͖Δ val Pattern = "(.+)/(.+)/(.+)".r //.rͰregexܕ “2021/05/20" match { case Pattern(y, m, d) => s"${y}೥${m}݄${d}೔" case _ => "???" }

Slide 94

Slide 94 text

ύλʔϯϚον val Pattern = "(.+) (.+) (.+)".r requestLine match { case Pattern(method, path, version) => Some(Request(method, path, version)) case _ => None } 3FRVFTU1BSTFSTDBMBʢൈਮҰ෦վมʣ

Slide 95

Slide 95 text

0QUJPOܕ requestLine match { case pattern(method, path, version) => Some(Request(method, path, version)) case _ => None } w +BWBͰ͍͏0QUJPOBMʢΈ͍ͨͳ΋ͷʣ w )BTLFMMͰ͍͏.BZCF w 4PNFͱ/POF͔ΒͳΔܕʢ୅਺తσʔλܕʣ w ஋͕͋Δ͔ͳ͍͔෼͔Βͳ͍ঢ়ଶΛද͢ w ஋͕ଘࡏ͢Δ͔ͷνΣοΫΛڧ੍Ͱ͖Δ

Slide 96

Slide 96 text

SFpOE

Slide 97

Slide 97 text

SFpOE w ਖ਼نදݱʹϚονͨ͠จࣈྻΛऔಘ w Ҿ਺ʹάϧʔϓԽͨ͠ਖ਼نදݱΦϒδΣΫτΛ౉͢ͱɺ
 ઌ಄ʹ͸Ϛονͨ͠จࣈྻશମɺҎ߱ʹΩϟϓνϟ͞ΕͨจࣈྻͷϕΫλʔ ;; #"" ͸java.util.regex.PatternͷϦςϥϧ (re-find #"(.+)/(.+)/(.+)" "2017/11/18") ;; => ["2017/11/18" "2017" "11" "18"] ;; restͰઌ಄Ҏ֎ͷཁૉΛऔಘ (rest (re-find #"(.+)/(.+)/(.+)" "2017/11/18")) ;; => ("2017" "11" "18")

Slide 98

Slide 98 text

[JQNBQ w ڧྗͳίϨΫγϣϯϥΠϒϥϦ͸$MPKVSFͷಛ௃ w [JQNBQ͸ͭͷίϨΫγϣϯ͔Β.BQΛ࡞Δ w $MPKVSFͰ͸ΫϥεΑΓ΋.BQΛ޷Ή (zipmap [:a :b :c] [1 2 3]) ;; => {:a 1, :b 2, :c 3}

Slide 99

Slide 99 text

SFpOE[JQNBQ (let [line "GET / HTTP/1.1"] (zipmap [:method :path :version] (rest (re-find #"(.+) (.+) (.+)" line)))) ;; => {:method "GET", :path "/", :version "HTTP/1.1"} ϦΫΤετϥΠϯͷ֤ཁૉΛ.BQʹม׵

Slide 100

Slide 100 text

SFpOE[JQNBQ <NFUIPEQBUIWFSTJPO> <(&5)551> (let [line "GET / HTTP/1.1"] (zipmap [:method :path :version] (rest (re-find #"(.+) (.+) (.+)" line)))) ;; => {:method "GET", :path "/", :version "HTTP/1.1"} ϦΫΤετϥΠϯͷ֤ཁૉΛ.BQʹม׵

Slide 101

Slide 101 text

SFpOE[JQNBQ <NFUIPEQBUIWFSTJPO> <(&5)551> (let [line "GET / HTTP/1.1"] (zipmap [:method :path :version] (rest (re-find #"(.+) (.+) (.+)" line)))) ;; => {:method "GET", :path "/", :version "HTTP/1.1"} ϦΫΤετϥΠϯͷ֤ཁૉΛ.BQʹม׵

Slide 102

Slide 102 text

SFpOE[JQNBQ <NFUIPEQBUIWFSTJPO> <(&5)551> (let [line "GET / HTTP/1.1"] (zipmap [:method :path :version] (rest (re-find #"(.+) (.+) (.+)" line)))) ;; => {:method "GET", :path "/", :version "HTTP/1.1"} ϦΫΤετϥΠϯͷ֤ཁૉΛ.BQʹม׵

Slide 103

Slide 103 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ

Slide 104

Slide 104 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ

Slide 105

Slide 105 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ ఴࣈͰΞΫηε͢ΔΑΓ҆৺

Slide 106

Slide 106 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ ύλʔϯϚον
 S ఴࣈͰΞΫηε͢ΔΑΓ҆৺

Slide 107

Slide 107 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ ύλʔϯϚον
 S ఴࣈͰΞΫηε͢ΔΑΓ҆৺ ߏ଄ͷ෼ղʹ΋࢖͑Δ

Slide 108

Slide 108 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ ύλʔϯϚον
 S SFpOE
 ఴࣈͰΞΫηε͢ΔΑΓ҆৺ ߏ଄ͷ෼ղʹ΋࢖͑Δ

Slide 109

Slide 109 text

ਖ਼نදݱʹֶ͍ͭͯΜͩ͜ͱ ໊લ෇͖άϧʔϓ ύλʔϯϚον
 S SFpOE
 ఴࣈͰΞΫηε͢ΔΑΓ҆৺ ߏ଄ͷ෼ղʹ΋࢖͑Δ ݁Ռ͸ίϨΫγϣϯɺίϨΫγϣϯૢ࡞ͱ૊Έ߹Θͤͯ

Slide 110

Slide 110 text

จࣈྻͷѻ͍

Slide 111

Slide 111 text

จࣈྻ݁߹ w ϨεϙϯεʢΦϒδΣΫτϚοϓʣ͔Β
 )551ϨεϙϯεϔομΛ૊Έཱ͍ͯͨ public class Response { public final Status status; public final String contentType; public final int contentLength; public final byte[] body; }

Slide 112

Slide 112 text

4USJOH#VJMEFS

Slide 113

Slide 113 text

4USJOH#VJMEFS String response = "HTTP/1.1 " + status.statusCode + CRLF + "Server: SimpleJavaHttpServer" + CRLF + "Content-Type: " + contentType + CRLF + "Content-Length: " + 
 String.valueOf(contentLength) + CRLF + "Connection: Close" + CRLF + CRLF; 3FTQPOTFΦϒδΣΫτΛ)551Ϩεϙϯε΁ม׵

Slide 114

Slide 114 text

4USJOH*OUFSQPMBUJPO 5SJQMF2VPUF

Slide 115

Slide 115 text

4USJOH*OUFSQPMBUJPO w จࣈྻϦςϥϧͷલʹTΛ෇͚Δͱɺม਺Λల։Ͱ͖Δ val price = 1000 s"Price is $price" // => Price is 1000

Slide 116

Slide 116 text

5SJQMF2VPUF "Hello triple quote!\nHello stripMargin!" """Hello triple quote! Hello stripMargin!""" """|Hello triple quote! |Hello stripMargin!""".stripMargin w վߦΛؚΉจࣈྻΛຒΊࠐΉʹ͸ɺΛ࢖͏ w ΠϯσϯτΛଗ͑Δʹ͸Πϯσϯτจࣈ c ͱTUSJQ.BSHJOΛ࢖͏

Slide 117

Slide 117 text

4USJOH*OUFSQPMBUJPOͱ5SJQMF2VPUF val response = s"""HTTP/1.1 ${status.value} |Date: ${rfc1123Formatter.format(now)} |Server: SimpleScalaHttpServer |Content-Type: $contentType |Content-Length: ${body.length.toString} |Connection: Close | |""".stripMargin 3FTQPOTFΦϒδΣΫτΛ)551Ϩεϙϯε΁ม׵

Slide 118

Slide 118 text

TUS

Slide 119

Slide 119 text

w $MPKVSFͰ͸จࣈྻͷ݁߹͸Ͱ͸ͳ͘TUS w Մม௕Ҿ਺ɺ4ࣜͳΒͰ͸ TUS (+ "hoge" "fuga") ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:128) (str "hoge" "fuga" "piyo") // => hogefugapiyo

Slide 120

Slide 120 text

TUS (let [header (str "HTTP/1.1" SP status SP reason-phrase CRLF "Content-Length:" (count body) CRLF "Content-Type:" content-type CRLF "Connection: Close" CRLF CRLF)] ...) 3FTQPOTFΦϒδΣΫτΛ)551Ϩεϙϯε΁ม׵

Slide 121

Slide 121 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ

Slide 122

Slide 122 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS

Slide 123

Slide 123 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS ࠷దԽʹࣗ৴͕ͳ͚Ε͹KBWBQD

Slide 124

Slide 124 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS 4USJOH*OUFSQPMBUJPO
 5SJQMF2VPUF ࠷దԽʹࣗ৴͕ͳ͚Ε͹KBWBQD

Slide 125

Slide 125 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS 4USJOH*OUFSQPMBUJPO
 5SJQMF2VPUF ࠷దԽʹࣗ৴͕ͳ͚Ε͹KBWBQD ͪΐͬͱͨ͠ςϯϓϨʔτΤϯδϯΈ͍ͨʹ࢖͑Δ

Slide 126

Slide 126 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS 4USJOH*OUFSQPMBUJPO
 5SJQMF2VPUF TUS ࠷దԽʹࣗ৴͕ͳ͚Ε͹KBWBQD ͪΐͬͱͨ͠ςϯϓϨʔτΤϯδϯΈ͍ͨʹ࢖͑Δ

Slide 127

Slide 127 text

จࣈྻ݁߹ʹֶ͍ͭͯΜͩ͜ͱ 
 4USJOH#VJMEFS 4USJOH*OUFSQPMBUJPO
 5SJQMF2VPUF TUS ࠷దԽʹࣗ৴͕ͳ͚Ε͹KBWBQD ͪΐͬͱͨ͠ςϯϓϨʔτΤϯδϯΈ͍ͨʹ࢖͑Δ 4ࣜͳΒͰ͸

Slide 128

Slide 128 text

Ϧιʔεͷ؅ཧ

Slide 129

Slide 129 text

Ϧιʔεͷ؅ཧ w ετϦʔϜ΍%#ίωΫγϣϯɺιέοτ͸࢖͍ऴΘͬͨΒDMPTF w ๨ΕΔͱϝϞϦϦʔΫͷݪҼʹͳΔ͜ͱ͕͋Δ w खͰDMPTFॻ͖ͨ͘ͳ͍ʂ😫

Slide 130

Slide 130 text

5SZXJUI3FTPVSDFT

Slide 131

Slide 131 text

5SZXJUI3FTPVSDFT try (InputStream in = new FileInputStream(file)) { // Կ͔ϦιʔεΛѻ͏ॲཧ } // try۟Λൈ͚ͨΒclose w USZ۟Λൈ͚ͨΒࣗಈͰDMPTF w ର৅͸KBWBJP$MPTFBCMF KBWBMBOH"VUP$MPTFBCMFͷ࣮૷Ϋϥε

Slide 132

Slide 132 text

-PBO1BUUFSO

Slide 133

Slide 133 text

-PBO1BUUFSO w ʮआΓͨΒฦ͢ʯΛ࣮֬ʹߦ͏ͨΊͷΠσΟΦϜ w ͔͋ͨ΋ݴޠ੍͕࣋ͭޚߏ଄ͷΑ͏ͳϝιουΛɺ
 ϓϩάϥϚ͕؆୯ʹఆٛͰ͖Δͷ΋4DBMBͷΑ͍ͱ͜Ζ val reader = new BufferedReader(...) using(reader) { r => // readerΛ࢖ͬͨԿ͔ͷॲཧ } // ϒϩοΫΛൈ͚ͨΒreader͸close͞Ε͍ͯΔ ˞4DBMB͔Βඪ४ϥΠϒϥϦʹˢͱ΄΅ಉ౳ͷTDBMBVUJM6TJOH͕௥Ճ͞Ε·͕ͨ͠ɺ
 ΠϝʔδΛ௫ΉͨΊʹࣗ෼Ͱ࣮૷ͯ͠Έ·͢

Slide 134

Slide 134 text

-PBO1BUUFSOͷ࣮૷ def using[A, R <: Closeable](resource: R)(f: R => A): A = { try { f(resource) } finally { resource.close() } }

Slide 135

Slide 135 text

-PBO1BUUFSOͷ࣮૷ def using[A, R <: Closeable](resource: R)(f: R => A): A = { try { f(resource) } finally { resource.close() } } ܕม਺3͸$MPTFBCMF͔ͦͷαϒλΠϓɻDMPTFϝιουΛ࣋ͭ͜ͱΛอূɻ

Slide 136

Slide 136 text

-PBO1BUUFSOͷ࣮૷ def using[A, R <: Closeable](resource: R)(f: R => A): A = { try { f(resource) } finally { resource.close() } } 3ܕͷԿ͔Λड͚औΓɺԿΒ͔ͷܕ"Λฦؔ͢਺ΛҾ਺ʹͱΔ

Slide 137

Slide 137 text

-PBO1BUUFSOͷ࣮૷ def using[A, R <: Closeable](resource: R)(f: R => A): A = { try { f(resource) } finally { resource.close() } } Ϧιʔεʹରͯؔ͠਺Λద༻

Slide 138

Slide 138 text

-PBO1BUUFSOͷ࣮૷ def using[A, R <: Closeable](resource: R)(f: R => A): A = { try { f(resource) } finally { resource.close() } } ࠷ޙʹDMPTF

Slide 139

Slide 139 text

-PBO1BUUFSO using(socket) { s => val in = s.getInputStream val out = s.getOutputStream val request = parser.fromInputStream(in) val response = request.map(handleRequest) response.foreach(_.writeTo(out)) } VTJOHϒϩοΫΛൈ͚ͨΒɺTPDLFUΛDMPTF͢Δ

Slide 140

Slide 140 text

XJUIPQFO

Slide 141

Slide 141 text

w -PBO1BUUFSOʹࣅͨXJUIPQFOͱ͍͏ϚΫϩ w MFUͱಉ͡Α͏ͳײ͡Ͱ࢖͏ XJUIPQFO (with-open [f (io/file "test.txt")] ...)

Slide 142

Slide 142 text

XJUIPQFO (with-open [s socket] (-> (request-parser/from-input-stream (.getInputStream s)) (request-handler/handle-request) (response-writer/write (.getOutputStream s)))) XJUIPQFOΛൈ͚ͨΒɺTPDLFUΛDMPTF͢Δ

Slide 143

Slide 143 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ

Slide 144

Slide 144 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT

Slide 145

Slide 145 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT USZ۟Λൈ͚Δ࣌ʹDMPTF

Slide 146

Slide 146 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT -PBO1BUUFSO USZ۟Λൈ͚Δ࣌ʹDMPTF

Slide 147

Slide 147 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT -PBO1BUUFSO USZ۟Λൈ͚Δ࣌ʹDMPTF ؔ਺͕஋Ͱ͋Δ͜ͱΛ׆͔͠ɺ੍ޚߏจͷΑ͏ʹݟͤΔ

Slide 148

Slide 148 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT -PBO1BUUFSO XJUIPQFO USZ۟Λൈ͚Δ࣌ʹDMPTF ؔ਺͕஋Ͱ͋Δ͜ͱΛ׆͔͠ɺ੍ޚߏจͷΑ͏ʹݟͤΔ

Slide 149

Slide 149 text

Ϧιʔεͷ؅ཧʹֶ͍ͭͯΜͩ͜ͱ 5SZXJUI3FTPVSDFT -PBO1BUUFSO XJUIPQFO USZ۟Λൈ͚Δ࣌ʹDMPTF ؔ਺͕஋Ͱ͋Δ͜ͱΛ׆͔͠ɺ੍ޚߏจͷΑ͏ʹݟͤΔ DMPTFͯ͘͠ΕΔMFUΈ͍ͨͳΠϝʔδ

Slide 150

Slide 150 text

ฒߦॲཧ

Slide 151

Slide 151 text

ฒߦॲཧ w ϦΫΤετΛγϦΞϧʹॲཧ͢ΔͱଞͷϦΫΤετΛ଴ͨͤͯ͠·͏ w ίϯϏχͷϨδͰ͓ห౰ΛԹΊͯ΋Β͏ྫ͕Πϝʔδ͠΍͍͢

Slide 152

Slide 152 text

͋ͨͨΊϦΫΤετ ͋ͨͨ·͓ͬͨห౰ w ͓٬͞Μ͕গͳ͚Ε͹ɺిࢠϨϯδ͕୆Ͱ΋े෼·͔ͳ͑Δ ίϯϏχͷϨδΛྫʹߟ͑ͯΈΔ

Slide 153

Slide 153 text

͋ͨͨΊϦΫΤετ ͋ͨͨ·͓ͬͨห౰ w ͓٬͞Μ͕ଟ͘ͳΔͱɺϨδ͕٧·ͬͯ͠·͏ ίϯϏχͷϨδΛྫʹߟ͑ͯΈΔ

Slide 154

Slide 154 text

͋ͨͨΊϦΫΤετ ͋ͨͨ·͓ͬͨห౰ w ిࢠϨϯδͷ਺Λ૿΍ͤ͹ղܾʂ ίϯϏχͷϨδΛྫʹߟ͑ͯΈΔ

Slide 155

Slide 155 text

5ISFBE &YFDVUPS4FSWJDF

Slide 156

Slide 156 text

5ISFBE class HogeThread extends Thread { public void run() { // Կ͔ඇಉظʹ࣮ߦ͍ͨ͠ॲཧ } } HogeThread h = new HogeThread(); h.start(); class FugaRunnable implements Runnable { public void run() { // Կ͔ඇಉظʹ࣮ߦ͍ͨ͠ॲཧ } } FugaRunnable f = new Thread(new FugaRunnable()); f.start(); 5ISFBEΛFYUFOET3VOOBCMFΛJNQMFNFOUT

Slide 157

Slide 157 text

5ISFBE public class WorkerThread extends Thread { private Socket socket; private RequestParser parser; private RequestHandler handler; public WorkerThread( Socket socket, RequestParser parser, RequestHandler handler) { ... 5ISFBEͷఆٛ 5ISFBEͷىಈ Thread worker = new WorkerThread(socket, parser, handler); worker.start();

Slide 158

Slide 158 text

&YFDVUPS4FSWJDF ExecutorService cachedPool = Executors.newCachedThreadPool(); cachedPool.execute(runnable); ExecutorService fixedPool = Executors.newFixedThreadPool(4); fixedPool.execute(runnable); w ΑΓߴਫ४ͳฒྻॲཧͷͨΊͷ࢓૊Έ w εϨουϓʔϧͷछྨ΋ࢦఆͰ͖Δ

Slide 159

Slide 159 text

'VUVSF

Slide 160

Slide 160 text

'VUVSF w 'VUVSFBQQMZ͸౉͞ΕͨॲཧΛඇಉظʹ࣮ߦ w ͍ͭͲͷΑ͏ʹඇಉظʹ࣮ߦ͢Δ͔͸&YFDVUJPO$POUFYU࣍ୈ import scala.concurrent.Future // ForkJoinPoolɺσϑΥϧτͰ͸ίΞ਺෼ͷฒྻ౓Ͱॲཧ
 import scala.concurrent.ExecutionContext.Implicits.global val result: Future[User] = Future { // .apply͸লུͰ͖Δ userRepository.fetch(userId) } result.map(user => user.id) result.flatMap(user => tweetRepository.fetch(user.id))

Slide 161

Slide 161 text

&YFDVUJPO$POUFYU͸Ͳ͏ड͚औΔʁ w 'VUVSFBQQMZʹ͸Ҿ਺ϒϩοΫ͕ͭ w ͭ໨ͷҾ਺ϒϩοΫͰ&YFDVUJPO$POUFYUΛड͚औΔ object Future { ... def apply[T](body: => T)(implicit executor: ExecutionContext): Future[T] = unit.map(_ => body) ... } Future { userRepository.fetch(user) } // ↑͸Future#applyͷݺͼग़͠

Slide 162

Slide 162 text

8IBUͱ)PXͷ෼཭ w ୈҰҾ਺ϒϩοΫlCPEZ5z w 8IBUʮԿΛ࣮ߦ͢Δ͔ʯ w ୈೋҾ਺ϒϩοΫlJNQMJDJUFYFDVUPS&YFDVUJPO$POUFYUz w )PXʮͲͷΑ͏ʹ࣮ߦ͢Δ͔ʯ w JNQMJDJUΩʔϫʔυ͕͍͍ͭͯΔͷͰɺ໌ࣔతʹҾ਺ͱͯ͠౉͢ඞཁͳ͠ w 'VUVSF EP4PNFUIJOH FYFDVUPS object Future { ... def apply[T](body: => T)(implicit executor: ExecutionContext): Future[T] = unit.map(_ => body) ... }

Slide 163

Slide 163 text

JNQMJDJU8IBUͱ)PXͷ෼཭ w )PX͕ڊେʹͳΔͱɺίʔυͷຊདྷͷҙਤ͕ຒ΋Εͯ͠·͏ w JNQMJDJUͷେ͖ͳϞνϕʔγϣϯ͸)PXͷӅณ w 8IBUͱ)PXΛ෼཭͢Δ͜ͱͰɺ໨తΛ୺తʹࣔ͢͜ͱ͕Ͱ͖Δ val values: Seq[(String, Option[Int])] val sorted = sort(values)( tuple2Comparator( stringComparator, optionComparator(intComparator))) val sorted = sort(values) // implicit

Slide 164

Slide 164 text

IUUQHBLV[[[[HJUIVCJPTMJEFTJNQMJDJU@SFJOUSPEVDUJPO

Slide 165

Slide 165 text

UISFBE

Slide 166

Slide 166 text

$MPKVSFͷฒߦॲཧؔ਺ w $MPKVSFͷฒߦॲཧؔ਺͸ͨ͘͞Μ͋Δ w HP w UISFBE w TFOE w TFOEPGG w GVUVSF w FUD

Slide 167

Slide 167 text

$MPKVSFͷฒߦॲཧؔ਺ εϨουϓʔϧ εϨου਺ TFOE 'JYFE5ISFBE1PPM ίΞ਺ TFOEPGG $BDIFE5ISFBE1PPM ੍ݶͳ͠ GVUVSFGVUVSFDBMM QNBQQDBMMT $BDIFE5ISFBE1PPM ੍ݶͳ͠ HP 'JYFE5ISFBE1PPM ίΞ਺ UISFBE
 UISFBEDBMM $BDIFE5ISFBE1PPM ੍ݶͳ͠ SFEVDFST 'PSL+PJO1PPM ࣗಈ੍ޚ

Slide 168

Slide 168 text

*0ό΢ϯυ$16ό΢ϯυ ΞϓϦέʔγϣϯͷʮෛՙʯ͸ɺ
 *0ό΢ϯυͱ$16ό΢ϯυͷछྨʹେผ͞ΕΔ w *0ό΢ϯυ w *0͕ύϑΥʔϚϯεͷϘτϧωοΫ w $16͸ʮ଴ͪʯ͕ଟ͘ͳΔ w σΟεΫΞΫηε΍ϦϞʔτ௨৴ͳͲ w$16ό΢ϯυ w $16͕ύϑΥʔϚϯεͷϘτϧωοΫ w $16͸ϑϧՔಇ w େن໛ͳՊֶܭࢉͳͲ

Slide 169

Slide 169 text

$MPKVSFͷฒߦॲཧؔ਺ εϨουϓʔϧ εϨου਺ TFOE 'JYFE5ISFBE1PPM ίΞ਺ TFOEPGG $BDIFE5ISFBE1PPM ੍ݶͳ͠ GVUVSFGVUVSFDBMM QNBQQDBMMT $BDIFE5ISFBE1PPM ੍ݶͳ͠ HP 'JYFE5ISFBE1PPM ίΞ਺ UISFBE
 UISFBEDBMM $BDIFE5ISFBE1PPM ੍ݶͳ͠ SFEVDFST 'PSL+PJO1PPM ࣗಈ੍ޚ

Slide 170

Slide 170 text

$MPKVSFͷฒߦॲཧؔ਺ εϨουϓʔϧ εϨου਺ TFOE 'JYFE5ISFBE1PPM ίΞ਺ TFOEPGG $BDIFE5ISFBE1PPM ੍ݶͳ͠ GVUVSFGVUVSFDBMM QNBQQDBMMT $BDIFE5ISFBE1PPM ੍ݶͳ͠ HP 'JYFE5ISFBE1PPM ίΞ਺ UISFBE
 UISFBEDBMM $BDIFE5ISFBE1PPM ੍ݶͳ͠ SFEVDFST 'PSL+PJO1PPM ࣗಈ੍ޚ

Slide 171

Slide 171 text

UISFBE (thread (with-open [s socket in (.getInputStream s) out (.getOutputStream s)] (-> (request-parser/from-input-stream in) (request-handler/handle-request) (response-writer/write out)))) $BDIFE5ISFBE1PPMΛ࢖ͬͨฒྻॲཧ

Slide 172

Slide 172 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ

Slide 173

Slide 173 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF

Slide 174

Slide 174 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF FYUFOET5ISFBEJNQMFNFOUT3VOOBCMF

Slide 175

Slide 175 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF 'VUVSF FYUFOET5ISFBEJNQMFNFOUT3VOOBCMF

Slide 176

Slide 176 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF 'VUVSF FYUFOET5ISFBEJNQMFNFOUT3VOOBCMF 5ISFBE্ཱͪ͛Ͱ͸ͳ͍ɻ
 Ͳ͏࣮ߦ͢Δ͔͸&YFDVUJPO$POUFYU࣍ୈɻ

Slide 177

Slide 177 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF 'VUVSF UISFBE FYUFOET5ISFBEJNQMFNFOUT3VOOBCMF 5ISFBE্ཱͪ͛Ͱ͸ͳ͍ɻ
 Ͳ͏࣮ߦ͢Δ͔͸&YFDVUJPO$POUFYU࣍ୈɻ

Slide 178

Slide 178 text

ฒߦॲཧʹֶ͍ͭͯΜͩ͜ͱ 5ISFBE
 &YFDVUPS4FSWJDF 'VUVSF UISFBE FYUFOET5ISFBEJNQMFNFOUT3VOOBCMF 5ISFBE্ཱͪ͛Ͱ͸ͳ͍ɻ
 Ͳ͏࣮ߦ͢Δ͔͸&YFDVUJPO$POUFYU࣍ୈɻ *0$16ό΢ϯυ͔Λҙࣝ͠Α͏

Slide 179

Slide 179 text

8FCαʔόʔΛ࡞ͬͯ ԿΛಘͨʁ

Slide 180

Slide 180 text

ͪΐͬͱਂ͘જΔ༐ؾ

Slide 181

Slide 181 text

ϓϩάϥϛϯάݴޠ΍8FCϑϨʔϜϫʔΫ͸
 ͜Ε·ͰͲͷΑ͏ʹมԽ͖͔ͯͨ͠ʁ

Slide 182

Slide 182 text

ʮ3FBEBCMF4DBMBʯJO4DBMB.BUTVSJ
 !HBLV[[[[ ϓϩάϥϛϯάݴޠͷਐԽͷྺ࢙͸ɺ ͍͔ʹ)PXΛӅ΃͍ͯ͠
 8IBUΛ୺తʹදݱͰ͖ΔΑ͏ʹ͢Δ͔ɺͷ
 ྺ࢙Ͱ΋͋Γ·͢

Slide 183

Slide 183 text

ྫ͑͹+BWBͷ4USFBN"1*

Slide 184

Slide 184 text

ྫ͑͹+BWBͷ4USFBN"1* ʮϦετΛॱ൪ʹ͞Β͍ɺ
 ɹۮ਺ͩͬͨΒϦετʹ٧ΊΔʯ ɹͱ͍͏खଓ͖ʢ)PXʣ

Slide 185

Slide 185 text

ྫ͑͹+BWBͷ4USFBN"1* खଓ͖ΛӅṭ͠ɺ
 ʮۮ਺ͷΈͷϦετΛ࡞Δʯ ɹͱ͍͏໨తʢ8IBUʣʹϑΥʔΧε

Slide 186

Slide 186 text

ϑϨʔϜϫʔΫ΍ϥΠϒϥϦͰ΋ w ྫ %#͔ΒϨίʔυΛ݅औಘ w ʮ%#ʹͲ͏͍͏42-Λൃߦ͢Δ͔ʯͱ͍͏)PXΛӅณ͠ɺ
 ʮ+PCΛ*%ͰϑΟϧλϦϯάͯ݅͠औಘ͢Δʯͱ͍͏8IBUΛදݱ

Slide 187

Slide 187 text

ͦͷҰํͰ͜Μͳ͜ͱ΋ w ؆୯ͦ͏ʹʮݟ͑ΔʯϑϧελοΫ8FCϑϨʔϜϫʔΫ w ͪΐͬͱ΍΍͍͜͜͠ͱΛ΍Ζ͏ͱ͢Δͱɺ্͙͢ख͍͔͘ͳ͘ͳΔ w ʮ)551ϨεϙϯεϔομΛݟΖʯ w ʮ$POUFOU5ZQF͕PDUFUTUSFBN͔ͩΒʜʯ w ʮNVMUJQBSUGPSNEBUB͕ʜʯ w ʮ+PJOͨͭ͠΋Γ͕αϒΫΤϦʹͳͬͯΔͷͰ͸ʁʯ w ʮ42-ͷ࣮ߦܭը͕ʜʯ

Slide 188

Slide 188 text

ʮΫϥʔΫͷୈࡾ๏ଇʯΞʔαʔɾ$ɾΫϥʔΫ ߴ౓ʹൃୡٕͨ͠ज़͸ɺ
 ຐ๏ͱݟ෼͚͕͔ͭͳ͍

Slide 189

Slide 189 text

ͳͥʮϋϚΔʯͷ͔ʁ w υΩϡϝϯτͷαϯϓϧίʔυWTʮ࣮ઓʯͷίʔυ w ྆ऀͷဃ཭͸ந৅ԽͷϨΠϠʔΛॏͶΔ΄Ͳେ͖͘ͳΔ w ݁ہ͸ԼͷϨΠϠʔͷ஌ࣝΛ஌͍ͬͯΔඞཁ͕͋Δ

Slide 190

Slide 190 text

ʮ࿙Εͷ͋Δந৅Խͷ๏ଇʯ w CZ+PFM4QPMTLZ w ந৅Խͱ͸ɺҰ౓ʹ஫໨͢΂͖֓೦ΛݮΒ͢͜ͱ΍ɺ
 ͦͷ࢓૊Έͷ͜ͱ w ந৅Խ͸͢΂ͯɺఔ౓ͷࠩͦ͋͜Εɺ࿙Ε͕͋Δ IUUQTDPNNPOTXJLJNFEJBPSHXJLJ 'JMF+PFM@TQPMTLZ@PO@@TFQU@KQH

Slide 191

Slide 191 text

8FCϑϨʔϜϫʔΫͷʮந৅Խͷ࿙Εʯ w ϑϧελοΫͳ8FCϑϨʔϜϫʔΫ͸࿙Ε͕ݦஶ w ໘౗ͳ࡞ۀΛந৅Խ͠ɺ࡞ۀΛޮ཰Խͯ͘͠ΕΔ w ͔͠͠໘౗ͳ෦෼Λ׬શʹӅณͯ͘͠ΕΔΘ͚Ͱ͸ͳ͍ w ͋͘·Ͱ΋ʮޮ཰ԽʯͷͨΊͷந৅ԽͰ͋Γɺ
 ʮԿ͕ى͖͍ͯΔ͔ʯΛҙࣝ͢Δඞཁ͕͋Δ w )551ɺ42-ɺ$16ɺϝϞϦɺ*0ɺωοτϫʔΫɺFUD

Slide 192

Slide 192 text

࿙Εͷ͋Δந৅ԽͰى͖Δ͜ͱ w ϓϩάϥϛϯάݴޠ΍8FCϑϨʔϜϫʔΫ͸ɺந৅ԽʹΑͬͯɺ
 )PXͰ͸ͳ͘8IBUʹूதͰ͖ΔΑ͏ʹਐԽ͍ͯ͘͠ w 8IBUʹूதͰ͖Δར఺͸େ͖͍͕ɺ
 ͦͷந৅Խ͸ඞͣ͠΋׬શͰ͸ͳ͘ɺ
 ݁ہ͸ԼͷϨΠϠʔͷ)PXΛ஌Βͳ͍ͱઌʹਐΊͳ͍͜ͱ͕͋Δ

Slide 193

Slide 193 text

ʮ+PFMPO4PGUXBSFʯ+PFM4QPMTLZ ࿙Εͷ͋Δந৅Խͷ๏ଇʹ͏·͘ରॲ͢Δ
 །Ұͷํ๏͸ɺͦͷந৅Խ͕ͲͷΑ͏ʹػೳ͠ɺ
 ͦΕ͕ԿΛந৅Խ͍ͯ͠Δͷ͔ΛֶͿ͜ͱͩɻ

Slide 194

Slide 194 text

ಘͨ΋ͷͪΐͬͱਂ͘જΔ༐ؾ w ʮ࿙Εͷ͋Δந৅Խʯͷ΋ͱͰ͸ɺ໰୊ղܾͷͨΊʹ
 ීஈ৮Δٕज़ͷԼͷϨΠϠʔʹજΔ͜ͱ͕ආ͚ΒΕͳ͍
 ͔ͭɺ๛෋ͳ৘ใ͕͋Δͱ΋ݶΒͳ͍ w 8FCαʔόʔΛ࡞Δ͜ͱͰɺ8FCϑϨʔϜϫʔΫ͕ͲΜͳ࢓ࣄΛ ͍ͯ͠Δ͔΋ͳΜͱͳ͘෼͔ΔΑ͏ʹ w ӳޠͷҰ࣍৘ใʹ౰ͨΔ͕͍ͤͭͨ͘͜ͱͰɺ
 ະ຋༁ͷ৽͍ٕ͠ज़ͷυΩϡϝϯτͳͲ΋ԲͤͣಡΊΔΑ͏ʹ w ʮ࢓ࣄͰ࢖͍ͬͯΔϑϨʔϜϫʔΫ΍ϛυϧ΢ΣΞͷίʔυ΋
 ಡΜͰΈΑ͏ɻ͋ΘΑ͘͹ίϯτϦϏϡʔτͯ͠ΈΑ͏ʯͱ
 ͪΐͬͱਂ͘જͬͯΈΔ༐ؾˍڵຯΛ͖͔͚࣋ͭͬʹ

Slide 195

Slide 195 text

8FCαʔόʔΛ࡞ͬͯΈΔ͜ͱ͕ɺ
 Έͳ͞Μͷʮਂ͍ʯΤϯδχΞͷΩϟϦΞΛ
 ܗ࡞Δ͖͔͚ͬʹͳΕ͹͏Ε͍͠Ͱ͢

Slide 196

Slide 196 text

🙏 ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

Slide 197

Slide 197 text

ʢ࣌ؒʹ༨༟͕͋Ε͹ʣ ίʔυϦʔσΟϯάλΠϜʂ

Slide 198

Slide 198 text

No content

Slide 199

Slide 199 text

No content

Slide 200

Slide 200 text

No content