Go, Hello World

Tag

Setelah install Go di lokal komputer saya perlu menjalankan Go untuk testing environment.

Seperti biasanya saya ikutin apa yang ada dipetunjuk, “Hello world”

package main
import "fmt"
func main() {
     fmt.Printf("hello, world\n")
}

Saya jalankan di console dengan : Go run “namafile”

Go

Tag

Sudah hampir 4 tahun saya gak nulis apapun disini, tiba-tiba hati saya tertancap pada Go.

Menurut yang saya baca sekilas dari tulisan orang-orang. Go, hampir sama dengan Erlang, sebuah bahasa yang membuat saya berfikir berbeda mengenai programming object. Konon Go lebih hebat.

Dalam C# dan bahasa yang setara dengan itu komunikasi antar object dilakukan dengan memanggil method, kemudian beberapa data disharing dengan method. Dalam Erlang komunikasi dilakukan dengan passing message. Message adalah sesuatu yang tidak dapat diubah. Sperti halnya kita berbicara, apa yang keluar dari mulut kita tidak bisa kita ubah, kecuali kita meralat dengan mengeluarkan ucapan berikutnya.

Dalam kehidupan pada umumnya, model dunia yang ada diotak saya dengan otak anda berbeda. Model akan berubah ketika otak kita menerima input kejadian dari luar lingkungan.

Go, konon di design untuk programming dicloud dengan banyak server. Mari kita lihat apa seperti itu.

Go bisa diinstall dari golang.org

Meregister proses

Tag

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

kongkuren erlang 1

Tag

-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.

Satu Agreegate Root Per Assembly atau Per Namespace?

Tag

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?

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

Tag

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

Tag

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.