$ blog / engineering
Engineering
實例工作經驗上碰到的大小事,從中學習並記錄
Series
Series · 12 parts
Aug 2026從 19 個 goroutine 到 exit 137
19 個 goroutine、一個共用瀏覽器、exit 137。從 Go 並發、GMP 排程、記憶體三層模型到 semaphore 修法的全紀錄。
從 19 個 goroutine 到 exit 137
00從 19 個 goroutine 到 exit 137:Go 並發 OOM 全紀錄(overview)01OS 基礎詞彙:process、thread、kernel、syscall02執行環境:socket、container、stack、heap、cgo03GMP 排程器與 netpoller:I/O 等待不佔 CPU04GOMAXPROCS 限制平行,不限並發05記憶體三層模型:cgroup → allocator → heap06OOM 診斷決策樹:從 pprof 往下鑽07共享資源的影響範圍:當一個死,全部一起死08分配器內部:size class、fragmentation、scavenger09用 TryAcquire 做 load shedding:快速拒絕勝過緩慢排隊10keep-alive 讓重試卡在同一台:不換連線,429 等於白回11錯誤的修法:GOMEMLIMIT 調錯 process、git 考古才找到原因
Series · 10 parts
Aug 2026一次 Golang 版本升級的連鎖反應
一次自動依賴更新把 Golang 版本升級,沿著 Docker、Alpine、libvips 一路引爆,換來九個關於版本耦合、被污染的測試基準與靜默安全漏洞的教訓。
一次 Golang 版本升級的連鎖反應
Series · 10 parts
Jul 2026從筆電連上遠端資料庫
從筆電連上遠端資料庫的一套心智模型:五個座標、通道、docker 打包,以及一次性查詢與 REPL 的差別。
從筆電連上遠端資料庫
00從筆電連上遠端資料庫:一套心智模型(overview)01一條 DB 連線就是五個座標02連線 URI 是標準式,flag 只是把它拆開03兩種通往遠端 DB 的通道:Cloud SQL Auth Proxy vs kubectl port-forward04docker-compose 的 image vs build:差在來源,不是有沒有映像05build 期 COPY 把檔案烤進映像,volume 是即時掛載06DB CLI 只在一件事上分岔:有 query flag 就是一次性,沒有就是 REPL07MySQL CLI:遠端連線與參數08MySQL CLI:內嵌 SQL 的四種餵法09sqlit:純鍵盤版的 DBeaver,一頁複習整套模型
Series · 7 parts
Jul 2026一張遷移單背後的 PKI 與 TLS
一張一句話的遷移單,藏著兩個方向相反的 TLS。拆解背後那套 PKI(憑證、金鑰與 CA):從入口的單向 TLS,到對 Kafka 的雙向 mTLS。
一張遷移單背後的 PKI 與 TLS
Series · 8 parts
Jul 2026裁切、縮放、填滿:圖片處理
一個把 GIF 裁成垃圾的 bug,換來對圖片與動圖的真正理解:格式取捨、libvips 的 page-strip,以及讓靜圖動圖共用的一條載入路徑。
裁切、縮放、填滿:圖片處理
Series · 10 parts
Jul 2026一個操作,三種引擎
一個操作,三種引擎:用「意圖」而非死背語法,在 ClickHouse、Spark、MongoDB 之間查詢。
一個操作,三種引擎
00一個操作,三種寫法:跨引擎查詢的心智模型(overview)01ClickHouse 資料型別:實務上真正會碰到的那些02Spark 資料型別:基本、巢狀,以及 struct 與 map03可攜式 SQL 核心:到哪都能跑的那 80%04count(*) vs count(欄位):差別就在 NULL05LIKE vs ILIKE:跨引擎的子字串搜尋,順帶談大小寫06真正會用到的 ClickHouse 陣列函式:has、arrayMap、multiIf07Spark 陣列函式與 collect_list、collect_set08從 SQL 到 MongoDB:運算子與詞彙對照09跨引擎查詢練習:來驗收一下(附解答)