Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Ruthless Testing 1

Sebelum menyerahkan aplikasi ke client, sudahkah Anda melakukan testing? 100% programmer pasti menjawab dengan kompak, “SUDAAAAHHHH !!!”

Nah, kalau begitu, pertanyaannya, apa saja yang sudah ditest?

Jawaban orang biasanya bervariasi, tergantung nilai project, jumlah orang yang tersedia, dan juga tergantung tingkat kegaptekan si programmer terhadap teknologi testing yang tersedia.

Testing minimal yang dilakukan biasanya adalah user testing. Jadi, ada user (atau programmer yang pura-pura jadi user) mencoba menggunakan aplikasi yang (katanya sih) sudah selesai. Biasanya fenomena ini akan berakhir dengan periode bugfix yang lebih lama daripada periode coding itu sendiri.

Jadi, bagaimana tipsnya supaya user testing berjalan dengan lancar, minim bug, kalaupun ada, bisa diselesaikan dalam bilangan hari?

Jawabannya adalah melaksanakan “ruthless testing”. Artinya testing secara kejam. Testing yang berlapis-lapis sehingga kalau ada programmer bandel yang membuat percabangan if terlalu dalam, akan langsung ketahuan.

Bagaimana itu? Kita akan lihat sebentar lagi.

Ada berapa jenis testing? Hmm .. menurut saya ada:

  1. Unit testing
  2. Integration testing
  3. Coverage testing
  4. Code compliance testing
  5. User/functional testing
  6. Performance testing

Semua test ini harus dijalankan tanpa kecuali.

What the !@#$? Banyak sekali? Apakah semua harus dijalankan? Wah, bisa-bisa kerjaan kita cuma ngurusin test doang? Bagaimana ini?

Hmm.. jangan khawatir, semua bisa dijalankan dengan investasi minimal di awal project. Tips saya adalah:

  1. Alokasikan pembuatan test bersama-sama dengan construction. Jangan setelah construction. Jadi, wahai Project Managers, kalau merencanakan construction, tambahkan alokasi waktu untuk membuat test.

  2. Semua test harus otomatis dan bisa dijalankan dengan sekali perintah. Di project saya, semua test dijalankan cukup dengan:

ant full-test

Baiklah, mari kita lihat satu persatu secara lebih detail.

Unit Testing

Ini adalah testing di level paling detail dari aplikasi. Artinya, testing di level method/function. Misalnya saya punya kode seperti ini:

public class DayCounter{
  /**
  * menghitung jumlah hari dalam bulan dan tahun yang diminta. 
  * Misalnya, bila month = 2 dan year = 2000, method ini akan menghasilkan 29.
  * @param month bulan yang akan dihitung
  * @param year tahun yang akan dihitung
  * @return jumlah hari dalam bulan dan tahun bersangkutan
  */
  public int numDays(int month, int year) {
    return 29;
  }
}

Coba lihat contoh kode di atas? Salah bukan? Apapun yang kita masukkan, hasilnya pasti 29. Mari kita buktikan dengan unit test bahwa kode di atas salah.

public class DayCounter extends junit.framework.TestCase{
  public void testNumDays() {
    DayCounter d = new DayCounter();
    assertEquals(31, d.numDays(1,2000)); 
  }
}

Pada waktu dijalankan, unit test tersebut akan menghasilkan tulisan FAILED

Di Java, unit test dapat dilakukan secara otomatis dengan menggunakan JUnit.

Integration Test

Sebagian besar aplikasi yang kita buat akan menggunakan database. Untuk itu, kita perlu mengetes apakah kode program kita dapat berinteraksi dengan database sesuai harapan. Mirip dengan JUnit, kita membuat unit test yang mengakses database. Misalnya, berikut kode programnya:

public class DatabaseAccess{
  /**
  * memeriksa username dan password dalam database. 
  * Method ini akan mencocokkan username dan password yang diberikan 
  * dan yang terdaftar di database.
  * Apabila cocok, akan menghasilkan true, dan apabila tidak cocok akan menghasilkan false.
  * @param username 
  * @param password
  * @return true kalau cocok, false kalau tidak cocok
  */
  public boolean checkLogin(String username, String password) {
    String sql = "SELECT * FROM user WHERE username=? AND password=?"
    // dst kode akses database
  }
}

Dan ini adalah kode untuk mengetesnya.

public class DatabaseAccess extends junit.framework.TestCase{
  public void testCheckLogin() {
    DatabaseAccess db = new DatabaseAccess();
    
    // asumsikan ada username endy dan password secret di database
    assertTrue(db.checkLogin("endy", "secret"));

    // coba dengan user sembarang, harusnya akan menghasilkan false
    assertFalse(db.checkLogin("nobody", "gakada"));
  }
}

Perhatikan bahwa kedua test di atas mengasumsikan bahwa kita punya database, terisi data endy:secret, dan tidak ada record nobody:gakada di dalam tabel user. Berarti, setiap dijalankan, kita harus memastikan asumsi di atas terpenuhi. Lalu, bagaimana cara menjalankannya secara otomatis? Gampang, gunakan DBUnit.

Dengan DBUnit, kita dapat me-reset kondisi database sesuai keinginan setiap kali test akan dijalankan. Caranya, kita harus buat test data, yaitu satu record berisi data endy:test dalam tabel user. Test data ini disimpan dalam file checkLogin.xml

<dataset>
  <user id='1' 
        username='endy'
        password='secret'
  />
</dataset>

Sebelum test dimulai, pastikan database direset. Tambahkan method berikut di kode test:

public class DatabaseAccess extends junit.framework.TestCase{
  public void testCheckLogin() {
    // reset database
    prepareDatabase();
    
    DatabaseAccess db = new DatabaseAccess();
    
    // asumsikan ada username endy dan password secret di database
    assertTrue(db.checkLogin("endy", "secret"));

    // coba dengan user sembarang, harusnya akan menghasilkan false
    assertFalse(db.checkLogin("nobody", "gakada"));
  }

  private void prepareDatabase(){
    DatabaseOperation.CLEAN_INSERT.execute(dbConn, getTestData());
  }

  private IDataSet getTestData(){
    return new FlatXmlDataSet(new FileInputStream("checkLogin.xml"));
  }
}

Nah, DBUnit akan dengan senang hati me-reset isi database development Anda. Pastikan test tersebut dijalankan di DATABASE DEVELOPMENT, dan bukan DATABASE PRODUCTION.

Sementara cukup sekian. Pada artikel selanjutnya, kita akan bahas tentang:

  1. Coverage Testing
  2. Code compliance testing
  3. User/functional testing
  4. Performance testing Dan sesuai janji saya, semua test otomatis dan sekali pencet.

Game Oldies

Berangkat dari membaca blog teman yang mengulas tentang Transport Tycoon Deluxe yang sekarang ada versi open sourcenya, saya jadi teringat koleksi game oldies saya.

Jaman saya SMU dulu, sekitar tahun 1994-1997, game favorit saya dan teman-teman adalah UFO-Enemy Unknown. Game ini berkisah tentang penyerbuan alien ke bumi. Dengan fitur yang cukup variatif, seperti kejar-kejaran pesawat alien, penyerbuan ke markas musuh, mempertahankan markas dari serbuan alien, dan riset teknologi, game ini terasa sangat canggih pada masa itu.

Pada waktu mulai bermain, teknologi pasukan kita sangat minim. Seiring dengan seringnya bertempur, kita mulai mengkoleksi persenjataan alien. Persenjataan ini kemudian diteliti. Setelah penelitian selesai, kita bisa menggunakan senjata tersebut.

Bukan cuma senjata, mayat dan pesawat alien juga diteliti, sehingga kalau kita sudah main cukup lama, semua teknologi alien bisa kita gunakan.

Game yang sudah lama punah ini, tetap bisa dimainkan di masa kini dengan cara download dari abandonia.

Sekuelnya juga ada, yaitu Terror From The Deep dan Apocalypse.

Selain game itu, kami dulu juga suka memainkan The Incredible Machine 2. Ini adalah game puzzle, di mana kita disuruh mengkombinasikan alat-alat yang tersedia untuk memecahkan masalah yang diberikan. Alat-alat yang disediakan bermacam-macam, mulai dari balon zeppelin, anti gravitasi, motor listrik, blender, dan sebagainya. Sangat bermanfaat untuk mendongkrak kreativitas adik-adik kita di SD.

Untuk memainkan game berbasis DOS ini, kita membutuhkan DOS Emulator. Saya biasa menggunakan DosBox dengan front-end D-Fend.

Dengan dos emulator ini, kita bisa juga menjalankan game yang bahkan lebih tua lagi seperti Digger.


Otomasi Transfer File dengan WinSCP

Setelah sebelumnya kita mengotomasi backup untuk Subversion, baik di Windows maupun di Linux, masih ada sedikit PR yang tersisa.

File backup yang dihasilkan oleh script masih berkeliaran di komputer yang sama dengan repository. Jadi kalau sempat terjadi bencana harddisk jebol, repository beserta backupnya akan musnah tanpa sisa.

Solusi sementaranya adalah dengan cara rajin memindahkan file-file backup secara periodik ke komputer lain, untuk selanjutnya ditulis ke dalam CD/DVD. Tetapi, kegiatan copy-mengcopy setiap minggu sangat membosankan. Belum lagi kalau ternyata ada assignment mendadak sehingga kegiatan transfer file menjadi terlupakan. Solusi yang lebih hi-tech adalah dengan mengotomasi proses transfer file. Jadi, file backup yang sudah dihasilkan akan kita transfer secara otomatis ke komputer lain, kalau perlu komputer di negara lain.

Untuk melakukan otomasi ini, kita membutuhkan aplikasi WinSCP. Ini adalah aplikasi untuk mentransfer file antara komputer Windows dengan Linux. Sejak menggunakan aplikasi ini, saya tidak pernah lagi menggunakan Windows Sharing dan Samba Server untuk kebutuhan file transfer.

Berikut caranya. Perhatikan bahwa konfigurasi saya adalah sebagai berikut:

  • Repository Server: Windows 2000 Professional dengan WinSCP terinstal

  • Backup Server: Linux OpenSuSE 10.0 dengan SSH server aktif [IP Address: 192.168.0.2]

  • Username di Backup Server: backuponly

  • Password di Backup Server: backuppasswd

  • Folder yang mau dibackup: c:\Backup

  • Folder tujuan: /home/endy/backup

Salah satu keunggulan WinSCP adalah, selain bisa mengelola transfer secara GUI, dia juga memiliki kemampuan scripting, sehingga bisa dipanggil dari command prompt.

Screenshot WinSCP

Berikut adalah script untuk mengotomasi proses copy folder C:\Backup dari Windows ke /home/endy/backup di Linux. Save sebagai c:\upload-backup.txt

# Modus batch, supaya WinSCP tidak tanya-tanya
option batch on
# Otomatis overwrite file yang sama
option confirm off
# Masukkan username dan password
open backuponly:backuppasswd@192.168.0.2
# Pindah ke folder backup
cd /home/endy/backup
# Upload folder C:\Backup seisinya
put c:/Backup 
# Disconnect
close
# Exit WinSCP
exit

Dan berikut adalah bat script untuk mengeksekusi script di atas, save dengan nama c:\backup-scp.bat:

"C:\Program Files\WinSCP3\winscp3.exe" /console /script=upload-backup.txt

Script backup-scp.bat siap dijalankan melalui Windows Scheduler, sebaiknya 10 menit setelah jadwal backup.


Synergy

Synergy Screenshot

Perhatikan gambar di atas.

Seringkali kita bekerja dengan lebih dari satu komputer pada saat yang bersamaan. Misalnya seperti saya. Untuk kegiatan rutin sehari-hari saya menggunakan Debian GNU/Linux, yaitu untuk browsing (Firefox), membaca email (KMail), berlangganan RSS (aKregator), chatting (Gaim), dan sebagainya.

Tetapi ada kalanya saya ‘terpaksa’ menggunakan Windows. Misalnya untuk mengedit template dokumen dengan MS Word. Template dokumen sangat mementingkan ketepatan setting font, border, margin pada suatu dokumen. Jadi walaupun bisa dibuka dengan OpenOffice, tetap saja ada beberapa komponen layout yang rusak. Kegiatan lainnya adalah membuat perencanaan project dengan menggunakan MS Project. Aplikasi ini belum ada padanannya di Linux. Jadi mau tidak mau saya harus menggunakan MS Project agar rencana project saya bisa digunakan orang

Banyak juga orang yang bekerja menggunakan laptop, sedangkan di kantor tetap disediakan PC. Biasanya polanya sama. Kegiatan internet rutin tetap di laptop, sedangkan pekerjaan kantor di PC.

Apapun alasannya, banyak orang yang menggunakan dua komputer sekaligus.

Pada jaman dahulu kala, kita terpaksa menggunakan dua perangkat keyboard dan mouse untuk mengendalikan kedua komputer tersebut. Yang lebih canggih biasanya menggunakan remote desktop agar bisa mengendalikan komputer satu dari lainnya, sehingga tidak perlu pindah-pindah keyboard. Tapi solusi ini, walaupun hi-tech, tetap masih kurang produktif. Karena dengan menggunakan dua monitor, kita bisa lebih cepat bekerja. Monitor satu menampilkan referensi/tutorial, monitor satu lagi digunakan untuk coding.

Gambar di atas adalah solusinya. Ada aplikasi ajaib bernama Synergy. Selain ajaib, aplikasi ini juga gratis dan mudah diinstal.

Cara kerjanya demikian. Kita instal Synergy di kedua komputer. Kemudian kita jalankan Synergy sebagai server di komputer yang keyboard dan mousenya ingin kita gunakan. Untuk berjalan sebagai server, kita perlu membuat file konfigurasi synergy.conf sebagai berikut:

section: screens
    laptop:
    pc:    
end
section: links
    laptop
        right = pc
    pc:
        left = laptop
end

Berikut penjelasannya:

  • laptop: hostname komputer yang pertama

  • pc: hostname komputer yang kedua

  • pada konfigurasi di atas, laptop diletakkan di sebelah kiri pc.

Dengan konfigurasi di atas, apabila kita sedang mengendalikan laptop, kemudian kita menggerakkan kursor mouse ke pinggir layar sebelah kanan, kursor akan menyeberang dari monitor laptop ke monitor PC. Begitu juga sebaliknya.

Untuk administrator, Synergy ini bisa digunakan untuk menggantikan KVM terminal. KVM terminal adalah hardware yang memungkinkan beberapa komputer dikendalikan dengan satu perangkat monitor, keyboard, dan mouse.

Lebih canggih lagi, clipboardnya berhubungan. Artinya kita bisa copy text dari laptop, dan paste di PC.

Setelah selesai, silahkan lakukan koneksi dari client ke server. Petunjuk lengkap bisa dibaca di sini.

Oh iya, walaupun sudah jelas dari screenshot di atas (KDE di kiri -sudah pasti Linux- dan Windows di kanan), pasti ada aja yang tanya, “Bisa jalan di Windows atau Linux gak ya?” Jawabannya, “Sangat bisa !!!”

Saya sudah menggunakan Synergy untuk menghubungkan Debian Sarge dan Windows 2000 Professional. Untuk Sarge harus pakai Synergy 1.2.2 (bawaan apt-get) sedangkan versi terbaru (per 24 Mei 2006) adalah 1.3.1.

Tentu saja versi client dan server harus sama, untuk menghindari kepusingan tanpa manfaat.

Update: Beberapa teman mencoba menjalankan Synergy server di Windows dan mengaku mengalami kesulitan. Kebetulan di tempat saya ada beberapa anak magang yang tertarik untuk mencoba. Ternyata, kesalahan utama dalam setting server di Windows adalah lupa memberitahu Synergy komputer mana yang di kiri dan yang mana yang di kanan.

Baiklah, mari kita lihat saja screenshotnya:

Tampilan Awal

Begitu Synergy dijalankan, kita akan melihat tampilan berikut: Synergy Start Up

Dari sini, kita kemudian memilih setting Synergy sebagai server. Lalu klik configure, sehingga kita masuk ke halaman selanjutnya.

Konfigurasi Screen

Screen, atau layar, memberitahukan Synergy berapa komputer yang terlibat dalam jaringan, dan nama masing-masing komputer. Sebagai ilustrasi, kita akan menggunakan dua komputer, kita beri nama komputerkiri dan komputerkanan. Dengan layout (seperti dari namanya) komputerkiri berada di sebelah kiri komputerkanan.

Berikut adalah tampilan untuk menambah screen: Konfigurasi Screen

Setelah dikonfigurasi, komputerkiri muncul di layar sebagai berikut: KomputerKiri sudah dikonfigurasi

Lanjutkan dengan konfigurasi komputerkanan. Konfigurasi KomputerKanan

Layar setelah konfigurasi terlihat seperti ini: Setelah konfigurasi dua screen

Beberapa orang yang menceritakan kesulitan pada saya, biasanya berhenti pada tahap ini. Oh, kedua komputer sudah saya entri ke dalam Synergy, berarti sekarang sudah bisa connect. Ya memang bisa connect, kalo kita jalankan dengan log debug, akan terlihat bahwa kedua komputer sudah connected. Tapi kenapa mousenya belum bisa menyeberang layar?

Jawabannya adalah, karena Synergy belum tau seperti apa layoutnya. Bagaimana susunan komputernya? Apakah komputerkiri di sebelah kiri, kanan, atas, bawah atau di mana?

Baiklah, sekarang kita akan memberi tahu layoutnya kepada Synergy. Lihat panel Link di bawah? Nah di situlah letak konfigurasinya. Isikan nilai yang diinginkan, yaitu di 0-100% sisi layar kiri dari komputerkanan adalah komputerkiri. Setelah diisi, klik tombol +. Berikut adalah layar konfigurasinya adalah sebagai berikut: Link komputer kiri ke kanan

Lakukan hal yang sama dengan komputer kanan. Ini supaya mouse yang sudah menyeberang ke komputer kiri bisa kembali lagi ke komputerkanan. Kalau cuma satu link, dia bisa pindah ke kiri, tapi tidak bisa kembali lagi. Jangan lupa membalik nilainya, isinya adalah: 0-100% sisi layar kanan dari komputerkiri adalah komputerkanan.

Berikut layar konfigurasi setelah diisi: Layar konfigurasi akhir

Selanjutnya, jalankan servernya, dan coba connect dari client.

Selamat mencoba :D


Subversion backup script untuk Windows

Dulu saya pernah menulis tentang cara backup repository Subversion secara otomatis. Tetapi, script yang ada di situ hanya bisa dijalankan di Linux, karena ada satu baris bermasalah pada Perl scriptnya, yaitu:

$next_backup_file = "daily-incremental-backup." . date +%Y%m%d;

Baris di atas akan menjalankan perintah operating system seakan-akan kita menjalankan perintah ini di command prompt: $ date +%Y%m%d

Di Linux, perintah ini berjalan lancar, menampilkan output sebagai berikut: 20060515

Output tersebut nantinya digunakan untuk membentuk nama file dump. Tetapi di Windows, hasilnya adalah: The system cannot accept the date entered .. blablabla Rupanya Windows mengira kita akan ganti tanggal komputer.

Jadi akhirnya, karena saya tidak mengerti Perl, saya membuat backup script baru dengan Ruby. Logika yang sama, alur program yang sama, cuma beda bahasa. Inilah hasilnya. Silahkan digunakan dan dimodifikasi sesuai kebutuhan.

svn-weekly-backup.rb

# Full Backup script for Subversion Repository #
require 'date'

# 1. Initialize variables
backup_folder = "c:/Backup"
repo_folder = "c:/Repository/Imagine"
youngest = `svnlook youngest #{repo_folder}`.strip
next_backup_file = "weekly-full-backup.#{Time.now.strftime("%Y%m%d")}.dmp"
compress_script = backup_folder+"/compress-"+youngest+".tzs"
compress_command = "C:/Program Files/TUGZip/TzScript.exe #{compress_script}"


# 2. Perform backup
puts "Backing up to revision #{youngest}\n";
result = `svnadmin dump #{repo_folder} > #{backup_folder}/#{next_backup_file}`

# 3. Compress backup result
# 3.1 Creating temporary zip script [TugZip  Required]  
puts "Generating compress script ...\n";
tzs_file = < <-TZS
		function main()
		{
		     var Comp = new Compress();
		     Comp.Archive = "#{backup_folder}/#{next_backup_file}.zip";
		     Comp.Type = "ZIP";
		     Comp.Compression = 3;
		     Comp.WorkingDir = "#{backup_folder}";
		     Comp.Data = "#{next_backup_file}";
		     Comp.Password = "";
		     Comp.DateExtension = 0;
		     Comp.TimeExtension = 0;
		     Comp.Overwrite = 1;
		     Comp.Recurse = 0;
		     Comp.StoreFolderNames = 1;
		     Comp.IncludeHiddenFiles = 1;
		     Comp.DoCompress();
		}
	TZS
File.open(compress_script, "w") do | file |
    file << tzs_file	
end

# 3.2. Executing compression
puts "Compressing dump file...\n";
puts `#{compress_command}`

# 3.3. Deleting temporary zip script 
puts "Deleting compress script ...\n";
File.delete(compress_script);

# 3.4 Deleting uncompressed dump file
puts "Deleting uncompressed dump file ...\n";
File.delete(backup_folder+"/"+next_backup_file);

# 4. Write last backup position to marker file
File.open(backup_folder+"/last_backed_up", "w") do | file |
    file << youngest
end

svn-daily-backup.rb

# Full Backup script for Subversion Repository #
require 'date'

# 1. Initialize variables
backup_folder = "c:/Backup"
repo_folder = "c:/Repository/Imagine"
youngest = `svnlook youngest #{repo_folder}`.strip
next_backup_file = "daily-incremental-backup.#{Time.now.strftime("%Y%m%d")}.dmp"
compress_script = backup_folder+"/compress-"+youngest+".tzs"
compress_command = "C:/Program Files/TUGZip/TzScript.exe #{compress_script}"

# 1.a. Get last backed up revision
last_backup = 0;
if File.exist?(backup_folder+"/last_backed_up")
	File.open(backup_folder+"/last_backed_up", "r") do | file |
	    while line = file.gets
			last_backup = line.strip.to_i
		end
	end
end


# 2. Perform backup
if last_backup == youngest.to_i
	puts "No new revision since last backup .. exiting"
	exit 0; 
end

start_backup = last_backup + 1

puts "Backing up from revision #{last_backup} to revision #{youngest}\n";
result = `svnadmin dump --incremental --revision #{last_backup}:#{youngest} #{repo_folder} > #{backup_folder}/#{next_backup_file}`

# 3. Compress backup result
# 3.1 Creating temporary zip script [TugZip  Required]  
puts "Generating compress script ...\n";
tzs_file = < <-TZS
		function main()
		{
		     var Comp = new Compress();
		     Comp.Archive = "#{backup_folder}/#{next_backup_file}.zip";
		     Comp.Type = "ZIP";
		     Comp.Compression = 3;
		     Comp.WorkingDir = "#{backup_folder}";
		     Comp.Data = "#{next_backup_file}";
		     Comp.Password = "";
		     Comp.DateExtension = 0;
		     Comp.TimeExtension = 0;
		     Comp.Overwrite = 1;
		     Comp.Recurse = 0;
		     Comp.StoreFolderNames = 1;
		     Comp.IncludeHiddenFiles = 1;
		     Comp.DoCompress();
		}
	TZS
File.open(compress_script, "w") do | file |
    file << tzs_file	
end

# 3.2. Executing compression
puts "Compressing dump file...\n";
puts `#{compress_command}`

# 3.3. Deleting temporary zip script 
puts "Deleting compress script ...\n";
File.delete(compress_script);

# 3.4 Deleting uncompressed dump file
puts "Deleting uncompressed dump file ...\n";
File.delete(backup_folder+"/"+next_backup_file);

# 4. Write last backup position to marker file
File.open(backup_folder+"/last_backed_up", "w") do | file |
    file << youngest
end

Langkah terakhir, buat bat script sederhana untuk mengeksekusi script ruby ini. Dengan adanya bat script, kita bisa dengan mudah menambahkan entri di Windows Scheduler untuk dijalankan secara otomatis dan terjadwal.

svn-weekly-backup.bat

ruby C:\Backup\svn-weekly-backup.rb

daily-full-backup.bat

ruby C:\Backup\svn-daily-backup.rb

Terakhir, buat folder c:\Backup dan letakkan file-file berikut dalam folder tersebut:

  • svn-weekly-backup.rb

  • svn-daily-backup.rb

  • svn-weekly-backup.bat

  • svn-daily-backup.bat

Sistem backup Anda siap digunakan.

Buat yang malas copy-paste, silahkan download keempat file tersebut [tar.bz2 1.4 KB].

** Perhatian: Untuk menjalankan kode ini dengan baik, Anda harus menginstal aplikasi TugZIP. Ini dibutuhkan untuk mengkompres file hasil dump. Buat yang lebih suka WinZip, WinRAR, atau aplikasi kompresi yang lain, silahkan memikirkan cara memanggilnya dari command prompt dan memodifikasi kode program di atas, yaitu bagian #3: Compress Backup Result.

Selain itu, Anda juga harus menginstal bahasa pemrograman Ruby. Installernya bisa didownload di sini. **

Selamat menggunakan, semoga bermanfaat :D