Web Frameworkとして検討する言語とフレームワーク

##はじめに

今までは、Webアプリの開発というと`Rails`という感じでした。しかし、今日ではRailsを参考に多くのWeb Frameworkも登場しているので、それらについておすすめのものを検討してみます。

##Ruby on Rails

Rubyでは、[Rails](https://github.com/rails/rails)というWeb framework(Webフレームワーク)が有名ですね。

しかし、速度が遅いなどと言われているのが少し気になります。

##Elixir on Phoenix

Elixirでは、[Phoenix](https://github.com/phoenixframework/phoenix)があります。Phoenix-frameworkは、Rails風なリッチなフレームワークである割にデフォルトでもそこそこ速いらしいです。

これは興味があったので試してみました。Dockerでやる場合は以下。

https://github.com/xtity/docker-centos7-elixir-phoenix

```bash:
$ docker run -d -p 80:4000 --name phoenix -t xtity/docker-centos7-elixir-phoenix
```


それ以外は本体にインストールすることになるけど、以下のような感じです。

```bash:
$ brew install elixir

$ mix local.hex

$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.14.0/phoenix_new-0.14.0.ez
```

使い方はテンプレートを作成し、サーバーを起動。`localhost:4000`にアクセスする感じ。

```bash:
$ mkdir phoenix

$ cd phoenix

$ mix phoenix.new ./hello_phoenix

$ cd hello_phoenix

$ mix phoenix.server
----------------------------
$ curl 127.0.0.1:4000
```

サンプルとしてチャットアプリのコードが公開されています。

https://github.com/chrismccord/phoenix_chat_example

[Demo](http://phoenixchat.herokuapp.com/)

また、デモは[Heroku](https://www.heroku.com/)を使用していて、これはWebアプリなどを無料で公開できるサーバーを管理できるサービスという感じのものです。これについては後述します。


##Go on Revel

Goでは、まず、ちょっと重めの[Revel](http://revel.github.io)を使ってみます。

[http://qiita.com/2KB/items/7a743033d8d1a87f1b72](http://qiita.com/2KB/items/7a743033d8d1a87f1b72)

```bash:
$ go get github.com/revel/revel

$ go get github.com/revel/cmd/revel
```

```bash:
$ cd $GOPATH

$ revel help
usage: revel command [arguments]

The commands are:

new         create a skeleton Revel application
run         run a Revel application
build       build a Revel application (e.g. for deployment)
package     package a Revel application (e.g. for deployment)
clean       clean a Revel application's temp files
test        run all tests from the command-line

Use "revel help [command]" for more information.

$ revel new myapp

$ tree myapp
myapp
├── README.md
├── app
│   ├── controllers
│   │   └── app.go
│   ├── init.go
│   ├── routes
│   │   └── routes.go
│   ├── tmp
│   │   └── main.go
│   └── views
│       ├── App
│       │   └── Index.html
│       ├── debug.html
│       ├── errors
│       │   ├── 404.html
│       │   └── 500.html
│       ├── flash.html
│       ├── footer.html
│       └── header.html
├── conf
│   ├── app.conf
│   └── routes
├── messages
│   └── sample.en
├── public
│   ├── css
│   │   └── bootstrap.css
│   ├── img
│   │   ├── favicon.png
│   │   ├── glyphicons-halflings-white.png
│   │   └── glyphicons-halflings.png
│   └── js
│       └── jquery-1.9.1.min.js
└── tests
└── apptest.go

$ revel run myapp
------------------------
$ curl 127.0.0.1:9000
```

APIとして機能させるために、`JSON`を返すようにしてみます。

```bash:$GOPATH/src/myapp/app/controllers/app.go
package controllers

import "github.com/robfig/revel"

type User struct {
Name string
}

type App struct {
	*revel.Controller
}

func (c App) Index() revel.Result {
//return c.Render()
return c.RenderJson(User{"go test"})
}
```

アクセスすると、こんな感じで返します。

```bash:
$ revel run myapp
------------------------
$ curl localhost:9000
{
"Name": "go test"
}
```

あと、Golangには、[Beego](http://beego.me/quickstart), [Martini](https://github.com/go-martini/martini/blob/master/translations/README_ja_JP.md), [Goji](https://github.com/zenazn/goji)などがあって、`Beego`は中国っぽいのでみんな避けてる感じなのと(中国が嫌いとかではなく、マルウェア的な意味で)、`Martini`は軽量で使いやすいということで人気ぽいです。

しかし、`Martini`には黒魔術を常用するという問題があり、この問題は根本的なものであるため、現在でも解決されていないと思われます。これは、Go言語のシンプル理念とは相反するものであり、メンテナンスのコストが増大する可能性がありますので、あまり使いたくない感じします。

したがって、個人的には、[Goji](https://github.com/zenazn/goji)を使ってみたい。

##PaaS

`Heroku`とは、Webアプリなどを無料(無料で使える料金プランがあるという意味)で公開できるサーバーを管理できるサービスという感じのものです。

こういったサービスは、[Heroku](https://www.heroku.com/), [Modulus](https://modulus.io/), [DigitalOcean](https://www.digitalocean.com/), [OpenShift](http://qiita.com/syui/items/e6d1d7981f89a5df10a8)なんかが有名ですよね。

データベースは、HerokuのPostgreSQLとAmazon RDSのPostgreSQLが有名です。これに関しては、[Heroku PostgreSQL vs. Amazon RDS for PostgreSQL](http://yakst.com/ja/posts/2583)を読まれてみても面白いかもしれません。

Herokuは、新しい[料金体系](https://blog.heroku.com/archives/2015/5/7/new-dyno-types-public-beta)が発表されたことから移行先が検討されています。

個人的には、[OpenShift](http://qiita.com/syui/items/e6d1d7981f89a5df10a8)がおすすめかなあと思っています。