[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 source files not allowed when not using cgo or SWIG”):

這裏提供我的解決方式:

  1. 刪除 %GOPATH%下的pkg資料夾
  2. 重新開啟 console 或是確認 go env有讀到正確 go 1.5的設定.

##心得

gvm主要是給Ubuntu(linux-like)來管理Golang版本套件的.既然是Mac OSX就要用最好使用的homebrew

搞定 brew switch 切換Go 版本真的是很方便… 不過c-shared MAC也沒有 想玩還是有點麻煩… 還是在Win上面弄docker玩…

[研討會心得][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 reduce size.
  • Callback should not block
    • JS is single thread. (main thread)

會後心得:

  • 使用brew 來管理Go版本,好像很酷

參考資料:

[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)
  • git commit/push in b folder

請注意: 這個做法有相對的安全考量,請自行參照

TODO:

Post commit hook

需要Jenkins在commit submit之後,自動跑task. 可以參考Jenkins CI: How to trigger builds on SVN commit

##參考資料

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

##前言

image

主要是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~/.vim/colors
  • 修改設定,vim ~/.vimrc:

      set t_Co=256
      :colorscheme molokai
    

如果你跟我一樣是Mac OSX的環境,set t_Co=256這個設定是不能減少的.

所以目前畫面會是這樣.

image

資料夾開啟檔案 NERDTreeToggle

想要左半部跟Sublime Text一樣有資料結構可以選擇開啟檔案?就要裝NERDTreeToggle.一樣透過vim-pathogen來加入,透過vim ~/.vimrc

    map <C-n> :NERDTreeToggle<CR>

就可以透過ctrl + N來開啟如下:

image

tagbar: class outline viewer

tagbar是一個功能強大的需要先安裝好ctags,在Mac OSX底下相當的方便

透過brew就可以直接安裝:

    brew install ctags

記得還是得裝gotag

    go get -u github.com/jstemmer/gotags

修改vim ~/.vimrc增加以下設定:

    let g:tagbar_type_go = {  
        \ 'ctagstype' : 'go',
        \ 'kinds'     : [
            \ 'p:package',
            \ 'i:imports:1',
            \ 'c:constants',
            \ 'v:variables',
            \ 't:types',
            \ 'n:interfaces',
            \ 'w:fields',
            \ 'e:embedded',
            \ 'm:methods',
            \ 'r:constructor',
            \ 'f:functions'
        \ ],
        \ 'sro' : '.',
        \ 'kind2scope' : {
            \ 't' : 'ctype',
            \ 'n' : 'ntype'
        \ },
        \ 'scope2kind' : {
            \ 'ctype' : 't',
            \ 'ntype' : 'n'
        \ },
        \ 'ctagsbin'  : 'gotags',
        \ 'ctagsargs' : '-sort -silent'
    \ }        

neocomplete: 即時自動補字

vim需要lua支援,可以查看是否有:

    :echo has("lua")

如果沒有可以更新:

    brew update vim --with-lua

這樣應該都搞定了.

可能會遇到的問題

關於QuickFix

當跑:GoBuild 產生錯誤的時候,會跳出quickfix,這時候可以透過以下的快速鍵使用:

  • 跳到quickfix

      :.cc
    
  • 關閉quickfix

      :.ccl
    

關於autocomplete Preview畫面需要關閉

可以直接打

    :pclose

或是改在 vim ~/.vimrc

    # insert mode
    autocmd CursorMovedI * if pumvisible() == 0|pclose|endif
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif

增加更多的順手設定(更新: 2015/08/20)

這裏記錄一些,我認為很順手的設定.此外,所有的設定檔可以參考我開源出來的設定:https://github.com/kkdai/vimfiles:

主要都是要修改vim ~/.vimrc:

    ""//主要是修改Mac上面Insert Mode: backspace 的行為.不需要再透過"x" 來刪除東西
    set backspace=indent,eol,start
    
    ""//啟動滑鼠功能,你可以用滑鼠做以下事情:
    ""//切換不同的分割畫面,透過滑鼠在NerdTree去展開與打開檔案,甚至是選取文字
    set mouse=a

    “”//啟動系統的剪貼簿,再作選取與複製的時候,不僅僅會複製到vim的記憶體中,更可以在系統剪貼簿使用.
    set clipboard=unnamed

##心得

不要找人家的 .vimrc,一定要親手一步一步地安裝
不要找人家的 .vimrc,一定要親手一步一步地安裝
不要找人家的 .vimrc,一定要親手一步一步地安裝

很重要,講三次的原因是…. 我一開始很興奮地裝了一堆plugin.其實都不會用 orz.最好的方式.. 還是自己一個個安裝.. 也一個個來瞭解怎麼用. 畢竟vim 本來就是學習曲線的進入很難,熟了以後就跟飛的一樣的一個工具.

接下來就要強迫自己儘量不用sublime text而使用vim …. orz

##相關資源:

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

image

前言:

這裏整理一下,如何透過Golang來處理多國使用者網頁顯示的問題.

所謂面對多國使用者的時候,主要有一些問題:

  • 如何根據不同國家顯示不同資料
  • 如何根據不同國家顯示正確的時間資料
  • 如何根據不同國家顯示以及儲存正確的字元集

我在這裡只把顯示的部分整理一下….

判斷使用者國家語系方法:

透過使用者設定

這個是最簡單的方式,也就是使用者自己先設定好你所偏好的語言.類似Google一樣,然後所有的語言顯示就會依據你的顯示方式.

但是這個方式可能有以下的問題,某些服務可能不只有在內部使用者使用.有可能會邀請不同的使用者. 這時候要如何顯示正確的語言呢?

接著來看第二個判斷方式…..

瀏覽器回傳數值

每個瀏覽器都會提供Accept-Language這個Header參數可以提供網站來參考.它的細節在此

以下列出我用Golang 抓出的三個我常用的瀏覽器結果,在繁體中文Mac OSX上面.

  1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4]
  2. Safari: [zh-tw]
  3. 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你就可以取出資料並且開始判斷與處理.這裏我使用的是martinimartini-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 http.ResponseWriter, req *http.Request) {
        //取得瀏覽器Accept-Lang設定
    	var acceptLang string
    	for _, v := range res.Header["Accept-Language"] {
    		acceptLang = v
    		break
    	}

        //轉換成可了解文字 en. tw. jp ...
        Lang := ParseAcceptLang(acceptLang)
        
        //根據不同語言讀取不同圖形
        imageAddr := GetImageAddrByLang(Lang)
        
        //直接將圖片寫回http.responseWriter
    	res.Header().Set("Content-Type", "image/jpeg")
    	err := jpeg.Encode(res, GetImage(imageAddr), &jpeg.Options{100})
    	if err != nil {
    		res.WriteHeader(500)
    	} else {
    		res.WriteHeader(200)
    	}
    }

心得:

這一篇把相關的部分做一個簡單的整理,也希望能找到更有效的方式來顯示正確的資訊給使用者.

參考鏈結:

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

前言

主要是因為看過https://speakerdeck.com/jeffersonlam/reflections-from-52-weeks-52-projects投影片之後想要跟自己挑戰.

條件與限制

  • 一個禮拜一個專案
  • 不限制專案大小,但是重構不包含其中.
  • 不限制一定要建立新的專案,可以學習人家寫一樣的專案(但是要自己打造內容,而不是fork再來修改)。
  • 不限制任何程式設計語言

真的沒點子嗎? 這一篇文章也不錯 Write code every day

進度 (會不斷更新)

  1. (06/25):Facebook Album Downloader: https://github.com/kkdai/goFBPages 一個抓取臉書相簿的小工具.
    • 主要學習FB API跟檔案下載.
  2. (07/02): Instagram Downloader: https://github.com/kkdai/goInstagramDownloader 抓取Instagram的相片的小工具.
    • 其實Instagram 不少眉眉角角,沒下去寫不知道他的分頁的設計其實相當有趣.
  3. (07/10): Facebook Album Client: https://github.com/kkdai/goFbAlbum 將小工具的API抽取出來成為一個元件,順便加上相關文件.
  4. (07/18): Microsoft Translator: https://github.com/kkdai/mstranslator
    • 發現不少特別的眉眉角角,先寫在心得裡面.這個工具可以幫助你使用一些基本的翻譯網路功能.
  5. (07/25): iloveptt 我愛批踢踢: https://github.com/kkdai/iloveptt
  6. (07/31): Paxos: https://github.com/kkdai/paxos
    • 學習如何用Go channel模擬網路通訊
  7. (08/07): Bloom Filter https://github.com/kkdai/bloomfilter
  8. (08/15): Skip List: https://github.com/kkdai/skiplist
  9. (08/22): https://github.com/kkdai/pubsub A Redis pub/sub concept implement.
  10. (08/29) https://github.com/kkdai/webpic WebPic downloader
  11. (09/04) https://github.com/kkdai/jsonop A json operation library
  12. (09/12) https://github.com/kkdai/radix A simple radix tree implement in Golang
  13. (09/19) https://github.com/kkdai/dfa A Deterministic Finite Automata function implement in Golang
  14. (09/26) https://github.com/kkdai/nfa A Nondeterministic Finite Automata function implement in Golang
  15. (10/02) https://github.com/kkdai/e-nfa A Epsilon Nondeterministic Finite Automata function implement in Golang
  16. (10/09) https://github.com/kkdai/re2epsnfa A tranform function to translate RE to Epsilon-NFA
  17. (10/16) https://github.com/kkdai/cyk CYK algorithm in Golang
  18. (10/23) https://github.com/kkdai/pcp PCP: Post’s Correspondence Problems simple solver implement in Golang
  19. (10/30) https://github.com/kkdai/tm TM: Turing Machine implement in Golang.
  20. (11/05) https://github.com/kkdai/twitter A simple twitter API in Golang
  21. (11/13) https://github.com/kkdai/consistent Consistent Hashing implement in Golang
  22. (11/20) https://github.com/kkdai/photomgr A photo download made for gomobile in Golang
  23. (11/27) https://github.com/kkdai/trigram A trigram indexing using Go.
  24. (12/04) https://github.com/kkdai/ngram A ngram indexing using Go.
  25. (12/11) https://github.com/kkdai/beacon Beacon Simulator: A simple beacon simulator (iBeacon/Eddystone) in Golang
  26. (12/18) https://github.com/kkdai/youtube A Youtube download package in Golang
  27. (12/25) https://github.com/kkdai/react-diff React Diff binary tree in Golang
  28. (12/31) https://github.com/kkdai/EddystoneScanner Eddystone Beacon Scanner in Golang
  29. (01/08) https://github.com/kkdai/CoapPubsub A PubSub client/server using CoAP protocol
  30. (01/15) https://github.com/kkdai/ri A UDP client/server to get Public and Private IP and Port for hole punching
  31. (01/22) https://github.com/kkdai/coapmq A Publish-Subscribe Broker for the Constrained Application Protocol (CoAP) in Golang
  32. (01/29) https://github.com/kkdai/oxford-face Project Oxford Face API for Golang
  33. (02/05) https://github.com/kkdai/oxford-face-client A client App for oxford-face Golang package (http://github.com/kkdai/oxford-face)
  34. (02/12) https://github.com/kkdai/oxford-emotion Project Oxford Emotion API for Golang
  35. (02/19) https://github.com/kkdai/diskqueue NSQ Diskqueue implement in Golang
  36. (02/26): https://github.com/kkdai/pd (PUBSUB) Publish-Subscrbe message broker with Disk queue in Golang
  37. (03/04): https://github.com/kkdai/rd A simple RPC Message Queue Server/Client with DiskQueue.
  38. (03/11) https://github.com/kkdai/raftrpc Simple RPC Key Value Server using etcd/Raft in Golang.
  39. (03/18) https://github.com/kkdai/githubrss A github notification (starred, follower, followed) RSS feed in Golang
  40. (03/25) https://github.com/kkdai/rss-webserver A simple Github Status RSS feeder server in Golang
  41. (04/01) https://github.com/kkdai/slack-console A simple slack console tool in Golang
  42. (04/08) https://github.com/kkdai/plurk-makerserver Plurk post server for IFTTT Maker in Golang
  43. (04/15) https://github.com/kkdai/kmp KMP (Knuth–Morris–Pratt algorithm) implement and related string function Strstr and Strchr in Golang
  44. (04/22) https://github.com/kkdai/aca Aho–Corasick algorithm automation implement in Golang
  45. (04/29) https://github.com/kkdai/LineBotTemplate A simple Golang LineBot Template and tutorial how to setup on Heroku for Line Bot API
  46. (05/06) https://github.com/kkdai/LineBotPetNeedMe Animal Adoption Platform on Line Bot
  47. (05/13) https://github.com/kkdai/petneedme Package to get Pet Adoption OpenData from Taiwan in Golang
  48. (05/20) https://github.com/kkdai/bstream A Bit Stream helper in Golang
  49. (05/27) https://github.com/kkdai/trr TRR: Time-Series of gorilla algorithm with Raft RPC Server/Client in Golang
  50. (06/03) https://github.com/kkdai/maglev A Google Maglev Hashing Algorithm implement in Golang
  51. (06/10) https://github.com/kkdai/petl A Pipeline ETL process and receive data from pipe in Golang
  52. (06/17) https://github.com/kkdai/raftserver A RPC Server implement base on Raft Paper in Golang

心得 (不斷更新)

  • [07/18]關於Micorsoft Translator:
    • 在實作的時候,不確定是不是所有API都是這樣. Microsoft 竟然把Appid 寫在Authorization的token前面,變成 APPID + " " _ token. 參考 API Spec
    • 另外一個讓人百思不得其解的是Microsoft Json response 竟然前面有BOM(Byte Order Mark),讓我在做json.Unmarshal的時候死得很大啊. 解決方式看這裡
    • 同時也發現原來想要手工打造一個API client其實可能還要忍受許多API上面資料格式混亂的問題.比如這個有些API用JSON,有些用XML.而且API URI還可以不同版本,太奇特了.
  • [07/25]關於Ptt Crawler
    • 順便學習了goquery,挺好玩的.
    • 因為想要給朋友用,也順便把Windows 支援弄了一下,主要是要把所有目錄都用filepath.FromSlash轉過.細節可以看這裡
  • [07/31]Paxos
    • 主要是學習如何用Go來表達與呈現網路中的分散式系統架構.這部分應該可以寫一篇說明文章.
  • [08/07]Bloom Filter
    • 主要學習test package 跟 bechmark function.
  • [08/15]SkipList
    • 主要是複習一下用linked list 怎樣在Go上面實現.. 並且完成sorted linked list.
    • 也瞭解了Skiplist的資料結構與各種演算法.
  • [08/22]Pubsub
    • RedisPub/Sub概念實現,主要是特過channel 的特性來實現Massaging Management System
    • 裡面主要透過兩個map來相互的控制:
      • 一個Map 管 chan-> topics: 也就是透過 chan 來查看該chan訂閱多少topics
      • 一個Mao 管 topic->chans : 也就是透過某個topic 來查看有多少chan 訂閱
    • 透過這兩個Map的機制,來做topic的訂閱管理
  • [08/29]WebPic
    • 學習了剪貼簿的存取方式,與更深一層的JQeury使用方式.
  • [09/04]jsonop
    • 主要把recursive拿回來練手,還有發現nil(none)其實是一個特別的資料型態.
  • [09/12] radix tree
    • 完全依照spec來implement,發現大家都使用for loop,我還是依舊使用recursive來做.可能效能沒那麼好.不過挺有趣的.
  • [09/19] DFA
    • 主要是學習Coursera Automata用到的,順便寫成小程式.其實使用Map會比想像中簡單.只是這邊要注意的是Map iterator是沒有順序的,參考這裡Iteration order
  • [09/26] NFA
    • 繼續做automata上面的內容.一開始要寫,會擔心NFA很難implement.但是只要把概念想好,將目前的點開始發散(使用BFS)方式來實作,其實就可以做出來.
  • [10/02] ε-NFA
    • Automata其實有不少部分可以拿來寫程式,而且diagram的traversal也很有趣.尤其對於ε的處理,想了很久啊.
  • [10/09]主要是透過Automata 課程上的題目來改成自己可以用的轉換方式.並且支援自己寫出的e-nfa.感覺挺酷的…. 不過也發現自己原先寫e-nfa有些部分沒有考量到.
  • [10/16]CYK: 竟然寫好程式忘記過來更新,還是持續在弄automata的東西.CYK主要是拿來計算是否輸入文字能被特定的CFG所產生出來.
  • [10/23]PCP: 持續弄Automata.這個問題是NP-Problem,而且似乎沒有辦法找到一個完整的解法.目前只能找出有沒有產生迴圈.有把相關的論文都找出來記錄起來.
  • [11/05]Twitter: 主要是要搞懂twitter流程與設定.
  • [11/13]Consistent Hashing: Hash的演算法很重要,整個資料結構動不動都靠它了…..
  • [11/20] 學過 CocoaPods後跟gomobile 來寫iOS App變得更簡單.讚讚…
  • [11/27] 有特別為了這個寫了一篇post
  • [12/04] 主要是優化效能,有一篇相關文章
  • [12/11] 先練習Beacon Simulator 也順便了解Eddystone的格式,詳細說明文章