Spring By Example. Contoh-contoh Spring Framework Komplit

Sebenarnya saya menemukan situs ini sudah cukup lama. Tapi baru teringat lagi ketika sedang cari-cari tutorial tentang Apache Tiles. Tutorial tentang Spring Framework di situs ini sangat komplit mulai dari IOC dasar sampai integrasi dengan Framework lain seperti GWT, Tiles dan lain-lain. Di situs ini tutorialnya bukan berbentuk blog tapi sudah dalam format buku dan bisa download pdfnya.
Tadinya Framework Spring yang dipakai baru versi 2.5 tapi setelah Spring Framework versi 3.0 rilis tutorial di situs ini juga sudah di update. Tapi ya kekurangannya adalah masih tetap berbahasa Inggris. Mungkin kalau ada waktu luang saya akan coba mencomot beberapa tutorial di situs ini dan menuliskannya kembali dalam bahasa Indonesia.
Oh iya untuk Source Code nya juga tersedia dan bisa di download lewat Subversion dan didalam tutorialnya dijelaskan langkah-langkah untuk download lewat Subversion.
Silahkan menuju TKP situsnya dan TKP Souce Code nya

Tutorial cara install JDK dan NetBeans di Windows

Ada tutorial sederhana nih tentang tata cara Install JDK dan NetBeans di Microsoft Windows. Sangat sederhana tapi saya yakin berguna. Pada tutorial ini proses instalasi di lakukan pada Windows XP Profesional tetapi cara yang sama dapat dilakukan pada Windows yang lebih baru seperti Vista dan Seven. Oh iya tutorial ini sebenarnya adalah hasil pekerjaan dari salah satu mahasiswa yang ikut mata kuliah Pemrograman Visual yang saya ampu di Universitas Janabadra.

Penulisnya adalah abdul aziz, mahasiswa Teknik Informatika Universitas Janabadra Yogyakarta.
Tutorialnya dapat di download di sini.

Masalah baru Master-detail ! TableCellRenderer!

Salah satu teman saya yaitu si echo punya masalah dan telah berhasil menyelesaikannya. Kalau gak salah masalah yang dihadapi adalah master-detail di Java Swing nah kira-kira seperti dibawah ini hasil penyelesaian masalahnya.

Masalah diatas sudah diselesaikan oleh echo, tapi kok saya menemukan masalah baru. Antara lain :

  1. Tanggal lahir masih muncul secara komplit sampai ke detik-detiknya juga, bagaimana cara memperbaiki tampilan tanggal lahir agar sesuai dengan format yang diinginkan seperti 04-April-1990.
  2. Kolom Jenis kelamin juga baru menampilkan tampilan apa adanya seperti yang ada pada Enum JenisKelamin, bagaimana cara kita agar dapat menampilkan sesuai dengan keinginan.
  3. Bagaimana kalau data dari sebuah kolom bertipe double dan merupakan data berupa uang. Standar penulisan uang di Indonesia adalah simbolΒ  “Rp.”, pemisah ribuan “.” dan koma “,” contohnya “Rp. 90.000,00”. Sedangkan default pada Java menggunakan standar amerika yaitu simbol “$”, pemisah ribuan “,” dan koma “.”.
  4. Apabila seorang mahasiswa mempunyai data berupa foto, bagaimana cara agar JTable dapat menampilkan data foto berupa gambar bukan hanya string.

Saya berfikir sejenak……………
Nah ketemu solusinya!!

Solusi tak lain dan tak bukan adalah TableCellRenderer yaitu Kelas yang digunakan untuk merender cell pada JTable sehingga kita bisa menentukan bagaimana format data dan komponen yang akan dimunculkan. Komponen yang dirender secara default oleh JTable adalah JLabel sehingga kita hanya perlu mengatur text yang tampil pada JTable, tetapi tidak menutup kemungkinan kita untuk merender komponen lain seperti JPanel.
TableCellRenderer didaftarkan pada JTable sesuai dengan type class pada setiap column, contoh TableCellRenderer untuk Date.class.

tabelMahasiswa.setDefaultRenderer(Date.class, new DateTableCellRenderer());
Source code diatas salah satu contoh pendaftaran TableCellRenderer dengan type Date.class. Oh iya untuk memastikan type dari column-column di JTable kita harus menambahkan sedikit kode program pada TableModel.

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return Date.class;
            case 4:
                return Mahasiswa.JenisKelamin.class;
            case 5:
                return Image.class;
            default:
                return null;
        }
    }

Fungsi getColumnClass(int) merupakan hasil override dari kelas AbstractTableModel seperti halnya fungsi getColumnName(int). Pada NetBeans kita cukup menekan alt+insert, pilih ‘Override Method…’ kemudian pilih fungsi yang akan di override. Cara kerja fungsi getColumnClass(int) sama seperti fungsi getColumnName(int) kita harus menentukan secara manual type-type kolom sesuai dengan urutannya (ingat dimulai dari 0 bukan 1).

package org.jasoet.swing.cellrenderer;

import java.awt.Component;
import java.text.SimpleDateFormat;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;

/**
 *
 * @author Deny Prasetyo
 */
public class DateTableCellRenderer extends DefaultTableCellRenderer {

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMMM yyyy");

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel component = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        component.setHorizontalAlignment(SwingConstants.CENTER);
        component.setText(simpleDateFormat.format(value));

        return component;
    }
}

Source code diatas merupakan solusi untuk masalah nomor 1. Kita hanya perlu memformat data yang berupa date menggunakan kelas SimpleDateFormat. Pattern yang digunakan kali ini adalah “dd MMMM yyyy” yang akan menghasilkan format tanggal seperti “01 January 2010”, untuk pattern-pattern yang lain bisa dilihat di dokumentasi kelas SimpleDateFormat.
Hasil dari format kelas SimpleDateFormat cukup kita masukkan sebagai properti text pada komponen JLabel dan apabila perlu kita atur juga alignment agar rata tengah (Center).Oh iya untuk membuat custom TableCellRender kita hanya perlu membuat kelas turunan dari DefaultTableCellRenderer dan meng-override fungsi getTableCellRendererComponent.
Nah masalah nomor 1 sudah selesai sekarang kita lanjut ke nomor 2. Konsep untuk menyelesaikan nomor 2 hampir sama seperti pada nomor 1. Pada dasarnya Enum merupakan sebuah kelas sehingga kita hanya perlu membuat sebuah TableCellRenderer dan mendaftarkannya untuk type JenisKelamin.class.

tabelMahasiswa.setDefaultRenderer(JenisKelamin.class, new JenisKelaminTableCellRenderer());
package org.jasoet.swing.cellrenderer;

import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import khannedy.blogging.masterdetail.entity.Mahasiswa.JenisKelamin;

/**
 *
 * @author Deny Prasetyo
 */
public class JenisKelaminTableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel component = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        component.setHorizontalAlignment(SwingConstants.CENTER);
        JenisKelamin jk = (JenisKelamin) value;
        if (jk == JenisKelamin.LakiLaki) {
            component.setText("Laki-Laki");
        } else {
            component.setText("Perempuan");
        }
        return component;
    }
}
 

Untuk menyelesaikan masalah nomor 3 dan 4 kita harus menambahkan beberapa field pada kelas Mahasiswa dan MataKuliah karena pada program yang dibuat echo tidak menyertakan contoh field berupa double dan image.

Tambahkan 1 field berupa String dengan mana urlFoto. Field ini nanti akan berisi nama file gambar yang dimaksudkan sebagai Foto.


private String urlFoto;
 public String getUrlFoto() {
 return urlFoto;
 }

 public void setUrlFoto(String urlFoto) {
 this.urlFoto = urlFoto;
 }

Tambahkan 2 field yaitu sks dan biaya pada kelas MataKuliah, Sks bertipe Integer dan Biaya bertipe Double. Β Untuk 2 field ini sudah jelas kan kegunaannya.


private int sks;
private Double biaya;

public Double getBiaya() {
return biaya;
}

public void setBiaya(Double biaya) {
this.biaya = biaya;
}

public int getSks() {
return sks;
}

public void setSks(int sks) {
this.sks = sks;
}

Dengan bertambahnya 1 field pada kelas Mahasiswa dan 2 Field pada otomatis kita diharuskan untuk mengedit TableModelMahasiswa,TableModelMataKuliah dan MahasiswaService.

TableModelMahasiswa.java


package khannedy.blogging.masterdetail.model;

import java.awt.Image;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import khannedy.blogging.masterdetail.entity.Mahasiswa;

public class TableModelMahasiswa extends AbstractTableModel {

private List<Mahasiswa> list;

public TableModelMahasiswa(List<Mahasiswa> list) {
this.list = list;
}

public List<Mahasiswa> getList() {
return list;
}

public int getRowCount() {
return list.size();
}

public int getColumnCount() {
return 6; //Edited by Jasoet
}

@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Nim";
case 1:
return "Nama Depan";
case 2:
return "Nama Belakang";
case 3:
return "Tanggal Lahir";
case 4:
return "Jenis Kelamin";
//Added by Jasoet [start]
case 5:
return "Foto";
//Added by Jasoet [end]
default:
return null;
}
}

public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return list.get(rowIndex).getNim();
case 1:
return list.get(rowIndex).getNamaDepan();
case 2:
return list.get(rowIndex).getNamaBelakang();
case 3:
return list.get(rowIndex).getTanggalLahir();
case 4:
return list.get(rowIndex).getJenisKelamin();
//Added by Jasoet [start]
case 5:
return list.get(rowIndex).getUrlFoto();
//Added by Jasoet [end]
default:
return null;
}
}

//Added by Jasoet [start]
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return Date.class;
case 4:
return Mahasiswa.JenisKelamin.class;
case 5:
return Image.class;
default:
return null;
}
}
//Added by Jasoet [end]
}

TableModelMataKuliah.java


package khannedy.blogging.masterdetail.model;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import khannedy.blogging.masterdetail.entity.MataKuliah;

public class TableModelMataKuliah extends AbstractTableModel {

private List<MataKuliah> list = new ArrayList<MataKuliah>();

public void setList(List<MataKuliah> list) {
this.list = list;
fireTableDataChanged();
}

public int getRowCount() {
return list.size();
}

public int getColumnCount() {
return 4;//Edited by Jasoet
}

@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Kode";
case 1:
return "Nama";
//Added by Jasoet [start]
case 2:
return "SKS";
case 3:
return "Biaya";
//Added by Jasoet [end]
default:
return null;
}
}

public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return list.get(rowIndex).getKode();
case 1:
return list.get(rowIndex).getNama();
//Added by Jasoet [start]
case 2:
return list.get(rowIndex).getSks();
case 3:
return list.get(rowIndex).getBiaya();
//Added by Jasoet [end]
default:
return null;
}
}

//Added by Jasoet [start]
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Integer.class;
case 3:
return Double.class;
default:
return null;
}
}
//Added by Jasoet [end]
}

MahasiswaService.java


package khannedy.blogging.masterdetail.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import khannedy.blogging.masterdetail.entity.Mahasiswa;
import khannedy.blogging.masterdetail.entity.MataKuliah;

public class MahasiswaService {

 public List<Mahasiswa> getAllMahasiswa(Integer count) {
 List<Mahasiswa> mahasiswas = new ArrayList<Mahasiswa>();

 for (int i = 0; i < count; i++) {
 if (i % 4 == 0) {
 Mahasiswa mahasiswa = createMahasiswa("10106031", "Eko Kurniawan", "Khannedy", new Date(), Mahasiswa.JenisKelamin.LakiLaki,"p.png");
 mahasiswa.add(createMataKuliah("IF3456", "Sistem Informasi Geografis",3,90000));
 mahasiswa.add(createMataKuliah("IF3457", "Komputer Grafika",3,80000));
 mahasiswa.add(createMataKuliah("IF3458", "Rekayasa Perangkat Lunak",2,12000));
 mahasiswa.add(createMataKuliah("IF3459", "Pemrograman Berorientasi Objek",4,45000));
 mahasiswas.add(mahasiswa);
 } else if (i % 4 == 1) {
 Mahasiswa mahasiswa = createMahasiswa("10106032", "Tini", "Sumarni", new Date(), Mahasiswa.JenisKelamin.Perempuan,"7.png");
 mahasiswa.add(createMataKuliah("IF3413", "Algoritma dan Pemrograman Lanjutan",1,21000));
 mahasiswa.add(createMataKuliah("IF3489", "Kewirausahaan",3,23000));
 mahasiswa.add(createMataKuliah("IF3468", "Manajemen Proyek",4,45000));
 mahasiswa.add(createMataKuliah("IF3499", "Sistem Basis Data",3,16000));
 mahasiswas.add(mahasiswa);
 } else if (i % 4 == 2) {
 Mahasiswa mahasiswa = createMahasiswa("10106032", "Tono", "Sumarno", new Date(), Mahasiswa.JenisKelamin.LakiLaki,"8.png");
 mahasiswa.add(createMataKuliah("IF3412", "Algoritma dan Pemrograman",5,23000));
 mahasiswa.add(createMataKuliah("IF3457", "Komputer Grafika",2,40000));
 mahasiswa.add(createMataKuliah("IF3468", "Manajemen Proyek",1,50000));
 mahasiswa.add(createMataKuliah("IF3449", "Pengolahan Citra",2,23000));
 mahasiswas.add(mahasiswa);
 } else {
 Mahasiswa mahasiswa = createMahasiswa("10106022", "Rina", "Sholihat", new Date(), Mahasiswa.JenisKelamin.Perempuan,"12.png");
 mahasiswa.add(createMataKuliah("IF3412", "Algoritma dan Pemrograman",2,45000));
 mahasiswa.add(createMataKuliah("IF3489", "Kewirausahaan",3,25000));
 mahasiswa.add(createMataKuliah("IF3466", "Database Lanjut",4,40000));
 mahasiswa.add(createMataKuliah("IF3423", "Pengenalan Ilmu Komputer",2,29000));
 mahasiswas.add(mahasiswa);
 }
 }

 return mahasiswas;
 }

 protected MataKuliah createMataKuliah(String code, String name,int sks,double biaya) {
 MataKuliah mataKuliah = new MataKuliah();
 mataKuliah.setKode(code);
 mataKuliah.setNama(name);
 mataKuliah.setSks(sks);
 mataKuliah.setBiaya(biaya);
 return mataKuliah;
 }

 protected Mahasiswa createMahasiswa(String nim, String namaDepan,
 String namaBelakang, Date tanggalLahir,
 Mahasiswa.JenisKelamin jenisKelamin,String urlFoto) {

 Mahasiswa mahasiswa = new Mahasiswa();
 mahasiswa.setJenisKelamin(jenisKelamin);
 mahasiswa.setNamaBelakang(namaBelakang);
 mahasiswa.setNamaDepan(namaDepan);
 mahasiswa.setNim(nim);
 mahasiswa.setTanggalLahir(tanggalLahir);
 mahasiswa.setUrlFoto(urlFoto);
 return mahasiswa;
 }
}

Setelah itu kita perlu membuat 2 buah TableCellRenderer lagi yaitu ImageTableCellRenderer dan DoubleTableCellRenderer.

ImageTableCellRenderer.java

package org.jasoet.swing.cellrenderer;

import java.awt.Component;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;

/**
 *
 * @author Deny Prasetyo
 */
public class ImageTableCellRenderer extends DefaultTableCellRenderer {

 private String imageLocation = "/org/jasoet/swing/images/";

 @Override
 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 if (isSelected) {
 JLabel component = new JLabel();
 URL resource = getClass().getResource(imageLocation + value);
 ImageIcon imageIcon = new ImageIcon(resource);

 component.setIcon(imageIcon);
 component.setText("");
 component.setHorizontalAlignment(SwingConstants.CENTER);
 int currentHeight = table.getRowHeight(row);
 int currentRowWidth = table.getColumnModel().getColumn(column).getPreferredWidth();

 if (currentHeight < imageIcon.getIconHeight()) {
 table.setRowHeight(row, imageIcon.getIconHeight());
 }
 if (currentRowWidth < imageIcon.getIconWidth()) {
 table.getColumnModel().getColumn(column).setPreferredWidth(imageIcon.getIconWidth());
 }

 return component;
 } else {
 JLabel component = new JLabel();

 component.setText("" + value);
 component.setHorizontalAlignment(SwingConstants.CENTER);
 table.setRowHeight(row, 16);

 return component;
 }
 }
}

DoubleCellRenderer.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.jasoet.swing.cellrenderer;

import java.awt.Component;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;

/**
 *
 * @author Deny Prasetyo
 */
public class DoubleCellRenderer extends DefaultTableCellRenderer {

 private DecimalFormat decimalFormat;

 public DoubleCellRenderer() {
 Locale idLocale = new Locale("id");
 DecimalFormatSymbols dfs = new DecimalFormatSymbols(idLocale);
 dfs.setCurrencySymbol("Rp. ");
 decimalFormat = new DecimalFormat("\u00A4##,###.##", dfs);
 }

 @Override
 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 JLabel component = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 component.setHorizontalAlignment(SwingConstants.RIGHT);
 component.setText(decimalFormat.format(value));

 return component;
 }
}

Hasilnya kira-kira sperti ini.

Untuk kode program komplit Β bisa di-checkout menggunakan Subversion di https://jasoet.googlecode.com/svn/tags/master-detail atau download file zipnya di sini.

Training Java (full stack) di Yogyakarta

Sekarang telah dibuka Training Center berlokasi di Yogyakarta yang fokus pada pemrograman Java. Dari mulai Java fundamental, desktop, web sampai penggunaan framework seperti Spring, Hibernate, JPA dan lain-lain dengan biaya yang sangat terjangkau untuk kalangan mahasiswa di Jogja.

Training center bernama ExtendsJCenter ini menawarkan beberapa paket training sesuai dengan kebutuhan mahasiswa/umum antara lain :

  • Java Fundamental (10x pertemuan @2 jam)
  • Java Desktop (10x pertemuan @2 jam)
  • Java Web (10x pertemuan @2 jam)
  • Spring Web Framework (12x pertemuan @2 jam)
  • Spring GUI Framework (12x pertemuan @2 Jam)
  • Java Web Full Stack (35x pertemuan @2 Jam)

ExtendsJCenter ini selalu berusaha untuk memberikan materi yang sesuai dengan standar yang banyak digunakan industri sehingga diharapkan skill dari lulusan ExtendsJCenter dapat memenuhi kebutuhan industri IT di Indonesia.
Untuk informasi lebih lanjut silahkan kunjungi website resmi ExtendsJCenter di http://www.extendsj.com.

Menginstal Curl

Istilah Curl pertama kali saya temui ketika menonton video tutorial tentang Ruby on Rails. Curl ini semacam command line yang digunakan untuk mentransfer data menggunakan url sintaks dan support banyak protokol seperti FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS dan FILE. Bisa juga digunakan untuk melakukan request HTTP baik berupa GET, POST, PUT, dan lain-lain.

Dengan kemampuan-kemampuan yang dimilikinya, curl banyak digunakan untuk melakukan test pada aplikasi web.
Contoh :
curl http://www.google.com

maka akan menghasilkan

<HTML><HEAD><meta http-equiv=”content-type” content=”text/html;charset=utf-8″>
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF=”http://www.google.co.id/”>here</A&gt;.
</BODY></HTML>

curl dapat di download secara gratis sini. Tersedia pilihan untuk banyak Sistem Operasi baik linux, mac atau windows. Untuk windows kita hanya perlu mendownload paket curl versi windows yang berbentuk zip. Extract dan kemudian tambahkan pada variable PATH di Environtment Variable agar dapat diakses pada command line.

JAva Meet Up JUG-JogloSemar bulan February 2010

Setelah vakum beberapa waktu, bulan ini acara rutin JUG-JogloSemar akan digelar lagi.

Detail acara :
JAva Meet Up bulan February 2010
Hari : Sabtu
Tanggal : 20 February 2010
Waktu : 09.00 WIB
Tempat : Ruang PRESENTASI STMIK AKAKOM Yogyakarta
Tema : MVC Framework

Pembicara
1. Kris Sadewo ==> Spring MVC
2. Deny Prasetyo ==> Spring Roo
3. Hendro Steven ==> ZK MVC

Sifat acara Free/Bebas untuk Semua.

Acara ini terselenggara atas kerjasama JUG-JogloSemar dan HMJ Managemen Informatika STMIK Akakom Yogyakarta.
Oh iya teman-teman mohon dukungannya dengan ikut menyebarkan informasi berguna ini kepada teman-teman yang lain :D.

Untuk peta bisa dilihat disini.

Local Mirror NetBeans

Sekarang sudah tersedia mirror local untuk downlad NetBeans. Temen-temen yang kesulitan download dari netbeans.org atau yang dikampusnya ada koneksi IIX atau INHERENT bisa coba download disini. Versi yang disediakan mulai dari versi 6.1 sampai versi yang terbaru, untuk saat ini yang terbaru adalah versi 6.8 semoga nanti ketika ada versi yang lebih baru mirror local ini langsung menyediakan.

Konfigurasi Modem Haier CE 100 (Smart) pada Linux Mint Gloria (Ubuntu Jaunty)

Saya mendapatkan cara konfigurasi ini setelah melewati proses “Try n Error” yang cukup panjang. Berbekal beberapa posting di beberapa blog akhirnya saya menemukan konfigurasi yang tepat untuk Modem Haier CE 100. Saya menggunakan operator Smart untuk terkoneksi dengan internet.
Ketika pertama kali Modem Haier CE 100 di pasang di Laptop yang terdeteksi bukan modem melainkan USB Flash, Ini dikarenakan Haier CE 100 memang mempunyai fitur sebagai USB Flash. Hal yang harus kita lakukan pada dasarnya memastikan bahwa Linux Mint dapat mengenali modem sebagai USB Serial Modem. Nah beberapa langkah yang dapat kita lakukan antara lain :

  1. Memastikan kernel linux yang kita pakai memiliki modul usbserial. Kebetulan linux mint gloria atau ubuntu 9.04 menggunakan kernel versi 2.6.28.11-generic yang sayang sekali masih terdapat bug sehingga modul usbserial tidak dapat dikenali dan harus di patch. Untuk masalah ini dapat diselesaikan dengan mengupgrade kernel yang dipakai menjadi versi 2.6.28-13 generic. Kernel versi 2.6.28.13-generic tersedia di repository ubuntu.
  2. Setelah kernel di update kemudian pasang Modem dan tunggu sampai muncul drive baru seperti halnya kita memasang USB Flash.
  3. Jalankan pada command line perintah “sudo lsusb -v | more” pastikan modem Haier kita dikenali dengan munculnya text “Qualcomm, Incorporated” dan “USB MMC Storage” pada output text yang keluar. Ini berarti modem kita telah dikenali sebagai USB MMC Storage.
  4. Sekarang coba “eject” modem dengan mengklik kanan icon pada desktop. Ingat EJECT BUKAN UNMOUNT.
  5. Kemudian ulangi langkah ke 3. Apabila benar maka text yang muncul akan berubah menjadi “Qualcomm CDMA Technologies MSM” ini menandakan bahwa modem kita telah berubah fungsi menjadi USB Modem.
  6. Product Modem Haier memiliki ID 201e:2009, ini dapat dibuktikan pada output text yang keluar pada langkah sebelumnya.
  7. Pada dasarnya koneksi ke modem merupakan koneksi serial (cmiiw) sedangkan modem yang kita gunakan dikenali sebagai USB Device. Nah kali ini baru modul usbserial yang ada pada kernel berfungsi.
  8. Jalankan perintah “sudo modprobe usbserial vendor=0x201e product=0x2009”. 0x201e dan 0x2009 tidak lain adalah ID Modem Haier yang telah dikenali oleh linux. Langkah ini digunakan untuk menghubungkan USB Modem ke serial port.
  9. Untuk membuktikan apakah langkah ke 8 berhasil jalankan perintah “dmesg”, apabila muncul text “generic converter now attached to ttyUSB0” berarti seluruh proses pengenalan modem oleh linux mint telah selesai.

Setelah modem  dikenali oleh linux mint, langkah selanjutnya adalah menginstall program untuk mengkoneksikan modem dengan jaringan internet. Apabila menggunakan modem HSDPA seperti huawei e220, program dialer telah tersedia oleh linux mint tetapi untuk modem Haier CE 100 kita harus menggunakan program tambahan seperti wvdial.
Pada Linux Mint Gloria atau Ubuntu Jaunty (versi 9.04) program wvdial sudah tidak disertakan langsung pada cd instalasi sehingga kita harus menginstallnya lewat synaptic (cari paket bernama wvdial) atau secara command line dengan menjalankan perintah “sudo apt-get install wvdial”.
Setelah wvdial terinstall yang perlu dilakukan adalah menuliskan konfigurasi pada “/etc/wvdial.conf”. File konfigurasi dapat di edit menggunakan teks editor biasa seperti gedit atau yang lain. Atau untuk lebih mudah jalankan perintah “sudo gedit /etc/wvdial.conf”.
Tambahkan konfigurasi pada file “wvdial.conf” seperti dibawah ini.

[Dialer smart]
Auto DNS = on
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Stupid Mode = yes
Modem Type = Analog Modem
ISDN = 0
New PPPD = yes
Phone = #777
Modem = /dev/ttyUSB0
Username = ‘smart’
Password = ‘smart’
Baud = 460800
Dial Command = ATDT
FlowControl = CRTSCTS
Ask Password = 0
Stupid Mode = 1
Compuserve = 0
Idle Seconds = 300

Sekarang jalankan perintah “sudo wvdial smart” untuk memulai koneksi ke internet. SEMOGA BERHASIL

My New ThinkPad SL400 and Linux Mint Gloria

Alhamdulilah akhirnya punya kesempatan untuk mengganti laptop Acer Aspire dengan laptop yang baru. Acer Aspire yang sudah hampir 4 tahun saya miliki sudah uzur dan sudah saatnya untuk pensiun. Dengan Pentium M 1.6 Ghz dan RAM DDR2 1 giga Acer Aspire milik saya sudah tidak sanggup untuk menjalankan NetBeans atau SpringSource Tool Suite (Eclipse) dengan baik.
Sebelum membeli Laptop pengganti sebenarnya saya sempat membeli sebuah PC dengan Prosesor Core Duo, RAM DDR2 2 Gb dan 2 buah monitor flat. Dengan PC tersebut saya masih sempat menyelesaikan sebuah proyek dan mencoba beberapa game baru seperti Call Of Duty 4 dan lain-lain. Akan tetapi PC tersebut mempunyai sebuah kelemahan fatal yang membuat saya harus membeli Laptop baru yaitu mobilitas, kita tahu sendiri kalau PC enggak bisa diajak “jalan-jalan”.

Setelah melirik beberapa merk laptop yang pas dikantong akhirnya pilihan saya jatuh ke Lenovo ThinkPad SL400. Desain ThinkPad SL400 lumayan jadul karena memang desain seri ThinkPad masih dipertahankan sejak IBM belum dibeli oleh Lenovo. Ehm.. bukan IBM nya sih yang dibeli Lenovo hanya divisi Laptop IBM yang di beli oleh Perusahan dari china ini. Laptop ThinkPad SL400 dilengkapi oleh Core 2 DUO T5670, RAM 4 Giga (setelah diupgrade), hardisk 160 gb dan beberapa fitur lain. Dengan spesifikasi tersebut, laptop baru saya ini sudah enak untuk diajak jalan-jalan dan koding dibanyak tempat berbeda.
Nah untuk urusan Sistem Operasi, pilihan jatuh ke Linux Mint. Distro turunan dari Ubuntu yang mempunyai tampilan sedikit lebih cantik  dan beberapa fitur tambahan yang cukup memudahkan seperti “Open As Root” dan “Open in Terminal”. Versi Linux Mint yang saya gunakan adalah Linux Mint Gloria, turunan dari Ubuntu 9.04 Jaunty Jackalope. Pada versi ini hampir seluruh hardware pada ThinkPad ini dikenali dengan baik.  Pemilihan Linux Mint sebagai Sistem Operasi yang saya pakai lebih dikarenakan pada ThinkPad SL400 ini tidak dibundle dengan Microsoft Windows selain itu karena saya lebih sering develop software menggunakan Java sehingga perbedaan OS tidak terlalu berpengaruh.
Sejauh ini pembelian ThinkPad SL400 dan pemilihan Sistem Operasi tidak ada masalah berarti kecuali cicilan tiap bulan yang harus dibayar dan Konfigurasi Modem Haier CE 100 yang saya gunakan. Sejak 1 bulan yang lalu saya mulai berlangganan internet dari Operator Smart dan menggunakan Modem Haier CE 100 yang sudah support jaringan EVDO rev-A. Sebelum berlangganan Smart saya berlanggangan IM2 kemudian Telkomsel Flash dengan menggunakan Modem HSDPA Huawei E220.

Pada Linux Mint Gloria atau Ubuntu versi 9.04 sudah tersedia fasilitas koneksi Mobile Broadband yang memudahkan koneksi internet menggunakan Modem HSDPA dengan catatan Modem telah dikenali dengan baik. Modem HSDPA Huawei E220 sudah dikenali dengan baik oleh Ubuntu sayangnya modem yang saya gunakan sekarang yaitu Haier CE 100 belum dikenali sebagia modem dan hanya dikenali sebagai USB Flash karena memang memiliki fasilitas tambahan sebagai USB Flash.
Alhamdulilah setelah Googling Semalam suntuk dan melakukan banyak “try n error” akhirnya Modem Haier CE 100 dapat dikenali  oleh Linux Mint dan dapat terkoneksi dengan internet sama seperti ketika menggunakan Sistem Operasi Microsoft Windows.
Nah untuk kronologis konfigurasi Haier CE 100 di Linux Mint silahkan tunggu postingan berikutnya :D.

Contoh Program Java Swing, Hibernate, Spring

Setelah meluangkan waktu sekitar 3 jam akhirnya program Apotik sederhana versi Spring+Hibernate telah selesai. Silahkan donlot di tempat biasa.

Untuk librarinya sebagian besar sudah disediakan oleh NetBeans dan beberapa library lain bisa menggunakan library yang sama seperti program sebelumnya.

Selamat mencoba !!!!!