+ All Categories
Home > Technology > Starting an Erlang Project

Starting an Erlang Project

Date post: 11-Aug-2015
Category:
Upload: guest2056d
View: 155 times
Download: 0 times
Share this document with a friend
23
分散処理勉強会 #3 LT Starting an Erlang Project Ikuta@Zero Co. Ltd. (id:cooldaemon) July 3rd, 2009. 1
Transcript

分散処理勉強会 #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 でも様々

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 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

14

テストCommon Test を推奨

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

けれど・・・

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

別ノードのカバレッジ情報を取得できない(分散ノードを利用したプロジェクトで不便)

15

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

mochiweb 組み込み用 Web Server

smerl Meta Programming 機能の提供

erljob Job Scheduler

udp_server UDP パケットの送受信 Server

list_utils List 操作機能の提供

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

16

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

気が向いたら更新

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

ermlia_web で mochiweb_http を start

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

17

smerlMeta 操作機能の提供

Erlyweb の Model 生成などに利用

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

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

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

18

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

タスクの...

監視

安全な入れ替え

実行間隔の変更

登録・破棄

一時停止・再会19

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

20

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

Supervisor の監視下

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

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

21

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

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

例外を投げない split

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

22

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

23


Recommended