Senin, 21 September 2015

Beginilah Cara Mudah Membuat Program C Anda Bisa Bicara


Speech synthesis atau TTS (Text To Speech) merupakan teknologi terkini yang mampu meningkatkan interaksi antara manusia dengan komputer. Dengan teknologi seperti ini, komputer dapat menyampaikan pesan dalam bentuk suara.

Teknologi TTS biasanya ada dalam wujud perangkat lunak executable ataupun library. Software dalam bentuk library biasanya ditujukan untuk developer, sedangkan software dalam wujud executable ditujukan untuk keperluan lain. Ada banyak sekali software TTS yang bisa ditemukan di internet, namun hanya beberapa saja yang mendukung sintesa ucapan bahasa Indonesia.

Software yang akan kita pakai dalam tutorial ini adalah eSpeak. Software ini tersedia dalam bentuk executable dan library, namun keduanya dapat diimplementasikan pada program yang akan kita buat dengan mudah. Tulisan ini hanya menjelaskan cara pemakaian software executable eSpeak daripada library nya, karena lebih sederhana dan mudah diimplementasikan.

Sebelumnya download dan install eSpeak di komputer anda.
http://espeak.sourceforge.net/download.html

Lalu build dan jalankan program dari source code di bawah ini.

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

char *espeak_path = "C:/Program Files/eSpeak/command_line/espeak.exe";

int speak(char *string){
 int r;
 char command[1000];
 
 sprintf(command, "\"\"%s\" -v id \"%s\"\"", espeak_path, string);
 r = system(command);
 return r;
}

int main(){
 int r;
 
 r = speak("Halo, nama saya Irvan");
 if (r)
  printf("Gagal");
 else
  printf("OK");
 return r;
}

espeak_path adalah string yang menyimpan alamat executable eSpeak. Pada umumnya lokasinya akan terdapat pada C:/Program Files/eSpeak/command_line
fungsi speak() kita buat untuk memudahkan proses sintesa teks ke ucapan. Cara kerjanya sederhana, fungsi ini akan menjalankan program espeak beserta argumennya yang berisi teks yang ingin diucapkan. Jika melakukannya melalui CMD (Command Prompt), kita bisa melakukannya dengan command> "C:\Program Files\eSpeak\command_line\espeak.exe" -v id "Halo, nama saya irvan". Hal ini sama saja dengan memanggil fungsi system() dari program kita. Hanya saja, cara penulisannya agak berbeda, kita butuh 2 tanda petik lagi, seperti ini ""C:\Program Files\eSpeak\command_line\espeak.exe" -v id "Halo, nama saya irvan"".

Command dieksekusi dengan tambahan argumen -v id yang memberitahukan eSpeak bahwa argumen teks masukan berbahasa Indonesia. Selain itu, kita juga bisa mengatur gaya pengucapan dengan parameter berikut.
-p <integer> : Mengatur pitch, atau tinggi rendahnya nada suara. Nilai integer dapat diatur antara 0 - 99.
-s <integer> : Mengatur kecepatan pengucapan. Nilai parameter dapat berupa 80 - 450
-g <integer> : Mengatur jeda antar kata. Argumen berupa nilai dalam ukuran integer * 10 miliditik.


Untuk menggabungkan command dan argumennya agar bisa dieksekusi dengan fungsi system(), kita menggunakan sprintf().
sprintf(command, "\"\"%s\" -v id \"%s\"\"", espeak_path, string);

Jika fungsi system() berhasil, dapat dipastikan return value akan bernilai 0. Namun jika gagal, biasanya fungsi ini akan mengembalikan nilai -1.

Selamat mencoba :)
Read more

Jumat, 18 September 2015

Komputer Lemot, Ternyata SVCHOST.EXE Makan Banyak Memori


Saat browsing, rasanya tak seperti biasa. Performa laptop saya terasa menurun. Bukan koneksi wifi-nya, tapi sepertinya penyebab lemot berasal dari salah satu proses, karena lemotnya juga terasa sampai di program lain. Setelah saya teliti, task manager menunjukkan bahwa firefox.exe mengonsumsi memori lebih dari 200 MB. "Hmm, mungkin ada bug," gumam saya (Saya baru saja mengupdate firefox). Akirnya saya kill proses firefox.exe dari task manager. Tapi sepertinya penyebabnya bukan dari sini. Saya periksa satu per satu, tapi tak ada proses yang punya gelagat aneh.

Apanya ya, yang salah? Di bagian bawah pada task manager terdapat button "Show processes from all users". Saya coba klik, dan akhirnya saya menemukan...

Wow, proses monster!
Bukan cuma monster biasa, setelah di kill program ini akan bangkit lagi dan memakan sisa memori yang ada. Awalnya saya hiraukan, tapi hal ini semakin menggangu pekerjaan saya. Yang aneh, svchost.exe hanya lapar memori setiap koneksi internet aktif. Saya coba flashback ingatan aktivitas yang saya lakukan beberapa waktu yang lalu. Saya kira penyebabnya adalah Firefox yang baru saja saya update. Namun, masalah itu tetap ada meski saya sudah meng-uninstall Firefox. Saya juga ingat, saya kemarin baru saja mengaktifkan windows update. Sudah lama sekali saya tidak mengaktifkannya, karena windows updater selalu mencuri banyak kuota internet. Saya tertarik untuk mengaktifkannya kembali karena saya baca dari beberapa artikel, Microsoft menyediakan layanan update Windows 10 secara gratis dan otomatis. Namun siapa sangka, entah apa masalahnya, mengaktifkan Windows update bisa mendatangkan maut bagi memori saya :v
Jadi sekarang saya coba untuk menonaktifkannya kembali.


Dan, Alhamdulillah, FIX. Ternyata inilah penyebabnya.. :D

Update:
Memang benar, penyebabnya Windows update. Tapi sepertinya, ini tidak bisa dihentikan secara permanen. Hari ini terjadi lagi, jadi saya masuk task manager -> Tab Services -> Klik kanan wuauserv -> Stop.
Mungkin anda punya tips tambahan? silahkan share lewat komentar di bawah :)
Read more

Kamis, 17 September 2015

Cara Compress File Menjadi Gzip dengan ZLIB dan C

Diperlukan waktu yang sangat lama untuk mempelajari algoritma yang efektif untuk kompresi file. Maka dari itu, akan lebih baik jika kita menggunakan algoritma yang sudah ada jika kita menginginkan program kita memiliki fungsional seperti itu. Ada beberapa library yang bisa kita gunakan secara gratis untuk melakukan kompresi data. Dengan library tersebut, kita cukup memanggil fungsi yang telah disediakan sesuai dengan kebutuhan, tanpa perlu mengimplementasikan algoritma kompresi apapun.

Salah satu library yang bisa digunakan untuk menangani masalah kompresi adalah zlib. Zlib menyediakan fungsi untuk mengompres dan mengekstrak data dengan algoritma deflate, huffman dan RLE. Untuk menangani archive dalam wujud file, zlib hanya menyediakan beberapa fungsi manipulasi archive GZip (.gz). Jadi untuk tulisan kali ini kita cukup mempelajari cara dasar untuk mengompres file menjadi archive GZip.


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

int main(int argc, char **argv)
{
 gzFile   outfile;
 FILE  *infile;
 void  *inbuffer;
 size_t   hasread;
 
 printf("Mengompres contoh.txt menjadi contoh.txt.gz ...\n");
 infile = fopen("contoh.txt","rb");
 if (!infile){
  printf("Gagal membuka file input\n");
  return -1;
 }
 outfile = gzopen("contoh.txt.gz","wb9");
 if (!outfile){
  printf("Gagal membuat file output\n");
  return -1;
 }
 inbuffer = malloc(8192);
 if (!inbuffer){
  printf("Gagal membuat buffer untuk file input\n");
  return -1;
 }
 if (gzbuffer(outfile, 8192) != 0){
  printf("Gagal membuat buffer untuk file input\n");
  return -1;
 }
 do{
  hasread = fread (inbuffer, 1, 8192, infile);
  if (hasread)
   gzwrite(outfile, inbuffer, hasread);
 }while(!feof(infile));
 
 gzclose(outfile);
 printf("Berhasil\n");
}
Compile dan link kode diatas dengan header dan library dari situs resmi zlib.
http://www.zlib.net/

Maka hasilnya akan nampak seperti berikut..


Hmm, mungkin kode di atas masih terlalu sulit untuk dipahami?
Baik, kita mulai dari tutorial dasarnya saja.


#include <string.h>
#include <stdio.h>
#include <zlib.h>

char *indata  =
 "Pendidikan memiliki peranan penting dalam meningkatkan "
 "sumberdaya manusia. Pendidikan adalah hak bagi setiap m"
 "anusia dan oleh karena itu setiap manusia berhak meneri"
 "ma pendidikan yang layak. Namun sangat disayangkan bahw"
 "a kualitas pendidikan di beberapa negara masih terbilan"
 "g rendah. Setiap siswa memiliki keterampilan belajar ya"
 "ng berbeda-beda dan pada umumnya cenderung kurang termo"
 "tivasi untuk menggunakan media buku dalam kegiatan bela"
 "jar. Sehingga, perlu adanya inovasi untuk mengembangkan"
 " media belajar yang menarik bagi siswa.";

int main(int argc, char **argv)
{
 gzFile  outfile;
 
 printf("Mengompres data ke file data.txt.gz ...\n");
 outfile = gzopen("data.txt.gz","wb9");
 gzbuffer(outfile, 8192);
 gzwrite(outfile, indata, strlen(indata) + 1);
 gzclose(outfile);
 printf("OK");
}

Untuk membuat ataupun membuka file baru, kita butuh objek bernama gzFile, lalu objek tersebut kita gunakan untuk membuka file baru dengan fungsi gzopen. Sekilas bentuknya mirip dengan fungsi fopen(), ya. Hanya saja cara penggunaan modenya agak beda. gunakan "rb" untuk membaca arsip, atau "wb" untuk menulis arsip, angka 0-9 juga dapat disertakan untuk menentukan compression level.

gzFile gzopen (const char *path, const char *mode);

Fungsi di atas dinyatakan berhasil apabila tidak mengembalikan nilai 0. gzFile yang telah digunakan dengan gzopen() kemudian harus diatur ukuran buffer internalnya. Buffer ini digunakan untuk membantu proses kompresi ataupun ekstraksi. Menurut dokumentasi, ukuran yang disarankan adalah 8192 bytes.

int gzbuffer (gzFile file, unsigned size);

Ukuran buffer internal pada fungsi di atas ditentukan oleh parameter size. Jika fungsi berhasil, maka akan mengembalikan nilai 0. Setelah itu, kita bisa melakukan proses kompresi data dengan gzwrite()


int gzwrite (gzFile file, voidpc buf, unsigned len);

parameter file adalah objek gzFile yang telah dibuka dengan gzopen() dan telah diatur besar buffer internalnya. Parameter buf adalah lokasi data yang akan dikompres, jumlah data yang akan dikompres ditentukan oleh parameter len. Return value berupa jumlah data yang berhasil dikompres, jika error maka nilai yang dikembalikan == 0.

Setelah semuanya selesai, jangan lupa akhiri dengan fungsi  gzclose().


int gzclose (gzFile file);


Compile dan link, daaannn... :)


Untuk kode yang sebelumnya, coba pelajari sendiri, ya. Buat latihan :)
Selamat mencoba, dan tunggu tutorial berikutnya untuk cara dekompres nya, ya... :)
Read more

Senin, 14 September 2015

Cara Mendaftarkan HotKey dengan Windows API


Hotkey adalah salah satu fitur yang banyak diterapkan pada sistem operasi berbasis GUI. Meskipun sebagian besar akses program GUI dilakukan dengan mouse, akses menggunakan keyboard juga masih tetap dipakai. Jika anda masih belum tahu apa itu Hotkey, cobalah jangan menyimpan dokumen melalui menu File -> Save, tapi cukup tekan CTRL + S secara bersamaan; atau, jika ingin membuka file, cukup tekan CTRL + O. Yups, itulah hotkey.

Fitur hotkey sebenarnya efektif untuk program GUI, namun kita masih bisa mencobanya pada program console. Hotkey yang kita bahas disini adalah global hotkey. Artinya, hotkey ini dapat diterima oleh program tanpa harus membuat window dalam keadaan focus, misalnya saat program di-minimize, program tetap dapat menerima hotkey yang telah ditentukan. Contoh program yang menggunakan global hotkey adalah software screen shot dan antivirus; program ini berjalan otomatis saat startup dan bekerja dalam background, lalu program ini akan tampil saat user menekan tombol yang telah ditentukan, misalnya Shift + PrtSc.

Di Windows, pendaftaran Hotkey dilakukan dengan API RegisterHotKey


BOOL WINAPI RegisterHotKey(
  _In_opt_ HWND hWnd,
  _In_     int  id,
  _In_     UINT fsModifiers,
  _In_     UINT vk
);

hWnd adalah handle window yang ingin mendaftarkan hotkey. Parameter ini bersifat opsional, karena kita membuat program konsol, hiraukan saja parameter ini.
id adalah identifier hotkey. Misalnya kita mendaftarkan 2 hotkey, maka kita bisa membuat id hotkey pertama = 1 dan id hotkey kedua = 2.
fsModifiers adalah keyboard utama hotkey. Argumen yang bisa dimasukkan dapat berupa konstanta sebagai berikut:
  • MOD_WIN
  • MOD_CONTROL
  • MOD_SHIFT
  • MOD_ALT
vk adalah kode tombol keyboard yang harus ditekan bersamaan dengan tombol yang telah ditentukan pada fsModifiers. Info lengkap, kunjungi link berikut, https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

Jika berhasil, fungsi ini mengembalikan nilai TRUE. Sebaliknya, jika gagal nilai FALSE yang dikembalikan.

Contoh


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

int main(void){
	BOOL retval;
	MSG msg = {0};
	
	retval = RegisterHotKey (0, 1, MOD_SHIFT | MOD_CONTROL, 0x4B);
	if (retval == FALSE){
		printf("Gagal mendaftarkan HotKey\n");
		exit(-1);
	}
	else
		printf("Pendaftaran HotKey berhasil\n");
	
	while (GetMessage(&msg, NULL, 0, 0) != 0){
		if (msg.message == WM_HOTKEY){
			printf("HotKey CTRL + SHIFT + K diterima \n");            
		}
	} 
    return 0;	
} 

Hasil
Berikut ini adalah hasil program dari kode di atas.


Resources
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx
Read more

Jumat, 11 September 2015

Meningkatkan Trafik Blog : Membuat Fans Page atau Meningkatkan SEO?


Sebenarnya trafik blog tidak begitu penting untuk blog pribadi. Yang terpenting, isi dari postingan dapat dipahami oleh setiap pengunjung yang membaca, dan akan lebih bagus apabila isi dari blog dapat menarik perhatian setiap pengunjung untuk terus membaca. Khusus untuk blog umum, trafik blog kadang lebih diutamakan daripada isi dari blog itu sendiri, terlebih lagi jika tujuan pembuatan blog itu untuk bisnis sampingan.

Ada banyak cara yang dapat dilakukan untuk meningkatkan trafik blog. 2 diantaranya adalah membuat fans page blog dan meningkatkan SEO. Setiap cara tentunya memiliki kelebihan dan kekurangan, namun salah satu dari cara-cara tersebut mungkin cenderung efektif, tergantung tujuan anda.

Berikut ini adalah 2 strategi yang akan kita bahas, sekaligus kelebihan serta kekurangannya.
1. Meningkatkan SEO
Kita mulai dari yang paling umum, meningkatkan SEO. Dengan meningkatkan SEO, blog kita akan lebih mudah dikenali oleh search engine. SEO dapat ditingkatkan dengan berbagai cara, misalnya; berkomentar di blog orang lain, menentukan kata kunci yang sesuai, submit link, dsb. Keunggulan serta kekurangan yang bisa didapatkan dengan menerapkan cara ini adalah sebagai berikut:
- Jangkauan pengunjung jauh lebih luas, dapat menjangkau pengunjung dari mancanegara
- Trafik cenderung tidak tetap, karena tingkat persaingan dengan blog lain sangat tinggi
- Lebih mudah dilakukan, namun tetap dengan kesabaran
- Pergantian domain dapat merusak trafik. Trafik blog akan turun drastis saat anda mengganti domain. Bahkan anda harus merancang strategi dari awal lagi.


2. Membuat Fanspage
Cara ini bukanlah tergolong baru, namun masih belum banyak yang menggunakan cara ini. Banyaknya pengguna Facebook menjadikan cara ini efektif untuk menggaet calon pembaca baru. Adapun kelebihan dan kekurangan dari metode ini adalah:
- Mencari likers butuh waktu yang lama, namun Anda masih bisa menggunakan banyak strategi promosi atau menggunakan jasa untuk meningkatkan like fanspage Anda
- Merubah domain tidak terlalu mempengaruhi trafik, karena mayoritas pengunjung Anda datang dari link yang anda share.
- Facebook menyediakan layanan promosi yang membuat Anda dapat memilih calon pembaca secara spesifik.
- Trafik lebih stabil bahkan dapat terus meningkat seiring dengan banyaknya likers fanspage Anda.


Strategi mana yang akan Anda pilih? Keduanya penting, jadi Anda harus menjalankan kedua strategi tersebut secara seimbang. Cara pertama mungkin akan efektif Anda lakukan di waktu awal, lalu cara kedua akan sangat penting dilakukan jika Anda ingin menambah trafik secara perlahan sekaligus mempertahankannya :)
Read more