Komunikasi antar Agreegate dengan Domain Event

November 11, 2009 oleh mfathur

Post yang lalu, kita telah bersetuju untuk memutus hubungan erat antar aggregate, komunikasi dilakukan dengan pub/sub. Mekanismenya, kita menggunakan Domain Event.

Menurut Udi, kunci dari Domain Event ada dalam kata “when”. Yang belum begitu jelas, siapa yang berhak meraise event? Agregate root, atau semua stakeholder agreegate?

Satu Agreegate Root Per Assembly atau Per Namespace?

November 9, 2009 oleh mfathur

Welly lebih suka jika per assembly, dengan demikian agreegate benar-benar terisolir. Oetawan keberatan, karena akan membengkakkan jumlah library. Tapi library bisa digabung dengan ILMerge.

Dalam DDD, Eric Evan mengijinkan adanya hubungan antara root dengan root atau entity dengan root, merujuk apa yang dilakukan Greg Young, aku dan Welly lebih suka untuk tidak ada reference sama sekali antar agreegate root. Hubungan antar agreegate diwakili oleh value object. Komunikasi antara agreegate dilakukan dengan messaging: pub/sub.

Bagaimana Seharusnya Kita Menyusun Kelas-Kelas dan Infrastruktur Serta Alat-alat Agar Sesuai dengan DDD di .Net?

November 8, 2009 oleh mfathur

Ok. Mari kita diskusikan bagaimana seharusnya kita meletakkan kelas-kelas, perkakas, dan lain sebagainya agar memenuhi standart DDD dengan .Net.

Dalam salah satu sample DDD, orang membuat dalam Java, 1 paket 1 agreegate root yang berisi, entity, value object, domain event, dan interface dari repository, mungkin juga interface dari infrastruktur lainnya.

Lalu bagaimana dengan .net? Setujukah kalau kita buat setiap 1 agreegate root 1 namespace, yang berarti satu project. Isi dari project ini, interface (untuk tujuan mocking–agar mudah ditest?) terdiri dari interface infrastructur dan interface model, class (implementasi dari interface, yang harus didefinisikan sebagai internal), Factory (baik builder, abstrack, maupun method–lihat GOF).

Dengan demikian object-object tidak bisa dicreate dari luar, sehingga bisa diatur hanya lewat builder. Untuk menjaga agar object tidak bocor keluar, maka root tidak boleh mereturn apapun kecuali DTO. ? masih ada yang tertinggal?

Method harus eksplisit tidak boleh satu untuk semua message, consume misalnya. ?

 

Membagi hasil pencarian ke dalam halaman

September 3, 2009 oleh mfathur

Artikel  FullText Search yang ditulis NugrahaPutra, mengajari saya bagaimana cara membagi hasil pencarian dalam beberapa halaman.

Dalam artikel itu, hasil dari pencarian dipindahkan kedalam array. Untuk pencarian yang dibatasi, katakalah 100 hit, memindahkan kedalam array tentu tidak memakan waktu lama. Tapi jika dilakukan terhadap hit yang tidak terbatas, katakanlah 10.000 hit lebih, maka seketika performance akan terasa drop.

Karena itu saya ubah sedikit, saya tidak menyimpan kedalam hit, tetapi ketika method get_result() dipanggil baru sy masukkan data-data itu kedalam array. Tentu saja sebanyak offset (jumlah item yang dikehendaki dalam halaman). Berikut selengkapnya.

function get_result ($offset, $page){
        $hits = array();
	$startpos = ($page-1) * $offset;
	$endpos = $startpos+$offset;
	if($this->get_num_result()<$endpos)
	     $endpos=$this->get_num_result();
	$j=0;
	for ($i=$startpos;$i<$endpos;$i++){
		$item=$this->result[$i];
		$this->hits[$j]["id"] = $item->id;
            	$this->hits[$j]["score"] = $item->score;
            	$this->hits[$j]["productid"] = $item->productid;
		$this->hits[$j]["productcode"] =$item->productcode;
		$this->hits[$j]["nama"] = $this->query->highlightMatches($item->nama);
		$this->hits[$j]["keterangan"] =$this->query->highlightMatches($item->keterangan);
            	$this->hits[$j]["harga"] = $item->harga;
            	$this->hits[$j]["hargaNormal"] = $item->hargaNormal;
            	$this->hits[$j]["namasupplier"] = $this->query->highlightMatches($item->namasupplier);
            	$this->hits[$j]["alamat"] = $this->query->highlightMatches($item->alamat);
            	$this->hits[$j]["profileUrl"] = $item->profileUrl;
            	$this->hits[$j]["productUrl"] = $item->productUrl;
            	$this->hits[$j]["img1Url"] = $item->img1Url;
            	$this->hits[$j]["img2Url"] = $item->img2Url;
            	$this->hits[$j]["img3Url"] = $item->img3Url;
		$j++;
}

PHP highlight hasil pencarian

September 3, 2009 oleh mfathur

Alangkah baiknya jika pada hasil pencarian kata-kata yang match (ketemu) dibold atau diberi warna lain, sehingga kita bisa menilai mana yang benar2 kita cari.

PHP lucene sudah menyediakan hal itu, caranya mudah. Masukkan string kedalam lucene highlighter. Method itu berada dalam class query. Contoh:

$note=$this->query->highlightMatches($item->keterangan);

Didalam query berisi kata-kata yang kita cari. Method highlightMatches() mencari kata-kata yang match didalam field keterangan dan memberinya tanda. Tanda ini dalam format html style. Jadi siap diconsume oleh browser.

PHP JSON

September 3, 2009 oleh mfathur

Pada awalnya JSON saya buat sendiri secara manual. Semua berjalan baik, sampai suatu ketika output dari hasil search harus saya highlight, saat itulah JSON saya gagal diparse. Setelah saya renungkan, bukan saja soal highlight, bahkan jika saja inject dengan tanda petik pun, JSON saya gagal.

Saya sempat ragu untuk menggunakan JSON dan akan kembali menggunakan XML. Tapi, tunggu dulu, saya pikir dalam hati, siapa tahu Zend punya sesuatu. Saya tanya ke paman google dan juga cek ke library Zend. Ini yang saya dapatkan: Zend JSON Encoding.

Bagaimana cara memakainya? Prinsipnya, kita punya data, entah mungkin array atau object, nah cukup lemparkan data itu ke Zend JSON Encoding. Selesai. Semudah itu. Sperti ini:

[katakanlah $hits adalah array hasil search]

$jsonHits=Zend_Json::encode($hits) ;

yang kita butuhkan adalah:

require_once ‘Zend/Json.php’;

pastikan juga ada JSON dalam folder library Zend: Zend/Json.

PHPLucene tidak mengindex angka

Agustus 30, 2009 oleh mfathur

Jadi ceritanya begini (scenario): saya punya kumpulan produk yang dipromosikan diinternet. Tentu saja ada field yang berisi promosi dan juga field harga promosi.

Nah, pencarian yang saya inginkan, contoh: “sepatu sport harga kurang dari 100000″. Karena angka tidak diindex, maka search saya tidak pernah menemukan satupun.

Selidik punya selidik, ternyata masalahnya ada di Analizer. Semacam parser. By default Lucene akan menggunakan analizer yang mengabaikan angka. Trus agar bisa mesti diganti apa? Setelah tanya mbah google, gampang katanya: cari analizer yang ada kata “num” didalamnya….hehehe lucu ya…lucene gitu loh…
Trus saya pakai apa? Pakai ini nih:

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num()
);

Sayangnya analizer diatas membedakan huruf besar dan kecil, “baju” tidak sama dengan “Baju”. Pada kenyataannya kedua hal itu sama, maka saya coba cari yang lain lagi. Saya cari di Zend Library:

library\Zend\Search\Lucene\Analysis\Analyzer\Common

Didalam path diatas ada beberapa folder: Text, TextNum, Utf8, Utf8Num. Saya buka TextNum, dan saya memenukan analizer :Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive. Sehingga saya ubah menjadi:

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive()
);

PHPLucene: apa yang berbeda

Agustus 30, 2009 oleh mfathur

Anda mungkin bertanya: berbeda dari apa? Tentu saja dari Lucene.Net hehehehe karena saya belum pernah pakai yang Java.
Pada prinsipnya baik yang di dotnet maupun yang di PHP, sama. Bahkan, katanya nih, soalnya aku belum coba, hasil index bisa dibaca oleh siapa saja.
Trus bedanya apa? Ada beberapa catatan, tentu saja nanti bisa nambah:
1. Di dotnet dibedakan mendaji dua class: membaca dan menulis, sementara di PHP cukup satu saja.
2. Dalam pencarian, by default, PHP akan mencari kesemua field yang diindex. Jadi tidak repot dengan term dan query.

WAMPServer dan Zend Framework

Agustus 28, 2009 oleh mfathur

Saya newbie dalam dua alat ini. Namun, saya akan tetap mencoba mencatat bagaimana menggabungkan library Zend kedalam WAMPServer. Saya tidak akan menjelaskan apa itu WAMPServer maupun Zend, silahkan anda menggoogling di internet.

Setelah berhasil mendownload keduanya dari internet, saya menginstall WampServer. Mudah saja, tinggal pencet next dan next sampai finish. Selesai menginstall, saya coba ketikkan “localhost” dibrowser, muncul dashboard dari wampserver. Ok, saya berasumsi jalan.

Di-icontry saya muncul icon setengah lingkaran kayak spedometer. Oh…rupanya itu milik wamp. Saya dekati pakai mosue, dia bilang server offline. Loh kok tetep bisa (tadi itu loh local hostnya kok bisa tampil)…aneh memang. Aih peduli amat….

Selanjutnya Zend saya extract. Saya kopi salah satu demonya (Search) ke dalam folder www. (dari ZendFramework-1.9.2\demos\Zend\Search –>kopi ke–>C:\wamp\www). Jadi ada folder:C:\wamp\www\search

Saya ketik dibrowser “http://localhost/search/create-index.php”. Browser bilang: Zend/Feed.php tidak ditemukan harap mengincludekan library PHP.

Dari wampserver trayicon–>PHP–>PHP.ini. Setelah file terbuka, cari keyword “include_path”. Temukan bagian ini:

; Windows: “\path1;\path2″
;include_path = “.;c:\php\includes”

ubah menjadi

; Windows: “\path1;\path2″
include_path = “.;c:\php\includes;C:\wamp\library”

Jadi “;” didepan itu “include_path” saya buang. Lalu saya tambahkan “C:\wamp\library”, ini adalah folder dimana zend library hasil ekstrak saya letakkan, anda boleh meletakkan dimana anda suka.

Restart Server: wampserver trayicon–>RestartAllServices

Pastikan koneksi internet anda ada, karena “create-index.php” mencari file diinternet. Reload kembali browser anda. Mestinya sudah OK. Kalau belum, tinggalkan pesan dibawah.

Akhirnya harus belajar PHP, Ajax, Javascript!

Agustus 26, 2009 oleh mfathur

Berhubung partnerku yang hebat diwebsite ngertinya PHP…apa boleh buat, saya harus ikut ngePHP.

Pertama, aku harus install webservernya, duh pake apa ya….bloon nih. Kata dia pakai WARMSERVER aja.

Kedua, aku mesti cari contoh basic. Tanya-tanya mbah google, kayaknya aku cocok dengan tutorial basic ajax-php.

Ketiga, aku mesti pilih editor. Editor apa yang bagus ya?….saking bingungnya aku pakai notepad.

Keempat, setelah diketik ditaruh dimana? ternyata ditaruh dibawah folder www. Tepatnya di C:\wamp\www

Gampang ternyata. Sayangnya javascriptnya gak jalan…kenapa ya…..Tiba-tiba teringat, aku kan punya visual studio.  Dengan visual studio, ketahuan, ternyata salah ketik. kkkkkkkkk malu….