Travelling Plan and Salary++

Halooo, dah lama nih ga freewriting. Nulis bebas gituh maksudnya.

Oke kita mulai dengan kisah tenggorokan yang sakit dan mulut yang sariawan lagi serta perut yang agak-agak tidak karuan. Pasti ini semua efek dari coca cola yang saya tenggak banyak sekali semalam, dan kebanyakan makan saos (tulisannya harusnya saus). 😦 Ya gitulah makanan minuman. Yang enak biasanya ga sehat, yang tidak enaklah yang sehat. Namun tetep aja, misalnya, dibandingkan susu saya lebih suka coca cola.

Cerita selanjutnya adalah mengenai kisah kerja saya. Tadi sore saya baru bertemu dengan big bos di kantor. Inti pertemuan adalah mengenai evaluasi kerja satu tahun pertama saya. Saya masuk 15 Juli 2008. Sekarang sudah Juli 2009, itulah waktu, berjalan dengan sangat cepat. Bagian menarik dari pertemuan tersebut adalah bos menyatakan cukup puas dengan hasil kerja saya selama setahun terakhir. Padahal saya sendiri justru merasa kurang. Bagian terpenting dari pertemuan itu adalah salary++. Tidak terlalu mengejutkan, karena sejak 2 bulan lalu saya sudah meminta hal tersebut. Nilai incrementnya cukup lumayan. Bisa maksa jika ngotot pengen kredit mobil. Jika bicara masalah gaji tidak akan pernah ada habisnya. Hal yang terpenting dari penghasilan bukanlah kuantitasnya namun keberkahannya. Kuantitas melimpah jika tidak berkah, pasti tidak akan terasa bermanfaat. Tentu saja meski demikian tidak ada larangan untuk mencari nilai lebih besar selama dilakukan dengan cara yang benar. How much you’ll be paid is determined by you.

Yang berikutnya adalah mengenai traveling plan. Entah dari mana, keinginan saya untuk jalan-jalan terpicu lagi minggu-minggu belakangan. Pengen mencoba jalan ke Bali setelah lebaran. Sesudah coba jalan ke Singapura dan Asia Tenggara. Baru setelah itu nekad coba ke Eropa. Sambil melancarkan Bahasa Asing. Untuk yang paling deket paling-paling mau solo motor touring deket-deket sini. Bandung, Sukabumi sejauhnya nyoba ke Cirebon. Ingin membuktikan perkataan orang bijak jaman dulu. Konon, sering melakukan perjalanan akan mempertajam hati.

Kursus Bahasa Inggris. Maksimal setelah lebaran, saya harus maksa ngambil kursus Bahasa Inggris. Jika tidak maksa, tidak akan bisa-bisa. Mungkin di ILP Cibubur dekat rumah. Setiap Sabtu atau Minggu.

Angkot traveler. Beberapa minggu belakangan saya mulai suka naik angkot lagi. Komuter 110 KM pulang pergi menggunakan motor amat sangat menghabiskan tenaga jika dilakukan setiap hari. Tentu saja pengeluaran bertambah dengan naik angkutan umum namun energi dapat lebih dihemat dan waktu dapat dimanfaatkan untuk membaca sekedarnya, atau mungkin berkenalan dengan penumpang lain. :p

That’s all for now. Lanjut lagi nanti.

48 Jam

Sesuatu akan terasa berharga ketika ia tidak ada
Sesal pun baru datang ketika sesuatu itu pergi
Berjuta kata “jika saja” dan kata “andaikan” pun tidak terlalu banyak memberi arti
Jika saja aku dapat bersikap lebih baik waktu itu
Andaikan aku tidak terus menerus berkata keras
Seandainya aku mau mendengar semua keluh kesahnya dengan manis
Bukan dengan kata-kata yang terus menyalahkan dan menyalahkan
Namun dengan sikap melindungi dengan penuh kasih, memaklumi semua kekurangannya
dan terus membantunya memperbaiki diri
Kini sudah 48 jam aku belum mendapat kabar darinya
Pertama kalinya aku tidak tahu bagaimananya
48 jam yang serasa berpuluh tahun
Kuharap ia baik-baik saja
Tak kuasa aku menanti waktu untuk bertemu lagi

Dynamic Richfaces Menu, MenuItem and Action

Currently I have necessity to build dynamic menu use rich:menu and rich:menuitem. I make simple POJO model class for each menu and menuitem. Of course you can use EntityBean if necessary. Menu is just used for grouping while menuitem, children of menu which has action property that will triger some action when it is clicked.

// Menu model
public class Menu{
private String menuCaption;
private boolean enabled;
// Relation to MenuItem 
private List menuItems;

public Menu(String menuCaption, List menuItems, boolean enabled){
this.menuCaption = menuCaption;
this.menuItems = menuItems;
this.enabled = enabled;
}
// don't forget getter and setter
}



// MenuItem Model
public class MenuItem{
private String menuItemCaption;
private String menuItemAction;
private boolean enabled;  

public MenuItem(String menuItemCaption, String menuItemAction, boolean enabled){
this.menuItemCaption = menuItemCaption;
this.menuItemAction = menuItemAction;
this.enabled = enabled;
}
// don't forget getter and setter
}

Here are MenuManagedBean class. Property menuList will be refered in page and make some kind of this representation.
Menu1 Menu2
-MenuItem1 -MenuItem5
-MenuItem2 -MenuItem6
-MenuItem3
-MenuItem4

public class MenuManagedBean{
private List menuList;
public List getMenuList(){
List menuItemList1 = new ArrayList();
MenuItem menuItem1 = new MenuItem("Menu Item1", "#{someManagedBean.someAction}", true);
MenuItem menuItem2 = new MenuItem("Menu Item2", "#{someManagedBean.someAction}", true);
MenuItem menuItem3 = new MenuItem("Menu Item3", "#{someManagedBean.someAction}", true);
MenuItem menuItem4 = new MenuItem("Menu Item4", "#{someManagedBean.someAction}", true);
menuItemList1.add(menuItem1);
menuItemList1.add(menuItem2);
menuItemList1.add(menuItem3);
menuItemList1.add(menuItem4);

List menuItemList2 = new ArrayList();
MenuItem menuItem5 = new MenuItem("Menu Item5", "#{someManagedBean.someAction}", true);
MenuItem menuItem6 = new MenuItem("Menu Item6", "#{someManagedBean.someAction}", true);
menuItemList2.add(menuItem5);
menuItemList2.add(menuItem6);

Menu menu1 = new Menu("Menu1", menuItemList1, true);
Menu menu2 = new Menu("Menu2", menuItemList2, true);


menuList = new ArrayList();
menuList.add(menu1);
menuList.add(menu2);
return menuList;
}
// getter and setter
}

Next is faces page. You can use facelets or jsp page. For your notice we use jstl c:forEach tag for looping menuList in MenuManagedBean. We can not use ui:repeat or a4j:repeat here. They will not work because ui:repeat and a4j:repeat is rendered on runtime. Otherwise c:forEach is compiled before.

Eventhough the faces page will be shown, and every other value attribute appear correctly, the action attribute is not work. When we click a menuitem, rather than call appropriate string action from menuItemAction property of class MenuItem, its try to call menuItemAction method from menuItem managed bean which don’t exist.

<c:forEach var="listMenu" items="#{menuManagedBean.menuList}">
<rich:dropDownMenu disabled="#{!listMenu.enabled}">
<f:facet name="label">
<h:panelGroup>
<h:outputText value="#{listMenu.menuCaption}"/>
</h:panelGroup>
</f:facet>
<c:forEach var="menuItem" items="#{listMenu.menuItemList}">
<%-- The action attribute bellow is not work --%>
<rich:menuItem value="#{menuItem.menuItemCaption}" action="#{menuItem.menuItemAction}" disabled="#{!menuItem.enabled}"/>
</c:forEach>
</rich:dropDownMenu>
</c:forEach>

After some trial and error, I use binding aproach. I add htmlMenuItem property from class org.richfaces.component.html.HtmlMenuItem. This property will be use as binding value in revised MenuManagedBean class bellow.

import org.richfaces.component.html.HtmlMenuItem;
public class MenuItem{
private String menuItemCaption;
private String menuItemAction;
private boolean enabled;  
private HtmlMenuItem htmlMenuItem;

public MenuItem(String menuItemCaption, String menuItemAction, boolean enabled){
this.menuItemCaption = menuItemCaption;
this.menuItemAction = menuItemAction;
this.enabled = enabled;
}

// getter setter

}


public class MenuManagedBean{
private List menuList;
public List getMenuList(){
List menuItemList1 = new ArrayList();
MenuItem menuItem1 = new MenuItem("Menu Item1", "#{someManagedBean.someAction}", true);
// make binding
HtmlMenuItem htmlMenuItem = new HtmlMenuItem();
Class[] params = {};
MethodExpression actionExpression = app.getExpressionFactory().createMethodExpression(ctx.getELContext(),
                    menuItem1, String.class, params);
            htmlMenuItem.setActionExpression(actionExpression);
            htmlMenuItem.setDisabled(!menuItem1.getEnabled());
            htmlMenuItem.setValue(menuItem1.getMenuItemUrl());
            menuItem1.setHtmlMenuItem(htmlMenuItem);
            
MenuItem menuItem2 = new MenuItem("Menu Item2", "#{someManagedBean.someAction}", true);
// make binding same as above
// ...
MenuItem menuItem3 = new MenuItem("Menu Item3", "#{someManagedBean.someAction}", true);
// make binding same as above
// ...

MenuItem menuItem4 = new MenuItem("Menu Item4", "#{someManagedBean.someAction}", true);
// make binding same as above
// ...

menuItemList1.add(menuItem1);
menuItemList1.add(menuItem2);
menuItemList1.add(menuItem3);
menuItemList1.add(menuItem4);

List menuItemList2 = new ArrayList();
MenuItem menuItem5 = new MenuItem("Menu Item5", "#{someManagedBean.someAction}", true);
// make binding same as above
// ...

MenuItem menuItem6 = new MenuItem("Menu Item6", "#{someManagedBean.someAction}", true);
// make binding same as above
// ...

menuItemList2.add(menuItem5);
menuItemList2.add(menuItem6);

Menu menu1 = new Menu("Menu1", menuItemList1, true);
Menu menu2 = new Menu("Menu2", menuItemList2, true);


menuList = new ArrayList();
menuList.add(menu1);
menuList.add(menu2);
return menuList;
}
}

Last step is we use binding attribute to refer every menu and its menu item. Finally, dynamic menu item work as I expect

<c:forEach var="listMenu" items="#{menuManagedBean.menuList}">
<rich:dropDownMenu disabled="#{!listMenu.enabled}">
<f:facet name="label">
<h:panelGroup>
<h:outputText value="#{listMenu.menuCaption}"/>
</h:panelGroup>
</f:facet>
<c:forEach var="menuItem" items="#{listMenu.menuItemList}">
<%-- We make change here -->
<rich:menuItem binding="#{menuItem.htmlMenuItem}"/>
</c:forEach>
</rich:dropDownMenu>
</c:forEach>

Upgrade Ubuntu 9.04

Minggu lalu, akhirnya saya mengupgrade Intrepid Ibex Ubuntu 8.10 ke Jaunty Jackalope Ubuntu 9.04. Alasan install ulang adalah saya harus melebarkan partisi linux yang hanya 15 GB. Padahal saya memerlukan Oracle 11g untuk development. Dengan partisi seukuran itu, komputer saya sering error ketika kapasitas hardisk kosong bisa habis menjadi 0 persen. Sebenarnya jika memungkinkan melakukan proses upgrading, tentunya itu akan menjadi pilihan menyenangkan. Proses install ulang cenderung memakan waktu. Belum lagi setelah install ulang harus mengatur ulang segala konfigurasi dan aplikasi-aplikasi yang dibutuhkan. Namun apa daya, konfigurasi partisi yang tumpang tindih antara logical dan primary memaksa saya harus format ulang beberapa partisi dan tidak bisa upgrade, harus install ulang.

Tahapan pertama dari prosesi install ulang adalah backupp data-data. Pertama adalah bookmark firefox. Meski saya sudah register del.iciou.us, saya masih gak ngerti cara pakenya. :p Jadi backup bookmark kita lakukan secara manual dari firefox. Backup berikutnya adalah file .bashrc di home folder. Meski tidak penting-penting amat, tapi perlu dilakukan juga. Awalnya ingin membackup thunderbird. Namun ternyata tidak ada pilihan mudah untuk melakukan itu. Jadi setelah install ulang tinggal download ulang saja semua email dari server. Ketiga, backup file .vdi virtualbox. Saya punya Windows XP, FreeBSD dan Open Solaris di sana. Berkat kecanggihan virtualbox, OS virtual tersebut bisa digotong-gotong sesuka hati. Lalu yang paling penting backup data-data lain ke hardisk portable.

Tahapan kedua, download iso terbaru dari internet. Dengan koneksi internet yang ada, download selesai kurang dari 1 jam. Tahapan ketiga panggang iso ke cd rw. Untungnya masih ada cd rw yang meski sudah baret-baret ternyata masih bisa dipake. Tahapan keempat, install ubuntunya. Tidak sampai satu jam, ubuntu sudah matang.

Tahapan kelima adalah install ulang aplikasi-aplikasi yang diperlukan. Paling utama JDK. Saya memilih menginstall punya Sun dari pada menginstall dari repositori ubuntu. Lalu install netbeans dan glassfish. Setelah itu, yang paling sulit adalah install oracle 11g. Namun kini tidak perlu khawatir partisi Linux sudah 40 GB dengan swap 2.5 GB. Lalu install thunderbird dari repository. Yang tak kalah penting, upgrade Pidgin. Kurang beruntung, pidgin yang dibundel dengan Jaunty Jackalope masih versi 2.5.5. Masih error nyambung ke yahoo. Dengan sedikit otak-atik saya akhirnya bisa membuat pidgin 2.5.7 siap pakai. Semua aplikasi lain seperti Eclipse (ganymede dan galileo), JBoss, Ant, Maven, service mix, Mule, tomcat, ireport, liferay, mobicent SIP Server ada di directory ntfs, jadi hanya perlu linking dari .bashrc file. Terakhir karena pengen iseng, saya install weblogic punya bea dan oracle dan websphere community edition. Yang tak boleh lupa adalah install Virtual Box. Saya install yang dari Sun daripada versi OSE dari repo ubuntu.

First impression setelah install adalah, login screen yang beda, trus wallpaper yang beda, system tray yang juga agak beda. Setelah semua selesai, komputer siap dipakai koding lagi. Pusing lagi deh. 😦