tentang coding erlang

Open in app
Wicaksono Trihatmaja
11 Followers
·
About
Follow
Open in app
Responses (1)

To respond to this story,
get the free Medium app.
Open in app
Toha Lukman Hakim
Toha Lukman Hakim
about 2 years ago

present. sampun njih mas.

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}
                           ]}
                    ]}
           ]
}.
Deps merupakan dependency project kita. Disini kita menggunakan cowboy sebagai web server.
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.
Relx merupakan informasi yang dibutuhkan oleh rebar3 dalam melakukan kompilasi seperti nama output file nya, versi kompilasinya, dll
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.
Erlang-Central
Rebar3
Cowboy Github
5

1



Tutorial
Erlang
Bahasa Indonesia
More from Wicaksono Trihatmaja
Follow
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
20



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
14

1


Aug 22, 2017
Go dalam container
Kemarin ini nyobain bikin project go kecil-kecilan, intinya sih nyobain bikin koneksi ke mysql dan melakukan crud lah. Code nya saya ambil dari sini karena males bikin code sendiri.. wkwkwk.. (yes, i’m from wekaweka land)
kira-kira begini code main.go-nya
/*
taken from here with minor edit
*/
package main

    import (
        _ "github.com/go-sql-driver/mysql"
        "database/sql"
        "fmt"
    )

    func main() {
        db, err := sql.Open("mysql", "root:hai@/test?charset=utf8")
        checkErr(err)

        // insert
        stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
        checkErr(err)

        res, err := stmt.Exec("astaxie", "telo", "2012-12-09")
        checkErr(err)

        id, err := res.LastInsertId()
        checkErr(err)

        fmt.Println(id)
        // update
        stmt, err = db.Prepare("update userinfo set username=? where uid=?")
        checkErr(err)

        res, err = stmt.Exec("astaxieupdate", id)
        checkErr(err)

        affect, err := res.RowsAffected()
        checkErr(err)

        fmt.Println(affect)

        // query
        rows, err := db.Query("SELECT * FROM userinfo")
        checkErr(err)

        for rows.Next() {
            var uid int
            var username string
            var department string
            var created string
            err = rows.Scan(&uid, &username, &department, &created)
            checkErr(err)
            fmt.Println(uid)
            fmt.Println(username)
            fmt.Println(department)
            fmt.Println(created)
        }

        // delete
        stmt, err = db.Prepare("delete from userinfo where uid=?")
        checkErr(err)

        res, err = stmt.Exec(id)
        checkErr(err)

        affect, err = res.RowsAffected()
        checkErr(err)

        fmt.Println(affect)

        db.Close()

    }

    func checkErr(err error) {
        if err != …
Read more · 3 min read
1



About
Help
Legal
Get the Medium app
A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store

Komentar

Postingan populer dari blog ini

Tips dan trik terbaik untuk game Rise Of Kingdoms

lirik lagu hadapi berdua tiara andini

v1rst