Monday, November 09, 2009

Design application - letakkan behaviour mencorakkan design anda dan bukan data

Kena ingat bila design yang penting bagaimana design tersebut menampung keperluan behaviour object2 tersebut dan jgn terlalu ambil berat bagaimana data itu di tunjukkan

Cuba kurangkan penggunaan Inheritance - Inheritance also anti pattern

Next target ialah untuk cuba design menggunakan composition/association dan elakkan terlebih guna Inheritence.

Saturday, November 07, 2009

Setter dan Getter anti pattern

Sekarang aku dapat merasakan kenapa public Setter dan Getter anti pattern...

Thursday, November 05, 2009

Berubah dari pemikiran CRUD ke DDD

Ada diffrent code sebegini?


var teller = s.Get(tellerId);
teller.TotalCashInHand = TotalCashInHand - amountToTransfer

dan lagi satu

var teller = s.Get(tellerId)
teller.DeductCashAmountWhenAmountTransfer(amountToTransfer);

Code atas tu kita panggil car CRUD dan yang dibawah di panggil cara DDD;


Menggunakan AggregateRoot collection untuk add entity/value object

Persoalan yang timbul bagaimana penggunaan sebenar child collections dalam AggregateRoot (AR). Pemahaman aku sebelum ini terlalu ekstrim dimana child collection itu mesti digunakan sama ada untuk add dan juga fetch child item (lazy load). Pengalaman mengajar untuk lebih flexible dalam menentukan penggunaan child collections dalam AR.


Aku bawa satu contoh, didalam library/Book Store system ada satu features yang kita panggil "Lend Book". Bagaimana kita hendak model kan ini.

BookStore 1--0..* AvailableBooks

Didalam sebuah book store akan ada 0 atau lebih Books. Jika kita nak menambah collection buku didalam book store kita akan buat begini:

var bookStore = s.get(bookStoreId);
bookStore.AddNewBook(new Book{ .. });

So bagaimana pula jika kita hendak lend book dari book store?. Oleh kerana book ialah entity dibawah AR book store maka segala aktiviti berkaitan buku sama ada command dan query pelulah melalui AR BookStore (It rules AR) . Jika dahulu aku akan buat begini:

var bookStore = s.Get(bookStoreId);
bookStore.Lend(bookId,customer);

Code didalam BookStore

public void Lend(Guid bookId,Customer customer)
{
var book = AvailableBooks.Where(c=>c.Id == bookId).SingleOrDefault();
BookLendToCustomers.Add(new BookLend{ Book = book, Customer = customer});
}

Ok code ini tiada masalah, malahan follow apa yang disuggest oleh DDD team, tetapi aku akan menghadapi performance problem jika dalam book store tersebut mempunyai 100000 buah buku. AvailableBooks collection akan load semua buku kedalam memori dan akan buat memory query untuk dapatkan buku tersebut berdasarkan bookId (bahasa bercampur-campur book/buku).

Jadi cara aku skrg lebih flexible sama ada membenarkan query ke book entity atau inject domain event kedalam Book store.

Option 1

var bookStore = s.Get(bookStoreId);
var book = s.Get(bookId);
bookStore.Lend(book,customer);

Option 2

var bookStore = s.Get(bookStoreId);
bookStore.Lend(bookId,customer);

Code didalam book store

public void Lend(Guid bookId,Customer customer)
{
var event = new BookQueryEvent{ BookId = bookId}
DomainEvent.Raise(event);

var book = event.Book;
BookLendToCustomers.Add(new BookLend{ Book = book, Customer = customer});
}

Code domain event akan diinject menggunakan any IoC library seperti castle,autofac,structuremap etc

Saper sudi share..pendapat

Thursday, October 22, 2009

Real command scope dalam CQS

Minggu lepas aku submit code aku untuk group DDD buat review dan comment, dan Alhamdulillah ada banyak comment yang menarik yang dapat memperbetulkan kefahaman aku tentang CQS. Salah satu point yang aku dapat ialah apabila prosess command digunakan , hanya methodGet( jika guna Nhibernate) sahaja yang diperlukan, tiada method query akan digunakan.





Wednesday, October 21, 2009

Visual NHibernate & NHibernate Mold

"Sculpture is a .NET open source Model-Driven Development code generation framework ideal for creating and managing .NET Enterprise Applications."



Visual designer and mapping tool for creating and editing NHibernate projects


Tuesday, October 20, 2009

Distributed Ajax Call

3 bulan tak update apa-apa kat sini, tersangatlah busy dan tersangat malas dan waluapun banyak yang nak share tentang pengalaman baru dalam develop distributed application tapi buntu nak start macam mana. Cuma yang aku rasa best ialah dapat selesaikan masalah Ajax call cross domain.





Friday, August 28, 2009

DDD rules diguna hanya pada Command process

Apabila design domain model menggunakan Domain Driven Design pattern seperti Aggregate Root, Service , penggunaan pattern ini hanya valid pada process yang melinatkan command sahaja. Pattern ini pula dikenali sebagai CQS - Command Query Separation (Arhitecture Level). Jadi untuk list/search atau reporting rules DDD tersebut tidak diguna pakai. Anda free untuk search dari mana-mana entity.

Monday, August 24, 2009

Keperluan melakukan refactoring

Refactoring dikategorikan sebagai seni, sama juga dengan Domain Design, memerlukan kreativiti dan kesabaran untuk mendapat keputusan yang bagus.


Kebiasaan Refactoring session boleh berlaku 3 -4 kali sebelum anda mendapat keputusan yang terbaik.

Refactoring yang selamat jika pada permulaan design dan conding, enviroment development sudah bermula dengan Test Driven Development (TDD).

Maka jika berlaku major perubahan pada code dan design, kita tidak perlu risau dependency dengan code/component lain insyAllah dengan cepat dapat di ketahui jika berlaku error.


Tuesday, August 11, 2009

Message boleh jadi Command atau Event

Bila buat naming method menggunakan message sebagai parameter ada 2 jenis message yang boleh digunakan


1. Message sebagai command
2. Message sebagai event

Message sebagai command
Message sebagai command adalah seperti ini
public class Customer
{
public void ApplyImprestAccount(new CreateNewImprestAccount());
}

CreateNewImprestAccount - ialah command, jika dibaca memang nampak akan maksud message tersebut.

Message sebagai event
Message sebagai event pula ialah kiata hendak memberitahu sesuatu dah berlaku dan apa sequence seterusnya.

public void UpdateRegistrationStatus(RegistrationStatus registrationStatus)
{
this.RegistrationStatus = registrationStatus;
if(RegistrationStatus == RegistrationStatus.InActive)
{
DomainEvents.Raise(new MailInitiatorBecameInActive
{
LicenseCustomer = this.Customer,
MailInitiator = this
});
}
}

Hendakkan kepastian baca tentang CQS.Aku pun masih baru




Monday, August 10, 2009

Naming Code yang mudah dibaca dan maintain

Macam mana nak buat naming method yang mudah dibaca dan apabila melihat naming tersebut terus boleh faham apa sebenarnya kerja yang akan dibuat oleh code tersebut. Kebaikan pada naming method yang difahami jelas maksud memudahkan untuk baca dan juga maintain.Code tersebut juag tidak perlu banyak comment.Selain dari itu jika berbincang dengan team developer yang lain naming menggambarkan situasi sebenar real world. Naming yang bagus ialah yang follow Ubiquitous Language semasa dicussion dengan subject matter expert didalam process design domain model.

Contoh -

1. Customer can request license with existing license as a parent license.
2. Customer can request license as a new license

Dulu code yang aku tulis ada seperti ini dibawah ini.

public void RequestLicense(int number,string location,Guid parentLicenseId)
{
...
}

public void RequestLicense(int number,string location)
{
...
}

Bila aku tengok balik code macam nie selepas 2 /3 bulan aku susah nak dapat tahu maksud code tersebut jika dilihat hanya pada naming method.

Aku baru sahaja bertukar cara naming code menggunakan konsep "Message". So secara basic naming code kemungkinan sama tetapi parameter akan berubah dari individual type kepada Message yang akan menggandungi parameter2 tersebut.

public void RequestLicense(CreateNewLicenseWithExistingParentLicense msg)
{
...
}

public void RequestLicense(CreateNewLicense msg)
{
...
}

Friday, July 31, 2009

NHibernate - Training

Minggu lepas first time aku bagi training untuk company luar dan training tersebut di kelolakan oleh pihak Syarikat aku berkerja, maka aku tak perlu bercuti unutk buat consultation training. 6 orang developer datang selama 4 hari dari sebuah company. Tajuk yang aku pilih untuk train dia orang ialah Building Enterprise Application using NHiberante & Domain Driven Design.

Kebanyakkan masa dalam training menjurus kepada hands on training. Hari pertama banyak aku sentuh tentang teori/konsep ORM/NHibernate. Aku juga bawa contoh penggunaan TDD dalam development dan aku buat example tanpa prepare so nak tunjukkan serba sedikit cara real start project from scratch. So bila run TDD tu nampak lah kebaikan sebab bila buat impromptu nampak lah apa yang aku expect code tak menghasilkannya kerana ada silap dalam code base tersebut.

Nanti aku tulis lagi, dah masa bulan malas nak update...

Wednesday, July 29, 2009

NHibernate - using list sebagai collection

Aku jarang guna list <list> sebagai collection untuk NHibernate. Biasanya aku guna bag configuration untuk collection. Bag is ordered collection
Dalam NHibernate collection boleh di congifigure sebagai <set>, <list>, <map>, <bag>, <array>and <primitive-array>

Cuma dalam situasi tertentu aku perlukan guna <list> untuk dapatkan index. Cuma jika <list> in diconfigurekan sekali dengan inverse=true index akan null. Jadi untuk guna kena letak inverse=false

Sunday, July 26, 2009

API Flexibility or Dynamic

Pada pendapat aku API code hanya dibuat berdasarkan process dan bukan berdasarkan kemampuan design tersebut, ini adalah kerana untuk mengelakkan confuse walaupun ada comment pada code atau documentation.


Untuk lebih mudah faham jika dalam scenario tu dikehendaki 2 process dilakukan kerana turutan/aturan/sequence dari UI maka buatlah code yang support 2 process tersebut jangan buat code api yang boleh buat dalam kedua-dua process tersebt kedalam hanya 1 process, jika tidak diperlukan.

Wednesday, July 15, 2009

Update

Lately busy dengan macam-macam benda duniawi, then since last week nak online guna Celcom broadband kat area rumah aku nie ada masalah, adalah dlm 10 min dlm HSDPA connection lepas tu terus je drop ke GPRS, jadi banyak kerja aku terganggu. Sekarang nie aku cuba pula guna PIWimax so far nie first day dan nampak macam ok, tak tahu lah pulak bila org dah start ramai subscribe.


Aku pun sekarang dah kurang buat coding kat office, walaupun kerja banyak dan aku sepatutnya membantu teams members aku yang lain, cuma aku dah start macam kura-kura bila masuk bab programming hehehe.. lagi slow dari budak fresh grade.

Aku rasa aku kekurangan fokus, bila aku nak buat programming tiba-tiba dapat call..kena check something, kena meeting, kena update something pada CIO ..etc (alasan je tu)... aku nak kena bercuti fikirkan pasal programming dan kerja, tapi waktu nie nak pergi bercuti pun time musim H1N1

Banyak juga update dalam software development dalam jangka masa sebulan nie. Nanti bila mode aku datang semula nak menulis aku akan update..insyAllah




Saturday, June 13, 2009

DDD : Messaging

Konsep messaging banyak digunakan dalam DDDD atau dikenali sebagai Distributed Domain Driven Design. Dalam .Net community setahu aku ada 2 transport application iaitu NServiceBus dan MassTransit. Cuma messaging approach boleh juga digunakan dalam cara Domain Driven Design yang biasa tanpa menggunakan any messaging transport.

Aku tertarik dengan konsep messaging dari segi kekemasan code dan keupayaan code tersebut bila didesign ala messaging. Kalau mengikut DDDD, Domain akan reference/couple dengan messaging structure manakala jika follow DDD, service akan reference/couple dengan messaging structure.

Dalam post kali nie aku nak bawa contoh bagaimana hendak guna DDD dengan messaging iaitu service reference messaging structure.

Aku baru je nak mencuba, so kalau silap bagi tahu.Apa itu message? Kalau ditanya kepada aku apa itu message jawapannya ialah satu set yang mengandungi samaada arahan atau maklumat sesuatu Context. Sebagai contoh context Tunjuk jalan ke Masjid Shah Alam. Maka terdapat arahan dan maklumat yang perlu letakkan didalam message untuk di hantar kepada si penerima. Penerima boleh jadi rakan sekerja, pemandu teksi atau sesiapa yang faham message tersebut. Berdasarkan message tersebut si penerima akan response berdasarkan apa yang diminta dan supporting maklumat.

Message : Tunjuk Jalan Ke Masjid Alam

Arahan : Sila bagi arahan untuk Ke Masjid Shah Alam
Maklumat 1 : Aku sekarang di lokasi seksyen 9 dan destinasi Masjid Shah Alam
Maklumat 2 : Aku nak pergi menaiki kereta

namespace Direction.Services
{
public interface IMessage
{
}

public interface IServiceHandler<TMsg> where TMsg : IMessage
{
void Handle(TMsg msg);
}


public class TunjukJalanKeMasjidShahAlamMenggunakanKereta : IMessage
{
public string from { set; get; }
public string to { set; get; }
}

public class TunjukJalanKeMasjidShahAlamBerjalanKaki : IMessage
{
public string from { set; get; }
public string to { set; get; }
}

public class TunjukJalanKeMasjidShahAlamMenaikiBasikal : IMessage
{
public string from { set; get; }
public string to { set; get; }
}

public class DirectionService :
IServiceHandler<TunjukJalanKeMasjidShahAlamBerjalanKaki>,
IServiceHandler<TunjukJalanKeMasjidShahAlamMenggunakanKereta>

{

#region IShowDirection Members

public void Handle(TunjukJalanKeMasjidShahAlamBerjalanKaki msg)
{
//Send to Domain to calculate and show the possible way
//Direction.FindFrom(msg.from).FindTo(msg.to).With(Transportation.Leg);
}

public void Handle(TunjukJalanKeMasjidShahAlamMenggunakanKereta msg)
{
//Send to Domain to calculate and show the possible way
//Direction.FindFrom(msg.from).FindTo(msg.to).With(Transportation.Car);
}

#endregion


}
}


Code diatas tidak di test dan hanyalah imiginasi sahaja untuk tatapan umum.

Friday, June 12, 2009

DDD : AggregateRoot rules

Salah satu pattern yang tersangat penting dalam Domain Driven Design ialah AggregateRoot. Dan ianya juga adalah pattern yang nampak mudah tapi susah untuk di pilih semasa didesign di dalam Domain Model.

Apa definisi AggregateRoot? Kalau mengikut buku Domain Driven Design dan setelah membacanya aku boleh membuat kesimpulan pemahaman aku sendiri yang pada aku betul, iaitu AggregateRoot ialah anda mengroupkan beberapa entity atau value object kepada sesuatu object entity yang akan menjadi ketua dan object entity ini akan bertindak menjaga sebarang anasir-anasir baik dan jahat dari luar yang menganggu kelompok/komuniti. Ini bermakna jika ada permintaan dari pihak luar yang bukan penduduk dalam komuniti AggregateRoot tadi maka permintaan tersebut perlulah melalui ketua tadi dan si ketua yanag akan memanggil pengikutnya (Aggregate) untuk bertindak dan tindakan yang berlaku adalah diketahui oleh siketua. Ok ini bahasa mudah yang aku nak cerita, bahasa susah korang google lah sendiri.

Kepentingan AggregateRoot jika di design dengan betul, akan mengurangkan keserabutan (complexity).

Rule yang pertama aku follow, developer lain ada rules masing-masing mengikut pemahaman dia orang. Aku pun baru je faham tu pun kekadang salah pilih AggregateRoot. Lagi satu peringatan jika kesilapan memilih AggregateRoot boleh menjadikan design anda menjadi lebih komplex dan aku pernah merasa keperitan ini. Aku akan hanya pilih AggregateRoot bila perlu dan jika tidak perlu aku tak nak buat. Ianya bukan kemestian, cuma memastikan kekuatan design. Sebelum ini 2/3 bulan sebelum ini pemilihan aggregate root macam kemestian tapi apabila dah terjerat baru kutahu langit itu tinggi. Walaupun dari segi turutan dalam design domain model priority AggregateRoot ialah ketiga penting setelah mengenal pasti entity/value object (1) dan relation association antara object(2). Ianya berada ketangga ketiga hitz sepanjang zaman volume 1 kompilasi, tapi kekuatan design banyak berkait rapat dengan AggregateRoot.

Rule aku yang kedua, Aggregate ialah rakyat marhaen dibawah jajahan takluk AggregateRoot. Jika delete AggregateRoot, maka semua Aggregate akan turut sama terkorban dan mengorbankan diri (kes ikut ketua tanpa usul periksa U jump, I jump) mereka ini tidak nak menjadi anak yatim piatu. Dalam erti kata sebenar Aggregate ini tidak bernilai jika tidak bersama-sama AggregateRoot dan mesti ingat nilai ini adalah berdasarkan Context. Contoh nilai berdasarkan context ialah jika anda masuk kekedai Kereta sama ada baru atau terpakai (second hand) , tujuan anda ialah hendak membeli Kereta itu ialah Context, maka bayangan anda ialah sebiji kereta yang normal yang lengkap dengan body, engine, interial dan tayar. Apa perasaan anda jika hendak beli kereta tapi oleh kerana bodynya tidak dijual dan yang dijual hanyalah tayar apakah nilai tayar dalam context awal tadi. Salesman tu mungkin kena baling dengan tayar tu kot. Tapi sebaliknya jika anda dah ada sebuah kereta tapi tayar anda bocor dan perlu diganti, maka jika anda pergi ke kedai service kereta, mekanik tu akan ganti tayar anda bukan ganti kereta anda, disini tayar adalah lebih bernilai mengikut context tayar bocor.

Rule yang ketiga, sebarang kerja yang dilakukan oleh aggregate , maka AggregateRoot perlu memantau agar perkara-perkara tidak senonoh tidak berlaku dalam jagaan dia. Ok ambil contoh Mursyidul Am PAS ialah AggregateRoot bagi Aggregate jemaah PAS, maka sebarang aktivi seperti Unity Goverment ke atau apa, beliau kena tahu dan tegur jika ada pelanggaran berlaku yang merugikan Islam dan Parti, Aggregate tidak boleh buat sesuka hati nak berdua-duaan dengan orang lain. Orang lain dari luar parti perlu berbincang dengan Mursyidul Am PAS kenapa perlu berdua-duaan untuk kebaikan ummah ke atau apa ke. So jika bukti keikhlasan maka Mursyidul Am PAS mugkin ada letak syarat jika anda ingin kawan dengan si Aggregate A dari Terengganu maka syaratnya Islam mestilah didahulukan dan lain-lain syaratnya. Pendekkan cerita katakan lah Mursyidul Am PAS setuju dan berkawanlah si orang luar tadi dengan Aggregate A, dia pun suruh lah bermacam-macam, suruh buat ini dan buat itu dan semasa perkerjaan tersebut dibuat semua informasi tersebut dipantau terus oleh Mursyidul Am PAS dan tiba-tiba dilihatnya orang luar itu suruh Aggregate A menari ronggeng, wah nie dah kes berat , berdasarkan syarat yang dipersetujui maka terdapat pelanggaran syarat maka perkerjaan Aggergate tadi akan dihentikan dan timbul Pop Up Message "Tak Takut Allah ke hehehehe ". Maka tugas AggregateRoot tadi menjaga supaya tidak tercemar Agregate-Agregate yang berada dibawahnya.

Kesimpulan 3 rules yang aku rasa paling hitz yang boleh dijadikan panduan memilih bakal AggregateRoot, walaupun ada rules lain tapi tidak sepenting rules2 ini. Cerita yang dibawa tiada kena mengena dengan yang hidup atau yang mati dan tiada kena mengena dengan isu sekarang.

Selamat beraggregate root - jangan nak rongeng2

Wednesday, June 10, 2009

LHDN hantar surat minta hutang cukai lagi

Aku balik kampung semalam, ambil anak-anak aku yang bercuti kat kampung sempena cuti sekolah dan kerana ada majlis maka-makan sebelah family wife aku, semua adik-beradik wife aku pun balik, so aku pun dikehendaki balik ada surprise.. aku sampai melaka lepas maghrib dan memang surprise bila tengok 2 meja makan ada kat lama rumah, rupa-rupanya ada makan-makan ikan bakar nasi lemak dan yg lagi surprise ada hadiah untuk semua anak-anak dan menantu, Alhamdulillah. Aku sempat balik rumah jengok mak kesayangan aku, sempat melepas rinda pada mak. Kat meja ada beberapa surat atas nama aku, dari LHDN dia orang send surat minta hutang cehhh!!!.. taksiran 2008 walaupun dah ditolak PCB tapi masih tak cukup, so aku dikehendaki bayar lagi RM xxxx, kesilapan aku , ada beberapa resit masa beli buku aku tak simpan.

Sepatutnya cukai nie dia bagi lah diskaun bagi yang tak sokong kerajaan hahahah..., aku kena selesaikan baki tu dalam tempoh 6 bulan..kalau tak jadi kes along kena kurung heheh..so tahun nie aku tengah kumpul semua resit bila beli buku... resit masuk toilet awam pun kalau boleh reduce cukai aku nak masukkan juga.

Anak aku Muhammad 'Umar Hafiy dah botak sama macam rambut aku hehehe..sama handsome macam aku..hahaha.. plan aku nak bawa anak-anak jalan tak jadi..sekarang nie musim H1N1 risau gak nak bawak ke public area.

Sunday, June 07, 2009

UI Design - Field Layout

Aku memang hancur dalam bab design UI, dan aku memang tak suka involve coding dengan UI, maka aku tidak ada banyak pengalaman dari segi User Experience dan lain-lain yang berkaitan dengan UI. Cuma aku tertarik cara UI yang diperkenalkan dalam ruby campus application, bagi aku kemas dan simple.

Boleh tengok example UI dia kat link nie http://www.opensourcerails.com/projects/15435-RubyCampus

Aku ada juga cuba nak buat macam tu saja suka-suka tapi tak sure lah ok atau tak


Car design nie memang lain sikit dar kebiasaan tapi dari segi user adakah cara UI layout macam ini lagi ok? atau konsep 1 column memanjang kebawah macam 37signals punya cara design

atau 2 column design seperti biasa.

Saturday, June 06, 2009

Muktamar PAS 55

Aku jarang nak cerita sangat pasal politik dalam nie..sesekali je, cuma kali nie aku nak ulas sikit pasal Muktamar PAS 55, oleh kerana penganjuran kali nie dekat dengan rumah aku, maka aku dapat ikuti perkembangan dengan lebih kerap selain dari membaca online ulasan2 yang lain dan dah 2 malam berturut-turut aku pergi saner,tapi tak masuk dalam dewan, cuma melihat gerai-gerai dan dengar ceramah free yang dipasang di kedai-kedai. Aku terlibat dalam PAS secara tak langsung sejak dari sekolah, sebab aku tolong arwah bapa buat kerja-kerja amal untuk PAS, aku ingat lagi masa tu hujung tahun 80an aku dah bersekolah menengah tingkatan 3, maner le ada sangat orang PAS kat kampung aku, ada le 2-3 kerat yang aku tahu,yang lain semuanya biru karat.Arwah bapa aku pun aktif selepas bersara.Aku masih ingat masa tu ada ceramah kalau tak silap aku Mat Sabu penceramah dia, yang hadir cuma dalam 20 orang dicampur dengan beberapa batang pokok pisang. So siapa yang sokong PAS kat kampung aku tu kira alien (makhluk asing).

Aku bukan ahli yang berjawatan cuma ahli biasa je sekarang dan tak de plan nak aktif sekadar membantu apa-apa yang perlu masa pilihanraya. Jadi sepanjang tempoh tersebut banyak peristiwa aku lihat dalam PAS, kemenangan, kekalahan dan pelbagai peristiwa suka dan duka.Selepas tahun 1990 apabila kemenangan PAS yang agak cemerlang di Kelantan dan perlantikan Tuan Guru Nik Aziz menjadi menteri besar, ada sedikit perubahan penerimaan di negeri-negeri macam negeri aku Melaka. Ada arus perubahan apabila mereka yang bukan berlatar belakang pendidikan agama tertarik dengan pembawaan PAS yang membawa Islam sebagai moto asas perjuangan. Pada masa itu ketrampilan, ketokohan Ustaz Fadhil Noor begitu jelas, dimana para Ulama dan Profesional saling lengkap melengkapi.Pada masa itu jelas akan perananan masing-masing dan proses tarbiyah yang dijalankan oleh pemimpin pada ketika itu membawa hasil yang digeruni musuh Tiada pihak yang sibuk nak jadi pemimpin sebaliknya takut apabila dipilih.

Kadang-kadang Allah uji dengan kemenengan dan ahli jemaah lupa akan perkara tersebut dan masing-masing sekarang lebih sibuk kepada jawatan dan pertelingkahan seiapa yang lebih patut memimpin ulama ke atau professional. Musuh telah berjaya memasukkan jarum agar ahli-ahli PAS sibuk dengan melabelkan pihak ini dan pihak itu.

Dua-dua pihak juga sama ada profesional dan ulama dalam PAS ada yang patut duduk diam jika tak boleh buat kerja dari memberi kenyataan bodoh yang kemudianya diambil sebagai peluru oleh pihak musuh. Kerja mengketegori sesetengah pihak tergolong dalam golongan tertentu sebenarnnya memberi kesan yang besar. Pemimpin PAS kena tahu itu. Jangan sibuk dengan Kerajaan Perpaduan sahaja, perpaduan dalam PAS kalau tak dijaga akan mengakibatkan usaha untuk bangun semula mendapat keyakinan rakyat marhaen 50 tahun lagi.

Perkukuhkan proses tarbiyah, jika ulama sekalipun tapi tidak turun kepada professional untuk menerangkan adap dalam berjemaah dan asyik mengatakan bahawa mereka sahaja yang layak menjadi pemimpin, aku rasa orang tu tak layak bergelar ulama. Jika dia itu bagus, tidak perlu ada kuota insyAllah ramai perwakilan akan pilih.

Aku masih lagi tak faham sesetengah pemikiran orang berjawatan dalam PAS yang tak nampak priority mana dahulu yang perlu diselesaikan dari sibuk nak berdialog dengan UBN. Keputusan dah ramai tahu so harap yang diberi amanah tu pikul tugas dengan sebaik-baiknya , jangan hampakan orang-orang yang menyanyangi kerja kebaikan ini.

Tuesday, June 02, 2009

Msc Malaysia Open Source Conference 2009

Agak terbatas waktu untuk aku update latest news etc. 2 hari aku hadiri seminar Msc Malaysia Open Source Conference 2009 di Berjaya Convention Center dengan tema Open to Change.

Aku rasa nie pertama kali aku hadiri event besar untuk open source dan tiada beza dengan seminar yang biasa aku hadiri anjuran Microsoft, suma dalam MS Tech Ed, free gift tu lagi banyak, tanya soalan pun boleh dapat ipod/baju. Aku memang jarang nak bertanya soalan pada speaker cuma masa Presentation Adempier ERP aku bertanya soalan kenapa team beliau tidak menggunakan ORM yang strong lebih-lebih lagi app tersebut di develop dalam Java, so kebiasaanya Hibernate akan menjadi pilihan, tapi bila dia demo dan tunjukkan sedikit code java, aku nampak ada command SQL dalam code. Jawapannya dari awal project nie dah di develop sedemikian rupa dan line of code/features/module dah besar banyak dan untuk mereka port semua dataaccess function kepada Hibernate akan ambil masa yang lama dan Unit test mereka tidak sekuat untuk menahan gegaran refactoring.

Lain-lain session yang aku masuk ialah OpenID/AOuth, Moodle Tips. Ada beberapa keynote dari Google team members. Makanan memang best A+, aku paling puas hati tentang makan.

Wednesday, May 27, 2009

Bila anak demam

This week penat lain macam, ketiga-tiga anak aku demam serentak. Bermula dengan anak sulung aku, sehari selepas tu anak aku no 2 dan yang ke 3 pun kena demam. Deeni Husna anak aku yang no 2 susah nak makan ubat, jadi kena guna psychology sikit. Aku suruh dia lumba makan ubat dengan kakak dia..saper yang menang boleh dapat gula :) Risau tengok dia menggigil-gigil tak sedap badan, tapi Alhamdulillah doktor check kata demam biasa sahaja, tekak merah ada infection sikit. Kawasan rumah aku pun ada beberapa kes demam denggi.Time dia orang demam nie lagi banyak demand dia, especially Damia Bisyri, so yang lain tu pun ambil can lah follow leader, nak buku colorlah, nak pencil, nak tengok CD upin-ipin. Aku dan wife aku dah lama tak tengok TV nak masuk 2 bulan, setiap malam sebelum dia orang nak tidur, mesti dia orang nak tengok CD kartun, upin-ipin,madagascar,nemo, iqra so aku memang dah tak de masa nak tengok tv.

Plan aku nak sambung tulis NHibernate Siri minggu nie tak jalan sangat, kalau sempat insyAllah aku sambung.

Sunday, May 24, 2009

Command Query Separation : Cara berfikir design yang berbeza

Bila anda create Person dan persistence/simpan record kedalam mana-mana Persistence Storage (normally RDBMS) adakah sepantas kilat anda perlu view list record Person? Dan adakah anda ingin beberapa saat selepas anda masukkan record Person kedalam DB, anda mengharapkan orang lain yang search akan dapat record tersebut? Berapa penting business requirement ini kepada design anda?

Ini adalah pertanyaan yang boleh ditanya apabila hendak design sesuatu system yang melibatkan creating dan reporting (search/view record).

Command Query Separation membawa conceptual architecture yang agak berlainan tetapi bukan baru. Topik ini telah lama diperbincangkan cuma bukan mengguna nama Command Query Separation dan kebanyakkan adalah untuk working paper yang berkaitan dengan "Distributed Application". Martin Fowler ada artikel yang ada kena mengena dengan topik Command Query Separation , beliau menulis tentang EagerReadDerivation .

Saturday, May 23, 2009

Command Query Separation

Aku agak lama juga untuk memahami idea CQS in dalam bentuk SOA. Ok sebelum itu, mungkin ada yang tak clear apa itu CQS.

Ini berdasarkan Wiki:

Command-query separation (CQS) is a principle of imperative computer programming. It was devised by Bertrand Meyer as part of his pioneering work on the Eiffel programming language.

It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In other words, asking a question should not change the answer. More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.

Jadi CQS ini pada mulanya hanya principle yang diguna pakai dalam programming language sebagai guideline iaitu sesuatu method/function itu hanya boleh melakukan specific kerja samaada command atau query dan tidak boleh buat kedua-dua sekali. Principle ini ada kaitan juga jika dilihat kepada Single Responsibility Principle cuma SRP bercerita tentang class manakala CQS bercerita tentang function dan method.

Contoh code yang break CQS ialah apabila kita bagi arahan supaya melakukan tambahan item kedalam box/container dan kemudian dengan function yang sama kita minta method/function tersebut retun value berapa item dah ditambah dalam box/container tersebut.. Jika ada code kita yang ditulis sebegitu maka mengikut rule CQS adalah salah."Tell vs Ask", bagi tahu object untuk buat apa atau minta object untuk pulangkan value.

Ok , itu apa sebenarnya tersurat , cuma ada beberapa SOA expert yang memperluaskan konsep CQS ini kedalam architecture design system. Aku ambil masa yang lama nak feel CQS dan kegunaan dalam SOA, nak tahu sebab dan kelebihan apabila apply CQS dalam SOA enviroment design.

Tidak habis disitu apabiila CQS hendak diguna pakai dalam SOA, keluar lagi satu term iaitu Messaging dalam CQS.Aku pun ambil masa beberapa hari juga hantar message dalam forum tanya soalan-soalan tentang CQS dan SOA. Aku ada hantar satu example minta dia orang comment cara pemahaman aku tentang CQS tapi totally apa yang aku buat tu salah..start dari itu kefahaman aku makin bertambah sedikit.

Lagi satu point yang cuba dibawa ialah reporting function bukan sebenarnya tanggungjawab didalam domain, bagaimana untuk paging,sorting,orderby perlu diletak dibawah penguasaan context yang berlainan dari context domain. Jadi bagi orang-orang ini apabila berhadapan dengan domain context apa yang mereka fokuskan ialah "read type domain object" dalam ertikata mudah Create,Update,Delete (CUD). Manakala reporting context hanya ada Read (R).
Reporting disini ialah bagaimana untuk display data pada client di presentation layer.

Friday, May 22, 2009

NHibernate: Satu analisis perkembangan di Malaysia


Hibernate ialah Object Relational Mapper dimana project ini dimulakan oleh community Java lebih dari 6 tahun yang lepas. Sekarang ini Hibernate dibawah kelolaan JBoss group, kedua-dua pengasas awal mereka bekerja dengan JBoss sekrang ini.NHibernate pula ialah versi Hibernate yang di tulis semula dan dipadankan dengan teknologi .Net Framework (Microsoft). NHibernate core development sudah menjangkau usia 5 tahun bermula dari tahun 2004 dan sepanjang itu telah keluar banyak versi kepada pengguna. Latest versi ialah NHibernate 2.1 dan keupayaan NHibernate versi ini hampir sama dengan Hibernate 3.0

Penerimaan konsep ORM dalam Java community lebih ketara berbanding didalam community .Net. Ini berdasarkan community Java telah lebih lama terlibat dan bermula dengan project-project sebegini. Project open source dalam Java community lebih ketara, cuma selepas beberapa tindakan dari community .Net yang ingin melihat perkembangan sihat dalam .Net software development dan dengan penglibatan Microsoft sendiri yang sekarang ini sudah mula boleh menerima open source sebagai cara baru memperlihatkan cara tindakan, cara berfikir yang berlainan dari kebiasaan yang diamalkan oleh developer-developer yang mendapat didikan terus dari amalan software development Microsoft. Pattern & Practice Microsoft sebelum ini, selalu dikritik oleh lead-lead developer yang memcabar bahawa cara tersebut tidak berapa sesuai dalam perkembangan software untuk enterprise era.

Tertubuhnya community yang menggelarkan diri mereka sebagai ALT.Net ialah sebagai interpretasi mereka untuk memperkenalkan cara yang lebih bagus dari segi design, penggunaan tools, corak berfikir dalam ruang yang lebih bebas dan pengawalan life cycle software itu sendiri. NHibernate sendiri lebih mendapat tempat dalam community ini berbanding dengan Entity Framework atau Linq to SQL. Sudah semestinya mereka-mereka ini mempunyai pendapat kenapa mereka menolak product ORM Entity Framework yang diperkenalkan oleh Microsoft. sebab itu ialah EntityFramework tidak support POCO dan persistence ignorance. POCO ialah Plain Old CLR Object, iaitu simple basic class yang mengandungi setter/getter dan behavior. EntityFramework sebelum version 4.0 penggunaan entity perlulah di extend kepada persistence class dan di sinilah timbulnya masalah besar apabila hendak melakukan unit test.

Perkembangan NHibernate di Malaysia sendiri cukup perlahan dan pada aku ini adalah kerana maklumat yang ada pada software developer dalam community .Net di Malaysia lebih tertumpu kepada core cara yang diperkenalkan oleh Microsoft. Mircosoft Malaysia sendiri dibawah department consulting services (Aku pernah berkerja sebagai contract developer 8 bulan) tiada pengetahuan tentang NHibernate dan seminar, training tiada langsung menyentuh tentang NHibernate. Forum-forum lain juga kurang bercerita tentang NHibernate apatah lagi bercerita tentang Unit Test, Domain Design dan Agile. Forum disini lebih terarah kepada basic programming atau "Getting Started". Aku tidak menafikan kepentingan forum yang membincangankan maklumat tersebut, tapi pada aku developer di Malaysia sendiri perlulah membuka mata dengan lebih luas dan mencari cara yang lebih efficien dalam software development. Aku tujukan pada developer yang menjadikan Microsoft sebagi platform. Developer dari community lain aku percaya mereka jika bercerita tentang software development lebih advance dari segi framework, cara dan lotaran kotak pemikiran mereka.

Ada beberapa company di Malaysia yang telah pun menggunakan NHibernate didalam production code mereka, sebagai contoh Security Commision (SC), POS Malaysia,TMNet, Al-Madinah International University, IIUM (Research & Management). Company software development yang lain ada beberapa tapi project yang mereka handle aku tak berapa pasti. Hibernate mungkin lebih lagi wallahu'alam, mungkin member java boleh update.

Aku berhasrat agar banyak lagi software company di Malaysia yang akan menggunakan NHibernate sebagai ORM mereka. Sebagai permulaan aku cuba menulis NHibernate Siri dalam usaha aku hendak memperkenalkan NHibernate, dan insyAllah kalau ada masa dan jika ada yang berminat aku rancang hendak adakan NHibernate training. Aku ada terfikir hendak berbincang dengan pihak management company aku untuk buat NHibernate Short Course tapi masih tersimpan dalam hati sahaja.

Sunday, May 17, 2009

Andai ku tahu

Lirik dan lagu nie memang best..

Andai kutahu
Kapan tiba ajalku
Ku akan memohon
Tuhan tolong panjangkan umurku

Andai kutahu
Kapan tiba masaku
Ku akan memohon
Tuhan jangan Kau ambil nyawaku

Aku takut
Akan semua dosa dosaku
Aku takut
Dosa yang terus membayangiku


Andai kutahu
MalaikatMu kan menjemputku
Izinkan aku
Mengucap kata taubat padaMu

Aku takut
Akan semua dosa dosaku
Aku takut
Dosa yang terus membayangiku

Ampuni aku
Dari segala dosa dosaku
Ampuni aku
Menangisku bertaubat padaMu

Aku manusia
Yang takut neraka
Namun aku juga
Tak pantas di surga

Andai kutahu
Kapan tiba ajalku
Izinkan aku
Mengucap kata taubat padaMu

Aku takut
Akan semua dosa dosaku
Aku takut
Dosa yang terus membayangiku

Ampuni aku
Dari segala dosa dosaku
Ampuni aku
Menangisku bertaubat padaMu

Haaa... Haaaa... Haaa... Haaaa... [2x]

Friday, May 15, 2009

Silverlight

Sejak 2-3 hari kebelakangan nie, aku cari masa dalam sejam sebelah malam membaca tutorial tentang Silverlight. Aku boleh cakap aku tertarik dengan Galery Showcase dan Tutorial Video Series. Aku ada plan nak write Silverlight Application combine dengan ASP.Net MVC masih belum sampai lagi cita-cita tersebut. ASP.Net MVC functionality pun masih banyak yang aku tak tahu.

InsyAllah aku nak sambung tutorial tentang NHibernate selepas ini. Aku rasa selain dari tambahan pemahaman detail tentang NHIbernate, ianya boleh jadikan sumber untuk aku bagi pada team members aku yang masih belum tahu pasal NHibernate atau pun team member yang baru join.

Thursday, May 14, 2009

Kalau aku ada duit cash lebih, nie kereta yang aku nak beli


Aku berangan je nie, tapi memang aku cukup minat dengan design kereta nie

Wednesday, May 13, 2009

NHibernate Siri: Asas - Part 1 of N

Artikel aku yang lepas tentang NHibernate hanya menyentuh sedikit tentang NHibernate secara umum. Aku fokuskan kepada bagaimana hendak mula develop simple app dengan NHibernate.

Kali ini aku nak masuk detail kepada asas NHibernate, tapi aku plan tak nak sentuh teori tentang ORM atau teori NHibernate itu sendiri. Aku nak start direct asas kepada NHibernate technical.

Secara dasarnya element penting dalam NHibernate ialah Domain object, Domain Mapping dan juga Session.

Untuk mula aku akan cadangkan project structure yang aku akan buat ialah seperti ini


- NS.Domain

- NS.Infrastructure

- NS.Service

- NS.Tests



Domain Object
Domain object ialah normal class yang ada property (set,get) dan method. Disini letaknya business behaviour dan terpulang pada kita nak design domain object itu bentuknya bagaimana. Ia boleh menjadi complex atau menjadi simple mengikut context yang didefine semasa process sesi modeling. Untuk tutorial ini, aku akan define simple business object iaitu Product. Product class akan di create di dalam NS.Domain.





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NS.Domain
{
public class Product
{
public string Name { set; get; }

public string Description { set; get; }

public decimal Price { set; get; }
}
}


Selepas create domain class ini, next ialah mapping domain object ini untuk persistence ke dalam database. NHibernate akan gunakan mapping ini sebagai panduan untuk berinteraksi dengan persistence medium (Database).

Domain Mapping
Untuk mapping domain object ada beberapa cara untuk melakukannya, pada kebiasaan ialah dengan create xml file Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="FirstSolution" namespace="FirstSolution.Domain">
<class name="Product">
<id name="Id">
<generator class="guid" />
</id>
<property name="Name" />
<property name="Description" />
<property name="Price" />
</class>
</hibernate-mapping>


Ok, kali ini aku tidak akan menggunakan xml kerana agak susah untuk write markup sebaliknya aku akan guna fluent mapping dalam project FluentNHibernate. Sebelum itu ada satu lagi cara untuk mapping ialah menggunakan property attribute

    [Class]
public class AACatalog
{
[Property]
public virtual string Version { get; set; }

[ManyToOne(Name = "Batery", Lazy = Laziness.Proxy, Cascade = CascadeStyle.None, OuterJoin=OuterJoinStrategy.False)]
public virtual Batery Batery { set; get; }

[Bag(Name = "BateryCatalogs", Lazy = true, Generic = true, Inverse = true, Cascade = CascadeStyle.AllDeleteOrphan)]
[Key(1, Column = "AAId")]
[OneToMany(2, Class = "BateryCatalogs", ClassType = typeof(BateryCatalogs))]
public virtual IList<BateryCatalog> BateryCatalogs
{
set;
get;
}
}



Untuk domain class Product aku akan create ProductMap didalam NS.Domain dan aku letak didalam folder Mapping seperti ini. Pastikan juga letakkan reference FluentNhibernate.dll di reference project tree.Class ProductMap ialah seperti dibawah. Ada sedikit penambahan di class Product dimana aku tambah property untuk Id, secara umum unutk mapping pada persistence class yang simple kita banyak boleh gunakan default attribute pada nhibernate mapping, dimana nhibernate engine akan "infer" colum name, colum type etc. Sebagai conoth jika kita tak define nama colum nhibernate mapping akan ambil property name sebagai nama column

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentNHibernate.AutoMap;

namespace NS.Domain.Mapping
{
public class ProductMap : AutoMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.Price).CustomSqlTypeIs("decimal");
}
}
}


Ok selesai dengan mapping domain class, langkah seterusnya ialah untuk test business domain dengan run configuration dan table schema.Class dibawah ialah helper class yang akan digunakan didalam test.

    public class NHibernateInMemoryConfiguration
{
protected static string DbFile = "db";
protected static ISessionFactory sf = null;
protected static Configuration config = null;


public static void InitializeConfiguration(string assemblyName)
{
sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
//.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")
.ShowSql())
.Mappings(m => m
.FluentMappings
.AddFromAssembly(Assembly.Load(assemblyName)))
.ExposeConfiguration(SetConfiguration)
.BuildSessionFactory();
}

public static void SetConfiguration(Configuration cfg)
{
config = cfg;
}

public void CreateSchema()
{
if (File.Exists(DbFile))
File.Delete(DbFile);
new SchemaExport(config).Create(true, true);

}
}


Ok selesai dengan class ini, masa unutk run test.Aku akan buat 2 class satu ialah base class iaitu RepositoryBaseTest.cs dan ProductTest.cs

    public class RepositoryBaseTest : NHibernateInMemoryConfiguration
{
protected ISession session;



[TestFixtureSetUp]
public void ConfigurationInitialization()
{
InitializeConfiguration("NS.Domain");
}

[SetUp]
public void Setup()
{
this.CreateSchema();
}
}



    [TestFixture]
public class ProductTest:RepositoryBaseTest
{
[Test]
public void Should_save_Product()
{
using(var s = sf.OpenSession())
using(var tx = s.BeginTransaction())
{
Product p = new Product { Name = "A", Description = "B", Price = Convert.ToDecimal("10.0") };
s.Save(p);
tx.Commit();
}

}
}



Tuesday, May 12, 2009

Sarapan pagi harga macam kat hotel

Aku terkejut pagi nie, cukup terkejut, semalam terkejut sebab MB haram Zambry tu tak layak jadi MB tapi terkejut suka/syukur. Pagi nie aku terkejut sebab harga sarapan nasi goreng pagi + telur mata dan teh o ais limau beharga RM 8.50. dah la masa tu cash kat tangan aku ada le sepuluh ringgit aja. Sebab tu masa nak ambil ayam berat je hati aku nak ambik, SubhanAllah.. aku tak jadi ambik, kalau tak sure RM 15 aku kena bayar, sure aku berhutang lagi 5 ringgit :) Masa dia cakap RM 8.50 tu, tergerak lah mulut aku nak tanya semula takut dia salah kira ke dia nampak telur mata tu macam ayam goreng, tapi aku tak terkata, aku ambil duit terus jalan.

Aku budget biasanya makan pagi around kurang dari RM5 tu pun biasanya aku sarapan dengan anak aku sebelum hantar dia ke tadika, hari nie aku tak sarapan dengan dia, beli kan roti je kat dia so aku tak plan nak sarapan, bila nak parking kereta duit syiling aku tak cukup, so aku decide gi sarapan dulu.

Aku agak je lah kos yang jadi sampai 8.50 ialah
a) Nasi goreng pagi yang dah sejuk RM 4.00
b) Telur mata RM 2.00
c) Teh O ais limau 2.50

Sekian yang masih terkejut

Saturday, May 09, 2009

Offer

Alhamdulillah , walau ekonomi gawat aku masih lagi dapat 3 offer untuk join another company dan sudah tentu offer yang diberi pun agak lumayan. Cuma hati aku masih belum terbuka untuk kemana-mana masih lagi dan masih setia di company M. Setakat ini aku suka enviroment dan tugas yang aku pikul walau pun kenkadang datang keributan dari pelbagai arah, tapi insyAllah aku yakin dengan rezeki yang Allah telah tetapkan.

Aku suka bekerja dengan team yang aku handle sekarang ini. Pihak top management insyAllah nampak macam ada perubahan. Consultation/freelance project pun aku dapat banyak juga offer tapi aku bukan boleh nak buat semua. Memang kalau ikutkan kata hati nak je ambik semua, tapi nanti aku yang merana, masa untuk family aku kena ada. Anak aku dah semakin membesar, persekitaran luar semakin mencabar, kalau aku busy sangat dengan kerja, terabai lak tanggungjawab aku dengan dia orang. Zaman Najib perintah lagi le haru, bodoh tahap gaban le..ishh geram aku. One Malaysia konon... part agama anak bagi ibubapa yanag memeluk Islam pun tak boleh nak handle dengan cara berhikmah nak create slogan One Malaysia. Mana pergi slogan Islam Hadhari? tu pun tak boleh nak jelaskan dengan clear.Ok terbabas sikit pasal politik, sakit hati tengok politik Malaysia akhir-akhirnie macam badut kena selsema BABI.

So kalau ada yang aku rasa member2 boleh buat selalunya aku akan bagi fully kat dia orang untuk buat kecualilah memang aku diperlukan juga untuk monitor progress project.

Sunday, May 03, 2009

4 individu C# freelance fulltime or outsourcing company

Aku hanya menyampaikan peluang pada sesiapa yang ada company atau tahu kawan-kawan dia punya company yang ada buat outsourcing untuk developer c#, salah sebuah company di KL memerlukan khidmat 4 orang C# developer fulltime selama 4 bulan. Seorang dibayar dalam range RM7K per month. Kalau ada individu yang berminat pun boleh juga. Hantar maklumat kepada aku then insyAllah aku forwardkan kepada company tu. Email kepada irwanazam@gmail.com

Saturday, May 02, 2009

NHibernate Siri: Macam mana nak start

Aku dah beberapa kali nak tulis tentang Nibernate tapi selalu je tak habis siri tu. Dan kebanyakkan pengunjung yang datang direct dari google search masuk di sini adalah berkaitan NHibernate. Sebenarnya aku kena tulis supaya aku lebih faham dan tak lupa part basic dan untuk kemudian hari senang untuk tengok balik basic tentang NHibernate nie.

Ok untuk bermula basic sekali ialah kena install NHibernate samaada download yang binary atau dari source file dan kemudian compile semula. Aku rasa untuk yang simple download je yang binary.

1. Download NHibernate binary distribution
NHibernate

2. Download NUnit
NUnit

3. Download FluentNHibernate
FluentNHibernate

Ok ready
Install kesemua component/libarary tersebut. Aku akan guna SQL Lite untuk testing persistence object. So tak perlu susah-susah nak setup database SQL Server etc. 3 perkara penting bila test persistence object ialah check save/update atau tidak dalam database, query return seperti dikehendaki dan cascade bila delete.

Ok jika semua dah install ready untuk coding. Open Visual Studio atau Express Edition dan create InMemoryPersistenceTest.cs

public class InMemoryPersistenceTest
{
public ISessionFactory sf = null;
private const string DbFile = "firstProgram.db";

public InMemoryPersistenceTest(string assemblyName)
{
sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile(DbFile)
.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")
.ShowSql()
)

.Mappings(m => m
.FluentMappings
.AddFromAssembly(Assembly.Load(assemblyName)))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}

public void BuildSchema(Configuration cfg)
{
if (File.Exists(DbFile))
File.Delete(DbFile);

new SchemaExport(cfg)
.Create(true, true);
}
}


Aku guna FluentNHibernate untuk setting NHibernate configuration. Next step aku create file Person.cs

namespace NHibernateSeries1.Domain
{
public class Person
{
public virtual Guid Id { set; get; }

public virtual string Name { set; get; }
}

public class PersonMap : AutoMap<Person>
{
public PersonMap()
{
WithTable("Person");
Id(x => x.Id).GeneratedBy.Guid();
Map(x => x.Name);
}
}
}


Ok bila dah create domain untuk Person,perlu ada mapping, aku guna facility yang ditawarkan dalam FluentNhibernate untuk buat AutoMap. Masa untuk lakukan testing.

namespace NHibernateSeries1
{
[TestFixture]
public class PersonTest:BaseTest
{
Guid personId;
[Test]
public void SavePerson()
{
using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
Person p = new Person { Name = "Azam" };
s.Save(p);
personId = p.Id;
tx.Commit();
s.Close();
}

using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
var p = s.Get<Person>(personId);
Assert.AreEqual("Azam",p.Name);
tx.Commit();
}

}
}
}


Alhamdulillah cukup mudah tanpa setup database pun. Bila run insyAllah dapatlah warna PAS (hijau) ertinya berjaya hehehe

Thursday, April 30, 2009

90% Application adalah CRUD process

Percaya tak bahawa 90% application/system adalah berkaitan simple CRUD (Create,Read,Update and Delete).

Simple Design

Aku masih tak dapat lari dari bila design memasukkan element mistik dalam design aku? Apa design ada element mistik dan seram?..(Terpengaruh dengan cerita seram yang kerap ditayangkan di TV). Tak lah sebenarnya apa yang aku nak cakapkan ialah bila design result akhirnya akan menjadi komplex kerana menjadi kebiasaan aku macam tu.

Ntah kali keberapa aku pasang niat untuk cuba design menggunakan konsep KISS dan YAGNI, walau aku faham kedua-dua konsep nie, tapi bila masa aku design atau menulis code sering aku terlupa akan guideline ini. Design kalau terlalu syok sendiri akan menyusahkan orang lain aku cukup setuju pendapat ini. Salah seorang teammate aku pernah tegur, kenapa aku bila design fikirkan benda yang complex?.. Jawapannya ialah kerana aku adalah student graduated in Electrical Engineering yang dah terbiasa dengan complex formula hehehe boleh ke bagi reason macam tu?? Kaukan dah grade 11 thn lepas maner ingat lagi formula tu semua..tipu je tu..hehehe ....habis tu Mr H tu pun sama grade dalam EE kenapa dia design ok je?Sebab dia grade zaman tu IC memory baru berapa je/conductor/Circuit board layer baru ada selapis je zaman tu, zaman aku dah berlapis-lapis macam kuih lapis so nak kira current masuk dan current keluar sampai air liur yang terkeluar tau, tu belum nak kira voltage, yang tak betul pun ramai sebab salah calculate voltage.. pergh , so tu lah reason kuat yang aku boleh bagi untuk mempertahankan diri :)

Teguran yang membina dan aku akui kebenaran tersebut...sebab itu bagus jika ada orang lain yang review code dan design kita, kita jangan mengharapkan orang akan setuju dengan design kita kerana kita tidak akan banyak belajar jika tiada kritikan kecuali memang Allah dah bagi ilmu laduni (ilmu yang dapat tanpa belajar dari mana-mana sumber, ilmu nie untuk semua bidang atau bidang agama sahaja?) kena tanya member-member yang expert bidang kerohanian.

Jadi majulah simple domain design untuk kesihatan anda, rakan-rakan anda dan alam sekitar..

Wednesday, April 29, 2009

Muhammad 'Umar Hafiy



Yaya hero sudah datang sekali dia tarik dua-dua kakak dia tumbang daaa...... :)Tak boleh tengok kakak dia minum air yougurt sure nak... sampai habis dia minum manalah si kakak tu tak menangis..

Deeni Husna

Posing bila depan kamera


Masa baru-baru pandai nak berjalan



Anak kedua aku Deeni Husna, independent, berani dan suka kacau kakak dan adik dia... dia lak suka nak pergi sekolah..:)


Damia Bisyri


Masa pagi raya



Dalam walker



Bergaya di sofa baru


Anak sulong aku, berumur hampir 4 tahun. Banyak celoteh dan banyak sangat pertanyaan,suruh aku beli kereta baru yang ada gelungsor dan peti ais dan dalam peti ais tu ada air yogurt and vitagen anggur... Selalu tanya hari nie pergi sekolah ke tidak..kalau aku atau wife aku kata tak gi sekolah perasaan dia "Bahagianya Hidup".

Friday, April 24, 2009

Peraturan TDD yang kedua

Peraturan pertama ada di sini
Setiap perbuatan akan dipertanggungjawabkan. Apabila object tersebut melakukan sesuatu tugas mesti ada kesan samaada perbuatan itu merupakan arahan(command) atau juga permintaan(query). Kejayaannya bila anda ada kawalan penuh dan anda memang sudah menjangkakan kesan yang terjadi dari perbuatan tersebut.

Maka peraturannya ialah check semua kesan gegaran berapa skala richter.

Kalau aku tolak kau dari bangunan nie ke bawah: Kesannya dengan izan Allah.

1. Kau mati
2. Aku suka hati (kejam betul..)
3. Harta kau aku yang punya
4. Aku kena dakwa (bersalah atau tidak tengok cable aku macam mana..:)


Ini ialah kesan dan memang tu jangkaan pada keadaan normal atau dipanggil Assert.

Single Responsibility Principle berguna dalam design Interface

Ada satu lagi pattern/principal yang insyAllah dilain masa aku akan cerita iaitu Interface Segregation Principle. Cuma apa yang aku nak cerita ada sedikit kena mengena dengan Interface Segregation Principle tapi dari sudut Single Responsility Principle.

Sebelum nie aku ada menulis Transformasi kepada Single Responsibility Principle dimana pada pendapat aku untuk mencapai konsep pattern tersebut groupkan tugas-tugas yang related/berkaitan kepada satu class. Cara yang sama boleh digunakan juga pada class yang baru kita asingkan.

Konsep mengroupkan tugas yang berkaitan kedalam class yang lain diguna pakai juga kepada Interface.

Istiqamah dalam memboikot

Aku dan family aku dah lama tak makan-makan di McDonalds atau KFC, dah hampir 5 bulan kami sekeluarga pertahankan diri dari membeli makananan di kedua-dua company ini. Aku percaya pada konsep boikot walau satu product impactnya tetap ada kalau semua umat Islam ada matlamat yang sama. Cuma ntah macam mana semalam masa bawa anak-anak aku jalan, kami lalu di depan kedai KFC, agaknya baunya manarik kot, so anak aku kata kat aku.. "Abah nak makan KFC", aku bagi tahu dia untuk cari makan dikedai lain je.. anak aku baru berusia hampir 4 tahun, dia merengek nak makan ayam KFC gak. Aku tak sampai hatilak tengok dia dah menangis.. so wife aku kata jom cari yang drive thru je. Pada aku ada juga kejayaan dalam memboikot selama hampir 5 bulan, aku kena realistik dan cuba didik anak aku sedikit-sedikit, cuma yang pasti McDonalds anak-anak aku memang dah tak nak, sebab aku pernah bagi tahu tu orang jahat punya company:), KFC aku tak cakap cam tu pulak :).. salah ke aku cakap macam tu?

Barang-barang keperluan lain yang boleh diganti dgn product Malaysia atau Muslim, kami cuba sikit-sikit, contohnya ubat gigi aku replace dengan ubat gigi mukmin junior dan yang kayu sugi, Nescafe aku dah stop terus beli, sebab tak berapa minat dan sebelum-sebelum nie kalau beli Nescafe memang boleh tahan lebih dari 3 bulan.

Ada yang boleh direplace dengan product yang lebih kurang sama quality dan ada juga product yang orang Muslim belum keluarkan lagi, dan keperluan tu penting yang tidak dapat tidak kena terus membeli.

Cuma satu kalau boleh teruskanlah memboikot apa-apa yang boleh. Satu product pun cukup memadai sebenarnya atleast ada juga sumbangan kearah kekuatan permintaan umat Islam dalam jual beli.

Thursday, April 23, 2009

Aku mula menyukai AAA

AAA (Arrange-Act-Assert), baru je menceburkan diri dan membiasakan diri dengan cara AAA, tak pasti sejauh mana kebagusan dan resultnya nanti, masih awal untuk mengatakan cara ini yang terbaik, cuma lebih clear sedikit dari cara yang lama.

AAA masih tergolong dalam golongan pemikiran BDD. Sebelum ini aku guna BDD cuma dengan different cara, dimana setiap method (When,Because,Act) akan diberi class sendiri dan apabila penggunaan terhadap sesuatu function berlaku akan adalah beberapa Assert yang terjadi.

Iman & Hidayah

Baca entry dari 1kHz berkaitan Hidayah , terasa mereka yang convert ke Islam kerana Allah nie iman dia orang lagi tinggi dari kita, ujian yang mereka hadapi memang berat yang kalau kita Islam sejak lahir mungkin tak mampu hendak hadapi.

Perbezaan ketara antara orang yang diberi dengan orang yang mencari.

Wednesday, April 22, 2009

Transaformasi kepada Single Responsibility Principal

Post aku sebelum nie ada menyentuh tentang kepentingan pattern SRP dan OCP dalam mencorakkan design domain dan sewaktu coding. Tapi bila aku bercerita tentang kepentingan pattern jika tidak diterjemahkan kedalam code dan real implemantation agak payah hendak mendapat gambaran yang jelas dan kebaikan pattern tersebut. Aku ada berbincang dengan kawan seangkatan berkaitan kedua-dua pattern dan apa yang pasti SRP merupakan pattern yang agak tricky. Jadi aku cuba terangkan dengan layman word dan code.

Aku tiada banyak idea nak bagi contoh dan aku pun tak pasti contoh yang aku bawa ini bagus atau tidak, ini juga menjadi kayu pengukur untuk aku mengetahui kefahaman aku dalam pattern2 ini.

Apa dia SRP?..

Single Responsibility Principle

Mengikut tuan empunya diri yang memperkenalkan pattern ini, SRP ialah
Sesuatu class/object hanya ada satu sebab sahaja untuk diubah..

Aku bawah contoh code dibawah :


    public class Report
{
public void Print()
{
//
}

public IList GetData()
{
return null;
}

public void FormatReport()
{
//
}
}


Kenapa code ini melanggar principle SRP. Kalau dilihat code tersebut ada berapa kerja code Report itu boleh buat? Ada 3, iaitu dia boleh melakukan tugas Print(), tugas untuk Formatting FormatReport() dan tugas untuk mendapatkan data GetData(). Oleh kerana itu code tersebut ada 3 sebab utama jika kita hendak buat perubahan.

Jadi adakah setiap class/object hanya boleh melakukan satu tugas sahaja bagi memenuhi SRP? Jawapannya sudah tentulah tidak. Kena faham maksud responsibility (tanggungjawab). Ok seorang bapa mempunyai banyak tanggungjawab, salah satu ialah menyara anak-anak. Jika beliau mempunyai 3 orang anak adakah perlu diwujudkan 3 class berkaitan saraan? Jawapan ialah tidak. Object saraan hanyalah satu tapi tugasnya boleh ada banyak selagi mana ianya berada dalam lingkungan makna saraan.

Caranya ialah dengan groupkan mana-mana tugas yang related dengan responsibility class tersebut dan refactorkan.

Contoh:

public class Bapa
{
public void Bekerja()
{
}

public void SaraanAnak1()
{
}

public void SaraanAnak2()
{
}

public void SaraanAnak3()
{
}

public void SaraanIbuBapa()
{
}

}


Jadi berdasarkan code diatas ini class bapa coupling direct dengan tugas-tugas tersebut, aku boleh bahagikan kepada 3 responsiblity disini seperti berikut.
1. Bekerja
2. Saraan Anak
3. Saraan IbuBapa (Bapa/Ibu kepada bapa tersebut)

Jadi bila refactor dia akan menjadi:

public class Bapa
{

public void Tugas()
{
new SaraanIbuBapa();
new SaraanAnak();
new Kerja();
}
}

public class Kerja
{
public Kerja()
{
Bekerja();
}

public void Bekerja()
{
}
}

public class SaraanAnak
{
public SaraanAnak()
{
SaraanAnak1();
SaraanAnak2();
SaraanAnak3();
}

public void SaraanAnak1()
{
}

public void SaraanAnak2()
{
}

public void SaraanAnak3()
{
}
}

public class SaraanIbuBapa
{
public SaraanIbuBapa()
{
SaraanIbuBapaSendiri();
SaraanIbuBapaMertua();
}

public void SaraanIbuBapaSendiri()
{
}

public void SaraanIbuBapaMertua()
{
}
}


So dari class Bapa yang sarat dgn tugas kita dah menjadikan class Bapa untuk follow SRP. Ini adalah secara basic, class SaraanAnak sendiri adalah grouping tugas secara highlevel kemungkinan juga akan ada refactor di class tersebut tetap ada. Aku cuba buat sesimple yang boleh

Cuba-cubalah memahami, ada yang nak bagi comment dipersilakan.