COSCUP 2017 議程筆記微感想
之前參與 COSCUP 2017 的小筆記與感想 (2017-08-06),記得當初為了搶這票券,也是費了一番苦心。但計畫總是趕不上變化,這次只有參加第二天的議程,除了外面的攤位有去走了一圈逛逛外,大部分都在 Golang 社群議程場內活動。
也許應該要效法議程主持人 Kakashi 之前參加的經驗那樣,應該花大量的時間跟其他人交流互動,多認識業界中各領域的大神,竟然有這麼好的機會把大神們都招集再一起呢,而不是像這次第一次參加都只窩在議場裡,沒什麼主動認識新的大神。
插曲是沒想到坐在旁邊的竟然是研究所時期,其他實驗室同期的同學啊,也是這次 Golang 社群講者之一 Appleboy 同實驗室的學弟,這世界可真小不是嗎。
大部分的簡報、影片以及相關資訊都可以在 Golang 社群找的到。
Marshal 不給你的,自己來
自訂 JSON Marshal 的議題,主要是方便用戶端更容易處理資料,因而要自訂 Marshal,使得時間格式改用 Unix time 輸出,期間遇到的實做問題與解決。
自己之前實作好似也有遇到相同的問題,主要是針對自訂結構 A 實作自動 Marshal 函數,將時間改用 Unix 格式輸出:
type A struct {
Name string
CreateTime time.Time
}
func (a A) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Name string
CreateTime int64
}{
a.Name,
a.CreateTime.Unix(),
})
}
如果搭配上 embedding struct,若沒有實作 MarshalJSON
,那麼 marshal 結果將會是錯誤的:
type B struct {
A
Age int
}
func main() {
a := A{"Hello", time.Now()}
b := B{a, 17}
ar, _ := json.Marshal(a)
br, _ := json.Marshal(b)
println("Marshal(A):", string(ar)) // Marshal(A): {"Name": "Hello", "CreateTime":1502769076}
println("Marshal(B):", string(br)) // Marshal(B): {"Name": "Hello", "CreateTime":1502769076}
}
這樣得為 struct B 實作 MarshalJSON
,若以後 B 又 embedding 到另一個 struct C,那麼 C 也得實作 MarshalJSON
才行。這樣實在有點麻煩,較好的作法會比較偏向演講者所提的,為該時間自訂結構並且直接使用:
type UnixTime struct {
time.Time
}
func (u UnixTime) MarshalJSON() ([]byte, error) {
return json.Marshal(u.Unix())
}
type A struct {
Name string
CreateTime UnixTime
}
type B struct {
A
Age int
}
那麼套用原本的輸出程式碼,結果將會正確所希望的輸出。
GoLearn:Go 語言處理機器學習
上次聚會 Lighting talk 那位分享者的更詳細介紹,使用 GoLearn 處理以下資料分析工作:
- Decision tree
- KNN (K-nearest-neighbors)
- Bayes 條件機率分析
- Linear regression 線性迴歸分析 (找一條線能代表所有已知資料)
- Neural network 類神經網路
展示手寫數字的資料學習,以及拿訓練樣本來辨識現場手寫的資料,看起來效果來挺不錯的。
Go, Java, C# gRPC + Protocol buffer 共同大亂鬥
推坑性質的介紹 gRPC,具有以下特性:
- 支援 HTTP2,大量傳輸速度會很快
- 多個語言函數庫支援,Java, C#, and Go
- 目前瀏覽器還沒有支援 gRPC…
- 資料格式採用 Protocol Buffer,其程式碼產生步驟:
- 寫定義檔
- 使用 code gen
- 直接使用產生的程式碼
- channel 概念,支援 streaming/ timeout
比較有印象的現場展示一個語音辨識 Demo,透過 gRPC 呼叫 Google API ‘speed to text’,進而拿到語音轉換成文字後的結果,覺得這個相當有趣,要找時間來嘗試看看。
Dependency Injection in Go
這場蠻有啟發的,DI (Dependency Injection) 這實作模式常常使用到,但從來沒有認真是了解那幾個專有名詞,Dependency Inversion Principle, Inversion of Control, and Dependency Injection,講者在短時間介紹解釋這三個名詞的概念,以及一個很好理解的範例介紹,並在最後分享他們所使用的 DI 函數庫。
DI 是為了解決 Coupled system 所帶來的問題:
- Changes are risky, 難修改(有風險,要改很多東西)
- Testing is difficult, 難測試
- Semantics is complex, 難看懂
細節可以參考作者簡報,應該要來重新組織對於這模式的理解以及相關的範例…。
自架 Git server 的選擇-Gitea
Appleboy 推坑 Gitea 的議程,一套使用 Golang 開發的 Git server 服務,精彩內容應該直接看 Appleboy 的文章介紹啊。
沒有留言: