Sabtu, 17 Oktober 2015

Template Function Vs Overloading Function Pada C++

Halo pembaca setia digital saintis. Maaf rasanya sudah lama sekali saya tidak kembali menulis, mungkin karena mengingat waktu yang hanya tetap 24 jam sehari, namun hal yang harus dikerjakan terus bertambah :D. Ok langsung saja saya akan mencoba membahas topik yang akan saya tulis kali ini. Topik kali ini adalah perbandingan antara penggunaan Template Function dengan Overloading Function. Kenapa saya mencoba menulis topik ini, karena saya pernah bertemu sebuah situasi yang mana ada sebuah method atau fungsi memerlukan nilai kembalian (return) yang berbeda, namun dengan type parameter yang sama. Kemudian saya menjadi teringat dengan penggunaan Template Function.

Pada situasi tersebut, memang ada solusi lain untuk menjawabnya, kita tinggal melakukan casting pada nilai hasil kembalian dari fungsi tersebut menjadi nilai type yang kita inginkan. Tetapi menurut hemat saya, cara itu tidak akan selamanya berhasil. Karena misal jika ada sebuah fungsi dengan nilai kembalian (return) bertipe float, kemudian kita ingin melakukan casting nilai tersebut menjadi int, maka akan ada pembuangan nilai seperti 3.3 akan menjadi 3. Kita kehilangan originalitas nilai sebesar 0.3. Jadi karena itu saya mencoba memilih solusi dengan menggunakan Template Function.

Untuk situasi seperti itu, teknik overloading dari salah satu cabang ilmu Object Oriented Programming juga tidak bisa menjadi solusi. Karena overloading tidak bisa membuat 2 fungsi yang memiliki nama sama, jumlah parameter yang sama, tipe parameter yang sama namun tipe kembalian nilainya yang berbeda. Pada topik ini saya lebih mengulas fungsi yang mengembalikan nilai, karena yang kita tahu sebenarnya fungsi itu sendiri memiliki 2 macam, yang mengembalikan nilai (return) dan yang tidak mengembalikan nilai (void).

Saya akan mencoba menjelaskan terlebih dahulu tentang apa itu Template Function. Template Function adalah salah satu feature atau keunggulan dari C++. Dengan Template Function, kita bisa membuat sebuah fungsi secara general dengan akan menerima berbagai macam tipe data. Berikut adalah rumusan umum untuk membuat sebuah Template Function pada C++.

template <class type> type func_name(type arg1, ...);
*http://www.cprogramming.com/tutorial/templated_functions.html

Dari rumusan umum di atas, saya mencoba membuat sebuah program sederhana dengan membuat dan menggunakan Template Function sebagai contohnya. Berikut adalah program sederhana yang saya buat.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;

template <class type> type addWithTemplate(type a, type b)
{
    return a + b;
}

int addWithOverloading(int a, int b)
{
    return a + b;
}

float addWithOverloading (float a, float b)
{
    return a + b;
}

int main()
{        
    cout << "addWithTemplate(5, 5) : " << addWithTemplate(5, 5) << endl;
    cout << "addWithTemplate(5.5f, 5.5f) : " << addWithTemplate(5.5f, 5.5f) << endl;
    cout << "\n******************************************************************\n" << endl;
    cout << "addWithOverloading(3.5f, 3.5f) : " << addWithOverloading (3.5f, 3.5f) << endl;
    cout << "addWithOverloading(3, 3) : " << addWithOverloading (3, 3) << endl;
    return 0;
}

Pada baris 5 - 8 menjelaskan bahwa saya membuat sebuah Template Function dengan nama addWithTemplate dengan dua parameter yang bernama a dan b. Tipe parameter - parameter tersebut tidak dideklarasikan secara eksplisit, namun diganti menggunakan type. Dari identifier type tersebut yang akan membuat fungsi addWithTemplate bisa menerima tipe data apa saja. Dapat kita lihat bersama, fungsi tersebut hanyalah tidak lebih dari sebuah fungsi penjumlahan biasa antara dua nilai.

Pada baris 10-18 menjelaskan bahwa saya membuat fungsi penjumlahan pula dengan nama fungsinya addWithOverloading, namun dengan teknik Overloading Function. Saya membuat dua fungsi yang overloading, pertama bertipe int dan kedua bertipe float.

Pada baris 22-26 adalah pemanggilan fungsi-fungsi yang telah dibuat tadi. Untuk baris 22 saya memanggil fungsi addWithTemplate dengan nilai parameter masing - masing 5 (int). Untuk baris 23 saya juga memanggil fungsi addWithTemplate dengan nilai parameter masing - masing 5.5f (float). Lalu pada baris 25 saya memanggil fungsi addWithOverloading dengan nilai parameter masing - masing 3.5f (float). Untuk baris 26 saya juga memanggil fungsi addWithOverloading dengan nilai parameter masing - masing 3(int).

Berikut adalah hasil dari program tersebut jika dijalankan.

Gambar Hasil Program Penggunaan Template Function & Overloading Function
Terlihat pada hasilnya, untuk fungsi addWithTemplate, meskipun dengan tipe parameter int atau float, tetap bisa menghasilkan dengan benar. Begitupun juga dengan fungsi addWithOverloading, dapat menghasilkan nilai yang benar dan sesuai. Hanya saja fungsi addWithOverloading harus dideklarasikan dua kali dengan hanya dibedakan tipe parameternya, sedangkan fungsi addWithTemplate cukup sekali dalam pendeklarasiannya. Jadi jelas lebih simple penggunaan Template Function dan lebih efisien dari sisi code yang ditulis.

Jadi kembali dengan situasi permasalahan pada awal - awal paragraf yang telah saya tulis, bahwa Template Function bisa menjadi solution yang tepat, karena kita tidak perlu memerlukan casting lagi yang dapat menyebabkan originalitas nilainya berkurang.

Semoga tulisan kali ini cukup bermanfaat dan bisa memberikan wawasan kepada teman-teman khususnya para developer C++ yang sudah membaca tulisan saya ini. Terimakasih.

*Note : Seharusnya feature Template Function ini tidak hanya ada pada C++, melainkan ada pula pada Java dan C# CMIIW

Senin, 29 Juni 2015

Cara Decompile File Jar


Pada artikel kali ini saya akan mencoba untuk mengulas bagaimana caranya kita ingin membongkar source code pada file executeable java (.jar). Caranya ternyata tidak begitu sulit, kita cukup menyiapkan sebuah tools decompiler untuk melakukan decompiling file JAR tersebut menjadi source code kembali (.java). Tools decompiler ini tersedia di Java Decompiler. Silahkan download tools tersebut terlebih dahulu.

Ketika sudah mendownload tools tersebut, buka tools tersebut.

Gambar Membuka Java Decompiler Tools
Setelah dibuka maka akan tampil form seperti gambar berikut ini

Gambar Form Utama Java Decompiler Tools

Pilih Menu File > Open File. Kemudian pilih file jar yang ingin didecompile menjadi source code. Pada contoh di artikel ini saya memilih program java sederhana yang telah saya buat dengan nama Decompile.

Gambar Setelah Memilih File Jar
Setelah itu pilih Menu File > Save All Sources. Ketika telah disave, maka akan menjadi seperti yang ditampilkan pada gambar berikut ini.
Gambar Hasil Save Source Untuk Decompile.jar
Kemudian extract file tersebut, dalam contoh artikel ini, file yang diextract adalah Decompile.jar.src.zip. Pada akhirnya nanti kita akan menemukan file Decompile.java. Pada artikel ini terletak pada direktori \Decompile.jar.src\decompile\Decompile.java. Langkah terakhir yaitu membuka file Decompile.java tersebut dengan editor tercinta Anda. Kemudian Anda akan melihat source code tersebut. Berikut adalah source code hasil decompile dari tools Java Decompiler.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*    */ package decompile;
/*    */ 
/*    */ import javax.swing.JOptionPane;
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ public class Decompile
/*    */ {
/*    */   public static void main(String[] args)
/*    */   {
/* 19 */     JOptionPane.showMessageDialog(null, "Halo");
/*    */   }
/*    */ }


/* Location:              D:\Tio\Decompile\dist\Decompile.jar!\decompile\Decompile.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */

Seperti itulah hasil source code yang telah didecompile. Formatnya memang agak berbeda daripada kita menulis dari awal. Dan sedikit catatan dari saya pribadi, terkadang tools Java Decompiler ini menghasilkan source code tidak 100% benar (ada error jika dicompile lagi) namun kesalahannya tidak begitu fatal melainkan seperti adanya nama kelas atau variable yang sama dan pada scope yang sama yang telah dideklarasikan, ataupun seperti adanya kelas yang perlu didefinisikan namun tidak didefinisikan terlebih dahulu sehingga menyebabkan error.

Sekian dahulu dari saya, semoga dapat bermanfaat. Terimakasih.

Selasa, 16 Juni 2015

Penggunaan Regex Dengan QRegularExpression

Kali ini saya akan mencoba menulis tentang penggunaan Regex dengan menggunakan Class QRegularExpression pada Qt. Sebelum jauh melangkah kepada penggunaan QRegularExpression. Saya akan mencoba menjelaskan sedikit tentang apa itu Regular Expression atau biasa dikenal dengan Regex. Ya yang jelas Regex itu bukan suatu genre lagu.

Regex merupakan suatu fungsi yang digunakan dalam pengaturan pola pada suatu teks. Regex biasanya digunakan dalam melakukan validasi-validasi teks agar data teks yang masuk dapat terkendali dan terhindar dari Garbage In. Pengaturan pola pada Regex menggunakan notasi-notasi yang cukup bervariasi dalam penggunaannya. Kenapa kita perlu Regex? Karena untuk mempersingkat baris pada program kita dalam melakukan validasi, dengan menggunakan notasi-notasi dari Regex, kita bisa menghemat banyak baris dalam melakukan validasi pada program kita.

Dalam tulisan ini saya tidak membahas detil tentang notasi-notasi Regex, saya langsung saja menjelaskan bagaimana cara menggunakan Class QRegularExpression pada Qt. Berikut saya akan mulai menjelaskannya dengan diawali dari code program di bawah ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <QCoreApplication>
#include <QRegularExpression>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QRegularExpression regExp("[^\w]+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$");
    QString email = "freakandstein@gmail.com";
    if(regExp.match(email).hasMatch()){
        qDebug() << "Match";
    }else{
        qDebug() << "Not Match";
    }
    return a.exec();
}

Code program di atas melakukan contoh validasi format email dengan menggunakan Class QRegularExpression. Pada baris ke 7 terdapat pattern atau pola Regular Expresssion dengan menggunakan notasi-notasi yang akan melakukan validasi teks apakah itu email atau bukan. Untuk pattern Regex email tidak selamanya harus seperti pada baris ke 7 di atas, itu semua tergantung logic dan pengetahuan tentang notasi dari si pembuat pattern, bisa lebih singkat atau bisa lebih panjang.

Pada baris ke 8 kita mencoba email dengan nama "freakandstein@gmail.com" apakah valid atau tidak sebagai email. Lalu pada baris ke 9, email akan dicocokan dengan pola yang telah dibuat dengan menggunakan fungsi match() dan hasMatch(). Hasil dari baris ke 9 akan mengembalikan nilai True jika memang email tersebut terdapat kecocokan dengan pola atau akan mengembalikan nilai False jika memang email tersebut tidak ada kecocokan dengan pola.

Pada code program di atas saat dijalankan, maka akan menghasilkan "Match". Berikut adalah gambar dari contoh programnya.

Output Program Regex
Fungsi yang digunakan pada Class QRegularExpression untuk program di atas adalah fungsi match() dan hasMatch(). Sebenarnya masih ada beberapa lagi fungsi yang ada pada Class QRegularExpression. Tetapi untuk kali ini saya hanya menggunakan 2 fungsi tersebut, untuk selebihnya dapat dicari lagi lebih dalam pada documentation yang telah disediakan.

Untuk sekedar tambahan, saat ini banyak website yang menyediakan sarana untuk belajar Regex secara langsung. Kita bisa langsung mencoba membuat pola dengan notasi-notasi dan kita bisa langsung mengujinya dengan teks inputannya. Contohnya adalah https://regex101.com/, menurut saya website tersebut cukup rekomen bagi yang ingin belajar Regex. Di website tersebut selain kita bisa menguji pola yang kita telah buat secara langsung, di sana juga terdapat penjelasan yang cukup komprehensif untuk setiap notasi-notasinya.

Sekian dari saya, semoga tulisan ini bisa bermanfaat bagi kita semua khususnya pribadi saya sendiri. Terimakasih.

Jumat, 12 Juni 2015

Setup QT Developer For Android

Pada artikel kali ini saya akan mencoba berbagi tentang bagaimana caranya melakukan setup konfigurasi pada QT Developer untuk develop Android. Seperti yang kita telah tahu sebelumnya pada artikel saya, QT adalah sebuah tools atau framework yang berbasis C++ dan bisa mendevelop aplikasi desktop dan juga mobile seperti Android, Blackberry dan iOS. Kali ini saya akan mencoba fokus untuk Android terlebih dahulu, karena saya memang hanya memiliki Android saja :D.

Pertama dan yang utama adalah, kita harus mendownload QT untuk Android terlebih dahulu. Berikut adalah linknya jika ingin mendownloadnya terlebih dahulu QT For Android. Setelah download selesai, maka diinstal dan sedikit menunggu sampai dengan selesainya menginstal. Jika instalasi selesai, langsung saja buka QT Creator pada Program. Pilih Qt Creator (Community) seperti yang ada pada gambar di bawah ini

Qt Creator (Community) Pada Menu Program Windows

Jika kita sudah pernah menginstal QT namun bukan untuk yang develop Android, maka jangan sampai tertukar shortcut programnya. Tetapi sedikit tips dari saya, lebih baik dari awal kita instal saja QT untuk develop Android, karena bagaimanapun dengan QT Android kita bisa mendevelop aplikasi Android dan juga bisa mendevelop desktop. Namun jika kita menggunakan QT untuk desktop, maka kita tidak akan bisa mendevelop untuk aplikasi Android.

Saat Qt Creator (Community) telah dibuka. maka akan tampil sama persis seperti QT Creator untuk desktop. Kemudian masuk pada menu Tools -> Options->Android. Pada gambar di bawah, ini adalah tampilan dari menu Android.

Configuration Qt for Android
Pada gambar di atas, dibutuhkan JDK, Android SDK, Android NDK dan Ant Executable. Untuk ke empat file tersebut harus kita miliki untuk kemudian kita referensikan pada Qt Creator for Android. Bagi yang belum memiliki, berikut saya melampirkan link JDKSDKNDK dan Apache Ant. Bagi Programmer Mobile yang berbasis Java, tidak asing dengan apa yang dimaksud JDK dan SDK, namun saya akan mencoba menjelaskan sekilas tentang apa itu NDK. NDK adalah suatu Toolset yang mana kita bisa menulis program dengan menggunakan C/C++ Native pada develop aplikasi Android, inilah bagian penting dari Qt for Android Developer, karena dengan menggunakan Qt untuk mendevelop aplikasi Android, kita akan menggunakan bahasa pemrograman C/C++, sehingga membutuhkan yang namanya NDK sebagai penterjemah untuk bisa berkomunikasi dengan Dalvik Virtual Machine. Sedangkan Apache Ant itu sendiri adalah semacam Java Library untuk pendukung saat proses building software.

Setelah ke empatnya telah kita download, untuk JDK biasanya kita install, lalu untuk NDK, SDK dan Apache Ant cukup kita ekstrak saja. Kemudian untuk masing-masing lokasinya kita browse seperti gambar yang ada di atas. Sesuaikan masing-masing lokasinya. Setelah itu Qt for Android siap digunakan, kita bisa langsung mendeploy aplikasi yang telah kita buat ke dalam Gadget Android kita atau maupun bisa juga kita membuat terlebih dahulu virtual Gadget Android nya sebagai tester untuk aplikasi yang kita buat.

Sekian dari artikel yang singkat ini, semoga dapat bermanfaat.





Minggu, 07 Juni 2015

Cara USB Debugging Zenfone 2

Pada artikel kali ini, saya sedikit berbagi bagaimana caranya untuk melakukan debug pada Asus Zenfone 2 melalui USB. Awalnya, saya sempat bingung untuk melakukan debugging ini. Saya sempat berpikir bahwa ini adalah masalah kecil, karena biasanya pada gadget-gadget android terdapat menu Developer Options di dalam menu Settings, namun pada Zenfone 2 ini, saya tidak menemukan menu tersebut, saya sempat menghabiskan waktu cukup banyak untuk mencari dimana menu untuk mengubah mode menjadi USB Debugging. Namun saya tidak menemukannya juga, kemudian saya mencoba mencari forum luar lewat si kacamata Google, alhasil saya menemukan caranya, ternyata caranya agak sedikit unik, tidak menggunakan aplikasi tambahan pula. Unik dan simpel. Dua kata yang mewakili. Penasaran bagaimana caranya? Ok langsung saja saya mulai.

1. Buka menu Settings

Menu Settings

2. Pilih About, kemudian pilih Software Information


Menu About => Software Information

3. Pada Build number, tap beberapa kali


Build number

4. Tap beberapa kali hingga muncul seperti ini


Unlock Developer Option

5. Setelah itu kembali ke menu Settings dan lihat ada menu Developer Options


Menu Developer Options

6. Pilih Developer Options, kemudian akhirnya kita menemukan USB Debugging mode.


USB Debugging
Jika kita belum melakukan tahap seperti di atas, menu Developer Options tidak akan muncul. Demikian cara untuk menampilkan Developer Options pada Asus Zenfone 2. Terimakasih dan selamat mendeploy.

Sabtu, 30 Mei 2015

Virus CTB Locker Ransomware

Virus CTB (Curve Tor Bitcoin) Locker adalah jenis Ransomware terbaru. Mulai menyerang PC user sejak pertengahan Juli 2014. Virus ini sejenis parasit yang akan mengenkrip file-file pribadi kita dan untuk bisa didekrip kembali, kita harus menebusnya dengan berupa Bitcoins yang harganya bisa senilai 120 USD, 24 USD dan lain-lain tergantung permintaan dari jenis CTB Locker tersebut. Saat file-file kita telah terenkripsi, maka kita tidak akan bisa membuka file-file tersebut sebagaimana mestinya. Kita membutuhkan sebuah kunci / key untuk mendekripnya.

CTB Locker ini biasanya menyebar melalui email, pada email tersebut akan ada sebuah attachment file yang mana user biasanya akan terpancing untuk mendownload file tersebut. Setelah user mendownload file attachment tersebut, biasanya file tersebut berbentuk RAR. Setelah itu user mengekstrak file RAR tersebut dan akan ada 2 file hasil ekstraksi yaitu file berjenis HTML dan satu lagi berupa EXE (executable) namun icon file tersebut adalah berlambang PDF. Dan user akan terpancing karena penasaran dengan isi dari file bericon PDF tersebut yang padahal itu adalah awal dari kehancuran. Karena itu adalah trigger awal dari CTB Locker untuk menyebar ke sistem Windows kita. File-file yang akan diinfeksi oleh CTB Locker ini antara lain 3fr, accdb, ai, arw, bay, cdr, cer, cr2, crt, crw, dbf, dcr, der, dng, doc, docm, docx, dwg, dxf, dxg, eps, erf, indd, jpe, jpg, kdc, mdb, mdf, mef, mrw, nef, nrw, odb, odm, odp, ods, odt, orf, p12, p7b, p7c, pdd, pef, pem, pfx, ppt, pptm, pptx, psd, pst, ptx, r3d, raf, raw, rtf, rw2, rwl, srf, srw, wb2, wpd, wps, xlk, xls, xlsb, xlsm, xlsx.

Jika kita sudah mengetahui bahwa PC kita terjangkit virus ini, diharapkan segera untuk menginstall SpyHunter untuk menghapus Ransomware ini. Segera melakukan backup kepada file-file yang belum terinfeksi. Berikut adalah contoh dari warning CTB Locker.


Source : http://www.techrepublic.com/article/ctb-locker-virus-how-to-protect-your-systems-and-what-to-do-if-infected/
Sayangnya meskipun sudah dilakukannya full scanning oleh SpyHunter. File-file yang telah terinfeksi tetap tidak akan bisa dipulihkan kembali. Sehingga kembali lagi kepada slogan "Mencegah lebih baik dari pada mengobati". Sedikit tips dari saya, jangan pernah mudah terpancing kepada file-file yang tidak jelas siapa pengirimnya, perhatikan tipe file atau apa jenis filenya, berhati-hati jika menerima file yang berekstensi EXE, HTML dan VBS. Karena besar sekali kemungkinan itu adalah file-file yang menjadi trigger untuk menyebarnya virus ke dalam PC kita. Sekian dari saya dan semoga bermanfaat.

Sumber : http://tanpavirus.web.id/virus-ctb-locker/

Kamis, 21 Mei 2015

Efisiensi Code Menggunakan Collection Java Library

Pada artikel kali ini, saya akan mencoba berbagi keuntungannya menggunakan salah satu dari Collection Java Library yaitu ArrayList. Sebelumnya saya akan menceritakan sedikit tentang bagaimana cara membaca suatu teks pada sebuah file. Pada pembacaan teks di suatu file, biasanya kita menampung teks dari file tersebut ke dalam suatu array untuk setiap barisnya. Walaupun mungkin ada cara lain. Namun kita akan membahas di sini ketika ingin membaca teks pada suatu file berdasarkan per barisnya.

Langsung saja kita mulai. Kita akan mengambil suatu contoh script dari suatu website

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public int readLines(String path) throws IOException{
        FileReader file_to_read = new FileReader(path);
        BufferedReader bf = new BufferedReader(file_to_read);
        
        String aLine;
        int numberOfLines = 0;
        
        while((aLine = bf.readLine()) != null){
            numberOfLines++;
        }
        bf.close();
        
        return numberOfLines;
    }
source: http://www.homeandlearn.co.uk/java/read_a_textfile_in_java.html

Script di atas bekerja untuk menghitung jumlah baris teks pada file. Jika kita menggunakan array primitif, kita harus mendefinisikan jumlah element array terlebih dahulu. Karena itulah diperlukan script fungsi seperti di atas. Dan setelah itu menggunakan script berikut ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public String[] OpenFile(String path) throws IOException{
        FileReader fr = new FileReader(path);
        BufferedReader textReader = new BufferedReader(fr);
        
        int numberOfLines = 3;
        String [] textData = new String[numberOfLines];
        
        int i;
        
        for(i = 0; i < numberOfLines; i++){
            textData[i] = textReader.readLine();
        }
        
        textReader.close();
        return textData;       
    }
source: http://www.homeandlearn.co.uk/java/read_a_textfile_in_java.html

Jika menggunakan array primitif seperti script yang di atas, kita harus tahu jumlah elementnya terlebih dahulu, sedangkan kita biasanya tidak akan tahu berapa jumlah baris teks yang ada pada suatu file yang akan kita baca. Terlihat pada baris 5 pada script di atas, masih langsung ditentukan sendiri jumlah barisnya, seharusnya pada script di atas ada perubahan sedikit yaitu pada baris 5 sehingga menjadi seperti ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public String[] OpenFile(String path) throws IOException{
        FileReader fr = new FileReader(path);
        BufferedReader textReader = new BufferedReader(fr);
        
        int numberOfLines = readLines(path);
        String [] textData = new String[numberOfLines];
        
        int i;
        
        for(i = 0; i < numberOfLines; i++){
            textData[i] = textReader.readLine();
        }
        
        textReader.close();
        return textData;       
    }

Script di atas bekerja untuk membaca teks setiap baris pada suatu file, dengan menggunakan readLines(path), jumlah baris teks pada suatu file tersebut bisa kita definisikan melalui nilai kembali dari fungsi tersebut. Kemudian nilai kembalian dari fungsi tersebut digunakan untuk mendefinisikan jumlah dari element array yang akan menampung teks per barisnya.

Namun script di atas semuanya masih bisa diminimalisasi lagi menjadi lebih simpel dengan menggunakan ArrayList. Tidak perlu diharuskan untuk mengetahui berapa jumlah baris teks yang ada pada file yang akan dibaca. Berikut adalah script yang saya buat berdasarkan referensi dan kondisi dari dua script di atas sebelumnya.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public ArrayList<String> readFile(String path) throws FileNotFoundException, IOException{
        ArrayList arrList = new ArrayList<String>();
        FileReader fileReader = new FileReader(path);
        BufferedReader br = new BufferedReader(fileReader);
        String tmpLine = "";
        while( (tmpLine = br.readLine()) != null){
            arrList.add(tmpLine);
            //System.out.println(tmpLine);            
        }
        return arrList;
    }


Dengan menggunakan ArrayList, kita tidak perlu tahu jumlah baris teks dari file yang akan kita baca untuk ditampung ke dalam array. Pembacaan file juga hanya cukup sekali, tidak dilakukan dua kali. Selain jumlah code menjadi banyak, dengan kasus seperti ini juga akan membuat lambat kinerja program, karena membaca file dua kali yang mana seharusnya dapat dibaca sekali saja. Sekian dari artikel kali ini, semoga dapat menambah wawasan bagi yang membacanya. Terimakasih

Minggu, 10 Mei 2015

Tips Membaca Dengan Baik Dan Cepat

Membaca adalah salah satu cara dimana kita bisa mengambil suatu pelajaran atau ilmu pengetahuan. Kegiatan membaca sangatlah penting bagi siapa saja yang ingin memiliki tambahan wawasan pengetahuan. Dalam kalangan akademis, justru sangat dianjurkan atau bahkan diharuskan banyak membaca, karena ada beberapa bidang ilmu pengetahuan yang setiap saat terus berkembang, sehingga dibutuhkannya minat baca yang cukup baik.

Dengan membaca, kita menjadi banyak memiliki pandangan akan suatu objek, sehingga akan mempengaruhi pola kita dalam berpikir saat menghadapi suatu problematika. Manfaat membaca juga tidak hanya itu, dengan membaca kita bisa lebih mudah mengawali suatu pembicaraan kepada orang lain sebagai lawan bicara kita, ataupun kita bisa mudah ikut turut berkomunikasi kepada orang-orang yang sedang membicarakan topik tertentu yang ternyata boleh jadi karena kita sering membaca, kita bisa tau topik tersebut lalu kita bisa ikut "nimbrung". Dan masih banyak lagi keberuntungan yang akan kita dapat ketika kita gemar membaca.

Membaca tidak hanya sekedar melihat tulisan lalu mengucapkannya di bibir atau di hati. Tetapi membaca juga memiliki suatu tata cara, tata cara dimana kita bisa membaca secara efektif dan efisien. Efisien di sini adalah dalam arti seberapa banyak kita menggunakan waktu dalam membaca untuk memahami suatu bacaan yang sedang kita baca, semakin sedikit waktu yang kita gunakan untuk bisa sampai memahami apa yang kita baca, maka itu semakin efisien dan vice versa. Pada tulisan kali ini, saya akan mencoba berbagi tentang bagaimana cara membaca dengan baik dan cepat. Berikut adalah caranya.

1. Posisikan kepala dengan bacaan tidak begitu jauh atau tidak begitu dekat
Jarak membaca yang baik adalah 40 cm dari mata dengan sudut 40-70 derajat dari permukaan meja. Membacalah dengan posisi duduk tegak, tidak sedang tiduran apalagi jongkok. Karena agar mata kita tidak begitu bekerja keras dalam membaca dan tulang punggung atau pinggang kita tetap normal, tidak bungkuk atau sebaliknya.

2. Membaca dengan cahaya penerangan yang cukup.
Jika membaca dengan cahaya yang kurang, maka dapat merusak mata. Membacalah di tempat yang memiliki pencahayaan yang cukup terang, agar mata kita tetap sehat setelah membaca. Lalu di saat mata kita terasa sudah mulai lelah, berilah waktu sejenak untuk beristirahat, seperti kita berjalan-jalan sejenak sambil melihat pemandangan hijau atau lain-lainnya.

3. Konsentrasi
Saat membaca kita perlu sekali dalam berkonsentrasi, karena jika kita membaca namun tak berkonsentrasi, maka itu sama halnya dengan membuang - buang waktu saja, karena kita tidak akan bisa mengambil pemahaman dari apa yang kita baca jika tak berkonsentrasi. Sebisa mungkin hindarilah membaca sambil mendengarkan musik, karena biar bagaimanapun, hal itu akan membebani kinerja otak kita, sehingga kita menjadi lebih sulit dalam berkonsentrasi untuk membaca.

4. Membaca dengan tidak bersuara
Membaca yang baik itu tak perlu sampai mengeluarkan suara yang kita baca, berkaitan pula dengan kecepatan membaca, karena jika kita bersuara, otomatis akan memperlambat kecepatan kita membaca. Membaca dengan bibir yang bergerakpun juga tidak seharusnya demikian, karena itu juga akan memperlambat kecepatan membaca kita. Bahkan membaca dengan mengucapkan kembali kata-kata yang telah dibaca di kepala kita pun juga akan memperlambat kecepatan membaca kita.

5. Membaca dengan tidak menggerakan leher
Dalam membaca, terkadang leher kita ikut bergerak menyesuaikan posisi kalimat yang sedang kita baca, itu juga mempengaruhi kecepatan dalam membaca, dalam membaca yang cepat tidak seharusnya leher kita ikut bergerak, seharusnya hanya mata kita saja yang bergerak mengikuti kalimat yang sedang kita baca, mungkin jika pada awal-awal, otot mata kita akan merasa lelah, namun itu proses yang wajar, jika kita biasakan maka otot mata kita menjadi kuat dan terbiasa bergerak cepat mengikuti kalimat yang kita baca.

6. Membaca dengan tidak per satu kata
Saat membaca memang kita tidak akan membaca bacaan kita dari huruf demi huruf. Namun seharusnya juga tidak perlu membacanya dari kata demi kata. Apa maksudnya? Maksudnya adalah jika ada suatu kalimat dengan terdiri 5 kata, kita bisa membacanya sekaligus 2-3 kata, bagaimana mungkin bisa? Tentu saja bisa. Posisikanlah pandangan kita pada antara 2-3 kata tersebut yang ingin akan kita baca. Sedikit pengetahuan tambahan, bahwa otak kita tetap mampu membaca suatu kata meskipun urutan hurufnya dibolak-balik. Contoh untuk 3 kata ini "Libeh habet lgai" kita pasti tau apa 3 kata tersebut seharusnya, yaitu "Lebih hebat lagi". Dengan memanfaatkan itulah kita jadi bisa membaca kata dengan sekaligus banyak.

7. Latihan
Latihan yang rutin akan membuat kita menjadi terbiasa dan bisa. Ada suatu software yang bisa membantu kita dalam melatih kita untuk bisa membaca secara cepat. Software tersebut bisa didownload di sini. Berikut adalah tampilan software tersebut.


Kita juga bisa melakukan modifikasi pada teks yang akan kita baca. Setelah itu untuk memulainya adalah dengan memilih "Show Reader", maka akan tampil seperti ini


Jika kita bisa membaca dengan kecepatan Word Per Minutes sampai 500 WPM, itu sudah cukup bagus, tetapi dengan catatan, kita juga memahami isi dari bacaan tersebut, tidak hanya asal membaca cepat saja. Sekian dari tulisan ini, semoga dapat menggugah minat membaca teman-teman menjadi lebih baik lagi. Terimakasih dan selamat berlatih.

Jumat, 08 Mei 2015

Definisi Asset Management System

Sebelum menjelaskan apa itu Asset Management, saya akan mencoba menjabarkan satu per satu arti dari apa itu aset dan apa itu manajemen. Langsung saja tanpa panjang lebar lagi saya akan mecoba menjelaskannya. Asset adalah suatu jenis kekayaan yang dimiliki oleh individu ataupun suatu organisasi, memiliki nilai ekonomis, bisa berwujud (tangible) atau tidak berwujud (intangible), memiliki nilai tukar atau jual dan dapat membantu individu atau organisasi tersebut untuk mencapai suatu tujuannya. Kemudian pengertian dari Management adalah suatu pengelolaan sumber daya mulai dari manusia, finansial, fisik dan juga informasi untuk mencapai tujuan dengan efektif dan efisien.

Setelah penjelasan apa itu Asset dan apa itu Management. Maka dapat didefinisikan bahwa Asset Management adalah upaya pengelolaan aset atau suatu jenis kekayaan yang dimiliki oleh individu ataupun suatu organisasi, baik jenis kekayaan tersebut tangible atau intangible agar dapat tercapainya suatu tujuan dari individu atau organisasi tersebut. Dengan melalui proses perencanaan manajemen, pengadaan aset, pemeliharaan aset meliputi pengecekan informasi tentang kondisi aset hingga aset yang tidak bisa digunakan lagi.

Pada masa kini khususnya di negara kita yang tercinta Indonesia, pengelolaan aset masih belum maksimal dalam pemanfaatannya, karena memang diperlukannya kompetensi pengelola aset. Saat ini pengelolaan aset yang berwujud masih belum diimplementasikan dengan baik, bukan hanya pada perusahaan saja melainkan juga pada pemerintahan. Dibutuhkannya suatu figur sistem yang dapat menjadi pengelola aset dan mencatat segala aktifitas atau transaksi aset pada suatu organisasi, dan sebenarnya pada saat ini sudah cukup banyak sistem yang telah concern pada manajemen aset, hanya namun tak begitu banyak yang mengimplementasikan sistem-sistem tersebut. Contoh pada perusahaan tempat saya bekerja, kebetulan saya bekerja pada perusahaan yang concern pada aset manajemen, sistem yang pernah diimplementasikan antara lain seperti Hardcat Asset Management System dan Enterprise Asset Management IBM Maximo. Kedua sistem tersebut pada intinya adalah sebagai Asset Management. Namun tetap memiliki spesifikasi dan spesialisasi yang berbeda. Misal pada Hardcat Asset Management System, dapat dilengkapi juga Barcode Tracking System, sehingga sangat mudah dalam pengumpulan data pada aset. Dan untuk IBM Maximo Asset Management lebih fokus kepada plant dan produksi, infrastruktur, transportasi dan real estate.

Saya harap dengan tulisan ini, kita semua bisa lebih membuka mata akan pengelolaan aset, sehingga penggunaan aset bisa lebih efektif dan efisien. Sekian dari saya, harap maklum jika masih ditemukannya kekurangan. Terimakasih.





Senin, 04 Mei 2015

Perbandingan Cout Dengan Printf

Pada bahasa pemrograman C++ untuk melakukan perintah cetak, umumnya adalah menggunakan perintah cout dengan menambahkan header #include<iostream> terlebih dahulu di paling atas code editor. Namun karena pada dasarnya bahasa C++ ini adalah pengembangan dari bahasa C, bahasa C++ juga dapat menggunakan header atau librari yang tersedia pada bahasa C, tetapi tidak berlaku sebaliknya.

Pada bahasa pemrograman C, untuk melakukan perintah cetak adalah menggunakan printf dengan menambahkan header #include<stdio.h>, jika kita menggunakan compiler GCC, untuk menggunakan header tersebut, kita menambahkannya dengan cara menulis #include<cstdio>. sedikit berbeda bukan? Pada artikel kali ini, saya akan mencoba menjelaskan perbedaan apa saja yang ada pada kedua perintah cetak tersebut menurut versi saya.

1. Rawan kesalahan

  • Pada penulisan fungsi printf harus menggunakan tanda '%' untuk menyesuaikan tipe data apa yang akan dicetak. Misal jika akan mencetak double, maka akan menggunakan tanda '%d', jika suatu string maka '%s'. Sehingga ditulisnya printf("%s","Hello Kasih"), atau printf("%d", 28) dan lain-lain. Untuk format seperti itu rawan terjadinya error dan kita harus mengetahui tipe data terlebih dahulu sebelum mencetaknya. 
  • Pada penulisan fungsi cout harus menggunakan operator '<<'. Berbeda dengan fungsi printf, kita tidak perlu mengetahui tipe data apa yang akan dicetak. Dengan fungsi cout, langsung secara otomatis menyesuaikan tipe data yang akan dicetak. Jadi untuk kemungkinan terjadi kesalahan atau error lebih sedikit dibanding pada penggunaan printf.
2. Kecepatan
Pada penggunaan fungsi printf, proses mencetak jauh lebih cepat dibanding menggunakan cout. Pada printf compiler tidak perlu melakukan pengecekan kembali tipe data yang sesuai yang akan dicetak, melainkan karena sudah didefinisikan sendiri oleh kita. Proses pengecekan kembali yang dilakukan oleh compiler itulah yang membutuhkan waktu. Pada penggunaan fungsi cout, kita memang dimudahkan untuk tidak mendefinisikan tipe data apa yang akan dicetak terlebih dahulu, namun justru itu adalah faktor yang mempengaruhi kinerja compiler menjadi lebih lambat. Biasanya pada kontes pemrogramman seperti TOKI (Tim Olimpiade Komputer Indonesia) bagi yang menggunakan bahasa C++, disarankan untuk menggunakan fungsi printf dari pada menggunakan fungsi cout. Berikut adalah contoh program yang membandingkan kecepatan mencetak antara fungsi cout dengan printf.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;

int main()
{
    float start;
    start = clock();
    for(int i = 0; i < 5000; i++){
        //cout << "Hello World" << endl;
        printf("%s", "Hello World\n");
    }
    cout << "Durasi : " << ((clock() - start) / (float) CLOCKS_PER_SEC) << endl;
    return 0;
}

Pada program di atas, untuk mencoba perbedaan kecepatan antara printf dengan cout, dilakukan proses looping sebanyak 5000 kali. Dari jumlah loop tersebut sudah terlihat perbedaan waktu dalam satuan detik. Jika ingin mencoba program di atas, bisa langsung dicoba dicopy code program di atas ke www.cpp.sh untuk langsung melihat hasilnya. Sekian dan terimakasih. Semoga bermanfaat

Selasa, 28 April 2015

Optimasi Database Dengan Menambahkan Index

Pada setiap program pasti biasanya membutuhkan suatu media penyimpanan untuk data, baik data itu dalam jumlah yang banyak maupun sedikit. Penyimpanan data tersebut disimpan ke dalam program di dalam sebuah database. Perfomance pada suatu program terkait pula dengan banyak sedikitnya data yang ada pada database. Pengolahan data pada database juga sangat diperlukan, mulai dari perancangan desain baik secara logic atau fisik sampai kepada implementasinya, karena database menyangkut skalabilitas program itu sendiri dan terkait pula pada mudah atau sulitnya program tersebut dipelihara (Maintenance).

Untuk database yang mengolah data berjumlah banyak, dibutuhkan kiat-kiat atau tips agar pada proses waktu retreive data maupun update data dapat lebih teroptimalkan. Berikut saya akan mencoba berbagi tips untuk mengoptimalisasi database dengan cara menambahkan index.

Sebuah indeks database adalah sebuah struktur data yang meningkatkan kecepatan operasi dalam sebuah tabel. Indeks dapat dibuat menggunakan satu atau lebih dari satu kolom. Indeks dapat dibayangkan sebagai indeks buku, sehingga melalui indeks buku tersebut dapat dicari letak item tertentu dalam buku dengan mudah. Keberadaan indeks dalam basis data antara lain adalah untuk mempercepat pencarian data berdasarkan kolom tertentu.

Berikut adalah cara membuat Index pada suatu table untuk database MySQL.
 CREATE UNIQUE INDEX index_name  
 ON table_name ( column1, column2,...);  

Untuk contohnya misalkan kita memiliki sebuah table bernama mhs, kemudian kita ingin membuat index pada kolom nama. Berikut adalah contohnya.

 CREATE UNIQUE INDEX nama_idx  
 ON mhs (nama)  

Setelah pembuatan index selesai. Silahkan coba lakukan SELECT Query, misal SELECT nim FROM mhs WHERE nama='Kasih'. Bandingkan dan perhatikan waktu eksekusinya saat belum ditambahkan index dan setelah ditambahkan index.

Sabtu, 18 April 2015

6 Kesalahan Umum Pada Pemrograman C++

Pada kesempatan kali ini, saya akan mencoba berbagi tentang kesalahan-kesalahan yang biasa terjadi pada seorang programmer pemula dalam menulis code C++. Saya akan menulis 6 hal yang sering biasanya terjadi. Berikut adalah ulasannya.
1. Variabel tidak dideklarasi
1:  int main()  
2:  {  
3:   cin>>a;  
4:   cout<<a;  
5:  }  
Apa yang salah pada program di atas? ya yang kurang adalah tidak dideklarasikannya variabel a, seharusnya program di atas seperti ini
1:  int main()  
2:  {  
3:   int x;  
4:   cin>>x;  
5:   cout<<x;  
6:  }  
2. Variabel tidak diinisialisasi
1:  int count;  
2:  while(count<100)  
3:  {  
4:   cout<<count;  
5:   count++;  
6:  }  
Kesalahan pada sepenggal program di atas adalah tidak diinisialisasinya variabel count. Kesalahan pada program di atas karena variabel count nilainya akan terisi secara acak sesuai jangkauan tipe data integer, program itu mungkin tidak error jika dijalankan, tetapi output dari program itu dipastikan tidak akan sesuai harapan si penulis program.

3. Mengisi variabel dengan nilai variabel lainnya
1:  int a, b;  
2:  int sum=a+b;  
3:  cout<<"Enter two numbers to add: ";  
4:  cin>>a;  
5:  cin>>b;  
6:  cout<<"The sum is: "<<sum;  
Pada sepenggal program di atas, hampir sama kasusnya dengan poin ke 2, sama-sama belum diinisialisasikan. Baris ke 2 untuk variabel sum inisialisasikan dengan penjumlahan 2 nilai variabel a dan b. Namun kedua nilai variabel tersebut belum diinisialisasikan terlebih dahulu, sehingga hasil dari nilai variabel sum akan acak nilainya. Berikut sepenggal program di atas yang seharusnya.
1:  int a, b;  
2:  int sum;  
3:  cout<<"Masukkan 2 angka untuk penambahan: ";  
4:  cin>>b;  
5:  cin>>a;  
6:  sum=a+b;  
7:  cout<<"Variabel sum : "<<sum;  
Seperti di atas ini seharusnya sepenggal program tersebut. Maka hasilnya akan indah, karena jika sesuatu sesuai harapan akan indah dan baik.

4. Menggunakan "=" untuk membandingkan nilai variabel
1:  char x='Y';  
2:  while(x='Y')  
3:  {  
4:   //...  
5:   cout<<"Lanjutkan? (Y/N)";  
6:   cin>>x;  
7:  }  
Pada sepenggal program di atas, program akan menghadapi looping yang tidak ada hentinya, karena pada baris kedua variabel x bukan dibandingkan dengan nilai Y, melainkan variabel x selalu diinisialisasikan dengan nilai Y. Sehingga selalu dianggap true meskipun user memasukkan nilai selain Y pada variabel x. Berikut adalah sepenggal program yang seharusnya.
1:  char x='Y';  
2:  while('Y'==x)  
3:  {  
4:   //...  
5:   cout<<"Continue? (Y/N)";  
6:   cin>>x;  
7:  }  
Sekedar sedikit tips untuk menghindari kesalahan logic pada program di atas, sebaiknya variabel yang akan dibandingkan diletakkan disebelah kanan dari operator "==" dan nilai pembandingnya diletakkan di sebelah kiri dari operator "==". Agar jika kita seandainya lupa atau typo untuk mengetik operator perbandingan menjadi operator assign ("="), saat program dijalankan atau dicompile akan menampilkan error.

5. Semicolon berlebih
1:  int x;  
2:  for(x=0; x<100; x++);  
3:   cout<<x;  
Semicolon atau titik koma memang paling sering menjadi penyebab errornya program, kali ini juga program akan error tidak hanya di saat tidak menambahkan semicolon, melainkan saat menambahkan semicolon pun program menjadi error, karena pada penulisan for tidaklah menggunakan semicolon seperti yang ada pada baris ke 2 di atas.

6. Index array berlebih
1:  int array[10];  
2:  //...  
3:  for(int x=1; x<=10; x++)  
4:   cout<<array[x];  
Pada pemrograman seperti C++, index terakhir adalah selalu dikurang satu dari jumlah seluruh element arraynya, jika element array berjumlah 10, maka index dari array tersebut maximal adalah 9. Program di atas jelas akan error karena pada saat program dijalankan, index array tersebut mencapai nilai 10, sedangkan jumlah element array pada program di atas adalah 10, seharusnya program di atas dibuat seperti berikut ini.
1:  int array[10];  
2:  //...  
3:  for(int x=0; x<10; x++)  
4:   cout<<array[x];  

Minggu, 05 April 2015

Mendapatkan Dollar Dari Android

Saya akan mencoba berbagi bagaimana caranya kita mendapatkan dollar setiap harinya hanya dengan memainkan gadget android kita. Kita hanya perlu mendownload aplikasi yang direkomendasikan dan melakukan beberapa task. Tasknya antara lain seperti memainkan aplikasi yang telah kita download minimal 3-5 menit perharinya. Untuk itu saya akan mencoba berbagi bagaimana caranya kepada teman-teman yang ingin mencobanya. Berikut adalah langkah-langkahnya.

1. Buka Google Playstore di Gadget Android teman-teman
2. Install aplikasi Whaff. Ukurannya hanya sekitar 14 MB saja
3. Setelah diinstall, maka kita akan diminta untuk melakukan login pada aplikasi Whaff tersebut dengan akun Facebook.
4. Kemudian kita akan diminta masukan kode invitation code, masukkan kode invitation code ini. BC69134
5. Setelah berhasil, maka dipojok kanan atas dari aplikasi tersebut akan tampil dollar yang telah kita dapat. Untuk awal daftar, kita mendapatkan 0.3 $.

Teman-teman tidak perlu banyak menghabiskan banyak waktu untuk mendapatkan dollar perharinya, hanya cukup menghabiskan waktu beberapa menit saja untuk melakukan task demi task yang ada perharinya. Dollar yang telah dikumpulkan akan dapat ditukar (payout) antara lain ke Paypal, Google Play Giftcard, Facebook Giftcard, Amazon Giftcard, Xbox Giftcard, Steam Giftcard, Itunes dan lain-lain. Masing-masing memiliki minimum dollar yang baru akan bisa diambil (withdraw). Misal jika ingin ditukarkan ke Paypal, harus memiliki dollar yang telah terkumpul minimal 10.50 $.

Demikian dari saya, semoga bermanfaat dan selamat mengumpulkan dollarnya.

Jumat, 03 April 2015

Akses Website Dengan Java Library

Kembali lagi dengan saya, kali ini saya akan mencoba membahas tentang bagaimana kita mengakses sebuah website mulai dari login dari website tersebut, kemudian mengambil data atau konten yang terdapat dari website tersebut dengan menggunakan Selenium Library di Java. Selenium Library adalah sebuah library yang awalnya diperuntukan untuk Java. Namun sekarang sudah mulai dikembangkan tidak hanya dipakai oleh Java, melainkan bisa oleh C#, Ruby, Python dan Javascript. Selenium ini juga sering disebut sebagai API's Webdriver, teman-teman dapat mendownloadnya di sini Selenium Webdriver.

Pada tutorial kali ini, saya akan menggunakan Java dalam penggunaan Selenium Library ini. Saya akan membuat simulasi mulai dari login sampai mengambil konten yang ada ketika sudah login. Website yang saya gunakan adalah website local buatan saya sendiri yang hanya sekedar untuk login saja. Mekanisme dari bagaimana kita bisa login adalah kita harus tahu dulu tag, id, class, atau name pada HTML, sesuai kebutuhan saja, tergantung element yang tersedia dari website tersebut.

Berikut adalah source dari halaman web saat akan login.

 <!DOCTYPE html>  
 <html>  
   <head>  
     <title>Reservasi/Login</title>  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/bootstrap/css/bootstrap.min.css" />  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/jquery-ui/css/redmond/jquery-ui-1.9.0.custom.css" />  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/main.css" />    
   </head>  
   <body>   
     <div class="layout">  
       <div class="top_side">  
       </div>  
       <div class="left_side">  
       </div>  
       <div id="center_side">        
         <form method="POST" action="http://localhost/reservasi/login/sign" id="frm_login" name="frm_login">  
   <h3>  
     Login  
   </h3>  
   <label for="username">Username</label>  
   <input type="text" name="username" id="username" class="span3" />                
   <label for="password">Password</label>  
   <input type="password" name="password" id="password" class="span3" /> <br />  
   <input type="submit" class="btn" value="LOGIN" id="btnlogin" name="btnlogin" />  
   <input type="reset" class="btn" value="RESET" id="btnreset" name="btnreset" />  
 </form>  
       </div>  
       <div class="left_side">  
       </div>  
       <div class="bottom_side">  
         <h5>&COPY; Copyright by Satrio Wicaksono</h5>  
       </div>  
     </div>      
   </body>  
 </html>  

URL dari halaman tersebut adalah http://localhost/reservasi/login. Perlu kita perhatikan dari source halaman web login tersebut adalah element input yang ada pada element form, kita akan menggunakan tag id untuk setiap element input. Kita menggunakan id username, password dan btnlogin yang nantinya akan kita panggil pada program Java kita. Berikut adalah code dari program Java dengan penggunaan Selenium Library.

1:  package grabweb;  
2:  import org.openqa.selenium.By;  
3:  import org.openqa.selenium.WebDriver;  
4:  import org.openqa.selenium.WebElement;  
5:  import org.openqa.selenium.htmlunit.HtmlUnitDriver;  
6:  public class GrabWeb {  
7:    public static void main(String[] args) {  
8:       WebDriver driver = new HtmlUnitDriver();  
9:       driver.get("http://localhost/reservasi/login");  
10:      WebElement eUsername = driver.findElement(By.id("username"));  
11:      WebElement ePassword = driver.findElement(By.id("password"));  
12:      WebElement eLogin = driver.findElement(By.id("btnlogin"));  
13:      eUsername.sendKeys("admin");  
14:      ePassword.sendKeys("admin");  
15:      eLogin.submit();  
16:      WebElement eMessage = driver.findElement(By.tagName("h3"));  
17:      System.out.println(eMessage.getText());  
18:      driver.quit();  
19:    }  
20:  }  

Pada baris 8 adalah inisialisasi pembuatan object webdriver, kemudian baris 9 untuk menyambungkan program kita untuk bisa mengakses sebuah halaman website yang kita inginkan, pada tutorial ini halaman website yang kita akan coba adalah http://localhost/reservasi/login. Pada baris 10-12 adalah pengambilan element berdasarkan id dari web tersebut. Baris 13 adalah menginputkan element input yang memiliki id username dengan string "admin", begitu juga dengan baris 14. Lalu pada baris 15 adalah seolah-olah kita melakukan klik button submit dengan id yaitu btnlogin tadi. Kemudian setelah login entah berhasil atau gagal, akan melanjutkan ke baris 16 dengan mengambil element yang ada pada halaman selanjutnya setelah login. Element yang diambil kali ini berdasarkan tag name, yaitu tag name H3. Untuk lebih jelasnya, berikut adalah source halaman web setelah login berhasil

 <!DOCTYPE html>  
 <html>  
   <head>  
     <title>Reservasi/Login</title>  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/bootstrap/css/bootstrap.min.css" />  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/jquery-ui/css/redmond/jquery-ui-1.9.0.custom.css" />  
     <link rel="stylesheet" type="text/css" href="http://localhost/reservasi/assets/main.css" />    
   </head>  
   <body>   
     <div class="layout">  
       <div class="top_side">  
       </div>  
       <div class="left_side">  
       </div>  
       <div id="center_side">        
         <h3><marquee> Selamat datang admin</marquee></h3><form method="POST" action="http://localhost/reservasi/login/signout" id="frm_logout" name="frm_logout">    
   <input type="submit" class="btn" value="LOGOUT" id="btnlogout" name="btnlogout" />    
 </form>      </div>  
       <div class="left_side">  
       </div>  
       <div class="bottom_side">  
         <h5>&COPY; Copyright by Satrio Wicaksono</h5>  
       </div>  
     </div>      
   </body>  
 </html>  

Jika login berhasil, maka akan mengambil konten element dengan tag name H3 dari halaman tersebut. Maka program akan menghasilkan output "Selamat datang admin". Namun jika login gagal, maka saya membuat halaman web tersebut redirect kembali ke halaman login lagi dan program akan menghasilkan output "Login".

Kenapa saya memilih menggunakan Selenium Library ini, padahal Java sendiri sebenarnya memiliki fungsi atau kelas yang serupa dengan library ini, itu karena menurut saya penggunaannya lebih mudah dan Selenium ini juga dapat mengambil sebuah element html seperti button yang mana button tersebut tidak memiliki id atau name atau class, melainkan hanya memiliki sebuah value tag dari element input, namun Selenium dapat mengakses atau mengambil button tersebut. Syntaxnya kurang lebih seperti ini : WebElement eSubmit = driver.findElement(By.xpath("//input[@value='LOGIN']"));  Itulah salah satu kedahsyatan Selenium Library.

Cukup sekian dari saya, semoga bermanfaat dan terimakasih.