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
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
640
Sign In with Apple
nonchalant
1
2.5k
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
AIの中の人になってみる
htkym
0
120
Building a Meta Ray-Ban display app
akkeylab
0
180
Oxlintはいいぞ(続)
yug1224
1
430
不幸な GC
chencmd
0
720
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
600
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.1k
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
370
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
240
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
280
仕様駆動開発の消費期限
watany
20
8.9k
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
520
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
800
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Everyday Curiosity
cassininazir
0
290
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Fireside Chat
paigeccino
42
4k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
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)