Saturday, November 28, 2015

Menggunakan FUSE (Filesystem in Userspace)

Haloo.. jumpa lagi haha..

Kali ini, gak perlu muqaddimah panjang-panjang, langsung aja nih, kita bahas apa itu FUSE dan gunanya untuk kita-kita (asik)

Oke, sebelum membahas FUSE, kita mesti tau apa itu Filesystem. Filesystem adalah struktur logika yang digunakan untuk mengendalikan akses terhadap
data yang ada pada harddisk. Gampangnya, Filesystem bertugas untuk memberi kemudahan pada user untuk mengakses harddisk tanpa harus memahami alamat data yang diakses itu pada harddisk.

Nah, Filesystem ini ada banyak jenisnya, dan tiap OS biasanya memiliki filesystem yang berbeda. Sementara itu, FUSE merupakan mekanisme sistem operasi untuk sistem operasi Unix-like yang memungkinkan pengguna tidak berhak istimewa menciptakan filesystem mereka sendiri tanpa mengubah kode kernel. Oleh karena itu, pengguna FUSE dapat membuat filesystemnya sendiri tanpa harus mengubah secara langsung kode pada kernel OS. (Buat yang belum paham kernel, coba di search sendiri ya, singkat kok hehe).

Oke, jadi penggunaan FUSE seperti ini:

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

Pembuatan Filesystem:
1. Ketikkan code dibawah ini dan simpan dengan nama sesuai keinginanmu



Sudah selesai? Nah, ada sedikit lagi bagian yang harus diubah agar kodingan berjalan, yaitu mengubah dirpath (letaknya dibawah deretan #include) dari "/home/farhan/Pictures" menjadi direktori yang ingin kamu mount ke FUSE (kalau masih belum tau apa itu mount, silahkan di search juga.. semangat ^_^)

Oke, masuk tahap-tahap akhir:
1. Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]
2. Kemudian buat sebuah direktori, misalnya: /tmp/fuse
3. Coba jalankan fuse tadi dengan cara: ./[nama file] /tmp/fuse
Maka semua isi direktori yang diketikkan di dirpath tadi akan dimount ke
direktori /tmp/fuse
4. Coba masuk ke /tmp/fuse dari terminal dan jalankan perintah ls, maka semua isi direktori tersebut akan ditampilkan.

Nah sekian dulu yaa.. semoga membantu :)

Saturday, November 7, 2015

Menggunakan Shared Memory


Halo.. Welcome back!

Jadi, akhir-akhir ini, ada game baru lagi booming banget di kampus dan temen-temenku. Nama gamenya itu "Duel Otak". Itu game merupakan game 2 player dimana kedua player menjawab pertanyaan sesuai kategori (ada 6 dalam satu kali pertandingan) dan pemenang ditentukan oleh siapa yang menjawab benar paling banyak. Nah, yang bikin seru, kedua player ini bisa melihat hasilnya, sehingga keliatan mana yang lebih, ehm, "pintar" gitu.. hehehe.

Yah, karena banyak banget temen-temenku yang main, aku pun jadi ikutan juga :v. Sambil memainkan game ini, muncul di pikiranku, gimana caranya para player ini bisa melihat hasil dari lawannya, sedangkan mereka bermain di perangkat yang berbeda. Nah, karena kebetulan lagi belajar tentang IPC (Inter-Process Communication), aku jadi mikir kayaknya developer Duel Otak ini menggunakan IPC untuk melakukannya. Walaupun aku gatau pasti juga sih :v.

Okay, cukup soal game nya. Waktunya masuk "main part".

*jeng jeng*

Nah, kali ini, kita akan bekerja menggunakan shared memory, salah satu metode yang digunakan untuk melakukan IPC. Metode shared memory dikerjakan dengan salah satu program membuat porsi memori untuk diakses oleh program yang lain dengan menggunakan suatu kunci. Karena menggunakan memori, metode ini tidak bisa dijalankan menggunakan komputer yang berbeda, karena beda komputer berarti beda memori. Maka, bisa dipastikan Duel Otak tidak memakai metode ini, hehe.

Oke. Fokus lagi.

Nah, sekarang, kita akan masuk ke pengimplementasian shared memory. Kali ini kita akan bekerja dengan C. Source code untuk kali ini terbagi dua, untuk server dan untuk client. Pertama, kita akan memulai dengan code segment yang digunakan oleh kedua source code ini.

Pertama, kita akan menggunakan beberapa library, seperti yang terlihat dibawah ini:

sys/types.h digunakan untuk memunculkan tipe data key_t yang akan digunakan sebagai kunci shared memory kita. sys/ipc.h untuk memunculkan fungsi IPC_CREAT untuk membuat entry jika shared memory belum dibuat, dan sys/shm.h untuk memunculkan fungsi shmget untuk membuat segmen shared memory dan shmat untuk memasukkan segmen shared memory sebagai salah satu bagian yang akan digunakan oleh program kita. Adapun stdio.h digunakan sebagai standar I/O, dan SHMSZ sebagai ukuran segmen memory yang akan dijadikan shared memory.

Setelah selesai dengan library, waktunya masuk ke fungsi main.

Deklarasikan variabel yang akan kita pakai, dan masukkan nilai yang akan kita jadikan kunci shared memory. Nilai ini harus sama antara server dan client.





Kemudian, kita mulai membuat segmen shared memory kita. Caranya bisa dengan menggunakan sintaks dibawah ini:






Disini shmget akan menciptakan segmen berukuran sesuai SHMSZ dengan kunci sesuai key, dimana 0666 bermakna segmen itu bisa di read, write, dan execute. shmget akan mengembalikan nilai negatif ke shmid jika segmen gagal dibuat.

Lanjut, waktunya menyambungkan segmen yang telah kita buat ke program yang akan kita jalankan. Kita menggunakan shmat seperti contoh dibawah ini:






Setelah melalui rangkaian proses ini, shared memory siap untuk dijalankan. Mulai dari ini source code server dengan client akan berbeda. Disini kita akan membuat source code dimana server mengisikan alfabet ke segmen shared memory dan client akan menerima dan mencetaknya.

server.c








Disini kita menunggu client mengubah isi shm sebagai tanda sudah selesai menerima dan mencetak.


client.c





Mengubah shm menjadi * setelah selesai menerima dan mencetak.


Nah, source code sudah selesai dibuat. Waktunya compiling. Di linux, kita bisa melakukan compiling dengan menggunakan sintaks gcc [nama_source_code].c -o [nama_executable_file].o di terminal. Karena sekarang kita menggunakan dua source code yang dijalankan secara bersamaan, maka kita akan menggunakan dua terminal. Berikut contoh jalannya program di terminal setelah compiling.



server.o menunggu client.o menerima dan mencetak.

client.o mencetak alfabet ke terminal



server.o selesai menunggu client.o













 Okay, sekian dulu untuk hari ini. Semoga membantu, ya ^_^