Sabtu, 13 September 2014

“Bash script untuk meng-automatisasi hidup Anda”

Pada dasarnya, hampir semua perintah/aplikasi Linux/Ubuntu* dapat dijalankan melalui terminal. Perintah-perintah tersebut dapat di automatisasi dengan membuat aplikasi script yang dalam hal ini sedang dibahas adalah bash script.


Untuk memulai bash script, pada section pertama ini saya akan bahas mengenai perintah dasar pada Linux;
1. Asumsi Anda telah mengerti syntax dasar Linux sehingga saya tidak menuliskannya, seperti;
buat file,
buat direktori,
menghapus file,
menghapus direktori
mengganti owner file
mengganti mode file
dan perintah dasar lainnya

Jika Anda menguasai perintah diatas, lanjut pada perintah dibawah.


2. Membersihkan terminal
$ clear


3. Mendefinisikan variabel dan memanggil variabel dari terminal
$ bolang=”ini variabel bolang”
$ echo $bolang
ini variabel bolang


4. Membuat funcion langsung pada terminal
$ function kambiang { echo “ini memanggil kambiang”; }
$ kambiang
ini memanggil kambiang
$

$ function kambiangGadang() { echo “ini kambiang gadang”; }
$ kambiangGadang
ini kambiang gadang
$


5. List file berdasarkan ekstensi
Asumsi didalam folder ada 3 file, yaitu: file01.jpg, file02.txt, file03.zip

Untuk melihat file, pasti menggunakan
$ ls
file01.jpg
file02.txt
file03.zip

Melihat file berdasarkan ekstensi;
$ ls *.jpg
file01.jpg

Melihat file lengkap dengan atribut dan ditambahkan array esktensi;
$ ls -l *.{jpg,txt,zip}
file01.jpg
file02.txt
file03.zip


6. Menjalankan beberapa perintah dengan 'satu kali enter'
Disini saya menggunakan sebuah contoh kasus git yang perintahnya berulangkali dilakukan sampai koding selesai. Saya pikir ini sangat menjengkelkan.
Perintah tersebut dapat diserderhanakan cukup dengan operator &&
$ git add . && git commit . && git push origin master

Jika perintah diatas dijalankan, maka pertama kali akan membuka 'editor CLI' default Anda untuk membuat keterangan commit. Setelah Anda menyimpannya, perintah akan dilanjutkan kepada git push.


Setelah mengenal beberapa perintah dasar seperti diatas, berikut saya akan membuat beberpa bash script sebagai contoh aplikatif;

1. Cek path interpreter bash script
$ which bash
/bin/bash


2. Membuat bash script pertama
Langkah pada CLI berikut adalah; membuat folder, berpindah ke folder yang dibuat, membuat file
$ mkdir bash_tut
$ cd bash_tut
$ nano hello_kambing.sh

Ketikkan dalam nano script berikut dan simpan;
#!/bin/bash
echo "hello kambing"

Selanjutnya ganti menjadi executable dan jalankan
$ chmod +x hello_kambing.sh
$ ./hello_kambing.sh
hello kambing
$

Atau dengan perintah lain, Anda bisa memanggil seperti berikut;
$ sh hello_kambing.sh
hello kambing
$


3. Operator && untuk membuat beberapa command dijalankan dalam satu kali eksekusi
Disini kembali saya menggunakan contoh git.
Jika pada point diatas Anda tetap mengetik beberapa kata untuk menjalankannya, sekarang Anda dapat membuat lebih sederhana dengan membuat sebuah aplikasi script.
Ketik kode berikut, berikan nama, jadikan executable dan jalankan;

#!/bin/bash
git add . && git commit . && git push origin master


4. Membaca input dari user
#!/bin/bash
clear
echo "Nama"
read nama
echo "Password"
read password
echo "Nama Anda adalah $nama, password $password"


5. Logical dan comparison
#!/bin/bash
clear
echo "Nama"
read nama
echo "Password"
read password
if [ $nama = "Nitza" ] && [ $password = "ganteng" ]
then echo "Anda memang ganteng"
else
echo "Anda tidak ganteng"
fi


6. Checking file/folder
#!/bin/bash
if test -f /home/nitza/kambiang
then
echo "kambiang ada"
else
echo "kambiang tidak ada"
fi


Beberapa command line untuk 'test'
- d Mengetahui direktori
-e Mengetahui file exist
-f Check regular file
-g SGI permission
-r Check readable
-s Check if file size != 0
-u SUID permission
-w Check writable
-x Check executable


7. Mempersingkat copy log file pada server
Terkadang Anda tidak malas mengetik command, tetapi hanya lupa mengingat folder/file path tempat beberapa log yang Anda butuhkan. Sementara pekerjaan ini tiap hari harus Anda kerjakan. Yap...buatlah bash script-nya dan tentu saja ini menggunakan perintah scp. Berikut contohnya;

#!/bin/bash
scp root@server.com:/usr/share/webserver_app/logs/log_file.txt /your_local_computer/home && gedit log_file.txt


8. Menjalankan modem

Hampir semua modem dapat berjalan dengan cara ini. Beberapa modem CDMA dan GSM yang tidak disupport oleh Ubuntu, ketika saya jalankan perintah ini dapat berjalan dengan sangat baik.

Hal yang pertama Anda lakukan adalah melihat usb Anda, memberikan modprobe yang terkait
$ lsusb

Perintah diatas dapat memberikan Anda vendor dan product modem Anda. Ingat kodenya untuk diisikan pada aplikasi bash script.

Ganti beberapa konfigurasi untuk wvdial. Jika belum ada aplikasi wvdial, silahkan install terlebih dahulu.
$ nano /etc/wvdial.conf
Ganti username dan password sesuai dengan ISP Anda

Buat bash script berikut.

#!/bin/bash
#beberpa modem auto run sebagai cd, dan eject dengan perintah berikut
sudo eject /dev/sr1

sleep 3
#modprobe sesuai dengan kode yang didapat dari lsusb
sudo modprobe usbserial vendor=0x19d2 product=0xfffe
sleep 10
#konfigurasi akan dijalankan otomatis berkaitan dengan /dev/ttyUSB[n]
sudo wvdialconf

sleep 3
#menjalankan wvdial (menyambungkan dengan ISP)
sudo wvdial


Masih banyak fungsi bash script yang dapat Anda tulis. Silahkan buat bash script Anda sendiri untuk meng-automatisasi pekerjaan Anda.

Selasa, 02 September 2014

Memahami Cara Kerja Web dan HTTP

Pendahuluan

Aplikasi berbasis web telah berkembang pesat pada masa ini menjadikan orang awam paling tidak mengetahui bagaimana web itu bekerja.

Berbasis web bukan berarti hanya website, berbasis web artinya dapat terkoneksi melalui protokol web untuk mengakses data, mengendalikan sesuatu dari jarak jauh.

Telpon pintar, Internet banking, rumah pintar, GPS, komputasi awan (cloud computing) merupakan hanya beberapa aplikatif dari teknologi web. Sehingga ini mematahkan paradigma aplikasi desktop lebih hebat dari aplikasi web. Dan tulisan pendahuluan ini ingin mengedukasi sebagian besar orang yang berpandangan bahwa lulusan IT hanya dapat membuat website, benerin printer dan benerin komputer.

Jika melihat konsep penerapan web lebih jauh, teknologi informasi secara umum dan web secara lebih khusus  adalah enabler bagi sebuah organisasi baik itu pemerintahan, organisasi non profit dan organisasi profit. Dikatakan enabler karena web/teknologi informasi merupakan inti bisnis sehingga tanpa web/teknologi informasi tidak dapat berjalan. Bandingkan dengan pada masa lalu dimana web/sistem informasi yang hanya merupakan sebuah support bagi sebuah organisasi.

Kita sebagai pribadi secara tidak sadar telah tergantung kepada teknologi web. Memposting status di media sosial, meng-upload photo pada iCloud, mencari berita tentang photo leak artis Hollywood yang sedang marak diberitakan dan lain sebagainya.

Dengan teknologi web, organisasi dapat membangun business intelligence, decission support system (DSS), sistem pakar, Service Oriented Architecture (SOA) dan lain sebagainya.

Tulisan diatas cukup menggambarkan bahwa mengetahui teknologi web cukup penting pada kehidupan dewasa ini. Tetapi saya tidaka akan menulis topik yang sangat luas seperti diatas. Tulisan berikut akan lebih spesifik membahas bagaimana cara kerja web dan HTTP.


Gambaran sedernhana dari kehidupan sehari-hari

Seseorang sebut saja namanya Tumbuang duduk memegang sebuah telpon pintar. Si Tumbuang ingin membuat curhat pada website sobatcurhat.com. Si Tumbuang mengetikkan sebuah Uniform Resource Locator (URL) pada browser mobile-nya.

Gambaran diatas cukup sederhana, tetapi bagaimana itu bekerja dapat dituliskan dengan sebuah tulisan yang relatif panjang seperti berikut.


Bagaimana proses yang terjadi?

Dengan gambaran yang sederhana tersebut, proses yang terjadi adalah URL mencari alamat yang ada pada internet. Bisa saja alamat tersebut ada pada belahan bumi yang jauh disana, berbeda benua, berbeda negara atau dimana saja.

Seperti namanya Uniform Resource Locator; komputer/browser client akan me-request resource yang dapat saja berupa tulisan, gambar atau suara dimana saja resource tersebut berada.

Secara teknikal, client browser akan me-request data yang ada pada web server dan web server akan memberikan response terhadap request tersebut.

Secara sederhana, sebenarnya setiap komputer adalah sebuah server. Komputer yang diberikan/di-set/diinstall sebagai web server akan dapat memberikan layanan web dan bisa berfungsi sebagai web server.

Request dan response diberikan oleh sebuah protokol yang dinamanakan dengan HyperText Transfer Protocol (HTTP) dan HTTP merupakan protokol stateles.

HTTP meminta komunikasi yang dengan bahasa yang sama antara browser dan web server sehingga mereka saling mengerti.

Berikut proses yang terjadi secara teknikal ketika browser mengakses sebuah URL;

1. Parsing URL

URL mempunyai format seperti berikut: [protocol]://[domain]/[request-URI]

URL yang di-request sebenarnya bukan hanya berasal dari browser. URL yang di-request dapat saja dilakukan melalui terminal atau robot. Alat untuk me-request URL ini disebut sebagai user agent sehingga kedepannya saya akan menyebut user agent untuk jenis ini.

Jika pada format diatas, protocol saya tuliskan sebagai array []. Ini saya maksudkan karena masih ada protokol lain yang bisa bekerja dengan format tersebut seperti FTP, JDBC:MySQL atau yang lainnya yang tidak dibahas disini.


2. HTTP Request

User agent akan mengirimkan request pada web server. Metode yang paling banyak digunakan pada tahapan ini adalah GET.

Method yang lain pada HTTP Request adalah HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT (HTTPS) dan PATCH.

Berikut adalah sebuah contoh request yang dilakukan.


Terlihat diatas; Accept, Accept-Encoding, Cookie dll merupakan properti yang dapat ditambahkan ketikan melakukan request oleh user agent.

Jika ingin mengirimkan request melalui terminal, dapat menggunakan perintah curl seperti berikut;

$ curl -d "nama=Nitza" \
> -d "alamat=Jakarta" \
> server.com


3. HTTP Response

Pada tahap ini, user agent akan menerima response dari web server. Response tersebut biasanya akan terlihat seperti berikut;



Diatas, terlihat jenis response yang diterima melalui Content-Type sehingga user agent yang biasanya adalah browser mem-parsing dan render sesuai dengan Content-Type tersebut.

Ragam dari Content-Type dapat dilihat pada link berikut http://en.wikipedia.org/wiki/Internet_media_type

Jika menggunakan user agent dengan jenis terminal, berikut syntax untuk melihat response HTTP yang di-request;

$ curl -I http://domain.com

Jika tidak menggunakan opsi -I, maka semua response akan ditampilkan pada terminal/user agent.

Saya rasa pembahsan tentang curl cukup menarik karena dapat mengirimkan parameter, merequest dan melihat response tanpa bantuan user interface. Tidak adanya bantuan user interface dan berjalan pada terminal menjadikannya lebih seksi karena bisa dipanggil melalui java runtime dan bash script sehingga kita bisa membuat aplikasi baru untuk keperluan spesifik; bisa saja sebagai tester aplikasi (umumnya dipakai untuk lingkungan java) dan hacking**.


Apa itu stateless protokol?

HTTP merupakan stateless protokol yang artinya HTTP tidak mengingat data yang kita kirim melalui browser. Setiap kali pengguna me-request HTTP, web server akan me-response dengan data baru setiap waktu diminta sehingga HTTP request dan response selalu dibuat per-akses. Dalam arti sederhana, tidak ada hubungan antara request & response yang lama dengan request & response yang baru.

Jadi, bagaimana cara menyajikan data terkait jika HTTP tidak mengingat data yang kita minta sebelumnya?

Untuk menjawab ini, saya berikan ilustrasi sebagai berikut; ketika Anda berkungjung ke website penjualan misalnya e-bay, maka setiap kali Anda melihat barang, data barang tersebut dijadikan barang favorit oleh aplikasi untuk ditampilkan kembali sebagai suggest untuk pilihan yang akan Anda beli.

Proses tersebut terjadi, karena pada user agent diciptakan sebuah session dan cookie sehingga web server dapat mengingat hal tersebut dan memberikan data yang berhubungan dengan request sebelumnya. Session dan cookie adalah key-value pair data pada web server. Penjelasan lebih lanjut tentang session dan cookie mungkin akan dijabarkan pada tulisan berikutnya


Jika Anda pernah melihat kode error pada sebuah halaman, maka Anda cukup beruntung mengetahuinya karena kode response jarang ditampilkan jika kode tersebut untuk iformasi, sukses dan redirection. Berikut adalah code status respon secara garis besar;
1xx ditujukan sebagai informasi
2xx sukses. Jika Anda sering bermain dengan Ajax, biasanya success response ini sering digunakan dengan kode sukses 200.
3xx redirection
4xx client error
5xx server error


Penutup

Dengan mengetahui cara kerja website bagi awam dapat mengetahui apa itu sebenarnya web sehingga menambah pengetahuan akan web dan bisa saja mendapat ide baru sebagai enabler bagi pribadi sendiri atau organisasinya. Sebuah contoh penerapan web adalah sebuah aplikasi Android yang saya buat untuk kepentingan keluarga yang juga saya share pada goole play sehingga ribuan orang bisa memakainya.

Sendangkan dengan mengetahui cara kerja website/http ini bagi para web developer, dapat mengerti tentang trouble shooting dan  membuat arsitektur yang lebih baik pada sistem yang sedang dibuat. (keamanan, ketangguhan dll).


Sumber
http://www.w3.org/Protocols/rfc1341/4_Content-Type.html
http://en.wikipedia.org/wiki/Internet_media_type
http://en.wikipedia.org/wiki/List_of_HTTP_status_codes


*) Request dan response sebaiknya tidak dijadikan Bahasa Indonesia pada tulisan ini
**) Hacking sebenarnya tidak untuk tujuan jahat. Tetapi kata ini sering disalah artikan sehinga menjadi konotasi yang negatif.

Senin, 01 September 2014

Akses database MySQL dari komputer lokal menggunakan terminal

Judul dari tulisan ini memang sedikit kuno terutama pada zaman serba visual ini. Sebagian orang tidak membutuhkan ini karena menjadi coder praktis. Tetapi banyak hal yang didapat jika mengetahui perintah yang sangat dasar ini terutama untuk membuat aplikasi yang berhubungan dengan database dengan konsep yang lebih baik tanpa interpreter aplikasi lain seperti ODBC atau JDBC dan memahami konsep bagaimana koneksi tercipta sehingga mencegah serangan terhadap database.

Berapa contoh keuntungan mengetahui penggunaan perintah dasar ini;
- Jika tidak dapat menggunakan browser untuk database bisa menggunakan perintah ini,
- Jika koneksi sangat lamban, bisa menggunakan perintah ini,
- Jika tidak dapat masuk ke server sementara port MySQL (default 3306) dapat diakses,
- Jika ingin membuat aplikasi yang dapat memanggil perintah melalui terminal,
- Jika ingin berbuat jahat untuk meyerang server lain*,
- Dan banyak jika yang lainnya sesuai dengan kasus Anda.

Perlu diperhatikan disini, untuk dapat menggunakan perintah ini dari komputer lokal, port yang berhubungan dengan MySQL pada server harus diaktifkan.

Untuk melihat port yang aktif pada server Anda, ketik perintah berikut;

$ nmap ServerAnda.com

Jika port MySQL Anda terbuka, maka Anda dapat lanjut pada syntax selanjutnya. Jika tidak, Anda dapat mengaktifkan port tersebut seperti yang ada pada tulisan ini.

Berikut adalah syntax untuk mengakses database MySQL pada langsung dari terminal pada komputer lokal;

$ mysql -h ServerAnda.com -u username -p

Setelah perintah tersebut dieksekusi, maka Anda diminta memasukkan password dan jika akses granted, Anda dapat mengelola database melalui terminal.

Cukup mudah bukan? :)


*) Contoh yang buruk, berhati-hatilah terhadap port database Anda.

Jumat, 22 Agustus 2014

Javadoc sebagai standar dokumentasi industri software

Java sebagai bahasa murni berorientasi objek mempunyai aturan yang ketat tentang penerapannya. Aturan-aturan yang ketat ini menjadikan Java sebagai bahasa yang populer karena keteraturannya. Java juga mengembangkan J2EE yang dikenal sebagai Java 2 Platform, Enterprise Edition. Dengan ini, Java mengklaim dan memang mengkhususkan untuk pengembangan aplikasi dengan skala besar.

Aplikasi dengan skala besar tentunya membutuhkan dokumentasi yang sangat baik sebagai sumber pengelolaan aplikasi. Dengan dokumentasi yang baik, setiap programmer dapat menggunakan kembali (reusable) Class yang telah dibuat bahkan untuk aplikasi yang lain.


Jadi, apa itu Javadoc?

Javadoc adalah dokumentasi generator dari Oracle Corporation untuk menghasilkan dokumentasi API dalam format HTML pada source code Java.

Dari sejarah awal pengembangan Java, Java telah menerapkan javadoc ini. Begitu terstruktur dan rapi arsitektur Java sehingga banyak bahasa lain juga mulai menerapkannya.

Pada IDE yang canggih seperti Netbeans dan Eclipse, Javadoc hadir dalam bentuk popup informasi sehingga programmer tidak perlu membaca halaman html. Untuk IDE yang tidak memiliki fitur javadoc atau text editor biasa, maka programmer buth javadoc (dalam format HTML).


Bagaimanakah bentuk Javadoc itu?

Karena Javadoc dalam bentuk HTML, dokumentasi tersebut dapat kita jumpai banyak di internet. Salah satu bentuk Javadoc seperti screenshot berikut




Bagaimana cara menulis Javadoc?

Dokumentasi lengkap pada Javadoc dapat ditemukan pada website Oracle berikut: http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Secara sederhana, penulisan Javadoc terlihat seperti gambar berikut;



Pada IDE yang sudah memiliki fitur Javadoc akan memiliki popup untuk menampilkannya seperti berikut;




Bagaimana cara menghasilkan Javadoc?

Untuk menghasilkan Javadoc, tentunya berbeda-beda untuk setiap IDE.

Saat ini saya sedang bekerja dengan Eclipse IDE sehingga saya akan menjelaskan langkah cara menghasilkan Javadoc dengan Eclipse.

1. Pilih project yang akan di generate Javadoc-nya

2. Pada bagian menu: Project - Generate Javadoc

3. Ikuti saja langkah demi langkah yang disajikan oleh eclipse

4. Hasil akhir akan terlihat seperti berikut;





Penutup

Aplikasi bukanlah sebuah barang yang bisa usang. Membuat aplikasi tidak dimulai langsung sempurna. Aplikasi senantiasa diperbarui dengan berbagai macam alasan. Jika dokumentasi yang dihasilkan baik, rapi dan memiliki standar penulisan yang baku, maka pengembangan aplikasi menjadi lebih besar dan komplek akan terus terjaga.


Referensi

- http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html
- http://en.wikipedia.org/wiki/Javadoc

Kamis, 21 Agustus 2014

Aplikasi sederhana pengiriman email pada server sendiri dengan JavaMail

Seiring dengan perkembangan cloud computing dan aplikasi cloud, maka email sebagai pengenal seseorang dalam dunia maya juga menjadi sesuatu hal yang penting.

Aplikasi cloud atau hanya sekedar website biasa membutuhkan email baik itu sebagai promosi produk, konfirmasi keikut sertaan, milis, atau notifikasi. Oleh karena itu, kemampuan setiap bahasa pemrograman dan developer-nya untuk mengirimkan email sangatlah penting. Alangkah lucunya sebuah aplikasi atau usaha Anda yang digadang-gadang sangat hebat mengirimkan promosinya melalui akun mail gratis seperti gmail, yahoo atau akun mail gratis lainnya.

Well... jika Anda ingin membuatkan mail pribadi, bisa hubungi saya :D

Pada tulisan kali ini saya membahas tentang mengirim email dengan library javax.mail. Library ini bisa didownload pada http://www.oracle.com/technetwork/java/javamail/index.html

Untuk membuat email dapat terkirim melalui server, Anda harus mengaktifkan port 25 atau port lainnya yang mendukung Send Mail Transfer Protocol (SMTP)


1. Mengirim email dari Virtual Private Server.
Pada code dibawah juga saya selipkan 'myserver.com', silahkan aktifkan baris tersebut dan menonaktifkan baris localhos untuk dapa mengirimkan email jika server Anda langsung pada IP publik.

package tutmailb;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      
      System.out.println("mulai mengirim");
    
      // Dikirimkan kepada...
      String to = "itsme@nitzaalfinas.com";

      // Data pengirim
      String from = "nitza@myserver.com";
      final String username = "nitza"; //username server
      final String password = "password"; //password server

      // mengirimkan email melalui vps
      String host = "localhost";
      
      //mengirimkan email melalui server pribadi
      //String host = "myserver.com";

      
      Properties props = new Properties();
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");
      

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
      });
      
      
      try {
    // Default MimeMessage object.
    Message message = new MimeMessage(session);
    
    // setFrom
    message.setFrom(new InternetAddress(from));
 
    // header
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
 
    // pesan
    message.setText("Halo... Ini pengirimain email melalui JavaMail ... ");

    //jika ingin mengirimkan email html, aktifkan baris berikut dan matikan baris diatas
    //message.setContent("

Ini adalah email html

", "text/html"); // kirim email Transport.send(message); System.out.println("Saya keren dan telah sukses mengirimkan email... :D"); } catch (MessagingException e) { throw new RuntimeException(e); } } }


Compile kedalam bentuk jar. Misalnya; tutmailb.jar
Untuk menjalankan email diatas, buka terminal Anda dan ketik perintah Java seperti berikut;

$ java -jar tutmailb.jar



2. Mengirimkan email melalui Gmail
Mengirimkan email langsung dari akun gmail Anda juga memungkinkan dilakukan melalui server Anda. Tentunya user yang akan menerima akan melihat email yang dikirim melaui gmail. Tetapi gmail juga memberikan opsi anda untuk mengganti gmail anda dengan format namaanda@perusahaananda.com.



package tutmailb;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      
      System.out.println("mulai mengirim");
    
      // Dikirimkan kepada...
      String to = "kepada@gmail.com";

      // Data pengirim
      String from = "dari@gmail.com";
      final String username = "dari";//username gmail
      final String password = "password";//password gmail

      // mengirimkan email melalui vps
      String host = "myserver.com";
      

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");
      

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
      });
      
      
      try {
    // Default MimeMessage object.
    Message message = new MimeMessage(session);
 
    
    // setFrom
    message.setFrom(new InternetAddress(from));
 
    // header
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
 
    // pesan
    message.setText("Halo... Ini pengirimain email melalui JavaMail ... ");
    
    // kirim email
    Transport.send(message);

    System.out.println("Saya keren dan telah sukses mengirimkan email... :D");

      } 
      catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Untuk menjalankannya, sama dengan cara diatas menggunakan terminal.


3. Selesai.

Berikut screenshot aplikasi diatas dari server aplikasi diatas.



Aplikasi sederhana diatas masih berjalan dengan command line. Mungkin pada tulisan selanjugnya saya akan bahas mengirimkan email dengan User Interface (UI).


Ubuntu Firewall - Uncomplicated Firewall

Firewall atau dalam bahasa Indonesia diartikan sebagai tembok api. Dalam pengertiannya pada Teknologi Informasi tidak jauh berbeda.

Firewall adalah sistem perangkat lunak yang membentengi dan meng-kontrol lalu lintas jaringan, menjaga keamanan jaringan tersebut terhadap lalulintas yang tidak aman. Firewall biasanya diterapkan pada sebuah gateway mesin antara jaringan lokal dan internet.

Tulisan kali ini tidak membahas lebih dalam tentang firewall. Tulisan kali ini hanya membahas tentang firewall yang secara default untuk Ubuntu yaitu Uncomplicated Firewall (UFW).

Firewall biasanya sangat berhubungan erat dengan port-port pada mesin. Untuk mengetahui port mana yang terbuka pada sebuah mesin/sistem, kita bisa melihat dengan perintah nmap seperti berikut;



Dari contoh diatas, kita dapat melihat detik.com membuka port 22 untuk ssh, port 80 untuk http dan port 443 untuk https. Dan dapat kita lihat lebih jauh, ada tcp dibelakang port untuk kasus lain, kita juga bisa temukan udp. Untuk tcp/udp tidak akan diulas pada tulisan ini. Jika Anda ingin tau lebih jauh, berikut ada penjelasan ringant tentang tcp/udp. Lebih jauh lagi, untuk para hacker, mengetahui port yang terbuka dapat menjadikan pintu masuk bagi mereka. Maka dari itu, diperlukanlah sebuah firewall yang secara default sudah ada pada Ubuntu yaitu UFW.

Berikut command dasar untuk UFW;

1. Melihat status UFW

# ufw status
atau
# ufw status verbose

Untuk melihat raw status
# ufw show raw


2. Mengaktifkan UFW
Paket UFW telah ada pada Ubuntu tetapi secara default tidak berjalan pada sistem. Untuk mengaktifkannya, ketik perintah berikut;

# ufw enable

3. Mematikan UFW

# ufw disable



4. Allow

# ufw allow <port>/<optional: protocol>

Contoh
# ufw allow 22/tcp


5. Deny

# ufw deny <port>/<optional: protocol>


Contoh:

# ufw deny 22/tcp


6. Menghapus rule

# ufw delete deny <port>/<optional: protocol>


Contoh:

# ufw delete deny 22/tcp
# ufw delete deny 22
# ufw delete allow 22


7. Men-allow berdasarkan service
Contoh:

# ufw allow http
# ufw allow https
# ufw allow smtp
# ufw allow submision
# ufw allow imaps


Sumber lainnya yang bisa dibaca tentang UFW;
- https://help.ubuntu.com/10.04/serverguide/firewall.html
- https://wiki.ubuntu.com/UncomplicatedFirewall
- https://help.ubuntu.com/community/UFW
- https://github.com/miniwark/miniwark-howtos/wiki/Firewall-setup-on-Ubuntu-12.04


Selasa, 19 Agustus 2014

ApplicationContext pada Spring Web MVC

Aplikasi Java berbasis web memerlukan environment yang berbeda-beda sehingga dibutuhkanlah sebuah 'script' yang dapat diatur tanpa melalui compiling. Script ini biasanya dalam format xml yang ditempatkan pada folder resources. Karena tidak di-compile menjadi bytecode, maka kita dengan mudah dapat mengganti script tersebut ketika sudah berada pada server produksi.

Misalnya; untuk bekerja pada lingkungan development lokal kita memerlukan setting database dengan user root dan password 1234. Sedangkan pada server produksi, kita memerlukan setting user kambing dengan password ganteng. Maka dari itu karena kita menerapkan ApplicationContext maka dengan mudah kita dapat mengganti sesuai dengan lingkungan kerja kita.

Berikut adalah langkah-langkah bagaimana membuat ApplicationContext pada Spring Web MVC;

1. Buat sebuah project Spring Web MVC.
Pada pembuatan project ini saya sarankan menggunakan Spring Tool Suite (STS).

2. Buat class dengan nama TutAppContext.java
package com.nitza.trycontexta;

public class TutAppContext {
 
 private String name;
 private String pekerjaan;
 
 public void setName(String name) {
  this.name = name;
 }
 
 public void setPekerjaan(String pekerjaan) {
  this.pekerjaan = pekerjaan;
 }
 
 public String printJsonString() {
  return "{ \"Nama\": \""+name +"\", \"Pekerjaan\":\""+pekerjaan+"\" }";
 }
}


3. Buat file MyBeans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="tutBean" class="com.nitza.trycontexta.TutAppContext">
<property name="name" value="Nitza" />
<property name="pekerjaan" value="Consultant" />
</bean>
</beans>


4. Ganti HomeController yang dibuat secara default seperti berikut

package com.nitza.trycontexta;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class HomeController {
 
 @RequestMapping("/")
 @ResponseBody
 public String tutContext() {
  ApplicationContext context = new ClassPathXmlApplicationContext("MyBeans.xml");
  
  TutAppContext tutBean = (TutAppContext) context.getBean("tutBean");
  return tutBean.printJsonString();
 }
}


5. Struktur file/folder terlihat seperti berikut




6. Ketika aplikasi dijalankan akan terlihat seperti berikut


Finish!

Jika ingin download contoh, berikut link github-nya.

Minggu, 17 Agustus 2014

Bekerja dengan file dan folder pada Java

Hampir semua aplikasi bekerja dengan file/folder dan Java sebagai bahasa Bytecode mempunyai keunggulan dibandingkan dengan bahasa script. Aplikasi Java yang berbasis web dapat dikombinasikan dengan 'Java yang berjalan pada desktop'. Ini menjadikan Java dapat bekerja dengan file jauh lebih dalam.

Sebagai contoh sederhana, website keepvid.com dapat mengkonversi video-video yang ada pada url kedalam bentuk yang bisa kita download. Tentu saja ini tidak dapat dilakukan oleh bahasa script. Oleh karena itu, keepvid.com membutuhkan Java diaktifkan untuk bisa bekerja dengan baik. Ya, begitulah salahsatu keunggulan Java diantara keunggulannya yang lain.

Pada tulisan kali ini, saya akan membahas tentang modifikasi file/folder pada Java menggunakan Spring MVC, class yang kita butuhkan adalah java.io.File dan perlu dicatat bahwa tutorial ini menggunakan Linux file/folder system.

Berikut adalah cara bekerja dengan file/folder;


1. Membuat folder

@RequestMapping("/buat_direktori")
@ResponseBody
public String getBuatDirektory() {
  
    //definisikan path
    File path = new File("/home/nitza/direktori");
  
    //jika path belum ada, buat path baru
    if(!path.exists()) {
 path.mkdirs();
    } 
  
    return "ok";
}


2. Me-rename file

@RequestMapping("/rename_file")
@ResponseBody
public String getTestRenameFile() {
  
    //file yang ada di server
    File fileYgAda = new File("/home/nitza/resources/folder_temp/sesuatu.png");
  
    //buat file kosong terlebih dahulu
    File fileBaru = new File("/home/nitza/resources/folder_temp/berubah.png");
  
    if(fileYgAda.renameTo(fileBaru)){
        return "berhasil";
    }
    else {
        return "gagal";
    }
}


3. Memindahkan file pada folder yang lain

@RequestMapping("/pindah_file")
@ResponseBody
public String getPindahFile() {
    //file yang ada di server
    File fileYgAda = new File("/home/nitza/resources/folder_temp/bolang.png");
  
    //buat file baru
    File fileBaru = new File("/home/nitza/resources/bolang.png");
  
    if(fileYgAda.renameTo(fileBaru)){
        return "berhasil";
    }
    else {
        return "gagal";
    }
}


4. Copy file dengan linux command
Metode ini sedikit tricky tetapi sangat berguna. Dan metode ini memberika kita akses untuk menjalankan berbagai macam command pada Linux. Tetapi yang dibahas dibawah hanyalah perintah untuk copy file dengan syntax cp

@RequestMapping("/copy_file")
@ResponseBody
public String getCopyFile() throws IOException {

    Runtime.getRuntime().exec("cp /home/nitza/resources/folder_temp/kucing.png /home/nitza/resources/folder_temp/kucingx.png");
  
    return "ter-copy";
}



5. Copy file dengan Apache Commons library

@RequestMapping("/copy_file_b")
@ResponseBody
public String getCopyFileB() throws IOException {
 //file yang ada di server
 File fileYgAda = new File("/home/nitza/resources/folder_temp/kambing.png");
  
 //buat file kosong terlebih dahulu
 File fileBaru = new File("/home/nitza/resources/folder_temp/kambingb.png");
  
 FileUtils.copyFile(fileYgAda, fileBaru);
  
 return "ter-copy";
}


Masih banyak method-method pada java.io.File yang harus di-explore seperti isDirectory(), isFile(), exists() dan lain sebagainya. Dan untuk bahan bacaan lebih lengkap tentang java.io.File dapat ditemukan pada berikut; http://docs.oracle.com/javase/7/docs/api/java/io/File.html


Tutorial aplikasi upload file dengan Spring MVC

Untuk mengikuti tutorial ini, saya sarankan menggunakan Spring Tool Suite (STS).

Berikut langkah-langkah membuat aplikasi upload dengan Spring MVC;

1. Buat project


2. Buat project setting


3. Struktur file/folder terlihat seperti berikut


4. Atur dependencies (penambahan dependency)

5. Karena kita memulai dengan Spring Tool Suite (STS) mengikuti langkah-langkah diatas, maka secara default maka Controller-nya dibuat oleh STS. Ganti Controller seperti code berikut

package com.nitza.tutupload;

import java.util.Locale;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
 
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home() { 
  return "home";
 }
}


6. Buat form dan ganti home.jsp seperti berikut


7. Tambahkan method postFileUpload seperti berikut

package com.nitza.tutupload;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {
 
 @Autowired
 ServletContext context;
 
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home() { 
  return "home";
 }
 
 
 @RequestMapping(value="/fileupload/upload",method=RequestMethod.POST)
 public String postFileUpload(HttpServletRequest request, 
   HttpServletResponse response,
   Model model) 
 {
  
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  
  List fileNames = new ArrayList(); //upload beberapa file
  
  if (isMultipart) {
   
   FileItemFactory factory = new DiskFileItemFactory(); //membuat FileFactory
   
   ServletFileUpload upload = new ServletFileUpload(factory);
   
   try {
    
    List items = upload.parseRequest(request);
    Iterator iterator = items.iterator();
    
    while (iterator.hasNext()) {
     FileItem item = (FileItem) iterator.next();
     if (!item.isFormField() && !item.getName().equals("")) {
      String fileName = item.getName();
      
      /* jika file upload ditempatkan relatif terhadap folder aplikasi (/resources) 
      String root = context.getRealPath("/");
      File path = new File(root + "/resources");
       */
      
      //berikut ditempatkan relatif terhadap server
      File path = new File("/home/nitza/tututut"); 
      
      if (!path.exists()) {
       boolean status = path.mkdirs(); //jika path tidak ada, maka dibuat oleh aplikasi
      }

      File uploadedFile = new File(path + "/" + fileName);
      fileNames.add(fileName);
      System.out.println("File Path:-"
        + uploadedFile.getAbsolutePath());

      item.write(uploadedFile);
     }
    }
   } catch (FileUploadException e) {
    System.out.println("FileUploadException:- " + e.getMessage());
   } catch (Exception e) {
    System.out.println("Exception:- " + e.getMessage());
   }
      
  }
  
  model.addAttribute("files",fileNames);
  return "view_success";
  
 }
 
}



8. Buat file view_success.jsp seperti berikut


Finish!

Jumat, 15 Agustus 2014

Manipulasi DOM dengan JavaScript

Begitu banyak sumber tentang sejarah JavaScript. Ada yang mengatakan tidak berhubungan dengan Java dan ada yang mengatakan berhubungan dengan Java. Untuk menggali lebih jauh, mungkin kita harus melakukan research lebih lanjut dan tulisan ini tidak difokuskan untuk itu. :D Saya ambil saja salah satu sumber yang saya yakini yang saya dapatkan pada halaman http://oreilly.com/pub/a/javascript/2001/04/06/js_history.html yang menyatakan bahwa Javascript dan Java saling berhubungan pada awal pengembangannya.

Berikut kutipan yang diterjemahkan pada halaman tesebut;
"Balik pada awal 1995. Netscape mempekerjakan Brendan Eich pada MicroUnitSystems Engineering untuk mengimplementasikan satu bahasa baru. Membuat Navigator baru yang menambahkan dukungan Java yang dapat diakses oleh programmer non-Java. Eich memutuskan untuk membuat script terpisah yang menyesuaikan dengan environtment dan audience (programmer) agar web designer dan "
web developer dapat terhubung pada elemen-elemen yang ada pada halaman (html)."

Bahasa script seperti; JavaScript, PHP, Ruby, AutoLISP dll sejatinya diperuntukkan untuk aplikasi yang kecil. Tetapi seiring perkembangan waktu, bahasa script berkembang kearah enterprise tentunya dengan arsitektur yang disesuaikan.

Dulu, JavaScript digunakan hanya terbatas pada akses halaman html. Pada masa ini, JavaScript telah dikembangkan secara luas seperti game engine, animasi, manipulasi halaman html, framework UI, dll.

Pada tulisan kali ini, saya akan menunjukkan bagaimana memanipulasi Document Object Model (DOM) menggunakan JavaScript dengan format latihan;


1. Menambahkan tulisan pada node[1]

Buatlah page seperti berikut


Jalankan page maka akan terlihat seperti berikut;



2. Menambahkan attribut style pada elemen.
Melanjutkan contoh diatas, sekarang bukalah developer tools dan ikuti gambar berikut;
































3. Menambahkan text pada elemen DOM
Berikut ini Anda kita akan mempelajari bagaimana menangani array pada elemen dan memberinya nama.

Buatlan halaman seperti berikut


Buka halaman tersebut, buka developer tools dan tuliskan langkah-langkah berikut;




4. Menambahkan class pada elemen DOM
Game kali ini cukup menarik karena kita bisa membuat dan memodifikasi elemen, menempatkan class atau id sehingga berwarna-warni.

Game berikut bisa dimulai dengan merefresh halaman yang sudah dibuat pada game diatas sebelumnya.
Buka developer tools, dan ikuti berikut;


Game yang menarik bukan? :)




[1] node = DOM element, nodes = DOM elements

Selasa, 12 Agustus 2014

Bermain-main dengan objek pada JavaScript

Pada 'dunia programming', banyak sekali saya temukan programmer instan. Saya mengatakan instan karena mereka tidak tau tentang filosofi dan prinsip scripting itu sendiri sehingga pemahaman mereka dangkal. Kebanyakan dari programmer instan memakai framework yang sudah jadi tanpa ingin tau apa yang terjadi didalamnya.

Memakai framework bukan merupakan hal yang salah tetapi tidak mengenal dasar script itu adalah sebuah hal yang salah. Dalam penulisan code juga ada satu konsep penulisan yaitu abstraction yang artinya menyembunyikan kerumitan. Mari kita ambil contoh tentang abstraction; seorang cewek pengendara mobil sangat tau bagaimana cara mengendarai mobil tanpa harus mengerti mobil. Tetapi jika terjadi kerusakan pada mobil (bug), maka dia tidak tau cara memperbaikinya dan lebih jauh karena tak mengerti, mobilnya ditinggal di jalan dan dia tidak sampai tujuan.

Ya... semua programmer memulai memang dari yang instan termasuk saya sendiri. Saya mempunyai latar belakan Teknik Sipil yang tak berhubungan sama sekali tentang programming. Tetapi kecintaan saya tentang komputer membawa saya banyak belajar programming sejak kuliah. Bahkan saya sudah mengenal dan menggunakan Linux dari tahun 2000 yang pada waktu itu RedHat 6. Dan bagi saya, programmer senior yang tidak update ilmunya hanyala senior dalam hal umur tetapi tidak dapat diandalkan. :D

Tulisan berikut tidak membahas tentang sejarah JavaScript maupun perintah-perintah dasar lainnya. Tulisan ini difokuskan pada objek pada Javascript melalui konsep 'permainan'. Dengan adanya 'permainan' ini saya harapkan me-refresh/meningkatkan pemahaman programmer tentang JavaScript sehingga mungkin saja bisa membuat framework JavaScript sendiri. :D

Silahkan persiapkan browser dan developerttools Anda untuk mengikuti permainanya.


Permainan 1. Membuat objek pada javascript dengan mendefinisikan objek kosong

//mendefinisikan objek kosong
var mobil = {};

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Permainan2. Mendefinisikan objek langsung dengan isinya

//mendefinisikan objek langsung dengan isinya
var mobil = {
    warna: "merah",
    roda: 3
};

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;



Permainan 3. Membuat objek turunan


//mendefinisikan objek langsung dengan isinya
var kendaraan = {
    warna: "kuning",
    roda: 2
};
var mobil = Object.create(kendaraan);

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Permaian 4. Menganal 'this'



Permaian 5. Pewarisan


//struktur nya kurang lebih begini
var kendaraan = function(data) {
    //private value
    var nama = data.nama || "tak ada nama",
            warna = data.warna || "tak ada warna",
            roda = data.roda || 0,
            getNama = function() {
                return nama;
            },
            setNama = function(namaBaru) {
                nama = namaBaru;
            },
            getWarna = function() {
                return warna;
            },
            setWarna = function(warnaBaru) {
                warna = warnaBaru;
            },
            getRoda = function() {
                return roda;
            },
            setRoda = function(jumlahBaru) {
                roda = jumlahBaru;
            },
            allData = function() {
                return nama + " - " + warna + " - " + roda;
            };
            
    //objek baru
    var that = {};
    that.getNama = getNama;
    that.getWarna = getWarna;
    that.getRoda = getRoda;
    that.setWarna = setWarna;
    that.setRoda = setRoda;
    
    return that;
};

//mendefinisikan data
var dataBajai = {
    nama: "Belalang Tempur",
    warna: "Kalabu cik kuciang",
    roda: 3
};

//mendefinisikan bajai
var bajai = kendaraan(dataBajai);


Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Demikian permaiannya dan mungkin tulisan berikutnya akan saya bahas tentang memanipulasi DOM dengan JavaScript agar bisa membuat halaman HTML lebih interaktif.

Minggu, 10 Agustus 2014

Trik mempercepat compiling dan running Maven project pada Tomcat 8

Membuat aplikasi java untuk website membutuhkan ketelitian dan kesabaran. Aplikasi yang dibuat tidak langsung berjalan setelah code diganti. Aplikasi harus di compile terlebih dahulu, upload ke server dan diletakkan pada path yang semestinya atau path yang dikenali oleh aplikasi server, misalnya; Tomcat.

Pada post terdahulu saya memberikan contoh bagaimana membuat server Git, pada post kali ini saya akan membuat bagaimana cara memanfaatkan server Git tersebut untuk mempercepat pekerjaan kita khususnya berkaitan dengan Maven project dan Tomcat 8.

Berikut langkah-langkahnya;

1. Buat repository project.
Ingat, repository project yang kita buat bukanlah bare repository.
Berikut saya akan mencontohkan dengan perintah clone;

~/project$ git clone /home/your_name/Documents/repository/project01.git

Jika repository tersebut sudah ada pada server, mungkin perlu perintah pull
~/project/project01$ git pull origin master



2. Update Maven dependencies

~/project/project01$ mvn dependency:resolve


3. Compile Maven.
Karena project Maven kita adalah project web, maka perlu meng-compile dengan hasil war

~/project/project01$ mvn compile war:war


4. Letakkan pada folder aplikasi Tomcat agar di deploy secara otomatis oleh Tomcat
Dan perlu diingat, user pemilik Tomcat harus sama dengan yang memiliki war. Dan biasanya project .war dapat ditemukan pada folder target

~/project/project01$ cd target
~/project/project01/target$ chown root:root project01.war
~/project/project01/target$ sudo cp project01.war /ke/folder/tomcat/webapps


5. Restart Tomcat

~/folder/tomcat8/bin$ sudo sh shutdown.sh
~/folder/tomcat8/bin$ sudo sh startup.sh

6. Finish!

Catatan: untuk mempelajari lebih lanjut tentang compiling pada Maven, klik link berikut

Jumat, 08 Agustus 2014

Service Oriented Architecture

Apakah itu Service Oriented Architecture (SOA)?
Pengertian Service secara bahasa adalah layanan. Tetapi pada penerapan TI di Indonesia juga digunakan istilah servis atau service. Untuk selanjutnya dalam tulisan ini akan digunakan istilah service.
Oriented dalam bahasa Indonesia dapat diartikan sebagai arah.
Sedangkan Architecture dalam bahasa Indonesia dapat diartikan sebagai rancangan.
Jadi pengertian Service Oriented Architecture menurut bahasa adalah arah perancangan/perencanaan dari sebuah layanan/service.
Sedangkan menurut OASIS[1], SOA adalah sebuah cara untuk mengatur, memanfaatkan dan mendistribusikan informasi/service dibawah domain/platform yang berbeda. Memberikan sebuah sarana standar untuk ditawarkan, ditemukan dan memberikan interaksi dengan service lain sehingga memberikan hasil baru sesuai dengan apa yang diharapkan.
unsur SOA oleh Krafzig Dirk, Karl Banke, dan Dirk Slamapng.png
Gambar 1. Unsur SOA oleh Krafzig Dirk, Karl Banke, dan Dirk Slama
Dengan kata lain SOA atau Service Oriented Arcitecture adalah sebuah teknik perancangan aplikasi dengan menggunakan kembali komponen-komponen (service) yang sudah ada sebelumnya untuk memberikan hasil baru sesuai dengan tujuannya seperti terlihat pada gambar 1diatas yang digambarkan oleh Krafzig Dirk, Karl Banke, dan Dirk Slama.
Dalam perancangan aplikasi, menggunakan SOA, aplikasi akan memanggil modul-modul yang sudah dibangun sebelumnya. Pendekatan modular ini bukanlah suatu hal baru. Teknik-teknik pemrograman terkini telah mengedepankan pendekatan modular dalam membangun aplikasi. Akan tetapi SOA berbeda dengan modular pembangunan aplikasi tersebut karena komponen (service) pada SOA dibangun dan berinteraksi dengan service lain secara bebas dan lepas (loose coupled).
Dengan bersifat loose coupled, sebuah service dapat di-panggil oleh program/service lainnya tanpa program pemanggil tersebut perlu memperhatikan di mana lokasi service yang dipanggil berada dan platform/teknologi apa yang digunakan oleh service tersebut. Loose coupling sangat penting bagi SOA karena dengan demikian pemanggilan sebuah service oleh service lainnya dapat dilakukan pada saat run-time seperti contoh penerapan SOA pada sebuah Bank.
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj38T9mX6BS1KYyCV0fCEydI9oIJKLg1TUhljQYcpFJWPV4UOakthRAUMPnVrMJGy29mhLnaQPPmWXb02WCww-11FvS1tCsASkejXPgURytqqvEPNfnq9V_5xJNuhFGEb3zz4fUgncDHJo/s400/SOA-04.gif
Gambar 2. Implementasi SOA pada sebuah Bank


Pada SOA, service terbagi atas beberapa layer seperti terlihat pada gambar 3, yaitu;
1.    Enterprice Service Layer,
2.    Domain Service Layer,
3.    Aplication Service Layer.
Setiap service dalam satu layer akan saling ber-interaksi dan setiap layer saling ber-interaksi dengan layer yang lainnya dan layer-layer ini dapat digabungkan kembali menjadi satu service baru.
soa-service.png
Gambar 3. Interaksi Antar Layer dalam Service Oriented Architecture[2]

Syarat dalam Penerapan SOA
Untuk memudahkan penerapan SOA, sistem yang dibutuhkan adalah;
§  Interoperabilitas, yaitu di antara sistem yang berbeda dan bahasa pemrograman yang menyediakan dasar untuk integrasi antara aplikasi pada platform yang berbeda melalui sebuah protocol komunikasi. Salah satu contoh komunikasi tersebut tergantung pada konsep yang diterapkan. Menggunakan sebuah konsep untuk menurunkan kompleknya sebuah aplikasi, sehingga memungkinkan pengembang aplikasi untuk fokus pada fungsionalitas aplikasi, dan tidak terfokus pada rumitnya requirement dari sebuah protokol komunikasi.
§  Membuat sebuah gabungan resource. Membangun dan mempertahankan aliran data ke system database gabungan. Hal ini memungkinkan fungsi baru dikembangkan sebagai referensi format bisnis untuk setiap elemen data.

Prinsip SOA
Berikut prinsip-prinsip dalam menetapkan aturan dasar bagi pengembangan, pemeliharaan, dan penggunaan SOA:
§  Penggunaan kembali (re-use), granularity, modularity, composability, komponenisasi dan interoperability.
§  Standar aturan secara umum dan standar aturan kebutuhan spesifik.
§  Identifikasi dan kategorisasi, pengadaan dan pengiriman, serta pemantauan dan pelacakan.
Berikut prinsip-prinsip arsitektur spesifik untuk desain dan service definisi fokus pada tema tertentu yang mempengaruhi perilaku intrinsik sistem dan gaya desain SOA:
§  Service enkapsulasi - jasa konsolidasi untuk penggunaan SOA. Seringkali service tersebut tidak direncanakan berada di bawah SOA.
§  Service loose coupling - Service menjaga hubungan yang meminimalkan keterkaitan antar resource dan berdiri sendiri untuk bisa dimanfaatkan oleh service lain.
§  Service rule – Aturan service yang harus dipatuhi berupa perjanjian/kontrak antara service, seperti yang didefinisikan bersama oleh  service-service dan dipadukan akan digabungkan kesalam satu dokumen kontrak/aturan service.
§  Service abstrak – Diluar aturan service, service menyembunyikan logika pemrogramannya dari dunia luar.
§  Service usability - Logika dibagi menjadi service-service dengan tujuan dapat digunakan kembali oleh service yang lain.
§  Service composability - Koleksi service dapat dikoordinasikan dan dirakit untuk membentuk service komposit (service gabungan).
§  Service autonomy - Service memiliki kendali atas proses didalam service tersebut (encapsulate).
§  Service optimation - Semua service berada pada posisi yang sama dengan service lain tetapi pemilihan service berkualitas tinggi lebih diutamakan oleh serive lain.
§  Service discoverability - Service harus dirancang agar mencirikan service itu sendiri sehingga dapat ditemukan oleh service lain yang membutuhkan service tersebut melalui aturan-aturan service yang telah ditetapkan.
§  Service relevansi - Fungsi service yang dihadirkan dapat dikenali oleh service lain sehingga dapat dipakai kemali.

Selain itu, ada faktor yang mempengaruhi user ketika menimplementasikan  SOA:
§  Efisiensi dalam penggunaan system resource.
§  Service mature atau service yang telah teruji dan kecepatan kinerja service.
§  EAI (Enterprise Application Integration)

Karakteristik Service dalam SOA
Pada SOA ada 2 karakteristik service seperti terlihat pada gambar 4.
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH4yIycbMDzWl97J0VYF98Te_u6FE9FB8EuiPbpeB9_AoSZxgOASG273gPIboIMeqc-Cgr7R6p7Z6fOIVnipINp33cSAn2-6SyXC8ChrFPX7wUhXXgR-lXHj5NKEQUoyvazx1nPkcue94/s400/SOA-08.gif
Gambar 4. Karakteristik dalam SOA
1.    Service Interface.
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiX40F8OBzOzufs5KgJVUbnPsY8YqLl9pH9ID1UeWn-TsBxIre3FOrmmXDIwa9ESlkPsiSbXLyFhD8Ld3xzTLEHsm0Kr4Zzuimw5WzyXOTV61ZRlz8tBPLh20hyphenhyphen7EaoRsLlCWIeNwfLCg/s400/SOA-05.gif
Gambar 5. Service Interface
Service interface menyatakan bagaimana service tersebut dapat dipanggil seperti parameter input/output (I/O) dan dimana lokasi parameter itu berada.
Misalkan, service interface untuk Customer Lookup menyatakan berbagai cara untuk mendapatkan informasi tentang seorang customer (dari id customer atau nama dan sebagainya) dan struktur data customer yang didapatkan seperti pada gambar 5. Service Implementation adalah bagaimana logic dari service customer lookup tersebut dijalankan.
2.    Service implementation.
Service Implementation  sangat terkait dengan teknologi pemrograman yang digunakan.
SOA tidak memperdulikan bagaimana sebuah service diimplementasikan.
Entah ditulis dengan bahasa PHP atau Java, yang penting adalah bagaimana service tersebut dapat dipanggil dan memberikan informasi sesuai dengan Service Interface-nya. Karakteristik SOA yang tercakup dalamservice implementation adalah service tersebut harus business oriented. Dalam arti, setiap service yang di inisiasikan harus melakukan suatu aktivitas bisnis tertentu, misalkan Customer Lookup, Fund Transfer, Check Inventory, dan sebagainya. Tidak dapat dipungkiri pula bahwa keberhasilan SOA belakangan ini ikut dimotori oleh tingginya penerimaan teknologi web services di kalangan pengembang aplikasi. Walaupun ide tentang SOA telah ada sebelum web services dilahirkan, web services dan SOA saat ini telah menjadi suatu sinergi dan bahkan beberapa kalangan menganggap dengan menggunakan web services maka ia telah menerapkan SOA. Tetapi ini adalah sebuah hal yang berbeda.


Penerapan Web Service dalam SOA
Web service merupakan salah satu penerapan SOA. Web service membangunan-blok fungsional yang dapat diakses melalui Internet Protokol standar independen dari platform dan bahasa pemrograman yang berbeda. Service ini dapat dinamakan sebuah aplikasi baru atau hanya mengemas sistem lama yang telah ada agar menjadi network-enable.
Setiap bagian SOA bisa menjalankan salah satu peran atau kedua peran dibawah:
1.   Service Provider - Operator selular menciptakan web service interface dan akses informasi ke registri web service tersebut. Setiap penyedia service yang harus memutuskan untuk mempublish informasi, bagaimana membuat trade-off antara keamanan dan kemudahan service, bagaimana harga service, atau (tidak dikenakan biaya) bagaimana / apakah untuk mengeksploitasi service untuk memberikan nilai informasi pada service lain. Penyedia juga harus memutuskan apa kategori service harus terdaftar dalam service yang diberikan penghubung dan perjanjian apa yang diperlukan untuk menggunakan service ini. Register service apa saja yang tersedia di dalamnya, dan daftar semua penerima potensial dari service. Penghubung (operator/link/communicator/broker) kemudian memutuskan lingkup hubungan. Penghubung publik tersedia melalui Internet, sementara private broker hanya dapat diakses oleh tingkatan tertentu, misalnya, pengguna intranet perusahaan. Selain itu, harus diputuskan jumlah informasi yang akan diberikan. Beberapa broker mengkhususkan diri pada banyak listing. Lainnya menawarkan informasi yang banyak pada service terdaftar dalam service tersebut. Beberapa lanskap yang luas mencakup jasa dan lain-lain fokus dalam industri. Beberapa broker katalog broker lain. Tergantung pada model bisnis, broker dapat mencoba untuk memaksimalkan melihat, permintaan, jumlah listing atau keakuratan dari daftar. The Universal Deskripsi Discovery dan Integrasi (UDDI) mendefinisikan spesifikasi cara untuk mempublikasikan dan menemukan informasi tentang Web Service. Broker service teknologi lainnya (misalnya) ebXML(Elektronik Bisnis menggunakan Extensible Markup Language) dan mereka berdasarkan ISO / IEC 11179 Metadata Registry (MDR) standar.
2.   Service konsumen - konsumen service atau web service klien menempatkan entri dalam registri menggunakan berbagai broker menemukan operasi dan kemudian mengikat ke penyedia service untuk meminta salah satu web service. Apapun service-service konsumen perlu, mereka harus bawa ke broker, lalu mengikatnya dengan service masing-masing dan kemudian menggunakannya. Mereka dapat mengakses beberapa service jika service ini menyediakan berbagai service.
Penerapan SOA melalui web service seperti pada gambar 6.
SOA.gif
Gambar 6. Penerapan SOA melaui Web Service sebagai sentralisasi service[3]


Manfaat Penerapan SOA
Beberapa arsitek perancang IT perusahaan percaya bahwa SOA dapat membantu perusahaan merespon lebih cepat dan biaya-efektif terhadap perubahan kondisi pasar. Ini gaya arsitektur mempromosikan penggunaan kembali di makro (layanan) daripada tingkat mikro (kelas) tingkat. Hal ini juga dapat mempermudah interkoneksi - dan penggunaan - TI yang ada.
Dalam beberapa hal, seseorang bisa menganggap SOA sebagai evolusi arsitektur daripada sebagai revolusi. Ia menangkap banyak praktik terbaik dari arsitektur perangkat lunak sebelumnya. Dalam sistem komunikasi, misalnya, pembangunan sedikit telah terjadi solusi yang menggunakan binding statis benar-benar bicara dengan peralatan lainnya dalam jaringan. Dengan resmi merangkul pendekatan SOA, sistem seperti ini dapat memposisikan diri untuk menekankan pentingnya yang terdefinisi dengan baik, antar-beroperasi antarmuka yang sangat.
Banyak orang mempertanyakan apakah SOA hanya menghidupkan konsep seperti pemrograman modular (1970), desain berorientasi event (1980) atau antarmuka / desain berbasis komponen (1990)? SOA mempromosikan tujuan memisahkan pengguna (konsumen) dari implementasi layanan. Layanan sehingga dapat berjalan pada berbagai platform didistribusikan dan diakses melalui jaringan. Ini juga bisa memaksimalkan penggunaan kembali layanan.
SOA adalah sebuah disiplin dan desain arsitektur disusun untuk mencapai tujuan interoperabilitas meningkat (pertukaran informasi, usabilitas, dan composability), meningkat federasi (sumber daya pemersatu dan aplikasi sambil mempertahankan otonomi masing-masing dan self-governance), dan meningkatkan bisnis dan domain penyelarasan teknologi.
Service-Oriented Architecture (SOA) merupakan suatu pendekatan arsitektur (atau gaya) untuk membangun sistem perangkat lunak-intensif kompleks dari seperangkat universal yang saling berhubungan dan saling tergantung pada setiap blok.
SOA menyadari bisnis dan TI manfaat melalui memanfaatkan metodologi analisis dan desain pada saat jasa membuat. metodologi ini memastikan bahwa layanan tetap konsisten dengan visi dan roadmap arsitektur, dan bahwa mereka mematuhi prinsip-prinsip pelayanan-orientasi. Argumen yang mendukung aspek bisnis dan manajemen dari SOA diuraikan dalam berbagai publikasi.
Sebuah layanan terdiri dari unit yang berdiri sendiri dari fungsi yang tersedia hanya melalui antarmuka yang ditetapkan secara formal. Layanan dapat menjadi semacam "perusahaan-nano" yang mudah untuk memproduksi dan memperbaiki. Juga layanan dapat "mega-korporasi" dibangun sebagai karya terkoordinasi layanan sub-ordinat.
Sebuah peluncuran matang SOA efektif mendefinisikan API sebuah organisasi.
Alasan untuk memperbaiki pelaksanaan service sebagai proyek terpisah dari proyek yang lebih besar meliputi:
1.   Pemisahan mempromosikan konsep ke layanan bisnis yang dapat disampaikan dengan cepat dan bergerak secara independen dari proyek-proyek yang lebih besar dan lebih lambat-umum dalam organisasi. bisnis mulai memahami sistem dan user interface yang disederhanakan meminta layanan. Ini memberikan peningkatan perfomance. Artinya, itu mendorong inovasi bisnis dan mempercepat waktu ke pasar.
2.   Pemisahan mempromosikan decoupling layanan dari proyek. Hal ini mendorong desain yang baik sepanjang layanan dirancang tanpa mengetahui siapa konsumen perusahaan.
3.   Dokumentasi dan artefak uji layanan tidak tertanam dalam detail dari proyek yang lebih besar. Hal ini penting pada saat jasa harus digunakan kembali nanti.

  


Referensi
1.    Barry & Associates, Inc., Januari 2010, http://www.service-architecture.com/
3.    OASIS Organization on Wikipedia, Juli 2010, http://en.wikipedia.org/wiki/OASIS_(organization).


[1] Sebuah Organisasi Ahli untuk Standar Struktur Information atau Organization for the Advancement of Structured Information Standards (OASIS)

Cara Mengetahui Besar Database PostgreSQL Tanpa Mendownloadnya

Berikut adalah langkah-langkah untuk mengetahui ukuran semua database di instance PostgreSQL yang berjalan di dalam kontainer Docker: 1. Men...