April 29, 2013

Mengakses Java dari SWI Prolog

SWI Prolog mempunyai fasilitas bi-directional untuk menghubungkan program Java yang kita buat dengan Prolog dan sebaliknya, jadi kita bisa mengakses Java melalui SWI Prolog, demikian juga Java bisa menggunakan kemampuan rule-based system dan fasilitas-fasilitas dari SWI Prolog. Fasilitas ini akan disertakan secara langsung saat mengkompilasi SWI Prolog jika kita mempunyai JDK (baik Oracle JDK maupun OpenJDK). Hasil dari proses kompilasi tersebut adalah JPL.

Membahas mengenai interfacing ini relatif kompleks, tetapi bisa dimulai dari konfigurasi. Standar konfigurasi dari $JAVA_HOME dan lain-lain masih harus ditambahkan lagi. Jika menggunakan instalasi JDK dari disto, barangkali akan berbeda, tetapi yang saya uraikan ini adalah konfigurasi dari instalasi manual JDK. Pada instalasi manual JDK, masih harus ditambahkan environment variable LD_LIBRARY_PATH. Jika tidak dikonfigurasi, ada error tidak ditemukan pustaka-pustaka yang diperlukan seperti berikut ini:

09:43:27-bpdp@bpdp-arch:/usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog$ swipl
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.3.14)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- [jpl_versions_demo].
ERROR: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
'$open_shared_object'/3: libjvm.so: cannot open shared object file: No such file or directory
ERROR: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
library `java' does not exist (Please add directory holding libjava.so to $LD_LIBRARY_PATH)
Warning: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
Goal (directive) failed: jpl:initialization(setup_jvm,now)
ERROR: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:1:
Exported procedure jpl:jpl_c_lib_version/1 is not defined
%  library(jpl) compiled into jpl 0.06 sec, 1,947 clauses
ERROR: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:22:
jpl:jFindClass/2: Undefined procedure: jpl:jni_func/3
Warning: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:22:
Goal (directive) failed: user:jpl_versions_demo
% jpl_versions_demo compiled 0.07 sec, 1,953 clauses
true.
?- 

File-file yang diperlukan terdapat pada instalasi JDK. Pada komputer saya, $JAVA_HOME=/home/bpdp/software/jdk. Export environment variable LD_LIBRARY_PATH bisa dilakukan di .bashrc maupun di tempat lain sebagai berikut:

$ cat $HOME/.bashrc
...
...
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/i386:$JAVA_HOME/jre/lib/i386/client
...
...
$
Hasilnya adalah sebagai berikut:

?- [jpl_versions_demo].
%  library(jpl) compiled into jpl 0.06 sec, 1,978 clauses
prolog library version: 3.1.4-alpha
  java library version: 3.1.4-alpha
     c library version: 3.1.4-alpha
BINGO! you appear to have the same version of each library installed
% jpl_versions_demo compiled 0.18 sec, 2,030 clauses
true.
?- 

BINGO! It works! Mari kita lihat contoh JTable:

?- [jpl_table_demo].
% jpl_table_demo compiled 0.69 sec, 1,619 clauses
true.
?- 

Silahkan melihat ke /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/ untuk contoh-contoh lainnya. 

Selamat berkarya!










April 24, 2013

LiteIDE X: IDE Cross Platform untuk Go

IDE (Integrated Development Environment) adalah komponen penting dalam pengembangan software. Dengan software ini, pengembang bisa menggunakan komponen-komponen yang terintegrasi ke dalam satu software sehingga memudahkan pengembangan untuk fokus pada pekerjaan pengembangan software. Jika pada beberapa waktu yang lalu saya sudah membahas penggunaan Vim sebagai IDE dari Go, sekarang ini saya akan membahas IDE lainnya yang saya pikir mempunyai fitur bagus dan merupakan software bebas.

Pada dasarnya ada beberapa IDE yang bisa digunakan selain Vim. LiteIDE X dibuat oleh visualfc dan tersedia dalam bentuk source code maupun binary:

Source code:
Binary:
Jika akan men-download versi binary, ada 2 kategori yang bisa dipilih yaitu LiteIDE X dan LiteIDE X + WebKit. Jenis kedua diperlukan jika kita akan menggunakan LiteIDE X untuk membuat file-file Markdown (.md).

Instalasi

Instalasi di Linux sangat mudah, hanya tinggal mengekstrak file yang kita download (saat ini versi terakhir adalah versi X17) pada suatu direktori dan jika ingin menjalankan cukup dengan mengeksekusi file $LITEIDEX_HOME/bin/liteide (cd $LITEIDEX_HOME/bin; ./liteide &):



Konfigurasi GOPATH

Saat pertama kali menggunakan software ini, GOPATH akan ditentukan berada di $GOROOT (di tempat saya: /home/bpdp/software/go). Konfigurasi ini disebut system GOPATH. Kita bisa menambahkan konfigurasi Custom GOPATH dengan memilih menu berikut:


Setelah itu akan muncul dialog untuk mengisikan Custome GOPATH, isikan direktori tempat kita membuat proyek software:



Membuat Proyek

Untuk membuat proyek baru, pilih menu File - New... akan muncul dialog berikut:


Pada Name, isikan nama proyek. Nama ini akan menjadi file executable jika kita akan membuat proyek yang berjenis Command Project. Ada beberapa pilihan disini:
  1. Empty File: file kosong
  2. Go Source File: Source code aplikasi Go kita
  3. LUA: untuk bahasa pemrograman Lua (seharusnya Lua, bukan LUA).
  4. Markdown File: membuat file .md (biasanya README.md atau dokumentasi-dokumentasi dibuat dalam format ini).
  5. Command Project: menghasilkan executable binary file, jika tanpa GOPATH, kita bisa memilih di direktori mana saja
  6. Package Project: menghasilkan pustaka
Untuk pertama ini, kita buat Command Project pada GOPATH, isikan nama, kemudian klik OK, akan muncul:


Pilih Yes untuk mengaktifkan proyek baru kita. Saat proyek di-load, ada beberapa file yang dibuatkan oleh LiteIDE X:


Jika ingin melihat struktur dari file yang kita edit, kita bisa melihat ke Outline di sebelah kanan:



Mengkompilasi dan Menjalankan

Program yang kita buat dijalankan dengan menggunakan Ctrl-R atau menu berikut:



Hasilnya ada pada Build Output sebagai berikut:


Code Completion

Dengan menginstall dan menjalankan gocode (https://github.com/nsf/gocode), maka kita bisa menggunakan code completion di LiteIDE X. Gocode merupakan daemon, artinya program yang berjalan di latar belakang. Ikuti instalasinya di URL tersebut setelah itu, aktifkan sebelum masuk ke LiteIDE X. Tanpa konfigurasi, code completion akan langsung berfungsi (lihat juga artikel saya http://bpdp.blogspot.com/2013/04/menggunakan-vim-sebagai-ide-go.html sebelumnya yang membahas instalasi gocode).


Sebenarnya masih banyak fasilitas lain, tetapi untuk permulaan uraian ini saya pikir mencukupi. Saya akan menambahkan beberapa kelengkapan lagi di posting-posting berikutnya.

Happy hacking!
















Best Practices untuk Organisasi Direktori Proyek Go di Github / BitBucket / Assembla / etc


Saat sudah membuat proyek pengembangan software menggunakan Go dan akan dipublikasikan ke server penyedia repository Git (seperti github.com, bitbucket.org, atau assembla.com), kita harus menentukan struktur direktori yang baik dari proyek kita. Berdasarkan panduan dari How to Write Go Code (http://golang.org/doc/code.html), tiap proyek kita bagi menjadi beberapa direktori:
  1. src: berisi source code
  2. pkg: berisi paket object code yang telah dikompilasi (pustaka)
  3. bin: binary executable
Jika untuk diri sendiri, barangkali ini sudah selesai. Jika proyek akan kita publikasikan ke git repo, struktur akan sangat berpengaruh. Initialisasi git seharusnya tidak dilakukan di $GOPATH, tetapi di src/. Perhatikan, pada contoh berikut ini $GOPATH adalah root directory dari proyek tempat file test.go berada:


Saya sudah mempunyai account github, dan root directory saya di github adalah http://github.com/bpdp, dengan demikian, saat membuat proyek, misalnya namanya adalah goarangodb, maka proyek tersebut akan berada di http://github.com/bpdp/goarangodb. Untuk kasus seperti ini, source code dari proyek kita sebaiknya diletakkan di $GOPATH/src/github.com/bpdp/goarangodb, sekaligus goarangodb menjadi nama paket. Inisialisasi git dilakukan di direktori $GOPATH/src/github.com/bpdp/goarangodb.

Mengapa harus demikian? Pada saat melakukan go get http://github.com/bpdp/goarangodb, artiffak dari proyek tersebut (source code, README, dll) akan diletakkan di direktori $GOPATH/src/github.com/bpdp/goarangodb. Dengan demikian, kita sebagai pengembang akan mempunyai situasi yang sama dengan deevloper yang meng - go get proyek kita.


April 22, 2013

Menggunakan Vim Sebagai IDE Go


Untuk menggunakan Vim (http://www.vim.org), ada plugin utama serta berbagai plugin pendukung yang bisa digunakan. Sebaiknya, menggunakan pathogen untuk mempermudah pengelolaan berbagai plugin tersebut. Bagian ini akan menjelaskan berbagai konfigurasi serta instalasi yang diperlukan sehingga Vim bisa menjadi peranti untuk pengembangan aplikasi menggunakan Go.

Instalasi dan Konfigurasi Pathogen 

Pathogen adalah plugin dari Tim Pope yang digunakan untuk mempermudah pengelolaan plugin. Kode sumber dari Pathogen bisa diperoleh di   https://github.com/tpope/vim-pathogen . Untuk instalasi, ikuti langkah berikut:

$ cd
$ mkdir .vim/autoload
$ mkdir .vim/bundle
$ cd .vim/autoload
$ wget https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
-2013-04-17 22:39:09--  https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
Resolving raw.github.com (raw.github.com)... 199.27.75.133
Connecting to raw.github.com (raw.github.com)|199.27.75.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11730 (11K) [text/plain]
Saving to: ‘pathogen.vim’
100===================================================>] 11,730      50.3KB/s   in 0.2s

2013-04-17 22:39:11 (50.3 KB/s) - ‘pathogen.vim’ saved [11730/11730]
$ ls -la
total 20
drwxr-xr-x 2 bpdp bpdp  4096 Apr 17 22:39 .
drwxr-xr-x 5 bpdp bpdp  4096 Apr 17 22:21 ..
-rw-r--r-- 1 bpdp bpdp 11730 Apr 17 22:39 pathogen.vim
$

Setelah itu, untuk menggunakan Pathogen, letakkan aktivasinya di $HOME/.vimrc atau di $HOME/.vim/vimrc (saya piliah lokasi yang kedua) sebagai berikut:

execute pathogen#infect()

Setelah itu, semua plugin tinggal kita ambil dari repository (bisa dari github, bitbucket, dan lain-lain) langsung di-copy satu direktori ke direktori $HOME/.vim/bundle.

Instalasi dan Kofigurasi Plugin Golang dan Plugin Pendukung 

Setelah selesai melakukan instalasi Pathogen, berbagai plugin yang diperlukan bisa diambil langsung dari Internet. Berikut ini adalah daftar yang digunakan penulis:
  1. Colorschemes: untuk tema warna dari Vim. Bisa diperoleh di https://github.com/flazz/vim-colorschemes 
  2. Nerdtree: untuk menampilkan file-file dalam struktur pohon di sebelah kiri sehingga memudahkan navigasi. Bisa diperoleh di https://github.com/scrooloose/nerdtree 
  3. Golang: plugin utama agar Vim mengenali kode sumber Go. Bisa diperoleh di:https://github.com/jnwhiteh/vim-golang.git 
Cara instalasi:

$ cd
$ cd .vim/bundle
$ git clone

Hasil dari menjalankan ``vim'' atau ``gvim'' melalui shell untuk menulis kode sumber Go bisa dilihat pada gambar berikut:


Autocompletion 

Vim menyediakan fasilitas autocompletion melalui Omniautocompletion. Fasilitas ini sudah terinstall saat kita menginstall Vim. Untuk mengaktifkan fasilitas ini untuk keperluan Go, kita harus menginstall dan mengaktifkan Gocode (https://github.com/nsf/gocode). Sebaiknya kode sumber dari Gocode diambil semua karena ada script Vim yang akan kita gunakan:

$ git clone https://github.com/nsf/gocode.git
Cloning into 'gocode'...
remote: Counting objects: 2491, done.
remote: Compressing objects: 100remote: Total 2491 (delta 1323), reused 2449 (delta 1295)
Receiving objects: 100Resolving deltas: 100

Setelah itu, install Gocode menggunakan perintah go get -u github.com/nsf/gocode. Hasilnya adalah file executable binary $GOROOT/bin/gocode. Sebelum menggunakan Vim, aktifkan dulu gocode dengan mengeksekusi gocode melalui shell. Setelah itu, tambahkan satu baris di $HOME/.vim/vimrc: set ofu=syntaxcomplete#Complete di bawah baris filetype plugin indent on.
Kode sumber lengkap dari $HOME/.vim/vimrc yang penulis gunakan bisa dilihat pada Listing berikut:

execute pathogen#infect()
syntax on
filetype plugin indent on
set ofu=syntaxcomplete#Complete
if has("gui_running")
  colorscheme asma  nian_blood
else
  colorscheme slate
endif
set smartindent
set tabstop=2
set shiftwidth=2
set expandtab
autocmd vimenter * NERDTree
autocmd vimenter * if !argc() | NERDTree | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
let g:NERDTreeDirArrows=0
let g:cssColorVimDoNotMessMyUpdatetime = 1
set guifont=Liberation\ Mono\ 11
set number
set numberwidth=4
set cpoptions+=n
highlight LineNr term=bold cterm=NONE ctermfg=DarkGrey ctermbg=NONE gui=NONE guifg=DarkGrey guibg=NONE
set grepprg=grep\ -nH\ $*

Untuk mengaktifkan completion, kita harus masuk ke mode Insert dari Vim, setelah itu tekan Ctrl-X, Ctrl-O secara cepat. Hasil autocompletion bisa dilihat di gambar berikut:



Go + REST Client Untuk Mengakses URL Dengan Respon JSON Dinamis

REST merupakan pola arsitektur aplikasi yang memanfaatkan HTTP untuk mengeksploitasi layanan / services serta method dari HTTP (GET, POST, DELETE, dll) untuk berkomunikasi antara klien dengan server. REST merupakan hasil disertasi dari Roy T. Fielding, bisa dibaca lengkap di http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm. Enaknya menggunakan REST adalah kemudahan interoperabilitas data maupun layanan serta. Hal ini juga berlaku ke banyak basis data NOSQL yang biasanya menyertakan REST API sehingga implementasi driver bisa dengan mudah dibuat tanpa akses low level networking seperti halnya masa-masa pra REST. 

Go juga menyediakan akses yang cukup lengkap untuk keperluan HTTP client ini, meskipun masih tetap diperlukan thin layer untuk wrapper guna mempermudah akses ini. Jika memang tidak akan membuat wrapper, bisa menggunakan berbagai pustaka REST yang tersedia. Pada tulisan ini, saya akan menggunakan pustaka restclient (https://github.com/jmcvetta/restclient) yang dibuat oleh Jason McVetta (https://github.com/jmcvetta). 

Basis data NOSQL biasanya mempunyai fitur horizontal scalability yang memungkinkan setiap dokumen (dalam SQL bisa disamakan dengan record / row) bisa mempunyai komponen yang berbeda-beda dan scalable. Salah satu contoh yang akan saya bahas disini adalah ArangoDB (http://www.arangodb.org). ArangoDB menyediakan REST API yang dijelaskan dengan lengkap disini: http://www.arangodb.org/manuals/current/ImplementorManual.html. Untuk tulisan ini, saya akan memberikan contoh http://server:port/_api/document untuk mengambil data dokumen. Sintaks lengkap dari API ini adalah:


GET /_api/document/document-handle


Jika hasilnya bisa diprediksi, dalam artian, kita mengetahui struktur data yang akan diambil, maka struktur itu bisa kita definisikan menggunakan struct, tetapi tentu saja ini hanya pada kondisi tertentu saja. Kebanyakan, jika kita akan mengakses dokumen, fitur skalabilitas horizontal menyebabkan tiap dokumen mempunyai isi yang berbeda-beda. Jadi bisa dikatakan bahwa strukturnya berupa JSON yang dinamis. Bagaimana mengelola ini menggunakan Go?

Jika menemui kasus seperti ini, maka kita bisa mendeskripsikan isi yang akan kita akses tersebut menggunakan map[string]string. Berikut adalah program yang saya gunakan untuk mengakses dokumen di ArangoDB:

akses-doc-arangodb.go

package main
import (
  "fmt"
  "github.com/jmcvetta/restclient"
)
func main() {
  var jml int
  var s map[string]string
  r := restclient.RequestResponse{
    Url:    "http://localhost:8529/_api/document/_users/1736896",
    Method: restclient.GET,
    Data:   "",
    Result: &s,
  }
  _, err := restclient.Do(&r)
  if err != nil {
    panic(err)
  }
  jml = len(s)
  fmt.Printf("Jumlah komponen = %d\n", jml)
  fmt.Print(s)
  fmt.Println("\nUser = ", s["user"])
}

Hasilnya adalah sebagai berikut:

Jumlah komponen = 6
map[_rev:1736896 _key:1736896 active: user:root _id:_users/1736896 password:$1$0cc26832$d582f08ab0898d7d1ab2a18e221d7dc1a2ea93ff80a093678a566fae35bbfc60]
User =  root

Jadi, sekarang waktunya ancang-ancang untuk membuat driver ArangoDB untuk Go menggunakan REST API yang disediiakan ArangoDB. Stay tune!



April 19, 2013

Go for Web Application: Template and jQuery Integration

In this article I will explain about using Go to develop web application together with template and jQuery integration. Develop a web server is a trivial task in Go. Interestingly, Go which initially meant to ease the development of server software has lots of standard libraries for that purpose. Web server is not the only one, although we will explore this capability now. Before we continue, make sure that you already have jQuery (I use jquery-ui 1.9.1) and of course Go (1.0.3). For now, we do not need template engine since Go comes with html/template package. That's enough for now.

Ok, let me give an overview first. We will develop a simple Web application. Our application (let's say its name is go-jquery-example) will read the template, put a string inside the template and display the template. Wait, that's not quite complex, we will add jQuery into that page so in the future we may develop a Web application with good UI. To this end we should make a static file explorer into our Web application so that we can place jQuery into the template (like /js/jquery-ui.js).

Let's see the directory structure first.



  • assets: this directory will be used to serve static files. It consists of css (all CSS files), img (all image files), and js (all javascript files). We put jQuery into that directory.
  • gojquery.go: our main application. 
  • templates: this directory will serve all template files.
default.tpl


gojquery.go

package main

import (
 "html/template"
 "log"
 "net/http"
)

// this handler will be executed when we use web client 
// to access http://server/display
func handler(w http.ResponseWriter, req *http.Request) {

  // read the whole template
  t, err := template.ParseFiles("templates/default.tpl")

  if err != nil {
    log.Fatal(err)
  }

  // The person's name struct which will be substituted 
  // into the template
  type Person struct {
    Name string
  }

  // put the person name here
  p := Person{Name: "bpdp"}

  // put the name into the template and populate the view
  // w is the response which will be sent to web client
  t.Execute(w, p)

}

func main() {

  // assign the handler (http://server/display)
  http.HandleFunc("/display", handler)

  // put assets dir to serve static files (see dir structure below)
  http.Handle("/", http.FileServer(http.Dir("assets/")))

  // put web server to work, port 8123
  http.ListenAndServe(":8123", nil)
}

Now, to run this Web application, go to the root directory where gojquery.go reside, and run the application:

go run gojquery.go

Try access http://server:8123/ and http://server:8123/display to see the result.

Full source code available at https://github.com/bpdp/go-jquery-example. Enjoy!

April 08, 2013

Wifi Configuration for Lenovo G480 on Arch Linux

This tip probably trivial, but if you have problems in wifi connection to WAP (Wireless Access Point) using Lenovo G480 laptop, then probably this tip should make your laptop sane. Note that wifi configuration has been successfully identified at install time and modules perfectly loaded without user intervention using brcmsmac and its dependencies. The problem is on the result of this driver. In my laptop, I found that wifi connection is very unstable.

I went to Arch Linux wiki and AUR (as always), then checked the https://wiki.archlinux.org/index.php/Broadcom_wireless page, then I realized that this unstable connection problem came from the driver. So I tried broadcom-wl driver from AUR. Just do this:

# yaourt -S broadcom-wl

and wifi connection work very stable after the next reboot without configuration. This package put a configuration file at /etc/modprobe.d/broadcom-wl.conf. It consists of:

$ cat /etc/modprobe.d/broadcom-wl.conf 
blacklist b43
blacklist bcma
blacklist ssb
$

Note: If you don't use Arch Linux, grab the driver and compile it for your own distribution: http://www.broadcom.com/support/802.11/linux_sta.php