Jun 24, 2020
5 min read
在分享 Go string to slice 議題 文章後,有朋友(感謝@陳孝思)在社團裡面分享另一個議題,關於在 strings package 的 builder 中有避免 escape analysis 的方式。基於這個分享,我就去查閱了相關 source code 和 issues ,並且整理成此文章。
Escape analysis escape analysis 是協助 Go compiler 判斷要將 variable 分配在 goroutine stack 還是 heap 的方式,而由於變數的分配位置會關係到 garbage collection 進而影響效能,因此 escape analysis 也是 Gopher 所在意的議題之一。
Read more → Jun 1, 2020
4 min read
日前在看 Go runtime/string.go source code 的時候,意外看到一篇文章 Go中string转[]byte的陷阱 ,不過這篇文章的日期間隔已久,Go version 也從文章中的 1.10 改版到 1.14 了,所以想要更新一下這個議題現況。
Version Go version: 1.14
問題摘要 1. runtime.stringtoslicebyte 首先,文章中提到的例子:
1
2
3
4
5
6
7
func main () {
s := [] byte ( "" )
s1 := append ( s , 'a' )
s2 := append ( s , 'b' )
//fmt.Println(s1, "==========", s2)
fmt . Println ( string ( s1 ), "==========" , string ( s2 ))
}
在沒有 fmt.Println(s1, "==========", s2) 這一行的情況下,output 會產生:
Read more → May 28, 2020
8 min read
如果想要在 Google Cloud Platform 的 GKE 上使用 Ingress 功能,最簡單的方式就是用 GKE 本身預設提供的 ingress-gce controller。不過不知道大家在設定 ingress yaml 的時候,有沒有留意到 ingress-gce 規定 service type 只能是 NodePort,但是 ingress-nginx 卻沒有這種限制呢?
本篇文章會從 Google Cloud Platform 所提供的 load balancer 服務開始說明,並且結合 ingress-gce controller,讓大家瞭解兩者的運作方式和限制原因。
首先來說明 Google Cloud Platform 的 external load balancer 的運作流程:
Read more → May 19, 2020
4 min read
在 Trace transfer.sh open project 有提到我目前正在調整 transfer.sh 這個 open source project,把它修改成內部所需要的一個 service,而之前已經改得差不多了,所以簡單地來介紹一下修改了哪些內容:
需求 每個 download request 能依需求驗證 IP address 和 user account / password 能使用外部 service 來驗證 user account 需能支援 curl cmd tool k8s deployment 修改項目 1. Middleware Chain 根據需求 1,在 getHandler 前加入 middleware chain,其中包含:
Read more → Apr 29, 2020
3 min read
在 Multilingual Mode in Hugo 這篇文章中有提到目前使用 Hugo site generator 產生 multi-lang site 的問題,使用者必須要為每個語言都建立一個檔案,才不會造成最後在產生網站後,發生某一個語言的頁面遺失問題。(例如,使用者一定要建立 about.md, about.tw.md,這樣當瀏覽者在選擇中文語言的網站時,才會顯示出 about 頁面)。這樣其實會造成不少困擾,因為不是每個語言都可以這麼即時的被翻譯完成,但我們又不希望有頁面遺失,因此需要透過一些方式來解決這個問題。
而其中一個方法就是建立一個 symbolic link,當某個語言還沒被翻譯時,就建立一個 symbolic link 來代表這個檔案,然後實際檔案則指向預設語言的檔案。
因此,side project github.com/YuShuanHsieh/hugo-langs-symlink 就是為了這個目的而誕生的,用我熟悉的 Go 語言來編寫,使用者可以透過參數來決定要建立 symbolic link 的語言和檔案對象。Project 簡單地提供 create 和 remove 兩個 sub command ,這樣用戶就能直接在 local 端操作和刪除 symbolic link,避免產生過多的 symbolic link 而影響到 git commit。
Read more → Apr 22, 2020
11 min read
這兩天在試著部署 Discourse -目前主流的 forum open porject。雖然它有 cloud 版本可以用,不過因為基於一些因素,我們打算先自行部署,給團隊成員實際試用測試過後,再來看是否要使用官方提供的 Cloud 付費版本。而在部署的過程中發現蠻多問題的,所以也一併記錄下來,給想要自行部署的人參考。
Discourse Container 首先在 Discourse container 部份,我們選擇由 bitnami 所維護的 bitnami/discourse 版本,原因是它提供相對完整的 configuration 和流程,事後證明這個選擇也是對的,因為我有嘗試使用 Discourse 所提供的 container 來部署,結果根本是場災難,畢竟官方所提供的 container 本來就不適合用在自行部署,除了流程複雜之外,size 也大許多 (2.5GB)。
Version Discourse 版本部分,目前 (2020/04) 官方是 2.5.0 beta,而 bitnami/discourse 則是 2.4.1 也就是官方所提供的最新穩定版本,因此不會有太大的版本落差。
Read more → Apr 15, 2020
8 min read
因為工作需求,需要一個透過 cli 就可以 upload 和 download 的工具,剛好 open project transfer.sh 有提供類似的功能,不過我們有額外的需求,包含每個 request 都要能 fiter IP 和執行 HTTP Basic Auth 驗證,因此就有這個機會來分析一下 transfer.sh source code 並且後續可以針對我們需求來修改!
Source code 分析 HTTP Router 首先來看 transfer.sh 的 source code,這個 project 其實程式碼蠻少的,所以大概花個幾個小時就可以大致了解運作方式。transfer.sh 是一個簡單的 Web server,其 path router 是使用 gorilla/mux,雖然 gorilla/mux 的 path search 是 slice 設計, route 效率不比 radix tree router 效能好,不過因為這個 Web server 的 path 也不多,所以就還可以接受。
Read more → Apr 7, 2020
13 min read
紀錄用 Hugo site generator 建立多語言網站時所遇到的問題,與過程中相關的學習內容,包含 Hugo render 過程、source code trace 等。
預備知識 The flow of Hugo Render Hugo 是一個 Site Generator,那他是怎麼產出這些 static html 的呢?首先程式會先遍歷在 content folder 底下所有的 folder 和 file,並且組成一個 contentTree (題外話, contentTree 是採用 radix 資料結構)。然後再把這些 content node 根據 node type (e.g. type 可能是 sections or taxonomies) 去對應到 layout folder 內的 template,接著 render 出最後的 html 頁面。(也可參閱 hugolib/site.go 由 Hugo 開發者所寫的簡易流程)
Read more → Mar 31, 2020
6 min read
三月一整月都在非常忙碌的情況下度過。
搬家 在經過漫長地油漆、裝系統櫃、打掃等流程,我在竹北的新房終於裝潢完成,因此在三月初的時候就很匆忙地把租屋處退掉,並且搬來新家住。本來租屋只有十坪大小,現在換成近三十坪的生活空間,突然有點不太習慣,需要清潔的區塊也變大不少,也開始體悟掃地機器人的重要性。由於當初在買房子的時候,有點太快做決定,因此一直很擔心新家會不會有什麼不好的地方,不過現在搬進來幾個禮拜,覺得一切都還蠻美好的,樓上樓下鄰居都不會吵鬧,社區環境安靜單純,戶數不多所以整潔還不錯,主委也非常盡責。
Read more → Feb 24, 2020
2 min read
最近一個月發生了一些事情,導致又一陣子沒有更新技術文章或是讀書日誌。
一月底的時候在工作上發生了一件事情,讓我突然間深深陷入負面情緒中。其實我早在事情發生之前是有所選擇的,我可以選擇穩定或是挑戰,而我在那時候選擇了挑戰,即使這挑戰讓我付出蠻多代價,包含家人的不諒解、長距離通勤等,我在事情沒發生之前都覺得這一切代價都算值得。
在事情發生後,我其實剛開始的幾天是非常沮喪的,我覺得我那時候做了錯的選擇,才會讓自己陷入進退兩難的局面。我本來就是轉職人生,這樣的背景讓我更難坦然地面對現實,因為我要付出的成本比團隊工程師們都要高。
不過在冷靜之後,我開始回想,我在這段短暫旅程中,是否有達到我當初的目的。
我有幸跟強者同事一起工作
有很好的主管讓我 work from home
我接觸到我之前不會碰到的 cloud service 和相關 infrastructure
我開始念起 AWS 和 GCP 並希望可以考過證照
如果當初我沒有選擇這條路,會有現在的我嗎?我覺得應該很難。
我學到了很多東西,即使結果可能不如當初想的一樣,但我還是在這過程中學到不少技能和回憶。
如果再問我一次,我會說我不後悔當初的選擇。
我不太確定未來會怎樣發展,但是我會繼續地把新學到的技能,一路地深入堅持下去。
Read more →