Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

どうも僕です。

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って鳥取を持ち上げてみる

手順と技術要素

  1. Server-Side Swiftのインストール
    • Macで開発
  2. Webアプリケーションの作成
    • Swift Package Manager
    • Curassow
    • Mustache
  3. 島根を避けて鳥取へたどり着くゲーム
    • DBPedia
  4. 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版があったので試してみました。

GRMustache.swift

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

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

DBPedia

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

開発

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away