Source Code dan logika untuk Konversi Angka Biner, Oktal, Desimal dan Hexadesimal pada Bahasa C

Kemarin malam iseng iseng melanjutkan program bahasa C untuk melakukan konversi angka antar basis dan vice versa. Pada program ini, Anda bisa memasukan bilangan biner, oktal, desimal atau hexadesimal dan nanti akan muncul angka konversinya. Saya menulis program ini untuk latihan lagi setelah beberapa bulan gak megang pemrograman dan kebetulan mau belajar mikrokontroller yang banyak menggunakan angka hexa dan biner.

Untuk informasi saja, biner adalah sistem penomoran berbasis 2, oktal berbasis 8, desimal berbasis 10 dan hexa berbasis 16. Pun begitu, angka maksimum penulisan adalah basis – 1, karena penulisan angka dimulai dari 0 hingga basis-1. Lebih lanjut: http://id.wikipedia.org/wiki/Sistem_bilangan

Screenshot program

Screenshot from 2014-08-12 08:05:13Gambar 1. Ketika program mulai di eksekusi

Screenshot from 2014-08-12 08:05:47Gambar 2. Ketika memilih hexadesimal dan output yang diberikan

Source Code:

#include <stdio.h>
#include <string.h>
 
void welcome() {
        printf("Selamat datang di Basis Angka Konverter");
        printf("\nby tegar (http://about.me/tegarimansyah)");
}

void cls() {
	int i;
	for (i=0;i<100;i++) {
		printf("\n");
	}
}

void biner(int n) {
    if (n > 0) {
        biner(n/2);
        printf("%d",n%2);
    }
}
 
int pangkat(int n,int x) {
    int nilai=1,i;
    for (i=0;i<x;i++) {
        nilai=nilai*n;
    }
    return nilai;
}

int cekdesimal(int x) {
    //checking
    if (x < 0)    { //no minus
        return 1;
    }
    //end of checking, all is right
    return 0;
}

int cekbiner(char str[],int *x) {
    int i,dec = 0;
    
    //checking
    for (i = 0; i < strlen(str); i++)
    {
        if ((str[i] - '0' != 1 ) && (str[i] - '0' != 0))
        {
            return 1;
        }
    }
    //end of checking, all is right
    
    for (i =0; i <  strlen(str) ; i++)
    {
        if (str[i] - '0' == 1) {
            dec = dec + pangkat(2,strlen(str)-1-i);
        }
    }
    *x = dec;
    return 0;
}

int cekoktal(char str[],int *x) {
    int i,dec=0;
    
    //checking
    if ((strlen(str) >= 6) && (str[0] > 49)) {
        return 1;
    }
    
    for (i = 0; i < strlen(str); i++)
    {
        if (!((str[i] > 47 ) && (str[i] < 56)))
        {
            return 1;
        }
    }
    //end of checking, all is right
    for (i =0; i <  strlen(str) ; i++)
    {
        dec = dec + (str[i] - '0') * pangkat(8,strlen(str)-1-i);
    }
    *x = dec;
    return 0;
}

int cekhexa(char str[],int *x) {
    int i,dec=0;
    
    //checking
    for (i = 0; i < strlen(str); i++)
    {
        if (! ( ((str[i] > 47 ) && (str[i] < 58)) || ((str[i] > 96 ) && (str[i] < 103)) || ((str[i] > 64 ) && (str[i] < 71)) ))
        {
            return 1;
        }
    }
    //end of checking, all is right
    for (i =0; i < strlen(str) ; i++)
    {
        if ((str[i] >= '0' ) && (str[i] <= '9')) {
            dec = dec + (str[i] - '0') * pangkat(16,strlen(str)-1-i);
        }
        else if ((str[i] > '@' ) && (str[i] < 'G')) {
            dec = dec + (str[i] - 55) * pangkat(16,strlen(str)-1-i);
        }
        else if ((str[i] > 96 ) && (str[i] < 'g')) {
            dec = dec + (str[i] - 87) * pangkat(16,strlen(str)-1-i);
        }
    }
    *x = dec;
    return 0;
}

int main() {
    int x,dec;
    char oct[6],bin[16],hex[4];
    welcome();
    while(1) {
    printf("\n\n===============================\nBasis Angka Masukan\n1. Desimal\n2. Biner\n3. Oktal\n4. Heksadesimal\nChoose: ");
    scanf("%d",&x);
    switch(x) {
        case 1:
                    printf("Masukan angka desimal (Maksimal 65535): ");
                    scanf("%d",&dec);
                    if(cekdesimal(dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Biner: ");
                    biner(dec);
                    printf("\nOktal: %o",dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 2:
                    printf("Masukan angka biner (Maksimal 16 bit): ");
                    scanf("%s",bin);
                    if(cekbiner(bin,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("\nDesimal: %d",dec);
                    printf("\nOktal: %o",dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 3:
                    printf("Masukan angka Oktal (Maksimal 177777): ");
                    scanf("%s",oct);
                    if(cekoktal(oct,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Desimal: %d",dec);
                    printf("\nBiner: ");
                    biner(dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 4:
                    printf("Masukan angka hexa (Maksimal FFFF): ");
                    scanf("%s",hex);
                    if(cekhexa(hex,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Desimal: %d",dec);
                    printf("\nBiner: ");
                    biner(dec);
                    printf("\nOktal: %o",dec);
                    break;
        default: printf("Not Present");
    } //end case
    } //end loop
    return 0;
} //end main

Programnya masih dapat dipadatkan lagi, tapi karena kemarin sedang malas malasnya ngoding jadinya ya berantakan seperti itu. Terkompilasi tanpa error dan warning pada gcc 4.6.3 di Ubuntu Linux 12.04 kernel 3.11.0-15-generic.

Penjelasan Program

Untuk melakukan konversi dapat dibilang sangat sederhana. Cuma dibutuhkan sedikit imajinasi untuk meminta input berupa hexa, oktal dan biner. Pada program tersebut, jika user meminta konversi dari hexa, oktal atau biner maka input berupa string ( %s ), bukan integer ( %d ). Disana pun telah disediakan variabel untuk menyimpan bilangan dalam bentuk string ( dan ini seharusnya bisa lebih di singkat, boros banget mendeklarasi string sebesar itu).

Terdapat beberapa fungsi yang dibuat, yang pertama adalah void welcome() yang hanya dipanggil sekali (tidak dimasukkan looping) saat aplikasi mulai dijalankan. Setelah itu fungsi void cls() yang sepertinya tidak digunakan karena saya berubah pikiran untuk melakukan penghapusan layar, jadi fungsi ini bisa dihapus.

Setelah itu fungsi void biner(int n). Dikarenakan melakukan konversi desimal ke biner tidak dapat dilakukan dengan specifier (seperti %d, %X, %o) maka kita dapat menggunakan cara menemukan angka biner ke desimal seperti yang diajarkan pada dulu jaman sekolah. Pada program ini terdapat rekursif fungsi, yaitu memanggil diri dia sendiri hingga kondisi tidak terpenuhi. Rekursif ini saya panggil diatas printf agar penulisan biner tidak terbalik.

Nah selanjutnya fungsi int pangkat(int n. int x). Sebenarnya ini hanya fungsi yang mengembalikan nilai yang sama dengan n pangkat x. Entah kenapa saya lebih suka membuat fungsi sendiri dari pada memanggil header math.h. Pangkat ini cukup dibutuhkan untuk melakukan konversi ke bilangan desimal.

Selanjutnya int main(). Ya, program utama ini hanya berisi looping dan switch case yang memanggil fungsi lainnya. Looping saya gunakan infinite loop sehingga hanya dapat ditutup dengan menekan close pada terminal atau signal interupt (ctrl+c).

Nah, sengaja saya lewatkan untuk funsi cekdesimal, cekbiner, cekoktal dan cekhexa. Pada cekdesimal, saya hanya mensyaratkan nilai tidak boleh negatif. Pada lainnya, ada setidaknya dua tugas yang harus dikerjakan yaitu mengecek apakah penulisan benar dan tidak melebihi 16 bit serta tugas kedua untuk melakukan konversi dari string yang ada ke bilangan desimal terlebih dahulu. Setelah terkonversi, bilangan desimal tersebut dikirim ke variabel dec melalui alamat pointer.

Sudah selesai, mungkin ada yang ditanyakan? Pengembangan terhadap kode ini terbuka secara bebas.

Advertisements

Motion Detection menggunakan webcam di ubuntu 12.04

Hari ini iseng iseng saya membongkar “kotak penyimpanan” saya. Ternyata ada satu buah webcam usb yang diberikan ayah saya beberapa bulan yang lalu. Hmm, diapakan ya?

Saya pun terpikirkan untuk membuat sebuah motion detection yang terinspirasi dari video ini

Kegunaan motion detection ini bisa difungsikan sebagai:

  • CCTV portable
  • Video Time Lapse ( walau agak maksa sih)

Di karenakan raspberry ku sedang digunakan untuk proyek lain, aku pun mencoba menggunakan komputerku yang terinstall ubuntu 12.04. Yang aku butuhkan hanya usb webcam dan usb expander ( yang buat usb menjadi panjang). IMG_20140603_134252 IMG_20140603_134258 IMG_20140603_191857

Cara membuatnya pun cukup mudah.

  1.  Pastikan webcam yang anda gunakan dapat dibaca oleh komputer anda. Coba gunakan perintah
    gstreamer-properties

    pilih video dan lakukan test pada input. Jika terjadi error, maka gantilah pilihan device.
    Screenshot from 2014-06-03 13:09:45Screenshot from 2014-06-03 13:10:05

  2. install motion
    sudo apt-get install motion
  3. buat directory (hidden) motion dan copy file configurasi dari motion
    mkdir .motion
    sudo cp /etc/motion/motion.conf ~/.motion/motion.conf
  4. ubah lah konfigurasi sesuai kebutuhan yang telah dicopy tadi.
    sudo gedit .motion/motion.conf
  5. mungkin yang akan diubah hanya pada pilihan
    width
    height
    framerate
    treshold
    target_dir
  6. selesai. Jalankan dengan menggunakan peritah
    sudo motion

    Screenshot from 2014-06-03 19:26:00

  7. jika terdapat error
    [1] Failed to open video device /dev/video0: No such file or directory

    kembali ke motion.conf dan cari videodevice. Ubah video0 menjadi yang sesuai dengan yang ada pada gstreamer-properties bagian pipeline

Nah sudah selesai, sekarang saya sedang mencari bagaimana cara menggabungkan banyak foto tersebut menjadi satu buah video yang bagus. Mungkin openshot bisa menjadi jawabannya.

Referensi:

http://ubuntuforums.org/showthread.php?t=2022316

Back In Time, system restore pada Ubuntu 12.04

Back in Time adalah aplikasi backup yang cara kerjanya mirip dengan system restore pada Microsoft Windows. Si pembuat mengatakan

Keep in mind that Back In Time is just a GUI. The real magic is done by rsync (take snapshots and restore), diff (check if somethind changed) and cp (make hardlinks).

Ohh, ternyata dia memanfaatkan fungsi rsync, diff dan cp.

Langsung saja cara menginstallnya. Saya pertama mencoba menggunakan tutorial yang ada di internet salah satunya http://www.ubuntugeek.com/back-in-time-a-simple-backup-tool-for-ubuntu.html yaitu dengan menambah repository deb http://le-web.org/repository stable main tetapi gagal. Hal tersebut dikarenakan link repository tersebut sudah diganti dengan si pembuatnya.

Lalu saya mencoba mengunjungi dokumentasi Back in time (http://backintime.le-web.org/) dan mendapat link launchpad (repository ppa pada ubuntu) https://launchpad.net/~bit-team/+archive/stable.

Lalu saya coba menambahkan repo tersebut

sudo add-apt-repository ppa:bit-team/testing && sudo apt-get update

lalu kita install Back in time. Kita cukup menginstall backintime-common. Tetapi jika ingin tampilan GUI, kita bisa juga menambahkan backintime-gnome atau backintime-kde. Karena saya pengguna gnome jadi yang saya lakukan adalah

sudo apt-get install backintime-common backintime-gnome

Ini untuk yang ingin menggunakan secara CLI

tegar@IBM-T60:~$ backintime -h

Back In Time
Version: 1.0.17

Back In Time comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type `backintime --license' for details.

Options
--profile <profile name>
 Select profile (use it before other options)
--profile-id <profile id>
 Select profile by id (use it before other options)
-b | --backup
 Take a snapshot (and exit)
--backup-job
 Used for cron job: take a snapshot (and exit)
--snapshots-path
 Show the path where is saves the snapshots (and exit)
--snapshots-list
 Show the list of snapshots IDs (and exit)
--snapshots-list-path
 Show the paths to snapshots (and exit)
--last-snapshot
 Show the ID of the last snapshot (and exit)
--last-snapshot-path
 Show the path to the last snapshot (and exit)
--keep-mount
 Don't unmount on exit. Only valid with
 --snapshots-list-path and --last-snapshot-path.
--unmount
 Unmount the profile.
--benchmark-cipher [file-size]
 Show a benchmark of all ciphers for ssh transfer (and exit)
-v | --version
 Show version (and exit)
--license
 Show license (and exit)
-h | --help
 Show this help (and exit)

Atau yang gui juga sudah ada di dash (backintime-gnome)

Screenshot from 2014-05-28 08:39:20

NB: Saya melihat di web launchpad bahwa versi teranyar adalah precise, jadi kemungkinan pengguna 12.10 keatas tidak bisa menggunakan repository tersebut. Cara lainnya bisa download source code-nya (http://backintime.le-web.org/download_page/) dan lakukan compile ( persiapan dan cara compile source code bisa di baca disini )

Penggunaan

Oh iya, ada dua mode di Back in Time, yaitu mode user dan root (dengan sudo). Perbedaannya adalah user hanya bisa membackup yang ia kuasai (biasanya hanya /home/<nama user>) tetapi root bisa ke seluruh sistem.

Untuk menggunakan GUI dengan user root, kita menggunakan perintah

gksu backintime-gnome

Jangan lupa tulisan gnome / kde nya ya. Saya beberapa menit bingung karena tampilan GUI tidak muncul 😀

Screenshot from 2014-05-28 09:07:42

Pertama kita harus membuat profile terlebih dahul seperti mau disimpan dimana, folder apa yang akan di backup dan sebagainya. Saya menyarankan untuk men-exclude-kan folder /home dan /media.

Setelah selesai, tekan take snapshot dan selamat menunggu 🙂

Google Translate pada Terminal Ubuntu

Google translate adalah salah satu (atau bahkan terdepan) dalam bidang menterjemahkan kata kata. Tetapi terkadang kita malas untuk membuka web browser dan masuk ke halaman website google  translate karena mungkin koneksi internet.

Kita harus berterima kasih kepada Hristo Hristov atas jasanya membuat skrip google translate CLI. Keuntungan kita menggunakan CLI dari pada google translate pada browser adalah CLI dapat dibuka jauh lebih cepat dari pada browser dan tidak perlu me-load tampilan google translate.

Cara Menginstall

Skrip ini hanya membutuhkan 1 dependencies yaitu Gnu AWK ( gawk) cukup install dengan

sudo apt-get install gawk

Setelah itu kita fork project ini dari github ke komputer kita dan menginstallnya

$ git clone git://github.com/soimort/google-translate-cli.git
$ cd google-translate-cli/
$ make instal

Proses instalasi selesai, kamu boleh menghapus folder google-translate-cli tadi

$ cd ..
$ rm -rf google-translate-cli/

Cara Menggunakannya

Gunakan perintah trs untuk melihat cara penggunaannya

$ trs
Usage: translate {[SL]=[TL]} TEXT|TEXT_FILENAME
       translate {[SL]=[TL1]+[TL2]+...} TEXT|TEXT_FILENAME
       translate TEXT1 TEXT2 ...

TEXT: Source text (The text to be translated)
      Can also be the filename of a plain text file.
  SL: Source language (The language of the source text)
  TL: Target language (The language to translate the source text into)
      Language codes as listed here:
    * http://developers.google.com/translate/v2/using_rest#language-params
      Ignore the code where you want the system to identify it for you.
      Prefix the code with an ampersat @ to show the result phonetically.

Jadi kita harus melakukan ini jika ingin mentranslate dari indonesia ke inggris

$ translate {[id]=[en]} "selamat pagi"
good morning

Atau bisa juga dari sebuah file

tegar@IBM-T60:~$ echo "selamat pagi" > translate
tegar@IBM-T60:~$ translate {[id]=[en]} translate 
good morning

Mudah bukan? Anda bisa juga menggunakan alias pada .bashrc untuk mempersingkat perintah yang diminta. Oh ya, anda harus terhubung dengan internet untuk dapat menggunakan google translate ini.

Semoga bermanfaat

Baca lebih lanjut: https://github.com/soimort/google-translate-cli

Melakukan persiapan sebelum melakukan compile source code di ubuntu

Selama berhari hari ini pusing melakukan proses compile driver modem wifi. Walaupun sampai sekarang belum bisa digunakan karena belum mencoba lagi, setidaknya saya akan share apa saja yang harus di persiapkan sebelum melakukan compilling.

Compiling dilakukan ketika kita mendownload aplikasi yang berformat .tar.gz atau .tar.bz2 dimana tidak ada file yang dapat langsung di eksekusi. File tersebutlah yang akhirnya kita sebut source-code (ingat? kita berada di dunia opensource). Kebanyakan pengguna mengatakan caranya mencompile adalah dengan 3 perintah sakti yaitu

./configure
make
sudo make install

Lalu apakah kebanyakan newbie berhasil melakukan compile? Saya rasa tidak ( karena saya newbie dan saya tidak berhasil). Kita membutuhkan beberapa paket baik compiller maupun dependencies. Paket pertama yang harus di install adalah build-essential yang berisi berbagai macam compiler yang kita butuhkan. Lalu checkinstall untuk membuat aplikasi yang dicompile dapat terintegrasi dengan paket manajer. Yang lainnya adalah untuk mendukung fasilitas yang dibutuhkan saat proses compiling nanti seperti cvs , subversion , git-core , mercurial.

Read More »

Mudah menggunakan pastebin dengan aplikasi CLI di Ubuntu

Pastebin adalah sebuah website yang cukup populer dimana semua orang bisa menyimpan sebuah teks. Penggunaan teks bisa bermacam macam, entah catatan, pesan error, code pemrograman, copy paste text dan sebagainya. Pastebin sendiri dapat digunakan baik sebagai guest atau akun yang telah terdaftar, jadi dapat dengan mudah melakukan copy paste teks. Saya sendiri sering menggunakan pastebin untuk membantu memandu pemrograman teman yang berada di tempat yang jauh.

Website pastebin dapat dikunjungi di http://pastebin.com . Adapun website yang memiliki fungsi yang sama adalah http://paste.ubuntu.com , http://paste.debian.net , http://pastebin.mozilla.org , http://pastebin.ca , http://slexy.org , http://yourpaste.net .

Kelemahan dari website diatas adalah adalah kita harus membuka browser terlebih dahulu untuk menyimpan hasil copy-paste. Tetapi sekarang kita bisa dengan mudah menggunakan terminal untuk menyimpan hasil copy-paste tersebut. Caranya dengan menginstal pastebinit (Pastebin It)

sudo apt-get install pastebinit

Cara Penggunaan

Read More »

Mengatasi Ubuntu Wired Connection: Device not managed

Tiba tiba saja komputer yang terhubung dengan kabel lan tidak bisa terkoneksi pada internet. Pada network manager tertulis Device not managed. Ada apa?

f5fPL

Langsung saja saya googling dan menemukan jawabannya disini dengan mudah : http://askubuntu.com/questions/71159/network-manager-says-device-not-managed

ZIlj0

 

NB: Gambar saya ambil dari sumber solusi, karena tadi tidak sempat membuat screenshot

Solusi:

Masuk ke terminal (ctrl+alt+T) lalu ketikan

sudo nano /etc/NetworkManager/NetworkManager.conf

Nano dapat kamu ubah dengan gedit atau yang lainnya. Lalu ketikan pada baris managed ubah dari false ke true

 

<em style="color: #333333;">managed=true<span style="font-style: normal;">

 

Save dan lakukan restart network manager

sudo service network-manager restart

====================

Sekian solving saat ini, semoga dapat membantu.