Minggu, 27 Desember 2015

Cara Mempercepat apt-get update, Untuk Kamu yang Punya Kuota Terbatas

 
Saya ingat, saat dulu sekali, saya masih menggunakan modem untuk mengakses internet. Di daerah saya yang masih bisa dibilang pelosok, kecepatan koneksi internet tentu saja masih terbatas, mendapatkan sinyal 3G bukanlah solusi yang mudah dan murah.

Meski sekarang ini saya telah meninggalkan dunia per-modem-an :p dan mulai beralih ke fasilitas wifi kampus, terkadang masalah kecepatan tetap saja menjadi masalah yang tak dapat dihindari. Saya sadar, bukan hanya saya yang suka gratisan.

Masalah ini secara tidak langsung berimbas pada aktivitas keseharian seorang linuxer seperti saya. Apalagi jika linuxer tersebut sering menambah repository eksternal ke dalam daftarnya. Efeknya perintah apt-get update akan memerlukan waktu jauh lebih lama untuk dieksekusi.

Menurut analisa saya, paket translations files adalah yang memerlukan ukuran besar saat proses apt-get update berlangsung. Dan saya yakin, para pembaca disini tidak begitu peduli kegunaannya. Saya pun kurang begitu paham, tapi yang jelas itu tidak begitu penting, toh kita jarang mengubah bahasa tampilan Ubuntu ke dalam bahasa lain. Jadi, FIX, mulai sekarang kita tidak butuh lagi translation files.

Bagaimana mencegah apt-get mendownload translation files/translation indexes?
Menurut link ini, hal tersebut dapat dialkukan dengan mengedit salah satu konfigurasi apt, yaitu konfigurasi file yang bernama 00aptitude. Berikut langkahnya.
1. Buka file konfigurasi sebagai root, bisa dengan gedit, leafpad atau text editor lain.
sudo gedit /etc/apt/apt.conf.d/00aptitude
2. Buat baris baru, lalu tambahkan kode konfigurasi berikut dibawah.
Acquire::Languages "none";

Nah, sekarang coba anda ketikkan perintah apt-get update dan lihat hasilnya :)

Semoga bermanfaat dan selamat berhemat kuota :)
Read more

Sabtu, 26 Desember 2015

Membuat Web Browser Sederhana dengan GTK, Webkit dan C


Masih begitu asing bagi beberapa programmer, ketika mendengar kata Webkit dan GTK. Tapi karena blog ini sudah menyediakan sedikit tutorial pemrograman GTK, maka kita akan mengaitkan tutorial GTK terdahulu dengan webkit. Webkit sudah dikembangkan cukup lama. Menurut Wikipedia, sampai saat ini juga telah digunakan oleh beberapa web browser, seperti safari, opera dan google chrome.

Sudah agak lama webkit melintas di pikiran saya. Namun saya belum terlalu banyak menggalinya lebih jauh. Mengapa? Karena untuk melihat Webkit terinstall di windows tidak mudah. Ini mungkin waktu yang tepat untuk berbagi sedikit tentang WebKit, karena akhir-akhir ini sedang aktif menggunakan sistem GNU/Linux. Meski kita tahu GTK cross-platform, khusus untuk tutorial ini hanya ditujukan untuk programmer GTK yang berkutat di lingkungan sistem Linux saja, karena saya belum menemukan cara praktis untuk menginstall webkit di Windows.

Untuk melihat program GTK tampil dengan widget browser, pertama kita harus menginstall libwebkit2gtk beserta development packages-nya. Disini saya menggunakan distro Ubuntu, pengguna distro lain mungkin harus sedikit mengerahkan keringat untuk bertanya pada mbah google. Sebenarnya webkit ini terinstall otomatis saat saya menginstal development packages untuk GTK, namun untuk memastikannya gunakan perintah berikut.

apt-get install libwebkit2gtk-3.0 -0 libwebkit2gtk-3.0 -dev

Awalnya saya tidak sengaja melihat dokumentasi WebkitGtk terinstall di /usr/share/gtk-doc. Berbekal ini, akhirnya saya mencoba bereksperimen membuat program sederhana dengan memanfaatkan library webkit. Hasil programnya sederhana, tapi jika saya tidak segera menulisnya mungkin suatu saat saya harus membaca dari awal lagi untuk memahami baris kode tersebut, jadi saya putuskan untuk menulis dan membagikannya untuk teman-teman semua

Widget yang disediakan webkit dapat digunakan dengan mudah, selayaknya ketika kita membuat widget GTK pada umumnya. Jadi konsep-konsepnya tentu tidak akan saya jelaskan lagi. Yang saya jelaskan di tutorial ini hanyalah beberapa fungsi yang bisa anda gunakan sebagai eksperimen secara individu.

Kelas terpenting dalam Webkit2GTK adalah WebKitWebView. Kelas ini menyediakan widget untuk digunakan secara sinkon dengan GTK. Untuk membuat widget ini, kita cukup menggunakan fungsi seperti berikut.

GtkWidget *webkit_web_view_new (void);

Fungsi di atas akan membuat sebuah widget WebKitWebView baru, selanjutnya widget tersebut dapat kita tampilkan bersama dengan widget lainnya. Referensi yang berisi daftar API WebKitWebView lain juga bisa diakses di link ini.

Contohnya implementasinya seperti ini.

webkit.c

#include <gtk/gtk.h>
#include <webkit/webkit.h>

int main(int argc, char* argv[]){
    GtkWidget *window, *webkit;
   
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(window, "Browser Webkit");
    gtk_window_set_default_size(window,800,600);
    //membuat widget webkit
    webkit = webkit_web_view_new ();
    //pasang dan tampilkan
    gtk_container_add(GTK_CONTAINER(window), webkit);
    gtk_widget_show_all(window);
    //alamat protokol harus jelas.
    //misal, situs seperti FB, google, harus https://
    webkit_web_view_load_uri (webkit, "http://m.facebook.com");
    gtk_main();
}

Build source dengan perintah berikut.
gcc -o webkit webkit.c `pkg-config --libs --cflags gtk+-3.0 webkit2gtk-3.0`
Saat pertama kali tampil, kita hanya melihat bidang segi empat kosong. Dengan sedikit kreatifitas dan usaha, kita bisa membuatnya menampilkan homepage khusus saat pertama kali tampil. Hmm, tapi saya rasa pemikiran itu masih terlalu jauh untuk saat ini, jadi kita akan memulai semunya dengan membuka sebuah website di widget ini.


void webkit_web_view_load_uri (WebKitWebView *web_view, const gchar *uri);

Parameter uri menentukan alamat yang akan diakses. Penulisannya harus disertakan protokol yang jelas, misalnya http://, https://, ftp://, atau file://. Jika tidak, webkit tidak akan bisa menampilkannya.

Penasaran hasil eksperimen saya seperti apa? Ini dia..

Untuk daftar fungsi yang jelas, silahkan buka dokumentasi WebKit2GTK(link). Disana anda akan mengetahui fungsi-fungsi sederhana, namun tentu saja, powerful. Setelah anda membacanya, anda akan bisa membayangkan gambaran abstrak untuk membuat tombol back-forward-reload, save page, menampilkan progress, dan lain-lain. 
Read more

Selasa, 22 Desember 2015

Cara Mengatasi File sources.list yang Terhapus atau Malformed


Sudah beberapa hari ini saya dibuat pusing oleh tugas laporan. Eh, rupanya itu bukan satu-satunya garam yang harus saya telan mentah-mentah di minggu ini. Rupanya package manager Ubuntu saya mengalami sedikit masalah. Kemarin hari, saya menghapus beberapa file tak penting di sistem saya. Saya sedikit ngawur, antara terburu-buru dan terpaksa. Saya menginstall ubuntu saya di Flashdisk sebagai LiveUSB, dengan bantuan file casper-rw sebesar 1 GB. Sebuah ukuran yang cukup besar, namun dengan ukuran seperti itu saya sering mendapati low disk space saat keadaan genting. Itulah akar dari  masalah yang sedang saya alami.

Saya mulai merasakannya ketika hendak mencoba menginstall aplikasi, tapi tidak ditemukan. Jadi saya coba mengupdate apt.
root@it:/home/it# apt-get update
E: Type 'count=1/>' is not known on line 1 in source list /etc/apt/sources.list
E: The list of sources could not be read.


Singkat cerita, saya mencari tahu ke berbagai situs. Tapi saya kurang dapat menangkap apa permasalahan yang sedang saya alami. Lama kelamaan saya tahu, intinya file /etc/apt/sources.list mengalami malformed, jadi harus diganti. Tapi dimana saya harus mendapatkan pengganti yang tepat?

Teman saya, jarang ada yang pakai sistem GNU/Linux, pun kalau ada, itu teman dunia maya. Apa harus saya tanya satu persatu? Kalaupun ada yang tepat, saya belum yakin cara ini akan berhasil.

Saya akhirnya mencoba mengetikkan keyword "ubuntu 14.04 apt source.list" di Google. Di bagian yang atas, saya menemukan hasil sebuah judul sebuah situs yang agaknya menarik perhatian saya, Ubuntu Sources List Generator.

Caranya sangat mudah, bahkan kita bisa menambahkan beberapa diantara banyak pilihan 3rd parties yang telah disediakan.

Setelah memilih repo, klik Generate List. Maka kita bisa memilih daftar repo default atau daftar repo yang baru saja kita pilih secara bebas. Terakhir, kita hanya perlu menyalin kode itu ke dalam file /etc/apt/sources.list

Ada cara yang lebih mudah, yaitu copy paste command yang tertera diatas kode yang telah di-generate, paste ke terminal dan jalankan. Bentuk kodenya semacam ini.

curl https://repogen.simplylinux.ch/txt/synaptic_de621757bd6034e918084b63f5c88083c7156982.txt | sudo tee /etc/apt/sources.list

Ya, jangan tanya hasilnya. Karena tentu saja akan bilang, sangat memuaskan. :D
Read more

Senin, 21 Desember 2015

Inilah Mengapa Linux Aman dari Virus


Keamanan adalah yang yang terpenting dalam penggunaan komputer. Sistem operasi bukan hanya harus menyediakan layanan prima dan aman, tapi ia juga wajib menjamin keamanan untuk menghindari ancaman dari luar. Salah satu ancaman yang paling sering ditemukan di sistem operasi adalah ancaman dari serangan virus.

Dari sini, timbul sebuah tanda tanya besar, mengapa sebagian besar virus menyerang Windows? Bukan Mac, Ubuntu, Debian, atau yang lain? Inilah jawabannya.

Privilege
Linux memperhatikan betul bagian-bagian penting dalam sistem. Setiap file memiliki atribut yang menentukan siapa saja yang berhak mengakses, memodifikasi dan menghapusnya, jadi tidak sembarang program dapat merusak sistem. Windows sebenarnya juga menerapkan sistem privilege lebih ketat, terutama setelah filesystem NTFS dibuat. Masalahnya, filesystem FAT yang tidak mendukung penerapan atribut file juga masih banyak digunakan.

Executable bit
Filesystem FAT masih menjadi filesystem yang digunakan pada sebagian besar flash disk. Selanjutnya fakta ini memberikan nilai tambah pada untuk sistem Linux. Program yang akan dijalankan pada sistem Linux harus memiliki atribut executable bit, sedangkan kita tahu bahwa FAT tidak mendukung penggunaan atribut, bahkan NTFS sendiri tidak menyediakan atribut executable bit untuk Linux, karena memang desainnya dikhususkan untuk Windows.

Diversitas Sistem
Sistem Linux memiliki varian yang tak terhitung jumlahnya, mulai dari Debian, Ubuntu, Mint, Slax, hingga Tiny Core Linux. Varian-varian tersebut memiliki subsistem yang berbeda dan standarisasinya pun tidak ada. Jadi setiap pengembang bebas mendesain sistemnya seperti yang dia inginkan. Semua Windows dapat menjalankan program saat startup melalui informasi registry dan semua versi Windows semikian. Hal ini berbeda dengan Linux, berbeda varian bisa jadi memiliki cara tersendiri untuk membuat program berjalan otomatis saat startup.
Contoh lain, jika kita membuka My Computer pasti kita menemukan beberapa drive letter, antara A - Z. Tapi di Linux tidak. beberapa sistem melakukan mount disk di folder /mnt, lalu beberapa varian yang lain sering kali ditemukan melakukan hal yang berbeda.

Autorun
Sebagian besar cara penyebaran yang efektif bagi virus adalah autorun. Sistem linux sama sekali tidak tahu apa itu autorun.inf, ia akan memperlakukannya seperti file biasa. Bahkan jika anda mau, anda boleh mencoba double-click program virus dalam flashdisk tersebut secara langsung. :p

Programmer yang Baik
Tahukah Anda, Kernel linux, beserta program-program di dalamnya 99%(perkiraan saja) merupakan buatan programmer sukarela, mereka tidak mengharapkan imbalan sepeserpun. Bisa jadi sebagian besar pengguna Linux adalah kontributor yang mengembangkan beberapa program untuk sistem Linux.

Pasar Sistem Operasi
Diantara sekian banyak sistem operasi yang ada di dunia, Windows sampai saat ini masih mendominasi di urutan pertama. jenis perangkat lunak yang digunakan sebagian besar sama, jadi ini sangat potensian untuk perkembangan virus.

Itulah beberapa alasan yang saya tulis berdasarkan perspektif saya sendiri. Tentunya dengan pengamatan dari fakta yang ada, bukan sekedar ngawur. Namun tentunya dalam penulisan ini masih banyak ditemukan salah kata. Jadi saya akan mencoba terbuka menerima masukan dari anda.
Read more

Minggu, 20 Desember 2015

Membuat Shared Library


Tutorial ini untuk programmer Linux. Programmer Windows mungkin harus baca tentang Dynamic Link Library di link ini.

Jika di Windows kita mengenal file DLL(Dinamic Link Library), maka di Linux kita mengenal file serupa, yang disebut shared library. Dalam shared library biasanya diisi fungsi-fungsi penting yang bisa digunakan oleh program. Penggunaan shared library selama ini dikenal sangat berguna dalam arsitektur sistem pada masa kini.

Saya telah sekian lama mengamati, programmer di Indonesia terlalu serius mempelajari bagaimana membuat program, tanpa mempelajari seluk-beluknya. Program yang dibuat umumnya hanya single executable. Atau, jika tidak begitu, paling tidak mereka telah mencoba menggunakan library eksternal yang dihadirkan bersama program mereka.

Tidak mengherankan jika kontribusi Indonesia dalam dunia pengembangan software tidak begitu nampak. Hal ini karena programmer Indonesia kurang aktif mengembangkan hal yang dapat bermanfaat bagi orang lain, salah satunya library. Meskipun kita selama ini hanya aktif dalam mengembangkan program, akan lebih baik jika mulai sekarang kita memisahkan sebagian kode dan membutnya dalam bentuk library. Selanjutnya bagikan library tersebut untuk programmer lain.

Apa gunanya?
Kenapa kita harus membuat shared library. Dari perspektif saya, saya dapat membedakan 2 alasan seseorang dalam membuat shared library, yaitu:
1. Memiliki lebih dari 1 proyek software. Dengan membuat libary yang sama untuk setiap program yang berbeda akan membuat pengembangan setiap proyek semakin mudah.
2. Ingin berbagi dengan programmer lain. Contoh proyek aplikasi yang turut membagikan librarynya adalah adalah eSpeak, VLC dan FFMPEG. Namun jika diamati lebih jauh, umumnya alasan ini hanya brorientasi untuk pengembangan library saja, contohnya SQLite dan MPG123.

Membuat Shared Library
Membuat shared library tidak jauh berbeda dengan membuat program biasa, hanya saja ada beberpa hal yang perlu diperhatikan dan diketahui. Pertama-tama kita harus membuat kumpulan fungsi library dalam source code, pisahkan deklarasi struct, typedef, include dan buat deklarasi prototype semua fungsi ke dalam sebuah file header. Format file header sebaiknya dibuat seperti ini.
#ifndef __MYLIB_H__
    #define __MYLIB_H__
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     //Tulis header disini
    #ifdef __cplusplus
    }
    #endif
#endif


Penjelasannya adalah sebagai berikut,
di bagian paling atas kita harus memeriksa apakah header ini sudah di-include. Tujuannya adalah agar tidak terjadi kesalahan karena header di-include lebih dari satu kali secara tidak sengaja.
#ifndef __MYLIB_H__
    #define __MYLIB_H__
    ...
#endif


Selanjutnya, anda perlu tahu bahwa kode ini ditulis khusus untuk C, sehingga jika digunakan pada C++, kita harus mengapit kode seperti ini.
extern "C"
{
    ...
}


Tapi kita tidak ingin repot. Kita tidak ingin membuat library dengan 2 syntax yang berbeda. Jadi kita gunakan saja direktif agar compiler menentukan sendiri apakah baris kode seperti diatas perlu disertakan atau tidak. Direktifnya seperti ini.
    #ifdef __cplusplus
    extern "C"
    {
    #endif
        …
        …
    #ifdef __cplusplus
    }
    #endif


OK, kita sudah tahu bagaimana membuat header. yang baik. Sekarang kita hanya tinggal menulis beberapa baris kode untuk membuat shared library kita yang pertama.
 
mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
#ifdef __cplusplus
extern "C"
{
#endif

typedef struct{
    int a;
    int b;
} ab;

void set_a(ab*, int);
void set_b(ab*, int);
int get_ab(ab*);
void print_ab(ab*);

#ifdef __cplusplus
}
#endif
#endif


mylib.c
#include <stdio.h>
#include "mylib.h"

void set_a(ab *s, int num){
    s->a = num;
}

void set_b(ab *s, int num){
    s->b = num;
}

int get_ab(ab* s){
    return s->a + s->b;
}

void print_ab(ab* s){
    int total = s->a + s->b;
    printf("A + B = %d\n", total);
}


build source tersebut menjadi library dengan perintah seperti ini.
gcc -shared -o mylib.so mylib.c

Menggunakan Shared Library dalam Program
Shared library yang sudah jadi bisa digunakan dengan mudah, hanya dengan meng-include header, sebelum menggunakan fungsi-fungsi di dalamnya. Contohnya seperti ini.

mylib_test.c
#include "mylib.h"

ab mydata;

int main()
{
    set_a(&mydata,10);
    set_b(&mydata,5);
    print_ab(&mydata);
}


build source code demonstrasi ini dengan perintah berikut.
gcc -o mylib_test mylib_test.c mylib.so

Hasil
Windows secara otomatis mencari shared library DLL di folder program dan folder system. Namun, di sistem linux, shared library harus berada dalam direktory /lib. Jadi, sebelum menjalankan mylib_test, copy mylib.so ke dalam folder /lib.
cp mylib.so /lib/mylib.so

Dan, beginilah hasilnya ketika kita mengeksekusinya dari terminal :)
it@it:~$ ./mylib_test
A + B = 15
it@it:~$


Sudah, mudah bukan? sekarang pilihan anda untuk memnentukan apakah library yang anda buat harus dibagikan ke orang lain secara open source atau closed source. Itu pilihan anda, tapi, sebelum berpikir jauh kesana, mungkin anda perlu membuat library dulu :D
Read more

Sabtu, 19 Desember 2015

Perbedaan Prosesor CISC dan RISC


Intel merupakan salah satu contoh prosesor berarsitektur CISC(Complex Instruction Set Computer). Arsitektur CISC cenderung memiliki karakteristik instruksi yang lebih banyak dan panjang setiap instruksinya berbeda beda, mulai dari 1 byte hingga 12 byte, bahkan lebih. Suatu arsitektur prosesor bisa digolongkan dalam CISC apabila sebuah instruksi mampu mengerjakan lebih dari satu operasi dasar, yang meliputi pembacaan data dari memori, melakukan operasi aritmatika dan logika dan menyimpan data ke dalam memori. Hal ini berbeda dengan arsitektur RISC(Reduced Instruction Set Computer). Arsitektur RISC menyediakan instruksi dalam bentuk yang sederhana dan pada umumnya operasi yang dilakukan register-to-register. Arsitektur RISC menyediakan instruksi sederhana yang mana semua instruksi selalu memiliki panjang yang sama. Misalkan pada prosesor MIPS, semua hasil assembly instruksinya masing-masing akan selalu berukuran 4 byte. Perbedaan lebih jelas bisa dilihat pada operasi penjumlahan antara intel dan MIPS berikut.




Instruksi Intel
add [mydata],0x100
Instruksi MIPS
lw $t1,mydata
addiu $t2,$t1,0x100
sw $t2,mydata

Prosesor Intel mendukung operasi akses memori pada hampir semua instruksinya. Sementara itu, prosesor MIPS dan prosesor RISC lainnya hanya dapat menggunakan register. Untuk mengakses memori, prosesor menyediakan instruksi load untuk membaca data dari memori ke register dan store menyimpan data dari register ke memori.

Prosesor CISC akan cenderung lebih mudah dipelajari assemblynya, karena beberapa alasan, pertama instruksinya lebih mudah dimengerti dan praktis untuk ditulis, jumlah register lebih sedikit dibandingkan prosesor arsitektur RISC membuatnya mudah untuk dihafalkan, prosesor RISC hanya berfokus pada simplifikasi desain prosesor dan compiler, namun arsitektur CISC lebih fokus pada penyediaan fungsi abstraksi operasi tingkat tinggi di tingkat assembly. Secara garis besar kita bisa mengatakan bahwa CISC bersifat programmer oriented, sedangkan RISC lebih kepada hardware oriented.
Jika melihat lebih dalam lagi, masih ada banyak perbedaan yang bisa ditemukan. Prosesor CISC memiliki waktu eksekusi instruksi yang berbeda, tergantung pada jenis instruksi dan addressing mode yang digunakan. Hal ini secara langsung memaksa pengembang arsitektur untuk menetapkan algoritma pipelining yang tepat, karena waktu eksekusi berbeda-beda, tentu saja akan semakin rumit. Hal ini berbalik dengan arsitektur RISC. Instruksi yang sederhana membuat pengembang mudah menetapkan waktu eksekusi instruksi, setiap instruksi memiliki waktu eksekusi seragam dan algoritma yang diterapkan untuk pipelining pun sederhana.
Read more