Selasa, 03 Januari 2017

Perancangan Perangkat Lunak “Vending Machine e-money Mandiri”


90s pepsi vending machine

Vending Machine e-money Mandiri

Ternyata cukup dengan menggunakan e-money kita bisa mendapatkan minuman segar dari Vending machine Mandiri.
Pertama memilih produk, kemudian menempelkan kartunya, dalam hitungan detik, minuman menggelinding keluar. Hore!!
Berikut gambar mesinnya :
 1
 2
 3

 Berikut cara penggunaanya :


Infrastruktur Vending Machine

Mari kita lihat komponen yang ada didalam sebuah vending machine pada umumnya

4.jpg

Komponen dari vending machine antara lain :
  • Mikrokontoler : Sebagai komputer yang mengolah semua perangkat di vending mechine agar bekerja dengan baik
 
  •  Card reader : Membaca identitas dari kartu yang ditempelkan, dengan decode melalui akses ke database Bank Mandiri
 Hasil gambar untuk vending machine card reader

  • CD : Menampilkan intruksi dan keterangan yang ada
  • Bottle Dispenser : Menampung dan mengeluarkan botol
Internal layout of a vending machine

  • Power Socker: Daya/sumber energi dari vending machine
 Hasil gambar untuk vending machine power
  •  Refrigrator : Pendingin produk/botol
 
  •  Produk / Botol

4+1 Model View

Setelah menggunakan vending machine, mari kita analisa bagaimana vending machine bekerja menggunakan 4+1 model view. Hal diperlukan dalam menggambarkan arsitektur pada sebuah perangkat lunak.
 Hasil gambar untuk 4+1 model view
  • Logical view menggambarkan fungsionalitas sistem kepada end-user, antara lain : Class diagram, Object diagram, Collaboration diagram.
  • Process view berurusan dengan aspek dinamis pada sistem, dan fokus pada perikalu sistem, antara lain Sequence diagram, Activity diagram
  • Development view menggambarkan sistem pada sudut pandang programmer, antara lain Component diagram
  • Physical view menggambarkan sistem pada sudut pandang enggineer fisik dari device, antara lain Deployment diagram
  • Skenario mengilustrasikann skema bagaimana sistem bekerja dengan menggunakan use case diagram

Scenarios

Use Case Diagram
 us.png

Process View

Sequence Diagram

sq

Activity Diagram
 ac.png

Logical View

Class Diagram
 cl.png

Collaboration Diagram
 cl


Development View

Component Diagram
 comp-png

Physical View

Deployment Diagram
 dp

Design Pattern Vending Machine

Vending Machine = State Design Pattern
State pattern memungkinkan sebuah objek mengubah behavior nya ketika internal state nya berubah, hal ini ditemukan di vending machine. Vending machine memiliki state-state berdasarkan stock nya, jumlah uang yang terdeposit, ability untuk berubah state, memilih item, dll. Ketika uang didepositkan dan pilihan telah ditentukan, vending machine akan entah mengeluarkan produk nya dan tidak ada perubahan, mengeluarkan produk dan berubah state, tidak mengeluarkan produk karena kekurangan uang, atau tidak mengeluarkan produk karena kekuarangan stock minuman.
 State example


Implementasi Vending Machine

Setelah menganalisa diagramnya, berikut implementasi dari vending machine tadi
 3.gif


Berikut link source code : github.com/dzakybd/VendingMachine

Disusun oleh :
  • Dzaky ZF (5114100067)
  • M. Anwar (5114100137)
  • Andreas Galang (5114100153)
Referensi
  • fajarbaskoro.blogspot.com
  • en.wikipedia.org/wiki/4%2B1_architectural_view_model
  • youtu.be/QlghTi1WWfY
  • youtu.be/Smbyr9eZcd0
  • world2buzz.blogspot.co.id/2013_05_01_archive.html
  • deamertek.com/Fridge.aspx
  • cleanprolaundryparts.com/cleanpro/256-6-cph-1k-018-cph-vending-machine-power-socket-power-supply-.html
  • eufass.blogspot.co.id/2012/12/whats-inside-vending-machine-and-trivia.html
  • sourcemaking.com/design_patterns/state

Minggu, 27 November 2016

Design Pattern - Singleton Pattern

Definisi

Singleton pattern adalah salah satu pola desain sederhana di Java. Jenis pola desain ini berada di bawah pola penciptaan sebagai pola yang memberikan salah satu cara terbaik untuk membuat sebuah objek.

Pola ini melibatkan satu kelas yang bertanggung jawab untuk membuat sebuah objek sambil memastikan bahwa hanya objek tunggal yang akan dibuat. Kelas ini menyediakan cara untuk mengakses hanya objeknya yang dapat diakses langsung tanpa perlu instantiate objek dari kelas.

Singleton pattern diimplementasikan dengan membuat class dengan method yang membuat instance class yang baru jika instance belum ada. Jika instance sudah ada maka akan diarahkan object yang telah ada. Untuk mencegah object tidak instankan berkali-kali maka constructor dirubah menjadi private atau protected, protected constructor bisa dipanggil oleh subclass dan class yang berada dalam satu package, jika private constructor maka hanya bisa dipanggil oleh class itu sendiri tetapi itu berarti class tersebut tidak bisa di subclass-kan



Implementation

Kita akan membuat kelas SingleObject. Kelas SingleObject memiliki konstruktor private dan memiliki static instance itu sendiri.

Kelas SingleObject menyediakan metode statis untuk mendapatkan static instance untuk outside world. SingletonPatternDemo, kelas demo akan menggunakan kelas SingleObject untuk mendapatkan objek SingleObject.



Step 1

Buat Singleton Class
public class SingleObject {

   //create an object of SingleObject
   private static SingleObject instance = new SingleObject();

   //make the constructor private so that this class cannot be
   //instantiated
   private SingleObject(){}

   //Get the only object available
   public static SingleObject getInstance(){
      return instance;
   }

   public void showMessage(){
      System.out.println("Hello World!");
   }
}

Step 2
Dapatkan satu-satunya obyek dari singleton class
public class SingletonPatternDemo {
   public static void main(String[] args) {

      //illegal construct
      //Compile Time Error: The constructor SingleObject() is not visible
      //SingleObject object = new SingleObject();

      //Get the only object available
      SingleObject object = SingleObject.getInstance();

      //show the message
      object.showMessage();
   }
}

Step 3
Cetak output


Penggunaan

Contoh penggunaan singleton pattern adalah pada kasus aplikasi yang menggunakan MDI (multiple document interface).

Pada aplikasi MDI ketika kita tidak menerapkan singleton maka ketika membuka sebuah form child dengan menekan sebuah menu, yang terjadi adalah penciptaan sebuah objek dari form child yang bersangkutan setiap kali tombol ditekan. Jika kita menekan menu sebanyak 5 kali maka akan ada 5 form yang sama. Tentunya yang diinginkan hanya ada 1 form.


Referensi : 
  1. https://www.tutorialspoint.com/design_pattern/singleton_pattern.html
  2. http://www.vincehuston.org/dp/singleton.html
  3. http://www.newthinktank.com/videos/design-patterns-tutorial/
  4. http://agung-setiawan.com/implementasi-nyata-singleton-pattern/

Senin, 24 Oktober 2016

Perancangan Perangkat Lunak – Sistem Perpustakaan

Use Case Diagram

Sequence Diagram Peminjaman Buku 



Sequence Diagram Pengembalian Buku


Class Diagram 


Code Implementasi


#include<iostream>
#include<stdlib.h>

using namespace std;

int n,n1;
int i;
int inc=0;
int inc1=0;

class book
{
public:
 int bookcode;
 char bookname[20];
 char authorname[20];
 int bookprice;
 int status;
public:
 void addbook()
 {
  status=1;
  cout<<"\t\t\t TAMBAH BUKU"<<endl<<endl;
  inc++;
  bookcode=100+inc;
  cout<<"\n\tKode Buku                :"<<bookcode<<endl;
  cout<<"\n\tNama Buku          :";
  cin>>bookname;
  cout<<"\n\tPenulis        :";
  cin>>authorname;
  cout<<"\n\tHarga         :";
  cin>>bookprice;
 }

 void display_book()
 {
  cout<<bookcode<<"\t\t"<<bookname<<"\t\t"<<authorname<<"\t\t"<<"\t\t"<<bookprice<<endl;
 }

 void book_status()
 {
  if(status==1)
  {
   cout<<"\t\tID Buku:"<<bookcode<<"\t\tStatus:Available"<<endl;
  }
  else
  {
   cout<<"\t\tID Buku:"<<bookcode<<"\t\tStatus:Issued"<<endl;
  }
 }
}; book b[10];

class member
{
public:
 int borrower_id;
 char studname[20];
 int bookcount;
public:
 void addstud()
 {
  cout<<"\t\tTambah Peminjam"<<endl;
  cout<<endl;
  inc1++;
  borrower_id=100+inc1;
  cout<<"\t\tID Peminjam            :"<<borrower_id<<endl;
  cout<<"\t\tNama   :";
  cin>>studname;
  cout<<endl;
  bookcount=2;
  cout<<"\t\tMaximum Buku:"<<bookcount<<endl<<endl;
 }
 
 void dispstud()
 {
  cout<<"\t"<<borrower_id<<"\t\t"<<studname<<endl;
 }
};member s[10];

class transaksi
{
public:
 int day,month,year;
 int day2,month2,year2;
 int iday,imon,iyear;
 int rday,rmon,ryear;
 int eday,emon,eyear;
 int yr1,yr2,m1,m2,d1,d2,mons1,mons2,mons,days,yrs,sum,j;
 int  loop;
 int fine;

public:
 void isdatecalc()
 {
  cout<<"\t\thari:";
  cin>>day;
  cout<<"\t\tbulan:";
  cin>>month;
  cout<<"\t\ttahun:";
  cin>>year;
  day2=day;
  month2=month;
  year2=year;
  day2=day2+20;

  if(((month2==1)||(month2==3)||(month2==5)||(month2==7)||(month2==8)||(month2==10)||(month2==12))&&((day2>31)))
  {
   day2=day2-31;
   month2=month2+1;
   if(month2==13)
   {
    year2++;
    month2=1;
   }
  }
  else if(((month2==4)||(month2==6)||(month2==9)||(month2==11))&&((day2>30)))
  {
   day2-=30;
   month2++;
  }
  else if(((year2%4==0)||(year2%400==0))&&(day2>29)&&(month==2))
  {
   day2-=29;
   month2++;
  }
  else if(((year2%4!=0)||(year2%100!=0)||(year2%400!=0))&&(day2>28)&&(month2==2))
  {
   day2-=28;
   month2++;
  }
  cout<<endl;
 }
 
 void isdate()
 {
  iday=day;
  imon=month;
  iyear=year;

  cout<<"\t\tTanggal pinjam:"<<iday<<"/"<<imon<<"/"<<iyear;
  cout<<endl;
 }
 
 void retdate()
 {
  rday=day2;
  rmon=month2;
  ryear=year2;
  cout<<"\t\tTanggal kembali:"<<rday<<"/"<<rmon<<"/"<<ryear<<endl;
  cout<<endl;
 }
 
 void edatecalc()
 {
  eday=rday;
  emon=rmon;
  eyear=ryear;
  eday=eday+20;
  if(((emon==1)||(emon==3)||(emon==5)||(emon==7)||(emon==8)||(emon==10)||(emon==12))&&((eday>31)))
  {
   eday=eday-31;
   emon=emon+1;
   if(emon==13)
   {
    eyear++;
    emon=1;
   }
  }
  else if(((emon==4)||(emon==6)||(emon==9)||(emon==11))&&((eday>30)))
  {
   eday-=30;
   emon++;
  }
  else if(((eyear%4==0)||(eyear%100==0)||(eyear%400==0))&&(eday>29)&&(emon==2))
  {
   eday-=29;
   emon++;
  }
  else if(((eyear%4!=0)||(eyear%100!=0)||(eyear%400!=0))&&(eday>28)&&(emon==2))
  {
   eday-=28;
   emon++;
  }
  cout<<endl;
  cout<<endl;

  cout<<"\t\tperpanjang tanggal kembali:"<<eday<<"/"<<emon<<"/"<<eyear<<endl;
 }
 void finecalc(){
  int mon[]={31,28,31,30,31,30,31,31,30,31,30,31};
  loop=365;
  sum=0;
  d1=rday;
  m1=rmon;
  yr1=ryear;
  cout<<endl;
  cout<<"\t\ttanggal kembali: "<<d1<<"/"<<m1<<"/"<<yr1<<endl;
  cout<<endl;
  cout<<"\t\tmasukkan tanggak kembali.."<<endl;
  cout<<endl;
  cout<<"\t\thari:";
  cin>>d2;
  cout<<endl;
  cout<<"\t\tbulan:";
  cin>>m2;
  cout<<endl;
  cout<<"\t\ttahun:";
  cin>>yr2;
  cout<<endl;
  days=d2-d1;
 
  yrs=yr2-yr1;
  if(m2>=m1)
  {
   mons=m1-m2;
   mons2=abs(mons);
  }
  else
  {
   mons=m2-m1;
   mons2=abs(mons);
  }
  sum=yrs*loop+mons+days+mons2;
  if(m2>m1)
  {
   j=m1;
  }
  else
  {
   j=m2;
  }
  if(mons2!=0)
  {
 
 
   for(i=0;i<mons2;i++)
   {
    sum=sum+mon[j];
    j++;
   }
  }
  cout<<endl;
  cout<<"\t\ttanggal kembali:"<<d2<<"/"<<m2<<"/"<<yr2<<endl;
  cout<<endl;
  fine=(sum+mons)*1;
 
  if((yr1%4==0)||(yr1%400==0)&&(m1==2))
  {
   fine=fine+1;
  }
       cout<<"\t\t\tJumlah denda"<<fine<<endl;
 }
}; transaksi is;


int main()
{
 int option,i;
 char ch2,ch3,ch4;
 int sbookcode,sstudid;
 int flag,flag1,pos,spos,ipos;
 int sflag,stpos;
 int book_id,borrower_id;
 int rbookcode,rstudid;
 int rflag1,rflag2;
 int rpos1,rpos2,l;
 do
 {
  cout<<"\t\t\tLIBRARY MANAGEMENT SYSTEM"<<endl<<endl;
  cout<<"\t\t\t\tMAINMENU"<<endl<<endl;
  cout<<"\t\t  ##############################################"<<endl<<endl;
  cout<<"\t\t \t1. TAMBAH BUKU            "<<endl;
  cout<<"\t\t \t2. LIHAT SEMUA BUKU       "<<endl;
  cout<<"\t\t \t3. TAMBAH DATA PEMINJAM   "<<endl;
  cout<<"\t\t \t4. LIHAT DATA PEMINJAM  "<<endl;
  cout<<"\t\t \t5. PINJAM BUKU            "<<endl;
  cout<<"\t\t \t6. KEMBALIKAN BUKU        "<<endl;
  cout<<"\t\t \t0. EXIT                   "<<endl<<endl;
  cout<<"\t\t  ##############################################"<<endl;
  cout<<endl;
  cout<<"\t\t\t\tPilih opsi:";
  cin>>option;
  switch(option)
  {
   case 1:
    cout<<"\t\tTambah Buku"<<endl<<endl;
    cout<<"\t\tMasukkan jumlah buku :";
    cin>>n;
    for(i=1;i<=n;i++)
    {
     cout<<"Kode buku:"<<100+i;
     b[i].addbook();
    }

    cout<<endl;
    cout<<endl;
    cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;
    main();
    break;

   case 2:
    cout<<"\t\t\tDAFTAR BUKU"<<endl<<endl;
    cout<<"KODE BUKU\tJUDUL\tPENULIS \tHARGA"<<endl<<endl;
    for(i=1;i<=n;i++)
    {
     b[i].display_book();
    }
    cout<<endl;
    for(i=1;i<=n;i++)
    {
     b[i].book_status();
    }
    cout<<endl;
    cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;
    main();
    break;

   case 3:
    cout<<"\t\tTAMBAH PEMINJAM"<<endl<<endl;
    cout<<"\t\tJumlah : ";
    cin>>n1;
    for(i=1;i<=n1;i++)
    {
     s[i].addstud();
    }
    cout<<endl;
    cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;
    main();
    break;

   case 4:
    cout<<"\t\tLIST OF ALL ADDED STUDENTS"<<endl;
           cout<<"\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^"<<endl;
    cout<<endl;
    cout<<"\t******************************************"<<endl;
    cout<<"\tSTUDENT ID\tSTUDENT NAME\tDEPT NAME"<<endl;
    cout<<"\t******************************************"<<endl;
   
     for(i=1;i<=n1;i++)
    {
       s[i].dispstud();
   
    }
    cout<<endl;
   
    cout<<"\t<<-----Back To Main Menu-----"<<endl;
    main();
    break;
    break;

   case 5:
    cout<<"\t\t PEMINJAMAN BUKU"<<endl<<endl;
    cout<<"\t\tID Peminjam:";
    cin>>borrower_id;
    for(i=1;i<=n1;i++)
    {
     if(borrower_id==s[i].borrower_id)
     {
      flag=1;
      spos=i;
     }
    }
    if(flag==1)
    {
     cout<<"\t\tKode Buku:";
     cin>>book_id;
     for(i=1;i<=n;i++)
     {
      if(book_id==b[i].bookcode)
      {
       flag1=1;
       ipos=i;
      }
     }
    }
    cout<<endl;

    if(flag==1)
    {
     if(flag1==1)
     {
      if(s[spos].bookcount!=0)
      {
       if(b[ipos].status==1)
       {
        s[spos].bookcount--;
        b[ipos].status=0;
        cout<<"\t\tTanggal Peminjaman"<<endl<<endl;
        is.isdatecalc();
        is.isdate();
        is.retdate();
        cout<<"\t\tBuku berhasil dipinjam"<<endl;
        cout<<endl;
        cout<<"\t\tBooks allowed now:"<<s[spos].bookcount<<endl;
        cout<<endl;
        cout<<"\t ID Peminjam\t Nama\t Kode Buku"<<endl;
        cout<<"\t ----------\t ------------\t --------"<<endl;
        cout<<"\t "<<s[spos].borrower_id<<"\t\t "<<s[spos].studname<<"\t\t "<<b[ipos].bookcode<<endl;
       }
       else
       {
        cout<<"\t\tMohon maaf, buku sudah dipinjam"<<endl;
       }
      }
      else
      {
       cout<<"\t\tMohon maaf, tidak dapat meminjam lebih dari dua buku"<<endl;
      }

     }
     else
     {
      cout<<"\t\tMohon maaf, buku tidak ditemukan dengan ID : "<<book_id<<endl;
     }
    }
    else

    {
     cout<<"\t\tMohon maaf, ID peminjam tidak ditemukan:"<<borrower_id<<endl;
    }

    cout<<endl;
    cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;
    main();
    break;

   case 6:
    cout<<"\t\tPengembalian Buku"<<endl<<endl;
    cout<<"\t\tID Peminjam";
    cin>>rstudid;
    cout<<endl;
    for(i=1;i<=n1;i++)
    {
     if(rstudid==s[i].borrower_id)
     {
      rflag1=1;
      rpos1=i;
     }
    }

    if(rflag1==1)
    {

     cout<<"\t\tID Buku :";
     cin>>rbookcode;
     cout<<endl;
     for(i=1;i<=n;i++)
     {
      if(rbookcode==b[i].bookcode)
      {
       rflag2=1;
       rpos2=i;
      }
     }
    }
    if(rflag1==1)
    {
     if(rflag2==1)
     {
      cout<<"\tID Buku:"<<b[rpos2].bookcode<<" ID Peminjam:"<<s[rpos1].borrower_id<<" ?y/n:";
      cin>>ch4;
      if(ch4=='y')
      {
       if(b[rpos2].status==0)
       {
        cout<<endl;
        cout<<"\t\tBuku yang dapat dikembalikan..."<<endl;
        cout<<endl;
        is.retdate();
        cout<<"\t\tApakah kamu yakin mengembalikan buku ini ?y/n:";
        cin>>ch2;
        cout<<endl;
        if(ch2=='y')
        {
         cout<<"\t\t Buku belum lewat batas waktu ?y/n:";
         cin>>ch3;
         cout<<endl;
         if(ch3=='y')
         {
       //   is.retdate();
         //cout<<endl;
         // cout<<"\t\tBook returned before due date"<<endl;
         // cout<<endl;
          cout<<"\t\t\tFine - NIL"<<endl;
          cout<<endl;
          cout<<"\t\t\t THANK YOU"<<endl;
          b[rpos2].status=1;
          s[rpos1].bookcount++;
          cout<<endl;
          cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;
          main();
         }
         else
         {
          cout<<endl;
          cout<<"\t\tAnda harus membayar tagihan !!!"<<endl;

          is.finecalc();
          cout<<endl;
          b[rpos2].status=1;
          s[rpos1].bookcount++;
          cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;

          main();
         }
        }

        else
        {
         is.retdate();
         cout<<endl;
         cout<<"\t\tYou can extend the book for another twenty days.."<<endl;
         is.edatecalc();

        }

       }
       else
       {
        cout<<endl;
        cout<<"\t\tThis Book is not yet issued from library.. "<<endl;
       }
      }
      else
      {
       cout<<endl;
       cout<<"\t\t This book is not issued to you..Sorry!!!"<<endl;
      }
     }
     else
     {
      cout<<endl;
      cout<<"\t\tSorry!..No Book Exists With Code:"<<rbookcode<<endl;
     }

    }

    else
    {
     cout<<endl;
     cout<<"\t\tMohon maaf, ID peminjam tidak ditemukan:"<<rstudid<<endl;
    }

    cout<<endl;
    cout<<"\t\t<<-----Kembali ke Main Menu-----"<<endl;

    main();
    break;

   case 0:exit(0);
    default: 
    cout<<"\t\tPilihan salah.."<<endl;
    cout<<"\t\tMasukkan ulang pilihan...."<<endl;
    cout<<endl;
    cout<<"\t\t\t<<---Kembali---"<<endl;
    main();
    break;
  }
 }while(option==0);
}


by : Andreas Galang A (5114100153)

Senin, 17 Oktober 2016

Prototipe Program ATM

Setelah membuat UseCase Diagram coba kita buat prototype dari mesin ATM. Untuk melihat use case diagram serta sequence diagramnya dapat dilihat pada http://exodblog.blogspot.sg/2016/09/use-case-dan-interaction-diagram-untuk.html

#include
#include
#include
#include
using namespace std;

class account
{
	int acno;
	char name[50];
	int deposit;
public:
	void create_account();	
	void show_account() const;
	void dep(int);
	void draw(int);
	void report() const;
	int retacno() const;
	int retdeposit() const;	
};        

void account::create_account()
{
	cout<<"\nMasukkan no rekening. :";
	cin>>acno;
	cout<=500 ) : ";
	cin>>deposit;
	cout<<"\n\n\nAkun berhasil dibuat..\n";
}

void account::show_account() const
{
	cout<<"\nNo. rekening : "<>ch;
		system("cls");
		switch(ch)
		{
		case '1':
			write_account();
			break;
		case '2':
			cout<<"\n\n\tNo. rekening : "; cin>>num;
			deposit_withdraw(num, 1);
			break;
		case '3':
			cout<<"\n\n\tNo. rekening : "; cin>>num;
			deposit_withdraw(num, 2);
			break;
		case '4': 
			cout<<"\n\n\tNo. rekening : "; cin>>num;
			display_sp(num);
			break;
		case '5':
			display_all();
			break;
		 case '6':
			cout<<"\n\n\tBye ...";
			break;
		 default :cout<<"\a";
		}
		cin.ignore();
		cin.get();
	}while(ch!='6');
	return 0;
}

//    	write to file 

void write_account()
{
	account ac;
	ofstream outFile;
	outFile.open("account.txt",ios::binary|ios::app);
	ac.create_account();
	outFile.write(reinterpret_cast (&ac), sizeof(account));
	outFile.close();
}

//    	Menampilkan saldo akun spesifik

void display_sp(int n)
{
	account ac;
	bool flag=false;
	ifstream inFile;
	inFile.open("account.txt",ios::binary);
	if(!inFile)
	{
		cout<<"File error !";
		return;
	}
	cout<<"\nDETAIL SALDO\n";

    	while(inFile.read(reinterpret_cast (&ac), sizeof(account)))
	{
		if(ac.retacno()==n)
		{
			ac.show_account();
			flag=true;
		}
	}
	inFile.close();
	if(flag==false)
		cout<<"\n\nTidak ditemukan akun ..";
}

//    	Menampilkan saldo semua akun 

void display_all()
{
	account ac;
	ifstream inFile;
	inFile.open("account.txt",ios::binary);
	if(!inFile)
	{
		cout<<"File error !";
		return;
	}
	cout<<"\n\n\t\tDAFTAR AKUN\n\n";
	cout<<"====================================================\n";
	cout<<"A/c no.      NAME       Saldo\n";
	cout<<"====================================================\n";
	while(inFile.read(reinterpret_cast (&ac), sizeof(account)))
	{
		ac.report();
	}
	inFile.close();
}

//    	Fungsi deposit dan tarik uang 

void deposit_withdraw(int n, int option)
{
	int amt;
	bool found=false;
	account ac;
	fstream File;
	File.open("account.txt", ios::binary|ios::in|ios::out);
	if(!File)
	{
		cout<<"File error !";
		return;
	}
	while(!File.eof() && found==false)
	{
		File.read(reinterpret_cast (&ac), sizeof(account));
		if(ac.retacno()==n)
		{
			ac.show_account();
			if(option==1)
			{
				cout<<"\n\nMasukkan jumlah uang : ";
				cin>>amt;
				ac.dep(amt);
			}
			if(option==2)
			{
				cout<<"\n\nMasukkan jumlah uang : ";
				cin>>amt;
				int bal=ac.retdeposit()-amt;
				if(bal<500)
					cout<<"Saldo tidak cukup";
				else
					ac.draw(amt);
			}
			int pos=(-1)*static_cast(sizeof(ac));
			File.seekp(pos,ios::cur);
			File.write(reinterpret_cast (&ac), sizeof(account));
			cout<<"\n\n\t Data diperbarui";
			found=true;
	       }
         }
	File.close();
	if(found==false)
		cout<<"\n\n Data tidak ditemukan ";
}

void intro()
{
	cout<<"\n\n\n ATM BANK MANAGEMENT SYSTEM";
	cin.get();
}
by : Andreas Galang A (5114100153)

Senin, 26 September 2016

Use Case dan Interaction Diagram untuk Sistem ATM

CONTOH USE CASE DIAGRAM ATM BRI



System Startup Use Case

Sistem ini dimulai ketika operator menyalakan sistem. Operator akan diminta untuk memasukkan jumlah uang saat di ATM, dan koneksi ke bank akan dibentuk. Kemudian servis pelanggan dapat dimulai.




System Shutdown Use Case

sistem dimatikan ketika operator memastikan bahwa tidak ada pelanggan menggunakan mesin, dan kemudian mematikan mesin. Sambungan ke bank akan ditutup. Maka operator bebas untuk menghapus tanda terima deposit, mengisi kas dan kertas, dll


  1. Nasabah masuk pada ruangan ATM dan melakukan transaksi namun sebelumnya harus menggunakan kartu ATM dan Menginputkan no PIN. Sytem ATM akan melakukan autentifikasi kebenaran ATM dan no PIN yang di inputkan. Nasbah melakukan kegiatan memilih menu yang sudah di sediakan pada mesin ATM. Setelah melakukan pemilihan transaksi maka secara otomatis mesin ATM akan melakukan pengecekan dan penyimpanan transaksi yang dilakukan oleh nasabah dan mencetak pada fingerprint yang sudah tersedia pada mesin ATM dan melakukan action OUT-PUT sesuai dengan yang dilakukan nasabah
Transaksi (withdraw Money)
Nasabah memasukkan jumlah uang tunai yang ingin diambil. Kemudian ATM melakukan validasi dengan sistem bank. Jika respons dari sistem bank OK, maka ATM akan mengeluarkan uang tunai. Setiap transaksi direkam dalam Log Transaksi.
Payment
Nasabah dapat melakukan pembayaran berupa:
1. Pembayaran Tagihan
    Kartu Kredit BRI
    Kartu Kredit dan KTA RBS
    Kartu Kredit dan Personal Loan HSBC
    Kartu Kredit ANZ
    Kartu Kredit dan KTA SCB
    Personal Loan
    Ready Cash dan Eazy Pay Citibank
    Citifinansial
    FIF, BAF, SOF
    Finansia, Verena
    PLN
    Telkom
    Kartu Halo
    Matrix
    Flexi
    Speedy
    Indovision/Top TV/Oke Vision.
2. Pembayaran Universitas
4. Pembayaran Zakat dan Infaq
5. Pembayaran Tiket Pesawat dan Kereta Api
   Garuda
   Sriwijaya Air
   Lion

Transfer
Transaksi Transfer meminta pelanggan untuk memilih jenis akun untuk mentransfer dari menu account, untuk memilih akun yang berbeda untuk ditransfer, dan memasukkan uang dalam jumlah rupiah pada keyboard. Tidak ada tindakan lebih lanjut diperlukan setelah transaksi disetujui oleh bank sebelum mencetak tanda terima.Sebuah transaksi transfer dapat dibatalkan oleh pelanggan dengan menekan tombol batal setiap saat sebelum memasukkan jumlah uang.


Pembelian Pulsa (Credit Purchase)
Nasabah dapat melakukan pembelian pulsa:
1.  Simpati
2.  AS
3.  IM3
4.  Mentari,
5.  XL
6.  StarOne
7.  Flexi
8.  Esia
9.  Mobile8
10.Smart
11. Fren

12.Axis
Pengecekan Akun Nasabah (Account Info)
Nasabah dapat melakukan melihat info akun nasabah melalui ATM berupa jumlah saldo dan nomor rekening nasabah. ATM melakukan request saldo kepada sistem bank. Kemudian ATM mencetak sebuah struk yang berisi informasi saldo nasabah. Setiap transaksi direkam dalam Log Transaksi.



Referensi : 
  1. http://localtechno.blogspot.co.id/2013/11/use-case-dan-class-diagram-system-atm.html#.V-jee-afd_5
  2. http://www.math-cs.gordon.edu/courses/cs211/ATMExample/UseCases.html#Transaction

Andreas Galang 
5114100153

Selasa, 13 September 2016

Use Case Diagram


  1. Diagram use case merupakan pemodelan untuk menggambarkan kelakuan (behavior) sistem yang akan dibuat. 
  2. Diagram use case mendeskripsikan sebuah interaksi antara satu atau lebih aktor dengan sistem yang akan dibuat. 
  3. Diagram use case digunakan untuk mengetahui fungsi apa saja yang ada di dalam sebuah sistem dan siapa saja yang berhak menggunakan fungsi-fungsi tersebut. Yang ditekankan pada diagram ini adalah “apa” yang diperbuat sistem, dan bukan “bagaimana”. 
  4. Sebuah use case merepresentasikan sebuah interaksi antara aktor (user atau sistem lainya) dengan sistem.
  5. Use case menjelaskan secara sederhana fungsi sistem dari sudut pandang user.

Contoh Use Case Diagram Air Conditioner :



Referensi :
  •  http://www.eso.org/~tcsmgr/vlti/atcsdoc/Model/Rose/doc/atcs_uc.html
  •  https://pccontrol.wordpress.com/2012/08/23/pengetahuan-dasardiagram-use-case/





Sabtu, 28 November 2015

FUSE: Membuat File Backup Otomatis


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.

Kegunaan fuse ada banyak, salah satunya adalah yang saya sebutkan diatas. Kegunaan lainnya adalah untuk networking. Contohnya adalah google-drive-ocalmfuse, yang memungkinkan user untuk me-mount google drive ke linuxnya, sehingga memungkinkan mengaksesnya seakan-akan google drive tersebut adalah local storage. Contoh lainnya adalah PNGDrive, yang menyimpan data – data di filesystem tersebut ke sebuah gambar berformat .PNG, dan menggunakan file .PNG tersebut seakan-akan ia adalah sebuah filesystem

Untuk memulai membuat FUSE anda sendiri, anda harus men-download dan meng-install modul FUSE terlebih dahulu yang dapat anda dapatkan di http://fuse.sourceforge.net/ . lalu anda bisa mendownload template FUSE standar di http://fuse.sourceforge.net/doxygen/fusexmp_8c.html . dari template tersebut anda bisa berkreasi untuk melakukan hal – hal semau anda.  Sebagai contoh, saya ingin setiap file yang saya buka secara otomatis membuat file backupnya ( dengan format <namafile>.bak). Apabila file .bak dibuka maka akan muncul notifikasi peringatan file tersebut adalah file backup dan file tersebut tidak dapat dibuka.

Penasaran bagaimana source codenya, berikut source code yang saya gunakan

#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/exod/Downloads/";
char cbackup[100]=".bak";
char lastaccess[100],lastaccessbackup[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;

 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;
 char fpath[1000];
 sprintf(fpath,"%s%s",dirpath,path);

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

 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;

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

 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);
 }
 
 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,
struct fuse_file_info *fi) /Synchronize file contents
{
 /* 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);
}

Ganti bagian static const char *dirpath = "/home/exod/Downloads" dengan static const char *dirpath = "/home/[nama user]/Downloads"
Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]

Kemudian buat sebuah direktori, misalnya: /tmp/fuse
Sekarang yang anda lakukan adalah me mount program anda ke /tmp/fuse. Yaitu dengan cara :  ./[nama file] /tmp/fuse
Maka semua isi direktori /home/[nama user]/Downloads akan dimount ke direktori /tmp/fuse
Coba masuk ke /tmp/fuse dan jalankan perintah ls, maka semua isi direktori tersebut akan ditampilkan.

Terlihat bahwa yang diubah dari template adalah beberapa variabel global dan di dalam fungsi open. Karena hanya setiap membuka file akan dibuat backupnya, maka hanya fungsi open yang saya ubah sedikit.

Berikut beberapa istilah atau kegunaan setiap fungsi :
getattr        = xmp_getattr,  => mengambil atribut file
.access         = xmp_access,         => mengambil direktori
.readlink       = xmp_readlink,   => membaca target dari symbolic link
.readdir        = xmp_readdir,       => membaca direktori
.mknod          = xmp_mknod,     => membuka node file
.mkdir          = xmp_mkdir,         => membuat directory
.symlink        = xmp_symlink,   => membua symbolic link
.unlink         = xmp_unlink,       => menghapus file
.rmdir          = xmp_rmdir,           => menghapus directory
.rename         = xmp_rename,     => memperbaharui nama file
.link           = xmp_link,              => menciptakan hardlink ke file
.chmod          = xmp_chmod,      => mengubah permission file
.chown          = xmp_chown,      => mengubah kepemilikan file
.truncate       = xmp_truncate,    => merubah ukuran file
.utimens        = xmp_utimens,    => mengubah akses dan modifikasi waktu dari file dengan resolusi nanosecond
.open           = xmp_open,           => membuka file
.read           = xmp_read,              => membaca data dari file yang dibuka
.write          = xmp_write,            => menulis data ke file yang telah dibuka
.release        = xmp_release,        => melepaskan file yang sudah dibuka
.fsync          = xmp_fsync,           => sinkronisasi isi file

Cukup sekian ilmu yang dapat saya bagi hari ini. Jika ada kesalahan saya mohon maaf. Semoga bermanfaat :)
luvne.com resepkuekeringku.com desainrumahnya.com yayasanbabysitterku.com