試玩 Hummingbird 的 middleware

之前為了測試 Hummingbird 這個輕量 server framework 所以做了一個叫 LocalWeb 的 web project,主要是用來讓使用者在開發環境下方便地瀏覽與下載檔案;結果沒想到內建的 middleware 就幾乎把所有事情都搞定了。 當然還是要再加點工才可以方便使用,例如當我點進目錄時,希望可以一覽目錄下的檔案清單,所以就客製化做了個 middleware 掛上來,把目錄下的檔案展開成清單做成連結讓使用者可以下載,當使用者點到檔案時就直接串到 HBFileMiddleware 下載檔案這樣。 第一次嘗試實作 Hummingbird 的 middleware 所以花了點時間研究,目前實作版本可以參考這 DirectoryIndexMiddleware ,還好進入門檻不高就是,花最多時間反而是在刻呈現頁面的 html。 因為想呈現那種傳統 Apache web server 檢視目錄下的復古感,於是參考 HBResponseGenerator 這個 protocol,是用來產生 response 結果頁,基本上只要實作 func response(from request: HBRequest) 把刻好的 html 產生成 HBResponse 結果就可以。 成品像是這樣 DirectoryIndexPage 會在剛剛的 DirectoryIndexMiddleware 裡被用到回傳 response。 為了求快所以先不套用什麼 template engine,直接用 String 拼出來,之後有時間再研究看看 Stencil 還是 Leaf 哪個好用。 雛型差不多完成之後,想說要掛個 HTTPS 功能結果好像沒有那麼直覺。本來以為只要把 Configuration 裡的 tlsOptions 設定上去就好,然後就會被噴 warning 訊息: tlsOptions set in Configuration will not be applied to a BSD sockets server....

June 28, 2022 · Keanu Pang

快速實驗與驗證功能的小工具 swift-sh

OK, 我們現在可以用 swift-sh 工具預先安裝到系統裡,這樣子之後只要做小型測試時只要單一個 swift 檔案,裡面標註 import 的敘述,就可以直接執行它。 先安裝好 swift-sh 工具: brew install swift-sh 然後就可以開始編寫 swift 檔案做小型的驗證: #!/usr/bin/swift sh import Foundation import PromiseKit // @mxcl ~> 6.5 firstly { after(.seconds(2)) }.then { after(.milliseconds(500)) }.done { print("notice: two and a half seconds elapsed") exit(0) } RunLoop.main.run() 要記得檔案最前面的 shebang 要寫明 #!/usr/bin/swift sh 的敘述,這樣系統才會去觸發 swift-sh 工具來處理;以及 import 第三方套件時,要在該行的最後加上註解是哪個 SwiftPM 的來源,甚至可以標註版本。 最後只要把這個檔案加上可執行權限就可以直接執行了。

December 3, 2021 · Keanu Pang

Failable Initializer 筆記

之前在 這篇文章 看到的。 將自己的 class 來做出一個可以是 optional 的物件,這樣一來使用的時候就必須用 if-let 或 guard 來讀取,在程式上會比較好理解跟處理。 直接上 code: class FilteredImage { ... init?(with imageName: String) { guard let image = UIImage(named: imageName) else { return nil } self.image = image } } 也就是說在初始化時是用 init? 的方式,確保回傳得到的物件要嘛是 nil 要嘛真的有值,而且對應的屬性也保證有值。 使用上也因為初始化回傳的是 optional 物件,限制了使用者必須用 if-let 或 guard 來拿取: guard let filteredImage = FilteredImage(with: "bird") else { // filteredImage is nil return } // filteredImage is initialized and we use it normally 然後要保持一個原則,回傳是 nil 一定是因為初始化失敗而得到的,如果是後面的行為造成的話等於權責不分無法抓住問題:...

June 1, 2021 · Keanu Pang