Sabtu, 28 November 2015

Mengenal Kerumitan Komputer dengan FUSE

Filesystem in Userspace (FUSE) merupakan mekanisme sistem operasi untuk sistem
operasi Unix-like yang memungkinkan pengguna tidak ber-hak istimewa menciptakan file
system mereka sendiri tanpa mengubah kode kernel. Hal ini dicapai dengan menjalankan
kode file system di userspace, sedangkan modul FUSE hanya menyediakan "jembatan"
untuk antarmuka kernel yang sebenarnya.




Module kernel FUSE dan FUSE library berhubungan melalui sebuah special file descriptor
yang didapatkan dengan membuka /dev/fuse. FUSE kernal module meneruskan request
ke aplikasi fuse anda. aplikasi anda memerintahkan fuse cara menjawab request. FUSE
kernal module dan FUSE library berkomunikasi lewat file deskriptor spesial yang diperoleh
dengan membuka /dev/fuse. file ini dapat terbuka berkali-kali dan file deskriptor yang
diperoleh diteruskan ke mount syscall, untuk menyesuaikan deskriptor dengan filesystem
mount.


Nggak ngerti? Singkatnya FUSE adalah suatu source code di mana dengan source code itu kita bisa nge-mount suatu folder ke dalam direktori system (yang seharusnya nggak bisa diutak-atik).  Berikut ini adalah komponen-komponen penting dalam FUSE.


1.  Alamat direktori yang ingin di-mount
***
Tentunya harus ada alamat folder yang akan di-mount. Alamat ini bersifat absolut alias tidak relatif. Source codenya seperti di bawah ini :

static const char *dirpath = "/home/laily/Documents";

2. Fungsi get attribut
***
Fungsi ini bertujuan untuk mendapat info-info penting mengenai direktori, seperti kapan dibuatnya, ukuran, kapan terakhir di-update, dan sejenisnya.
Source codenya seperti di bawah ini :

static int xmp_getattr(const char *path, struct stat *stbuf)
{
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
   
    res = lstat(fpath, stbuf); 
    if (res == -1)
        return -errno;

    return 0;
}

3. Fungsi getdir
***
Fungsi ini bertujuan untuk mendapatkan direktori-direktori yang ada di dalam direktori yang di-mount.
Source codenya seperti di bawah ini :

static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
    DIR *dp;
    struct dirent *de;
    int res = 0;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    dp = opendir(fpath);
    if(dp == NULL)
        return -errno;
   
    while((de = readdir(dp)) != NULL)
    {
        res = filler(h, de->d_name, de->d_type);
        if(res != 0)
            break;
    }

    closedir(dp);
    return res;
}

4. Fungsi read
***
Fungsi ini digunakan untuk membaca setiap file yang ada di dalam direktori yang di-mount. Tujuannya adalah untuk meng-copy isi file agar dapat dibuat di dalam direktori mount.
Source codenya seperti di bawah ini :

static int xmp_read(const char *path, char *buf, size_t size, off_t offset)
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
   
    fd = open(fpath, O_RDONLY);  

    if(fd == -1)
        return -errno;
 
    res = pread(fd, buf, size, offset);
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}

5. Fungsi makenode
***
Fungsi ini digunakan untuk membuat sebuah node kosong tanpa ekstensi yang nantinya dapat diisi oleh isi-isi yang telah di-copy ketika fungsi read sebelumnya.
Source codenya seperti di bawah ini :

static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = mknod(fpath, mode, rdev);
    if(res == -1)
        return -errno;

    return 0;
}

6. Fungsi chmod
***
Seperti pada linux biasanya, fungsi ini digunakan untuk mengubah mode file, tentunya ini hal yang sudah umum bahwa mode dapat diubah agar semua user dapat mengakses dengan menggunakan "chmod 777"
Source codenya seperti di bawah ini :

static int xmp_chmod(const char *path, mode_t mode)
{
    int res;

    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = chmod(fpath, mode);
    if(res == -1)
        return -errno;

    return 0;
}

7. Fungsi write
***
Fungsi ini menuliskan isi-isi yang sudah di-copy ketika fungsi read dijalankan, ke dalam node-node kosong yang dibuat oleh fungsi makenode.
Source codenya seperti di bawah ini :

static int xmp_write(const char *path, const char *buf, size_t size, off_t offset)                                                             
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);

    if(fd == -1)
        return -errno;
   
    res = pwrite(fd, buf, size, offset);
    rename(fpath,fpath2)
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}

8. Fungsi open
***
Fungsi ini menentukan apa yang akan terjadi ketika file dalam mount dibuka. Biasanya code di sini sering dimodifikasi agar komputer memberikan respon yang berbeda-beda ketika file dibuka, namun normalnya adalah file berjalan seperti biasa
Source codenya seperti di bawah ini :

static int xmp_open(const char *path, int flags)
{
   
    int res;
    char fpath[1000], ads[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = open(fpath, flags);
 
    if(res == -1)
        {
        return -errno;
        }
    close(res);
    return 0;
}

9. Induk fungsi
***
Fungsi ini seperti memberi prototype fungsi apa saja yang akan di pakai ke pada fungsi main.
Source codenya seperti di bawah ini :

static struct fuse_operations xmp_oper =
{
    .getattr = xmp_getattr,
    .getdir = xmp_getdir,
    .mknod = xmp_mknod,
    .chmod = xmp_chmod,
    .open = xmp_open,
    .read = xmp_read,
    .write = xmp_write,
};

10. Fungsi main
***
Tanpa ini semua fungsi di atas tidak akan berjalan. Fungsi main memanggil semua fungsi di atas
Source codenya seperti di bawah ini :

int main(int argc, char *argv[])
{
    return fuse_main(argc, argv, &xmp_oper);
}

Sebenarnya masih banyak fungsi-fungsi lain dalam FUSE yang dapat memodifikasi apa yang terjadi, namun sekian saja kali ini karena sudah terlalu panjang. Semoga bermanfaat!




Jumat, 27 November 2015

Opini Terhadap Rambu Lalu Lintas

Rambu lalu lintas di Indonesia sebenarnya bukan masalah yang vital atau urgent untuk dibahas. Namun, tak ada salahnya kan mengungkapkan opini yang bersifat membangun?

Siapakah yang telah berjasa besar dalam hal pengadaan rambu-rambu lalu lintas ini? Pemerintah kota? Dinas lalu lintas angkutan jalan? Menteri perhubungan? atau biro-biro lainnya? Sebenarnya siapapun itu, yang  ditekankan di sini adalah seberapa banyak yang dialokasikan untuk itu? Berapa besar dana yang digunakan untuk sebuah rambu lalu lintas? Dikalikan dengan jumlah seluruh rambu lalu lintas di Indonesia, berapa banyak yang telah dihabiskan?

Ok, sekali lagi ini bukan masalah urgent. Masih jauh lebih murah daripada biaya-biaya yang lain seperti perbaikan jalan aspal, perawatan lampu jalan, pemeliharaan pohon-pohon kota, dan lain-lain. Tetapi dalam hal rambu lalu lintas ini apabila kita bisa berhemat walaupun sedikit, itu sudah sangat membantu negara?

Ini hanya sekedar opini. Dapatkah proyek pengadaan rambu lalu lintas dilelang (seperti proyek-proyek jalan tol) kepada usaha-usaha yang berada di sekitar rambu tersebut akan dipasang. Pengusaha yang ditawari pun dapat memanfaatkan rambu tersebut sebagai iklan. Misalnya



Tentunya tetap dengan MOU tertentu.

Sehingga pemerintah dapat menghemat biaya alokasi untuk pengadaan rambu lalu-lintas, selain itu juga mendapat dana tambahan dari hasil lelang.




Kamis, 05 November 2015

Your Own Music Player

Sesuai yang telah dijanjikan di post sebelumnya menganai pendahulan thread, post kali ini akan membahas sebuah problem case yang membutuhkan teknik thread dalam penyelesaiannya.

Apabila pada post sebelumnya code bertujuan untuk membuat persegi dan segitiga secara bersama-sama, maka pada post kali ini akan berada pada satu tingkat lebih rumit yakni membuat sebuah music player standard


Oke, nggak akan se-ekstrim itu sampai user interfacenya berbasis desktop. Music player yang akan kita buat menggunakan terminal atau comand prompt.

================================================================
                                 =========PROBLEM CASE===========
================================================================

Music player yang akan dibuat harus mempunyai fitur-fitur berikut :

>>help              (menampilkan fitur)
>>list                (menampilkan file-file musik di dalam folder "playlist")
>>play              (memutar sebuah musik)
>>pause            (mem-pause musik yang sedang dijalankan)
>>continue       (meng-unpause musik yang sedang di-pause)
>>stop              (men-terminate musik player)

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

Dalam kasus ini, yang berbeda dari kasus sebelumnya dan perlu treatment lebih adalah :

- memerlukan input -> fitur music player yang akan ditampilkan membuat user harus memberikan input perintah, tetapi di dalam fungsi thread tidak bisa meminta input, karena itu apabila meminta input dari user harus ada di dalam fungsi main. Selain itu input dibutuhkan juga untuk meminta judul lagu yang akan diputar.

- thread berjalan dipengaruhi suatu kondisi -> ada berbagai macam thread yang dibuat dalam program ini, namun thread yang berjalan haruslah sesuai dengan perintah yang diinputkan oleh user. Menjalankan thread Maka dalam hal ini bisa menggunakan branching if

- menggunakan banyak perintah system -> hal yang tidak dapat kita hindari yakni berinteraksi dengan system, seperti menggunakan system("pkill") untuk mematikan proses,  system("clear") untuk membersihkan layar, system("mpg123") untuk mem-play musik, dan lain-lain.

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

Dengan memperhatikan 3 hal diatas, kita dapat membuat hasil code seperti berikut :

>>thread 1 : help (menampilkan fitur)


>>thread 2 : list (menampilkan daftar musik di folder playlist)


>>thread 3 : play (memutar musik)


>>thread 4 : pause (mem-pause musik)


>>thread 5 : continue (meng-unpause musik)


>>thread 6 : stop (mematikan musik)


>>fungsi main : membuat percabangan untuk memanggil thread


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

Kalau digabungkan menjadi satu :

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

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

pthread_t tid[7];
char lagu[10];
char ads[100];

void* playandcount(void *arg)
{
pthread_t id=pthread_self();
if(pthread_equal(id,tid[1]))
    {
system("clear");
        printf(">>help\n");
printf(">>list\n");
printf(">>play\n");
printf(">>pause\n");
printf(">>continue\n");
printf(">>stop\n");
}
else if(pthread_equal(id,tid[2]))
    {
system("clear");
        chdir ("/home/laily/Documents/MODUL3/soalshift/playlist");
system("ls | grep .mp3");
}
else if(pthread_equal(id,tid[3]))
    {
        system("pkill mpg123");
        system("clear");
        snprintf(ads, sizeof(ads), "mpg123 %s",lagu);
        system(ads);
}
else if(pthread_equal(id, tid[4]))
    {
system("clear");
sleep(3);
system("pkill -STOP mpg123");
}
else if(pthread_equal(id, tid[5]))
    {
system("clear");
sleep(3);
system("pkill -CONT mpg123");
}
else if(pthread_equal(id,tid[6]))
    {
system("clear");
sleep(3);
system("pkill mpg123");
}
return NULL;
}

int main(void)
{
system("clear");
while(1)
{
char comm[10];
int err=0;
scanf("%s",comm);
if (err!=0) printf("\ncan't create thread : [%s]", strerror(err));
else if (strcmp(comm,"help")==0)
            {
                err=pthread_create(&(tid[1]), NULL, &playandcount, NULL);
            }
            else if (strcmp(comm,"list")==0)
            {
                err=pthread_create(&(tid[2]), NULL, &playandcount, NULL);
            }
            else if (strcmp(comm,"play")==0)
            {
                scanf("%s",lagu);
                err=pthread_create(&(tid[3]), NULL, &playandcount, NULL);
            }
            else if (strcmp(comm,"pause")==0)
            {
                err=pthread_create(&(tid[4]), NULL, &playandcount, NULL);
            }
            else if (strcmp(comm,"continue")==0)
            {
                err=pthread_create(&(tid[5]), NULL, &playandcount, NULL);
            }
            else if (strcmp(comm,"stop")==0)
            {
                err=pthread_create(&(tid[6]), NULL, &playandcount, NULL);
            }
            else printf("Wrong Input\n");
}
return 0;
    }


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

Tidak terlalu sulit bukan? Demikian tutorial cara membuat music player standard with thread kali ini, semoga bermanfaat

Thread : Together We Can United We Stand

Thread adalah proses yang dibagi-bagi menjadi kecil-kecil (sering disebut lightweight process) sehingga dapat dijalankan bersama-sama.


Thread-thread yang berjalan bersama-sama disebut multithread. Misalnya pada firefox, terdapat banyak thread untuk melakukan banyak task seperti menampilkan user interface, meminta input user, me-load pencarian, melakukan update, dan lain-lain. 

Together We Can United We Stand
Seperti kalimat diatas, keuntungan dari thread adalah program dapat dijlankan bersama-sama, jadi antara satu process dengan process yang lain tidak perlu saling tunggu.

Sekarang mari kita lihat perbedaan dua source code di bawah ini :

code tanpa thread




Code dengan Thread



Kedua code tersebut bertujuan mencetak bentuk persegi dan segitiga, namun pada source kedua menggunakan thread.
Apabila kedua code tersebut dicompile, akan menghasilkan output yang berbeda


Tanpa Thread






Dengan Thread


Dengan menggunakan thread kita bisa melakukan banyak proses bersama-sama, dalam code diatas thread dapat mencetak persegi dan segitiga bersamaan. Cukup mudah bukan?


Demikian sekilas mengenai thread dan keuntungannya. Untuk post berikutnya adalah suatu test case yang membutuhkan thread dalam pemecahannya.

Semoga bermanfaat

Sabtu, 17 Oktober 2015

Pop-Up Is Not Always a Virus!

Dari post sebelumnya mengenai daemon, post kali ini adalah salah satu penerapan daemon. Misalnya dalam satu test-case Anda ingin system menampilkan pop-up setiap dengan interval dan isi yang telah ditentukan.

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

Rincian test case :

Isi pop-up sudah dilist di dalam file yang bernama "quotes.txt"
Setiap yang ingin ditampilkan dalam pop-up dipisahkan oleh tanda koma (,)

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

Logical Solution :

-Menampilkan pop-up menggunakan perintah zenity
-Membaca file menggunakan perintah fopen dengan format "r" (read)
-Men-scanning di dalam file dilakukan per-karakter, sehingga system bisa mengetahui ketika bertemu tanda koma
-Setiap huruf yang telah di-scan dimasukkan ke dalam variabel string, ketika system bertemu koma, isi variabel tersebut ditampilkan di pop-up kemudian variabel string dikosongkan kembali untuk diisi quotes selanjutnya

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

Code :


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

Demikian implementasi dari daemon kali ini. Terima kasih

Unstoppable Daemon


Pernahkah Anda mengalami gangguan-gangguan desktop pada komputer Anda? Misalnya pop-up yang muncul tiap beberapa detik sekali, file yang sering terbuka sendiri tanpa di-klik, atau gambar yang tiba-tiba ter-edit dengan sendirinya?

Daemon bisa jadi adalah penyebab peristiwa-peristiwa tersebut. Apakah yang dimaksud dengan daemon? Daemon ialah process yang berjalan pada background yang tidak  memerlukan interaksi langsung dengan user. Dengan kata lain, user tidak akan bisa menghentikan daemon secara langsung. Bisa Anda bayangkan daemon yang dibuat dengan tujuan buruk, misalnya otomatis mendownload gambar-gambar tidak senonoh tanpa Anda bisa berbuat apa-apa. Untuk itu, pengetahuan mengenai daemon amatlah diperlukan untuk mencegah hal-hal tersebut.

Membuat daemon amatlah mudah bahkan bagi orang awam. Anda hanya perlu memahami bahasa c dan Anda akan dengan mudah membuat suatu program daemon. So, check it out!

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

Untuk membuat daemon, beberapa hal ini perlu diperhatikan :

- Daemon adalah suatu orphan process (child process yang kehilangan parent-nya). Untuk itu Anda perlu membuat child process kemudian membunuh parent-nya

- Mode file daemon harus bisa dibaca. Maka, Anda musti menggunakan fungsi umask

- Daemon yang merupakan orphan process, awalnya tidak memiliki Session ID sehingga tidak dapat berjalan. Agar process dapat berjalan, maka Anda perlu menggunakan fungsi setsid

- Daemon selalu aktif pada background, karena itu daemon haruslah berada pada direktori yang selalu aktif. Untuk itu Anda harus menggunakan fungsi chdir (change directory) untuk memindahkan process ke direktori yang selalu aktif yaitu home

- Menutup File descriptor standar untuk daemon, karena file descriptor bisa benar-benar disturbing ketika daemon dijalankan karena bisa berulang-ulang

- Kodingan Anda harus berada di fungsi while, karena inti dari daemon adalah dilakukan berulang-ulang secara kontinu

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

Berikut ini adalah pembuatan daemon dalam bahasa c

#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<syslog.h>
#include<string.h>

int main (void)
{
pid_t pid, sid;
pid=fork();
if (pid<0) exit (EXIT_FAILURE);
else if (pid>0) exit (EXIT_SUCCESS);
umask(0);
sid=setsid();
if (sid<0) exit (EXIT_FAILURE);
if ((chdir("/"))<0) exit (EXIT_FAILURE);
close(STDIN_FILENO);
//close(STDOUT_FILENO);
close(STDERR_FILENO);
while(1)
{
printf("SELAMAT DATANG\n");
sleep(2);
}
exit(EXIT_SUCCESS);
}

process diatas artinya menampilkan kalimat "SELAMAT DATANG" di terminal tiap 2 detik sekali.
Untuk menghentikan daemon caranya cukup rumit. Anda harus mengetahui pid dari process daemon tersebut. Kemudian Anda bisa mengehentikannya dengan funngsi kill <pid>

Sabtu, 03 Oktober 2015

Rumplestiltskin The Fallen

Kisah Rumplestiltskin bukanlah kisah yang umum di Indonesia. Dongeng ini berasal dari Jerman pada abad 19 masehi. Cerita yang bertema peri ini kemudian diangkat menjadi film berjudul "Rumplestiltskin" pada tahun 1987.

Satu hal yang ganjil di dongeng ini adalah kematian Rumplestiltskin di akhir cerita. Oh ayolah, Rumplestiltskin bukanlah tokoh antagonis. Pemeran jahat yang sesungguhnya, sang raja dan ayah gadis, justru hidup bahagia selamanya. Beginikah cara bertransaksi di zaman dahulu? Berjanji kemudian tidak menepati? Kurasa kebaikan yang dilakukan Rumplestiltskin tidak setimpal dengan
apa yang didapatkannya. Tentu saja ini bukan dongeng yang baik untuk diceritakan kepada anak-anak.

Apa nilai moral yang dikandung dalam cerita ini? Apa yang dipikirkan oleh si pembuat cerita?

Sabtu, 26 September 2015

Prima with Bash

Berikut ini adalah suatu sajian test-case yang akan kita coba selesaikan dengan menggunakan pemrograman bash. Saya asumsikan kalian telah belajar lebih banyak dari post sebelumnya tentang dasar pemrograman bash. So, Check it Out!

*************
Prima with Bash

Cayza ingin mengetahui bilangan apa saja yang merupakan bilangan prima. Bantulah Cayza untuk mengetahui bilangan-bilangan prima yang ada di bawah bilangan tertentu.

Semisal Cayza menginputkan angka 50, maka program akan memberikan semua bilangan prima yang ada di bawah 50 dalam list dan dimasukkan dalam file berjudul prima.txt. 

Selain itu Cayza ingin program bisa otomatis mengompress file tersebut dalam format .tar.gz dan membuat file baru berisi catatan (log) waktu pemakaian program tersebut. Jadi setiap kali Cayza menjalankan program, waktunya tercatat dalam catatan log tersebut.

---------------------

Logical Solution

Bilangan prima didapatkan dengan cara bilangan yang diinginkan dibagi satu-persatu  dengan semua bilangan dibawahnya (kecuali 1). Apabila tidak ada hasil pembagian yang bulat, maka bilangan tersebut adalah bilangan prima.

Katakanlah bilangan yang diinginkan adalah x, maka pseudoce-nya:

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

flag:=0
for i:= 2 to x
        if (x % i == 0) then flag := flag +1
if (flag := 0) then x is prima
else x is non-prima         

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

Variabel flag sebagai penanda, apabila ada pembagian yang bernilai bulat maka nilai flag akan bertambah. Jadi, apabila nilai flag tidak pernah bertambah (masih 0) berarti tidak ada pembagian yang bulat, berarti bilangan tersebut prima. Mudah bukan?

Karena nilai x dicari statusnya satu persatu mulai dari 2 sampai bilangan yang diinput oleh Cayza (0 dan 1 sudah jelas bukan bilangan prima), maka untuk x pun harus dibuat dalam mode looping. Jadi 
pseudocode-nya:

===============================
for x:=2 to input
        for i:= 2 to x
                if (x % i == 0) then flag := flag +1
        if (flag := 0) then x is prima
        else x is non-prima
===============================

Apabila kita code dengan bash :

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

#!/bin/bash
read input;
x=2
while [ $x -le  $input ];
do
    flag=0
    i=2
    while [ $i -lt $x ];
    do
        if [ $(( x%i )) -eq 0 ];
        then
        let "flag= $flag +1"
        fi
        let "i=$i+1"
    done
    if [ $flag -eq 0 ];
    then
    echo $x >> prima.txt
    fi
    let "x=$x+1"
done


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

Selanjutnya meng-konversi ke dalam bentuk .tar.gz. Dalam hal ini bisa menggunakan fungsi tar -zcvf. Berikut ini adalah penjelasan mengenai -zcvf

-> z artinya mengarsip dengan menggunakan gzip
-> c artinya mengompres (bisa  x kalau mau mengekstrak)
-> v artinya view, prosesnya tertampil di terminal (opsional, boleh dihilangkan)
-> f artinya nama file

Apabila kita code dengan bash :

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

tar -zcvf arsip_prima.tar.gz prima.txt
echo "File Telah Dikompres pada tanggal $(date '+%d_%m_%Y') pukul $(date '+%H:%M:%S')" >> log_prima.txt

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

Dengan demikian case kali ini terselesaikan dengan baik. Semoga posting ini bermanfaat untuk semua. Posting berikutnya akan berisi hal yang tidak ada hubungannya dengan pemrograman bash

#!/bin/bash

Nge-script dengan bash? Why not?

Pada dasarnya logika ngoding dengan bahasa bash hampir sama dengan bahasa C. Perbedaannya adalah pada aturan-aturan penulisan. Well, langsung saja kita simak bagaimana contoh programnya. Check it Out!



 ******************

Materi 1 : Input Output

---------------------------

#!/bin/bash
read nama;
echo "Hello $nama"

---------------------------

Penjelasan :

baris pertama adalah header. Sama seperti #include<iostream> di C++

baris kedua berarti meminta input dan menyimpan dalam variabel nama. Sama seperti fungsi scamf di C++. Variabel disini tidak perlu dideklarasikan terlebih dahulu

baris ketiga mencetak sesuatu yang telah diinputkan di dalam variabel nama. Sama seperti fungsi printf di C++. Untuk mengakses isi variabel nama menggunakan operator $

Hasil output:


****************

Materi 2 : Branching

------------------------

#!/bin/bash
read x
if [ $x = 10 ]
then
echo "Sama dengan 10"
else
echo "Lebih dari atau kurang dari 10"
fi

----------------------

Penjelasan :

Baris ketiga, yang di dalam kurung siku adalah pernyataan input sama dengan 10. Apabila pernyataan benar maka akan tercetak Sama dengan 10. Apabila pernyataan salah maka akan tercetak "Lebih dari atau kurang dari 10".

Baris kedelapan, fi berfungsi sebagai penutup fungsi if. Seperti kurung kurawa pada C++

Hasil output:


****************

Materi 3 : Looping

-----------------------

#!/bin/bash
read x
i=0
while [ $i -lt $x ]
do
echo "Masih Looping"
let "i=$i+1"
done

-----------------------

Penjelasan:

Looping menggunakan while mempunyai konsep hampir sama seperti Branching. Apabila pernyataan benar maka sistem akan melakukan perulangan. Perulangan berhenti ketika pernyataan tidak terpenuhi. 

Baris ketiga seperti fungsi percabangan if, yaitu pernyataan sebagai syarat looping.
Sebagai pengganti kurung kurawa, di bash menggunakan "do" dan "done"

Hasil output:

Tiga materi tersebut adalah fungsi yang paling sering dilakukan dalam pemrograman. Silahkan kembangkan diri kalian seluas mungkin dalam bidang pemrograman bash. Untuk post berikutnya adalah tentang testcase-testcase yang diselesaikan dengan menggunakan pemrograman bash. Semoga bermanfaat.

Senin, 14 September 2015

Ice Cream

Ingat episode ini? Episode di mana spongebob berkompetisi dengan Patrick untuk menjadi koki terbaik. Episode ini berjudul "The Fry Cook Games".Salah satu perlombaan dalam  kompetisi tersebut adalah membuat es krim.

Di televisi, tentu saja semua episode spongebob dialih-bahasa menjadi bahasa Indonesia, atau istilahnya 'dubbing'. Di episode ini ada satu scene yang mengalami kesalahan translate, sehingga lelucon yang sebenarnya dibuat tidak tersampaikan.

Scene tersebut adalah ketika spongebob berteriak "I scream for ice cream" (aku berteriak demi eskrim) di episode aslinya. Rupanya pihak penerjemah mendengarnya sebagai "Ice cream for ice cream" dan mendubbingnya "Es krim demi eskrim".