読者です 読者をやめる 読者になる 読者になる

try! Swift Swiftでサーバを書いてみよう #tryswiftconf Day3-2

try! Swift 2016

Caesar Wirth

CyberAgentのソフトウェアエンジニアです。これまでEコマース、SNS、動画ストリーミングなど多くのiOSアプリを開発してきました。Swiftクロスプラットフォームであるように、Androidアプリやバックエンドサーバのコードも書いてます。コードを書いてない時は、ハイキングやボルダリングをしたり、東京近郊のおいしいタコライスを探し回ってます!

https://twitter.com/cjwirth

多くのMaciOSアプリはバックエンドのサーバと通信します。 今やSwiftオープンソース化され、アプリ開発しているときと同じ言語でバックエンドの実装を行えるようになりました。サーバサイドSwiftを初める方法をお話しします。

おはようございます

f:id:niwatako:20160304103005j:plain

多くの方々は私がスケジュールに載っていなかったと思うかもしれません。

数日前新しいアプリを作り、try! Swift などカンファレンスのオーガナイザをしています。

f:id:niwatako:20160304103040j:plain f:id:niwatako:20160304103046j:plain

ミニマルなサーバーサイドSwiftアプリを作りましょう

クライアントサイドでリクエストを送る時のコードはこのようなものですね

f:id:niwatako:20160304103104j:plain

Pokedexからポケモンを取ってくると。

サーバーサイドをする時、他ではどうしているのかを参考にできると思います。

f:id:niwatako:20160304103142j:plain

RubyではSinatraが人気。

f:id:niwatako:20160304103149j:plain

Node

f:id:niwatako:20160304103230j:plain

でもRubyやJSを書きたい訳ではありませんね?誰かSwift書きたくないといつか言っていましたが(笑い)

f:id:niwatako:20160304103232j:plain

Swiftの利点は型があることです。

f:id:niwatako:20160304103310j:plain

クライアントサイドと変わりません。

f:id:niwatako:20160304103334j:plain f:id:niwatako:20160304103340j:plain

基本値なものだけ書いていますが、基本的型があれば何をサポートしているか分かる。

サーバータイプを定義する

f:id:niwatako:20160304103415j:plain

データのIn /Out、サーバーは関数のようなものです。

f:id:niwatako:20160304103437j:plain

ソケットをリスニングする、コネクションを開く、スレッドを起動する、Lowレベルの作業したくないことがいっぱい。

そこでフレームワークが使えます

f:id:niwatako:20160304103517j:plain

アプリの実装からこういった事柄を切り離すことが出来ます。

f:id:niwatako:20160304103538j:plain

一つの関数になりました。

f:id:niwatako:20160304103600j:plain

実行するとレスポンスが帰ってきます。

もうすこしRoutingの面倒を見る必要があります。一つのサーバータイプでは対処できません。

f:id:niwatako:20160304103629j:plain

メンテナンス可能でシンタックスを使えるようにしたい。

ルーターを作っていきます。

f:id:niwatako:20160304103645j:plain

ハンドルをしていきます。ルーティングを登録して、ハンドラーが集まってきたらハンドルファンクションも作れます。

半トラータイプというのはThrowもできます。リクエスト失敗に500、のエラーを返すことも可能。

f:id:niwatako:20160304103733j:plain f:id:niwatako:20160304103739j:plain

リクエストを投げて存在しなければエラーを投げる。エラーはもう一つのレスポンスタイプになる。

ハンドルファンクションはルーターと同じですね?

f:id:niwatako:20160304103817j:plain f:id:niwatako:20160304103837j:plain

サーバーにファンクショナリティを追加していきたいと思います。

f:id:niwatako:20160304103845j:plain

サーバーは何をしているかというと

f:id:niwatako:20160304103911j:plain

Pokedexを作ります。捕まえたポケモンが見れる。

f:id:niwatako:20160304103943j:plain

すべてのポケモンを返していくようなものにしましょう

シンプルです

f:id:niwatako:20160304104010j:plain

Getパスからポケモンを取ってきます。シンプルです。

Jsonライブラリを使っているので簡単にやってしまいます

f:id:niwatako:20160304104054j:plain

ポケモンが下で定義されていませんでした

f:id:niwatako:20160304104132j:plain

サーバー側はポケモンを返す。

f:id:niwatako:20160304104150j:plain

リクエストボディをパースします。無ければBadRequest。そしてポケモンをリクエストから取る。JSON Parse は失敗することも有りますよね?do で try します。

f:id:niwatako:20160304104325j:plain

パースして取れなければBadRequest、またパース自体に失敗してもBadRequest

f:id:niwatako:20160304104349j:plain

ポケモンを追加して応答します

f:id:niwatako:20160304104407j:plain

最低限以上になります。

試してみましょう

f:id:niwatako:20160304104432j:plain

f:id:niwatako:20160304104503j:plain

Fetchしてみます

f:id:niwatako:20160304104521j:plain

初めの三匹が入っています。エキサイティングですね

でもこれでもまだ静的データをハンドリングしているだけです。実際にサーバーで何か実行したい。

Postでなにか捕まえたモノを送りたい

f:id:niwatako:20160304104622j:plain

Postのレスポンスには何も戻ってきません。ステータスを出しただけで何も送ってないからです。

でも次に、フェッチすると、入っています!(3匹にさらにピカチューが帰ってきた)

いまはローカル環境のサーバーでやっているだけなので、これを本番環境にあげたい、「とりあえずリリースしようぜ!」

f:id:niwatako:20160304104720j:plain

マーク・ザッカーバーグが、多分動くと思うからリリースしようぜ、と、直接の引用ではないが言っております。

Herokuでデプロイしてみましょう。SwfitEnvは必須ではないが便利です。あとは必須です。

f:id:niwatako:20160304104803j:plain

自分の場合はこんな感じ

f:id:niwatako:20160304104821j:plain

Heroku ブランチにPush

f:id:niwatako:20160304104847j:plain f:id:niwatako:20160304104906j:plain f:id:niwatako:20160304104931j:plain f:id:niwatako:20160304104959j:plain

ご自身でやるときはもう少し早いと思います、デバッグモードでやれば

機能するプロダクション環境が出来たはずです。

先ほどと同じように、でもローカルホストではなくてHerokuでホストされています。

f:id:niwatako:20160304105031j:plain

おっと

f:id:niwatako:20160304105049j:plain

コミットしていませんでした

f:id:niwatako:20160304105107j:plain

ビルド中に

f:id:niwatako:20160304105120j:plain

ルーティングを書き直したいことがあるかもしれません。でも使えるものがあれば書き直す必要はありませんね

ライブラリを見てみました

f:id:niwatako:20160304105145j:plain

Perfect:最も成熟している、セットアップが簡単、スタートがすぐ。この場で開発者の話を聞けると思います。

IBMがKituraを出しています。最もモジュラー化されています。とてもモジュール構成。でも25日前にうまれた赤ちゃん賞でもある

Vapor、私にとって最も直感的。私のコードが好きならこれが向いていると思います。

デモが出来たようです

f:id:niwatako:20160304105316j:plain f:id:niwatako:20160304105338j:plain f:id:niwatako:20160304105351j:plain

DBライブラリは何が提供されているか

PostgreSQLMySQLSQLiteなど。Vaporはまだ足りないようです。調べてみてください。

本当に完璧にできていなくてもリリースした方がいいでしょうか。

みなさんのニーズ次第だと思います。作って壊したければどんどん出せば良いし。

2日前のセッションではまだGCDはLinuxに向けて存在しないということですが、どのようにハンドリングしていますか

リポジトリにはマージされたようだがこの段階ではまだ完成していなかった。どうやっているのか気になってみてみた。Perfectは自分のスレッドを管理している、Vaporも。コンカレンシーはまだ未完成、でもマージされたらいいと思います。この段階ではまだ至っていないという感じだと思います。

”QAに行くなら日本語もできるのでよろしくお願いします。”

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!