0%

貝祖曾說:對任意兩整數 $a,b \in \mathbb{Z}$ 一定可以找到 $x,y \in \mathbb{Z}$ 滿足 $gcd(a,b)=ax+by$。此即為貝祖等式 (Bézout's identity)。雖然網路上許多相關證明,但個人認為這些證明都有一個通病,也就是過程中省略許多步驟與解釋,讓人看得不明所以,無法輕易得知該步驟是根據什麼道理得來的。這篇文章主要為這些證明補上個人的想法,使證明過程容易理解。

閱讀全文 »

HTTP 搭配 TCP/IP 來運作是常見的案例,但實際上 HTTP 本身只假定下層協定會提供可靠的傳輸,所以只要任何滿足可靠傳輸的協定都能成為 HTTP 的下層。在行程間通訊 (IPC, Inter-Process Communication) 應用情境中,較常使用 Unix Domain Socket (UDS) 來取代 TCP/IP,例如:docker 指令透過 Docker Server 建立的 UDS 發送 HTTP Request 給 Docker Server。因此,對開發者來說,知道如何對使用 UDS 作為下層傳輸協定的 HTTP Client 進行測試是重要的。

閱讀全文 »

HTTP 是廣受使用的傳輸協定之一,其為客戶端 (Client) 與伺服器 (Server) 通訊訂定一個 Request/Response 標準,可以輕易地使用瀏覽器、爬蟲工具等遵守 HTTP 協定的 Client 來對 Server 發出請求以取得資料。在程式開發中,透過 HTTP 呼叫第三方 Server 的 API 是常見的一個行為,例如:LINE Notify、Firebase 等服務,背後皆是使用 HTTP 與其 Server 交換資料。為了確保邏輯正確性且提高代碼品質,正確撰寫 HTTP Client 的測試就變得格外重要。

閱讀全文 »

Golang 官方提供的測試工具 (go test) 與其他工具 (cover、race detector … 等) 高度整合,讓我們僅使用一個指令即可得到 Test Coverage 數據、偵測 Race Condition 等等。此外,隨工具而來的測試框架讓 Gopher 有規則可以共同遵守,不僅提昇開發者體驗,同時降低團隊間的溝通成本。在我們深入撰寫測試案例之前,先瞭解 go test 相關功能與使用姿勢將會有一定的幫助,這麼好的工具一定要讓它發揮滿滿的作用。

閱讀全文 »

開發程式的過程中最常做的事就是編譯、運行、看結果,若結果不符預期,對原始碼進行修改後再執行一樣的步驟直到運作正確為止,一來一回著實耗費不少寶貴時間。此外,修改代碼時還需要注意不要影響到其它地方的程式碼運行,若因此而產生錯誤就要花更多時間修改,是一種維護成本。長時間下來,這樣的程式碼難免成為所謂的「遺毒」。自動化測試這時候就能派上用場,自動化測試是解決這個問題的一種方法,也是最根本的方法,讓電腦代替人工進行對 Codebase 的測試,除了有省時省力的好處,同時也是降低維護成本的關鍵。

閱讀全文 »

當我在學 Design Pattern 時,請教前輩:「抽象是什麼?」對方熱心的一陣瘋狂輸出解釋並舉些範例,我的心中最後冒出一個想法:「聽起來好抽象。」同時依然無法體會抽象的含義,這便是我的親身經歷。就是這麼奇怪,我知道什麼場景可以用這個詞,但背後含意卻不清楚。為了徹底弄懂「抽象」的含義,特別寫成文章強迫自己去弄懂「抽象」的意思。

閱讀全文 »

單位轉換是多數系統中會碰到的課題,單純兩個單位之間的轉換還算容易,而多個單位的轉換就有點困難。以「速度」來說,在 m/s, mph 與 km/h 等數種單位之間互相轉換,排列組合就多達九種以上;而「貨幣」幾乎是每一個國家一種單位,需要在更多單位之間做轉換。如何寫出易於維護可擴展的單位轉換程式碼是非常重要的,這篇文章帶領讀者從數學角度出發,一步步推導出單位轉換公式並將其化為最簡。

閱讀全文 »

如果 WebSocket 伺服器頻繁向客戶端發送訊息,是否會影響客戶端的請求?是否應該使用多個 WebSocket 連接來分開數據流量?所以我用 Golang 來做這個場景的基準測試。最後,讓我來和大家分享一下這個結果。

閱讀全文 »

Prometheus 是監控與告警系統的工具集,將數據以時間序列的格式存在 TSDB (Time Series Database) 中,並提供 PromQL 來對資料做查詢。histogram_quantile 為其中一個聚合函式,讓我們能夠透過 histogram 類型的 metric 推算出指定的百分位數所對應的值,應用更靈活。在解讀數據之前,個人認為要先了解數據是如何得到的,因此這篇文章紀錄 histogram_quantile 的演算法原理。

閱讀全文 »