初探 Go 的單元測試:兼談 Stub 跟 Mock

測試是程式的防護網,能確保程式符合設計。而針對測試中包含第三方依賴的情境,可以用 Stub 或 Mock 來解耦,讓商業邏輯跟底層套件分開。本文會用 ORM 當例子,介紹 Golang 的 Stub 跟 Mock,並實作三種不同方式的測試。…

自動生成重複代碼:使用 Go 的 Template

開發軟體時,常常會發現有些函式或方法很類似,如果開發者僅僅寫設定檔,就有程式能根據設定檔來自動產生程式碼,不是很美好的事嗎?在實務上,這類用於產生程式的程式被稱為 Code Generator。本文會用 Callback 的 Generator 當例子,講解如何開發並使用一套 Code Generator。…

如何驗證使用者身分:使用 JWT

驗證與授權是開發網路應用時一定會遇到的問題。在傳統技術中,使用者會在登入時輸入帳號密碼,Server 驗證無誤後,創建一組 Session ID,Client 後續請求都會帶上 Session ID,方便 Server 檢驗。而 JWT 是自描述的驗證,對比舊方法來說,能降低 Server 的負擔。本文會講解 JWT 的原理並用 Node.js 搭配前端頁面,寫個簡單的網頁應用…

Conan:建置並管理 C/C++ 的產出物

以前我們討論過如何在 C/C++ 的專案中,使用 Conan 管理第三方套件。但如果角色轉換,開發的不是應用程式,而是函式庫,為方便他人引用,就需要將函式庫打包成 Conan Package,並上傳到 Server。本文會講解如何編寫 Conan 的 Recipe,打包 C/C++ 的函式庫,並在實際的應用程式中引用。…

用網頁製作你的簡報:reveal.js

reveal.js 是以 HTML 為基礎的簡報框架,藉由 CSS 跟 HTML 分離,講者可以更專注在內容,將設計交由第三方庫來處理。由於本質上是由 HTML、CSS 跟 JavaScript 組成,reveal.js 可以成為網站,只要使用者能上網,就能進行播放。本文會用 reveal.js 來設計簡報,嘗試體驗它的魅力。…

Go 的泛型替代方案:型別斷言與代碼生成

在 The Next Step for Generics 這篇文章中,Golang 有公開泛型的草稿,但至少到 1.15 為止,實務上仍需要仰賴別的方式來達到接近的效果。本篇會分別用型別斷言(type assertion)跟 genny 這套 Golang 開源函式庫,來試著實現一些基本函式,看看 Golang 如何處理泛型問題...

雙向互動的即時訊息:Websocket 入門

在 HTTP 設計之初,網路應用主要是交換文件,因此當提交訊息或更新訊息時,需要刷新整個頁面。但是對需要互動的應用,如果使用 HTTP 傳遞訊息,則需要客戶端頻繁向伺服端輪詢,可想而知會造成客戶端跟伺服端很大的負擔。比較理想的情況是,應該存在一個事件驅動模型,當伺服端有事件發生時,它會主動通知訂閱的客戶端,客戶端再進行更新,而這就是 WebSocket 這套通訊協定誕生的原因。…

資料庫版本遷移:以 Go 為例

我們通常稱呼資料庫版本遷移為 Migration,在 Laravel 或 RoR 中都有整合好的 Migration 工具,而 Golang 目前仍需要仰賴自己動手,golang-migrate 是現在比較成熟的專案。本文會講解如何使用 golang-migrate 的 CLI 跟函式庫,來建立資料庫 Migration。…