「島根を避けて鳥取へたどり着くゲーム」をServer-Side Swiftで作ってみた



どうも僕です。

[Code for Tottori Advent Calendar 2015](http://qiita.com/advent-calendar/2015/code4tottori) 20日目のエントリです。

題しまして、**『「島根を避けて鳥取へたどり着くゲーム」をServer-Side Swiftで作ってみた』**
鳥取要素はタイトルだけです。島根をライバル視しておりますがRuby大好きです。

完成したものはこちらです。諸事情あってHerokuにはRuby製のものをアップしています(え

> 島根を避けて鳥取へたどり着くゲーム
> https://reach-the-tottori.herokuapp.com/

キーワードを選び続けて、「鳥取県」が結果に含まれたらGoodです。それまでに「島根県」が表示されてしまうとBad、両者が一緒に表示されるとEvenです。頑張ってみてください。

実装については難しいことはしていません。いろんな知見の寄せ集めで試してみた記録です。何かの参考になりましたら。

## ゴール

* OSSになったServer-Side Swiftを使って簡単なアプリケーションを作ってみる
* Herokuで動かしてみる
* 島根を軽くDisって鳥取を持ち上げてみる

## 手順と技術要素

1. Server-Side Swiftのインストール
    * Macで開発
1. Webアプリケーションの作成
    * Swift Package Manager
    * Curassow
    * Mustache
1. 島根を避けて鳥取へたどり着くゲーム
    * DBPedia
1. 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が参照されるようパスを変更しておきます。

```sh
$ 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です。

```swift
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](https://github.com/kylef/Curassow)というHTTPサーバライブラリを使ってみました。

```swift
serve { request in
  return Response(.Ok, contentType: "text/plain", body: "Hello World")
}
```

まだまだ機能もシンプルでバギーな感じ。[Perfect](https://github.com/PerfectlySoft/Perfect)というフレームワークが出てきたらしいので、今度はそれを使ってみたいです。

### GRMustache.swift

テンプレートエンジン使いたかったので探してみたけどあまり見当たらず。
[Mustache](https://mustache.github.io/)というロジックレステンプレートというものがあり、Swift版があったので試してみました。

[GRMustache.swift](https://github.com/groue/GRMustache.swift)

Mustacheは言語に依存しない共通のフォーマットで記載するテンプレートエンジンで([Bash](https://github.com/tests-always-included/mo)まである！？)、かつロジックの記載ができません。
これはこれで役割がシンプルだし構文覚えるのが楽で良いなーと思いましたが、一方でViewにデータを渡すタイミングで表示を意識したデータ構造にする必要があり、責務の分離を工夫した方が良さそうです。例えばテーブルの偶数行だけ色を変えたい場合などにそのデータが奇数行か偶数行かという情報もViewに渡してやらなきゃいけません。


## 島根を避けて鳥取へたどり着くゲーム

### DBPedia

アプリのデータはWikipediaから取得しています。Wikipediaの情報をオープンデータ化してくれる[DBpedia](http://ja.dbpedia.org/)というものがあり、今回はこちらをお借りしました。とてもbenry。

### 開発

https://github.com/yatemmma/reach-the-good/tree/swift

Macではこんな感じで。

```sh
$ 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でゴリゴリ開発するというのはもう少し先の話になるかと思いますが、このタイミングでふれてみて概要を把握するのはとても良いと感じました。
また、言語の誕生からずっとエコシステムの発展が見守れるというのはとてもエキサイティングなことです。乗るしかない、このビッグウェーブに。