[研討會心得] 20190829 NAVER x LINE AI-Rush 2019 總決賽心得分享

什麼是 AI RUSH

大家好,我是 LINE Taiwan 的 Technical Evangelist – Evan Lin。去年於日本東京舉辦的 LINE DEVELOPER DAY 2018 會中,LINE 技術長朴懿彬以「Next LINE」定調 LINE 在技術上的發展願景,其中人工智慧、區塊鏈,與金融科技三大領域的相關技術,將扮演舉足輕重的角色,並以兩大關鍵字「串連(Connect)」與「互惠生態圈(Mutually Beneficial Ecosystem)」點出實現「Next LINE」所帶來的具體價值,讓 LINE 的服務持續進化。

為了探索 AI 的更多可能,並為 AI 開發社群提供一個切磋交流的平台,LINE 將首次與南韓市占第一的搜尋引擎 NAVER 聯手舉辦以人工智慧為主題的跨國黑客松「AI RUSH 2019」。「AI RUSH 2019」官方網站:https://ai-rush.com/

活動過程:

(圖片截至於 AI-Rush 官方網站)

整個 AI-Rush 活動分成兩個大部分,線上初賽與線下的決賽。 首先線上的初賽題目為「圖像分類 (Image Classification)」的題目,參賽者必須在 08/13 之前送出第一個階段的解法,最後經過挑選出最後的決賽隊伍,前往韓國春川的 NAVER Connect One 進行總決賽。

經過了第一階段的激烈競爭之後,透過第一階段的結算分數選出了總共三十個隊伍。要出發前往韓國來進行總決賽。 這次很開心台灣有四個隊伍進入了決賽,我也在韓國的仁川機場一路的陪伴他們往總決賽的場地勇敢邁進。

NAVER Connect One 總決賽:

08/26 全員到齊

08/26 當天在仁川機場迎接台灣的四隊代表隊伍後,就直接驅車前往位於韓國北方春川的 NAVER Connect One 的決賽場地。第一天到了當地其實已經是傍晚了,稍作休息後,我們就直接到餐廳來吃晚餐。

NAVER Connect One 的餐廳其實相當的乾淨,並且有專門的人員幫忙打理所有參賽者的餐點。在這邊的餐飲讓比賽的夥伴相當的安心與滿足。 吃完了晚餐過後,不少隊伍回到房間開始討論明後天的工作分配與相關準備,可以看得出來每一個參賽夥伴都躍躍欲試的樣子。

當然活動的特製貼紙與 LINE Developer 貼紙也是不會少。會場四周都有提供滿滿的貼紙讓參賽者可以自由地取用。當然也有不少本次活動特製的 “AI RUSH 2019” 的貼紙。

08/27 正式開工

“AI is the new black” 是這一次比賽的 Slogan 也是取自於 MIT Technology Review 2017 的文章。也就是代表著 AI 就是這個時代中最令人興奮與讓人覺得最跟得上時代的。 這也是 AI-Rush 想要參與的人都能感受到的。

這個會場是這次主要 AI-Rush 總決賽的 Hacking 的場所,在這個光線充足並且舒適的場地討論其實相當的棒,外面並且有供應源源不絕的甜點,飲料跟泡麵,讓每一個參賽的夥伴可以專心的討論與思考該如何尋找出最適合的運算方式。 就算是晚上或是半夜你都可以到這個會場中找到食物與參賽者來討論。 第一天的晚上就聽到有不少的團隊夥伴,因為半夜想吃點宵夜,於是到了會場跟大家一起 Hacking 。除了可以找靈感,也可以跟不少參與的夥伴來相互認識。

Quiz Game

在兩天一夜的 Hacking 過程中,每一個參加隊伍都相當的緊繃,全部人都相當嚴肅的面對的電腦螢幕。為了讓每一個參與的夥伴可以除了 Hacking 也能夠盡情地參與討論與互動。 主辦單位在 10:00, 14:00, 16:00, 20:00 與 22:00 都有安排小測驗 (Quiz time) ,並且在每一個 Quiz 的獲勝者都有機會可以得到相當珍貴的相關贈品。 這樣的小測驗除了可以讓每一個參賽的隊伍稍微放鬆心情之外,也可以吸引更多的參賽者在會場跟其他隊伍的互動。 讓整個活動相當的生動有趣。

小測驗的形式分為以下數種:

Quiz: 小挑戰

“剪刀,石頭,布” 這是一個很有趣的互動遊戲,也是一個讓台下的辛苦參與者可以伸展身體。透過主持人手舉起來玩猜拳遊戲,必須要贏過主持人(如果平手也被視為是淘汰),才能晉級。剩下最後的幾位才有機會來前面領取相關的贈品。

也有其他有趣的小挑戰:

  • 看兩張圖片找出不同的點。
  • 猜猜圖片是誰的照片。
  • 一些關於 LINE 的小歷史。

這些小活動的設計,除了可以讓會場的參與夥伴們有相關的互動之外,也紓解了競賽所產生的緊張氣氛。讓每個參賽者可以更認真的面對問題。

Treasure hunting

img img

除了有趣的小 Quiz 之外也有尋寶遊戲。主辦單位在活動會場周圍與餐廳的四周有隱藏有一些小紙條,只能能夠找到這些小紙條,也可以在每天的結尾前跟主辦單位來兌換相關贈品。 所以可以看到許多的參加隊伍除了在會場 Hacking 之外,也可以看到他們在會場與餐廳的周圍不斷地尋找相關的“寶藏“,畫面相當的有趣。

贈品

為了讓參賽者更能夠盡情享受互動的 Quiz 與 Treasure Hunting ,主辦單位的贈品準備的相當豐富。 想必每一位參賽者應該都收穫滿滿的。

08/28 名次揭曉與頒獎

激烈的競賽總是有揭曉的一天,最終恭喜來自於日本的團隊獲得了第一名的殊榮,第二名來自於東京大學的同學而第三名則是來自於韓國的同學。 這三個團隊也都樂於分享,也都在台上分享了如何分析資料,並且透過對於資料的了解方式來分享得到高分的技巧。

08/29 放鬆之旅

最後一天為了所有的參賽者安排了輕鬆的行程,工作人員們安排了韓國的鐵道自行車旅遊。整段旅程有接近兩個小時的放鬆行程,除了可以觀賞漂亮的鐵道風景之外,也有一些隧道有獨特的感受。每一個參賽者也都放鬆下盡情的享受韓國美麗的風景。

午餐則是選擇有名的春川雞,在具有風味的韓國餐廳之內享受韓國春川的風味餐點。每一個參加者都告訴我三天的行程下來,除了寫程式 Hacking 之外,大概就是不斷的吃東西。不論是 NAVER Connect One 的美食,小餐點甚至到了最後一天的春川雞。每一個參賽者都感受到主辦單位的用心與韓國的美食。

活動小結

一整個月的活動,最終選出了來自全世界的三十對決賽隊伍。三天密集的總決賽除了感受到每一個參賽團隊的熱情,更可以感受到大家對於追求最佳數據模型的專注與不妥協。 每一個團隊都希望到了最後一刻還可以想出更好的數據模型來解決使用者的問題,來尋求資料背後真正代表的意義。 我想這也是 AI-Rush 想要每一個參賽者能夠獲得的,更期待下一次與每一個參賽團隊見面的機會。

立即加入「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/)**

[研討會心得] GopherCon2019 心得分享 - How Uber Goes (1)

前提

偷個懶來看一下 GopherCon 2019 ,順便了解幾個有趣的議題。

GopherCon 2019: Elena Morozova - How Uber Goes

Youtube

最近 GopherCon 2019 的影片陸續上架了,歡迎大家記得去查看。一起來了解一下今年最新的分享。 今天分享一下這一場我覺得很不錯的題目,就是 How Uber Goes 。
Uber 工程師分享了從 2015 年之後導入了 Golang 之後遇到的幾個常見問題:

  • 建立大量的新服務。
  • 經常要切換不同的服務開發。 (Context Switching)
  • 要交付全球化的服務。

而解決方式則是透過以下三種方式:

  • Dependency Injection
  • Consistent Code Structure
  • Monorepo

由於這些問題,所以 Uber 內部首先為了方便建立不同新的服務而開發了 Dependency Injection Library - fx ( https://github.com/uber-go/fx ) ,透過 fx 開發不同新服務也變得更加的方便。 接下來有提到如何將每個不同服務會使用到的架構做一致性的架構設計,讓不同的服務之間程式碼能夠變得更好維護。最後透過 Monorepo (也就是所有的代碼都在一個很大的 repository 上面,而不是個別專案中) ,在套件版本的更動上也變得更加的方便(可以一個 commit 幫大家更新)。

Refer:

  • https://github.com/uber-go/fx

  • https://godoc.org/go.uber.org/fx

  • https://eng.uber.com/tag/uberfx/

  • https://www.youtube.com/watch?v=LDGKQY8WJEM

[Coursera] How Google does Machine Learning

Machine Learning with TensorFlow on Google Cloud Platform 系列上課心得

  • How Google does Machine Learning (本篇文章)
  • Introduce Tensorflow

How Google does Machine Learning 課程鏈結: 這裡

文章鏈結:

  • 課程僅有一個禮拜。本篇文章。

前言:

這是第二次的 [ML Study Jam 培訓計劃] 的免費課程,也是可以透過免費學習的經驗來拿取 Tensorflow T shirts 的計畫,當然我是不會錯過的。但是這次的課程是透過 Coursera 來完成,所以整體的課程上比重變得比較多,而且需要有更多影片與相關課程內容的討論。

課程大綱:

第一週主要都是 Machine Learning 經常會遇到的問題,以及 Google 在這方面是如何解決的。算是比較簡單的常識,這裡就不贅述。幾個需要注意的部份如下:

  • 許多在實驗室產生的數據模型 (model) 拿到實際上線無法正確使用,是因為資料的產生方式。不夠新,不夠實際。最好的改善方式是透過批次建立模型與 streaming data。

  • 這邊有討論到一些建立數據模型的時候,如果發現效果不夠好的時候應該要如何處理。一些建立的方式有:

    • 找出尚未發現的影響力特徵( Feature ),將其加入。
    • 增加適當的訓練數據。

到後半段主要介紹在 Google Cloud 裡面的一些基礎運用,由於大部分東西重複性有點高,在這裡就不贅述。

小結:

整篇課程算是相當的基本,不小心選錯了。就當作是複習吧!

Reference:

[TIL][Golang] 如何在你電腦上安裝嘗鮮版本的 Go(lang)

Go 1.13rc1 在 08/22 推出,裡面包含了一些新的功能讓人想試試看。但是僅僅想要測試新的語言功能卻不希望更改工作環境的設定。這裡提供一個新的方式,就是直接將最新版本到 Go binary file 下載,而不直接替換你工作環境。

Download Go binary by using go get

透過 go get golang.org/dl/go1.13rc1 的指令(後面也可以快速更換成任何你需要的版本),你就可以下載安裝檔案在你的 $GOBIN 下,透過執行 go1.13rc1 download 就會下載完整的執行檔案。 預設的安裝路徑會是 /Users/YOUR_NAME/sdk/go1.13rc1/ 。 之後就可以透過 go1.13rc1 直接嚐鮮最新版本的功能。

安裝多個版本的 Compiler

透過這樣的方式,你也可以快速的安裝多個版本的 Go(lang) binary 來做相關的 regression testing 或是跑一些 performance benchmark 。以下為一個簡單的範例來安裝舊版本的 Go 1.11 :

  • go get golang.org/dl/go1.11
  • $GOBIN/go1.11 download

希望這些能幫助到大家,一起來嚐鮮吧!!

[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/)