Life,Contribute!!!

I may fail, I may succeed. But i’ll live my life as I believe!!

Life,Contribute!!! header image 1

Mom’s Reciept : Nasi kabuli

June 17th, 2008 · 5 Comments

Bulan lalu gw berkesempatan pulang kampung setelah one-full-hectic-month. Selama di rumah gw sempet jalan-jalan ke water park dan merasakan resep istimewa mak gw: nasi kabuli.

Nasi kabuli asalnya dari jazirah arab, bumbunya sangat khas timur tengah: kayu manis, kapulaga, jinten hitam dan cengkeh. Daging yang digunakan adalah daging kambing. Untuk mendapatkan daging berkualitas tinggi, gw sama mak gw bangun subuh dan langsung ke rumah potong hewan. Harga dagingnya pun masih mayan murah dibanding dipasar, rp 75.000 untuk satu paha penuh kambing dewasa, kurang lebih 1,5 kg daging dan 1 kg tulang.

Proses memasknya memerlukan waktu satu malam penuh, daging kambing direbus dengan bumbu sampai meresap dan lembut. Pagi harinya, nasi dimasak setengah matang, kemudian nasi yang setengah matang dimatangkang diatas daging dan bumbunya dengan api sangat kecil. Hasilnya, hmmm… nasi menyatu dengan bumbu dan kaldu daging kambing.

Siang harinya, nasi kabuli siap untuk dihidangkan. Sebuah nampan ukuran sedang disediakan, nasi kabuli dituang ke nampan sehingga nasi berada di bawah dan daging kambingnya berada di tumpukan paling atas… sssluurupzz… hmmmm…

Cara makan nasi kabuli pun sangat khas, kita semua mengitari nampan dan duduk di lantai.

Suasana makan sangat menyenangkan :D

Kangen pulang lagi nih :D

→ 5 CommentsTags: kuliner

Weekend Kuliner : Pantasteiik & Rumah Jajanan Bang Ocang

June 17th, 2008 · 4 Comments

Weekend ini kita (saya dan neneng) berwisata kuliner, awalnya mau mampir di kantin dewi di belakang Pangrango Plaza, mie yaminya ueenak dan murah, tapi gw mutusin untuk nyoba menu di Pantasteiik. Tempat ini pertama kali gw lihat pas jalan-jalan mau makan ke kedai chinese food pak kumis deket kampus Pakuan bogor.

Dari depan Pantasteiik terlihat sangat cozy, ada ruang bagian dalam yang ber-AC dan non-smoking dan bagian luar dengan kanopi untuk yang lebih santai untuk smookers. Ketika memasuki bagian dalam, terdapat banyak meja dengan layout berbeda, ada yang menggunakan meja bundar dan kursi tinggi. Ada juga meja rendah dengan sofa dan kursi bundar.

Interior Pantasteiik sangat menarik dengan berbagai ornamen yang terlihat modern dan berwarna mantap. Tempat ini benar-benar asik dan berkelas.

Sekarang ke makananya, sesuai namanya ada 2 jenis menu: Pancake dan Steik. Kali ini kita memutuskan untuk mencoba pancakenya. Kalau steik ya udah pernah makan di obonk, tapi kalo pancakenya gw cuman pernah coba di kantin ICRAF-CIFOR.

Neneng pesen “Blueberry Heaven Pancake”, dan gw pesen “The Gunners”.

Blueberry Heaven Pancake

The Gunners

Pancakenya terdiri dari 3 lapis tebal, dan kita bisa memilih regular pancake atau wavel, atau kombinasi keduanya, misalnya 2 pancake dan 1 wavel seperti yang kita pesan. Es creamnya juga bisa milih coklat atau vanilla, sangat fleksibel dan memanjakan selera. Dekorasi pancakenya bagus banged, menggoda mata. Rasanya? hmm mantap, sebenernya pancake nih cocok bwat sarapan, lebih friendly ke perut dan menghindarkan dari rasa konstipasi yang tidak nyaman. Rasanya enak, cuman lu harus sangat laper untuk bisa ngabisin satu porsi pancake,:D

Pelayananya super ramah, dengan pelayan selalu senyum dan berusaha menjawab setiap pertanyaan dengan bahasa yang simple dan jelas.

Dua buah pancake, lemon punch dan air mineral ditebus dengan 1 lembar 50rb masih ada kembalianya, hmmm, nggak mahal-mahal banged. Skor akhir : 65 :D

Keesokan harinya kita cobain tempat makan yang lumayan mencolok di daerah deket kosan gw, masih di sepanjang jalan bangbarung raya. Namanya “rumah jajan bang ocang”, konsepnya sunda banged… di dalam ruangan ada meja panjang dengan dekorasi tungku dan alat masak dari tanah liat, kesan sunda-nya sangat kental. Neneng bilang interiornya mirip sama Bumbu Desa.

Gw pesen nasi goreng bang ocang :

Nasi gorengnya enak, dengan lauk yang lengkap: telur goreng, ayam goreng dan sate ayam. Sayangnya tidak ada yang istimewa di sisi bumbu, semuanya standard aja. Satu piring nasi goreng dan es teh ditebus Rp 23.500 lumayan mahal untuk ukuran menu nasi goreng. Skor akhir : 49 :D

Neneng nggak mau pesen makan karena kekeuh mau makan di tempat paporitnya: Ayam Geprek Istimewa. Pesanan rutinya : Ayam geprek,sop istimewa, nasi putih dan es teh. Semuanya Rp. 17.500, hhh lain kali gw makan di ayam geprek aja deh…..

→ 4 CommentsTags: kuliner

Instalasi NetBeans 6.1 Mobility Pack di Ubuntu

June 16th, 2008 · 1 Comment

Hari ini gw dapet tugas untuk bikin prototype aplikasi Java ME, dengan sangat PD-nya gw install mobility pack, membuat project CLDC dan menyangka simulator akan nongol dengan lancar, dan… eng ing eng… error …

cldc-run:
Copying 1 file to /home/ifnu/NetBeansProjects/Ponds/dist/nbrun40060
Copying 1 file to /home/ifnu/NetBeansProjects/Ponds/dist/nbrun40060
Jad URL for OTA execution: http://localhost:8082/servlet/org.netbeans.modules.mobility.project.jam.JAMServlet/home/ifnu/NetBeansProjects/Ponds/dist//Ponds.jad
Starting emulator in execution mode
/opt/netbeans-6.1/mobility8/WTK2.5.2/bin/emulator: 26: java: not found
ricoh-run:
semc-icon-assembly:
semc-ppro-emulator:
semc-do-run:
semc-run:
savaje-run:
nokiaS80-run:
nsicom-run:
run:
BUILD SUCCESSFUL (total time: 0 seconds)

Pertama kali gw punya prasangka kalau ini bugs di NetBeans 6.1 karena gw install di folder /opt, gw coba untuk install NetBeans 6.1 di folder /home, dan… tetep error. Trus gw curiga jangan-jangan NetBeans 6.1-nya yang ada bugsnya, akhirnya gw install NetBeans 6.0 di folder /home, dan… tetep error. Searching kesana kemari nggak ketemu juga, akhirnya gw klik itu error pada bagian “/opt/netbeans-6.1/mobility8/WTK2.5.2/bin/emulator: 26: java: not found” karena memang warnanya biru dan underline, alias hyperlink. Terbukalah file emulator yang isinya bash shell code, teliti punya teliti ada satu baris berikut ini yang bentuk statementnya mencurigakan

javapathtowtk=

sisi sebelah kanan dari operator “=” kok kosong? hmmm, harusnya berisi apa yaa? gw isi $JAVA_HOME, masih error, gw isi /opt/jdk1.6.06/ (sesuai folder instalasi JDK) masih error juga. Akhirnya ketemu juga jawabanya :

javapathtowtk=/opt/jdk1.6.06/bin/

Ternyata nilai dari javapathtowtk adalah folder ke $JAVA_HOME/bin/ :D

sigh…. 2 jam berharga hilang untuk konfigurasi sederhana….

→ 1 CommentTags: netbeans

Debuging PHP script dengan NetBeans

June 7th, 2008 · 5 Comments

Hari senin hingga jumat besok, saya ada kelas mengajar PHP. Ini bukan pertama kalinya saya mengajar kelas PHP, tapi yang sepesial kali ini adalah, kemungkinan saya akan menggunakan NetBeans PHP Support[1] sebagai editor-nya. Alasan utamanya ya karena editor yang biasa saya gunakan, Notepad++ masih terasa kurang memberikan bantuan kepada developer. Proses instalasi ini hanya ditest di Ubuntu 08.04.

Editor Feature
NetBeans PHP support menggunakan Base IDE yang sama dengan IDE untuk Ruby, jadi feature standard seperti auto-completion (variabel, class, fungsi dll), refactoring dan debugging tersedia.

Debugging
Feature ini sangat saya tunggu-tunggu, soalnya debugging kode PHP bukan perkara yang mudah, apalagi kalau sampai ada kode “html-dalam-php-echo”, wah bisa juling matanya melihat kode HTML tanpa sintax colouring.

NetBeans PHP support mendukung feature debug dengan bantuan XDebug [2], untuk mensettup NetBeans + LAMP + XDebug berikut ini adalah langkah-langkahnya, kemungkinan besar masih ada banyak kekurangan dan kesalahan. Saya berharap banyak masukan dan saran untuk perbaikan proses instalasi ini agar lebih akurat.

Instalasi Java
Saya menggunakan Java yang diinstall dengan mendownload binary-nya di java.sun.com, setelah selesai tinggal eksekusi file binary dengan mendouble-click atau menjalankan file binary dari command line :

./jdk-6u6-linux-i586.bin

Kelemahan utama cara ini adalah hasil extract file binary tersebut diletakkan di direktori yang sama dengan file .bin berada, sebaiknya file dan folder hasil extract tersebut dipindahkan ke folder /opt.
Cara lain yang jaaauh lebih mudah adalah dengan menggunakan apt-get atau aptitude

sudo apt-get install sun-java-6-jdk

Kelemahanya ya kita hanya mendapat versi JDK yang sudah disediakan sama Ubuntu, sedangkan kalau download sendiri kan bisa dapat JDK dengan update terakhir.
Setelah proses instalasi selesai, langkah selanjutnya adalah memasukkan path hasil instalasi Java ke dalam Path Ubuntu. Edit file /home/<user>/.bashrc dan tambahkan baris berikut ini di akhir file :

export JAVA_HOME=/opt/jdk1.6.0_06/
export PATH=$PATH:/$JAVA_HOME/bin

Ganti folder /opt/jdk1.6.0_06/ dengan folder instalasi java-nya, jangan copy paste buta yaah :D

Instalasi Netbeans PHP Support
Download Netbeans PHP Support terlebih dahulu [3], kemudian tinggal double click saja, dan sebaiknya instalasi netbeans juga diletakkan di folder /opt

Instalasi LAMP[4]
Semenjak Ubuntu 07.04 ada script dengan nama tasksel [5] untuk membantu berbagai macam proses instalasi paket-paket aplikasi, seperti LAMP,DNS, Firewall, Samba dan masih banyak yang lain. Instalasi Apache, PHP dan MySQL jadi jauh lebih mudah :

sudo tasksel install lamp-server

Perintah lengkap dari proses instalasi LAMP

sudo apt-get install apache2 php5 mysql-server php5-mysql

Setelah proses instalasi selesai sekarang waktunya menjalankan apache-nya

sudo /etc/init.d/apache2 restart

Coba buat file php dan letakkan di /var/www untuk mengetes apakah proses instalasi berhasil. Langkah berikutnya adalah memindahkan VirtualServer folder dari /var/www ke folder kerja-nya si NetBeans, secara default foldernya ada di /home//NetBeansProjects

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mysite
sudo mcedit /etc/apache2/sites-available/mysite

Ganti semua entry /var/www/ dengan /home//NetBeansProjects, kemudian install virtualhost mysite dan unistall virtual host default

sudo a2dissite default
sudo a2ensite mysite
sudo /etc/init.d/apache2 reload

Instalasi XDebug[6]
Ubuntu 08.04 sudah menyediakan package untuk XDebug, jadi kita nggak perlu compile dari source codenya cukup jalankan instalasi :

sudo apt-get install php5-xdebug

Gw nggak gitu paham apa aja requirement XDebug ini, tapi disarankan untuk install beberapa aplikasi berikut ini :

sudo apt-get php5-dev apache2-dev php-pear

Sampai di sini, proses instalasi sudah cukup dan tinggal mengedit file /etc/php5/apache2/php.ini dan tambahkan baris berikut ini tepat sebelum tag [Date] :

zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so

[debug]
; Remote settings
xdebug.remote_autostart=off
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000

; General
xdebug.auto_trace=off
xdebug.collect_includes=on
xdebug.collect_params=off
xdebug.collect_return=off
xdebug.default_enable=on
xdebug.extended_info=1
xdebug.manual_url=http://www.php.net
xdebug.show_local_vars=0
xdebug.show_mem_delta=0
xdebug.max_nesting_level=100
;xdebug.idekey=

; Trace options
xdebug.trace_format=0
xdebug.trace_output_dir=/tmp
xdebug.trace_options=0
xdebug.trace_output_name=crc32

; Profiling
xdebug.profiler_append=0
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=0
xdebug.profiler_output_dir=/tmp
xdebug.profiler_output_name=crc32

perhatikan bagian zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so terkadang nama foldernya bisa berbeda, anda harus mengecek ulang apakah folder 20060613+lfs memang ada atau tidak, kemungkinan di Ubuntu lain akan mempunyai struktur folder yang berbeda.

Setelah semua proses instalasi selesai, akhirnya gw punya lingkungan development PHP yang bisa debugging tanpa harus membeli Zend Studio, :D.

Quote :
[1] http://php.netbeans.org/
[2] http://www.xdebug.org/
[3] http://download.netbeans.org/netbeans/6.1/final/
[4] https://help.ubuntu.com/community/ApacheMySQLPHP
[5] https://help.ubuntu.com/community/Tasksel
[6] http://2bits.com/articles/setting-up-xdebug-dbgp-for-php-on-debian-ubuntu.html

→ 5 CommentsTags: netbeans

Artivisi @ JUG Booth @ IGOS Summit 2

May 26th, 2008 · No Comments

Gw akan bawain workshop singkat di booth JUG pada igos summit 2 tanggal 27-28 Mei 2008

Tempatnya di JaCC booth no 7.

Materi yang gw bawain :

  • 27 Mei 09.00-12.00 : JDBC, contoh source codenya ada di desktop app project template
  • 27 Mei 14.00-17.00 : JPA
  • 28 Mei 09.00-12.00 : Web basic, ini masih blom pasti materinya, tergantung peserta, mau web atau desktop
  • 28 Mei 14.00-17.00 : JasperReport

Silahkan bawa laptop masing-masing, nanti disediakan infokus dan colokan listrik. Semoga pameranya nggak terlalu rame, jadi bisa lumayan tenang buat workshop.

C U There

foto-foto selama di Igos Summit

workshop java

workshop

Lengkapnya ada di sini : http://picasaweb.google.co.uk/indrayana.mb/JUGAtIGOSSummit2?authkey=XwWLgb99UeA

→ No CommentsTags: event

Template Project Desktop Sederhana

May 24th, 2008 · No Comments

Hmmm, yet another desktop template ? padahal udah ada dua postingan gw sebelumnya yang membahas desktop project template, di sini dan di sana, alasan utama karena gw diminta untuk ngisi training sehari desktop aplication.

Tanggal 10 mei kemaren, adek-adek kelasku yang tergabung dalam Java Campus Team mengadakan code camp selama tiga hari, dilaksanakan setiap hari minggu. Nah gw kebagian hari terakhir untuk membahas aplikasi desktop sederhana. Sedangkan dua hari sebelumnya membahas tentang java language fundamental.

Sebelum memulai training gw melihat JPA project template sebagai materi yang cocok dengan timing dari training ini. Tetapi gw tetep mau mengajarkan dasar-dasar JDBC, karena JPA ini kodenya benar-benar bersih dari JDBC. Kalau tidak diajarkan, nanti khawatirnya peserta akan jadi framework coder semata tanpa tahu detail dari underliying technology seperti JDBC ini. Jadi gw menghilangkan beberapa hal yang sedikit menyita waktu agar materi JDBC + JPA dapat tersampaikan dalam waktu satu hari.

Hal pertama yang gw hilangkan adalah: MySQL. Adek-adek kelas ini membawa laptop sendiri, dan gak semua laptop terinstall MySQL, daripada ribet install, mending gunakan saja database yang sudah ada di java, Java DB.

Hal kedua yang gw hilangkan adalah layout aplikasi Swing yang menggunakan 2 buah JPanel terpisah yang digabungkan dengan sebuah JFrame. Gw ubah agar cuma ada satu class UI dengan meletakkan JTabbedPane ke dalam sebuah JFrame, hal ini mengurangi banyak sekali kode UI, seperti : menghandle CardLayout, membuat JTree untuk menu dan menggabungkan semuanya dalam satu JFrame.

NetBeans memberikan kemudahan untuk membuat JTabbedPane, langkah pertama adalah meletakkan sebuah JTabbedPane ke dalam JFrame. Kemudian dari jendela inspector kita bisa menambahkan tab-tab di dalamnya. Proses penambahan tab ini sedikit tricky, karena ternyata agak sulit menambahkan tab baru ke dalam JTabbedPane dengan cara drag-n-drop. Cara yang lebih gampang adalah dengan melakukan klik kanan di komponen JTabbedPane dari jendela inspector dan pilih menu :

Add from pallete -> Swing containers -> JPanel

Tampilan aplikasi menjadi seperti ini :






Ketiga adalah menghilangkan kode-kode BeansBinding dan menggunakan cara lama: TableModel. Di project template sebelumnya gw menggunakan framework BeansBinding untuk menampilkan data List of Object ke dalam komponen Swing. Karena nggak mau susah-susah menjelaskan BeansBinding akhirnya gw bikin implementasi TableModel untuk menampilkan object Person dan Group. Contoh kode untuk TableModel ini sebagai berikut :

public class PersonTableModel extends AbstractTableModel{
    private List persons;
    public PersonTableModel(List persons) {
        this.persons = persons;
    }
    public int getRowCount() {
        return persons.size();
    }
    public int getColumnCount() {
        return 4;
    }
    public Object getValueAt(int rowIndex, int columnIndex) {
        Person p = persons.get(rowIndex);
        switch(columnIndex){
            case 0 :
                return p.getId();
            case 1 :
                return p.getName();
            case 2 :
                return p.getEmail();
            case 3 :
                return p.getGroup().getName();
            default :
                return “”;
        }
    }
    @Override
    public String getColumnName(int column) {
        switch(column){
            case 0 :
                return “ID”;
            case 1 :
                return “NAME”;
            case 2 :
                return “EMAIL”;
            case 3 :
                return “GROUP”;
            default :
                return “”;
        }
    }

}

Setelah tiga hal diatas gw lakukan, akhirnya gw bisa menyampaikan materi untuk JDBC + JPA dalam waktu sehari. Jadinya ada dua buah implementasi DAO untuk project template ini: JPA dan JDBC. Banyak hal yang bisa dipelajari dari sini, antara lain

  1. JDBC code, penting dipelajari untuk semua programmer yang berurusan dengan database
  2. Perbedaan JPA dan JDBC murni
  3. Menhandle relationship secara manual dengan JDBC
  4. Transaction Manual dengan JDBC
  5. Perbandingan jumlah kode dalam JPA yang jauh lebih sedikit dibanding JDBC murni
  6. Susahnya menghandle relationship secara manual tanpa bantuan JPA

Bagian aplikasi yang ada GUInya dari project template ini dapat berjalan dengan menggunakan Service dari JPA, tetapi gw udah sediain class MainJdbc dan MainJpa untuk melihat secara programatic gimana sih caranya membuat kode dengan kedua mode ini.

Silahkan download source codenya di sini

Ok, kalau ada pertanyaan seputar project template ini saya sudah siapkan milisl project-template@googlegroups.com

selamat belajar

→ No CommentsTags: netbeans · project template

Java DB aka Apache Derby

May 24th, 2008 · 3 Comments

apache derby logoSeminggu yang lalu gw resmi memformat ulang semua partisi hardisk laptop, membuang windows xp (IPB campus license) dan Ubuntu 07.10 kemudian menginstall brand new Hardy Heron (Ubuntu 08.04).

Saking semangatnya gw lupa kalau di kontrakan gw nggak ada internet cepet, damn, padahal kerjaan juga masih menumpuk buaanyak, kenapa gw panik? karena nggak ada MySQL di instalasi default Hardy Heron, hmmm, what should i doo?

Gw keinget kalau di JDK 1.6 udah ada embeded database yang disebut Java DB. Database ini awalnya adalah Apache Derby yang dibranding ulang, jadi sebenernya ya barang yang sama dengan nama yang berbeda. Akhirnya gw berusaha oprek-oprek agar aplikasi-aplikasi yang gw kerjain bisa jalan diatas Java DB, nah disini nih baru kelihatan enaknya pake Hibernate, gw tinggal oprek-oprek konfigurasi di bagian jdbc.properties, dan tralala aplikasi gw jalan lagi.

Kofigurasi jdbc dan hibernate dialect untuk MySQL :

jdbc.username=root
jdbc.password=admin
jdbc.url=jdbc:mysql://localhost:3306/databasename
jdbc.driver=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Dengan Java DB berubah menjadi :

jdbc.username=root
jdbc.password=admin
jdbc.url=jdbc:derby://localhost:1527/databasename
jdbc.driver=org.apache.derby.jdbc.ClientDriver
hibernate.dialect=org.hibernate.dialect.DerbyDialect

Enaknya lagi, di netbeans sudah ada database client management untuk Java DB ini, kita bisa membuat database baru, membuat table, menambahkan column ke dalam table, melakukan query dan membuat query dengan visual query designer.

Sayangnya nih gw ga menemukan cara bagaimana drop database dan delete column, konyol juga yah :D, akhirnya gw berasumsi kalau mau drop database harus menggunakan query, dengan mengeksekusi query :

drop database [databasename];

And then? damn, kok eror sih? wah gimana caranya kalau mau drop database? setelah oprek sana-sini akhirnya ketemu satu cara, delete database secara fisik!!, he? ya mau gimana lagi? kalau di linux, database Java DB akan diletakkan di :

$home/.netbeans-derby/databasename

Delete column sih ternyata nggak sesusah drop database, tinggal pake query aja bis

alter table [tablename] drop column [columnname];

Ada satu masalah lagi nih, di NetBeans 6.0.1 secara default tidak mempunyai library Java DB, jadi driver Java DB harus ditambahkan ke dalam library netbeans secara manual dari jar, nama jar-nya adalah DerbyClient.jar. anda bisa search file di dalam folder instalasi netbeans untuk mandapatkan file DerbyClient.jar

Setelah mencoba-coba Java DB, saya jadi males mau pake MySQL hanya untuk development dan testing :D, akhirnya semua project template yang akan saya posting ke depan plus wicket project template secara default akan menggunakan Java DB.

Proses setup Java DB tidak susah, hanya perlu beberapa langkah saja :

  1. Buka tab service dari NetBeans (lebih baik gunakan versi 6.1)
  2. Expand node databases, dan Klik kanan node Java DB kemudian pilih menu create database
  3. Masukkan nama database, username dan password yang sesuai
  4. Klik OK

dan database anda sudah siap untuk digunakan.

Selamat mencoba

→ 3 CommentsTags: netbeans · project template

project-template@googlegroups.com

May 24th, 2008 · No Comments

Gw berencana untuk mengembangkan project-template yang sudah gw susun secara kontinue, jika ada teknologi baru atau ada versi upgrade, maka project template yang lama akan diperbaiki atau dibikin varianya. So far sudah ada web page untuk project-template di google code :

http://code.google.com/p/project-template

Tapi gw memerlukan berbagai masukan untuk memperbaiki kualitas project-template, nah gw mengundang semua yang tertarik untuk ikut berkontribusi dengan project ini untuk bergabung ke milis project-template@googlegroups.com

c u there

→ No CommentsTags: project template

Project template wicket-spring-hibernate

May 23rd, 2008 · 2 Comments

Setelah berkutat selama dua hari, hari ini gw menyelesaikan satu lagi project template : wicket-spring-hibernate. Alasan utama gw mau mendalami ini adalah karena gw pada dasarnya adalah Swing developer, gw seneng pattern class-class yang ada di Swing, gw seneng konsep Model, Event-Listener dan Renderer di komponen-komponen Swing. Alasan lainnya adalah gw udah mulai ngerasa jenuh dengan JSF, setelah berkutat selama nyaris delapan bulan terakhir gw ga bahagia dengan siklus code-compile-debug JSF terlalu lama, karena JSF itu mayan berat.

Awal melihat Wicket gw tertarik dengan View code wicket yang pure html, contohnya seperti di bawah ini  nih:

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <table>
            <form wicket:id="groupForm">
                <tr>
                    <td>Group Name</td>
                    <td><input type="text" wicket:id="name"/></td>
                </tr>
                <tr>
                    <td><input type="submit" value="Save"/></td>
                </tr>
                <input type="hidden" wicket:id="id"/>
            </form>
        </table>
        <br/>
        <table >
            <thead>
                <th>id</th>
                <th>Name</th>
            </thead>
            <tbody>
                <tr wicket:id="groups">
                    <td wicket:id="id"></td>
                    <td wicket:id="name"></td>
                </tr>
            </tbody>
            <a href="#" wicket:id="personPage">Person Page</a>
        </table>
    </body>
</html>

Terlihat hanya ada attribut wicket:id di dalam tag html, hal ini sangat berbeda dengan aliran JSP dimana didalamnya terdapat taglib-taglib aneh. JSF juga nyaris serupa, walaupun di facelets kita bisa menggunakan tag jsfc tetap saja kita terpaksa menggunakan tag-nya JSF kalau ketemu komponen-komponen yang kompleks, seperti dataGrid.

Alasan-alasan lain yang lebih lengkap sih bisa dibaca di blognya peter thomas :

http://ptrthomas.wordpress.com/2006/12/09/starting-to-look-at-wicket/
http://ptrthomas.wordpress.com/2007/03/02/wicket-impressions-moving-from-spring-mvc-webflow/
http://ptrthomas.wordpress.com/2007/05/14/a-wicket-user-tries-jsf/

Selama ini gw bikin aplikasi web selalu memerlukan requirement yang sangat simple, mostly CRUD code, Ajax-pun digunakan dengan sangat terbatas. Spesifikasi dan kompleksitas JSF terlalu besar untuk jenis aplikasi ini.

Wicket juga tidak lepas dari berbagai macam kelemahan, no silver bullet ya. Salah satu kelemahannya adalah management session yang memaksa user untuk mengerti low level arsitektural wicket yang menurut saya sih lumayan rumit. Kelemahan lain adalah pattern yang digunakan wicket ini benar-benar mirip dengan komponen-komponen di Swing, banyak sekali class-classnya. Programmer dipaksa untuk menghafalkan berbagai macam class componen, model, renderer dan lain-lainya, walaupun sebenernya ini masih jauh lebih menyenangkan dibanding menghafalkan tag componentnya JSF. Menghafalkan kompoenen sih sudah jadi resiko component based framework, dan menurutku sih menghafalkan nama komponen masih jauh lebih menyenangkan dibanding dengan membuat komponen sendiri :D, seperti kalau kita menggunakan action based framework seperti struts, struts2 atau SpringMVC.

Kelemahan lain adalah dokumentasi wicket yang masih kurang lengkap, terutama yang wicket 1.4, versi ini sudah memanfaatkan feature java 1.5 dengan maksimal, semua component dan class-classnya sudah generics sehingga mengurangi code untuk casting. At least ada wiki yang lengkap untuk semua komponennya :

http://cwiki.apache.org/WICKET/

Feature yang sangat menyenangkan dari wicket adalah XML-free configuration, nggak seperti JSF yang ada faces-config.xml atau struts yang ada struts-config.xml. Wicket hanya membutuhkan web.xml untuk mendeklarasikan servlet saja, dan itu hanya memerlukan beberapa baris tambahan saja, rapi. Seperti halnya aplikasi Swing yang mempunyai satu class khusus yang mempunyai main method, wicket mempunyai satu class khusus yang extends Application. Class ini adalah singleton yang hanya mempunyai satu buah instance saja, kita bisa meletakkan global variabel di dalam class ini.

Ada satu pattern yang menarik dari wicket, setiap class yang extend WebPage (ini mirip backingbean-nya JSF) harus ada file html dengan nama filenya sama persis dengan nama classnya. Misalnya dalam project template ini ada dua buah class yang extends WebPage, yaitu: PersonPage dan GroupPage, maka akan ada PersonPage.html dan GroupPage.html. Pattern ini tidak lazim ada di framework apapun, tetapi ada alasan bagus kenapa pattern ini digunakan (sebenernya gw juga nggak tau yah apa alasanya :D).

Wicket juga disertai dengan spring-extention, menggabungkan spring dengan wicket adalah perkara yang sangat mudah. Kita tinggal memasang spring servletcontextlistener seperti biasa, kemudian dari class-class wicket kita bisa menggunakan annotation @SpringBean untuk secara otomatis menginjek spring bean. Gw dapet satu caveat dari Edward Yakop tentang gimana caranya agar kita bisa menginjek spring bean ke dalam class yang tidak extends WebApplication, yaitu dengan menambahkan kode di bawah ini di bagian constructor class tersebut :

InjectorHolder.getInjector().inject(this);

Template aplikasi desktop dengan hibernate-spring masih bisa digunakan, tinggal mengganti kode-kode UI Swing dengan kode-kode Wicket.

NetBeans juga menyediakan wicket support yang bisa diperoleh di sini : https://nbwicketsupport.dev.java.net/

Silahkan download project templatenya di sini

→ 2 CommentsTags: netbeans · project template

Contoh kode Event-Listener-Trigger pattern

May 21st, 2008 · No Comments

Kemaren seorang temenku nanya tentang bagaimana caranya membuat pattern event-listener. Dan baru hari ini kesampaian untuk bikin sample codenya.

Event-Listener adalah pattern yang sangat penting dan banyak digunakan dalam aplikasi. Semua event dalam Swing menggunakan pattern ini secara extensive. Dulu pas saya pertama bekerja di ICRAF, hal yang pertama kali diajarkan mas degy adalah pattern event listner ini, karena ya itu, banyak digunakan dan konsep yang sangat penting dalam aplikasi.

Pattern ini sediktnya melibatkan class Event, class Trigger, interface Listener dan class implementasi dari interface Listener.

public class CustomEvent {

  private String description;
  private String name;
  private Date date;

  public CustomEvent(String description, String name, Date date) {
    this.description = description;
    this.name = name;
    this.date = date;
  }

  public Date getDate() {
    return date;
  }

  public String getDescription() {
    return description;
  }

  public String getName() {
    return name;
  }

}

Class Event hanya sebuah java bean sederhana yang bertugas merekam event yang terjadi bersama dengan informasi dari event tersebut. Class CustomEvent diatas hanya berisi tiga informasi: nama, deskripsi dan tanggal/waktu terjadinya event.

public interface CustomListener {

  public void process(CustomEvent event);

}

Interface Listner hanya terdiri dari sebuah method process dengan argumen object CustomEvent. Nantinya user akan membuat implementasi dari interface ini dan setiap implementasi akan menghandle event secara berbeda.

public class SimpleListener implements CustomListener{

  public void process(CustomEvent event) {
    System.out.println("simple listener executed at " + event.getName());
  }

}
public class AnotherSimpleListener implements CustomListener{

  public void process(CustomEvent event) {
    System.out.println("another simple listner executed at " + event.getName());
  }

}

Class SimpleListner dan AnotherSimpleListner adalah implementasi dari interface CustomListner, terlihat bahwa kedua class menghandle event dengan cara yang berbeda, yang satu mengeluarkan text dengan awalan “simple listner” dan satunya mengeluarkan text dengan awalan “Another simple listener”. Method ini nantinya akan dieksekusi oleh class Trigger jika suatu event terjadi.

public class CustomTrigger {

   private Set listeners = new HashSet();

  public void runSimulation(){

    CustomEvent start =  new CustomEvent(”start aplication”, “start event”, new Date());

    for(CustomListener listener : listeners ){
       listener.process(start);
    }
    try {
      Thread.sleep(1000l);
    } catch (InterruptedException ex) {
      Logger.getLogger(CustomTrigger.class.getName()).log(Level.SEVERE, null, ex);
    }

    CustomEvent end = new CustomEvent(”end application”, “end event”, new Date());

    for(CustomListener listener : listeners){
      listener.process(end);
    }
  }

 public void addListner(CustomListener listener){
    listeners.add(listener);
  }

  public void removeListener(CustomListener listener){
    listeners.remove(listener);
  }

}

Class Trigger akan menerima listener, nanti jika ada event yang terjadi didalam trigger, class ini akan mengeksekusi listener dengan menyertakan argument eventnya. CustomTrigger mempunyai satu method runSimulation yang berguna untuk memicu event di dalamnya, kalau dalam aplikasi swing, method ini sepadan dengan method yang ada di dalam komponen Swing yang diekusi ketika suatu event, misalnya mouse click, terjadi. Di dalam method runSimulation ada dua buah event, start event dan end event. Ketika event tersebut terjadi, akan dibuat object event dan berikutnya akan dieksekusi semua listener-nya. Class CustomTrigger ini juga mempunyai method addListener dan removeListener untuk mendaftarkan dan menghilangkan listener.

Setelah semua class selesain disusun, sekarang tinggal membuat kode untuk menyatukan semuanya.

public class Main {
  public static void main(String[] args) {

    CustomTrigger trigger = new CustomTrigger();
    SimpleListener simpleListener = new SimpleListener();
    trigger.addListner(simpleListener);
    AnotherSimpleListener anotherSimpleListener = new AnotherSimpleListener();
    trigger.addListner(anotherSimpleListener);
    trigger.runSimulation();

  }
}

Class Main hanya ada satu method main saja, di dalamnya terdapat kode untuk mengistansiasi trigger dan listenernya, kemudian mendaftarkan semua listener ke trigger. Langkah terakhir adalah memanggil method runSimulation untuk mengenerate eventnya.

Silahkan download source codenya di sini

Selamat Belajar.

→ No CommentsTags: pattern