💬 Pofat 的話
休息好誘人啊,上周休息一下這期差點就寫不出來了呢!不過既然說到休息,本期就來聊聊我對休息時機的評估方式,希望能幫助不知過勞的肝苦工程師早日發現身體的警訊。
很久沒感到心跳的變化了嗎?那不是因為你社會化而是過勞了
上周度假去沒出刊,倒是錄了集講休假的節目。休息是為了更多的休息回復疲勞的身心,然而我想大多人對疲勞的定義可能都含糊到明確(?),總之我不想上班就是了(雖然可能這是很多人的日常,包括我)。
關於疲勞與回復,我想到一個陳年故事。曾有位競技運動圈的友人自認天份不足,在攸關升學的大比賽前以吃苦當吃補的想法訓練,相信服下艱苦卓絕之後會有豐收。在比賽前的六週他破了一次個人紀錄,便以此重新調整訓練強度,而幾近狂熱的心情影響了判斷力,磨得過尖的刀刃終究碎裂,在賽前三周重病倒下,最終到比賽日前完全無法進行任何訓練。
從他的經驗我理解到「疲勞管理」的關鍵就是務實地回答「我到底有多累?」 這個問題,除非擁有極優秀的自我覺察能力,否則自我感覺並非一個穩定的觀察對象。幸好運動科學告訴我們一個可數值化的具體生理指標 - HRV (心率變異)。
先說結論: HRV 實際上代表的仍然不是「你到底有多累」這個概念,而是你的身體有多能「應付壓力」,所以數值越大代表身心越有餘裕,越能應付糟糕的一天。
那這個數值要怎麼取得呢?其實 Apple Watch 從 series 1 就內建這個功能,只是只能在 iPhone 的「健康」裡查看,從「瀏覽」-> 「心臟」-> 「心率變異」可以找到以日、週、月與年為區間的資料。要注意這個數字(單位為毫秒)不需跟別人比較,因為個體差異頗大,通常安靜心率越慢的人就會越大(比如運動員),最主要還是和自己的過往數據相比。建議以月為區間做長期觀察,若趨勢有在上升就是好事,持續下降兩三個月以上就要多留意。我手邊的資料不到三個月,且看我過去一個月的趨勢,前兩周有火燒屁股的專案搞得我 HP 日漸下降,然後七月底八月初去玩又回了一點血。
這個方法在十幾年前我還是個業餘運動員時就開始使用,它的數字意義是「每兩拍心跳間隔時間的標準差」,生物意義是交感神經與副交感神經的協調能力。當心率越能夠隨著外在情況或情緒快速反應就代表身心狀態越理想,比如緊張時(交感神經)很快地上升心率,放鬆時(副交感神經)也能在短時間內回到安靜心率,如此一來間隔時間的標準差就會比較大;反之,調節得慢或程度較小標準差就比較小。強壯的身心具有「健康」的不規律心跳。
Apple Watch 的量測方法是約每兩三小時會找個安靜的狀態做一分鐘的測量並取標準差,然後再對當日所有標準差做算術平均,因此佩戴時間越長組數越多越不容易失真。此外還有個強制測量的方法,就是啟用 Watch 「正念」裡的「呼吸」,會請你進行一分鐘的深呼吸,同時也會一起測量 HRV。
這方法雖然來自競技運動領域,近年來已有各種研究支持這方法也可以應用在職場或心理壓力等的評估,如果對自己在職場的身心狀況感到懷疑不妨敗弄隻 Apple Watch 來觀察看看,也許能提早發現警訊,之後有機會再來分享增加這個數值的方法。
上面的陳年故事還未完,最後躺了三周都沒訓練的友人因為意外獲得充分的休息,比賽當日破了個人紀錄,不過這只是上天對他的眷顧,不會時常發生的。
🌎 On Swift Community
Integrate SwiftUI Into a UIKit App
Natalia Panferova 在 Women Who Code Mobile Tech Summit 的演講影片已上線,內容當然不容錯過
Implementing a main thread watchdog on iOS
iOS 有 watchdog 來負責監視消耗太多資源和卡住 main thread 太久的情況,一旦超出界限就會把 app 終結,然而 watchdog 能告知你這情況發生了,卻未必能正確地告訴你凶手是誰,因為你只會看到 app 被終結當下的 call stack。透過 RunLoop Observer 我們能夠計算狀態變化間的時間差,然後把卡住太久的工作或 viewcontroller 紀錄下來。
很高興看到 Jesse Squire 在離線一段時間後又重新開始寫文章。
🗣️ On Swift Forum
borrow and take parameter ownership modifiers
Swift 在多年前就有一篇 Owenership Manifesto 做為發展的道標,這個從 Rust 學習的概念要點在於「單一所有權」(The Law of Exclusivity),而 Swift 把這個觀念融合入 ARC 以達到更好的效能。
具體來說這有兩種情況:
borrow
:呼叫方把物件傳給被呼叫方後保證物件在呼叫過程中都活著,被呼叫方不用負責釋放它,這物件只是呼叫方「借」出去的。take
:呼叫方把物件的所有權「給予」被呼叫方,被呼叫方會負責釋放,呼叫方仍若想保有該物件必須額外持有它。
對值類型也適用,只是持有這行為轉變成複製,釋放則變為銷毀複製品(Swift 實現的是值語義,底下做了很多最佳化的功夫)。Swift 目前採用一些規則來選擇使用哪一種,比如 initializer 或 setter 因為大多情況是傳進去後呼叫方就用不著了,所以採用 take , 反之其它方法就會採用 borrow 。
這個規則大多時候運作良好,只是並非總是最佳解,因此這個 SE 讓開發者能在方法的參數前加上 borrow
或 take
以指定要採用哪種方式。
Pitch - Swift Tooling Workgroup
SSWG 和 Vapor Core Team 的 Tim Condon 發起新的 workgroup ,旨在專注提升 Swift 開發者體驗的工具開發。
Implementing Parts of the Swift Compiler in Swift
目前 Swift compiler 有些元件已用 Swift 開發,不過都非必要元件,接下來的目標將會以既有 Swift compiler 來編譯 Swift compiler ,因此便能讓必要元件開始以 Swift 開發。
[Pitch] Quick navigation in DocC Render
如同 Alfred 或 Raycast 的主要輸入介面,DocC 也將擁有類似的介面用於快速導覽,支援模糊搜尋、依相關性排序結果以及鍵盤快速鍵,樂見其成。
🤪 Pofat 選推
牛牛是一隻牛還兩隻牛?
業界標準加密就是從業界標準的教學中直接複製 key pair 出來用(誤
這才是我要的 button
iOS 16 be like: