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 ^_^

Saturday, October 17, 2015

Membuat Daemon

Apa itu daemon?
Bagaimana cara membuat daemon?
Kenapa pengejaannya mirip dengan demon?
Apakah memang berhubungan dengan demon (baca: setan)?

Jika terlintas di pikiran teman-teman pertanyaan seperti itu (terutama pertanyaan nomer 3 dan 4) berarti kita sepemikiran, hehe.

Oke, serius.

Jadi, yang dimaksud daemon disini adalah proses yang berjalan di background tanpa diketahui user. Mungkin penamaan daemon ini datang dari sifatnya yang seperti hantu/setan ini, namun saya juga tidak tahu pasti, hehe.

Walaupun sifatnya seperti hantu/setan, membuat daemon tidaklah seperti setan (baca: susah). Pembuatannya hanya melibatkan source code C yang dikenal sebagai dasar seluruh bahasa pemrograman. Nah, mari kita mulai proses pembuatannya.

Pertama, kita harus melakukan forking parent process sebelum mematikannya. Mematikan proses induk diperlukan agar system mengira proses telah selesai sehingga kembali ke terminal. Padahal, masih ada proses anak yang melanjutkan proses induk itu. Langkah ini dapat dikerjakan dengan membuat code seperti ini:










Selanjutnya, untuk menulis file yang dibuat oleh daemon, dibutuhkan perubahan mode file agar benar-benar bisa ditulis dan dibaca. Untuk itu dibutuhkan implementasi umask(). Setelah itu, child process yang kita buat sebelumnya harus kita berikan unique SID, agar tidak lagi bertindak sebagai orphan process. Caranya bisa dengan menggunakan setsid(). Berikut implementasi dari umask() dan setsid():




Setelah itu, kita harus melakukan perubahan direktori kerja untuk mengambil proses daemon itu. Untuk melakukannya bisa menggunakan chdir(), seperti gambar dibawah. Ingat, direktori yang dibutuhkan adalah direktori tempat kita menyimpan daemon.





Lalu, kita harus menutup file descriptor standar dengan menggunakan fungsi close(). Perhatikan bahwa STDOUT dijadikan dokumentasi karena kita membutuhkan output dari daemon agar kita tahu bahwa daemon berjalan.





Terakhir, buatlah tugas dari daemon tersebut. Kita bisa memberikan tugas apapun yang kita mau, selama itu masih logis untuk dilakukan oleh komputer. Disini aku membuat daemon yang mencatat setiap proses dari user yang sedang login kedalam sebuah logfile berekstensi .txt . Untuk itu, kita bisa menggunakan command ps ux, seperti gambar dibawah. Fungsi sleep() digunakan untuk memberi jeda perulangan daemon melakukan tugasnya.








Jika kita gabungkan seluruh langkah tadi, maka seharusnya source code akan menjadi seperti ini:























Nah, source code telah selesai. Selanjutnya, kita harus melakukan compiling dari source code menjadi executable file. Caranya dengan mengetikkan sintaks "gcc nama_source_code.c -o nama_executable_file.o". Setelah itu, daemon siap dijalankan.

Compiling source code dan running program










Keberadaan file B10_log.txt sebagai bukti bahwa daemon process berjalan
 




















Isi dari logfile

Yah, sekian pembuatan daemon kali ini. Bagaimana? Mudah kan? Semoga membantu yaa :)

Sunday, September 27, 2015

Tutorial Compress File di Linux Menggunakan Bash Script

Halloo..

Jadi selama beberapa waktu belakangan ini, aku dapet beberapa ilmu baru, yang salah satunya itu mau aku bagiin ke temen-temen semua sekarang. Nah, kali ini, aku akan memberi sedikit tutorial mengenai cara mengompress direktori di Linux menjadi file berekstensi tar.gz dan juga membuat logfile di setiap kita mengompressnya..

Nah pertama, kita mulai dengan menentukan direktori yang mau kita kompres. Kita bisa membuat direktori baru jika diinginkan dengan cara seperti dibawah ini.






Nah, sekarang folder 27_09_2015 sudah dibuat. Fungsi ls menandakan isi dari direktori dimana kita berada sekarang.






Setelah folder dibuat, kita bisa mengompressnya dengan membuat sebuah script. Sebenarnya bisa juga melalui akses dari terminal secara langsung, namun penggunaan script akan memudahkan untuk mengompress folder kembali dilain waktu.

Cara pembuatan scriptnya:

Ketikkan nano di terminal kemudian enter



Sehingga keluar gambar seperti dibawah ini















Nah, lalu ketikkan seperti yang dicontohkan dibawah





Nah, pada script diatas ini, yang melaksanakan tugas compress adalah fungsi tar. Kemudian sintaks zcvf adalah rincian dari fungsinya, z menandakan penggunaan gzip untuk mengompress, c menandakan create archive, v menampilkan isi folder yang akan dikompres, dan f memberi nama archive atau file yang dikompress. Setelah zcvf adalah nama archive yang akan kita buat, lalu setelah itu adalah lokasi direktori yang akan kita kompress

Lalu, dibawah fungsi tar adalah line untuk kita membuat logfile. Isi dari data yang ingin kita cetak (sintaksnya adalah echo) akan dimasukkan ke file .txt dengan tanda  >>.

Ketik ctrl+X untuk menutup nano, sehingga muncul gambar seperti dibawah ini.



Ketikkan Y, lalu rename sesuai apa yang kita inginkan, lalu enter. Jangan lupa ekstensinya harus .sh



Sekarang script sudah ada di PC kamu








Akses script dengan mengetikkan seperti dibawah ini. Jika ditolak, bisa dengan mengetikkan chmod 777 nama_script.sh ,enter, lalu ketikkan sintaks dibawah kembali


Nah, hasil dari script diatas akan menjadi seperti ini

Proses di terminal





Tampilan archive dan logfile di Files
















Isi logfile







Bagaimana? Mudah kan? Semoga membantu yaa J