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
760
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1k
devsap 20180728: コード生成のススメ
nonchalant
0
150
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 Agent時代のリアーキテクチャ戦略と実践
hokaccha
1
640
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
410
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
580
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
120
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
940
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
130
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
180
ソフトウェアラスタライザ
fadis
1
790
typoなんかねぇよ
raspython3
0
670
フロントエンドUIフレームワークのこれまでとこれから
ssssota
1
700
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
600
Featured
See All Featured
Practical Orchestrator
shlominoach
191
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Amusing Abliteration
ianozsvald
1
290
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
WCS-LA-2024
lcolladotor
0
820
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
First, design no harm
axbom
PRO
2
1.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Visualization
eitanlees
152
17k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
270
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
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)