Slide 1

Slide 1 text

Perl Mongersのための Server Side Swift 入門 @isaoeka 1

Slide 2

Slide 2 text

2 自己紹介 ■ Տ໺ޭ ■ ΤンδχΞ!.PCJMF'BDUPSZ *OD ■ Twitter : @isaoeka ■ ೘ࢎ஋͕ߴいͰ͢ ■ ࠷ۙ͸ΞイΧπΛݟͯい·͢

Slide 3

Slide 3 text

3 私の熱いエンジニア活動 エンカツ 始まります

Slide 4

Slide 4 text

4 本日のアジェンダ ■ Server Side SwiftΛࢧ͑Δొ৔ਓ෺ͷ঺հ ■ ֤ओཁ8"'ͷ঺հ ■ VaporͰαンϓϧϓϩδΣΫτͰ༡Ϳ ■ ·ͱΊ

Slide 5

Slide 5 text

5 Server Side Swiftを支える登場人物の紹介

Slide 6

Slide 6 text

6 オープンソースになったSwift (3.0 ~ ) ■ ίΞライϒラϦ ■ Foundation ■ GDC ■ XCTest

Slide 7

Slide 7 text

7 オープンソースになったSwift (3.0 ~ ) ■ ίΞライϒラϦ ■ Foundation ■ GDC ■ XCTest CͰ࣮૷(CoreFoundation) SwiftͰCoreFoundationΛݺͿ(Foundation) し͔しFoundation͸、ະ։ൃɾ࣮૷なՕॴ͕࢒ͬ ͯいΔ

Slide 8

Slide 8 text

8 Swift Web Server Gateway Interface ■ Nest (nestproject/Nest) ■ Currasow ■ Http4swift ■ NestBox ■ Open Swift (open-swift/S4) ■ C7: Core Components ■ S4: Server Side ■ D5: Database

Slide 9

Slide 9 text

9 Swift Web Server Gateway Interface ■ Nest (nestproject/Nest) ■ ։ൃ͕ࢭ·ͬͯいΔ ■ Open Swift (open-swift/S4) ■ ։ൃଧͪ੾Γ CoreFoundationͷ։ൃ͕ਐΈ、ॆ࣮し ͖ͯͨ͜ͱʹΑΓ、InterfaceΛఆٛ͢ Δඞཁ΋な͘なͬͨ(?) ֤8"'Ͱ(original core + Foundation) Λఆٛし࣮૷しͯいΔ

Slide 10

Slide 10 text

■ apple/swift-package-manager ■ ඪ४ͷライϒラϦ؅ཧπʔϧ ■ ਽ܗ࡞੒swift package init 10 Swift Package Manager import PackageDescription let package = Package( name: "isucon6-swift", dependencies: [ .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 1), .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 1) ] ) Package.swif

Slide 11

Slide 11 text

11 IBM Swift Package Catalog ■ https://swiftpkgs.ng.bluemix.net/

Slide 12

Slide 12 text

12 Swift Modules ■ https://swiftmodules.com/

Slide 13

Slide 13 text

13 swiftenv ■ kylef/swiftenv ■ anyenv͔ΒͰ΋

Slide 14

Slide 14 text

14 エディタ ■ Xcode ■ AppCode VimͰॻ͖ͨ͘なͬͯ΋、ࠓͷͱ͜Ζ͸ແ೉ʹ IDEΛ࢖͏͜ͱΛΦススϝし·͢ɻ Emacs͸…Θ͔Γ·ͤΜ…

Slide 15

Slide 15 text

15 Perl Swift ■ PSGI/Plack ■ Carton ■ search.cpan.org
 metacpan.org ■ Vim/Emacs ■ original + Foundation ■ Swift Package Manager ■ IBM Swift Package Catalog ■ IDE (XcodeなͲ)

Slide 16

Slide 16 text

16 主要WAF紹介

Slide 17

Slide 17 text

17 Perfect BIG4

Slide 18

Slide 18 text

18 Perfect Vapor BIG4

Slide 19

Slide 19 text

19 Perfect Vapor Kitura BIG4

Slide 20

Slide 20 text

20 Perfect Vapor Kitura Zewo BIG4

Slide 21

Slide 21 text

21 Perfect Vapor Kitura Zewo BIG4(おそらく)

Slide 22

Slide 22 text

22 Perfect ■ PerfectlySoft/Perfect ■ Rails like ■ Full Stack ■ DB Connector ΍ Utility͕ॆ࣮

Slide 23

Slide 23 text

import PerfectLib import PerfectHTTP import PerfectHTTPServer // Create HTTP server. let server = HTTPServer() // Register your own routes and handlers var routes = Routes() routes.add(method: .get, uri: "/", handler: { request, response in response.setHeader(.contentType, value: "text/html") response.appendBody(string: "Hello, world!</ title><body>Hello, world!</body></html>") response.completed() } ) // Add the routes to the server. server.addRoutes(routes) // Set a listen port of 8181 server.serverPort = 8181 do { // Launch the HTTP server. try server.start() } catch PerfectError.networkError(let err, let msg) { print("Network error thrown: \(err) \(msg)") } 23 Perfect

Slide 24

Slide 24 text

24 Vapor ■ vapor/vapor ■ Laravel Inspired ■ Full Stack ■ セοτΞοϓ͕؆୯ ■ ਓؾ͕ߴい ■ ܕ҆શなϧʔςΟンά͕Մೳ

Slide 25

Slide 25 text

import Vapor let drop = Droplet() drop.get("hello") { req in return "Hello, world." } drop.run() 25 Vapor

Slide 26

Slide 26 text

import Vapor let drop = Droplet() drop.get("hello") { req in return "Hello, world." } drop.run() 26 Vapor ৠؾΛimport

Slide 27

Slide 27 text

import Vapor let drop = Droplet() drop.get("hello") { req in return "Hello, world." } drop.run() 27 Vapor ৠؾΛimport ణΛ࡞Δ

Slide 28

Slide 28 text

■ IBM-Swift/Kitura ■ IBM੡ ■ Express.js like 28 Kitura

Slide 29

Slide 29 text

// My first Kitura Swift code! import Kitura let router = Router() router.get("/") { request, response, next in response.send("Hello, Server Side Swift") next() } Kitura.addHTTPServer(onPort: 8090, with: router) Kitura.run() 29 Kitura

Slide 30

Slide 30 text

30 Zewo ■ Zewo/Zewo ■ Modular Web Framework ■ Full Stack ■ ίンϙʔωンτ͕7BQPSͱޓ׵ੑ͕͋Γ、੾Γସ͑Δ͜ͱ ͕Մೳ

Slide 31

Slide 31 text

import HTTPServer let log = LogMiddleware() let router = BasicRouter { route in route.get("/hello") { request in return Response(body: "Hello, world!") } } let server = try Server(port: 8080, middleware: [log], responder: router) try server.start() 31 Zewo

Slide 32

Slide 32 text

32 はたして、どれがベターなWAFなのか…

Slide 33

Slide 33 text

33 Github Stars 9796 7739 4982 1498 2016/12/06 時点

Slide 34

Slide 34 text

34 Perfectが1つ抜きん 出て高水準… https://medium.com/@rymcol/benchmarks-for-the-top-server-side-swift-frameworks-vs-node-js-24460cfe0beb#.7g3ujl51d Benchmark

Slide 35

Slide 35 text

35 Vaporのサンプルプロジェクトを試す

Slide 36

Slide 36 text

36 参考アプリケーション ■ vapor/slack-bot ■ ./Sources ҎԼΛશͯ࢓༷

Slide 37

Slide 37 text

37 Vaporプロジェクトの作成 ■ vapor new {project_name} ■ cd {project_name} ■ “vapor/slack-bot” ͔ΒίʔυΛഈआ ■ vapor xcode ■ vapor build ■ vapor run

Slide 38

Slide 38 text

38

Slide 39

Slide 39 text

39 まとめに入ります

Slide 40

Slide 40 text

40 まとめ : 所感 ■ Perl΄ͲͰ͸ແい͕ؾܰʹॻ͚ΔݴޠなͷͰ、iOSͷ։ൃʹ͸ڵຯ͕ແ い͚Ͳ、Swiftʹ͸ڵຯ͕͋ΔʂΈͨいなਓʹ࠷ద ■ SwiftΛར༻しͨΫライΞンτΤンδχΞ͕8FC։ൃʹͱ͖ͬͭ΍͘͢ なͬͨ ■ ݴޠͷ੒௕ʹ߹Θͤͯ、WAF΋੒௕ஈ֊ʹいΔ ■ ͱ͸い͑、3.0Ҡߦ͔Β͸Swift WAFք΋མͪணいͯ、ׂͱϋϚΓͲ͜ Ζ͸গなͦ͏