Archive for the ‘Blog’ Category
Pick Yourself Up
Nothings impossible I have found
For when my chin is on the ground
I pick myself up, dust myself off, start all over againDon’t lose your confidence if you slip
Be grateful for a pleasant trip
And pick yourself up, dust yourself off and start all over againWork like a soul inspired till the battle of the day is won
You may be sick and tired but you’ll be a man my son
Don’t you remember the famous man who had to fall to rise again?
They picked themselves up, dust themselves off and started all over again
Filed under: Lirik, Song of the Day Tagged: Diana Krall, The Very Best Of Diana Krall (Deluxe Edition)
Dibutuhkan Dana Segera
Sad but True
Hey I’m your life
I’m the one who takes you there
Hey I’m your life
I’m the one who cares
They, They betray
I’m your only true friend now
They, They’ll betray
I’m forever thereI’m your dream, make you real
I’m your eyes when you must steal
I’m your pain when you can’t feel
Sad but trueI’m your dream, mind astray
I’m your eyes while you’re away
I’m your pain while you repay
You know it’s sad but true, sad but trueYou, You’re my mask
You’re my cover, my shelter
You, You’re my mask
You’re the one who’s blamed
Do, Do my work
Do my dirty work, scapegoat
Do, Do my deeds
For you’re the one who’s shamedI’m your dream, make you real
I’m your eyes when you must steal
I’m your pain when you can’t feel
Sad but trueI’m your dream, mind astray
I’m your eyes while you’re away
I’m your pain while you repay
You know it’s sad but true,sad but trueI’m your dream,
I’m your eyes,
I’m your painI’m your dream
I’m your eyes
I’m your painYou know it’s sad but true
Hate, I’m your hate
I’m your hate when you want love
Pay, Pay the price
Pay for nothing’s fairHey, I’m your life
I’m the one who took you there
Hey, I’m your life
And I no longer careI’m your dream, make you real
I’m your eyes when you must steal
I’m your pain when you can’t feel
Sad but trueI’m your truth, telling lies
I’m your reasoned alibis
I’m inside open your eyes
I’m youSad but true
Filed under: Lirik, Song of the Day Tagged: Metallica, The Black Album
Kalau Jadi Orangtua itu….
Enak banget yah!
Dari dulu udah begitu, dikasih tau bae2 malah marah2. Ya orang sekarang jadi diem aja donk.
Jadinya kelakuan grasak grusuk ga keruan gitu kan.
Kalo makan permen bungkusnya harus dibuang keluar jendela, mobilnya terlalu bersih kayanya.
Kalo nelepon kaki harus diangkat ke meja, aneh2 aja. Duduk napa?
Oooh kursi ga boleh ada di toko, bikin orang males katanya. Lha terus yang molor ngalor ngidul pas jam toko siapa?
Yg satu ini juga.. ucapan ga bisa dijaga. Udah dibilang.. beda antara "contoh baik" lu (yup, gw sama ortu pake "gw" en "lu") sama ga pernah cukup itu bedanya tipiiiis banget. Gw aja eneg denger "contoh2 baik" dari lu.
"Si itu tuh.. begini......"
"Ya udah ga usah disamain lah.."
"Kalo contoh baik kan perlu dicontoh.."
Entah kenapa makin ke sini makin mantap. Dua minggu pulang bisa dua minggu jaga toko. Seminggu pertama yang punya pergi maen, seminggu kedua yang punya pulang maen terus sakit. Satunya lagi sibuk cari pelarian, masak keq, belajar apa keq, ngomel2 keq...
Persis orang gila...
Nah yang di tengah yang pontang panting. Sibuk ngatur strategi supaya ngga perang dunia lagi. Masalahnya bukan cuma internal, tapi seringkali perang dunianya meluas ke luar2. Jatuh deh korban2 tidak bersalah. Ini loh yang paling nggak enak. Kalo untuk kita2 sih, rasanya udah kebal semua. Plus kita udah punya keluarga baru lagi (yang ngga enak lah jadi korban). Duh pusingnya.
Punya keluarga baru juga bukannya tambah adem gitu, ini ya ampun, kalo di belakang omongannya ...halah lah...bagi gw sih jahat. Kalo udah biasa ngomong di belakang, kadang2 keceplosan ngomong di depan. Gw aja yang ngedenger ga enak... untung keluarga barunya sabar.
Kalo cerita wuih anak saya sekolah ini itu di sini di situ... yang ada hati ini malah miriiiiis banget. Kenapa sih, kalau ngga ditanya, perlu disebut "Ini anak saya yang sekolah di ...." ?? Tujuannya apa?
Orang juga punya otak donk, masa anaknya sekolah begini begitu, orang tuanya grasak grusuk begitu. Anaknya bego apa? Ya udah paling banter cuma bisa senyum aja.
Mending orang2 tau aja kalau anaknya bego... mending....
Doa gw ngga terkabul. Dari dulu gw paling takut ortu gw berubah jadi ortu2 yang bawa foto anaknya yang menang Olimpiade fisika-lah, kimia-lah, lalu keliling2 dan pamer. Semua yang dikenal harus dipamerin. Ya ampuuun Pak, Bu...tujuannya apa? Anak pinter karena ortu pinter? Lah ortunya ngitung turunan aja ngga bisa? Bangga.. atau sombong?
Ngga bisa dibilangin ya mau bilang apa?? Paling pura2 buta, bisu, dan tuli.
Selamat Galungan dan Kuningan
Kembali ke Emas Sebagai Alat Pembayaran
Kalo emas sebagai alat investasi is OK ga masalah!
Alat pembayaran? Weit tunggu dulu, GA PRAKTIS juragan....
Coba kita hitung2 sedikit yuks!
Harga 1 gram emas (10 Mei 2010, 12:20 NY Time, sumber di sini): 351,755 (351 ribu sekian sekian rupiah).
Yang berarti 1000 rupiah itu 1/351.755 = 0.0028 gram. Bisalah beli kangkung seiket.
Tapi.....bisa ga yang jual kangkung nyediain timbangan seakurat 1/10000 gram? Harga timbangannya lebih mahal dari omset jualan kangkungnya sebulan (belum lagi perlu ditera BMG).
Tang ting tung... tapi kan bisa di-koin-kan, seperti uang logam begitu loh.
OK, asumsi kita koinkan 1000 rupiah dalam koin emas (secara ga boleh itu pake logam2 lain...takut inflasi katanya). Berarti 1 koin 0.0028 gram kan.
Karena saya Cin* dan turunan iblis, saya nakal. Saya kikir sedikit koinnya (kandidat terbaik adalah di bagian gerigi di dimensi tebal koin). Satu koin jadi 0.0025 gram.
Saya korupsi 0.0003 gram per koin.
Ketahuan? Bagaimana mungkin? Sempet transaksi menimbang2 sampai se-detil itu? Keburu layu kangkungnya dan sekali lagi sulit cari timbangan sedetil ini.
Dan lagi emas itu logam lunak. Sebagai alat transaksi massal, wajar donk ada baret2 (seperti uang kertas yang lecek2).
1000 koin saya kikir (modal 1 juta rupiah), saya dapat 0.3 gram EMAS, yang harganya 105 ribu sekian sekian. 10% untung sekejap mata! Dan mudah lagi menjual kembali secara ini langsung EMAS.
Beda dengan koin biasa, dikikir nilai logamnya tidak sebanding nilai intrinsik koinnya.
Saya suka sekali kalau ini terjadi... yuuk mari....mungkin saya akan investasi di pabrik kikir.
Proud to be Indonesian
Last Sunday, when queuing for some cakes at the KKIS birthday party, a women was waving to her friend. Not long after that she asked her friend to get closer. But this man seemed not agree with her. He decided to stay behind the last person of the queue. That's the right thing to do, indeed! But this women who stood in front of me keep asking him to get closer. The man said to her that the queue was a long one and he cannot go to her place just like that.Then *I don't know why* she suddenly looked at me. Perhaps she was trying to ask permission from me. But I cannot do that, I was not the only one queuin in the line. So I said to her: "Maaf Bu, antriannya memang dari ujung sana". She then replied to me with a smile: "Iya, maaf, maklum orang Indonesia". It was then I felt something exploded inside me and without thinking any further I said to her with a little bit angry tone: "Wah, jangan bawa-bawa nama bangsa dong, Bu!". Fortunately, she did not hear a thing about what I have said to her. It was too crowded that afternoon. My bad!
I mean, what was she thinking? It has nothing to do with the country! Do Indonesian teachers never teach you to queue? I AM INDONESIAN. I hate when people say: "They must be Indonesian, they don't know how to queue!" I even hate more those who admitting themselves as Indonesian who cannot queue!
*Siram air dingin ke kepala*
Oh well, we, as the young generation, must not allowed this kind of attitude spreading any further. Please, be proud to be Indonesian, not just by saying "I am proud to be one", but more than that, be a better individual with a better attitude.
"Knowledge is power, but character is more!"
Kangen Masa Lalu
Usia sekarang udah kepala 2 mau ke kepala 3, ternyata gara-gara gaul sama mahasiswa jadi sering keinget masa lalu pas masih bebas-bebasnya jadi orang he…he…he…. Sekarang karena sering coding kemampuan bergitarku udah jauh dibanding dulu. Ternyata dalam hidup selalu ada yang datang dan pergi, termasuk skill.
Bu Guru Thane
Knapa julukan "Bu Guru" muncul saat aku berusaha mendeskripsikan seorang Thane ya?
Ntahlah, profesi itu begitu saja terlintas di pikiranku. Thane, menurutku, adalah orang yang paling bijaksana diantara kami semua. Dengan segala ide dan perkataan yang ia keluarkan, kami bisa menjadi sebuah "kelompok bermain" yang kompak selama ini. "Reliable" adalah satu kata lain yang bisa kugambarkan.
Pertemuanku dengan Bu Guru ini bermula saat makan malam di Makan Sutra. Sehari sebelum "petualangan" kami ke Pulau Ubin. Belum genap dua bulan sejak hari itu dan sekarang aku dan teman-teman sudah harus melepas Sang Ibu Guru, Thane, untuk menelusuri jejak hidupnya sendiri. Meninggalkan kami di persimpangan jalan yang berbeda. Tali-tali yang saat itu beririsan dan membentuk sebuah "simpul" kini telah menemukan jalan lain, seperti yang diungkapkan oleh Sang Pujangga. Kapan ya kita akan bertemu lagi? Aku tidak tahu.
Waktu punya dua hadiah buatku. Awal dan akhir. Awal adalah kesempatan yang tanpanya, hidup adalah bukan sebuah kehidupan. Dan akhir adalah guru yang selalu mengajarkan makna dari sebuah kehidupan. Akhir selalu berusaha memberitahukan bahwa setiap detik yang kita jalani adalah berharga. Tiap pertemuan yang ada adalah satu momen yang unik dan tidak akan pernah bisa diulang. Karena itu dalam setiap pertemuan, aku berusaha untuk tidak sekedar "ada", "hadir", tapi lebih dari itu, memberi sebuah "kesan". Saat akhir datang menjemput, perpisahan, pasti ada rasa sedih. Tapi semua itu sudah terbayar di setiap detik pertemuan yang terlewat. Karena ada "kesan" di setiap momen itu. Ada awal, pasti ada akhir. Dan itulah yang membuat manusia lebih bisa menghargai arti sebuah kehidupan. Semoga pertemuan kita selama ini berkesan ya ;)
Buat Thane, hehe, aku ngga pinter ngomong langsung, lewat tulisan aja deh. Aku juga ga bisa nyanyi apa2 tadi, soalnya emang ga kepikiran mo nyanyi apa ya enaknya :-p Maaf klo aku punya salah2 dan apapun yg mungkin kurang berkenan :) Sekali lagi, semoga sukses dalam menjalani hidup n mengejar mimpi. Salam kompak dari anak2 TK SukaSenang2! Bye2 Bu Guru, we'll meet again someday!
Mengejar Impian
Masalah terbesar dari Kardy adalah: dia selalu punya target yang berbeda (baca: terlalu banyak maunya). Disuruh apa aja (sekolah keq.. kerja keq..) pasti banyak mainnya.
Kemarin gw dan anak2 sekolah berlibur ke Pulau Ubin, yup seperti Bobby dan teman2-nya. Bukan pertama kali memang gw ke Pulau Ubin, secara dulu pernah ketika gw masih muda.
Tapi ini pertama kalinya gw menjelajah pulau secuil itu dengan sungguh2 (secara dulu pergi dengan kakek2 dan nenek2 gitu looh).
Kita nyewa sepeda dan bersepeda "santai" keliling pulau. Perlu sekitar 30 menit untuk kenalan dengan sepeda sewaan, dan setelah itu we were a great partner! Ga jelek.. 3 x 7 speed hard tail mountain bike. Suspensi depan memang agak lousy tapi still manageable. Sepeda murahan memang (paling murah sewanya SGD 3, paling mahal SGD 10, sepeda ini SGD 5), tapi entah kenapa cocok betul... ada koneksi batin (halah).

Yang gw sendiri heran adalah.. ngga cape cuy (thanks to my bike..muach)! Rekan seperjalanan ngos2-an, protes kenapa gw terlalu cepat (yang ada gw malah muter2 dulu nunggu mereka..ya kali2 sok sosial dikit lah), dan kenapa gw nda pernah turun dari sepeda dan ngedorong pas tanjakan.
Medan bagi gw sih yaaaa... lumayan lah (kita ke timur, utara, en barat pulau) cuma diperberat dengan kita nge-goes di kitaran jam 1 siang ke atas...so lagi panas2-nya.
Hihihi...gw bisa ngomong dengan gayanya...duh yang namanya student itu.. harus sporty dunks =P.
Sejujurnya gw agak kaget juga... gw berharap antara gw kecelakaan (gw master-nya dalam hal kecelakaan kendaraan), pusing (panas gombreng gitu), atau muntah (my best buddy dalam olahraga).
Cuma waktu itu ada saat dimana gw senyum2 sendiri: "Koq kayanya gambarnya mulai tersusun yah".
Ketika muda dulu gw pernah bilang "Tek, gw pingin ikut triathlon" (see my 2009 post). Gila kali yah..Kardy yang muntah lari 3.2 km, beratnya 89 kg di SMU, pas SMP gendut, selalu duduk di pinggir lapangan pas jam olahraga.
Bagi gw sih ga masalah cita2 gila... mengutip kata Chicken Soup: "Gantunglah cita2-mu setinggi langit, kalaupun kamu tidak berhasil menggapainya, kamu masih akan berada di antara bintang2." So yup cita2 gw memang aneh2...jadi bintang bokep, gigolo, biologist, sex consultant, virologist, dll.
Sadar tidak sadar ketika kuliah gw memperbaiki renang. Pertama kali nyemplung ke kolam ITB, gaya bebas gw ancur, bisa sih bisa..tapi 50 m langsung muntah (gitu2 masih dapet A =P). Maklum dari kecil selalu spesialisasi di gaya dada.
Sampai tingkat 2, pas ketemu bule keren yang berenang gaya bebas jam 12 siang. Non-stop bo (makanya keren)! Sekali nyemplung bolak balik sampai naek lagi (entah berapa kali cuma yang pasti banyak). Dari "mencontoh" (plagiat ini) si bule itulah gw belajar long distance swimming untuk gaya bebas. Ooh.. kakinya ga usah semangat '45 banget... dikit2 juga OK.
Di tingkat akhir pun.. gw males lulus cepet2, mengulur waktu untuk belajar side swimming. Alih2 sibuk ngerjain TA, setiap sore ke kolam renang buat ngelatih side swimming gaya bebas (malemnya nge-DoTA). Pokoknya ogah lulus sampai bisa.
Ketika kerja gw memperbaiki skill sepeda. Untung dapet pos di Lampung yang satu kota jalanannya mirip jalanan kompleks perumahan. Asri bo! Lengkap dengan tanjakan dan turunan yang gila (serius gilanya). Well masih inget pertama kali goes ke kantor..langsung muntah! Dan pernah malemnya lembur ngerjain tender, paginya latihan tanjakan, siangnya mantap mimisan! Jatoh? wuih menggelinding masuk bahu jalan. Celana jeans sampe bolong (yg ini sakit..keseret aspal en gravel).
Ketika kuliah lagi sekarang...hihihi.. agenda tersembunyi gw adalah memperbaiki lari. Secara negara ini kondusif buat lari. Dulu 3.2 km muntah, sekarang 5km bisa 2x seminggu (biasa aja tuh), 10 km masih tenang2 aja. Sebenernya cape sih nda begitu... lebih ke bosen!
Makanya mau coba ikutan event marathon someday. Tahun lalu pingin ikut Stand Chard marathon, cuma kepentok presentasi Data Mining :(. Taon ini kali yaa... kalo masih di SG.
Dan yoga pun luar biasa membantu. Well secara gurunya sering ngomong: "Mind over body, and breath over mind. Thus breath is everything." Entah kenapa eh beneran loh setelah ikutan jadi bisa lebih tenang. Pegel kaki ketika goes di tanjakan.. mirip koq dengan posisi warrior one, warrior two, etc. Masalah panas pun teratasi dengan pernafasan yang lebih tenang.
Mo dibilang haram keq.. pokoknya senam yang ini mantap!
Kalau sekarang ngeliat ke belakang...rasanya ok juga ya. Someday entah kapan I'm going to nail that triathlon! Ga ngincer juara memang, cuma ngincer finish. Habis itu bisa deh mati dengan tenang (yup2 gw masih pingin mati muda en beautiful).
Daripada married, gw lebih memilih mengejar impian yg ini!
Btw gw sekarang bisa push-up loh (baru sadar 2 minggu belakangan ini)... ga semati-matian dulu :). Good job to myself!
Hot Stuff Coming Through
8-Puzzle Problem (Bagian 3)
Bismillaah…
Melanjutkan pembahasan sebelumnya mengenai 8-Puzzle Problem, kali ini mungkin saya hanya akan berbagi alternatif implementasi terkait algoritma Hill Climbing. Pada uraian sebelumnya, dicontohkan implementasi Hill Climbing dalam bahasa Java, namun sekarang saya coba contohkan penerapannya menggunakan C++ sederhana. Perlu diketahui bahwa contoh implementasi berikut ini belum menggunakan konsep berorientasi objek, jadi masih murni prosedural. So… let see the idea…
/*
* @author: Andik Taufiq
* Bandung - May 07, 2010
* Program implementation with Hill Climbing strategy for 8-Puzzle Problem
*/
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
int initialState[] = { 1, 0, 2, 8, 4, 3, 7, 6, 5 }; // initial state
int goalState[] = { 1, 2, 3, 8, 0, 4, 7, 6, 5 }; // goal state
int resetValue = 0;
int tempHeuristic[] = { resetValue, resetValue, resetValue, resetValue }; // penyimpan sementara evaluation value
int totalSolution = 0; // total solusi yang dihasilkan
// prosedur untuk mencetak isi sebuah state ke layar
void printState(int state[]) {
for (int i=0; i < 9; i++) {
if (i % 3 == 0) {
cout << "\n";
}
cout << state[i];
cout << " ";
}
cout << "\n";
}
// prosedur untuk menggerakkan kotak kosong ke arah kiri
void moveLeft(int state[]) {
int index0;
for (int i = 0; i < 9; i++) {
if (state[i] == 0) {
index0 = i;
}
}
if (index0 % 3 > 0) {
int temp = state[index0];
state[index0] = state[index0-1];
state[index0-1] = temp;
}
}
// prosedur untuk menggerakkan kotak kosong ke arah kanan
void moveRight(int state[]) {
int index0;
for (int i = 0; i < 9; i++) {
if (state[i] == 0) {
index0 = i;
}
}
if (index0 % 3 < 2) {
int temp = state[index0];
state[index0] = state[index0+1];
state[index0+1] = temp;
}
}
// prosedur untuk menggerakkan kotak kosong ke arah atas
void moveUp(int state[]) {
int index0;
for (int i = 0; i < 9; i++) {
if (state[i] == 0) {
index0 = i;
}
}
if (index0 > 2) {
int temp = state[index0];
state[index0] = state[index0-3];
state[index0-3] = temp;
}
}
// prosedur untuk menggerakkan kotak kosong ke arah bawah
void moveDown(int state[]) {
int index0;
for (int i = 0; i < 9; i++) {
if (state[i] == 0) {
index0 = i;
}
}
if (index0 < 6) {
int temp = state[index0];
state[index0] = state[index0+3];
state[index0+3] = temp;
}
}
// fungsi yang menghasilkan nilai 1 jika array1 identik dengan array2, menghaslkan 0 jika tidak
int hasSameElement(int array1[], int array2[]) {
int temp = 1;
int i = 0;
for (int i = 0; i < 9; i++) {
if (array1[i] != array2[i]) {
temp = 0;
}
}
return temp;
}
// fungsi yang menghasilkan nilai heuristic untuk masing-masing sisi 8 puzzle
// benar 1 dinilai 1, benar 2 dinilai 5, benar 3 dinilai 40 --> Pak Sabar's Heuristic :p
int sideHeuristic(int side, int currentState[], int goalState[]) {
// side :
// upside = 1
// rightside = 2
// downside = 3
// leftside = 4
// center vertical = 5
// center horizontal = 6
int temp = 0;
int match = 0;
switch (side) {
case 1:
match = 0;
for (int i = 0; i < 2; i++) {
if (currentState[i] == goalState[i] && currentState[i] != 0) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 40;
}
break;
case 2:
match = 0;
for (int i = 2; i < 9; i=i+3) {
if (currentState[i] == goalState[i] && currentState[i] != 0) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 40;
}
break;
case 3:
match = 0;
for (int i = 6; i < 9; i++) {
if (currentState[i] == goalState[i] && currentState[i] != 0) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 40;
}
break;
case 4:
match = 0;
for (int i = 0; i < 7; i=i+3) {
if (currentState[i] == goalState[i] && currentState[i] != 0) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 40;
}
break;
case 5:
match = 0;
for (int i = 1; i < 8; i=i+3) {
if (currentState[i] == goalState[i]) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 5;
}
break;
case 6:
match = 0;
for (int i = 3; i < 6; i++) {
if (currentState[i] == goalState[i]) {
match++;
}
}
if (match == 1) {
temp = temp + 1;
} else if (match == 2) {
temp = temp + 5;
} else if (match == 3) {
temp = temp + 5;
}
break;
}
return temp;
}
// fungsi yang menghasilkan kolom ke- dari sebuah index value pada state
int getCol(int val) {
return ((val/3)+1);
}
// fungsi yang menghasilkan baris ke- dari sebuah index value pada state
int getRow(int val) {
return ((val%3)+1);
}
// fungsi yang menghasilkan jarak langkah suatu kotak terhadap kondisi goalnya
int stepCounter(int condition1, int condition2) {
int temp1 = getCol(condition1)-getCol(condition2);
if (temp1 < 0) {
temp1 = (temp1 * -1) * 2;
}
int temp2 = getRow(condition1)-getRow(condition2);
if (temp2 < 0) {
temp2 = (temp2 * -1) * 2;
}
return (((temp1 + temp2) * -1) + 4);
//return (temp1 + temp2);
}
// menghasilkan nilai Manhattan Heuristic untuk current state terhadap goal state
int manhattanHeuristic(int currentState[], int goalState[]) {
int temp = 0;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (currentState[i] != 0) {
if (currentState[i] == goalState[j]) {
temp = temp + stepCounter(i, j);
}
}
}
}
return temp;
}
// menghasilkan nilai heuristic total (Manhattan + Pak Sabar's) untuk setiap current state terhadap goal state
int heuristicValue(int currentState[], int goalState[]) {
return sideHeuristic(1, currentState, goalState) +
sideHeuristic(2, currentState, goalState) +
sideHeuristic(3, currentState, goalState) +
sideHeuristic(4, currentState, goalState) +
sideHeuristic(5, currentState, goalState) +
sideHeuristic(6, currentState, goalState) +
manhattanHeuristic(currentState, goalState);
}
// prosedur yang melakukan penyalinan nilai setiap elemen pada array2 ke setiap elemen pada array2
// array1 dan array2 sama-sama telah terdefinisi sebelumnya
void copyArray(int array1[], int array2[]) {
for (int i = 0; i < 9; i++) {
array2[i] = array1[i];
}
}
int getTheBestIndex(int arrayHeuristic[]) {
int temp = 0;
int tempValue = arrayHeuristic[0];
for (int i = 0; i < 4; i++) {
if (arrayHeuristic[i] > tempValue) {
tempValue = arrayHeuristic[i];
temp = i;
}
}
return temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
int currentState[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
copyArray(initialState, currentState);
int childState[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
while (hasSameElement(currentState, goalState) == 0) {
printState(currentState);
copyArray(currentState, childState);
moveUp(childState);
if (hasSameElement(childState, currentState) == 1) {
tempHeuristic[0] = 0;
} else {
tempHeuristic[0] = heuristicValue(childState, goalState);
moveDown(childState);
}
moveLeft(childState);
if (hasSameElement(childState, currentState) == 1) {
tempHeuristic[1] = 0;
} else {
tempHeuristic[1] = heuristicValue(childState, goalState);
moveRight(childState);
}
moveRight(childState);
if (hasSameElement(childState, currentState) == 1) {
tempHeuristic[2] = 0;
} else {
tempHeuristic[2] = heuristicValue(childState, goalState);
moveLeft(childState);
}
moveDown(childState);
if (hasSameElement(childState, currentState) == 1) {
tempHeuristic[3] = 0;
} else {
tempHeuristic[3] = heuristicValue(childState, goalState);
moveUp(childState);
}
int tempIndex = getTheBestIndex(tempHeuristic);
switch (tempIndex) {
case 0:
moveUp(currentState);
break;
case 1:
moveLeft(currentState);
break;
case 2:
moveRight(currentState);
break;
case 3:
moveDown(currentState);
break;
}
totalSolution++;
}
printState(currentState);
cout << "\nTotal Solution = ";
cout << totalSolution;
getchar();
return 0;
}
Kasus initial state dan goal state masih berupa hardcode, sehingga untuk mengubah-ubah nilainya perlu dilakukan secara langsung di kode program. Untuk fungsi evaluasinya, digunakan gabungan dari dua (2) nilai heuristic: Manhattan Distance dan Pak Sabar’s Heuristic
. Manhattan Distance telah saya jelaskan sebelumnya, sedangkan untuk Pak Sabar’s Heuristic penilaiannya dilakukan untuk setiap sisi pada 8-Puzzle (upside, rightside, downside, dan leftside). Thanks to Pak Sabar atas idenya. Satu lagi… program di atas belum dilakukan strategi big jump, jadi ketika ada kasus local maxima, maka akan terjadi forever loop. Semoga bermanfaat!!!
Bersambung…
Pahlawan atau Pengkhianat?
Kalo pergi keluar negeri untuk kerja di perusahaan, dianggap pengkhianat bangsa.
Tapi kalo udah terkenal ato udah jadi bos di luar negeri, dianggap megharumkan nama bangsa.
Pusing, terlalu banyak label.
Kalo mau mudah, tiap manusia punya keinginan tersendiri. Selama keinginannya itu 'sekadar' ingin bahagia bekerja di tempat yang dipilihnya (plus tidak merugikan orang lain), rasanya tidak ada masalah.
Make Prediction #QoD
if you make a great number of predictions, the ones that were wrong will soon be forgotten, and the ones that turn out to be true will make you famous.
Filed under: Quotation of the Day, Sitiran Tagged: Michael Newton, THE ENCYCLOPEDIA OF SERIAL KILLERS
Mohon Dibaca Untuk Mahasiswa Alpro Kelas Bu Rosa
Ini sebuah tips dari dosen UNS, jadi kalian bisa pada tahu kalau saya tidak berbohong mengenai bagaimana menguasai Algoritma dan Pemrograman.
Tips Sukses Belajar Pemrograman
8-Puzzle Problem (Bagian 2)
Bismillaah…
Menyambung postingan sebelumnya tentang 8-Puzzle Problem, kali ini akan saya lanjutkan dengan pembahasan detail mengenai metodologi yang digunakan dalam menyelesaikan permasalahan 8-Puzzle.
Di postingan sebelumnya telah disebutkan bahwa terdapat dua (2) metodologi dasar yang digunakan yaitu Blind Search dan Heuristic Search. Keduanya termasuk ke dalam jenis Pencarian atau Searching yang melibatkan pohon pencarian. Untuk yang Blind Search tidak akan saya bahas lebih lanjut karena secara prinsip cukup sederhana penalarannya. Sebagai contoh, sebut saja Depth First Search, yang termasuk ke dalam golongan Blind Search, hanya melakukan penelusuran terhadap pohon pencarian secara mendalam pada salah satu jalur pencarian hingga menemui solusi. Atau Breadth First Search yang hanya melakukan pencarian dengan menelusuri setiap level dari pohon pencarian. Untuk itu, sebelum kita melangkah ke pembahasan mengenai Heuristic Search, terlebih dahulu kita perlu tahu apa yang disebut sebagai heuristic itu sendiri.
Heuristic dalam konteks yang luas dapat didefinisikan sebagai suatu nilai informasi yang “dianggap” mendekati nilai solusi dari suatu permasalahan. Sebagai contoh, jika kita misalkan ada seseorang yang berada di Bandung hendak menuju Surabaya, lalu orang tersebut ingin mencari rute jalan darat terpendek yang dapat dilalui dari Bandung menuju Surabaya. Maka nilai heuristicnya bisa kita tentukan dari, misal jarak estimasi dari setiap titik keberangkatan menuju Surabaya berdasarkan jarak yang tertulis pada peta. Atau bisa saja nilai heuristicnya didasarkan pada jarak setiap titik keberangkatan terhadap stasiun kereta api terdekat. Yang jelas, nilai heuristic ini dapat sangat relatif berdasar penilaian masing-masing pembuat keputusan. Tapi perlu diingat, nilai heuristic ini digunakan dalam proses evaluasi setiap periode tertentu atau setiap titik evaluasi tertentu. Jadi sebisa mungkin nilai heuristic yang kita tentukan bersifat admissible atau dapat diterima secara semantik, baik karena kedekatannya dengan solusi maupun “masuk akal” dari sisi logika. Jika tidak demikian, maka bisa jadi bahwa proses pencarian yang kita lakukan malah akan menjauhkan kita dari solusi.
Pada 8-Puzzle Problem, kita juga dapat menentukan nilai heuristicnya. Namun agak berbeda dengan permasalahan bertipikal pencarian jarak terpendek, nilai heuristic pada 8-Puzzle langsung ditentukan berdasar kondisi kedekatannya dengan goal, karena kita tidak pernah tahu jarak atau langkah yang kira-kira dapat ditempuh dari state sekarang ke goalnya.
Pada berbagai referensi, ada beberapa nilai heuristic yang dapat dijadikan acuan untuk permasalahan 8-Puzzle. Salah satu yang cukup terkenal adalah Manhattan Distance. Manhattan Distance didefinisikan sebagai penjumlahan jarak masing-masing kotak 8-Puzzle terhadap posisinya yang benar pada kondisi goal. Sehingga, pada kondisi goal, heuristic pasti akan bernilai 0, karena semua kotak sudah pada posisinya masing-masing (jarak dengan posisinya yang benar = 0). Cara pendekatan seperti ini telah cukup dianggap admissible atau masuk akal. “Bagi yang mengatakan tidak masuk akal berarti akalnya belum masuk” by Jaya Setiabudi.
Berikut adalah contoh perhitungan Manhattan Distance untuk suatu state terhadap kondisi goalnya.
Seperti telah dikatakan sebelumnya, bahwa penilaian heuristic ini sangat relatif berdasar cara penalaran si pembuat keputusan. Jadi, sebenarnya penilaian ini juga dapat disebut sebagai penerapan strategi untuk permasalahn 8-Puzzle. Semakin bagus strateginya, maka akan semakin mangkus jalur pencarian yang dihasilkan. Monggo… bagi yang mempunyai strategi lebih bagus daripada Manhattan Distance dapat dishare dengan saya.
Berikutnya, yang kita lakukan adalah menentukan metodologi atau algortima pencariannya. Dengan menentukan metodologi pencarian, berarti kita menentukan bagaimana proses evaluasi yang dilakukan, tentunya menggunakan penilaian heuristic yang telah kita tentukan. Ada banyak metodologi yang dapat diterapkan untuk permasalahan 8-Puzzle. Berikut ini akan saya bahas beberapa algoritma populer yang dapat diterapkan untuk mencari jalur langkah penyelesaian 8-Puzzle.
Hill Climbing
Algoritma Hill Climbing merupakan salah satu teknik optimasi matematis yang termasuk ke dalam kategori local search. Disebut local search karena hanya melakukan evaluasi terhadap kemungkinan-kemungkinan state yang saat ini sedang dihadapi. Ketika telah memilih salah satu state yang dianggap terbaik, maka Hill Climbing akan melanjutkan pencarian hanya berdasar state yang telah dipilih tersebut, hingga mencapai kondisi goalnya. Jadi, ketika telah dipilih satu jalur, maka jalur yang lain akan diabaikan. Itulah mengapa Hill Climbing sering dianggap sebagai cara pencarian heuristic yang tercepat, karena hanya melakukan simple evaluation terhadap beberapa kemungkinan state yang dianggap terbaik, lalu memilihnya, dan melupakan kemungkinan lain yang berada di luar kondisi evaluatifnya. Dengan bahasa awamnya, Hill Climbing ini adalah tipikal yang setia dalam melakukan pemilihan.
Pada 8-puzzle, satu kali proses evaluasi menggunakan Hill Climbing hanya akan melibatkan maksimal 4 state untuk kondisi initial state, dan maksimal 3 state untuk kondisi state selain initial state. Sehingga state space untuk algoritma ini dapat dikatakan relatif sangat kecil. Berikut adalah contoh bagaimana algortima Hill Climbing dijalankan untuk suatu kasus state tertentu. Perlu diingat bahwa proses evaluasi yang dilakukan akan selalu mengambil nilai heuristic yang paling kecil.
Tetapi, Hill Climbing mempunyai dua (2) kelemahan:
- Plateau, kondisi ketika ada dua (2) atau lebih evaluation state yang mempunyai nilai heuristic sama besar dan juga merupakan nilai terbaik.
- Local Maxima, yaitu solusi lokal yang ditemukan dengan fungsi evaluasi. Tetapi solusi ini bukan kondisi goal yang diharapkan, dan jika dilakukan evaluasi secara terus menerus, maka akan kembali lagi ke kondisi solusi lokal itu sendiri. Karena memang fungsi evaluasi yang dilakukan menemui batasan pencarian lokal.
Untuk mengatasi kelemahan tersebut, ada strategi yang dapat diterapkan pada Hill Climbing agar solusi dapat ditemukan dengan baik. Strategi tersebut adalah:
- Untuk plateau cukup dapat diatasi dengan menerapkan aturan prioritas pergerakan kotak kosong. Misal, pergerakan kotak kosong ke atas adalah lebih diprioritaskan daripada pergerakan ke kiri, pergerakan kotak ke kiri lebih diprioritaskan daripada pergerakan ke kanan, dst.
- Sedangkan untuk local maxima, diperlukan lompatan besar (big jump) dengan memilih evaluation state yang lain ketika dalam kondisi local maxima. Big jump dapat diartikan dengan memilih state lain yang memiliki kedekatan heuristic dengan state terbaik, atau dengan cara melakukan pemilihan acak (random) terhadap state lainnya yang bukan terbaik.
Berikut adalah contoh implementasi algoritma Hill Climbing menggunakan bahasa pemrograman Java.
import java.util.Vector;
/**
*
* @author Andik Taufiq
* Hill Climbing solver for 8 puzzle problem
* March 18, 2010 - Bandung, Indonesia
*/
public class HillClimbing {
public Vector trackNodes;
private Node node;
public int[] initialState;
public int[] finalState;
public String message = "";
public HillClimbing(int[] initialState, int[] finalState) {
this.initialState = initialState;
this.finalState = finalState;
trackNodes = new Vector();
node = new Node(initialState, "");
node.heuristicValue = heuristic(node.nodeState, finalState);
trackNodes.addElement(node);
}
public String strArray(int[] array) {
String temp = "[ ";
for (int i = 0; i < array.length; i++) {
temp = temp + Integer.toString(array[i]) + " ";
}
temp = temp + "]";
return temp;
}
public String strSpecialArray(int[] array) {
String temp = "+===+===+===+\n";
String value = "";
for (int i = 0; i < array.length; i++) {
if (array[i] == 0)
value = " ";
else
value = Integer.toString(array[i]);
temp = temp + "| " + value + " ";
if (i%3 == 2) {
if (i < array.length - 1) {
temp = temp + "|\n+---+---+---+\n";
} else {
temp = temp + "|\n";
}
}
}
temp = temp + "+===+===+===+\n";
return temp;
}
private boolean hasSameElement(int[] state1, int[] state2) {
boolean temp = true;
int tempInt = 0;
for (int i = 0; i < state1.length; i++) {
if (state1[i] == state2[i])
tempInt++;
}
if (tempInt == state1.length)
temp = true;
else
temp = false;
return temp;
}
private boolean hasSameElements(int[] state, Vector arrayOfNodes) {
boolean temp = true;
int i = 0;
int counter = 0;
Node tempNode;
tempNode = new Node(state, "");
for (i = 0; i < arrayOfNodes.size(); i++) {
tempNode = (Node) arrayOfNodes.elementAt(i);
if (!hasSameElement(state, tempNode.nodeState)) {
counter++;
}
}
if (counter == arrayOfNodes.size()) {
temp = false;
} else {
temp = true;
}
return temp;
}
private int getMinVal(int[] array) {
int tempIndex = 0;
int tempValue = array[0]; // pre-assumed that array will never contains null value
for (int i = 0; i array[i]) {
tempIndex = i;
tempValue = array[i];
}
}
return tempIndex;
}
private Node getTheBestNode(Vector childs) {
int[] tempHeuristic = new int[childs.size()];
for (int i = 0; i < childs.size(); i++) {
tempHeuristic[i] = heuristic(((Node) childs.elementAt(i)).nodeState, finalState);
}
int tempIndex = getMinVal(tempHeuristic);
return (Node) childs.elementAt(tempIndex);
}
public int[] moveLeft(int index, int[] state) {
int[] tempState = new int[state.length];
for (int i = 0; i < tempState.length; i++) {
tempState[i] = state[i];
}
int temp = tempState[index-1];
tempState[index-1] = 0;
tempState[index] = temp;
return tempState;
}
public int[] moveRight(int index, int[] state) {
int[] tempState = new int[state.length];
for (int i = 0; i < tempState.length; i++) {
tempState[i] = state[i];
}
int temp = tempState[index+1];
tempState[index+1] = 0;
tempState[index] = temp;
return tempState;
}
public int[] moveUp(int index, int[] state) {
int[] tempState = new int[state.length];
for (int i = 0; i < tempState.length; i++) {
tempState[i] = state[i];
}
int temp = tempState[index-3];
tempState[index-3] = 0;
tempState[index] = temp;
return tempState;
}
public int[] moveDown(int index, int[] state) {
int[] tempState = new int[state.length];
for (int i = 0; i < tempState.length; i++) {
tempState[i] = state[i];
}
int temp = tempState[index+3];
tempState[index+3] = 0;
tempState[index] = temp;
return tempState;
}
private Vector getPossibleChilds(Node parent, Node ancestor) {
Node tempNode = new Node(parent.nodeState, "");
Vector tempStates = new Vector();
int[] tempState = new int[parent.nodeState.length];
for (int i = 0; i < tempState.length; i++) {
tempState[i] = parent.nodeState[i];
}
int index = 0;
// locate the index of empty tile
for (int i = 0; i < 9; i++) {
if (tempState[i] == 0) {
index = i;
}
}
switch (index) {
case 0:
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveLeft(index+1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 1:
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveRight(index-1, tempState);
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveLeft(index+1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 2:
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveRight(index-1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 3:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveLeft(index+1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 4:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveRight(index-1, tempState);
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveLeft(index+1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 5:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveRight(index-1, tempState);
tempState = moveDown(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 6:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 7:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveRight(index-1, tempState);
tempState = moveRight(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
case 8:
tempState = moveUp(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
tempState = moveDown(index-3, tempState);
tempState = moveLeft(index, tempState);
if (!hasSameElement(tempState, ancestor.nodeState)) {
tempNode = new Node(tempState, "");
tempStates.addElement(tempNode);
}
break;
}
return tempStates;
}
public Node getLastNode(Vector trackNodes) {
return (Node) trackNodes.elementAt(trackNodes.size()-1);
}
public void solveHillClimbing() {
Node tempNode = new Node(initialState, "");
Vector tempChilds = new Vector();
tempChilds = getPossibleChilds((Node) trackNodes.elementAt(0),
(Node) trackNodes.elementAt(0));
tempNode = getTheBestNode(tempChilds);
int i = 0;
while (!hasSameElement(((Node) trackNodes.elementAt(i)).nodeState, finalState)) {
if (hasSameElements(tempNode.nodeState, trackNodes) == false) {
trackNodes.addElement(tempNode);
if (!hasSameElement(tempNode.nodeState, finalState)) {
tempNode = new Node(tempNode.nodeState, "");
tempNode = getTheBestNode(getPossibleChilds((Node) trackNodes.elementAt(i+1),
(Node) trackNodes.elementAt(i)));
}
i++;
} else {
trackNodes.addElement(tempNode);
message = "Local max at " + strArray(((Node) trackNodes.elementAt(i)).nodeState);
i++;
break;
}
}
}
private int getCol(int val) {
return ((val/3)+1);
}
private int getRow(int val) {
return ((val%3)+1);
}
private int stepCounter(int condition1, int condition2) {
return (Math.abs(getCol(condition1)-getCol(condition2)) +
Math.abs(getRow(condition1)-getRow(condition2)));
}
public int heuristic(int[] currentState, int[] finalState) {
int temp = 0;
for (int i = 0; i < currentState.length; i++) {
for (int j = 0; j < finalState.length; j++) {
if (currentState[i] != 0) {
if (currentState[i] == finalState[j]) {
temp = temp + stepCounter(i, j);
}
}
}
}
return temp;
}
}
Keterangan Kode Program:
- Kode program di atas membutuhkan kelas Node seperti yang telah saya tuliskan pada postingan sebelumnya.
- Komponen masukan untuk penyelesaian dalam algoritma adalah berupa atribut initalState dan finalState.
- Penghitungan nilai heuristic diterapkan pada method heuristic().
- Langkah penyelesaian diimplementaskan pada method solveHillClimbing().
- Sehingga diperoleh hasil solusi yang ditampung pada trackNodes. Isi dari trackNodes ini dapat digunakan, baik untuk ditampilkan dengan GUI maupun dengan text mode.
Untuk program drivernya, saya berikan kebebasan bagi Anda untuk berkreasi.
bersambung…
Only If..
When there’s a shadow near, reach for the sun
When there is loving here, look for the one
And for the promises, there is the sky
And for the heavens are those who can flyChorus:
If you really want to, you can hear me say
Only if you want to will you find a way?
If you really want to you can seize the day
Only if you want to will you fly away?Interlude:
Na na na…When there’s a journey to follow the star
When there’s an ocean to sail to far
And for the broken hearts there is the sky
And for tomorrow are those who can FlyChorus….
Bridge:
Je voudrais voler, comme un oiseau d’ailleurs
(bis) d’ailleursChorus…
Filed under: Daily Life, Lirik, Song of the Day Tagged: Enya, May it Be
Maaf ya… Nikon
Hati-hati Parkir Kendaraan di Toko Rabbani
- Tidak ada permintaan maaf dari Toko Rabbani.
- Pihak Toko Rabbani terkesan saling melempar tanggung jawab. Pihak security bilang masalah parkir seharusnya jadi tanggung jawab pihak tukang parkir toko. Pihak tukang parkir belum datang saat pencurian tersebut terjadi. Kalo saya sebagai konsumen sebenarnya tidak perduli siapa yang harus bertanggung jawab di sana, entah security / tukang parkir. Yang penting Toko Rabbani bersedia bertanggung jawab!
- Pihak Toko Rabbani tidak mau memberikan jaminan secara resmi tentang bentuk pertanggungjawaban yang mereka berikan. Sebenarnya perwakilan Toko Rabbani sudah mengatakan bahwa mereka bersedia bertanggung jawab tetapi menunggu proses asuransi motor yang kami urus (kebetulan motornya masih belum lunas
). Saya meminta mereka membuat pernyataan resmi, hitam di atas putih, dengan materai, yang berisi apa tanggung jawab yang akan mereka berikan sebagai ganti rugi yang kami derita sebagai bentuk pertanggungjawaban mereka. Tetapi mereka selalu berkelit. - Tidak ada CCTV di bagian selatan gedung. Toko Rabbani sebenarnya sudah memasang CCTV yaitu di dalam gedung dan di sebelah utara gedung.Sepertinya Toko Rabbani memang tidak menargetkan konsumen yang datang dengan kendaaran motor, jadi mereka abaikan saja keamanan motor tersebut. Parkir sebelah selatan hanya cukup untuk motor. Toh pendapatan Toko Rabbani kan lebih gede dari orang-orang yang mengendarai mobil.
- Ketika toko buka seharusnya tukang parkir sudah ada. Jadi kejadian saling melempar tanggung jawab antara security toko, tukang parkir, atau pihak lainnya tidak akan terjadi.
Apa yang Harus Dilakukan Jika Merasa Sendiri Menyelesaikan Banyak Hal?
No hard feeling, but it’s all about the metric dear…
Perhaps I should share it to you: my future never-will-be child, why i don't want to be your parent. It's not because i don't love you nor because i'm selfish nor because i'm not afraid to die alone. But it's because: i consider every day, every single day in my life up until now, as NOT-interesting. And I truly hope that you will not suffer the same fate as me.
Our society and civilization has evolved so much. And at current date, at its glorious so called modern state, do you see what i see?
Twenty years back you could sell sweet soya sauce by claiming: "My sweet soya sauce is the best!"
However at current age, people will throw back your claim at your face and say "Uh-huh..what is the support of your claim?" Which is in simple term: you have to translate the term: BEST into something that can be understood by common people: NUMBERS!
For soya sauce the translation can be varies:
- The average change of number where the husband is eating home-cook food in one week from 1000 families.
- The average change of family members' body weight after a month using the given soya sauce.
- Or whatever as long as it displays good numerical properties.
This lead to another discussion: how do we value our own life?
My dear child, the greatest sin in our current society is not about blasphemy, denying so called holy ghost, etc.
But more into: sitting in false positions in too many properties (dimensions) of our society bell curves.
In other words: for a given property, you can't afford to be a standard more-over sub-standard. You have to be over the standard.
So if your intelligence = standard, face = standard, body = standard, communication ability = standard, etc1 = standard, etc2 = standard, ... etcn = standard, you know that you're in deep shit.
Yup my dear child, it is can be seen in our current society professional lives. Professor is someone whose intellectuality is over the standard, porn star is someone whose body and face are over the standard, etc.
If you are within standard, then welcome to join millions of other robotic-like, clone-like "ordinary" employees. If you are a sub-standard, then you're a trash.
My dear child,
since the very early stage of your life, you will be calculated, converted into numerical values so called marks. Yup, your quality is nothing more than numbers in your report sheet. Will i care about your desires, dreams, about how you treat others, or about how you view this world? Suddenly it will look like the soya sauce advertisement. No, i will not be able to understand you. I will choose the easiest path: by numerical values.
And since it is in numerical values, it will become easy to compare you and the others. Suddenly you will be placed inside the famous bell curve. The problem is the bell curve will shift according to the sample values. In other word, if you are a top in one property, you will be grouped with other tops and suddenly you become standard again. So what is the limit? What is the goal?
I also don't know. But say: if you were a top student in Stanfart, Hardfart, Institut Tai Burung, Not-Up-to-Standard, i would say that I am proud you! Because at that state, you stand as the over-standard outliers from thousands, millions perhaps, of people.
This will break my heart into pieces.
I really don't want to convert you into such values. I really want to consider you as an uniqueness. For whatever bell curves, you are always over the standard for me.
But yeah, i have to admit, the society doesn't permit me to. Even if i can protect you, but i can't protect you from society. When you go out, to find a job for example, you will be converted again, and the mighty bell curves will be put on you.
It is a slavery, we are the slaves, and our society is the master.
I always like the story where the hero is fighting monsters with strong righteous heart, or undead with faith. But currently we are fighting each other with yeah...metric. The numerical properties of our "self". There is no place for non-understandable terms like righteous heart, faith, etc.
I don't like this world. I do wish to be able to see other worlds, where metric will fail, where something else prevails. Perhaps in the other world there exists a method to view this world other than metric and numbers. Perhaps...and perhaps...
At the end, as silly as it seems, I do hope we can fight monsters and undead together, in the other world.
Nabi Saja Oedipus Complex (Suka Wanita Lebih Tua), So Why Not?
Kemarin ada topik menarik yang sedang diolok-olokkan beberapa mahasiswa terhadap temannya. Olok-olok itu terjadi mengenai apabila seorang lelaki menyukai wanita dengan usia lebih tua. Saya orang yang sangat terbuka dengan pilihan hidup siapapun karena bagi saya hidup adalah pilihan, semua pilihan memiliki resiko, dan semua pilihan ditanggung oleh manusia yang membuat pilihan, jadi pilihan terserah orang yang menjalaninya. Semua pilihan selalu memiliki nilai plus dan minus.
Saya kurang setuju dengan kurang open mind-nya masyarakat kita mengenai pilihan hidup seseorang. Sekarang coba kita lihat, Nabi Muhammad saja diberikan jodoh wanita yang jauh lebih tua dari usia Nabi (oedipus complex (menyukai wanita yang lebih tua)). Saat menikah setahu saya Nabi Muhammad berusia 25 tahun dan Khadijah berusia 40 tahun, selisih 15 tahun. Dan setahu saya, saat bersama Khadijah Nabi survive dari permasalahan-permasalahan sulit dengan Khadijah yang memang lebih wise di usianya. Bahkan saat bersama Khadijah Nabi tidak poligami. So dimana letak negatifnya? Atau hanya karena anggapan kultur belaka?
Lalu satu hal yang saya juga kurang setuju dengan kultur di masyarakat dimana seorang wanita tabu mengatakan “suka” duluan. Setahu saya Khadijah yang menyatakan dulu kepada Nabi Muhammad akan maksudnya. So dimana negatifnya? Atau hanya takut mengambil resiko ditolak saja? Apa kata dunia? Begitukah? Saya rasa sebaiknya kita lebih open mind dengan setiap pilihan manusia, jangan hanya termakan kultur belaka.
Doa Nabi Ibrahim Memohon Keturunan yang Baik
Ya Tuhanku, jadikanlah aku dan anak-cucuku orang-orang yang tetap mendirikan shalat. Ya Tuhan kami, perkenankan doaku.
Lord, make me and my offspring steadfast in prayer. Our Lord, grant our wishes. (Q.S. 14: 40)
Filed under: Al Quran, Quotation, Quotation of the Day Tagged: Ibrahim, Quran
UPI Wisuda VS Gasibu Minggu
Seru Bersama Mahasiswa
No More FV
Cikal Bakal Kultur Plagiat dan Korupsi yang Sudah Biasa di Indonesia
Jaman dulu dah sering lagu India tiba-tiba jadi lagu dangdut di Indonesia cuman diubah lirik. Lalu alasan pemakai nadanya terinspirasi dari sebuah lagu India (Gak langsung diakui kalo njiplak). Anda tentu tahu kan beda menjiplak dan “terinspirasi”.
Saya pernah mereset nilai mahasiswa saya (dianggap tidak ada nilai sama sekali di 2 kelas) karena sebagian besar dari mereka menyontek.
Saya pernah menge-nol-kan nilai beberapa mahasiswa saya karena ketahuan menyontek.
Mungkin terkesan saya kejam atau dijuluki “wanita berhati lurus”, tapi di hukum agama saya saja jika orang yang sudah baligh mencuri, maka harusnya dipotong tangannya, apakah Tuhan kejam jika begitu?
Dari semua peristiwa itu sepertinya memang “menyontek” sudah kultur.
Belum lagi plagiat di Universitas Parahiyangan Bandung oleh Seorang Profesor, atau plagiat Disertasi S3 yang ada di ITB baru-baru ini (baca disini). Parahnya mereka sudah melakukan lebih dari sekali. Lalu sering alasan yang dipakai orang Indonesia, “Saya Khilaf”. Saya pernah mendengarkan sebuah perkataan dari seorang dosen, kurang lebih seperti ini, “Manusia melakukan kesalahan pertama itu wajar dan manusiawi, lalu melakukan kesalahan kedua yang sama, itu juga masih manusiawi, tapi jika melakukan yang ketiga kalinya kesalahan yang sama itu sama dengan keledai“. Memalukan, apa karena sudah tidak punya malu?
Kenapa saya membahas menyonteknya. Karena menyontek biasanya dilakukan karena seseorang malas berusaha keras sehingga demi mendapatkan nilai bagus dia menyontek. Nah itu bisa berkembang menjadi karena ingin mendapatkan uang banyak dan malas berusaha keras maka dia korupsi (cikal bakal Gayus gayus yang lain). Intinya pada moral “malas” dan “menghalalkan segala cara”.
Hal ini sudah seperti lingkaran “setan” saja, karena misal awalnya moral dibentuk dari kecil seperti sekolah Dasar (SD), tapi semua orang juga tahu secara mayoritas siapa yang akan menjadi guru SD (saya saja tidak bersedia sebagai PNS guru SD
, bagi saya jadi guru SD susah). Sering agar sekolah mendapat penilaian bagus saat UN malah yang pintar disuruh gurunya menyonteki yang tidak bisa. Memang benar-benar sudah susah secara sistem untuk dibenahi. Atau ketika para guru itu diharuskan sekolah lagi ke S1 malah pas ujian saling menyontek, atau skripsinya benar-benar nyontek, yang penting lulus. Lha terus……kalau gurunya begitu, bagaimana siswanya?
Gangsir.com Bangkit dari Kubur… (Part 2)
Akhirnya Gangsir.com mampu bangkit kembali dari kuburnya. Ini kedua kalinya situs ini bangkit dari kuburnya. Gangsir.com pertama kali hidup sekitar tahun 2006. Kami hosting pada sebuah perusahaan hosting lokal. Tapi ternyata tidak sampai satu tahun, perusahaan tersebut bangkrut dan pemiliknya kabur
. Dan sialnya, domain Gangsir.com terdaftar atas nama pemilik hosting tersebut, bukan atas nama kami. Kami harus menunggu cukup lama agar domain tersebut expired dan kemudin kami daftarkan lagi. Memang sih kami memilih hosting di tempat tersebut karena harganya yang murah.
Dan alhamdulillah setelah sekian lama, pada hari Senin, 19 April 2010 kami berhasil menghidupkan kembali Gangsir.com. Semoga ini adalah kebangkitan yang terakhir dari situs ini, karena akan kami usahakan agar situs ini tidak pernah mati lagi. Amin. Kami sekarang hosting ditempat yang berbeda lagi. Sekali lagi terima kasih kepada Ditto Rahmat yang telah banyak membantu pada kebangkitan Gangsir.com untuk yang kedua kalinya.
Dikebangkitan Gangsir.com yang kedua ini, kami juga memberikan fitur yang benar-benar baru. Kami membuat sebuah proyek open source aplikasi untuk para dokter. Aplikasi tersebut kami beri nama GangDoctor. Aplikasi tersebut dapat digunakan untuk mencatat data pasien dan data obat. Semoga aplikasi tersebut dapat bermanfaat bagi semuanya. Amin.
Hungry-hungry Hobo
Invincible
I thought I had the right day, but I was in the wrong place.
I tried to open a door, but got it slammed in my face.
I’m at the back of the line, feels like eternity.Well, they tell me I’m gettin’ close, but I know I’m still far.
You can dress me up, but you can’t cover my scars.
I’ve become a professional at hide and seek.I’m a danger to myself.
I can take a wrong turn, you’re right behind me.
Crash and burn, I know you’ll find me.
As long as you’re here, I’m invincible.I can call your name and you’ll come running.
It’s pouring rain, you’ll make it sunny.
As long as you’re here, I’m invincible.Want to be part of the cure, but I’m part of the disease.
I can chase butterflies, but I get stung by the bees.
Sometimes I think too much, forget my clarity.I bought every self-help book that I could fit on the shelf.
Too many Downward Dogs, they can be bad for your health.
I don’t know who I am, so much for therapy.I’m a danger to myself.
I can take a wrong turn, you’re right behind me.
Crash and burn, I know you’ll find me.
As long as you’re here, I’m invincible.I can call your name and you’ll come running.
It’s pouring rain, you’ll make it sunny.
As long as you’re here, I’m invincible.I’m not the same old girl, no.
I want a brand new world.I can take a wrong turn, you’re right behind me.
Crash and burn, I know you’ll find me.
As long as you’re here, I’m invincible.I can call your name and you’ll come running.
It’s pouring rain, you’ll make it sunny.
As long as you’re here, I’m invincible.I thought I had the right day, but I was in the wrong place.
I tried to open a door, but got it slammed in my face.
I’m at the back of the line, feels like eternity.
Filed under: Daily Life, Lirik, Song of the Day Tagged: Chantal Kreviazuk, Plain Jane
Altering Execution Flow
Dengan menggunakan mekanisme try catch sebuah exception, kita bisa bikin eksekusi code kita melompat – lompat sesuai keinginan kita. Ini biasanya kita gunakan untuk sanity check dari variable yang kita punya.
Contohnya adalah code berikut ini (penjelasannya ada di comment dari method berikut ini):
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object object, BindException bindException) throws Exception {
// user must be authenticated (avoids auth errors)
if (Context.isAuthenticated()) {
HttpSession httpSession = request.getSession();
httpSession.setMaxInactiveInterval(-1); // don't let the session expire
String password = ServletRequestUtils.getStringParameter(request, "password");
String passphrase = ServletRequestUtils.getStringParameter(request, "passphrase");
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
byte[] iv = new byte[IV_SIZE];
try {
MultipartFile secretFile = multipartRequest.getFile("secretFile");
// sanity check
if (secretFile == null || secretFile.isEmpty())
throw new IOException("Unable to read secret file.");
InputStream secretFileInputStream = secretFile.getInputStream();
int ivSize = secretFileInputStream.read(iv);
// make sure the iv is 16 byte
if (ivSize != IV_SIZE)
throw new IOException("Secret file is corrupted or invalid secret file are being used.");
secretFileInputStream.close();
MultipartFile returnedData = multipartRequest.getFile("summaries");
// sanity check
if (returnedData == null || returnedData.isEmpty())
throw new IOException("Unable to read collection of summaries file.");
InputStream summariesInputStream = returnedData.getInputStream();
FileUtils.inflateSummaries(summariesInputStream, SummaryConstants.OUTPUT_LOCATION, password, passphrase, iv);
FileUtils.loadIndexFile("summaryindex.sql");
summariesInputStream.close();
String message = "Inflating collection of summary files completed successfully. Please check if files are decrypted succesfully.";
httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, message);
}
catch (Exception e) {
log.error("Inflating collection of summary files failed", e);
httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, e.getMessage());
}
return new ModelAndView(new RedirectView(getSuccessView()));
}
return showForm(request, response, bindException);
}
Inti dari tips kali ini adalah throwing exception didalam try catch block. Dengan mekanisme ini, flow dari program kita akan berubah sesuai dengan exception yang terjadi. Contohnya saat ivSize yang dibaca tidak sesuai dengan minimum yang kita inginkan, kita bisa men-throw exception disana dan exception ini akan di-catch kemudian sebuah error message akan ditampilkan di halaman web yang sedang dibuka oleh user.
if (ivSize != IV_SIZE)
throw new IOException("Secret file is corrupted or invalid secret file are being used.");
Dengan mekanisme ini, kita bisa mengatur flow eksekusi program kita tanpa if-then-else dan tanpa explicit goto.
Filed under: Personal Tagged: Java, programming
Knowing When to Stop
But what about love? Knowing that your path of loving someone is going to be very painful...do you still want to move forward and take all the risks? Don't you think by doing something like that you will only hurt more people and undoubtedly your love one?
Well, actually I don't have the intention to keep this serious talking right now. I just remember what my friend said when we were having dinner today. One of my friend ask us a question about the criteria of our ideal girlfriend/boyfriend. And this friend of mine, she said two things that made us laughed. She said, the first one must be "gebetable" and followed by "kissable", well more or less something like that.
"Gebetable" is, hmm, an Indonesian slang word joined with "able". "Gebetan" (n) is something like a person that you have an eye for. By saying this, does that mean that you have to know when to stop liking a person when he/she, for some reasons, is not "gebetable"? You have an eye for him/her but you know that if you have a relationship with him/her things will not go as a prince-and-princess-lived-happily-ever-after story, or at least that's what you think...
"Gebetable" --LOL-- Oh come on, Girl! You must be joking right! Where did you find that word? --LOL-- Hilarious! Indeed!
--
And what is this "kissable" about --LOL--
Just thinking about these two words makes me laugh all night long...
8-Puzzle Problem (Bagian 1)
Bismillaah…
Di tengah merebaknya “gosip” seputar paniknya pengumpulan tugas kuliah yang kian hari kian “riweuh” dan menumpuk, sepertinya baru mulai terasa bahwa kehidupan perkuliahan rupanya mengandung beban yang makin syarat serta semakin menguras waktu dan pikiran (lebay mode: ON). Untuk itu, saya berniat sedikit berbagi dengan teman-teman yang mungkin sedang sibuk-sibuknya “kejar tayang” dengan pekerjaan kantornya atau barangkali sedang “nyungsang jempalik” mengurusi masalah keluarga yang juga tidak kalah pentingnya. Sebagai “jomblowan” dan kaum “pengangguran”, saya memaklumi hal itu. Berikut adalah ulasannya. Monggo disemak!!
Ok… postingan kali ini adalah tentang tugas perkuliahan Intelejensi Buatan Tingkat Lanjut (EL5133) yang membahas mengenai permasalahan 8-puzzle (8-Puzzle Problem). Dalam dunia artificial intelligence, permasalahan-permasalahan yang sederhana seperti 8-Puzzle ini sering digunakan sebagai miniatur simulasi pencarian solusi terhadap suatu masalah. Tentang seperti apa, mengapa, dan bagaimana penerapan 8-Puzzle Problem ini, ada baiknya kita uraikan satu per satu poin-poinnya.
Definisi Singkat
8-Puzzle adalah representasi permainan teka-teki yang dapat diselesaikan dengan mengurutkan atau menyusun komponen-komponen pembentuknya sesuai dengan kondisi yang diinginkan. Komponen pada 8-Puzzle adalah berupa kotak-kotak bernomor atau bergambar (sesuai kebutuhan) yang dapat diacak sedemikian hingga menjadi suatu pola random yang dapat dicari jalan penyelesaiannya. Sesuai namanya, 8-Puzzle terdiri atas 8 kotak dan 1 tempat kosong yang dapat digerakkan dengan aturan tertentu. Aturan pergerakannya hanya berupa empat (4) arah pergerakan, yaitu: atas, bawah, kanan, dan kiri. Serta terlimitasi oleh ukuran dimensi papan yang ditempatinya. Pada 8-Puzzle, batasannya adalah ukuran 3×3. Sehingga, 8 kotak yang dimiliki hanya dapat bergerak dalam lingkup ukuran tersebut.
Tipikal Permasalahan
Tipikal permasalahan yang disajikan oleh 8-Puzzle adalah berupa pencarian langkah-langkah konkret sesuai aturan sehingga menuju kondisi akhir yang diinginkan. Oleh karena itu, pada bidang artificial intelligence, penyelesaian permasalahan 8-Puzzle ini dapat dikategorikan ke dalam metode Pencarian atau Searching. Penjelasan lebih lanjut mengenai Searching akan dibahas pada poin Metodologi.
Struktur Representasi
Karena berupa pencarian langkah-langkah menuju goal, maka permasalahan 8-Puzzle ini mungkin lebih sesuai jika direpresentasikan dalam bentuk Pohon Penyelesaian. Sehingga implementasinya akan lebih “mengena” jika menggunakan struktur pohon atau tree node dengan jumlah child sebanyak N, atau yang lebih familiar kita sebut sebagai N-ary Tree. Berikut adalah contoh implementasi N-ary Tree yang saya buat menggunakan bahasa favorit saya, JavaTM (dibacanya bukan Jawa Timuran ya… :p).
import java.util.Vector;
/**
*
* @author Andik Taufiq
* Node represents element of N-ary tree
* March 18, 2010 - Bandung, Indonesia
*/
public class Node {
public Node parentNode = null;
public Vector children;
public int index = 0;
public int[] nodeState;
public String nodeId;
public int level = 0;
public int heuristicValue;
public boolean closed;
public Node(int[] state, String id) {
this.children = new Vector();
nodeState = new int[9];
for (int i = 0; i < 9; i++) {
nodeState[i] = state[i];
}
if (parentNode == null) {
nodeId = id + "0";
level = 0;
} else {
nodeId = parentNode.nodeId + Integer.toString(parentNode.getChildrenNum() + 1);
level = parentNode.level + 1;
}
closed = false;
}
public void appendChild(Node node, int[] state) {
node.parentNode = this;
node.index = this.children.size();
node.nodeState = new int[9];
for (int i = 0; i < 9; i++) {
node.nodeState[i] = state[i];
}
node.nodeId = node.parentNode.nodeId + Integer.toString(node.parentNode.getChildrenNum() + 1);
node.level = this.level + 1;
node.closed = false;
this.children.addElement(node);
}
public int getChildrenNum() {
return this.children.size();
}
public boolean hasChildren() {
return this.getChildrenNum() > 0;
}
}
Representasi di atas saya bungkus ke dalam satu kelas bernama Node yang mewakili satu node pada struktur pohon N-ary. Untuk atribut, saya sesuaikan dengan kebutuhan terkait struktur data state pada 8-Puzzle yang sepertinya lebih cocok jika direpresentasikan dalam bentuk array of integer nodeState yang beranggotakan bilangan integer dari 0 sampai 8. Bilangan 0 mewakili kotak kosong atau blank, sedangkan bilangan lainnya mewakili kotak-kotak bernomor yang bersesuaian dengan bilangan tersebut. Serta nilai informasi menuju goal yang saya simpan pada atribut heuristicValue. Pembahasan mengenai nilai informasi ini akan diuraikan lebih dalam pada poin Informed Search.
Metodologi
Cara penyelesaian masalah dalam Searching, secara garis besar dibagi menjadi dua (2) metode, yaitu:
1. Pencarian dengan tanpa nilai informasi menuju kondisi akhir, biasa disebut sebagai Uninformed Search.
2. Pencarian yang memperhitungkan nilai informasi menuju kondisi yang diinginkan dan biasa disebut sebagai Informed Search.
…bersambung…





















































