今日から始めるMochiweb 第2回デモアプリから学ぶ。


前回作成したMochidemoデモアプリケーションを覗いてみる事にする。ひとまずこれくらいのレベルからみてこっと。


プロジェクト構成は以下のようになっている。
docはedocドキュメント、ebinはerlangのバイナリ実体、privはどうやら静的ファイルの置き場かな。
srcはもちのろんソースコード、supportはmakeのための設定ぽい。

こんな感じ。

pugya:mochiweb shot$ tree mochidemo/
mochidemo/

-- Makefile
-- deps
`-- mochiweb-src -> /Users/shot/dev/erlang/product/mochiweb/scripts/../ebin/..
-- doc
-- mochidemo.html
-- mochidemo_app.html
-- mochidemo_deps.html
-- mochidemo_sup.html
`-- mochidemo_web.html
-- ebin
-- mochidemo.app
-- mochidemo.beam
-- mochidemo_app.beam
-- mochidemo_deps.beam
-- mochidemo_sup.beam
`-- mochidemo_web.beam
-- include
-- priv
`-- www
`-- index.html(*1)
-- src
-- Makefile
-- mochidemo.app
-- mochidemo.erl
-- mochidemo.hrl
-- mochidemo_app.erl
-- mochidemo_deps.erl
-- mochidemo_sup.erl
`-- mochidemo_web.erl
-- start-dev.sh
-- start.sh

`-- support
`-- include.mk

9 directories, 24 files


まず表示されていたhtmlはpriv/www/index.htmlぽい。
どこかでルート指定が/priv/wwwにされているはずなので、まずはそこから抑えてみます。
コードの作りはおいおい。

pugya:src shot$ grep "priv" *.erl
mochidemo_sup.erl: {docroot, mochidemo_deps:local_path(["priv", "www"])}],

ふむ。mochidemo_sup.erlでルート指定しているぽ。
コードを見てみると(命名の標準的な規約からも)、supervisorだということがわかる。
以下のように、IP、port、ドキュメントルートを指定して、supervisorのWorkerの設定として渡している。
ちなみに監視ツリー形態はone_for_oneで、子プロセスも多分gen_serverだから、下記のコードでいうところのWebアトムもその設定になっているのかな。で、そのWebアトムの中でもWebConfig部分が実際の渡される設定部分ということなんだろう。

41 %% @spec init() -> SupervisorTree
42 %% @doc supervisor callback.
43 init(
) ->
44 Ip = case os:getenv("MOCHIWEB_IP") of false -> "0.0.0.0"; Any -> Any end,
45 WebConfig = [
46 {ip, Ip},
47 {port, 8000},
48 {docroot, mochidemo_deps:local_path(["priv", "www"])}],
49 Web = {mochidemo_web,
50 {mochidemo_web, start, [WebConfig]},
51 permanent, 5000, worker, dynamic},
52
53 Processes = [Web],
54 {ok, {{one_for_one, 10, 10}, Processes}}.

まあ当たり前だけども、ポートとか変えてコンパイルとmakeしなおしてみる。当然動く。
このへんはMochiwebのプロジェクト生成のテンプレートにベタに書いてあるみたいね。


短いけど今日はこれくらいにする。
次回は実際にサンプルコードを見てきまーす。