文章

用 Python 學網路程式設計重要概念,從單執行緒到 I/O 多工(I/O multiplexing)

在學習網路程式設計時,每個人都遇過怎麼讓 sever 可以盡可能地處理更多連線的課題,要達到這個目的,多數人直覺應該會想到運用多執行緒、多 processes 的架構,為每個連線建立 1 個新的執行緒或 process 處理,但是這種方法在處理大量連線時,就顯得捉襟見肘,單就多執行緒的解決方案來說,隨著連線數上升,首先就會遇到 CPU context switch 所造成的效能問題,更遑論多 processes 架構會需要使用比多執行緒架構更多資源的問題。

但現代有很多應用僅用單執行緒就能夠處理龐大的連線數,包含 Nginx, Redis 等知名開源軟體,這些軟體是怎麼做到的呢?這就需要談到 1 種稱為 I/O multiplexing 的技術!

本文將教導 1 種稱為 I/O multiplexing 的技術,該技術能夠讓單執行緒處理多個連線,將效能壓榨出來!

p.s. 這個技術還可以與多執行緒、多 processes 架構混用

Posted on  May 12, 2024  in  Python 程式設計 - 中階  by  Amo Chen  ‐ 15 min read

帶你搞懂 Python 的 Iterable, Iterator 與 Generator

Python 的 Iterable, Iterator 與 Generator 是經常會讓人產生混淆的事物,因為這 3 個都可以用 for 迴圈走訪,因此有些熟悉 Python 的面試官很喜歡問這 3 者之間的差異,追根究底是因為對這 3 者不熟悉的話,很容易寫出類似以下的低效率程式碼:

set([x for x in iterator])

本文將透過實際範例帶大家認識 Iterable, Iterator 與 Generator! 再也不搞混!

Posted on  May 3, 2024  in  Python 程式設計 - 中階  by  Amo Chen  ‐ 4 min read

用白話文談數學公式 - BM25 (Best Matching 25)

BM25 是一個經典的數學公式,廣泛應用於評估文件與查詢字串之間的相關性,因此在某些搜索引擎的搜索結果排序中扮演重要角色。例如,Elasticsearch 就內建了使用 BM25 進行結果排序的功能。

此外,在 AI 領域,像是 RAG (Retrieval-Augmented Generation) 等應用,也實作使用 BM25 來檢索(retrieve)相關文件。

對 BM25 有所理解的話,將會對從事搜索相關工作的人有所裨益。

本文將以白話文說明搭配範例的方式,介紹 BM25 公式以及如何計算。

Posted on  Apr 29, 2024  in  數學概念  by  Amo Chen  ‐ 5 min read

橫練金剛!將 Go 程式碼編譯成 WebAssembly — 以縮圖程式為例

近年來不斷地看到一些公司或服務採用 WebAssembly 這項技術,包含 Adobe, Microsoft, Google, Figma 等等,使我也對 WebAssembly 產生一點興趣,不過一直都沒有特別花時間研究,只知道 WebAssembly 是 1 種類似組合語言而且可以在瀏覽器中執行的低階語言,相較於 JavaScript 而言,更接近硬體層級,因此效率也更好一些。

直到最近 side project 有個很實際的需求作為契機,我才藉機會研究 WebAssembly 並體驗一下用 WebAssembly 打造應用的感覺。

現代很多語言都支援將程式碼編譯為 WebAssembly ,其中比較知名的是 Rust 程式語言,不過本文將以 Go / Golang 作為教學示範。

Posted on  Apr 26, 2024  in  Go 程式設計 - 高階  by  Amo Chen  ‐ 9 min read

適度用 Python 海象運算子提高程式碼可讀性與簡潔

Python 3.8 推出 1 個新的運算子 — Walrus Operator, 又稱海象運算子,其運算符號為 :=

Python 社群對海象運算子有一些爭議,主要是:

  1. 海象這個名稱不夠明白、直覺,無法讓人直接從名稱了解其用途
  2. 無法向下相容,如果你是套件開發者,用了海象運算子就會有 3.8 以前的相容問題要解決
  3. :== 符號太相似,難以快速識別

但無論其爭議為何,海象運算子只用 1 個新的符號,就能使程式碼變得簡潔之外,還能同時滿足 Python 使用者的習慣,長遠來看其實是利大於弊。

譬如下列程式碼,在使用海象運算子之後,其實只需要 2 行即可:

x = input('> ')
while x:
    print(x)
    x = input('> ')

因此,學會適度使用海象運算子是可以帶來好處的!

本文將介紹海象運算子與幾個適合使用海象運算子的場景。

Posted on  Apr 23, 2024  in  Python 程式設計 - 中階  by  Amo Chen  ‐ 5 min read

認識 Go 的 error 與學習判斷 error 類型的方法

Go 的程式設計中,透過回傳 error 型別的值告知錯誤發生是相當常見的模式,所以很多函式的回傳定義大多如下所示,其中 1 個會是 error 型別,用以告知執行時的錯誤:

func FunctionName() (結果的型別, error)

這也是為什麼我們如果閱讀各種以 Go 開發的開放原始碼專案會很常看到類似以下的程式碼的原因:

r, err := FunctionName()
if err != nil {
	// Error handling here
}

所以學會判斷 error 的類型並處理各種類型的錯誤,變成 Go 程式設計的重要課題。

本文將探討如何判斷 error 類型以及多種不同判斷的方法。

Posted on  Apr 16, 2024  in  Go 程式設計 - 初階  by  Amo Chen  ‐ 6 min read