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.

Presentasi Ruthless Testing

Saya akan berbicara pada pertemuan rutin komunitas Java, JaMU (Java Meet Up). Acaranya akan diadakan di kantor Sun Microsystem, Sabtu, 27 Januari 2006.

Tema yang akan saya bawakan adalah Ruthless Testing. Materi ini sudah dibahas pada beberapa artikel di blog ini. Silahkan datang langsung ke kantor Sun untuk mengikuti presentasinya. Gratis, tidak dipungut biaya. Anda tidak harus menguasai Java untuk bisa hadir.

Materi presentasi bisa dilihat secara online.

Presentasi dibuat menggunakan perangkat canggih bernama S5 (Simple Standards-Based Slide Show System), tools yang dibuat Eric Meyer, pakar CSS. Dengan S5, presentasi dapat dibuka oleh mayoritas browser yang digunakan masyarakat. Tidak tergantung lagi pada OpenOffice apalagi Microsoft Office.

Selamat membaca … sampai ketemu di JaMU.


Intro JMS

Pada artikel ini, kita akan coba buat demo penggunaan JMS menggunakan Spring Framework dan ActiveMQ. Spring Framework 2.0 telah dilengkapi dengan helper class untuk memudahkan kita menggunakan JMS (Java Messaging Service). Sayangnya dokumentasi di Spring Reference kurang lengkap, sehingga ada beberapa bagian yang harus kita cari sendiri.

Jangan khawatir, bagian yang kurang tersebut bisa dibaca di artikel ini.

Berikut skenario yang ingin saya buat:

  1. Jalankan JMS server (kali ini saya gunakan ActiveMQ)

  2. Siapkan MessageListener, yang akan bereaksi bila menerima pesan pada destination tertentu

  3. Kirim beberapa pesan ke destination yang didengarkan oleh MessageListener

  4. Pastikan pesan tersebut diterima dengan baik

Kita akan buat kasus sederhana saja, melibatkan tiga class:

  • Sender.java : pengirim pesan

  • Receiver.java : penerima pesan (MessageListener)

  • Main.java : class untuk menjalankan pengirim dan penerima

Berikut adalah kode programnya.

Sender.java

package tutorial.spring.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

public class Sender {
	private String message = "default message";
	private JmsTemplate jmsTemplate;
	
	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public void send() {
		jmsTemplate.send(new MessageCreator(){
			public Message createMessage(Session sess) throws JMSException {
				return sess.createTextMessage(message);
			}			
		});
	}
}

Receiver.java

package tutorial.spring.jms;

import javax.jms.JMSException;

public class Receiver implements MessageListener {

	public void onMessage(Message msg){
		if (msg instanceof TextMessage) {
			TextMessage txtMsg = (TextMessage) msg;
			try {
				System.out.println(txtMsg.getText());
			} catch (JMSException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("Unsupported message type : "+msg.getClass());
		}
	}	
}

Main.java

package tutorial.spring.jms;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("jms-ctx.xml");
		Sender sender = (Sender) ctx.getBean("sender");
		
		sender.setMessage("Percobaan menggunakan JMS dengan Spring. ");		
		sender.send();
		
		sender.setMessage("Pesan ini seharusnya diterima oleh Message Driven POJO");
		sender.send();
	}
}

Integrasi antara kode Java dan ActiveMQ diatur di konfigurasi Spring, jms-ctx.xml. Berikut kodenya.

jms-ctx.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>

	<bean id="messageListener" class="tutorial.spring.jms.Receiver" />
	<bean id="listenerContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
		<property name="connectionFactory" ref="jmsConnectionFactory"/>
		<property name="destinationName" value="TEST.FOO"/>
		<property name="messageListener" ref="messageListener"/>
	</bean>
	
	<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<constructor-arg index="0"><null/></constructor-arg>
		<constructor-arg index="1"><null/></constructor-arg>
		<constructor-arg index="2" value="tcp://localhost:61616"></constructor-arg>
	</bean>	
	
	<bean id="sender" class="tutorial.spring.jms.Sender">
		<property name="jmsTemplate" ref="jmsTemplate"/>		
	</bean>

	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="jmsConnectionFactory"/>
		<property name="defaultDestinationName" value="TEST.FOO"/>
	</bean>

</beans>

Apabila kita ingin menggunakan JMS server yang lain (selain ActiveMQ), cukup ganti deklarasi jmsConnectionFactory pada jms-ctx.xml di atas. Destination name juga di-hard code dengan nilai TEST.FOO. Nantinya pada aplikasi nyata, nilai ini mungkin ingin kita konfigurasi lebih jauh, atau diparameterisasi dalam database.

ActiveMQ mendukung dynamic destination creation, artinya destination TEST.FOO akan dibuatkan bila belum ada. Pada aplikasi server JMS yang lain, mungkin kita harus membuat TEST.FOO secara manual di server tersebut.

Selamat mencoba, semoga sukses.


Google "endy"

Masukkan keyword “endy” di Google Indonesia. Lihat hasil search paling atas …

[Google Search "endy". Klik untuk memperbesar ](/images/uploads/2007/01/endy-google-search-crop.png)


Version Control untuk Database

Menyimpan kode program Java ke repository tidak sulit. Yang lebih sulit adalah menyimpan artifak database, yaitu:

  • Skema database
  • Stored Procedure
  • Functions
  • Sample/Initial data

Kalau dilakukan dengan cara manual, akan sangat merepotkan, karena programmer harus melakukan langkah-langkah berikut untuk memastikan kode programnya tersimpan di repository:

  1. Copy semua source code melalui Query Editor
  2. Paste satu per satu ke text file
  3. Commit ke repository
  4. Ulangi langkah 1 - 3 untuk setiap kali perubahan

Dengan skala ribuan procedure, cara ini sangat merepotkan dan dijamin tidak akan dilakukan oleh programmer. Harus ada cara yang lebih baik.

Untungnya –seperti halnya masalah yang umum kita temukan– sudah banyak orang lain yang mengalami masalah sama, dan sudah ada yang memecahkannya. Kali ini solusinya adalah ScriptDB4SVN. Aplikasi kecil yang seumur hidupnya hanya bertugas melakukan langkah 1-3 di atas.

Sayangnya aplikasi ini hanya bisa digunakan untuk Microsoft SQL Server.

Aplikasi ini membutuhkan .Net Framework 2.0 yang dapat didownload secara cuma-cuma di website Microsoft. Segera setelah .Net Framework diinstal, kita dapat langsung menjalankan ScriptDB4SVN.

Sebelumnya, kita harus edit dulu file konfigurasinya. Kita harus beritahu ScriptDB4SVN tentang:

  • Host database
  • Nama database yang akan digunakan
  • Daftar tabel yang akan didump datanya

Berikut adalah contoh konfigurasinya

Setelah konfigurasi selesai dibuat, jalankan ScriptDB4SVN.exe. Hasilnya seperti ini.

Screenshot ScriptDB4SVN

Setiap kali ada perubahan di database, dobel-klik ScriptDB4SVN dan commit file yang berubah. Harus diperhatikan, ScriptDB4SVN tidak otomatis menjalankan svn add. Jadi kalau ada Store Procedure baru, kita harus jalankan svn add secara manual.

Pembaca yang teliti mungkin akan melihat script sql dengan nama aneh pada screenshot di atas. Itu adalah script replikasi. Kalau script tersebut dijalankan di Query Analyzer, maka dia akan merekonstruksi database sehingga sama dengan kondisi database target pada saat ScriptDB4SVN dijalankan.

Dengan adanya tools ini, masing-masing programmer dapat bekerja di database lokalnya sendiri. Secara periodik, dia harus melakukan svn update dan merekonstruksi database lokalnya dengan script terbaru sehingga tetap sinkron dengan kondisi terbaru.


Project Starter Kit

Mengelola project software tidak mudah. Ada berbagai aspek teknis dan non teknis. Apalagi kalau projectnya berkaitan dengan pemerintahan atau organisasi lain yang birokratis. Akan banyak pekerjaan dokumentasi.

Di sisi lain, pekerjaan teknis selain coding juga tidak kalah banyaknya. Contohnya, dalam kehidupan sehari-hari programmer, dia harus:

  1. Menulis kode
  2. Menyimpan kode di repository
  3. Memberitahu programmer lain tentang perubahan yang dilakukan
  4. Menulis dokumentasi kode
  5. Menjalankan unit test
  6. Membuat rilis
  7. Menjawab pertanyaan client/bos/tim user manual

Semua kegiatan ini harus dikelola dengan baik agar tidak saling tumpang tindih. Untungnya banyak perangkat pembantu yang dapat memudahkan hidup kita. Pastikan Anda menggunakan persenjataan ini agar proyek bisa berjalan dengan lebih lancar. Berikut daftarnya:

  1. Version Control
  2. Bug tracker
  3. Mailing list
  4. File server
  5. Wiki
  6. Forum
  7. Build server

Mari kita bahas dengan lebih detail.

Version Control

Semacam file server, tapi lebih sakti. Mampu menyimpan riwayat perubahan, perbedaan antar versi, dan lainnya. Silahkan download presentasi saya tentang Subversion untuk pemahaman lebih lanjut.

Bug Tracker

Sepanjang perjalanan project, pasti banyak terjadi kesalahan. Baik kesalahan dokumen, kode program, permintaan yang kurang jelas, dan sebagainya. Daripada membuat mencatat di satu file khusus, lebih baik gunakan aplikasi bug tracker. Setiap entri di bug tracker bisa ditugaskan pada satu user. Status dari setiap entri (sedang dikerjakan, sudah selesai, selesai tapi tidak memuaskan) semua bisa ditentukan.

Gunakan bug tracker untuk memberikan tugas pada orang lain. Bug tracker yang baik biasanya terintegrasi dengan mail server, sehingga begitu kita membuat entri, email akan dikirim ke orang yang menerima tugas. Pada waktu suatu entri selesai dikerjakan dan statusnya diganti, email akan dikirim ke si pemberi tugas. Dengan demikian, tidak ada hal yang tercecer atau terlupakan.

Berikut daftar beberapa aplikasi bugtracker yang gratis dan open source:

Mailing List

Biasanya dalam project, kita akan sering mengirim email ke beberapa orang sekaligus. Misalnya pengumuman rilis, klarifikasi requirement, janji meeting, atau laporan kemajuan. Daripada mengetik banyak alamat sekaligus, lebih baik buat mailing list sesuai tujuan komunikasi. Buatlah mailing list untuk manajemen dan development. Segala pengumuman dan diskusi tentang manajemen proyek dikirim ke mailing list manajemen. Pembicaraan tentang pemrograman dilakukan di milis development.

Dengan demikian, selain tidak perlu mengetik alamat email satu persatu dan beresiko lupa, semua pembicaraan juga terekam secara kronologis.

Tidak mau repot menginstal aplikasi milis? Gunakan saja milis gratisan seperti YahooGroups atau GoogleGroups.

File Server

Selain melalui repository, kadang kita perlu bertukar file berukuran besar. Untuk itu, kita perlu file server. Banyak penyedia file server gratisan di internet, misalnya Rapidshare atau Megaupload.

Kalau tidak mau pakai gratisan –mungkin takut data penting diambil orang– gunakan XAMPP.

Wiki

Wiki adalah website yang bisa diedit orang banyak. Contohnya wiki ArtiVisi. Cara mengeditnya juga mudah dan sederhana. Tidak perlu keahlian HTML atau pemrograman web. Ideal digunakan untuk membuat dokumen yang sering berubah dan diakses sepanjang waktu, misalnya:

  • spesifikasi aplikasi
  • desain sistem
  • manual penggunaan aplikasi

Aplikasi wiki banyak tersedia secara gratis, misalnya:

dan masih banyak aplikasi lainnya.

Perbandingan antar aplikasi dapat dilihat di situs MediaWiki dan DokuWiki

Instalasi DokuWiki sangat mudah, cukup extract, kemudian publish melalui webserver yang support PHP. Pengguna Windows bisa menggunakan XAMPP dan menjalankan DokuWiki dalam 5 (lima) menit saja.

Forum

Apabila proyek/produk kita digunakan masyarakat luas, pasti akan banyak interaksi dengan pengguna. Biasanya pengguna baru akan menemui kesulitan dan butuh tempat bertanya. Mereka ini biasanya malas ikut milis, karena mungkin cuma butuh satu jawaban dan tidak ingin mengikuti diskusi di milis.

Kita bisa gunakan aplikasi forum yang banyak tersedia secara gratis. Salah satu yang terkenal adalah phpBB. Maniak Java bisa gunakan mvnforum.

Build Server

Apabila proyek kita sudah dilengkapi dengan version control, automated unit test, dan automated code review, kita bisa gunakan build server. Gunanya adalah agar secara berkala (misalnya sehari sekali), ada yang mengambil semua kode terbaru dari repository, melakukan kompilasi, menjalankan semua automated test, dan melaporkan hasilnya via website, email, rss, instant messenger, sms, atau media komunikasi lainnya.

Berkat keajaiban open source, aplikasi ini tersedia secara gratis. Kita bisa gunakan CruiseControl atau Luntbuild. Buat yang nekat tetap ingin bayar, bisa gunakan Pulse atau Bamboo.

Wow … begitu banyak yang harus disiapkan?

Begitu dalam pikiran Anda.

Jangan khawatir, ada aplikasi gratis untuk menyatukan semuanya. Gunakan Trac.

Bagaimana kalo projectnya banyak? Di kantor saya biasanya ada 10 project jalan berbarengan. Belum lagi 15 produk yang harus dikelola.

Jangan khawatir. Bawa pulang Sourceforge ke kantor Anda. Atau gunakan saingannya, GForge. Keduanya gratis dan open source.

Demikianlah rangkaian persenjataan dalam mengelola proyek. Semoga bermanfaat.