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.

Hello Hibernate Annotation

Adanya fitur annotation di Java 5 membuka dunia baru bagi para coder Java. Dulu semua metadata mau tidak mau harus disimpan di XML file. Sekarang ada pilihan baru, kita bisa taruh di XML file, atau juga bisa di source code melalui annotation.

Salah satu implementasinya adalah annotation untuk hibernate untuk mendefinisikan mapping Hibernate. Sekarang kita tidak perlu lagi membuat *.hbm.xml untuk menyatakan mapping antara Java class dengan tabel di database.

Mari kita lihat kodenya.

Category.java

package id.web.endy.tutorial;

public class Category {
  private Integer id; 
  private String name;
  private String description; 

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public Integer getId() {
    return id;
  }
	
  public void setId(Integer id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Class di atas akan kita simpan ke database dengan skema tabel (MySQL) sebagai berikut:

Category-ddl.sql

CREATE TABLE Category (
  id INT PRIMARY KEY AUTO_INCREMENT, 
  name VARCHAR(255), 
  description VARCHAR(255)
);

Sebelum jaman annotation, kita harus buat mapping file sebagai berikut.

Category.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    
<hibernate-mapping>
  <class name="id.web.endy.tutorial.Category" table="Category">
    <id name="id" column="id">
      <generator class="auto"/>
    </id>
    <property name="name" column="name"/>
    <property name="name" column="description"/>
</class>
</hibernate-mapping>

Tapi dengan menggunakan annotation, kita bisa lupakan file Category.hbm.xml. Sebagai gantinya, kita tambahkan sedikit annotation pada class Category sebagai berikut

Category.java dengan Annotation

package id.web.endy.tutorial;

@Entity
public class Category {
  private Integer id; 
  private String name;
  private String description; 

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  @Id(generate=GeneratorType.AUTO)
  public Integer getId() {
    return id;
  }
	
  public void setId(Integer id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Perbedaan pada kode di atas cuma dua baris saja, yaitu:

  • @Entity
  • @Id(generate=GeneratorType.AUTO)

Selain untuk property dan id biasa, hibernate annotation juga dapat digunakan untuk one-to-many, many-to-many, dan teknik-teknik advanced lainnya.


Booklet Printing

Jika Anda adalah kolektor PDF obsesif-kompulsif seperti saya, pasti cepat atau lambat Anda akan mencari cara yang paling efektif untuk mencetak koleksi PDF tersebut.

Misalnya, kita punya Tutorial PHP-MySQL seperti pada gambar berikut

Modul PHP

Berhubung ada 81 halaman di file tersebut, kita ingin menghemat kertas dengan cara print bolak balik. Selain itu, kita juga mau cetak 2 halaman per lembar, sehingga yang tadinya seperti ini

Normal Page Print

menjadi seperti ini

Two Sheet per Page

Tapi sebetulnya, ada lagi yang lebih optimal, yaitu teknik yang dikenal dengan nama keren “booklet printing”, menjadikan susunan halaman menjadi seperti ini:

Booklet Print

Saya pernah membuat buku dengan cetakan seperti itu menggunakan printer Canon di Windows. Driver printer Canon tersebut sudah menyertakan fasilitas untuk melakukan booklet printing. Tetapi kalau menggunakan printer selain Canon, yah kita harus cari cara lain.

Setelah googling ke sana kemari, dengan menggunakan keyword “booklet printing kprinter”, akhirnya saya berhasil menemukan tutorial ini, yang menjelaskan cara melakukan booklet printing dengan KDE. Berikut langkah-langkahnya, saya contohkan dengan Acrobat Reader.

1. Buka Print Dialog, pilih kprinter sebagai print command, dan tekan Print

Acrobat Reader Print Dialog

2. Dialog KPrinter muncul, klik tombol Properties di pojok kanan atas

KPrinter Dialog

3. Pilih tab Filter, kemudian tambah filter baru dengan cara menekan tombok corong

KPrinter Properties

4. Tambah filter baru dengan cara menekan tombol corong

Untuk tahap pertama, yang dipilih adalah Pamphlet Printing - Even Page (step 1)

Pamphlet Printing - Even Page (step 1)

5. Balikkan kertas

Setelah hasil print keluar, balikkan susunan kertas dan letakkan kembali di printer. Untuk tahap ini, kita perlu trial-and error untuk mendapatkan teknik yang tepat. Coba print halaman 1-8 dulu sebagai percobaan.

6. Print sekali lagi

Lakukan langkah 1-6, dengan sedikit perbedaan. Pada langkah #6, pilih Pamphlet Printing - Odd Page (step 2)

Pamphlet Printing - Odd Page (step 2)

Selesai. Sekarang tinggal diberikan ke tukang jilid. :D


Debian Sarge vs OpenSuSE 10.0

Di kantor saya ada PC berkualifikasi cukup canggih untuk ukuran workstation. Spesifikasinya P-4 3GHz HT, 4GB DDR, 2x80GB SATA, DVD RW. PC tersebut sebetulnya dibeli untuk menjadi server. Tetapi karena dia terlambat datang, semua aplikasi server sudah terinstal di mesin lain dan sudah terisi banyak data. Sebelum sempat semua data tersebut dimigrasi, tugas lain buat saya sudah datang bertubi-tubi, sehingga alhasil tidak sempat migrasi. Akhirnya, PC server tersebut turun kasta menjadi ‘sekedar pembakar DVD saja’.

Sejak menjadi pembakar DVD, effort untuk migrasi menjadi semakin sulit. Karena banyak oknum-oknum yang pinjam untuk membackup data. Kalau sekedar pinjam saja tidak masalah, tetapi kadang data yang mau dibackup dicopy dan tidak dibakar-bakar, sehingga semakin sulit untuk reinstall PC tersebut.

Kenapa harus reinstall? Hmm, saya menggunakan Software-RAID dan LVM untuk mempartisi server tersebut, berjalan di atas Debian Sarge. Kernel yang digunakan Debian Sarge (pada waktu saya instal PC tersebut) adalah 2.6.8, sedangkan dukungan LVM baru ada di 2.6.13. Jadi, terpaksa menggunakan kernel 2.4.sekian yang sudah bisa menangani LVM. Tapi dengan kernel tersebut, memori yang didukung cuma maksimal 1GB, sehingga sisanya 3GB lagi makan gaji buta. Dengan demikian, solusi yang paling feasible adalah instal ulang dengan distro lain. Buat linux-mania yang sedang siap-siap tulis komentar, tidak usah repot-repot, “Saya tidak akan kompile kernel, terimakasih…. “

Berdasarkan anjuran teman saya, saya pilih OpenSuSE 10.0. Selain paketnya lebih maju daripada Debian, mirrornya juga ada di Indonesia. Belakangan saya tau kalo di CBN itu gak komplit. Tapi sudah terlambat … :P

Jadi akhirnya saya lakukan juga migrasi ke OpenSuSE. Berikut adalah daftar aplikasi yang ingin dimigrasi:

  • Repository Subversion dengan sebesar 5GB

  • Bug Database

Konfigurasi server:

  • RAID + LVM

  • HTTPS

  • LDAP Authentication

  • PHPLDAPAdmin

Dan berikut adalah langkah-langkah migrasinya

  1. Install subversion, jangan lupa buat group repousers dan mask-script
  2. Install apache2
  3. Dump data repository dari repo lama
  4. Create repository di tempat baru, dan load hasil dump

  5. Dump data otentikasi (username dan password) dari OpenLDAP yang lama slapcat -c -l data-otentikasi.ldif

  6. Config slapd.conf
  • suffix = artivisi.com

  • disable rootdn dan rootpw. Di Debian tidak ada entri ini. Entri ini menyebabkan saya (entah kenapa) tidak bisa login, padahal username dan password sudah benar

  • access level

  1. Load data otentikasi ke OpenLDAP yang baru slapadd -c -l data-otentikasi.ldif

  2. Konfigurasi Apache:

  • Add user untuk apache (di OpenSuSE 10.0 namanya wwwuser, kalo di Debian www-data) dalam grup repousers

  • Buat file svn.conf di folder conf.d

  • Instalasi Subversion bawaan OpenSuSE 10.0 tidak ada mod_dav_svn.so dan mod_authz_svn.so, jadi copy aja dari Debian

  • Selanjutnya sama dengan tulisan saya sebelumnya

  1. Instalasi PHPLDAPAdmin.
  • Download di websitenya. Paket standar OpenSuSE tidak menyertakan, tidak seperti apt-get

  • Extract dan edit config.php

  • Install php-session bila ketemu error session_module_name() not found

  1. Aktifkan https

Kesimpulan akhir:

  1. Paket instalasi apt-get di rumahnya Si Komo masih belum terkalahkan. Untuk menginstal aplikasi demi aplikasi di OpenSuSE, saya harus menjadi human-cd-changer. Mirror sih ada, tapi internasional semua, sangat lemot dari tempat saya.

  2. Entah salah setting atau gimana, kecepatan komputer tidak se-responsif ekspektasi saya.

  3. Paket aplikasi Debian masih jauh lebih kuno daripada OpenSuSE. Misalnya OpenOffice, di Debian masih versi 1, sedangkan di distro lain sudah versi 2.

  4. Dukungan hardware OpenSuSE lebih banyak.

  5. Konfigurasi grafis disediakan dalam Yast, tapi modifikasi manual masih memungkinkan.


Belajar Java, mulai dari mana?

Ini adalah pertanyaan yang paling sering ditanyakan ke saya, baik melalui Y!, email, ataupun tatap muka di kelas.

Saya sendiri belajar Java secara otodidak. Tidak melalui bangku kuliah (saya kuliah Teknik Industri), tidak juga ikut kursus atau pelatihan. Pada waktu itu -sekitar tahun 2002- milis jug-indonesia dan jlinux belum seramai sekarang. Sehingga untuk konsultasi dan tanya-jawab agak sulit. Perlu diperhatikan juga bahwa pada masa itu blog belum ngetren. Jarang ada blog yang membahas pemrograman Java dalam bahasa Indonesia.

Singkat kata, resource di internet tidak sebanyak saat ini (awal 2006).

Sebelum mulai belajar Java, kemampuan teknis saya adalah sebagai berikut:

  • Bisa menggunakan Linux, tapi sebatas user, bukan administrator ahli.

  • Mengerti tentang basic networking (IP Address, Subnet, cara kerja DNS, dan sedikit tentang routing)

  • Mengerti sedikit tentang relational database. SELECT, INSERT, UPDATE sih bisa.

  • Bisa PHP sedikit-sedikit. Cuma bisa HelloWorld, dan simpan isian form HTML ke dalam database. Tapi untuk aplikasi skala besar belum pernah buat.

Dengan modal pas-pasan seperti itu, saya berhasil diterima bekerja di sebuah kursus pendidikan franchise dari India. Waktu itu mereka baru membuka cabang di Surabaya, dan saya masuk sebelum grand-launching dilakukan.

Karena masih baru, siswa peserta kursus juga masih sedikit.Seingat saya, sehari cuma ada satu kelas selama 4 jam sehari. 4 jam sisanya, 20 perangkat komputer terbaru terhubung dengan jaringan termasuk satu asisten lab (tidak lain dan tidak bukan adalah saya) praktis menjadi pengangguran. Internet di sana dial-up, tapi ada beberapa buku pelajaran dan referensi di perpustakaan mini.

Waktu luang banyak, komputer banyak, buku banyak, internet agak lemot. Ya sudah, akhirnya saya ngoprek saja sendirian. Instruktur di sana, walaupun native speaker India, nampaknya kurang kompeten, sehingga kalo tanya ke dia, yang ada malah tambah bingung.

Minggu-minggu pertama saya habiskan membuat website dengan PHP. Berusaha bikin Content Management System kecil-kecilan. Tapi karena belum pengalaman, yang ada malah berantakan. Pengguna bukannya menjadi mudah malah menjadi sulit, karena untuk posting artikel harus mengerti HTML dan PHP :D. Padahal niatnya mau memudahkan. Yah, mau bagaimana lagi … ada masanya ketika kita masih muda dan bodoh :P

Bosan dengan PHP, saya mulai lihat-lihat buku di perpustakaan. Ada VB, Java, Windows 2000 Server, Oracle, dan sebagainya. Entah karena background saya yang pengguna Linux, saya kurang tertarik belajar VB. Selain itu, instruktur di sana (menganggap dirinya) master VB. Jadi saya tidak mau kompetitif dengan belajar VB juga. Oracle terlalu sulit buat saya (waktu itu). Instalasi saja sulitnya setengah mati. Installernya terlalu banyak tanya ini-itu yang saya gak ngerti apa jawabannya. Windows 2000 Server juga kelihatan kurang menarik. Jadilah akhirnya saya pilih belajar Java saja.

Saya coba belajar dari buku yang ada. Referensinya waktu itu Core Java vol 1 dan 2 karangan Cay Horstmann. Belakangan saya tau kalo buku itu sangat bagus dan lengkap. Ada beberapa konsep rumit seperti anonymous inner class yang dijelaskan dengan sangat baik di sana. Tapi untuk pemula, Core Java itu relatif sulit dimengerti.

Sekitar sebulan saya berputar-putar mencari cara belajar dan referensi yang bagus. Karena kualitas dan kecocokan referensi dengan cara belajar kita akan sangat berpengaruh terhadap kecepatan belajar.

Setelah browsing ke website Sun, saya berhasil menemukan tutorial Java dan dokumentasi Java. Ini merupakan referensi yang benar-benar cocok buat saya. Dengan bermodalkan dua bahan tersebut, akhirnya dua bulan berikutnya menjadi terang-benderang.

Satu demi satu konsep Java saya pelajari:

  1. Sintaks dan Semantic (for loop, statement, if-else, dsb)

  2. Konsep OOP

  3. Implementasi Class dan Object di Java

  4. Package

  5. I/O

  6. Collection

  7. Swing

  8. Thread

  9. JDBC

  10. dsb

Sampai akhirnya saya lumayan bisa membuat aplikasi desktop sederhana yang mengakses database.

Pada bulan keempat, saya masuk ke kantornya instruktur dan menemukan buku baru. Modul pelatihan Java Servlet. Wah, ada mainan baru. Segera saja saya coba semua contoh kodenya. Lumayan dari buku tersebut saya bisa memahami web.xml, servlet, dan application server. Waktu itu Tomcat belum terkenal seperti sekarang. Saya pakai Java Web Server untuk mendeploy servlet.

Sekitar enam bulan kemudian, saya sudah cukup mengerti apa itu EJB (waktu itu masih versi 1.x) dan bisa mendeploy EJB kecil-kecilan.

Kemudian saya ditugaskan menjadi dosen di Stikom, sebagai bagian dari paket kerjasama kursus tempat saya bekerja dengan Stikom. Di sana lebih banyak teman diskusi dan buku.

Dari titik ini, perjalanan belajar Java menjadi lebih mudah. Karena selain perpustakaan cukup lengkap, milis java juga sudah lumayan aktif. Sehingga saya dapat mainan baru seperti Hibernate dan Ant.

Sudah cukup panjang ceritanya. Pesan moral dari cerita ini adalah:

  1. Dengan waktu luang dan referensi yang tepat, belajar Java secara otodidak sangat mungkin dilakukan

  2. Download tutorial dan dokumentasi Java yang dikeluarkan Sun.

  3. Banyak berlatih (saya berlatih 6-8 jam sehari, setelah jam kantor saya masih stay untuk belajar)

  4. Untuk dapat melakukan poin #1 dan #2, kemampuan bahasa Inggris (read-only sudah cukup) wajib dimiliki.

Sedikit saran dari saya, cobalah berkontribusi di milis. Baik bertanya maupun menjawab. “Bagaimana kalo saya menjawab tapi jawabannya salah? Nanti diketawain … “ Jangan takut. Menjawab itu bagian dari belajar. Ini berarti kita mengujicoba pemahaman kita terhadap sesuatu.

Kalau pemahaman kita benar, komunitas akan memperkuat, dan kadang menambahkan sudut pandang yang berbeda sehingga pengetahuan kita semakin kaya. Kalau kita salah, akan ada yang mengoreksi. Sehingga pemahaman kita yang salah tersebut tidak akan terbawa sampai tua dan terungkap dalam event yang jauh lebih memalukan.

Nada-nada pedas dan komentar tidak ramah jangan sampai mengendurkan semangat. Anggap saja sebagai biaya kursus, karena : “Hei, ternyata bertanya di milis gak bayar. GRATIISS !!!”

Ok, selamat belajar mandiri :D


Java: Tidak untuk Pemula

Beberapa kali sepanjang perjalanan hidup, saya berkesempatan untuk mengajarkan Java kepada orang lain. Satu hal yang saya simpulkan dari pengalaman tersebut adalah “Java kurang cocok bagi pemula”.

Beberapa orang yang tidak setuju sekarang sedang bersiap-siap menggulung scroll-bar ke bawah, ke bagian komentar, untuk menumpahkan uneg-unegnya. :D Tapi sabar dulu, baca sampai selesai dan Anda akan mengerti maksud saya.

Sebelum kita mulai, mari definisikan dulu kata “pemula”. Pemula yang saya maksudkan adalah orang yang sama sekali belum pernah coding. Bisa memformat harddisk tidak masuk hitungan.

Ok, sekarang bayangkan Anda adalah seorang pemula. Bersemangat tinggi ingin belajar pemrograman, soalnya kayaknya titel programmer terlihat keren di kartu nama. Berdasarkan hasil browsing dan chatting di sana-sini, kata orang sih sekarang jamannya Java. Baiklah, mari kita belajar Java.

Anda ikut training Java -seperti lazimnya sopan santun di dunia pemrograman- hal pertama yang diajarkan instruktur adalah Hello World.

Instruktur: Selamat pagi bapak dan ibu. Sekarang kita akan belajar Hello World. Silahkan buka Notepad, dan ketik kode berikut:

public class HelloWorld {
  public static void main(String[] xx){
    System.out.println("Hello World");
  }
}

Instruktur: Dengan kode di atas, kita akan dapat mencetak tulisan “Hello World” ke layar. Bagaimana? Hebat kan?

Peserta: !@#$%[sumpah serapah disensor :P ]. Sama sekali tidak hebat. Apa itu class? Kenapa harus public? Apa artinya void? static? Berarti ada dynamic dong? Apa bedanya kurung kotak [] dengan kurung bulat () dan kurung kurawal {} ? …. [lagi-lagi disensor karena pertanyaan terlalu banyak]

Java, memang adalah bahasa yang mature. Sudah stabil (artinya tidak terlalu banyak perubahan fundamental) dan sudah teruji digunakan berbagai aplikasi besar dengan sukses. Tetapi tidak berarti mudah bagi pemula.

Seperti pada contoh sederhana di atas, sebetulnya baris yang ingin kita ajarkan adalah:

System.out.println("Hello World");

Tapi ada banyak baris lainnya yang ikut muncul. Karena ya di Java untuk Hello World memang itu kebutuhan minimalnya. Bandingkan dengan:

Ruby

puts "Hello World"

PHP

echo("Hello World");

Perhatikan bahwa saya tidak mempermasalahkan urusan kompile dan eksekusi, karena itu memang sudah konsep dasar Java bahwa source code harus dikompilasi.

Jadi, kesimpulannya adalah untuk mengajarkan Hello World, kita juga harus mengajarkan tentang:

  1. Apa itu class

  2. Akses level untuk class dan method, kalo gak pake public gimana? Gak bisa diakses di luar package. Jadi, harus ajarkan juga tentang ….

  3. Apa itu package

  4. Konsep method dan return value

  5. Array

  6. Perbedaan class method (static) dan instance method

Waaa … :( Berdasarkan keterangan di atas, saran saya untuk yang belum pernah coding sebelumnya adalah belajar dengan bahasa lain dulu. Misalnya PHP yang sintaksnya agak mirip. Nanti kalo sudah tau apa itu array, function, class, object, baru belajar Java.

Ini akan membuat hidup jadi lebih mudah untuk yang belajar, juga untuk yang mengajari.