Tampilkan postingan dengan label Go. Tampilkan semua postingan
Tampilkan postingan dengan label Go. Tampilkan semua postingan

Februari 20, 2016

Multiple Go versions in Linux

Currently, there are trends on software development that tend to release their SDK on regular basis. Rust for example, also Go with 6 month release cycle. This predictable release is good and I personally like it since I can predict on features availability and use them for my software development project. The downside of this approach is there are many versions availablle that install them using OS package manager is proved to be pain in the ass.

Some of developers then create tools to manage multiple versions of the SDK, see GVM (Go Version Manager) and multirust (for Rust) for example. They are good of course but I probably choose not to use them since probably someday they won't be developed (see the latest commit if you want). My approach is simpler but only for Linux with Bash. If you use Windows, you may adopt my approach using SET to setup env variables and put them in batch file (.BAT). Explanation follows.

Directory Setup

I put all of my Go related software inside /opt/software/go-dev-tools. Here's the structure:


Directory Contents

I put Go SDK inside go, all Go related tools inside go-tools, liteide for LiteIDE, and tmp for temporary pkg dir whenever I want to compile and put Go tools inside go-tools.

Inside go-version (go1.2.2, go1.3.3, etc), I extract all of downloaded SDK from Go download page.

Environment Variables

In my $HOME/env dir, I created go directory to manage environment variables for my Go version. They usually have the same env variables, except for version pre 1.5, 1.5 (for vendor experimentation) and  1.6.

Pre 1.5 and > 1.6

$ cat ~/env/go/go1.2.2
GODEVTOOLS_HOME=/opt/software/go-dev-tools

GO_HOME=$GODEVTOOLS_HOME/go/go1.2.2
LITEIDE_HOME=$GODEVTOOLS_HOME/liteide
GOTOOLS=$GODEVTOOLS_HOME/go-tools

export GOROOT=$GO_HOME
export GOOS=linux
export GOARCH=amd64
export GOHOSTOS=linux
export GOHOSTARCH=amd64
export GOBIN=$GOROOT/bin

export PATH=$PATH:$GO_HOME/bin:$LITEIDE_HOME/bin:$GOTOOLS

alias go=colorgo$

1.5

$ cat ~/env/go/go1.5.3
GODEVTOOLS_HOME=/opt/software/go-dev-tools

GO_HOME=$GODEVTOOLS_HOME/go/go1.5.3
LITEIDE_HOME=$GODEVTOOLS_HOME/liteide
GOTOOLS=$GODEVTOOLS_HOME/go-tools

export GOROOT=$GO_HOME
export GOOS=linux
export GOARCH=amd64
export GOHOSTOS=linux
export GOHOSTARCH=amd64
export GOBIN=$GOROOT/bin

export PATH=$PATH:$GO_HOME/bin:$LITEIDE_HOME/bin:$GOTOOLS

alias go=colorgo

export GO15VENDOREXPERIMENT=1
$

Usage 
Open new shell - terminal, and source environment variables:

$ source env/go/go1.2.2
11:25:22-bpdp@archer:~$ go version
go version go1.2.2 linux/amd64
11:25:25-bpdp@archer:~$

Open another new shell - terminal, and source env vars:

$ source env/go/go1.6.0
11:25:59-bpdp@archer:~$ go version
go version go1.6 linux/amd64
11:26:01-bpdp@archer:~$

and so on.

Go Tools

When you see something interesting for your Go project, just go to /opt/software/go-dev-tools/tmp and the Go get them and copy the files inside /opt/software/go-dev-tools/go-tools:

$ cd /opt/software/go-dev-tools/tmp/
$ export GOPATH=`pwd`
$ go get github.com/smartystreets/goconvey
$ mv ../go/go1.6/bin/goconvey ../go-tools/
$ which goconvey
/opt/software/go-dev-tools/go-tools/goconvey
$

I don't know whether my approach is the best, but it proves to be comfortable for me. As always, YMMV. Happy hacking!












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 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!

















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!