關於 web service, unity, blogger 等軟體工程筆記

COSCUP 2017 議程筆記微感想

Edit icon 沒有留言
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 的文章介紹啊。

沒有留言: