Selasa, 29 April 2014

Background Pattern Metal Untuk Website / Blog Anda (Recommended)

Penggunaan background akan membuat tampilan tema website anda semakin berwarna. Dengan pemasangan background gambar, kesan monoton dapat dihilangan. Namun, di sisi lain, penggunaan background gambar dapat mengurangi portabilitas dan memperlambat loading website.
Sebagai solusinya, penggunaan background gambar dioptimalan dengan menggunakan konten gambar berjenis pattern. Gambar pattern merupakan potongan gambar kecil yang dapat mengisi background website anda. Potongan gambar pattern secara tidak langsung dapat membuat tampilan website anda menarik tanpa harus menurunkan portabilitas website.

1. Metal Mesh Pattern - Pack 1
http://www.deviantart.com/art/Metal-Mesh-Patterns-Pack-1-107942844

2. Metal Lattice Texture
http://www.deviantart.com/art/Metal-Lattice-Texture-486271

3. Chain Lattice Texture
http://www.deviantart.com/art/Chain-Lattice-Texture-549569

4. Rusty Lattice Texture
http://www.deviantart.com/art/Rusty-Lattice-Texture-486195
Read more

Selasa, 22 April 2014

Tips Aman Menghindari Bug Sistem Windows 8.1


Pada postingan  sebelumnya saya menceritakan pengalaman saya menggunakan Windows 8.1. Betapa menjengkelkannya jika bug itu selalu datang, walaupun berkali-kali melakukan install ulang. Berbagai cara sudah saya tempuh untuk megatasi bug yang ada pada Windows 8.1, tapi hasilnya NIHIL.
Kemarin, saya memutuskan untuk menginstall ulang laptop kesayangan saya dengan Windows 8.1 untuk yang ketiga kalinya. Sebuah keputusan yang berat, tapi mau bagaimana lagi? saya sudah terlanjur cinta dengan Windows 8 :*
Saya mencoba flashback dan mulai memikirkan dari mana awal mula terjadi bug. Saya beranggapan bahwa titik awal bug mulai ada setelah Windows melakukan update. Itu mungkin sekali, karena Windows melakukan update otomatis saat terhubung internet. Padahal, tujuan update adalah menghadirkan fitur terbaru bagi pengguna, tapi justru disini update malah mengganggu pekerjaan penggunanya. Kemungkinan lain, mungkin juga bug bisa berasal dari program-program yang kita install. Tapi saya agak ragu jika bug Windows 8.1 berasal dari program, karena sebelumnya saya sempat melakukan uninstall semua program yang sudah saya install. Akan tetapi bug itu masih tetap ada. Jadi kemungkinan besar, bug dominan terjadi pada sistem. Pendapat ini saya dasarkan pada pengamatan konten-konten yang diupdate Windows secara otomatis saat proses update. Dan ternyata, proses update sebagian besar dilakukan untuk memperbaharui komponen sistem dengan komponen yang lebih baru. Jadi, sangat mungkin sekali jika perubahan sistem akaan mempengaruhi tingkah laku program.

Lalu, apa yang harus kita lakukan agar aman dari bug?
Menurut saya, cara yang paling aman adalah mengantisipasi sebelum bug itu datang. Untuk mengantisipasinya, buat restore point sebelum melakukan aktivitas yang beresiko menimbulkan bug bagi sistem. Seperti yang saya ceritakan di atas, bug sistem kemungkinan terjadi setelah melakukan update. Jadi, anda harus membuat restore point sebelum melakukan update. Ada juga sedikit kemungkinan jika bug bisa saja berasal dari program yang kita install. Membuat restore point sebelum menginstall program akan sangat merepotkandan juga membutuhkan waktu yang relatif lama. Sehingga, saran saya, untuk menghindari bug dari program, pembuatan restore point dilakukan secara terjadwal, misalnya setiap 1 bulan atau setiap 3 bulan.
O, iya. proses update sebaiknya dilakukan secara manual saja. Menonaktifkan Automatic Windows Update akan membantu anda menghindari bug tak terduga karena proses update. Dengan menonaktifkan Automatic Windows Update, anda bisa membuat restore point sebelum melakukan update lalu mengaktifkannya kembali saat selesai membuat restore point :)
Read more

Kamis, 17 April 2014

Hey, Windows 8.1 Datang : Upgrade? [PIKIR LAGI]


Sebelum membaca lebih lanjut, saya sarankan Anda agar tidak terlalu tertarik melihat postingan di blog-blog  tentang fitur-fitur Windows 8.1 baru. Ingat jika usia Windows 8.1 masih sangat muda.

Pengalaman suram saat instalasi sistem operasi sepertinya terulang kembali. Karena minimnya pengetahuan tentang komputer, saya tidak tahu kalau keseringan memformat harddisk dapat berujung pada kerusakan. Bahkan, dulu saya pernah berkali-kali merusak harddisk karena keseringan install ulang. Setelah tahu hal ini berdampak buruk, saya akhirnya dapat mengambil pelajaran dari pengalaman dulu ketika melakukan instalasi. Akan tetapi, seiring dengan bertambahnya pengetahuan dan rasa ingin tahu saya, saya akui, saya masih tetap sering melakukan install ulang. Dan yang menjadi objek eksperimen saya sebagian besar adalah sistem operasi berbasis GNU/Linux.

Kemarin, kampus saya sempat ada promosi Microsoft DreamSpark . Lumayan lah, bisa dapat OS original, walaupun lisensinya hanya terbatas 1 tahun :D
Saya mencoba mengajukan permohonan Windows 8.1 Enterprise 64-bit. Saya pikir dengan memilih versi paling baru, performa dan tampilannya akan lebih baik dari Windows yang sedang saya pakai (Windows 7). Tapi tampaknya bayangan saya berbeda jauh dengan yang saya harapkan.



Tampilan dan fitur Windows 8.1 tidak berbeda jauh dengan Windows 8. Perbedaan yang paling menonjol adalah keberadaan Start Button di pojok kiri bawah seperti OS windows yang sudah dirilis pada versi-versi sebelumnya. Selain itu, yang menarik dan belum pernah saya temui di Windows 7 adalah adanya beberapa tambahan aplikasi yang entah apa namanya(ada di start menu). Sayangnya untuk penambahan aplikasi, instalasi harus dilakukan secara online melalui Windows Store. Saat itu juga saya langsung memenuhi menu saya dengan banyak aplikasi. Hmmm, downloadnya lumayan lancar, sih, tapi ada sedikit masalah juga. Terkadang muncul pesan pending beberapa kali, lalu beberapa saat kemudian error :(
Padahal koneksi di kampus saya pas malam saya coba normal, seperti biasa, kecepatan download 2 Mbps!


 Semua aplikasi lancar dijalankan. Tampilan juga oke. Setelah puas, saya memutuskan untuk pulang ke kost dahulu dan melanjutkan eksperiment selanjutnya di esok hari.

[BEBERAPA HARI KEMUDIAN]
WTF! Semua aplikasi error! (lihat video di bawah)
yang bisa dijalankan hanya SkyDrive dan Image viewer saja :(
Setelah saya browsing-browsing saya mencoba setiap situs untuk membantu memperbaiki permasalahan ini. Saya coba update, atur beberapa settingannya, lewat command, dsb. Tapi apa boleh buat? Berhari-hari saya sudah berusaha tapi hasilnya NIHIL!
Akhirnya saya memutuskan untuk menginstall ulang Windows 8.1. Kali ini lebih parah lagi, belum lewat 1 hari, setelah saya mengisi beberapa aplikasi seperti Ms. Office, Archiver, dll, masalah itu timbul lagi. -_-
Saya bingung sampai sekarang, geleng-geleng kepala, putus asa, pengen downgrade balik ke Windows 7, tapi kasihan harddisknya T_T
Ternyata, setelah saya mengusut permasalahan ini, saya mendapatkan informasi dari banyak situs, bahwa Windows 8.1 memang menyimpan BANYAK BUG!! F*ck!!


Bagaimana dengan anda? Apa anda yakin ingin upgrade ke Windows 8.1? Atau anda sudah terlanjur merasakan bugnya? :p
Atau mungkin kalian punya solusi yang paling tepat untuk memecahkan bug pada Windows 8.1, silahkan share... :)
Read more

Senin, 14 April 2014

GTK Programming : Menampilkan Message Box dengan widget GtkMessageDialog



Jumpa lagi guys... :)
Pada tutorial - tutorial sebelumnya, kita sudah mempelajari banyak teknik pemrograman dasar GTK, bukan?
Karena terlalu bersemangat kita jadi lupa membahas widget yang cukup sederhana, tapi sangat sering digunakan. Widget yang saya maksud adalah GtkMessageDialog. Widget ini sangat berguna  saat kita ingin menampilkan pesan tanpa membuat window. Jika di Windows, ini lebih sering kita jumpai dengan sebutan MessageBox.

Let's Start
Kode yang saya sertakan di bawah ini akan menampilkan sebuah GtkMessageDialog ketika widget 'button' diklik. Proses penampilan GtkMessageDialog ada pada blok fungsi ButtonClick. Setelah muncul dan user mengeklik salah satu tombol pada GtkMessageDialog, kita membaca hasilnya lalu mencetaknya pada layar konsol.
#include<gtk/gtk.h>

GtkWidget *window, *button, *dialog;

void ButtonCallback(GtkButton *button, gpointer user_data)
{
gint hasil;
dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_YES_NO, "Ini adalah Message Dialog");
hasil = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
switch(hasil)
    {
      case GTK_RESPONSE_YES: g_print("Anda mengeklik YES\n");break;
      case GTK_RESPONSE_NO: g_print("Anda mengeklik NO\n");break;
      case GTK_RESPONSE_DELETE_EVENT: g_print("Anda menutup message dialog\n");
    }
}

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);
    //buat window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Hello world");
    //buat button
    button = gtk_button_new_with_label("Tampilkan Message Dialog!");
    //hubungkan sinyal
    g_signal_connect(button, "clicked", G_CALLBACK(ButtonCallback), NULL);
    //pasang
    gtk_container_add(GTK_CONTAINER(window), button);
    //tampilkan
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Saya rasa saya anda telah memahami semua kode yang ada dalam blok main(), karena saya sudah menjelaskan semuanya pada tutorial-tutorial sebelumnya. Jadi, di sini saya hanya akan menjelaskan fungsi inti untuk memunculkan GtkMessageDialog dan mengolah response-nya saja. Semua fungsi ini ada pada blok fungsi ButtonCallback().

Cara kerja MessageDialog sama persis seperti MessageBox di Windows. Setelah kotak pesan selesai ditampilkan, kita akan menerima GTK_RESPONSE, seperti halnya MessageBox. Response ini merupakan informasi yang dapat kita lihat untuk mengetahui tombol mana yang diklik oleh user.

Pada baris kode diatas, proses pembuatan MessageDialog kita lakukan dengan kode berikut.
dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_YES_NO, "Ini adalah Message Dialog");

Adapun fungsi prototype gtk_message_dialog_new secara deatil adalah sebagai berikut.
GtkWidget *gtk_message_dialog_new(GtkWindow *parent, GtkDialogFlags flags, GtkMessageType type, GtkButtonsType buttons, const gchar *message_format,...);

parent: window(GtkWindow) yang memiliki message dialog ini
flags: cara menampilkan message dialog. Gunakan GTK_DIALOG_MODAL agar message dialog selalu berada di depan parent, atau gunakan GTK_DIALOG_DESTROY_WITH_PARENT agar message dialog dapat dimunculkan bebas dan hilang otomatis saat parent dihapus. 
type: jenis message dialog yag ditampilkan. Parameter ini dapat berupa GTK_MESSAGE_INFO, GTK_MESSAGE_WARNING, GTK_MESSAGE_QUESTION, GTK_MESSAGE_ERROR atau GTK_MESSAGE_OTHER.
Buttons: tombol(GtkButton) yang akan ditampilkan pada message dialog. Parameter ini dapat berupa GTK_BUTTONS_NONE, GTK_BUTTONS_OK, GTK_BUTTONS_CLOSE, GTK_BUTTONS_CANCEL, GTK_BUTTONS_YES_NO atau GTK_BUTTONS_OK_CANCEL
message_format, ... : pesan yang ditampilkan pada message dialog.

Message dialog yang telah dibuat dapat dimunculkan dengan fungsi gtk_dialog_run() diikuti parameter GtkMessageDiaog yang telah kita buat sebelumnya.
hasil = gtk_dialog_run(GTK_DIALOG(dialog));

Fungsi diatas akan menampilkan message dialog dan mengembalikan response dalam bentuk integer saat message dialog ditutup. Nama response berikut adalah jenis response yang dihasilkan berdasarkan tombol yang diklik oleh user : GTK_RESPONSE_DELETE_EVENT, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, GTK_RESPONSE_CLOSE, GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_APPLY atau GTK_RESPONSE_HELP. Anda nanti bisa mencobanya satu persatu untuk melihat perbedaannya.

Setelah selesai, kita harus menghapus widget dari memori, yaitu dengan fungsi gtk_widget_destroy().
gtk_widget_destroy(dialog);
Sebenarnya tidak dihapus tidak masalah, asalkan pembuatan widget GtkMessageDialog cukup dilakukan sekali saja waktu inisialisasi program. Tapi, berhubung kode disini pembuatannya dilakukan saat widget button diklik, kita harus menghapusnya sesegera mungkin setelah selesai dipakai.

Hasil
Dan, seperti inilah hasil yang akan anda dapatkan :)


Selamat mencoba :)
Read more

GTK Programming : Packing dengan GtkGrid



Setelah pada tutorial sebelumnya kita menggunakan GtkBox untuk packing widget, kali ini kita akan menggunakan widget container yang lain untuk melakukan packing widget. GtkBox mampu mempacking widget secara vertikal ataupun horisontal, jika ingin mempacking secara horisontal sekaligus vertikal akan membutuhkan lebih dari 2 GtkBox. Tentu ini akan terasa kurang efisien. Jangan kawatir, kita dapat memecakan masalah ini dengan GtkGrid.

Sebelumnya ada pula widget bernama GtkTable yang memiliki fungsi serupa dengan GtkGrid. Sampai saat ini GtkTable masih ada, akan tetapi sekarang sudah tidak dianjurkan lagi penggunaannya(deprecated). Sekarang ini peranan GtkTable digantikan  dengan GtkGrid. Karena GtkTable sudah deprecated, disini kita hanya akan membahas GtkGrid saja.

Let's start
Cara kerja GtkGrid hampir sama dengan GtkBox seperti yang telah kita bahas pada tutorial sebelumnya. Semua widget yang bernaung dalam GtkGrid akan menyesuaikan diri sesuai dengan peletakan kolom dan barisnya.

Kode yang kita pakai pada tutorial sekarang ini tidak jauh berbeda dengan kode yang barusan kita pelajari pada tutorial sebelumnya. Teknik dasar packing dengan GtkGrid mirip sekali dengan GtkBox. Berikut adalah kodenya:
#include<gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window, *button1, *button2, *button3, *grid;
  
    gtk_init(&argc, &argv);
    //buat window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"GtkGrid Demo");
    //buat grid
    grid = gtk_grid_new();
    //pasang GtkGrid pada window
    gtk_container_add(GTK_CONTAINER(window), grid);
    //buat button
    button1 = gtk_button_new_with_label("Button 1");
    button2 = gtk_button_new_with_label("Button 2");
    button3 = gtk_button_new_with_label("Button 3");
    //pasang
    gtk_grid_attach(GTK_GRID(grid),button1,1,1,1,1);
    gtk_grid_attach(GTK_GRID(grid),button2,2,1,1,1);
    //gtk_grid_attach(GTK_GRID(grid),button3,1,2,2,1);
    gtk_grid_attach(GTK_GRID(grid),button3,1,2,1,1);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Dan, seperti biasa, saya hanya akan membahas kode yang belum pernah dibahas pada tutorial-turorial sebelumnya. Kode asing yang paling pertama kita temui adalah fungsi gtk_grid_new(). Bisa ditebak, fungsi ini adalah untuk membuat GtkGrid baru. :)
Prototype lengkap fungsi gtk_grid_new() adalah sebagai berikut:
GtkWidget *gtk_grid_new(void);

Selanjutnya kita pasang GtkGrid seperti halnya yang kita lakukan dalam pemasangan GtkBox.
Kita langsung lompat saja menuju beberapa baris selanjutnya. Pada baris ini terjadi proses pemasangan widget pada GtkGrid.
gtk_grid_attach(GTK_GRID(grid),button1,1,1,1,1);
gtk_grid_attach(GTK_GRID(grid),button2,2,1,1,1);
/*gunakan kode di bawah ini untuk melihat 1 widget ditempatkan dalam 1 kolom
gtk_grid_attach(GTK_GRID(grid),button3,1,2,2,1);
*/
gtk_grid_attach(GTK_GRID(grid),button3,1,2,1,1);

Fungsi prototype lengkap gtk_grid_attach() adalah sebagai berikut.
void gtk_grid_attach(GtkGrid *grid, GtkWidget *child, gint left, gint top, gint width, gint height);
grid: pointer ke GtkWidget yang telah didaftarkan dengan gtk_grid_new()
child: widget yang ingin ditambahkan ke dalam cntainer GtkGrid
left: lokasi penempatan kolom GtkGrid
top: lokasi penempatan baris GtkGrid
width: jumlah kolom yang digunakan untuk widget yang akan dipasang
height: jumlah baris yang digunakan untuk widget yang akan dipasang

Sederhana bukan? Yups, itu karena GtkGrid memiliki cara kerja yang mirip dengan GtkBox yang telah kita pelajari sebelumnya. :)

Hasil
Hasil layout dari ketiga button yang terpasang pada GtkGrid dapat anda lihat pada screenshot berikut.

'button3' dengan parameter width 1 kolom

 'button3' dengan parameter width 2 kolom
Selamat mencoba :)
Read more

GTK Programming : Menyusun Widget dengan GtkBox


Sebelumnya sudah dijelaskan bahwa GtkWindow termasuk dalam kategori 'container'(Klik disini untuk tutorial sebelumnya). Kita diperbolehkan untuk menambahkan/memasang widget lain di dalamnya. Kita sudah membuktikan hal ini pada tutorial sebelumnya, yaitu dengan memasang GtkButton pada GtkWindow dengan fungsi gtk_container_add(). GtkWindow hanya terbatas untuk menampung satu buah widget saja, sehingga untuk memiliki banyak widget dalam sebuah window, kita tidak dapat memakai fungsi gtk_container_add().
Program sederhana umumnya membutuhkan lebih dari 2 widget. Agar semua widget yang kita perlukan dapat terpasang pada window, kita membutuhkan bantuan widget container GtkBox. GtkBox merupakan salah satu widget dari golongan container yang mampu menampung lebih dari 1 buah widget.
GtkBox bekerja  layaknya garis pembatas bagi widget. Widget yang dimasukkan dalam GtkBox akan menyesuaikan diri sesuai garis batasannya.

Let's Start
Pada tutorial kali imi  kita akan mencoba membuat 2 buah tombol(GtkButton) dalam sebuah Window. Caranya adalah dengan memasang 2 tombol tersebut pada GtkBox lalu memasangkan GtkBox pada window. Perlu diingat bahwa widget GtkBox tidak dapat dilihat, namun perannya sangat penting dalam mengatur susunan widget secara sejajar dan teratur. Pembuatan GtkBox pada tutorial ini dilakukan dengan fungsi berikut.
#include<gtk/gtk.h>
int main(int argc, char *argv[])
{
    GtkWidget *window, *button1, *button2, *box;
   
    gtk_init(&argc, &argv);
    //buat window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Hello world");
    //buat horizontal box
    box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
    //pasang hbox pada window
    gtk_container_add(GTK_CONTAINER(window), box);
    //buat button
    button1 = gtk_button_new_with_label("Button 1");
    button2 = gtk_button_new_with_label("Button 2");
    //pasang
    gtk_box_pack_start(GTK_BOX(box),button1,TRUE,TRUE,10);
    gtk_box_pack_start(GTK_BOX(box),button2,TRUE,TRUE,10);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Cara kerja GtkBox pada kode di atas dapat dijelaskan dengan ilustrasi berikut.

1. GtkWindow baru dibuat
2. GtkBox dipasang pada GtkWindow
3. Menambahkan GtkButton pertama
4. Menambahkan GtkButton kedua
Bisa kita lihat pada tahap ke empat, widget yang bernaung pada GtkBox secara otomatis menyesuaikan diri.


Sebelu memasang GtkBox, tentunya kita harus membuatnya terlebih dahulu. GTK menyediakan fungsi gtk_box_new() untuk pembuatan GtkBox.
box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
Bentuk lengkap prototype fungsi diatas adalah sebagai berikut.
GtkWidget *gtk_box_new(GtkOrientation orientation, gint spacing);

orientation: cara penempatan widget pada box. Kita dapat menggunakan 2 metode, yaitu tegak lurus, vertikal (GTK_ORIENTATION_VERTICAL) atau juga bisa secara mendatar/horosontal (GTK_ORIENTATION_HORIZONTAL).
spacing: jarak pixel yang memisahkan antar widget yang telah terpasang dalam GtkBox.

Setelah GtkBox dibuat, pasang pada container window dengan fungsi htk_container_add().
gtk_container_add(GTK_CONTAINER(window), box);

Mungkin beberapa dari anda merasa ragu dengan fungsi diatas? window(GtkWindow) adalah container dan box(GtkBox) juga merupakan container. Kode diatas memasangkan box ke dalam window, benarkah demikian?
Yup, benar. Tidak ada yang salah, container mengizinkan pemasangan semua jenis widget, kecuali widget container berbasis window.

Untuk menambahkan kedua widget button yang kita inginkan dalam GtkBox, kita memakai fungsi berikut.
gtk_box_pack_start(GTK_BOX(box),button1,TRUE,TRUE,10);
gtk_box_pack_start(GTK_BOX(box),button2,TRUE,TRUE,10);
GtkBox tergolong dalam container, akan tetapi untuk memasang widget dalam GtkBox tidak boleh memakai fungsi 'gtk_container_add()', karena fungsi tersebut khusus untuk memasangkan widget pada container yang hanya mampu menampung satu buah widget, seperti GtkWindow. Sementara itu, GtkBox tidak membatasi jumlah widget, sehingga diperlukan metode yang berbeda.

Dalam pemasangan widget dalam container GtkBox, kita dapat menggunakan 2 macam fungsi:
1.  gtk_box_pack_start()
void gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
2. gtk_box_pack_end()
void gtk_box_pack_end (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);

box: GtkBox yang akan dipasang widget
child: widget yang akan dipasang pada  box
expand: jika bernilai benar ukuran widget dapat berubah sesuai perubaha ukuran window
fill: jika benar, ukuran widget akan menyesuaikan ukuran window
padding: Jarak pemisah tambahan yang memberikan jarak antar widget ayng terpasang dalam box

Kedua fungsi diatas memiliki fungsi yang sama. Perbedaannya terletak pada hasil penempatan widget pada container. Widget yang dipasang dengan gtk_box_pack_start() mendapat prioritas penempatan paling kanan atau paling bawah, begitu pula sebaliknya pada fungsi gtk_box_pack_end().

Setelah pembuatan dan pemasangan seleasai, kita boleh mulai menampilkan semua widget.
gtk_widget_show_all(window);
 
Proses penampilan window cukup menggunakan 1 fungsi, dengan parameter berisi container paling atas, yaitu window. Secara otomatis, gtk akan mencari widget lain yang terpasang dibawahnya.

Hasil
Penasaran dengan hasilnya?
Seperti inilah GtkBox berperan membantu kita dalam pemasangan widget :)

 GTK_ORIENTATION_HORIZONTAL

 GTK_ORIENTATION_VERTICAL

Selamat mencoba :)
Read more

Minggu, 13 April 2014

GTK Programming : Penanganan Sinyal dari Widget



Agar pembuatan widget dapat menghasilkan luaran, kita harus tahu saat pengguna memberikan input pada widget yang telah tampil. Misalnya kita mempunyai sebuah aplikasi yang akan menampilkan MessageBox ketika widget GtkButton diklik oleh pengguna. Bagaimana kita bisa tahu saat pengguna mengklik GtkButton?

Setiap widget yang kita tampilkan secara otomatis dibuatkan struktur GtkWidget oleh sistem GTK. Dalam struktur ini terdapat pointer-pointer menuju fungsi callback yang akan dijalankan ketika widget mendapatkan input/sinyal dari pengguna, baik itu input mouse, ataupun keyboard.

Setelah sebelumnya kita membahas tentang cara pembuatan Hello World Window dengan GTK, kali ini kita akan melanjutkan percobaan kita dalam membuat GtkButton dan menerima sinyal "clicked". Sinyal ini adalah signal yang umumnya dihasilkan oleh setiap widget setelah menerima input klik, termasuk GtkButton.

Let's Start
Compile source code dibawah ini dengan cara yang pernah saya jelaskan sebelumnya.
#include<gtk/gtk.h>

void ButtonClick(GtkButton *button, gpointer userdata)
{
g_print("Di klik!\n");
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *button;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Hello world");
    button = gtk_button_new_with_label("Klik");
    gtk_container_add(GTK_CONTAINER(window), button);
    g_signal_connect(button, "clicked", (GCallback)ButtonClick, NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Kode diatas hanya merupakan pengembangan dari kode yang pernah saya berikan pada postingan sebelumnya. Beberapa kode dan cara instalasi telah saya jelaskan, jadi khusus tulisan ini saya hanya menjelaskan bagian baru yang belum dijelaskan pada postingan sebelumnya.

void ButtonClick(GtkButton *button, gpointer userdata)
{
g_print("Di klik!\n");
}
Bagian diatas merupakan fungsi callback yang akan dipanggil setelah tombol mendapatkan klik. Tipe data dan parameter sudah merupakan standar dari GTK, jadi kita tidak bisa menggunakan yang lain. Yang boleh kita ubah hanya nama fungsinya saja.

g_print("Di klik!\n");
 g_print adalah fungsi built-int yang disediakan GTK dari bagian GLib. Penggunaannya sama persis dengan fungsi printf() yang biasanya kita pakai dalam membuat program konsol.

button = gtk_button_new_with_label("Klik");
Baris diatas digunakan untuk membuat widget button baru dengan menyertakan caption/label. Adapun prototype fungsinya adalah :
GtkWidget *gtk_button_new_with_label(const gchar *label);

 Setelah button dibuat, kita harus menentukan dimana kita harus meletakkannya.  Dalam hal ini kita menggunakan fungsi gtk_container_add()
gtk_container_add(GTK_CONTAINER(window), button);
Prototypenya:
void gtk_container_add(GtkContainer *container, GtkWidget *widget);

Container merupakan widget yang dapat digunakan untuk meletakkan widget lainnya. Dalam GTK, container dapat berupa window(GtkWindow), grid(GtkGrid), tab/notebook(GtkNotebook), dll. Khusus tutorial kali ini, kita hanya menggunakan GtkWindow sebagai container.

Setelah penempatan sudah oke, saatnya menghubungkan sinyal pada widget yang kita inginkan. Widget 'button' adalah widget yang akan kita coba. Tadi kita sudah membuat fungsi "ButtonClick" dan sekarang kita akan mengaturnya agar fungsi tersebut dijalankan ketika widget 'button' kita klik.
Caranya adalah dengan fungsi g_signal_connect(). Prototypenya adalah seperti berikut:
g_signal_connect(instance, detailed_signal, c_handler, data)
  • instance adalah nama widget yang ingin kita hubungkan.
  • detailed_signal adalah nama sinyal yang akan memanggil fungsi callback. karena kita ingin fungsi ini dipanggil saat terjadi klik, kita menggunakan "clicked"
  • c_handler adalah nama fungsi yang akan di panggil berdasarkan jenis sinyal yang kita daftarkan.
  • data adalah data yang ingin kita berikan kepada fungsi callback(opsional)
Sehingga bentuk fungsi koneksi widget 'button' akan seperti berikut:
g_signal_connect(button, "clicked", (GCallback)ButtonClick, NULL);

Jika sudah siap, saatnya menunjukkan semua widget :)
gtk_widget_show_all(window);
Fungsi diatas sengaja dipanggil setelah menghubungkan sinyal agar widget sudah siap menerima sinyal saat telah muncul di desktop.

Hasil

Yups, cukup mudah bukan? :)
Tahap ini masih alam tingkatan dasar, jadi tetap semangat ya...
Pada tutorial selanjutnya, kita akan membahas yang lebih advanced, dan lebih keren lagi pastinya :D

Read more

Sabtu, 12 April 2014

Analisa Dampak Negatif Penggunaan RAD Tool

Programmer pemula, sejak dari awal sudah dibiasakan untuk memakai RAD Tool (Rapid Aplication Development Tool), seperti Visual Studio dan Delphi. Memang benar bahwa RAD tools dapat mempermudah dan mempercepat pengembangan program, akan tetapi rupanya hal ini memiliki beberapa dampak negatif, dintaranya adalah:
1. Software bajakan
Karena pada umumnya RAD Tools bersifat komersial, tidak heran jika banyak versinya yang beredar ilegal di internet. Hal ini karena mungkin pengguna tidak mampu menjangkau harga software atau hanya bermaksud mencoba-coba tapi tak ada modal.
2. Masalah aplikasi low-level
Contoh sederhana adalah Indonesia, rata-rata programmernya sudah menggunakan RAD tools. Berdasarkan pengamatan penulis, mereka akan merasa kesulitan atau malas saat menemukan bahwa beberapa program tidak bisa dibuat dengan RAD tools, misalnya membuat program non-standar, library, driver, sistem, dll. Itulah mengapa di Indonesia jarang ditemukan aplikasi untuk linux, itu karena di Linux sulit mencari RAD tool. Bedakan dengan program buatan luar yang melimpah.
3. Kesulitan Baru
Syntax yang digunakan RAD tool umumnya mengalami beberapa perubahan dari bahasa aslinya, walaupun hanya sedikit, tapi ini akan membuat programmer sulit beradaptasi dengan lingkungan baru tanpa RAD tool. Kesulitan lainnya seperti saat kita membuat aplikasi dengan Microsoft Visual Studio. Mau tak mau aplikasi yang telah dibuat harus menyertakan .NET dengan versi yang sama, untuk dapat berjalan di komputer pengguna.
4. Kurang Portable
Beberapa aplikasi yang dibuat hampir tidak mungkin untuk di-port ke sistem operasi lain. Pengcualian untuk RAD Tools Lazarus untuk bahasa pemrograman Pascal. Selain gratis program ini juga mampu membuat aplikasi untuk sebagian besar sistem operasi.
5. Masalah Ukuran Program
Berdasarkan analisa penulis, program yang dibuat dengan RAD tools dihasilkan 2 kemungkinan, 1)Uuran lebih kecil. biasanya program mengharuskan penggunanya menginstall framework, misalnya .NET. 2)Ukuran lebih besar. Ada pula yang kebalikannya, program mampu berjalan tanpa framework, namun ukuran program sangat besar.

Itulah beberapa dampak negatif dari penggunaan RAD tools. Meskipun pengembangan aplikasi lebih mudah, jangan pernah melupakan poin-poin penting diatas, karena kemajuan dan perkembangan teknologi dan programming di Indonesia bergantung pada programmernya. hehehe :D
Sekian dari saya, terimakasih :)
Read more

Jumat, 11 April 2014

TCC (Tiny C Compiler), Compiler C Terkecil dan Tercepat


Umumnya pemrograman C menggunakan compiler Visual C++ Compiler, Borland C++ Builder, atau yang paling populer, GCC. Sementara itu, kompilasi menggunakan TCC masih belum dikenal oleh beberapa programmer C. Padahal jika diteliti, kompilasi dengan TCC jauh lebih cepat dibandingkan dengan kompilasi dengan compiler lainnya.

Ukuran TCC sangat kecil, sesuai dengan namanya TCC(Tiny C Compiler). Selain berperan sebagai compiler, TCC juga dapat melakukan linking. Jadi, compiler dan linker berada dalam satu file. Bukan hanya itu, TCC juga dilengkapi dengan assembler internal. Itulah mengapa TCC jauh lebih cepat daripada compiler lainnya. Selain karena dirancang secara minimalis, TCC juga dirancang dengan compiler dan linker yang dijadikan satu.

Menurut http://bellard.org/tcc/, kecepatan TCC jika dibandingkan dengan GCC sebagai berikut.
CompilerTime(s)lines/secondMBytes/second
TinyCC 0.9.22 2.27 859000 29.6
GCC 3.2 -O0 20.0 98000 3.4

Namun sayang sekali, sepertinya development TCC terlihat terganggu saat ini. Tapi, ini bukanlah suatu masalah karena TCC tetap tersedia gratis bagi para programmer C. Bagi kalian yang ingin bereksperimen dengan TCC, silahkan kunjungi link berikut untuk mendownload TCC langsung dari situs developernya :)
http://download.savannah.gnu.org/releases/tinycc/
* Untuk Linux dan Windows
Read more

I Love OpenSuSE :)


Kemarin saya sempat bingung download distro apa. Saya ragu dengan Linux Mint, Ubuntu dan Debian versi baru. Sebelum ini saya sudah pernah menginstall distro-distro tersebut, akan tetapi saya mendapatkan beberapa bug yang sepertinya menjadi ciri khas mereka. Sejauh yang saya lihat di Distrowatch, ketiga distro tersebut akhir-akhir ini selalu berada di urutan teratas, akan tetapi saya masih tetap meragukan mereka.

Pengalaman saya install Ubuntu, semua packages terinstall dengan baik, tampilannya juga oke. Tapi yang saya tidak sukai, setelah menginstall beberapa macam package, beberapa hari kemudian akan muncul pesan error setiap startup. Meskipun bukan berarti sistem rusak, ini terasa mengganggu bagi saya. Masalah lain adalah pengaturan brightness. Walaupun diatur berulang-ulang, tetap saja akan kembali ke brightness semula ketika startup.

Linux Mint oke juga sih. Sebelum menginstall distro ini saya punya pendapat bahwa distro yang diturunkan dari distro yang diturunkan dari distro :D kelihatannya akan lebih mudah bug. Dan, ternyata pendapat saya ini tidak meleset, saya mengalami permasalahan saat instalasi package saat pertama kali mengunakan Linux Mint. Hmmm, padahal belum dibuat apa-apa, tapi sudah bikin kesal.
Selanjutnya Debian. saya menginstall Debian karena banyak yang bilang distro ini adalah yang paling stabil. Secara, saya juga tahu proyeknya juga telah dimulai sejak lama sekali. Huh, tapi ternyata sama saja. Saya memiliki masalah wifi. wireless cardnya tidak bisa terdetksi, padahal saya menginstall versi debian yang paling baru lho. Masalah lain, saya tidak bisa melakukan klik dengan sentuhan pada touchpad, saya harus main klik setiap startup. Meskipun sudah diatur di system settingsnya, setiap startup kembali lagi. Males banget deh...

Nah setelah melihat pengalaman-pengalaman tadi, saya berusaha berpikir keras sebelum memilih distro yang teapt bag saya. Di luar sana ada distro yang stabil tapi tampilannya bagus, ada juga yang tampilannya bagus tapi tak stabil dan ada pula yang dua-duanya atau bukan keduanya :p

Saya memutuskan untuk mencari distro yang bagus sekaligus stabil. Untuk mendapatkan pilihan yang tepat, saya melihat distrowatch. Diantara urutan 1 - 10, saya sibuk mengintrospeksi masing-masing distro untuk melihat kriteria yang cocok dengan keinginan saya. Dari pengamatan ini saya mengambil Fedora 20 dan OpenSuSE 13.1 sebagai bahan pertimbangan. Setelah lama mempertimbangkan, akhirnya saya memilih OpenSuSE 13.1 :)

Itulah awal mula saya memakai OpenSuSE, tepatnya OpenSuSE 13.1 dengan desktop KDE :)

Saya akui tampilan OpenSuSE mulai dari awal(boot) sampai akhir(shutdown) bagus sekali. Saat itu saya belum menemukan bugs. Tapi besoknya, saya menemukan bugs baru, yaitu masalah repository, jadi saya tidak bisa mendownload aplikasi baru :'(
Detail errornya saya lupa, tapi yang jelas ada pesan kira-kira seperti ini :"file '/repodata/repomd.xml' not found on medium"

Hmm, sama seperti pengalaman memakai LinuxMint, kalau begini ceritanya. Saya berpikir-pikir, kenapa saya harus mendownload ISO 4GB kalau hasilnya seperti ini? :v
Karena saya tidak ingin perjuangan saya sia-sia, akhirnya saya mencoba browsing di seluruh penjuru Google :v
Dan akhirnya saya nemu solusi seperti yang dibahas pada thread di bawah ini :
http://forums.opensuse.org/showthread.php/492052-file-repodata-repomd-xml-not-found-on-medium
Mungkin teman-teman yang punya masalah sama seperti saya bisa mengikuti thread itu. :)
bagaimana selanjutnya? Jujur saja, sampai saat ini saya tidak menemukan bugs lain, bahkan saya menemukan banyak hal yang tidak dimiliki oleh distro lain. Yang paling saya sukai, disini ada tema yang lengkap sekali, baik tema ataupun plugin bisa download langsung melalui desktop. Konfigurasi lengkap dan lebih mudah dibandingkan distro lain yang pernah saya coba sebelumnya. Proses konfigurasi yang biasanya memerlukan terminal atau melalui aplikasi eksternal tidak lagi saya temui disini. Selain itu hampir semua aplikasi yang kita butuhkan sudah tersedia disini. Saya rasa, pihak OpenSuSE lebih mengedepankan desktop dibanding sistem, jadi tampilan OpenSuSE terlihat sempurna :D

Bagaimana dengan anda? Apakah anda juga tertarik memakai OpenSuSE atau justru sudah lebih dahulu memakai OpenSuSE daripada saya? :v
Read more

Kamis, 10 April 2014

Cara menjalankan Program 16-bit Pada Windows 64-bit dengan DOSBox


Seperti yang telah saya jelaskan pada postingan sebelumnya, Prosesor tidak dapat menjalankan aplikasi 16-bit pada mode 64-bit, karena Dalam mode tersebut hanya mengizinkan emulasi 32-bit. DOSBox adalah sejenis aplikasi yang bekerja mirip seperti sistem operasi DOS. Dengan aplikasi ini, kita dapat menjalankan aplikasi 16-bit layaknya di sistem operasi DOS.
Untuk menjalankan program melalui DOSBox, ikuti langkah berikut ini.



1. Buat folder di suatu tempat, misalkan di tulisan ini kita membuat folder di drive D, sebut saja "D:\Dosbox\"
2. Masukkan semua program yang akan dieksekusi pada folder tersebut.
3. Buka DosBox
4. Ketik "mount C D:\Dosbox". Untuk memasukkan/mount folder D:\Dosbox sebagai drive C:
5. Ketik "C:" untuk mengubah direktori kerja(current directory).
6. Ketik "dir" untuk menampilkan daftar file yang ada. Dalam hal ini, DOS hanya medukung nama file 11 karakter, sehingga file yang di-mount ke C:\ akan berubah nama aksesnya. Sehingga, command ini berguna untuk mengetahui nama-nama file yang akan kita akses. Contohnya yang harusnya C:\contohprogram.com menjadi C:\contoh~2.com

7. Sekarang tahap eksekusi, caranya cukup ketik nama program sesuai yang ada saat ketika mengeti "dir" tadi.
NB: jika ada anda memasukkan file baru ke D:\Dosbox, saat sudah di mount, file tidak akan langsung terdeteksi oleh dosbox. Solusinya, ketik "mount -u C" untuk meng-unmount folder D:\Dosbox dari drive C, lalu kembali mount dengan cara seperti yang dijelaskan sebelumnya.

Dari eksperimen kali ini, saya mencoba mengeksekusi game Mario for DOS. Dan seperti inilah hasilnya, hehehe :D
Selamat mencoba :)
Read more

Cara Instalasi Compiler GCC Untuk Windows Secara Offline / Manual


Selain di Linux, GCC juga tersedia untuk Windows. Dalam Windows, GCC sering disebut sebagai MinGW (Minimalist GCC for Windows). Untuk melakukan instalasi, MinGW telah menyediakan aplikasi online installer, akan tetapi banyak yang merasa kurang puas dengan installer jenis ini. Alasannya, kecepatan download terkadang sangat lambat dan sering pula terjadi error pada saat koneksi sedang down.
Sebenarnya cara instalasi secara manual sudah dijelaskan (http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite), akan tetapi masih sulit menemukan tutorial lain dalam bahasa Indonesia. Instalasi MinGW ternyata sangat mudah, dengan cara manual, proses instalasi tidak harus bergantung pada koneksi internet, kita juga bisa menggunakan downloader untuk mendownload GCC dengan lebih cepat.
Oke, langsung saa saya jelaskan caranya.
1. Download 7-zip untuk mengekstrak packages (http://www.7-zip.org/download.html)
2. Buat folder untuk menempatkan MinGW, misal dalam tutorial ini kita membuat folder pada C:, "C:\MinGW\"
3. Download packages MinGW terbaru(untuk lebih jelasnya lihat http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite.
Jika anda menginginkan MinGW anda mendukung kompilasi bahasa pemrograman lain, anda juga boleh menambahkan packages berikut ini.
  • gcc-c++ (bin and dev and dll) for C++
  • gcc-objc (bin and dev and dll) for Objective C
  • gcc-fortran (bin and dev and dll) for Fortran 90/95
  • gcc-java (not yet available) for Java
  • gcc-ada (bin and dev and dll) for Ada
4. Ekstak semua packages yang telah anda download ke dalam folder yang telah kita buat tadi. Dalam hal ini kita menggunakan 7-zip, karena 7-zip adalah salah satu archiver yang mendukung format archive LZMA.
5. Masuk Control Panel, cari pengaturan "Advanced System Settings" pada kotak pencarian, lalu buka setting tersebut.

6. Masuk tab "Advanced", klik button "Environment Variables".
7. Cari variabel bernama "Path", setelah itu pilih, lalu klik tombol "Edit..."
8. Tambahkan lokasi folder dimana executable MinGW terinstall. Dalam hal ini, kita menambahkan "C:\MinGW\bin" dalam variabel tersebut. Untuk Menmabahkan, pisahkan setiap nama folder dengan tanda titik koma ";", misalnya dalam komputer saya : %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\MinGW\bin

Oke, sekarang saatnya testing. Buka Command prompt, ketikkan "gcc". Jika Berhasil, akan muncul pesan seperti ini.

Oke, selesai..
Mudah kan? Selamat mencoba :)
Read more

Sabtu, 05 April 2014

Kenapa Program 16-bit Tidak Bisa Berjalan pada Sistem Operasi 64-bit



Mungkin anda merasa kesal dengan Windows, karena program 16-bit yang anda butuhkan tidak dapat dijalankan oleh Windows versi 64-bit. Banyak orang yang telah menerka, hal ini karena Microsoft ingin para penggunanya up to date dan segera meningggalkan program 16-bit. Benarkah hal yang demikian?
Sebenarnya hal ini bukan sepenuhnya salah Microsoft. Ada beberapa hal yang agak rumit untuk dijelaskan, tapi saya akan mencoba menjelaskan sedikit hal yang sudah saya pelajari.

Perlu diketahui prosesor Intel saat ini mendukung 3 mode operasi(operating mode), yaitu :
1. Real mode(16-bit), hanya mampu menjalankan instruksi 16-bit saja.
2. Protected mode(32-bit), dalam mode ini prosesor mampu menjalankan instruksi 32-bit dan mengizinkan sistem operasi untuk mengemulasikan instruksi 16-bit.
3. Long mode(64-bit), prosesor mampu menjalankan instruksi 64-bit serta dapat mengemulasikan instruksi 32-bit. Sementara itu, instruksi 16-bit tidak lagi didukung pada mode ini.

Dari awal perkembangan prosesor Intel, sampai sekarang. Prosesor intel dapat dibagi menjadi 3 jenis prosesor:
1. 16-bit(8086), yaitu prosesor yang hanya mendukung real mode.
2. 32-bit(x86), yaitu prosesor yang mendukung 2 mode(real dan protected)
3. 64-bit(x86-64), merupakan jenis prosesor yang paling baru. Jenis prosesor ini mendukung 3 mode sekaligus! Tapi kenapa aplikasi 16-bit tidak dapat dijalankan?

Berikut adalah penjelasannya..
Sudahkah anda tahu, bahwa komputer berprosesor 16-bit tidak dapat dipasang sistem operasi 32-bit dan 64-bit. Akan tetapi komputer berprosesor 32-bit dapat dipasang sistem operasi 16-bit dan komputer berprosesor 64-bit dapat dipasang sistem operasi 16-bit ataupun 32-bit? Mengapa demikian?

Saat komputer pertama kali dinyalakan, prosesor akan berada dalam real mode, baik prosesor 32-bit ataupun 64-bit. Prosesor hanya akan beralih ke mode lain jika diperintahkan.

Sistem operasi 32-bit dapat berjalan pada prosesor 64-bit karena sistem operasi hanya memberikan instruksi untuk masuk hingga protected mode saja. Sementara itu, sistem operasi 64-bit pada saat boot juga melewati fase real mode, akan tetapi sistem memberikan instruksi ke prosesor untuk masuk ke protected mode dan berlanjut ke long mode. Ingat, long mode tidak mendukung 16-bit. Jadi, intinya, ini bukan salah Microsoft.

Ya, itulah penjelasan internal, kenapa program 16-bit tidak bisa dijalankan pada sistem operasi 64-bit. Bagaimana dengan linux? Linux 32-bit tidak bisa menjalankan program 16-bit. Ini karena memang sejak awal Linux dibuat untuk dapat berjalan pada mode protected mode, jadi Linux sama sekali tidak menyediakan fitur emulasi 16-bit pada protected mode.
Read more