Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Otemachi.swift x Kyobashi.swift #02: Vapor + Pr...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takeshi Ihara
January 29, 2018
Programming
370
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Otemachi.swift x Kyobashi.swift #02: Vapor + ProtocolBuffers + DockerでServer Side Swift入門
https://kyobashi-swift.connpass.com/event/75379/
Takeshi Ihara
January 29, 2018
More Decks by Takeshi Ihara
See All by Takeshi Ihara
iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用コストを下げる
nonchalant
3
1.4k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装
nonchalant
3
6.4k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装 with 発表ノート
nonchalant
2
630
Sign In with Apple
nonchalant
1
2.4k
iOSDC RejectCon 20180915: Factoryの自動生成によりテストを書きやすくする
nonchalant
1
750
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1k
devsap 20180728: コード生成のススメ
nonchalant
0
140
potatotips #50: iOSは自動生成の夢を見るか?
nonchalant
0
2k
try! Swift Tokyo 2018: Best Docker Container in Swift
nonchalant
1
1.4k
Other Decks in Programming
See All in Programming
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
250
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.4k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
260
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.4k
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
250
RTSPクライアントを自作してみた話
simotin13
0
610
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
570
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
150
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.6k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
Rails Girls Zürich Keynote
gr2m
96
14k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
How STYLIGHT went responsive
nonsquared
100
6.2k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
A better future with KSS
kneath
240
18k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
How to make the Groovebox
asonas
2
2.2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Un-Boring Meetings
codingconduct
0
320
How to Talk to Developers About Accessibility
jct
2
240
Transcript
Vapor + ProtocolBuffers + DockerͰServer Side Swiftೖ @nonchalant0303 Otemachi.swift x
Kyobashi.swift #2
ࣗݾհ • Takeshi Ihara • Recruit Marketing Partners • iOS
Engineer • Twitter: @nonchalant0303 • GitHub: Nonchalant
Kyobashi.swift
Sample Project • https://github.com/Nonchalant/ VaporProtobufSample • Server, Clientͷαϯϓϧίʔυ (GET, POST)
• Vapor + ProtocolBuffers + Docker
Server Side Swift https://swift.org/download • Swift͕201512݄ʹΦʔϓϯιʔεԽ • LinuxαϙʔτΛ։࢝ • Vapor,
Kitura, PerfectͳͲͷϑϨʔϜϫʔΫ͕ ొ
Vapor https://github.com/vapor/vapor • ࠷ΘΕ͍ͯΔSwiftͷWebϑϨʔϜϫʔ Ϋ • PHPͷLaravelϑϨʔϜϫʔΫʹӨڹΛड͚ͯ ͍Δ • Swift
Package ManagerʹΑΔϥΠϒϥϦཧ • पลπʔϧॆ࣮
Vapor / Toolbox https://github.com/vapor/toolbox • ެ͕ࣜఏڙ͍ͯ͠ΔCLλεΫπʔϧ CSFXJOTUBMMWBQPSUBQUPPMCPY WBQPSOFX\QSPKFDU@OBNF^BQJ WBQPSCVJME
WBQPSSVO
None
Environment WBQPSWFSTJPO 7BQPS5PPMCPY 7BQPS'SBNFXPSL TXJGUWFSTJPO "QQMF4XJGUWFSTJPO TXJGUMBOH DMBOH 5BSHFUY@BQQMFNBDPTY
TXJGUQBDLBHFUPPMTWFSTJPO
Droplet.swift https://github.com/vapor/vapor/blob/master/Sources/Vapor/Droplet/Droplet.swift • VaporͷRoutingΛ࢘ΔΫϥε extension Droplet { func setupRoutes() throws
{ get("hello") { req in var json = JSON() try json.set("hello", "world") return json } } } ฦΓ͕"1*Ϩεϙϯε
ProtocolBuffers (protobuf) https://github.com/google/protobuf • Google͕։ൃͨ͠௨৴ӬଓԽͰͷར༻Λ తͱͨ͠γϦΞϥΠζϑΥʔϚοτ • .protoͰσʔλߏΛఆٛ͢Δ • Apple͕.swiftʹม͢ΔϓϥάΠϯΛެ։
protobufͷϝϦοτ • σʔλྔ͕খ͍͞ • ௨৴ͷߴԽ • σʔλߏΛෳϓϥοτϑΥʔϜͰڞ༗Մೳ
protobuf - ಋೖ https://github.com/apple/swift-protobuf CSFXJOTUBMMQSPUPCVG HJUDMPOFHJU!HJUIVCDPNBQQMFTXJGUQSPUPCVGHJU DETXJGUQSPUPCVGTXJGUCVJME HFOFSBUFCVJMEEFCVHQSPUPDHFOTXJGU
.proto syntax = "proto3"; import "proto/gender.proto"; message User { int64
id = 1; string name = 2; Gender gender = 3; }
generate .swift QSPUPDQMVHJOQSPUPDHFOTXJGUCVJMEEFCVH QSPUPDHFOTXJGUTXJGU@PVU6TFSQSPUP
User.pb.swift import Foundation import SwiftProtobuf … struct User: SwiftProtobuf.Message {
static let protoMessageName: String = "User" var id: Int64 = 0 var name: String = String() var gender: Gender = .other var unknownFields = SwiftProtobuf.UnknownStorage() init() {} … }
Serialize extension Message { … public func serializedData(partial: Bool =
default) throws -> Data public func jsonUTF8Data() throws -> Data … }
Vapor + protobuf extension Droplet { func setupRoutes() throws {
get("user") { req in return UserResponse.with { $0.users = [ User.with { $0.name = "Takeshi Ihara" $0.gender = Gender.male }, User.with { $0.name = "Hanako Yamada" $0.gender = Gender.female } ] }.serializedData() // or .jsonUTF8Data() } } }
Deserialize (Client) var urlRequest = URLRequest(url: URL(string: "http://localhost: 9000/user")!) urlRequest.allHTTPHeaderFields
= [ "Accept": "application/protobuf" ] URLSession.shared.dataTask(with: urlRequest) { data, _, _ in guard let data = data else { return } let response = try! UserResponse(serializedData: data) }.resume() • Serverͱಉ͡ϞσϧΛ͑Δ (User.pb.swift)
Docker https://www.docker.com/ • ίϯςφܕͷԾԽڥΛఏڙ͢ΔΦʔϓϯιʔ ειϑτΣΞ • શԾԽͰͳ͘1ϓϩηε • VMWareͳͲͷશԾԽʹൺͯɺσΟεΫ ༻ྔ͕গͳ͍ɺىಈ͕ૣ͍ɺॲཧ͕ߴ
docker-swift https://github.com/swiftdocker/docker-swift • UbuntuͰಈ࡞ՄೳͳApple͕ఏڙ͍ͯ͠ΔSwift όΠφϦ͕ಈ࡞ՄೳͳDockerΠϝʔδ • ຊ൪ʹ͍ۙLinuxͰͷಈ࡞ΛݕূͰ͖Δ • FoundationͳͲͷίΞϥΠϒϥϦMacOS, Linux
ͷίʔυ͕ҟͳΔ (Linux൛ෆશ)
Dockerfile FROM swift:4.0.3 USER root RUN mkdir -p /server COPY
./Config /server/Config COPY ./Sources /server/Sources COPY ./Makefile /server/Makefile COPY ./Package.resolved /server/Package.resolved COPY ./Package.swift /server/Package.swift ENV PORT 9000 EXPOSE 9000 WORKDIR /server RUN make build CMD ["make", "run"]
docker-compose https://docs.docker.com/compose/ • ෳίϯςφͷఆٛɾىಈͷߏπʔϧ version: "2" services: server: image: nonchalant/server:0.1
ports: - "9000:9000" ϩʔΧϧɺԾڥͷϙʔτͷϚοϐϯά
·ͱΊ • ؆୯ͳπʔϧɾΞϓϦͳͲServer Side SwiftͰ ॻ͍͍͍͔ͯ • Linux - SwiftίΞϥΠϒϥϦ͕ະͳͷ͕πϥ
Π (࣮ߦ࣌Τϥʔ) • Clientͷಈ࡞ݕূʹDocker͑Δ͔ (CircleCI 2.0)