Meregister proses

Desember 20, 2011

Kode berikut ini adalah contoh bagaimana meregister sebuah proses.

-module(echo2).
-export([go/0, loop/0]).

go() ->
register(echo, spawn(echo, loop, [])),
echo ! {self(), hello},
receive
{_Pid, Msg} ->
io:format(“~w~n”,[Msg])
end.

loop() ->
receive
{From, Msg} ->
From ! {self(), Msg},
loop();
stop ->
true
end.

Pid proses akan disimpan dalam VM Erlang dan dirujuk ke suatu alias. Kita bisa memanggil alias itu dari mana saja. Untuk mengetahui Pid kita bisa panggil whereis(alias). Untuk mengetahui list yang teregister kita bisa memakai regs().

atom di dalam tuple

Desember 20, 2011

atom tunggal sebaiknya tidak diwrap dalam tuple. kirim saja sebagai atom. ini akan menghemat memory.

kongkuren erlang 1

Desember 19, 2011

-module(echo).
-export([go/0, loop/0]).

go() ->
Pid = spawn(echo, loop, []),
Pid ! {self(), hello},
receive
{Pid, Msg} ->
io:format(“~w~n”,[Msg])
end,
Pid ! stop.

loop() ->
receive
{From, Msg} ->
From ! {self(), Msg},
loop();
stop ->
true
end.

how to run:
1. go to folder dimana file itu disimpan (cd bla bla)
2. ketik erl
3. c(echo).
4. go().

WARN: tanda titik.

Komunikasi antar Agreegate dengan Domain Event

November 11, 2009

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

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

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

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

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

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

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()
);


Ikuti

Get every new post delivered to your Inbox.