24 May 2006
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:
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:
Setelah dikonfigurasi, komputerkiri muncul di layar sebagai berikut:
Lanjutkan dengan konfigurasi komputerkanan.
Layar setelah konfigurasi terlihat seperti ini:
Konfigurasi Link
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:
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:
Selanjutnya, jalankan servernya, dan coba connect dari client.
Selamat mencoba :D
16 May 2006
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.
**
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
12 May 2006
Masih ingat jaman DOS dulu? Untuk menyalakan komputer kita harus memasukkan floppy disk yang lebar. Setelah komputer selesai booting, kalau kita ingin mengetik, ganti disket booting dengan disket berisi aplikasi Wordstar. Selesai mengetik, ingin menyimpan dokumen, ganti disket Wordstar dengan disket data. Capek bekerja, ingin main game, masukkan disket berisi Digger.
Hidup begitu mudah dan sederhana. Satu aplikasi muat di dalam satu disket. Berbeda dengan jaman sekarang. Harus instal dulu semua aplikasi. Kalau sudah tidak digunakan dan harddisk penuh, uninstal lagi. Lama-lama registry jadi berantakan dan akibatnya komputer jadi lemot.
Selain itu, kadang ada beberapa di antara kita yang kurang beruntung. Tidak bisa instal aplikasi di komputer yang sedang digunakan. Sebabnya bisa macam-macam. Ada yang dilarang kantor, ada juga yang cuma pinjam komputer sebentar, sehingga kalo mau instal aplikasi rasanya kurang sopan. Masa cuma pinjam 5 menit saja pakai instal-instal segala.
Nah, sekarang ada solusi jitu. Namanya aplikasi portabel. Artinya, aplikasi ini cukup dicopy ke USB disk dan bisa langsung dijalankan tanpa perlu instalasi.
Ada banyak aplikasi yang disertakan di dalamnya, antara lain:
Silahkan langsung ke websitenya
09 May 2006
Membuat screenshot di Windows itu gampang. Tinggal ikuti langkah-langkah yang dijelaskan Oom Mbot, beres. Tapi bagaimana caranya membuat screenshot di Linux?
Gampang, jika Anda pengguna KDE, instal saja KSnapshot. Ini adalah aplikasi kecil yang bisa menangkap tampilan layar.
Ada beberapa mode yang bisa digunakan, yaitu Full Screen, Region, dan Window under cursor. Full screen menangkap seluruh layar, termasuk menunya. Window under cursor hanya menangkap aplikasi yang sedang kita gunakan. Sedangkan Region hanya menangkap wilayah yang kita pilih saja.
Bagaimana kalau kita mau menampilkan popup-menu klik-kanan? Gampang, atur saja delay menjadi beberapa detik. Kemudian klik New Snapshot, dan lakukan klik kanan di aplikasi yang diinginkan. Selang beberapa detik kemudian, KSnapshot akan menangkap gambar.
Berbeda dengan di Windows, di Linux tombol PrtScr tidak secara otomatis menangkap tampilan layar. Tetapi masalah ini mudah diatasi. Kita dapat menyambungkan tombol PrtScr dengan KSnapshot, sehingga apabila tombol tersebut kita tekan, KSnapshot akan muncul.
Caranya, klik kanan tombol K di pojok kiri bawah. Kemudian pilih Menu Editor
Di panel sebelah kiri, cari aplikasi KSnapshot. Di Debian Sarge, biasanya KSnapshot ada di Graphics, Other Application. Begitu ketemu, langsung saja klik.
Di panel sebelah kanan akan muncul keterangan tentang aplikasi. Kita akan mengatur Shortcut Key, letaknya di baris paling bawah.
Klik tombol shortcutnya, akan muncul dialog kecil. Di sini kita bisa langsung tekan tombol PrtScr. Kemudian klik OK.
Selesai sudah. Sekarang setiap kali tekan PrtScr, KSnapshot akan segera beraksi.
Pembaca yang teliti akan berpikir, “Bagaimana caranya menangkap gambar KSnapshot itu sendiri? Padahal ketika kita tekan New Snapshot pasti KSnapshot akan menghilang.”
Gampang, jalankan saja dua KSnapshot sekaligus. Yang satu untuk di-capture, satu lagi untuk meng-capture. :D
05 May 2006
Adanya fitur annotation di Java 5 membuka dunia baru bagi para coder Java. Dulu semua metadata mau tidak mau harus disimpan di XML file. Sekarang ada pilihan baru, kita bisa taruh di XML file, atau juga bisa di source code melalui annotation.
Salah satu implementasinya adalah annotation untuk hibernate untuk mendefinisikan mapping Hibernate. Sekarang kita tidak perlu lagi membuat *.hbm.xml untuk menyatakan mapping antara Java class dengan tabel di database.
Mari kita lihat kodenya.
Category.java
package id.web.endy.tutorial;
public class Category {
private Integer id;
private String name;
private String description;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Class di atas akan kita simpan ke database dengan skema tabel (MySQL) sebagai berikut:
Category-ddl.sql
CREATE TABLE Category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
description VARCHAR(255)
);
Sebelum jaman annotation, kita harus buat mapping file sebagai berikut.
Category.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="id.web.endy.tutorial.Category" table="Category">
<id name="id" column="id">
<generator class="auto"/>
</id>
<property name="name" column="name"/>
<property name="name" column="description"/>
</class>
</hibernate-mapping>
Tapi dengan menggunakan annotation, kita bisa lupakan file Category.hbm.xml. Sebagai gantinya, kita tambahkan sedikit annotation pada class Category sebagai berikut
Category.java dengan Annotation
package id.web.endy.tutorial;
@Entity
public class Category {
private Integer id;
private String name;
private String description;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Id(generate=GeneratorType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Perbedaan pada kode di atas cuma dua baris saja, yaitu:
- @Entity
- @Id(generate=GeneratorType.AUTO)
Selain untuk property dan id biasa, hibernate annotation juga dapat digunakan untuk one-to-many, many-to-many, dan teknik-teknik advanced lainnya.