Jumat, 25 November 2016

Pentingnya Menulis Postingan/Artikel Sesuai EYD

ejaan yang disempurnakan

Untuk pemilik blog niche download, penulisan artikel yang sesuai dengan kaidah penulisan bahasa Indonesia sepertinya tidak terlalu penting. Ini karena kebutuhan pengunjung adalah untuk men-download, bukan membaca. Bagi anda pemilik blog dengan niche lain, perlu diketahui bahwa penulisan artikel yang benar sekaligus tepat amatlah penting. Apalagi jika artikel anda bayak menekankan segi keilmuan dalam tulisan tersebut.

Meski SEO sudah cukup untuk menggaet ribuan pengunjung tiap harinya, pastikan pengunjung tersebut dapat memasang stigma positif dalam pikiran mereka. Sehingga kepercayaan mereka terhadap artikel yang kita tulis akan memacu mereka untuk membaca artikel yang lain.

Seringkali blogger cenderung lebih mementingkan SEO, namun lalai dengan konten yang mereka tulis. Padahal dengan menciptakan gaya kepenulisan yang baik, manfaat yang bisa didapat bukan hanya sebatas kenyamanan pengunjung, lho. Bisa jadi, pengunjung adalah salah satu pelajar yang mencari referensi untuk makalah atau jurnal mereka. Jika gaya penulisannya baik, besar kemungkinannya jika link kita akan masuk ke dalam daftar pustaka mereka. Hebat bukan?

Manfaat lainnya, dengan tulisan yang baik beberapa link anda bisa menjadi salah satu sumber referensi untuk tulisan dari blogger lain atau bahkan sumber referensi bagi seseorang yang menjawab pertanyaan di sebuah forum. Jadi, gaya kepenulisan yang baik akan menjadi akar bagi pohon backlink anda. Ia akan terus tumbuh dan berkembang lebat, seiring dengan berjalannya waktu.

Setelah membahas manfaatnya, berikut saya tuliskan beberapa kesalahan umum yang biasa dilakukan dalam menulis sebuah artikel/postingan.

Penulisan Judul yang Salah
Sebagai contoh, judul “promo domain gratis terbaru” adalah salah. Meski judul tersebut memberikan makna untuk isi keseluruhan tulisan, banyak pembaca berpengalaman yang cenderung berpikir tulian tersebut kurang berbobot. Bandingkan dengan penulisan judul yang benar,  “Promo Domain Gratis Terbaru”. Meskin isi kontennya kurang relevan, jika sumber navigasi pengunjung adalah sebuah link, mereka lebih memiliki kepercayaan untuk meng-klik dan melanjutkan baca.

Penulisan Kata Tak Perlu dan Tidak Relevan
Untuk membuat tulisan terlihat lebih berbobot, kadang kita masih sering menuliskan kata tak perlu.
“Sudah lama tidak menulis... bla bla bla”
Tidak salah, hanya saja kita harus lebih telaten untuk menyeleksi kata-kata dengan baik. Jangan sampai pengunjung memiliki pikiran bahwa si admin malas menulis.

Menulis Kalimat Kurang Efektif
Hampir sama seperti poin sebelumnya. Tapi usahakan untuk banyak meminimalisir kemungkinan kesalahan pada poin ini. Parameter ini adalah aspek yang berbobot nilai besar dalam menentukan kualitas informasi yang disampaikan dalam tulisan. Saya malah menyarankan, lebih baik tulisan anda pendek, daripada harus membuat kata non-efektif yang dapat berpeluang memusingkan pembaca anda.

Lalai Menerapkan Tanda Baca
Salah satu kesalahan yang sering terjadi pada poin ini adalah penggunan tanda koma ( , ). Kadang sulit, memang. Untuk memperbaikinya, kita dapat mencoba untuk banyak-banyak meningkatkan hobi membaca.

Salah Saat Menggunakan “di” dan “di-”
Selalu ingat untuk menyambung “di” apabila yang mengikutinya adalah kata kerja.
  • Dimakan
  • Dikerjakan
  • Disambung
Beda halnya, jika beruruan dengan kata yang menyatakan tempat, benda atau yang lainnya.
  • Di kota
  • Di hari minggu
  • Di dekat task manager

Itu tadi beberapa hal yang bisa saya sampaikan dalam menulis artikel yang baik. Bukan bermaksud menggurui, karena saya pun sekarang juga sadar, masih banyak tulisan dalam blog ini yang belum sesuai dengan EYD. Tapi, harapannya tulisan ini dapat menjadi pertimbangan sekligus acuan untuk menulis artikel yang berkualitas dan informatif untuk blog anda.
Sekian dari saya.
See you again..
Read more

Cara Ampuh Meningkatkan Backlink Berkualitas Secara Otomatis

backlink

Tak dapat dipungkiri, backlink sangat berpengaruh terhadap kualitas sebuah website di mata search engine. Sehingga banyak sekali orang membanting otak mereka dengan berbagai cara untuk menemukan peluangnya.

Cara konvensional yang biasa dilakukan blogger adalah melakukan blogwalking secara rutin. Namun adakalanya mereka bosan dengan rutinitas penting ini. Oleh karena itu, kita harus beralih dari membanting otak secara rutin melalui blogwalking, ke cara modern. Cukup membanting otak sekali, namun berbuah puluhan hingga ribuan backlink untuk website kita. Mungkinkah?
Berikut adalah tipsnya.

1. Buat artikel berkualitas, Ingatkan pengunjung mencantumkan sumber
Dari analisa, ternyata banyak sekali karya tulis yang masih mencantumkan daftar pustaka dari Wikipedia. Ini karena konten dari Wikipedia memiliki stigma terpercaya di mata para pembacanya. Jika anda dapat menulis artikel berkualitas layaknya Wikipedia, ini bisa jadi peluang bagi Anda. Meski banyak ahli copas nakal bermunculan, setidaknya selalu ingatkan mereka untuk mencantumkan sumber yang mengarah ke website kita.

2. Aktif di berbagai forum yang relevan
Sebagian besar forum memiliki rating tinggi di mata Google. Biasanya CMS mereka mengizinkan kita untuk mencantumkan website di bagian profil. Mulai sekarang, manfaatkan ini, karena usaha anda dapat berbuah backlink bernilai tinggi. Sebagai tambahan, jawablah pertanyaan dari forum dengan eferensi yang mengarah ke artikel website kita apabila relevan.

Sebagai contoh, jika blog anda berbahasa inggris dan membahas banyak tentang komputer, sering-seringlah berkunjung di stackoverflow dan situs sejenis lainnya.
Cara ini tidak berpengaruh secara cepat dan langsung. Kecepatan dan besar pengaruhnya ditentukan oleh poin pertama.

3. Berkaryalah untuk project open source
Jika anda memiliki skill cukup di bidang pemrograman, khususnya web programming, buatlah sebuah karya gratis untuk orang lain. Tempatkanlah attribution yang mengandung link ke website anda. Jangan dibuat terlalu mencolok, atau pengguna akan mengahpusnya. Jadi, saat mereka menggunakan karya kita, backlink baru akan lahir.

Cara ini adalah cara ampuh jika ide kita unik dan berguna bagi banyak orang. Salah satu peluang besarnya adalah dengan membuat template blogger atau mengembangkan/memperbaiki template yang sudah ada. Kemudian submit ke banyak situs penyedia template gratis. Tunggulah beberapa minggu, maka anda akan melihat kualitas backlink anda naik setiap waktu.

Demikian secuil tips yang bisa saya bagikan. Mudah-mudahan bermanfaat.
See you again later
Read more

Sabtu, 12 November 2016

Episode Membuat Sistem Operasi: Hello World

Kemarin hari sudah diberikan sedikit gambaran bagaimana prosesor Intel menjalankan proses booting, kan? Kali ini kita akan memulai sebuah demonstrasi (tanpa ricuh, ya) sistem operasi mulai dari yang paling dasar, yaitu mencetak “Hello World”.
Sebelumnya, saya sarankan untuk belajar sedikit tentang assembly, karena di awal episode ini kita akan memulainya dengan bahasa assembly saja. Tapi jangan takut, untuk episode lebih expert nantinya, saya akan berusaha meminimalisasi peggunaaan assembly dengan fokus pada penggunaan bahasa C.
Selain pemahaman assembly, saya juga mengasumsikan anda telah mengerti tentang seluk beluk Linux. Jika belum, saya sarankan untuk belajar menggunakan Linux, mulai dari menggunakan distro populer, seperti Ubuntu.
Sebenarnya bisa pakai Windows. Tapi meski lingkungan desktopnya enak, banyak hal yang belum tersedia di Windows. Sehingga kita harus melakukan banyak persiapan yang membosankan; belum sampai mencetak “hello World”, pasti anda sudah bosan duluan. Yakin, deh.

Adapun target yang ingin dicapai dari penulisan episode membuat sistem operasi ini adalah menciptakan sistem operasi dengan spesifikasi kelengkapan seperti berikut:
  • Arsitektur 32-bit
  • Higher half, modular and monolithic kernel
  • Memory management
  • Device management
  • Filesystem
  • Multitasking & Multithreading

Yuk, langsung kita mulai episode perdananya sekarang juga…
Yang dibutuhkan:
  • Sebuah komputer terinstall distro linux (tutorial ini menggunakan Ubuntu)
  • GCC (di Ubuntu sudah tersedia)
  • QEMU (install dengan sudo apt-get install qemu-system-i386 )
  • NASM ( install dengan sudo apt-get install nasm )
Pada seri pertama ini, kita akan membuat bootsector mencetak hello world menggunakan BIOS interrupt. Seperti kata saya sebelumnya, bootsector memiliki ukuran 512 byte. Untuk itu, kita akan membuat sebuah disk virtual berkapasitas 512 bytes. :v Jadi, isinya hanya bootsector saja.

org 0x7c00
mov si, hello
print:
    mov al,[si]
    cmp al,0
    je print_ok
    mov ah,0x0E
    int 0x10
    inc si
    jmp print
print_ok:
hang:
jmp hang
hello db "Hello world!",0
times 510-($-$$) db 0
db 0x55
db 0xAA

Tak perlu saja jelaskan banyak, ya. Saya asumsikan bahwa anda sudah cukup mempelajari dasar bahasa assembly. Yang ingin banyak saya jelaskan adalah penggunakan interrupt 0x10 (int 0x10). Interrupt ini adalah salah satu fitur umum yang telah disediakan oleh semua BIOS pada tiap komputer. Salah satu kegunaannya bisa kita manfaatkan dengan kode layanan 0x0E (Teletype output).

Cara penggunaan teletype output dengan int 0x10 adalah dengan mengisi parameter register AL dengan karakter yang ingin di cetak. Cukup itu saja, tapi jangan lupa, register AH akan selalu menyimpan kode layanan. Maka dari itu kita mengisi 0x0E ke register AH untuk menyuruh interrupt mencetak karakter dalam register AL.

Lalu apa ini?
times 510-($-$$) db 0

Kode di atas menggunakan salah satu operator khusus yang disediakan oleh NASM. Tak penting untuk mengetahui mekanismenya. Intiya, anda musti tahu bahwa kode tersebut akan menginstruksikan NASM untuk melakukan padding dengan 0 hingga berukuran 510 byte.

Sisa 2 byte harus disediakan untuk boot signature.
db 0x55
db 0xAA

Tanpa boot signature seperti di atas, bootsector tidak akan dianggap valid. Jadi, wajib hukumnya menyertakan boot signature pada 2 byte terakhir dari bootsector.

Compile dengan:
nasm -f bin hello.asm -o hello.bin
Jalankan dengan:
qemu-system-i386 -hda hello.bin

Hasilnya...


FYI:
-f bin menginstruksikan NASM untuk mengeluarkan output dalam format plain binary
-hda hello.bin menginstruksikan QEMU untuk memasang virtual disk "hello.bin" sebagai harddisk pertama.

See you on the next episode..
Read more

Jumat, 11 November 2016

5 Langkah Mudah Membuat Daftar Tabel / Daftar Gambar Otomatis di Microsoft Word


tabel gambar

Setelah sebelumnya kita coba membuat daftar isi, kali ini kita akan kembangkan sedikit trik baru berkenaan dengan Microsoft Word. Tidak berbeda dengan membuat daftar isi, membuat daftar gambar dan daftar tabel juga menuntut kita untuk menyusun konten secara terstruktur.

Cara membuat daftar tabel dan daftar gambar sama saja, jadi cukup dengan membaca tulisan singkat ini, anda akan tahu bagaimana mempraktekkan keduanya sendiri di rumah.

1. Buat terstruktur dengan caption di bawah gambar atau tabel
Mulai dengan klik Insert Caption dari tab References. Masukkan label/kata kunci yang akan dijadikan daftar isi, contohnya Tabel, Foto, atau Gambar. Bila kurang jelas, ikuti anak panah dalam screenshoot berikut.
tabel gambar

2.Ubah format caption sehingga sesuai dengan format yang diinginkan.
Setelah caption pertama dibuat, akan terlihat teks caption kecil di bawah gambar. Nantinya caption ini akan menaut dalam daftar gambar yang dibuat. Caption ini masih dalam format standar, sekarang coba sedikit mengubahnya dengan format yang kita kehendaki, misalnya teks tebal, font Arial, align center, dan sebagainya.
tabel gambar

Jika sudah, wajib hukumnya mengupdate format baru tersebut. Caranya, blok caption baru tadi, kemudian melalui tab Home klik kanan style Caption > Update Caption to Match Selection. Selengkapnya, lihat screenshot berikut. Sekarang tempatkan keterangan di depan caption, misalnya dari "Foto 1", menjadi "Foto 1. Foto panorama Tuban".
tabel gambar

3.Lanjutkan dengan memberi caption pada gambar-gambar anda yang lain
Kali ini, cukup mulai dengan ketik keterangan gambar di bawah gambar yang akan diberi caption. Jika sudah, tempatkan penunjuk kursor | di depan keterangan. Masuk kembali ke tab References > Insert Caption. Jangan lupa untuk memastikan agar Label sesuai dengan yang dibuat sebelumnya.

tabel gambar

4. Sekarang, buat daftar gambarnya
Sediakan halaman kosong dan tempatkan pointer kursor ke posisi tersebut. Dan, untuk terakhir kalinya, masuk ke tab References > Insert Table of Figures.
tabel gambar

Pilih caption label yang sesuai dengan nama yang telah dibuat di awal tadi lalu klik OK. Hasilnya akan seperti berikut.
tabel gambar

5. Update daftar gambar jika kamu baru memasukkan caption baru.
Caption tidak langsung masuk otomatis setelah dibuat. Untuk itu, kita harus mengupdate manual daftar gambar tersebut untuk melihat caption yang baru ditambahkan, sehingga masuk ke dalamnya.
tabel gambar

Yup, mudah kan? Cuma 5 langkah!
Mudah-mudahan bermanfaat. Selamat mengerjakan laporan kembali. And, see you again on the next post.
Read more

5 Langkah Mudah Membuat Daftar Isi Otomatis di Microsoft Word 2007, 2010 dan 2013


Karena daftar isi bekerja layaknya hasil pencarian Google, jadi kita harus tahu bagaimana membuat seluruh konten kita dapat dengan mudah terindeks di daftar isi tersebut. Seperti search engine, agar semua konten yang kita tulis mudah terindeks oleh daftar isi Microsoft Word, maka kita harus membuat konten tersebut terstruktur.

Yuk, langsung saja, kita follow triknya..

1. Terapkan heading untuk tiap judul bab
Pertama, terapkan Heading 1 tiap menulis judul bab. Lakukan dengan memblok teks judul. Lalu kita bisa langsung klik Heading 1 dari tab Home. Namun, biasanya warna teks akan berubah jadi biru di awal anda melakukannya. Ini karena Microsoft Word mengikuti format standar. Agar format teks tersebut mengikuti standar yang kita buat sendiri, klik kanan pada Heading 1 dan pilih Update Heading 1 to Match Selection. Untuk selanjutnya, kita cukup langsung klik Heading 1, ya. Tidak perlu melakukan Update Match Selection lagi.

2. Lakukan juga pada tiap judul sub-bab dan sub-sub-bab.
Setelah heading 1, lakukan cara yang sama untuk heading 2, heading 3, dst...

3. Buat daftar isiUntuk mmbuat daftar isinya, Lakukan melalui tab References. Pilih Table of Contents > Automatic Table.


Hasilnya akan seperti ini...


4. Agar judul bab Daftar Isi Terindeks, hapus tulisan Contents, lalu tulis Daftar Isi di bagian atas dan luar area daftar isi, lalu segera terapkan Heading 1.

Sekarang terapkan Heading 1...

5. Jika anda menambahkan bab atau sub bab baru, Jangan lupa update daftar isi tersebut. Tak perlu membuat yang baru lagi, kok.
Caranya, klik kanan di area manapun di dalam daftar isi yang anda buat, pilih Update Field.

Selamat, anda berhasil membuat daftar isi otomatis. Mudah kan?
Yuk, kita lanjut buat laporannya. hehehe :)
Read more

Nostalgia : Inilah Blog Pertamaku !


Ketika menuju laboratorium komputer SMP, hal yang paling sulit adalah menikmati komputer dari awal dinyalakan sampai dengan dimatikan. Itu mungkin adalah alasan saya ingin mempelajari teknologi. Karena teknologi sulit didapatkan, tapi banyak yang menginginkan. Praktik internet pun terbatas, hanya diajari dasar-dasarnya, namun sisanya entah kemana harus mencari. Sejak saat itu, saya punya mimpi untuk membuat situs download game :v


Tapi nyatanya mimpi itu susah sekali untuk dicapai. Tak semudah membalikkan telapak tangan. Dan ternyata saat itu pun saya menyadari, menggerakkan jemari sendiri pun tak kuasa.

Blog dengan sebuah post, dihiasi dengan ilustrasi ghost rider. Saya tidak tahu, mengapa saya berpikir untuk menempatkan gambar itu di depan. Jelas juga, tidak ada korelasi antara game dengan ghost rider. Dan, yang paling membuat geli, mungkin adalah ketika melihat deskripsinya. Wueks, mau muntah. :v

"game serba keren abyyyyyis........."

Yuk, kita intip. Game apa, sih, yang saking kerennya bisa mengubah "i" menjadi "y"...



WTF! :v
Hahaha. Benar-benar indah masa lalu itu.
Meski blog pertama tersebut terlihat cupu; tanpanya saya tidak bisa tertarik untuk belajar dan belajar tentang teknologi dan banyak hal dari internet sampai sekarang. Jadi, terima kasih masa lalu, terima kasih irvangames.

Itu tentang saya, bagaimana dengan anda?
Yuk, share linknya..
Read more

Cara Include / Embed File Ke Dalam Program Dengan GCC


Kita bisa memasukkan file bersama program, lalu file tersebut dapat diakses layaknya variabel, lho. Jika belum pernah coba trik ini, yuk, baca lebih lanjut.

Saat kita memiliki resource dalam jumlah besar yang harus diolah, kita biasanya cenderung menyimpannya dalam sebuah file. Program akan membuka file tersebut dengan fopen(), membacanya dengan fread(), memprosesnya, dan terakhir, menutupnya dengan fclose(). Terlalu merepotkan apabila file ini bersifat statis dan tidak perlu untuk diubah-ubah lagi. Error juga bisa terjadi apabila ternyata file tersebut tidak sengaja dihapus oleh pengguna.

Daripada membuatnya sebagai sebagai file, bagaimana jika kita menggabungkan resource ini dengan program? pasti akan lebih simpel tentunya. Yuk, kita ikuti langkahnya.
Pertama, buat sampel teks, katakanlah contoh.txt.

lorem ipsum


Buat contoh.txt menjadi object dengan perintah berikut.

ld -b binary contoh.txt --no-leading-underscore -o contoh.o

Kok ld? katanya gcc? hehe. Iya memang. Yang kita gunakan adalah LD, bukan GCC. Program ini adalah linker untuk gcc. Jadi, jika anda memiliki GCC, pasti punya juga program LD.
Argumen -b binary menginstruksikan LD untuk mengeluarkan output dalam bentuk binary object, lalu argumen --no-leading-underscore akan mencegah ld untuk menghasilkan simbol dengan awalan underscore, dan terakhir -o contoh.o untuk memberikan nama output yang dikehendaki.

Kemudian buat program untuh mencetak teks tadi. Saya akan memberinya nama print_contoh.c.

#include <stdio.h>

extern char binary_contoh_txt_start[];
extern char binary_contoh_txt_end[];

int main(){
    printf(binary_contoh_txt_start);
}

Loh, apa itu binary_contoh_txt_start dan binary_contoh_txt_end?
Yap, benar. Kedua simbol ini dihasilkan otomatis oleh LD. Formatnya adalah binary_nama_file_start yang menunjuk ke bagian awal data, dan binary_nama_file_end yang menunjuk ke bagian ekor dari data. Jika kita tidak menggunakan argumen --no-leading-underscore saat menggunakan ld, simbol yang dihasilkan biasanya otomatis berganti nama dengan underscore di depannya. Itulah mengapa sebelumya argumen tersebut dipakai. Tanpa argumen tersebut kita harus mengakes binary_nama_file... sebagai _binary_nama_file....

Kita bisa mengakses teks yang kita buat dengan binary_contoh_txt_start. Kemudian, jika kita ingin mengetahui ukuran data yang telah di embed, hitung saja dengan binary_contoh_txt_end - binary_contoh_txt_start.

Untuk membangun program ini, gunakan command berikut.
compile print_contoh.c lalu build dengan contoh.o:
gcc -c print_contoh.c -o print_contoh.o
gcc contoh.o print_contoh.o -o print_contoh.exe

Atau, bisa dilakukan dalam satu perintah, seperti ini.
gcc contoh.o print_contoh.c -o print_contoh.exe

Hasilnya?

Belum pernah memikirkan ini sebelumnya? Kalau iya, ayo ikuti saya bilang: "WOW" :D
Sekian dari saya, semoga bermanfaat.
Read more

Rabu, 09 November 2016

Implementasi Red-Black Tree Dalam C – Part 4

Sesuai dengan janji saya sebelumnya, maka untuk tema red-black tree chapter ke empat ini saya akan tunjukkan contoh implementasi red-black tree insertion  secara lengkap. Untuk kalian yang membaca tulisan ini dalam keperluan memenuhi tugas kuliah, jangan abaikan penjelasan part sebelumnya, ya. Copy paste saja tidak cukup, lho.

Kode di luar penjelasan yang telah diberikan sebelum-sebelumnya, di sini saya sertakan kode sederhana untuk keperluan debugging. Kalian tinggal passing argumen ke pointer struktur RBTree, lalu kalian bisa memeriksa nilai masing-masing node dengan mudah.

void RBTreeDump(RBTree *tree){
 char action;
 RBTreeNode *node = tree->root;
 first:
 printf("node data %x color %x left %x right %x\n",
  node->data,
  node->colour,node->left,node->right);
 printf("[u]p [l]eft [r]ight [q]uit:");
 scanf("\n%c",&action);
 switch (action){
  case 'u':
   node = node->parent;
   break;
  case 'l':
   node = node->left;
   break;
  case 'r':
   node = node->right;
   break;
  case 'q':
   goto last;
   break;
  default:
   goto first;
 }
 goto first;
 
 last:
 return;
}

Untuk memeriksa apakah nilai masing-masing node sudah di-fix up dengan benar, masukkan juga data yang baru saja kamu input di...

https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

Bandingkan setiap node dengan hasil dump.
Dan, inilah source code lengkap yang sudah kamu tunggu-tunggu. Jangan lupa pesan saya yang di awal, ya.

#include <stdlib.h>
#include <stdio.h>

typedef struct _RBTreeNode {
 int     data;
 int     colour; //0 for black
 struct _RBTreeNode *parent;
 struct _RBTreeNode *left;
 struct _RBTreeNode *right;
} RBTreeNode;

typedef struct RBTree {
 RBTreeNode *root;
} RBTree;


void rotate_left(RBTree *tree, RBTreeNode *x){
 RBTreeNode *y = x->right;
 x->right = y->left;
 
 if(y->left) y->left->parent = x;
  y->parent = x->parent;
 if(x->parent == 0)
  tree->root = y;
 else if(x == x->parent->left)
   x->parent->left = y;
  else
   x->parent->right = y;
 x->parent = y;
 y->left = x;
}

void rotate_right(RBTree *tree, RBTreeNode *x){
 RBTreeNode *y = x->left;
 x->left = y->right;
 
 if(y->right) y->right->parent = x;
  y->parent = x->parent;
 if(x->parent == 0)
  tree->root = y;
 else if(x == x->parent->left)
   x->parent->left = y;
  else
   x->parent->right = y;
 x->parent = y;
 y->right = x;
}

#define IS_RED(x) ((x) ? ((x->colour) ? 1:0):0) 
void insert_fixup(RBTree *tree, RBTreeNode *z){
 RBTreeNode *y;
 while(IS_RED(z->parent)){
  if(z->parent == z->parent->parent->left){
   y = z->parent->parent->right;
   if(IS_RED(y)){
    z->parent->colour = 0;
    y->colour = 0;
    z->parent->parent->colour = 1;
    z = z->parent->parent;
   }
   else{
    if(z == z->parent->right){
     z = z->parent;
     rotate_left(tree,z);
    }
    z->parent->colour = 0;
    z->parent->parent->colour = 1;
    rotate_right(tree,z->parent->parent);
   }
  }
  else { //parent at right
   y = z->parent->parent->left;
   if(IS_RED(y)){
    z->parent->colour = 0;
    y->colour = 0;
    z->parent->parent->colour = 1;
    z = z->parent->parent;
   }
   else {
    if(z == z->parent->left){
     z = z->parent;
     rotate_right(tree,z);
    }
    z->parent->colour = 0;
    z->parent->parent->colour = 1;
    rotate_left(tree,z->parent->parent);
   }
  }
 }
 tree->root->colour = 0;
}

void RBTreeInsert(RBTree *tree, RBTreeNode *z){
 RBTreeNode *y = 0;
 RBTreeNode *x = tree->root;
 
 z->left = 0;
 z->right = 0;
 
 while (x != 0){
  y = x;
  if(z->data < x->data)
   x = x->left;
  else
   x = x->right;
 }
 z->parent = y;
 if(y == 0){
  tree->root = z;
 }
 else{
  if(z->data < y->data)
   y->left = z;
  else {
   y->right = z;
  }
 }
 z->colour = 1; //RED
 insert_fixup(tree,z);
}

void RBTreeDump(RBTree *tree){
 char action;
 RBTreeNode *node = tree->root;
 first:
 printf("node data %d color %d left %x right %x\n",
  node->data,
  node->colour,node->left,node->right);
 printf("[u]p [l]eft [r]ight [q]uit:");
 scanf("\n%c",&action);
 switch (action){
  case 'u':
   node = node->parent;
   break;
  case 'l':
   node = node->left;
   break;
  case 'r':
   node = node->right;
   break;
  case 'q':
   goto last;
   break;
  default:
   goto first;
 }
 goto first;
 
 last:
 return;
}


RBTree rbt = {0};
int main(){
 char action;
 RBTreeNode *node;
 int node_data;
 
 first:
 printf("[i]nsert [d]ump [u]nlink [q]uit:");
 scanf("\n%c",&action);
 switch (action){
  case 'd':
   RBTreeDump(&rbt);
   break;
  case 'i':
   node = (RBTreeNode*)malloc(sizeof(RBTreeNode));
   printf("Node data:");
   scanf("\n%d",&node_data);
   node->data = node_data;
   RBTreeInsert(&rbt,node);
   break;
  case 'q':
   goto last;
   break;
  default:
   printf("Unknown cmd\n");
   goto first;
   break;
 }
 goto first;
 
 last:
 return 0;
}
Hasilnya akan terlihat seperti ini, lho.



Akhirnya, kita telah menyelesaikan chapter tentang red-black tree insertion dengan baik. Untuk operasi red-black tree lain, seperti deletion dan searching; tunggu saja. Just keep in touch with Komputoo.
See you again.
Read more

Implementasi Red-Black Tree Dalam C – Part 3

Yak, jumpa lagi kita dengan tema red-black tree. Dan kali ini, akan membahas part tentang red-black tree insertion. Setelah sebelumnya sudah dibuat pusing dengan rotation, maka tulisan ini akan lebih membuat anda pusing dari sebelumnya, tapi untungnya tidak sampai bisa membuat anda muntah, apalagi sampai muntah darah. :v

Yuk, kita langsung lanjut saja ke topik pembahasan kita.

Proses insertion pada red-black tree bisa diawali dengan metode insertion ke struktur data tree biasa. Tapi selanjutnya, kita harus segera memberikan properti warna merah pada node yang baru ditambahkan tersebut. Dalam tullisan ini saya menggunakan nilai colour = 1, yang artinya berwarna merah/red; dan colour = 0 untuk merepresentasikan warna hitam.

Berikut pseudo-code untuk insertion awal.
RB-INSERT(T,z)
    y ← null
    x ← T->root
    WHILE x ≠ null DO
        y ← x
        IF z->data < x->data THEN
            x ← x->left
        ELSE
            x ← x->right
   
    z->parent ← y
    IF y = null THEN
        T->root ← z
    ELSE IF z->data < y->data THEN
            y->left ← z
        ELSE
            y->right ← z
   
    z->left ← null
    z->right ← null
    z->color ← RED
    RB-INSERT-FIXUP(T, z)


Tidak usah bingung, intinya, kita harus mencari posisi penempatan yang tepat, sesuai algoritma tree; yakni node yang nilainya lebih besar atau sama dengan nilai parent selalu berada di kanan. Jika tidak, taruh sebelah kiri. Dan, jangan lupa, kita sedang berhadapan dengan red black tree. Berikan node yang ditambahkan tersebut warna awal merah. Terakhir, kita akan memanggil fungsi Fix Up untuk memeriksa adanya tidaknya violation.

void RBTreeInsert(RBTree *tree, RBTreeNode *z){
 RBTreeNode *y = 0;
 RBTreeNode *x = tree->root;
 
 z->left = 0;
 z->right = 0;
 
 while (x != 0){
  y = x;
  if(z->data < x->data)
   x = x->left;
  else
   x = x->right;
 }
 z->parent = y;
 if(y == 0){
  tree->root = z;
 }
 else{
  if(z->data < y->data)
   y->left = z;
  else {
   y->right = z;
  }
 }
 z->colour = 1; //RED
 insert_fixup(tree,z);
}

Pemberian warna merah ini mungkin akan membuat node ini mengalami violation terhadap node lain terdekatnya. Maka dari itu, algoritma diperlukan untuk mengeliminasi kondisi violation ini

Selalu ingat bahwa node yang baru saja ditambahkan pasti berwarna merah.
Tahap berikutnya mungkin sedikit rumit, karena kita akan bertemu dengan banyak proses checking, comparison dan loop untuk memeriksa node terdekat yang mampu menimbulkan violation. Violation ini tidak cukup diatasi dengan mengganti warna node yang bersangkutan, tapi terkadang kita harus memutar-mutar posisi node, juga. Itulah mengapa pada artikel yang sebelumnya dibahas tentang rotation.

Tahapan pemeriksaan violation dalam proses insertion dilakukan dalam 3 tahap cek (case).

Case 1: node memiliki parent dan saudara parent (bisa disebut paman/uncle) yang warnanya sama-sama merah.
Violation ini diatasi dengan mengubah parent dan uncle menjadi hitam dan grand parent menjadi merah. Grandparent = node→parent→parent.

Case 2: node (lihat node z berikut) adalah child di sisi kanan dari parent. Lalu, disaat yang sama uncle (lihat y) dari node tersebut adalah hitam. Ingat, leaf node juga dianggap hitam, jadi bisa saja uncle merupakan leaf.

Case 3: Mirip case 2, disini node (lihat z) adalah child di sisi kiri dari parent. Di saat yang sama, uncle dari node tersebut (lihat y) berwarna hitam.

Kedua case ini bekerja secara bersama sama. Pertama saya jelaskan case 2. Misalnya, lihat gambar paling kiri di atas. Pada ilustrasi tersebut terjadi violation pada parent A terhadap child B, karena parent A berwarna merah, namun memiliki child merah (yaitu B).

Jika dilihat asal muasal violationnya, tidak beda jauh dengan case 1. Hanya saja, uncle di case 2 dan case 3 ini berwarna hitam. Coba perhatikan dan bandingkan lebih dekat. Lalu, untuk violation dalam case 2 ini, dapat diatasi dengan melakukan rotasi. Berdasarkan ilustrasi tersebut, lakukan rotasi kiri(left rotation), sehingga jadilah bentuk seperti ilustrasi yang tengah. Dengan kata lain, jika terjadi violation case 2, PASTI akan terjadi violation case 3.

Berikutnya kita bahas case 3. Case ini dapat terjadi ketika struktur node terlihat seperti ilustrasi yang tengah. Cara mengatasi violation ini adalah dengan melakukan rotasi sehingga menjadi seperti ilustrasi paling kanan. Sesuai ilustrasi tersebut, maka lakukan right rotation.

Case 2 dan case 3 yang telah saya jelaskan hanya berlaku ketika node A dan node B berperan sebagai child sebelah kiri dari C. Jika di arah kanan, ya, tinggal balik saja arah rotasinya. Setelah melakukan pemeriksaan dengan melihat ketiga case tersebut, kita juga perlu melihat kondisi parent. Pastikan tidak ada violation. Lanjutkan juga untuk memeriksa parent lebih atas lagi, dan seterusnya. Biar mudah, kita pakai while loop (lihat pseudo-code).

RB-INSERT-FIXUP(T, z)
    WHILE z->parent->color = RED DO
        IF z->parent = z->parent->parent->left THEN
            y ← z->parent->parent->right
            IF y->color = RED THEN
                //case 1
                z->parent->color ← BLACK
                y->color ← BLACK
                z->parent->parent->color ← RED
                z ← z->parent->parent
            ELSE
                IF z = z->parent->right THEN
                    //case 2
                    z ← z->parent
                    LEFT-ROTATE(T, z)
                //case 3
                z->parent->color ← BLACK
                z->parent->parent->color ← RED
                RIGHT-ROTATE(T, z->parent->parent)
        ELSE
            y ← z->parent->parent->left
            IF y->color = RED THEN
                z->parent->color ← BLACK
                y->color ← BLACK
                z->parent->parent->color ← RED
                z ← z->parent->parent
            ELSE
                IF z = z->parent->left THEN
                    z ← z->parent
                    RIGHT-ROTATE(T, z)
                z->parent->color ← BLACK
                z->parent->parent->color ← RED
                LEFT-ROTATE(T, z->parent->parent)
   
    T->root->color ← BLACK


Wow, sebegitu kah? jangan kawatir. Jika masih bingung, baca dan pahami penjelasan tentang ketiga case di atas. Kode yang akan ditunjukkan disini sama persis kok dengan yang telah dijelaskan.

Saat awal mempelajari red-black tree, saya sempat kesulitan. Masalahnya terletak pada pengecekan leaf node. Leaf node sama artinya dengan null pointer. Jadi ketika leaf node hendak diakses untuk dicek, node->colour; program akan mengalami fault. So, saya menulis macro sederhana untuk mengecek node dengan aman. Fungsi ini juga akan memeriksa apakah node yang dicek adalah null(leaf node). Jika iya, maka langsung dikatakan bahwa node tersebut adalah hitam.

#define IS_RED(x) ((x) ? ((x->colour) ? 1:0):0)

Macro di atas mengembalikan 1 jika merah, atau 0 jika hitam.
Terakhir, berikut saya sertakan kode untuk fix up node red-black tree yang baru dimasukkan.
void insert_fixup(RBTree *tree, RBTreeNode *z){
 RBTreeNode *y;
 while(IS_RED(z->parent)){
  if(z->parent == z->parent->parent->left){
   y = z->parent->parent->right;
   if(IS_RED(y)){
    z->parent->colour = 0;
    y->colour = 0;
    z->parent->parent->colour = 1;
    z = z->parent->parent;
   }
   else{
    if(z == z->parent->right){
     z = z->parent;
     rotate_left(tree,z);
    }
    z->parent->colour = 0;
    z->parent->parent->colour = 1;
    rotate_right(tree,z->parent->parent);
   }
  }
  else { //parent at right
   y = z->parent->parent->left;
   if(IS_RED(y)){
    z->parent->colour = 0;
    y->colour = 0;
    z->parent->parent->colour = 1;
    z = z->parent->parent;
   }
   else {
    if(z == z->parent->left){
     z = z->parent;
     rotate_right(tree,z);
    }
    z->parent->colour = 0;
    z->parent->parent->colour = 1;
    rotate_left(tree,z->parent->parent);
   }
  }
 }
 tree->root->colour = 0;
}

Masih sulit untuk mencobanya atau malas untuk melakukan debugging?
Tunggu chapter berikutnya, untuk melihat versi putting it all together.

Saat mempelajari red-back tree, saya sangat menganjurkan untuk mengikuti bacaan berikut. Chapter berikut ini akan sangat membantu.
software.ucv.ro/~mburicea/lab8ASD.pdf

Sekian dari saya, semoga tulisan ini bermanfaat.
See you on the next article.
Read more

Selasa, 08 November 2016

Untuk Apa Keyword This di C++? Kapan Harus Menggunakannya?


Keyword this bukan hanya ada dalam C++, bahasa pemrograman object oriented lain juga sama-sama menggunakan this dengan cara yang sama. Biasanya keyword this dipakai oleh method yang bernaung di dalam sebuah class. Oleh perspektif programmer, keyword this merupakan simbol untuk merujuk kepada member kelas dari method tersebut.

Yang membuatnya sedikit membingungkan, di C++ kita bisa mengakses member tanpa menggunakan this.
#include <iostream>
using namespace std;

class MyClass{
    public:
    int X;
   
    void MyMethod(){
        X = 1;
        cout<<X<<endl;
    }
};

int main(){
    MyClass *test = new MyClass();
    test->MyMethod();
}


Output :
1

Lantas, mengapa harus ada keyword this jika bisa mengakses member secara langsung?
Kegunaan keyword this memang rumit jika dijelaskan dengan kata-kata, definisi atau pengertian. Tapi, setelah melihat ini, anda akan tahu, mengapa harus ada keyword this.
#include <iostream>
using namespace std;

class MyClass{
    public:
    int X;
   
    void MyMethod(){
        int X;
       
        X = 1;
        this->X = 2;
        cout<<X<<endl;
        cout<<this->X<<endl;
    }
};

int main(){
    MyClass *test = new MyClass();
    test->MyMethod();
}


Output:
1
2

Yap, keyword this bisa dimanfaakan jika method yang dibuat memiliki nama local variable atau nama parameter yang sama dengan nama salah satu member class.

Kalau dari pendapat penulis sendiri, keyword this dapat berguna untuk mengurangi kompleksitas dalam OOP. Ini dapat terjadi karena method dari class boleh memiliki nama parameter yang sama persis dengan salah sau member class tersebut.
class MyClass{
    public:
    int X;
   
    void MyMethod(int X){
        this->X = X;
    }
};


Tanpa dukungan keyword this, programmer harus mendeskripsikan parameter dengan nama lain yang tidak boleh konflik dengan salah satu member class.
class MyClass{
    public:
    int X;
   
    void MyMethod(int newX){
        X = newX;
    }
};


Meski efeknya kode akan butuh lebih panjang untuk ditulis, namun hal ini dapat meningkatkan keterbacaan kode.

Sekarang sudah tidak bingung lagi kan, kenapa C++ memiliki keyword this?
OK, see you..
Read more

Cara Ganti Baris di Komentar Facebook Mobile / HP

Trik Ganti Baris di Komentar Facebook Mobile

Cara pindah baris baru di komentar facebook mobile? Memang bisa?

Jika kalian programmer web, mungkin kalian pernah iseng menggunakan tag <br/> untuk ganti baris. Atau mungkin, jika kalian programmer desktop, pernah suatu kali anda memberikan karakter \n bersama komentar yang anda tulis. Tapi sayang, usaha anda sama sekali tidak ada artinya. :v

Karena tidak tahu cara ganti baris, thread di grup pemrograman jadi makin sepi; karena sebagian besar penggunanya aktif dari ponsel. Susah kalau mau menulis balasan komentar dalam bentuk source code.

Saya sering kali mengeluh dengan masalah ini. Apalagi, saya adalah salah satu penggemar berat m.facebook.com. Bahkan, saat browsing dari desktop pun, saya lebih suka mengakses facebook versi mobile. Selain karena lebih cepat, juga karena lebih hemat kuota. Tapi, ya itu tadi masalahnya.

So, bagaimana mengakali keterbatasan kolom komentar facebook tersebut?
Ternyata caranya simple, lho.
- Klik link "Lampirkan Foto" yang ada di bawah kolom komentar.
- Sekarang, tulis komentar anda sesuka hati.
- Klik "Komentari", tanpa harus melampirkan foto.
Trik Ganti Baris di Komentar Facebook Mobile

Tadaa..
Selamat, anda telah berhasil membuat komentar berbaris-baris di facebook mobile untuk pertama kalinya. Untuk itu, kami akan hadiahkan kepada anda, sebuah mobil Honda Xenia.
Read more

Senin, 07 November 2016

Mengapa di Linux Tidak Ada Header conio.h ?

console conio

Biasanya untuk keperluan apa kamu membutuhkan header conio.h ?
Jika hanya untuk getch() sehingga program tidak keluar sebelum user menekan key; maka sepertinya ini tidak perlu dilakukan, karena semua program console di linux harus dieksekusi melalui terminal.

Header conio.h tidak ada di linux, bukan karena mengapa. Harus diketahui bahwa conio.h bukanlah header standar untuk bahasa C. Header ini ada di Windows, semenjak keberadaan Turbo C di zaman DOS. Jadi file ini memang hanya berperan sebagai helper khusus programmer yang ada di lingkugan Windows.

Jika memaksa dan benar-benar butuh, dunia linux menyediakan fungsi yang hampir ekuivalen dengan conio.h. Benarkah? Ya, untuk menggunakan beberapa fungsi dasar layaknya fungsi yang disediakan conio.h, gunakan ncurses.h. Tapi tunggu dulu, header ini juga bukan standar C, lho. Dan, untuk menggunakannya kita harus memiliki libncurses dan ncurses.h yang diinstall manual. Untungnya, sebagian besar distro sudah built-in dengan library ini, jadi anda tinggal install header nya.

Di Ubuntu, install header ncurses dengan
sudo apt-get install ncurses-dev

Ada sedikit poin yang harus diperhatikan untuk menggunakan fungsi libncurses. Salah satunya adalah selalu melakukan inisialisasi sebelum memakai fungsi-fungsi ncurses, dan melakukan deinisialisasi sesudahnya. Misal..
int main(void) {

  initscr();
  timeout(-1); 
  int c = getch();
  endwin(); 
  printf ("%d %c\n", c, c);
  return 0; 

}

FYI, kunjungi dokumentasi ncurses untuk melihat tata cara penggunaanya beserta melihat daftar fungsi yang didukung. http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

FYI, berikut referensi list standard library untuk C dan C++.
http://en.cppreference.com/w/c/header
http://en.cppreference.com/w/cpp/header
Read more

Cara Membuat / Share Link Berita Facebook Palsu


Akhir-akhir ini sering ketemu link berita nyeleneh, kadang juga bikin penasaran bagi siapa pun yang melihatnya. Eh, tapi ketika di klik, link nya entah mengarah kemana. :D

Kemarin juga lihat, teman facebook melakukan hal demikian. Awalnya saya abaikan, karena saya merasa link seperti itu sudah biasa, pasti hoax lah. Kemudian salah satu user facebook berkomentar, ia bertanya bagaimana membuat link semacam itu. Dan ternyata, jawabannya sedikit membuka mata batin saya untuk mencoba memulai bereksperimen. :D
Ternyata modalnya simple, jawabannya "inspect element" !

Yuk, langsung saja kita bahas bagaimana step-stepnya, ya. Biar bisa langsung coba isengin teman. Haha. Iya, kan? Mau buat apa lagi, coba..

Pertama, siapkan sebuah link. Paste ke kotak status facebook kamu.


Tunggu sebentar, sampai preview muncul. Cuma beberapa detik, tergantung koneksi yang sedang kamu pakai.

Eits, sebentar. Jangan di klik "Kirim" dulu ya. Karena disinilah letak trik yang akan kita lakukan. Sekarang, klik kanan di salah satu poin area halaman facebook dan klik "Inspect Element/Inspeksi Elemen".

Carilah nama judul postingan dari link tersebut, melalui kotak inspeksi. Setelah ditemukan, ubah teks tersebut menjadi teks yang kamu mau. Caranya, klik dua kali pada teks yang ingin diubah. Temukan juga judul sama lain dalam kode dan replacement kembali, sampai kamu tidak bisa menemukan judul asli lagi di dalam kode tersebut.

Sebenarnya tidak semua nilai harus diubah. Sepertinya hanya nilai tersembunyi saja yang harus diubah. Kamu bisa lihat gambar berikut, ini adalah gambar elemen tersembunyi di inspect element yang wajib kamu modifikasi. Tapi biar menyederhanakan proseduralnya, lebih baik untuk eksperimen pertama ini, kamu replace semuanya saja.

Selain judul, cari juga deskripsi asli melalui inspect element, dan ganti juga dengan deskripsi baru yang kamu mau. Sumber berita juga bisa diubah, atau bahkan juga bisa mengganti gambar sumber yang asli. Namun, untuk pergantian link, percobaan saya terus saja gagal. Mungkin, teman-teman yang berhasil mengganti link nanti bisa menambahkan comment disini.

Yups, sekarang sudah saatnya melihat link palsu beraksi.
Klik kirim, dan biarkan teman-temanmu tertipu. hahaha :D

Btw, jangan disalahgunakan, ya. Cuma boleh untuk keperluan hiburan saja. Saya sendiri melakukan cara ini karena mempunyai niatan untuk menyinggung teman yang selalu rame menghina Pak Ahok. Padahal kalau dilihat track record-nya, Pak Ahok terlihat memiliki karakter kepemimpinan yang baik. Begitu, sih, kalau menurut saya. Dan, dari awal Pak Ahok memang tergenal tegas, cekatan dan tanggap. Seburuk-buruknya beliau, pasti memiliki kelebihan. Tapi, memang dasarnya manusia, suka cari-cari dan membesarkan kesalahan orang lain.

Saya sebenarnya sebagai orang islam marah saat agaman saya dihina. Tapi, saya juga introspeksi dulu sebelum memutuskan untuk ngoceh-ngoceh. Pernahkah saya menghina agama lain? Pernah! Jadi saya tidak akan menyinggung apapun soal kesetaraan hukum. Saya seperti orang tak tau diri jika melakukan itu.

Eh, kok jadi ngomongin politik yah..
Sampai dimana tadi?
Oh, sudah selesai :)) Yups, seperti itulah cara share link palsu facebook. Sekali lagi saya himbau, jangan gunakan untuk mencari keuntungan pribadi dan/atau meugikan orang lain melalui jalan orang lain yang meng-klik iklan ini. Jika dibuat aneh-aneh, resiko ditanggung penumpang.
Read more