Wednesday, February 8, 2012

#16: +ve!

Wa mini. Lumix GF-2. 14mm f2.5 pancake kit lens. On CNY 2012 eve.
Waktu itu masih tak tahu.
Uwek sana, uwek sini.
Bila masa dah tahu,
Masih uwek sana, uwek sini.
- Pantun Mr. Harmonies
Proudly announcing, wa mini dah pregnant! Alhamdulillah, Allah maha kaya! :)
Wa mini. Lumix GF-2. 14mm f2.5 pancake kit lens. On CNY 2012 eve.
Next fun part of preparing to be a parents is.. Choosing a name! :)

To be continued..

Thursday, January 19, 2012

#15: Spiral Bokehland

Beruwang in spiral bokehland.
Lumix GF-2 dengan lens CCTV 25mm f1.4 (equivalent 50mm f1.4 pada sensor crop 2.0). Lokasi ni di Flet Titiwangsa, area Gombak. Pelik jugak tengok 2 ekor beruang simen cacat ni digantung tinggi atas pokok. Cute tapi agak scary pada waktu malam hihihi!

Thursday, January 12, 2012

#14: Getting lucky. Spotted an error in crp.h

Project Coco/R sepatutnya project yang sgt portable kerana kodnya langsung tak target untuk specific platform. Akan tetapi beberapa hari lepas, saya telah cuba untuk compile Coco/R dari source code menggunakan gcc versi 4.6.1 (pakej compiler mingw) dan ia berakhir dengan error (gcc invoked dengan gcc -c -w crp.c)
crp.h:168:6: error: conflicting types for 'SynError'
crp.h:27:6: note: previous declaration of 'SynError' was here
crp.h:178:6: error: conflicting types for 'SemError'
crp.h:30:6: note: previous declaration of 'SemError' was here
Error ini memanglah tak sepatutnya keluar. Dan memang error ini langsung tak keluar bila saya compile kod yang sama di Linux Mint 12 (juga menggunakan gcc versi 4.6.1). Ia tercompile dengan sempurna tanpa apa-apa warning di Linux Mint 12. Nasib baik saya invoke gcc diatas dengan -w, kalau tak, console saya dah penuh dengan warning.

Saya cuba untuk compile COLLECT.C, CR.C, CRA.C, CRF.C, CRP.C, CRS.C, CRT.C, CRX.C dan SET.C, dan saya dapati satu-satunya kod yang bermasaalah adalah CRP.C. Saya mati akal untuk membetulkan source code ini. Sebab crp.c adalah kod C yang sempurna di Linux Mint 12. Akhirnya saya mengambil keputusan untuk compile crp.c dengan menggunakan Tiny C Compiler. Invoked tcc -c crp.c dan tcc memberikan error ini:
crp.c:147: incompatible types for redefinition of 'SynError'
Masaalah sama. Ia tentang types dan tentang "SynError" (juga "SemError", tapi tcc tak dapat detect error ini. gcc walaubagaimanapun dapat detect masaalah symbol "SemError"). Nampaknya ia bukan masaalah compiler MingW lagi kerana kedua-dua compiler gcc dan tcc dapat detect error yang sama.

Buntu mencari penyelesaian, saya cuba pula mencari consultation melalui IRC di server IRC Linux Mint. Di server berkenaan ada satu channel bernama "#mingw" dan ia rupanya satu channel unofficial bagi project MingW. Saya cuba menanyakan soal ini di channel berkenaan dan beberapa orang tampil untuk membantu. Ada juga yang menanyakan tentang Coco/R sendiri, kerana ia satu project yang tidak famous berbanding project lain. Coco/R adalah satu program untuk menghasilkan compiler lain. Ia seperti tool lex dan yacc bersama dalam satu pakej. Malang sekali, tak ada penyelesaian dapat dicapai dalam sesi consultation tersebut. Cuma saya dinasihatkan untuk examine kod crp.c tersebut dalam bentuk yang dah di preprocessed. Saya invoke lagi gcc -E -o crp-pre.c crp.c untuk mendapatkan output crp.c yang dah di preprocessed. Ini adalah crp-pre.c:



Long story shorts, saya spotted error dari declaration SynError dan SemError. Ia di declared sebagai void SynError(int errno); untuk SynError dan void SemError(int errno); untuk SemError. Bagi saya yang baru didalam C ini, saya kurang memahami tentang apa masaalah disini, cuma saya hanya tahu, declaration dalam file header mestilah sama dengan assignment (saya belajar ini dari pengalaman dengan Pascal). Contohnya SynError dideclare void SynError(int errno); tapi di dalam crp.c, ia function SynError digunakan sebagai void SynError(int (*_errno())). The "*" dan "_" missing. Jeng jeng jeng..

Saya kemudian mengubah crp.h dengan mengantikan void SynError(int errno); kepada void SynError(int (*_errno())); dan  void SemError(int errno); kepada void SemError(int (*_errno()));.

Guess what, gcc dan even tcc telah berjaya compile crp.c dan berjaya link semua object lain membentuk file cocor.exe! I'm actually spotted error yang susah nak ditemui hurray!

Ini adalah crp.h dengan modifikasi dari saya:


Alhamdulillah! :) Terima kasih kerana sudi membaca. Selamat berprogramming!

Tuesday, January 3, 2012

#13: To the Women in My Life/Le Lis

My honest rating.
Kenapa 3.5/10 sahaja? Tontonlah Ombak Rindu (2011) dan BE VERY HONEST, bagilah rating.Ada baiknya dengar lagu Billy Cobham ini, lagi feeling Wakakakaka!

 Billy Cobham - To the Women in My Life/Le Lis

Seriously pengarah perlu review semula filem ini. Saya lihat ia dirakam sambil lewa kerana ada banyak ketidaksempurnaan yang tak patut wujud pun pada sebuah filem. Even filem zaman P. Ramlee pun tak ada masaalah out-of-focus seperti yang ada dalam filem Ombak Rindu (2011). Ambil positif, di masa hadapan, janganlah berlaku lagi perkara yang sama. Itu belum lagi sentuh bab transition hitam antara scene yang kadang-kadang terpotong dialong menjadikan sesetengah dialog jadi tergantung serta soundtrack sama yang berulang-ulang ntah berapa kali. Sekali lagi, ambil positif ya. Untung besar tu.. Taniah, dah berbelas juta dapat.
Try harder!
P/S: Mutu kerja pun kenalah sepadan dengan "upahnya" ok! :)

#12: Coderama - A smarter way untuk buat benda remeh

Saya geleng kepala sendiri bila membaca semula source code yang saya tulis dahulu. Saya tak mempraktikkan code optimization dengan menggunakan sepenuhnya kebolehan programming language yang saya gunakan. Contohnya ini, saya telah buat satu event dimana bila double click diatas status bar didalam Coderama IDE, semua panel tepi dan bawah akan collapse dan memberikan view source code editor yang luas. Ini kod saya untuk menghilangkan dan memunculkan semula semua panel disekeliling source code editor:
procedure TForm1.onStatusbar1DBClick .. bla bla bla..
begin
    if panel1.visible=true then panel1.visible:=false else panel1.visible:=true;
    if panel2.visible=true then panel2.visible:=false else panel2.visible:=true;
    if panel3.visible=true then panel3.visible:=false else panel3.visible:=true;
end;
Apa boleh buat, saya bukan coder profesional atau amatur, saya masih newbie yg sedang seronok bereksperimen :P Hehehe. Apapun, saya tiba-tiba teringatkan tentang satu operator didalam Pascal. Dalam Pascal ada beberapa operator senang untuk memudahkan kerja-kerja pengkodan. Antaranya OR, NOT, AND dan beberapa lagi operator lain. Kalau mengikut kod saya diatas, if panel1.visible=true then panel1.visible:=false else panel1.visible:=true; bolehlah diterjemahkan sebagai "kalau panel1 sedang ada, hilangkan panel1 atau jika tidak (jika panel1 memang dah hilang) adakan panel1".
procedure TForm1.onStatusbar1DBClick .. bla bla bla..
begin
   panel1.visible:=not panel1.visible;
   panel2.visible:=not panel2.visible;
   panel3.visible:=not panel3.visible; 
end;

Lihat bagaimana pula operator "not" dipraktikkan disini :)
Kalau ikut bahasa melayu, operator "not" bolehlah dicontohkan dengan perkataan "tidak". Benar bermaksud true. True adalah boolean. Jika perkataan "benar" berada sendirian, ia bermaksud benar. Akan tetapi kalau ada operator "Tidak" dihadapan boolean tadi, ia membawa maksud lain. "Tidak Benar" membawa maksud Salah/Palsu atau boolean "False". "Not True" sudah tentu bermaksud False. Bagaimana pula dengan "Tidak Tidak"? Ia bermaksud "Benar". Simple kan? :)
panel1.visible:=not panel1.visible; bermaksud, "visibility panel1 adalah bukan/sebalinya kepada visibiliti panel1". Simpler, smarter dan menampakkan jalan pintas yang baik dipraktikkan. Kalau anda seorang programmer, manfaatkanlah penggunaan operator atau apa-apa features yang ada didalam programming language yang anda gunakan kerana perkara remeh sebegini banyak memberi manfaat pada programmer sendiri. Terima kasih.