Sabtu, 28 November 2015

::FUSE::





               Helloo, long time no see.. Oke langsung aja kali ya.. Pada kali ini, aku akan berbagi ilmu tentang FUSE. Pernah denger atau pernah tau ga? Apasih FUSE itu?? Yuuuk check it out!
               FUSE adalah singkatan dari 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 bisa dicapai dengan menjalankan kode file system di userspace, sedangkan fuse hanya menyediakan "jembatan" antarmuka kernel yang sebenarnya.

Diagram cara kerja FUSE

               FUSE kernel modul dan FUSE library berkomunikasi melalui file deskriptor special 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 filesysem mount.
Untuk memahami FUSE ini , maka pada tutorial kali ini aku akan mengimplementasikannya.
Yuuuk mari disimak :D
Sebelumnya, jangan lupa untuk instal FUSE. Berikut cara installasi 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:
     a. Gunakan hak akses super user (sudo su) 
     b.  Ketikkan perintah ./configure 
     c. Ketikkan perintah make 
     d. Ketikkan perintah make install
4. FUSE siap digunakan.
 
               Nah contoh soalnya yaitu mengaitkan direktori lain (mount) dengan FUSE dengan kriteria ketika file dalam direktori tersebut dibuka, file tersebut secara otomatis membuat file backup dengan format nama: <nama file>.<ekstensi>.bak. File backup tersebut hanya bisa dibuka/dibaca, tidak bisa diedit. Lalu, jika file yang dibuka adalah file berekstensi .bak , maka akan muncul pesam eror berisi "FIle yang anda buka adalah file backup. FIle tidak bisa diubah maupun disalin kembali!" dan file tersebut tidak akan terbuka dan tidak dibuat backup nya.
Langkah-langkah mengerjakannya yaitu:
1. Pastikan installasi fuse berhasil. Lalu buka terminalmu. Lakukan perintah 'gedit' untuk menampilkan dan mengedit code-mu di Text Editor, dan perintah 'nano' untuk menampilkan dan mengedit code-mu di terminal langsung.

gambar perintah gedit

2.  Buatlah file system sendiri menggunakan FUSE.  Dan modifikasi code FUSE tadi sesuai dengan contoh soal. Tetapi di sini, aku akan memakai semua fungsi, agar kalian tau syntax masing-masing fungsi. Jadi, bila kalian ingin mencoba, modifikasi sendiri ya fungsi-fungsinya sesuai yang kalian butuhkan.
   Nah, di contoh soal tadi, fungsi yang paling banyak ku otak atik yaitu open, write. Selain itu juga menggunakan fungsi xmp_getattr dan xmp_getdir yang pasti digunakan sebagai dasarnya. Oh ya jangan lupa ganti bagian static const char *dirpath = "/home/[nama user kalian]/Downloads"


















gambar modifikasi FUSE
3. Lalu save code-kalian tadi dan compile program itu dengan menggunakan perintah:
               gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]
Kemudian buat sebuah direktori di Downloads. Lalu jalankan fuse tadi dengan cara:
         ./[nama file] [nama folder]
4. Hasilnya akan seperti ini :


                                                           gambar folder lala awal
gambar perubahan pada folder lala
Nah, selesai deh tutorial kali ini. Selamat mencoba , semoga berhasil ^^

Sabtu, 07 November 2015

SHARE MEMORY :: CARA MUDAH REKAP TRANSAKSI JUAL BELI



            Hello guys, long time no see. Btw, aku lagi ada bahan nih buat di-share ke kalian... tentang ilmu lagi sih, hehehe, bermanfaat kok suerr, terutama buat yang pengen menjajaki dunia bisnis. Kan zaman sekarang, orang-orang pada "wegah" (read:ogah) keluar, apalagi kalo panas terik di jalanan.. Pasti males kan?? Nah, karena ini nih olshop atau online shopping lagi marak sekarang. Banyak orang memilih untuk beli melalui olshop karena nggak ribet, ngga perlu keluar panas-panasan, pilihannya banyak dan juga bisa diakses kapanpun, dimanapun....asalkan ada internet sih hehe. Nah dengan type orang-orang yang begini nih, bisa disimpulin kalo olshop itu bakal ngelakuin banyak transaksi jual beli, kan? Setuju gak? Dan kalian yang pengen mulai bisnis jual beli ini pasti mikir juga kan gimana cara rekap transaksi kalian? Mau make cara manual(read: nulis di buku gede) atau pake excel??? Yah, iya kalo transaksinya cuma dikit. lah kalo banyak gimana? Gak pusing tuh? Ngerekap dan nge-update stock barang? Pusing kan pasti....

               Nah, saran yang pas nih ya kalian bikin aja aplikasi yang bisa ngerekap semua transaksi jual beli kalian dan meng-update stock barang kalian. Eh, emang bisa? Gimana cara bikinnya? Bisa dong, nah ini nih yang mau aku share, yaitu tentang "Share Memory" pada Linux. Apasih itu? Ya share memory. Lah gunanya? Dari namanya aja share memory, berarti file/aplikasi itu bisa kita share ke orang lain dan orang lain itu bisa ngakses file/aplikasi kita. Jadi intinya, bisa diakses oleh banyak user.

               Oke, lanjut ke contoh langsung deh ya.. Misalkan Ani punya Toko bernama Ani's Compt. Di toko ini tersedia komponen komputer yaitu RAM, Harddisk, Motherboard, PSU, VGA, dan Processor. Lalu, Ani ingin membuat aplikasi yang dapat mempermudah transaksinya dan meng-update stock barang(baik karena sudah laku terjual/ditambah stocknya). 

               Nah, kita bisa membuat 2 aplikasi, untuk penjual dan pembeli. Oh ya, langkah-langkahnya:
1.  Pertama, buka terminal linux kalian. Buka 2 terminal ya, yang satu untuk membuat program pedagang dan yang kedua untuk pembeli. 
buka 2 terminal seperti ini. Masuklah ke folder yang kamu inginkan dengan perintah cd(spasi)namafolder

2.    Bikinlah 2 program, yaitu program pedagang.c dan pembeli.c , dan simpan di folder yang kalian inginkan.
Perintah yang digunakan: "gedit pedagang.c" dan "gedit pembeli.c"
keterangan: perintah gedit itu untuk mengedit program pada text editor, apabila kamu ingin mengedit program pada terminal maka gunakan perintah nano.

ini hasilnya ya--

ini ngedit program di text editor

3.    Isilah program kalian:
- isi program pedagang.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

   int shmid, *p, *q, *r, *s, *t, *u;
   long long int jumlah;
   key_t key;

int pilih()
{
    fprintf(stdout, "Tambah stock barang lagi? (Y/N) ");
    char pilihan;
    pilihan=getchar();
        if(pilihan=='n' || pilihan=='N') return 0;
        else if(pilihan=='y' || pilihan=='Y') return 1;
        else
        {
            fprintf(stdout, "Pilihan tidak sesuai.\n");
         system("clear");
            pilih();
        }
}
/*keterangan: fungsi ini berguna untuk menawarkan apakah ingin menambah stock barang lagi atau tidak. */

int nambah_stock()
{
   char pil[100];
   while(1)
   {
     system("clear");
        fprintf(stdout, "---------LIST BARANG---------");
     fprintf(stdout, "\n1. RAM\n2. harddisk\n3. motherboard\n4. PSU\n5. VGA\n6. Processor\n7. Batal tambah stock\n Pilih: ");

       scanf("%s", pil);
       if( strcmp(pil,"1")!=0 && strcmp(pil,"2")!=0 && strcmp(pil,"3")!=0 && strcmp(pil,"4")!=0 && strcmp(pil,"5")!=0 && strcmp(pil,"6")!=0 && strcmp(pil,"7")!=0 )
       {
         system("clear");
        fprintf(stdout, "Perintah yang anda masukkan salah\n\n");
        continue;
       }
              
     if(strcmp(pil,"7")==0)
     {
                 system("clear");
                 break;
     }

        else  fprintf(stdout, "Jumlah yang ingin ditambah\t: ");
             scanf("%lld", &jumlah);

             if(strcmp(pil,"1")==0)                   (*p)+=jumlah;
             else if(strcmp(pil,"2")==0)           (*q)+=jumlah;
             else if(strcmp(pil,"3")==0)           (*r)+=jumlah;
             else if(strcmp(pil,"4")==0)           (*s)+=jumlah;
             else if(strcmp(pil,"5")==0)           (*t)+=jumlah;
          else if(strcmp(pil,"6")==0)   (*u)+=jumlah;
             getchar();

                if(!pilih())
                {
                 system("clear");
                    break;
                }
     }
}
/* keterangan: fungsi ini untuk meng-update jumlah barang apabila terjadi perubahan. */

int main(int argc, char **argv)
{
  
   char opsi[100];
    key = 1234;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    p = shmat(shmid, NULL, 0);          
    key = 2345;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    q = shmat(shmid, NULL, 0);
    key = 3456;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    r = shmat(shmid, NULL, 0);
    key = 4567;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    s = shmat(shmid, NULL, 0);
    key = 5678;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    t = shmat(shmid, NULL, 0);          
    key = 6789;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    u = shmat(shmid, NULL, 0);
  /*keterangan: diatas itu adalah inisialisasi untuk share memory. Jadi, key itu harus sama pada program pedagang.c dan pembeli.c karena key adalah kode penghubung pedagang dan pembeli. Perintah 0666 yaitu program bisa diread and write. */

    *p=0; *q=0; *r=0; *s=0; *t=0; *u=0;      //inisialisasi

    while(1)
    {
    
        fprintf(stdout, "-----------LIST MENU-------------\n");
     fprintf(stdout, "1. Lihat Stok Barang\n2.Tambah Stok Barang\n3. Keluar\n");

        scanf("%s", opsi);
        if(strcmp(opsi,"1")==0)
        {
                 system("clear");
                 fprintf(stdout, "------------RINCIAN STOCK BARANG--------\n");
fprintf(stdout, "1. RAM\t\t= %d\n2. harddisk\t= %d\n3. motherboard\t= %d\n4. PSU\t\t= %d\n5. VGA\t\t= %d\n6. Processor\t= %d\n\n", *p, *q, *r, *s, *t, *u);
        }
        else if(strcmp(opsi,"2")==0)
        {
         system("clear");
                     nambah_stock();
     }

        else if(strcmp(opsi,"3")==0)
     {
         system("clear");
         return 0;
     }
        else
        {
         system("clear");
            fprintf(stdout, "Maaf perintah yang kamu masukkan tidak sesuai\n");
            continue;
        }
    }
    return 0;
}


- isi program pembeli.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

    int shmid, *p, *q, *r, *s, *t, *u, jumlah;
    key_t key;

int opsi()
{
    fprintf(stdout, "Beli barang lagi? (Y/N) ");
    int pilihan;
    pilihan=getchar();
        if(pilihan=='n' || pilihan=='N') return 0;
        else if(pilihan=='y' || pilihan=='Y') return 1;
        else
        {
            fprintf(stdout, "Pilihan tidak sesuai\n\n");
                 system("clear");
            opsi();
        }
}
/*keterangan: fungsi ini berguna untuk menawarkan apakah ingin membeli barang lagi atau tidak. */

int beli_barang()
{
     char pilih[100];
     while(1)
            {
                fprintf(stdout, "---------LIST BARANG-----------\n");
                 fprintf(stdout, "1. RAM\n2. harddisk\n3. motherboard\n4. PSU\n5. VGA\n6. Processor\n7. Batal membeli\n Pilih: ");
                scanf("%s", pilih);

                if(strcmp(pilih,"1")!=0 && strcmp(pilih,"2")!=0 && strcmp(pilih,"3")!=0 && strcmp(pilih,"4")!=0 && strcmp(pilih,"5")!=0 && strcmp(pilih,"6")!=0 && strcmp(pilih,"7")!=0)
                {
                 system("clear");
                    fprintf(stdout, "Perintah Masukkan Salah\n\n");
                    continue;
                }              
                 if(strcmp(pilih,"7")==0){
                 system("clear");
                 break;
                 }
                else fprintf(stdout, "Jumlah\t\t: ");
                scanf("%d", &jumlah);

                if(strcmp(pilih,"1")==0)
                {
                    (*p)-=jumlah;
                    if(*p<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF Stock tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*p)+=jumlah;
                    }
                }
                else if(strcmp(pilih,"2")==0)
                {
                    (*q)-=jumlah;
                    if(*q<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF Stock tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*q)+=jumlah;
                    }
                }
                else if(strcmp(pilih,"3")==0)
                {
                    (*r)-=jumlah;
                    if(*r<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF Stock tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*r)+=jumlah;
                    }
                }
                else if(strcmp(pilih,"4")==0)
                {
                    (*s)-=jumlah;
                    if(*s<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF Stock tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*s)+=jumlah;
                    }
                }
                 else if(strcmp(pilih,"5")==0)
                {
                    (*t)-=jumlah;
                    if(*t<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF Stock tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*t)+=jumlah;
                    }
                }
                 else if(strcmp(pilih,"6")==0)
                {
                    (*u)-=jumlah;
                    if(*u<0)
                    {
                        system("zenity --error --title='Out of Stock' --text='MAAF tidak tersedia atau jumlah barang tidak mencukupi'");
                        (*u)+=jumlah;
                    }
                }
                getchar();
                if(!opsi())
                {
                    system("clear");
                    break;
                }
            }
}
/* keterangan: fungsi ini untuk meng-update jumlah barang apabila terjadi perubahan. */


int main()
{
     char pilih[100];

    key = 1234;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    p = shmat(shmid, NULL, 0);          
    key = 2345;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    q = shmat(shmid, NULL, 0);
    key = 3456;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    r = shmat(shmid, NULL, 0);
    key = 4567;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    s = shmat(shmid, NULL, 0);
    key = 5678;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    t = shmat(shmid, NULL, 0);          
    key = 6789;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);  
    u = shmat(shmid, NULL, 0);

    while(1)
    {
    
        fprintf(stdout, "---------LIST MENU-----------\n");
     fprintf(stdout, "1. Cek Stok Barang\n2. Beli Barang\n3. Exit\n Pilih: ");
        scanf("%s", pilih);
        if(strcmp(pilih,"1")==0)
     {
                 system("clear");
                 fprintf(stdout, "--------------STOCK BARANG---\nRAM\t\t= %d\nharddisk\t= %d\nmotherboard\t= %d\nPSU\t\t= %d\nVGA\t\t= %d\nProcessor\t= %d\n\n", *p, *q, *r, *s, *t, *u);
     }       
     else if(strcmp(pilih,"2")==0)
        {
     system("clear");
            beli_barang();
        }
        else if(strcmp(pilih,"3")==0){
                 system("clear");
                 return 0;
     }
        else
        {
         system("clear");
            fprintf(stdout, "Perintah yang anda pilih tidak sesuai\n\n");
            continue;
        }
    }
    return 0;
}


4.    Lalu compile dan jalankan program yang telah kalian buat di 2 terminal yang kalian buka tadi.
Perintah yang digunakan:  "gcc -o pedagang pedagang.c" dan "gcc -o pembeli pembeli.c"

output menu pada kedua program


5.    Hasilnya adalah sebagai berikut :
      Terdapat 3 menu utama di program pedagang.c yaitu Lihat Stock Barang, Tambah Stock Barang, dan Exit. Pada program pembeli.c, juga terdapat 3 menu utama yaitu Lihat Stock Barang, Beli Barang, dan exit. Nah, diprogram pedagang ini, kamu bisa menambah stock barang dan nantinya update-an tadi akan berubah secara langsung. Kamu bisa ngechecknya di lihat stock barang. Update-an tadi juga akan terjaadi di program pembeli.c karena kedua program itu menggunakan share memory. Dan apabila ada pembeli yang membeli, maka secara langsung jumlah stock barang yang dibeli tadi akan berkurang. dan apabila pembeli membeli barang yang stocknya kosong atau kurang dari jumlah stock, maka akan peringatan yang muncul dilayar.

- keluaran/hasil eksekusi program pedagang.c
  
tampilan lihat stock pada keadaan awal

tampilan ketika menambah stock barang

ini adalah tawaran ingin menambah stock barang lagi atau tidak.


- keluaran/hasil eksekusi program pembeli.c
ini tampilan lihat stock barang

ini tampilan ketika membeli barang

ini tampilan yang muncul ketika stock tidak tersedia/tidak mencukupi

dan ini hasil lihat stock barang pada kedua program. Dan hasilnya sama.

Jika ingin exit dari program, pilih menu 3.


Nah, bemanfaat bukan? Yuuuuk monggo dicoba bagi yang mau belajar :3
Selamat mencoba , sampai jumpa di postingan selanjutnya. Tunggu yah!