どうも。開発の@_fpです。
前回、Haskell を取り上げましたが、今回は関数型言語つながりで Erlang です。
Web 関係でも Facebook chat で使われている など、話題になることも少なくありませんが、多くの人にとって「なんだかよく分からない言語」という印象が強いのではないでしょうか。 実際は、 Haskell と比べるとかなりユルい雰囲気の言語という印象です。
特徴的なプロセスモデルが注目されがちですが、Erlang でも Web 開発は可能で webmachine というシンプルなフレームワークを利用する事で、比較的手軽に Web アプリケーションを作成する事ができます。
ここでは、 Facebook の Node.js 版スケルトンをほぼそのまま Erlang と webmachine で動作するよう移植した拙作の Facebook アプリケーションを紹介します。
下準備として必要なこと
- git のインストール
- Erlang のインストール (ダウンロード)
- Facebook 開発者登録
- Heroku 登録
- Heroku CLI のセットアップ
Facebook アプリの作成
Facebook の開発者ページで、新規アプリケーションを作成します。
Web Hosting をチェックします。Facebook アプリケーション作成と同時に Heroku アプリが作成されます。
Node.js を選択します。理由は Ceder だからというだけです。
この状態で、このアプリケーションの動作を確認しておくと良いでしょう。
Erlang 化
Heroku から適当な作業ディレクトリにチェックアウトして、プロジェクトの中身を一旦カラにします。
# 特に Node.js を dis るつもりはないです。
$ git clone git@heroku.com:hoge-ika-1234.git $ cd hoge-ika-1234 $ git rm -fr .gitignore node_modules package.json public Procfile views web.js $ git commit -m 'clean' $ cd ..
rebar のチェックアウト
Erlang のビルドツールである rebar をチェックアウトしてビルドします。
$ git clone https://github.com/basho/rebar.git $ cd rebar $ make
ビルドできたら、さっきのチェックアウトしたディレクトリにコピーします。
$ cp rebar ../hoge-ika-1234 $ cd ..
スケルトンファイルの追加
GitHub から拙作の Erlang スケルトンを取得します。
$ cd hoge-ika-1234 $ git pull https://github.com/fpt/efbapp.git
priv/app.config に App ID とシークレットキーを設定します。
$ vim priv/app.config $ git add -f priv/app.config $ git commit -m 'edit app.config'
ビルド
$ make
エラーがないか確認します。
heroku にコミット
@voluntasさんの方法で Heroku上で動かしてみます。 Procfile 等はスケルトンで変更済みです。
$ heroku config:add BUILDPACK_URL=http://github.com/heroku/heroku-buildpack-erlang.git $ git push origin master
余談ですが、普通に Heroku でアプリ作るとリポジトリはherokuになるんですが、 Facebook アプリから作ると origin になるようです。
動作チェック
Facebook 開発者ページの、アプリケーション概要から「キャンバスページ」の URL を開きます。動くとこんな感じです。
元の Node.js とほぼ同じだと思います。下のリストに出るあなたの情報がサーバーサイドの Erlang コードで Facebook API を通じて取得した情報です。
バグってエラー画面が出たらごめんなさい。てへぺろ☆
動かない場合
heroku logs コマンドで、エラーになっていないか調べてみましょう。 コミット漏れでファイルが足りていないといった事もあるかもしれません。
環境固有の問題など、上記の説明で不足している部分があるかもしれないので、エラーが起きたら修正方法を共有していただけると良いかと思います。
まとめ
動かして元の Node.js とソースを比較してもらえれば、意外と普通でシンプルな言語だと分かるのではないでしょうか。
個別のモジュールの使い方などについては、おいおい説明していきたいと思います。