$30 off During Our Annual Pro Sale. View Details »

実践Server Side Swift

Yuki Takei
February 24, 2017

実践Server Side Swift

Swift実践入門刊行記念イベント Feb 24 2017

Yuki Takei

February 24, 2017
Tweet

More Decks by Yuki Takei

Other Decks in Technology

Transcript

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

    View Slide

  2. View Slide

  3. Twitter͸ @noppoman722 Ͱ΍ͬͯ·͢

    View Slide

  4. • 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ͷาΈ

    View Slide

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

    View Slide

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

    View Slide

  7. Server Side Swiftͷ࢖͍ॴ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. main.swiftͷத਎

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. Swift Package ManagerΛ࢖ͬͯΈΑ͏

    View Slide

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

    View Slide

  22. هड़ྫ

    View Slide

  23. ……………
    ……………
    ……………
    Ϗϧυ

    View Slide

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

    View Slide

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

    View Slide

  26. XcodeͰ։ൃͯ͠ΈΑ͏

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. Xcode্Ͱ࣮ߦ

    View Slide

  32. XCTest΋΋ͪΖΜ࢖͑·͢ʂ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. Linux൛SwiftͰϋϚͬͨ͜ͱᶄ

    View Slide

  59. ࣮૷͞Εͯͳ͍wwwww

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  64. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  70. https://github.com/noppoMan/SwiftJNChatApp

    View Slide

  71. σϞ

    View Slide

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

    View Slide

  73. • 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
    ࠓճ࢖ͬͨϥΠϒϥϦ

    View Slide

  74. noppoMan/Prorsum

    View Slide

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

    View Slide

  76. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  81. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  85. objc_**͕LinuxͰ࢖͑ͳ͍…

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  90. View Slide

  91. View Slide

  92. View Slide

  93. ܕ҆શʹselect݁ՌΛѻ͏

    View Slide

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

    View Slide

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

    View Slide

  96. Migration/20170218035306_CreateUser.swift
    Migration Classͷఆٛ

    View Slide

  97. Migrationͷ࣮ߦ/ϩʔϧόοΫ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide