/images/avatar.png

Take notes of everything I learn

Welcome to my blog with some of my work in progress. I’ve been working on this book idea. You can read some of the chapters below.

Deply Project to Fly Replace Heroku

Deply Project to Fly Replace Heroku Heroku 將在 11/28, 2022 中止免費方案. 替代方案 更詳細的內容請參考: https://dev.to/meshvpatel18/top-heroku-alternatives-for-free-46g1 Netlify - Host serverless apps Cloudflare - Best for Static Site. Cyclic - Deploy full stack Node JS apps in seconds. Deta – The Cloud for Developers Firebase - Fast and secure web hosting Railway - Made for any language. Render - The fastest Devtron Fly - Run your full stack apps all over the world. Fathym - Develop and deploy micro frontends in a headless, open world.

pprof: Sync.atomic vs Sync.mutex

Sync.atomic vs Sync.mutex sync.atomic: https://pkg.go.dev/sync/atomic sync.mutex: https://pkg.go.dev/sync#Mutex 寫多讀少 -> 互斥鎖 寫少讀多 -> 原子操作, 讀寫鎖 Sync.atomic vs Sync.mutex Mutex vs Atomic 的情況裡,Mutex 相對更重。 因為涉及到更多的 goroutine 之間的上下文切換 pack blocking goroutine,以及喚醒 goroutine。 main.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 package main import ( "fmt" "log" "net/http" _ "net/http/pprof" "sync" "sync/atomic" ) type Config struct { a []int } func (c *Config) T() {} func Atomic(numbers int) { var v atomic.

Google Search and Google Analytics

Google Search and Google Analytics Google Search 進入 search-console 有多種驗證方式, 可使用右邊這種, 輸入你的, 例如: https://kimi0230.github.io/ 之後會要求你下載一個 html 檔 , googlexxxxxx.html. 將此檔案放在Hugo的 static 資料夾下. 然後到剛剛的下載網頁, 點擊驗證 驗證成功後 到 google search console 左邊側欄點選Sitemap > 新增 Sitemap, 路如: https://kimi0230.github.io/sitemap.xml Google Analytics 進入 https://analytics.google.com/ 左下角齒輪 管理 頁 -> 資料串流 -> 新增串流 -> 網站 複製 評估 ID 備用 點擊 代碼設定操作說明 -> 手動安插 -> 複製 全域網站代碼(gtag.js)備用。 Hugo 設置 config.toml 1 2 3 4 5 6 7 # Analytics config # 網站分析配置 [params.

Golang Struct Padding

Golang Struct Padding Go 編譯器可能會在結構值的某些字段之後填充一些 byte。 這謝填充的byte將會被算進此結構的大小。 因此,結構類型的大小可能不是其所有字段大小的簡單總和。 Go compilers may pad some bytes after certain fields of struct values. The padded bytes are counted for struct sizes. So the size of a struct type may be not a simple sum of the sizes of all its fields. Example 1 2 3 4 5 6 7 type T1 struct { a int8 // 7 bytes are padded here b int64 c int16 // 6 bytes are padded here.

Interfaces and Duck Typing in Go

Interfaces and Duck Typing in Go if it looks like a duck and quacks like a duck, it’s a duck 當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子 source: https://theburningmonk.com/2015/05/why-i-like-golang-interfaces/ 意思就是: 一個東西究竟是不是鴨子,取決於它能不能滿足鴨子的工作。 duck typing 多出現在動態語言, 例如PHP, Python, JavaScript, Ruby 等. 在靜態語言中比較罕見,但是在go中duck typing處處都是duck typing. Go isn’t object oriented in the typical sense 更多解釋可以看這 Is go duck-typed? go的 interface{} 和 duck typing 密不可分. 後面會有 example 來實現. Duck Typing duck typing 描述事物的外部行為而非內部結構 在物件導向(Object-oriented programming, OOP)的編程語言中,當某個地方(比如某個函數的參數)需要符合某個條件的變量(比如要求這個變量實現了某種方法)時,什麼是判斷這個變量是否"符合條件"的標準? 如果某種語言在這種情況下的標準是: 這個變量的類型是否實現了這個要求的方法(並不要求顯式地聲明),那麼這種語言的類型系統就可以稱為duck typing duck typing是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。 誰調用誰實現,比如你要調用一個A函數,而A函數中接收參數的同時調用了參數中的B方法.

Consistency, Availability, Partition Tolerance (CAP)

Consistency, Availability, Partition Tolerance (CAP) Consistency (一致性), Availability (可用性), Partition Tolerance (部分容錯性) Source : CAP 理論 Source : https://www.w3resource.com/mongodb/nosql.php Source : https://github.com/donnemartin/system-design-primer/raw/master/images/bgLMI2u.png 來源:CAP Theorem: Revisited 在一個分散式系統中,只能滿足以下三個項目的任兩項: Consistency 一致性 - 每次讀取都可以得到最新的資料,但偶爾會拿到錯誤 Availability 可用性 - 每次讀取都可以得到非錯誤的回應,但不能保證可以得到最新的資料, 不能超時不能吐 error. Partition Tolerance 部分容錯性 - 在任意分區的網路故障情況下,系統仍然能夠持續運行 網路是不可靠的,你的設計必須要確保部分容錯性,所以你只能夠在一致性與可用性中做出取捨。 CP : 一致性與部分容錯性 (保證原子讀寫時) 還是一個分區關掉服務,只提供一個分區的數據來確保一致性 等待分區的節點回覆可能會導致超時錯誤,如果你的系統的需求是需要 保證原子讀寫時, CP 是一個不錯的選擇。 AP : 可用性與部分容錯性, 最終一致性 兩個分區都可以服務,但是回傳合理但是不正確的數據 每個進行回覆的節點中的最新版本可能不是最新的,當分區節點解析完畢後,寫入的操作可能需要一些時間來傳播資料。 當你的系統需求需要保證 最終一致性,或當外部系統故障時,系統要能夠繼續運作時,AP 是一個不錯的選擇 在寫入後的讀取操作最終可以看到被寫入的資料(通常在數毫秒內)。資料透過非同步的方式被複製。DNS 或是電子郵件系統使用的就是這種方式,最終一致性在高可用的系統中效果很好。 CA 所以如果你的分布式系統做到 CA,犧牲 Partition Tolerance,那就是代表你的機房永遠不會出現網路分區,永遠不會掉包 ,那麼完美的機房給我來一打吧… 除非有可能有完美的網路環境,否則 CA 根本就是傳統定義的單機系統,而非分布式系統。所以不要再被騙「我這個分布式儲存系統只能做到 CA」.