Membuat Pemutar Video dengan JMF

Di post sebelumnya kita sudah belajar membuat pemutar mp3, sekarang kita menambahkan fitur pemutar video.

Perlu diingat bahwa tidak semua format video didukung oleh JMF.

Kita dapat menambahkan source code dari post sebelumya pada pemutar mp3.

Berikut adalah tambahannya.

Pada constructor, kita tambahkan component berikut:

Component visualComponent = myPlayer.getVisualComponent();
this.getContentPane().add(visualComponent, BorderLayout.CENTER);

ukuran frame juga kita ubah untuk menampung visual.

this.setSize(new Dimension(500, 400));

kita juga menambah method play() sebagai berikut:

myPlayer.start();

sehingga pada akhirnya, berikut source code lengkapnya:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.*;
import java.net.*;

public class HelloJMF extends JFrame {
static Player myPlayer = null;
public HelloJMF() {
super(“Demo JMF”);
play();
Component panelControl = myPlayer.getControlPanelComponent();
Component visualComponent = myPlayer.getVisualComponent();
this.getContentPane().add(panelControl, BorderLayout.SOUTH);
this.getContentPane().add(visualComponent, BorderLayout.CENTER);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stop();
System.exit(0);
}
});
this.pack();
this.setSize(new Dimension(500, 400));
this.setVisible(true);
}
public static void main(String[] args) {
HelloJMF helloJMF = new HelloJMF();
}
void play() {
try {
URL url = new URL(“file”,null,”C:\\Dani California.mpg”);
myPlayer = Manager.createRealizedPlayer(url);
myPlayer.start();
}
catch (Exception e) {
System.out.println(“Unable to create the audioPlayer :” + e);
}
}
void stop() {
myPlayer.stop();
myPlayer.close();
}
}
Selamat memutar video!

Membuat Pemutar MP3 dengan JMF

Sudah lama tidak update blog…

Sekarang kita mau mencoba pemutar MP3 yang sangat sederhana menggunakan Java.

Java menyediakan beberapa API (Application Programming Interface) untuk memudahkan pengembang Java membuat aplikasi multimedia. Salah satunya adalah Java Media Framework (JMF) API. http://java.sun.com/products/java-media/jmf/.
Sebelum kita mulai pada pembuatan aplikasi tersebut, berikut adalah prerequisite yang diperlukan.
1. Tentu saja JDK..
2. Install JMF API yang dapat didownload pada link di atas

Jika prerequisite sudah dipenuhi, mari kita mulai pembuatan aplikasinya.

Sebelum kita membuat aplikasinya, kita perlu membuat tempat menampungnya. Jadi kita membuat Frame dulu.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class HelloJMF extends JFrame {
public HelloJMF() {
super(“Demo JMF”);
JLabel empty = new JLabel(); /*sementara kita gunakan JLabel untuk memperagakan penempatan sebuah control pada frame*/
this.getContentPane().add(empty, BorderLayout.CENTER);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
this.pack();
this.setSize(new Dimension(300, 100));
this.setVisible(true);
}
public static void main(String[] args) {
HelloJMF helloJMF = new HelloJMF();
}
}

Setelah kode dieksekusi, maka akan muncul frame seperti berikut:
demoframe

Sekarang kita gunakan frame untuk menampung pemutar mp3 kita.
pertama, tambahkan beberapa statement import

import javax.media.*;
import java.net.*;

kemudian buat method play() dan stop()
void play() {
try {
URL url = new URL(“file”,null,”C:\\Coldplay-Fix You.mp3″);
myPlayer = Manager.createRealizedPlayer(url);
}
catch (Exception e) {
System.out.println(“Unable to create the audioPlayer :” + e);
}
}
void stop() {
myPlayer.stop();
myPlayer.close();
}

kemudian edit contructor kita menjadi:

public HelloJMF() {
super(“Demo JMF”);
play();
Component control = myPlayer.getControlPanelComponent();
this.getContentPane().add(control, BorderLayout.CENTER);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stop();
System.exit(0);
}
});
this.pack();
this.setSize(new Dimension(300, 100));
this.setVisible(true);
}

sehingga pada akhirnya kode kita akan berbentuk sebagai berikut:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.*;
import java.net.*;

public class HelloJMF extends JFrame {
static Player myPlayer = null;
public HelloJMF() {
super(“Demo JMF”);
play();
Component control = myPlayer.getControlPanelComponent();
this.getContentPane().add(control, BorderLayout.CENTER);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stop();
System.exit(0);
}
});
this.pack();
this.setSize(new Dimension(300, 100));
this.setVisible(true);
}
public static void main(String[] args) {
HelloJMF helloJMF = new HelloJMF();
helloJMF.play();
}
void play() {
try {
URL url = new URL(“file”,null,”C:\\Coldplay-Fix You.mp3″);
myPlayer = Manager.createRealizedPlayer(url);
}
catch (Exception e) {
System.out.println(“Unable to create the audioPlayer :” + e);
}
}
void stop() {
myPlayer.stop();
myPlayer.close();
}
}

File mp3 yang akan kita putar dapat diletakkan di C:\ColdPlay-Fix You.mp3 (absolute path) seperti contoh. Tapi, bisa juga diletakkan di directory yang sama seperti file .class (hasil compile) sehingga kita hanya menulis “ColdPlay-Fix You.mp3″ Dengan demikian, kita sudah dapat membuat pemutar mp3 sederhana. Pengembangan berikutnya kita bisa menggunakan pemutar mp3 yang sudah beredar sebagai benchmark untuk membuat pemutar mp3 yang lebih lengkap fiturnya.
Selamat membuat!

Setting Classpath and Environment Variables

Just recently, when i need to install ant for my final year project, i kind of reminiscent back to that day when i need to set up the path variables and the classpath. It took me about one whole day to figure out how to compile and interpret .java file to run. Frustated i am, yes, because at that time i didn’t have internet connection (hence, googling is not as meaningful). When i did find how it is done by myself, i felt really ecstatic i treat myself a lavish dinner (I didn’t get to eat lavish dinner very often).

When i first started coding using Java, i didn’t use fancy IDEs like Eclipse or NetBeans, instead, i use Text Editor. This way, i get to know the basic of compiling, interpreting, setting classpath, etc. Compiling the sources itself took me about an hour because i didn’t want to go to java directory first then call the javac.exe. So, i didnt want to call cds command every so often anytime i use the command prompt to compile the .java file. I just want to be able to call javac in any working directory. Instead of always go to this directory:

C:\Program Files\Java\jdk1.5.0_07\bin>javac HelloWorld.java

i want to use the javac in any working directory, i.e:

C:\My Java Programs>javac HelloWorld.java

How to do this? First of all, you must set the environment variables. In Vista, this can be done on

Control Panel–>System–>Advanced System Settings

In Advanced tab, click Environment Variables button.

In System Variables group, find PATH variable and edit it by adding your Java directory where the javac.exe resides. So, in my case it would be:

some path;C:\Program Files\Java\jdk1.5.0_07\bin;

Click OK, open command prompt and then try typing any name of executable file in the bin directory. It works doesn’t it?

Now, you probably curious about what the environment variables are:

Microsoft defines them to be:

Environment variables are strings that contain information such as drive, path, or file name. They control the behavior of various programs. For example, the TEMP environment variable specifies the location in which programs place temporary files.

So, the PATH variable that we’ve edited specify the location of executable files. Such as dir, ping, cd, etc. By setting the PATH variable, we don’t need to change the working directory to the one that has ping.exe , for example. That is why by adding our java directory to the PATH variable, we can call the command in any working directory.

Now, about the classpath.

Sun has a very comprehensive tutorial on setting the classpath, so just check it out here.

If you want to keep things simpe, you can set the environment variable so you won’t keep typing classpath directory for each cmd session.

So, add the environment variable : java

give the value to the directory where all your java source code, ex:C:\java.

Next, when you try to compile and run your java, you can type:

C:\anydirectory>javac %java%\HelloWorld.java

C:\anydirectory>java -classpath %java% HelloWorld

There you go!

Tentang Applet : Pengalaman Pertama

Applet adalah program Java yang dapat dieksekusi dalam halaman HTML, kurang lebih sama seperti image di dalam HTML. Saat browser menemui applet dalam halaman HTML, maka kode applet akan diteruskan dan dieksekusi oleh JVM.

Karena itu, untuk dapat mengeksekusi sebuah applet, maka di client harus terdapat installasi JRE (Java Runtime Environment).

Kelebihan Applet dibandingkan kode biasa di HTML:

- Applet adalah aplikasi Java yang berjalan di browser. Jadi sebagian besar kemampuan aplikasi Java dapat diimplementasikan dalam applet.

- Tidak perlu ada installasi setelah JRE

- Platform independent seperti keunggulan aplikasi-aplikasi web based lainnya.

Sekarang, mari kita membuat applet.

Siapkan text editor pilihan anda dan ketikkan kode berikut:

import java.applet.Applet;

import java.awt.*;

public class HelloWorld extends Applet {

public void paint (Graphics g) {

g.drawString(“Kulu Nuwun”, 5, 15);

}

public void init() {

}

}

Kemudian, simpan sesuai dengan nama public class kita yaitu HelloWorld.java.

Jika belum pernah mengatur classpath dan lain-lain, maka save saja di tempat installasi jdk. Contoh:

C:\Program Files\Java\jdk1.5.0_07\bin

Save di direktori di atas, buka cmd dan ketikkan perintah-perintah berikut.

C:\Program Files\Java\jdk1.5.0_07\bin javac HelloWorld.java

Perintah ini akan membuat file baru di direktori tersebut yaitu HelloWorld.class (jika anda menggunakan Vista, maka tempat file .class ada di :

C:\Users\<Nama User>\AppData\Local\VirtualStore\Program Files\Java\jdk1.5.0_07\bin

File .class inilah yang akan kita distribusikan bersama halaman HTML kita.

Sampai di sini, kita belum bisa mencoba melihat hasil karya kita, masih ada satu langkah lagi.

Buat halaman HTML sederhana untuk menampung applet kita. Katakanlah Hello.htm

<html>

<body>

<applet code=baru\HelloWorld.class width=”200″ height=”200″>
    Browser tidak support tag applet
    </applet>

</body>

</html>

Simpan file Hello.htm ini di dalam folder yang sama seperti file .class hasil compile file HelloWorld.java kita tadi.

Buka file Hello.htm dengan browser pilihan anda. Bisa? Itulah applet. Selamat mencoba.

Konsep OOP : Polymorphism

Kegunaan kedua dari inheritance adalah polymorphism (banyak bentuk). Bagaimana penggunaanya?

Kita gunakan contoh dari post sebelumnya tentang Inheritance.

Misal kita punya class Peternakan yang akan memanggil method makan() dari semua object Hewan. Kita tidak tahu class Hewan sudah diturunkan menjadi apa saja: bisa ayam, bebek, dan lain-lain. Tapi, satu hal yang pasti, jika mereka adalah subclass dari Hewan, maka mereka mempunyai method makan().

public class Peternakan {

public static void main(String[] args) {

Hewan hewan = new Hewan();

Bebek bebekKloset = new Bebek();

Ayam ayamKampus = new Ayam();

kegiatanHewan(hewan);

kegiatanHewan(bebekKloset);

}

public void kegiatanHewan(Hewan ternak) {

ternak.makan();

}

}

Jika terlebih dahulu dideklarasikan bahwa Ayam dan Bebek adalah subclass dari Hewan dan method makan ada di Hewan dan memproduksi output berupa string “Makan!”, maka output kode di atas adalah:

Makan!

Makan!

Contoh di atas adalah polymorphism. Class Hewan mempunyai banyak bentuk (polymorphism), bisa berupa Bebek maupun Ayam sehingga jika ada method public void kegiatanHewan(Hewan ternak) yang mengambil class Hewan sebagai parameternya, maka Bebek dan Ayam dapat menjadi argumen yang valid karena Bebek dan Ayam adalah Hewan.

Selanjutnya, misalkan kita punya kode sebagai berikut:

Hewan bebekKloset = new Bebek();

apakah compiler akan mengeluarkan error? Jawabannya tidak. Karena Bebek adalah Hewan. Jika demikian pada heap, object apa yang ada? Bebek atau Hewan? Jika ada code sebagai berikut, apa yang terjadi (misalkan di class Hewan ada method makan() dan class Bebek override method makan tersebut):

Hewan bebekKloset = new Bebek();

bebekKloset.makan();

Method makan() mana yang dipanggil? makan() pada Hewan atau makan() pada Bebek?

Jawabannya adalah makan pada Bebek(). Mengapa? Karena Java melakukan “late binding”, artinya pengasosiasian method dilakukan pada runtime. Jadi pada contoh di atas, tipe bebekKloset adalah Hewan, tapi pada saat aplikasi dijalankan, sebenarnya bebekKloset adalah Bebek dan bukan Hewan.

Konsep OOP : Inheritance

Mengapa mengunakan inheritance? Ada dua alasan yang paling mendasar:

1. Untuk menggunakan kembali kode yang sudah ada

2. Untuk memanfaatkan polymorphism (kita lihat di post selanjutnya)

Mari kita lihat alasan pertama. Cara untuk mewarisi suatu kelas adalah dengan menggunakan keyword extends.

class Hewan {

public void makan() {

//kode yang amat sangat panjang dan rumit

System.out.println(“Makan”);

}

}

class Bebek extends Hewan {

public void barisBerbaris() {

System.out.println(“Siap grak!”);

}

}

public class Peternakan {

public static void main (String[] args) {

Bebek bebekKloset = new Bebek();

bebekKloset.barisBerbaris();

bebekKloset.makan();

}

}

Output dari program di atas adalah:

Siap grak!

Makan

Jadi, dalam pewarisan (inheritance) semua method dari kelas super dapat digunakan oleh kelas yang mewarisi tanpa perlu menulis method-method tersebut lagi.

Secara default, semua kelas di Java mewarisi kelas Object, itu adalah cara Java untuk memasukkan method-method yang sering dipakai agar tidak perlu dibuat lagi oleh programmer, contoh: toString(), equals(), dan lain-lain.

Pada Java, satu kelas tidak dapat mewarisi lebih dari satu kelas dalam satu keturunan (multiple inheritance). Jadi kita tidak bisa mendeklarasikan:

public class Bebek extends Hewan, Makanan

Tapi kita bisa mendeklarasikan sebagai berikut:

class Hewan extends MakhlukHidup

kemudian

class Bebek extends Hewan.

dalam kasus ini, Bebek mempunyai method dari class Bebek, Hewan dan MakhlukHidup.

Sekian tentang inheritance, post selanjutnya akan membahas tentang polymorpism.

Konsep OOP : Encapsulation

Dari pengalaman pribadi dan teman-teman yang baru berangkat dari latar belakang procedural programming menuju object oriented programming (oop) dalam hal ini Java, ketiga konsep di atas adalah yang paling membingungkan.

Ada apa dengan encapsulation, inheritance dan polymorphism?

Pertama, mari kita lihat konsep encapsulation.

Perhatikan contoh berikut: Sebuah aplikasi yang di dalam suatu inputnya tidak boleh negatif. Misalkan aplikasi kasir, kasih tidak boleh memberikan input pembayaran berupa negatif sehingga kembalian = harga barang – (- pembayaran). Toko bisa ngutang T_T”. Kita sebagai programmer tentu sudah tahu tentang ini dan membuat sebuah pengendali, katakan if statement untuk mengatasinya.

public class Kasir {

public int pembayaran, kembalian, harga = 0;

// kode-kode untuk Kasir

void cekTransaksi() {

if (pembayaran < 0) {

System.out.println(“Tidak bisa ngutang”);

}

}

}

Apa yang terjadi jika variable pembayaran pada class Kasir digunakan untuk lima class, kita harus menulis lima statement if yang sama. Apa yang terjadi kalau kita berada dalam satu tim untuk mengembangkan sistem tersebut dan programmer lain perlu mengakses variable pembayaran tapi tidak mengerti tentang tanda negatif tadi. Apa yang terjadi kalau dalam salah satu kelas tersebut kita lupa menaruh statement if? Aplikasi tidak berjalan dengan semestinya.

Untuk mengatasi masalah itu, kita perlu membungkus seluruh member dari class tersebut sehingga nilainya tidak bisa diubah menjadi yang tidak kita inginkan. Inilah fungsi encapsulation.

Encapsulation biasa dilambangkan dengan penggunaan accessor dan mutator, atau method get dan set. Penamaan method menggunakan konvensi JavaBeans. Dinamakan accessor (get) karena ia hanya mengambil tanpa mengubah state dari member tersebut dan dinamakan mutator (set) karena ia mengubah state dari member tersebut. Method-method ini dideklarasi sebagai public sedangkan variable dideklarasi sebagai private.

Contoh class Kasir yang diperbaharui:

public class Kasir {

private int pembayaran = 0;

public int getPembayaran {

return pembayaran;

}

public void setPembayaran (int inputBayar) {

if (inputBayar <0) {

System.out.println(“Tidak bisa ngutang”);

}

else {

pembayaran = inputBayar;

}

}

}

Dengan ini, aplikasi kita akan lebih aman.

Jadi, mengerti tentang encapsulation?

Tugas Akhir Tahap 1

Kelulusan sudah di depan mata. Tinggal satu yang perlu diselesaikan sebelum meraih gelar Bachelor of Computing (biar keren dikit). Tugas akhir. Momok seluruh mahasiswa dari Sabang sampai Merauke. Dari International Date Line West (GMT-12) sampai Nuku’alofa (GMT+13).

Dari pencarian yang serius ke berbagai website dan beberapa kata kunci seperti “skripsi”, “thesis”, “tugas akhir” (saran: “tugas akhir” lebih banyak hasilnya makanya judul blog ini memakai kata-kata tugas akhir), akhirnya diketemukan dua kandidat untuk diangkat menjadi topik skripsi saya.

1. J2ME dan Location Based Service (LBS)

Mengembangkan fasilitas Location Based Service pada mobile phone menggunakan teknologi J2ME. Location Based Service maksudnya memberikan layanan berdasarkan tempat kita berada sekarang. Bisa informasi jalan, tempat-tempat seperti restoran, atm terdekat, dan lain-lain. Jadi, saat eksekusi program, program akan mengambil lokasi kita (memakai GPS atau memakai Cell-based-apalah-itu-namanya) kemudian mengolah data dan menempatkan kita di peta yang bisa dilihat di mobile phone kita.

Teknologi yang dipakai J2ME ditambah JSR 179 (Location API).

2. J2ME dan VOIP

Mengembangkan aplikasi VOIP pada mobile phone menggunakan teknologi J2ME. Saya belum pernah mencobanya, tapi di gambaran saya sih cara pengembangannya sebagai berikut:

  • Capture audio dari speaker mobile phone
  • Olah menggunakan MMAPI (Mobile Media API-JSR 135)
  • Buat session SIP (Session Initiation Protocol) memakai SIP API (JSR-180)
  • Menggunakan session yang telah dibuat, transfer data
  • Convert kembali menjadi audio.

Kira-kira seperti itu. Idenya sih seperti itu. Apakah dapat diimplementasikan, saya tidak tahu.

 

Melalui berbagai pertimbangan, akhirnya saya memutuskan untuk mengambil topik pertama. J2ME dan Location Based Service (LBS). Tinggal mencari handphone yang ada GPS nya (sambil lirik-lirik housemate). Kalau sudah selesai akan saya post semua source code dan aplikasi jadinya di sini. Jadi, stay tune.

Ada yang mau ikutan topik ini?

SCJP 1.6 (CX-310-065)

Wow. SCJP 1.5 saja belum selesai dipelajari sudah muncul yang 1.6. Jadi bagaimana ini, yang mana yang saya harus ambil?

Jawabannya adalah : tergantung kesiapan anda.

SCJP 1.6 secara resmi diperkenalkan oleh SUN bulan Desember 2007. Jadi, belum banyak dokumentasi yang mengulas tentang modul-modulnya walaupun setelah saya membaca-baca pengalaman orang yang sudah mengambil exam, tidak terlalu banyak perbedaan dengan yang 1.5.

Pada intinya, perbedaan mendasar adalah dari segi waktu, passing grade dan tiga API yang baru diperkenalkan, yaitu: java.io.Console, java.util.NavigableSet, java.util.NavigableMap.

Berikut detil perbandingan kedua exam tersebut:

SCJP 1.5 (CX-310-055)

  • Pass score: 59% (43 of 72 questions)
  • Time limit: 175 minutes
  • SCJP 1.6 (CX-310-065)

  • Pass score: 65% (47 of 72 questions)
  • Time limit: 210 minutes
  • Perbandingan objectives kedua exam. (Copy-paste dari forum javaranch)

    • Section 3:
      1.5: Given a scenario involving navigating file systems, reading from files, or writing to files, develop the correct solution using the following classes (sometimes in combination), from java.io: BufferedReader,BufferedWriter, File, FileReader, FileWriter and PrintWriter.
      1.6: Given a scenario involving navigating file systems, reading from files, writing to files, or interacting with the user, develop the correct solution using the following classes (sometimes in combination), from java.io: BufferedReader, BufferedWriter, File, FileReader, FileWriter, PrintWriter, and Console.
    • Section 5:
      1.5: Given a scenario, develop code that declares and/or invokes overridden or overloaded methods and code that declares and/or invokes superclass or overloaded constructors.
      1.6: Given a scenario, develop code that declares and/or invokes overloaded methods and code that declares and/or invokes superclass, or overloaded constructors.
    • Section 6:
      1.5: Write code that uses the generic versions of the Collections API, in particular, the Set, List, and Map interfaces and implementation classes. Recognize the limitations of the non-generic Collections API and how to refactor code to use the generic versions.
      1.6: Write code that uses the generic versions of the Collections API, in particular, the Set, List, and Map interfaces and implementation classes. Recognize the limitations of the non-generic Collections API and how to refactor code to use the generic versions. Write code that uses the NavigableSet and NavigableMap interfaces.
    • Section 7:
      1.5: Given a code example, recognize the point at which an object becomes eligible for garbage collection, and determine what is and is not guaranteed by the garbage collection system. Recognize the behaviors of System.gc and finalization.
      1.6: Given a code example, recognize the point at which an object becomes eligible for garbage collection, determine what is and is not guaranteed by the garbage collection system, and recognize the behaviors of the Object.finalize() method.

     

    Jadi, harus pilih yang mana? Menurut opini saya, kalau ingin mengambil SCJP dalam waktu dekat lebih baik yang 1.5. Tapi kalau sudah yakin bisa menguasai objective yang baru, kenapa tidak? Ambil yang 1.6. Tergantung kesiapan dan motivasi kita. Kalau mau tanya saya, saya mau mengambil yang 1.5. Dokumentasi lebih banyak dan passing grade lebih kecil (beda 4 jawaban yang benar dengan 1.6). Lagipula, saya mau mengambil SCJP sebagai prerequisite untuk spesialisasi di SCMAD (Sun Certified Mobile Application Developer) dan untuk spesialisai itu independen dengan versi SCJP yang diambil.

    Jadi mau pilih yang mana??

    Menuju SCJP Tahap 1

    Apa sih SCJP? SCJP itu adalah singkatan dari Sun Certified Java Programmer. Sebuah sertifikasi bertaraf internasional yang dikeluarkan oleh Sun Microsystem.

    SCJP adalah fondasi untuk meniti karir di pemrograman Java. Sertifikasi advanced seperti SCWCD, SCMAD, dll membutuhkan SCJP sebagai prerequisite.

    Berikut bagan sertifikasi Java yang dikeluarkan oleh Sun Microsystem.

    certpathJava

    Sertifikasi SCJP yang terbaru adalah untuk yang SCJP 1.6 (310-065) karena Java yang terbaru yang 1.6, tapi sepertinya saya akan mengambil yang SCJP 1.5. Selain karena tidak banyak perbedaan antara materi yang diujikan juga karena dokumentasi untuk SCJP 1.6 belum banyak beredar.

    Jadi, saya bertolak ke Inixindo Jakarta yang merupakan salah satu prometrik di Indonesia. Begitu masuk, saya diarahkan ke petugas yang berkewenangan (yang manis dan cantik).

    Voucher SCJP berharga $150 jika dirupiahkan menjadi Rp. 1,425,000.

    Cukup mahal tapi yah namanya juga sertifikat internasional. Voucher yang saya beli expired bulan Oktober tahun ini. Jadi saya bisa menjadwalkan untuk mengambil exam kapan saja sebelum bulan Oktober. Cukup waktu untuk persiapan.

    Anehnya, tidak ada semacam record yang diisi waktu pembelian voucher, jadi seperti membeli handphone. Hanya diberikan kuitansi. Setelah saya lihat vouchernya ternyata memang begitu. Jadi kalau vouchernya hilang, yah..hilang juga duit kita T_T.

    Kemudian saya mencoba mencari bahan latihan. Dari hasil browsing, saya mendapat info buku yang direkomendasikan banyak orang. buku SCJP 1.5 karangan Kathy Sierra dan Bert Bates (yang merupakan pelopor situs www.javaranch.com. OK. Jadi saya coba mencari buku itu.

    Akhirnya ketemu juga di Kinokuniya Plasa Senayan. Mahal. Rp.750.000. Yah, jadinya saya mencari yang versi “petani” nya di internet. Terpaksa.

    Ya sudah, Menuju SCJP Tahap II menyusul setelah mengambil examnya. Tidak dalam waktu dekat ini yang pasti karena sedang sibuk dengan tugas akhir.

    Jadi, mau ikutan menjadi SCJP?

    « Older entries Newer entries »