Jan 21, 2020
13 min read
前言 之前做 API server,制定 route path 時有遇到一些問題,於是就順手看了幾個 HTTP router / web framework 的 router 部分實作方式,並且記錄下來,提供給大家做個參考。
問題 需要加入
/stations/instances /stations/{id} 這兩個 path 對應到不同的 handlers。
Chi package github.com/go-chi/chi
知名 HTTP router library chi,其輕量、快速、handler 使用原生 net/http struct,都是不錯的優勢。和多數主流的 HTTP router 相似,chi 的 router 是採用 radix tree 結構,比較特別的是 chi 將 node type 分成四種:
Read more → Jan 19, 2020
16 min read
前言 由前篇 文章可以知道,使用 stack data structure 是最簡單的 memory allocator 入門寫法,但是卻會造成一些問題,例如不能任意順序 free 等。既然如此,我們就換成 list 來實作 memory allocator,解決使用 stack 實作的問題。
除了實作之外,也會討論到幾個實作 allocator 上遇到的問題,例如 sbrk,以及 minimum alignment。
Memory allocator 要素 在實作之前,先歸納一下 allocator 需求。 Computer Systems(book) 與 CS 4400 – Computer Systems 說明幾個 allocator 要素,包含:
Handling arbitrary request sequences Aligning blocks (8 bytes on 32-bit and 16 bytes on 64-bit) Not modifying allocated blocks (compaction is not allowed) How does free know an allocated block’s size? How is unallocated space represented? How do we keep track of free blocks? How do we choose an appropriate free block? 依照上列條件,可以知道 stack 形態的 allocator 其實並不能滿足基本 allocator 需求(例如:arbitrary request sequences),因此後續在實作 implicit free list 的時候,也會根據上列來一一檢視是否有達成需求。
Read more → Dec 30, 2019
6 min read
2019 年過去了,不免俗地跟風一下,回顧今年做了哪些事情。整體來說 2019 年對我來說是一個正向的轉變,包含職位、生涯、薪資、技術能力等,至於促使這些轉變的時機。我覺得是好好把握突然來的機會,以及當覺得這個方向好像和自己想做的有點不合時,就要勇於開拓新的方向。
Front-End to Back-End 首先,最大的轉變大概是從專職 front-end 變成 back-end 吧。而這個動機在於很多人在聽到我是商科轉職,就說我一定是去做前端,因為前端對他們而言技術能力需求低,即使文組也可以勝任,其他資工系本科出身的不會去寫前端。當然這樣的想法很過時,而且說這些話的人大概也寫不出來像 angular, react 之類的框架,不過為了證明自己能力,還是不爭氣地開始尋求 back-end 的機會,也很幸運地進入趨勢科技開始寫 Go 。
至於要如何從 front-end 轉成 back-end ,我個人是認為資工基本功非常重要。有一些人會說反正大部分的工作又用不太到高深的資料結構和演算法,我倒不是很認同,基礎理論就像是內功,當你在寫 code 的時候,有了這些基礎,就會很自然地留意到這項寫會不會有效率,或是這個功能該用怎樣的型態比較好。另外,我也覺得作業系統和網路概論很重要,在做 back-end 的時候一定會接觸到網路封包和 linux OS 等議題,有了這些知識,在發生 bug 或是 trace source code 的時候都會幫助很多。
參與 Golang 社群和新竹 GDG 社群 這時回想起來,那時候會加入 Golang 社群根本就是一個意外。一開始由 Evan 在線上詢問要不要來分享 Golang 題目,我其實根本還很菜,但不知道為什麼就同意了這件事情,也花了很多時間準備分享的報告。老實說那時候報告起來蠻鳥的,第一次分享又特別緊張~但 David 還是邀請我加入 Golang 志工團,就這樣很突然地加入了,並且開始陸續在新竹地區分享自己很喜歡的主題。
Read more → Dec 5, 2019
7 min read
前言 12/01是我生日,於是給自己放了一個禮拜的休息假,每天下班回去就是睡覺或是滑手機放空,除非公司 slack 出現訊息,不然很少打開電腦。老實說放假的感覺挺好的,沒有進修進度壓力,也可以好好休養身心~不知道是不是剛換環境以及天氣變化的關係,感冒時好時壞,這幾天就去大醫院照內視鏡和超音波做詳細檢查,幸好沒有什麼問題,就是抵抗力弱了一點(該不會是身體又發現我早午餐都沒怎麼吃吧QQ)
剛到職新創公司滿一個月,來說說感想~其實還沒加入之前蠻擔心的,畢竟聽說新創公司變動很快,不太清楚自己能不能適應,之所以加入完全是賭上對於主管和同事能力的信任。不過來了一個多月,感覺還不錯,除了福利好之外,還接觸到之前沒有機會實戰的技術。更有意思的是,每個產業都有自己的特色,去吸收那些產業知識和市場訊息,可以擴大自己的眼界。現在唯一比較有壓力的是英文口說 XD 還有許多年紀輕輕但是身懷絕技的同事們,進而督促自己不能懈怠才行。我覺得新創公司的好處是,每個同事都有自己的理想和態度主動積極,在那種氛圍下,自己也比較不容易懈怠。
生日剛過完,對自己也有些期許,其中最大的目標就是對 Google cloud platform 熟悉並且考到證照,既然決定要走 Cloud 開發,那當然要耕耘相關 infrastructure ,才能更妥善地利用這些服務來開發 application。當然我對作業系統還是很有愛,希望今年可以多讀一些相關論文,甚至可以啟發自己寫一點寫論文出來。之所以會這樣想,是因為發現自己還蠻喜歡做 research 的,可以讓自己對某些領域的學術知識更加了解。
預定目標回顧 1. 以工作為主的 Cloud 相關工作和概念學習 (100%) 這部分主要是學習到了 Google Cloud 的服務,像是 Endpoints, Storage, SQL 和 GKE 。除了學習如何調整這些 service 的行為和設定之外,也看了 document 來了解運作原理。目前將重心放在 Endpoints ,至少在 debug 的時候,可以快速知道 Endpoints 回應的錯誤可能是哪裡出了問題,或是當使用者打 API 時候發生錯誤,也要能知道問題是出在哪一端。另外還有 Cloud SQL,主要是測試 query performance 部分。
Read more → Nov 19, 2019
6 min read
前言 這次又來挑戰在新竹分享啦!每次來工程師大本營分享主題都蠻緊張的,很怕會被下面的工程師夥伴慘電,但即使如此,還是非常希望可以在新竹開講,畢竟新竹很多軟韌體工程師,講起 Operating System 時候,共鳴點比較多~
本次主題主要是想針對使用 C 的工程師來說明 Go 語言的特性,因此在內容上可能相對比較抽象,沒有太多 Coding 部分,絕大多數都是在 Go 是用什麼樣的方式來實現他的特色,例如 user-space scheduler。而這場參加的人數竟然有 20 幾位,算是 GDG Hsinchu 開辦以來人數最多的一次,由此可知大家對於偏底層的內容還是很感興趣,希望之後有機會可以討論到更深的主題!

Slides Move from C to Go Slides
Move from C to Go - Introduction 這個 section 其實就是大概介紹 Go 語言十週年慶和 Go 起源,個人覺得最重要的是關於 Go 之後未來的發展,包含:
Read more → Nov 5, 2019
8 min read
前言 應該是開始要努力分享一些學習到的內容了,十月份又變成只有學習日記,快要變成流水帳版了(誤)。十月卡了一個期中考大魔王,而且更可怕的是出社會太久都把微積分忘光,所以又回去複習。這次考試大多是證明,證明就是一個如果一開始錯誤,後面就會接連錯下去的東西~雖然證明不太好念,不過覺得過程中可以幫助釐清邏輯,再加上有考試壓力,還是收穫不少,當然考試分數也沒有太低啦哈。
十月依然是一個不是很平靜的月份,花了不少時間在處理人生大事上,中間還發生跑去韓國旅遊,結果不是很好玩的慘痛回憶。不過有一位姊姊跟我說,最令人印象深刻的通常不是什麼美好的回憶,所以雖然這次經驗不太好,但是下次就會知道如何應付,也是一種人生學習~這樣聽起來好像感覺就好很多,默默地放下這事情了。
希望十一月份可以更好。
預定目標回顧 1. 其他語言或工具學習 (100%) 這個月看了蠻多 database 的影片和寫作業。我在英國上過資料庫導論,其實英國教授那時候就教的不錯,只可惜 CMU Database 上的更完整一點。印象深刻的部分包含:DB 是用什麼方式來儲存 tuple、DB 可能會有自己的 scheduling 來進行寫入、以及 DB 也是有 free list 來管理目前 tuple 紀錄。對於這些關於 DB internel 的學習,覺得非常有收獲,所以非常有收穫~
2. 演算法學習 (80%) 主要複習內容就是考試內容啦,其實不難,不過要如何合理地論證,這是比較需要細讀的地方,尤其是大於小於這些,在證明時要合理地去使用,才能正確地算出 time complexity。另外就是開始進入紅黑樹、Dynamic Programming 啦,雖然上課都有專心上課,但是缺少下課完整的複習,所以只算達到 80%。
3. Memory Allocator (50%) 這部分主要是看 Free List,而且還找到很不錯的線上教材 Computer Systems Fall 2018 ,老師講解地清楚,內容也相當實用,用來複習 OS 或是增加相關知識都很不錯,強烈推薦。不過之所以只給 50%,是因為只有看 Global 類型的 free list,沒有去看更多關於 thread free list,以及沒有一個完整的實作 demo,十一月如果有空的時候要來補一下範例。
Read more → Oct 5, 2019
9 min read
前言 這個月是一個比較多事的月份,主要原因是重新調整了生涯規劃。雖然自己出社會也快要十年了,但是轉職成 Engineer 也才不過這兩年的事情,因此自己還像是一名剛出社會的半新鮮人一樣,到處地探索自己喜歡的事物,不斷地從過程中試圖挖掘出自己的熱情所在。
很好運的是,我覺得我在這過程中一直有貴人相助,例如我加入 Moxa,再因緣際會地加入趨勢科技,進而進入 Golang 社群開始與其他 co-organizer 辦活動等。老實說,我在群體中一直都是最菜的那位,但是大家給予我很多機會成長,讓我有機會接觸到各種事務,雖然依舊還是很菜,但至少開始有點經驗,知道自己該用什麼方式來找出問題點,在面對新技術的時候,可以從哪個方向下手讓自己快速學習。
要說下一個目標嗎?大概就是希望哪天能憑真實力對戰吧(誤)。目前大家對我的評價大多是認真上進積極,不過這些評價只能代表努力,無法展現出個人能力,希望哪一天可以用真實力來讓人欽佩。
預定目標回顧 不得不說,這個月太多事情煩心,所以目標有點偏移掉了。另外還有自己太過貪心,在學習的時候希望能掌握各個方向,導致稍嫌發散,這是後續需要改進的地方。總而言之,這個月份完成度蠻低的,要調整一下自己學習方向,不能什麼都想要學。
1. Linux kernel development (30%) 上個月預定是要看三章,結果實際上只有看一章《Memory Management》。主要原因是因為看到 Jserv 所貼的 mimalloc 共筆分享 ,結果注意力整個被共筆內容吸引過去了。我很喜歡 memory management,之前有看 Golang 的 memory management system,不過感覺自己只是了解大概,並不能具體說明出這樣做法解決什麼問題;再加上 Golang memory management 其實是 TCMalloc 分支版,一直很想了解是基於什麼原因而要做如此改變。
基於這個原因,就產生出一篇基於 stack 而成的 memory allocator ,接下來希望實作其他 memory allocator,從這些基本實作進而了解到 memory allocator 實作差異的真正用意。
Read more → Sep 24, 2019
9 min read
前言 在很多程式語言都會看到 memory allocator,也可以看到陸續發表的 allocator 實作方式,例如 microsoft mimalloc 。與其用看 source code 的方式來了解其原理,倒不如從基本學起,並且從實作過程中了解到為什麼他們要這樣設計 allocator。
原因 在程式開始執行時,我們可以預期會有兩塊 default memory space (system stack, heap) 分配,其中 system stack 負責存放 function return address 或是 local variable 等,而 processor 的 stack pointer 會指向 system stack 的初始位置(可能往下長或往上長)。另外的 heap 則是供 dynamic memory allocation 使用。
Read more → Sep 7, 2019
6 min read
前言 8月份有蠻多事情要處理,首先是 Go Taipei 社群和 DigitalOcean Hsinchu 合辦 Meetup,這也是我第二次在 Go 社群分享主題。而這次探討的主題和 Lock 相關,再加上會涉及一些系統相關議題,因此花了蠻多時間在看相關素材和實作細節,非常怕在 QA 時間被問到什麼很艱深的問題XD 其實每次分享,對分享者來說都是一個蠻有挑戰性的任務,主要是因為這些內容都需要蠻多時間去準備,而這次在工程師大本營新竹來分享,更是膽戰心驚,深怕不能帶給聽者有幫助的知識。不過,幸好這次 Meetup 安然度過了(所以才有時間來整理 8 月份的學習心得),當面認識了一些人,也交流了不少,很開心 :)

另外,這個月另一個挑戰是身體有些狀況,倒也不是啥嚴重病症,不過就是頻頻感冒發炎又牙齒痛,深深感受到工作雖然重要,但是身體還是要顧啊~尤其是看牙齒,做一次根管治療都蠻昂貴,本來想說應該沒有太多蛀牙,沒想到又有一個需要根管 QQ 看來要再更小心牙齒清潔了。
最後,這個月蠻多學習資源都是書籍,所以沒有太多 reference 可以分享。不過這個月看了 Linux Kernel Development 和 Perfbook ,覺得真是獲得非常多有用的知識,把虛無飄渺的作業系統更具體的呈現給讀者,非常推薦!
預定目標回顧 根據七月初紀錄,七月要完成的目標包含:
1. Go 聯合 meetup 分享講者,準備報告內容 (100%完成) 順利完成,報告 sildes An Introduction to Locks in Go
Read more → Aug 27, 2019
14 min read

前言 主流使用 HTTP/2 時都是基於 TLS protocol,不過在 HTTP/2 RFC7540 規範中, HTTP/2 其實也可以直接基於 cleartext TCP 來溝通。這次主要介紹 based on cleartext TCP 的 HTTP/2 server 與 client 實作,後續會再加入 HTTP/2 結合 TLS protocol 的相關內容。
HTTP/2 Version Identification 在 RFC7540 3.1 中有明確定義出 HTTP/2 on TLS protocol or cleartext TCP 的識別號,這個識別主要用於 client 端詢問 server 對於 HTTP/2 的 protocol 支援,以及切換到 HTTP/2 的過程。
Read more →