25
分散処理勉強会 #3 LT Starting an Erlang Project Ikuta@Zero Co. Ltd. (id:cooldaemon) July 3rd, 2009. 1

Starting an Erlang Project

Embed Size (px)

Citation preview

分散処理勉強会 #3 LT

Starting an Erlang ProjectIkuta@Zero Co. Ltd. (id:cooldaemon)July 3rd, 2009.

1

お題ビルドツール

ディレクトリ構成

起動と停止

ログ管理

テスト

モジュールの宣伝

2

ビルドツール世の中には、ビルドツールが沢山ある

GNU make, OMake, ant, MakeMaker, Rake, SCons, etc...

何を使うかは好み!

有名な Erlang Project でも様々

GNU make の利用率が高い(次いで Rake)

Erlang 標準の Emake の利用率は低い

3

ディレクトリ構成

名前 用途ebin *.beam、*.appinclude *.hrlpriv その他のファイルsrc *.erl、など

Erlang のマニュアルに記載されているディレクトリhttp://erlang.org/doc/design_principles/applications.html#app_dir

4

ディレクトリ構成

名前 用途

doc EDoc で生成したドキュメント

log SASL error_logger で出力されたログ

test Common Test 関連のファイル

公式ではないが、一般的なディレクトリ

5

ディレクトリ構成

名前 用途

contrib 便利なツールなど(Kai)

deps 依存モジュール(Mochiweb)

examples サンプルコード

scripts スクリプトファイル

既存プロジェクトで採用されているディレクトリ

6

起動と停止Erlang は VM 上で動作する

erl コマンドで VM を起動する必要がある

独自のコンソールを持つ

シェルと相性が悪い

escript は main/1 の終了 = VM の終了

常駐する処理に不向き

7

起動と停止Erlang は VM 上で動作する

常駐する処理に向く

コンソールはデタッチ&アタッチできる

escript は main/1 の終了 = VM の終了

シェルと相性が良い

使い捨て処理に向く

8

起動と停止起動はシェルで行う

#!/bin/sh

ROOT='/path/to'ERL='/usr/bin/env erl'

${ERL} -sname ${1} \ -pa ${ROOT}/ebin \ -eval 'application:start(foo).' \ -detached

※${ROOT} は、Makefile 内で sed で書き換える

9

起動と停止停止は escript で行う

#!/usr/bin/env escript%%! -sname foo_stopermain([Sname]) -> rpc:call(sname_to_node(Sname), init, stop, []);main(_) -> usage().

sname_to_node(Sname) -> Node = atom_to_list(node()), list_to_atom(Sname ++ string:substr(Node, string:cspan(Node, "@") + 1)). usage() -> io:format("usage: stop.erl [target sname]~n"), halt(1).

10

ログ管理SASL を使う

conf ファイルに保存先やローテションの記述

コード内で error_logger を使う

後から rb で参照する

rb は、escript から使うと便利

11

ログ管理詳しくは、Programming Erlang を参照の事

こちらもどうぞhttp://d.hatena.ne.jp/cooldaemon/20070918/1190085199

12

テストCommon Test (R12B から標準)

テスト対象とテストコードを分離

高機能

EUnit (R13B から標準)

テスト対象にテストコードを記述する事もできる

Assert マクロあり

モジュールごとに test/0 を用意 (Mochiweb など)13

テストCommon Test を推奨

コードカバレッジが最高に魅力的

カバレッジ情報の収集のためコンパイル時に +debug_info が必要

14

テストカバレッジ情報が収集できない事がある

メタ操作するとカバレッジは初期化される(メタ操作でモックを差し替え)

別ノードのカバレッジ情報を取得できない(分散ノードでテスト)

15

テスト環境により run_test のパスが異なるのでMakefile に下記を記載する(Kai オリジナル)

COMMON_TEST= $(shell erl -noshell -eval 'io:format("~s~n", [code:lib_dir(common_test)]).' -s init stop)RUN_TEST_CMD=$(COMMON_TEST)/priv/bin/run_test

16

テストCommon Testhttp://erlang.org/doc/apps/common_test/index.html

http://d.hatena.ne.jp/cooldaemon/20080118/1200635774

EUnithttp://erlang.org/doc/apps/eunit/index.html

http://d.hatena.ne.jp/cooldaemon/20070913/1189693590

17

モジュールの宣伝モジュール名 用途

mochiweb 組み込み用 Web Server

smerl Meta Programming 機能の提供

erljob Job Scheduler

udp_server UDP パケットの送受信 Server

list_utils List 操作機能の提供

※全て Ermlia で使用しているhttp://github.com/cooldaemon/ermlia/tree/master

18

mochiwebErmlia の場合、リポジトリに直接配置

気が向いたら更新

make 時に余計な事をさせない(doc の生成など)

ermlia_web で mochiweb_http を start

Req:recv_body で Content を受信http://code.google.com/p/mochiweb/

19

smerlMeta 操作機能の提供

Erlyweb の Model 生成などに利用

Ermlia ではテスト時にプロセスをモックに置換する用途で利用

カバレッジ情報が消えるので、個人的には非推奨http://yarivsblog.com/articles/2006/08/14/smerl-simple-metaprogramming-for-erlang/

http://d.hatena.ne.jp/cooldaemon/20080629/1214746935

20

erljob関数を定期実行する cron 的なモノ

タスクの...

監視

安全な入れ替え

実行間隔の変更

登録・破棄

一時停止・再開21

erljobgen_fsm ベースに切り替え予定http://github.com/cooldaemon/erljob/tree/master

22

udp_server“kai で言うところの tcp_server” の UDP 版

Supervisor の監視下

一つのソケットを使い回す

active モードにも対応http://d.hatena.ne.jp/cooldaemon/20080715

23

list_utilslists モジュールの物足りない部分を補完

シングルノードで動作する pmap

例外を投げない split

lists:split(2, [1]). はエラー

split_map、split_foldl、etc...http://gist.github.com/7239

24

ご清聴ありがとうございました

25