Tuesday, October 22, 2013

Menjalankan OSMDroid di API 18: Mengatasi Error NoClassDefFoundError

Saat menjalankan OSMDroid di API 18 (Android 4.3 Jelly Bean), akan muncul error berikut:

10-22 21:23:56.038: E/AndroidRuntime(28372): java.lang.NoClassDefFoundError: org.osmdroid.tileprovider.util.CloudmadeUtil

Untuk mengatasinya, lakukan langkah berikut:

1. Pastikan semua library *.jar ditempatkan pada folder libs, bukan lib atau yang lainnya, lalu hilangkan dari Java Build-Path.

Semenjak API 17, ADT akan secara otomatis mendeteksi semua library *.jar yang ditempatkan dalam folder libs, lalu secara otomatis library tersebut akan ditempatkan di "Android Private Libraries". Jadi meng-add secara manual semua library *.jar sudah tidak diperlukan lagi.


2. Pastikan check pada "Android Private Libraries" di Java Build-Path > Order and Export.


3. Bersihkan project, Project > Clean.

4. Jalankan aplikasinya... Voila! OSMDroid bisa berjalan lancar di Android 4.3 Jelly Bean (API 18).


Selamat mencoba (Ya2n).

Wednesday, May 22, 2013

Meng-Compile Beberapa Fungsi C/MEX dalam Satu File MEX di Matlab

Atau dengan kata lain: Membuat Library MEX

Salah satu kemelahan MEX adalah setiap fungsi C yang akan dicompile, harus di-wrap dalam sebuah fungsi beranama mexFunction, dan nama file yang berisi mexFunction harus sama dengan nama fungsi yang diinginkan. Misalnya, kita ingin membuat fungsi "adder: di MEX berikut:

FIle tersebut jika dicompile menggunakan MEX, akan menghasilkan file .mex (atau .mexgw, .mexw64, dsb), dimana namafungsi sama dengan nama file-nya. Agar fungsi hasil compileasi bisa dipanggil di Matlab dengan cara berikut:

>> adder(2,3)
adder
Adder from MEX function

ans =

     5

Maka file tersebut harus disimpan dengan nama file adder.c, sehinggal ketika dicompile menghasilkan file adder.mex (lihat keterangan diatas).

Demikian juga kalau kita punya beberapa fungsi C lainnya yang ingin dicompile ke MEX, maka tiap fungsi harus disimpan dalam nama file yang sesuai dengan nama fungsi yang dimaksud. Ini menjadi drawback ketika kita punya banyak sekali fungsi, sehingga terpaksa dicompile dalam banyak file MEX (misal: adder.mex, mult.mex, div.mex, dsb.). Bisakah kita mengcompile semua fungsi MEX tersebut dalam satu file MEX saja, sebutlah library.mex? Bisa.

Berikut workaround-nya:

1. Buat satu fungsi MEX (library.c) yang berfungsi untuk memparsing nama fungsi.

Masukkan nama-nama fungsi sebagai header, misalnya:

void mexAdder( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] );
void mexMult( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] );

Lihat code library.c berikut:

2. Sesuaikan nama fungsi pada masing-masing file sesuai nama yang ada di header (poin 1).

Misalnya untuk adder.c jadi begini:

3. Compile library.c bersamaan dengan fungsi-fungsi lainnya.

>> mex library.c adder.c mult.c

4. Selesai! Untuk memanggil fungsi, caranya:

>> library('adder', 2, 3)
adder
Adder from MEX function

ans =

     5

Sekarang kita punya satu file MEX (library.mex) yang berisi semua fungsi C/MEX. Mudah kan!? (ya2n) :D

Referensi:
- http://www.mathworks.com/help/matlab/matlab_external/building-mex-files.html
- http://is.muni.cz/th/256594/fi_m/thesis.pdf

Membuat Aplikasi Smart Poster Writer/Reader Menggunakan Android NFC dan Mifare Classic

Smart Poster merupakan teknologi yang mengubah poster yang tadinya hanya "statis" menjadi "dinamis", yaitu dengan meng-embed sebuah URL pada poster tersebut sehingga alih-alih membaca keterangan yang tertera pada poster, pembaca akan membuka link URL yang tentunya isinya dapat berubah-ubah sesuai kebutuhan.

Teknologi ini diimplementasikan dengan dua cara: QR Code (barcode 2 dimensi), dan NFC. Ada perdebatan mengenai teknologi smart poster ini.

Pertama, secara natural, orang tidak tertarik untuk melihat poster yang sama berulang kali, walaupun sebenarnya isi URL-nya berubah-ubah, lagipula bagaimana kita bisa tahu kalau isi URL-nya telah berubah?

Kedua, masalah security. Orang dapat mengganti gambar QR code, atau menyusupkan kartu NFC tanpa sepengetahuan pemilik poster karena keduanya tidak mencolok (sulit membedakan secara visual). Dengan cara ini, orang dapat memanfaatkan smart poster orang lain untuk meredirect ke URL dia.

Ketiga, masalah harga tag NFC. Perbedaan harga smart poster NFC dengan poster biasa sangat jauh. Apakah memang tambahan harga itu worth it untuk kebutuhan bisnis.

Terlepas dari tiga masalah diatas, smart poster sudah mulai dipakai terutama pada poster informasi publik di bandara, stasiun, terminal, dsb. Juga sudah diimplementasi di restoran-restoren (untuk pesan makanan), dan juga diimplementasikan di etalase virtual (orang melihat etalase produk berupa smart poster, lalu dari URL semart poster, orang tersebut membeli produknya).

Berikut contoh code aplikasi smart poster writer pada Android:

Pada code diatas, kita mengimport library NFC dan Mifare, lalu membuat variable berupa Tag, NFC, dan MifareClassic. Pada saat onCreate, semua variable ini diinisialisasi, dan fungsi handlernya juga diinisialisasi. Saya membuat dua fungsi handler yang dipanggil berdasarkan intent-nya. Yang akan saya jelaskan adalah createTag(getIntent()). Berikut isi createTag(getIntent()):

Code akan dieksekusi ketika muncul trigger berupa terdeteksinya NFC card/tag ke Android. Lihat line berikut:

mTagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);.

Variable mTagFromIntent di-bind dengan intent, ika intent tidak NULL, maka jalankan thread, dimana thread akan menjalankan fungsi writePoster() di background. Fungsi writePoster() adalah untuk melakukan koneksi dan transaksi data dengan NFC card/tag. Lihat code dibawah ini:

Pada code diatas, kita menulis data (NdefRecord) ke NFC card/tag berupa URI, sehingga ketika card ini dideteksi oleh Android, secara otomatis Android akan membuka web-bowser dan redirect page ke URI yang tertulis pada card/tag tersebut. Lihat line berikut:

NdefRecord uriRecord = NdefRecord.createUri(url);
NdefMessage message = new NdefMessage(uriRecord);

Adapun untuk jenis data yang lain, cara penulisannya berbeda. Jenis-jenis data yang bisa ditulis ke NFC dijelaskan pada spesifikasi NDEF (NFC Data Exchange Format), atau bisa juga dicek di Android SDK API berikut: http://developer.android.com/reference/android/nfc/NdefRecord.html

OK, sampai disini kita bisa melakukan fungsi write ke NFC tag berupa data URL. Selebihnya, code yang ada adalah bagian User Interface. Sebagai bonusnya, saya berikan contoh code sleek User Interface dengan fitur-fitur berikut:

  • Card Sliding Animation - mirip animasi card-nya Google Now
  • Tranparent Image Overlay - bisa dipakai untuk membuat UI tutorial, biasanya ditampilkan ketika user baru pertama buka aplikasi
  • Web View - web browser yang diembed di aplikasi
  • Multiple Page/Actvity with PushButton Intent - ini sih standard, yaitu perpindahan page/activity yang ditrigger PushButton

Code bisa didownload di https://github.com/yansyaf/android-smartposter-writer. Kalau ada pertanyaan, silakan comment dibawah. Enjoy! (ya2n)

Saturday, April 20, 2013

Debugging Aplikasi PHP

Debugging merupakan proses yang mau-nggak-mau harus dijalani tiap kali membuat program. Ada dua garis besar metode yang bisa dilakukan:

  • Nge-print variable dengan code
  • Menggunakan tools debugger dengan IDE (Integrated Development Environment)
Cara Tebar Ranjau

Cara pertama yaitu dengan menambahkan code var_dump($var);. Dengan cara ini, isi variable $var akan terlihat di browser. Makin banyak variable yang ingin diperiksa, makin banyak pula var_dump($var) yang harus ditambahkan sehingga code semakin kotor dan berantakan. Cara ini sering juga disebut dengan "tebar ranjau" :D

Cara tebar ranjau ini makin rumit kalau kita tidak tahu variable mana dan pada kondisi apa bug muncul (misalnya dalam kasus for loop), maka metode print variable dengan var_dump($var) ini menjadi tidak efektif. Walaupun demikian, metode ini sering dipakai untuk quick n dirt debug, pada kondisi-kondisi yang simple, dan biasanya banyak dipakai oleh newbie :D.

Cara Debugging Tools

Cara debugging php menggunakan tools adalah dengan memakai XDebug. Untuk pengguna Unix/Linux bisa ikuti langkah disini http://devzone.zend.com/1120/introducing-xdebug/. Untuk pengguna Windows yang memakai XAMPP sebagai webserver-nya, cukup ikuti langkah berikut:

  • Aktifasi XDebug
  • Buka "C:/xampp/php/php.ini", pada [XDebug], uncomment zend_extension dan tambahkan beberapa setting seperti line dibawah ini:

    [XDebug]
    zend_extension = "C:\xampp\php\ext\php_xdebug.dll"

    xdebug.remote_port=9000
    xdebug.profiler_enable=1
    xdebug.idekey=netbeans-xdebug
    xdebug.remote_enable=1
    xdebug.remote_handler=dbgp
    xdebug.remote_host=127.0.0.1
    xdebug.remote_mode=req
    xdebug_break();

  • Restart Apache service
  • Buka XAMPP Control Panel, stop Apache, lalu start kembali.

  • Cek apakah XDebug sudah terinstall atau belum
  • Buka http://localhost/xampp/phpinfo.php, pastikan XDebug sudah terinstall.

Bonus: setelah XDebug terinstall, output dari var_dump($var) akan berubah menjadi lebih readable. Perhatikan perbedaan berikut ini:

XDebug tidak diaktifkan

XDebug diaktifkan

XDebug sudah terinstall, tinggal install Debugging tools (IDE)-nya. Untuk PHP saya lebih suka pakai Netbeans, yang lain mungkin lebih suka Eclipse, pilihan saja. Untuk netbeans (versi 7.1 keatas) by default sudah suppport XDebug. Break point pada line yang ingin didebug, lalu klik Debug > Debug Project (atau klik icon pada toolbar) untuk mendebug aplikasi PHP. Sekarang kita bisa lihat isi variable PHP tanpa harus menambahkan (dan mendelete lagi) var_dump($var);.

Pada contoh dibawah ini, kita bisa periksa isi variable $data tanpa harus menambahkan code var_dump($data);

By default Netbeans PHP akan berhenti di line pertama ketika di debug. Untuk mengubah settingan ini masuk ke Tools > Option, pilih PHP lalu pilih tab Debugging. Uncheck pada pilihan "Stop at first line".

Selamat mencoba :D (ya2n)

Thursday, April 11, 2013

Tutorial Membuat Software MySQL Client (Windows, Linux, Mac) Menggunakan Qt Desktop

Pada tutorial berikut, kita akan membuat software desktop (GUI) menggunakan Qt untuk menampilkan database (MySQL) dari server. Berikut skemanya:

Tutorial ini ditujukan bagi yang sudah familiar dengan Qt dan sedikit tahu tentang MySQL. Bagi yang belum familiar dengan Qt, silakan pelajari dulu tutorial memulai membuat software GUI menggunakan Qt.

Install software yang dibutuhkan

Sebelum dilanjutkan, pastikan beberapa software ini telah terinstall, jika sudah terinstall bisa langsung masuk ke tutorial:

1. MySQL server

Untuk localhost, bisa install XAMPP disini. Setelah XAMPP terinstall, pastikan Apache dan MySQL server sudah dinyalakan.

2. MySQL Qt plugin

Untuk menginstall plugin MySQL di Qt, ikuti langkah pada tutorial disini. Untuk mengecek apakah MySQL plugin sudah terinstall atau belum, jalankan code berikut di Qt:

Maka Qt akan mengeluarkan output berupa daftar DBMS yang telah terinstall (pastikan QMYSQL ada dalam daftar list tersebut).

Membuat Database

1. Buka http://localhost/phpmyadmin
2. Masuk ke Privileges, klik "Add a New User".
3. Masukkan data berikut (isi Password dengan password):

JANGAN LUPA: pilih "Create database with the same name and grant privileges", lalu "Check All" pada pilihan privileges-nya.

4. Dari home PhpMyAdmin, masuk ke database example yang sudah dibuat pada no.5
5. Masuk ke menu SQL
6. Copy/paste SQL command dibawah ini, lalu klik GO:

Maka tabel test akan muncul seperti ini:

Membuat GUI

1. Buat file MysqlExample.pro, isikan dengan code berikut:
2. Buat file main.cpp difolder yang sama dengan MysqlExample.pro, isikan dengan code berikut:
3. Jalankan aplikasinya, maka akan muncul GUI dengan tabel dimana isi tabelnya diambil dari MySQL database di localhost.

Karena software ini dibuat menggunakan Qt, maka code yang sama dapat dijalankan di WIndows, Linux, dan Mac. Enjoy! (ya2n)

Monday, February 18, 2013

C++ Driver untuk Komunikasi PC ke Smart Card via Reader

Salah satu fitur yang disupport Windows API adalah komunikasi dengan Smart Card via Smart Card Reader. Komunikasi PC ke Smart Card dilakukan dengan menggunakan protokol APDU (Application Protocol Data Unit). Untuk lebih jelasnya mengenai APDU, lihat http://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit.

Library yang dipakai untuk mengimplementasi komunikasi tersebut adalah library winscard. Berikut adalah contoh aplikasi komunikasi PC dengan Smart Card via Reader dalam C++. Code dibuat sesimple mungkin dan dalam satu file saja, dengan tujuan untuk memudahkan mempelajari dan mengadaptasinya. Code dibagi atas tiga bagian besar:
  • Scan
    • Men-scan Smart Card Reader
    • Me-list daftar Reader yang terdeteksi
  • Connect
    • Men-connect ke Reader
  • Transmit/Receive
    • Mengirim command APDU ke Reader
    • Menerima respon dan dan menampilkan responnya


Selamat mencoba (ya2n)

Saturday, January 12, 2013

Menjalankan Hello World di DSP TI C6670

Hello world, program yang biasanya dijalankan untuk mulai mempelajari bahasa baru, IDE baru, dan sejenisnya. TI C6670 adalah prosesor DSP buatan Texas Instrument yang memiliki multicore processor (4-core). Compiler yang digunakan adalah CCS (Code Composer Studio) bawaan TI (Texas Instrument). CCS sendiri berbasis Eclipse platform, jadi bagi yang sudah terbiasa pakai Eclipse sebagai IDE-nya, tidak akan sulit memulai menggunakan CCS. Lebih lengkapnya silakan baca pada link berikut: http://www.ti.com/tool/ccstudio.

Berikut step-by-step menjalankan Hello World di TI C6670. Saya berusaha menyajikan dengan se-simpel mungkin agar mudah dipahami.

Saya bagi dalam 3 tahap utama:
1. Membuat project baru
2. Membuat code dan mem-build-nya
3. Menjalankan di board DSP (emulator)

Membuat Project Baru 

1. Jalankan CCS, buat project baru. Pada menu, pilih File > New > CCS Project
2. Pada isian Project Name, masukkan nama projectnya: helloworld
3. Pilih Project Type pada C6000
4. Pada project setting, pastikan settingan seperti dibawah ini:



Membuat Code dan Mem-Build-nya

1. Buat file baru, klik kanan pada project (pada Tab C/C++ Project), pilih New > Source File, simpan dan berikan nama helloworld.c

2. Buat code Hello World seperti biasa.


3. Aktifkan RTSC support, klik kanan pada project, New > RTSC Configuration File, beri nama helloworld.cfg. Setelah RTSC support diaktifkan, akan muncul beberapa include path baru.

4. Build code-nya, klik kanan pada project, lalu Build Project, akan muncul binary helloworld.out pada folder Debug.

Menjalankan di Board DSP (Emulator)

1. Pilih perspective CCS Debug, pada menu pilih Window > Open Perspective > CCS Debug, bagi yang sudah terbiasa pakai Eclipse pasti tahu ini :D

2. Buat Target Configuration baru, pada Tab Target Configurations, klik kanan pada User Defined > New Target Configuration, masukkan nama targetnya: C6670

3. Pada Connection pilih Blackhawk XDS560v2-USB Mezzanine Emulator, pada Device pilih TMS320C6670

4. Pastikan board DSP telah terkonek dengan PC/laptop, klik kanan pada target configuration C6670.ccxml, pilih Launch Selected Configuration. Akan muncul list 4-core processor C66xx_0, C66xx_1, C66xx_2, dan C66xx_3.

10. Klik kanan pada C66xx_0, lalu Connect Target.

11. Load binary yang sudah dibuild, pada menu pilih Run > Load > Load Program. Pilih Browse Project, pilih helloworld.out

12. Jalankan program, pada menu pilih Run > Resume, akan muncul Hello World! yang ditulis oleh prosesor DSP core 0.

Mudah bukan? Selamat mencoba! (ya2n)