Saturday, December 28, 2013

Menjalankan Aplikasi Berbasis Library GMP (GNU Multi Precision) di Windows Menggunakan MPIR

GMP (GNU Multi Precision) adalah library untuk operasi aritmatika dengan kepresisian tak terbatas. Dengan library ini, kita dengan mudah dapat melakukan perkalian bilangan yang sangat besar seperti:

7612058254738945 x 9263591128439081 = 70514995317761165008628990709545

Angka tersebut jelas tidak dapat direpresentasikan dalam tipe data standard, int, long int, double, dan selainnya. GMP memakai tipe data mpz_t sebagai container-nya. Secara teori, tingkat kepresisian operasi tidak terbatas dan dibatasi oleh besar memory (RAM) komputer yang dipakai. Operasi angka besar seperti ini banyak dijumpai pada algoritma cryptography, yang sering menggunakan angkat biner dengan jumlat bit sampai 1024-bit bahkan lebih.

GMP di Windows 

Salah satu kekurangan library GMP adalah tidak adanya solusi yang out-of-the-box untuk Windows. Untuk memakai GMP, harus melakukan porting Makefile terlebih dahulu sehingga dapat dicompile di Visual Studio, dan ini cukup memakan waktu.

Untungnya, sudah ada orang yang membuat fork dari repository GMP dan membuat versi sendiri yaitu: MPIR (Multi Precision Integer and Rationalhttp://www.mpir.org/). Berbeda dengan GMP, library ini sejak awal didesain agar support untuk platform Linux, Windows, MAC OS, dan Solaris.

Membuild Library MPIR di Visual Studio

Untuk mem-build library MPIR di Windows, dibutuhkan berikut:

  • Visual Studio (bisa memakai Visual Studio 10 Express)
  • Windows SDK 7.1

Langkah pertama adalah pastikan Windows SDK v7.1 sudah terinstall, cek folder "C:\Program Files\Microsoft SDKs\Windows\v7.1", jika belum ada maka perlu diinstall terlebih dahulu. Download di http://www.microsoft.com/en-us/download/details.aspx?id=8279 untuk online installer, atau http://www.microsoft.com/en-us/download/details.aspx?id=8442 untuk offline installer. Pilih installer yang cocok dengan platform yang dipakai:
  • GRMSDK_EN_DVD.iso untuk Windows x86 32-bit
  • GRMSDKX_EN_DVD.iso untuk Windows x64 64-bit
  • GRMSDKIAI_EN_DVD.iso untuk Intel Itanium Architecture 64-bit

Setelah Windows SDK v7.1 sudah terinstall, download source code MPIR di http://www.mpir.org/mpir-2.6.0.tar.bz2 (pada contoh ini versi 2.6.0).

Extract source code tersebut, lalu masuk ke folder "mpir-2.6.0\build.vc10". Buka "mpir.sln" menggunakan Visual Studio, lalu build project berikut: dll_mpir_gc, lib_mpir_gc, dan  lib_mpir_cxx. Library hasil build akan muncul di "mpir-2.6.0\lib\Win32\Debug" atau "mpir-2.6.0\lib\Win32\Release" tergantung dibuild dengan target Debug atau Release.


Setelah semua dicompile, dapat ditest apakah MPIR sudah berhasil di-build atau belum. Buka command prompt, masuk ke "mpir-2.6.0/build.vc10/", build semua project di mpir-test.sln. Setelah semua test project dibuild jalankan run-tests.py dari command prompt (harus install Python terlebih dahulu, download di www.python.org/getit/windows/).


Menjalankan aplikasi GMP menggunakan MPIR

Untuk menjalankan aplikasi GMP pada Windows menggunakan GMP, cukup masukkan path "mpir-2.6.0\lib\Win32\Debug" atau "mpir-2.6.0\lib\Win32\Release" pada Additional Library Directories, dan path "mpir-2.6.0\" pada Additional Dependencies.

Ambil contoh penggunaan GMP dari http://en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library, untuk perkalian bilangan besar.

Berikut hasilnya:


Library GMP banyak dipakai untuk membuat algoritma cryptography, misalnya pada algoritma RSA, untuk melakukan kalkulasi ciphertext = plaintext ^ e mod m, cukup gunakan mpz_powm(ciphertext, plaintext, e, e). Selamat mencoba ;-) (Yayan)

Catatan:
Library GMP termasuk sudah lama dan kemungkinan akan out-dated digantikan dengan library baru seperti MPIR, libgcrypt (untuk cryptography), dan sebagainya.

Jump Start RTL Project (Simulasi dan Sintesis) Menggunakan CMake

Dalam membuat project RTL, biasanya kita akan berhadapan dengan beberapa kebutuhan berikut:
  • Mixed language (Verilog/VHDL)
  • Scripting (Modelsim, Quartus, ISE, dll)
  • Multiple target (Altera, Xilinx, Artisan, dll.)
  • Repeatable process (design, simulation, synthesis, field testing, back to design, ..)
Untuk itu diperlukan environment project yang flexible dan mendukung kebutuhan diatas. Untuk memulai project RTL dengan environment flexible tersebut, bisa dicoba dengan menggunakan CMake:


Berikut struktur directoy-nya:


Environment tersebut dibuat menggunakan CMake. Untuk mulai menggunakannya, build dulu makefile-nya dengan CMake atau CMake-GUI (download dari http://www.cmake.org/cmake/resources/software.html).

Info selengkapnya dapat dibaca di: http://www.cmake.org/cmake/help/runningcmake.html

Quick Guide:
  1. Untuk menjalankan simulasi: make sim
  2. Untuk menjalankan simulasi dengan GUI (melihat waveform): make sim_gui
  3. Untuk menjalankan sintesis (otomatis memilih QUartus atau ISE): make syn
  4. Untuk mengubah target ke Altera, Xilinx, atau RTL model, modifikasi file /CMakeLists.txt, pada baris: set(TARGET "xilinx"), ganti "xlilinx" dengan "altera" atau "model"
  5. Untuk menambahkan desain Verilog, modifikasi file /src/CMakeLists.txt, pada baris: set(VERILOG_SYN_SRC_FILES buffer.v), tambahkan jadi set(VERILOG_SYN_SRC_FILES buffer.v file1.v file2.v), dan seterusnya.
  6. Untuk menambahkan desain VHDL, modifikasi file /src/CMakeLists.txt, pada baris: set(VHDL_SYN_SRC_FILES adder.vhd), tambahkan jadi set(VHDL_SYN_SRC_FILES adder.vhd file1.vhd file2.vhd), dan seterusnya.
  7. Untuk menambahkan Xilinx Core, modifikasi file /src/xilinx/CMakeLists.txt, tambahkan pada baris: set(XILINX_VERILOG_SYN_SRC_FILES ) untuk file Verilog, atau set(XILINX_VHDL_SYN_SRC_FILES ) untuk file VHDL.
  8. Untuk menambahkan Altera Core, modifikasi file /src/altera/CMakeLists.txt, tambahkan pada baris: set(ALTERA_VERILOG_SYN_SRC_FILES ) untuk file Verilog, atau set(ALTERA_VHDL_SYN_SRC_FILES ) untuk file VHDL.
Dengan enviroment ini, maka ada beberapa keuntungan:
  1. Project langsung dapat disetup dengan cepat tanpa harus membuat manual di Modelsim, Quartus, maupun ISE.
  2. Tidak perlu membuat script yang terpisah antara simulasi dan sintesis sehingga menghindari kesalahan file / perbedaan file yang disintesis.
  3. Dapat dijalankan disegala platform dan IDE.
  4. Dapat diintegrasi dengan sistem lain, misalnya Jenkins untuk continuous integration (baca: http://www.design-reuse.com/articles/23424/continuous-integration-complex-reconfigurable-system.html).
Tutorial selengkapnya dapat dilihat pada video berikut ini:


Selamat mencoba & jumpt start your RTL project ;-) (Ya2n)

Sunday, December 15, 2013

Menjalankan Simulasi IP Core Altera di Modelsim

Pada artikel sebelumnya, dijelaskan bagaimana mencompile library IP Core Xilinx untuk simulasi Modelsim. Pada artikel kali ini, akan dijelaskan bagaimana mengcompile library IP Core Altera untuk simulasi Modelsim. Perlu diketahui bahwa Altera juga menyediakan Modelsim Altera, dimana pada Modelsim versi tersebut, sudah diinclude library ALtera sehingga tidak perlu mengompile sendiri library tersebut. Tapi untuk modelsim versi biasa, perlu dilakukan langkah untuk mengcompile nya, berikut caranya:

1. Download TCL script untuk mencompile library (ada dia pilihan script: compile Verilog atau VHDL) dari sini:

http://www.altera.com/support/examples/tcl/tcl-modelsim.html

2. Modifikasi script untuk disesuaikan dengan instalasi Altera, dan pilihan library. Pada contoh ini, saya hanya akan mengcompile library untuk simulasi fungsional (tanpa timing, dsb.)

TCL script
3. Buka Modelsim, pilih "Tools > TCL > Ecexute Macro", lalu masukkan TCL script yang telah didownload dan dimodifikasi sebelumnya.

Execute TCL script dari Modelsim
4. Tunggu proses compile selesai, maka library Altera akan muncul di Modelsim. Untuk selanjutnya proses ini tidak perlu diulang setiap kali akan melakukan simulasi.

Library Altera di Modelsim
Selamat mencoba ;-) (Ya2n)

Menjalankan Simulasi IP Core Xilinx di Modelsim

FPGA (Field Programmable Gate Array) adalah IC yang terdiri dari gerbang logika (NAND, NOR, dsb.) dan blok memory yang dapat dikonfigurasi ulang (diprogram ulang) koneksinya. Bahasa pemogramannya menggunakan Verilog atau VHDL.

Pada FPGA, umumnya tersedia juga IP core, berupa desain hardware yang dapat digunakan langung tanpa harus membuat program Verilog/VHDL-nya. IP core yang umum digunakan adalah clock generator (PLL) dan memory blcok (RAM, ROM, FIFO, dsb). IP core lainnya seperti DSP block (filter, FFT, dsb.), interface block (USB, PCI, RapidIO, dsb.). Untuk IP core jenis ini biasanya memerlukan license sendiri.

Bentuknya IP core adalah macrocell, dimana kita tidak dapat melihat isinya dalam bentuk Verilog/VHDL, tapi biasanya disediakan modelnya, untuk keperluan simulasi. Model Verilog/VHDL IP Core tersebut dapat berupa behavioral model, gate level, sampai timing.

Untuk dapat menggunkan model IP core untuk simulasi Xilinx di Modelsim, ikuti langkah-langkah berikut:

1. Buka "Xilinx Library Compilation Wizard", atau ketik compxlibgui pada start menu atau command prompt. Pilih simulator yang dipakai (pada contoh ini Modelsim SE), pastikan path "Simulator Executable Location" sudah benar.

Xilinx Library Compilation Wizard
 2. Klik Next, pilih both VHDL and Verilog, tunggu proses selesai.


3. Setelah proses selesai, compxlibgui akan menghasilkan modelsim.ini. Copy bagian path library Xilinx ke modelsim.ini yang ada di folder instalasi modelsim (pada contoh ini di C:\modeltech_6.5\modelsim.ini)

modelsim.ini
4. Selesai, buka Modelsim, maka library Xilinx akan terlihat di "Library" modelsim.

Modelsim dengan library Xilinx

Mudah kan, selamat mencoba ;-) (Ya2n)

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)