Rabu, 27 Juni 2012

Double Buffering untuk Mengatasi "Flickering" di JAVA Applet

"Flickering" atau gambar yang berkedip merupakan masalah yang umum terjadi ketika membuat objek dan animasi di JAVA applet menggunakan AWT library. Berikut ini contoh kode untuk animasi sederhana di JAVA applet:

import java.applet.*;
import java.awt.*;
public class AnimasiBola extends Applet implements Runnable
{
   int x_pos = 10; 

   int y_pos = 100; 
   int radius = 20; 

public void init() 

   setBackground (Color.blue); 
 } 

public void start ()

   Thread th = new Thread (this); 
   th.start (); 
 } 

public void run () 

   Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

   while (true) 
   { 
        x_pos ++; 
        repaint(); 

        try 
        { 
             Thread.sleep (20); 
         } 
        catch (InterruptedException ex) { } 

       Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
   } 
 } 

public void paint (Graphics g) 
 { 
     g.setColor (Color.red); 
     g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 
  } 
}

Jika kode diatas dijalankan, animasi pada layar terlihat kurang "smooth", terlihat seakan-akan gambar berkedip sekian detik. Hal inilah yang sering disebut dengan istilah "flickering". Sedangkan penjelasan sederhana dari fenomena "flickering" adalah:
  • Ketika method repaint() dipanggil, method update() akan dijalankan.
  • Method update() secara default akan membersihkan tampilan layar kemudian memanggil method paint(). Method paint() inilah yang bertugas membentuk objek.
  • Karena ada mekanisme "bersihkan layar" dari method update() maka terjadi jeda waktu sekian milidetik antara tampilan layar yang dibersihkan dengan penggambaran kembali objek di layar.
Hal inilah yang mengakibatkan gambar objek berkedip. Untuk mengatasi hal tersebut, ada suatu cara yang cukup mudah yaitu dengan menggunakan 'double buffering'. Prinsip double buffering adalah sebagai berikut:

Analogikan layar JAVA applet terdiri dari dua screen layer, background layer dan foreground layer. Segala hal yang ada di background tidak akan terlihat jika ada objek di foreground di posisi yang sama. Ketika repaint() dipanggil, method update() membuat sebuah gambar di background, gambar yang dibuat sama dengan gambar objek yang akan ditampilkan di foreground. Selanjutnya gambar di background diduplikasikan ke foreground. Sehingga jeda waktu ketika layar dibersihkan akan terisi oleh gambar dari background.

Double buffering dilakukan di dalam method update(). Berikut ini contoh kode double buffering dari website ini :

public void update (Graphics g) {
// initialize buffer

if (dbImage == null) {

dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics (); }

// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

// draw elements in background
dbg.setColor (getForeground());
paint (dbg);

// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}


Senin, 25 Juni 2012

Lately, Buku Pemrograman == Buku Resep


Hari ini saya punya kesempatan ngobrol kembali dengan guru saya. Seorang JAVA programmer paling hebat yang pernah saya kenal. Seorang yang lebih memilih ketak ketik daripada drag and drop atau klik sana, klik sini di IDE. Seorang yang hingga saat ini belum pernah menggunakan Netbeans. Seorang yang lebih memilih menulis sendiri JAVA framework untuk para konsumen-nya ketimbang menggunakan framework yang telah ada. Intinya, seorang yang 'old-fashioned' atau lebih tepatnya 'konvensional' :-) However, itulah yang membuat beliau hebat dan faham betul JAVA "luar dalam".

Percakapan diawali dengan sapaan yang biasa beliau lontarkan ke saya, "Lagi opo, nduk?" Saya pun menjawab bahwa saya sedang mengajar, kemudian saya bercerita bahwa dalam mengajar JAVA, saya masih menggunakan buku JAVA SL-275 keluaran Sun, dan tutorial-tutorial yang dahulu saya dapatkan ketika saya masih belajar bersama beliau. Kemudian beliau berkomentar, buku materi dasar-dasar JAVA yang baik sepanjang pengetahuan dia adalah:
1. JAVA SL-275
2. Bruce Eckel - Thinking in Java (http://www.mindview.net/Books/TIJ/)
3. Josh Bloch - Effective Java

Beliau berkata "saya tidak cocok dengan buku-buku pemrograman yang banyak beredar di toko-toko buku jaman sekarang, buku-buku tersebut tak ubahnya seperti buku resep masakan saja..."

Beliau melanjutkan, "Buku resep hanya menampilkan nama masakan, nama bahan dan bagaimana cara membuatnya, tanpa menjelaskan bahwa cabai itu pedas, garam itu asin, intinya bersifat instan, tanpa konsep..."

Saya pun berpikir, apa yang beliau sampaikan memang benar. Buku-buku pemrograman yang beliau maksudkan memang seperti buku resep. Intinya, minim konsep. Tetapi kenapa buku-buku tersebut laku keras? Bahkan ada yang direvisi dan dicetak ulang setiap tahun, dan tetap laku! Guru saya pun punya jawabannya, "Jaman sekarang jarang-jarang ada orang belajar pemrograman yang orientasinya konsep. Sekarang semuanya mau cepat, serba instan." Saya setuju dengan hal tersebut. Hal yang kemudian terlintas dalam benak saya adalah 'kenapa'?

Beberapa kemungkinan yang terlintas di benak saya adalah:
Pertama, ada tuntutan deadline waktu pembuatan aplikasi. Mahasiswa yang diminta membuat sebuah aplikasi sebagai tugas mata kuliah, kebanyakan akan memilih membeli buku-buku instan tersebut. Hal ini karena pengetahuan tentang konsep membutuhkan waktu yang lebih lama, sedangkan mereka dibatasi deadline oleh dosennya. Maka orientasi para mahasiswa tersebut adalah, yang penting aplikasi jadi.
Kemungkinan kedua, berkaitan dengan perubahan lingkungan dan kultur. Hal ini cukup kompleks untuk dibahas, karena bersifat multidimensi. Bahkan, secara tak sadar, hal-hal kecil yang ada di jaman sekarang, contohnya tayangan televisi pun, secara tidak langsung telah mendidik masyarakat untuk lebih menyukai hal-hal yang serba instan.

Then... Bahkan saya mulai berpikir, blog saya ini -pun jangan-jangan menurut beliau juga seperti buku resep. Sepertinya saya harus merombak tulisan-tulisan saya disini agar lebih menekankan konsep ketimbang langkah-langkah praktis.

Rabu, 18 April 2012

Berbagi Pengalaman Visitasi Akreditasi

Visitasi akreditasi mungkin menjadi momen yang cukup melelahkan namun ditunggu-tunggu oleh perguruan tinggi. Kampus saya baru saja melalui proses visitasi selama 3 hari berturut-turut, selalu diakhiri hingga tengah malam, bahkan di hari terakhir kami baru selesai pukul 03.00 dini hari.
Asesor yang bertugas dari Politeknik Bandung (POLBAN) dan dari ITTelkom. Dari pengalaman visitasi akreditasi kemarin, saya ingin berbagi beberapa tips untk teman-teman yang sedang mempersiapkan diri sebagai objek visitasi:

  1. Setiap informasi yang dituliskan di borang harus ada bukti fisik yang lengkap. Saya katakan disini "setiap informasi", frase tersebut berlaku bahkan untuk setiap kata dan setiap angka yang telah kita cantumkan di borang. Salah satu contoh yang kami alami, ketika asesor menanyakan tentang keterserapan alumni di dunia kerja, referensi data yang kami gunakan adalah formulir alumni tracer. Asesor meminta untuk ditunjukkan formulir tersebut, dan menghitung tumpukan formulir tersebut satu-persatu untuk dicocokkan jumlahnya dengan angka di borang. Pelajaran berharga yang didapatkan adalah, setiap aktivitas sekecil apapun, harus kita dokumentasikan dari awal. Bahkan jika ada pertemuan kecil dengan mahasiswa, baiknya dibuat BAP. Penyusunan dokumennya-pun harus rapi dan terstruktur sehingga jika suatu saat dbutuhkan, mudah untuk dicari.
  2. Bagian penyaji data fisik, baiknya merupakan orang-orang yang memang sehari-hari bekerja dengan data-data yang terkait. Alhamdulillah tidak ada masalah dalam pencarian dan penyajian data fisik selama visitasi berlangsung di kampus saya. Para penyaji data fisik adalah orang-orang yang mewakili bagian akademik, kemahasiswaan, kepegawaian, logistik, olahta, LPM, LPPM, laboratorium, perpustakaan.
  3. Perlu diperhatikan layout ruangan visitasi. Layout meja di kampus saya membentuk huruf U. Pada dua sisi yang berhadapan adalah meja asesor berhadapan dengan meja Pengisi Borang, kemudian meja tempat penyajian data fisik ada di ujung meja asesor memanjang hingga ujung meja pengisi borang dan para penyaji data fisik duduk dibelakang meja tersebut. Ketika pengisi borang membutuhkan data fisik, bisa dengan mudah langsung memberikan kode kepada para penyaji data fisik.
  4. Siapkan akomodasi seperti tempat sholat, air minum, terutama konsumsi snack dan makanan besar sebaik mungkin, mengingat visitasi akan memakan banyak energi.
  5. Sebelum visitasi akreditasi dilaksanakan, lakukan simulasi visitasi dengan mengundang rekan sejawat yang faham seluk beluk akreditasi atau minimal pernah menjalani proses visitasi akreditasi. Hal ini perlu untuk mengetahui apa kira-kira poin yang kurang dalam borang milik kita dan apakah data-data fisik yang disediakan sudah lengkap.
  6. Lakukan pertemuan untuk mensosialisasikan visitasi ini kepada mahasiswa dan segenap civitas kampus, termasuk cleaning service. Pengalaman kemarin di kampus saya, ketika asesor melakukan kunjungan ke lab dan bertemu dengan mahasiswa, asesor menanyakan tentang visi misi institusi dan prodi.
  7. Terkait dengan poin 5, pemahaman tentang visi misi institusi dan prodi baiknya diberikan kepada dosen, karyawan dan mahasiswa jauh-jauh hari sebelum visitasi berlangsung. Komentar dari asesor di kampus saya adalah, mahasiswa dan karyawan baru sampai di tahap "hafal" namun belum sepenuhnya "paham" tentang visi misi institusi dan prodi.
  8. Selain pengisi borang, baiknya jangan bicara atau mengemukaan pendapat ke asesor sebelum diminta oleh pengisi borang.
  9. Selama visitasi, kita diperbolehkan mengajukan revisi dari borang yang sudah dibuat, revisi tentunya dapat dilakukan jika data atau bukti fisik revisi dapat kita sediakan.

Semoga bermanfaat..

Senin, 16 Januari 2012

Multimarker dengan in2AR v 2

File yang saya gunakan untuk mencoba adalah file SimpleDemo.as yang berada di dalam bundle SDK v2. Agar dapat mendeteksi beberapa buah marker, ada beberapa baris kode yang harus diubah yaitu:

Tambahkan (embed) source marker pada baris ini:
// embed your data file here
        [Embed(source = '../assets/def_data.ass', mimeType='application/octet-stream')]
        private static const data_ass:Class;
        [Embed(source = '../assets/bush_data.ass', mimeType='application/octet-stream')]

Tambahkan reference objek pada baris ini:
asfeatLib.addReferenceObject( ByteArray( new bush_data_ass ) );

Dalam fungsi onModelDetected ganti indeks array models dengan ref.id:
models[ref.id].setTransform( ref.rotationMatrix, ref.translationVector, ref.poseError, mirror );

Saya hanya ingin mencoba mendekteksi marker yang berbeda, untuk model 3d yang ditampilkan saya menggunakan model yang sama dengan file contoh jadi saya melakukan langkah ini: tambahkan instance dalam Away3DLiteWorld.as, kemudian dalam SimpleDemo.as panggil intance tersebut (dalam fungsi init3d() ):

models = Vector.<ARAway3DLiteContainer>([
                                                world3d.in2ar,world3d.in2ar2
                                                ]);

 dan jangan lupa... :-D ubah jumlah objek referensi pada baris ini:

 public var maxReferenceObjects:int=2;


Selamat mencoba..

Senin, 09 Januari 2012

in2AR versi 2

Berikut ini langkah-langkah yang saya gunakan untuk mencoba menggunakan in2AR versi 2, dengan catatan tanpa ada project yang ditambahkan, hanya mencoba file contoh yang disertakan di dalam SDK.

  1. Download SDK terbaru dari website in2AR
  2. Jalankan FlashDevelop, buat project baru, unzip SDK in2AR ke dalam folder project anda.
  3. Pada jendela Project di FlashDevelop, pastikan semua .swc di dalam folder lib telah di - "Add to library". Caranya klik kanan pada masing-masing .swc kemudian beri tanda cek pada "Add to library".
  4. Jika pada project in2AR versi sebelumnya anda menemukan file main.as, maka pada in2AR versi 2 ini anda tidak akan menemukan file main.as. Sebagai gantinya, di dalam folder examples ada 5 file .as, files inilah main.as yang anda cari. Anda dapat mencoba untuk menjalankan setiap .as tersebut satu persatu.
  5. Misal anda ingin mencoba SimpleDemo.as, pada jendela Project, klik kanan file SimpleDemo.as lalu beri tanda cek pada "Document Class". Selanjutnya klik "Test Project".

Terjadi error???

Coba sebelum mencoba menjalankan file .as klik Menu Project > Properties.
  1. Pada tab output, pada bagian General, arahkan Output file ke bin\SDK_SimpleDemo.swf.
  2. Pada Tab SDK di bagian Installed SDK(s) pilih SDK yang anda gunakan, setting yang saya gunakan Flex 4.5.1, AIR 2.6 karena kebetulan memang saya menggunakan Flex tersebut.
  3. Pada tab Classpaths, di bagian Project Classpath, tambahkan classpath examples, sesuai dengan nama folder tempat SimpleDemo.as berada.

Selamat Mencoba