Minggu, 02 Oktober 2016

SWOT Gramedia Bookstore

Strengths

Kekuatan Gramedia Bookstore yaitu kelengkapan produk yang tersedia, dengan menyediakan produk yang beragam dan berkualitas. Lokasi outlet Gramedia Bookstore yang tersebar di berbagai kota di seluruh Indonesia juga merupakan kekuatan yang membuat Gramedia Bookstore dikenal oleh seluruh masyarakat Indonesia. Selain itu, informasi mengenai buku yang ada di Gramedia Bookstore juga mudah diperoleh karena adanya website resmi Gramedia Bookstore yang mengelola informasi tersebut.

Weaknesses

Salah satu kelemahan Gramedia Bookstore adalah harga produk yang tersedia dapat dijangkau oleh konsumen kelas menengah, namun terdapat beberapa produk yang harganya relatif lebih mahal, seperti alat tulis dan produk multimedia. Gramedia Bookstore menawarkan harga yang lebih tinggi dibandingkan harga yang ditawarkan oleh toko-toko elektronik lainnya. 

Opportunities

Buku merupakan kebutuhan bagi semua orang, tidak terbatas usia sehingga dapat dikatakan permintaan terhadap buku tidak pernah menurun bahkan cenderung bertambah. Hal tersebut dapat menjadi peluang bagi Gramedia Bookstore untuk terus memperluas dan memperkaya usahanya.

Threats

Salah satu ancaman bagi Gramedia Bookstore adalah semakin banyaknya toko buku yang ada yang memberikan harga lebih murah dan sering memberikan diskon bagi pelanggannya. Selain itu penjualan buku melalui media internet kini juga telah marak di masyarakat. Meskipun Gramedia Bookstore juga memiliki situs online, namun keberadaan situs penjualan buku online lainnya juga dapat menjadi ancaman bagi Gramedia Bookstore, seperti contohnya Amazon, Ebay, Kaskus, dll. Dalam hal ini Gramedia Bookstore harus memiliki cara tertentu agar konsumen lebih memilih untuk berbelanja di situs online Gramedia daripada situs lainnya, misalnya seperti prosedur pembelian dan pembayaran yang mudah. Situs penjualan buku online yang telah disebutkan di atas tidak hanya menjual buku namun e-book, sedangkan untuk saat ini Gramedia Bookstore belum menyediakan produk berupa e-book. Kondisi tersebut menjadi ancaman bagi Gramedia Bookstore.


Share:
Read More

CRC dan Class Diagram Library Management System

Use Case Diagram

gbr 1. Use Case Diagram Library Management System

CRC ( Class Responsibilities Collaborator )

CRC adalah kumpulan kartu indeks standar yang telah dibagi menjadi tiga bagian (class,responsibilities, collaborator). Class merupakan koleksi benda-benda yang samaresponsibilities adalah sesuatu yang diketahui class atau tidak, dan collaborator yang berinteraksi  untuk mengisi dari responsibilities.
gbr 2. CRC Library Management System


Class Diagram

Class diagram adalah diagram yang menggambarkan struktur sistem dari segi pendefinisian kelas-kelas yang akan dibuat untuk membangun sistem. kelas memiliki 3 bagian utama yaitu attribute, operation, dan name. kelas-kelas yang ada pada struktur sistem harus dapat melakukan fungsi-fungsi sesuai dengan kebutuhan sistem.
gbr 3. Class Diagram Library Management System

Check Realization

gbr 4. Check Realization Library Management System


Referensi :
Share:
Read More

Minggu, 25 September 2016

Analisis Perancangan Sistem Informasi Toko Buku

Sistem Informasi Toko Buku

TPS ( Transaction Processing Systems)

TPS adalah sistem informasi yang terkomputerisasi yang dikembangkan untuk memproses data dalam jumlah besar untuk transaksi bisnis rutin seperti daftar gaji dan inventarisasi. TPS berfungsi pada level organisasi yang memungkinkan organisasi bisa berinteraksi dengan lingkungan eksternal. Data yang dihasilkan oleh TPS dapat dilihat atau digunakanoleh manajer. Sistem ini bekerja pada level operasional. Input pada level ini adalah transaksi dan kejadian. Proses dalam sistem ini meliputi pengurutan data, melihat data, memperbaharui data. Sedangkan outputnya adalah laporan yang detail, daftar lengkap dan ringkasan.

Pada studi kasus toko buku, yang merupakan TPS adalah kasir dan pembeli. Terlaksananya proses transaksi pembelian buku dan pembayaran oleh pembeli dan petugas kasir.

MIS ( Management Information Systems )

MIS mendukung spektrum tugas-tugas organisasional yang lebih luas dari TPS, termasuk analisis keputusan dan pembuat keputusan. MIS menghasilkan informasi yang digunakan untuk membuat keputusan, dan juga dapat membantu menyatukan beberapa fungsi informasi bisnis yang sudah terkomputerisasi (basis data).

Pada studi kasus toko buku, yang merupakan MIS adalah pengaturan stok buku yang terdapat dalam toko buku oleh supervisor

DSS ( Decision Support System )

DSS hampir sama dengan MIS karena menggunakan basis data sebagai sumber data. DSS bermula dari MIS karena menekankan pada fungsi mendukung pembuat keputusan diseluruh tahap-tahapnya, meskipun keputusan aktual tetap wewenang eksklusif pembuat keputusan.

Jenis-jenis DSS menurut tingkat kerumitan dan tingkat dukungan pemecahan masalahnya adalah sebagai berikut:
  • Mengambil elemen-elemen informasi.
  • Menganalisis seluruh file.
  • Menyiapkan laporan dari berbagai file.
  • Memperkirakan dari akibat keputusan.
  • Mengusulkan keputusan.
  • Membuat keputusan.
Pada studi kasus toko buku, yang merupakan DSS yaitu manager toko tersebut yang memberikan promo kepada pembeli. 

EIS ( Executive Information System )

EIS adalah sistem terkomputerisasi yang menyediakan akses bagi eksekutif secara mudah ke informasi internal dan eksternal yang relevan dengan critical success faktor (faktor penentu keberhasilan)

Pada studi kasus toko buku, yang merupakan EIS yaitu adanya pembukaan cabang toko buku yang baru.
Share:
Read More

Use Case Diagram Library Management System

Studi kasus Sistem Manajemen Perpustakaan adalah perangkat lunak manajemen perpustakaan yang ditujukan untuk memonitor dan mengontrol transaksi yang terjadi di perpustakaan. Studi kasus ini memberikan kita informasi lengkap mengenai perpustakaan dan transaksi keseharian yang terjadi di perpustakaan.


  • Class Diagram


gbr 1. Class diagram library management system
Terdapat 5 kelas yaitu Library, BooksDatabase, Vendor, User dan Librarian 

  • Use Case Diagram

gbr 2. Use case diagram library management system
Librarian 
•Issue a book
•Update and maintain records
•Request the vendor for a book
•Track complaints

User
•Register
•Login
•Search a book
•Request for isse
•View history
•Request to the Librarian
•Unregister

Books Database
•Update records
•Show books status

Vendors
•Provide books to the library
•Payment acknowledgement

  • Sequence Diagram

gbr 3. Sequence diagram untuk mencari buku dan mengisukan buku terserbut dari user ke pustakawan

  • Activity Diagram

Aktivitasnya yaitu:

User Login dan Autentifikasi
Operasi pencarian buku bagi pembaca

Mengakui dan mengisukan buku ke user oleh pustakawan
Menyediakan buku-buku yang diminta oleh pustakawan dari vendor
Pembayaran tagihan dari pustakawan ke vendor
Pembaharuan status buku dalam database buku


gbr 4. Activity diagram library management system

  • State Chart Diagram

gbr 5. State chart diagram library management system
  • Deployment Diagram

gbr 6. Deployment diagram library management system

Sumber referensi : http://www.indiastudychannel.com/resources/150271-UML-Diagrams-case-studies-Library.aspx


Share:
Read More

Sabtu, 28 November 2015

FUSE

FUSE atau Filesystem in User Space 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.
Untuk menginstall FUSE di Linux pertama Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download stable release kemudian Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz). Lakukan installasi FUSE dengan cara :
  1. Gunakan hak akses super user (sudo su)
  2. Ketikkan perintah ./configure
  3. Ketikkan perintah make
  4. Ketikkan perintah make install
FUSE siap digunakan.

Kali ini kita akan membuat program di mana 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. Jika file yang dibuka adalah file berekstensi .bak,   maka 
akan muncul pesan error berisi “File yang anda buka adalah file backup. File tidak bisa diubah maupun disalin kembali!” dan file tersebut tidak akan terbuka dan tidak dibuat backupnya.

Codenya adalah:

#define FUSE_USE_VERSION 30
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef linux
/* For pread()/pwrite()/utimensat() */
#define _XOPEN_SOURCE 700
#endif
#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <sys/time.h>
#ifdef HAVE_SETXATTR
#include <sys/xattr.h>
#include <dirent.h>
#endif

static const char *dirpath = "/home/vania/Documents/";
char logfile[100]="/home/vania/logfilefuse.txt";
char cbackup[100]=".bak";
int numb=0;
char lastaccess[100],lastaccessbackup[100],accessbackup[100][100];
char lastunlink[100],lastunlinkbackup[100];
FILE *fin,*from,*to,*temp;
char buffer[BUFSIZ];
size_t sizetemp;

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_access(const char *path, int mask)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = access(fpath, mask);
    if (res == -1)
        return -errno;

    strcpy(lastaccess,"NULL");
    strcpy(lastaccessbackup,"NULL");
    return 0;
}

static int xmp_readlink(const char *path, char *buf, size_t size)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = readlink(fpath, buf, size - 1);
    if (res == -1)
        return -errno;
    buf[res] = '\0';
    return 0;
}

static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
{
    DIR *dp;
    struct dirent *de;
    (void) offset;
    (void) fi;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    dp = opendir(fpath);
    if (dp == NULL)
    return -errno;
    while ((de = readdir(dp)) != NULL) {
        struct stat st;
        memset(&st, 0, sizeof(st));
        st.st_ino = de->d_ino;
        st.st_mode = de->d_type << 12;
        if (filler(buf, de->d_name, &st, 0))
        break;
    }
    closedir(dp);
    return 0;
}

static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
    int res;
    /* On Linux this could just be ‘mknod(path, mode, rdev)’ but this
    is more portable */
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    if (S_ISREG(mode)) {
        res = open(fpath, O_CREAT | O_EXCL | O_WRONLY, mode);
        if (res >= 0)
        res = close(res);
    }
    else if (S_ISFIFO(mode))
        res = mkfifo(fpath, mode);
    else
        res = mknod(fpath, mode, rdev);
    if (res == -1)
        return -errno;
    //fin=fopen(logfile,”a+”);
    //fprintf(fin,”mknod %s\n”,path);
    //fflush(fin);
    //fclose(fin);
    return 0;
}

static int xmp_mkdir(const char *path, mode_t mode)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = mkdir(fpath, mode);
    if (res == -1)
        return -errno;
    return 0;
}

static int xmp_unlink(const char *path)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = unlink(fpath);
    if (res == -1)
    return -errno;
    strcpy(lastunlink,fpath);
    strcpy(lastunlinkbackup,fpath);
    strcat(lastunlinkbackup,cbackup);
    xmp_unlink(lastunlinkbackup);
   
    return 0;

}

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

static int xmp_symlink(const char *from, const char *to)
{
    int res;
    res = symlink(from, to);
    if (res == -1)
    return -errno;
    return 0;
}

static int xmp_rename(const char *from, const char *to)
{
    int res;
    res = rename(from, to);
    if (res == -1)
    return -errno;

    return 0;
}

static int xmp_link(const char *from, const char *to)
{
    int res;
    res = link(from, to);
    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_chown(const char *path, uid_t uid, gid_t gid)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = lchown(fpath, uid, gid);
    if (res == -1)
    return -errno;
    return 0;
}

static int xmp_truncate(const char *path, off_t size)
//Change the size of a file
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = truncate(fpath, size);
    if (res == -1)
    return -errno;
    return 0;
}

#ifdef HAVE_UTIMENSAT
static int xmp_utimens(const char *path, const struct timespec ts[2])
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    /* don’t use utime/utimes since they follow symlinks */
    res = utimensat(0, fpath, ts, AT_SYMLINK_NOFOLLOW);
    if (res == -1)
    return -errno;
    return 0;
}

#endif
static int xmp_open(const char *path, struct fuse_file_info *fi)
{
    int res,len=strlen(lastaccess),num=0,flag=0;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);

    strcpy(lastaccess,fpath);
    strcpy(lastaccessbackup,fpath);
    strcat(lastaccessbackup,cbackup);

    while(num<numb){
        if(strcmp(lastaccessbackup,accessbackup[num])==0)flag=1;
        if(flag==1){
            res = open(fpath, fi->flags);
            if (res == -1)
                return -errno;
            close(res);
            return 0;
            break;
        }
        num++;
    }
    if(flag==0){
        strcpy(accessbackup[numb],lastaccessbackup);
        numb++;
    }
    len=strlen(lastaccess);
    if ((len >= 2) && strcmp(&(lastaccess[len - 4]), ".bak") == 0){
        char command[100];
            sprintf(command,"zenity --error --text='File yang anda buka adalah file backup. File tidak bisa diubah maupun disalin kembali'");
            system(command);
            return 1;
    }

    res = open(fpath, fi->flags);
    if (res == -1)
        return -errno;

    int j=0, i=0, count=0;
    int len2=strlen(path);
  
    while(j<len2){
        if(path[j]=='.') count=1;
        if(count==1) break;
        j++;
    }

    if(count==1&&flag==0)
        while(i<=len){
        if(lastaccess[i]=='.'){
            if ((len >= 2) && strcmp(&(lastaccess[len - 4]), ".bak") != 0){
                if(access(lastaccessbackup,F_OK)==0) remove(lastaccessbackup);

                from=fopen(lastaccess,"rb");
                to=fopen(lastaccessbackup,"wb");
                char a;
                while(1){
                    a=fgetc(from);
                    if(!feof(from))
                        fputc(a,to);
                    else break;
                }
               

                char command[100];
                sprintf(command,"chmod 444 '%s'",lastaccessbackup);
                system(command);
            }
            //        fclose(from);
        //    fclose(to);
        }
        i++;
    }

    close(res);
    return 0;
}

static int xmp_read(const char *path, char *buf, size_t size, off_t offset,
struct fuse_file_info *fi)
{
    int fd;
    int res;
    (void) fi;
    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;
}

static int xmp_write(const char *path, const char *buf, size_t size,
off_t offset, struct fuse_file_info *fi)
{
    int fd;
    int res;
    (void) fi;
   
    while((sizetemp = fread(buffer, 1, BUFSIZ, from)))
    {
        fwrite(buffer, 1, sizetemp, to);
    }
    fclose(from);
    fclose(to);
   
    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);
    if (res == -1)
        res = -errno;
    close(fd);
    return res;
}

static int xmp_statfs(const char *path, struct statvfs *stbuf)
//Get file system statistics
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = statvfs(fpath, stbuf);
    if (res == -1)
    return -errno;
    return 0;
}

static int xmp_release(const char *path, struct fuse_file_info *fi)
/*Release an open file
Release is called when there are no more references to an open file:
all file descriptors are closed and all memory mappings are unmapped.*/
{
    /* Just a stub.  This method is optional and can safely be left
    unimplemented */
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    (void) fpath;
    (void) fi;
    return 0;
}

static int xmp_fsync(const char *path, int isdatasync,
//Synchronize file contents
struct fuse_file_info *fi)
{
    /* Just a stub.  This method is optional and can safely be left
    unimplemented */
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    (void) fpath;
    (void) isdatasync;
    (void) fi;
    return 0;
}

#ifdef HAVE_POSIX_FALLOCATE
static int xmp_fallocate(const char *path, int mode,
off_t offset, off_t length, struct fuse_file_info *fi)
//Allocates space for an open file
{
    int fd;
    int res;
    (void) fi;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    if (mode)
        return -EOPNOTSUPP;
    fd = open(fpath, O_WRONLY);
    if (fd == -1)
        return -errno;
    res = -posix_fallocate(fd, offset, length);
    close(fd);
    return res;
}

#endif
#ifdef HAVE_SETXATTR
/* xattr operations are optional and can safely be left unimplemented */
static int xmp_setxattr(const char *path, const char *name, const char *value,
size_t size, int flags)
//Set extended attributes
{
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    int res = lsetxattr(fpath, name, value, size, flags);
    if (res == -1)
    return -errno;
    return 0;
}

static int xmp_getxattr(const char *path, const char *name, char *value,
size_t size)
//Get extended attributes
{
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    int res = lgetxattr(fpath, name, value, size);
    if (res == -1)
    return -errno;
    return res;
}

static int xmp_listxattr(const char *path, char *list, size_t size)
//List extended attributes
{
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    int res = llistxattr(fpath, list, size);
    if (res == -1)
    return -errno;
    return res;
}

static int xmp_removexattr(const char *path, const char *name)
{
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    int res = lremovexattr(fpath, name);
    if (res == -1)
    return -errno;
    return 0;
}


#endif /* HAVE_SETXATTR */

static struct fuse_operations xmp_oper = {
    .getattr        = xmp_getattr,
    .access         = xmp_access,
    .readlink       = xmp_readlink,
    .readdir        = xmp_readdir,
    .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,
    #ifdef HAVE_UTIMENSAT
    .utimens        = xmp_utimens,
    #endif
    .open           = xmp_open,
    .read           = xmp_read,
    .write          = xmp_write,
    .statfs         = xmp_statfs,
    .release        = xmp_release,
    .fsync          = xmp_fsync,
    #ifdef HAVE_POSIX_FALLOCATE
    .fallocate      = xmp_fallocate,
    #endif
    #ifdef HAVE_SETXATTR
    .setxattr       = xmp_setxattr,
    .getxattr       = xmp_getxattr,
    .listxattr      = xmp_listxattr,
    .removexattr    = xmp_removexattr,
    #endif
};

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

Simpan kodingan tersebut dengan ekstensi.c, compile di terminal dengan cara : gcc -Wall [nama file].c `pkg-config fuse –cflags –libs` -o [nama file]. Kemudian buat sebuah direktori, misalnya: /home/vania/Downloads/fuse. Coba jalankan fuse tadi dengan cara: ./[nama file] /home/vania/Downloads/fuse . Maka semua isi direktori /home/vania/Documents akan dimount ke direktori /home/vania/Downloads/fuse. Jika salah satu file dibuka, maka akan dibuat file .bak nya. Dan jika file .bak tersebut dibuka maka akan muncul pesan error.
Share:
Read More

Sabtu, 07 November 2015

[THREAD] Membuat Music Player versi Sendiri

Sebelum kita membuat music player, kita harus mengerti dahulu apa itu thread.
Thread adalah bagian kecil dari suatu proses yang bisa di jadwalkan oleh sistem operasi. Thread juga disebut sebagai proses ringan (lightweight). Macamnya ada 2, yaitu :
  • Single Threading : sebuah proses yang hanya memiliki satu thread yang berjalan. Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses.
  • Multi Threading : proses yang memiliki lebih dari satu thread yang berjalan didalamnya, sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu waktu.
Nah music player yang kita buat di sini adalah multi threading. Nantinya music player yang kita buat dijalankan berbasis konsol. Fiturnya ada menu help, list, play lagu, pause lagu, continue lagu dan stop lagu.
Pertama-tama, kita buat fungsi threadnya dahulu :

void* playAndCount(void *arg){ //fungsi yg akan dijalankan sbg thread
    unsigned long i=0;
    pthread_t id=pthread_self();
    int iter;
    if(pthread_equal(id,tid[0])){ //thread pertama menjalankan menu
        system("clear");
        printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    }
    else if(pthread_equal(id,tid[1])){ //thread kedua melihat list
    //system("clear");   
    system("cd playlist");       
    system("ls | grep .mp3");
    }
    else if(pthread_equal(id,tid[2])){ //thread ketiga menjalankan lagu
    char tmp[1000];
    if(init==1) system("kill -9 $(pgrep vlc)");
    init=1;
    //printf("%s playing\n", path[nolagu-1]);
    sprintf(tmp, "cvlc %s", path[nolagu-1]);
    system(tmp);
   
    }
    else if(pthread_equal(id,tid[3])){ //thread keempat pause lagu
        sleep(detik);
    system("kill -20 $(pgrep vlc)");
    }
    else if(pthread_equal(id,tid[4])){ //thread kelima melanjutkan lagu    
    sleep(detik);
    system("kill -18 $(pgrep vlc)");   
    }
    else if(pthread_equal(id,tid[5])){ //thread keenam stop lagu
    init=0;       
    system("kill -9 $(pgrep vlc)");
    }
    return NULL;
}

Untuk di main function kita tulis :

int main()
{
    system("clear");
    printf("C06 Music Player\n");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    int i=0,pilihan;
    int err;
    init=0;
    while(1){
    //system("clear");
    scanf("%d", &pilihan);
    if(pilihan==3){
        system("clear");
        system("cd playlist");
        FILE *fp = popen("ls | grep .mp3", "r");      
        while (fgets(path[j], sizeof(path[j]), fp) != NULL){
            printf("%s", path[j]);
            j++;
        }          
        printf("Masukkan pilihan lagu yang ingin dimainkan(nomer baris 1-...): ");
        scanf("%d", &nolagu);
        //printf("%d %s", nolagu, path[nolagu-1]);
        pclose(fp);
    }
    else if(pilihan==4){
        printf("Musik pause setelah :");
        scanf("%d", &detik);
    }
    else if(pilihan==5){
        printf("Musik continue setelah :");
        scanf("%d", &detik); 
    }  
        err=pthread_create(&(tid[pilihan-1]), NULL, &playAndCount, NULL); //membuat thread
        if(err!=0){ //cek error pembuatan thread
            printf("\ncan't create thread: [%s]", strerror(err));
        }
        else{
            //printf("\nThread created successfully\n");
        }
    system("clear");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
       
    }
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_join(tid[2],NULL);
    pthread_join(tid[3],NULL);
    pthread_join(tid[4],NULL);
    pthread_join(tid[5],NULL);

    return 0;
}

Bila digabungkan maka kodingannya akan seperti ini :

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

pthread_t tid[6]; //inisialisasi array u/ menampung thread. dalam kasus ini ada 6
int detik, init;
int nolagu, j=0;
char path[100][1024];


void* playAndCount(void *arg){ //fungsi yg akan dijalankan sbg thread
    unsigned long i=0;
    pthread_t id=pthread_self();
    int iter;
    if(pthread_equal(id,tid[0])){ //thread pertama menjalankan menu
        system("clear");
        printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    }
    else if(pthread_equal(id,tid[1])){ //thread kedua melihat list
    //system("clear");  
    system("cd playlist");      
    system("ls | grep .mp3");
    }
    else if(pthread_equal(id,tid[2])){ //thread ketiga menjalankan lagu
    char tmp[1000];
    if(init==1) system("kill -9 $(pgrep vlc)");
    init=1;
    //printf("%s playing\n", path[nolagu-1]);
    sprintf(tmp, "cvlc %s", path[nolagu-1]);
    system(tmp);
   
    }
    else if(pthread_equal(id,tid[3])){ //thread keempat pause lagu
        sleep(detik);
    system("kill -20 $(pgrep vlc)");
    }
    else if(pthread_equal(id,tid[4])){ //thread kelima melanjutkan lagu    
    sleep(detik);
    system("kill -18 $(pgrep vlc)");  
    }
    else if(pthread_equal(id,tid[5])){ //thread keenam stop lagu
    init=0;      
    system("kill -9 $(pgrep vlc)");
    }
    return NULL;
}

int main()
{
    system("clear");
    printf("C06 Music Player\n");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    int i=0,pilihan;
    int err;
    init=0;
    while(1){
    //system("clear");
    scanf("%d", &pilihan);
    if(pilihan==3){
        system("clear");
        system("cd playlist");
        FILE *fp = popen("ls | grep .mp3", "r");      
        while (fgets(path[j], sizeof(path[j]), fp) != NULL){
            printf("%s", path[j]);
            j++;
        }          
        printf("Masukkan pilihan lagu yang ingin dimainkan(nomer baris 1-...): ");
        scanf("%d", &nolagu);
        //printf("%d %s", nolagu, path[nolagu-1]);
        pclose(fp);
    }
    else if(pilihan==4){
        printf("Musik pause setelah :");
        scanf("%d", &detik);
    }
    else if(pilihan==5){
        printf("Musik continue setelah :");
        scanf("%d", &detik); 
    }  
        err=pthread_create(&(tid[pilihan-1]), NULL, &playAndCount, NULL); //membuat thread
        if(err!=0){ //cek error pembuatan thread
            printf("\ncan't create thread: [%s]", strerror(err));
        }
        else{
            //printf("\nThread created successfully\n");
        }
    system("clear");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
       
    }
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_join(tid[2],NULL);
    pthread_join(tid[3],NULL);
    pthread_join(tid[4],NULL);
    pthread_join(tid[5],NULL);

    return 0;
}

Simpan kodingan tersebut, dan compile dengan :  gcc -pthread -o [output] input.c
Share:
Read More

Sabtu, 17 Oktober 2015

[HOWTO] Mencatat Proses yang sedang Berjalan

Kali ini, saya akan berbagi mengenai cara mencatat setiap proses yang sedang berjalan dari user yang sedang aktif. Namun untuk melakukan itu, pertama-tama kita buat daemon dahulu. Daemonnya adalah seperti ini :

#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) {
        sleep(10);
     }

    exit(EXIT_SUCCESS);
}
Jangan lupa untuk membuat daemon tsb dalam file ekstensi c.
Untuk mengetahui proses yang sedang berjalan dari user yang sedang login kita bisa mengetikkan ps ux di terminal. Namun karena kita akan membuatnya di C, kita tidak bisa mengetikkan ps ux begitu saja. Kita perlu memanggil system. Nah cara mudahnya sebenarnya kita bisa menambahkan system("ps ux > logfile.txt") di dalam while(1). Tapi, di sini saya akan membuatnya dengan memadukan bahasa C. Penulisannyapun juga akan tetap dimasukkan di dalam while(1).

char path[1024];

        FILE *fp = popen("ps ux", "r");
        FILE *out= fopen("home/vania/C06_log.txt", "w+");
        if (fp == NULL)
        {
            perror("popen: ");
            exit(EXIT_FAILURE);
        }
        while (fgets(path, sizeof(path), fp) != NULL)
            fprintf(out,"%s", path);


        pclose(fp);  
        fclose(out);  
        sleep(10);

popen di atas adalah untuk menjalankan process di system. Jadi, nantinya output dari process tsb akan dimasukkan ke dalam sebuah file txt dengan nama C06_log.txt dan menyimpannya di direktori tsb . Untuk kodingan keseluruhannya adalah sebagai berikut :

#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) {
        char path[1024];

        FILE *fp = popen("ps ux", "r");
        FILE *out= fopen("home/vania/C06_log.txt", "w+");
        if (fp == NULL)
        {
            perror("popen: ");
            exit(EXIT_FAILURE);
        }
        while (fgets(path, sizeof(path), fp) != NULL)
            fprintf(out,"%s", path);


        pclose(fp);  
        fclose(out);  
        sleep(10);
    }

    exit(EXIT_SUCCESS);
}
Untuk menjalankan kodingan tersebut, di terminal kita ketikkan gcc -o proses proses.c (di sini saya menyimpan file tsb dengan proses.c). Lalu jalankan proses tsb dengan ./proses . Nantinya akan keluar C06_log.txt di direktori home dan akan terupdate setiap 10 detik. Jika ingin mengubah updateannya bisa diganti waktunya sesuai yang diinginkan di perintah sleep(). Jika ingin menghentikkan proses, bisa kita ketikkan pkill proses di terminal.
Sekian dan terima kasih.
Share:
Read More