Rabu, 24 September 2014

Mengubah Gambar Bitmap Menjadi Vector dengan Inkscape


Gambar bitmap mendeskripsikan setiap unit gambarnya sebagai informasi piksel, sehingga ukurannya lebih besar. Sementara itu, gambar vektor mendeskripsikan gambar sebagai kumpulan objek yang memiliki bentuk tertentu. Walaupun ukuran gambar vektor lebih kecil, gambar vektor umumnya bukan berupa foto. Biasanya gambar vektor hanya bisa dihasilkan dengan menggambar dengan software khusus desain vektor.
Gambar vektor dapat dikonversi ke dalam format bitmap dengan fitur export, sedangkan gambar bitmap dapat di ambil bentuk vektornya melalui proses tracing. Tracing merupakan suatu proses untuk mendeteksi setiap satuan piksel dalam gambar untuk mendapatkan informasi gambar vektor.
Inkscape merupakan salah satu dari software desain grafis berbasis vektor yang mendukung proses tracing.

Untuk melakukan tracing pada inkscape, pertama pilih gambar bitmap, lalu import melalui menu File > Import
Saya ambil contoh gambar berikut..

Buka menu Path, pilih Trace Bitmap...
Setelah muncul jendela trace bitmap, pilih jenis tracing sesuai dengan apa yang anda inginkan. Jika belum tahu apapun tentang opsi tersebut, coba lihat preview masing-masing jenis tracing yang disediakan.
Setelah proses selesai, gambar vektor yang dihasilkan bisa dimanipulasi bentuknya dengan node tool atau diubah warnanya sesuai keinginan..

Berikut ini merupakan beberapa hasil yang saya dapatkan dari perlakuan tracing yang berbeda-beda.

Selamat mencoba :)
Read more

Tips Agar Tidak Terlalu Lama Terpaku di Warnet


Internet adalah tempat dimana orang bisa menemukan banyak hal, dari yang positif samapai yang berbau porno. Karena mungkin saking banyaknya, kita akan sulit berhenti jika terlanjur disuguhi internet. Kalau gratis sih tak jadi masalah, ini sih di warnet. Bahkan, dengan niat awal mengerjakan tugas, kadang kita masih tetap bisa tersesat, entah kemana. :v
Bagaimana mengatasinya? Sebenarnya mudah kok, asalkan punya niat. Nah, justru niat inilah yang sering disepelekan oleh orang-rang yang mengalami masalah ini dan ingin berhenti. Setelah niat, baca tips-tips berikut ini..

1.    Bawa uang pas
Dengan membawa uang pas, saya jamin anda akan berhenti browsing pada waktunya. Kalau uang habis, mau internetan pakai apalagi? Tips ini cocok buat yang suka ambil tarif personal, Banyak yang menggebu-gebu berinternet dan sulit berhenti karena masih punya uang. Padahal mereka tahu, pada akhirnya akan menyesal juga.

2.    Pilih tarif paket
Selain karena tarif paket lebih ekonomis, billing juga akan terhenti sendiri walaupun kita sedang asyik browsing. Hmm, tapi kalau masih punya uang biasanya beli paket lagii. Hehehe. Jadi point ini juga harus didukung point nomor 1.

3.    Buat list
Sebenarnya kebutuhan yang harus kita cari tidak terlalu banyak. Tapi karena terlalu lama mengingat, banyak waktu yang terbuang untuk googling tak jelas. Jadi, tak ada salahnya membuat list berisikan daftar item yang akan kita cari.

4.    Datang ke warnet saat mendekati deadline
Cara ini selain ampuh, juga sangat greget gan. Biasanya ide-ide datang tak terduga saat kita kepepet. Tapi tak jarang juga tugas kita berantakan karena waktu terlalu singkat. Nah, coba agan pelajari waktu yang tepat agar kunjungan agan di warnet menjelang deadline dapat mendatangkan ide briliant :v

5.    Datang ke warnet di malam minggu

Not work for jones gan :v Kalau agan bukan jones, tentunya agan tau kenapa cara ini bisa berhasil :v

6.    Datang ke warnet saat mau tutup
Nah, ini cara yang paling ampuh gan. Jangan tanya kenapa.. Hehehe. :v

7.    Apalagi ya? :v

Ah, sudah aja deh ya gan… :v
Semoga bermanfaat :v
Read more

Senin, 15 September 2014

Macam - Macam Software Untuk Memperkecil Ukuran EXE (EXE Compressor)


Program executable yang berukuran besar terkadang terasa menggangu. Solusinya, kita bisa mengompres bagian dalam program ini agar berukuran lebih kecil. Bukan hanya programnya saja, beberapa software berikut juga bisa mengompres file DLL. Ternyata, di luar sana belum banyak yang mengetahui hal ini. Tapi, bagi programmer virus, nama software-software semacam ini sepertinya sudah tidak asing didengar. Heheheh :D
Khusus bagi yang sudah tahu, mungkin Anda bisa menambah beberapa dari software ini untuk membandingkan hasilnya.
Oke, langsung saja kita cek semua software berikut di TKP..
  1. UPX
  2. AsPack
  3. MPRESS
  4. NeoLite
  5. CExe
  6. FSG
  7. PECompact
  8. PETite
  9. PESpin
  10. XComp
  11. .netshrink
  12. eXPressor 
Selamat mencoba gan :)
Read more

Inkscape : Software Paling Tepat Untuk Membuat Animasi Game


Membuat game awalnya sangat membingungkan, karena banyak sekali hal yang harus dipersiapkan. Salah satu hal yang awalnya membuat kita ragu adalah memilih software untuk membuat animasi sprite. Saya pun juga demikian, tapi saya beruntung karena saya telah menemukan software yang tepat untuk membuat animasi game saya.


Menurut saya, memilih software untuk membuat animasi sprite game perlu memperhatikan hal-hal berikut..

1. Format gambar
Menurut saya, software pembuat animasi untuk game yang bagus adalah software yang mendukung format Portable Network Graphic(PNG) secara menyeluruh, karena format gambar PNG yang didukung secara menyeluruh membuat gambar yang kita gunakan terlihat halus.
2. Lengkap
Kata lengkap sebenarnya relatif, tapi kriteria apakah software tersebut free, dapat menjadi nilai tambah.
3. Desain vektor atau bitmap?
Ya, kalau boleh memilih, keduanya bisa, tapi yang paling utama adalah software desain grafik vektor.

Dari ketiga kriteria di atas, saya menemukan beberapa software dan mencobanya satu per satu:
Co**l draw : Fiturnya lengkap, namun sayang, ini bukan free software. Format PNG di dukung, tapi tidak sepenuhnya, bisa dilihat, bagian gambar kurang halus dan bagian pinggirnya terlihat banyak noda, sehingga nampak kurang realistik.
G**e Maker's sprite editor: Sempurna, format PNG didukung sepenuhnya, namun sayang desainnya mirip dengan M****soft Paint, sehingga saya agak merasa kesulitan. Selain itu, saya hanya berorientasi pada GameEditor, jadi saya agak kerepotan membuka tutup program ini.
InkScape: Em, sempurna. Saya kira tidak perlu saya jelaskan, software inilah yang tepat untuk membuat sprite sesuai dengan semua kriteria. Ya, walaupun agak sulit, tapi saya puas dengan hasilnya, karena saya lebih mempriorotaskan kualitas gambar yang bersih.


Langkah Membuat Animasi Sprite di Inkscape
Pertama, atur dimensi kotak,yaitu panjang(W) dan lebar(H) kotak, usahakan dalam bentuk bilangan bulat(tanpa koma). Selanjutnya pastikan kotak tersebut dalam posisi X=0 dan Y=0. Jika sudah, gambarlah frame pertama dalam kotak tersebut.

O, iya. Atur juga kotak tersebut, agar backgroundnya transparan(none).




Jika frame pertama telah dibuat, frame kedua akan jauh lebih mudah lagi. Cukup duplicate(copy/paste) kotak sekaligus gambar di dalamnya ke posisi berikutnya. Contohnya seperti gambar berikut…


Terserah bagaimana mengatur agar gerakan gambar terlihat nyata. Yang terpenting adalah posisi penempatan kotak.
Jika sudah, seleksi semua kotak. Ingat, hanya kotaknya saja!
Contohnya seperti gambar berikut ini...

Dan selanjutnya atur outline/stroke agar transparan/none..

Nah, kita sudah mendekati tahap akhir. Tahap akhir itu adalah ekspor. Yaitu melalui File -> Export. Jika merasa gambar terlihat terlalu besar, kita bisa merubah Width dan Height pada kotak dialog export, tanpa harus takut kehilangan kualitas gambar..

Ini dia hasilnya. Setiap pixelnya terlihat halus dan sempurna :v

Bahkan saat dipakai dalam Game Editor pun tetap terlihat jernih.. :)

Bagaimana? mudah kan?
Tidak semua yang berkualitas itu harus mahal. Cukup pakai Inkscape, kita bisa membuat sprite dengan kualitas sempurna, tanpa harus membeli atau membajak softwarenya. Hehhehe
Selamat mencoba :)
Read more

Membuat DLL Sederhana dengan MinGW


Dynamic Link Library merupakan file yang di link bersama program-program lain untuk memberikan kemudahan dalam melakukan suatu pekerjaan. Sebelum ada DLL, dulu program di link bersama dengan static library, sehingga ukuran program menjadi lebih besar. Dengan adanya fitur shared memory, diciptakanlah dynamic link library. Library cukup diload satu kali, lalu semua program bisa menggunakan satu library itu secara bersamaan. Jika ingin menggunakan fungsi dari library, program tidak perlu mengambil kode dari library tersebut saat proses linking, program hanya mengaitkan nama fungsi saja kedalam program. Ketika program dijalankan, sistem operasi akan meload library dan mencari alamat pointer fungsi yang diinginkan.

Let's start
Walaupun DLL hanya bertugas menyediakan fungsi bagi program yang membutuhkan, tapi DLL juga memiliki entry-point atau fungsi main(). Bedanya, fungsi utama ini dipanggil hanya untuk keperluan inisialisasi dan de-inisialisasi.
Berikut ini adalah bentuk fungsi entry-point nya...

BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
            //Kode
            break;

        case DLL_PROCESS_DETACH:
            //Kode
            break;

        case DLL_THREAD_ATTACH:
            //Kode
            break;

        case DLL_THREAD_DETACH:
            //Kode
            break;
    }
    return TRUE;
}


hDll
Argumen pertama adalah nomor handle DLL. Digunakan untuk memanipulasi DLL jika diperlukan saat inisialisasi atau saat de-inisialisasi.

dwReason
dwReason adalah kode yang memberitahukan informasi ketika DllMain dipanggil. Informasi ini dapat berupa salah satu dari empat berkut ini..
  • DLL_PROCESS_ATTACH : DllMain dipanggil setelah program meload DLL. Saat inilah kita melakukan inisialisasi.
  • DLL_PROCESS_DETACH : DllMain dipanggil saat program berhenti menggunakan DLL. Saat hal ini terjadi, de-inisialisasi bisa dilakukan bila diperlukan.
  • DLL_THREAD_ATTACH : DllMain dipanggil saat proses membuat thread baru.
  • DLL_THREAD_DETACH : DllMain dipanggil saat proses telah menghentikan thread.
lpReserved
Nilai argumen ini dapat dikategorikan menjadi 2:
  • Jika dwReason = DLL_PROCESS_ATTACH, lpReserved bernilai 0 jika library diload secara dynamic. Jika bukan 0, library diload secara static.
  • Jika dwReason = DLL_PROCESS_DETACH, lpReserved bernilai 0 jika library dihentikan secara dynamic dengan fungsi FreeLibrary(). Jika bukan 0, library dihentikan secara static, yaitu bersamaan dengan berhentinya program.

Return value
Sebaiknya DllMain mengembalikan nilai 1(TRUE), jika tidak program akan dianggap mengalami error saat meload library. Tapi, jika kita ingin melakukan inisialisasi atau de-inisialisasi tertentu dan hasilnya tidak mendukung, mungkin mengembalikan nilai FALSE akan lebih baik.

Let’s coding
Kode yang kita tulis pertama adalah kode untuk membuat DLL itu sendiri. Dalam DllMain, kita mendeteksi argumen dwReason untuk membuktikan apakah DLL_PROCESS_ATTACH dan DLL_PROCESS_DETACH benar-benar dieksekusi pada waktu yang benar. Untuk melakukannya, kita menggunakan fungsi MessageBox(). Sementara itu, kita juga membuat FungsiA() dan FungsiB() yang bisa dipanggil oleh program.


Nama file : contoh_dll.c

#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(0,"DLL_PROCESS_ATTACH", "dwReason", MB_OK);
            break;

        case DLL_PROCESS_DETACH:
            MessageBox(0,"DLL_PROCESS_ATTACH", "dwReason", MB_OK);
            break;
    }
    return TRUE;
}

void FungsiA()
{
    MessageBox(0,"Pesan dari FungsiA()", "Hey", MB_OK);
}

void FungsiB()
{
    MessageBox(0,"Pesan dari FungsiB()", "Hey", MB_OK);
}


Agar FungsiA() dan FungsiB() bisa di pakai oleh program dan bisa diakses dengan mudah, kita dianjurkan untuk membuat file header yang isinya berupa deklarasi bentuk FungsiA() dan FungsiB().




Nama file: contoh_dll.h

//deklarasi FungsiA() dan FungsiB()

void FungsiA();
void FungsiB();


Untuk mengompile file ini mejadi dll, gunakan perintah berikut..
gcc -Wall -shared contoh_dll.c -o contoh_dll.dll

Setelah membuat DLL, sekarang kita bisa mengujinya dengan kode program berikut. Kode ini akan mencoba memanggil FungsiA() sekaligus FungsiB().


Nama file: pakai_dll.c

#include <stdio.h>
#include <conio.h>
#include "contoh_dll.h"

int main()
{
    printf("Program mulai\n");
    FungsiA();
    FungsiB();
   
    printf("Press any key to exit\n");
    getch();
    return 0;
}


Untuk mengompilenya, gunakan perintah berikut..
gcc -Wall pakai_dll.c contoh_dll.dll -o pakai_dll.exe

Download source
Jika kode di atas belum jelas, anda bisa mendownloadnya dalam link berikut ini.


https://app.box.com/s/qcnndlhofzw13lo3crb6
 
Demo


Read more

Mendapatkan Informasi dan Persentase Baterai Laptop dengan C


Di Windows, kita dapat menemukan banyak sekali fungsi API yang sangat membantu pekerjaan kita. Salah satunya adalah dalam hal mendapatkan informasi baterai, seperti persentase dan life time. Hal ini sedikit berbeda dan menjadi nilai plus jika dibandingkan dengan L*nux. Untuk mendapatkan informasi baterai, kita cukup menggunakan satu fungsi API, yaitu GetSystemPowerStatus(). Fungsi ini langsung bisa kita pakai setelah meng-include header windows.h.

Cara kerja
Cara kerjanya sederhana, kita cukup memanggil fungsi berikut disertai argumen berupa pointer ke SYSTEM_POWER_STATUS. Berikut ini adalah bentuk fungsinya..

BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS lpSystemPowerStatus);

Jika berhasil, fungsi akan mengembalikan nilai 1(TRUE). Jika gagal, fungsi mengembalikan 0(FALSE).
Berikutnya, yang harus kita ketahui adalah struktur data yang digunakan sebagai parameter itu sendiri. Setelah pemanggilan fungsi, struktur ini akan diisi data status baterai berdasarkan keadaannya saat itu.

typedef struct _SYSTEM_POWER_STATUS {
    BYTE   ACLineStatus;          
    BYTE   BatteryFlag;          
    BYTE   BatteryLifePercent;   
    BYTE   Reserved1;            
    DWORD  BatteryLifeTime;     
    DWORD  BatteryFullLifeTime; 
} SYSTEM_POWER_STATUS;

typedef struct SYSTEM_POWER_STATUS *LPSYSTEM_POWER_STATUS;


ACLineStatus
Menunjukkan apakah charger dalam keadaan terpasang atau tidak. Bagian ini dapat memiliki nilai dan arti sebagai berikut:
  • 0 : Offline(tidak terpasang)
  • 1 : Online(terpasang)
  • 255 : Tidak diketahui

BatteryFlag
Menunjukkan status pengisian baterai.
  • Jika bernilai -1, artinya tidak diketahui (unknown)
  • Jika bernilai 0, artinya baterai dalam keadaan antara high dan low dan sedang tidak di charging.
Jika tidak, operasi berikut akan menunjukkan status baterai:
  • if(BatteryFlag & 1) printf("high ");
  • if(BatteryFlag & 2) printf("low ");
  • if(BatteryFlag & 4) printf("critical ");
  • if(BatteryFlag & 8) printf("charging ");
  • if(BatteryFlag & 128)printf("no system battery");

BatteryLifePercent
Persentase energi baterai yang sedang tersisa. Nilainya bisa berada antara 0 – 100, jika nilainya 255 atau mungkin bukan 0 – 100, maka kita anggap tidak diketahui(unknown)

BatteryLifeTime
Waktu sisa penggunaan baterai dalam detik, jika tidak diketahui(unknown) nilainya adalah 0xFFFFFFFF.

BatteryFullLifeTime
Waktu penggunaan baterai ketika energi penuh, dalam detik. Jika tidak diketahui, nilainya 0xFFFFFFFF.

Oke, langsung saja download sourcenya disini gan!

https://app.box.com/s/756on4pau171flv56fr5

Hasil


Read more

Compress 1 GB Menjadi 1 MB : Mungkinkah?


Highly compressed. Itulah yang sering kali kita temui di internet. Semua heran, bagaimana bisa file sebesar sekian gigabyte itu bisa menjadi hanya sekian megabyte? Yang lebih mengherankan lagi, format filenya hanya ZIP atau 7z. Kalau formatnya KGB sih, wajar. :D
Belum banyak yang tahu jika sebagian besar file seperti itu adalah 'FAKE', 'HOAX, 'PALSU', atau apalah. Lagipula, algoritma kompresi biasa manapun tidak bisa dimanipulasi untuk mencapai rasio kompresi ‘super tinggi’. Jadi kemungkinan besar, file-nya lah yang dimodifikasi oleh oknum nakal yang sekedar mencari rating di internet.
Algoritma dasar dari sebuah software archiver adalah mengelompokkan data yang sama menjadi data yang lebih pendek. Misalnya data seperti berikut ini..




Data yang memiliki banyak deretan sama lebih mudah dikompresi. Contohnya saja di atas, data sebesar 13 byte, bisa dikompres menjadi 6 byte. Begitupun berlaku sebaliknya, data yang memiliki banyak nilai acak sangat sulit dikompresi dengan algoritma manapun. Contohnya saja, file MP3 dan gambar. Bagaimana dengan teks? Pernah coba mengompres file yang berisikan teks? Jika pernah, maka anda melihat bahwa file tersebut memiliki rasio yang tinggi. Ini karena teks memiliki susunan bit yang mudah ditebak, sehingga lebih efektif untuk dikompres. Salah satu algoritma yang efektif untuk mengompres teks adalah ‘huffman’.
Kita ambil contoh sebuah gambar berukuran 344 KB. Lihatlah, betapa banyaknya data yang berderetan secara acak. Dan, sampel kedua berupa bilangan yang penuh dengan deretan 00 berukuran lebih dari 209 MB. Untuk, membuktikan efektifitas kompresi teks, saya juga menyertakan sampel teks acak berukuran 111 KB.





Ingin tahu, apa yang terjadi setelah saya kompres menjadi ZIP?






Wow, amazing…
Jadi, sekarang anda tahu kan apa yang dilakukan oleh oknum itu sekarang? :v
Ini file yang sudah saya kompres, coba extract dan lihat sendiri hasilnya..

https://app.box.com/s/38e3whc1tx2mtfv29l1i

Read more

Membuat Program Database Sederhana Dengan SQLite (C)


SQLite merupakan library yang menyediakan fitur manajemen database untuk software. Sudah dari dulu SQLite banyak dikenal karena memiliki keistimewaan tersendiri. Dengan ukuran yang lumayan kecil, SQLite sudah dapat menyediakan hampir semua kode kueri seperti pada MySQL. Selain itu, dengan menggunakan SQLite, kita mendapatkan beberapa keuntungan, antara lain:
  • Program tidak terlalu terpengaruh dalam hal kecepatan, karena SQLite berukuran sangat kecil dibandingkan software database lain(mis. MySQL)
  • Lebih sederhana dan mudah, karena SQLite tidak membutuhkan username, password dan file konfigurasi apapun.
  • Instalasi mudah, karena inti SQLite hanya terdiri atas sebuah file library saja.
Sudah banyak pengembang software yang mem-binding SQLite dan menggunakannya sebagai manajer database default-nya, salah satu contohnya adalah Mozilla Firefox. Tak ayal lagi, SQLite sangat cocok digunakan untuk manajer database software kita.

Mari kita mulai

SQLite dapat menyimpan database dalam file. Jika diperlukan, kita juga bisa membuat database sementara(temporary) yang disimpan dalam RAM. Untuk membuat atau membuka database, kita menggunakan fungsi sqlite3_open. Argumen pertama(*filename) adalah nama file yang akan dibuka. Jika file belum ada, SQLite akan membuat file tersebut. Jika argumen pertama adalah “:memory:” atau 0, maka sqlite akan membuat database dalam memori. Argumen kedua(**ppDb) adalah pointer-to-pointer yang menunjuk ke struktur data sqlite (struct sqlite3). Struktur data ini berperan sebagai handle.
Berikut ini adalah bentuk fungsinya lebih jelas..

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);


Setelah database ditentukan, kita dapat mulai menjalankan query untuk melakukan apapun seperti yang biasanya manajer database lakukan. Jika biasa melakukan pemrograman PHP, fungsi yang akan kita bahas berikut ini memiliki fungsi yang sama dengan mysql_query, hanya saja disini argumennya lebih eksplisit. Berikut ini adalah bentuk fungsinya..

int sqlite3_exec(
  sqlite3*,              /* An open database */
  const char *sql,       /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**), /* Callback function */
  void *,                /* 1st argument to callback */
  char **errmsg          /* Error msg written here */
);


Seperti yang kita lihat, fungsi ini memiliki 5 parameter. Argumen pertama(sqlite3*) adalah pointer ke struktur daya sqlite. Seperti biasa, fungsinya adalah sebagai handle yang menyimpan statistik database yang telah dibuka. Yang kedua adalah pointer ke string yang berisi kode query. Saya rasa tidak perlu penjelasan pada bagian ini, sebagian besar kode sama seperti MySQL. Jika anda nanti anda mengalami kesalahan query, mungkin anda menggunakan beberapa kode yang berbeda dengan MySQL. Yang ketiga adalah fungsi callback untuk menerima data hasil query. Jika kode query yang diberikan tidak mengembalikan data, argumen ini boleh dibiarkan kosong. Sementara itu, bentuk fungsi callback akan kita bahas sebentar lagi. Lanjut ke parameter ke-empat, argumen ini penggunaannya tidak wajib alias opsional, jadi kita boleh biarkan kosong. Penggunaannya hanya diperlukan jika kita perlu data tambahan pada fungsi callback. Apabila kita menyertakan argumen pada argumen ini, SQLite akan menunjkkannya pada argumen pertama fungsi callback. Parameter terakhir merupakan pointer-to-pointer yang menunjuk pada buffer yang berisikan pesan error, jika eksekusi kode query terjadi kesalahan, pesan errornya bisa kita baca dari sini.
Oke, kita sudah membahas point terpenting dari bahasi query. Sebelum membahas ke fungsi paling akhir(sqlite3_close), kita jangan sampai lupa untuk memahami bentuk fungsi callback-nya. Berikut ini adalah bentuk fungsi callback-nya..

int callback(void* callback_data, int jml_kolom, char **isi_kolom, char **nama_kolom)
{
//kode
}


Sebenarnya kode diatas tidak perlu saya jelaskan juga, karena nama parameternya sengaja saya tulis dalam bahasa Indonesia. Tapi, biar lebih afdol dan semua jenis pembaca bisa paham, biarkan saya memenuhi tutorial ini dengan sedikit penjelasan setiap argumen fungsi callback di atas. Yang paling pertama adalah argumen yang berisi data opsional. Seperti yang telah dijelaskan pada fungsi sqlite3_exec – argumen keempat. Berikutnya, ada argumen kedua yang merupakan jumlah kolom dari hasil query. Ingat, jumlah kolom, bukan jumlah baris. Jadi, fungsi callback ini akan dipanggil untuk menerima data setiap baris satu per satu. Nah, selanjutnya parameter isi_kolom adalah array data yang masing-masing adalah isi dari kolom hasil pembacaan query. Terakhir adalah nama_kolom, tentu saja isinya adalah array dari nama-nama kolom data.

Dan, akhirnya, kita sampai untuk membahas fungsi paling terakhir, sekaligus fungsi paling sederhana.
int sqlite3_close(sqlite3*);

Jika sudah selesai melakukan manajemen database, kita dianjurkan untuk memberitahukan SQLite. Sebenarnya, statistik data secara otomatis akan terhapus ketika program selesai tanpa harus memanggil fungsi ini. Akan tetapi, jika kita menangani banyak data, fungsi ini terkadang diperlukan jua. Fungsi ini cukup menggunakan sebuah argumen yaitu pointer ke struktur data sqlite seperti fungsi sebelumnya.

Error Codes
Jika anda perhatikan baik-baik, maka anda akan tahu bahwa semua fungsi di atas mengembalikan nilai int. Apa gunanya/maksudnya?
Hampir semua fungsi SQLIte mengembalikan nilai integer(int), yang menunjukkan status hasil pemanggilan fungsi. Jika semua argumen benar dan tidak terjadi error, maka nilai kembalinya adalah 0 (atau ditulis dengan SQLITE_OK), selain itu, bisa jadi ada kesalahan.

Source Demo
Untuk memahami fungsi ini dalam, lihatlah source, header sekaligus DLL dalam link berikut.
(header dapat didapatkan pada situs resmi dengan nama “sqlite3_almagation” dan DLL dapat diperoleh pula dengan nama “sqlite_dll”)
Create_db.c : membuat table dalam database
Insert_db.c : mengisi table yang telah dibuat dengan beberapa data
Show_db.c : menampilkan database yang telah dibuatkan table dan diisikan data

https://app.box.com/s/80psou8z4zb0mk9g3cmi

Untuk pendukung, saya juga menyertakan ebook kecil didalamnya, yang sebelumnya sudah saya baca untuk memahami SQLite

Compiling dan Linking
Untuk mengompile program, saya menggunakan GCC dengan perintah seperti berikut:
gcc -Wall –o create_db.exe create_db.c sqlite3.dll
gcc -Wall –o insert_db.exe insert_db.c sqlite3.dll
gcc -Wall –o show_db.exe show_db.c sqlite3.dll

(source dan DLL harus ada dalam 1 folder)

Hasil




Read more

Sabtu, 13 September 2014

Membuat Captcha dengan PHP


Captcha merupakan salah satu hal terpenting dalam memmbangun sebuah jaringan web yang aman, terutama dari tindakan spam. Ada banyak metode yang bisa kita gunakan dalam membuat captcha.  Tapi, disini saya akan menunjukkan metode yang saya ciptakan sendiri, entah di luar sana sudah ada atau tidak, tapi yang jelas metode ini cukup aman dan efektif untuk digunakan dalam website dan lumayan mudah untuk dibuat :)
Cara kerja penampil captcha ini sangat sederhana,
Untuk proses pembuatan captcha langkahnya adalah sebagai berikut:
  • Pertama kita membuat angka acak. Pada tutorial ini, angka acak yang dihasilkan antara 10000 - 99999 (5 digit).
  • Selanjutnya kita membuat kode hash dari angka acak tadi.
  • Kode hash dari captcha disimpaan pada cookie si client.
  • Angka acak dalam bentuk text lalu dibuat ke dalam bentuk gambar  dengan sekumpulan fungsi pemrosesan image pada PHP. Antara lain imagestring(): untuk membuat teks  dan imageline(): untuk membuat garis.



filename : captcha.php
Kode berikut untuk menghasilkan gambar teks captcha acak. sekaligus mengirimkan cookie ke client.


<?php
    srand(time());
    $code = rand(10000,99999);
    $codehash = sha1("NAVI$code");
    setcookie("cap",$codehash,time() + 3600);
   
    //buat gambar
    header("Content-type: image/gif");
    $img = imagecreate(50,20);
    $orange = imagecolorallocate($img,200,180,50);
    $black = imagecolorallocate($img, 0, 0, 0);
    imagestring($img,5,2,2,"$code",$black);
    //vline
    imageline($img,rand(0,49),0,rand(0,49),19,$black);
    imageline($img,rand(0,49),0,rand(0,49),19,$black);
    //hline
    imageline($img,0,rand(0,19),49,rand(0,19),$black);
    imageline($img,0,rand(0,19),49,rand(0,19),$black);
   
    imagegif($img);
    imagedestroy($img);
?>






filename: index.php
Baris kode berikut adalah kode yang menunjukkan gambar captcha dan form untuk mengetik captcha
<img src='captcha.php' />
<form name='captcha_form' method='POST' action='hasil.php'>   
    <input type='text' name='captcha_txt' maxlength='5' />
    <input type='submit' name='submit_btn' value='Submit captcha' />
</form>

<?php   
    if(isset($_POST['captcha_txt']))
    {
        $captcha = $_POST['captcha_txt'];
        $captcha_hash = $_COOKIE['captcha'];
        if(sha1("KOMPUTOO$captcha") == $captcha_hash)
        {
            echo "Captcha benar";
        }
        else
        {
            echo "Captcha salah";
        }
    }
?>

 
Selamat mencoba :)
Read more

Perbedaan tag HTML <div> dan <span>


Pengaturan CSS pada suatu elemen HTML dapat dilakukan secara berkelompok, yaitu dengan menggunakan tag <div>. Ada juga tag <span> yang seakan-akan memiliki fungsi sama dengan <div>, padahal keduanya memiliki kegunaan yang jauh berbeda. Umumnya, programmer yang baru mulai terjun dalam pemrograman web akan merasa kebingungan untuk membedakan kedua tag ini. Lalu, apa perbedaan antara kedua tag ini?
Walaupun kegunaannya hampir sama, tapi penggunaan dan fungsiinya ternyata jauh berbeda.
<div> digunakan untuk mengelompokkan elemen menjadi sebuah blok(daerah berbentuk kotak). Setelah dikelompokkan, elemen yang ada di dalam tag <div> akan selalu berada dalam satu baris.
Sementara itu,
<span> umumnya digunakan untuk text saja, selain itu juga sering digunakan pada gambar. Jika kita menerapkan CSS pada elemen yang berada diantara tag <span>, efeknya akan sedikit berbeda dengan <div>, karena tag <span> tidak mengelompokkan konten di dalamnya dalam bentuk blok.
Untuk melihat perbedaannya lebih jelas, lihat hasil beberapa baris kode berikut.Resize  window pada browser anda, dan lihat perbedaan yang terjadi antara tag <div> dan <span>

div:
<div style="color:#F00;background:#0F0;border:1px solid red;">
Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!
</div>

<br/>


span:
<span style="color:#F00;background:#0F0;border:1px solid red;">
Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!
</span>


Inilah hasil dari kode di atas. Saya tidak bisa mendeskripsikan perbedaannya lebih jauh. Tapi dengan melihat hasil kode di atas dan screenshoot di bawah ini, saya harap anda paham perbedaannya.


Read more

Membuat Sistem Operasi Hello World Untuk Boot Flashdisk



Penjelasan
Ketika kita menyalakan komputer, CPU akan mencoba mencari ROM BIOS. Dalam memori ROM ini terdapat instruksi-instruksi untuk menyiapkan komputer sebelum kode boot sector di masukkan dalam memori. Boot sector code adalah sekumpulan kode instruksi yang disimpan pada alamat sektor pertama disk. Kode ini berisi kumpulan instruksi-instruksi yang digunakan untuk memasukkan file ke dalam memori. Karena semua disk mempunyai sektor berukuran 512 byte, maka kode boot sector yang kita buat harus berukuran 512 byte juga.
Setelah ROM ditemukan, instruksi selanjutnya dijalankan untuk melakukan POST(Power On Self Test). Tugas POST adalah memeriksa keadaan chip BIOS dan CMOS RAM. Jika tidak ditemukan masalah, berikutnya POST mencoba memeriksa perangkat keras komputer, seperti video card, disk, keyboard dan port untuk memastikan semuanya bekerja dengan baik.
Jika POST mengetahui semua hardware dalam keadaan normal dan CPU telah siap, maka POST berhenti dan berlanjut menuju BIOS untuk menentukan sistem operasi yang akan di jalankan. Biasanya BIOS menentukan urutan pencarian sistem operasi dalam disk dengan bantuan CMOS chip. Kita juga dapat mengubah urutan pencarian dengan masuk kedalam CMOS Setup atau dengan menekan F2 saat boot. Disini BIOS mencoba memeriksa disk satu per satu. Jika pada sektor pertama terdapat signature, BIOS akan memasukkan sektor tersebut ke alamat 0x7c00 dan menjalankan instruksi JMP ke alamat tersebut.

Sebelum Mulai
Sebelum memulai, saya menganjurkan anda untuk memahami bahasa assembly terlebih dahulu. Selain itu, anda harus tahu bagaimana mengatur BIOS agar USB flashdisk kita berjalan pertama kali(Yang pernah install ulang pasti tahu).
Perlu saya tekankan, bahwa percobaan ini dapat beresiko menimbulkan kehilangan data, jadi ikuti instruksi dan lakukan percobaan dengan hati-hati. Jika ada kehilangan atau kerusakan, diluar tanggung jawab saya. Saya anjurkan untuk memindahkan semua data dari Flashdisk ke komputer
Yang harus disiapkan:
  • HxD
  • NASM
  • Kode boot
  • Flashdisk
Saya berasumsi bahwa anda telah mengetahui bagaimana kode di bawah ini bekerja, jadi saya tidak akan bertele-tele menjelaskannya kepada anda. Saya hanya memberikan sedikit penjelasan dalam bentuk komentar di beberapa baris kode.
;format kode 16-bit
;ingat, bios meload bootsector pada 0x0000:0x7c00
[BITS 16]
[ORG 0x7c00]

jmp mulai
hello db "hello world",0

mulai:
mov ax,0
mov ds,ax
mov es,ax
mov ss,ax

mov sp,0xFFFF

;cetak hello world
mov si,hello
call print

;hang. Untuk berhenti, matikan PC dengan menekan tombol power
;jangan khawatir, 100% aman
hang:
    jmp hang

;fungsi untuk mencetak string
print:
    mov al,[si]
    cmp al,0
    je .ok
    mov ah,0x0e
    int 0x10
    inc si
    jmp print
.ok:
    ret

;ini membuat kode setelah dicompile menjadi 510 byte + 2 byte signature
times 510 - ($-$$) db 0
;signature harus 0xAA55
dw 0xAA55


Simpan dengan nama hello.asm
lalu compile dengan perintah nasm hello.asm

Instalasi
Untuk instalasinya, anda membutuhkan HxD dan Flashdisk yang sudah di pindah semua datanya.
  • Jalankan HxD sebagai administrator. Yaitu dengan cara klik kanan program HxD -> Run as administrator
  • Ke menu Extras -> Open disk





  • Seperti yang kita lihat “Removable Disk 1” adalah flashdisk yang telah kita tancapkan barusan.
    Jangan lupa menghilangkan centang Open as Readonly. Lalu, klik OK

  • Blok dan Copy satu sektor disk, yaitu block 0 - 1FF
  • Buat file baru. Buka menu File->New, lalu paste dan simpan dengan nama backup.bin
  • Sekarang buka file hello.asm yang sudah di compile. Setelah dicompile file ini biasanya bernama hello, tanpa ekstensi.
  • Copy semua kode hex dari file hello, lalu paste ke 1 sektor pertama (block 0 - 1FF) di Removable disk.


  • Setelah itu, save
  • Sekarang coba restart komputer dan lihat hasilnya. Jika tidak muncul, atur pengaturan booting melalui BIOS setting
Pada percobaan saya, inilah screenshot yang terlihat pada LCD laptop saya.






Untuk mengembalikan disk yang telah termodfikasi sektornya, copy data dari hasil backup tadi lalu taruh pada sektor pertama disk. Jika tidak berhasil, format saja.

Read more

Download Ebook Linux Device Driver Isi Lengkap


Device driver adalah software yang berjalan dalam ruangan system dan bertugas untuk menangani perangkat tertentu yang terpasang dalam sebuah komputer. Di Indonesia, pengembangan perangkat lunak masih terbatas pada pengembangan program user, sementara itu pengembangan perangkat lunak device driver belum banyak yang mengetahuinya.
Sistem operasi berbasis GNU/Linux memiliki struktur sistem yang kompleks, namun sederhana dan lebih mudah dipahami dibandingkan sistem lain. Oleh karena itu, developer yang tertarik untuk terjun menjadi ahli pengembangan device driver akan lebih baik jika mempelajari cara kerja driver dari sistem linux terlebih dahulu.
Bagaimana dengan anda? apakah anda juga tertarik untuk mempelajarinya?
Silahkan download melalui link di bawah ini:

https://app.box.com/s/4v14sy0530o2goog07a6

Selamat mencoba :)
Read more

Software Kamus Besar Bahasa Indonesia [COCOK BAGI YANG SUKA GALAU]


Ketika galau, manusia bisa mengeluarkan untingan-untingan kata yang indah dari lubuk hatinya. Tapi sayangnya belum banyak yang sadar dan memanfaatkan hal ini untuk hal-hal yang positif. Contohnya untuk membuat puisi. hehehhe :D
Saya sengaja mengaitkan hal ini dengan software Kamus Besar Bahasa Indonesia karena sebagian besar galau-ers adalah pecinta komputer, ini lebih sering terlihat pas malam minggu. tul kan? :D
Daripada melampiaskan perasaan ini untuk hal-hal negatif (mis. nonton b*kep, mengeluh), lebih baik kita memperintah ungkapan perasaan kita untuk membuat puisi. Caranya, dengan melihat kata-kata dari  kamus.
Semua orang, termasuk saya berpikir, daripada uang dibuat beli kamus, mending buat jajan. Untungnya, ada programmer baik yang menyediakan kamus yang bisa diperoleh secara gratis.


O, iya. Ini malam minggu ya?
Ok, daripada menggalau, mari kita membuat puisi :D

http://ebsoft.web.id/kbbi-kamus-besar-bahasa-indonesia-offline-gratis/

Read more