談 HTTP 標頭(header) "Connection: keep-alive" 的作用
根據 HTTP/1.0 版的標準,每 1 個連線都應該在 server 回應(response)完之後關閉,然而 HTTP 是基於 TCP 的通訊協定,每次建立連線都需要做 1 次 TCP 三向交握(Thr
Posted on May 22, 2024 in HTTP headers by Amo Chen ‐ 2 min read
根據 HTTP/1.0 版的標準,每 1 個連線都應該在 server 回應(response)完之後關閉,然而 HTTP 是基於 TCP 的通訊協定,每次建立連線都需要做 1 次 TCP 三向交握(Thr
Posted on May 22, 2024 in HTTP headers by Amo Chen ‐ 2 min read
你有想過 sever 端要怎麼主動通知 client 端有事件發生或資料更新嗎?
除了 WebSocket 還有沒有其他做法呢?
一起看看 1 種稱為 Server-Sent Events 的技術吧!
Posted on May 21, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
在學習網路程式設計時,每個人都遇過怎麼讓 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 是經常會讓人產生混淆的事物,因為這 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 是一個經典的數學公式,廣泛應用於評估文件與查詢字串之間的相關性,因此在某些搜索引擎的搜索結果排序中扮演重要角色。例如,Elasticsearch 就內建了使用 BM25 進行結果排序的功能。
此外,在 AI 領域,像是 RAG (Retrieval-Augmented Generation) 等應用,也實作使用 BM25 來檢索(retrieve)相關文件。
對 BM25 有所理解的話,將會對從事搜索相關工作的人有所裨益。
本文將以白話文說明搭配範例的方式,介紹 BM25 公式以及如何計算。
Posted on Apr 29, 2024 in 數學概念 by Amo Chen ‐ 5 min read
近年來不斷地看到一些公司或服務採用 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 3.8 推出 1 個新的運算子 — Walrus Operator, 又稱海象運算子,其運算符號為 :=
。
Python 社群對海象運算子有一些爭議,主要是:
:=
與 =
符號太相似,難以快速識別但無論其爭議為何,海象運算子只用 1 個新的符號,就能使程式碼變得簡潔之外,還能同時滿足 Python 使用者的習慣,長遠來看其實是利大於弊。
譬如下列程式碼,在使用海象運算子之後,其實只需要 2 行即可:
x = input('> ')
while x:
print(x)
x = input('> ')
因此,學會適度使用海象運算子是可以帶來好處的!
本文將介紹海象運算子與幾個適合使用海象運算子的場景。
Posted on Apr 23, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
本文將介紹 1 個相對少被提到的 operator 模組,該模組提供與 Python 各種運算子(operator)相對應的函式,適合喜歡 functional programming 的開發者使用,此外也有幾個高實用性的方法可以使用,不妨花一點點時間看看吧!
Posted on Apr 22, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 3 min read