[Golang] 你也喜歡 Golang 嗎? 一起來當 Go GDE (Google Developer Expert)

前言

三年前(2016/08/21)第一次報名的大型研討會演講,就是在 COSCUP 講「如何透過 52 個專案來學習 Golang 」 。 之後就是舉辦 golang.tw 的社群活動,並且在許多地方持續地講解跟 Golang 相關的議題 (參看我投影片整理鏈結 https://github.com/kkdai/slides)。 終於也在三年後的同一天,就在 Go 在五月之後正式成為 GDE 的項目之一之後,筆者通過了 Google 的相關面試成為 Golang 全球首波的 Google Developer Expert 的一員。

這篇文章會跟各位分享一下什麼是 GDE (相關的權利跟義務),並且不免俗的在這篇文章裡面會再介紹一次什麼是 Golang (大多是投影片整理),最後分享該如何成為 Google Developer Expert 。

什麼是 GDE (Google Developer Expert)

Google 擔任 Developer Relations Program Manager - Eric 這篇文章不能錯過 ( 為什麼你應該申請成為 Google Developers Experts (GDE) ) ,為了保持資料正確性,在此都會節錄一些官方統一宣傳的義務跟權利。

成為 GDE 後的福利

GDE 計劃以及背後支持的產品單位會依據當時的資源與活動狀態來安排活動或給予 GDE 福利。平時您可以與您所在地區的 Google Developer Relation Regional Lead 來討論活動的各種資源協助,而以全球活動來說 :

  • GDE 計劃每年都會舉辦至少一次全球峰會(GDE global summit),可以認識其他一樣有熱情的人(興奮)。
  • 邀請該領域的 GDEs 參加 beta program / focus group / … 等活動來與 GDEs 們互動,讓 GDEs 有一定的份量能影響產品或技術的發展。(Golang 這邊希望可以參與更多討論跟分享)
  • GDEs 可能會優先嚐試或取得 alpha/beta 期的產品或免費使用額度。
  • 參加 Cloud Next 或 Google I/O 的機票住宿補助等等。 (我個人是希望有 GopherCon :p )

當然這些福利都是視情況而定。

以上都是擷取自 Eric 的文章“為什麼你應該申請成為 Google Developers Experts (GDE)”,但是筆者本身的原因如下:

  • 認識其他 GDE : 就像筆者不喜歡只參加研討會而沒有機會上去講(當初去 Google I/O 其實我也弄了投影片想衝上去 XD ) ,因為想認識講者最好的方式就是當講者。你想認識其他強到爆炸的方式,就是你也要當上 GDE 跟著他們到 GDE Submit 裡面去相認。
  • 讓台灣 Go 社群有更多曝光度: 本次入選很榮幸是在全球第一批,應該也是少數的華人之一。主要當初很積極要爭取的原因,除了筆者超愛這個 Go 這個語言之外,就是也希望讓台灣 Golang.tw 社群能獲得更多的注意,因為每次要辦活動來找國際級的 Golang 講者都無法被注意到。 身為社群的主辦人之一,這次一些私心 :p 。

主要是這兩個個人因素,在此跟大家分享一下。

成為 GDE 伴隨來的義務:

因為這是一個鼓勵性質的計劃,計劃希望認可專業開發人員的付出,並不是要找免費的勞務資源,我們知道開發人員都有可能因為忙碌或是工作關係而無法安排太多的活動。

雖然沒有特別義務,但是其實 GDE 內部都有貢獻投稿系統 (Activities Submit System) ,並且你所有的活動(貢獻)都是會被所有的 GDE 來檢驗跟查看的。不過平常就有在講的人,真的可以不需要擔心相關的事情。 (像我就是 :p )

什麼是 Go (lang)

身為社群的主辦人之一,也是推廣的愛好者在本篇文章還是會讓大家了解一下。 根據官方 Golang.org 的主要說明如下:

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

個人主要會學習 Golang 的理由如下:

  • 語法簡潔 (Simplicity) : 讓許多有 C 語言概念的人可以輕易上手並且了解。
  • 強大的 built-in standard libraries : 包括好用的 goroutinechannelsnet/http 都是相當好用的相關內建套件。
  • 內建的測試與相關好用延伸開發者工具: 當初為了讓開發者能夠更喜歡開發,開發團隊在相關 toolchain 上面下了相當多的苦心。 像是內建的測試 go test (還包含 benchmark ) ,還有文件小幫手 ( godoc ) ,查詢相關定義的 (gopls ) 都是相當好用的工具。

這邊有些我之前準備的投影片,歡迎大家取用來了解。

有哪些 Golang 相關台灣中文社群資源:

如何成為 Go(lang) GDE (How to become Go GE)

講了那麼多福利跟好東西,想必各方 Golang 好手都想要一起來當 GDE (Google Developer Expert )。 大致上的經過流程經過以下幾個過程,詳細的文章相當建議各位看看以下文章:

幫各位整理以下的一些重點:

  • 自我評估:
    • 你喜歡分享 Golang 相關的演講嗎? 你喜歡寫相關的 Golang 文章嗎? 你有常來 Golang.tw 社群來分享嗎?(沒有的話,請來找我分享)身為 GDE 某種程度就是要有在幫忙宣傳與分享相關領域的技術與內容。 如果你平常沒有做類似的事情,建議你應該要開始做。 來 Golang Taipei Meetup 分享一個小 talk 開始吧?
  • 跟 Google Developer Relations Program Manager 也就是 Eric 談談:
    • 他會給你相關建議跟整理相關資料,任何台灣跟香港的人想要申請,千萬別忘記找他討論看看。別忘記!千萬不要問了又不敢投喔!!
  • 徵選第一關社群面試:
    • 會挑選一個資深的 GDE 跟你討論相關的貢獻部分,這邊會請你分享你的過往經驗與你如何分享。你必須要能夠有足夠的資料與熱情來表達你自己。
  • 徵選第二關產品面試:
    • 這裡就相當嚴肅了,你會分配到一位 Google 內部相關的產品員工(極大可能是工程師)跟你討論相關的技術部份。該名人員審核你對於你申請項目的了解程度,對於 Golang 也就是對於整個語言的主要概念與內部架構是否能夠熟悉。

過了這兩關就是準備 NDA 跟 T&C 就可以等著宣布。希望每個人都可以來申請喔。 可以找上官林傑

Does your passion match your aspiration?

「你會成為 GDE 不是因為你最近的努力練習,是你已經是具有 GDE 的資格」。

一路面試過來,許多面試官都跟我講,我的印象很深刻。

許多有熱情或是看了文章之後,一股腦想要獲得這樣認證的人,我也建議你們要好好思考。因為 GDE 是一種榮耀,但是與其是一種榮耀,不如說因為你過往許多的貢獻 Google 感激你給你的相關稱號。

你本身並不會因為 GDE 變得更厲害,讓你變得厲害的是: 過往的每一場 talk ,每一個社群的活動,每一篇你努力寫出的文章,每一段你寫出的範例程式碼。

Does your passion match your aspiration? 你的熱情能不能夠匹配你的心願呢?單單有熱情卻沒有辦法踏出那一步去實現,去努力完成,那麼永遠都不會成功的。

有熱情成為 Go GDE 嗎? 先來社群開始分享吧! 有一天你也會成為一員的!

參考文章

[研討會心得] 20190730 GolangTW @M Space - Introducing the go channel and pipeline buffered/unbuffered channel

前言

大家好,我是 LINE Taiwan 的 Technical Evangelist - Evan Lin。這次很開心回到 Golang 社群參加了 “GolangTaipeiGathering#423” 的聚會活動。

  • 社群 GolangTW Meetup: https://www.meetup.com/golang-taipei-meetup/

  • 本次活動網頁: 活動網址

這次參與社群的聚會主要是希望透過分享一個資料處理上容易所面臨的問題,來解釋 Go(lang) 裡面一個經常讓人困擾的問題,也就是 Buffered/UnBuffered Channel 的差異,如何應用與如何透過 Channel 來完成 Data Pipeline 。

Introducing the go channel and pipeline buffered/unbuffered channel / 資深開發技術推廣工程師 Evan Lin

投影片

以前在做 Machine Learning Platform 的時候,有機會可以開發資料處理的 pipeline 。開發能處理資料處理的相關功能的時候,最重要的就是希望能夠讓資料處理的速度能夠越快越好。假設一張照片要做人臉判斷的話,正常的做法是讀取圖片(假設需要花費時間 100 ms ) 然後將圖片做人臉判斷 ( 300 ms ) ,最後要將資料儲存在資料庫或是中介媒體(檔案)(10 ms) 。這樣可能一個圖像檔案需要花費 100 + 300 +10 = 410 ms 的時間,如果要處大量的數據的時候,這樣的時間花費就無法計算。 所以這時候就需要透過 goroutine 與 channel 來大量處理這些資料。 接下來就從頭來稍微解釋 Buffered/UnBuffered Channel 的差異與使用方式。

Buffered/UnBuffered Channel

通常在講解 goroutine 與 channel 的時候,最常與人討論與瞭解的問題就是「什麼是 UnBuffered Channel ,什麼又是 Buffered Channel ? 兩者的差異與應用的地方在哪裡?」。在講解 Buffered 與 UnBuffered 之前,先來了解 Channel 具有的基本特性:

  • Channels are goroutine safe
  • Channels carry messages between goroutines
  • FIFO semantics
  • Channels cause blocking and unblocking

接下來讓筆者透過幾個範例來讓讀者能有清楚的了解:

首先先來舉個 UnBuffered Channel :

這個範例可以在 Playground 直接執行。

這是一個簡單的 UnBuffered Channel 的使用範例,使用的方法就是在 main() 裡面呼叫一個 goroutine 去將一個 channel ch 給值 (send) ,而最後就在從 ch 接受(receive) 數值。

這邊有一些小地方需要注意:

  • 由於是 UnBuffered Channel 所以傳送 (send) 與接受 (Receive) 都會造成 block ,尤其當 UnBuffered Channel 已經在傳送一個數值的時候,傳送第二個數值的話就會造成 goroutine block 必須等待數值被接受( Receive ) 之後才能繼續處理。
  • 如果在 main() 對於 unbuffered channel 傳送值 (send) 卻沒有接受 ( Receive) ,則會造成 deadlock detector 偵測到而報錯 fatal error: all goroutines are asleep - deadlock! ,但是在 goroutine 裡面卻不會產生錯誤,因為只會產生 goroutine leak 。(備註: 如果有呼叫到 libsystem 的 function call 也不會,可以參考 Go issue 33004 )
  • 如果對於一個已經 closed channel 去給值 (send) 會發生問題,但是拿值只會拿回 empty value 。

接下來,對於 Buffered Channe.l 也舉一個例子:

相關的範例可以在 Playground 直接執行。

第二個範例就是一個簡單的 Buffered Channel 的範例,比對前一個範例可以了解 Buffered Channel 比起 UnBuffered Channel 可以 send 與 receive 更多數值而不需要 wait (或是說 block) 。 也因為這樣的方式,其實在使用上,通常會建議需要同步處理的資料,建議放在 Buffered Channel 裡面,可以讓數個 goroutine 針對一個 Buffered Channel 來做資料的操作。

Golang Pipeline pattern

接下來來講解一個經常在資料處理上的方式,就是透過 channel 來做 pipeline 的處理。這裡要舉一個在 Golang Blog: Go Concurrency Patterns: Pipelines and cancellation 裡面的範例:

相關的範例可以在 Playground 直接執行

這是一個簡單的範例來透過 UnBuffered Channel 來將資料逐一的傳遞到各個函式之間。這個範例主要是透過輸入一連串的數字,gen() 將其送入 channel 之中,而 sq() 將其從 channel 收到後,將數值平方之後再送到另外一個 channel ,而最後就拿這個 out channel 來將接受到的數值列印出來。

這個範例可以注意以下幾件事情:

  • pipeline 中的每個函式的共通樣式都是,建立一個輸出的 channel ( out ) ,透過 goroutine 接受輸入的 channel ( in ) 。
  • 由於是透過 UnBuffered Channel 來傳遞資料,所以每次只有一個會處理。透過以上的範例,會先處理 2 然後再處理 3

透過 Pipeline pattern 在處理資料的時候有以下的好處:

  • 每個處理函式可以專心的功能部分。
  • 由於是 pipeline 的處理,每一個處理的步驟可以做疊加或是順序調整。

最重要的就是可以透過 goroutine 來讓資料處理的 pipeline 變成多線程( multiple threading ) ,細節將在接下來講解。

Advanced Pipeline patterns

在 Pipeline 的進階 pattern 裡面有以下幾種:

  • Fan-In:
    • 將多個 channel 併入為單獨一個 channel 。主要用於在 Fan-Out 之後,要將資料統一並且收集回來的處理方式。
  • Fan-Out:
    • 相反的,就是將單獨 Channel 裡面的資料分散傳送到多個 Channel 裡面,主要用於準備平行處理的前置作業。

主要的應用場景就是,透過 Fan-Out 的方式將資料傳送到多個 Channel 之中,這樣的話可以透過個別 Channel 再來串接相關的 Pipeline (或是平行處理相同的 Pipeline ) ,最後再透過 Fan-In 的方式將平行處理完的資料整理到一個 Channel 之中,作為之後的資料儲存或是相關的處理。

作為舉例上, Fan-In 的相關範例程式碼如下:

Playground 上查看完整可以運行的程式碼。

merge()的處理上,會使用 sync.WaitGroup 來處理 goroutine 裡面需要等待來正確的關閉 out ,並且透過多個 go output(c) 來透過 goroutine 分別處理資料的整合。

Explicit cancellation

此外,除了 Fan-In 與 Fan-Out 之外,因為 Pipeline 的資料處理上經常都是需要比較長的時間,也有可能在處理到一半的時候需要將整個流程暫停或是取消的情況。這時候會需要使用 Explicit cancellation 的方式,拿前一段的 merge()做一些以下的修改:

完整可執行的程式碼可以在 Playground 裡面看到。

透過這段代碼可以了解,傳入的參數 done chan struct{} 主要就是透過 UnBuffered channel 來做邏輯的控制,而其中的:

for n := range c {
            select {
            case out <- n:
            case <-done:
            }
        }

更是主要控制是否要停止的邏輯判斷, select 在 Go 裡面的用法相當有彈性,除了可以做情況的判斷之外,更可以有多樣的 Pattern 可以使用,其中這個範例就是最常在 goroutine 裡面會使用到的。有兩種狀況可以判斷,而 select 自動會走到不造成 block 的那個判斷式。也就是說,如果當 done channel 裡面有數值可以接收的話,那麼就不會等待 out channel 數值接收。

好用的 pipeline package - Go-kit

https://github.com/go-kit/kit 是一個很好用的套件工具,裡面提供了許多有用的小工具,包括了 circuitbreakerratelimit 等等有用的工具。 但是其實裡面有一個好用的 pipeline 套件稱為 endpoint

這邊有一段範例程式碼,在 Playground 展示了如何使用 go-kit 的 endpoint 套件,來實做一個簡單的 pipeline 的功能。 這邊可能讀者也會發現: 什麼時候開始也可以在 Playground 使用 3rd party 的套件呢?

根據這個 tweet ,原來 2019 的五月之後 Playgound 的功能有更新過已經支援 thrid-party import 了。這樣透過 Playground 來討論問題也就變得更方便。

Go-kit endpoint Pipeline + Buffered Channel

最後讓透過 Go-kit 的 endpoint 的 pipeline 套件與 Buffered Channel 的概念,來實做一個簡單的讀取圖片的 Pipeline 。

這個範例程式碼透過輸入的 numOfImageReaders 來在判斷需要多少的 goroutine 來處理相關的功能,也就是 ImageReader(in, out) 。並且預設 Buffered Channel 的大小是 1000 來讓所有的資料都可以馬上被處理而不需要等 pipeline 後端處理完畢。

小結:

本文透過介紹 Buffered/UnBuffered Channel 的介紹來詳細解釋 Pipeline pattern 並且透過一個實務上的案例(照片的資料讀取與處理)來解釋如何應用 Channel 來完成 Pipeline 。

更多相關內容:

Refactoring in Goland for beginner / Julian Chu

本文主要是透過 JetBrains 的產品 Goland 來快速地幫助開發者做重構 (Refactoring) 的相關工作。 相關的影片條列如下:

  • https://youtu.be/oCgoxqDS2tM
    • 利用GoLand重構, 最後面利用move這個重構把struct跟method搬到其他package (move上次沒demo到)
  • https://youtu.be/QTgpVx4bVbk
    • 利用test + auto complete生成struct跟method

整理一下相關問題:

  • GoLand怎麼切換tab:
    • GoLand(alt + left/right, 或ctrl+tab)
    • VScode(ctrl + page up/down)
    • vim/VScodeVim/ideavim( g + t/T)
  • GoLand可以自動載入vimrc嗎還是一定要source:
    • 可以,不過路徑跟名字有限制,ideavim會自動載入~/.ideavimrc 
    • 更多細節在 https://github.com/JetBrains/ideavim#files

相關貼文可以參考:

  • https://www.facebook.com/groups/269001993248363/permalink/1388935217921696/
  • https://www.facebook.com/groups/269001993248363/permalink/1384468938368324/

活動小結

每次到投影片靈感枯竭的時候,就會回 Go Taipei Community 去取暖。去講一場技術分享會讓我覺得格外的心情開朗,感謝當天的夥伴們熱情的討論,也歡迎大家一起來了解。

身為 Golang.TW 的共同籌辦人,真的很久沒有回到社群來單純的給一場技術的分享。藉由這次機會除了能夠分享之外,也能順便回來社群看看好久不見得夥伴們。

立即加入「LINE開發者官方社群」官方帳號,就能收到第一手Meetup活動,或與開發者計畫有關的最新消息的推播通知。▼

「LINE開發者官方社群」官方帳號ID:@line_tw_dev

關於「LINE開發社群計畫」

LINE今年年初在台灣啟動「LINE開發社群計畫」,將長期投入人力與資源在台灣舉辦對內對外、線上線下的開發者社群聚會、徵才日、開發者大會等,預計全年將舉辦30場以上的活動。歡迎讀者們能夠持續回來察看最新的狀況。詳情請看 2019 年LINE 開發社群計畫活動時程表 (持續更新)https://engineering.linecorp.com/zh-hant/blog/line-taiwan-developer-relations-2019-plan/)

[研討會心得] 20190723 Chatbots 11 at 天瓏書局 Coding Space

前言

大家好,我是 LINE Taiwan 的 Technical Evangelist - Evan Lin。這次很開心受到 chatbot 社群的邀請,參加了 “Chatb10ts meetup 聊天機器人小小聚 11 @ 天瓏書局 Coding Space” 的聚會活動,並且分享 LINE API 更新與個人開發的心得。在此也跟各位分享本次參與的心得,並且也希望透過社群分享的力量能夠讓聊天機器人的開發動能更加的盛大。

  • 社群 Chatbots Meetup: https://chatbots.kktix.cc/

  • 本次活動網頁: 活動網址

由於 Chatbots Meetup 本身屬於社群自主性的活動,裡面也有許多社群朋友所贊助的閃電秀。裡面的所有內容也是相當的難得與有趣。也希望能夠透過本篇文章讓大家稍微了解 Chatbots Meetup 社群閃電秀的魅力。

LINE Social API in Go / 資深開發技術推廣工程師 Evan Lin

投影片

首先先跟所有的來賓分享新的 LINE Login API 更新 並且也分享透過更新後的 API 所撰寫的範例網站 https://login-tester-evan.herokuapp.com/ 。 透過以下三個新的 API 可以讓你更了解聊天機器人的相關訊息,分別有:

由於是新的 API 所以 LINE BOT SDK 相關開源套件還沒有加入這些 API ,如果讀者也是開源貢獻者的話,也歡迎各位直接到各個語言的 SDK 去貢獻。 (參考: Python, Go)

第二個部分就是透過 Social API 來完成 LINE Login 的流程,因為 Social API 並沒有官方套件提供給大家來使用,在這裡開發了一個 LINE Social API Go 套件來方便大家開發使用,並且也有更多的詳細內容在於如何透過 Social API 來開發一個 LINE Login 的範例文章在這裡

想要直接感受的開發者也可以直接透過 https://login-tester-evan.herokuapp.com/ 這個網站來做一些測試與了解。 首先在這裡分享透過 Social API 兩種的取得使用者資訊的方式,分別為: 透過 OpenID 的方式與透過 Social API 。

使用 OpenID 來取得使用者資訊

以上循序圖是根據 LINE 官方文件中的 ““Integrating LINE Login with your web app” 教學文件所繪製的循序圖。透過這個流程可以了解,如果在 scope 之中指定好了 openid之後拿到的 access token 之中就會有一個欄位稱為ID Token 可以透過這個欄位來解析出使用者的資訊。

使用 Access Token 來取得使用者資訊

以上循序圖是透過 Access Token 再去取的使用者資訊的方式。如果是透過 access token 要做,需要再透過 access token 去呼叫 Social API 的 Get user profile API(https://api.line.me/v2/profile) 的方式來取得使用者的資訊。 跟前一個方式不同的是,雖然還需要多呼叫一次來取得使用者資訊。

這次的分享主要介紹了一個方便各位使用 LINE Social API 的 SDK 套件,並且詳細解釋了 LINE Login 的兩種取得使用者資訊的方式。

更多相關內容:

Live Coding 使用 dialogflow + Google Cloud Run 實作 LINE Bot - LINE API Expert, Wolke

由 LINE API Expert - Wolke 所帶來的分享,就是現場帶著觀眾透過 DialogFlow 來部署 LINE Bot 。整個內容從對於 DialogFlow 的基本介紹,什麼是 Intent ,什麼又是 Entity ,再介紹如何透過 DialogFlow 串接 LINE Chatbot 的整個流程。

LIFF 從新手入門到實戰經驗分享, LINE API Expert, iCook CTO, Richard Lee

投影片

接下來同樣身為 LINE API Expert 的 Richard Lee 則帶來了 LIFF 從新手入門到實戰經驗的分享,相當清楚地從 LIFF (LINE Frontend Framework) 的基本介紹,到分享 iCook 當初導入 LIFF 的時候所遇到的一些問題。並且也分享了一篇完整的技術文章,透過 vConsole 來 Debug LIFF 的實作介紹,也歡迎大家可以去了解一下。

閃電秀

講解完了主要三個講者之後,接下來就是介紹這個社群最有魅力的部分就是閃電秀。所有的閃電秀可以參考這篇共筆文章 https://beta.hackfoldr.org/chatbot/ ,由於都是五分鐘的閃電秀,主要內容快速用條列介紹給各位:

  • 結合MQTT 以及 LINE API 的快問快答機器人/ NiJia
    • 身為主辦人之一的 Nijia 首先帶來如何透過 MQTT 一個在 IOT 經常使用的輕薄傳輸協定來讓 Device 可以跟 API server 溝通的方式。
  • CUI:如何做出一個不難聊的機器人 / Estelle(小凹)
    • 投影片:
      • https://drive.google.com/file/d/17jX0UFMkkSz96RcYtv6egYv30CbDkUyi/view?usp=sharing
    • 內容分享:
      • 這一場演講分享了如何設計一個好的 CUI (Conversational User Interface) 來讓你的使用者能夠喜歡跟你的聊天機器人互動與溝通,不會因為難聊而容易中斷與停止整個互動的過程。
  • 小小技巧:開發時使用 ssh 作為免費的 ngrok pro / Patrick Liu
    • 介紹開發 LINE Bot 經常使用到的 ngrok 的使用心得。
  • kamigo: chatbot MVC framework based on rails / 卡米哥
    • Github:
      • https://github.com/etrex/kamigo
    • Demo:
      • https://kamigo-demo.herokuapp.com/menu
    • 內容分享:
      • 最後一位閃電秀的講者,同時也是身為 LINE API Expert 的卡米哥,本身也是知名 LINE Bot 「卡米狗」的作者則帶來了一個新的套件 Kamigo 也就是基於 Ruby and Rails 的 LINE Bot framework。透過 Kamigo 這個套件可以很快速地在 Ruby and Rails 上面快速部署出一個 LINE Bot 。

活動小結

社群分享永遠是讓創意激盪的最佳方式,而 Chatbots Meetup 是一個很熱情與充滿創造力的社群組織。也希望有更多有創意的開發者願意加入 LINE Chatbot 的開發行列,更希望能熱情的參與社群的活動與一起來分享。

立即加入「LINE開發者官方社群」官方帳號,就能收到第一手Meetup活動,或與開發者計畫有關的最新消息的推播通知。▼

「LINE開發者官方社群」官方帳號ID:@line_tw_dev

關於「LINE開發社群計畫」

LINE今年年初在台灣啟動「LINE開發社群計畫」,將長期投入人力與資源在台灣舉辦對內對外、線上線下的開發者社群聚會、徵才日、開發者大會等,預計全年將舉辦30場以上的活動。歡迎讀者們能夠持續回來察看最新的狀況。詳情請看 2019 年LINE 開發社群計畫活動時程表 (持續更新)https://engineering.linecorp.com/zh-hant/blog/line-taiwan-developer-relations-2019-plan/)

[TIL][Golang] go/build 與 golang.org/x/tools/go/packages 的差異

前言:

一開始主要是因為看到這個 tweet ,不禁想了解到底什麼是 go/build 而什麼又是 golang.org/x/tools/go/packages

因為 “Developer tools should now use that instead. It support both go path and Go Mod.” 這句話從 @_rsc 講出來更讓筆者想了解這些工具的差異。

What is go/build?

根據 go/build 的 GoDoc 上面解釋,其實 go/build 主要是幫助你取得 Go packages 資訊之用的,當然本身也可以直接拿取原本 binary 的 GOARCH, GOROOTGOPATH 的相關資訊。 當然也是可以取得 packages 相關資訊,至於使用上可以參考以下 sample code.

Sample code for go/build

這個片段程式碼可以解析使用者輸入的套件參數,並且應出所有的套件資訊。比如說你輸入 gobuild flag 就會解析 flag這個套件的相關資訊。

What is golang.org/x/tools/go/packages?

golang.org/x/tools/go/packages 比較專注做套件的解析工作,可以透過 GoDoc 相關資訊來了解,主要透過 packages.Load() 來讀取所有的套件資訊,並且可以透過 packages.Visit()來將所有套件的 dependency 找出來。

而當初設計這個套件主要就是為了 Go Modules 而設計的,大家可以參考相關文件 The Go Blog: Go Modules in 2019 ,裡面的相關敘述。 在 Go 1.11 的 Release note 其實也有提到,在作為 Package Loading 的工具查詢上,雖然 golang.org/x/tools/go/packages 還沒納入 standard library ,但是強烈建議要做 package loading 相關事項的時候應該就要改成 packages 。

Sample code for golang.org/x/tools/go/packages

小結:

golang.org/x/tools/go/packages 在查詢套件資訊的時候,會先透過 GoPath 來查詢,如果找不到就會透過 Go Modules 來查詢。 而 go/build 只要 GoPath 找不到就會顯示套件無法查詢。

這兩個工具在做一些 DevOps 工具或是一些 CICD 的相關工作的時候會用到,就如同 @_rsc 建議的,應該要儘早使用 golang.org/x/tools/go/packages 來查詢相關資訊。但是可惜的是 Bazel 目前還沒有支援。

Reference:

  • https://twitter.com/rakyll/status/1154431863689076736
  • https://godoc.org/golang.org/x/tools/go/packages
  • https://golang.org/pkg/go/build/
  • https://github.com/kkdai/build-package-test
  • https://blog.golang.org/modules2019
  • https://tip.golang.org/doc/go1.11#gopackages

[Golang] 快速整理一些 Go 版本上的差異(使用者角度) (Go version change note since Go 1.3 to 1.12)

前言:

其實從 Go 1.10 之後大概就沒有認真的在確認每個版本的變更之處,所以在這裡整理一下 Go 1.3 ~ 1.12 的變革。 一些快速懶人包如下:

  • 幾個大變動:
    • Go 1.5 : Pure Go for compiler and linker. go vendor.
    • Go 1.11: Go modules and WebAssembly support.

其他好奇的人可以查看 The State of Go.

(用英文寫,因為語言變化用中文實在不好表達)

Go version history (major change):

Since Go 1.3, here only list few major changed you might be interested.

  • Go 1.3 (2014/06/18) (Detail Release note)
    • Start 6 months release cycle.
    • Remove support for Windows 2000
    • Support DragonFly BSD, FreeBSD
  • Go 1.4 (2014/12/10) (Detail Release note)

    • Support build ARM processor of Android system.
    • Support go generate
    • Speed is slightly faster than 1.3
  • (Big change) Go 1.5 (2015/08/19) (Detail Release note)

    • The compiler and runtime are now written entirely in Go (with a little assembler)
      • If you want to build go after 1.5, you need to install go 1.4.2 first.
    • Go programs run with GOMAXPROCS set to the number of cores available.
    • experimental support for “vendoring”
    • Add new tool go tool trace
  • Go1.6 ( 2016/02/17) (Detail Release note)
    • Experienmental port 64-bit MIPS
    • Experienmental port for Android x86 (32bit)
    • HTTP/2 protocol support
    • “GO15VENDOREXPERIMENT” default enable.
  • Go1.7 ( 2016/08/15) (Detail Release note)
    • Support macOS 10.12 Sierra
    • Remove “GO15VENDOREXPERIMENT” support.
    • Full support 64-bit MIPS
    • Move golang.org/x/net/context into standard library context.
    • net/http/httptrace for tracing event in HTTP requests.
  • Go1.8 ( 2017/02/16) (Detail Release note)

    • Remove support for Mac OSX 10.7
    • go fix support context fix from golang.org/x/net/context into standard library context. (which happen in 1.7)
    • plugin package for loading such plugins at run time. Plugin support is currently only available on Linux.
  • Go1.9 (2017/08/24) (Detail Release note)
  • Go1.10 (released 2018/02/16) (Detail Release note)
    • For travis CI, you need to specific version in “1.10”, rather than 1.10.
    • No need set for GOROOT and GOTMPDIR.
    • The go test command now caches test results, to bypass test caching using go test -count=1 to verify if any test failure unexpectly.
  • (Big change) Go1.11 ( 2018/08/24) (Detail Release note)

  • Go1.12 ( 2019/02/25) (Detail Release note)
    • Go’s new windows/arm port supports running Go on Windows 10 IoT Core on 32-bit ARM chips such as the Raspberry Pi 3.
      • GO111MODULE default is on, (go modules will default enable)
    • go tool vet no longer supported.
      • godoc and go doc:
      • go doc begin from 1.4, compatible with godoc
      • godoc goes to pure web service since 1.12.
      • go doc goes to command line tool since 1.12.
      • The ReverseProxy now automatically proxies WebSocket requests.

Reference:

[Golang] 在 KKTIX 上免費透過邀請碼來開邀請票

前言:

身為社群的共同籌劃人,每個月最基本的工作總是在不斷的開票亭,找講者跟舉辦 Meetup。而在舉辦 Meetup 的時候,總是希望可以開放一些邀請票給某些特定的族群(內定名單,工作人員,講者)不需要透過搶票就可以直接拿到票卷,但是 KKTIX 原本的邀請碼是需要透過付費的方式來達成。

其實不用那麼麻煩,可以透過「購票資格」的方式來達成,本篇文章希望能夠幫助有一些人能夠更快的了解。

最後把以前常用的邀請碼建立小工具也開源出來,大家可以拿來用。

建立邀請碼小工具 https://github.com/kkdai/radomtix

流程:

  • 首先先到購票資格去新增一個購票資格,也就是邀請碼的意思。

  • 這裡點選「新增名單」

  • 所謂的名單可以透過「邀請碼」或是某些特殊文字來讓使用者填寫,這裡開始填寫邀請碼。

  • 這時候回到票種去新增一個新的票種

  • 請注意 “必須使用邀請碼購買” 不要打勾

  • 購票資格這裡,就把”Invitation ticket” 跟 “test Invitation code” 連接在一起。

  • 建議可以有購買限制,這樣一個邀請碼只能買一張票。

Reference: