Slide 1

Slide 1 text

࣮ફ Server Side Swift Yuki Takei Swift࣮ફೖ໳ץߦه೦Πϕϯτ Feb 24 2017

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Twitter͸ @noppoman722 Ͱ΍ͬͯ·͢

Slide 4

Slide 4 text

• 2015೥12݄ΑΓɺServer Side SwiftͷϥΠϒϥϦ։ൃ΍ί ϛϡχςΟ΁ͷߩݙΛελʔτ • 2016೥2݄ʹSlimaneΛϦϦʔε(ݱࡏ։ൃ͸Stop) • 2016೥3݄͔ΒTokyo Server Side Swift Meetup։࢝ • 2016೥4݄͔ΒOpen-SwiftɺZewoίϛϡχςΟʹࢀՃ • 2016೥10݄ΑΓServer Work GroupͷεςʔΫϗϧμʔʹ • 2017೥1݄ΑΓSwiftΛόοΫΤϯυαʔϏεͷݴޠͱͯ͠ɺ αʔϏε։ൃΛελʔτ ๻ͱServer Side SwiftͷาΈ

Slide 5

Slide 5 text

https://tokyo-ss-swift.connpass.com/

Slide 6

Slide 6 text

• Server Side Swiftͷ࢖͍ॴ • Server Side Swiftͷ։ൃ؀ڥΛ੔͑Δ • SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ • ࣮ફతͳWebΞϓϦέʔγϣϯΛ࡞Ζ͏ ΞδΣϯμ

Slide 7

Slide 7 text

Server Side Swiftͷ࢖͍ॴ

Slide 8

Slide 8 text

SwiftΛwebαʔϏεͰ࢖͏ϝϦοτ • ੩తݴޠͳΒͰ͸ͷ҆શੑɺॊೈͳݴޠ࢓༷ • ࣮ߦ଎౓ɺলΤω • VMɺGC͕ͳ͍ • iOSΞϓϦ։ൃʹ࢖ΘΕ͍ͯΔϥΠϒϥϦ͕ͦͷ ··࢖͑Δέʔε͕༗Δ

Slide 9

Slide 9 text

• APIαʔόʔ(Node.js΍GoͰ࡞͍ͬͯΔͱ͜Ζ) • όονॲཧͳͲͷίϚϯυϥΠϯΞϓϦέʔγϣϯ • ը૾ॖখɺѹॖɺ҉߸ԽͳͲLLͰ͸࣌ؒͷ͔͔Δ෦෼ SwiftͷwebαʔϏεͰͷ࢖͍ॴ

Slide 10

Slide 10 text

Server Side Swiftͷ։ൃ؀ڥΛ੔͑ͯΈΑ͏

Slide 11

Slide 11 text

• Xcode8.2ΛࣄલʹΠϯετʔϧ͓͖ͯ͠·͠ΐ͏ ؀ڥߏஙͷલʹ….

Slide 12

Slide 12 text

Server SideϓϩδΣΫτ͸ ίϚϯυϥΠϯΛ࢖ͬͯ࡞੒͍͖ͯ͠·͢

Slide 13

Slide 13 text

Server Side SwiftϓϩδΣΫτͷ࡞੒ ϓϩδΣΫτ༻ͷσΟϨΫτϦ࡞੒

Slide 14

Slide 14 text

εχϖοτ࡞੒ίϚϯυ Server Side SwiftϓϩδΣΫτͷ࡞੒

Slide 15

Slide 15 text

Server Side Swiftͷ جຊతͳϑΝΠϧߏ੒ Server Side SwiftϓϩδΣΫτͷ࡞੒

Slide 16

Slide 16 text

main.swiftͷத਎

Slide 17

Slide 17 text

ίϚϯυϥΠϯ্ͰͷϏϧυͱ࣮ߦ ίϯύΠϧ & ϦϯΫ

Slide 18

Slide 18 text

ίϚϯυϥΠϯ্ͰͷϏϧυͱ࣮ߦ .build/debugҎԼʹ࣮ߦՄೳͳϥΠϒϥ͕ग़དྷΔ

Slide 19

Slide 19 text

ίϚϯυϥΠϯ্ͰͷϏϧυͱ࣮ߦ ࣮ߦ

Slide 20

Slide 20 text

Swift Package ManagerΛ࢖ͬͯΈΑ͏

Slide 21

Slide 21 text

• ͦͷ໊ͷ௨ΓɺSwift༻Package Manager(Appleެࣜ) • ௨শSPM • CocoaPods΍CarthageͱಉϨΠϠʔ • ϓϩδΣΫτ഑ԼͷPackage.swiftʹઃఆ΍ґଘΛॻ͖ ࠐΉ • ݱ࣌఺Ͱ͸ɺiOS΍MacͳͲͷUIΞϓϦ͸ະαϙʔτ Swift Package Managerͱ͸

Slide 22

Slide 22 text

هड़ྫ

Slide 23

Slide 23 text

…………… …………… …………… Ϗϧυ

Slide 24

Slide 24 text

…………… …………… …………… ґଘϥΠϒϥϦͷclone Ϗϧυ

Slide 25

Slide 25 text

…………… …………… …………… ίϯύΠϧ & ϦϯΫ Ϗϧυ

Slide 26

Slide 26 text

XcodeͰ։ൃͯ͠ΈΑ͏

Slide 27

Slide 27 text

SPMͰ࡞ͬͨϓϩδΣΫτ͸ɺ XcodeͰ։ൃ͢Δ͜ͱ΋ग़དྷ·͢ɻ

Slide 28

Slide 28 text

XcodeͰ։ൃͯ͠ΈΑ͏ Package.swift͔ΒઃఆΛಡΈࠐΈɺ.xcodeprojΛ࡞੒͢Δ

Slide 29

Slide 29 text

XcodeͰ։ൃͯ͠ΈΑ͏ ίϚϯυҰൃͰxcodeproj͕࡞੒͞ΕΔ

Slide 30

Slide 30 text

XcodeͰ։ൃͯ͠ΈΑ͏ xcodeprojΛ։͖·͢

Slide 31

Slide 31 text

Xcode্Ͱ࣮ߦ

Slide 32

Slide 32 text

XCTest΋΋ͪΖΜ࢖͑·͢ʂ

Slide 33

Slide 33 text

SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯ Λ࡞ΔϙΠϯτ

Slide 34

Slide 34 text

SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ ڧྗͳܕ҆શੑΛ׆͔͢

Slide 35

Slide 35 text

σʔλϕʔε΍APIϨεϙϯεͷIO݁Ռ͸Anyܕ͕΄ͱΜͲ JSON MySQL

Slide 36

Slide 36 text

σʔλϕʔε΍APIϨεϙϯεͷIO݁Ռ͸Anyܕ͕΄ͱΜͲ JSON MySQL AnyܕΛͦͷ··ѻ͏ͱ…

Slide 37

Slide 37 text

σʔλϕʔε΍APIϨεϙϯεͷIO݁Ռ͸Anyܕ͕΄ͱΜͲ JSON MySQL unwrapɺόϦσʔγϣϯΛ౎౓ॻ͘͸Ίʹ…

Slide 38

Slide 38 text

Server Side͸ؔΘΔਓ਺͕ଟ͍ͨΊɺ AnyܕΛ;ΜͩΜʹ࢖ͬͨίʔυ͸ϝϯς͕૬౰େม

Slide 39

Slide 39 text

DBͷऔಘ݁ՌͳͲ͸͖ͪΜͱܕΛఆٛ͠·͠ΐ͏

Slide 40

Slide 40 text

Enum ڧྗͳܕ҆શੑΛ׆͔͢ EnumʹΑΔύλʔϯϚονϯά͸ɺServer SideͰ΋༗ޮ HTTP Method HTTP Status

Slide 41

Slide 41 text

Enum ڧྗͳܕ҆શੑΛ׆͔͢ ErrorͷύλʔϯϚονϯάͰɺΤϥʔϨεϙϯεΛॊೈʹ

Slide 42

Slide 42 text

ܦݧ্ɺwebαʔϏεΛӡ༻͍ͯͯ͠ɺ αʔόʔ͕མͪΔେ͖ͳݪҼͷҰ͕ͭNullࢀর(ψϧϙ)Ͱ͢ɻ Optionalܕ ڧྗͳܕ҆શੑΛ׆͔͢

Slide 43

Slide 43 text

Swiftʹ͸Optionalܕ͕͋ΓɺϓϩάϥϚ͸ͦͷ஋͕nullΛڐ༰ ͢Δ͔Ͳ͏͔Λࢹ֮తʹ൑அͰ͖·ͨ͠ ʢίϯύΠϥ͕ڭ͑ͯ͘ΕΔʣ Optionalܕ ڧྗͳܕ҆શੑΛ׆͔͢

Slide 44

Slide 44 text

Optionalܕ ڧྗͳܕ҆શੑΛ׆͔͢ JavaScriptͰΫϥογϡ͢Δ͔΋͠Εͳ͍ྫ

Slide 45

Slide 45 text

Optionalܕ ڧྗͳܕ҆શੑΛ׆͔͢ SwiftͰ҆શʹIO݁ՌΛѻ͏

Slide 46

Slide 46 text

SwiftΛαʔόʔͰ࢖͏ϝϦοτͯ͠ɺ ͜ͷnullͷڐ༰ੑ͸ͱͯ΋େ͖ͳཁૉͰ͢ɻ

Slide 47

Slide 47 text

SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ ΫϥΠΞϯτͰϝδϟʔͳϥΠϒϥϦΛੵۃతʹ࢖͏

Slide 48

Slide 48 text

• Swiftʹ͸iOSͳͲͰங͔ΕͨɺطଘͷΤίγες Ϝ͕͋Δ • UIΛ࣋ͨͳ͍௨৴ॲཧ΍σʔλγϦΞϥΠζʹ ಛԽͨ͠΋ͷ͸ߴ֬཰ͰServer SideͰ΋࢖͑Δ • SPMʹରԠ͍ͯ͠ͳ͍৔߹΋ɺগ͠ͷมߋͰ Server SideͰ࢖͑Δέʔε͕͋Δ SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ ΫϥΠΞϯτͰϝδϟʔͳϥΠϒϥϦΛੵۃతʹ࢖͏

Slide 49

Slide 49 text

• Himotoki • SwiftyJSON • swift-protobuf • RXSwift • JSONWebToken.swift αʔόʔαΠυͰ΋࢖͑ΔiOSͷϥΠϒϥϦʢ΄ΜͷҰ෦ʣ

Slide 50

Slide 50 text

ंྠͷ࠶ൃ໌Λ߇͑ͯɺΤίγεςϜΛੵۃతʹ׆༻͠·͠ΐ͏

Slide 51

Slide 51 text

SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ UbuntuͰಈ͘͜ͱΛ࠷༏ઌʹ

Slide 52

Slide 52 text

• GoͷΑ͏ͳϙʔλϏϦςΟ͸ະͩSwiftʹ͸ͳ͍ • SwiftެࣜαϙʔτͷLinux͸Ubuntu • MacͰ͸࢖͑ͯ΋UbuntuͰ࢖͑ͳ͍API͸݁ߏ͋Δ • ςετίʔυΛඞͣUbuntuͰ΋૸Βͤ·͠ΐ͏ SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ UbuntuͰಈ͘͜ͱΛ࠷༏ઌʹ

Slide 53

Slide 53 text

Linux൛SwiftͰϋϚͬͨ͜ͱᶃ CF**ͰDNSղܾΛࢼΈ͕ͨ…..

Slide 54

Slide 54 text

CF**ͰDNSղܾΛࢼΈ͕ͨ….. Linux൛SwiftͰϋϚͬͨ͜ͱᶃ

Slide 55

Slide 55 text

Linux൛Swiftʹ͸CF**Ͱ࢖͑ͳ͍΋ͷ͕͋Δ Linux൛SwiftͰϋϚͬͨ͜ͱᶃ

Slide 56

Slide 56 text

Main thread͔Ͳ͏͔൑ఆ͠Α͏ͱͯ͠… Linux൛SwiftͰϋϚͬͨ͜ͱᶄ

Slide 57

Slide 57 text

Main thread͔Ͳ͏͔൑ఆ͠Α͏ͱͯ͠… Linux൛SwiftͰϋϚͬͨ͜ͱᶄ

Slide 58

Slide 58 text

Linux൛SwiftͰϋϚͬͨ͜ͱᶄ

Slide 59

Slide 59 text

࣮૷͞Εͯͳ͍wwwww

Slide 60

Slide 60 text

͜ͷΑ͏ʹɺະͩLinux൛SwiftͰ͸τϥοϓ͕ͪΒ΄Β

Slide 61

Slide 61 text

MacͰಈ͍͔ͨΒͬͯ҆৺͠ͳ͍Α͏ʹʂ

Slide 62

Slide 62 text

SwiftͰݎ࿚Ͱߴ଎ͳwebΞϓϦέʔγϣϯΛ࡞ΔϙΠϯτ GCDΛ׆༻ͯ͠ɺαʔόʔϦιʔεΛޮ཰తʹѻ͏

Slide 63

Slide 63 text

GCDͱ͸ɺThread΍ඇಉظ໋ྩΛ؆୯ʹѻ͏ͨΊͷϥΠϒϥϦ GCDΛ͏·͘ѻ͏͜ͱ͕ɺSwiftͷServer SideΛ߈ུ͢Δ伴

Slide 64

Slide 64 text

Dispatch Queue Serial Task Task Task Task Task queue.async {} Concurrent Task Task Task Task Task Task Task Task queue.async {} executing waiting balancing thread 1 thread 1 thread 2

Slide 65

Slide 65 text

Dispatch Source Dispatch Source Socket ؂ࢹ Event Event Event ιέοτ΍ϑΝΠϧͷهड़ࢠΛ؂ࢹͯ͠ɺ ॻ͖ࠐΈ͕͋ͬͨλΠϛϯάͰΠϕϯτΛൃՐ select΍kqueueͱ͍ͬͨඇಉظܥͷsystem callΛந৅Խ͍ͯ͠Δ

Slide 66

Slide 66 text

GCDΛۦ࢖ͯ͠ɺߴ଎ͳαʔόʔΛ࡞Γ·͠ΐ͏

Slide 67

Slide 67 text

SwiftͰ࣮ફతͳWebΞϓϦέʔγϣϯ Λ࡞ͬͯΈΑ͏

Slide 68

Slide 68 text

Ϣʔβʔ A Ϣʔβʔ B OAuth OAuth Callback Callback ͜Μͳײ͡ͷwebΞϓϦέʔγϣϯΛ࡞ͬͯΈ·ͨ͠ ChatϧʔϜ ᶃ ᶃ ᶄ ᶄ ᶅ ᶅ

Slide 69

Slide 69 text

• GithubͷOAuthΛ࢖ͬͨϩάΠϯػೳ • JWTʹΑΔϢʔβʔೝূ(ηογϣϯ୅ସ) • σʔλ͸શͯMySQLʹอଘ͢Δ • ίʔυଆͰεΩʔϚ؅ཧ • View͸SPAͰఏڙ ͬ͘͟Γͱͨ͠ཁ݅

Slide 70

Slide 70 text

https://github.com/noppoMan/SwiftJNChatApp

Slide 71

Slide 71 text

σϞ

Slide 72

Slide 72 text

https://www.youtube.com/watch?v=WI7BQQHVV_Y&feature=youtu.be ಈըURL͸ͪ͜Β

Slide 73

Slide 73 text

• noppoMan/Prorosum …… HTTP Server • noppoMan/WebAppKit …… Routing, Middleware • noppoMan/SwiftKnex …… Mysql Client, Schema Migrator • apple/swift-protobuf …… Entities and JSON serializer • kylef/JSONWebToken.swift …… JWT encode/decode ࠓճ࢖ͬͨϥΠϒϥϦ

Slide 74

Slide 74 text

noppoMan/Prorsum

Slide 75

Slide 75 text

noppoMan/Prorosum • HTTP ServerͳͲͷSwiftඪ४Ͱఏڙ͞Ε͍ͯͳ͍ ωοτϫʔΫػೳΛิ׬͢Δ • LinuxͰಈ͘͜ͱΛલఏʹ։ൃ͞Ε͍ͯΔ • GoݴޠͷgoroutineͱChannelΛΠϯεύΠΞ͠ ͨɺඇಉظ/ಉظॲཧϞσϧ

Slide 76

Slide 76 text

ProrsumͷαʔόʔΞʔΩςΫνϟ DispatchSource + DispatchQueueΛ࢖ͬͨ Πϕϯτۦಈ + WorkerThreadͷϋΠϒϦοτϞσϧ main thread DispatchSourceͰɺ listeningSocketΛ؂ࢹ Queue Queue Queue Queue Queue Queue Queue Queue Queue client DispatchQueue(concurrent) nonblocking I/O blocking I/O

Slide 77

Slide 77 text

• Ͳ͏ͯ͠΋ɺCallbackϕʔεͷϑϩʔ੍ޚʹͳͬ ͯ͠·͏ • ConcurrentͰ࣮ߦ͢Δ৔߹ɺεϨουηʔϑΛҙ ࣝͯ͠ϓϩάϥϛϯάΛ͢Δඞཁ͕͋Δ DispatchQueueͷ໰୊఺

Slide 78

Slide 78 text

thread Prorsumͷඇಉظ/ಉظॲཧϞσϧ Task1 Task2 Task3 send send send main thread receive Channel thread thread ProrsumͰ͸ݪଇͱͯ͠callbackʹΑΔϑϩʔ੍ޚ͸ߦΘͳ͍ɻ Prorosumͷఏڙ͢Δgoؔ਺ͱchannelʹΑΓɺฒྻॲཧͱͦͷಉظΛऔΔ Async Async Async Sync(Blocking)

Slide 79

Slide 79 text

go()ͱChannelΛ࢖࢛ͬͨଇԋࢉͷྫ

Slide 80

Slide 80 text

thread લճͷਤʹ౰ͯ͸ΊΔͱ Task1 Task2 Task3 send(1) send(2) send(3) main thread Channel thread thread go() go() go() receive(1) receive(2) receive(3)

Slide 81

Slide 81 text

ProrsumͷύϑΥʔϚϯε Request/sec 0 17500 35000 52500 70000 Prorsum Kitura Go 1.7 HTTP Server Express 14,769 64,768 17,144 29,436 ɾwrk -d 30s -t 4 -c 20 ɾResponded with the 10 length of random JSON array ɾMachine: MacOS Sierra, 8 logical cores, 8GB RAM

Slide 82

Slide 82 text

Routing΍Middleware • noppoMan/WebAppKitΛ࢖͍ͬͯΔ • WebAppKit͸ϓϩʔαϜ޲͚ͷRoutingɺ MiddlewareΛఏڙ͢ΔϑϨʔϜϫʔΫ • Express΍SinatraͷΑ͏ͳ΋ͷ • ೝূͳͲ͸͜ͷMiddlewareͰॲཧ͍ͯ͠Δ

Slide 83

Slide 83 text

APIͱͷ௨৴ (NS)URLSessionΛ࢖ͬͯAPIͱ௨৴͍ͯ͠Δɻ ͨͩ͠ɺίʔϧόοΫϕʔεͷϑϩʔ੍ޚʹͨ͘͠ͳ͍ͷͰɺdataTaskResumtSync ͱ͍͏ϝιουΛ௥Ճͯ͠ɺpthread_cond_waitͰϒϩοΫ͢ΔΑ͏ʹ͍ͯ͠Δ Routes/GithubRoute.swift

Slide 84

Slide 84 text

࣮͸APIKitΛ࢖͍͔ͨͬͨͷͰ͕͢ɺɺ

Slide 85

Slide 85 text

objc_**͕LinuxͰ࢖͑ͳ͍…

Slide 86

Slide 86 text

ͥͻLinuxରԠ͍ͨ͠Ͱ͢Ͷʂ

Slide 87

Slide 87 text

• SwiftyJSONͳͲͷJSONϥΠϒϥϦ͸࢖͍ͬͯͳ͍ • EntityΛswift-protobufΛ࢖ͬͯఆ͍ٛͯ͠ΔͨΊɺͦ Ε͕ఏڙ͢ΔJSONγϦΞϥΠζػೳΛ࢖͍ͬͯΔ JSONͷऔѻ

Slide 88

Slide 88 text

Swift͔ΒMySQLΛѻ͏ ͓ख੡ͷSwiftKnexͱ͍͏ϥΠϒϥϦΛ࢖͍ͬͯΔ

Slide 89

Slide 89 text

• Mysql QueryBuilder • Schema Migration • Pure SwiftͰMySQLϓϩτίϧΛ࣮૷͍ͯ͠Δ noppoMan/SwiftKnex

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

No content

Slide 92

Slide 92 text

No content

Slide 93

Slide 93 text

ܕ҆શʹselect݁ՌΛѻ͏

Slide 94

Slide 94 text

ίʔυଆͰεΩʔϚ؅ཧ SwiftKnexʹ͸ɺεΩʔϚ؅ཧ/ϚΠάϨʔγϣϯػೳ͕උΘ͍ͬͯΔ

Slide 95

Slide 95 text

Migration ClassΛ࡞੒͢Δ $ ./.build/debug/SwiftKnexMigration create ResourceName ΛίϚϯυϥΠϯ͔Β࣮ߦ͢Δ͜ͱͰɺMigration ClassΛ࡞੒

Slide 96

Slide 96 text

Migration/20170218035306_CreateUser.swift Migration Classͷఆٛ

Slide 97

Slide 97 text

Migrationͷ࣮ߦ/ϩʔϧόοΫ

Slide 98

Slide 98 text

Ϋϥ΢υ΁ͷσϓϩΠͳͲɺ ࿩͍ͨ͜͠ͱ͸ଞʹ΋୔ࢁ͋ΔͷͰɺͥͻ࠙਌ձͰʂ

Slide 99

Slide 99 text

SwiftͰͷαʔόʔαΠυ։ൃ͸ເ෺ޠͰ͸ͳ͘ɺ ͢ͰʹϦΞϧͳ΋ͷͰ͋Δͱ͍͏͜ͱ͕఻ΘΕ͹خ͍͠Ͱ͢ʂ

Slide 100

Slide 100 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠