5 Erlang Debian にしてみた


PIC
____________________________________________________________________

5.1 のきかけ

Erlang というプログラミング言語がありますこれをしてみようとたのはErlang そのも のがきかけではなくいつものようにのものがきかけですCouchDB という Apache Incubator*3 *4 ドキメントタベ友人からえてもらたのがきかけでしたCouchDB Erlang JavaScript されているというのでErlangだろう味をちました

5.1.1 脱線 CouchDB とは

CouchDB 徴には以下のものがあります

RDB のようににしかりとスキておく必要はなくHTTP PUT ドキメント GET DELETE するタベですRDB るものではないので摘要直まだよく分かりませんですがそうなので友人とこれをめるべく 動中です

CouchDB キテクチについてはCouchDB Project ムペから転載したシステム念図をご さいこれらのErlang によるものです

またCouchDB については動の翻訳などもているのでまた機会におできればと ます

5.1.2 Erlang

Erlang ですがCouchDB 味をさらにそのをどうなているのをりたいとたのですがErlang いう言語りませんプログラミング分散えたプログラミングとい うのですがそもそも文法がまたく分からないのでスコだけを眺めてできるものではないなということから めてみましたまた分散味をていたので味がうまいたのもかけとな りました

Erlang
Erlang Ericsson Computer Science Laboratory 分散されたある程度リアルタイム無停 働するといシステムできるようにされたプログラミング言語ですもともとはエリクソン けで使われていましたが1998 年にプンソとしてされましたライセンスErlang Public License*5 Mozilla Public License ライセンスですプログラミング言語ということですが20 年を超えるされる機器分野でもがありえばエリクソン AXD301*6 どがあるそうです


プログラミング Erlang というんで2 動かしているですがその味を 徴をげます

分にはみがいものばかりですえはできないなんてないのいましたしくは

Erlang による
Erlang されているソフトウですこれらは deb になておりLenny にもまれてい ます

Erlang
年前からでは流行りらしいのでもちらほらています

的にしていくのはまだこれからみたいなじしますがあまり使われていないうちに遊んでおこうと ます

5.2 える

Debian でははまだないものの Erlang Erlang かれたソフトウがあります

$ apt-cache search erlang | wc -l
63

ちなみにとしてげた CouchDB YAWS deb になています

Erlang 使うために必要erlang-base ですではなく くのには emacs Erlang もあるのでそれもインストしておくといで

$ sudo apt-get install erlang-base erlang-mode

ところでerlang-base ではなくerlang インストすればerlang スパから分割 れている連パインストされるので便かもしれませんがこの存関めて連する 90 導入されますじて適宜選択してください

$ sudo apt-get install erlang

5.3 使てみる

Erlang 使うにはerl コマンドしますするとErlang shell(Eshell) 動します

$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [64-bit] [smp:2] [async-threads:0] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1>

“1>プロンプトですEshell 了するにはq(). するか

1> q().
ok
2> $

またはctrl+ c, a します

1>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
$

ではえれないという徴をみてみます

1> A=10.
10
2> A=20.
** exception error: no match of right hand side value 20

てのエラになてしまいましたErlang えはできない単一なのですもう えててみまし

1> A1=1.
1
2> A2=2.
2
3> A3=A1+A2.
3
4> A3=3.
3
5> A3=A1+2.
3
6> A3=A1+4.
** exception error: no match of right hand side value 5
7> A1=A2+A3.
** exception error: no match of right hand side value 5
8> A1=A3-A2.
1

1,2,3 のように未代してはできますが6,7 のようにされたしては なおすことができないことが分かりますしかし4,5,8 のように同じであればできるようにえます 4,5,8 しているわけではなくみのパタているの です

みののことを束縛いますが未束縛してはイコいますが みのしてはパタというです

までこんなプログラミング言語たことなかたのですがプログラミング言語ではなくであれ 同じようなができることが分かりますえばx + y = 6,x-y = 2 というえてみますこのではx, y x=4, y=2 にはなりません単一同じようなものとえればいのかもしれま せん

5.4 コンパイルしてみる

スコからコンパイルしてする方法についてしますプログラムする方法3 があり ます

としてはやはりHello World いてみますこれはなしのプログラムですありとなしで プログラムいがてきますhello.erl というイル名でプログラムして さい

-module(hello).
-export([start/0]).

start() ->
    io:format("Hello world on Erlang~n").

Erlang プログラムモジ単位としどのモジ属する造になています するにはまずモジコンパイルしなければなりませんコンパイルしたモジ張子 beam*9 とい 名前イル生成されますコンパイルにはつのやりがあります

5.4.1 Eshell からコンパイルする方法

ほどの hello.erl Eshell からコンパイルするにはです

1> c(hello).
{ok,hello}
2> he
heart    hello
2> hello:start().
Hello world on Erlang
ok
3>

c(hello). コンパイルいますc() module(hello) およびプログラムフイルhello.erl するこ とにしてくださいコンパイルするとhello.beam イル生成されますこれは Erlang VM けのバイナリコ です

$ ls -lrt hello.*
-rwx------ 1 user user   90 2009-05-14 01:35 hello.erl
-rw------- 1 user user  552 2009-05-14 01:35 hello.beam
$ file hello.beam
hello.beam: Erlang BEAM file
5.4.2 からコンパイルする

からコンパイルするerlc コマンド使います

$ erlc hello.erl
$ ls -lrt hello.*
-rwx------ 1 user user   90 2009-05-14 01:35 hello.erl
-rw------- 1 user user  708 2009-05-14 01:53 hello.beam

からてみます

$ erl -noshell -s hello start -s init stop
Hello world on Erlang

無事できましたなお味があります

5.4.3 escript する

Erlang では escript というみもありこれを使うとプログラムコンパイルせずにスクリプトとして直接でき ます

hello:start escript としてするにはのようにイルえますイル名はhello.esc としまし たがコンパイルするときと任意張子ありません

#!/usr/bin/env escript

main(_) ->
    io:format("Hello world on Erlang~n").

これををつけてしてみます

$ chmod 700 hello.esc
$ ./hello.esc
Hello world on Erlang
5.4.4 ありのコンパイルする

なしでしたがするプログラムはどうやせばいのでしうか ありのプログラムしてみます

ボナするいてみましたまずEshell です

-module(fib).
-export([fib/1]).

fib(0) -> 1;
fib(1) -> 1;
fib(N) ->
    fib(N-2) + fib(N-1).

するとこんな

1> c(fib)
1> .
{ok,fib}
2> fib:fib(10).
89
3> fib:fib(20).
10946
4> fib:fib(30).
1346269

からするえる必要があります

-module(fib1).
-export([main/1]).

main([A]) ->
    I = list_to_integer(atom_to_list(A)),
    F = fib(I),
    io:format("fibonacci ~w = ~w~n", [I, F]),
    init:stop().

fib(0) -> 1;
fib(1) -> 1;
fib(N) ->
    fib(N-2) + fib(N-1).

これをコンパイルしてみます

$ erlc fib1.erl
$ erl -noshell -s fib1 main 10 -s init stop
fibonacci 10 = 89
$ erl -noshell -s fib1 main 20 -s init stop
fibonacci 20 = 10946
$ erl -noshell -s fib1 main 30 -s init stop
fibonacci 30 = 1346269

5.5 deb にしてみる

のとおりErlang beam イルからするかescript する必要がありますErlang ランタイ ムシステム動ロ利用しています現在ドパスEshell から code:get_path() 認することがで きます

1> code:get_path().
[".","/usr/lib/erlang/lib/kernel-2.12.5/ebin",
 "/usr/lib/erlang/lib/stdlib-1.15.5/ebin",
 "/usr/lib/erlang/lib/xmerl-1.1.10/ebin",
 "/usr/lib/erlang/lib/webtool-0.8.3.2/ebin",
 "/usr/lib/erlang/lib/typer-0.1.5/ebin",
 "/usr/lib/erlang/lib/tv-2.1.4.2/ebin",
 "/usr/lib/erlang/lib/tools-2.6.2/ebin",
 "/usr/lib/erlang/lib/toolbar-1.3.0.1/ebin",
 "/usr/lib/erlang/lib/test_server-3.2.4/ebin",
 "/usr/lib/erlang/lib/syntax_tools-1.5.6/ebin",
 "/usr/lib/erlang/lib/ssl-3.10/ebin",
 "/usr/lib/erlang/lib/ssh-1.0.2/ebin",
 "/usr/lib/erlang/lib/snmp-4.12/ebin",
 "/usr/lib/erlang/lib/sasl-2.1.5.4/ebin",
 "/usr/lib/erlang/lib/runtime_tools-1.7.3/ebin",
 "/usr/lib/erlang/lib/public_key-0.1/ebin",
 "/usr/lib/erlang/lib/pman-2.6/ebin",
 "/usr/lib/erlang/lib/percept-0.7.3/ebin",
 "/usr/lib/erlang/lib/parsetools-1.4.5/ebin",
 "/usr/lib/erlang/lib/otp_mibs-1.0.4.1/ebin",
 "/usr/lib/erlang/lib/os_mon-2.1.8/ebin",
 "/usr/lib/erlang/lib/orber-3.6.10/ebin",
 "/usr/lib/erlang/lib/odbc-2.10.3/ebin",
 "/usr/lib/erlang/lib/observer-0.9.7.4/ebin",
 "/usr/lib/erlang/lib/mnesia-4.4.7/ebin",
 "/usr/lib/erlang/lib/megaco-3.9.1.1/ebin",
 "/usr/lib/erlang/lib/inviso-0.6/ebin",
 [...]|...]

頭に“.” ているためカレントデレクトリにあるbeam イル動的にされるため できたわけですドパス/usr/lib/erlang/lib していますこれはErlang デフルトライブラリデレクト code:lib_dir() 認できます

1> code:lib_dir().
"/usr/lib/erlang/lib"

ほどした hello モジもこのライブラリデレクトリしますしかしここにすると動的に ドパスるわけではないので必要んとする必要があります

さてhello-erlang-1.0 というレクトリhello モジてこのレクトリします

$ mkdir hello-erlang-1.0
$ mv hello.erl hello.esc

Makefile します

.SUFFIXES: .erl .beam .yrl

.erl.beam:
erlc -W $<

BINDIR?=/usr/lib/erlang/lib/hello-1.0/ebin

ERL = erl -boot start_clean

# compile erlang module list
MODS = hello

all: compile
${ERL} -noshell -s hello start -s init stop

compile: ${MODS:%=%.beam}

install:
install -d ${DESTDIR}${BINDIR}
install -m 644 hello.beam ${DESTDIR}${BINDIR}
install -m 755 hello.esc  ${DESTDIR}$/usr/bin/

clean:
rm -rf *.beam erl_crash.dump

dh_make しますCDBS にしてみます

$ dh_make -c gpl -b --createorig
Maintainer name : Kouhei Maeda
Email-Address   : mkouhei@palmtb.net
Date            : Fri, 15 May 2009 00:36:24 +0900
Package Name    : hello-erlang
Version         : 1.0
License         : gpl3
Using dpatch    : no
Using quilt     : no
Type of Package : cdbs
Hit <enter> to confirm:
Skipping creating ../hello-erlang_1.0.orig.tar.gz because it already exists
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the hello-erlang Makefiles install into $DESTDIR and not in / .

debian レクトリ以下しますまずサンプルフイルします

$ cd debian
$ rm *.ex *.EX

changelog します

$ dch
hello-erlang (1.0-1) unstable; urgency=low

  * Initial releas

 -- Kouhei Maeda <mkouhei@palmtb.net>  Thu, 14 May 2009 22:56:51 +0900

control しますerlang-base 必要なのでします

Source: hello-erlang
Section: game
Priority: extra
Maintainer: Kouhei Maeda <mkouhei@palmtb.net>
Build-Depends: cdbs, debhelper (>= 7), erlang-dev
Standards-Version: 3.8.1
Homepage: http://www.palmtb.net/

Package: hello-erlang
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, ${erlang-base:Depends}
Description: Hello World for Erlang.
 Hello World Erlang version.

copyright します

This package was debianized by:

    Kouhei Maeda <mkouhei@palmtb.net> on Thu, 14 May 2009 22:54:34 +0900

Upstream Author(s):

    Kouhei Maeda <mkouhei@palmtb.net>

Copyright:

    <Copyright (C) 2009 Kouhei Maeda>

License:
(以下)

rules しますdh_make 生成されたinclude 文しかないので他をします DEB_FIXPERMS_EXCLUDE hello.beam しておかないとインスト与されてしまいます *11beam イルErlang VM むだけですので必要ありません

#!/usr/bin/make -f

DEB_MAKE_CHECK_TARGET :=
DEB_FIXPERMS_EXCLUDE := hello.beam

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/makefile.mk

binary-arch binary-indep: build

DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(DEB_DESTDIR)$(cdbs_curpkg)
# Add here any variable or target overrides you need.

たらdebuild します

$ debuild -us -uc
\end{commadline}

pbuilder します
\begin{commandline}
$ sudo pbuilder create --distribution sid
$ sudo pbuilder build hello-erlang_1.0-1.dsc

なければ最後インストアンインストできるか認しておきます

$ sudo dpkg -i hello-erlang_1.0-1_amd64.deb
未選択 hello-erlang  選択しています
(タベんでいます ...  現在 193995  イルレクトリインストされています)
(hello-erlang_1.0-1_amd64.deb  から) hello-erlang  展開しています...
hello-erlang (1.0-1)  しています ...

$ dpkg -L hello-erlang
/.
/usr
/usr/bin
/usr/bin/hello.esc
/usr/share
/usr/share/doc
/usr/share/doc/hello-erlang
/usr/share/doc/hello-erlang/changelog.Debian.gz
/usr/share/doc/hello-erlang/README.Debian
/usr/share/doc/hello-erlang/copyright
/usr/sbin
/usr/lib
/usr/lib/erlang
/usr/lib/erlang/lib
/usr/lib/erlang/lib/hello-1.0
/usr/lib/erlang/lib/hello-1.0/ebin
/usr/lib/erlang/lib/hello-1.0/ebin/hello.beam
$ hello.esc
Hello world on Erlang
$ erl -noshell -pa /usr/lib/erlang/lib/hello-1.0/ebin -s hello start -s init stop
Hello world on Erlang
$ sudo apt-get remove --purge hello-erlang
ジリストんでいます... 
存 関 ツ リ し て い ま す
ています... 
以 下 動 で イ ン ス ト されましたがもう必要とされていません :
(snip)
これらをするには ’apt-get autoremove’  利用してください
以 下 さ れ ま す :
  hello-erlang*
プグレ: 0  インスト: 0  : 1  : 17 
こ の 作 後  73.7kB  スクされます
続 行 し ま す か  [Y/n]?
(タベんでいます ...  現在 194002  イルレクトリインストされています)
hello-erlang  しています ...

5.6 まとめ

Erlang しだけ眺めてみましたまだまだ分からないことが多いのでさらにしていきますまた最後 したについてはErlang ドパス動的にされないのでにす にされた便使えるではありませんされた OCaml では dh-ocaml というがありますがErlang にはありませんでしたErlang 必要 するdh-erlang のようながあるとDebian でも Erlang はさらに便になるなといま した

5.7

52 エリア Debian 2009 5
____________________________________________________________________________________________