最近幫同事建立了一台測試機,我使用 Cloudflare Tunnel 提供客戶測試網址,這樣就不需要處理防火牆的種種瑣事,不但減少了許多管理上的麻煩,透過 Cloudflare 的平臺檔在前面也相對安全許多。這篇文章會記錄一下我在 Ubuntu 22.04.5 LTS 上安裝和配置 Cloudflare Tunnel 的過程。
... 繼續閱讀 ...
最近幾週 MCP
(Model Context Protocol) 正夯,要瞭解這個 AI 世界的 USB 介面,那肯定是要親手寫一個 MCP Server 才行。今天這篇文章我將參考 MCP 官網的範例,示範一個完整的開發步驟,讓大家知道用 Python 開發 MCP Server 的起手式。我會透過最新潮的 uv 快速建立 Python 開發環境,並且寫一個簡單的 MCP Server 應用,然後快速安裝到 Claude Desktop 與 Visual Studio Code Insiders 之中,讓 Claude Desktop 與 GitHub Copilot 的 Agent Mode 都可以呼叫 MCP 伺服器中的工具。
... 繼續閱讀 ...
我最近幫一位同事整理一個已經維護 7 年的 Angular 專案,結果發現一個前後端分離的專案,只有「後端」有設定 CI / CD,前端一直以來都是人工建置與部署。我在弄 CI / CD 的時候,發現了許多 npm 套件版本有依賴問題,為了能消除這些惱人的警告,花了我好幾個小時的時間才得到徹底的解決。我這次會遇到套件依賴問題,就是因為當初的開發人員搞不定,多年來一直都視而不見,依賴問題從來都沒有搞定過,每次換人維護都用 npm install --force
或 npm install --legacy-peer-deps
來解決問題,然後一代傳一代,變成祖傳的慣例,變成技術債。如果專案有個維護妥當的 package-lock.json
檔案,其實要還原套件不是什麼難事,今天這篇文章我就來深入探討這個問題。
... 繼續閱讀 ...
由於從 .NET Core 1.0 開始,就沒有自動載入 BIG5
編碼的 Encoding
資料,所以你沒辦法直接透過 Encoding.GetEncoding("Big5")
取得 Encoding
物件。在 .NET Core 3.1 之前,還需要須額外安裝 System.Text.Encoding.CodePages
套件才行。不過,從 .NET 5 開始,這個套件成為了 .NET SDK 的一部分,不再需要額外安裝。但即便如此,你還是要特別執行一段註冊以使用此編碼。接下來,我們將深入探討如何註冊這些編碼並正確使用它們在不同的場景中。
... 繼續閱讀 ...
最近正在設計一個「即時口譯」的應用,可以幫助我們客戶在舉辦現場活動或即時線上活動時,可以提供多語言的口譯服務。我們需要將語音輸入訊號轉換為文字,然後再轉換為其他語言的語音。在這個過程中,首先要先深入瞭解常見的 WAV 格式,瞭解之後才能做一些更深層的細部操作。這篇文章將深入探討 WAV 格式,從 PCM 編碼格式到檔案大小計算方法,讓我們更好地處理音頻資料。
... 繼續閱讀 ...
最近研究了多套語音轉文字的模型,今天這篇文章我打算來分享一套由 Google 發展的 Chirp 通用語音模型 (Google USM),該模型能夠在單一模型中統一處理多種語言的數據,且主要用來處理短音頻(小於1分鐘)和長音頻(1分鐘至8小時)的應用情境。
... 繼續閱讀 ...
我現在維護著幾套不同的 Chrome 擴充套件,每次發佈新版本時都需要手動上傳更新,覺得有點麻煩,所以我這幾天研究了一下 Chrome Web Store Publish API 並設定了 GitHub Actions 來自動化發佈 Release 與 Chrome Extension,真的方便太多了。這篇文章我就來說說這個設定的過程。
... 繼續閱讀 ...
我在春節期間看了 Netflix 熱播的韓劇《外傷重症中心》,我在追劇的過程中不僅被劇情吸引,還不禁將劇中的情節與軟體開發的日常進行對比。這部劇不僅展現了醫療救援的緊張與挑戰,也讓我思考了許多與職場、專業精神相關的議題。以下是我從軟體人的角度出發,對這部劇的一些觀察與感想。
... 繼續閱讀 ...
微軟從 ASP.NET Core 9 開始正式支援 OpenAPI 規格,並推出 Microsoft.AspNetCore.OpenApi NuGet 套件,在建立 ASP.NET Core Web API 專案時,預設就會加入可以產生 OpenAI 規格的端點。不過,對許多開發人員來說,常用的 Swagger UI 介面卻不見了。今天這篇文章我就來說說怎樣把 Swagger UI 加回專案中。
... 繼續閱讀 ...