波報 #37 - Apple Music Classical
Swift 大小事 2023/3/6 - 2023/3/12
💬 Pofat 的話
本期發刊前的週末發生了一件超級大事,超過半數矽谷新創存錢的美國矽谷銀行 (SVB)因不利於己的消息和(結果上來看)失敗的應對而瞬間倒閉,眾多新創急如熱鍋上的螞蟻,此情此景讓我想到電影「白銀帝國」的場景。熱門事件的網路解析文章數量與恐慌度成正相關,相關討論大家可以找到很多,只是感歎今年才一季就有層出不窮的事件持續渲染大環景氣將如巖冬的氛圍,不過大家也別太絕望,亂世才能出英雄嘛,總之還是祝大家都能安好地找到自己的歸屬。
🌎 On Swift Community
Introducing Swift Certificates and Swift ASN.1
Swift 公佈兩個新的官方 package:swift-certificate 與 swift-asn1,前者可以處理常見用來辨識身份的 X.509 證書(如 TLS)流程;而該證書的資表達格式則稱做 ASN.1, 其格式彈性且複雜,還有特定的序列化和反序列化規則(BER、DER), 這些是則後者的職責所在。swift-certificate
目前尚在前期開發階段以取得更多社群回饋,樂見這個非 app 開發者的關鍵需求終於有了 Swift 的原生版本。


Apple Music Classical
Apple 的全新古典音樂專用 app,目前開放預購,3月 28號可以正式開聽。其內容還是來自於 Apple Music ,有人可能會疑惑「為什麼要把相同的內容再放到另一個 app 裡?」
因為古典音樂的分類法、屬性和流行音樂非常不同,光人名就很難處理了,比如柴可夫斯基就可能找到四十多種不同的拼法,目前的推薦演算法也不是針對這類型的音樂需求最佳化,主流串流服務提供的清單多是「Relaxing Classical」、「Chilled Classical」這類型的粗分,可以滿足業餘聽眾,但遠不及滿足更進階的群族(縱使不多)。而這個 app 其實來自於 Apple 在 2021 年八月收購的古典音樂串流新創 - Primephonic,Apple Music Classical 應該會基於它們原本的介面,利用它們的經驗提供古典音樂粉絲更好的體驗,原訂 2022 年發佈不過想必又是因為疫情而延期了,我個人非常期待!

Vapor 最新動態
Vapor (Swift on Server Side framework)最近才釋出了移植到 AWS 和用 DocC 建立 API 文件的重要基礎建設,接下來會有新的設計,MySQLNIO 的底層重寫,以及讓 Vapor 全面支援 Swift Concurrency,這麼多的工作竟然只有兩個核心成員在推動,有興趣的 Swift 開發者不妨也投身加入這個新領域。
手工打造 HTML 解析器的那些事
重量級的技術長文,也許 HTML 轉 NSAttributedString 的需求不是太熱門,所以只好手動實現套件的歷程與技術結構詳解,對於技術狂應該是個很棒的早午餐搭配(可能會看到午餐)。


Universal Link Debug 實錄
又是看得很爽的技術推文,架上跳轉如果有問題又沒有設定錯誤,可以留意 Apple CDN 是不是被擋住了。


macOS: Slow by Design
本文作者發現新買的 M2 Pro 編譯與單元測試 rustc 的速度與硬體規格無法匹配,偉哉大 M2 怎麼沒什麼驚人改進,而且連 VPN 時還會更慢,原來是 macOS X El Captain (10.11)引進的 SIP 機制,執行程式前會把執行文件做 checksum 並送到蘋果的伺服器檢測是否為惡意程式,如果想對信任的程式關閉這項檢查,可以把工具加入隱私設定裡的 Developer Tools 中。
🗣️ On Swift Forum
SE-0392 Custom Actor Executors
這是個很重要的提案, Swift Concurrency 目前的設計旨在讓使用者聚焦於不能同步存取、需被隔離(actor isolation)的資料,因此「刻意地」模糊化程式執行的環境(OS 的執行緒,或 GCD 的 queue),也避免了熱點執行緒太忙的情況,比如規劃專門執行緒給 Disk I/O 這種常見的設計,在大量資料同步時可能會阻礙了在上面高優先的工作。目前的例外只有 @MainActor
,因它必跑在 main thread 上。
這樣的設計就有如自排車,使用者不用考慮太多便可安全地達成目的,而隨著 Swift Concurrency 日漸蓬勃,加入手自排的功能也不錯,尤其是某些與外部元件互動的場合,可能會需要把程式跑在特定的環境上(例如利用 thread local variable 儲存的狀態、切換 thread 後這些便會丟失),SE-0392 主要新增了一個 protocol SerialExecutor
,其中的 func enqueue(_:)
可以拿到將即執行的工作,actor 透過它便能把工作都依序地執行在指定的環境(執行緒或者 context )上,看起來長這樣:
actor 只要指定 UnownedExecutor
是上述建立的 executor 即可:
此外,這提案還引入了一個用來在 synchronous 方法裡檢查是不是在正確的 executor 上執行,比如 assumeOnMainActorExecutor
, 這原本是另一個獨立提案但因為跟這個提案密不可分便合併進來。
[Pitch] @OptionSet
macro
SE-0389 Attached Marcos 實現了可以定義改變函數簽名、增加成員等的 macros,可以取代許多 code-get 工具,裡面的一個例子 OptionSet
現在被抽出成一個獨立的 SE pitch。使用過 OptionSet
的人想必能認同使用這個資料型態需要寫不少模版程式且容易出錯,比如下面的範例,若項目一多可能會不小心使用到重複的數字而出錯:
解決方式則是利用一個內部的 enum 來取代手工 increment:
而那繁瑣的 initializer 一看就是 compiler 該負責的事情,所以本提案的主旨就是把 @OptionSet
加入 standard library,簡化後即能寫成如下:
不過我個人對於 standard library 「幫忙寫程式碼」的概念感到有點多此一舉,既然定義都在一起何不直接開個新的 type ( Alternatives 裡提到的 optionset
),或是留言中提到的另一個好替代點子,用 enum
包複的 option set,至少我個人一直以來使用它的體驗都是「可複選的 enum」:
最後對於整個 Swift Macro 系列提案有興趣的可以到其example project 玩玩,需先到官方下載 2023.3.8 之後的 Swift development snapshot 搭配使用。
🤪 Pofat 選推
Apple 英國新辦公室上週啟用,可以在 Pink Floyd 的專輯裡工作惹
Twitter 再度自爆(!?
檢查 app 是不是 ChatGPT 套一層皮的方式
🫡 疫情期間的新創企業家們

螢幕數量與等級
Indie 們是這種感受嗎?我是有在睡夢中解過程式啦