Tutorial Erlang untuk Pemula

 




Tutorial Erlang untuk Pemula

Wicaksono Trihatmaja

Wicaksono Trihatmaja

Oct 2, 2018·5 min read

Untuk sementara saya skip dulu tentang analisis daya pada AC karena agak rumit menganalisisnya. Parameter yang harus saya ambil terlalu banyak. Hehehe. Oleh karena itu, daripada medium ini sepi tanpa ada artikel baru (bikin laba-laba bersarang), maka saya coba isi dengan pengenalan erlang untuk pemula.

Tulisan ini tidak ditujukan untuk mengenalkan detail tentang sejarah erlang, bagaimana variable dalam erlang, apa itu fungsional programming, atau hal-hal yang bersifat teoritis lainnya. Tetapi tulisan ini lebih ke arah praktikal gimana caranya install erlang, apa itu rebar3, dan kita langsung akan mencoba membuat aplikasi web REST dengan erlang.

Sebelum kita beranjak lebih jauh, tutorial ini seluruhnya menggunakan OS Linux Ubuntu yah. Maklum gratisan, Hehe. Dan kita belum akan membuat aplikasi yang mendukung clustering. Serta yang paling penting, JANGAN ASAL COPY PASTE khususnya text dengan background abu-abu. Baca dulu. :)

Instalasi Erlang

Installasi erlang bisa macam-macam, paling gampang kira-kira seperti ini

$ sudo apt-get install erlang

Masalahnya adalah jika menggunakan cara installasi seperti itu maka versi erlang yang diinstall adalah versi 18. Sedangkan sekarang sudah versi 21.1 (saat tulisan ini ditulis).

Cara lainnya adalah dengan menggunakan kerl. Kerl adalah script yang dapat membuat hidup kita lebih indah dalam urusan build dan install erlang.

Download script-nya terlebih dahulu

$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl

Kemudian beri permission untuk execute

$ chmod a+x kerl

Kerl ini memiliki beberapa fungsi, kita tidak akan go through satu-satu fungsinya, yang kita perlukan sekarang adalah fungsi build erlang nya. Pertama kita cek versi erlang yang tersedia menggunakan fungsi berikut

$ kerl list releases
...
21.0
21.1
Run '/usr/local/bin/kerl update releases' to update this list from erlang.org

Kemudian pilih salah satu versi dan build dengan perintah

$ kerl build <versi_erlang> <nama_build>
---
$ kerl build 21.1 mybuild-21.1
Verifying archive checksum...
Checksum verified (sxxxxxxxxxxxxxxx)
Extracting source code
Building Erlang/OTP 21.1 (21.1), please wait...
Erlang/OTP 21.1 (21.1) has been successfully built

Proses ini memakan waktu agak lama. Jadi harap bersabar.. Ini ujian.. #lho??!

Setelah selesai proses build, kita bisa lihat hasil build nya

$ kerl list builds
21.1,mybuild-21.1

Kemudian kita install hasil build nya di folder seperti ini misalnya

$ mkdir ~/erlang-21.1
$ kerl install <hasil_build> <folder_tujuan>
---
$ kerl install mybuild-21.1 ~/erlang-21.1
Installing Erlang/OTP 21.1 (21.1) in /home/trihatmaja/erlang-21.1...
You can activate this installation running the following command:
. /home/trihatmaja/erlang-21.1/activate
Later on, you can leave the installation typing:
kerl_deactivate

Lakukan aktivasi sesuai dengan perintah yang ada

. /home/trihatmaja/erlang-21.1/activate

Done! Yuk di test

$ erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 10.1

Rebar3

rebar3 merupakan tools untuk membuat project erlang jadi lebih mudah untuk dimanage. Semacam build tools dan package management untuk erlang. Ini sangat membantu juga saat kita memulai sebuah project, membuat skeleton project, melakukan compilation dan build project, membuat package release ke production, download erlang package, dll.

$ curl -O https://s3.amazonaws.com/rebar3/rebar3
$ chmod +x rebar3

Kemudian bisa masukkan file executeable itu ke dalam salah satu folder yang sudah terdaftar dalam env $PATH.

Installasi rebar3 done!

Aplikasi Web REST

Setelah erlang environment dan rebar3 sudah diinstall, maka kita siap untuk membuat aplikasi pertama kita. Yey!!

Bikin skeleton projectnya menggunakan rebar3

$ rebar3 new app myapp

Maka nanti akan terdapat beberapa file di dalam folder myapp.

Buka file rebar.config . Kemudian edit di bagian ini atau tambahkan jika belum ada

{deps, [cowboy]}.{plugins, [rebar3_hex]}.{relx, [{release, {myapp, "0.0.1"},[myapp]},
{dev_mode, true},
{include_ert, false},
{extended_start_script, true}]
}.
{profiles, [
{prod, [
{relx, [
{dev_mode, false},
{include_ert, true}
]}
]}
]
}.
  1. Deps merupakan dependency project kita. Disini kita menggunakan cowboy sebagai web server.
  2. Plugins merupakan plugin yang digunakan oleh rebar3. Saat ini kita menggunakan plugin rebar3_hex. Dimana hex ini adalah tempat banyak sekali library erlang yang bisa kita gunakan.
  3. Relx merupakan informasi yang dibutuhkan oleh rebar3 dalam melakukan kompilasi seperti nama output file nya, versi kompilasinya, dll
  4. Profiles merupakan informasi yang dibutuhkan oleh rebar3 untuk release ke production.

Untuk lebih detail tentang file rebar.config bisa di lihat di website resminya ini.

Next kita masuk ke folder src dan edit file myapp.app.src tambahkan cowboy di bagian applications dibawah stdlib

...
{applications,
[kernel,
stdlib,
cowboy
]},
...

Edit konfigurasi selesai!.. Fiuh.

Lanjut.. kita membuat register route nya menggunakan cowboy . Edit file myapp_app.erl

%% from cowboy example
%%%---------------------------------------------------------------
%% @doc myapp public API
%% @end
%%%---------------------------------------------------------------
-module(myapp_app).-behaviour(application).%% Application callbacks
-export([start/2, stop/1]).
%%================================================================
%% API
%%================================================================
start(_StartType, _StartArgs) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/", toppage_h, []}
]}
]),
{ok, _} = cowboy:start_clear(http, [{port, 8080}], #{
env => #{dispatch => Dispatch}
}),
myapp_sup:start_link().
%%--------------------------------------------------------------------
stop(_State) ->
ok.
%%================================================================
%% Internal functions
%%================================================================

Kemudian kita buat satu file lagi dengan nama toppage_h.erl dimana file ini merupakan handler dari route /

%% from cowboy example-module(toppage_h).-export([init/2]).
-export([content_types_provided/2]).
-export([hello_to_html/2]).
-export([hello_to_json/2]).
-export([hello_to_text/2]).
init(Req, Opts) ->
{cowboy_rest, Req, Opts}.
content_types_provided(Req, State) ->
{[
{<<"text/html">>, hello_to_html},
{<<"application/json">>, hello_to_json},
{<<"text/plain">>, hello_to_text}
], Req, State}.
hello_to_html(Req, State) ->
Body = <<"<html>
<head>
<meta charset=\"utf-8\">
<title>REST Hello World!</title>
</head>
<body>
<p>REST Hello World as HTML!</p>
</body>
</html>">>,
{Body, Req, State}.
hello_to_json(Req, State) ->
Body = <<"{\"rest\": \"Hello World!\"}">>,
{Body, Req, State}.
hello_to_text(Req, State) ->
{<<"REST Hello World as text!">>, Req, State}.

Inti dari coding di atas adalah jika header request-nya mengandung text/html atau application/json atau text/plain maka akan direspon sesuai fungsinya masing-masing.

Setelah semua sudah siap, maka kita lakukan kompilasi dengan bantuan rebar3

$ rebar3 compile

kemudian kita buat release-nya

$ rebar3 release

dan bisa kita jalankan aplikasi dengan cara

_build/default/rel/myapp/bin/myapp console

Test dengan menggunakan browser di alamat http://localhost:8080 atau menggunakan curl atau menggunakan nghttp

$ curl -i http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date:
content-length: 136
content-type: text/html
vary: Accept

<html>
<head>
<meta charset="utf-8">
<title>REST Hello World!</title>
</head>
<body>
<p>REST Hello World as HTML!</p>
</body>
</html>

Test menggunakan JSON

$ curl -i -H "Accept: application/json" http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date: Fri, 28 Sep 2012 04:16:46 GMT
content-length: 24
content-type: application/json
vary: Accept

{"rest": "Hello World!"}

Test menggunakan plain text

$ curl -i -H "Accept: text/plain" http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date: Fri, 28 Sep 2012 04:18:35 GMT
content-length: 25
content-type: text/plain
vary: Accept

REST Hello World as text!

Done!

Jika kita mau membuat release ke production

$ rebar3 as prod tar
===> tarball .... successfully created!

Maka nanti di folder _build akan ada folder prod/rel/myapp/ didalamnya ada file dengan format tar yang bisa di copy ke production dan jalankan seperti ini

$ tar -xzvf myapp-0.0.1.tar.gz
$ ./bin/myapp-0.0.1 console

Kesimpulan

Banyak yang saya ringkas dalam artikel kali ini karena ingin membantu teman-teman agar tidak bingung serta lebih mudah dalam memulai belajar erlang sehingga semangat teman-teman untuk belajar makin membara. Hehe. Untuk detail artikel bisa baca-baca di link bagian referensi yang saya sertakan.

Referensi

WRITTEN BY

Wicaksono Trihatmaja

1

1

More from Wicaksono Trihatmaja

Dec 11, 2017

Kulkas Panasonic NR-B348F ST

Setelah 2 hari melakukan monitoring energi pada sebuah kulkas merk Panasonic dengan No. Model NR-B348F ST saya melihat ada beberapa hal yang menarik. Mungkin karena kulkas itu merupakan barang yang saya sendiri tau fungsinya seperti apa, jadi buku pentunjuk manual-nya tidak saya baca atau mungkin memang karena dari pabrikannya tidak memberikan informasi yang jelas terhadap fitur-fitur yang ada didalamnya sehingga saya juga tidak tahu.

Kulkas model ini mungkin sama dengan kulkas merk Sanken Model SK-350. Secara bentuk, warna, fitur, teknologi , bentuk tray, kapasitas, dsb. Perbedaannya hanya pada penamaan fitur, dan motif tray di dalam kulkas tersebut selebihnya sama. Menarik yah, kenapa kulkas Panasonic bisa sama dengan Sanken? …

Read more · 4 min read


Dec 7, 2017

Work from Home and How Much the Electricity Cost

Artikel ini sudah diupdate di artikel WFH dan konsumsi listriknya.

Jadi cerita nya, saya kemarin kerja dari rumah karena upgrade prometheus dari v1.7.1 ke v2.0.0 memakan waktu yang lebih lama dari ekspektasi. Eksekusi jam 6 pagi, baru up jam 12 siang. Dan selama itu metrics nya tidak terbaca dan semua orang buta perimeter terhadap apa yang terjadi dengan microservice mereka. Yang menyebabkan lama adalah indexing yang dilakukan prometheus v1.8.2 sebagai provider data metrics lama (metrics selama 1 minggu), yang akan dibaca oleh prometheus v2.0.0.

Anyway, saya ga akan bicarakan masalah migrasi prometheus, tetapi disini saya ngomongin tentang biaya listrik yang dikonsumsi saat saya bekerja di rumah. …

Read more · 3 min read

Untuk sementara saya skip dulu tentang analisis daya pada AC karena agak rumit menganalisisnya. Parameter yang harus saya ambil terlalu banyak. Hehehe. Oleh karena itu, daripada medium ini sepi tanpa ada artikel baru (bikin laba-laba bersarang), maka saya coba isi dengan pengenalan erlang untuk pemula.

Tulisan ini tidak ditujukan untuk mengenalkan detail tentang sejarah erlang, bagaimana variable dalam erlang, apa itu fungsional programming, atau hal-hal yang bersifat teoritis lainnya. Tetapi tulisan ini lebih ke arah praktikal gimana caranya install erlang, apa itu rebar3, dan kita langsung akan mencoba membuat aplikasi web REST dengan erlang.

Sebelum kita beranjak lebih jauh, tutorial ini seluruhnya menggunakan OS Linux Ubuntu yah. Maklum gratisan, Hehe. Dan kita belum akan membuat aplikasi yang mendukung clustering. Serta yang paling penting, JANGAN ASAL COPY PASTE khususnya text dengan background abu-abu. Baca dulu. :)

Instalasi Erlang

Installasi erlang bisa macam-macam, paling gampang kira-kira seperti ini

$ sudo apt-get install erlang

Masalahnya adalah jika menggunakan cara installasi seperti itu maka versi erlang yang diinstall adalah versi 18. Sedangkan sekarang sudah versi 21.1 (saat tulisan ini ditulis).

Cara lainnya adalah dengan menggunakan kerlKerl adalah script yang dapat membuat hidup kita lebih indah dalam urusan build dan install erlang.

Download script-nya terlebih dahulu

$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl

Kemudian beri permission untuk execute

$ chmod a+x kerl

Kerl ini memiliki beberapa fungsi, kita tidak akan go through satu-satu fungsinya, yang kita perlukan sekarang adalah fungsi build erlang nya. Pertama kita cek versi erlang yang tersedia menggunakan fungsi berikut

$ kerl list releases
...
21.0
21.1
Run '/usr/local/bin/kerl update releases' to update this list from erlang.org

Kemudian pilih salah satu versi dan build dengan perintah

$ kerl build <versi_erlang> <nama_build>
---
$ kerl build 21.1 mybuild-21.1
Verifying archive checksum...
Checksum verified (sxxxxxxxxxxxxxxx)
Extracting source code
Building Erlang/OTP 21.1 (21.1), please wait...
Erlang/OTP 21.1 (21.1) has been successfully built

Proses ini memakan waktu agak lama. Jadi harap bersabar.. Ini ujian.. #lho??!

Setelah selesai proses build, kita bisa lihat hasil build nya

$ kerl list builds
21.1,mybuild-21.1

Kemudian kita install hasil build nya di folder seperti ini misalnya

$ mkdir ~/erlang-21.1
$ kerl install <hasil_build> <folder_tujuan>
---
$ kerl install mybuild-21.1 ~/erlang-21.1
Installing Erlang/OTP 21.1 (21.1) in /home/trihatmaja/erlang-21.1...
You can activate this installation running the following command:
. /home/trihatmaja/erlang-21.1/activate
Later on, you can leave the installation typing:
kerl_deactivate

Lakukan aktivasi sesuai dengan perintah yang ada

. /home/trihatmaja/erlang-21.1/activate

Done! Yuk di test

$ erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 10.1

Rebar3

rebar3 merupakan tools untuk membuat project erlang jadi lebih mudah untuk dimanage. Semacam build tools dan package management untuk erlang. Ini sangat membantu juga saat kita memulai sebuah project, membuat skeleton project, melakukan compilation dan build project, membuat package release ke productiondownload erlang package, dll.

$ curl -O https://s3.amazonaws.com/rebar3/rebar3
$ chmod +x rebar3

Kemudian bisa masukkan file executeable itu ke dalam salah satu folder yang sudah terdaftar dalam env $PATH.

Installasi rebar3 done!

Aplikasi Web REST

Setelah erlang environment dan rebar3 sudah diinstall, maka kita siap untuk membuat aplikasi pertama kita. Yey!!

Bikin skeleton projectnya menggunakan rebar3

$ rebar3 new app myapp

Maka nanti akan terdapat beberapa file di dalam folder myapp.

Buka file rebar.config . Kemudian edit di bagian ini atau tambahkan jika belum ada

{deps, [cowboy]}.{plugins, [rebar3_hex]}.{relx, [{release, {myapp, "0.0.1"},[myapp]},
{dev_mode, true},
{include_ert, false},
{extended_start_script, true}]
}.
{profiles, [
{prod, [
{relx, [
{dev_mode, false},
{include_ert, true}
]}
]}
]
}.
  1. Deps merupakan dependency project kita. Disini kita menggunakan cowboy sebagai web server.
  2. Plugins merupakan plugin yang digunakan oleh rebar3. Saat ini kita menggunakan plugin rebar3_hex. Dimana hex ini adalah tempat banyak sekali library erlang yang bisa kita gunakan.
  3. Relx merupakan informasi yang dibutuhkan oleh rebar3 dalam melakukan kompilasi seperti nama output file nya, versi kompilasinya, dll
  4. Profiles merupakan informasi yang dibutuhkan oleh rebar3 untuk release ke production.

Untuk lebih detail tentang file rebar.config bisa di lihat di website resminya ini.

Next kita masuk ke folder src dan edit file myapp.app.src tambahkan cowboy di bagian applications dibawah stdlib

...
{applications,
[kernel,
stdlib,
cowboy
]},
...

Edit konfigurasi selesai!.. Fiuh.

Lanjut.. kita membuat register route nya menggunakan cowboy . Edit file myapp_app.erl

%% from cowboy example
%%%---------------------------------------------------------------
%% @doc myapp public API
%% @end
%%%---------------------------------------------------------------
-module(myapp_app).-behaviour(application).%% Application callbacks
-export([start/2, stop/1]).
%%================================================================
%% API
%%================================================================
start(_StartType, _StartArgs) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/", toppage_h, []}
]}
]),
{ok, _} = cowboy:start_clear(http, [{port, 8080}], #{
env => #{dispatch => Dispatch}
}),
myapp_sup:start_link().
%%--------------------------------------------------------------------
stop(_State) ->
ok.
%%================================================================
%% Internal functions
%%================================================================

Kemudian kita buat satu file lagi dengan nama toppage_h.erl dimana file ini merupakan handler dari route /

%% from cowboy example-module(toppage_h).-export([init/2]).
-export([content_types_provided/2]).
-export([hello_to_html/2]).
-export([hello_to_json/2]).
-export([hello_to_text/2]).
init(Req, Opts) ->
{cowboy_rest, Req, Opts}.
content_types_provided(Req, State) ->
{[
{<<"text/html">>, hello_to_html},
{<<"application/json">>, hello_to_json},
{<<"text/plain">>, hello_to_text}
], Req, State}.
hello_to_html(Req, State) ->
Body = <<"<html>
<head>
<meta charset=\"utf-8\">
<title>REST Hello World!</title>
</head>
<body>
<p>REST Hello World as HTML!</p>
</body>
</html>">>,
{Body, Req, State}.
hello_to_json(Req, State) ->
Body = <<"{\"rest\": \"Hello World!\"}">>,
{Body, Req, State}.
hello_to_text(Req, State) ->
{<<"REST Hello World as text!">>, Req, State}.

Inti dari coding di atas adalah jika header request-nya mengandung text/html atau application/json atau text/plain maka akan direspon sesuai fungsinya masing-masing.

Setelah semua sudah siap, maka kita lakukan kompilasi dengan bantuan rebar3

$ rebar3 compile

kemudian kita buat release-nya

$ rebar3 release

dan bisa kita jalankan aplikasi dengan cara

_build/default/rel/myapp/bin/myapp console

Test dengan menggunakan browser di alamat http://localhost:8080 atau menggunakan curl atau menggunakan nghttp

$ curl -i http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date:
content-length: 136
content-type: text/html
vary: Accept

<html>
<head>
<meta charset="utf-8">
<title>REST Hello World!</title>
</head>
<body>
<p>REST Hello World as HTML!</p>
</body>
</html>

Test menggunakan JSON

$ curl -i -H "Accept: application/json" http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date: Fri, 28 Sep 2012 04:16:46 GMT
content-length: 24
content-type: application/json
vary: Accept

{"rest": "Hello World!"}

Test menggunakan plain text

$ curl -i -H "Accept: text/plain" http://localhost:8080
HTTP/1.1 200 OK
connection: keep-alive
server: Cowboy
date: Fri, 28 Sep 2012 04:18:35 GMT
content-length: 25
content-type: text/plain
vary: Accept

REST Hello World as text!

Done!

Jika kita mau membuat release ke production

$ rebar3 as prod tar
===> tarball .... successfully created!

Maka nanti di folder _build akan ada folder prod/rel/myapp/ didalamnya ada file dengan format tar yang bisa di copy ke production dan jalankan seperti ini

$ tar -xzvf myapp-0.0.1.tar.gz
$ ./bin/myapp-0.0.1 console

Kesimpulan

Banyak yang saya ringkas dalam artikel kali ini karena ingin membantu teman-teman agar tidak bingung serta lebih mudah dalam memulai belajar erlang sehingga semangat teman-teman untuk belajar makin membara. Hehe. Untuk detail artikel bisa baca-baca di link bagian referensi yang saya sertakan.

Referensi

Ini merupakan bacaan yang berhubungan dengan tulisan ini.

  1. Erlang-Central
  2. Rebar3
  3. Cowboy Github

WRITTEN BY

Setelah 2 hari melakukan monitoring energi pada sebuah kulkas merk Panasonic dengan No. Model NR-B348F ST saya melihat ada beberapa hal yang menarik. Mungkin karena kulkas itu merupakan barang yang saya sendiri tau fungsinya seperti apa, jadi buku pentunjuk manual-nya tidak saya baca atau mungkin memang karena dari pabrikannya tidak memberikan informasi yang jelas terhadap fitur-fitur yang ada didalamnya sehingga saya juga tidak tahu.

Kulkas model ini mungkin sama dengan kulkas merk Sanken Model SK-350. Secara bentuk, warna, fitur, teknologi , bentuk tray, kapasitas, dsb. Perbedaannya hanya pada penamaan fitur, dan motif tray di dalam kulkas tersebut selebihnya sama. Menarik yah, kenapa kulkas Panasonic bisa sama dengan Sanken? …


Artikel ini sudah diupdate di artikel WFH dan konsumsi listriknya.

Jadi cerita nya, saya kemarin kerja dari rumah karena upgrade prometheus dari v1.7.1 ke v2.0.0 memakan waktu yang lebih lama dari ekspektasi. Eksekusi jam 6 pagi, baru up jam 12 siang. Dan selama itu metrics nya tidak terbaca dan semua orang buta perimeter terhadap apa yang terjadi dengan microservice mereka. Yang menyebabkan lama adalah indexing yang dilakukan prometheus v1.8.2 sebagai provider data metrics lama (metrics selama 1 minggu), yang akan dibaca oleh prometheus v2.0.0.

Anyway, saya ga akan bicarakan masalah migrasi prometheus, tetapi disini saya ngomongin tentang biaya listrik yang dikonsumsi saat saya bekerja di rumah. …

Komentar

Postingan populer dari blog ini

Tips dan trik terbaik untuk game Rise Of Kingdoms

15 Aplikasi Foto Grid dan Foto Kolase Terbaik di Android

CARA MENAMPILKAN HELLO WORD DEV-C++