Meruvian Menyambut Idul Fitri 1431 H

Posted on September 01, 2010 by Dian Aditya

Hari ini merupakan hari ke dua saya di Meruvian Camp Depok dalam rangka kunjungan rutin. Menyenangkan ternyata walaupun saya sempat merasa sebagian dari mereka bakalan terusik dengan selembar checklist yang saya bawa :P Dan mulai dari kemarin malam hingga siang ini, merupakan moment yang cukup menarik menurut saya. Dimulai dari pemilihan kepala suku (setiap bulan ada kepala suku baru yang bertanggung jawab menjaga stabilitas nasional) hingga pagi ini sebelum kegiatan wajib dimulai. Sangat berkesan dimana pagi ini diadakan ritual semacam babat alas, mungkin yang satu ini lebih cocok disebut babat lumut atau mungkin sapu jogan. Apalah namanya, yang jelas ritual ini dilakuakan atas kesadaran semua penduduk Meruvian Depok untuk menyambut Hari kemenangan 1 Syawal 1431 H yang tinggal mengitung hari. Berikut beberapa foto ketika ritual sedang berlangsung.

 

Kepala suku baru sedang memberi contoh bagaimana cara merawat benda keramat yang paling sering dibutuhkan dalam keadaan darurat :D

Senyum itu ibadah lho?.

Ikutan nampang juga (ikutan bantuin maksudnya)

Sikat dan karbol, salah satu senjata yang ampuh untuk membasmi kuman

Dan akhirnya ritual diakhiri dengan pembersihan camp secara menyeluruh

Cukup kagum saya dengan kegiatan tersebut, dan memang inilah pelajaran yang terpenting diluar kompetensi mereka sebagai calon software developer (atau mungkin sudah) yaitu nilai kemandirian dan tanggung jawab terhadap lingkungan. Coding bakalan lebih tenang kalo tempatnya mendukung, betul gak?.

Filed under Experience | 2 Comments | Permalink

Integrasi Struts2 dengan Spring Framework

Posted on August 22, 2010 by Dian Aditya

Awal cerita dimulai ketika dahulu kala saat saya membuat sebuah aplikasi berbasis swing dengan koneksi database menggunakan jdbc (purba banget yah...). Sebuah kasus muncul ketika saya harus menginisialisasikan setiap Object DataSource di setiap class yang membutuhkan pasokan koneksi ke database. Sebuah teknik yang sangat buruk baik secara penulisan kode yang berulang-ulang dan membuang banyak waktu, lebih buruk lagi pengaruhnya terhadap performa aplikasi karena koneksi ke database merupakan sebuah operasi yang mahal, tidak terbayangkan berapa banyak koneksi yang terjadi hanya untuk membuat satu buah CRUD saja. Singkat cerita setelah cari-cari (curi-curi), disitulah awal mula saya bertemu dengan sebuah istilah yang dinamakan Dependency Injection (DI) dan Inversion of Control (Ioc), nah loh dua buah istilah ternyata :p yaitu sebuah mekanisme dimana sebuah object diinisialisasikan 'sekali' dalam IoC container yang kemudian akan disuntikkan ke setiap class yang membutuhkannya, walaupun saat itu saya masih menggunakan cara manual untuk melakukan injeksi ke setiap class melalui constructor.

Akhir cerita masalah selesai hingga saya meneruskan sebuah project bernama BlueOxygen Postila (yang ini sudah pakai hibernate loh :D). Weeiiitt jangan pergi dulu, cerita masih belum selesai.

Babak satu tuntas, dan babak selanjutnya pun berjalan, dan memang benar, masalah barupun muncul ketika saya membuat aplikasi berbasis web menggunakan Struts2 sebagai controllernya. Teknik injeksi pada Postila sama sekali tidak berlaku pada aplikasi web. Dan lagi-lagi saya dipertemukan dengan teknologi yang bernama SpringFramework, sebuah IoC Container yang terpopuler saat itu (mungkin juga sampai saat ini :D).

"Hoaammmm ngantuk, kepanjangan ceritanya!!!" Wehe saya yakin semua yang baca pasti pada ngantuk...

Gak usah panjang lebar (tapi panjang buaaanget :p), saya mau sharing gimana cara melakukan injeksi pada Struts2 dengan menggunakan Spring sebagai IoC containernya. Disini saya mengambil contoh kasus DataSource dimana setiap... @#$@%#$^%$&%!!! Hehehe, kasusnya sama seperti di awal cerita.

Pertama saya menggunakan Struts versi 2.2.1 dan SpringFramework versi 3.0.1.

Berikut beberapa library yang dibutuhkan (belum pake maven :p)

Kemudian tambahkan baris berikut pada web.xml

  1: <?xml version="1.0" encoding="UTF-8"?>
  2: <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3: 	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4: 	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5: 	id="WebApp_ID" version="2.5">
  6: 
  7: 	<display-name>Struts2</display-name>
  8: 
  9: 	<filter>
 10: 		<filter-name>struts2</filter-name>
 11: 		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 12: 	</filter>
 13: 
 14: 	<filter-mapping>
 15: 		<filter-name>struts2</filter-name>
 16: 		<url-pattern>/*</url-pattern>
 17: 	</filter-mapping>
 18: 
 19: 	<!-- Spring Configuration -->
 20: 	<context-param>
 21: 		<param-name>contextConfigLocation</param-name>
 22: 		<param-value>classpath:applicationContext*.xml</param-value>
 23: 	</context-param>
 24: 
 25: 	<listener>
 26: 		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 27: 	</listener>
 28: 
 29: 	<welcome-file-list>
 30: 		<welcome-file>index.jsp</welcome-file>
 31: 	</welcome-file-list>
 32: </web-app>

Berikut konfigurasi jdbc connection pada applicationContext-jdbc yang diletakkan pada classpath. Saya menggunakan MySQL DB.

  1: <?xml version="1.0" encoding="UTF-8"?>
  2: <beans xmlns="http://www.springframework.org/schema/beans"
  3: 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4: 	xmlns:p="http://www.springframework.org/schema/p"
  5: 	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6: 		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  7: 
  8: 	<bean id="dataSource"
  9: 		class="org.springframework.jdbc.datasource.DriverManagerDataSource"
 10: 		p:driverClassName="com.mysql.jdbc.Driver" p:username="root"
 11: 		p:password="admin" p:url="jdbc:mysql://localhost:3306/test" />
 12: 
 13: </beans>
 14: 

Kemudian untuk memudahkan implementasi method buat sebuah interface untuk menerima datasource dari konfigurasi bean.

  1: package com.mervpolis.dwx.struts2spring.datasource;
  2: 
  3: import javax.sql.DataSource;
  4: 
  5: public interface DataSourceAware {
  6: 
  7: 	/**
  8: 	 * Action class yang mengimplementasikan method ini akan secara otomatis
  9: 	 * ter-inject oleh object yang telah diinisialisasi pada
 10: 	 * applicationContext-jdbc.xml. Nama method harus sama dengan id pada bean
 11: 	 * (jika id="datasource" maka nama method adalah setDatasource()) dengan
 12: 	 * parameter yang juga harus disesuaikan dengan class pada bean
 13: 	 * (org.springframework.jdbc.datasource.DriverManagerDataSource merupakan
 14: 	 * implementasi dari javax.sql.DataSource)
 15: 	 */
 16: 	void setDataSource(DataSource dataSource);
 17: 
 18: }
 19: 

Coding terus, terus coding... Berikut konfigurasi dari struts.xml

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: 
  3: <!DOCTYPE struts PUBLIC
  4:     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  5:     "http://struts.apache.org/dtds/struts-2.0.dtd">
  6: 
  7: <struts>
  8: 	<constant name="struts.enable.DynamicMethodInvocation" value="false" />
  9: 	<constant name="struts.devMode" value="false" />
 10: 	<constant name="struts.convention.action.suffix" value="Controller" />
 11: 	<constant name="struts.convention.default.parent.package" value="struts-default" />
 12: 	<constant name="struts.convention.package.locators" value="action" />
 13: </struts>

Terakhir buat Action Classnya...

  1: package com.mervpolis.dwx.struts2spring.action;
  2: 
  3: import java.sql.Connection;
  4: import java.sql.ResultSet;
  5: import java.util.ArrayList;
  6: import java.util.HashMap;
  7: import java.util.List;
  8: import java.util.Map;
  9: 
 10: import javax.sql.DataSource;
 11: 
 12: import org.apache.struts2.convention.annotation.Action;
 13: import org.apache.struts2.convention.annotation.Result;
 14: import org.apache.struts2.convention.annotation.Results;
 15: 
 16: import com.mervpolis.dwx.struts2spring.datasource.DataSourceAware;
 17: import com.opensymphony.xwork2.ActionSupport;
 18: 
 19: @Results({ @Result(name = ActionSupport.SUCCESS, type = "velocity", location = "/view/item/item_list.vm") })
 20: public class ItemController extends ActionSupport implements DataSourceAware {
 21: 
 22: 	private DataSource dataSource;
 23: 	private List result = new ArrayList();
 24: 
 25: 	@Action("/item/show")
 26: 	public String show() throws Exception {
 27: 		if (dataSource == null) {
 28: 			addActionError("Gagal menyuntik datasource");
 29: 		} else {
 30: 			Connection connection = dataSource.getConnection();
 31: 			ResultSet resultSet = connection.prepareStatement(
 32: 					"SELECT * FROM item").executeQuery();
 33: 			while (resultSet.next()) {
 34: 				Map data = new HashMap();
 35: 				data.put("name", resultSet.getString("name"));
 36: 				data.put("price", resultSet.getString("price"));
 37: 				result.add(data);
 38: 			}
 39: 		}
 40: 
 41: 		return SUCCESS;
 42: 	}
 43: 
 44: 	public List getResult() {
 45: 		return result;
 46: 	}
 47: 
 48: 	/**
 49: 	 * Nah method inilah yang nantinya secara otomatis akan disuntik oleh si spring
 50: 	 */
 51: 	public void setDataSource(DataSource dataSource) {
 52: 		this.dataSource = dataSource;
 53: 	}
 54: }
 55: 

Eits ternya ada satu lagi yang ketinggalan... Jangan lupa buat viewernya juga... (classpath:/vew/item/item_list.vm)

  1: #foreach($error in $actionErrors)
  2: 	$error
  3: #end
  4: 
  5: $!result

Dan akhirnya selesai juga :D coba jalankan, mungkin terkesan ajaib dimana  DataSource tiba-tiba telah terinisialisasi dan aplikasipun berjalan seperti pada normalnya dan disinilah menurut saya kecanggihan dari Spring.

Filed under Java | 1 Comments | Permalink

Baca Kode ASCII Dengan JQuery

Posted on August 18, 2010 by Dian Aditya

Wets... Waktunya balik ke client side lagi, ini nih saya mo sharing tentang cara baca kode ASCII di JQuery, eits... jangan dianggap saya kurang kerjaan, pembacaan kode ascii ini berguna untuk validasi, salah satunya di blog saya sebelumnya di sini yang menggunakan metode ini untuk membatasi karakter angka saja yang boleh ditulis di textfield.

Sebelumnya apa itu ASCII, ini saya kutip dari Wikipedia

Kode Standar Amerika untuk Pertukaran Informasi atau ASCII (American Standard Code for Information Interchange) merupakan suatu standar internasional dalam kode huruf dan simbol seperti Hex dan Unicode tetapi ASCII lebih bersifat universal, contohnya 124 adalah untuk karakter "|". Ia selalu digunakan oleh komputer dan alat komunikasi lain untuk menunjukkan teks. Kode ASCII sebenarnya memiliki komposisi bilangan biner sebanyak 8 bit. Dimulai dari 0000 0000 hingga 1111 1111. Total kombinasi yang dihasilkan sebanyak 256, dimulai dari kode 0 hingga 255 dalam sistem bilangan Desimal.

Nah langsung aja terjun ke kodenya, pertama yang paling penting bikin formnya dulu (html biasa boleh lah :D)

  1: <table align="center">
  2:   <tr>
  3:     <td>Input</td>
  4:     <td>
  5:       <input type="text" id="input" size="10" style="text-align: center;">
  6: 	</td>
  7:   </tr>
  8:   <tr>
  9: 	<td>Kode ASCII</td>
 10: 	<td>
 11: 	  <input type="text" id="code" size="10" disabled="disabled" style="text-align: center;">
 12: 	</td>
 13:   </tr>
 14:   <tr>
 15: 	<td>Deskripsi</td>
 16: 	<td>
 17: 	  <input type="text" id="desc" size="30" disabled="disabled">
 18: 	</td>
 19:   </tr>
 20: </table>

Dan berikut kode untuk JavaScriptnya

  1: $(function(){
  2:   $('#input').keydown(function(e) {
  3: 			
  4: 	// Baca ASCII nya di sini...
  5: 	var key = e.keyCode;
  6: 			
  7: 	// Validasi angka
  8: 	if (key >= 48 && key <=57) {
  9: 	  $('#desc').val('Angka');
 10: 			
 11: 	// Validasi huruf
 12: 	} else if (key >= 65 && key <=90) {
 13: 	  $('#desc').val('Huruf');
 14: 				
 15: 	// Selain ketentuan diatas :D
 16: 	} else {
 17: 	  $('#desc').val('Bukan angka & huruf');
 18: 	}
 19: 			
 20: 	$('#code').val(key);
 21: 	$('#input').val('');
 22:   });
 23: });

Nah cukup mudah kan (jawab ya!! peace), dan hasilnya adalah sebagai berikut

Input
Kode ASCII
Deskripsi

Yang Bikin Kita Susah Go Global

Posted on August 11, 2010 by Dian Aditya

Kemarin saya diajakin ikutan seminar joget workflow oleh Pak Frans di kawasan mega kuningan, sesuatu yang belum pernah saya alami sebelumnya, seperti pembicaranya yang full english dan para peserta yang usianya jelas jauh di atas saya (mungkin memang saya peserta termuda di sana :D). Sangat terasa 'global'nya bagi saya, mungkin salah satunya karena acaranya diselenggarakan di kantor kedubes Malaysia (walaupun sempat dikejutkan dengan suguhan lemper, semoga tidak diklaim juga sebagai makanan khas mereka) yang mau tidak mau membuat saya harus membandingkan dukungan pemerintah Malaysia dengan pemerintah Indonesia (yang belum saya lihat, red) dalam hal produk opensource butatan dalam negeri.

Bukan bidang saya memang untuk menyinggung masalah-masalah beginian, namun disisi lain memang sedikit demi sedikit kita harus mulai merubah pola pikir kita sendiri yang sudah melekat sejak jaman penjajahan hingga sekarang. Yang mungkin mebuat kita susah untuk go global. Berikut beberapa hal yang sering saya perhatikan di sekitar lingkungan saya, bahkan saya sendiripun sempat mengalami.

"Kerja di luar kota? Jauh amat" kata-kata ini yang dulu sering saya dengar dari teman-teman seangkatan ketika saya memutuskan untuk berangkat ke Meruvian Jakarta sekitar 3 - 4 bulan yang lalu, persis setelah lulus dari SMK tercinta. Yah mungkin ini salah satu faktornya mengapa kita susah banget untuk bisa go global, sebagian dari mereka masih berfikir tinggal dekat dengan keluarga adalah prioritas yang tidak bisa di ganggu gugat. Dan inilah salah satu sifat yang harus dibuang jauh-jauh, mengapa? Ini petuah yang saya dapat dari Pak Frans, "Gimana bisa ke Australia atau keliling Eropa kalau ke luar kota yang masih di dalem negeri sendiri aja gak berani."

"Mending di sini aja, disana ada apan sih?" sebagian dari kita masih sangat nyaman tinggal di tempat asal, "kenapa musti susah-susah, mau makan sayur tinggal ambil di depan rumah, mau bebek tinggal ambil di belakang rumah" disaat Pinky and The Brain diluar sana sedang berusaha membuat hama untuk mengurangi populasi bebek di seluruh dunia untuk memuluskan rencana besar mereka menguasai dunia. Kemungkinan yang belum sempat tefikirkan hingga akhirnya produk-produk produk luar negeri masuk sebelum barang kita sempat go global.

Jadi, apakah kita masih akan memelihara sifat tersebut disaat negara lain mulai gencar mendobrak rumah yang kita pikir masih aman?

Filed under Experience | 2 Comments | Permalink

Struts2 Annotation (Convention Plugin)

Posted on July 06, 2010 by Dian Aditya

  Akhir-akhir ini saya masih sangat interest nih sama controller yang satu ini. Walaupun banyak orang bilang sekarang lagi hot-hotnya SpringMVC dan Struts merupakan teknologi jaman purba, but hey!! Ini Struts2 yang banyak orang menganggapnya sama dengan Struts(saja), walaupun sebenarnya saya juga belum pernah coba Struts 1 heuheuheu... Tapi biarin aja lah, yang jelas saya masih tetep mau bahas tentang Struts2 ini.

  Salah satu alasan yang bikin saya cinta Struts2 adalah plugin-nya yang cukup banyak yang sampai sekarang 'belum' saya temukan hal serupa pada SpringMVC. Nah karena hal itu kali ini saya mau kasih kabar nih kalau Struts2 ternyata punya versi anotasi untuk menggantikan mappernya yang berbentuk XML (saya juga baru tahu nih :hammer:). Kasus ini mirip seperti antara Hibernate Core dengan Hibernate Annotation yang sebenarnya fungsinya sama, hanya berbeda dalam bentuknya saja.

  Langkah awal bagaimana program Struts2 dapat mengenali anotasi adalah dengan menambahkan library struts2-convention-plugin-2xx.jar pada classpath. File ini sudah satu paket dengan struts-core saat kita download library Struts2 (saya menggunakan versi 2.1.6.1).

  Nah untuk mempermudah pemahaman (baca: biar saya gak capek ngetik :p), saya akan membandingkan versi anotasi dengan postingan saya sebelumnya yang masih menggunakan XML.

  Mari memulai membatiknya (baca: coding).

Pertama rubah settingan struts.xml menjadi seperti berikut :

  1: <!DOCTYPE struts PUBLIC
  2:         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  3:         "http://struts.apache.org/dtds/struts-2.0.dtd">
  4: 
  5: <struts>
  6: 	<constant name="struts.enable.DynamicMethodInvocation" value="false" />
  7: 	<constant name="struts.devMode" value="false" />
  8: 	<!-- default path untuk viewer -->
  9: 	<constant name="struts.convention.result.path" value="/pages" />
 10: 	<!-- struts akan secara otomatis mengenali class yang berakhiran 
 11: 		Controller sebagai Action Class -->
 12: 	<constant name="struts.convention.action.suffix" value="Controller" />
 13: 	<constant name="struts.convention.default.parent.package"
 14: 		value="struts-default" />
 15: </struts>

Suffix bersifat opsional, jika baris tersebut tidak ditulis maka secara default struts akan mengenali class yang berakhiran *Action sebagai action class. Kemudian result path berfungsi untuk setting dimana folder viewer diletakkan (secara default result path /WEB-INF/content/).

Sekarang mari kita bandingkan versi XML dengan Annotation

Berikut contoh versi XML-nya, lihat

  1: 	<package name="default" extends="struts-default" namespace="/cobastruts">
  2: 		<action name="HelloVelocity" class="com.mervpolis.struts.HelloWorldAction">
  3: 			<result name="success" type="velocity">/page/hello.vm</result>
  4: 		</action>
  5: 		<action name="HelloJSP" class="com.mervpolis.struts.HelloWorldAction">
  6: 			<result name="success">/page/hello.jsp</result>
  7: 		</action>
  8: 	</package>

Dan berikut ini versi Anotasinya

  1: package com.mervpolis.struts;
  2: 
  3: import java.sql.Timestamp;
  4: 
  5: import org.apache.struts2.convention.annotation.Action;
  6: import org.apache.struts2.convention.annotation.Actions;
  7: import org.apache.struts2.convention.annotation.Namespace;
  8: import org.apache.struts2.convention.annotation.Result;
  9: 
 10: import com.opensymphony.xwork2.ActionSupport;
 11: 
 12: @Namespace("/cobastruts";)
 13: @Actions( {
 14: 		@Action(value = "HelloVelocity", results = { @Result(name = ActionSupport.SUCCESS, type = "velocity", location = "hello.vm";) }),
 15: 		@Action(value = "HelloJSP", results = { @Result(name = ActionSupport.SUCCESS, location = "hello.jsp";) }) })
 16: public class HelloWorldController extends ActionSupport {
 17: 	private String pesan;
 18: 	private String waktu;
 19: 
 20: 	public String execute() {
 21: 
 22: 		pesan = "HELLO WORLD....!!! Method execute telah dijalankan....";
 23: 		waktu = new Timestamp(System.currentTimeMillis()).toString();
 24: 
 25: 		return SUCCESS;
 26: 	}
 27: 
 28: 	public void setPesan(String pesan) {
 29: 		this.pesan = pesan;
 30: 	}
 31: 
 32: 	public String getPesan() {
 33: 		return pesan;
 34: 	}
 35: 
 36: 	public void setWaktu(String waktu) {
 37: 		this.waktu = waktu;
 38: 	}
 39: 
 40: 	public String getWaktu() {
 41: 		return waktu;
 42: 	}
 43: 
 44: }

Bagaimana? Menurut saya sih annotation lebih efisien daripada XML. Masih berpikir Struts2 susah? Cobain dulu... ^_^

Filed under Java | 0 Comments | Permalink