Welcome to HQ's Blog

Hello World! If you've visited this blog before, welcome back. Please help me what article do you like by give it a comment. But if you're new with this blog, please feel free to stay ahead for a shortwhile, to read my articles. I assure you will get something by read it carefully. Haha...

Ok ok... By the way, this blog belongs to me, Haqqi. Yeah, that is my nickname. If you want to know about me, please read the top sidebar titled "About Me". If you want to know MORE about me, please feel free to add my Messenger (xp_guitarist) and chat with me. I am Indonesian. My English is not so good, so please don't laugh if my 'syntax' is wrong. But sometimes I will post my blog in Bahasa Indonesia (I think most of them will).

The reason I create this blog is, I want to share everything I can share. From my experience, computer program I used, my algorithms and source codes, and some useful infos and tips. So, if you want to request something I can, feel free to ask. And if you also want to share me something, I always open my hand, haha. Anyway, WELCOME TO MY BLOG!

This site is best viewed with Mozilla Firefox with resolution 1024x800 or more

Page copy protected against web site content infringement by Copyscape

ANNOUNCEMENT!!!

This blog is dead!!! I moved it to my new blog in http://haqqi.net. Thank you for reading this blog. Hope you will read my new blog too.

Ganti Template

Sep 19, 2009

Sekedar niat, nggak tau jadi apa nggak

Lama-lama, bosen juga sama template blog saya yang satu ini. Beberapa hari terakhir, tampilannya error lagi, entah kenapa. Sejenak, muncul keinginan untuk desain template baru. Buka-buka google, cari tutorial bikin template blogger. Ada banyak banget ternyata, tapi malah jadi bingung yang mana yang mau saya pakai. Rencananya, saya mau bikin template yang murni dari nol, dengan desain saya sendiri.

Tapi malah kepikiran hal lain. Kenapa gak langsung hosting sendiri aja? Bikin personal website, mumpung sekarang lagi waktunya personal branding. Dipikir-pikir bener juga sih. Tapi terus gimana nasib blog-ku yang ini? Apa semua posting-nya mau dipindah ke domain sendiri itu? Hm, rasanya nggak deh. Mending tetep aja tapi ntar di-redirect.

Oke, keputusannya berarti tetap dengan blog ini, dengan alamat ini, tapi dengan penambahan mask link. Rencananya setelah beli domain, langsung dihubungkan sama subdomain web personal saya. Itu berarti, saya harus desain ulang blog ini. Desain blog nggak bisa sehari langsung jadi, apalagi dengan pengetahuan saya tentang web programming yang nyaris nol. Harus benar-benar meluangkan waktu. Tapi kapan?

Semua butuh proses. Saya mau nyoba-nyoba dulu desain di blog dummy. Nanti kalau udah sukses, baru template-nya diintegrasi sama blog ini. Semoga berhasil.
read more...

Tutorial Java : Membuat Splash Screen

Sep 10, 2009

Lagi-lagi tutorial Java sederhana


Woi, ketemu lagi. Mumpung lagi semangat-semangatnya nulis tutorial nih. Kali ini saya akan memberikan tutorial sederhana, yaitu bagaimana cara membuat splash screen yang biasanya ditampilkan sebelum sebuah program dijalankan. Sebenarnya, jika Anda memakai NetBeans, sangat mudah sekali kalau ingin membuat splash screen. Tutorialnya ada di sini. Sedangkan yang saya buat, bisa diaplikasikan meski pakai text editor biasa.

Teknik ini memanfaatkan class JWindow dari package javax.swing dan peran sebuah thread untuk melakukan sleep. Anda bisa mengacak-acak (baca: mempelajari) source code di bawah ini.


/*
* DO NOT REMOVE THIS COPYRIGHT
*
* This source code is created by Muhammad Fauzil Haqqi
* You can use and modify this source code but
* you are forbidden to change or remove this license
*
* Nick : Haqqi
* YM : xp_guitarist
* Email : fauzil.haqqi@gmail.com
* Blog : http://fauzilhaqqi.blogspot.com
*/

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;

/**
*
* @author Haqqi
*/
public class SplashScreen extends JWindow {
//*********************//
//*** Variable area ***//
//*********************//
private BufferedImage image;

//************************//
//*** Constructor area ***//
//************************//
public SplashScreen(BufferedImage image) {
this.image = image;
}

//*******************//
//*** Method area ***//
//*******************//
public void showSplash(int duration) {
// primary panel, get from frame's content pane
JPanel pane = (JPanel) getContentPane();
// set the size based on image size
int width = image.getWidth();
int height = image.getHeight();
pane.setPreferredSize(new Dimension(width, height));

// label to display the image
JLabel label = new JLabel(new ImageIcon(image));
pane.add(label);

pack();
// set window to center of the screen
setLocationRelativeTo(null);
setVisible(true);

// sleep for a while
try {
Thread.sleep(duration);
} catch (InterruptedException ex) {}

setVisible(false);
dispose();
}

public static void main(String[] args) {
BufferedImage image = null;
try {
image = ImageIO.read(SplashScreen.class.getResource("logo-banner.gif"));
} catch (IOException ex) {}
SplashScreen ss = new SplashScreen(image);
ss.showSplash(2000);
}
}

Satu class tersebut, bisa Anda manfaatkan untuk splash screen dengan gambar yang berbeda, terserah Anda. Anda cukup parsing URL yang tepat dari gambar Anda. Pada contoh di atas, file gambar terletak dalam satu folder dengan file java dari class SplashScreen. Jadi saya menggunakan method getResource() untuk mendapatkan URL-nya.

Selamat mencoba!!!
read more...

Tutorial Java : Game Sederhana - Snake HQ

Sep 9, 2009

1 jam coding sambil smsan


Rabu pagi, jam 00.10 saya tiba-tiba bangun entah kenapa. Seperti biasa, laptop saya masih menyala di atas kepala saya. Habis matiin laptop, ngecek sms di HP, eh ternyata ada balesan. Saya bales, ternyata dibales lagi. Akhirnya gak jadi ngelanjutin tidur, malah smsan. Nah, di posting ini, bukan itu intinya. Sambil smsan, saya bingung mau ngapain. Ya udah, langsung buka laptop lagi, niat ngelanjutin bikin artikel tentang membuat game Java. Kebetulan saya mau memasukkan source code sebuah rancangan game sederhana. Mau nggak mau ya saya buka NetBeans dan mulai coding.

Source code yang saya buat nggak sulit-sulit amat sih, dan nggak panjang-panjang amat, makanya saya posting di sini. Ini cuma rancangan sederhana game Snake HQ, game sejenis ular-ularan yang nanti makan apel dan jadi tambah panjang. Semoga tutorial di posting ini bisa membantu para pembaca yang pingin mulai belajar game Java.

Source code ini saya buat dengan menggunakan NetBeans 6.7.1 serta JDK 6u16. Pembuatannya di laptop saya, dengan OS Windows XP SP3.

Oke, kita mulai. Pertama-tama, kita tentukan sampai mana target rancangan ini diselesaikan. Kebetulan karena ini iseng-iseng, saya cuma berniat sampai animasi sederhana dan deteksi tepi area agar kalau ular tersebut sampai di tepi, bisa tembus di sisi lain. Ini belum sampai deteksi dabrakan dengan dinding, makanan (apel), maupun tabrakan antara kepala dan badan ular tersebut. Karena itu, class utama yang kita butuhkan hanya 2, yaitu untuk panel utama game dan ular yang akan berjalan. Class tambahan lain, akan dibahas kemudian.

Kita mulai dari class ular. Sementara ini, attribut yang kita butuhkan hanya koordinat ular, arah ular menghadap, dan panjang maksimal (bisa fleksibel nantinya). Sedangkan behaviour yang bisa dilakukan ular antara lain adalah mengubah arah menghadap, mengupdate koordinat seluruh anggota badan setiap berjalan, termasuk untuk tembus ke sisi lain saat menabrak tepi panel. Berikut source code-nya.


/*
* DO NOT REMOVE THIS COPYRIGHT
*
* This source code is created by Muhammad Fauzil Haqqi
* You can use and modify this source code but
* you are forbidden to change or remove this license
*
* Nick : Haqqi
* YM : xp_guitarist
* Email : fauzil.haqqi@gmail.com
* Blog : http://fauzilhaqqi.blogspot.com
*/

package snakehq;

import java.awt.Point;

/**
* Snake class, a representation of a snake
*
* @author Haqqi
*/
public class Snake {
//*********************//
//*** Variable area ***//
//*********************//
// coordinates of body
private Point[] body;
// facing
private int face;

// maximum snake's length
private final int maxLength = 10;

// orientation
public static final int NORTH = 0;
public static final int EAST = 1;
public static final int SOUTH = 2;
public static final int WEST = 3;

// snake pixel size
public static final int SNAKE_SIZE = 10;

//************************//
//*** Constructor area ***//
//************************//
public Snake() {
body = new Point[maxLength];
for(int i = 0; i < maxLength; i++) {
body[i] = new Point(20 - i, 15);
}
face = EAST;
}

//*******************//
//*** Method area ***//
//*******************//
public Point[] getBody() {
return body;
}

public void moveEast() {
if(face != WEST)
face = EAST;
}

public void moveWest() {
if(face != EAST)
face = WEST;
}

public void moveNorth() {
if(face != SOUTH)
face = NORTH;
}

public void moveSouth() {
if(face != NORTH)
face = SOUTH;
}

public void update() {
// update body
for(int i = body.length - 1; i > 0; i--) {
body[i].x = body[i-1].x;
body[i].y = body[i-1].y;
}
// update head
Point head = body[0];
if(face == NORTH) {
if(head.y <= 0)
head.y = Panel.AREA_HEIGHT - 1;
else
head.y--;
}
else if(face == EAST) {
if(head.x >= Panel.AREA_WIDTH - 1)
head.x = 0;
else
head.x++;
}
else if(face == SOUTH) {
if(head.y >= Panel.AREA_HEIGHT - 1)
head.y = 0;
else
head.y++;
}
else if(face == WEST) {
if(head.x <= 0)
head.x = Panel.AREA_WIDTH - 1;
else
head.x--;
}
}
}

Pembuatan class Snake ini tidaklah sulit. Bagian terpenting dari game sederhana ini adalah kerangka game yang berupa panel. Berikut source code-nya.

/*
* DO NOT REMOVE THIS COPYRIGHT
*
* This source code is created by Muhammad Fauzil Haqqi
* You can use and modify this source code but
* you are forbidden to change or remove this license
*
* Nick : Haqqi
* YM : xp_guitarist
* Email : fauzil.haqqi@gmail.com
* Blog : http://fauzilhaqqi.blogspot.com
*/

package snakehq;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
* Panel class, the skeleton of the game
*
* @author Haqqi
*/
public class Panel extends JPanel {
//*********************//
//*** Variable area ***//
//*********************//
private Snake snake;
private Thread animation;

public static final int PANEL_WIDTH = 400;
public static final int PANEL_HEIGHT = 300;
public static final int AREA_WIDTH =
PANEL_WIDTH / Snake.SNAKE_SIZE;
public static final int AREA_HEIGHT =
PANEL_HEIGHT / Snake.SNAKE_SIZE;

//************************//
//*** Constructor area ***//
//************************//
public Panel() {
setPreferredSize(new Dimension(
PANEL_WIDTH, PANEL_HEIGHT));
snake = new Snake();
initThread();
addKeyListener(new KeyManager());
setFocusable(true);
requestFocusInWindow();
animation.start();
}

//*******************//
//*** Method area ***//
//*******************//
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.addRenderingHints(new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON));
drawSnake(g2);
}

// render the snake
private void drawSnake(Graphics2D g2) {
Point[] s = snake.getBody();
int pixel = Snake.SNAKE_SIZE;
// fill the head
g2.fillOval(s[0].x * pixel, s[0].y * pixel,
pixel,pixel);
// draw body outline
for(int i = 0; i < s.length; i++) {
g2.drawOval(s[i].x * pixel, s[i].y * pixel,
pixel, pixel);
}
}

// initiate animation thread
private void initThread() {
animation = new Thread(new Runnable() {
public void run() {
while(true) {
try {
// sleep a while for animation
Thread.sleep(300);
} catch (InterruptedException ex) {}
snake.update();
SwingUtilities.invokeLater(
new Runnable(){
public void run() {
repaint();
}
});
}
}
});
}

// Keyboard handler of the game
private class KeyManager extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
int c = e.getKeyCode();
switch(c) {
case KeyEvent.VK_RIGHT:
snake.moveEast();
break;
case KeyEvent.VK_LEFT:
snake.moveWest();
break;
case KeyEvent.VK_UP:
snake.moveNorth();
break;
case KeyEvent.VK_DOWN:
snake.moveSouth();
break;
}
}
}

/**
* Main method that run firstly when the program starts
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("Snake HQ");
f.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
f.add(new Panel());
f.pack();
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}

Panel ini hanya mempunyai 2 atribut/object penting. Yang pertama, jelas adalah si ular. Yang kedua, adalah thread yang digunakan untuk mengatur animasi. Proses animasi itu sendiri diatur dalam method initThread(). Coba saja pelajari apa yang dilakukan program dalam thread tersebut. Bagian lain yang penting adalah private class KeyManager. Class ini digunakan untuk menangkap event yang terjadi pada keyboard.

Untuk rendering, semua diatur dalam override method paintComponent(). RenderingHints di-set agar tampilan lebih lembut. Setelah itu, lakukan penggambaran seluruh badan ular. Kembali ke thread animation. Yang membuat ular seperti berjalan, adalah penghentian program selama beberapa milisecond, kemudian badan ular di-update sesuai method update dari class Snake tersebut. Terakhir, panel diletakkan dalam sebuah JFrame (window), yang diconstruct dalam method main.

Source code bisa didownload di:
http://haqqilibrary.googlecode.com/files/SnakeHQ.zip

Selamat mencoba!!!
read more...

Dari Perfeksionis Menjadi Idealis

Sep 6, 2009

Tentang hidup saya lagi, semoga memberi inspirasi

Sekali lagi, ada cewek yang bilang kalau saya ini perfeksionis. Mungkin dia menangkap dari pola pikir saya, pandangan hidup saya, dan radikalisme saya, yang bisa dilihat waktu saya ngobrol sama dia. Kalau saya dibilang perfeksionis waktu dulu, saya terima pendapat itu. Tapi kalau sekarang, saya mendeklarasikan diri bahwa saya nggak perfeksionis.

Ya, saya bisa mulai menikmati hidup setelah saya menemukan kembali dunia saya. Sejak saat itu, saya merasa hidup ini adalah anugerah yang luar biasa.

Nah, kenapa saya tiba-tiba nulis topik ini? Hm, berawal dari perkataan cewek itu, dan acara buka bersama bareng temen-temen SMA. Ada perasaan yang beda antara buber tahun ini dengan tahun kemarin, waktu saya masih menjadi saya yang lama. Rasanya, buber tahun ini lebih ada taste. Nggak cuma buber sih, semua yang saya jalani saat ini memang lebih berasa. Tapi perbedaan itu benar-benar saya rasakan semalam (waktu buber).

Di perjalanan pulang, saya berpikir mengapa bisa demikian. Memang secara garis besar karena saya sudah berubah. Tapi apa yang mendasari perubahan taste itu?

Alasan itu, mengembalikan tulisan ini pada topik, tentang ke-perfeksionis-an saya. Semenjak orang terpenting dalam hidup saya meninggal di saat yang tidak tepat, dialah target perfeksionis saya. Karena pola pikir saya waktu itu, secara nggak sadar saya membikin suatu kotak pembatas sendiri. Akibatnya, sangat fatal. Saya menjadi nggak bersyukur atas apa yang menjadi "lingkungan" saya. Saya merasa nggak bisa menemukan "lingkungan" yang sama dengan yang dulu. Akibatnya, saya sering berpindah-pindah lingkungan dan malah menyebabkan saya jadi merasa sendirian. Parahnya, keperfeksionisan saya malah semakin menjadi-jadi. Hidup saya jadi terasa suram, nggak ada rasanya, dan nggak berisi.

Sebuah kejadian membuat saya membuang keperfeksionisan saya yang sangat rumit, menjadi sesuatu yang lebih sederhana. Tapi tetap, idealisme yang merupakan bagian dari perfeksionisme, melekat di diri saya. Meskipun demikian, hidup saya sekarang jadi lebih berasa. Saya jadi bisa lebih bersyukur dengan apa yang ada di lingkungan saya. Saya sadar, di sekitar saya ada banyak teman-teman yang bisa mengisi hidup saya, meskipun nggak ada yang bisa menggantikan F. Tapi beneran nih, saya benar-benar enjoy dengan pola hidup saya yang sekarang.

Nikmatilah hidup hari ini, karena kita nggak bisa mengulang yang lalu.

Sekarang saya jadi senyum-senyum sendiri. Kenapa saya dulu bisa segitu bodohnya menyia-nyiakan hidup saya dengan pola pikir saya. Saya jadi nggak bisa memiliki kenangan masa-masa SMA yang bahagia. Saya stuck di tempat saya berdiri. Nggak ada kenangan, nggak ada impian. Itu semua karena mengharapkan kesempurnaan semu.

Sudahlah, yang berlalu biarlah berlalu. Sekarang hidup saya sudah menjadi lebih baik, lebih berasa. Menikmati dan mensyukuri pemberian Tuhan saat ini, akan menambah nikmat di kemudian hari. Tapi saya tekankan, idealisme yang tetap melekat ini, semata-mata demi membuat saya agar tidak keluar jalur dari impian saya. Kalau nggak gitu, saya nggak akan jadi seperti sekarang ini. Sebab idealisme saya lebih mengarah ke prinsip.

Dalam hal prinsip, tegarlah seperti karang
Dalam hal selera, mengalirlah seperti air

Sekian posting artikel kali ini. Sekali lagi, blogging adalah free-writing. Nggak ada niat untuk menyombongkan diri. Saya hanya menuangkan hasrat menulis saya. Dan semoga tulisan ini bisa memberikan inspirasi bagi pembaca.
read more...

PPS

Sep 5, 2009

Post Power Syndrome? Masa sih?

Jabatan Ketua Himpunan Mahasiswa Prodi Teknologi Informasi sudah nggak lagi melekat di tubuh saya. Jabatan anggota BPMU, secara otomatis lepas juga karena peraturan baru. Banyak yang tanya ke saya, gimana rasanya? Udah mengalami post power syndrome (PPS)?

Sebelum lanjut, apa sih PPS itu? PPS katanya sih penyakit yang muncul sebelum dan sesudah hilangnya jabatan struktural yang melekat pada seseorang. Gejalanya, orang tersebut masih merasa memegang jabatannya dan menganggap orang lain tetap menjadi bawahannya.

Saya menderita PPS? Nggak tuh.

Selepas jabatan saya, saya malah merasa lebih bebas. Saya pastinya akan punya banyak waktu untuk mengembangkan sayap saya. Ketua HMP yang baru pun saya rasa bisa menjalankan tugas lebih baik daripada saya. Saya juga ikut membantunya sih, tapi hanya dari bagian konsep. Dan lepasnya jabatan saya ini, merupakan rencana yang sudah sejak awal saya plot. Jadi, nggak akan ada penyesalan.

Dari awal target saya untuk aktif di Lembaga Kemahasiswaan hanya sampai tahun kedua ini. Di tahun ketiga, orientasi saya sudah berubah. Saya berencana mengisi Curriculum Vitae saya dengan berbagai aktivitas positif lainnya, yang berhubungan dengan spesialisasi saya di dunia IT. Apa aja?

Banyak sekali yang ingin saya kejar tahun ini. Sebagai mahasiswa, saya mau bayar hutang mata kuliah yang memang sengaja nggak saya ambil di semester kemarin. Sebagai penulis, akan saya lanjutkan dengan tetap membuat tutorial-tutorial seputar keahlian saya. Sebagai anak band, hm... kayaknya nggak terlalu besar targetnya. Tetap nge-band lah intinya. Sebagai pencari uang (sebelum dicari uang), saya harus menyelesaikan project yang saya dapatkan. Saya juga berencana membuat usaha sendiri dengan dibantu oleh penasehat yang luar biasa.

Saya mulai menyadari kekuatan network. Dengan adanya network, saya bisa jadi lebih besar. Van Deventer kemarin menjadi salah satu asset yang besar di masa depan. Sekarang, nggak terlalu muluk-muluk. Saya akan mulai dari komunitas open source bernama OSUM. Kebetulan saya yang menjadi Leader di group kampus saya. Dan rencananya, tanggal 3 Oktober 2009 ini akan ada perayaan SFD2009 dengan saya menjadi ketua panitianya. Pertama kali jadi ketua panitia beneran nih. Biasanya jadi Steering Committee soalnya. Hehe... Moga-moga acara ini sukses dan saya bisa memperbanyak kenalan lewat OSUM ini.

Balik ke topik, apa saya menderita PPS? Jelas sekali, TIDAK. Saya semakin enjoy dengan kehidupan saya saat ini, dimana saya bisa mengejar semua impian saya. Semoga semua impian saya terwujud. Amien.
read more...