Ubuntu上でSwiftサーバーサイドフレームワークのPerfectを動かしてみた


# はじめに

11月末にSwiftのサーバーサイドフレームワークの[Perfect](https://github.com/PerfectlySoft/Perfect)が発表されました。さっそく試してみます。


![image](https://qiita-image-store.s3.amazonaws.com/0/57284/110a8032-a2d6-af9f-c258-e449b8dea468.png)


### まずは
ワクワクしながら[Swiftでサーバサイドプログラムを書く with Perfect（導入編）](http://qiita.com/nirazo/items/a09b1a4687384d3e1fd0)を参考にMac上で動かしてみました。なるほど、簡単に動きますね。

### 次はXcodeを使わずにやってみたい！

ということでMac上でサクっとやりたいのですがmakeでこけます。残念。[このイシュー](https://github.com/PerfectlySoft/Perfect/issues/38)で同じ内容を指摘されていますので、このissueが解決されるのを待ちましょう。(え、自分で修正してプルリク送れよ、というツッコミはなしで)。ということでLinuxで試してみました。基本的に各種公式ドキュメントの手順をトレースしています。

# 試した環境
* Ubuntu 15.10 (OSX ElCapitan 10.11.2上にのせてます)

Ubuntu15.10は、[Ubuntu 15.10 日本語 Remix リリース](https://www.ubuntulinux.jp/News/ubuntu1510-ja-remix)からisoイメージをDLしてきてVirtualBoxで上で準備しました。本当はVagrantでbox使ってさくっとやりたかったのですが、色々ハマりまして。。。需要あれば環境準備手順もどこかにまとめます。一応少しだけまとめてあります->[Ubuntu 15.10 日本語版をVirutualBox上にインストールする方法(sshできない罠も解消)](http://qiita.com/yonell/items/8b3af541dd102607fbcf)あと、Perfectは今のところ15.10でしか動かないらしいです。[appleさん](https://swift.org/download/)は15.10だけでなくて14.04もswiftのサポートしてくれてるんでひょっとしたら動くかもですが。

# ざっくり手順

1.Ubuntu上でSwiftを実行できるように
2.Perfectをclone
3.その他必要なものを準備
4.動作確認してみます

# 実際にやってみます

## 1.Ubuntu上でSwiftを実行できるように
[公式ページのGetting Started](https://swift.org/getting-started/)の手順にそってます。swiftをソースコードからビルドしたい方は[apple/swift](https://github.com/apple/swift)からどうぞ。

### 1-1. Swift公式ページの[Download Swift](https://swift.org/download/)にアクセスし、Ubuntu 15.10 Swift 2.2 SnapshotをDL

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/441cfca2-c8fb-8345-58d8-54b98362a486.png)


### 1-2. clangをインストール
※clang(クラン)とはコンパイラです。詳しくは[wiki](https://ja.wikipedia.org/wiki/Clang)参照。


```
sudo apt-get install clang
```

### 1-3. PATHを通す

```
export PATH=/path/to/Swift/usr/bin:"${PATH}"
```

### 1-4. 動作確認
これでswiftが実行できるようになりました。（とても簡単でしたね！)

対話型で実行してみると、、、動きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/d3c24150-47bb-86ad-03cc-edd854fd6dcc.png)

もちろん*.swiftも実行できます。公式ページによるとLinuxではGlibcをimportする必要があるとのことです。

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/b1371850-d10c-f736-a629-0fee9c8aea3e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/60c04810-ba11-3474-40fc-8e91ba85e61f.png)


## 2.Perfectをclone

まずはgitインストール

```
sudo apt-get install git
```

次は[Perfect](https://github.com/PerfectlySoft/Perfect)をcloneしましょう。

```
git clone https://github.com/PerfectlySoft/Perfect.git
```

認証求められると思いますのでご自分のIDとPASSをいれてください。


## 3. 必要なものを準備

基本的に公式のREADMEの通り。

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/09349ff1-bda7-9e99-9eaf-f2f41cb524e9.png)



### 3.1 PerfectLibをbuild

```
# 必要なライブラリをinstall
sudo apt-get install libssl-dev libevent-dev

# build
cd {Perfectをcloneしたディレクトリ}/PerfectLib
make
sudo make install
```

自分では試せてないですが、ライブラリが足りずにmakeでこけるみたいです。
詳しくは[ubuntu15.10にswift+Perfect環境を作ろうとしたらmakeで結構怒られたのでメモ](http://qiita.com/h-tko/items/7f5614723640d4197a74)を参照です。

### 3.2 PerfectServerをbuild

```
cd {Perfectをcloneしたディレクトリ}/PerfectServer
make
```

### 3.3 Apache2をinstall

デフォルトではapacheが入ってないのでinstall
```
sudo apt-get install apache2
```

## 4. 動作確認してみます
上手く動かなかったので、こちらの記事[サーバーサイド Swift フレームワークである Perfect を Docker で動かせるようにした](http://blog.holidayworking.org/entry/2015/12/27/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89_Swift_%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E3%81%82%E3%82%8B_Perfect_%E3%82%92_Docker_%E3%81%A7)を参考にさせていただきました。

## 4.1 PerfectServer起動
参考にした記事によるとperfectserverhttpを実行するディレクトリ内に、PerfectLibrariesディレクトリが必要でなおかつその中にsoファイルの実体もしくはシンボリックリンクが貼られてないといけないようです。

```
cd {Perfectをcloneしたディレクトリ}/Examples
# アプリケーションをコンパイル
make

mkdir PerfectLibraries
cd PerfectLibraries

# シンボリックリンクはります
ln -s {Perfectをcloneしたディレクトリ}/Examples/URL\ Routing/URLRouting.so .
cd ..
./perfectserverhttp
```
今回はURL Routingを試してみました。詳細は[こちら](https://github.com/PerfectlySoft/Perfect/tree/master/Examples/URL%20Routing#url-routing)をご参照いただきたいですが、名前の通りルーティングをどうするかを理解するためのサンプルのようです。もし他のアプリケーションを動かしたい場合は、シンボリックリンクの向き先を相当するsoファイルに向けてください。

# ブラウザでアクセスしてみます
OKですね!
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/a3736b03-d4bc-9691-235b-0ca13ec37ff2.png)


# おわりに
一応うまく行きましたが、もう少し色々やってみたいので進捗あったら更新しますm(_ _)m

# ご協力いただいた方々
* @holidayworking さん[サーバーサイド Swift フレームワークである Perfect を Docker で動かせるようにした](http://blog.holidayworking.org/entry/2015/12/27/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89_Swift_%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E3%81%82%E3%82%8B_Perfect_%E3%82%92_Docker_%E3%81%A7)
* @h-tko さん[ubuntu15.10にswift+Perfect環境を作ろうとしたらmakeで結構怒られたのでメモ](http://qiita.com/h-tko/items/7f5614723640d4197a74)
* @yuta-t さん [編集リクエスト](http://qiita.com/yonell/items/79bf4ee3cd65f69903ec/patches/17287)