Apa Itu Socket ?

Socket adalah mekanisme komunikasi untuk pertukaran data antar aplikasi yang terdapat di dalam sebuah mesin maupun beda mesin dan pertukaran ini terjadi pada sebuah jaringan komputer.

Untuk membangun sebuah aplikasi yang berbasis socket, kita dapat menggunakan 2 jenis socket yang berbeda yaitu :

  • TCP Socket : menggunakan konsep connection oriented dan reliable data transfer sehingga aplikasi yang dibangun dengan TCP Socket tidak mempedulikan lama waktu sebuah pengiriman data akan tetapi sangat mementingkan ketepatan data. Konsep connection oriented adalah suatu proses pengiriman data disertai dengan tanggung jawab sehingga ketika data sampai pada tujuan akan ada pemberitahuan atau jika terjadi kesalahan pada saat pengiriman data maka data tersebut akan dikirim kembali ke tujuannya. Konsep reliable data transfer adalah sebuah proses pengiriman data dengan menggunakan nomor urut sehingga pada saat diterima, data akan tersusun berdasarkan nomor urut tersebut.

  • UDP Socket : menggunakan konsep connectionless oriented dan unreliable data transfer sehingga aplikasi yang dibangun dengan UDP Socket tidak mementingkan ketepatan data tetapi lebih mementingkan akan delay waktu pada saat proses pengiriman data. Konsep connectionless oriented adalah suatu proses pengiriman data tidak disertai dengan tanggung jawab sehingga jika terjadi kesalahan pada saat proses pengiriman maka data tersebut tidak akan dikirim ulang ke tujuan. Konsep unreliable data transfer adalah sebuah proses pengiriman data dalam bentuk datagram tanpa nomor urut.

Implementasi TCP Socket

Pada artikel ini, penulis akan melakukan implementasi TCP Socket dengan menggunakan bahasa pemrograman java. Silahkan buat sebuah file dengan nama ServerChat.java kemudian masukkan codingan seperti berikut.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;

/*
 * ServerChat.java
 * Copyright (C) 2016 Rizki Mufrizal <mufrizalrizki@gmail.com>
 *
 * Distributed under terms of the MIT license.
 */

 public class ServerChat {

    private static final int PORT = 9001;
    private static HashSet<String> names = new HashSet<>();
    private static HashSet<PrintWriter> printWriters = new HashSet<>();

    public static void main(String[] args) throws IOException {
        System.out.println("server jalan pada port : " + PORT);
        ServerSocket serverSocket = new ServerSocket(PORT);
        try {
            while (true) {
                new Handler(serverSocket.accept()).start();
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            serverSocket.close();
        }
    }

    private static class Handler extends Thread {

        private String name;
        private Socket socket;
        private BufferedReader bufferedReader;
        private PrintWriter printWriter;

        public Handler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                printWriter = new PrintWriter(socket.getOutputStream(), true);

                while (true) {
                    printWriter.println("submitname");
                    name = bufferedReader.readLine();

                    if (name == null) {
                        return;
                    }

                    synchronized (names) {
                    
                        if (!names.contains(name)) {
                            names.add(name);
                            break;
                        }
                    
                    }
                }

                printWriter.println("nameaccepted");
                printWriters.add(printWriter);

                while (true) {
                    String input = bufferedReader.readLine();
                    
                    if (input == null) {
                        return;
                    }
                    
                    printWriters.stream().forEach((pw) -> {
                        pw.println("message " + name + " : " + input);
                    });

                }

            } catch (IOException e) {
                System.out.println(e);
            } finally {

                if (name != null) {
                    names.remove(name);
                }
            
                if (printWriter != null) {
                    printWriters.remove(printWriter);
                }
            
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println(e);
                }
            }
        }
    }
}

Pada codingan diatas, kita membuat 2 class di dalam satu file, dimana class Handler kita lakukan inheritance terhadap class Thread. Fungsinya adalah kita akan membuka koneksi dan menunggu permintaan koneksi dari client. Pada saat client melakukan koneksi ke server maka client akan melakukan syncronize dengan server atau client akan melakukan request ke server, kemudian server akan melakukan sycronize terhadap seluruh client yang terhubung pada jaringan sehingga ketika ada suatu aksi maka server akan memberikan response kepada semua client meskipun client tersebut tidak memberikan request ke server. Pada codingan diatas, server akan berjalan pada port 9001 sehingga client harus bisa melakukan koneksi pada jaringan dan port yang sama dengan server.

Tahap selanjutnya, kita akan membuat sebuah client, silahkan buat sebuah file dengan nama ClientChat.java kemudian masukkan codingan berikut.

import java.awt.event.ActionEvent;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/*
 * ClientChat.java
 * Copyright (C) 2016 Rizki Mufrizal <mufrizalrizki@gmail.com>
 *
 * Distributed under terms of the MIT license.
 */

public class ClientChat {

    private BufferedReader bufferedReader;
    private PrintWriter printWriter;
    private JFrame jFrame = new JFrame("aplikasi chat");
    private JTextField jTextField = new JTextField(40);
    private JTextArea jTextArea = new JTextArea(8, 40);

    public ClientChat() {
        jTextField.setEditable(Boolean.FALSE);
        jTextArea.setEditable(Boolean.FALSE);
        jFrame.setSize(500, 500);
        jFrame.getContentPane().add(jTextField, "North");
        jFrame.getContentPane().add(new JScrollPane(jTextArea), "Center");
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        jFrame.setLocation((dimension.width / 2) - (jFrame.getSize().width / 2), (dimension.height / 2) - (jFrame.getSize().height / 2));

        jTextField.addActionListener((ActionEvent e) -> {
            printWriter.println(jTextField.getText());
            jTextField.setText("");
        });
    }

    public String getServerAddress() {
        return JOptionPane.showInputDialog(
            jFrame,
            "masukan ip address",
            "selamat datang di aplikasi chat",
            JOptionPane.QUESTION_MESSAGE
        );
    }

    public String getName() {
        return JOptionPane.showInputDialog(
            jFrame,
            "Masukkan nama anda",
            "selamat datang di aplikasi chat",
            JOptionPane.QUESTION_MESSAGE
        );
    }

    private void run() throws IOException {
        String serverAddress = getServerAddress();
        Socket socket = new Socket(serverAddress, 9001);
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        printWriter = new PrintWriter(socket.getOutputStream(), true);

        while (true) {
            String line = bufferedReader.readLine();
            if (line.startsWith("submitname")) {
                printWriter.println(getName());
            } else if (line.startsWith("nameaccepted")) {
                jTextField.setEditable(Boolean.TRUE);
            } else if (line.startsWith("message")) {
                jTextArea.append(line.substring(8) + "\n");
            }
        }
    }

    public static void main(String[] args) throws IOException {
        ClientChat clientChat = new ClientChat();
        clientChat.jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        clientChat.jFrame.setVisible(Boolean.TRUE);
        clientChat.run();
    }

}

Pada codingan diatas, kita membuat sebuah aplikasi chat untuk bagian client, port telah kita tentukan sesuai dengan port server yaitu 9001, sedangkan IP akan didefinisikan sendiri oleh user yang akan melakukan inputan. Aplikasi ini digunakan untuk melakukan chat secara group, misalkan jika terdapat 2 user maka kita dapat melakukan chat secara serentak, ketika user 1 melakukan chat maka secara otomatis user 2 akan mendapatkan balasan chat dari user 1 begitu pula sebaliknya.

Uji Coba TCP Socket

Untuk melakukan uji coba TCP Socket, kita dapat menggunakan aplikasi wireshark. Untuk melakukan instalasi wireshark, silahkan tambahkan ppa berikut.

sudo add-apt-repository ppa:wireshark-dev/stable

Kemudian lakukan update

sudo apt-get update

lalu lakukan instalasi aplikasi dengan perintah

sudo apt-get install wireshark

Tahap selanjutnya, silahkan lakukan compile kedua source code yang telah buat tadi, jalankan dengan perintah berikut untuk melakukan compile kedua file ServerChat.java.

javac ServerChat.java

kemudian jalankan dengan perintah

java ServerChat

Untuk melakukan compile file ClientChat.java maka jalankan perintah berikut.

javac ClientChat.java

kemudian jalankan dengan perintah

java ClientChat

Jalankan ClientChat sebanyak 2x sehingga akan muncul 2 form, 2 form ini merupakan representasi dari 2 client sehingga silahkan masukkan IP anda dengan 127.0.0.1 kemudian masukkan nama yang berbeda pada setiap form, kemudian lakukan chat antar client. Berikut adalah output dari aplikasi client tersebut.

Screenshot from 2016-04-14 14:22:40.png

Langkah selanjutnya adalah kita akan melakukan test dengan menggunakan wireshark, silahkan buka wireshark anda, berikut adalah tampilan dasboard nya.

Screenshot from 2016-04-14 16:38:33.png

Pada bagian dasboard terdapat proses capture, silahkan anda pilih any. Setelah selesai maka akan muncul seperti berikut.

Screenshot from 2016-04-14 16:39:42.png

arti dari gambar tersebut adalah aplikasi wireshark dengan melakukan capture terhadap jaringan yang sedang berjalan. Kemudian jalankan kembali aplikasi chat yang telah kita buat, pada saat aplikasi chat bagian client dijalankan maka pada aplikasi wireshark akan muncul seperti berikut.

Screenshot from 2016-04-14 19:39:10.png

Kemudian lakukan chat antar 2 client maka anda juga akan melihat ada proses pertukaran paket pada protokol TCP. Berikut adalah output ketika penulis melakukan chat.

Screenshot from 2016-04-14 19:38:17.png

Implementasi UDP Socket

Setelah melakukan implementasi TCP Socket, tahap selanjutnya kita akan melakukan implementasi UDP Socket dengan bahasa pemrograman java :). Silahkan buat sebuah file dengan nama UDPServer.java lalu masukkan codingan seperti berikut.

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * UDPServer.java
 * Copyright (C) 2016 Rizki Mufrizal <mufrizalrizki@gmail.com>
 *
 * Distributed under terms of the MIT license.
 */

public class UDPServer {

    public static void main(String args[]) {
        DatagramSocket datagramSocket = null;

        try {
            datagramSocket = new DatagramSocket(8888);

            byte[] buffer = new byte[65536];
            DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);

            System.out.println("socket server jalan, menunggu data yang dikirim");

            while (true) {
                datagramSocket.receive(datagramPacket);
                byte[] data = datagramPacket.getData();
                String s = new String(data, 0, datagramPacket.getLength());

                System.out.println(datagramPacket.getAddress().getHostAddress() + " : " + datagramPacket.getPort() + " : " + s);

                s = "data yang terkirim : " + s;
                DatagramPacket packet = new DatagramPacket(s.getBytes(), s.getBytes().length, datagramPacket.getAddress(), datagramPacket.getPort());
                datagramSocket.send(packet);
            }

        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

Pada codingan diatas dapat dilihat bahwa server akan menunggu data yang dikirim dari client, data yang dikirim adalah packet dalam bentuk datagram sehingga packet tersebut tidak memiliki penomoran pada saat pengiriman berlangsung.

Untuk kebutuhan testing, kita juga akan membuat sebuah client udp, silahkan buat sebuah file dengan nama UDPClient.java kemudian masukkan codingan berikut.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDPClient.java
 * Copyright (C) 2016 Rizki Mufrizal <mufrizalrizki@gmail.com>
 *
 * Distributed under terms of the MIT license.
 */

public class UDPClient {

    public static void main(String args[]) {
        DatagramSocket datagramSocket = null;
        String s;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        try {
            datagramSocket = new DatagramSocket();
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");

            while (true) {
                System.out.print("Masukkan pesan anda : ");
                s = bufferedReader.readLine();
                byte[] b = s.getBytes();

                DatagramPacket datagramPacket = new DatagramPacket(b, b.length, inetAddress, 8888);
                datagramSocket.send(datagramPacket);

                byte[] buffer = new byte[65536];
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                datagramSocket.receive(packet);

                byte[] data = packet.getData();
                s = new String(data, 0, packet.getLength());

                System.out.println(packet.getAddress().getHostName() + " : " + packet.getPort() + " : " + s);
            }

        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

Codingan diatas berfungsi sebagai client, dimana pada saat client dijalankan, anda dapat mengirim pesan ke server lalu server akan mengembalikan pesan anda kembali. Jika terdapat banyak client, maka pesan tersebut tidak akan syncronize dengan client yang lain akan tetapi pesan tersebut hanya syncronize dengan server.

Uji Coba UDP Socket

Uji coba UDP dapat menggunakan nmap, wireshark dan juga aplikasi client yang telah kita buat tadi. Kita akan melakukan uji coba terlebih dahulu dengan menggunakan nmap. Silahkan lakukan instalasi nmap dengan perintah berikut.

sudo apt-get install nmap

Langkah selanjutnya silahkan lakukan compile file UDPServer.java lalu jalankan file tersebut. Kemudian kita akan mengecek terlebih dahulu status jaringan dengan perintah.

netstat -u -ap

Maka akan muncul output seperti berikut.

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 *:ipp                   *:*                                 -               
udp        0      0 *:mdns                  *:*                                 12151/          
udp        0      0 *:mdns                  *:*                                 -               
udp        0      0 *:51757                 *:*                                 -               
udp        0      0 localhost:52426         localhost:52426         ESTABLISHED -               
udp        0      0 *:52813                 *:*                                 -               
udp        0      0 10.42.0.1:domain        *:*                                 -               
udp        0      0 rizki-HP-431-Not:domain *:*                                 -               
udp        0      0 *:bootps                *:*                                 -               
udp        0      0 *:bootpc                *:*                                 -               
udp6       0      0 [::]:8888               [::]:*                              21206/java      
udp6       0      0 [::]:mdns               [::]:*                              -               
udp6       0      0 [::]:51861              [::]:*                              -               
udp6       0      0 [::]:4466               [::]:*                              - 

Bisa dilihat bahwa UDP Server telah berjalan sukses, bisa dilihat pada bagian PID/Program name terdapat kalimat java dan bertepatan dengan port 8888 yang telah kita konfigurasi pada codingan java. Langkah selanjutnya, untuk mengirim pesan ke server, silahkan jalankan perintah berikut.

ncat -vv localhost 8888 -u

Maksud dari perintah diatas adalah

  • -vv berfungsi untuk memberikan informasi secara detail
  • -u berfungsi untuk mendeklarasikan protokol UDP

Jika berhasil, maka akan muncul output seperti berikut.

Ncat: Version 6.40 ( http://nmap.org/ncat )
libnsock nsi_new2(): nsi_new (IOD #1)
libnsock nsock_connect_udp(): UDP connection requested to 127.0.0.1:8888 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [127.0.0.1:8888]
Ncat: Connected to 127.0.0.1:8888.
libnsock nsi_new2(): nsi_new (IOD #2)
libnsock nsock_read(): Read request from IOD #1 [127.0.0.1:8888] (timeout: -1ms) EID 18
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 26

Kemudian silahkan ketikan pesan yang anda inginkan, jika berhasil maka anda akan mendapatkan response dari server, berikut adalah output nya.

Ncat: Version 6.40 ( http://nmap.org/ncat )
libnsock nsi_new2(): nsi_new (IOD #1)
libnsock nsock_connect_udp(): UDP connection requested to 127.0.0.1:8888 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [127.0.0.1:8888]
Ncat: Connected to 127.0.0.1:8888.
libnsock nsi_new2(): nsi_new (IOD #2)
libnsock nsock_read(): Read request from IOD #1 [127.0.0.1:8888] (timeout: -1ms) EID 18
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 26
hello rizki mufrizal
libnsock nsock_trace_handler_callback(): Callback: READ SUCCESS for EID 26 [peer unspecified] (21 bytes): hello rizki mufrizal.
libnsock nsock_trace_handler_callback(): Callback: WRITE SUCCESS for EID 35 [127.0.0.1:8888]
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 42
libnsock nsock_trace_handler_callback(): Callback: READ SUCCESS for EID 18 [127.0.0.1:8888] (42 bytes): data yang terkirim : hello rizki mufrizal.
data yang terkirim : hello rizki mufrizal
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #1 [127.0.0.1:8888] EID 50

Jika kita cek pada bagian server, maka akan muncul output seperti berikut.

socket server jalan, menunggu data yang dikirim
127.0.0.1 : 34481 : hello rizki mufrizal

Tahap yang terakhir kita akan melakukan uji coba dengan menggunakan wireshark, silahkan matikan UDPServer, lalu jalankan kembali wireshark dan jalankan UDPServer. Setelah selesai, silahkan jalankan UDPClient kemudian silahkan kirimkan pesan. Berikut adalah output ketika terjadi pengiriman pesan dengan UDP Socket.

Screenshot from 2016-04-14 19:35:24.png

Sekian tutorial belajar socket programming dan Terima kasih :)

Artikel - artikel yang lalu, penulis membuat tulisan mengenai database PostgreSQL, akan tetapi pada penulisan ini kita akan mencoba menggunakan database h2 :).

Apa Itu Foreign Key ?

Foreign Key adalah sebuah column atau field yang berfungsi sebagai kunci tamu dimana kunci ini akan kita gunakan untuk relasi antar tabel.

Jika anda telah terbiasa dengan database yang memiliki arsitektur RDBMS maka anda tidak asing lagi dengan namanya primary key. Setiap tabel di dalam database wajib memiliki primary key, dikarenakan primary key ini berfungsi sebagai kunci unik untuk membedakan antara 1 row atau record dengan record yang lain.

Apa hubungan antara primary key dan foreign key ? biasanya primary key kita gunakan sebagai kata kunci, sedangkan foreign key biasanya diambil dari primary key sebuah tabel, contoh nya seperti berikut.

NPM Nama Mahasiswa Kelas
58412085 Rizki Mufrizal 4IA04
12345678 Mufrizal 4IA00

dan berikut adalah tabel nilai uts.

ID Nilai UTS UAS NPM
N01 100 100 58412085
N02 90 90 12345678
N03 80 80 58412085

Dari kedua tabel diatas dapat dilihat adanya relasi antara tabel mahasiswa dan tabel nilai. Pada tabel mahasiswa terdapat 1 primary key yaitu npm sedangkan pada tabel nilai kita memiliki 1 primary key juga yaitu id nilai. Sesuai dengan pembahasan kita yaitu foreign key, pada kedua tabel diatas terdapat 1 foreign key. Fireign key tersebut berada pada tabel nilai yaitu npm, dimana npm ini adalah primary key yang terdapat pada tabel mahasiswa.

Bagaimana Cara Menentukan Foreign Key ?

Kebiasaan seorang mahasiswa bingung bagaimana cara menetukan relasi antar tabel, bahkan ada beberapa mahasiswa yang secara langsung membuat aplikasi tanpa membuat normalisasi dan ERD, padahal normalisasi dan ERD adalah sesuatu yang wajib dibuat. Pada artikel ini, kita akan menggunakan cara cepat untuk menentukan relasi antar tabel. Misalkan penulis mempunyai data seperti berikut.

NB JB TK HSB JBT TH TT NP JBD THPB
Rinso Cair 01-01-2016 Rp 1000 10 Rp 5000 02-02-2016 Rizki 5 Rp 5000
Baju Padat 01-02-2016 Rp 2000 50 Rp 10000 02-02-2016 Rizki 5 Rp 10000
Rinso Cair 01-01-2016 Rp 1000 10 Rp 10000 02-02-2016 Mufrizal 10 Rp 10000

Ket :

  • NB : Nama Barang
  • JB : Jenis Barang
  • TK : Tanggal Kadaluarsa
  • TH : Total Harga
  • TT : Tanggal Transaksi
  • NP : Nama Pembeli
  • HSB : Harga Satuan Barang
  • JBT : Jumlah Barang Tersedia
  • JBD : Jumlah Barang Dibeli
  • THPB : Total Harga Per Barang

Data diatas merupakan data mentah atau bisa dibilang data diatas masih terdapat duplicate. Biar gampang, silahkan copy data tersebut ke libre office atau excel. Jika sudah kita akan membedakan data - data tersebut. Dari tabel diatas, bisa dilihat bahwa terdapat terdapat column - column yang doubel seperti nama barang, jenis barang, tanggal kadaluarsa, harga satuan barang dan jumlah barang yang tersedia. Column - column tersebut merupakan data barang, dimana data tersebut kita kelompokkan menjadi satu tabel, maka tabel barang akan menjadi seperti berikut.

ID Barang Nama Barang Jenis Barang Tanggal Kadaluarsa Harga Satuan Barang Jumlah Barang Tersedia
B01 Rinso Cair 01-01-2016 Rp 1000 10
B02 Baju Padat 01-02-2016 Rp 2000 50

Pada tabel diatas kita menambahkan satu column yaitu id barang, id barang ditambahkan karena pada tabel sebelum nya belum terdapat primary key. Setelah selesai, langkah selanjutnya kita akan melakukan spesifikasi untuk tabel penjualan, berikut adalah bentuk tabel nya.

Kode Transaksi Penjualan Tanggal Transaksi Nama Pembeli Total Harga
T01 02-02-2016 Rizki Rp 5000
T02 02-02-2016 Mufrizal Rp 10000

Lagi - lagi penulis menambahkan sebuah column kode transaksi penjualan sebagai primary key. Tabel penjualan ini akan berisi mengenai data - data penjualan dalam sekali transaksi, akan tetapi di dalam sekali transaksi terdapat beberapa barang yang berbeda sehingga kita akan membuat tabel penjualan detail. Tabel penjualan detail ini akan memiliki relasi ke tabel penjualan dan tabel barang, dimana relasi tabel penjualan ke tabel penjualan detail memiliki relasi one to many sama seperti tabel barang dan tabel penjualan detail sehingga seluruh data akan konsisten dan mengurangi kerangkapan data. Berikut adalah tabel penjualan detail.

Kode Transaksi Penjualan Detail Jumlah Barang Total Harga Per Barang Kode Transaksi Penjualan ID Barang
TD01 5 Rp 5000 T01 B01
TD02 5 Rp 10000 T01 B02
TD03 10 Rp 10000 T02 B01

Dari tabel diatas terdapat 3 column yang penulis tambahkan yaitu column kode transaksi penjualan detail sebagai primary key, kode transaksi penjualan sebagai foreign key dan id barang sebagai foreign key juga. Berikut adalah tampilan ERD nya seperti berikut.

Screenshot from 2016-03-26 14:07:44.png

Dari ERD diatas penulis membuat 2 garis yang berbeda yaitu ada yang tersambung dan ada garis putus - putus. Perbedaan nya adalah garis tersambung berfungsi sebagai parent child sehingga apabila orang tua nya atau tabel master dihapus maka tabel anak nya atau child nya juga akan dihapus yang sering disebut dengan identifying relationship. Berbeda dengan garis putus - putus, jika master tabel dihapus maka child tabel tidak akan dihapus.

Dari tabel diatas kita bisa melihat bahwa jika tabel penjualan dihapus maka secara otomatis si tabel penjualan detail akan dihapus, berbeda dengan tabel barang, jika tabel barang dihapus maka tabel penjualan detail tidak dihapus.

Implementasi Pada H2 Database

H2 Database adalah salah satu dbms yang bisa kita gunakan sebagai database server maupun embedded database dan ditulis dengan menggunakan bahasa pemrograman java.

Pada tutorial ini, kita akan menggunakan h2 database untuk membuat relasi dengan menggunakan foreign key. Silahkan download h2 database di h2 database. Penulis mendownload file binary yang ada pada bagian Maven (Binary, Javadoc, and Source), kemudian jalankan perintah berikut.

java -jar h2-1.4.191.jar

Maka secara otomatis browser akan terbuka dan melakukan akses web h2 database yang akan kita gunakan. Kemudian ubah jdbc url seperti berikut

jdbc:h2:~/database/belajar_h2

Kemudian klik connect, secara otomatis h2 database akan membuat database dengan nama belajar_h2.mv.db di dalam folder database. Tampilan web h2 database yang akan tampil seperti berikut.

Screenshot from 2016-03-26 14:38:54.png

Langkah selanjutnya, untuk membuat tabel barang, silahkan jalankan perintah berikut pada web h2 database.

CREATE TABLE IF NOT EXISTS tb_barang(
    id_barang VARCHAR(150) NOT NULL PRIMARY KEY,
    nama_barang VARCHAR(45) NOT NULL,
    jenis_barang VARCHAR(45) NOT NULL,
    tanggal_kadaluarsa DATE NOT NULL,
    harga_satuan_barang DECIMAL(10) NOT NULL,
    jumlah_tersedia_barang INT(10) NOT NULL
);

Kemudian untuk tabel penjualan silahkan jalankan perintah berikut.

CREATE TABLE IF NOT EXISTS tb_penjualan(
    kode_transaksi_penjualan VARCHAR(150) NOT NULL PRIMARY KEY,
    tanggal_transaksi DATE NOT NULL,
    nama_pembeli VARCHAR(45) NOT NULL,
    total_harga DECIMAL(10) NOT NULL
);

Langkah selanjutnya adalah membuat tabel penjualan detail, silahkan jalankan perintah berikut.

CREATE TABLE IF NOT EXISTS tb_penjualan_detail(
    kode_transaksi_penjualan_detail VARCHAR(150) NOT NULL PRIMARY KEY,
    jumlah_barang INT(10) NOT NULL,
    total_harga_per_barang DECIMAL(10) NOT NULL,
    kode_transaksi_penjualan VARCHAR(150) NOT NULL,
    id_barang VARCHAR(150) NOT NULL,
    FOREIGN KEY(kode_transaksi_penjualan) REFERENCES tb_penjualan(kode_transaksi_penjualan) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(id_barang) REFERENCES tb_barang(id_barang)
);

Untuk dapat mengenerate ERD dari tabel yang telah dibuat maka kita akan menggunakan Execute Query. Silahkan download aplikasi tersebut, jika sudah langsung buka aplikasi tersebut. Silahkan lakukan konfigurasi driver h2 database, setelah selesai, lakukan konfigurasi seperti berikut.

Screenshot from 2016-03-26 15:46:35.png

Lalu klik connect, silahkan klik nama databasenya kemudian pilih menu database dan pilih generate ERD lalu pilih map existing database maka akan muncul seperti berikut.

Screenshot from 2016-03-26 15:50:17.png

Kemudian pilih schema menjadi public, lalu pilih semua tabel dan pilih select all, maka outputnya akan seperti berikut.

Screenshot from 2016-03-26 16:03:03.png

Setelah selesai, silahkan klik generate. berikut adalah output yang dihasilkan.

Screenshot from 2016-03-26 16:09:24.png

Sekian artikel mengenai belajar membuat foreign key pada h2 database dan terima kasih :).

Bagi mahasiswa jurusan teknik informatika, kata protokol merupakan sebuah kata yang sering didengar. Jika kita membicarakan mengenai protokol pasti berkaitan erat dengan yang namanya jaringan komputer. Pada artikel ini, penulis akan menjelaskan sedikit apa itu protokol dan bagaimana contoh nyata protokol pada kehidupan nyata.

Apa Itu Protokol ?

Protokol adalah sebuah bahasa atau dapat dikatakan juga sebagai tata bahasa untuk berkomunikasi antara satu pihak dengan pihak yang lain.

Dari pengertian diatas dapat kita simpulkan bahwa dengan menggunakan protokol kita dapat melalukan komunikasi. Komunikasi disini adalah komunikasi antar komputer. Pada zaman sekarang, jenis - jenis protokol yang dapat kita gunakan untuk melakukan komunikasi antar komputer terbilang banyak, diantaranya seperti protokol http, smtp, ftp dan lain sebagainya.

Masing - masing protokol mempunyai fungsi yang sama yaitu saling berkomunikasi akan tetapi memiliki cara implementasi yang berbeda - beda. Contohnya misalnya protokol http merupakan protokol yang digunakan untuk transfer atau pertukaran data dalam bentuk hyper text antar client server sedangkan protokol smtp digunakan untuk mengirim atau pertukaran data dalam bentuk email. Kedua protokol diatas berfungsi untuk saling komunikasi akan tetapi secara tidak langsung implementasi dari kedua protokol tersebut adalah berbeda.

Contoh Penerapan Protokol Dalam Kehidupan Nyata

Dalam keseharian kita, sebenarnya terdapat banyak sekali contoh nyata implementasi protokol jaringan. Pada artikel ini, penulis memberikan gambaran tentang protokol dengan contoh POS dan TIKI. Jika kita ingin mengirim surat melalui POS maka tahapan kerjanya seperti berikut.

  1. Persiapkan dokumentasi / surat yang hendak anda kirim
  2. Masukkan surat atau dokumentasi tersebut ke dalam map surat agar surat tidak rusak
  3. Tuliskan alamat tujuan pada map surat anda
  4. Cara membayar untuk jasa POS yaitu dengan cara membeli perangko, sehingga anda tidak dapat secara langsung membayar secara tunai
  5. Tempelkan perangko di map surat anda
  6. Datang ke kantor POS lalu serahkan map surat anda kepada petugas

Jika kita menggunakan jasa TIKI, maka berikut adalah tahapan kerjanya.

  1. Persiapkan dokumentasi / surat yang hendak anda kirim
  2. Masukkan surat atau dokumentasi tersebut ke dalam map surat agar surat tidak rusak
  3. Tuliskan alamat tujuan pada map surat anda
  4. Datang ke loket TIKI, lalu anda akan bertemu dengan petugas disana
  5. Anda melakukan pengisian formulir dan membayar cash sesuai dengan harga yang telah ditetapkan

Dari contoh diatas dapat kita lihat, bahwa kedua perusahaan tersebut sama - sama dapat mengirim surat akan tetapi memiliki tahapan yang berbeda, dimana tahapan yang berbeda ini dapat dilihat pada bagian pembelian perangko dan pembayaran cash. Hal ini juga berlaku pada sebuah protokol, setiap protokol memiliki fungsi yang sama yaitu komunikasi akan tetapi setiap protokol memiliki implementasi yang berbeda - beda.

Kesimpulan

Protokol adalah sebuah bahasa atau tata bahasa yag digunakan untuk melalukan komunikasi jaringan. Setiap protokol memiliki tujuan yang sama yaitu melakukan komunikasi antar komputer, akan tetapi masing - masing protokol melakukan implementasi berbeda - beda.

Membuat sebuah aplikasi berbasis web adalah salah satu keahlian yang banyak dibutuhkan. Di dalam dunia kerja, memiliki skill dalam membuat aplikasi web memiliki nilai plus tersendiri. Beberapa mahasiswa sering bertanya kepada penulis tentang bagaimana cara membuat web ? membuat web menggunakan tool apa saja ? dan lain sebagainya. Pertanyaan tersebut memang sederhana akan tetapi memiliki jawaban yang cukup panajang. Pada artikel ini, penulis ingin sharing tentang apa saja yang perlu dipelajari agar kita dapat mengerti dan membuat web sendiri :).

Pelajari HTML

HTML(hypertext markup Language) adalah sebuah bahasa markup untuk membuat sebuah halaman web.

Yang pertama kali yang harus anda pelajari adalah html. Mengapa html ? dikarenakan semua aplikasi web pasti ditulis dengan html. Html biasanya digunakan untuk membuat tampilan halaman web. Seorang developer web yang sudah ahli, tag - tag html merupakan hafalan di luar kepala sehingga dia sangat paham betul sintak - sintak html. Nah bagaimana agar kita bisa seperti developer diatas ? cara nya mudah yaitu sering - sering ngoding html dengan menggunakan text editor yang tidak memiliki auto complete seperti gedit, notepad++ dan sebagainya. Silahkan anda pelajari seluruh tag html terutama html 5 di w3school.

Pelajari CSS

CSS(Cascading Style Sheet) berfungsi untuk mengatur component - component web seperti warna, lebar, style dan sebagainya.

Mengapa kita harus mempelajari css ? kan sekarang banyak template dan framework css seperti bootstrap ? Inti dari mempelajari css adalah agar anda dapat mengetahui minimal bagaimana caranya mengubah warna, bagaimana cara mengatur tinggi, lebar dan sebagainya. Sehingga dengan mempelajari css, anda tidak hanya bisa menggunakan framework css bahkan anda dapat membuat template anda sendiri. Pada saat melamar kerja, setiap developer front end pasti diwajibkan menguasai css, mengapa demikian ? dikarenakan setiap perusahaan pasti menginginkan pembuatan template web yang bagus sesuai dengan permintaan perusahaan tersebut.

Pada zaman sekarang terdapat beberapa bahasa baru agar anda dapat lebih optimal untuk melakukan coding css, diantaranya adalah less dan sass. Biasanya developer akan menggunakan bahasa diatas karena masing - masing bahasa diatas dapat menggunakan annotation fitur - fitur lain nya. Bahasa diatas nantinya akan di conver menjadi css yang siap dipakai. Bagi anda yang ingin belajar css silahkan akses di w3school.

Pelajari JavaScript

JavaScript adalah salah satu bahasa tingkat tinggi dan dinamis. JavaScript dikembangkan oleh Brendan Eich.

JavaScript adalah salah satu bahasa yang sangat powerfull. Hal ini terbukti pada zaman sekarang perkembangan teknologi javascript bagaikan pertumbuhan jamur di musim hujan :). Pada zaman dulu, javascript hanyalah bahasa yang dapat berjalan pada client, akan tetapi pada tahun 2009 Ryan Dahl membuat node js dari javascript yang dapat jalan di server.

Pada sub ini, kita hanya fokus pada javascript di sisi client. Di sisi client terdapat banyak framework yang dapat kita pelajari. Berikut adalah contoh framework dan library yang bisa dipelajari.

Fungsi dari javascript sebenarnya sangatlah banyak, diantaranya adalah kita dapat membuat aplikasi dengan konsep ajax. Dimana konsep ajax ini sangatlah banyak digunakan karena pertukaran data terjadi di belakang aplikasi. Bagi anda yang ingin belajar javascript silahkan akses w2school.

Pilih Bahasa Pemrograman

Tahap selanjutnya adalah anda diharuskan memilih bahasa pemrograman. Bahasa pemrograman dipilih adalah bahasa pemrograman yang mendukung untuk membuat aplikasi web seperti java, php, ruby, javascript dan lain sebagainya. Untuk pemilihan bahasa pemrograman silahkan dilihat kembali kebutuhan aplikasi yang akan dibuat. Jika aplikasi berskala enterprise maka gunakan bahasa pemrograman java, jika aplikasi menengah keatas anda dapat menggunakan java, php, ruby atau node js.

Nah jika anda mahasiswa, anda harus pilih bahasa apa untuk membuat sebuah aplikasi web ? kalau penulis menyarankan untuk mempelajari 1 bahasa yang benar - benar anda kuasai akan tetapi bahasa tersebut masih sangat digunakan untuk zaman sekarang contohnya seperti java dan php. Jika anda telah menguasa bahasa tersebut, untuk memperluas ilmu pengetahuan, anda dapat mempalajari bahasa - bahasa pemrograman lain seperti ruby dan node js. Jadi silahkan tentukan bahasa pemrograman untuk membuat aplikasi web yang anda inginkan :).

Pelajari Protokol Http

Http(Hypertext Transfer Protocol) adalah sebuah protokol jaringan lapisan aplikasi yang digunakan untuk sistem informasi terdistribusi, kolaboratif, dan menggunakan hipermedia.

Mengapa anda harus mempelajari protokol http ? dikarenakan untuk melakukan akses sebuah web kita akan menggunakan protokol sebagai penghubung antara client dan server. Jika anda tidak mengerti protokol http bagaimana anda dapat menyambungkan antara komputer server yang menjalankan aplikasi web anda dengan aplikasi browser yang terdapat di komputer client ?.

Apa saja yang harus dipelajari pada protokol http ? yang anda harus pelajari adalah bagaimana cara akses dari client ke server, method - method apa saja yang terdapat pada protokol http dan lain sebagainya. Jika anda mengerti bagaimana cara kerja protokol http maka anda tidak akan terlalu kesulitan ketika nanti nya anda akan mempelajari tentang teknologi web service.

Berikut adalah list apa saja yang penulis pelajari sehingga penulis bisa membuat aplikasi web.

  1. belajar html
  2. belajar css
  3. belajar javascript
  4. belajar jquery
  5. belajar angular js
  6. Belajar Ajax
  7. belajar bahasa pemrograman java
  8. belajar framework java web seperti spring mvc
  9. belajar ruby on rails
  10. belajar node js

Sekian artikel mengenai belajar web mulai dari mana dan terima kasih :).

Pada artikel sebelumnya, penulis telah membahas mengenai bagaimana cara instalasi dan konfigurasi postgresql :). Jika pada artikel sebelumnya kita hanya belajar bagaimana cara instalasi, konfigurasi serta belajar mengenai DDL, DML dan DCL pada postgresql, sedangkan pada artikel ini kita akan membahas mengenai sequence pada postgresql :).

Apa Itu Sequence Pada PostgreSQL ?

Sequence adalah urutan atau berurutan, Artinya sebuah key yang digenerate secara berurutan atau disebut juga dengan sequential key.

Sequence merupakan salah satu fitur yang terdapat pada postgresql. Sequence memiliki konsep yang sama dengan auto increment yang terdapat pada mysql akan tetapi terdapat beberapa perbedaan, diantaranya adalah.

  1. Sequence dapat di custom, artinya kita dapat melakukan custom terhadap maksimal angka yang digenerate, minimal angka yang digenerate, besarnya increment atau pengulangan dan lain sebagainya.
  2. Sequence bersifat dinamic, dimana kita dapat menentukan angka awal yang digenerate, berbeda dengan auto increment yang selalu diawali dengan angka 1.
  3. Auto increment biasanya dibuat berbarengan dengan membuat tabel atau dapat juga pada saat melakukan alter tabel sedangkan sequence dibuat secara terpisah atau bisa juga menggunakan type data serial pada postgresql untuk membuat secara otomatis sequence sehingga sequence dengan type data serial sangatlah mirip dengan auto increment.

Berikut adalah list database yang menggunakan sequence :

Membuat Sequence Pada PostgreSQL

Sebelum membuat sequence, kita terlebih dahulu membuat tabel. Database yang akan digunakan adalah belajar-postgresql sama seperti pada artikel instalasi dan konfigurasi postgresql. Untuk membuat tabel, silahkan jalanlan perintah berikut.

CREATE TABLE barang(
    id_barang integer NOT NULL PRIMARY KEY,
    nama_barang character(50) NOT NULL,
    jenis_barang character(5) NOT NULL,
    harga_barang money
);

Codingan sql diatas berfungsi untuk membuat tabel dengan nama barang dimana untuk type data angka kita akan gunakan integer, untuk string kita akan gunakan character sedangkan untuk uang kita gunakan type data money.

Setelah selesai, tahap selanjutnya adalah kita membuat sequence. Untuk membuat sequence jalankan perintah berikut.

CREATE SEQUENCE IF NOT EXISTS nomor_sequence
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 987654321
    START WITH 1;

Berikut adalah penjelasan mengenai codingan diatas.

  • CREATE SEQUENCE IF NOT EXISTS nomor_sequence berfungsi untuk membuat sebuah sequence dengan nama nomor_sequence, akan tetapi sebelum sequence dibuat terdapat pengecekan dengan adanya perintah IF NOT EXISTS. Jika sequence telah ada maka sequence tidak dibuat begitu pula sebaliknya.
  • INCREMENT BY 1 berfungsi sebagai tingkatan iterasi, maksudnya setiap kali data diinput maka sequence akan bertambah 1, anda dapat mengganti angka 1 menjadi angka berapa pun sesuai dengan keinginan anda.
  • MINVALUE 1 berfungsi untuk menandakan bahwa minimal value yang dihasilkan oleh sequence tersebut adalah angka 1.
  • MAXVALUE 987654321 merupakan kebalikan dari MINVALUE dimana pada sequence kita dapat menentukan batas maksimal key atau angka yang dihasilkan oleh sequence tersebut.
  • START WITH 1 berfungsi untuk mendeklarasikan bahwa sequence yang dibuat akan dimulai dari angka 1.

Untuk mengecek apakah sequence telah dibuat atau belum, bisa jalankan perintah berikut.

SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema='public';

dan outputnya akan seperti ini jika sequence berhasil dibuat.

sequence_name
----------------
 nomor_sequence
(1 row)

Uji Coba Sequence Pada PostgreSQL

Untuk melakukan ujia coba sequence pada postgresql sangatlah gampang, kita hanya perlu melakukan insert sebuah data ke database. Silahkan jalankan perintah berikut.

INSERT INTO barang(id_barang, nama_barang, jenis_barang, harga_barang)
VALUES(nextval('nomor_sequence'), 'rinso', 'cair', 1000);

Untuk memanggil sequence, cukup dengan menggunakan sintak nextval('nama sequence'). Dimana pada insert data diatas, kita menggunakan sequence dengan nama nomor_sequence yang telah dibuat. Langkah selanjutnya lakukan pengecekan data dengan perintah.

SELECT * FROM barang;

maka outputnya akan seperti ini.

 id_barang |                nama_barang                | jenis_barang | harga_barang 
-----------+-------------------------------------------+--------------+--------------
         1 | rinso                                     | cair         |   Rp1.000,00
(1 row)

Mengubah Sequence Pada PostgreSQL

Untuk mengubah sequence pada postgresql, kita dapat menggunakan perintah alter. Misalkan kita ingin merubah increment menjadi 2, maka anda dapat mengubah sequence tersebut dengan perintah.

ALTER SEQUENCE IF EXISTS nomor_sequence
    INCREMENT BY 2;

Setelah selesai, lakukan insert data kembali untuk mengetahu bahwa sequence telah berubah dengan perintah.

INSERT INTO barang(id_barang, nama_barang, jenis_barang, harga_barang)
VALUES(nextval('nomor_sequence'), 'aqua', 'cair', 5000);

Kemudian jalankan perintah select kembali untuk menampilkan barang, maka akan muncul output seperti berikut.

 id_barang |                 nama_barang              | jenis_barang | harga_barang 
-----------+------------------------------------------+--------------+--------------
         1 | rinso                                    | cair         |   Rp1.000,00
         3 | aqua                                     | cair         |   Rp5.000,00
(2 rows)

Bisa dilihat bahwa sequence nya berhasil di ubah, dimana id nya akan terus bertambah sebanyak 2 per inputan data.

Menghapus Sequence Pada PostgreSQL

Untuk menghapus sequence, kita dapat menggunakan perintah drop. Untuk menghapus sequence nomor_sequence silahkan jalankan perintah berikut.

DROP SEQUENCE IF EXISTS nomor_sequence;

Kemudian lakukan pengecekan sequence kembali, jika berhasil maka akan muncul output seperti berikut.

sequence_name 
---------------
(0 rows)

Sekian artikel mengenai belajar membuat sequence pada postgresql dan terima kasih :).