November 9, 2014

Implementing Derby in Greenfoot’s Jar Deployment: Tetris Game

Hello, this November should be called database month in my blog! I’ll post databases related technology such as MySQL, Derby, etc (from {Java} developer’s point of view) to familiarize myself with such technology so I can learn more advanced technology, such as spatial database technology.

Simple greenfoot tetris game
While there are so many libraries out there on the internet that you can use within greenfoot, this post will be the implementation of embedded derby in your greenfoot scenario deployment and a little of its problem. A little knowledge about greenfoot (2.4.0), jar packaging, and embedded derby will be helpful when reading this article. I also post my tetris game distribution which you can download below this post.



Imagine a situation where you have developed from scratch, a tetris game in greenfoot, and then you said to yourself,

“Hmm, I’m too lazy to write down the score saving code manually, I should use derby instead.“

If you want to utilize derby or any other libraries in greenfoot IDE, the IDE has to know where the derby library is and load the derby library’s driver from there. For that, you need to do:

Set the classpath in greenfoot environment by:
  1. Clicking edit -> preferences.
  2. In libraries tab, in user libraries, click add and enter the location to your derby.jar files .
  3. Finally, restart greenfoot.
Then, you can connect to the database via JDBC through derby’s driver. The path to the database will begin from your greenfoot scenario’s root folder.

Problem with Deployment

While it is relatively easy to use derby to create and access database right away in your greenfoot scenario, it’s not the same if you deploy it into a jar file.

You see me losing the game..
If you deploy (or ‘export’) your scenario and run it as is, all of your database related code will be useless. I don’t know the exact problem, but what I do know is that I’ve never saw any ‘jar in a jar’ files in any Java application’s jar. Maybe, your game can’t access the jar files when it is a jar file by itself and thus, the driver will never loaded.

But, worry not--remembering the Java packaging/deployment tutorials, I’ve decided to put derby library (jar) in the same directory as the game’s jar file (not inside the jar) and set the classpath in the game’s jar manifest file to include the derby library.

Derby’s database system and your database folder, will belong in the directory (root directory) that contain your game and derby library’s jar files.

These are the highscore which is saved using derby library
Finally, besides your game’s jar file and the derby’s library, you should put the (pre-generated) database in your game distribution.

The final file structure of your distribution more or less should look like this:

[your game directories] /
   |--- [your game].jar
   |--- derby.jar
   |---derby.log
   |---database /
     |---[your database]

To summarize things up, you can use external libraries in greenfoot by addressing the libraries in the preferences. After you deploy your greenfoot scenario into jar file, you should put the library besides your scenario jar’s file (or database folder) and tell your game’s jar file manifest where the library is.

Tetris game: https://drive.google.com/file/d/0B27ziWaCDimLenNKNkZVYWNwdms/view?usp=sharing


November 2, 2014

MathQuiz: A little experiment using embedded Derby database.

Ok, so I've decided to write down my blog in English language to make my writings more available to the wide audiences of the Internet. This post will be my first attempt to write a post in English and also my first attempt to utilize (embedded) Apache Derby technology in my Java code. All of the resoure(s) I've put on this post are available for download below this post.

Introducing MathQuiz
MathQuiz is a very thin, Java (using JDBC) game that utilize embedded Derby database to save the player's score. It consist of only 1 source (java) file, and can only be played in command prompt interface.

The game (or should I say, quizzes?) is very straight forward: you run it, answer ten (10) mathematical problems: each will give you 1 point if answered correctly, and then save the score with your name in the database. You can download the game and the sourcecode using the link provided below this post.

The database and its table are pre-created using the ij tools from the Apache Derby distribution. The one and only table 'scores' consist of two columns, labelled username and score.
Below, using the ij tools, you can see me connecting to the database and retrieve all of the rows from the table 'scores'.


This game is part of my learning process: Learning JDBC, Apache Derby, Ant, SQL, and other usefull (database) technology, I plan to integrate it into the eBookManager project I've reviewed in this blog. As student in Department of Geography who learn GIS and stuff's, its even become more important.

Sourcecode: https://drive.google.com/file/d/0B27ziWaCDimLdnN1eXFlbVlCMEU/view?usp=sharing

September 11, 2014

Open Source Project: eKitaab EBook Manager


Halo setelah lama tidak lagi menulis akhirnya ini tulisan perdana saya di blog tahun ini..

Sekarang penulis ingin memperkenalkan sebuah software opensource bernama eKitaab yang dirilis dengan lisensi publik GNU oleh Balaji Srinivasan tahun 2007. Sebuah software manajemen ebook yang sangat berguna bagi kita-kita yang masih menjadi mahasiswa, yang sayangnya, perkembangan nya sudah lama terhenti. Meski demikian, versi “terbaru” software ini, versi 0.6 (2007) masih dapat didapatkan distribusinya di http://ebookmanager.sourceforge.net/ . Penulis ingin menyampaikan ketertarikan penulis pada software ini, kekuatan dan kelebihan software ini, serta sedikit perubahan yang telah penulis buat terhadap software ini, yang source code nya bisa kalian dapatkan di bagian bawah tulisan ini.

Ada beberapa hal yang membuat penulis tertarik pada software ini, antara lain: berguna bagi penulis yang masih mahasiswa, dan opensource, sehingga bisa dimodifikasi sesuai kebutuhan serta dapat dijadikan bahan pembelajaran sebagai developer. Untuk alasan yang pertama, penulis memang dari dahulu mencari software manajemen softcopy materi-materi perkuliahan. Manajemen file materi perkuliahan secara konvensional/manual seperti menyusunan struktur folder/direktori sesuai mata kuliah dari seabrek file materi dirasa masih belum cukup, masih banyak masalah yang melanda seperti: file yang susah dicari, bingung menempatkan file, file ganda, dan lain sebagainya. Dari kesulitan penulis sebagai mahasiswa di atas, penulis mulai, ketemulah software ini yang paling mendekati kebutuhan penulis. Mendekati loh ya...

Masuklah alasan kedua yang membuat penulis tertarik: karena software ini opensource, murni Java dimana penulis memiliki kemampuan dasar didalamnya, serta dikembangkan dalam IDE Netbeans, memudahkan software ini untuk diutak-atik sesuai dengan kebutuhan penulis. Yang tidak kalah penting, software ini bisa dijadikan sebagai alat pembelajaran serta latihan agar menjadi developer handal.
 
...#ehem...
 
Sedikit flashback, sebelum menemukan software ini, sempat terlintas dalam benak (naif) penulis untuk membuat software sendiri starting from scratch, namun penulis mengurungkan niat tersebut karena pastinya akan memakan banyak waktu. Yasudah, karenanya penulis putuskan untuk mengembangkan software punya Pak Balaji yang sudah ada ini saja. Dan ini merupakan software opensource pertama yang penulis modifikasi!
 
Keunggulan dan kelemahan
 
Penulis merasa tidak ada keunggulan yang bisa ditonjolkan dalam kesederhanaan software ini selain potensinya untuk dikembangkan lebih jauh lagi, paling tidak software ini bisa berguna bagi kalangan mahasiswa, atau kalangan developer muda yang ingin belajar menjadi developer. Itu saja cukup bagi penulis yang menilai software ini sebagai pengguna dan (calon) pengembangnya.
Ada yang unik dari software ini dalam menyimpan keterangan mengenai ebook-ebooknya: software, ini menyimpan informasi mengenai buku pada nama file, informasi tersebut tidak dipisahkan dalam sebuah database tersendiri. Hal ini menjadikan penyimpanan data menjadi praktis, namun terbatas, sehingga penulis tidak memasukannya sebagai keunggulan.
 
Kemudian, sebagai proyek yang sudah terhenti sejak tahun 2007; software ini memiliki banyak kelemahan, antara lain: berbagai fitur kurang update sehingga tidak bisa digunakan, dokumentasi buruk, dan teknis kodingannya, dari desain sampai implementasi juga tidak begitu baik.
 
Sebagai contoh, dalam software ini ada sebuah fitur untuk secara otomatis mendapatkan informasi mengenai ebook yang kita punya dari jasa penyedia informasi buku seperti Amazon. Sama seperti Windows Media Player lah, yang secara otomatis mendownload informasi mengenai album/lagu yang sedang kita putar. Software ini sepertinya terhubung pada server Amazon untuk mengambil informasi mengenai bukunya. Namun sekarang fitur tersebut sudah tidak bisa digunakan, mungkin karena ada perubahan pada servernya, atau memang karena belum diatur konfigurasinya oleh penulis.
 
Selanjutnya untuk dokumentasi kode, penulis merasa gregetan saat pertama kali membuka source code software ini dalam IDE Netbeans, dikarenakan sedikitnya komentar serta dokumentasi di dalamnya. Komentar yang dibuat sepertinya bukan untuk developer lain (dari luar), hanya untuk kalangan sendiri. Dokumentasi yang kurang ditambah pengalaman serta pengetahuan penulis yang masih sedikit, menyebabkan usaha untuk mempelajari dan mengerti kode ini membutuhkan waktu yang cukup lama: total kira-kira 3 jam, dalam 3 hari, karena jika penulis lelah membaca kodenya, penulis suka ketiduran...
 
Sedangkan untuk kekurangan dari segi desain dan implementasi, penulis tidak akan berkomentar banyak karena belum mengerti banyak (mengenai program ini sendiri maupun ilmu design pattern), namun satu yang penulis yakin, program ini masih bisa disederhanakan lagi dari kedua segi tersebut.
 
Modifikasi pada kode
 
Sebelum membuat modifikasi terhadap software ini, tentu sebelumnya kita harus memahami dulu cara kerja software ini. Secara ringkas, software ini bertujuan untuk menampilkan keterangan/informasi mengenai ebook ke dalam tabel pada tampilan utamanya. Sekali lagi penulis ingatkan, source code bisa kalian dapatkan dibawah tulisan ini.


Gambar 1 Tampilan utama eKitaab Ebook Manager dalam Ubuntu. 

Format ebook yang didukung (untuk ditampilkan dalam tabel) software ini bermacam, ada 8, tetapi yang penulis butuhkan untuk materi kuliah hanyalah yang berformat PDF, sehingga penulis putuskan untuk mengubah sedikit kode software ini.


Gambar 2 Bagian implementasi verifikasi file dalam MainFrame.java . Penulis komentari format selain pdf dan chm.


 Gambar 3 Bagian yang memanggil fungsi verifikasi di atas, dalam BookTableDataModel.java.

Tanpa mau terkesan teknis, sedikit detail dari cara kerja di atas: Pada dasarnya semua data dan informasi yang ditampilkan dalam tabel (instansi dari JTable) ini di-handle oleh sebuah data model, yang dalam Java merupakan instansi dan implementasi dari AbstractDataModel. Pada software ini, yang digunakan adalah subclass dari AbstractDataModel, yaitu kelas BookTableDataModel. Kelas BookTableDataModel inilah yang berfungsi untuk membaca dan mengambil informasi dalam file di harddisk, memasukannya ke dalam data model, untuk kemudian ditampilkan ke dalam tabel. Tetapi sebelum memasukan informasi mengenai file ke dalam data model, ia melakukan sedikit verifikasi terhadap extensi/format file yang terbaca, memastikan hanya file ebook yang dimasukan ke dalam data model.

Nah, dengan sedikit mengubah kode dalam bagian verifikasi tersebut, penulis dapat mengatur, tipe/format file apa yang akan dimasukan ke dalam data model, untuk kemudian ditampilkan di tabel. 

Sederhana, namun seperti yang penulis katakan sebelumnya: dokumentasi yang kurang ditambah pengalaman serta pengetahuan penulis yang masih sedikit membuat mengubah kode ini—mengembangkan software ini makan waktu.

***
Kembali lagi pada penulis, penulis memutuskan menggunakan software ini karena sesuai dengan kebutuhan penulis sebagai mahasiswa dan sebagai bahan pembelajaran pemrograman serta pengembangan software Java.
Tentu banyak lagi software manajemen ebook lainnya, jika kalian punya contoh yang opensource silahkan komentar disini dan bahas apa keunggulannya, bandingkan dengan software ini. Jika ada kritik dan saran silahkan dikomentari. Jika setelah membaca artikel ini kalian berminat untuk mengembangkan software ini lebih jauh, ingin menambahkan fitur-fitur baru, ingin membuat dokumentasi, dan sebagainya, please let me know, silahkan dikomentari.




*Jika ingin mempelajari lebih lanjut mengenai hubungan antara JTable, AbstractDataModel, dan data serta cara mengolahnya bisa baca disini: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

**Bagi yang mau lihat mendownload source codenya yang sudah penulis modifikasi: https://drive.google.com/file/d/0B27ziWaCDimLM3dsMmVsbkc2VU0/edit?usp=sharing

October 9, 2012

Selama ini kita coding dimana?

Salah satu bidang yang bikin saya penasaran di komputer adalah computer networking. Setelah membaca bukunya James F. Kurose dan Keith W. Rose yang berjudul Computer Networking: A Top-Down Approach Featuring the Internet, saya mendapat pencerahan! Dalam Internet protocol, aplikasi-aplikasi serta program-program ngga jelas yang selama ini telah saya buat berada pada Application Layer. Layer paling atas dari protocol yang digunakan dalam berinternet ria.

Jadi, dalam berinternet, dalam berkomunikasinya ada peraturan-peraturan yang disebut dengan protocol. Nah peraturan tersebut ada beberapa, disebut dengan model. Model yang paling banyak ditemui pada saat ini adalah model IP yang terdiri dari.. hmm lupa, 7 layer (lapisan) kalau tidak salah. Tapi di dalam buku yang saya sebut diatas, ada model baru yang disebut dengan model hybrid, digunakan untuk menperjelas tujuan tiap-tiap lapisan di dalam model.

Mari kita lihat lapisan-lapisan dalam model hybrid ini. Dari paling atas ke paling bawah urutannya:
1. Application layer - tingkat paling atas, untuk berkomunikasi pokoknya tinggal terima jadi deh
2. Transport layer - menyediakan komunikasi secara logis dengan proses pada komputer lain
3. Network layer - menyediakan komunikasi secara logis dengan komputer lain
4. Data-link layer - melanjutkan pesan agar mencapai ke-tujuannya
5. Physical layer - layer fisik, menggunakan gelombang cahaya untuk mengirimkan pesan ... -_-

Jadi apa gunanya lapisan-lapisan tersebut?
Lapisan tersebut digunakan agar komputer-komputer di seluruh dunia dapat berkomunikasi melalui internet. Jadi kalo internet kita anggep sebagai pesta pernikahan, buat masuk ada peraturannya, misal: harus make baju bagus, harus bawa suvenir (-_-), harus isi daftar tamu, dst. Eh analogi ini tidak mewakili bagaimana cara berkomunikasi lewat internet, tapi hanya syarat komputer agar bisa berkecimpung dalam internet.

Jadi intinya kita sebagai programmer bisa bernaung di-lapisan mana aja sih. Kalo saya cenderung sebagai desktop programmer ya bernaungnya di layer 1 sampai layer 2 aja, ngga perlu tau dengan layer dibawahnya (perlu sih, dikit). Lalu kalo kalian tukang server, kerja di Cisco, atau perusahaan router atau switch lainnya yaa cenderung programming di layer 3, 4, atau 5. Kalau kalian lulusan teknik elektro, belajar bahasa assembly, ilmuwan akustik, fisikawan, dst ya cenderung di layer 5.

***

Yaak sekian artikel refreshing setelah berbulan-bulan tidak nge-blog. Ada hubungannya tentang kenapa saya buat game online di post sebelumnya loh, hehe. Karena pemahaman saya masih sedikit, kalo ada salah harap bilang-bilang ya.

July 22, 2012

Online Game: Update 22 Juli 2012 (setelah belajar buat masuk SIMAK UI...)


Dan.. ngga keterima Fasilkom-nya -_-" (keterima di Geografi MIPA sih, hehe..)

(curhat..)

ehm..


Client dengan server sudah (ini dari minggu-minggu lalu sih) berhubungan secara 2 arah. Namun karena hubungan 1 arahnya (dari client ke server) masih bermasalah, saya akan fokus ke bagaimana server mengolah data clientnya, dan bukan yang dari server ke client.

Masalahnya adalah lagging di sisi server (gila aja kalo servernya lag gimana nanti clientnya? clientnya cuma satu pula -_-). Sekarang saya mau troubleshoot masalah-masalahnya nih. Karena saya belom ngerti dataflow (yang mungkin sumber masalahnya..) ,mungkin saya belajar dulu dikit-dikit hehe.

Yang akan saya coba lakukan sekarang adalah membuat aplikasi client-server super sederhana (yang pasti kemungkinan lagnya lebih kecil), laaaaalu membandingkan aplikasi tersebut dengan game ini. Siapa tau nemu kan masalahnya? hehe.

Ngga kerasa udah 1 bulan sejak ini game pertama di-coding (bakalan lama nih..). Subscribe ke blog ini buat ngikutin update berikutnya dan menambah tekanan kepada saya biar cepet selesai, loh(?)..

June 27, 2012

Next up! Online game!

Di tutorial berikutnya saya akan membuat tutorial cara membuat game online dengan menggunakan Greenfoot!

Sebenernya gamenya udah jadi dan udah bisa dimainin dengan LAN atau WAN. Tapi masih tahap experimental dan banyak bugnya. Kan saya sambil buat game sambil belajar juga -__- hahaha. Jadi yaa, saya belum begitu mengerti fundamentalnya.

Oh iya, saya emang sekalian belajar juga dengan bikin semua tutorial dipost-post terdahulu. Bikin game online bisa sekalian belajar networking dan I/O Java. Jadi, yaa sangat berguna.


Tutorial nanti bakalan ngebahas dua aplikasi, Client dan Server game tersebut.


Oh iya, kalo mau liat applikasi clientnya, silahkan download di:
http://www.greenfoot.org/scenarios/4238

May 26, 2012

Grapher

Skenario ini untuk menampilkan fungsi matematika.


Ini link skenario yang udah diupload ke Greenfoot Gallery:
http://www.greenfoot.org/scenarios/3423

Ini screenshootnya:



Berikut ini class-classnya:

  • Graph hmm ini koordinat kartesian berisikan x,y, dengan 1 unit = 1 pixel, dan ada grid 5px*5px. Semua garis yang ada ditampilkan di sini berada dalam variabel "lines" yang merupakan vector. Berikut ini fungsi-fungsi (metode) yang utama, fungsi lain selain ini hanya pendukung untuk menggerakan graph ini(dengan cara digeser)..
    • Graph() -- constructor disini tempat kita membuat/menambahkan garis baru. Dengan membuat objek(sebenernya interface..) "line", dan menambahkannya kedalam kumpulan "lines". 
    • drawMap() -- fungsi ini berisi fungsi drawGrid() sama drawLines(), supaya simple hehe. drawGrid() didahulukan supaya fungsi garisnya tidak nabrak sama grid-gridnya.
    • drawLines() --  ini isinya manggi metode drawGrid() terus drawLine(). Supaya lebih rapih sedikit.
    • drawLine() --  menggambar garis, dari paling kiri ke kanan layar, relatif dengan posisi-x dan posisi-y grafik tersebut. Jadi fungsi ini melakukan sebuah loop dari kiri ke kanan sepanjang layar. Jadi awalnya gini, kita menghitung posisi relatif titik pojok kiri-atas layar itu dengan titik (0, 0). Setelah kita mendapatkan selisih x-nya, kita mulai loop dari kiri-layar, x-nya adalah selisih tadi. Saat ini garis belom digambar. Setelah memasukan x pada fungsi garisnya, maka kita mendapatkan y. Naah, untuk digambar giliran y-nya yang dikurangi dengan jarak layar ke titik (0,0), yang y-nya. Jadi sederhananya (xLayar - x, yLayar + y). Kenapa y tidak dikurang? Karena di Greenfoot(ngga hanya Greenfoot sih, hampir semua), semakin tinggi y-nya, semakin kebawah. Ini lebih sederhana lagi, titik yang kita gambar jadinya adalah dari titik [(xLayar - x) -1, (yLayar - y) -1] ke titik [(xLayar-x), (yLayar-y)]
    • drawGrid() -- kalo yang ini, fungsi untuk gambar garis kotak-kotak. Seperti drawLine(), mulai loop dari layar sebelah kiri (untuk garis vertikal). Lalu posisi relatif x, ditambah dengan loopan, dibagi dengan 5, jika ngga ada sisa bagi maka gambar garis deh di posisi x-layar tersebut. Garis horizontalnya juga seperti ini, namun ingat, semakin kebawah y semakin nambah, jadi harus dinegasiin (dibalikin).
  • GraphInfo -- ini objek buat nampilin info yang ada disebelah kanan, supaya keliatan keren aja haha. Soalnya kita juga ngga tau itu posisinya dimana dan ngga ada tulisan di axisnya.
  • Line --  Interface ini keren! Karena bikin kode disini jadi Object Oriented!
    • function() --  nah disini silahkan membuat fungsi buatan kalian sendiri. Eh tapi di class ini ngga bisa diapa-apain, karena ini cuma interface. Kalo mau buat garis liat petunjuknya di constructor kelas Graph.
    • getColor() --  ini untuk ditambahkan, mau warna apa garis tersebut.
Hehehe..
Tadinya sih niatnya mau nambahin parser, supaya bisa langsung masukin fungsi. Tapi belom sempet.
*Niatnya mau bikin RPN parser sendiri jadinya lama...
*Udah lama jadi sih.. jadi tinggal nambahin elemen GUI aja..