LibGDX untuk membuat Game pada Android (Modul Tutorial LibGDX)

13 October 2013 at 07:42 | Posted in android, kuliah | Leave a comment
Tags: , ,

LibGDX  (libgdx.badlogicgames.com) adalah framework untuk membuat game,  visualisasi dan simulasi.  Kelebihan LibGDX diantaranya:

  1. Multiplatform. Dapat menghasilkan app untuk desktop (Win, Linux, Max), Android, iOS dan web dengan mudah.
  2. Free dan opensource (lisensi Apache 2.0).
  3. Basisnya Java.
  4. Tidak perlu mengetahui Android SDK.  Anda dapat membuat game di Android walaupun belum pernah membuat app di Android sebelumnya, tentunya asal mengerti Java.
  5. Tidak perlu menggunakan emulator!  Proses pengembangan jadi jauh lebih cepat. Jalankan project di desktop dan nanti setelah selesai baru jalankan versi Androidnya tanpa tambahan code.
  6. Kinerja bagus, melebihi beberapa framework lain (pembahasan tentang ini: http://www.sparkrift.com…l)
  7. Menyediakan banyak fitur yang memudahkan programmer membuat game seperti box2D, Scene2D, Bullets  3D dan lainnya.
  8. Dokumentasi lumayan dan forum-nya aktif.

Saya membuat modul praktikum untuk kuliah game programming di Ilkom UPI. Lisensi tutorialnya adalah creative commons dan formatnya MS Word, jadi silahkan didistribusikan, dimodifikasi asal nama saya jangan dibuang.  Bagi yang berminat, dokumennya dapat didownload di: yuliadi.com/ilkom  (cari dokumen yang diawali “tutorial_libgdx”)

Perlukah memanaskan mobil lama-lama?

11 August 2013 at 10:07 | Posted in Uncategorized | Leave a comment

Memanaskan mobil sepertinya sudah menjadi kebiasaan. Bagi yang memiliki garasi jauh dari rumah dan tetangga ini tidak menjadi masalah, tetapi bagi yang tinggal di daerah padat dan rumah kecil ini bisa menimbulkan polusi yang merugikan orang-orang disekitar mobil. Apalagi catalytic converter yang berfungsi untuk menyaring zat berbahaya dari buangan kendaraan  baru berfungsi optimal pada suhu 650 derajat celcius. Belum lagi kalau mempertimbangkan bahan bakar yang dibuang percuma.

Setelah saya membaca manual buku mobil saya (Picanto), ternyata hanya diperlukan 10-20 detik untuk memanaskan mobil, dengan perkecualian untuk cuaca yang sangat dingin yang tentunya  tidak pernah terjadi di Indonesia. Menurut saya ini juga berlaku untuk mobil-mobil yang lain, diluar mobil berumur tua.  Jika ragu, coba baca manualnya.

Image

Implementasi Game/Animation Loop di Android Bagian 2

4 August 2013 at 00:26 | Posted in android | Leave a comment

Pada posting sebelumnya, telah dibahas implementasi game loop di Android.  Tetapi implementasi tersebut masih memiliki kelemahan. JIka jumlah objek banyak sehingga proses update posisi membutuhkan waktu lama,  ditambah lagi delay yang fix 0.2 detik maka loop akan berlangsung lebih lama dari seharusnya. Kecepatan animasi juga dapat berbeda untuk berbagai smartphone.

Ada dua cara untuk memperbaiki: pertama delay dilakukan secara dinamik, semakin lambat smartphone, semakin lambat loop maka sleep juga akan semakin sebentar. Yang kedua, jika loop membutuhkan waktu lebih lama dari minimal waktu yang ditentukan, maka untuk mengejar ketertinggalan update posisi akan dilakukan tanpa ditampilkan (hanya updateposisi tanpa draw). Penjelasan lebih rinci dapat dilihat di http://obviam.net/index.php/the-android-game-loop/   Kode dibawah juga saya adaptasi dari contoh pada web tersebut.  Berikut kode-nya, banyak komentar yang saya tambahkan pada kode ini, semoga bisa lebih memperjelas.

import com.example.animasicanvas2.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;

//menggunakan runnable, karena hanya run yang dibutuhkan untuk dioverride
//baca: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
//tentang bedanya extends thread vs runnable

//sebagian kode diambil dari : http://obviam.net/index.php/the-android-game-loop/

public class GameRunnable implements Runnable {

	 //TAMBAHAN==========

	// nilai frame per detik (fps) yang diinginkan
	// jika 25 FPS artinya satu loop yang berisi update+draw akan dieksekusi setiap 1/25 detik
	private final static int 	MAX_FPS = 25;

	// frame period, waktu satu loop dieksekusi dalam satuan mili detik (ms)
	// jadi kalau 25 FPS, maka frame perode adalah 1/25 detik atau 1000/25 ms = 40ms
	private final static int	FRAME_PERIOD = 1000 / MAX_FPS;

	// jumlah frame yang boleh dilewat saat proses update posisi terlalu lama
	// Contoh: untuk 25 FPS, satu loop berarti diekkseskusi 40ms
	// misalnya jumlah objek yang harus diupdate posisinya banyak sehingga
	// melewati 40ms, maka akan dilakukan updateposisi *TANPA* proses draw (di-skip).
	// kenapa spt itu? karena lebih baik FPS turun daripada posisi objek berantakan.
	// konstanta berikut menyatakan berapa frame proses draw boleh di-skip
	// detilnya silahkan lihat method run()
	private final static int	MAX_FRAME_SKIPS = 5;

	 //jika true, loop di run() berakhir
	 boolean mRun=false;
	 float posX=10;
	 float posY=100;
	 Bitmap bmp;
	 private Paint cat = new Paint();

	 //akses ke surface dan canvas
	 private SurfaceHolder mSurfaceHolder;

	 //akses ke context (untuk ambil resource)
	 Context mContext;

	 long lastTick;

	 private void updatePosisi(long tick) {
		 //1 tick = 1/25 detik (untuk 25FPS)
		 //update akan dilakukan jika sudah berselang 1 detik dari update terakhir
		 if (tick-lastTick > 25) {
			 //geser ke kiri dan kalau sudah max, kembali ke awal
			 posX= posX+10;
			 if (posX>200) {
				 posX=10;
			 }
			 lastTick = tick;
		 }
	 }

	 //siapkan resources berupa bitmap,
	 //ambil bitmap icon launcher supaya mudah
	 public GameRunnable(SurfaceHolder vSurfaceHolder, Context vContext) {
		  mSurfaceHolder = vSurfaceHolder;
		  mContext = vContext;
		  Resources res = mContext.getResources();
		  bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
	 }

	 //bersihkan layar dan gambar objek
	 public void doDraw(Canvas c) {
		//canvas perlu dicek apakah null, karena pada saat
		 //user pindah ke activity lain (user tekan home), c bisa
		 //berisi null (proses shutdown belum selesai dan
		 //thread masih jalan, tapi canvas sudah didestroy)
		 if (c!=null) {
			//clear screen
			c.drawColor(Color.WHITE);
			//gambar bitmap
			c.drawBitmap(bmp,posX,posY,cat);
		}
	 }

	 @Override
     public void run() {

		 //TAMBAHAN
		 // waktu mulai awal loop
		 long beginTime;

		 // waktu real yang dibutuhkan untuk loop
		 long timeDiff;

		 // waktu tidur, misal FPS 25, berarti 1 loop = 40ms. Jika timeDiff = 30 ms, maka
		 // sleeptime 10ms (sisa waktu digunakan untuk sleep)
		 // tapi jika timeDiff 60ms, maka sleepTime akan bernilai negatif (-
		 int sleepTime;

		 // jumlah frame (draw) yang sudah di-skip, lihat penjelasan tentang
		 // MAX_FRAME_SKIPS diatas
		 int framesSkipped;

		 //satuan waktu update, setiap update nilai tick akan bertambah
		 //jika objek dalam suatu game banyak, nilai tick digunakan sebagai waktu global
		 //sehingga setiap objek sinkron
		 long tick = 0;

		 //loop forever selama tidak dishutdown (mRun diset false)
		 while (mRun) {
             Canvas c = null;
             try {
                 c = mSurfaceHolder.lockCanvas(null);
                 //lock surface agar tidak diakses thread lain dulu
                 synchronized (mSurfaceHolder) {
                     //TAMBAHAN
                	 //catat waktu skr
                	 beginTime = System.currentTimeMillis();
     				 framesSkipped = 0;

                	 updatePosisi(tick);
                	 tick++;
                     doDraw(c);

                     //TAMBAHAN
                     //hitung waktu yg dibutuhkan untuk satu loop
                     timeDiff = System.currentTimeMillis() - beginTime;
     				 //hitung waktu tidur, kalau positif artinya loop
                     //lebih cepat dari max FPS dan thread akan tidur
                     //tapi kalau nilainya negatif artinya loop berjalan
                     //lebih dari waktu seharusnya shg akan dilakukan penyesuaian
                     //yaitu update posisi tanpa draw.
     				 sleepTime = (int)(FRAME_PERIOD - timeDiff);

     				 //sleep sebanyak sleepTime kalau masih ada siswa waktu (sleeptime>0)
     				 if (sleepTime > 0) {
	     				 try {
	     						Thread.sleep(sleepTime);
	     				 } catch (InterruptedException e) {
	     						e.printStackTrace();
	     						Log.e("yw","error saat mencoba sleep"+e.getMessage());

	     				 }
     				 }

     				 //jika sleeptime negatif (proses update dan draw terlalu lama)
     				 //maka masuk loop berikut
     				 //di dalam loop update dilakukan *TANPA* draw
     				 while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {

    					// update posisi saja
     					updatePosisi(tick);
     					tick++;
    					//tambah, jika sleepTime>=0 keluar
    					sleepTime += FRAME_PERIOD;

    					//jumlah draw yang di-skip, dibatasi agar FPS tidak terlalu
    					//drop
    					framesSkipped++;
    				 }

                 }
             } finally {
                 //pastikan diunlock
                 if (c != null) {
                     mSurfaceHolder.unlockCanvasAndPost(c);
                 }
             }
         }
     }

	//jika diset false maka akan shutdown (lihat method run())
	public void setRunning(boolean b) {
		mRun = b;
	}
}

Implementasi Game/Animation Loop di Android

2 June 2013 at 13:49 | Posted in android | 1 Comment
Tags: ,

Bermula dari pertanyaan mahasiswa, ternyata setelah cukup lama saya mencari belum ada penjelasan yang menurut saya enak mengenai loop untuk animasi atau game berbasis canvas (game loop). Akhirnya saya coba sendiri menggunakan dasar contoh LunarLander yang merupakan bagian dari SDK samples dengan lumayan banyak modifikasi.

Game loop pada intinya adalah:

while (true) {
	updatePosisiObjek();
	gambarObjek();
}

Contoh berikut merupakan implementasi loop untuk animasi sederhana.  Jika anda belum mengerti dasar-dasar Android, anda dapat mendownload modul pengantar android di yuliadi.com/ilkom terutama bagian canvas.

Pada app ini terdapat tiga class, pertama GameRunnable yang berfungsi untuk mengatur gerakan dan menggambar di canvas. Kedua adalah GameView yang merupakan turunan dari SurfaceView yang menyediakan canvas yang akan digambar. GameView ini juga bertugas membuat dan mematikan thread (thread ini diisi GameRunnable). Terakhir adalah activity utama (MainActivity). Penjelasan lebih detil dapat dilihat di source codenya langsung.

Source code untuk class GameRunnable:

package edu.upi.cs.yudiwbs.animasicanvas2;

import com.example.animasicanvas2.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;

//menggunakan runnable, karena hanya run yang dibutuhkan untuk dioverride
//baca: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
//tentang bedanya extends thread vs runnable
public class GameRunnable implements Runnable {

	 //jika true, loop di run() berakhir
	 boolean mRun=false;
	 float posX=10;
	 float posY=100;
	 Bitmap bmp;
	 private Paint cat = new Paint();

	 //akses ke surface dan canvas
	 private SurfaceHolder mSurfaceHolder;

	 //akses ke context (untuk ambil resource)
	 Context mContext;

	 private void updatePosisi() {
		 //geser ke kiri dan kalau sudah max, kembali ke awal
		 posX= posX+10;
		 if (posX>200) {
			 posX=10;
		 }

		 //tidur 0.2 detik, agar animasi tdk terlalu cepat
		 try {
				Thread.sleep((long)(1000*0.2));
		 } catch (InterruptedException e) {
				e.printStackTrace();
				Log.e("yw","error saat mencoba sleep"+e.getMessage());

		 }
	 }

	 //siapkan resources berupa bitmap, ambil bitmap icon launcher supaya mudah
	 public GameRunnable(SurfaceHolder vSurfaceHolder, Context vContext) {
		  mSurfaceHolder = vSurfaceHolder;
		  mContext = vContext;
		  Resources res = mContext.getResources();
		  bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
	 }

	 //bersihkan layar dan gambar objek
	 public void doDraw(Canvas c) {
		 //canvas perlu dicek apakah null, karena pada saat
		 //user pindah ke activity lain (user tekan home), c bisa
		 //berisi null (proses shutdown belum selesai dan
		 //thread masih jalan, tapi canvas sudah didestroy)
		 if (c!=null) {
			//clear screen
			c.drawColor(Color.WHITE);
			//gambar bitmap
			c.drawBitmap(bmp,posX,posY,cat);
		}
	 }

	 @Override
     public void run() {
		 //loop forever selama tidak dishutdown (mRun diset false)
         while (mRun) {
        	 Log.i("yw","looping...."); //hapus log ini kalau tidak mendebug
             Canvas c = null;
             try {
                 c = mSurfaceHolder.lockCanvas(null);
                 //lock surface agar tidak diakses thread lain dulu
                 synchronized (mSurfaceHolder) {
                     updatePosisi();
                     doDraw(c);
                 }
             } finally {
                 //pastikan diunlock
                 if (c != null) {
                     mSurfaceHolder.unlockCanvasAndPost(c);
                 }
             }
         }
     }

	//jika diset false maka akan shutdown (lihat method run())
	public void setRunning(boolean b) {
		mRun = b;
	}
}

Sedangkan code untuk class GameView adalah

package edu.upi.cs.yudiwbs.animasicanvas2;

import android.content.Context;

import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//surfaceView digunakan karena GUI akan seriung diupdate
//dan cepat untuk animasi
public class GameView extends SurfaceView implements SurfaceHolder.Callback  {

	public Thread mThread;
	private GameRunnable gr;

	//buat thread dan jalankan
	public void startThread() {
		//objek GameRunnable jadi parameter
		mThread = new Thread(gr);
		gr.setRunning(true);
	    mThread.start();

	}

	public void shutDownThread() {
		Log.i("yw","shutdown thread mulai");
		boolean retry = true;
        gr.setRunning(false);  //matikan,

        //loop terus sampai thread berhenti karena
        //setRunning(false) tidak menghentikan seketika
        //coba lihat method GameThread.run()
        while (retry) {
            try {
                mThread.join();
                retry = false;
            } catch (InterruptedException e) {
            }
        }
        Log.i("yw","shutdown selesai");
	}

	public GameView(Context context) {
		super(context);
		SurfaceHolder holder = getHolder();
		holder.addCallback(this);
		gr = new GameRunnable(holder,context);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		Log.i("yw","jalankan thread !!");
		startThread();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		shutDownThread();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// bisa digunakan untuk memberi tahu GameRunnable ada perubahan dimensi
		// surface (misal dirotate)
	}
}

Dan terakhir adalah MainActivity

package edu.upi.cs.yudiwbs.animasicanvas2;

import com.example.animasicanvas2.R;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

GameView gv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		gv= new GameView(this);
		setContentView(gv);
	}

	 @Override
	 protected void onPause() {
	    super.onPause();
	    //nantinya perlu diisi dengan penyimpanan state
	    //melalui bundle
	 }

	 @Override
	protected void onResume() {
		super.onResume();
		//nantinya perlu diisi dengan load state
	 }

}

Kode diatas masih memiliki kelemahan, perhatikan penggunaan delay 0.2 ms pada updatePosisi() di GameRunnable. Jika suatu saat app ini diinstall pada smartphone yang lambat dan memiliki ratusan objek yang harus diupdate posisinya maka animasi akan berjalan semakin lambat. Pada kasus sepeert itu seharusnya delay dikurangi. Posting berikutnya akan membahas cara untuk mengatasi hal ini.

Salah satu hal yang perlu ditangani adalah saat pengguna pindah ke app lain dan kembali. Misalnya dengan menekan home, pindah ke app lain lalu kembali ke app animasi ini. Setiap pengguna pindah ke app lain, maka thread harus distop agar tidak memakan resources. Setelah mencoba beberapa kali dan memperhatikan hasil log, saat home ditekan, maka canvas pada doDraw dapat bernilai null. Jadi saat thread masih berjalan canvas dapat bernilai null. Ini sebabnya perlu ada pengecekan kondisi if (c!=null) pada method GameRunnable.doDraw (baris 63). Pada app LunarLander yang asli, tidak ada pengecekan ini dan terjadi error saat user menekan home.

Hal yang lain, saat home ditekan, maka GameView.surfaceDestroyed pasti akan dipanggil. Tadinya saya mengira sistem tidak akan men-destroy kecuali kalau membutuhkan. Ini menyebabkan proses mematikan thread dilakukan bukan di activity.onPause tapi cukup di method surfaceDestroyed. Tentu dalam kondisi sebenarnya onPause dan onResume perlu ditangani untuk menyimpan state. Sebagai contoh, saat app ini dijalankan dan kemudian device dirotasi maka app akan mulai dari awal lagi (nilai GameRunnable.posX hilang).

Petunjuk Singkat Mencari Topik Skripsi, Menyusun Proposal Skripsi, Menyusun Skripsi dan Prasidang+Sidang

8 April 2013 at 08:46 | Posted in Uncategorized | 6 Comments

Berdasarkan pengalaman saya membimbing skripsi di Ilkom UPI, berikut beberapa hal penting yang mudah-mudahan bisa membantu mahasiswa menyelesaikan skripsinya mulai dari mencari topik skripsi sampai dengan sidang. Bagi mahasiswa di luar Ilkom UPI, mungkin ada perbedaan, tapi menurut saya ide dasarnya tetap dapat digunakan.

Setelah mengontrak skripsi, hal yang pertama kali harus dilakukan adalah mencari topik. Kegiatan ini sangat penting, mendapatkan topik yang baik berarti sekitar 30% skripsi telah selesai. Jadi persiapannya juga tidak dapat seadanya. Ini beberapa saran untuk mendapatkan topik yang baik:

  1. Skripsi dapat dikatakan sebagai tugas besar terakhir, yang paling besar. Anda menggabungkan ilmu yang anda peroleh saat kuliah sekaligus praktikum dan tugas-tugas besarnya. Setelah menyelesaikan semua kuliah, anda seharusnya sudah punya gambaran  untuk mengambil tema apa. Ambil topik yang anda sukai sehingga saat dikerjakan tidak terasa berat. Itu sebabnya bagi yang masih kuliah, manfaaatkan kuliah  sebaik-baiknya. Jangan ambil kuliah pilihan hanya karena teman lain mengambilnya dan jangan jadi ‘penggembira’ saat mengerjakan tugas kelompok
  2. Mengenai beban, bayangkan tugas besar yang dikerjakan selama sekitar 4 bulan intensif (~50 jam per minggu). Kalau anda menemukan topik yang dapat dikerjakan 1-2 bulan, topiknya pasti terlalu ringan. Walaupun mungkin lolos seminar proposal tapi akan lebih tidak enak kalau terjegal saat prasidang. Topik yang dapat dikerjakan dengan formula Excel sederhana (non vb script),  biasanya juga masuk ke kategori terlalu sederhana.
  3. Setelah mendapat tema umum, misalnya “jaringan”, “datamining”, “pemrosesan grafik”, “social media”, “sistem informasi”, “imk” dst, mulailah mencari lebih dalam. Gunakan google untuk mencari pembahasan tentang itu, baca ebook, sambil coba cari topik yang lebih khusus (lebih spesifik). Tujuannya agar anda familiar dengan istilah-istilah atau jargon yang umum digunakan dalam topik tersebut. Ini akan menjadi bekal saat membaca paper. Anda mungkin sudah mulai membayangkan masalah-masalah sekitar topik tersebut yang dapat anda angkat menjadi topik skripsi. Lebih ideal jika anda mendapatkan topik dari dosen. Jika topik diberikan dosen, artinya dosen tersebut tertarik dengan topik ini sehingga dukungan akan lebih besar. Dosen juga biasanya sudah tahu cakupan yang tepat dan gambaran kasar solusi. Tentu anda juga harus cocok dengan topiknya.
  4. Jangan mulai dari algoritma, tapi mulailah dari masalah. Jadi tentukan dan pahami dulu apa masalahnya, baru cari algoritma atau teknik untuk memecahkan masalah tersebut (jangan dibalik). Salah satu kesalahan yang sering terjadi adalah terlalu buru-buru menentukan teknik solusi dari masalah. Langkah 5 dapat digunakan untuk mencari berbagai alternatif solusi.
  5. Setelah mempunyai bekal dasar-dasar materi, saatnya mulai masuk ke aspek yang lebih ilmiah yaitu paper. Pada skripsi, mhs tidak diharapkan hanya sekedar membuat aplikasi biasa tapi harus punya sisi inovatif. Sisi inovatif tersebut biasanya hanya dapat diperoleh dari paper. Gunakan scholar.google.com dengan keyword sesuai topik anda. Pilih paper yang menarik, TIDAK semua paper harus dibaca. Awali baca paper dengan membaca abstrak lalu kesimpulan (jangan semuanya dulu). Jangan khawatir jika ada istilah yang anda tidak mengerti. Jika menarik, coba baca sekilas isinya. Anda TIDAK harus memahami keseluruhan isi paper. Kemudian jarang sekali paper yang dapat dimengerti dalam sekali baca, ada yang harus dibaca 10-20 kali baru terasa jelas. Beberapa paper yang terpilih, yang paling relevan akan menjadi dasar proposal anda. Untuk tingkat S1 mhs boleh me-reimplementasi paper yang sudah ada dengan sedikit tambahan atau perubahan.
  6. Bersamaan dengan tahap 5, anda mulai dapat menemui dosen yang terkait dengan topik anda. Jangan menghadap dosen dengan kepala kosong karena pertemuannya akan tidak produktif. Manfaatkan dosen untuk saran-saran berkaitan dengan topik, berdiskusi mengenai bagian paper yang anda tidak mengerti, apakah topik layak untuk dijadikan skripsi dsb. Cari dosen dengan bidang yang cocok dengan topik skripsi. Ini bisa dilihat dari matakuliah yang diajarkan dosen tersebut dan skripsi yang pernah dibimbing sebelumnya (untuk di UPI bisa dilihat di: http://repository.upi.edu/)
  7. Selanjutnya mulai membuat proposal. Bagian yang terpenting dari proposal adalah bab 1. Pada bab 1, perlu disampaikan latar belakang dan rumusan masalah/tujuan.  Latar belakang menjawab mengapa topik skripsi penting dan layak diambil. Saat ditanya “mengapa anda mengambil topik ini? mengapa ini bisa jadi topik skripsi? apa alasannya? mengapa penting?” itu dijawab di latar belakang. Sedangkan rumusan masalah atau tujuan menggambarkan apa yang menjadi masalah yang  hendak diselesaikan. Anda tidak bisa menyelesaikan masalah kalau tidak tahu masalahnya apa. Biasanya pada tahap ini perlu bolak balik cukup intensif dengan dosen pembimbing. Jangan masuk ke bab 2 dulu sebelum bab1 benar-benar stabil.
  8. Selanjutnya buat bab2. Jika bab 1 (latarbelakang/tujuan) memperlihatkan aspek “mengapa (why) dan apa (what)”, bab 2 akan menjelaskan aspek “bagaimana (how)”.  Isi dari bab 2 adalah penelitian/buku/materi/teori/library yang dibuat *orang-lain* yang relevan dengan skripsi anda. JANGAN memasukkan materi yang tidak relevan dengan topik. Sebelum mulai, tanyakan pada dosen pembimbing materi apa saja yang perlu masuk dan urutan pembahasannya. Untuk tahap proposal tidak perlu dibuat terlalu detil, anda tidak perlu mengetahui solusi masalah secara rinci tapi anda diharapkan mempunyai gambaran kasar bentuk solusinya. Pada penulisan bab 2 ini seringkali terjadi copy-paste, ini WAJIB dihindari karena kalaupun lolos sampai wisuda, kalau ada yang menggugat di kemudian hari, ijazah anda bisa melayang (terjadi pada teman S2 saya). Caranya mudah dengan tiga langkah: baca-pahami-tulis. Baca referensi (bagusnya lebih dari satu), setelah paham baru tulis dengan kalimat sendiri. Jangan lupa cara pengutipan referensi. Sedapat mungkin hindari referensi skripsi orang lain, karena seringkali kualitasnya tidak jelas dan akan memperkuat keinginan untuk copy-paste
  9. Jangan terlalu beralama-lama dalam pembuatan proposal. Tidak perlu menunggu proposal sempurna, karena nanti toh akan berubah saat perjalanan membuat skripsi.
  10. Saat sidang proposal skripsi, selama anda mengerjakan bab 1 dan 2 dengan baik dan melakukan persiapan presentasi (banyak latihan presentasi), harusnya anda dapat lolos dengan mudah.  Fokus dosen penguji dalam sidang proposal adalah “apakah ini masalah ini layak untuk dijadikan topik skripsi?”, “apakah ini feasible untuk dikerjakan dalam waktu 4 bulanan? (terlalu sulit atau tidak) dan “apakah mahasiswa tahu gambaran solusinya?” (jangan-jangan hanya punya masalah tapi tidak tahu menyelesaikannya).

Tahap berikutnya adalah penyusunan  skripsi.

BUKU SKRIPSI

Dalam skripsi, ada 3 bab yang paling penting: bab1, bab2 dan bab4 sedangkan bab3 dapat dikatakan bagian dari bab4. Jika proposal sudah dipersiapkan dengan baik, harusnya anda hanya akan merubah sedikit di bab1 dan hanya melengkapi bab2 (strukturnya akan tetap). Bab 1 dan Bab 2 sudah dibahas sekilas sebelumnya.

Khusus untuk bab 2,  berbeda dengan tahapan proposal yang tidak detil, pada tahapan skripsi bab 2 harus serinci mungkin sehingga setelah menyelesaikan bab ini, anda akan mendapat gambaran yang jelas dan rinci bagaimana menyelesaikan software. Sedapat mungkin gunakan contoh-contoh di bab 2, ini bermanfaat bagi anda maupun penguji dan pembimbing agar lebih paham dengan apa yang anda buat. Kalau penguji bingung dengan apa yang dikerjakan oleh mahasiswa, dia malah akan bertanya kemana-mana. Jangan lakukan coding sebelum bab 2 selesai, karena efeknya software malah akan sering dibongkar ulang.

Untuk mengecek apakah bab 2 sudah selesai, coba bayangkan anda serahkan bab 2 ke mhs ilkom lain, apakah setelah baca bab 2 anda dia sanggup untuk mengerjakan softwarenya? jika tidak artinya bab 2 anda masih kurang rinci.

Langkah berikutnya adalah membuat rancangan yang dituangkan dalam dokumen teknis (doktek) berdasarkan tujuan yang dituliskan di bab 1 dan teori di bab 2. Mengapa harus merancang dulu? alasannya sama dengan yang dibahas di RPL, bongkar-pasang rancangan jauh lebih cepat dan mudah dibandingkan bongkar pasang software. Analoginya: bayangkan membuat bangunan 5 lantai tanpa rancangan terlebih dulu (langsung buat tembok). Akan cepat pada awalnya tapi ujung-ujungnya malah lebih lambat.

Selanjutnya implementasikan rancangan ini dengan coding, catat hal-hal yang penting dan menarik yang ditemukan selama tahapan rancangan, coding dan eksperimen. Catatan ini akan masuk ke bab 4. Besar kemungkinan ada hal-hal baru yang anda temukan sehingga doktek, bab 2 atau bahkan bab 1 perlu diupdate, tidak perlu khawatir karena ini merupakan hal yang wajar.

Terakhir adalah membuat bab 4. Kontras dengan bab 2 yang berdasarkan teori orang lain, bab 4 berisi apa yang *anda* kerjakan, dan *tidak-ada* materi buatan orang-lain di bab 4 ini. Tuliskan semua kegiatan, hasil dan analisis di bab ini. Dosen akan menilai apa yang anda kerjakan dari bab4, jangan sampai misalnya ada 10 hal yang anda kerjakan, tapi di bab 4 hanya ditulis 2. Itu sebabnya bab 2 dan bab 4 adalah bab yang harusnya paling tebal diantara bab lain.

BACKUP

Kadang terjadi data hilang akibat virus atau tidak sengaja diformat. Atau memang laptop/hardisknya hilang dicuri. Penting untuk melakukan backup, gunakan dropbox untuk dokumen skripsi dan repo seperti github, code.google untuk source code skripsi anda (sekalian untuk version control)

PROSES BIMBINGAN

Setiap dosen punya cara masing-masing dalam membimbing, karena anda adalah salah satu dari sekian mahasiswa bimbingan, andalah yang harus menyesuaikan diri. Pahami karakter dosen, apa yang dia sukai/benci dan aturan mainnya. Jangan ragu bertanya jika ada yang tidak jelas atau ada masalah. Coba tanya ke alumni atau mahasiswa lain yang sudah lama dibimbing oleh dosen tsb. Kalau dalam kondisi terpaksa harus berganti dosen pembimbing, lakukan dengan baik-baik dan lapor terlebih dulu.

PROSES PRASIDANG & SIDANG

Tiga kunci untuk presentasi yang baik: latihan, latihan dan latihan. Buku skripsi harus anda baca dengan detil dan berulang-ulang. Coba tanya ke teman atau alumni mengenai gaya menguji calon dosen penguji/pembimbing. Ujian sidang biasanya lebih ringan daripada prasidang, karena proses pengujian ada di prasidang. Sidang umumnya hanya untuk melihat perbaikan yang dilakukan pasca prasidang.

Sebelum mulai prasidang+sidang, test proyektor untuk memastikan bekerja dengan laptop anda. Lalu anda harus memegang hardcopy buku skripsi, jangan sampai saat ditanya “coba buka halaman xy”, lalu anda harus membuka softcopy di laptop. Jangan lupa bawa bolpen dan kertas, catat apa masukan dan pertanyaan dari dosen. Banyak penguji yang kesal jika masukannya tidak dihiraukan hanya karena alasan “lupa”.

Jangan berasumsi penguji telah mengerti materi dalam skripsi anda, siapkan contoh-contoh agar mereka lebih paham, termasuk demo program. Dosen dapat bertanya sampai source code, oleh karena itu siapkan juga source codenya.

Dalam menjawab pertanyaan, coba cerna dulu pertanyaanya dan pikirkan jawabannya, jangan langsung menjawab.

Berbeda dengan prasidang, ujian sidang lebih fokus terhadap perbaikan yang dilakukan. Materi tidak perlu diulang, tampilkan masukan dosen pada prasidang, lalu apa yang anda lakukan terhadap masukan tersebut.

LAIN-LAIN

Beberapa hal penting yang harus diperhatikan saat membuat skripsi

  • Jangan menuliskan hal yang anda tidak mengerti. Sangat menyebalkan mendengar alasan “saya juga tidak tahu maksudnya, saya tulis karena di referensinya juga ditulis seperti itu”. Kalau sudah masuk ke dokumen skripsi anda, andalah yang harus bertanggung jawab. Baca, pahami baru tulis. Jangan hanya menterjemahkan apalagi copy paste.
  • Bahasa yang digunakan dalam skripsi tidak sama dengan bahasa yang digunakan di blog atau novel. Hindari bahasa berbunga-bunga yang dapat memiliki makna ganda dan tidak akurat. Contoh kalimat yang jelek: “sejalan dengan berlalunya waktu, permasalahan ini menjadi semakin pelik”. Hindari kata-kata seperti “mungkin”, “kira-kira”, “sepertinya” dan “biasanya”. Bahasa yang digunakan di dalam skripsi adalah bahasa kering tapi akurat. Tujuannya saat pembaca selesai membaca skripsi anda, isi kepalanya akan sama  dengan isi kepala anda saat menulis skripsi tersebut.
  • Terakhir tapi penting, jangan lakukan kecurangan (copy-paste, plagiat, program dibuatkan orang lain). Kalaupun  lolos, ada pengadlian akhir yang tetap tidak dapat dihindari.

Tutorial JQuery Mobile

29 March 2013 at 08:00 | Posted in Uncategorized | Leave a comment

Pada kuliah mobile programming semester ini, saya menambahkan materi baru yaitu JQuerymobile.  JQuerymobile adalah kumpulan css dan javascript yang membuat HTML kita lebih mudah digunakan di mobile device (touch friendly), sehingga cocok digunakan untuk membuat web app.  Contoh tampilan jquerymobile seperti berikut:

contoh_jquery

Mengapa webapp saya masukkan ke dalam materi kuliah?  saat ini kemampuan browser di mobile semakin powerfull dan koneksi internet untuk mobile juga semakin cepat  dan reliable. Kelebihan  webapp yang lain adalah lebih mudah dikembangkan dan bisa digunakan di banyak platform dengan mudah.

Materi pemrograman native  app di kuliah saya juga bergeser,  sekarang native app lebih difokuskan pada pemanfaatan sensor (accelerometer, AGPS dan magnetometer), 3D  dan aplikasi yang membutuhkan komputasi tinggi yang sulit dibuat dengan webapp.

Jika ingin mempelajari lebih lanjut, saya telah membuat tutorial praktikum JQueryMobile, tutorialnya berbahasa Indonesia, lisensinya createive commons sehingga bebas untuk digunakan bahkan dimodifikasi. Ambil versi terakhir di: http://yuliadi.com/ilkom

Perpanjangan STNK 5 tahun di Samsat Bandung Barat

26 December 2012 at 12:06 | Posted in Uncategorized | 3 Comments

Akhirnya harus memperpanjang STNK 5 tahunan dan ganti plat nomor mobil yang habis 3 Jan 2013. Berdasarkan pengalaman bayar pajak tahunan di outlet Giant Pasteur yang cepat dan info dari orang-orang bahwa sekarang pengurusan di samsat sudah gampang maka saya putuskan untuk mengurus sendiri di Samsat Bandung Barat di Jalan Pajajaran.  Berikut adalah langkah-langkahnya. Relatif cepat,  tanpa pungli dan tanpa calo kok :-)    Catatan: Ini saya lakukan Des 2012, jadi di masa depan mungkin akan ada perubahan.

  1. Siapkan STNK asli, KTP asli (tentunya yang sesuai dengan STNK), BPKP, uang  dan bolpen. Fotocopy cukup BPKP saja.  Selama disana tidak perlu menunjukkan BPKP asli, tapi saya bawa untuk jaga-jaga.
  2. Datang ke samsat, masuk ke tempat parkir bagian belakang dan ambil formulir di ruangan sebelah kanan (bukan gedung utama).  Ada tulisan “Pengambilan Formulir” di loketnya.
  3. Isi formulir di meja yang disediakan. Ini gunanya membawa bolpen, katanya sih bolpen disediakan tapi saat saya disana tidak ada.
  4. Cari petugas gesek  yang menggunakan rompi merah dengan tulisan samsat di punggungnya. Jangan tertukar dengan tukang ojek yang juga berompi merah.
  5. Dia akan  gesek nomor mesin dan nomor rangka dan hasilnya ditempel di formulir. Saya menunggu apakah akan diminta “uang rokok”, ternyata tidak.  Ini bagus.
  6. Serahkan formulir+hasil gesek ke petugas yang berada di meja di sebelah loket pengambilan formulir, juga serahkan KTP & BPKP asli. Setelah diperiksa  akan ditandatangani petugas. Petugasnya bukan berada di ruangan loket, tapi di sebelahnya (di bawah tenda).
  7. Serahkan semua dokumen ke loket disebelah kirinya. Loket tersebut bertulisan “cek fisik”, petugas akan memeriksa lagi.  Saran: menurut saya langkah 6-7 ini bisa digabung saja, terasa redundan.
  8. Masuk ke gedung utama, cari loket D di sudut. Banyak yang berdiri di pintu terobos saja. Kebanyakan orang yang ada disana adalah bayar pajak tahunan. Serahkan semua dokumen di loket D ini.
  9. Duduk dan tunggu dipanggil di loket pembayaran di bagian tengah. Akan dipanggil nama dan nomor plat mobil. Ini berbeda dengan yang bayar pajak tahunan yang hanya dipanggil nomor antrian saja.
  10. Bayar dan tunggu lagi dipanggil oleh loket persis di sebelah kanan loket D.
  11. Ambil STNK +bukti pajak+KTP dan  copy STNK (warna biru) untuk mengambil plat nomor. Cek apakah sudah benar, kasus saya, tanggal masa berlaku salah sehingga harus diulang.
  12. Keluar dari gedung, jalan agak ke belakang di tempat yang bertulisan “workshop”, serahkan copy warna biru, tunggu sebentar, plat mobil diserahkan dan selesai. Total waktu yang diperlukan sekitar 1.5 jam (saya datang jam 8 pagi).

Walaupun masih agak bingung urutan prosedurnya dan tidak ada informasi untuk ini, tapi pelayanan tanpa pungli dan tanpa calo (saat saya masuk bahkan tidak ada yang menawari) patut dihargai dan sudah merupakan langkah maju.

Modul Tutorial Pengantar Pentaho Kettle (Pentaho Data Integration)

25 September 2012 at 07:11 | Posted in kuliah | 4 Comments

Pentaho Kettle adalah versi community dari  Pentaho Data Integration yang free dan open source.  Tool ini digunakan untuk proses ETL  (Extract, Transform, Load)  dalam  data warehouse.  Selain untuk data warehouse,  software  ini dapat digunakan untuk migrasi data, pembersihan data, preprocessing sebelum mining dan banyak lagi.  Kettle  mudah digunakan (user interface drag-drop),  powerfull tapi fleksibel, dan dirancang untuk dapat menangani data berukuran besar.

Dulu saat  mengembangkan  sistem saya sering  harus mengimpor data dalam berbagai format (excel, teks, foxpro dan lainnya). Biasanya yang saya lakukan adalah membuat program sendiri.  Kelemahannya: hanya saya yang mengerti dan software konversi  yang saya buat  sulit untuk digunakan orang lain.  Belum lagi kadang ada bug dan masalah-masalah lain.  Sayang baru tahu ada tools ini sekarang :)

Semester ini, untuk pertama kalinya  Kettle masuk sebagai materi  praktikum pada  kuliah Data warehouse dan mining   Bagi yang berminat untuk mempelajari atau menggunakannya dalam pelatihan atau kuliah,  berikut adalah tutorial singkat pengantar Kettle.  Berbahasa Indonesia dalam format docx,  lisensinya creative common sehingga bebas didistribusikan/update/remix selama nama saya dicantumkan  dan tidak untuk komersial.   Tutorial ini masih dalam tahap beta dan mungkin masih banyak berubah.

Versi 24 september 2012: docx  atau  pdf

Mempercepat Emulator Android

15 September 2012 at 00:45 | Posted in android | 8 Comments

- update Nov 2013 -
Emulator 4.2.2 versi Atom Intel sering error saat dijalankan, solusinya adalah check opsi “Wipe user data” pada launch options.

- end update-

Salah satu hal yang menyebalkan dalam membuat aplikasi android adalah emulatornya yang sangat lambat. Lambat saat load dan juga tidak responsif. Untuk mempercepat, bisa saja menggunakan smartphone Android yang dihubungkan dengan kabel USB. Tetapi cara ini tidak fleksibel dan tidak praktis, harus bolak-balik antara layar laptop dengan layar smartphone. Belum lagi jika ingin mencoba di beberapa versi Android.

Berita bagusnya, bagi yang menggunakan  prosesor Intel yang mendukung teknologi Intel VT  (virtualization tech) dapat  mempercepat waktu loading dan eksekusi  secara signifikan.  Harus dipastikan dulu prosesor yang Anda miliki mendukung VT-x  dengan mengeceknya di  http://ark.intel.com/Products/VirtualizationTechnology.   Jika ada di dalam daftar tersebut, maka langkah selanjutnya mudah (saya asumsikan Android SDK sudah diinstall).

Petama install Intel Hardware Accelerated Execution Manager (HAXM), download dan install software di alamat berikut:

http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager/

Atau alternatifnya melalui android SDK manager dibagian Extra.

Setelah itu install  Intel Jelly Bean x86 Emulator System, dapat  melalui android SDK dengan cara mendownload “Intel Atom x86 System Image”.  Versi terendah yang memiliki Intel System Image adalah API 10 (Android 2.3.3), tapi khusus untuk versi 2.3.3 ini ada trik yang harus dilakukan agar emulator dapat bekerja (baca keterangan di paling bawah).

ataupun melalui cara manual (download zip). Petunjuk lengkapnya ada di:

http://software.intel.com/en-us/articles/android-41-jelly-bean-x86-emulator-system-image

Selanjutnya buat AVD berdasarkan image ini dengan cara memilih  Intel sebagai target, sekali lagi: intel sebagai target (jangan ARM).  Kemudian aktifkan GPU Emulation saat membuat AVD (dibagian hardware, klik button “new” dan pilih GPU).  Coba jalankan dan AVD ini akan berjalan jauh lebih cepat dan lebih responsif (perkiraan kasar saya 400% lebih cepat).

Mengapa lebih cepat? secara default emulator android menggunakan arsitektur  ARM.  Dengan menggunakan system image Intel,   semua fitur yang disediakan prosesor Intel dapat dimanfaatkan.

Pembahasan lebih rinci tentang ini  dapat dibaca di: http://developer.android.com/tools/devices/emulator.html#accel-vm

—-
Untuk Intel System Image versi 2.3.3, jika menggunakan konfigurasi default  maka emulator akan hang diawal booting. Solusinya adalah mengeset resolusi menjadi 480×800 dan mematikan GPU (gambar bawah).   Karena resolusi diset manual, maka panel berisi keyboard/home/back  akan hilang.  Untuk mengatasi ini aktifkan keyboard support sedangkan untuk mensimulasikan tombol HOME ketik HOME, dan untuk BACK ketik ESC.

Mencegah Mahasiswa Berbuat Curang

1 September 2012 at 12:59 | Posted in kuliah | 1 Comment

Masalah kecurangan akademik menurut saya sudah mirip korupsi.   Mengakar dari SD sampai pasca sarjana (bahkan di tingkat profesor),  mengacaukan sistem karena mendorong orang untuk memilih jalan pintas daripada bekerja keras.  Berikut adalah apa yang saya lakukan untuk mengurangi kecurangan akademis pada kuliah yang saya pegang di UPI.  Menurut saya efektif, karena setelah beberapa semester saya tidak melihat lagi kasus-kasus baru.

Ujian

Untuk ujian, yang saya lakukan adalah menggunakan asisten atau kakak kelas mereka, tentu dipilih yang saya kenal dan saya yakin  ‘bersih’ dan bisa diandalkan. Jadi kalau ada 40 mahasiswa, akan dipecah menjadi dua kelas.  Setiap kelas berisi 20 mahasiswa diawasi 3-4 asisten  (ya 1 asisten untuk 5 mahasiswa)  dan saya bolak-balik.  Asisten menggunakan sistem silent alarm. Jika ada yang dicurigai, tidak ditegur tapi  saat mereka mengumpulkan berkasnya akan dipisahkan atau ditandai.  Asisten kebanyakan ditempatkan di samping dan belakang kelas.

Biasanya yang mencontek ini juga punya group sendiri yang ingin duduk berdekatan. Sebelum ujian dimulai group mahasiswa yang ‘mencurigakan’ ini akan saya acak-acak sehingga mereka terpisah sejauh mungkin.  Jika saat ujian ada yang mencurigakan, mahasiswa tersebut juga dapat dipindahkan.  Mahasiswa yang  pintar dan rajin tidak mau bergabung karena takut.  Aturan saya adalah semua yang terlibat, baik source maupun destination akan sama-sama mendapat E.   Mahasiswa yang rajin dan pintar jadi punya  alasan untuk menolak menjadi sumber contekan “Maaf, bukannya nggak mau bantu, tapi saya takut kena E”.    Ini efektif memutuskan ‘pemasok’ contekan dan kalaupun ada sumber contekan,  kualitasnya rendah.

Terakhir  saat saya memeriksa ujian dan menemui jawaban yang  mencurigakan mirip, saya panggil semua yang terlibat. Kalau mereka mengaku, langsung E.  Kalau mengelak, saya  tidak mau berdebat,  hanya  minta mereka buat pernyataan dan ditandatangani  “Demi Allah saya tidak melakukan kecurangan”.  Biasanya mereka mengaku di tahap ini.  Kalau masih tidak mengaku?  bisa jadi memang jujur tapi kalaupun tidak  itu sudah  jadi urusan mereka dengan yang Diatas.

Tugas/Skripsi 

Untuk tugas, pemeriksaaan kecurangan relatif lebih sederhana karena elemen terbesar tugas adalah membuat software. Biasanya kalau saya curiga, saya akan minta mereka menjelaskan source code-nya. “OK, tunjukkan code untuk bagian ini”. Pernah terjadi, jangankan bagian dari code-nya, file-nya saja mereka tidak bisa menunjukkan.  Lalu setelah saya lihat sekilas, kadang saya bertanya “Loop di baris xxx untuk apa ya? method xxx input dan outputnya apa ya? coba jelaskan”.   Pernah dalam satu semester ada 15 orang  yang saya beri E karena kasus ini .  Sayangnya tidak seperti mencontek di ujian, pihak pemberi code seringkali tidak dapat ditangkap, biasanya mereka mengaku dibuatkan oleh kakak angkatan.  Kedepan mungkin saya gunakan  software pembanding source code untuk bisa menangkap siapa saja yang bekerjasama.

Untuk skripsi, kita bisa deteksi berdasarkan presentasi saat sidang dengan kualitas dokumen. Ada yang dokumennya bagus, tapi saat menjelaskan dan menjawab berantakan.  Tentu harus dibedakan tidak bisa menjelaskan karena grogi atau tidak bisa menjelaskan karena tidak tahu apa yang mereka tulis.   Kecurangan juga dapat dideteksi dari gaya menulis, sering mahasiswa melakukan copy-paste dari berbagai sumber yang memiliki gaya menulis berbeda.  Saat dibaca akan terasa seperti terpatah-patah atau tersendat-sendat.

Prinsipnya kita harus membuat kecurang menjadi tidak menguntungkan secara  ‘ekonomis’ (manfaat vs resiko) . Tentu masih ada yang nekat, tapi biasanya tanpa curangpun mereka memang  tidak akan lulus juga.

Sangat penting aturan main dijelaskan diawal dan diterapkan dengan konsisten.  Awalnya  banyak ‘korban’ berjatuhan, tapi setelah mereka tahu sistemnya serius dan tidak sepadan untuk dilanggar secara drastis kasus kecurangan berkurang.

Next Page »

Create a free website or blog at WordPress.com. | The Pool Theme.
Entries and comments feeds.

Follow

Get every new post delivered to your Inbox.

Join 64 other followers