Sabtu, 28 November 2015

FUSE


FUSE itu Rumit, 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.

Diagram Cara Kerja Fuse

Langkah - langkah instalasi FUSE :
  1. Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download   stable release
  2. Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz)
  3. Lakukan installasi FUSE dengan cara :
  • Gunakan hak akses super user (sudo su)
  • Ketikkan perintah ./configure
  • Ketikkan perintah make
  • Ketikkan perintah make install
FUSE siap digunakan

Membuat FUSE :
Buka gedit, beri nama file berkesteni .c ketik kode berikut ini

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>

static const char *dirpath = "/home/anandi/Documents/";
char alamat[1000];
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;
}

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;
}

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);
    strcpy(alamat,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;
}

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;
}

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;
}

static int xmp_write(const char *path, const char *buf, size_t size, off_t offset)                                                              
{
    int fd;
    int res;
    int res1;
    char fpath[1000],temp1[1000];

    sprintf(fpath, "%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);
 
    sprintf(temp1, "%s%s", dirpath, alamat);
    res1 = chmod(temp1, 0000);
    if(res1 == -1)
        res1 = -errno;

    if(fd == -1)
        return -errno;

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

    close(fd);
    return res;
}

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

    close(res);
    return 0;
}

static struct fuse_operations xmp_oper =
{
    .getattr = xmp_getattr,
    //.readlink = xmp_readlink,
    .getdir = xmp_getdir,
    .mknod = xmp_mknod,
    //.mkdir = xmp_mkdir,
    //.symlink = xmp_symlink,
    //.unlink = xmp_unlink,
    //.rmdir = xmp_rmdir,
    //.rename = xmp_rename,
    //.link = xmp_link,
    .chmod = xmp_chmod,
    //.chown = xmp_chown,
    //.truncate = xmp_truncate,
    //.utime = xmp_utime,
    .open = xmp_open,
    .read = xmp_read,
    .write = xmp_write,
    //.release = xmp_release,
    //.fsync = xmp_fsync,
    //.readdir = hello_readdir
};

int main(int argc, char *argv[])
{
    return fuse_main(argc, argv, &xmp_oper);
}
Cara menjalankannya:
  1. Ganti bagian static const char *dirpath = "/home/anandi/Documents" dengan static const char *dirpath = "/home/[nama user]/Documents"
  2. Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama sembarang file]
  3. Kemudian buat sebuah direktori, misalnya: /tmp/fuse
  4. Coba jalankan fuse tadi dengan cara: ./[nama file] /tmp/fuse
FUSE telah berjalan, maka semua isi direktori /home/anandi/Documents akan dimount ke direktori /tmp/fuse
Semoga bermanfaat dan Selamat mencoba....


Sabtu, 07 November 2015

Thread - Music Player


Di post kali ini akan membahas mengenai Thread di dalam sistem operasi. Thread itu bagian dari sebuah proses. Biasanya thread digunakan untuk menjalankan 2 aktivitas dalam waktu yang bersamaan.

Agar lebih jelasnya, ayo membuat program pemutar musik yang bisa dijalankan menggunakan terminal di linux dan berbasis konsol. Jadi nanti programnya ada fitur-fitur play, pause, stop seperti pemutar musik biasanya.

Nah, musik umum filenya kan ber-ekstensi .mp3 maka agar bisa diputar gunakan software "mpg123", jika belum ada silahkan install terlebih dahulu (bisa langsung online "sudo apt-get install mpg123"). Untuk lebih jelasnya lagi langsung ae yoo...

Musik Player mempunyai fitur-fitur :
  • Help      
  • List      
  • Play 
  • Pause        
  • Continue
  • Stop
Dalam program ini nantinya akan ada fungsi thread yang berisi berbagai macam thread (play, pause, dll), user bisa menginputkan perintah yang sesuai dengan thread yang sedang dijalankan.

Selanjutnya membuat fungsi threadnya

Thread 0. Membuat tampilan menu



Thread 1. Menampilkan lagu yang ada di folder playlist


Thread 2. Membuat thread play



Thread 3. Membuat thread pause











Thread 4. Membuat thread continue










Thread 5. Membuat thread stop











dan selanjutnya adalah membuat fungsi main nya (full code)

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

pthread_t tid[8];
char namalg[100];
char lg[100];
int n;

void* PlayAndCount(void *arg)
{
    unsigned long i=0;
    pthread_t id = pthread_self();
    int iter;
    if(pthread_equal(id,tid[0]))
    {
        //menampilkan menu
        system("clear");
        printf("1. Help\n");
        printf("2. List\n");
        printf("3. Play\n");
        printf("4. Pause\n");
        printf("5. Continue\n");
        printf("6. Stop\n");
    }
    else if(pthread_equal(id,tid[1]))
    {
        //menampilkan list lagu
        system("clear");
        chdir("/home/anandi/Desktop/modul3/playlist");
        system("ls|grep .mp3");
       
    }
    else if(pthread_equal(id,tid[2]))
    {
        //play
        system("pkill mpg123");       
        system("clear");
        snprintf(lg, sizeof(lg), "mpg123 %s", namalg);
        system(lg);
       
    }
    else if(pthread_equal(id,tid[3]))
    {
        //pause
        system("clear");
        sleep(n);
        system("pkill -STOP mpg123");
       
    }
    else if(pthread_equal(id,tid[4]))
    {
        //continue
        system("clear");
        sleep(n);
        system("pkill -CONT mpg123");
    }
    else if(pthread_equal(id,tid[5]))
    {
        //stop
        system("clear");
        sleep(n);
        system("pkill mpg123");
    }
    return NULL;
}

int main(void)
{
      while(1)
    {
        char kata[100];
        int err=0;
        scanf("%s", kata);
          
        if(err!=0) printf("\ncant create thread : [%s]", strerror(err));
        else if(strcmp(kata, "Help")==0) err=pthread_create(&(tid[0]), NULL, &PlayAndCount, NULL);
        else if(strcmp(kata, "List")==0) err=pthread_create(&(tid[1]), NULL, &PlayAndCount, NULL);
        else if(strcmp(kata, "Play")==0)
        {
            scanf("%s", namalg);
            err=pthread_create(&(tid[2]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Pause")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[3]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Continue")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[4]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Stop")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[5]), NULL, &PlayAndCount, NULL);
        }
    }

    return 0;   
}
Jalankan di terminal, simpan file menggunakan .c jangan lupa di compile lihat apa yang terjadi.
Yak cukup sekian, cukup susah juga bagi saya wkwk, kurang sekurang kurangnya mohon maaf yang sebesar besarnya
Semoga Bermanfaat :)


Sabtu, 17 Oktober 2015

Belajar Linux lagi - Daemon dan Proses

Daemon dan Proses
Proses adalah suatu program yang sedang dalam keadaan di eksekusi
Cara membuat proses yaitu dengan cara menjalankan programnya, maka proses dari program tersebut akan berjalan juga

Daemon adalah proses yang berjalan dibalik layar dan berjalan sendiri dimulai saat linux booting dan berjalan. Proses ini menunggu permintaan dari proses lainnya, bila tidak ada request, maka berada dalam keadaan idle.

Langkah membuat daemon :
1. Lakukan Inisiai
  karena ini menggunakan bahasa c maka buat library yang dibutuhkan,di google banyak kok
#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>
2. Forking dan Pembunuhan proses induk
    Melakukan forking dengan melahirkan proses menjadi induk dan anak. lalu proses induknya dibunuh/dimatikan. proses induk dimatikan akan membuat proses menjadi selesai diterminal, maka proses anaknya bisa berjalan setelah induknya mati
pid_t pid, sid;
pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }
umask(0) // umask(0) berguna agar mendapat akses penuh dari file yang dibuat daemon.
3. Membuat Unique Session ID (SID)
    daemon itu proses yang bekerja secara independen dari pada proses-proses yang lain, maka dari itu dibutuhkan dengan memanggil fungsi setsid() agar proses mendapatkan session ID yang baru
sid = setsid();
    if (sid < 0) {
        exit(EXIT_FAILURE);
    }
    if ((chdir("/")) < 0) {
        exit(EXIT_FAILURE);
    }
4. Mengubah Directory Kerja
    Daemon selalu bekerja di balik layar jadi direktori kerja diamon haruslah sebuah direktori yang hidup (direktorinya tidak boleh hilang)
if((chdir(“/home/anndi/prak2/”)) < 0)
{
exit(EXIT_FAILURE);
}
5. Menutup File Descriptor Standar
    Salah satu dari langkah terakhir dalam mengeset daemon adalah menutup file descriptor standar (STDIN, STDOUT, STDERR). Karena daemon tidak perlu
menggunakan kendali terminal, file descriptor dapat berulang dan berpotensi
memiliki bahaya dalam hal keamanan. Untuk mengatasi hal tersebut maka
digunakan implementasi fungsi close().
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
6. Membuat Perulangan
    Perulangan ini nanti akan berisi perintah (terserah kita) yang akan dijalankan secara realtime, dibutuhkan sebuah looping dan akan berjalan terus menerus sampai prosesnya di bunuh.
while (1) {
   sleep(20) ;
}
exit(EXIT_SUCCESS);
Program Fullnya
#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);
    }
    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("Hello Word\n");
    sleep(20);
}
exit(EXIT_SUCCESS);
}
Cara Menjalankan program diatas yaitu tulis programnya dengan notepad/text editor atau menggunakan IDE seperti CodeBlock dll, save dengan tipe file .c kemudian buka terminal dan tuliskan perintah berikut
gcc nama_file.c -o nama_file (bisa sembarang nama)
perintah diatas kalo diprogram c namanya nge compile, jadi sebelum dijalankan compile terlebih dahulu

kemudian jalankan prosesnya
./nama file(sembarang nama)
lihat hasilnya, jika tidak terjadi sesuatu berarti programnya ada yang salah.

karena di awal tidak dibuka dengan pembukaan maka di akhir saya akan buat penutupan.
Yak cukup sekian dari postingan kedua ini, kurang sekurang kurangnya mohon maaf yang sebesar besarnya
Semoga Bermanfaat :)

Sabtu, 26 September 2015

Belajar Linux

Linux adalah sebuah sistem operasi diamana pengguna dapat menggunakanya secara free atau opensource. Pengertian linux adalah software sistem operasi open source yang gratis untuk disebarluaskan, jadi diijinkan untuk menginstal pada komputer ataupun mengkopi dan menyebarluaskannya tanpa harus membayar.
Nama "Linux" berasal dari nama pembuatnya, yang diperkenalkan tahun 1991 oleh Linus Torvalds. Sistemnya, peralatan sistem dan pustakanya umumnya berasal dari sistem operasi GNU, yang diumumkan tahun 1983 oleh Richard Stallman. Kontribusi GNU adalah dasar dari munculnya nama alternatif GNU/Linux. cukup sedikit tentang ulasan mengenai linux
Harap maklum apabila penjelasannya kurang jelas dan ada sedikit kesalahan, karena Saya pun masih awam di linux dan belum mahir menggunakan Linux. Lanjuuutttt.....

berikut kegunaan perintah-perintah terminal linux termasuk contohnya:
   a. ls
      ls itu digunakan utk melihat isi dari suatu file / direktori
      untuk ls -l itu utk melihat semua file lengkap
      untuk ls -a itu utk menampilkan semua file yg tersembunyi
      untuk ls -f itu ukt menampilkan semua file tanpa proses sorting
      sintaksnya : ls
      cthnya : ls /etc
   b. pwd
      pwd itu digunakan utk menampilkan nama direktori dimana anda sedang berada saat itu
      cthnya ialah : kita lg membuka file download, jika kita $ pwd maka hasilnya home/download
   c. mkdir
      mkdir itu digunakan utk membuat direktori baru
      utk sintaksnya : mkdir [nama_folder]
      cthnya ialah : mkdir folderku
   d. chmod
      chmod itu digunakan utk mengatur hak akses suatu file atau direktori
      cthnya ialah : chmod 777 /home/anandi
   e. chown
      chown itu digunakan utk mengubah pemilik file dan group
      cthnya ialah : chown vinsensia fileku.txt , maka file "fileku.txt" akan berubah mjd pemilik   vinsensia
   f. chroot
      chroot itu digunakan utk menjalankan perintah dgn direktori root yg berbeda
      cthnya ialah : chroot /home/anandi
   g. sudo
      sudo itu digunakan utk menjalankan perintah sbg root
      cthnya ialah : sudo mkdir vinsensia
   h. grep
      grep itu digunakan utk mencari file utk baris yg cocok dgn pola tertentu
      cthnya ialah : grep anandi /vinsensia
   i. ps
      ps itu berguna sbg status proses
      cthnya ialah : ps
   j. halt
      halt itu digunakan utk mematikan komputer, namaun harus sbg root
      sintaksnya : halt
      cthnya ialah : halt
   k. cd
      cd itu digunakan utk mengganti suatu direktori
      sintaksnya : cd [alamat_direktori]
      cthnya ialah : cd /var/www
   l. rm
      rm itu digunakan utk menghapus suatu file
      sintaksnya : rm [nama_file]
      cthnya ialah : rm fileku.txt , maka file "fileku.txt" akan dihapus
   m. mv
      mv itu digunakan utk memindahkan file ,cut dan merubah nama (rename) sebuah file
      sintaksnya : 
      mc / direktori/ file_yg_ingin_dicut/ direktori_tujuan (utk cut)
      mc / direktori/ file_yg_ingin_direname / nama_baru_file (utk rename)
      cthnya ialah : mv fileku.txt filemu.txt
   n. date
      date itu digunakan utk menampilkan ataupun mengubah tanggal dan waktu
      sintaksnya : date
      cthnya ialah : $ date 091210002015 , hasilnya : tanggal 12 sept 2015 pukul 10:00
   o. free
      free itu digunakan utk menampilkan penggunaan memori
      sintaksnya : free
      cthnya ialah : memori sisanya 256mb ~$free , maka hasilnya 256000kb
   p. whoami
      whoami berfungsi utk mencetak pengguna saat ini dan nama id
      cthnya ialah :
      saya@saya:~$ whoami
      saya
      maka user yg sedang dipakai saat ini yakni saya
   q. which
      which berfungsi utk mencari pengguna $ path utk file program
      cthnya ialah which filename
   r. cp
      cp itu digunakan utk menyalin satu atau lebih file ke lokasi lain
      sintaksnya : cp / direktori / file_yg_ingin_dicopy / direktori_tujuan
      cthnya ialah :  cp fileku.txt filemu.txt


Shell Scripting
Shell script adalah beberapa perintah yang ditulis dengan plain text file.fungsi utama dari shell scripting adalah mengotomasi perintah - perintah yang sudah biasa kita gunakan sehingga kita tidak perlu menuliskan setiap kali dengan cara yang berulang dan lengkap, tapi cukup dengan fungsi yang telah kita buat. Untuk manualnya $man bash or $man sh.













Berikut adalah sedikit contoh programnya














Program diatas adalah program menapilkan bilangan prima
Konsep dari bilangan prima yaitu bilangan yang n yang dibagi satu persatu dengan semua bilangan dibawah n dimulai dari >1, apabila bilangan tersebut mendapatkan sisa bagi maka bilangan tersebut adalah bilangan prima.

program dimulai dengan membaca variable n lalu akan menjalankan perulangan dimulai i=2 sampai n dan akan melakukan perulangan untuk mengecek bilangan i saat itu apakah bilangan prima atau bukan dan mencetak nilai i jika prima.

hasil outputnya

 












Bagaimana mudah bukan? kalo menurut saya sih susah...
yak cukup sekian postingan pertama ini, kurang sekurang kurangnya mohon maaf yang sebesar besarnya
Semoga bermanfaat :)