uv 是 Astral 公司推出的一款基於 Rust 編寫的「 Python 套件管理工具 」,雖然 Python 的套件管理生態內已經存在多種工具如 pip 、 poetry 、 conda 等等,但在效能、相容性和功能上 uv 都有出色表現,得益於使用 Rust 進行編寫,uv 工具的速度讓人驚艷 ;且從「 安裝管理 Python 版本 」、「 虛擬環境建置」、「 package 依賴 」以上 uv 全部都統整好了,其目標是取代多種現有工具,為 Python 專案的開發和管理帶來了新的選擇。 uv 也成為 Astral 公司繼 Ruff (Python 程式碼檢查器和格式化工具) 之後,另一個知名的專案了。

Continue reading

前段時間發現自己對 Python 的 Iterable、Iterator、Generator 之間的差別並沒有很熟稔,我們都知道這三個都可以使用 for loop 來遍歷,再進一步思考一下所謂的 for-loop 是怎麼實現的。 首先已常見的 list 來說,它本身是一個有 index 的結構,可以一個一個拿出來,蠻符合 for-loop 的使用直覺 ; 但是 dict 也是可以用 for loop 走訪呀,而它並不是順序排列的 ; 甚至 open 的 file 都可以用 for loop 結構來讀取每個 row ,那這些為什麼也能用 for-loop 呢? 這背後有兩個核心概念: Iterable(可迭代對象)Iterator(迭代器)

當我們了解 Iterable 和 Iterator 之後,就可以進一步來了解 Generator ,同時再來把這三個做一個比較整理。

Continue reading

Cron

在軟體工程中,有蠻多工作都會需要排程的,而 Linux 排程是透過 crontab 與 at 這兩個,這兩個有啥異同呢? 我們可以發現工作排程的方式基本上分成:

  • 例行性的 : 每隔一定的週期就會需要處理,那就可以使用 rontab 這個指令設定的任務循環
  • 突發性的 : 會訂一個時間點執行,但做完以後就沒有了,那就可以使用 at 指令處理僅執行一次就結束的任務

Cron 是 Linux 系統下的一個定時任務管理服務,為了要精確表示「何時」執行, 就發明了一個抽象的 Cron 表達式,相信大家都有看過類似 0 12 * * * 這種在定時任務中常出現的寫法,像 「 GCP Cloud Scheduler」、「 GitHub Actions」、「 SpringBoot 的 @Scheduled」,都以 Cron 表達式來定義任務觸發時間點。

Continue reading

我們都知道 Python 是一個動態的語言,代表每一個 variable 是什麼型別是在 runtime 的時候決定的,雖然很靈活可是當 code 量級上去之後因爲類型不正確引發的錯誤也會逐漸增加。但 Python 也是可以做到型別要求的,就是使用 「 Type Hint 」 或者叫 「 Type Annotation 」,中文稱呼蠻多種的例如「型別標註」、「型別提示」等等。 若有寫 Type Hint 的話,比較現代的 IDE 都會有一些自動顯示或補全輔助 :

Python 的 Type Hint 是從3.5開始萌芽逐漸引入直到現在,故有一些發展的歷史脈絡和演變,有一些寫法也漸漸更替,故簡單介紹和分析一下。

Continue reading

Python 的 Coroutine 發展已經逐漸穩定成熟,已經成為了提升 Python 程式效能的優秀解決方案之一,在之前簡單介紹 Coroutine 和 await/async 時,我們在範例 code 中一直有用到一個 Python buildin 模組 asyncio,它提供了一套完整的工具和接口,用於建立非同步應用程式,其核心是 Event-Loop,會追蹤所有註冊的任務,並根據任務的狀態調度它們的執行。 故接著來了解 Event-Loop 和其工作的執行單位 Task 吧 !

Continue reading

之前有介紹了 Asynchronous ,而 Python 的 Coroutine 是實現 Asynchronous 的一種設計方式,且 Python 目前已經有非常直觀簡單的語法糖來定義 Asynchronous Code,使得程式寫起來就像普通的 「 Sequential Processing 順序執行 」任務那樣,但同時卻也可以對目標函數標註做「等待」的動作,並在「等待」期間可以先去做其他任務,達成非同步的功效,提高程式的並發性,而其重要的關鍵字就是 :

  • async : 用來宣告 function 能夠有異步的功能成為 Coroutine function
  • await : 用來標記 Coroutine 切換暫停和繼續的位置

而這兩個關鍵字是在 Python3.5 引入且在 Python3.7 成為保留關鍵字。它們在著名的 FastAPI 框架下的 path operation function 下也經常使用,接下來就簡單介紹一下吧。

Continue reading

cloc 全名是 Count Lines of Code , 為一個計算 code 和設定檔行數的 CLI 工具,是使用 Perl 語言開發的開源統計工具。cloc 支援非常多程式語言、平台、格式的統計,可以快速地計算一個 project 中所有文件的行數、空行、註釋行等等。有時候在寫一些報告會用到,可以幫助整理資料。

Continue reading

tar是 Unix 和類 Unix 系統上常用的壓縮工具,名字來自於 tape archive 的縮寫, tar 可以將多個文件或目錄打包成一個檔案。單純 .tar 檔案是沒有壓縮資料的,只是把好多目錄與資料夾打包起來變成一個大檔案而已;如果要有壓縮資料的功能,要使用 .tar.gz 壓縮檔案,是最常見的壓縮檔案格式。

Continue reading

set 是 shell 內建的命令,適當的使用可以增加腳本的安全性和可維護性,幫助腳本執行時可盡快發現錯誤,從而減少不必要的問題。因此很多 script.sh 檔,第一行都會加

  • set -euo pipefail

這篇文章簡單解釋並記錄一下,可以參考使用。

Continue reading

sed 全名為 Stream EDitor ,取了前面的 S 和後面的 ED 來命名。sed 對正規表示法有良好的支援,主要功能為自動化的修改文字檔,是在 Linux 和 Unix 系統中使用的文本處理工具,可在 pipe 中間進行文字的取代、刪除、插入等等。

Continue reading

Author's picture

李昀陽 YunYang Lee

Welcome to my Tech Note. You can read some of the chapters below.

Software Engineer

Taiwan