Menggunakan Spring Annotation (Struts2-Spring #2)

Posted on September 08, 2010 by Dian Aditya

Ini lanjutan dari blog saya yang kemarin tentang Integrasi Struts2 dengan Spring Framework, dan yang ingin saya sharing kali ini gak akan jauh berbeda dari topik kemarin, yaitu tentang salah satu fitur dari Spring Framework yang sudah ada sejak versi 2.5 yaitu annotation. Dalam hal ini saya akan mencontohkan bagaimana melakukan autowiring terhadap DataSource (gak jauh dari yang kemarin, cuma ganti jadi anotasi doank).

Kali ini saya membuat kasus (lohloh bikin kasus) dimana saya memiliki sebuah Data Access Object (DAO) untuk melakukan transaksi database, dan DAO ini membutuhkan DataSource untuk dapat melakukan tugasnya yang akan digunakan oleh Controller untuk menyampaikannya kepada Viewer Layer. Hehehehe?. Saya juga bingung gimana menggambarkannya.

Langsung berangkat ke TKP.

Berikut sedikit modifikasi dari applicationContext-jdbc.xml

  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: 	<context:component-scan base-package="com.mervpolis.dwx" />
  9: 
 10: 	<bean id="dataSource"
 11: 		class="org.springframework.jdbc.datasource.DriverManagerDataSource"
 12: 		p:driverClassName="com.mysql.jdbc.Driver" p:username="root"
 13: 		p:password="admin" p:url="jdbc:mysql://localhost:3306/test" />
 14: 
 15: </beans>

Nah ada satu baris mantra yang ditambahkan di situ yang berfungsi untuk melakukan scan terhadap semua class yang mengandung anotasi seperti @Autowired @Service @Component dll.

ItemDao.java

  1: package com.mervpolis.dwx.struts2spring.dao;
  2: 
  3: import java.sql.ResultSet;
  4: 
  5: public interface ItemDao {
  6: 	void saveItem(String name, String price);
  7: 
  8: 	ResultSet getAllItems();
  9: }

Berikut implementasinya

  1: package com.mervpolis.dwx.struts2spring.dao;
  2: 
  3: import java.sql.Connection;
  4: import java.sql.PreparedStatement;
  5: import java.sql.ResultSet;
  6: import java.sql.SQLException;
  7: 
  8: import javax.sql.DataSource;
  9: 
 10: import org.springframework.beans.factory.annotation.Autowired;
 11: import org.springframework.stereotype.Service;
 12: 
 13: /**
 14:  * Sama dengan
 15:  * <code>&lt;bean id="itemDao" class="com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl"&gt;</code>
 16:  *
 17:  */
 18: @Service
 19: public class ItemDaoImpl implements ItemDao {
 20: 
 21: 	/**
 22: 	 * Nah setternya diganti dengan yang satu ini
 23: 	 */
 24: 	@Autowired
 25: 	private DataSource dataSource;
 26: 
 27: 	public void saveItem(String name, String price) {
 28: 		try {
 29: 			Connection connection = dataSource.getConnection();
 30: 
 31: 			String sql = "INSERT INTO item (name, price) VALUES (?, ?)";
 32: 			PreparedStatement statement = connection.prepareStatement(sql);
 33: 			statement.setString(1, name);
 34: 			statement.setString(2, price);
 35: 
 36: 			statement.executeUpdate();
 37: 		} catch (SQLException e) {
 38: 			e.printStackTrace();
 39: 		}
 40: 	}
 41: 
 42: 	public ResultSet getAllItems() {
 43: 		try {
 44: 			Connection connection = dataSource.getConnection();
 45: 
 46: 			ResultSet resultSet = connection.prepareStatement(
 47: 					"SELECT * FROM item").executeQuery();
 48: 
 49: 			return resultSet;
 50: 		} catch (SQLException e) {
 51: 			e.printStackTrace();
 52: 
 53: 			return null;
 54: 		}
 55: 	}
 56: 
 57: }
 58: 

Sudah mulai terlihat bedanya, untuk melakukan injection sudah tidak menggunakan setter lagi, tetapi dengan menggunakan @Autowired, sedangkan untuk pembuatan bean-nya digunakan @Service.

Sekarang tingga; menyuntikkan DAOnya ke controller

  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: import org.springframework.beans.factory.annotation.Autowired;
 16: 
 17: import com.mervpolis.dwx.struts2spring.dao.ItemDao;
 18: import com.mervpolis.dwx.struts2spring.datasource.DataSourceAware;
 19: import com.opensymphony.xwork2.ActionSupport;
 20: 
 21: /**
 22:  * @author Dian Aditya
 23:  *
 24:  */
 25: @Results({ @Result(name = ActionSupport.SUCCESS, type = "velocity", location = "/view/item/item_list.vm") })
 26: public class ItemController extends ActionSupport {
 27: 
 28: 	private List result = new ArrayList();
 29: 	private String id;
 30: 
 31: 	/**
 32: 	 * Inject lagi
 33: 	 */
 34: 	@Autowired
 35: 	private ItemDao itemDao;
 36: 
 37: 	@Action("/item/show")
 38: 	public String show() throws Exception {
 39: 		if (itemDao == null) {
 40: 			addActionError("Gagal menyuntik itemDao");
 41: 		} else {
 42: 			ResultSet resultSet = itemDao.getAllItems();
 43: 			while (resultSet.next()) {
 44: 				Map data = new HashMap();
 45: 				data.put("name", resultSet.getString("name"));
 46: 				data.put("price", resultSet.getString("price"));
 47: 				result.add(data);
 48: 			}
 49: 		}
 50: 
 51: 		return SUCCESS;
 52: 	}
 53: 
 54: 	public String getId() {
 55: 		return id;
 56: 	}
 57: 
 58: 	public void setId(String id) {
 59: 		this.id = id;
 60: 	}
 61: 
 62: 	public List getResult() {
 63: 		return result;
 64: 	}
 65: }
 66: 

Dan coba dijalankan, hasilnya tidak akan jauh beda dari contoh sebelumnya.

 

Sedikit bonus :p berikut contoh tanpa menggunakan anotasi.

  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: 	<bean id="itemDao" class="com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl"
 14: 		p:dataSource-ref="dataSource" />
 15: 
 16: </beans>

Atau secara sederhananya mungkin juga seperti ini.

  1: // org.springframework.jdbc.datasource.DriverManagerDataSource
  2: DriverManagerDataSource dataSource = new DriverManagerDataSource();
  3: dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  4: dataSource.setUsername("root");
  5: dataSource.setPassword("admin");
  6: dataSource.setUrl("jdbc:mysql://localhost:3306/test");
  7: 
  8: // javax.sql.DataSource
  9: DataSource source = dataSource;
 10: 
 11: // com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl
 12: ItemDaoImpl daoImpl = new ItemDaoImpl();
 13: daoImpl.setDataSource(source);
 14: 
 15: // com.mervpolis.dwx.struts2spring.dao.ItemDao
 16: ItemDao itemDao = daoImpl;

Cape juga ternyata, selamat menikmati hidangannya.

Filed under Java | 0 Comments | Permalink

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