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