どうも僕です。
Code for Tottori Advent Calendar 2015 20日目のエントリです。
題しまして、『「島根を避けて鳥取へたどり着くゲーム」をServer-Side Swiftで作ってみた』
鳥取要素はタイトルだけです。島根をライバル視しておりますがRuby大好きです。
完成したものはこちらです。諸事情あってHerokuにはRuby製のものをアップしています(え
島根を避けて鳥取へたどり着くゲーム
https://reach-the-tottori.herokuapp.com/
キーワードを選び続けて、「鳥取県」が結果に含まれたらGoodです。それまでに「島根県」が表示されてしまうとBad、両者が一緒に表示されるとEvenです。頑張ってみてください。
実装については難しいことはしていません。いろんな知見の寄せ集めで試してみた記録です。何かの参考になりましたら。
ゴール
- OSSになったServer-Side Swiftを使って簡単なアプリケーションを作ってみる
- Herokuで動かしてみる
- 島根を軽くDisって鳥取を持ち上げてみる
手順と技術要素
- Server-Side Swiftのインストール
- Macで開発
- Webアプリケーションの作成
- Swift Package Manager
- Curassow
- Mustache
- 島根を避けて鳥取へたどり着くゲーム
- DBPedia
- Herokuへデプロイ
- Heroku buildpack: swift
Server-Side Swiftのインストール
今回はMacで開発しました。既存のSwiftはバージョン2.1でしたが、Package Managerを使う為バージョン2.2をインストールします。https://swift.org/download/ から Xcode Swift 2.2 Snapshot をインストール。
2.2が参照されるようパスを変更しておきます。
$ export PATH="/Library/Developer/Toolchains/swift-2.2-SNAPSHOT-2015-12-10-a.xctoolchain/usr/bin:${PATH}"
SwiftがOSSになったのでSwift Package Managerとか試してみた
http://qiita.com/hayashikun/items/fddcdb7c2f9c687bcc80
Webアプリケーションの作成
Swift Package Manager
HomeBrewの作者の方が開発されてるらしいですね。
設定ファイルがSwiftで記述できるのでbenryです。
import PackageDescription
let package = Package(
name: "reach-the-tottori",
dependencies: [
.Package(url: "https://github.com/kylef/Curassow.git", majorVersion: 0, minor: 2),
.Package(url: "https://github.com/groue/GRMustache.swift", majorVersion: 1, minor: 0),
]
)
Curassow
CurassowというHTTPサーバライブラリを使ってみました。
serve { request in
return Response(.Ok, contentType: "text/plain", body: "Hello World")
}
まだまだ機能もシンプルでバギーな感じ。Perfectというフレームワークが出てきたらしいので、今度はそれを使ってみたいです。
GRMustache.swift
テンプレートエンジン使いたかったので探してみたけどあまり見当たらず。
Mustacheというロジックレステンプレートというものがあり、Swift版があったので試してみました。
Mustacheは言語に依存しない共通のフォーマットで記載するテンプレートエンジンで(Bashまである!?)、かつロジックの記載ができません。
これはこれで役割がシンプルだし構文覚えるのが楽で良いなーと思いましたが、一方でViewにデータを渡すタイミングで表示を意識したデータ構造にする必要があり、責務の分離を工夫した方が良さそうです。例えばテーブルの偶数行だけ色を変えたい場合などにそのデータが奇数行か偶数行かという情報もViewに渡してやらなきゃいけません。
島根を避けて鳥取へたどり着くゲーム
DBPedia
アプリのデータはWikipediaから取得しています。Wikipediaの情報をオープンデータ化してくれるDBpediaというものがあり、今回はこちらをお借りしました。とてもbenry。
開発
Macではこんな感じで。
$ swift build
$ .build/debug/reach-the-tottori
Herokuへデプロイ
Swift用のBuildpackを使います。
Heroku buildpack: swift
https://github.com/kylef/heroku-buildpack-swift
Buildpackというのは、デプロイの度に任意のコマンドが実行できる仕組みだそうです。バイナリを組み込んで動作させることでHerokuでサポート外の言語でも行けるというもの。便利ですね。
今回はHerokuで動かすところまでは未達成。GRMustache.swiftの内部でFoundationを使用しており、Foundation入りの環境を作ってやる必要がありました。対応できたらまた投稿したいと思います。
まとめ
まだまだOSS化されたばかりで、ライブラリなど発展途上もしくは誕生すらしていないものが多いです。サーバサイドをSwiftでゴリゴリ開発するというのはもう少し先の話になるかと思いますが、このタイミングでふれてみて概要を把握するのはとても良いと感じました。
また、言語の誕生からずっとエコシステムの発展が見守れるというのはとてもエキサイティングなことです。乗るしかない、このビッグウェーブに。