[Golang]透過brew來做Golang的版本切換

前言: 本來想在Mac OSX上面使用gvm來管理Golang 的版本切換,主要是因為想切到 Go 1.5 beta來玩玩新東西. 不過昨天去GTG聚會之後,學到brew switch之後,覺得整個很威啊… 這裏把幾個筆記記錄一下: ###指令集: 使用brew安裝Golang //把brew的fomulae更新到最新版本 sudo brew update //使用brew安裝Go brew install go 更新版本 //拿目前最新版本 Go 1.5 beta3 舉例 brew upgrade go -v=1.5beta3 --devel //注意.. 就的版本 Go 1.4.2 不會從你的brew位置移除 //可以查詢 brew info go: //目前系統有安裝兩個版本.... 使用的是1.4.2 go: stable 1.4.2 (bottled), devel 1.5beta3, HEAD Go programming environment https://golang.org /usr/local/Cellar/go/1.4.2 (4584 files, 276M) * Poured from bottle /usr/local/Cellar/go/1.5beta3 (5357 files, 277M) Built from source From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/go.rb 切換版本 //使用brew switch來切換 brew switch go 1.5beta3 //螢幕顯示 Cleaning /usr/local/Cellar/go/1.2.1 Cleaning /usr/local/Cellar/go/1.4.2 Cleaning /usr/local/Cellar/go/1.5beta3 3 links created for /usr/local/Cellar/go/1.5beta3 //如此就可以切換.... 不過檔案不會移除 反安裝版本 //使用brew uninstall brew uninstall go //只會移除目前使用的版本... 不過由於原本目錄沒有指向新的,所以功能都無法使用 //將目前使用的版本切換到 1.4.2 brew switch go 1.4.2 可能會發生的錯誤 切換Go版本,然後跑go build可能會發生以下的錯誤: package . imports runtime: C source files not allowed when not using cgo or SWIG: atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_darwin.c mfixalloc.c mgc0.c mheap.c msize.c os_darwin.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c 解決方式(solution for “C...
繼續閱讀

[研討會心得][GTG14][Golang]第十四次的Golang Taiwan聚會

前言 小孩出生後難得可以參加研討會GTG#14,主要也是想看看Go 1.5的一些新功能介紹. 第一階段: tka - 用 Golang 幫 Ruby 加速 筆記: buildmode=c-shared: 啟動版本: Golang 1.5 beta2 環境: linux / android (win/mac 不支援) 資料結構不同: GoInt8 -> signed char GoString -> char *p, int length Ruby FFI: ruby package to load dynamic libraries. 呼叫方式: require 'ffi' require 'benchmark' module LibGo extend FFI::Library ffi_lib './libgo.so' // (fn) (input) (output) attach_function :fib, [:int], :int end 效能比較 簡單功能 Ruby > golang 五倍 fibinacci Golang > Ruby 二十倍 參數挑選 使用GoString 與 使用C.String 結果: C.String 會比較快 原因: Ruby 轉 Golang string 需要配置兩個參數 (char * 與 length) Q&A C-Shared GC Not tested yet. C++ binding with Go 速度應該沒差 其他: 有介紹到的golang Language package看起來很好用 第二階段: 用 Go 寫前端, GopherJS 優劣分析 Slide: Full-stack go with GopherJS from Poga Po 筆記 ** Fullstack Go** GopherJS Goroutines works in JS JS s signle-thread GopherJS provide roroutine scheduler. Examples: DOM Callback 效能: 測試五千個goroutine來選轉圖片是可以接受. Gocha No dead code elimation Use js not fmt to...
繼續閱讀

[JENKINS]使用Jenkins部署Golang Server

##前言 想要把Server部署(deployment)自動化,於是又把Jenkins拿出來用. Service Deployment PHP Service 要部署PHP Service其實很簡單,主要就是把檔案*.php複製到apache目錄底下就好. 在Jenkins抓完Git之後,新增一個”執行Shell” echo "Deploy server1..." mv pserver1/*.php /var/www/html/server1/ Go Service 由於Server上的Golang Service使用screen在背景跑.要部署要分成幾個階段: Build Go execution file 這裏有兩個approach一個是使用Go Plugin for Jenkins,而我是直接使用command line跟系統參數.確認go env可以抓到正確的環境參數: 在Jenkins抓完Git之後,新增一個”執行Shell” echo "Building Go SERVER" export GOPATH=/YOUR/GOPATH cd YOUR_GO_PATH rm ORI_GO_EXECUTION_FILE go build -v Kill current service and start new service 在Jenkins build好Go之後,新增一個”執行Shell” echo "Deploy Server" cd /YOUR/PATH sudo ./go_server_restart.sh 這裏有shell script 的內容: #!/bin/sh cd /YOUR/PATH COMMAND_GO_SERVER=/YOUR/PATH/go_server go_server_pid=`pidof ${COMMAND_GO_SERVER}` if [ $go_server_pid ]; then date +"%Y/%m/%d %H:%M:%S-Go Server Restart" kill -9 $go_server_pid sudo screen -d -m ./go_server date +"%Y/%m/%d %H:%M:%S-Restart completed" else sudo screen -d -m ./go_server date +"%Y/%m/%d %H:%M:%S-Start completed" fi 關於Jenkins權限 這裏要注意,如果要跑mv 或是kill -9 需要有root的權限,這樣需要把jenkins的權限調高.細節可以參考How to run a script as root in Jenkins? 修改Sudoers sudo visudo 增加jenkins ALL = NOPASSWD: ALL 如果要更改檔案後commit回去 [2015/10/21 update] 如果希望能更改檔案後,自動的push回去的話. 主要要參考這一個stackoverflow 主要的問題是jenkins的每一個action裡面的git 是沒有紀錄的(因為是工作區) 所以解決方式是跑git checkout master.不過這樣一來在那邊的git 的id 會亂掉. 比較建議的做法是另外開一個資料夾,然後把檔案複製過去再去commit jenkins a repo build file copy destination files to b folder (the same a repo)...
繼續閱讀

[Golang]將開發環境從sublime text切換到vim

##前言 主要是vim-go版號進步到了1.1,在社群裡面大家一面倒都使用vim來作為Go的開發環境.所以還是來試試看. ##安裝 初始VIM環境 清乾淨環境,避免之前有裝過太多plugin rm -Rf ~/.vim rm ~/.vimrc 安裝vim-pathogen 先要先裝vim-pathogen,這個可以幫助我們接下來要安裝的一些工具. mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim 接下來要編輯vim ~/.vimrc: execute pathogen#infect() 安裝Vim-Plug 先裝vim-plug,來管理vim的plugin curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 透過Vim-Plug安裝 Vim-go 記得還得編輯設定檔 vim ~/.vimrc 把以下加上去 call plug#begin('~/.vim/plugged') Plug 'fatih/vim-go' call plug#end() 還沒完,還需要啟動pluginstall vim :PluginInstall 他會把vim-go裝起來,透過vim 去打開go檔案,就會有基本的syntax highlighter 一些vim-go進階設定 根據vim-go作者建議,你可以把以下部分加上去vim ~/.vimrc: 打開各種syntax highlighter let g:go_highlight_functions = 1 let g:go_highlight_methods = 1 let g:go_highlight_structs = 1 let g:go_highlight_operators = 1 let g:go_highlight_build_constraints = 1 各種快速鍵,其中 代表的是 '\' au FileType go nmap <leader>r <Plug>(go-run) au FileType go nmap <leader>b <Plug>(go-build) au FileType go nmap <leader>t <Plug>(go-test) au FileType go nmap <leader>c <Plug>(go-coverage) 把go-fmt 換成 go-import 強烈推薦 :p let g:go_fmt_command = "goimports" 初始安裝完成 到目前為止,你可能會需要使用的功能如下(都是在vim下面) #Save it and check goimport result :w #Build current project :GoBuild #Run it :GoRun #Run Go Run directly \r #Run Go Build directly \b #Go to definition g d monokai 顏色配置 如果你跟我一樣喜歡sublime text的monokai配色,你一定要跟我這樣弄: 從fatih/molokai下載molokai.vim 到...
繼續閱讀

[Golang]如何處理多國使用者的網頁輸出

前言: 這裏整理一下,如何透過Golang來處理多國使用者網頁顯示的問題. 所謂面對多國使用者的時候,主要有一些問題: 如何根據不同國家顯示不同資料 如何根據不同國家顯示正確的時間資料 如何根據不同國家顯示以及儲存正確的字元集 我在這裡只把顯示的部分整理一下…. 判斷使用者國家語系方法: 透過使用者設定 這個是最簡單的方式,也就是使用者自己先設定好你所偏好的語言.類似Google一樣,然後所有的語言顯示就會依據你的顯示方式. 但是這個方式可能有以下的問題,某些服務可能不只有在內部使用者使用.有可能會邀請不同的使用者. 這時候要如何顯示正確的語言呢? 接著來看第二個判斷方式….. 瀏覽器回傳數值 每個瀏覽器都會提供Accept-Language這個Header參數可以提供網站來參考.它的細節在此. 以下列出我用Golang 抓出的三個我常用的瀏覽器結果,在繁體中文Mac OSX上面. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] Safari: [zh-tw] FireFox: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // Parse accept-language in header to convert it as: tw, en, jp ... func ParseAcceptLang(acceptLang string) string { // 1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] // 2. Safari: [zh-tw] // 3. FF: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // // Ret: zh or en ... tarStrings := strings.Split(acceptLang, ";") if len(strings.Split(tarStrings[0], ",")) > 1 { return strings.Split(tarStrings[0], ",")[1] } return strings.Split(tarStrings[0], "-")[0] } 以上程式碼可以根據目前的Header的Accept-Language 內容轉換成 tw, en或是jp. 針對不同國家語系,顯示不同內容 使用javascript 顯示網頁部分 透過之前的ParseAcceptLang搭配著http.Request裡面的Header你就可以取出資料並且開始判斷與處理.這裏我使用的是martini跟 martini-render. func ShowDifferentResultByLang(r render.Render, res *http.Request) { var acceptLang string for _, v := range res.Header["Accept-Language"] { acceptLang = v break } outPutData.Lang := OutPutStruct{} //取得瀏覽器Accept-Lang設定 outPutData.Lang = ParseAcceptLang(acceptLang) r.HTML(200, "SOME_TMPL", outPutData) } .... //Web Template <script type="text/javascript"> var Language = "\{\{ .Lang \}\}"; DoSomethingWith(Language) </script> 這裡面的方法,就是要透過瀏覽器的回傳數值.透過JavaScript 來做相關的處理. 在JS裡面的細節我就不詳談了,這裡有一個詳細方法可以讓大家參考. 顯示不同的圖片 除了在網頁上面透過Java Script來顯示不同的內容之外,其實就算要顯示圖片也是可以透過不同的瀏覽器來給予不同的語言. 方法其實很簡單,就是必須要多開一個接口來幫忙處理圖形的處理部分. 這裏主要會用到的是 http.ResponseWriter的方式. func ShowLocaleImageByBrowser(params martini.Params, r render.Render, db *DB_Medium, res...
繼續閱讀

[年度計畫]52 Weeks, 52 Projects.... (持續更新)

前言 主要是因為看過https://speakerdeck.com/jeffersonlam/reflections-from-52-weeks-52-projects投影片之後想要跟自己挑戰. 條件與限制 一個禮拜一個專案 不限制專案大小,但是重構不包含其中. 不限制一定要建立新的專案,可以學習人家寫一樣的專案(但是要自己打造內容,而不是fork再來修改)。 不限制任何程式設計語言 真的沒點子嗎? 這一篇文章也不錯 Write code every day 進度 (會不斷更新) (06/25):Facebook Album Downloader: https://github.com/kkdai/goFBPages 一個抓取臉書相簿的小工具. 主要學習FB API跟檔案下載. (07/02): Instagram Downloader: https://github.com/kkdai/goInstagramDownloader 抓取Instagram的相片的小工具. 其實Instagram 不少眉眉角角,沒下去寫不知道他的分頁的設計其實相當有趣. (07/10): Facebook Album Client: https://github.com/kkdai/goFbAlbum 將小工具的API抽取出來成為一個元件,順便加上相關文件. 主要學習Travis CI 跟 GoDoc (07/18): Microsoft Translator: https://github.com/kkdai/mstranslator 發現不少特別的眉眉角角,先寫在心得裡面.這個工具可以幫助你使用一些基本的翻譯網路功能. (07/25): iloveptt 我愛批踢踢: https://github.com/kkdai/iloveptt 主要是學習corbra跟goquery. (07/31): Paxos: https://github.com/kkdai/paxos 學習如何用Go channel模擬網路通訊 (08/07): Bloom Filter https://github.com/kkdai/bloomfilter (08/15): Skip List: https://github.com/kkdai/skiplist (08/22): https://github.com/kkdai/pubsub A Redis pub/sub concept implement. (08/29) https://github.com/kkdai/webpic WebPic downloader (09/04) https://github.com/kkdai/jsonop A json operation library (09/12) https://github.com/kkdai/radix A simple radix tree implement in Golang (09/19) https://github.com/kkdai/dfa A Deterministic Finite Automata function implement in Golang (09/26) https://github.com/kkdai/nfa A Nondeterministic Finite Automata function implement in Golang (10/02) https://github.com/kkdai/e-nfa A Epsilon Nondeterministic Finite Automata function implement in Golang (10/09) https://github.com/kkdai/re2epsnfa A tranform function to translate RE to Epsilon-NFA (10/16) https://github.com/kkdai/cyk CYK algorithm in Golang (10/23) https://github.com/kkdai/pcp PCP: Post’s Correspondence Problems simple solver implement in Golang (10/30) https://github.com/kkdai/tm TM: Turing...
繼續閱讀