[Golang][程式設計週記].. 2015第3週.. 20150123

前言: 看起來每個禮拜一篇的紀錄會有點繁雜,應該要把所有文章拆開來一篇一篇儲存.但是很多部分沒辦法一次寫完又很痛苦. 再觀察看看要怎麼寫好了. 筆記: [Golang] 相關網頁與資源 EBOOK: Learn how to build and deploy web applications with Go. Golang Microsoft Version Info and Icon Resource Generato 在Windows上面可以幫你寫好版本資訊,對於之後要sign code或是其他build process會比較方便. Golang适合高并发场景的原因分析 這篇主要是講解一些Go的優點,以及Go是不是合作為大型伺服器的開發.裡面也提到所謂的C10K甚至到C10M也就是開發同時客戶超過一萬個與一百萬個的伺服器,是可以使用Go作為開發語言的.個人覺得這一篇相當適合詳細閱讀. 如何处理10000 TCP连接 千万级并发实现的秘密:内核不是解决方案,而是问题所在! Time parsing utility for Go http://godoc.org/github.com/dataence/timex Learning HTTP caching in Go 有寫Http Cache的部分滿值得看的, The Most Powerful Feature of Go Is The Least Sexy 提到很多Go的優點跟缺點,其實透過一般人所認為Go的缺點,反而會是Go最重要的優點… 比如說Go不支援 generics,可以讓速度更快.更不容易出問題. 不支援exception,但是支援multiple return卻可以讓program更容易控制,更不容易在意想不到的地方跳出去. 是不是很威? :) Provide basic charts in go Golang繪圖與畫圖工具,雖然說是basic charts但是裡面其實不論是長條圖,直方圖,條狀圖,折線圖,圓餅圖其實都有支援.看起來很實用 A compiler from Go (golang.org) to JavaScript for running Go code in a browser 把Golang一些邏輯可以完全轉到JS,也有出playground Sync MySQL data into elasticsearch 把MySql裡面的資料sync到ElasticSearch,很酷喔…. Go London User Group London的Go Group裡面有相當多的影片可以看. Mooc: Essential Go Go的線上課程,雖然一定要收費而且內容比較適合初學者. [Golang]關於JSON,如何處理敏感的資料: JSON Encoding in Go: Dealing with Sensitive Fields 這篇解決了我最近對於JSON struct tag的疑問. // 隱藏AuthToken ,在JSON中完全不會出現. type SafePerson struct { FirstName string LastName string AuthToken string `json:"-"` } // 如果沒有值,就不會出現在JSON裡面. type PrettySafePerson struct { FirstName string LastName string AuthToken string `json:",omitempty"` } [Go Boston] 2015-01 Meetup講稿 Go/Gorilla for MEAN Stack...
繼續閱讀

[Golang] 相當好用但又要注意的defer

經常在處理檔案的開關必須要注意到file open就一定要有搭配的 file close.但是如果有很多的case,搭配著很多的return.那是不是就得在每個地方寫上fclose? func FileProcess() error { //開啟檔案 f, err := os.Create("/tmp/dat2") check(err) //在這裡呼叫 defer f.Close(),如果有參數會這時候讀入 defer f.Close() if CASE1 { Do something //這時候會執行 f.Close() return errors.New("Error Case2") } else if CASE2 { Do something //這時候會執行 f.Close() return errors.New("Error Case2") } // 就算之後要增加新的case,也不用擔心要補 f.Close() //這時候會執行 f.Close() return nil } Golang裡面有個很方便的function 叫做defer,他執行的時間點會是在你離開目前的function. 不過這裡需要注意的是有兩個地方: 變數的傳遞,會在呼叫defer的時候傳入.所以他並不是很簡單的直接移到最後呼叫 根據GoDoc Defer: The arguments to the deferred function (which include the receiver if the function is a method) are evaluated when the defer executes. 呼叫與執行defer採取的是LIFO. 參考這篇文章 結論: defer最好還是使用在fopen與fclose比較不會有問題. 如果有參數要帶,千萬要想清楚當時參數的順序與是否有其他問題會發生. package main import ( "errors" "fmt" ) func useAClosure() error { var err error defer func() { fmt.Printf("useAClosure: err has value %v\n", err) }() err = errors.New("Error 1") fmt.Println("Finish func useAClosure") return err } func deferPrintf() error { var err error //呼叫的時候會把參數帶過去,所以err是nil defer fmt.Printf("deferPrintf: err has value %v\n", err) err = errors.New("Error 2") //注意這裡是LIFO,所以呼叫會是43210 for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i)...
繼續閱讀

[Golang][iOS][程式設計週記].. 2015第二週.. 20150116

前言: 這個禮拜,總算有點時間可以去參加GTG.也順便多花了點時間研究Go…. 筆記: [Golang] 一些網址與資料 golang port of Google’s libphonenumber Go (Golang) code and table generator for CRUD functionality StreetCRUD is a code and table generation command-line utility for people who aren’t fans of ORMs, but appreciate a kick start creating struct methods, tables, and queries for basic CRUD functionality. Type-driven code generation for Go Code Generation using go-codec - for 2-20X performance improvement Using Go to improve your Ruby application’s performance Tango: Microkernel & pluggable web framework for Go Server Public Key Pinning in Go Decoding JSON streams with some garbage and slice/array garbage collection question 持續追蹤看看有沒有比較好的方式可以處理JSON的source如果有garbage Build dashboards using ascii/ansi art and javascript 用ascii跟ansi來顯示一些條狀圖跟線圖,而且是動畫. [Golang] 關於Golang的基礎執行環境 由於Go是compile只要用go win 版本compile成執行擋 (xxx.exe),最小大小為 2mb.可以在乾淨的Win7環境下直接執行. 就算有一些基本的fmt的函數也約為2mb左右. 可見執行環境相當的小. [Golang] 關於Golang與 C++的比較 (由dl.google.com為範例來比較) 主要是從這張slide擷取過來.內容是Google的人把dl.google.com從C++轉移到Go.優點如下: less than half the code more testable, tests same CPU usage for same bandwidth … but can do much more bandwidth … and more than one CPU less memory (!)...
繼續閱讀

[研討會心得]Golang Taipei Gathering #12 etcd in IoT /go generate

前言: 本來還在思考要不要參加,但是剛好gtg slack上面有人願意把票讓出來.就趕快來聽聽.此次的相關資料在這裡. 研討會筆記: [POGA]Go Generate, trick to write Ruby 適合拿來寫 DSL Stirng/HASH Anywhere lack of “syntax eror” GO sort 不支援int64 sort, 其實只是多寫成4 lines :). 參考這篇 Because it’s four lines of code: type int64arr []int64 func (a int64arr) Len() int { return len(a) } func (a int64arr) Swap(i, j int} { a[i], a[j] = a[j], a[i] } func (a int64arr) Less(i, j int) bool { return a[i] < a[j] } Float64 is the more common float, int is the more common it, so both have predefined versions of this. self-refererencial function struct tag using reflect is slow, don’t use it in DSL. go generate 僅僅是regex來替換而非parser “go get” don’t run “go generate” for you slide: http://www.slideshare.net/poga/gtg12 與講者額外的談話: struct tag 可能會發生問題.. 由於json tag 是會被go compiler skip,但是極有可能會發生一些錯誤 tag 內名稱寫錯而永遠讀不到json的內容 不小心把一些語法寫在雙影號外面.(e.g. omit…) 寫錯不會造成整筆資料都是空的,而是某個欄位會變成空的.這就比較麻煩. 關於go generate 使用實例: 把他當成shell script 自我檢查,比如slide裡面的auto error [HAWK]miicasa etcd for IoT What is IoT? 物聯網 - 蒐集狀態機 透過簡單的 AND OR NOT的來控制....
繼續閱讀

[Java][Golang][Python][程式設計週記].. 2015第一週.. 20150109

前言: 主要紀錄一些網路上查到的東西,實作上應該會有更多文章出現…. 筆記 [Java] 關於一切有趣的Java資源 RDBMS & PostgreSQL(1): 淺談資料庫 本身跟Java沒有太大關係,不過內容挺有趣的,尤其講到數據的成本 XDDD 其他篇相關文章如下: RDBMS & PostgreSQL(2):跟 MySQL 說再見, 加入 PostgreSQL 吧 針對這份簡報內容的一些討論 操作員在凌晨四點被叫醒 關於DB Cassandra 處理的一些事件與大量資料處理 [Golang] 一些有趣的Golang 資源 Hyperfox 一個可以當proxy與了解本地端HTTP/HTTPS內容的工具 No Effing Clue: Compiler 2 Part 1: Introduction to Apprentice Compiler Design 本篇是講解一些compiler設計上的概念. No Effing Clue: Compiler Part 10: Compiling to C 針對透過Go來寫Compiler的概念. HTTP狀態碼 跟Go無關,主要是記錄一下要怎麼做martini response用的 BoltDB: Low-level key-value DB 與etcd不太一樣的是,他只是單單有資料庫.而沒有JSON輸出. Why Go’s Closure Can Be Dangerous 主要是講解,GO的closure牽扯到GC(Garbage collection)所以使用全域變數要小心造成記憶體浪費(直到結束前都不會減少). Dropbox: Open Sourcing Our Go Libraries 其實是去年的舊聞,不過github可以在這裡找 [SQLBuilder] 在slack討論中有提到Sqlbuilder,也就是可以透過簡單的function去產生複雜(或簡單)的sql語法來操作資料庫 某大大寫的sqlbuilder 這邊有dropxob提供的sqlbuilder 不過總括的寫起來,其實sqlbuilder還是只能幫助到一些簡單的轉譯,就rails migration上面有人建議從code generation 下手會比較好. 這裏有關於Golang使用者還沒打算使用ORM的文章 此外,比較沒有看過NoSQL 有Query Builder,只有看到node.js有類似的query engine 衍伸閱讀: Golang ORMs:A survey of the current state of Golang ORM MongoDB: SQL to MongoDB Mapping Chart Go and Postgres:Go, Martini and Postgres Tutorial - Part 1 A little trick to statically link C to Golang with cgo 一些小技巧如何在Go上面連接C,使用的是cgo An NES emulator written in Go 超酷.. 用Go寫任天堂模擬器 Experimental KVM-based VMM, written in Go 虛擬機器的監視器(Virtual Machine Monitor),根據上面的講解,會比docker所使用的container更有優點. 延伸閱讀MSFT: 雲端運算: 虛擬化類別 Github:A replacement...
繼續閱讀

[Golang]關於martini架構的更深一步了解

前言: 最近開始深究Go的webframework martini.慢慢開始會寫更多的東西出來. 筆記: 以下敘述的方式,會根據我想要達成的目標依序紀錄一下: [JSON] 解決martini JSON的資料解析(parse) 不論是Martini或是 http.Request原本基本都會是使用JSON.Unmarshall來處理. 這裏需要注意的是,跟當初在處理mongodb的資料一樣.變數的名稱不可以全部是小寫,但是json資料名稱需要全部都是小寫. 如果不小心把變數名稱全部打成小寫,會無法正確的Unmarshall資料. type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } str := `{"page": 1, "fruits": ["apple", "peach"]}` res := &Response2{} json.Unmarshal([]byte(str), &res) fmt.Println(res) fmt.Println(res.Fruits[0]) [martini-render] 關於martini 顯示json的顯示部份.原本encoding/json能處理大部分的事情.但是要能完整顯示http status code 與json內容的話.我還是選擇了martini-contrib/render render.JSON(400, map[string]interface{}{"result": "success"}) [Martini map]接下來問題是,如何在各個martini handler中,去傳遞你要的變數或是如何把資料庫加入. 原本是應該要直接使用martini.Use(DB()) 然後再去接 DB 的起始martini.handler即可.參考這裡 但是想要做成可變動的資料庫格式(in-mem DB, mongodb 共存) 所以還是直接丟整個變數比較好.類似作法參考 var db SomeDB{} //將變數透過martini 傳到各個handler m.Map(&db) ... //新增一個變數參數就可以使用 func someHandler(params martini.Params, r render.Render, db *SomeDB) { .... } 相關文章: Go Doc: Init function Init是負責每個檔案的起始function,會比main()更早啟動.但是各個檔案的Init並沒有一定順序. 根據這份文件提到,他在整個程式中的順序會是: 變數起始 Import Init Go :Methods on structs Build a RESTful API with Martini Learning Go with Martini - Working with MongoDB Simple App with Go, Martini, Gorp and MySQL
繼續閱讀