Hero Image
Design Reflection

需求設計與反省 最近面試遇到些需要我描述 SA 或是 SD 的工作經驗描述,發現我講得的零零落落的,不然就是根本忘了,故挑幾點印象比較深刻做文字整理,以便以後需要的時候可以回來這裡回想。 郵局信箱與招領 所有信箱都來自實際存在的地址,在第一次申請(141)建立可投遞的信箱維護所有基本資料(姓名、電話等等…)依賴信箱主檔與客戶基本檔。 實際投遞遇到問題或是租戶自行申請將影響信箱狀態變更(142 狀態如:續租或暫停使用等等…),影響信箱生命存續終止(145、146 如退租、屆期未續、轉空戶)。 若通訊地址有更改請先執行維護信箱交易(154 調整為改投或i郵箱)再執行退租,此時的通訊地址才會正確。 由多個交易可以看出信箱的所有狀態與存續的的生命週期。 所有變更資料面依賴信箱主檔、變更歷程寫入 BoxChange_LG(變更歷程)且幾乎所有報表查詢都會依賴變更歷程的最新一筆。 大量的計算邏輯(報表 781、782…)有大量的 sql 重複查詢,其實就是不同的查詢條件,可以彙總成共用 lib 抽離不同件數計算邏輯,不需要每個欄位都一個複雜又重工的 sql 指令。 反省: 礙於專案時程壓力,只好先寫寫看在再回過頭看需求細節的真實用意,其實很危險,很多姑且先寫寫看的功能,都會在終於懂得哪一刻發現很多多此一舉的地方,甚至在 QA 深入各個交易互測階段發現一些明顯邏輯不通的錯誤。 如果可以先了解欄位/物件真義,再進行開發還是比較好,但就是會需要說服 SA 把其他相關的交易規格都拿到,即便是大致掃一眼也是好的。 個資軌跡 h 銀行 個資軌跡交易類別,依 dal 實際邏輯做 function 做預設值參考,服務可以傳入參數強制改為要或不要寫入個資軌跡。 trackType比如: 查詢(新增/修改/刪除交易的查詢、新增 、修改 、刪除 等等。 db Entity 新增 annotation 註記不同機敏程度的代號,透過共用的 Repositary 層偵測更新的 model 牽涉機敏欄位多寡來記錄個資軌跡,並抽離以方便維護是否紀錄的邏輯 if (A_TypeCount >= 2 || (A_TypeCount >= 1 && B_TypeCount >= 1)) return 則記錄個資軌跡; 反省: 資料面攔截所有系統的機敏軌跡,但忽略列的業務邏輯層建立的 dto 也有個資,dal 可以寫入的內容有限,只能記錄自定義的 trackType 且依賴回傳的 TEntity result,如果回傳結果有多層 entities 結構,無法紀錄深層機敏資料( 多層 Entity 結構 )且會顯示 Expression Tree (LINQ 原始表達式字串) 無法讀取內容物例如: c.IdNo == value(HuaNan.Service+<>c__DisplayClass3_0).input.IdNo)

Hero Image
Distributed System

Distributed System 分散式系統設計,Net 8 服務,啟用 nginx upstream 從單機到多實例後,遇到的設計問題。 核心概念:Stateless Service 什麼是 Stateless? 定義:服務的每個實例不保留任何與特定請求或使用者相關的狀態資訊。 為什麼需要 Stateless? ┌─────────┐ ┌──────────────┐ ┌──────────┐ │ Client │────▶│ Load Balancer│────▶│Instance A│ └─────────┘ └──────────────┘ ├──────────┤ │ │Instance B│ │ ├──────────┤ └─────────────▶ │Instance C│ └──────────┘ 當你的系統從 1 台機器擴展到 N 台時: 請求分散:用戶的連續請求可能落在不同實例 實例隨時變動:Auto-scaling 會新增/移除實例 故障轉移:某個實例掛掉,流量會轉到其他實例 ❌ 禁止使用的狀態儲存方式 方式 為什麼不行 實際案例 IMemoryCache 只存在單一實例 User A 的資料在 Instance A,但下次請求到 Instance B static 變數 無法跨實例共享 計數器在每個實例都是獨立的 Singleton 內部狀態 每個實例有自己的 Singleton Session 資料只存在啟動該請求的實例 檔案系統 本地儲存 上傳的檔案只在一台機器上 ✅ 狀態必須外部化 所有狀態都必須存放在所有實例都能存取的外部系統:

Hero Image
NFS

NFS Local-like File Access 類本地讀寫 Network FileSystem 網路檔案系統,NFS 是一種讓多台電腦可以像操作本地硬碟一樣訪問遠端檔案的系統。 是一種 RPC Service(Remote Procedure Call),當你用 NFS 讀寫檔案時,客戶端其實是在透過 RPC 向伺服器發送「打開檔案」「讀檔案」「寫檔案」這些遠端操作的請求, Dynamic Port Allocation 動態端口 容器配置不需要額外維護 port export,rpcbind 會自動協調服務所使用的 TCP/UDP port,並且同一個 network 內的容器可以直接訪問這些 port;若存在防火牆或跨主機通信時,則需要額外開通對應 port,配置相對複雜。 Server/Client 伺服器/客戶端 因為是一種 RPC Service,所以會有兩種角色 Server、Client 就像 FileZilla 也是,你要遠端可以 FileZilla 連到,你需要在 target server 安裝 FileZilla server 或其他 ftp 類型 server on 著 listening ( 持續運行以監聽連線請求 ) 當 server 啟用時,可以讓服務跨 os、跨 server,同步讀取、寫入本地檔案。 ┌─────────────────┐ 網路 ┌─────────────────┐ │ NFS Server │ <─────────────────> │ NFS Client │ │ (141) │ │ (142) │ │ │ │ │ │ /nfs (實體目錄) │ ─────匯出(export)──> │ /nfs (掛載點) │ │ chmod 777 │ │ mount 後可存取 │ └─────────────────┘ └─────────────────┘ 安裝 Windows 啟用 server/client 開啟或關閉 Windows 功能

Hero Image
Test Tool

Test Tool Listed Tool StressTesting 壓力測試: JMeter、Nbomber End-to-End Test E2E 測試: Automa StressTesting JMeter //Todo Nbomber //Todo End-to-End Test Automa //Todo 補充 All Types of Test 文章提及工具: 壓力測試、E2E 測試 功能性測試 單元測試 (Unit Test) - 測試最小可測試單元 整合測試 (Integration Test) - 測試模組間的介面與互動 系統測試 (System Test) - 測試完整系統功能 驗收測試 (Acceptance Test) - 驗證系統是否符合需求 冒煙測試 (Smoke Test) - 快速驗證主要功能是否正常 回歸測試 (Regression Test) - 確保新改動不影響既有功能 非功能性測試 效能測試 (Performance Test) - 測試系統效能表現 負載測試 (Load Test) - 測試預期負載下的表現 🟢 壓力測試 (Stress Test) - 測試極限負載: JMeter、Nbomber 尖峰測試 (Spike Test) - 測試突發流量 耐久測試 (Endurance/Soak Test) - 測試長時間運行穩定性 安全測試 (Security Test) - 測試系統安全性與漏洞 相容性測試 (Compatibility Test) - 測試不同環境、瀏覽器、裝置的相容性 可用性測試 (Usability Test) - 測試使用者體驗 UI 相關測試 🟢 E2E 測試 (End-to-End Test) - 模擬使用者完整操作流程: Automa UI 測試 - 測試介面元件與互動 視覺回歸測試 (Visual Regression Test) - 比對畫面截圖差異 其他測試類型 探索性測試 (Exploratory Test) - 手動探索系統行為 混沌工程測試 (Chaos Engineering) - 主動注入故障測試韌性 A/B 測試 - 比較不同版本效果 災難復原測試 (Disaster Recovery Test) - 測試系統復原能力

Hero Image
RAG

RAG Retrieval-Augmented Generation RAG(檢索增強生成)是一種架構模式。 在 LLM 生成答案前,先從外部知識庫檢索相關資料,再將檢索結果提供給模型作為上下文,提升回答的正確性、可控性與即時性。 LLM 的本質:條件機率模型(Conditional Probability Model) 定義 大型語言模型(LLM)的核心任務只有一個:在給定前文條件下,預測下一個 token 的機率分佈。 數學形式為: P(token_t | token_1 … token_{t-1}) 表示在給定前文 token 的情況下,模型預測下一個 token 的機率。 這個機率分佈是由模型內部的所有參數(weights)共同決定的。 這些參數並不儲存任何可直接查詢的知識內容,而是隱式地編碼了大量語言片段之間的統計關聯與結構模式。 LLM 並不具備「查詢」、「記憶文件」或「事實驗證」能力。 LLM「知識」從何而來 X LLM 沒有文件 X LLM 沒有資料表 X LLM 沒有條目式知識 O 參數空間中所編碼的統計關聯結構 壓縮後的語言世界模型 訓練階段:把世界「壓縮」成參數,訓練資料(書籍、文件、程式碼、維基百科)僅用於不斷調整模型參數,強化 token 與 token 之間的關聯機率 資料不會被儲存,僅留下統計痕跡。 小模型仍「看起來懂很多」 多數人類知識是低熵、可高度壓縮的 技術文件與教科書高度模板化 (token 關聯穩定) 常識與基礎知識在語料中反覆出現 因此:只需要很少參數就能學到這種穩定規律,LLM 並非記住內容,而是學會「怎樣說才像懂」。 Transformer 擅長「關聯建模」 世界不是隨機的,而是高度可壓縮: 長距離 token 關聯 抽象語義空間 結構對齊(Structure Alignment) Transformer 等於一個超強壓縮器,這讓它可以: 將問題對齊到「已見過的語言模式」 再生成對應回應 回答不是「查到」,而是「生成」,不是回憶,是重建 類比

Hero Image
Multi-Tenant JWT Authentication

LineCRM.CarCare 登入架構說明 Multi-Tenant JWT Authentication 多租戶(Multi-Tenant)JWT 雙 Token 認證機制(Access Token + Refresh Token),支援商店用戶(Store)與客戶用戶(Customer)兩種身份類型的獨立認證流程。透過泛型設計與介面抽象,實現了可擴展的多角色登入系統,並結合 Redis 快取機制管理 Refresh Token,提供安全且高效的身份驗證解決方案。 Key Features 雙 Token 機制:Access Token (短效) + Refresh Token (長效) 多角色支援:Store User 與 Customer User 獨立認證 自動 Token 更新:Middleware 自動偵測過期並刷新 分散式快取:Redis 管理 Refresh Token 狀態 安全性強化:HttpOnly Cookie + CSRF 防護 可擴展架構:新增用戶類型僅需實作兩個介面 1. Adapter Pattern (適配器模式) 位置: StoreInfo 、 CustomerInfo、 IClaimAdapter.cs public interface IClaimAdapter<CurrentUser> { IEnumerable<Claim> GetClaims(); static abstract CurrentUser? FromClaimsPrincipal(ClaimsPrincipal principal); } public class CustomerContext : AppDataContext<CustomerInfo> { public CustomerContext(IHttpContextAccessor httpContextAccessor, IBaseLogger log) : base(httpContextAccessor, log) { } public override CustomerInfo? CurrentUser { get { var user = _httpContextAccessor.HttpContext?.User; return CustomerInfo.FromClaimsPrincipal(user); } } } public class CustomerInfo : IClaimAdapter<CustomerInfo> { public IEnumerable<Claim> GetClaims(){} public static CustomerInfo? FromClaimsPrincipal(ClaimsPrincipal principal){} } 說明:

Hero Image
Typora

Typora a nice .md file editor IDE 撰寫者:Amanda Chou 日期:2025/04/17 .md ? md 是什麼? Markdown 文件的副檔名 Markdown 又是什麼? Markdown ? **Markdown **是一種輕量級標記式語言,創始人為約翰·格魯伯。 使用易讀易寫的純文字格式編寫文件,然後轉換成有效的XHTML(或者HTML)文件。 這種語言吸收了很多在電子郵件中已有的純文字標記的特性。 輕量化、易讀易寫特性,並且對於圖片,圖表、數學式都有支援 Markdown 用途廣泛 目前許多網站都廣泛使用Markdown來撰寫說明文件或是用於論壇上發表訊息。如GitHub、Reddit、Discord、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、簡書等,甚至還能被用來撰寫電子書。 之前介紹的 Vue 文件 重新認識 Vue.js | Kuro Hsu git book 也是 深入淺出 GitBook 寫作與自助出版,電子書也能多人協作 HackMD 也是 小題大作的30個 HackMD 技巧 現在演示的這個投影片也是 md fille 怎麼變 slide? 後面針對匯出章節會提到 Why Markdown 輕量易用:Markdown 語法簡單直觀,幾乎無學習成本。(幾乎沒有,但還是有一點,語法還是需要熟悉一下) 高度可移植:Markdown 文件是純文字格式,可以在任何平台上查看或編輯,方便與版本控制工具,適合開發者和團隊協作。 多用途輸出:支援導出為 PDF、HTML、Word、Slides 等多種格式。特別適合技術文件、筆記、部落格文章等用途。 多輸出主要是依賴 Pandoc 工具支援,後面針對匯出章節會提到 強大的生態系統:可擴展性強,支持 LaTeX(數學公式)、圖表(如 mermaid.js)、代碼高亮等功能。 開放性標準:Markdown 是一種開放格式,無專屬軟體依賴,確保文件長期可讀。 參考: 寫作&筆記神器 MarkDown 真希望我學生時期就懂 分享了 dillinger, Typora 還有影片介紹 Why Markdown 只要可以版控,就會好找很多 如果有要找,版控,就會好找很多