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

Starting an Erlang Project

Aug 11, 2015

Download

Technology

guest2056d
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Starting an Erlang Project

分散処理勉強会 #3 LT

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

1

Page 2: Starting an Erlang Project

お題ビルドツール

ディレクトリ構成

起動と停止

ログ管理

テスト

モジュールの宣伝

2

Page 3: Starting an Erlang Project

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

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

何を使うかは好み!

有名な Erlang Project でも様々

Erlang 標準の Emake は、多分、不人気

3

Page 4: Starting an Erlang Project

ディレクトリ構成

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

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

4

Page 5: Starting an Erlang Project

ディレクトリ構成

名前 用途

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

log SASL error_logger で出力されたログ

test Common Test 関連のファイル

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

5

Page 6: Starting an Erlang Project

ディレクトリ構成

名前 用途

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

deps 依存モジュール(Mochiweb)

examples サンプルコード

scripts スクリプトファイル

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

6

Page 7: Starting an Erlang Project

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

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

独自のコンソールを持つ

シェルと相性が悪い

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

常駐する処理に不向き

7

Page 8: Starting an Erlang Project

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

常駐する処理に向く

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

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

シェルと相性が良い

使い捨て処理に向く

8

Page 9: Starting an Erlang Project

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

#!/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

Page 10: Starting an Erlang Project

起動と停止停止は 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

Page 11: Starting an Erlang Project

ログ管理SASL を使う

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

コード内で error_logger を使う

後から rb で参照する

rb は、escript から使うと便利

11

Page 12: Starting an Erlang Project

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

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

12

Page 13: Starting an Erlang Project

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

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

高機能

EUnit (R13B から標準)

テスト対象にテストコードを記述

Assert マクロあり

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

Page 14: Starting an Erlang Project

テスト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

Page 15: Starting an Erlang Project

テストCommon Test を推奨

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

けれど・・・

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

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

15

Page 16: Starting an Erlang Project

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

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

Page 17: Starting an Erlang Project

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

気が向いたら更新

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

ermlia_web で mochiweb_http を start

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

17

Page 18: Starting an Erlang Project

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

Page 19: Starting an Erlang Project

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

タスクの...

監視

安全な入れ替え

実行間隔の変更

登録・破棄

一時停止・再会19

Page 20: Starting an Erlang Project

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

20

Page 21: Starting an Erlang Project

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

Supervisor の監視下

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

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

21

Page 22: Starting an Erlang Project

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

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

例外を投げない split

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

22

Page 23: Starting an Erlang Project

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

23