The bugs that haunt you are the bugs you must avoid in the future…

Dear My Bright Team,

The Project “C” is (almost) over. We should take lessons and best
practices when we fight and struggle day and night several months ago.

But the war is not over yet. For the greater battle in Project “P”
Field is coming toward us.

All the bug creatures which have wound you (at least your pride) in the
last battle should be examined and carefully anticipated.

The exceptions, related with number format, The Dementor null pointer
exception, wrongfully call ambigous method names, the dilemma of
obscure views, negligence syndromes, misleading comments, the absences of javadoc
comments, the avada cadavra of magic numbers still daunting our life.

I do not emphasize your mistakes. Everybody has a mistake. But those
who learn from their mistakes will gain benefits beyond their
imagination!

Don’t fall in the same trap hole. Bugs free or Code Harder!

Best regards,

Wisnu Widiarta

=====================================================================================

Email di atas aku kirim ke semua developerku, di akhir fase project C,
dan di awal fase project P. Kita emang harus belajar dari kesalahan
(bugs), dan berusaha untuk dihindari di projek selanjutnya. Dengan begitu
quality yang dideliver ke client akan lebih baik seiring berjalannya waktu.

Ada yang punya pengalaman dengan bugs?

 

Thunderbird CSV to Zimbra CSV Converter

Kantorku lagi migrasi dari MS Exchange Server ke Zimbra, sebuah collaboration and messaging software dari Zimbra, Inc. Nah kebetulan email clientku menggunakan Mozilla Portable Thunderbird. Pas mau export address book thunderbird yang sudah aku export dalam bentuk CSV (Comma Separated Value), ternyata tidak compatible. Akhirnya aku coba buat sebuah address di ThunderBird dan Zimbra, masing-masing aku isi dengan keterangan nama fieldnya, barulah ketahuan mappingnya.

Dasar aku orangnya pemalas, aku nggak mau masukin satu-satu email dari ThunderBird ke Zimbra (cappppeeeeeeeee deeeech). Mau nggak mau ya click icon Borland Delphi 2006 dan membuat tool sederhana untuk convert.

Berikut ini source codenya. Barangkali ada yang mau menambahkan konversi dari Outlook CSV ke Zimbra atau dari mail client lainnya, silakan.

unit MainForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls;

type
TformName = class(TForm)
lblThunderbird: TLabel;
edThunderbird: TEdit;
sbOpenCSV: TSpeedButton;
progressBar: TProgressBar;
bbConvert: TBitBtn;
SaveDialog: TSaveDialog;
OpenDialog: TOpenDialog;
procedure bbConvertClick(Sender: TObject);
procedure sbOpenCSVClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Convert(thunderBirdFileName, zimbraFileName: String);
end;

const
{Thunderbird's Constants}
TB_FIRST_NAME = 0;
TB_LAST_NAME = 1;
TB_DISPLAY_NAME = 2;
TB_NICK_NAME = 3;
TB_EMAIL = 4;
TB_ADDITIONAL_EMAIL = 5;
TB_WORK_PHONE = 6;
TB_HOME_PHONE = 7;
TB_FAX_NUMBER = 8;
TB_PAGER = 9;
TB_MOBILE_PHONE = 10;
TB_HOME_ADDRESS_LINE_1 = 11;
TB_HOME_ADDRESS_LINE_2 = 12;
TB_HOME_CITY = 13;
TB_HOME_STATE = 14;
TB_HOME_ZIP = 15;
TB_HOME_COUNTRY = 16;
TB_WORK_ADDRESS_LINE_1 = 17;
TB_WORK_ADDRESS_LINE_2 = 18;
TB_WORK_CITY = 19;
TB_WORK_STATE = 20;
TB_WORK_ZIP = 21;
TB_WORK_COUNTRY = 22;
TB_WORK_TITLE =
 23;
TB_WORK_DEPARTMENT = 24;
TB_WORK_ORGANIZATION = 25;
TB_WORK_WEBSITE = 26;
TB_HOME_WEBSITE = 27;
TB_UNKNOWN_1 = 28;
TB_UNKNOWN_2 = 29;
TB_UNKNOWN_3 = 30;
TB_CUSTOM_1 = 31;
TB_CUSTOM_2 = 32;
TB_CUSTOM_3 = 33;
TB_CUSTOM_4 = 34;
TB_NOTES = 35;

{Zimbra's Constants}
ZB_ASSISTANT_PHONE = 0;
ZB_BIRTHDAY = 1;
ZB_CALLBACK_PHONE = 2;
ZB_CAR_PHONE = 3;
ZB_WORK_ORGANIZATION = 4;
ZB_COMPANY_PHONE = 5;
ZB_DESCRIPTION = 6;
ZB_WORK_DEPARTMENT = 7;
ZB_DLIST = 8;
ZB_EMAIL = 9;
ZB_EMAIL2 = 10;
ZB_EMAIL3 = 11;
ZB_FILE_AS = 12;
ZB_FIRST_NAME = 13;
ZB_FULL_NAME = 14;
ZB_HOME_CITY = 15;
ZB_HOME_COUNTRY = 16;
ZB_HOME_FAX = 17;
ZB_HOME_PHONE = 18;
ZB_HOME_PHONE2 = 19;
ZB_HOME_ZIP = 20;
ZB_HOME_STATE = 21;
ZB_HOME_STREET = 22;
ZB_HOME_WEBSITE = 23;
ZB_INITIALS = 24;
ZB_WORK_TITLE = 25;
ZB_LAST_NAME = 26;
ZB_MIDDLE_NAME = 27;
ZB_MOBILE_PHONE = 28;
ZB_NAME_PREFIX = 29;
ZB_NAME_SUFFIX = 30;
ZB_NICK_NAME = 31;
ZB_NOTES = 32;
ZB_OFFICE = 33;
ZB_OTHER_CITY = 34;
ZB_OTHER_COUNTRY = 35;
ZB_OTHER_FAX = 36;
ZB_OTHER_PHONE = 37;
ZB_OTHER_ZIP_CODE = 38;
ZB_OTHER_STATE = 39;
ZB_OTHER_STREET = 40;
ZB_OTHER_WEBSITE = 41;
ZB_PAGER = 42;
ZB_WORK_CITY = 43;
ZB_WORK_COUNTRY = 44;
ZB_WORK_FAX = 45;
ZB_WORK_PHONE = 46;
ZB_WORK_PHONE2 = 47;
ZB_WORK_ZIP = 48;
ZB_WORK_STATE = 49;
ZB_WORK_STREET = 50;
ZB_WORK_WEBSITE = 51;
ZB_TYPE = 52;

var
formName: TformName;

implementation

uses classStringSplitter, StrUtils;

{$R *.dfm}

procedure TformName.bbConvertClick(Sender: TObject);
begin
if FileExists(edThunderbird.Text) then
begin
if SaveDialog.Execute then
begin
Convert(edThunderbird.Text, SaveDialog.FileName);
end;
end
else
MessageDlg('The file you requested is not found or cannot be read. ' +
'Please try another file.', mtError, [mbOK], 0);
end;

procedure TformName.Convert(thunderBirdFileName, zimbraFileName: String);
var
list, fields, outputList: TStringList;
i, j: integer;
destination: array[ZB_ASSISTANT_PHONE..ZB_TYPE] ofString;
row: String;
begin
list := TStringList.Create;

list.LoadFromFile(thunderBirdFileName);
progressBar.Position := 0;
progressBar.Max := list.Count;

fields := TStringList.Create;
outputList := TStringList.Create;

outputList.Add('"assistantPhone","birthday","callbackPhone","carPhone",' +
'"company","companyPhone","description","department"
,"dlist","email",'+
'"email2","email3","fileAs","firstName","fullName","homeCity",'+
'"homeCountry","homeFax","homePhone","homePhone2","homePostalCode",'+
'"homeState","homeStreet","homeURL","initials","jobTitle","lastName",'+
'"middleName","mobilePhone","namePrefix","nameSuffix","nickname","notes",'+
'"office","otherCity","otherCountry","otherFax","otherPhone",'+
'"otherPostalCode","otherState","otherStreet","otherURL","pager",'+
'"workCity","workCountry","workFax","workPhone","workPhone2",'+
'"workPostalCode","workState","workStreet","workURL","type"');

i := 0;
while i < list.Count do
begin
row := '';
TStringSplitter.split(list[i], ',', fields);

destination[ZB_ASSISTANT_PHONE] := '';
destination[ZB_BIRTHDAY] := '';
destination[ZB_CALLBACK_PHONE] := '';
destination[ZB_CAR_PHONE] := '';
destination[ZB_WORK_ORGANIZATION] := fields[TB_WORK_ORGANIZATION];
destination[ZB_COMPANY_PHONE] := '';
destination[ZB_DESCRIPTION] := '';
destination[ZB_WORK_DEPARTMENT] := fields[TB_WORK_DEPARTMENT];
destination[ZB_DLIST] := '';
destination[ZB_EMAIL] := fields[TB_EMAIL];
destination[ZB_EMAIL2] := fields[TB_ADDITIONAL_EMAIL];
destination[ZB_EMAIL3] := '';
destination[ZB_FILE_AS] :='';
destination[ZB_FIRST_NAME] := fields[TB_FIRST_NAME];
destination[ZB_FULL_NAME] := fields[TB_FIRST_NAME] + ' ' + fields[TB_LAST_NAME];
destination[ZB_HOME_CITY] := fields[TB_HOME_CITY];
destination[ZB_HOME_COUNTRY] := fields[TB_HOME_COUNTRY];
destination[ZB_HOME_FAX] := '';
destination[ZB_HOME_PHONE] := fields[TB_HOME_PHONE];
destination[ZB_HOME_PHONE2] := '';
destination[ZB_HOME_ZIP] := fields[TB_HOME_ZIP];
destination[ZB_HOME_STATE] := fields[TB_HOME_STATE];
destination[ZB_HOME_STREET] := fields[TB_HOME_ADDRESS_LINE_1] + ' ' +
fields[TB_HOME_ADDRESS_LINE_2];
destination[ZB_HOME_WEBSITE] := fields[TB_HOME_WEBSITE];
destination[ZB_INITIALS] := '';
destination[ZB_WORK_TITLE] := fields[TB_WORK_TITLE];
destination[ZB_LAST_NAME] := fields[TB_LAST_NAME];
destination[ZB_MIDDLE_NAME] := '';
destination[ZB_MOBILE_PHONE] := fields[TB_MOBILE_PHONE];
destination[ZB_NAME_PREFIX] := '';
destination[ZB_NAME_SUFFIX] := '';
destination[ZB_NICK_NAME] := fields[TB_NICK_NAME];
des
tination[ZB_NOTES] := fields[TB_NOTES];
destination[ZB_OFFICE] := fields[TB_WORK_ORGANIZATION];
destination[ZB_OTHER_CITY] := '';
destination[ZB_OTHER_COUNTRY] := '';
destination[ZB_OTHER_FAX] := '';
destination[ZB_OTHER_PHONE] := '';
destination[ZB_OTHER_ZIP_CODE] := '';
destination[ZB_OTHER_STATE] := '';
destination[ZB_OTHER_STREET] := '';
destination[ZB_OTHER_WEBSITE] := '';
destination[ZB_PAGER] := fields[TB_PAGER];
destination[ZB_WORK_CITY] := fields[TB_WORK_CITY];
destination[ZB_WORK_COUNTRY] := fields[TB_WORK_COUNTRY];
destination[ZB_WORK_FAX] := fields[TB_FAX_NUMBER];
destination[ZB_WORK_PHONE] := fields[TB_WORK_PHONE];
destination[ZB_WORK_PHONE2] := '';
destination[ZB_WORK_ZIP] := fields[TB_WORK_ZIP];
destination[ZB_WORK_STATE] := fields[TB_WORK_STATE];
destination[ZB_WORK_STREET] := fields[TB_WORK_ADDRESS_LINE_1] + ' ' +
fields[TB_WORK_ADDRESS_LINE_1];
destination[ZB_WORK_WEBSITE] := fields[TB_WORK_WEBSITE];
destination[ZB_TYPE] := '';

for j := ZB_ASSISTANT_PHONE to ZB_TYPE do
begin
row := row + '"' + destination[j] + '"';
if j <> ZB_TYPE then
row := row + ',';
end;

outputList.Add(row);

progressBar.StepBy(1);
Inc(i);
end;

outputList.SaveToFile(zimbraFileName);

 outputList.Free;
fields.Free;
list.Free;
end;

procedure TformName.sbOpenCSVClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
edThunderbird.Text := OpenDialog.FileName;
end;
end;

end.
 
Kalau mau download aplikasi dan source codenya silakan klik di attachment.
Kalau mau mengoreksi, mau menambahkan, please comment yaa..

Transformers (2007)

Film besutan Michael Bay yang diproduseri oleh Steven Spielberg ini benar-benar memberikan entertainment dengan spesial efek dan sound efek yang mengagumkan.

Ceritanya, seperti diambil dari Detik, berkisah tentang perseturuan antara Autobots dan Decepticon, kaum robot baik dan jahat di planet Cybertron. Dua kekuatan besar yang dulunya bersahabat itu dipimpin oleh Optimus Prime (robot berhati baik, pemimpin Autobots) dan Megatron (kepala penjahat kaum Decepticons). Mereka memperebutkan Allspark, sebuah benda berbentuk kubus, yang jatuh ke bumi. Allspark akan memberikan kekuatan bagi siapapun yang berhasil menemukannya.

Megatron sempat memburu Allspark ke bumi. Namun, ia gagal. Alih-alih robot jahat itu malah terdampar di Samudra Arktik, Kutub Utara yang membeku. Megatron kemudian ditemukan oleh pelaut Archibald Witwicky. Sebelum akhirnya tak sadarkan diri, ia menggunakan kekuatan terakhirnya untuk mencetak peta letak Allspark di kacamata Witwicky.

Lebih dari satu abad berlalu, adalah seorang abg bernama Sam Witwicky (Shia LaBeouf). Sam adalah keturunan dari Archibald Witwicky. Di sekolahnya, Sam bukanlah anak populer yang disukai semua orang. Ia malah sering dicemooh oleh teman-temannya.

Suatu hari, ayah Sam membelikannya mobil. Ternyata mobil kuning itu adalah Autobots yang menyamar. Namanya Bumblebee. Ia bertugas melindungi Sam dan kacamata kakek buyutnya. Rupanya, Bumblebee bukanlah satu-satunya Autobots yang berada di bumi.

Di Qatar, kaum Decepticons telah melakukan sejumlah serangan pada kamp militer AS. Pentagon pun panik dan melakukan sejumlah langkah penanggulangan. Masalah pun bertambah. Ternyata, Megatron yang membeku bangkit kembali. Peperangan Autobots melawan Decepticons pun tak terelakkan.

Di pihak Autobots ada Optimus Prime, Autobot Jazz, Autobot Ratchet, dan Ironhide. Masing-masing dapat berubah wujud dari mobil menjadi robot. Mereka pun punya kekuatan berbeda.

Sementara kubu Decepticons terdiri dari Megatron, Starscream, Brawl, Barricade, Bonecrusher, Skorponok, Decepticon Frenzy, dan Blackout.

Apakah Sam dan kaum Autobots berhasil melawan kaum Decepticon?
Nonton aja yah.

———————————————————————————————–
Kemarin nonton berenam di Pondok Indah XXI, 75 rebu pake BCA Card. Yang nonton usianya dari 31 th, 25, 26, 17, 12, dan 4. 6 jagoan, semuanya cowok, hang out together. Hehehe.. pemimpinnya yang 4 tahun itu.