Mei 15, 2013

IDE dan Pengajaran Pemrograman


Tulisan ini berangkat dari pengalaman saya mengajar pemrograman selama bertahun-tahun (kurang lebih sekitar 13 tahun). Pemrograman memang sering menjadi momok bagi mahasiswa Informatika. Cukup menggelikan, karena kalau tidak mau bertemu dengan pemrograman seharusnya mahasiswa tidak masuk ke Informatika, but you know ...

Selama bertahun-tahun, barangkali para mahasiswa saya mengenal saya sebagai dosen yang "kejam" dalam hal mengajarkan semua hal yang terkait dengan pemrograman. Alasannya apa, akan saya uraikan nanti. Saya sebenarnya prihatin dengan kondisi kemampuan mahasiswa serta rekan-rekan akademisi yang sering menggunakan IDE (Integrated Development Environment) dalam proses pengajaran. Saya tidak anti software IDE karena saya sendiri juga menggunakan software-software tersebut, yang akan saya uraikan disini adalah IDE seharusnya tidak digunakan dalam proses pendidikan.

IDE merupakan software yang mengintegrasikan berbagai macam tools untuk pengembangan software. IDE merupakan software besar monolothic (hence, against UNIX philosophy), biasanya secara minimal akan berisi editor (untuk menulis source code), user interface designer, help / documentation, refactoring tool, build system, debugger, compiler / interpreter, class browser, profiler, dan project management. Mempelajari IDE memerlukan waktu dan biasanya mahasiswa tidak akan memahami sampai dalam.

Saat mengajar, saya memang cenderung keras: saya selalu memakai Linux dan tidak suka melihat para mahasiswa menggunakan IDE. Mahasiswa selalu saya paksa menggunakan text editor biasa (karena kebanyakan memakai Windows, mereka saya suruh memakai NotePad, NotePad++, TextPad, atau yang ngepet-ngepet lainnya). Ketidaksukaan saya terhadap penggunakan IDE ini dilatarbelakangi oleh beberapa alasan:

  1. IDE mengotomatiskan banyak proses yang seharusnya dipahami oleh seseorang yang belajar pemrograman. Ini akan menyebabkan mahasiswa tidak mau memperhatikan internal working, algoritma, optimasi, dan lain-lain. Pernahkah anda menanyakan arti dari build.xml ke mahasiswa yang biasa menggunakan NetBeans? Lihat jawaban mereka. :)
  2. IDE membuat mahasiswa menjadi manja dan cenderung tergantung dengan IDE. Jadi kalau pakai Text Editor biasa, mahasiswa tidak tergantung? ya tetap tergantung, namanya juga menggunakan komputer, mereka harus tergantung pada komputer. Yang saya maksud disini adalah penggunaan IDE tanpa pemahaman konsepsual yang kuat terhadap algoritma dan proses rekayaasa software akan membuat mereka tidak bisa apa-apa saat IDE tersebut tidak ada di komputer.
  3. IDE sering membuat mahasiswa berpikir menurut IDE tersebut, sehingga jika di industri mereka bekerja menggunakan IDE yang lain, tentu akan memerlukan investasi waktu yang signifikan untuk hal tersebut. Cobalah menyuruh mahasiswa yang menggunakan NetBeans untuk berpindah ke Eclipse (standar JSE) jika ingin menguji :). 


IDE biasanya memang digunakan di industri pengembangan software, oleh sebab itu, dalam proses pendidikan seharusnya penggunaan IDE dilarang, tetapi menjelang kelulusan harus ada workshop penggunaan IDE. Saya yakin, jika ini dikerjakan, para mahasiswa yang mendapatkan workshop itu akan mengatakan "nah, lha ini gampang ternyata menggunakan NetBeans untuk proses refactoring". Tidak akan ada lagi (atau kalaupun ada, semoga minimal) mahasiswa yang hobi menggunakan NetBeans, pada saat wawancara kerja ditanyakan "Refactoring itu apa?" dan si mahasiswa hanya diam tidak bisa menjawab, sementara dia sering menggunakan fasilitas itu secara "tidak sadar".

Tantangannya? sederhana: kemampuan SDM (dosen terutama). This one I can not be sure ...

Mei 09, 2013

Add MIME types into LiteIDE editor

This is just simply a note to myself. LiteIDE uses some text files for its configuration. Using View - Options menu, one can update LiteIDE configuration, but not all of its configurations can be changed this way. One example is the MIME types. I use "*.tpl" for my template file's pattern. This extension file name is not exist in MIME Types from View - Options - LiteEditor - File Types menu, so this kind of file is render as a plain text file without syntax coloring while I want them to be rendered as HTML file. You know how painful it is, right?

LiteIDE uses a file to configure file types. It resides in $LITEIDE_HOME//share/liteide/liteapp/mimetype. The file is liteeditor.xml. Change that file:



Very simple indeed. A very nice and good IDE for Go (and Lua also). :)

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

Maret 29, 2013

Idiomatic Programming


Salah satu hal yang menghambat orang untuk belajar adalah banyaknya istilah-istilah yang membingungkan. Semua domain pengetahuan biasanya memang mempunyai istilah-istilah sendiri dan meskipun ada satu istilah yang muncul di lebih dari satu domain pengetahuan, pengertiannya seringkali tidak sama sehingga pemahaman tentang istilah bersifat context-dependent (harus dilihat konteksnya). 

Memplejari pemrograman juga kurang lebih harus memahami berbagai macam istilah yang muncul. Kali ini saya akan menjelaskan sedikit tentang istilah "idiomatic programming". Jika anda sering membaca milis, newsgroup, atau berbagai macam resources di Internet, terutama yang terkait dengan pemrograman, barangkali akan sering mendengar istilah-istilah berikut:
  • Idiomatic Clojure
  • Idiomatic Go
  • Idiomatic C++
Saya petikkan berbagai pertanyaan (dalam Bahasa Inggris) di berbagai sumber di Internet terkait dengan hal ini:
Jawaban-jawaban dari pertanyaan tersebut tidak penting untuk tulisan ini, yang penting adalah pengertian dari "Idiomatic Clojure", "idiomatic way to ..... in Go". 

Kata "idiom" di luar konteks pemrograman digunakan untuk menunjukkan "bahasa yang khusus untuk suatu komunitas, orang, wilayah, atau kelas" (diambil dari http://www.merriam-webster.com/dictionary/idiom - ada beberapa arti lain yang mirip). Dalam konteks bahasa pemrograman, kata "idiom" sebenarnya mirip dengan hal-hal seperti itu. Jika kita membicarakan "Idiomatic Go" maka kita akan membicarakan pola / patterns yang dianggap baik untuk menyelesaikan masalah dengan sintaks dan semantik dari Go. Demikian juga jika menggunakan "Idiomatic Clojure", yaitu menunjukkan cara pemecahan masalah pemrograman yang baik dan sesuai dengan pola yang digunakan oleh para pemrogram Clojure. Ingat, seringkali ada banyak cara untuk melakukan suatu hal menggunakan suatu bahasa pemrograman tertentu. Bisa saja kode sumber kita betul dan menghasilkan sesuatu yang benar sesuai tujuan pembuatan program, tetapi tidak "idiomatic". Jadi, berbicara tentang hal ini sama saja berbicara tentang optimasi kode sumber. 

Dari mana mengetahui "Idiomatic Programming"? Tidak mudah memang. Yang jelas, jika ingin mempejari dari buku-buku, carilah buku atau dokumentasi semacam "Effective Java" (http://www.oracle.com/technetwork/java/effectivejava-136174.html), "Effective Go" (http://golang.org/doc/effective_go.html), atau berbagai macam buku tentang design patterns sertaprogramming patterns. Latihan serta bergaul dengan fellow programmers di seluruh dunia juga akan sangat membantu kita untuk memahami "Idiomatic Programming".