去了兩個月健身房之後——我的「有氧運動」進化史

by Sam Chivers

兩個多月前,我發表了〈37,加入健身房,專注 Zone 2〉,宣誓著我投入有氧運動的決心!

75 天過去,我仍持續嗎?還是已經半途而廢?

本文就來整理一下,這兩個月多的變化,以及我獲得的體驗與感悟。

延伸閱讀:28,去了 2 個月圖書館之後


以減脂為起點

8 月底,我為了「減脂」(嚴格來說是降低體脂率)而報名健身房。

當時的計畫很簡單:不涉及重訓(另有教練),把這個健身房當成「有氧專區」,全力投入有氧運動來達成減脂的目標。

加入健身房的第一個月,跑步機是我的首選。使用方式也很簡單——以 Zone 2 的中低強度運動為主。我不跑步,而是設定坡度,採用走路的方式訓練。

那時我的期望是慢慢來,讓身體自然適應。

這兩個月來,經歷了幾個階段的改變(當然少不了和 AI 討論😎),訓練模式和目標也逐漸調整。

可說是一段「有氧運動進化史」,是不是真的愈來愈好,我敢不說。但顯然更符合我的期待。以下分三個階段講述——純個人經驗,僅供參考

iThome 鐵人賽寫作攻略——新手必看指南

除了「加碼」組別,2024 iThome 鐵人賽已圓滿落幕,而我也順利完賽。

在讀完〈iThome 鐵人賽 - 得《優選》獎項的寫作心法〉和〈【Day 31】- 忙碌上班族如何在鐵人賽中堅持30天寫作?從靈感到策略:9個關鍵步驟〉這兩篇大作後,我不禁見獵心喜、心癢難耐🤩

也想好好寫一篇攻略,獻給還在觀望中、猶豫明年是否要參賽的你。

雖說是「寫作」攻略,但其實更適合稱為「參賽與完賽」攻略。

本文不會介紹任何寫作技巧,而是聚焦於如何成功跑完這場「寫作馬拉松」——最好再拿個獎!

接下來,我將分享我的鐵人賽參賽經驗,以及一些實際的做法。

與 AI 共舞:我的 LeetCode 刷題之道(上)準備篇

最近,我剛結束了 iThome 鐵人賽的寫作之旅——真是不輕鬆,但值得!

相關文章:Django Ninja 30:系列回顧與完賽心得

隨著比賽結束,我開始進入求職準備的第二階段——學習演算法(主要是 LeetCode 刷題)和系統設計。

老實說,我一直很排斥刷 LeetCode,因為感覺很「填鴨」,一點也不吸引人。

這可能是因為這件事和求職面試掛勾,所以讓人有壓力;又或者我還沒有真正領略資料結構與演算法之美。

總之,我很逃避!


但這次不同了。

我找到了一個全新的方法,讓刷題不再那麼痛苦,還幫助我盡可能理解每一道題——這都要歸功於 AI。

我將分享如何透過 AI 輔助來提升刷 LeetCode 的學習效果。關鍵是——它讓原本枯燥的過程(對我來說)變得有趣

當然,這樣的方法也有一些「限制」,後續會提及。

我將這個主題分成上、下兩篇,各有不同的著眼。

Django Ninja 30:系列回顧與完賽心得

2024 iThome 鐵人賽

這是 Django Ninja 系列教學的第 30 篇。

系列最終章,我們的「Django Ninja 探險」將暫時告一段落。

這當然不是結束,畢竟 Django Ninja 還只是一個相對新的專案——我對它的未來充滿期待。

本文將分為兩個部分:

  1. 回顧整個系列,檢視我們在各章中學到的概念與技術——盡可能只提重點。
  2. 分享我在寫作過程中的最大挑戰、對 Django Ninja 的期待,最後則是我的鐵人賽完賽心得。

受限於篇幅,更多的幕後花絮、創作細節及個人心得,我將在與正賽無關的第 31、32 篇中,再行分享。

此外,我還會不定期更新「Django Ninja 番外篇」,補充正篇中未能詳述的內容。有興趣的讀者,歡迎訂閱本系列本站 email

話不多說,我們直接開始。


一、系列目標與主要學習成果

回到第 1 篇的開頭,整個系列的目標是:

在這個 30 天的系列文章中,我們將詳細探討 Django Ninja 的基礎實作,透過文字教學範例專案的程式碼,帶你一步一步熟悉這個強大而靈活的 Django API 開發框架。

沒錯,而我們具體做了哪些事呢?

主要學習成果

透過本系列,讀者掌握了以下 Django Ninja 核心技能:

  1. 設定 Django Ninja 路由。(卷 7-8)
  2. 處理各種 HTTP 請求及參數——路徑參數、查詢參數、body。(卷 9-12)
  3. 使用 Schema 設計和定義 API 回應的資料結構。(卷 13-16)
  4. 從專案程式碼自動產生 API 文件、透過 Pydantic 驗證資料、有效處理系統拋出的錯誤。(卷 17-22)
  5. 靈活運用進階功能,包括檔案上傳、分頁和資料過濾。(卷 23-27)

還有最後的身分認證與單元測試。可說是一段相當完整的旅程

單元測試——使用 Test Client 與 pytest 測試 API

2024 iThome 鐵人賽

這是 Django Ninja 系列教學的第 29 篇。

「請問你們的專案有單元測試嗎?」

面試中如果你提出這個問題,可能會讓面試官面有難色。

測試的重要性,大部分開發者都心知肚明。只是願意認真對待的人未必很多。

但如果真心想提高程式碼品質、減少 bug,讓專案更容易維護,那單元測試依舊是不可或缺的工具。

良好的測試不僅能幫助我們及早發現問題,還能在專案重構或新增功能時,確保現有的功能不會被破壞。

雖然寫測試會增加初期的開發時間,而且維護上也需要花費心力——這本來就不是一件輕鬆的事。但長期而言,它能為專案帶來持續的健全與穩定性。

所以,我們還是好好寫測試吧!


本文大綱

這是整個系列中唯一一篇有全文大綱的教學。

原因是,本文要提及的事項較多,畢竟單元測試這麼大的主題,怎麼可能靠一篇 2500 字的文章說完。限於篇幅,無法一一詳談——但也不能直接省略。

所以需要有一個供讀者鳥瞰的全文輪廓,讓你更容易了解、吸收。大綱如下:

  1. 單元測試的理想與現實。
  2. Django API 測試重要概念說明。
    • Test Client 的意義與用途。
    • pytest 和 pytest-django 簡介。
    • pytest fixtures 與測試函式。
  3. 測試程式碼的實作與解說。
  4. 結語。

簡單來說,本文不會講解所有的程式碼改動,而是在必要時提及。其餘部分,由我直接實作並收錄在範例專案中,讓讀者自行參考。

在有限的篇幅中,帶你了解整體概念比關注細節更重要。當你掌握了基本概念,再去看程式碼會更加得心應手。

有關單元測試的更多討論,歡迎參考這篇心得〈為什麼你「應該」寫單元測試——《Python 工匠》筆記〉。這是一本立論紮實的好書,相信你會有所收獲。

本文所有的程式碼改動,可參考這個 PR

身分認證——Session 認證與全域設定

2024 iThome 鐵人賽

這是 Django Ninja 系列教學的第 28 篇。

歡迎來到第七章!本章總共有兩篇內容:

  • 卷 28:身分認證——Session 認證與全域設定
  • 卷 29:單元測試——使用 Test Client 與 pytest 測試 API

這些主題的核心功能,並非由 Django Ninja 實作,但框架仍提供了一定程度的整合。並且,這些功能對於任何 Django 專案來說,都至關重要。

本文介紹幾乎所有 API 專案都需要的——身分認證Authentication)。

我們將探討如何在 Django Ninja 中利用 Django 內建的 session-based 認證,實現完整的登入驗證功能,並進一步說明如何設定全域認證,以減少程式碼的重複。

本文所有的程式碼改動,可參考這個 PR


認證的兩個層次

進入實作前,我們要先了解,所謂的身分認證,究竟代表什麼。

以「帳號密碼 + session 認證」為例,身分認證的範圍主要涵蓋兩個階段

首先,當使用者透過帳號密碼進行登入時,系統會檢查這些內容、確認身分合法。登入成功後,系統會將使用者資訊(比如用戶 id)儲存至 session,以維持登入狀態

這是登入時的認證,也是我們最常說的認證。(狹義的認證

接著,當使用者嘗試存取受「認證保護」的 API 時,系統會檢查 session 並確認身分,確保每個 API 請求都來自合法登入的使用者。

簡言之:

  • 第一階段:初次登入時的身分確認。
  • 第二階段:後續請求時的身分確認。

兩個層次相輔相成、一體兩面,確保服務能夠在使用者登入後續操作中,提供適當的安全保障。