phoenix-powerWebアプリを作成したいなあと思って、どの言語が良いのか、どのWebフレームワークを採用するのかなどを検討してみました。

Ruby on Rails

Rubyでは、RailsというWeb framework(Webフレームワーク)が有名ですね。しかし、現時点ではこの選択肢は個人的にはないと考えています。確かに、今までは、Webアプリというと、Rails一択という感じでした。これは日本でも海外でもそんな感じだったのではないでしょうか。

しかし、現時点では、Railsを参考に数々の問題を解決したWeb Frameworkが登場しているからです。その一番は、やはり速度にあるように思います。

Elixir on Phoenix

Elixirでは、Phoenixがあります。Phoenix-frameworkは、Rails風なリッチなフレームワークである割にデフォルトでもそこそこ速いらしいです。

これは興味があったので試してみました。

Dockerでやる場合は以下。

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

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

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

1
2
3
4
5
$ 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にアクセスする感じ。

1
2
3
4
5
6
7
8
9
10
11
$ 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

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

Go on Revel

Goでは、まず、ちょっと重めのRevelを使ってみます。

http://qiita.com/2KB/items/7a743033d8d1a87f1b72

1
2
3
$ go get github.com/revel/revel

$ go get github.com/revel/cmd/revel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ 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を返すようにしてみます。

$GOPATH/src/myapp/app/controllers/app.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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"})
}

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

1
2
3
4
5
6
$ revel run myapp
------------------------
$ curl localhost:9000
{
"Name": "go test"
}

あと、Golangには、Beego, Martiniなどがあって、Beegoは中国っぽいのでみんな避けてるっぽいのと(中国が嫌いとかではなく、マルウェア的な何かが入ってるんじゃないか的な意味で)、Martiniは軽量で使いやすいということで人気ぽいです。

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

したがって、個人的には、Beegoを使ってみたい。

Heroku

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

こういったサービスは、Heroku, Modulus, DigitalOceanなんかが有名ですよね。

データベースは、HerokuのPostgreSQLとAmazon RDSのPostgreSQLが有名です。これに関しては、Heroku PostgreSQL vs. Amazon RDS for PostgreSQLを読まれてみても面白いかもしれません。

Herokuは、新しい料金体系が発表されたことから移行先が検討されています。

個人的には、Modulusがおすすめかなあと思っています。