Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

SSH dengan JSch

Mengakses Remote Server dengan Java

Kita sudah biasa mengakses komputer lain menggunakan SSH. Cukup ketikkan ssh username@namaserver, tekan enter, dan lakukan apa yang kita mau. Nah, bagaimana kalau kita ingin membuat aplikasi yang butuh mengakses komputer lain? Misalnya, kita ingin membuat aplikasi sederhana yang menampilkan input IP Address, Username, Password serta tombol Shutdown. Begitu input field kita isi dan tombol Shutdown ditekan, aplikasi kita akan melakukan ssh ke komputer tersebut dan menjalankan perintah shutdown -h now.

Di Java, hal ini dapat dengan mudah dilakukan menggunakan pustaka JSch. Berikut langkah-langkah untuk menggunakan JSch.

Mendapatkan Pustaka JSch

Tentunya yang pertama kita lakukan adalah membuka website JSch dan mengunduh rilis terbaru. Pilih yang ZIP, jangan yang JAR, karena di dalamnya ada beberapa contoh penggunaan yang akan kita butuhkan untuk mencontek nantinya.

Paket ZIP ini belum dikompilasi, dan kita membutuhkan Ant untuk melakukan proses build. Jika Anda belum pernah menggunakan Ant, baca dulu tutorial ini. Setelah proses build selesai dilakukan, akan muncul file *jar di dalam folder dist.

Template Aplikasi Java

Buatlah project Java menggunakan editor yang Anda sukai. Pastikan jar JSch sudah terdaftar di project Java yang barusan dibuat. Setelah itu, buatlah Java Class sebagai berikut

public class JschDemo {
    public static void main(String[] args) throws Exception {

    }
}

Untuk selanjutnya, kode program akan ditulis di dalam method main.

Parameter koneksi

Untuk melakukan koneksi ke komputer lain, kita memerlukan beberapa variabel, ditunjukkan dengan kode sebagai berikut.

String host = "localhost";
String user = "endy";
String pass = "java";
String command = "shutdown -h now";

Kita akan melakukan koneksi ke komputer kita sendiri (localhost) dengan username endy dan password java. Setelah berhasil terhubung, kita akan menjalankan perintah shutdown -h now.

Pre Requisite

Agar kode program kita bisa dijalankan, ada beberapa persyaratan sebagai berikut:

  • Komputer yang ingin dihubungi harus menjalankan SSH server

  • Komputer yang ingin menghubungi harus melakukan koneksi SSH secara manual terlebih dulu, agar komputer tujuan terdaftar di file known_hosts

  • User yang digunakan untuk koneksi harus memiliki akses yang cukup untuk melakukan perintah yang diinginkan

Menggunakan JSch

Setelah parameter koneksi kita deklarasikan, dan juga prasyarat di komputer tujuan dipenuhi, sekarang kita bisa mulai menggunakan JSch. Pertama, kita instankan dulu object dari class JSch.

JSch jsch = new JSch();

Kemudian, kita berikan database known_hosts, yaitu daftar komputer tujuan beserta public keynya. Ini berguna untuk melakukan verifikasi terhadap komputer tujuan.

jsch.setKnownHosts("/home/endy/.ssh/known_hosts");

File known_hosts ini akan otomatis dibuat bila kita melakukan koneksi SSH ke komputer lain. Itulah sebabnya kita harus melakukan koneksi manual terlebih dulu, sehingga public key komputer tujuan sudah terdaftar dalam file ini. Alternatif dari menggunakan file ini adalah mendaftarkan public key di komputer tujuan dan menggunakan private key untuk login.

Selanjutnya, kita membuka koneksi ke komputer tujuan

Session session = jsch.getSession(user, host);
session.setPassword(pass);
session.connect();

Lalu, kita membuka channel. Channel menggambarkan bentuk interaksi kita dengan komputer tujuan. JSch menyediakan beberapa jenis channel, misalnya exec dan shell. Kita menggunakan exec untuk mengeksekusi satu perintah saja. Sedangkan shell bisa digunakan untuk membuka terminal interaktif yang bisa kita berikan perintah sebanyak kita mau.

ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.connect();

Kita bisa membaca output dari perintah yang kita jalankan menggunakan I/O Stream seperti biasa.

BufferedReader reader = new BufferedReader(new InputStreamReader(channel.getInputStream()));
String output = reader.readLine();
while (output != null) {
    System.out.println(output);
    output = reader.readLine();
}
reader.close();

Segera setelah perintah selesai dijalankan, kita mengakhiri channel dan session.

channel.disconnect();
session.disconnect();

Berikut adalah keseluruhan kode program.

public class JschDemo {

    public static void main(String[] args) throws Exception {
	String host = "localhost";
	String user = "endy";
	String pass = "java";
	String command = "shutdown -h now";

        JSch jsch = new JSch();
        jsch.setKnownHosts("/home/endy/.ssh/known_hosts");

        Session session = jsch.getSession(user, host);
        session.setPassword(pass);
        session.connect();

        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(command);
        channel.connect();

        BufferedReader reader = new BufferedReader(new InputStreamReader(channel.getInputStream()));
        String output = reader.readLine();
        while (output != null) {
            System.out.println(output);
            output = reader.readLine();
        }
        reader.close();

        channel.disconnect();
        session.disconnect();

    }
}

Selamat mencoba. Bila percobaan Anda sukses, komputer yang sedang Anda gunakan akan shutdown setelah aplikasi selesai dijalankan. :D


Upgrade Ubuntu

Sebentar lagi Ubuntu terbaru akan rilis. Seperti biasanya, saya akan menjalankan ritual 6 bulanan yang terdiri dari kegiatan sbb:

  • Unduh ISO Ubuntu terbaru

  • Bakar ke CD

  • Backup isi home folder

  • Backup mailbox Thunderbird

  • Remove semua hidden file di home folder

  • Reinstall Ubuntu dengan memformat partisi sistem

Saya tidak terlalu suka upgrade, karena banyak menyisakan sampah dan jebakan. Lebih nyaman dan cepat memformat partisi sistem daripada troubleshoot hasil upgrade.

Karena ritual ini akan terus dilakukan di masa depan, ada baiknya kita optimasi workflownya agar lebih efisien.

Berikut adalah requirement saya untuk workflow upgrade ini:

  • Saya memiliki beberapa aplikasi yang mandatory tapi tidak termasuk dalam paket default Ubuntu, seperti Java SDK, Thunderbird, Inkscape, dan beberapa aplikasi lain. Saya ingin menyimpan daftar aplikasi ini, dan me-reuse-nya setiap kali upgrade.

  • Saya ingin memisahkan proses download *.deb yang memakan waktu lama dengan proses instalasi aplikasi. Tujuannya, agar proses download *.deb ini bisa ‘dititipkan’ di komputer lain yang online 24/7. Setelah selesai, hasilnya tinggal dicopy ke komputer saya, dan langsung diinstal

Setelah browsing kesana kemari, akhirnya saya mendapatkan workflow yang sesuai, sebagai berikut.

  • Buat dulu daftar paket yang ingin diinstal, dari instalasi Ubuntu yang sekarang

  • Lakukan proses instalasi

  • Buat daftar URL untuk mengunduh *.deb menggunakan Ubuntu yang baru diinstal

  • Jalankan proses unduh di komputer lain yang online 24/7

  • Setelah selesai, pindahkan hasilnya ke komputer ber-Ubuntu baru, dan instal

Membuat daftar aplikasi

Daftar aplikasi yang terinstal di komputer yang kita pakai sekarang dapat didapatkan dengan menjalankan perintah berikut di command prompt.

dpkg --get-selections | sed -n 's/^\(.*\)\tinstall$/\1$/p' | cut -f1 > daftar_aplikasi.txt

Buka file daftar_aplikasi.txt dengan Text Editor dan buang aplikasi yang terinstal secara default. Setelah diedit, file saya berisi sebagai berikut.

ttf-inconsolata
ttf-droid
nautilus-open-terminal
mc
chmsee
unrar
comix
keepassx
subversion
git-svn
gimp
network-manager-openvpn
network-manager-openvpn-gnome
network-manager-pptp
network-manager-pptp-gnome
network-manager-vpnc
network-manager-vpnc-gnome
openssh-server
gnome-alsamixer
vlc
rtorrent
hamster-applet
timer-applet
inkscape
mysql-server
mysql-query-browser
mysql-admin
sun-java6-jdk
ubuntu-restricted-extras
build-essential
ant

Proses Instalasi

Tidak ada yang istimewa dari proses instalasi. Berikut checklist yang saya gunakan:

  • Backup isi home folder

  • Backup mailbox Thunderbird, biasanya ada di folder .mozilla-thunderbird

  • Remove semua hidden file dan folder di home. File hidden ini berisi konfigurasi aplikasi yang terinstal. Kita tidak ingin sistem baru kita menggunakan konfigurasi lama. Nanti jadi tidak terlihat barunya.

  • Reinstall Ubuntu dengan memformat partisi sistem

  • Edit /etc/apt/sources.list agar menggunakan mirror lokal. Saya biasa menggunakan kambing.ui.ac.id

  • Jalankan apt-get update untuk mengupdate database aplikasi

Berikut isi file /etc/apt/sources.list saya.

deb http://kambing.ui.ac.id/ubuntu/ intrepid main restricted universe multiverse
deb http://kambing.ui.ac.id/ubuntu/ intrepid-updates main restricted universe multiverse
deb http://kambing.ui.ac.id/ubuntu/ intrepid-security main restricted universe multiverse

Setelah install ulang, file ini akan menjadi seperti ini

deb http://kambing.ui.ac.id/ubuntu/ jaunty main restricted universe multiverse
deb http://kambing.ui.ac.id/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://kambing.ui.ac.id/ubuntu/ jaunty-security main restricted universe multiverse

Segera setelah database aplikasi kita up-to-date, kita bisa lanjut ke langkah berikutnya.

Membuat daftar URL untuk download

Jalankan perintah berikut di command prompt.

cat daftar_aplikasi.txt |  tr '\n' ' '| xargs apt-get install -qq --print-uris | cut -d\' -f2 > daftar_url.txt

Perintah ini akan menghasilkan file daftar_url.txt, yang berisi daftar URL file *.deb yang dibutuhkan untuk instalasi.

Mengunduh *.deb

Berbekal daftar_url.txt, kita bisa segera menjalankan proses pengunduhan di komputer lain yang online 24/7. Komputer ini tidak perlu menjalankan Ubuntu terbaru. Bahkan tidak harus menjalankan Linux.

Jika komputer tersebut juga menjalankan Linux, maka kita bisa menggunakan wget dengan perintah sebagai berikut.

wget -b -c -nc -o donlod-ubuntu.log -i daftar_url.txt

Proses pengunduhan dapat dipantau dengan melihat isi file donlod-ubuntu.log. Gunakan perintah tail seperti ini.

tail -f donlod-ubuntu.log 

Tekan Ctrl+C untuk keluar dari tail.

Proses ini akan menghasilkan banyak file *.deb di folder tempat kita menjalankan perintah wget tadi. Setelah semua file didapatkan, copy ke komputer kita yang baru diinstal tersebut.

Instalasi *.deb

Copy semua file *.deb ke folder /var/cache/apt/archives di komputer berUbuntu baru. Selanjutnya kita lakukan proses instalasi dengan mengetik perintah berikut di command prompt.

cat daftar_aplikasi.txt  |  tr '\n' ' '| xargs apt-get install -y

Tunggu sejenak sampai selesai.

Replikasi Instalasi

Bagaimana jika kita disuruh melakukan instalasi identik di banyak komputer sekaligus? Gampang, berikut caranya.

Instal salah satu komputer sampai selesai. Lengkapi semua aplikasi yang dibutuhkan. Segera setelah selesai, extract daftar aplikasi yang terinstal menggunakan perintah berikut.

dpkg --get-selections > daftar_instalasi.txt

Copy file daftar_instalasi.txt ini berikut isi folder /var/cache/apt/archives/ ke komputer berikut yang akan diinstal.

Di komputer berikut, copy file *.deb ke folder /var/cache/apt/archives/. Lalu jalankan perintah berikut untuk mengisi daftar instalasi.

sudo dpkg --set-selections < daftar_instalasi.txt

Setelah itu, jalankan perintah berikut untuk memulai proses instalasi.

sudo apt-get dselect-upgrade

Semoga bermanfaat.


Intro jQuery

Jaman sekarang, membuat tampilan menarik di aplikasi web sudah tidak sulit lagi. Banyak pustaka JavaScript yang siap digunakan dengan mudah. Tidak perlu lagi kita memusingkan keragaman browser dengan keanehannya masing-masing.

Salah satu pustaka JavaScript yang populer adalah jQuery. Berbeda dengan pustaka JavaScript lainnya, jQuery tidak menawarkan komponen UI yang aneh-aneh. Demikian juga dengan efek visual, hanya tersedia sekenanya saja. Dengan demikian, jQuery berukuran relatif kecil dan mudah dipelajari.

Akan tetapi, di balik kesederhanaan tersebut tersimpan kecanggihan arsitekturnya. Dengan arsitektur yang rapi ini, orang mudah membuat plugin untuk menambah kemampuan jQuery. Hasilnya, ada jQuery UI dengan koleksi komponen UI yang kaya. Ada juga jqGrid dengan komponen tabelnya yang canggih.

Pada tutorial ini, kita akan mempelajari dasar-dasar pemrograman JavaScript menggunakan jQuery. Setelah menguasai dasar-dasarnya, kita akan mampu menggunakan berbagai teknik tingkat tinggi seperti AJAX dan efek visual. Kita juga akan mudah mempelajari dan menggunakan berbagai komponen dan plugin yang tersedia.

Pada intinya, penggunaan jQuery terdiri dari dua langkah sederhana :

  1. Mendapatkan elemen HTML yang ingin kita gunakan
  2. Menambahkan behavior pada elemen HTML yang sudah didapatkan.

Sebagai contoh kasus, kita akan membuat kalkulator sederhana yang tampilannya seperti ini: (/images/uploads/2009/03/kalkulator-jquery.png)

Berikut adalah kode HTML untuk membuat kalkulator tersebut.

<html>
  <head>
    <title>Kalkulator jQuery</title>
  </head>
  <body>
    <h1>Kalkulator jQuery</h1>

    <input name="num1"> * <input name="num2">
    <input type="button" id="hitung" value="=">
    <input name="hasil" disabled="true">
        
  </body>
</html>

Dari screenshot di atas kita sudah bisa menebak cara kerja halaman web tersebut. Bila tombol = ditekan, maka nilai yang ada di input num1 dan num2 akan dibaca dan dikalikan. Kemudian hasilnya akan ditampilkan di input hasil.

jQuery menganjurkan kita untuk mengikuti prinsip unobtrusive javascript, yang artinya tidak menambahkan event pada kode HTML.

Bila kita tidak mengikuti prinsip ini, biasanya kita akan langsung menambahkan event di tombol = seperti ini

<input type="button" id="hitung" value="=" onclick="alert('Hello World');">

Dengan prinsip unobtrusive javascript, kode HTML untuk tampilan dibiarkan apa adanya. Event onclick akan kita tambahkan di kode JavaScript yang bisa dipasang di blok head secara inline (ditulis langsung), ataupun dikeluarkan ke file tersendiri.

Pada contoh ini, kita akan menulis inline supaya lebih mudah.

Instalasi jQuery

Sebelum kita melakukan apa-apa, terlebih dulu halaman kalkulator tersebut harus bisa mengakses jQuery. Tambahkan baris berikut pada blok head.

<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>

Pastikan lokasi file jQuery.js sudah benar.

Setelah itu, biasanya kita akan menambahkan kode program JavaScript yang akan dijalankan setelah seluruh halaman selesai diload oleh browser. Tentunya kita tidak ingin menambahkan event pada elemen yang belum selesai diload.

Berikut adalah blok standar untuk meletakkan kode JavaScript kita.

<script type="text/javascript">
    $(function(){
        
    });
</script>

Event onclick

Langkah pertama yang kita lakukan adalah menambahkan event ke tombol =. Agar bisa melakukannya, kita harus mendapatkan tombol tersebut. Kalau kita perhatikan kode HTML di atas, tombol = memiliki ID yang berisi nilai hitung. Atribut ID harus unik dalam satu halaman HTML. Dengan demikian, kita bisa langsung mendapatkan tombol = dengan menggunakan IDnya. Setelah tombol didapatkan, kita bisa langsung menggunakan function click untuk menambahkan event onclick. Berikut adalah kode programnya.

<script type="text/javascript">
    $(function(){
        $("#hitung").click();
    });
</script>

Dalam JavaScript, kita bisa memasukkan function sebagai parameter dalam function lain. Bagi mereka yang sudah pernah coding C atau C++, pasti sudah tidak asing dengan teknik ini, biasa disebut function pointer dalam C atau C++.

Nah, mari kita isikan function sebagai parameter untuk function click, seperti ini :

<script type="text/javascript">
    $(function(){
        $("#hitung").click(function(){
            
        });
    });
</script>

Selanjutnya, kita tinggal mengimplementasikan logika kode program kita, yaitu :

  1. ambil nilai num1
  2. ambil nilai num2
  3. kalikan num1 dan num2
  4. hasilnya isikan ke input text hasil

Selector name

Fitur jQuery untuk menunjuk elemen HTML tertentu disebut selector. Pada penambahan event onclick di atas, kita sudah menggunakan selector berdasarkan ID. Sekarang, kita akan menggunakan selector atribut untuk memilih input dengan atribut name berisi num1, num2, dan hasil. Berikut kode program implementasi dari logika di atas.

<script type="text/javascript">
    $(function(){
        $("#hitung").click(function(){
            var num1 = $("input[name=num1]").val();
            var num2 = $("input[name=num2]").val();
            $("input[name=hasil]").val(num1 * num2);
        });
    });
</script>

Kesimpulan

Silahkan buka kalkulator.html di browser, dan coba apakah sudah bekerja dengan benar.

Secara garis besar, pemakaian jQuery dapat dijelaskan dengan satu kalimat,

pilih elemen menggunakan selector, lalu manipulasi sesuai keinginan

Setelah memahami artikel ini, kita bisa mengembangkan kemampuan kita dalam menggunakan jQuery, diantaranya:

  • mempelajari berbagai selector selain id dan atribut. jQuery memiliki banyak sekali selector yang bisa digunakan

  • menggunakan berbagai event lain selain onclick, misalnya onfocus, onchange, dsb

  • operasi elemen selain mengeset value, misalnya menambahkan isi elemen, mengakses server dengan AJAX, dsb

  • menggunakan plugin-plugin jQuery misalnya Date Picker, Tab, jqGrid, dan sebagainya

  • membuat plugin sendiri


Spring Build

Martinus dan Ifnu kalo baca ini pasti merasa familiar dengan struktur folder dan prosesnya.

Saya gak nyontek lho … :p


Null Date di MySQL

Null Date di MySQL

Bila memiliki tipe data DATE di database MySQL, format standarnya adalah yyyy-MM-dd. Jadi, bila kita mau mengisi 17 Agustus 1945, kita lakukan seperti ini

INSERT INTO hari_besar_nasional (tanggal, keterangan)
VALUES ('1945-08-17', 'Hari Kemerdekaan RI');

Bila kita tidak mengisikan tanggal alias NULL, maka MySQL akan mengisi kolom tersebut dengan nilai 0000-00-00. Sayangnya, nilai ini tidak diterima dengan baik oleh driver JDBC MySQL.

Berikut contoh kode program dalam Java

String sql = "select * from hari_besar_nasional";
ResultSet rs = connection.createStatement().executeQuery(sql);

while(rs.next()){
  System.out.println("Tanggal : "+rs.getDate("tanggal");
  System.out.println("Keterangan : "+rs.getString("keterangan");
}

rs.close();

Jika ada data yang berisi 0000-00-00, maka akan terjadi exception sebagai berikut:

java.sql.SQLException: Cannot convert value ‘0000-00-00 00:00:00’

Masalah ini dijelaskan di dokumentasi MySQL ini.

Solusinya adalah mengganti parameter koneksi database, yang tadinya seperti ini :

jdbc:mysql://localhost/nama_database

menjadi seperti ini

jdbc:mysql://localhost/nama_database?zeroDateTimeBehavior=convertToNull