Sunday, October 31, 2004

Result Set dari Oracle function/procedure

Oracle procedure ataupun function dapat mengebalikan nilai dengan tipe cursor, tipe data cusrsor mirip dengan ResultSet di Java, jadi kita bisa menggunakan nilai balikan function/procedure cursor menjadi ResultSet pada program Java.

Dibawah ini contoh Oracle function dan procedure yang menghasilkan curson

create or replace package types as
type cursorType is ref cursor;
end;
/

create or replace function sp_ListEmp return types.cursortype as
l_cursor types.cursorType;
begin
open l_cursor for select ename, empno from emp order by ename;
return l_cursor;
end;
/

create or replace procedure getemps( p_cursor in out types.cursorType ) as
begin
open p_cursor for select ename, empno from emp order by ename;
end;
/


Penggunaan pada program Java-nya seperti ini:

java.sql.Connection conn = null;
...
String query = "begin :1 := sp_listEmp; end;";
CallableStatement cstmt = conn.prepareCall(query);
cstmt.registerOutParameter(1,OracleTypes.CURSOR);
cstmt.execute();
ResultSet rset = (ResultSet)cstmt.getObject(1);

Referensi: http://asktom.oracle.com/~tkyte/ResultSets/



Oracle: Function Based Indexes bisa mempercepat eksekusi function

Beberapa waktu yang lalu proyek saya mempunyai masalah pada performance database. Ini pertama kalinya saya berhadapan dengan masalah performance yang cukup besar. Masalah adalah pada proses batch, proses untuk mengambil data dari file-file teks, parsing, validasi, dan memasukannya ke database Oracle dalam jumlah yang sangat besar.

Proyek selesai, masalah performansi dapat diatasi dengan tuning pada parameter database dan sedikit pada query. Tapi setelah beberapa waktu, database production mengalami masalah yang sama, data semakin besar dan tim mulai melakukan perombakan-perombakan besar pada query.

Database specialist mulai melihat procedure/function yang ada di Oracle database. Salah satu komentarnya ketika melihat banyakannya function TRUNC() digunakan adalah hal itu bisa dipercepat dengan membuat indeks pada fungsi. Aneh kedengarannya, fungsi bisa di-indeks? Tapi memang benar, fungsi pada suatu kolom pada tabel tertentu bisa di-indeks. Jadi intinya, kita membuat indeks untuk suatu kolom dengan menggunakan function pada nilai-nilai kolom tersebut. Dengan demikian, execution plan pada query dengan menggunakan function yang tadinya "TABLE ACCESS (FULL)" akan menjadi "INDEX (RANGE SCAN)" yang berarti akan lebih cepat.

Contoh dibawah ini adalah cara untuk membuat function based indexes pada kolom FIRST_NAME di tabel EMPLOYEE dengan function upper(FIRST_NAME) :

create index EMP_UPPER_INDEX on EMPLOYEE(upper(FIRST_NAME));


Tapi untuk menggunakan Function Based Indexes, kita perlu hati-hati karena ada kelemahannya juga yaitu proses insert dan update akan menjadi lebih lambat kira-kira 5 kali. Untuk proses insert yang banyak dalam satu waktu seperti pada proses batch, akan menjadi delay yang sangat signifikan. Jadi perlu pertimbangan yang detail untuk menerapkan stategi baru, karena biasanya tidak terlepas dengan pertimbangan keuntungan dan kerugiannya. Artikel referensi ini harus dibaca untuk pengertian yang lebih baik tentang function based indexes :




PL/SQL coding standard

Minggu ini adalah minggu pertama kali saya benar-benar harus coding dengan PL/SQL. Membaca code orang memang cukup melelahkan apalagi dengan gaya yang sedikit acak-acakan, identasi tiap line yang kurang bagus, penamaan variabel yang tidak mudah dimengerti (hati-hati memberi nama varibel di PL/SQL jangan sampai sama dengan nama kolom dalam query select yang ada di procedure/function yang dibuat), dan cara-cara yang tidak efektif.

Memang tidak mudah untuk membuat program pertama kali langsung bagus, maka dari itu kita perlu belajar dulu bagaimana membuat program yang baik bukan sekedar membuat program yang berjalan dengan benar (hasil outputnya benar). Ciri utama program yang baik adalah selalu memperhatikan berbagai aspek. Dari sisi bisnis program itu haruslah benar, dan ini hanya terjadi jika program kita telah ditest. Program yang benar belum bisa dikatakan benar walaupun kelihatannya begitu. Dari sisi sistem, program yang baik haruslah memperhatikan aspek-aspek seperti performance, security, maintainability dan lain-lain.

Itulah sebabnya diawal pekerjaan kita, kita perlu membuat coding style standard atau mengikuti standar yang sudah dibuat orang. Kita juga perlu mencari tips/tricks bagaimana menulis program yang baik.

Tidak mudah untuk menemukan PL/SQL coding standard. Masih lebih mudah untuk mencari tips/tricks untuk coding yang baik, yang meperhatikan performance (kecepatan mempereroleh/memanipulasi data) pada database, karena performance untuk data yang besar pada database selalu jadi masalah. Website dibawah ini adalah salah satu dokumen PL/SQL coding standard yang bisa jadi referensi untuk membuat program dengan PL/SQL di Oracle :



Thursday, October 28, 2004

Create java executable file in Windows

To create executable file for java application inWindows, so you just do one click to launch:

1. create a bat file with the following line

START java -jar JARFILE

or

javaw -jar JARFILE

START or javaw command makes java application run without command prompt showing to your screen

4. Using Nullsoft (NSIS) script or JELUDE

4. Free tools, see related links in Jelude page

Tuesday, October 19, 2004

Windows script untuk mengubah ip address

Sering kali kita perlu mengubah-ubah setting ip address komputer Windows dan yang kita lakukan adalah membuka window connection properties dan megubah ip address secara manual. Jika perubahan sering maka mengubah dengan cara seperti itu akan jadi pekerjaan yang menyebalkan.

Supaya pekerjaan tersebut menjadi mudah kita bisa menggunakan perintah netsh dari command prompt. Dibawah ini contoh penggunaan perintah netsh:
 netsh int ip set address "LAN" source=dhcp

Perintah diatas akan mengeset connection dengan nama "LAN" untuk obtain IP address automaticaly alias menggunakan DHCP. Jika tidak ada conncetion dengan nama "LAN" maka perintah tersebut akan menghasilkan error Invalid interface LAN specified.. Untuk merubah nama connection, klik Start > Setting > Network and Dial-up Connection, lalu pilih (klik) connection yang akan di-rename, klik-kanan > rename.
Dibawah ini contoh mengubah connection ke static IP 3.241.30.114 dengan netmask 255.255.0.0:

netsh int ip set address "LAN" static 3.241.30.114 255.255.0.0

Untuk mempermudah gonta-ganti IP, maka buat saja BAT file dari perintah diatas. Jadi kalo mau ngubah IP tinggal klik aja.

Monday, October 18, 2004

WSAD trik: mengubah alamat CVS server

Kalau kita pake WSAD (IBM Websphere Application Developer) trus kita ubah alamat sever CVS yang kita gunakan, maka kita akan kesulitan melakukan setting perubahan tersebut tanpa kehilangan informasi sikronisasi (CVS meta information) terakhir dengan server CVS.

Kita dapat dengan mudah membuat "repository location" baru dan menghapus "repository location" yang lama pada CVS perspective. Kemudian men-disconnect tiap folder dengan cara folder pada package explorer, kemudian pilih "Team" > "Disconect". Setelah itu akan ada window konfirmasi yang menyuruh kita menghapus meta information atau tidak. Jika kita pilih tidak, maka saat kita akan mengeset folder/project tersebut agar terkoneksi dengan CVS dengan cara klik kanan folder, pilih "Team" > "Share Project" makaserver CVS tidak akan berubah dari sebelumnya.

Jika kita pilih menghapus meta information CVS, maka setelah terkoneksi dengan server CVS yang baru kode kita akan terlihat konflik semua dengan kode yang ada di CVS. Tentu saja ini sangat menjengkelkan jika kita telah ...

..bersambung

Friday, October 15, 2004

WAS fixpack

My current WAS version is 5.1.0.3 and try to applying WebSphere Application Server 5.1.0 Cumulative Fix 5 (5.1.0.5). First, I get the fixpack from :

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&uid=swg24007453&loc=en_US&cs=utf-8〈=en

It's a quite simple but li'll bit scary coz this my first time and the WAS is on production system.
I don't know where to start. So I start to reading README file from the link above, then I know what should I do.

If you find the subject of "Finding the readme_updateinstaller.txt, readme_updateinstaller.html and readme_updateinstaller.pdf files", and don't know where the file is, just follow the link bellow:

http://publib.boulder.ibm.com/infocenter/ws51help/index.jsp?tab=search&searchWord=+readme_updateinstaller+5.1.0.5&maxHits=50

here is the step to applying the fixpack...

1. Download the fixpack.
2. Unpack the zip file in C:\Websphere\update (FYI, my WAS installed in C:\Websphere)
3. Stop the WAS using stopServer command
4. Run C:\WebSphere\AppServer\bin\SetupCmdLine.bat to set JAVA_HOME path
5. Then run C:\Websphere\update\updateWizard.bat and follow the wizard, just click next and next ... until finish



Tuesday, October 12, 2004

Joke: IT resource management

Teman saya baru aja keluar dari perusahaan, dia meninggalkan setumpuk code pada satu proyek. Saya masuk dalam proyek yang ditinggalkannya hanya dengan hand-over yang cuma dilakukan beberapa jam dengan cara diskusi apa yang masih perlu dilakukan dan isu-isu yang ada. Beberapa bug tertinggal dalam proyek tersebut dan tentu saja seperti biasanya minim dokumentasi.

Kejadian seperti itu bukan cuma sekali. Di bidang IT di Indonesia hal itu banyak terjadi. Saya gak ngerti bagaimana perusahan2 itu melakukan resource management.

Kalo kita runut lagi kebelakang, sebelum proyek dimulai, memang banyak kesalahan-kesalahan yang sering terjadi di proyek IT pada saat awal proses. Penyebab pertama dan yang utama biasanya adalah uang atau keuntungan. Seperti terjadi di semua perusahaan, di perusahaan IT pun profit pasti jadi tujuan utama. Tapi bagaimana bisa dengan harga perorang USD 200 sampai 350 perjam, project masih 'gagal' hanya karena minimalisasi resource demi minimalisasi cost project.

Yang terjadi di proyek IT yang riil kadang lebih parah. Misalnya, saat rencana tertulis 10 orang, sedangkan kenyataannya saat proyek berjalan, resource lebih kecil dari itu. Kalo kata teman saya, seirng ada 'developer bayangan' pada saat planning. Developer tersebut kenyataannya tidak pernah ada, dan pekerjaan developer bayangan itu kanyatannya menjadi pekerjaan developer riil. Hal tesebut bukanlah suatu mark-up yaitu untuk mendapatkan keuntungan yang lebih besar kemudian manajemen mencoba me-markup resource sehingga nilai proyek jadi lebih besar. Yang terjadi biasanya adalah mark-down yaitu mengurangi resource agar biaya produksi bisa ditekan sekecil mungkin. Kondisi seperti itu fatal karena proyek jelas sekali akan beresiko gagal. Resiko gagal ada karena developer kelebihan kerjaan sehingga pekerjaan bisa jadi tidak selesai tepat waktunya atau bagaian-bagain penting dalam proyek yang tidak utama tapi sebenernya penting seperti dokumentasi (sampai ke level source code) tidak dilakukan. Ada juga kemungkinan developer yang mengerjakan proyek sakit, stres, resign, atau bahkan mati :) gara-gara keseringan begadang, banyak minum kopi dan merokok sehingga resource berkurang.

Kejadian-kejadian seperti ini biasanya baru disadari setelah proyek mendekati terlihat kritis: perkerjaan masih banyak, waktu tinggal sedikit. Proyek semakin parah dengan menghilangnya beberapa developer karena developer kurang tangguh atau tidak cukup iman untuk berbakti kepada perusahaan. Apa yang dilakukan manajemen pada saat seperti itu? Ambil resource lain dari proyek yang tidak kritis, atau cari resource baru, atau meeting, meeting dan meeting.

Akhirnya UAT datang juga. Proyek selesai, tapi bug dimana-mana. Berutunglah kalau client tidak cukup pintar untuk menemukan bug dengan cepat. Dengan trik-trik khusus, client akan senang dengan hasil proyek. Tapi cepat atau lambat bug ditemukan juga, masalah-masalah lain ditemukan seperti berkurangnya performance sistem, sulitnya maintenance process dan lain-lain.

Demi memuaskan client (kalau manajemen tidak putusa asa) akhirnya untuk menyelesaikan masalah-masalah yang ada, ditambahlah beberapa orang developer untuk bug fixing atau penambahan-penambahan kecil permintaan client atau manajemen memutuskan membeli software lain untuk optimasi. Jadi akhirnya terjadi cost tambahan dibelakang, proyek sudah terlanjur 'gagal' dan cost pun tidak jadi terminimalisasi.

Parahnya, kondisi seperti itu biasanya terjadi lagi di proyek berikutnya.

Monday, October 11, 2004

Cara copy file lewat windows sharing

Kalo kamu butuh library untuk koneksi dengan SMB/CIFS seperti untuk maping windows network drive atau untuk copy file antar mesin Windows lewat folder sharing dan lain-lain, gunakanlah jCIFS. jCIFS dapat diperoleh dengan gratis di http://jcifs.samba.org

Dibawah ini contoh code untuk meng-copy file ejlp12.txt lewat folder sharing windows dari komputer 3.110.110.57 ke direktori lokal C:
import java.io.File;

import java.io.FileOutputStream;
import jcifs.smb.SmbFileInputStream;

/**
* Copy file from remote host to local disk
*/
public class CopyFile {
public static void main(String[] argx) throws Exception {
// Set IP lokal, nama file dan tempat dimana file hasil copy disimpan
String localIP = "3.110.110.12";
String localFile = "C:\\ejlp12.txt";

// Set IP remote, user, password, nama file dan tempat file yang akan di-copy
String sambaUser = "Administrator";
String sambaPassword = "master";
String remoteComputer = "3.110.110.57";
String sharedDirectory = "/D$/";
String remoteFile = "ejlp12.txt";

jcifs.Config.setProperty( "wins", localIP );
SmbFileInputStream in = new SmbFileInputStream(
new StringBuffer("smb://").append(sambaUser).append(":")
.append(sambaPassword).append("@").append(remoteComputer)
.append(sharedDirectory).append(remoteFile).toString());
FileOutputStream out = new FileOutputStream(new File(localFile));
byte[] b = new byte[8192];
int n;
while(( n = in.read( b )) > 0 ) {
out.write(b,0,n);
}
out.flush();
out.close();
}
}


Sederhana dan gampang kan?

Sunday, October 10, 2004

UI bad practice: fake component

Kadang-kadang kita ingin mempercantik web interface, mempermudah interaksi antara user dan sistem dengan menambahkan beberapa komponen html atau komponen form html dan menambahakan script untuk otomasi interaksi atau untuk membuatnya telihat lebih indah/keren. Tapi sayangnya banyak designer UI malah membuatnya semakin rumit, sulit didebug, dan justru malah mempersulit user karena user perlu waktu untuk mempelajari komponen yang diotomasi tersebut.

Penambahan komponen-komponen form-html untuk otomasi juga membuat halaman html menjadi 'kotor'. Komponen-komponen form tersebut menjadi fake component yang membuat data yang dikirim ke server (POST/GET) menjadi panjang. Membuat parameter-parameter baru yang sebenarnya tidak pernah dibutuhkan/diproses oleh server. Sebagai contoh, misalnya untuk suatu komponen input yang bernama "currencyId", seorang designer UI yang buruk bisa jadi membuat fake component seperti "currencyCode", "currencyDescription". Kita bisa tebak apa yang dia inginkan dari nama komponent-komponent fake tersebut. Dari fake components tersebut maka data pada request POST atau URL pada request GET akan menjadi seperti ini:

...¤cyId=12&currencyCode=¤cyDesciption=&...

Dari contoh diatas kita lihat ada fake parameters yang mungkin tidak pernah ada nilainya (value). Anda mungkin berfikir tidak ada yang salah dengan hal itu karena parameter-parameter tersebut tidak memberikan kontribusi terlalu signifikan dalam performance. Memang, dengan sedikit fake component pengaruhnya tidak signifikan tapi saya tidak berbicara tentang performance disini.

Yang menjadi concern utama saya disini adalah bagaimana kita harus mendesain UI sehingga memudahkan user dan meminimalisasi fake component. Penambahan otomasi user seharusnya mengurangi jumlah iteraksi antara user dan sistem. Jika otomasi atau apapun jenis enhancement pada UI kita membuat jumlah interaksi semakin lebih banyak maka lebih baik jangan lakukan enhancement tersebut. Untuk menghitung jumlah iteraksi sangan mudah, yaitu hitung saja jumlah aksi user terkecil seperti klik, mengerakkan kursor/mouse, menekan tombol keyboard, perpindahan tangan dari mouse ke keyboard dan lain-lain.

Oh ya, jangan lupa dengan adanya fake component dan javascript untuk mengotomatisasinya maka akan sulit juga buat kita untuk menggunakan validator framework yang umum. Bisa jadi akan menambahkan fake variabels di kode sisi server kita sebagai solusi (bad practice) agar kita tidak perlu mengubah kode validator framework yang digunakan.


Friday, October 08, 2004

Hirarki Apache

ASF punya banyak software/alikasi/program/library yang open source, cukup banyak dan populer. Tapi kalau kita ke website Apache.org kadang bingung mencari project yang kita cari apalagi kalau itu project yang masih baru belum rilis atau masih dalam incubator project.

Halaman "Hierarchy of The Apache Software Foundation" memberikan list yang cukup lengkap dari projects yang ada di ASF sehingga memudahkan kita untuk menemukannya.


Keep clean after you intrude on ...

Remainder list untuk Windows intruder :
  • Kalau kamu login dengan user lain, kembalikan windows welcome screen ke keadaan semula. Biasanya windows menampilkan username yang terakhir login pada sistem. Untuk merubahnya, edit registry atau buat file .reg seperti dibawah ini lalu execute.
    Windows Registry Editor Version 5.00
    

    [HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WindowsNT\CurrentVersion\Winlogon]
    "DefaultUserName"="Administrator"
    Ganti Administrator dengan nama user semula.
  • Backup recent document, dan kembalikan ke keadaan semula. Harus diingat, bukan cuma windows recent document yang perlu dikembalikan ke kondisi semula tapi juga recent document pada aplikasi jika kamu membuka file. Recent document pada aplikasi biasanya di-list pada dropdown menu dari toolbar [File] dan untuk menghilangkan/mengubahnya tidak mudah. Untuk MsWord kita bisa mengghilangkannya dengan tombol (CTRL+ALT+_) setelah itu klik satu satu item di list recent file.
  • Kalo mengakses file balikan ke kondisi semula, gunakan tool untuk merubah created/modified/accessed dates misalnya FileDateChanger
  • Kalo perlu meninggalkan program yang running (misalnya trojan), buatlah program tersebut tidak terlihat. Simple application HideWin bisa dicoba.
  • Sementara ini pesan terakhir: Gunakan rootkit untuk mempermudah pekerjaan ;-)

Wednesday, October 06, 2004

Membuat file CSV

Saya pernah membuat code untuk menghasilkan file CSV (Comma Separated Value) untuk keperluan log. Tools yang saya gunakan adalah tools dari http://ostermiller.org/utils/ package com.Ostermiller.util mempunyai class-class utiliti untuk membuat atau membaca (parsing) file CSV.

Karena saya tidak ingin menggunakan semua utility yang ada package teserbut, yang saya perlukan hanya class untuk membuat file CSV maka saya copy satu file CSVPrinter.java

Menggunakan class CSVPrinter cukup mudah. Ini contoh implementasinya :
public class AuditTrailService(){


...

public OutputStream getCsvBackupFile(OutputStream os, String group) throws CATSException {
//
CSVPrinter p = new CSVPrinter(os);
try {
// Ambil data yang akan di save ke file CSV
ArrayList logs = auditTrailDB.getAllLog(group);
LogAuditTrailTO logAuditTrailTO = null;

// Komentar untuk informasi file CSV
p.printlnComment("BOF");
p.printlnComment("EQ Audit trail backup file @" + (new Date()));
p.printlnComment("");
p.printlnComment("File, group, level, time, username, status, description");

for (int i =0; i < logs.size(); i++) {
logAuditTrailTO = (LogAuditTrailTO) logs.get(i);
p.print(logAuditTrailTO.getFileName());
p.print(logAuditTrailTO.getLogGroup());
p.print(logAuditTrailTO.getLogLevel());
p.print(DateUtil.systemTime2String(logAuditTrailTO.getLogDate()));
p.print(logAuditTrailTO.getUserName());
p.print(logAuditTrailTO.getStatus());
p.println(logAuditTrailTO.getDescription());
}
p.printlnComment("EOF");
return os;
} catch (SQLException e) {
e.printStackTrace();
throw new EQException(999, "Database error. " + e.getMessage());
}
}
}
Dengan contoh method yang yang general terbut kita dapat dengan mudah membuat file CSV atau mengirimkannya ke browser dengan servlet. Dibawah ini contoh penggunaan pada struts action untuk menghasilkan file CSV dengan method tersebut,

public class AuditTrailCSVAction extends Action {

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {

ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward("/");

try {
// Setting header must be done before creating request's output stream
response.setContentType("text/plain");
response.setHeader(
"Content-Disposition",
"attachment;filename=logaudittrail_backup.csv");
OutputStream out = response.getOutputStream();
AuditTrailService auditTrailSvc = new AuditTrailService();
out = auditTrailSvc.getCsvBackupFile(out, "SECURITY");
} catch (Exception e) {
e.printStackTrace();
errors.add("name", new ActionError("error", e.getMessage()));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
}
return null;
}
}
Alternatif tool gratis lain yang bisa digunakan untuk membuat atau membaca file CSV bisa didapat disini. Selain itu, J-Stels Software memiliki utilitas yang lebih bagus untuk file CSV yaitu StelsCSV yang merupakan JDBC type-4 untuk text file, sehingga memanipulasi file text seperti SCV bisa dilakukan seperti manipulasi database dengan JDBC biasa. Bahkan utilitas tersebut sudah memiliki kemampuan JOIN antar file, sayangnya aplikasi terbut tidak gratis.

Tuesday, October 05, 2004

Struts bean:define error jika object null

Tips kecil dalam menggunakan struts taglib: tags-bean.

Setiap kali kita menggunakan taglib <bean:define> akan menghasilkan error jika object yang diminta adalah null. Tentu saja kita tidak mengharapkan error ini, tapi tidak ada mekanisme agar taglib tersebut mengabaikan error tersebut seperti pada tag <bean:write> yang dapat kita berikan attibute ignore="true" untuk mengabaikan error jika bean yang dimaksud tidak ada (null).

Untuk itu cek dahulu bean yang akan kita buat dengan taglib <bean:define> dengan menggunakan taglib <logic:notempty> sehingga jika memang object tersebut null maka taglib <bean:define> tidak akan dieksekusi dan hasilnya tidak terjadi pesan kesalahan jika bean tidak ada.

UI pattern dan usability

Saya pernah sekali tertarik untuk mempelajari usability dari design interface aplikasi tertutama aplikasi web. Website pertama yang sering dibaca adalah useit.com yang memberikan pencerahan terhadap bagaimana pentingnya aspek usability pada desain web dan bagaimana kita melakukannya. Apa yang diungkapkan Jakob Nielsen di website-nya kadang tidak baru tapi apa yang sudah biasa kita hadapi didepan browser. Saya pikir he is not so briliant, tapi dia tau bagaimana memilih mana yang bagus mana yang tidak, berpikir sedikit dan menggumpulkannya sebagai tulisan dan menyebutnya sebagai bapak usability.

Aspek usability pada user interface (UI) bukanlah hal yang baru. Kita dapat rasakan dengan hampir miripnya semua komponen UI yang ada pada software, dan kita terbiasa menggunakannya. Dengan menggunakan komponen yang biasa dipakai (common) berarti kita telah memberikan nilai plus pada aspek usability karena dengan komponen yang biasa digunakan user tidak perlu berkenalan lagi untuk dapat menggunakannya. Tiap software developer kenal textbox, dropdown combo, tab control dan kita cukup tau bagaimana menggunakanya dan mengkombinasikannya sehingga terbentuk UI yang lengkap dan mudah digunakan. Kita tinggal mengikuti contoh dari desain software yang ada. Walaupun desain dari segi artistik (warna, gambar) berbeda-beda tapi kita bisa merasakan kesamaan dari desain UI tersebut misalnya pada tata letak tiap komponen, interaksi antara user dan interface.

Katalog pattern untuk desain UI yang cukup lengkap, termasuk web deain, gui dan mobile user interface patter dapat kita temukan di www.welie.com. Website lain yang berisi katalog UI pattern adalah time-tripper.com/uipatterns dan "User Interface Design Patterns."

Tulisan COMMON GROUND: A Pattern Language for Human-Computer Interface Design cukup panjang dan komperhensif untuk dijadikan acuan dalam mendesain a complex interactive software artifact.

Saturday, October 02, 2004

I hate your code! (2)

Hari ini saya lihat code yang dibuat oleh orang lain. Coding-nya jelek karena beberapa hal berikut:
  • Code yang ditulis tidak konsisten, untuk hal-hal yang mirip dilakukan dengan dengan cara yang berbeda. Biasanya ini terjadi pada programmer yang baru saja belajar dan malas me-refactor code yang sudah ada. Karena tiap kali programmer awal menemuka hal yang bagus, iya akan langsung mengimplementasikannya dan yang sebelumnya dia tinggalkan begitu saja.

  • Code generator dibuat untuk mempercepat coding tapi kadang-kadang default template code generator memberikan komentar2 yang menyebalkan (karena tidak perlu). Template untuk code generator sebelum mulai coding harus diubah, pekerjaan sekali tapi kadang tidak dilakukan dan membuat source code kita kotor.

  • Komentar pattern. Saya menemukan komentar (javadoc) tentang pattern yang berhubungan dengan suatu class menjadi komentar class tersebut. Tentu saja akan muncul pada dokumentasi api. Ini contoh kontar yang dibuat:

    Responsibilities : Bla bla bla
    Collaborations : Bla bla bla
    Dependencies : Bla bla bla
    Applied Patterns : Bla bla bla

    Menurut saya ini jelek. Biarkan dokumentasi pattern disimpan di dokumentasi software design. Hal ini karena pattern biasanya melibatkan banyak kelas tidak satu class (pattern Singelton termasuk pattern yang hanya melibatkan satu kelas) jadi pattern tidak berasosiasi kuat dengan satu class. Saya tidak tau dari mana dia mendapat ide untuk membuat komentar seperti itu. Ada yang pernah membuat komentar seperti itu?

Struts: Cancel button

Struts punya mekanisme untuk mendeteksi action dari cancel button. Dengan cara kita sendiri, mudah untuk membuat cancel button yang berfungsi saat kita membatalkan suatu halaman/form.

Jika kita tahu mekanisme yang sudah ada, kita tidak perlu repot lagi. Struts mempunyai taglib html <html:cancel> yang bisa kita gunakan untuk cancel button. Jika kita membuat cancel button dengan tag tersebut tanpa meng-overide attribute "onclick" dan "property" maka kita akan mendapatkan kemudahan dari pemrosesan pembatalan. Proses pembatalan suatu form yaitu [1] tidak dilakukannya validasi pada form walaupun cancel button sebenarnya melakukan POST seperti halnya button submit dan [2] dengan pendeteksian yang mudah disisi struts-action, kita bisa menangani aksi cancel ini berbeda dengan aksi submit.

Contoh sebuah button cancel :
  <html:cancel>Cancel</html:cancel>
Tag tersebut akan menghasilkan html seperti ini:
  <input type="submit" name="org.apache.struts.taglib.html.CANCEL" value="Cancel" onclick="bCancel=true;">
Dan kita bisa mendeteksi pada struts-action dengan cara seperti ini:
  public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {

if (isCancelled(request)) {
// do something here
...
return (mapping.findForward("success"));
}
}

Friday, October 01, 2004

I hate your code!

Saya sudah banyak ikut bergabung dalam project IT, tentu saja bukan project sendirian. Setiap project pasti melibatkan orang lain walaupun itu project yang kecil misalnya cuma sekedar membuat web site. Actually saya belum pernah membuat website yang benar2 simple. Sekecil apapun project IT yang saya kerjakan mininal melibatkan art designer, jadi pekerjaan bisa dijalankan dengan 2 orang. Saya sebagai architect dan developer dan seorang lagi sebagai art designer.

Dengan dua orang saja yang punya fungsi yang jelas berbeda dalam satu project tidak sulit untuk membuat project berjalan lancar. Tentu saja lebih sedikit konflik.

Beberapa project melibatkan banyak orang dengan role yang sama, misalnya developer atau programmer. Ketika tidak ada hal-hal standar yang disepakati bersama, siap-siap saja untuk gagalnya project atau paling tidak jadi project yang menjengkelkan.

Beberapa orang mungkin bekerja cepat, tapi pekerjaannya jelek. Yes, his code is run but..it's suck. Artikel "Humor: Why your code sucks" sama sekali bukan humor, even the discussion is. Point-point dari artikel tersebut totally right. Saya sendiri benci dengan code yang jelek, walaupun mungkin code saya sebenernya jelek (i can't count my own code).

Bukan karena code kita hanya akan digunakan hanya oleh diri kita sendiri lalu kemudian kita bisa seenaknya coding tanpa membuatnya mudah dibaca dan dimengerti.

Kenapa ini harus terjadi di project saya sekarang... :(

Bagaimana JVM bekerja?

Website ARITMA punya bahan-bahan dan link-link yang bagus untuk topik JVM di Java Corner-nya. Ada preview buku Inside the Java Virtual Machine, juga aplet-aplet simulasi JVM, garbage collector, dll.


Struts Validator: ActionForm menjadi ValidatorForm

Menggunakan struts tanpa validasi cukup mudah, menggunakan framework validasinya Atruts ternyata memperudah pekerjaan. Tapi tunggu, saya dapat masalah ketika struts form-bean harus berubah dari subclass ActionForm mejadi subclass dari ValidatorForm atau ValidatorActionForm.

Saya biasa membuat property dari form-bean dengan variabel-variabel seperti Integer, Double, String, Long dan bahkan kadang-kadang menggunakan primitive variables. Semuanya tidak ada masalah. Jika suatu input karakter harus jadi null pada form-bean karena input tersebut di-set pada property form-bean yang bertipe Integer, saya cukup senang dengan hal itu. Setelah saya menggunakan validator framework, ternyata muncul masalah yaitu saya harus mengubah semua property form-bean saya menjadi String.

Hal ini karena validator akan menganggap input dari client adalah null jika input tidak match dengan tipe varibel form-bean. Misalnya kita membuat input "Foo" yang harus diset pada property "age" yang bertipe Integer, maka struts variabel "age" akan berisi null untuk kemudian dilakukan validasi. Tentu saja ini tidak bagus, karena dengan dua aturan validasi misalnya "varibel tersebut diperlukan (required)" dan "varibel tersebut harus integer" maka komentar error yang muncul adalah komentar required bukannya komentar error kesalahan tipe data.

Jadi validator framework perlu mendapatkan karakter input sesuai dengan input data dari client. Dan hal ini hanya dapat diperoleh jika 'semua' property pada form-bean bertipe String. Paling tidak semua property yang butuh divalidasi.

Do I miss something in Struts?

Followers