Elixir+Phoenixに触ってみる（インストール編）

# 今回やることやること
- Elixirのインストール
- Phoenixを使ったアプリ基盤作成

# Elixirとは？
Elixirとは、Erlangを元に開発された、Ruby風の文法を持つ言語である。
Erlangの持つ並行性からくるスケーラビリティ（パフォーマンスが悪い？じゃあ実行プロセスを増やせばいい！）と耐障害性（プロセスから反応が帰ってこない？じゃあ一旦殺してまた新しいプロセスを立ち上げよう！）を保持しつつ、
Erlang特有のあまり一般的ではない文法からRuby風の文法に化粧しなおすことで、開発者達の興味を引き、
これまで言われてきたエコシステムの弱さを克服しようとしている言語になっている、と思う。（これは推測）

# Phoenixとは？
Elixirを使った、Webアプリケーションフレームワーク。
ようするに、Elixir版のRails。
実際ElixirはRailsの元コントリビュータによって進められているらしく、PhoenixもRailsや
その後続たちを使ったことがある人ならば、ごく自然に理解できるようなつくりになっているらしい。

また、HTML文字列を生成してクライアントに返すという古典的なWebアプリケーションモデルを大本においていたRails（最近のバージョンはよく知りませんが…）とちがって、
- ブラウザ以外のクライアントを想定した、RESTアーキテクチャ
- クライアントとの双方向通信のためのWebSocket
などといったものも標準でサポートしているのもポイント。

# Elixirのインストール
前回作成した環境（ http://qiita.com/ak-ymst/items/354b6d8c14029d52231b ）にインストールしたいのだが、CentOS7ではソースからコンパイルしてやる必要がある様子。
インストール作業は、こちらのサイト( http://www.jeramysingleton.com/install-erlang-and-elixir-on-centos-7-minimal/ )を参考にさせていただきました。
## 必要なツール類をインストール

     $ sudo yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git

wxBaseもErlangで必要らしいのでインストールする。

     $ sudo yum install wxBase.x84_64

## Erlangのインストール。
リポジトリ追加用のrpmが用意されているので、そちらを使用後、yumでインストールを行う。

    $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
    $ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
    $ sudo yum install esl-erlang

無事インストールされているかを確認する。

    $ erl -version
    Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 7.2

erlコマンドの使い方は、また機会があったら。

## Elixirのインストール
Elixirのソースはgithubで管理されているので、そちらからcloneする。

    $ sudo mkdir /opt/elixir
    $ sudo git clone https://github.com/elixir-lang/elixir.git /opt/elixir

そしてコンパイル。

    $ cd /opt/elixir
    $ sudo make clean test

コンパイルが通ったら、PATHの通っている場所に各種バイナリのシンボリックリンクを作成。

    $ sudo ln -s /opt/elixir/bin/iex /usr/local/bin/iex
    $ sudo ln -s /opt/elixir/bin/mix /usr/local/bin/mix
    $ sudo ln -s /opt/elixir/bin/elixir /usr/local/bin/elixir
    $ sudo ln -s /opt/elixir/bin/elixirc /usr/local/bin/elixirc

無事インストールされているかコンソールから確認。

    $ elixir -v
    Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

    Elixir 1.3.0-dev (8b3db09)

# Phoenixを使ってアプリケーション基盤を作成する
Phoenixプロジェクトの作成はmixコマンドを使って行う。
mixはElixir付随のプロジェクト管理用コマンドラインツール。rubyでいうBundlerに相当するらいいのですが、詳しいことはまだ調べてないのでよくわかりません。

まずは、パッケージ管理ツールであるhexとPhoenixをインストールする。

    $ mix local.hex
    $ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

そして、プロジェクトの作成

    $ cd ~
    $ mix phoenix.new phoenix_sample --database mysql

ちなみに、phoenixプロジェクトのデフォルトのDBはpostgresqlになっているようなので、mysqlを使いたい場合はオプションで指定してやる必要がある（プロジェクト作成後に、configを修正することで使うDB変えることも可能）

プロジェクトを作成したら、メッセージとして表示されるようにプロジェクトディレクトリに移動し、ビルドインサーバを起動してみるわけだが、

    $ cd phoenix_sample
    $ mix phoenix.server
    [info] Running PhoenixSample.Endpoint with Cowboy using http on port 4000
    [error] Could not start watcher because "node" is not available. Your Phoenix application is still running, however assets won't be compiled. You may fix this by installing "node" and then running "npm install".

となり起動失敗。メッセージを読むとnodeが必要とのこと。早速インストール。
v4.x系が必要？なので、バージョンはそれを選択。
（訂正：必要なnodeのバージョンは5系でした）

    $ git clone https://github.com/creationix/nvm.git ~/.nvm
    $ source ~/.nvm/nvm.sh 
    $ nvm install v4.2.6
    $ node -v
    v4.2.6
    $ npm install

再度、サーバ起動

    $ mix phoenix.server
    [info] Running PhoenixSample.Endpoint with Cowboy using http on port 4000
    05 Feb 15:27:55 - error: Compiling of web/static/js/app.js failed. Couldn't find preset "es2015" relative to directory "web/static/js" ; Compiling of web/static/js/socket.js failed. Couldn't find preset "es2015" relative to directory "web/static/js"

何やらエラーが発生しているようだが
http://192.168.33.100:4000/
にアクセスすると一応はTOP画面らしきものが表示される。
CSSがまったく当たってないようにみえるのは、上記のエラーのせいでしょう。

# 次回
今回作ったプロジェクト基盤を元に、最後のエラーの修正と、簡単なチュートリアルを行ってみたいと思います。