Posts for: #Golang

bolt

記錄一下一些好用 golang library

blot 是一個純 golang 以簡單為美開發的 key value 資料庫,後來會用他,是因為一開始要存非常簡單的資料

想說就用 sqlite 來存就好了,反正欄位很少,資料結構簡單,開發環境是 Mac ,目標環境是 Linux ,部署的流程

就用 python 的 fabric 簡化,本地端編譯完 linux/amd64 的程式,複製到遠端 Linux,可是 github.com/mattn/go-sqlite3 有用到

CGO ,在 Mac 上面必須要用 gcc for linux 來編譯,編譯完後,到了目標機器上面又有 glibc 版本的問題,覺得這樣很花時間

不方便,另外就是 CGO 的編譯速度沒有很帥氣,立馬就決定找一個不依賴 CGO 的 key value store,目前覺得蠻合用了,這個專案的頁面的第一句話

就說服我了(我也太沒原則了吧) “Simple is the new beautiful.”

https://github.com/boltdb/bolt

使用簡單,由於我的 server  主要還是用簡單 JSON 格式,所以就先不用 gob 來 Encode 資料


// Example for bolt
package main

import (
“encoding/json”
“fmt”

“github.com/boltdb/bolt”
)

var (
db *bolt.DB
dbpath = “./user.db”
userbucket = []byte(“users”)
)

func main() {

db, _ = bolt.Open(dbpath, 0644, nil)

key := []byte(“unique_key_here”)
var value = struct {
Name string
Title string
}{“Somebody”, “Gopher”}

fmt.Println(key, value)

// in write transaction
err := db.Update(func(tx *bolt.Tx) error {
bucket, err := tx.CreateBucketIfNotExists(userbucket)
if err != nil {
return err
}
data, err := json.Marshal(value)

fmt.Println(“Please remember handle the error”, err)

if err == nil {
bucket.Put(key, data)
}

return nil
})

fmt.Println(err)
// in read
db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket(userbucket)
if bucket != nil {
// if have a struct to restore it
//json.Unmarshal(bucket.Get([]byte(key)), &user)
fmt.Println(bucket.Get(key))
}

return nil
})

}


Golang Web 好色開發

現在由於 Single Page Application 盛行,還有多平台的介接,在後端常簡化成只有開發

Api 的方式來使用,用 Golang 的標準函式,幾乎就可以解決了,有時候偷懶一下,或是想試一下其他開發的想法,及函式庫

在一般的開發情境下,我們可以用 gin 或是 fresh

來做類似 server 端 live reload ,開發完成後,就用 gox 編譯目標平台的執行程式,有了這一個 vim-go 的 Vim plugin 後,在
Vim 裡,就像是用 IDE 開發一樣,不用再打 import 了

fresh 的 terminal 訊息處理,有顏色,我很不爭氣的就用 fresh


另外,Golang 除了強大的標準函式庫,立即(即戰力呀,鄉親) 可以做 Api server 的開發外,還有很多小而美的框架,或是小函式可以用

mux

https://github.com/bmizerany/pat 簡單至極的 router Mutex,可能你直接看 source code 比看文件快

https://github.com/julienschmidt/httprouter

https://github.com/jadekler/git-go-websiteskeleton Skeleton example

mini framework

有 Martini https://github.com/go-martini/martini Magic King, Express.js like

作者為了中和平反一下 gopher 的意見,另外寫了 Negroni Express.js like

gin-gonic 算是簡化版的 martini 然後再把 inject 的魔法拿掉,效能提昇很多

最早開始的,gorilla http://www.gorillatoolkit.org/ 很多人,就是用他的 mux 和 session module 來用算是小而美的代表作,喜歡,金剛,首選

https://github.com/rcrowley/go-tigertonic tiny, small

https://github.com/zenazn/goji

http://fitstar.github.io/falcore/ pipeline king

https://github.com/gocraft/web

https://github.com/pilu/traffic fresh 的作者寫的

另外還有幾個比較大,且完整的框架,比較像是一條龍的框架,beegorevel

因為,個人掌握度沒到位,所以就只有停在,見習別人程式的階段,另外,也是覺得太大一包,怕吞下去會消化不良,其他還有很多

最後,很不爭氣把其中一個專案試用一下 Goji 了,因為他 terminal 有顏色,這其實還蠻自我矛盾的,有 GUI 的時候,覺得效率不好
喜歡用 terminal,有了 terminal 了以後,對這一種,有顏色的工具,或像是 yeoman 之類,還有可愛的 Mascot 的工具毫無招架之力

fresh



Goji


Yeoman



PS: 這一篇,充滿個人喜好,超不專業,大家要玩的開心最重要

Upass 誕生

Upass

什麼樣的軟體都會有需求,這是一個針對電子資源使用者設計的

Proxy Server ,因應越來越多的電子資源,及電子書的產生,目前這些廠商大多還是用

IP 限制的保護方式,來保護著作權,所以在使用上,如果沒有在 IP 的範圍內,就沒有辦法

取閱這一些電子資源,尤其,像是學術單位,政府機關,或是研究單位,通常訂閱了許多的電子資源

目前一般的開放的解法,就是裝 Squid ,或是其他 Open source 的 Proxy,但是管理,

沒有這麼方便,或是使用上比較沒有彈性,或是使用商用的 Porxy 軟體,像是 OCLC 的 EZproxy

但是報價非常驚人,所以小弟的朋友做了 Upass ,一個符合 Proxy 標準的商業 Proxy 實作,價格會比 EZproxy 來得實惠很多,不是用修改頁面 URL 的方式

有需求的可以參考,不用再忍受 EZproxy 高額的商業授權,及額外的更新訂購費用,一個不同於 EZproxy 的替代方案


and yes, Upass is written in Golang.

PS: 另外徵求代理商中
目前支援 GNU/Linux ,Unix Like 系統,單純 binary 安裝非常簡單

說點輕鬆一點的 Golang 之 go


最近,有個小玩具,用 Golang 來實作

覺得用來寫網路服務,渾然天成,很直覺,超自然的

尤其覺得 Golang 裡的 goroutines 和 channel 的合作無間

想起以前,寫 process 及 threading 有點相見恨晚

語法 go 更是有趣,我把它翻譯成 去吧 ,可以讓你自己決定,哪些工
去吧 衝呀 的感覺

go DoSomething()

有夠直白,寫高併發應用,有種千軍萬馬期發的感覺

寫起來,還蠻有趣的喔

你 go 了嗎?

Martini

Martini Demo from Martini on Vimeo.


http://golang.tw/ 上面的分享看到

https://github.com/codegangsta/martini 這寫的太漂亮了吧

和 express.js 有異曲同工之趣,強烈建議,要賞 code 一下,初步,還有很多 middleware 需要有,不過,畢竟他這一個專案,非常的年輕,已經不錯了

順便來一杯


PS: 未成年請勿飲酒,喝酒不開車,開車不喝酒

Yes GOLANG 1.1 is released


經過近一年的淬練,相信 golang 又向前跨了一步

除了一些小小的改變,這一次很大的亮點,就是效能的提升,以及對 arm 的支援( 原本的就有支援,這一次正式 release 版本的支援更好)
這時候推荐您來玩玩,已經不能算是嘗新了

好兵器,不收嗎?

參考資源

http://blog.golang.org/2013/05/go-11-is-released.html 發佈頁

https://code.google.com/p/go/downloads/list 下載頁面

go get like npm

Go 下面想要安裝套件,可以像是用 node.jsnpm 安裝不加 global 的參數,做本地端的安裝嗎?

建立 shell script gopm 放在您的 $PATH 中的路徑

#!/bin/bash
# Uasge:
# gopm get some package from github
# gopm run yourmain.go
OLDGOPATH="$GOPATH"
export GOPATH=$PWD
go $*
export GOPATH="$OLDGOPATH"

或是都是在本地端開發,不太在意覆蓋原本的 GOPATH,直接像是加在 .bashrc 的環境裡

alias gopm=‘export GOPATH=pwd && go’

只要用 GOPATH 這一個環境變數,就可以達到了,所以這樣設定以後,執行的時候,就會用目前的資料夾當作,GOPATH ,套件也就都會安裝在執行時的目錄

執行程式測試的時候也一樣,假設叫 gopm ,就用 gopm run yourmain.go 就可以了

安裝需要的套件和 go get 一樣,例如在所在專案路徑安裝所有相依套件,原本打

go get

會裝到 GOROOT 路徑下

換成打

gopm get

因為加了目前專案路徑($PWD)為 GOPATH ,所以安裝到目前的資料夾下


PS: gopm 只是我自己隨便取的,文件及 source code 裡是有提到,不可以和 GOROOT 同一個資料夾,不過這不是廢話嗎 XD
UPDATE: 在 mail list 上面當小白後,GOPATH 不要去覆蓋他,會影響到整的 GO 環境 build 變數,以我目前的了解會用暫時覆蓋的方式,有比較好的方式再來更新