[{"content":"為什麼要自己做工具？ 備戰 2026 台東 CT226 全超鐵（226km）的過程中，補給計畫一直是我最頭痛的環節。\n騎車 180km、跑步 42.2km，總時間預計超過 11 小時，補給稍有失誤就可能在賽道上「爆缸」。我查過很多資料，也研究了 Maurten、SiS 等品牌的補給計算器，但問題很明顯：那些工具都是以國外補給品為主，台灣常用的 GA 太空膠、碳水炸彈、UP FAST 根本找不到。\n每次備賽前我都要打開 Excel，手動排每小時補給什麼、幾分鐘一次，然後還要確保咖啡因不過量、鈉補給足夠。這個流程很繁瑣，而且每次改一個參數（例如調整平均功率的假設）就要全部重算。\n所以我決定自己做一個。\n工具介紹：三鐵補給規劃 網址：https://bike-power-calculator.web.app/nutrition.html\n這個工具的核心功能是：根據你的體能數據、賽事條件、還有你手邊有哪些補給品，自動排出分鐘級的補給時間表。\n輸入什麼 體重、排汗率、環境溫度與濕度 FTP（功能性閾值功率）和預計平均功率 跑步配速 賽事距離（51.5、113、226 等） 進階選填：每小時碳水目標（g/hr）、鈉目標（mg/hr） 輸出什麼 一張詳細的補給時間表，包含：\n每個補給點的時間（分鐘） 補給項目名稱 累積碳水攝取 累積鈉攝取 累積咖啡因 備注（是否開放咖啡因窗口、電解質補充等） 計算邏輯 碳水需求 根據運動強度（以 FTP 百分比計算），工具會估算每小時碳水消耗量：\n騎車：依據平均功率與體重換算消耗 跑步：依據配速估算強度 如果你已知每小時要攝取多少碳水（例如你相信自己能消化 90g/hr），可以直接在進階設定裡覆蓋自動計算值。\n補給間隔計算 補給間隔用這個公式計算：\ninterval = 60 / (carbPerHr / leadProduct.carbs) 然後 snap 到最接近的合理值（5、10、15、20、25、30、40、45 分鐘），避免出現「18.7 分鐘補一次」這種不實際的排程。\n果膠輪替 一開始我設計的版本永遠都補同一個果膠，後來發現這樣比賽中會吃到膩。改進後加入輪替機制：每次補給後 rotationOffset + 1，讓你選的所有果膠輪流出現，避免一種吃到厭。\n咖啡因窗口 咖啡因不是從一開始就可以用，研究指出太早使用效果會打折扣：\n騎車段：完成 60% 後才開放 跑步段：完成 30% 後才開放 開放後才會在排程中安排咖啡因補給品（UP 綠茶咖啡因膠囊、可樂）。\n電解質動態排程 如果你設定了鈉目標（mg/hr），電解質間隔會動態計算：\nelecInterval = elecProduct.sodium / sodiumTargetPerHr * 60 沒設定的話，預設固定每 60 分鐘補一次電解質。\n補給品資料庫 工具內建了台灣市場常見的補給品，包含：\n產品 碳水 鈉 GA 太空能量膠（銀膠） 30.8g 250mg GA 太空能量膠MAX（小金膠） 29.8g 303mg GA ULTRA 能量膠（紅膠） 45g 103mg UP FAST 能量果膠 30g 50mg 碳水炸彈（蜂蜜） 42.2g 0mg 碳水炸彈（黑糖） 35g 250mg 坤能量膠（原味） 25g 0mg WiNSPORTS 鹽味西瓜 31.5g 225mg DECATHLON 葡萄粉包 31g 275mg Race On 電解液 0g 442mg 每個補給品都有優先順序排序，可以用拖曳或上下箭頭調整；也可以勾選哪些要加入本次計畫。\n技術架構 這個工具是純前端，不需要任何後端伺服器：\nHTML + Vanilla JavaScript：全部邏輯在一個 nutrition.html 裡 Firebase Hosting：免費靜態網站托管，push main 自動部署 localStorage：記憶使用者選擇的補給品和偏好 html2canvas：匯出補給計畫為圖片 之所以選擇不用任何框架，是因為這個工具的使用者（包括我自己）就是偶爾賽前打開用一下，不需要複雜的狀態管理，純 JS 反而維護起來最直接。\n深色模式 CSS 使用設計 token 系統，所有顏色都用 CSS 變數定義：\n:root { --blue: #2563eb; --text-1: #1f2937; --bg: #ffffff; --border: #e5e7eb; } [data-theme=\u0026#34;dark\u0026#34;] { --blue: #60a5fa; --text-1: #f1f5f9; --bg: #0f172a; --border: #334155; } 切換主題只需要在 \u0026lt;html\u0026gt; 加上 data-theme=\u0026quot;dark\u0026quot;，配色全部自動切換，不會有某個角落還是白底的問題。\n開發過程的幾個技術決策 為什麼不用現有的計算器？ Garmin、Polar、甚至 TrainingPeaks 都有補給功能，但都不支援自訂台灣補給品。我要的是「我手邊有這些膠，幫我排出最優補給順序」，這個需求現有工具做不到。\n補給間隔的 snap 邏輯 原本計算出來的間隔可能是 13.5 分鐘這種值，比賽中很難執行。所以加了 snap 到固定清單 [5, 10, 15, 20, 25, 30, 40, 45]，往最近的整數靠，確保排出來的計畫是可以實際遵守的。\n左面板收合 賽前確認排程時，不需要一直看輸入面板，所以加了橫向收合功能。收合後只剩一條細邊，不佔螢幕空間，點擊可以重新展開。\n結語 這個工具從想法到可用版本大概花了幾個下午的時間，主要靠 Claude AI 協助寫 JavaScript 的計算邏輯和 CSS 排版。整個過程讓我更確信一件事：對工程師來說，AI 最大的價值不是幫你寫你不會的東西，而是讓你能更快把腦袋裡的設計落實成程式碼。\n補給計畫只是工具，更重要的是訓練有沒有到位。\nCT226，4/28 見。\n工具連結：三鐵補給規劃\n","permalink":"https://0Zhen.github.io/posts/triathlon-nutrition-planner/","summary":"\u003ch2 id=\"為什麼要自己做工具\"\u003e為什麼要自己做工具？\u003c/h2\u003e\n\u003cp\u003e備戰 2026 台東 CT226 全超鐵（226km）的過程中，補給計畫一直是我最頭痛的環節。\u003c/p\u003e\n\u003cp\u003e騎車 180km、跑步 42.2km，總時間預計超過 11 小時，補給稍有失誤就可能在賽道上「爆缸」。我查過很多資料，也研究了 Maurten、SiS 等品牌的補給計算器，但問題很明顯：\u003cstrong\u003e那些工具都是以國外補給品為主，台灣常用的 GA 太空膠、碳水炸彈、UP FAST 根本找不到。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e每次備賽前我都要打開 Excel，手動排每小時補給什麼、幾分鐘一次，然後還要確保咖啡因不過量、鈉補給足夠。這個流程很繁瑣，而且每次改一個參數（例如調整平均功率的假設）就要全部重算。\u003c/p\u003e\n\u003cp\u003e所以我決定自己做一個。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"工具介紹三鐵補給規劃\"\u003e工具介紹：三鐵補給規劃\u003c/h2\u003e\n\u003cp\u003e網址：\u003ca href=\"https://bike-power-calculator.web.app/nutrition.html\"\u003ehttps://bike-power-calculator.web.app/nutrition.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e這個工具的核心功能是：\u003cstrong\u003e根據你的體能數據、賽事條件、還有你手邊有哪些補給品，自動排出分鐘級的補給時間表。\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"輸入什麼\"\u003e輸入什麼\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e體重、排汗率、環境溫度與濕度\u003c/li\u003e\n\u003cli\u003eFTP（功能性閾值功率）和預計平均功率\u003c/li\u003e\n\u003cli\u003e跑步配速\u003c/li\u003e\n\u003cli\u003e賽事距離（51.5、113、226 等）\u003c/li\u003e\n\u003cli\u003e進階選填：每小時碳水目標（g/hr）、鈉目標（mg/hr）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"輸出什麼\"\u003e輸出什麼\u003c/h3\u003e\n\u003cp\u003e一張詳細的補給時間表，包含：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e每個補給點的時間（分鐘）\u003c/li\u003e\n\u003cli\u003e補給項目名稱\u003c/li\u003e\n\u003cli\u003e累積碳水攝取\u003c/li\u003e\n\u003cli\u003e累積鈉攝取\u003c/li\u003e\n\u003cli\u003e累積咖啡因\u003c/li\u003e\n\u003cli\u003e備注（是否開放咖啡因窗口、電解質補充等）\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"計算邏輯\"\u003e計算邏輯\u003c/h2\u003e\n\u003ch3 id=\"碳水需求\"\u003e碳水需求\u003c/h3\u003e\n\u003cp\u003e根據運動強度（以 FTP 百分比計算），工具會估算每小時碳水消耗量：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e騎車：依據平均功率與體重換算消耗\u003c/li\u003e\n\u003cli\u003e跑步：依據配速估算強度\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如果你已知每小時要攝取多少碳水（例如你相信自己能消化 90g/hr），可以直接在進階設定裡覆蓋自動計算值。\u003c/p\u003e\n\u003ch3 id=\"補給間隔計算\"\u003e補給間隔計算\u003c/h3\u003e\n\u003cp\u003e補給間隔用這個公式計算：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003einterval = 60 / (carbPerHr / leadProduct.carbs)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然後 snap 到最接近的合理值（5、10、15、20、25、30、40、45 分鐘），避免出現「18.7 分鐘補一次」這種不實際的排程。\u003c/p\u003e\n\u003ch3 id=\"果膠輪替\"\u003e果膠輪替\u003c/h3\u003e\n\u003cp\u003e一開始我設計的版本永遠都補同一個果膠，後來發現這樣比賽中會吃到膩。改進後加入輪替機制：每次補給後 \u003ccode\u003erotationOffset + 1\u003c/code\u003e，讓你選的所有果膠輪流出現，避免一種吃到厭。\u003c/p\u003e\n\u003ch3 id=\"咖啡因窗口\"\u003e咖啡因窗口\u003c/h3\u003e\n\u003cp\u003e咖啡因不是從一開始就可以用，研究指出太早使用效果會打折扣：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e騎車段：完成 60% 後才開放\u003c/li\u003e\n\u003cli\u003e跑步段：完成 30% 後才開放\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e開放後才會在排程中安排咖啡因補給品（UP 綠茶咖啡因膠囊、可樂）。\u003c/p\u003e","title":"用 Claude AI 打造三鐵補給規劃工具：從痛點到上線的完整記錄"},{"content":" 隨著變頻器驅動馬達（Inverter-fed Motor）普及，高壓絕緣問題從「低壓工頻」升級為「高頻 PWM 脈衝衝擊」，局部放電（Partial Discharge, PD）成為工程師不得不面對的課題。這篇筆記整理了從磁線規範、介電物理，到 PD 測試實務的完整知識脈絡。\n一、磁線規範：NEMA MW 1000 與 MW 35-C NEMA MW 1000 — 美國磁線總體規範 ANSI/NEMA MW 1000（2025 年後更名為 MW 01000）是美國磁線（Magnet Wire）國家標準，涵蓋圓形、矩形、方形薄膜絕緣銅／鋁磁線，分為三個部分：\nPart 1：通用資訊（定義、尺寸規格、測試條件） Part 2：各類型磁線的非尺寸產品規格 Part 3：測試程序與數值 Annex H：FIW（全絕緣磁線）專用規範，包含在線高壓連續性測試（Inline HVC） 業界常見的「NEMA 1000」、「MW 1000」、「NEMA MW 1000」均指同一份標準。\nNEMA MW 35-C — PEI/PAI 漆包線子規範 MW 35-C 專門針對圓形銅質磁線，採用 Polyesterimide / Polyamideimide 雙層絕緣，熱等級 200°C，對應 IEC 60317-13。\n項目 NEMA MW 1000 NEMA MW 35-C 性質 磁線總體規範 子產品規範 範圍 所有磁線類型 圓形銅線／PAI 絕緣 熱等級 視子規範而定 200°C 對應 IEC — IEC 60317-13 MW 1000 的 PD 相關測試 測試類型 適用規範 說明 高壓連續性（HVC） MW 1000 Part 3 偵測針孔，非直接 PD 量測 介電崩潰電壓 MW 1000 Part 3 破壞性，確認絕緣強度 FIW 在線 HVC MW 1000 Annex H 100% 線材掃描，故障電流 18 mA PDIV 測試 主要參考 IEC 60270 MW 1000 未獨立規定，通常由客戶規格指定 二、PEI/PAI 漆包線特性 MW 35-C 定義的雙層漆包線結構：\n底層（Basecoat）：聚酯醯亞胺（PEI）—— 提供基礎介電強度與機械性能 面層（Topcoat）：聚醯胺醯亞胺（PAI）—— 提供高耐熱、耐化學性 特性 說明 耐熱性 熱等級 200°C，熱壽命優異 機械性能 抗刮傷性極佳（PAI 高硬度），繞線性優良 耐化學性 耐溶劑、耐冷媒，適合密閉（Hermetic）應用 介電性能 高介電崩潰電壓，熱塑性流動特性良好 與其他磁線比較：\n特性 PEI/PAI (MW 35-C) 純聚酯 (MW 28) 聚醯亞胺 (MW 16-C) 熱等級 200°C 155°C 220°C+ 耐化學性 ★★★★☆ ★★☆☆☆ ★★★★★ 機械強度 ★★★★☆ ★★★☆☆ ★★★★★ 成本 中等 低 高 三、介電理論基礎 電極化 vs 磁化 — 一個熟悉的類比 做馬達的人對磁化（Magnetization）不陌生：外加磁場 H，材料產生磁化強度 M，兩者合成磁通密度 B。介電極化（Dielectric Polarization）是完全對應的類比：\n電極化 磁化 驅動場 電場 E 磁場 H 響應量 極化強度 P 磁化強度 M 材料方程 D = ε₀E + P B = μ₀(H + M) 線性響應 P = ε₀χₑE M = χₘH 同樣地：\n電場問題 磁場問題 介電常數 εᵣ 導磁率 μᵣ 電極化率 χₑ = εᵣ − 1 磁化率 χₘ = μᵣ − 1 氣泡（電場集中） 氣隙（磁場集中） 介電損 磁滯損 介電常數 εᵣ 的工程意義 εᵣ 越大，材料被極化的能力越強，越能屏蔽內部電場。氣體 εᵣ ≈ 1，幾乎無極化能力，因此絕緣體中若存在氣泡，電場就會集中在氣泡內部，這正是局部放電的根本起因。\n材料 εᵣ 真空／氣體 ≈ 1 聚乙烯 (PE) 2.3 環氧樹脂 3–5 水 80 四、高壓放電現象總覽 高壓下的放電現象分為幾種型態，工程上常混淆，這裡一次釐清：\n電暈放電（Corona Discharge） 電場強度超過氣體游離場強（空氣 ≈ 3 kV/mm）時，局部氣體游離但未形成完整導電通道。會產生藍紫色光暈、臭氧（O₃）、NOx 與 EMI，是 PD 的一種形式。\n輝光放電（Glow Discharge） 需要低氣壓（1～100 Pa），氣體均勻游離，形成穩定自持放電。日光燈、霓虹燈的原理。電流小、不損傷電極，與馬達絕緣關係較小。\n電弧放電（Arc Discharge） 電流夠大時形成完整導電通道，溫度極高（數千至數萬 K），具破壞性。電焊、閃電、開關跳弧都是電弧。\n（封面圖即為電弧放電實驗，來源：YouTube）\n閃絡（Flashover） 沿絕緣體表面發生的放電（非穿透內部）。表面污染 → 漏電流增加 → 乾帶形成 → 局部電弧 → 貫穿通道。常見於戶外高壓礙子與套管。\n放電的物理判斷條件 所有放電現象的共同物理基礎：\n符號 意義 qλE_app 電子走一個平均自由路徑 λ 累積的動能 Wᵢ 游離能（Ionization Energy） W_b 化學鍵能（Bond Energy） qλE_app \u0026gt; Wᵢ → 碰撞游離發生，電子雪崩啟動 W_elec \u0026gt; W_b → 化學鍵斷裂，絕緣材料永久損傷 電子雪崩崩潰機制：(a) 碰撞游離 (b) 電子倍增 (c) 雪崩通道形成 (d) 化學鍵斷裂導致放電。[3]\n五、局部放電（PD）定義與類型 IEC 60270 定義 發生在電極間局部區域的放電，但未完全橋接兩電極之間的絕緣。\n這個「未完全橋接」是關鍵：放電是局部的、不完全的，絕緣整體仍維持功能，但會隨時間累積劣化。\nPD 的三種類型 局部放電類型：(a) 內部放電 (b) 表面放電 (c) 電暈放電 (d) 電樹枝通道（Treeing Channel）。[2]\nPD 類型 發生位置 說明 Internal Discharge 固體絕緣內部氣泡 最典型的 PD Surface Discharge 絕緣體表面 表面不完全導通 Corona Discharge 電極尖端附近氣體 電場集中區域游離 重要區分：\n表面放電（局部，未貫穿）→ Surface Discharge → 屬於 PD ✅ 閃絡（貫穿兩電極） → Flashover → 不屬於 PD ❌ 絕緣內部的氣泡問題 實際高壓電纜或馬達繞組中，絕緣層內部難免存在製程缺陷或老化造成的空隙（Voids）：\n高壓電纜截面示意：絕緣層中的空隙（Insulation Voids）是局部放電的主要發生位置，空隙越靠近導體，承受電場越強。[1] [1]\n六、氣泡導致 PD 的物理機制 氣泡為何危險？根本原因在於 εᵣ 的差異：\n在串聯介質（絕緣體 + 氣泡）中，電場分配與介電常數成反比：\n$$E \\propto \\frac{1}{\\varepsilon_r}$$\n[導體] ─── [絕緣體 ε≈3] ─── [氣泡 ε≈1] ─── [絕緣體 ε≈3] ─── [導體] ↑ 電場集中在氣泡 完整因果鏈：\n氣泡 εᵣ ≈ 1 ↓ 極化強度 P ≈ 0（幾乎不極化） ↓ 無束縛電荷產生 ↓ 沒有反向電場削弱內部電場 ↓ 電場集中 → 碰撞游離 → 局部放電（PD） 一句話記憶：介電常數低 = 極化能力弱 = 無法屏蔽電場 = 電場集中 = PD。\n七、PDIV、PDEV、RPDIV 這三個參數是 PD 測試的核心指標：\n參數 全名 說明 PDIV Partial Discharge Inception Voltage 電壓由低→高，首次偵測到 PD 時的電壓 PDEV Partial Discharge Extinction Voltage 電壓由高→低，PD 消失時的電壓 RPDIV Repetitive PDIV PD 開始穩定重複出現時的電壓 數值關係：\n低壓 ──→ PDEV ──→ PDIV ──→ RPDIV ──→ BDV（擊穿） PD消失 PD首次 PD穩定重複 絕緣崩潰 通常 PDEV \u0026lt; PDIV ≤ RPDIV。PDEV \u0026lt; PDIV 是因為遲滯效應：放電一旦啟動，維持放電比重新啟動容易。\n階梯電壓法（Step Voltage Method）：紅線為電壓上升路徑，在 corona 起始點（PDIV）後繼續升壓至 Max Working Voltage，再升至崩潰（breakdown）。藍線顯示存在 PDIV 遲滯。\n對變頻器驅動馬達而言，RPDIV 比 PDIV 更有工程意義：PDIV 可能只是偶發單次事件，RPDIV 才代表 PD 穩定在每個交流週期重複，持續侵蝕絕緣。\n記憶法：PDIV = 第一次看到；RPDIV = 確定會一直來。\n八、PD 測試方法 標準電氣法（IEC 60270） 測試電路四大元件：\n高壓測試變壓器（T）：自身 PD 應 \u0026lt; 5 pC 耦合電容（Ck）：1 nF～1 μF，為高頻脈衝提供低阻抗路徑 檢測阻抗（Zm）：PD 電流脈衝 → 電壓脈衝 PD 量測儀器：放大、濾波、輸出 pC 數值 測試前用 PD 校準器注入已知脈衝（如 100 pC），上升時間須 \u0026lt; 60 ns。\n六種偵測方法比較 方法 頻率範圍 適用設備 特點 電氣法（IEC 60270） 100 kHz～1 MHz 電纜、變壓器 定量（pC），需低雜訊環境 UHF 電磁法 300 MHz～1500 MHz GIS 氣體絕緣開關設備 抗干擾強 聲波法（AE） 20 kHz～300 MHz 油浸式變壓器 TOF 定位放電位置 DGA 化學法 — 油浸式設備 分析 H₂、CH₄、C₂H₂ UV 相機法 紫外線 架空線路、戶外設備 帶電巡檢目視電暈 HFCT 夾鉗法 1 MHz～50 MHz 電纜接頭／終端 夾接地線，不需停電 驗收標準參考 設備 標準 驗收準則 高壓電纜（工廠） IEC 60840 \u0026lt; 5 pC 電纜（現場安裝後） IEEE 400.3 100～300 pC @ U₀ 變壓器 72.5 kV 以下 IEC 60076-3 ≤ 300 pC 馬達／發電機（新品） IEC 60034-27-1 \u0026lt; 1000 pC PRPD 圖形判斷放電類型 圖形特徵 放電類型 正負半週對稱，約 45°/225°（兔耳形） 內部空洞放電 正負半週不對稱 表面放電 僅出現在單一半週 電暈放電 脈衝散佈無規律，與相位無關 外部雜訊 九、馬達絕緣測試總覽 高壓馬達定子繞組含雲母（Mica），是最耐 PD 的材料之一。PD 的發生不代表立即失效，而是隨時間累積劣化，因此需要定期監測。\n四種測試的定位：\n測試 類比 偵測的問題 絕緣電阻（IR） 量體溫 整體受潮、污染、老化 交流耐壓（Hi-Pot AC） 壓力測試 對地絕緣能否承受高壓 PD 測試 X 光 絕緣內部潛在空洞劣化 Surge Test 超音波 匝間是否已短路 建議執行順序：\nIR / PI → Surge Test → Hi-Pot AC → PD 測試 先做 IR 確認夠乾燥，再做 Surge 確認無短路，才做高壓測試，最後用 PD 確認細節。\n十、變頻器馬達的絕緣挑戰 頻率越高，問題越嚴重 介電損與頻率成正比：\n$$P = f \\cdot \\varepsilon_0 \\cdot \\varepsilon_r \\cdot \\tan\\delta \\cdot E^2$$\nPD 劣化也與頻率成正比——頻率越高，每秒放電次數越多，絕緣劣化速度越快。\n電源類型 PD 劣化 介電損 特點 DC 最低 幾乎無 無過零點，熄弧困難 工頻 AC（50/60 Hz） 中 中 正常運行 高頻 AC（kHz 以上） 高 高 熄弧困難 PWM 脈衝 最高 高 變頻器驅動馬達特別危險 材料選擇 材料 極性 tan δ 耐熱等級 PTFE（鐵氟龍） 極低 極低 高 聚醯亞胺 PI 中等 低 H 級（180°C+） 聚酯亞胺 PEI 中等 中 F 級 聚酯 PET 較高 較高 B/F 級 變頻器專用馬達不只需要耐熱的絕緣材料，更需要在高頻下維持低介電損（低 tan δ），這是選用 PI 漆包線的核心原因，而非只是熱等級的考量。\n附錄：重要標準對照 標準 說明 ANSI/NEMA MW 1000 美國磁線總體規範 NEMA MW 35-C PEI/PAI 圓形銅磁線規範，200°C IEC 60317-13 MW 35-C 對應 IEC 標準 IEC 60270 局部放電測試方法（電氣法） IEC 60034-27-1 馬達定子繞組離線 PD 測試 IEC 60034-27-2 馬達定子繞組在線 PD 測試 IEC 60076-3 變壓器 PD 驗收標準 IEC 60840 高壓電纜 PD 驗收標準 IEEE 43 絕緣電阻測試（IR/PI） IEEE 400.3 電纜現場 PD 測試 參考資料 [1] Lectromec. Addressing the Big Questions of Partial Discharge. https://lectromec.com/addressing-the-big-questions-of-partial-discharge/\n[2] Rathod, V. B., Kumbhar, G. B., \u0026amp; Bhalia, B. R. (2022). Partial Discharge Detection and Localization in Power Transformers based on Acoustic Emission: Theory, Methods, and Recent Trends. IETE Technical Review, 39(3), 540–552. https://doi.org/10.1080/02564602.2021.1871672\n[3] Wang, J., Shen, ZH., Li, W. et al. (2025). Dynamic atomic-scale electron avalanche breakdown in solid dielectrics. Nature Communications, 16, 6465. https://doi.org/10.1038/s41467-025-61866-z\n[4] 電弧放電實驗影片. https://www.youtube.com/watch?v=iO_2NA_eF-Q\n","permalink":"https://0Zhen.github.io/posts/high-voltage-insulation-pd/","summary":"\u003cblockquote\u003e\n\u003cp\u003e隨著變頻器驅動馬達（Inverter-fed Motor）普及，高壓絕緣問題從「低壓工頻」升級為「高頻 PWM 脈衝衝擊」，局部放電（Partial Discharge, PD）成為工程師不得不面對的課題。這篇筆記整理了從磁線規範、介電物理，到 PD 測試實務的完整知識脈絡。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"一磁線規範nema-mw-1000-與-mw-35-c\"\u003e一、磁線規範：NEMA MW 1000 與 MW 35-C\u003c/h2\u003e\n\u003ch3 id=\"nema-mw-1000--美國磁線總體規範\"\u003eNEMA MW 1000 — 美國磁線總體規範\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eANSI/NEMA MW 1000\u003c/strong\u003e（2025 年後更名為 MW 01000）是美國磁線（Magnet Wire）國家標準，涵蓋圓形、矩形、方形薄膜絕緣銅／鋁磁線，分為三個部分：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePart 1\u003c/strong\u003e：通用資訊（定義、尺寸規格、測試條件）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePart 2\u003c/strong\u003e：各類型磁線的非尺寸產品規格\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePart 3\u003c/strong\u003e：測試程序與數值\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAnnex H\u003c/strong\u003e：FIW（全絕緣磁線）專用規範，包含在線高壓連續性測試（Inline HVC）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e業界常見的「NEMA 1000」、「MW 1000」、「NEMA MW 1000」均指同一份標準。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"nema-mw-35-c--peipai-漆包線子規範\"\u003eNEMA MW 35-C — PEI/PAI 漆包線子規範\u003c/h3\u003e\n\u003cp\u003eMW 35-C 專門針對\u003cstrong\u003e圓形銅質磁線\u003c/strong\u003e，採用 Polyesterimide / Polyamideimide 雙層絕緣，熱等級 200°C，對應 IEC 60317-13。\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e項目\u003c/th\u003e\n          \u003cth\u003eNEMA MW 1000\u003c/th\u003e\n          \u003cth\u003eNEMA MW 35-C\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e性質\u003c/td\u003e\n          \u003ctd\u003e磁線總體規範\u003c/td\u003e\n          \u003ctd\u003e子產品規範\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e範圍\u003c/td\u003e\n          \u003ctd\u003e所有磁線類型\u003c/td\u003e\n          \u003ctd\u003e圓形銅線／PAI 絕緣\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e熱等級\u003c/td\u003e\n          \u003ctd\u003e視子規範而定\u003c/td\u003e\n          \u003ctd\u003e200°C\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e對應 IEC\u003c/td\u003e\n          \u003ctd\u003e—\u003c/td\u003e\n          \u003ctd\u003eIEC 60317-13\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"mw-1000-的-pd-相關測試\"\u003eMW 1000 的 PD 相關測試\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e測試類型\u003c/th\u003e\n          \u003cth\u003e適用規範\u003c/th\u003e\n          \u003cth\u003e說明\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e高壓連續性（HVC）\u003c/td\u003e\n          \u003ctd\u003eMW 1000 Part 3\u003c/td\u003e\n          \u003ctd\u003e偵測針孔，非直接 PD 量測\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e介電崩潰電壓\u003c/td\u003e\n          \u003ctd\u003eMW 1000 Part 3\u003c/td\u003e\n          \u003ctd\u003e破壞性，確認絕緣強度\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eFIW 在線 HVC\u003c/td\u003e\n          \u003ctd\u003eMW 1000 Annex H\u003c/td\u003e\n          \u003ctd\u003e100% 線材掃描，故障電流 18 mA\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003ePDIV 測試\u003c/td\u003e\n          \u003ctd\u003e主要參考 IEC 60270\u003c/td\u003e\n          \u003ctd\u003eMW 1000 未獨立規定，通常由客戶規格指定\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"二peipai-漆包線特性\"\u003e二、PEI/PAI 漆包線特性\u003c/h2\u003e\n\u003cp\u003eMW 35-C 定義的雙層漆包線結構：\u003c/p\u003e","title":"高壓絕緣與局部放電：從磁線規範到 PD 測試一次搞懂"},{"content":" 從事磁鐵相關產業，或對磁性材料有興趣的朋友，這篇筆記整理了鐵氧體磁鐵從製造到應用的核心知識，包含製程三大維度、軟硬磁差異、牌號命名規則，以及一些業界有趣的小知識。\n一、什麼是鐵氧體（Ferrite）？ 鐵氧體是一種陶瓷磁性材料，主要成分為氧化鐵（Fe₂O₃）加上其他金屬氧化物（如錳、鋅、鎳、鋇、鍶等）。由於原料豐富、成本低廉，是目前全球使用量最大的磁性材料之一，廣泛應用於電感、變壓器、馬達、揚聲器等電子與電機產品。\n二、製程三大維度 選擇鐵氧體的製程，需要同時考量三個獨立的維度，它們可以自由組合，決定最終產品的性能與成本。\n維度一：混料方式 — 濕式 vs 乾式 這個維度決定原料粉末如何混合均勻。\n乾式（Dry Process） 濕式（Wet Process） 作法 粉末直接混合造粒 加水研磨成漿料，再脫水 混合均勻度 一般 優良 成本 低 較高 最終性能 普通 較佳 補充：熱壓燒結（Hot Press Sintering） 屬於乾式製程的一種特殊形式，全程不加水，同時施加壓力與高溫，一步完成成型與燒結，緻密度極高、晶粒細小，但通常單獨列為一種製程類別。\n維度二：固化方式 — 燒結 vs 黏結 這個維度決定粉末最終如何固化成形。\n燒結（Sintered） 黏結（Bonded） 作法 高溫（1100–1300°C）燒結 混入橡膠、塑膠或樹脂成型 密度 高，質地硬脆 較低，可具彈性 磁性能 強 較弱 形狀彈性 受限 高度自由，可彎曲裁切 耐溫性 優 受黏結劑限制 應用 馬達、揚聲器磁鐵 廣告磁條、冰箱磁鐵 維度三：磁矩排列 — 等方性 vs 異方性 這個維度決定製造時磁粉的排列方式，影響最終磁性能的上限。\n等方性（Isotropic） 異方性（Anisotropic） 成型時加磁場？ 否 是 磁矩排列 隨機 沿特定方向整齊排列 磁性能 較弱 較強（可達 2 倍以上） 充磁方向 任意方向皆可，甚至多極充磁 只能沿排列方向充磁 成本 低 較高 常見誤解澄清： 等方性和異方性磁鐵製造完成後，本身都不帶磁性，兩者都需要經過充磁才能使用。差別只在於充磁的方向限制。\n三維度的最佳組合 最高性能：異方性 + 濕式 + 燒結 → 常用於高效馬達磁鐵 一般量產：等方性 + 乾式 + 黏結 → 橡膠磁條、廣告磁鐵 三、軟磁 vs 硬磁 這是鐵氧體最根本的功能分類，差別在於磁化與去磁的難易程度。\n項目 軟磁（Soft Magnetic） 硬磁（Hard Magnetic） 矯頑力 Hc 低，容易去磁 高，難以去磁 磁導率 μ 高，易被磁化 低 磁滯損耗 低 高 功能定位 傳導、引導磁通量 永久提供磁場 需要充磁？ 不需要 需要 典型材料 MnZn、NiZn 鐵氧體 SrFe（鍶鐵氧體）、BaFe（鋇鐵氧體） 應用場合 變壓器磁芯、電感磁芯、天線 馬達轉子、揚聲器、感應器 一句話記憶：軟磁像海綿，磁場來就吸、走就放，用來傳導磁通；硬磁像記憶，一旦磁化就長期保持，用來永久提供磁場。\n軟磁的輕稀土添加 在高性能 MnZn 或 NiZn 軟磁鐵氧體中，會添加微量輕稀土元素來改善性能：\n元素 主要效果 鑭（La） 降低損耗、提高磁導率 釹（Nd） 改善高頻特性 鐠（Pr） 細化晶粒、降低損耗 鈰（Ce） 降低成本、調整燒結特性 這些添加物通常偏析在晶界，抑制晶粒異常成長，使微結構更均勻，進而提升整體性能。\n四、磁鐵牌號命名規則 命名格式 字母 + 數字 ↓ ↓ 材料類型 BHmax（磁能積）× 10 磁能積（BHmax） 代表磁鐵儲存磁能的能力，單位為 MGOe（百萬高斯奧斯特），數值越高磁鐵性能越強。\n常見牌號 牌號 材料類型 BHmax（MGOe） 特性 Y10 燒結鐵氧體，等方性 ≈ 1.0 基本款 Y30 燒結鐵氧體，異方性 ≈ 3.0 常見馬達用 Y40 燒結鐵氧體，異方性 ≈ 4.0 高性能 R10 橡膠黏結鐵氧體，等方性 ≈ 1.0 可彎曲、可裁切 R20 橡膠黏結鐵氧體，異方性 ≈ 2.0 軟性磁鐵中較高性能 業界小知識：為什麼唸「才」？ 台灣磁鐵業界常把牌號的「號」唸成「才」，例如「Y30才」。這是因為台灣早期磁鐵產業大量引進日本技術，「才」來自日文「号（ごう / gō）」的口語發音，沿用至今，成為業界師傅之間的獨特術語。\n這種現象在台灣傳統製造業相當常見，許多機械、電子、模具業的術語都保有日語發音的痕跡。\n五、各材料性能與價格比較 鐵氧體整體屬於低成本磁性材料。真正的價格差異，來自於不同材料家族之間的比較：\n材料 BHmax 範圍 相對價格 備註 鐵氧體（Ferrite） 1–4 MGOe ★☆☆☆ 低 最普遍，原料豐富 鋁鎳鈷（AlNiCo） 1–5 MGOe ★★☆☆ 中 耐高溫特性好 釤鈷（SmCo） 18–32 MGOe ★★★★ 很貴 稀土材料，高溫穩定 釹鐵硼（NdFeB） 35–55 MGOe ★★★☆ 貴 性能最強，稀土，價格波動大 硬磁比軟磁貴？不一定。在鐵氧體家族內，硬磁和軟磁價差不大。真正貴的是釹鐵硼、釤鈷這類含稀土的材料，是因為原料稀缺，而非「硬磁」本身的特性。\n六、製造與測試重點 壓製成型的密度梯度問題 壓製磁鐵時，壓力從模具端施加，在傳遞過程中因粉末摩擦而衰減。高度越高，密度梯度越明顯，造成：\n磁性不均勻 燒結收縮不一致，容易變形或裂紋 機械強度不均 改善方式：\n改用雙向加壓（上下同時施壓，最差點從底部移到中間） 採用等靜壓成型（CIP），各方向均勻施壓 設計上降低 H/D 比（高度與直徑比），盡量壓扁 優化粉末流動性（造粒、添加潤滑劑） 退磁測試：開迴路 vs 閉迴路 永久磁鐵在高溫、反向磁場或震動下可能發生退磁，這兩種測試方法用來量化退磁抵抗能力：\n開迴路測試 閉迴路測試 有無導磁迴路 無，磁鐵單獨放置 有，放入導磁軛鐵 退磁場影響 大（自身退磁場明顯） 小 工作點位置 低（B-H 曲線較低處） 高（接近 Br） 測試嚴苛度 嚴苛，最壞情境 接近實際應用 模擬情境 裸磁鐵單獨使用 磁鐵裝入產品後 設計產品時通常以閉迴路工作點為基準，但安全規格驗證有時會要求開迴路測試也必須通過。\n七、重點整理 製程三維度可自由組合：混料（濕/乾）× 固化（燒結/黏結）× 排列（等方/異方） 最高性能組合：異方性 + 濕式 + 燒結 軟磁傳導、硬磁永久：功能完全不同，都重要 兩者都需充磁：等方性充磁方向自由，異方性方向固定 牌號數字 = BHmax × 10：R 系列是橡膠黏結，Y 系列是燒結 「才」是日語發音：台灣製造業日語殘留的有趣現象 高件壓製需注意密度梯度：H/D 比越大問題越嚴重 退磁測試開迴路最嚴苛，閉迴路最接近實際使用 本文整理自實務討論，適合有基礎電磁或材料背景的讀者參考。如有任何補充或指正，歡迎留言討論。\n","permalink":"https://0Zhen.github.io/posts/ferrite-magnet-notes/","summary":"\u003cblockquote\u003e\n\u003cp\u003e從事磁鐵相關產業，或對磁性材料有興趣的朋友，這篇筆記整理了鐵氧體磁鐵從製造到應用的核心知識，包含製程三大維度、軟硬磁差異、牌號命名規則，以及一些業界有趣的小知識。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"一什麼是鐵氧體ferrite\"\u003e一、什麼是鐵氧體（Ferrite）？\u003c/h2\u003e\n\u003cp\u003e鐵氧體是一種\u003cstrong\u003e陶瓷磁性材料\u003c/strong\u003e，主要成分為氧化鐵（Fe₂O₃）加上其他金屬氧化物（如錳、鋅、鎳、鋇、鍶等）。由於原料豐富、成本低廉，是目前全球使用量最大的磁性材料之一，廣泛應用於電感、變壓器、馬達、揚聲器等電子與電機產品。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"二製程三大維度\"\u003e二、製程三大維度\u003c/h2\u003e\n\u003cp\u003e選擇鐵氧體的製程，需要同時考量三個獨立的維度，它們可以自由組合，決定最終產品的性能與成本。\u003c/p\u003e\n\u003ch3 id=\"維度一混料方式--濕式-vs-乾式\"\u003e維度一：混料方式 — 濕式 vs 乾式\u003c/h3\u003e\n\u003cp\u003e這個維度決定原料粉末如何混合均勻。\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003e乾式（Dry Process）\u003c/th\u003e\n          \u003cth\u003e濕式（Wet Process）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作法\u003c/td\u003e\n          \u003ctd\u003e粉末直接混合造粒\u003c/td\u003e\n          \u003ctd\u003e加水研磨成漿料，再脫水\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e混合均勻度\u003c/td\u003e\n          \u003ctd\u003e一般\u003c/td\u003e\n          \u003ctd\u003e優良\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e成本\u003c/td\u003e\n          \u003ctd\u003e低\u003c/td\u003e\n          \u003ctd\u003e較高\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e最終性能\u003c/td\u003e\n          \u003ctd\u003e普通\u003c/td\u003e\n          \u003ctd\u003e較佳\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e補充：熱壓燒結（Hot Press Sintering）\u003c/strong\u003e 屬於乾式製程的一種特殊形式，全程不加水，同時施加壓力與高溫，一步完成成型與燒結，緻密度極高、晶粒細小，但通常單獨列為一種製程類別。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch3 id=\"維度二固化方式--燒結-vs-黏結\"\u003e維度二：固化方式 — 燒結 vs 黏結\u003c/h3\u003e\n\u003cp\u003e這個維度決定粉末最終如何固化成形。\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003e燒結（Sintered）\u003c/th\u003e\n          \u003cth\u003e黏結（Bonded）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作法\u003c/td\u003e\n          \u003ctd\u003e高溫（1100–1300°C）燒結\u003c/td\u003e\n          \u003ctd\u003e混入橡膠、塑膠或樹脂成型\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e密度\u003c/td\u003e\n          \u003ctd\u003e高，質地硬脆\u003c/td\u003e\n          \u003ctd\u003e較低，可具彈性\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e磁性能\u003c/td\u003e\n          \u003ctd\u003e強\u003c/td\u003e\n          \u003ctd\u003e較弱\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e形狀彈性\u003c/td\u003e\n          \u003ctd\u003e受限\u003c/td\u003e\n          \u003ctd\u003e高度自由，可彎曲裁切\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e耐溫性\u003c/td\u003e\n          \u003ctd\u003e優\u003c/td\u003e\n          \u003ctd\u003e受黏結劑限制\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e應用\u003c/td\u003e\n          \u003ctd\u003e馬達、揚聲器磁鐵\u003c/td\u003e\n          \u003ctd\u003e廣告磁條、冰箱磁鐵\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"維度三磁矩排列--等方性-vs-異方性\"\u003e維度三：磁矩排列 — 等方性 vs 異方性\u003c/h3\u003e\n\u003cp\u003e這個維度決定製造時磁粉的排列方式，影響最終磁性能的上限。\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003e等方性（Isotropic）\u003c/th\u003e\n          \u003cth\u003e異方性（Anisotropic）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e成型時加磁場？\u003c/td\u003e\n          \u003ctd\u003e否\u003c/td\u003e\n          \u003ctd\u003e是\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e磁矩排列\u003c/td\u003e\n          \u003ctd\u003e隨機\u003c/td\u003e\n          \u003ctd\u003e沿特定方向整齊排列\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e磁性能\u003c/td\u003e\n          \u003ctd\u003e較弱\u003c/td\u003e\n          \u003ctd\u003e較強（可達 2 倍以上）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e充磁方向\u003c/td\u003e\n          \u003ctd\u003e任意方向皆可，甚至多極充磁\u003c/td\u003e\n          \u003ctd\u003e只能沿排列方向充磁\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e成本\u003c/td\u003e\n          \u003ctd\u003e低\u003c/td\u003e\n          \u003ctd\u003e較高\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e常見誤解澄清：\u003c/strong\u003e 等方性和異方性磁鐵製造完成後，本身都\u003cstrong\u003e不帶磁性\u003c/strong\u003e，兩者都需要經過充磁才能使用。差別只在於充磁的方向限制。\u003c/p\u003e","title":"鐵氧體磁鐵完整筆記：製程、分類與性能一次搞懂"},{"content":" 每次 push 完還要手動登進伺服器重啟服務？這篇文章會告訴你怎麼讓機器幫你做完這一切，以及在 Windows 上這件事有多難搞。\n什麼是 GitLab Runner？ GitLab Runner 是一個開源的代理程式（agent），負責執行 GitLab CI/CD pipeline 裡定義的 job。\n整個流程長這樣：\n簡單說：你寫程式、push 上去，剩下的 Runner 全包。\n你在 .gitlab-ci.yml 裡寫什麼，Runner 就執行什麼。GitLab 本身只負責管理流程，Runner 才是真正動手做事的人。\nRunner 的三個層級 GitLab Runner 有三種作用範圍：\n類型 作用範圍 設定位置 Shared Runner 整個 GitLab 平台 管理員設定 Group Runner 某個 Group 下所有專案 Group Settings Project Runner 單一專案 Project Settings 公司 GitLab 通常會有 Shared 或 Group Runner，但它們的環境是公用的，不適合部署到特定機器。要部署到指定伺服器，就需要自己架 Project Runner。\nExecutor：Runner 用什麼環境執行？ Runner 本身只是個殼，實際執行環境由 Executor 決定：\nExecutor 說明 適合情境 shell 直接在 Runner 所在機器執行 部署到固定伺服器 docker 每個 job 起一個乾淨的 Docker container 建置、測試 kubernetes 跑在 K8s cluster 上 大規模 CI 環境 virtualbox 起 VM 執行 需要隔離的整合測試 本文使用 shell executor，因為目標是直接在 Windows 伺服器上部署。\n在 Windows 上安裝 GitLab Runner 1. 下載執行檔 從官方下載 Windows 版：\nhttps://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe 建立專屬資料夾並重新命名：\nC:\\GitLab-Runner\\gitlab-runner.exe 2. 在 GitLab 建立 Project Runner 進到 GitLab 專案 → Settings → CI/CD → Runners 點 New project runner 勾選 Run untagged jobs 點 Create runner，複製畫面上 glrt- 開頭的 token 3. 註冊 Runner 用系統管理員開啟 PowerShell，執行：\ncd C:\\GitLab-Runner .\\gitlab-runner.exe register 依序填入：\nGitLab URL（完整網址，含 https://） Registration token Runner 名稱（隨意） Executor：shell 4. 啟動 Runner 安裝成背景服務（推薦，機器重啟後自動恢復）：\n.\\gitlab-runner.exe install .\\gitlab-runner.exe start 臨時執行（測試用）：\n.\\gitlab-runner.exe run Windows 踩坑實錄 以下是在 Windows VM 上部署 FastAPI 服務時，實際踩過的七個坑。\n專案背景：\n後端：FastAPI（Python） 前端：靜態 HTML 部署環境：Windows VM 版本控制：公司內部 GitLab 目標：每次 git push 到 main branch 後，伺服器自動拉取最新程式碼並重啟服務。\n坑 #1：Runner 被公司 Group Runner 搶走 症狀\nPipeline 觸發後，跑的是公司的 Group Runner（Docker 環境），不是自己裝的 Runner，log 出現：\nPreparing the \u0026#34;docker\u0026#34; executor 原因\n公司 GitLab 的 Group Runner 是共用的，只要有任務就會搶先執行。\n解法\n幫自己的 Runner 加一個 tag，在 .gitlab-ci.yml 指定只用這個 tag 的 Runner：\nSettings → CI/CD → Runners → 編輯 Runner → 加上 tag，例如 windows-local\ndeploy: tags: - windows-local 教訓：只要有自訂 Runner，.gitlab-ci.yml 一定要加 tags，否則任何 Runner 都可能搶到任務。\n坑 #2：Shell executor 找不到 pwsh 症狀\nERROR: Job failed (system failure): prepare environment: failed to start process: exec: \u0026#34;pwsh\u0026#34;: executable file not found in %PATH% 原因\nGitLab Runner 在 Windows 上預設使用 pwsh（PowerShell Core），但電腦上沒有安裝。\n解法\n修改 C:\\GitLab-Runner\\config.toml，把：\nshell = \u0026#34;pwsh\u0026#34; 改成：\nshell = \u0026#34;powershell\u0026#34; 重新啟動 Runner：\n.\\gitlab-runner.exe stop .\\gitlab-runner.exe run 坑 #3：start cmd /c 在 PowerShell 裡語法錯誤 症狀\nStart-Process : PositionalParameterNotFound 原因\nstart cmd /c 是 cmd 的語法，在 PowerShell 裡無效。\n解法\n改用 PowerShell 原生的 Start-Process：\nStart-Process \u0026#34;python.exe\u0026#34; -ArgumentList \u0026#34;main.py\u0026#34; -WindowStyle Hidden 坑 #4：taskkill 找不到進程導致 Pipeline 失敗 症狀\nERROR: Job failed: exit status 128 第一次跑沒問題，第二次跑時因為 python 沒在運行，taskkill 找不到進程就報錯中斷。\n解法\n用 try/catch 包起來，找不到進程時繼續執行而不是報錯：\ntry { Stop-Process -Name python -Force -ErrorAction Stop } catch { Write-Host \u0026#34;No python process found, continuing...\u0026#34; } 坑 #5：編碼錯誤 UnicodeEncodeError: 'cp950' 症狀\nUnicodeEncodeError: \u0026#39;cp950\u0026#39; codec can\u0026#39;t encode character \u0026#39;\\U0001f513\u0026#39; 服務啟動失敗，因為程式碼裡有 emoji，但 Runner 環境預設使用 cp950（繁體中文編碼）。\n原因\n用 VSCode 跑時，IDE 自動設定 UTF-8 環境，所以沒問題。但 GitLab Runner 啟動的環境預設是系統編碼（Windows 繁體中文 = cp950）。\n解法\n在腳本裡設定環境變數：\n$env:PYTHONUTF8 = \u0026#34;1\u0026#34; 坑 #6：讀不到 .env 檔 症狀\nValueError: 此金鑰需要密碼，請設定環境變數 MOTOR_PASSWORD 原因\nmain.py 讀取 .env 時用的是相對路徑，必須在 backend 目錄下執行才找得到。\n解法\n用 -WorkingDirectory 指定工作目錄：\nStart-Process \u0026#34;python.exe\u0026#34; -ArgumentList \u0026#34;main.py\u0026#34; -WorkingDirectory \u0026#34;D:\\你的專案路徑\\backend\u0026#34; 注意：git pull 仍然要在專案根目錄執行，不是 backend。\n坑 #7：Pipeline 跑完後 python 也跟著死掉 症狀\nPipeline 顯示成功，但網頁打不開，log 也沒有任何內容。\n原因\nStart-Process 和 Start-Job 啟動的背景進程，都屬於 Runner 的 session。Pipeline 結束後，session 關閉，所有子進程跟著被終止。\n解法\n使用 Windows Task Scheduler 啟動，讓 python 進程完全獨立於 Runner session：\n$action = New-ScheduledTaskAction ` -Execute \u0026#34;python.exe\u0026#34; ` -Argument \u0026#34;main.py\u0026#34; ` -WorkingDirectory \u0026#34;D:\\你的專案路徑\\backend\u0026#34; $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(3) Register-ScheduledTask -TaskName \u0026#34;DeployFastAPI\u0026#34; -Action $action -Trigger $trigger -Force 這樣 Task Scheduler 啟動的進程屬於系統層級，Runner session 結束後也不受影響。\n最終可用的 .gitlab-ci.yml stages: - deploy deploy: stage: deploy only: - main tags: - windows-local script: - cd D:\\你的專案路徑 - git pull origin main - try { Stop-Process -Name python -Force -ErrorAction Stop } catch { Write-Host \u0026#34;No python process found, continuing...\u0026#34; } - Start-Sleep -Seconds 2 - $env:PYTHONUTF8 = \u0026#34;1\u0026#34; - $action = New-ScheduledTaskAction -Execute \u0026#34;D:\\你的專案路徑\\.venv\\Scripts\\python.exe\u0026#34; -Argument \u0026#34;main.py\u0026#34; -WorkingDirectory \u0026#34;D:\\你的專案路徑\\backend\u0026#34; - $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(3) - Register-ScheduledTask -TaskName \u0026#34;DeployFastAPI\u0026#34; -Action $action -Trigger $trigger -Force - Start-Sleep -Seconds 5 - Write-Host \u0026#34;Deploy completed successfully!\u0026#34; 為什麼 Windows 比 Linux 麻煩這麼多？ 問題 Linux Windows 重啟服務 systemctl restart myapp Task Scheduler 預設編碼 UTF-8 cp950（繁體中文） 背景進程管理 成熟穩定 Session 結束就被殺 Shell bash PowerShell（語法差異大） 大部分 GitLab CI/CD 的教學都是針對 Linux 寫的，所以在 Windows 上會踩到很多沒有文件記錄的邊緣情況。\n結語 GitLab Runner 的概念其實很簡單：一個代理，接收 GitLab 派來的任務，在本機執行腳本。難的不是架構，而是環境差異帶來的細節問題。\n在 Windows 上走過這七個坑之後，整套流程是穩定可用的。如果之後要移到 Linux，systemctl restart 一行就能取代 Task Scheduler 的那段邏輯，反而更乾淨。\n希望這篇紀錄能幫到同樣在 Windows 上踩坑的人。\n","permalink":"https://0Zhen.github.io/posts/gitlab-runner-windows/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e每次 push 完還要手動登進伺服器重啟服務？這篇文章會告訴你怎麼讓機器幫你做完這一切，以及在 Windows 上這件事有多難搞。\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"什麼是-gitlab-runner\"\u003e什麼是 GitLab Runner？\u003c/h2\u003e\n\u003cp\u003eGitLab Runner 是一個開源的代理程式（agent），負責執行 GitLab CI/CD pipeline 裡定義的 job。\u003c/p\u003e\n\u003cp\u003e整個流程長這樣：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"GitLab Runner 自動部署流程圖\" loading=\"lazy\" src=\"/posts/gitlab-runner-windows/gitlab-runner-flow.svg\"\u003e\u003c/p\u003e\n\u003cp\u003e簡單說：你寫程式、push 上去，剩下的 Runner 全包。\u003c/p\u003e\n\u003cp\u003e你在 \u003ccode\u003e.gitlab-ci.yml\u003c/code\u003e 裡寫什麼，Runner 就執行什麼。GitLab 本身只負責管理流程，Runner 才是真正動手做事的人。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"runner-的三個層級\"\u003eRunner 的三個層級\u003c/h2\u003e\n\u003cp\u003eGitLab Runner 有三種作用範圍：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e類型\u003c/th\u003e\n          \u003cth\u003e作用範圍\u003c/th\u003e\n          \u003cth\u003e設定位置\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eShared Runner\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e整個 GitLab 平台\u003c/td\u003e\n          \u003ctd\u003e管理員設定\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eGroup Runner\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e某個 Group 下所有專案\u003c/td\u003e\n          \u003ctd\u003eGroup Settings\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eProject Runner\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e單一專案\u003c/td\u003e\n          \u003ctd\u003eProject Settings\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e公司 GitLab 通常會有 Shared 或 Group Runner，但它們的環境是公用的，不適合部署到特定機器。要部署到指定伺服器，就需要自己架 Project Runner。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"executorrunner-用什麼環境執行\"\u003eExecutor：Runner 用什麼環境執行？\u003c/h2\u003e\n\u003cp\u003eRunner 本身只是個殼，實際執行環境由 \u003cstrong\u003eExecutor\u003c/strong\u003e 決定：\u003c/p\u003e","title":"GitLab Runner 完整指南：從原理到 Windows 踩坑實錄"},{"content":" http://www.rlhonor.com/tp/image/20140826/20140826154261576157.png\n這篇文章整理了塑膠射出成型（Injection Molding）在產品設計端與模具端最核心的知識點，適合產品設計師、機構工程師、模具工程師，以及想深入了解製造知識的人閱讀。\n一、流長比（L/t Ratio）：料流走得到嗎？ 流長比（L/t，Flow Length to Thickness Ratio）是衡量熔融塑膠能否順利充填模穴的關鍵指標：\nL：熔膠從澆口（Gate）流到最遠端的距離 t：該流道區域的肉厚（Wall Thickness） 每種材料都有其流長比上限，超過這個值，熔膠在到達末端前就已降溫固化，導致充填不足（Short Shot）。\n最常見的解決方案是多點進澆 — — 在多個位置開設澆口，縮短每股料流行走的距離。但代價是：多股料流匯合必然產生結合線（Weld Line），工程師需要判斷結合線位置是否影響外觀或結構強度。\n💡 設計原則：盡量讓結合線落在非外觀面、非受力區域。\n流長比 L/t 材料對照表\n各材料 L/t 範圍差異顯著：PS、PA 流動性最佳（可達 300+），PC 與 PVC 流動性較差（僅 90–160），設計時需特別注意澆口布置。加玻纖後 L/t 上限約再打 7–8 折。\n二、肉厚設計：均勻才是王道 肉厚設計是射出成型中最容易被忽略、卻影響最深遠的環節。肉厚急遽變化可能引發兩大問題：\n遲滯現象（Hesitation Effect）：料流從厚肉區進入薄肉區時，薄處流阻大，料流速度驟降甚至停滯，表面出現流痕或充填不均。\n真空泡（Void）與縮痕（Sink Mark）：厚肉區外皮先固化，內部塑膠持續收縮卻無法補料 — — 收縮在內部形成真空泡，在表面形成縮痕。\n結構筋（Rib）的肉厚規則 結構筋壁厚 ≤ 主肉厚 × 50% 這個原則能有效避免結構筋根部產生縮痕或 Void。Boss（螺絲柱）底部常用「火山口（Moat Cut）」設計 — — 在根部環狀挖槽，進一步減少縮水。\n三、材料選用：六大考量面向 選材不只是挑「強度夠」的料號，完整評估需涵蓋六個面向：\n四、物性表怎麼看？兩個容易誤解的數據 熱變形溫度（HDT）≠ 長期使用溫度 物性表上的 HDT（Heat Deflection Temperature） 是在特定負載（1.82 MPa）下，樣品彎曲達 0.25mm 時的溫度 — — 是短時間量測值，不代表可以長期在該溫度使用。長期使用溫度（RTI）通常遠低於 HDT。\nUL 746C → 耐候性評級 戶外或長期暴露於紫外線的產品，需查閱 UL 746C（抗 UV 紫外線、抗老化），直接影響材料長期外觀與機械性能穩定性。\n塑膠材料耐熱溫度（HDT）比較\n三個溫度等級清楚呈現：通用料（PP/PE/PS）HDT 75–100°C、工程料（ABS/PC/PA）100–220°C、特殊工程料（PEEK/PEI/LCP）超過 200°C — — 但成本也大幅躍升。\n五、高分子聚合物分類 高分子聚合物 ├── 橡膠（Rubber） ├── 矽膠（Silicone） └── 塑膠（Plastic） ├── 熱固性（Thermoset） → 固化後不可再加工，如 Epoxy、Phenolic └── 熱塑性（Thermoplastic） ├── 結晶性（Crystalline） └── 非結晶性（Amorphous） 結晶性 vs 非結晶性 💡 選材口訣：要透明選非結晶、要耐化學選結晶、兩者都要考慮 PC。\n六、材料價格 vs 耐熱溫度：選材全局觀 材料價格 vs 耐熱溫度氣泡圖\n這張圖呈現選材最核心的取捨 — — 耐溫越高、價格越貴：\n左下（通用料）：PP、PE、PS — 低價低耐溫，適合消費品大量生產 中區（工程料）：ABS、PC、PA、POM — 性價比高，覆蓋大多數工業應用 右上（特殊工程料）：PEEK（$90/kg）、PEI（$35/kg） — 航太、醫療等高規格場景 氣泡大小代表流動性（L/t 上限）：PA 和 PS 氣泡最大，充填最容易；PC 和 PSU 氣泡小，需要更高射壓或更多澆口。\n七、表面粗糙度規格對照 模具表面規格是設計端與模具廠溝通的共同語言，目前業界常用三套系統：\nSPI（美國塑膠工業協會） ⚠️ 常見誤解：SPI 是美國塑膠工業協會制定，不是 DME 發明的。DME 只是製作實物樣品板販售。\nVDI 3400（德國工程師協會） 由 Verein Deutscher Ingenieure 制定，專門針對放電加工（EDM）表面：\nCharmilles 號數 33號 Ra = 4.50 μm，屬粗加工等級，不是外觀規格，肉眼可見明顯麻點。\n八、對應模具廠：設計端需要懂的模具知識 模穴數 / 兩板模 vs 三板模 加熱澆道（Hot Runner）：無料頭、縮短週期，適合高產量；但模具成本高、換色困難。\n機台噸數 鎖模力（噸）= 投影面積（cm²）× 材料係數 PP ≈ 0.32 / ABS ≈ 0.40 / PC ≈ 0.55 ton/cm² 模具鋼材 冷卻水路 / 頂針 / 排氣 冷卻：佔週期 60–70%；進出水溫差控制在 3°C 以內；複雜件考慮隨形水路（Conformal Cooling） 傳統水路 vs 隨形水路對比\n頂針：均勻分布避免頂白；外觀面改用頂塊或氣頂 排氣：排氣槽深 0.02–0.05mm，設於分模線與末端充填處；不足會導致燒焦或結合線加劇 總結：射出成型設計的核心思維 流長比 → 決定澆口數量 → 影響結合線位置 肉厚均勻 → 決定縮痕/Void 風險 → 影響外觀品質 材料特性 → 決定收縮率 → 影響尺寸精度與翹曲 表面規格 → 決定後加工需求 → 影響模具成本 模具設計 → 決定週期與品質 → 影響量產成本 掌握這些知識，設計師才能在產品開發初期做出對製造友善（DFM）的決策，避免開模後才修改的高昂代價。\n","permalink":"https://0Zhen.github.io/posts/2026-04-10/","summary":"\u003cp\u003e\u003cimg alt=\"http://www.rlhonor.com/tp/image/20140826/20140826154261576157.png\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*KKg-v2fWAJW75OAE.png\"\u003e\n\u003cem\u003e\u003ca href=\"http://www.rlhonor.com/tp/image/20140826/20140826154261576157.png\"\u003ehttp://www.rlhonor.com/tp/image/20140826/20140826154261576157.png\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e這篇文章整理了塑膠射出成型（Injection Molding）在產品設計端與模具端最核心的知識點，適合產品設計師、機構工程師、模具工程師，以及想深入了解製造知識的人閱讀。\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"一流長比lt-ratio料流走得到嗎\"\u003e一、流長比（L/t Ratio）：料流走得到嗎？\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e流長比\u003c/strong\u003e（L/t，Flow Length to Thickness Ratio）是衡量熔融塑膠能否順利充填模穴的關鍵指標：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eL\u003c/strong\u003e：熔膠從澆口（Gate）流到最遠端的距離\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003et\u003c/strong\u003e：該流道區域的肉厚（Wall Thickness）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e每種材料都有其流長比上限，超過這個值，熔膠在到達末端前就已降溫固化，導致\u003cstrong\u003e充填不足（Short Shot）\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e最常見的解決方案是\u003cstrong\u003e多點進澆\u003c/strong\u003e — — 在多個位置開設澆口，縮短每股料流行走的距離。但代價是：\u003cstrong\u003e多股料流匯合必然產生結合線（Weld Line）\u003c/strong\u003e，工程師需要判斷結合線位置是否影響外觀或結構強度。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e💡 設計原則：盡量讓結合線落在非外觀面、非受力區域。\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg alt=\"流長比 L/t\\u00a0材料對照表\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*YtnNydiStpB4OUOay4FmLQ.png\"\u003e\n\u003cem\u003e流長比 L/t 材料對照表\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e各材料 L/t 範圍差異顯著：PS、PA 流動性最佳（可達 300+），PC 與 PVC 流動性較差（僅 90–160），設計時需特別注意澆口布置。加玻纖後 L/t 上限約再打 7–8 折。\u003c/p\u003e\n\u003ch2 id=\"二肉厚設計均勻才是王道\"\u003e二、肉厚設計：均勻才是王道\u003c/h2\u003e\n\u003cp\u003e肉厚設計是射出成型中最容易被忽略、卻影響最深遠的環節。\u003cstrong\u003e肉厚急遽變化\u003c/strong\u003e可能引發兩大問題：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e遲滯現象（Hesitation Effect）\u003c/strong\u003e：料流從厚肉區進入薄肉區時，薄處流阻大，料流速度驟降甚至停滯，表面出現流痕或充填不均。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e真空泡（Void）與縮痕（Sink Mark）\u003c/strong\u003e：厚肉區外皮先固化，內部塑膠持續收縮卻無法補料 — — 收縮在內部形成真空泡，在表面形成縮痕。\u003c/p\u003e\n\u003ch2 id=\"結構筋rib的肉厚規則\"\u003e結構筋（Rib）的肉厚規則\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e結構筋壁厚\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e≤\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e主肉厚\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e50\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e這個原則能有效避免結構筋根部產生縮痕或 Void。Boss（螺絲柱）底部常用「火山口（Moat Cut）」設計 — — 在根部環狀挖槽，進一步減少縮水。\u003c/p\u003e\n\u003ch2 id=\"三材料選用六大考量面向\"\u003e三、材料選用：六大考量面向\u003c/h2\u003e\n\u003cp\u003e選材不只是挑「強度夠」的料號，完整評估需涵蓋六個面向：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*KZ2KUmEBfrLJa0X4WZ1VZg.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"四物性表怎麼看兩個容易誤解的數據\"\u003e四、物性表怎麼看？兩個容易誤解的數據\u003c/h2\u003e\n\u003ch2 id=\"熱變形溫度hdt-長期使用溫度\"\u003e熱變形溫度（HDT）≠ 長期使用溫度\u003c/h2\u003e\n\u003cp\u003e物性表上的 \u003cstrong\u003eHDT（Heat Deflection Temperature）\u003c/strong\u003e 是在特定負載（1.82 MPa）下，樣品彎曲達 0.25mm 時的溫度 — — 是短時間量測值，\u003cstrong\u003e不代表可以長期在該溫度使用\u003c/strong\u003e。長期使用溫度（RTI）通常遠低於 HDT。\u003c/p\u003e","title":"射出成型設計全解說：從流長比到模具廠對應，工程師必看的完整筆記"},{"content":"A practical guide to harmonic distortion analysis using a free browser-based tool\nBack-EMF (Back Electromotive Force) is the voltage generated by a spinning motor. Analysing its harmonic content reveals critical information about motor quality, winding symmetry, and potential electromagnetic interference. Total Harmonic Distortion (THD) is the standard metric used to quantify this distortion.\nThis guide walks through the complete process — from capturing the waveform to obtaining a reliable THD value — using a free, browser-based FFT analyser that requires no software installation.\n🔗 Open Free FFT Analyser →\n1 Capture the Back-EMF Waveform A real motor back-EMF contains a fundamental plus harmonics. The FFT spectrum on the right reveals each harmonic component.\nEquipment needed Oscilloscope (any brand that exports CSV) Motor under test — spin at constant RPM Differential probe or voltage divider if voltage is high Measurement tips Spin the motor at a stable, constant speed — THD changes with RPM Capture at least 5–10 complete cycles for better frequency resolution Use a sampling rate at least 10× higher than the highest harmonic you want to measure Export as CSV from your oscilloscope software Tektronix CSV format: Column D = Time (seconds) Column E = Voltage (V) 2 Understand FFT Bins and Spectral Leakage Before running FFT, two key concepts determine the accuracy of your results.\nWhat is an FFT Bin? FFT divides the frequency range into fixed-width slots called bins. Think of them as buckets — each bucket collects energy from a specific frequency range. The bin width is determined by:\nBin width (Hz) = Sampling rate / Number of points Example: 250,000 Hz ÷ 16,384 pts ≈ 15.3 Hz per bin Each bar is one FFT bin. When the true frequency (yellow dashed line) falls between bins, energy spills into neighbouring bins — this is spectral leakage.\nThe problem: A motor’s fundamental frequency almost never aligns perfectly with an FFT bin. Energy between bins spreads into neighbours, creating false harmonics and inaccurate THD readings.\n3 Choose the Right Window Function A window function solves the leakage problem by multiplying each sample by a weight that tapers smoothly to zero at both ends. This eliminates the boundary discontinuity that causes leakage.\nAll window functions taper the signal edges. The key difference is the trade-off between frequency resolution and amplitude accuracy.\nLeft: Rectangular window shows heavy leakage — energy spreads across many bins. Right: Flat-top window keeps the peak amplitude accurate even when the frequency is between bins.\nFor back-EMF THD measurement, always use Flat-top window. It provides the best amplitude accuracy regardless of bin alignment — which is almost never perfect in real measurements.\n4 Run the FFT Analysis 🔗 Open Free FFT Analyser →\nOption A — Upload CSV Click the Upload CSV tab Drag and drop your oscilloscope CSV file Select Flat-top window function Click Analyse Option B — Paste data directly Click the Paste Data tab Copy two columns (time + voltage) from your spreadsheet Paste into the text area — sampling rate is auto-detected from the time column Select Flat-top and click Analyse 5 Interpret the Results Left: harmonic amplitudes on log scale — a healthy motor shows rapidly decreasing harmonics. Right: energy ratio pie chart with THD percentage.\nFundamental frequency (1x) The tool automatically identifies the largest peak as the fundamental. A 4-pole motor at 3000 RPM produces a fundamental around 100 Hz.\nHarmonic amplitudes (2x–10x) The bar chart uses a logarithmic scale so you can see all harmonics simultaneously. In a healthy motor, harmonics should decrease rapidly. Prominent odd harmonics (3x, 5x, 7x) often indicate winding asymmetry.\nTHD calculation THD = √(A₂² + A₃² + ... + A₁₀²) / A₁ × 100% Where A₁ = fundamental amplitude A₂–A₁₀ = harmonic amplitudes Typical THD ranges for motors 6 Export and Document Click Export CSV to download the full spectrum and harmonic summary. The file includes frequency and amplitude for every FFT bin, the complete harmonic table, and the THD value — ready to attach to your test report.\nCommon Pitfalls Using Rectangular window: Only accurate when signal frequency perfectly aligns with a bin — almost never the case in real measurements. Too few cycles: Less than 5 cycles reduces frequency resolution. More cycles = narrower bins = better harmonic separation. Comparing across RPM: THD is RPM-dependent. Always document motor speed alongside THD value. Large DC offset: The tool removes DC automatically, but a large offset can reduce measurement dynamic range. Summary Back-EMF THD analysis comes down to three decisions:\nCapture enough cycles — at least 5–10 for reliable frequency resolution Use Flat-top window — for accurate harmonic amplitude measurement Understand bin misalignment is normal — window functions handle it The free tool below automates all FFT computation so you can focus on interpreting the motor’s health from the harmonic spectrum.\n🔗 Try the Free FFT Analyser →\n","permalink":"https://0Zhen.github.io/posts/how-to-measure-motor-back-emf-thd-with-fft/","summary":"\u003cp\u003e\u003cem\u003eA practical guide to harmonic distortion analysis using a free browser-based tool\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eBack-EMF (Back Electromotive Force) is the voltage generated by a spinning motor. Analysing its harmonic content reveals critical information about motor quality, winding symmetry, and potential electromagnetic interference. \u003cstrong\u003eTotal Harmonic Distortion (THD)\u003c/strong\u003e is the standard metric used to quantify this distortion.\u003c/p\u003e\n\u003cp\u003eThis guide walks through the complete process — from capturing the waveform to obtaining a reliable THD value — using a free, browser-based FFT analyser that requires no software installation.\u003c/p\u003e","title":"How to Measure Motor Back-EMF THD with FFT"},{"content":" 窗函數・補零・Cooley-Tukey・THD ── 從示波器 CSV 到 Excel 的完整流程\n最後還有免費FFT 頻譜分析工具\n前言 每當你用示波器擷取波形並匯出成 CSV，你拿到的是一段訊號的時域快照。頻率內容──有哪些諧波、各自有多大、總諧波失真是多少──在你做**快速傅立葉轉換（FFT）**之前都是隱形的。\n本文完整走過 FFT 分析流程的每一個步驟，從原始 CSV 資料到帶有完整標註的 Excel 輸出。我們會解釋每個步驟為什麼必要、Cooley-Tukey 如何讓 FFT 快到可以即時分析，以及窗函數的關鍵作用──特別是 Flat-top 窗在精確量測諧波振幅上的不可取代性。\n步驟一 去直流（Remove DC Offset） 示波器訊號常常帶有一個固定的直流偏移。如果不去掉它，FFT 會在 0 Hz 產生一個巨大的尖峰，把其他頻率的成分全部淹沒。解決方法很簡單：把所有樣本的平均值算出來，然後每個樣本都減去它。\n去直流後的值[i] = 原始訊號[i] — 平均值\n圖 1 ── 左：含 DC 偏移的原始訊號（均值 = 0.60 V）。右：減去均值後，波形歸零於中心線。\n去直流後，訊號的均值精確等於 0，所有 FFT 能量都正確代表振盪成分，而不是靜態偏移。\n步驟二 補零（Zero-Padding） Cooley-Tukey FFT 只有在 N 是 2 的次方時才能達到最佳效率。示波器擷取的點數幾乎不可能剛好是 2ⁿ。補零的做法是在訊號尾端填入 0，直到總長度達到下一個 2 的次方。10,000 個樣本對應的下一個值是 16,384。\n圖 2 ── 左：100 個原始樣本。右：補入 28 個 0（橘色區域）達到 128 = ²⁷。補零讓 FFT 更快，也讓頻譜曲線更平滑，但不會提高真正的頻率解析度。\n**重要：**補零不能增加頻率解析度。真正的解析度永遠是 Δf = fs / N原始點數。補零只是讓頻譜「插值得更密」，看起來更平滑。\n步驟三 窗函數（Window Functions） 什麼是頻譜洩漏？ FFT 假設擷取的訊號會無限循環。如果訊號的末端無法平滑接回開頭***(這幾乎每次都發生)***邊界處的突然跳變會引入各種假頻率成分，擴散到整個頻譜。這就是頻譜洩漏（Spectral Leakage）。\n窗函數如何解決？ 窗函數是一條加權曲線，乘上每個樣本。它讓訊號兩端平滑地降到 0，頭尾自然接在一起，突變消失，洩漏大幅減少。\n圖 3 ── 四種常見窗函數的形狀。矩形窗不做任何加權（最容易洩漏）；Hann 和 Hamming 兩端平滑歸零；Flat-top 頂部極度平坦，以犧牲頻率解析度換取最高振幅精度。\n圖 4 ── 頻譜洩漏比較（訊號頻率為 5.7 Hz，不對齊任何 bin）。紅色虛線為真實頻率。矩形窗出現大量裙擺；Flat-top 的峰值即使不對齊 bin 仍最接近真實振幅。\n窗函數比較表 Flat-top 窗的數學公式 我們使用的是 5 項餘弦疊加版本：\nw(i) = 0.21558–0.41663cos(θ) + 0.27726cos(2θ) — 0.08358cos(3θ) + 0.00695cos(4θ)\n其中 θ = 2π·i / (N−1)。各項係數正負交替，讓函數在兩端略微低於 0，這正是頂部能如此平坦的原因。\n步驟四 Cooley-Tukey FFT 演算法 直接計算離散傅立葉轉換（DFT）需要 O(N²) 次運算。N = 16,384 時約需 2 億 6 千萬次乘法。Cooley-Tukey 演算法利用對稱性，把複雜度壓到 O(N log₂N)，約 22 萬次，速度提升約 1,000 倍。\n核心概念 演算法的關鍵洞察是：一個 N 點 DFT 可以分拆成兩個 N/2 點 DFT。反覆二分，直到變成 1 點 DFT（結果就是原值本身），再由下往上合併，過程稱為蝶形運算（Butterfly Operation）。\n圖 5 ── N=8 的蝶形運算示意圖。三個階段（log₂8 = 3）從 bit-reversal 排列的輸入產生完整頻譜。每個階段用複數旋轉因子（twiddle factor）合併相鄰配對。\n• 第一階段 ── Bit-reversal 排列：把輸入重新排序，使遞迴二分對應到簡單的索引交錯\n• 第二階段 ── 蝶形運算：log₂(N) 個回合，每回合用旋轉因子 e^(−j2πk/N) 合併相鄰配對\n最終結果與直接 DFT 完全相同，但快上千倍。\n步驟五 振幅補償（Amplitude Correction Factor, ACF） 加了窗函數之後，訊號整體能量被壓低了──大多數樣本的加權係數都小於 1。不補償的話，頻譜上的每個振幅都會比真實值小。振幅修正因子（ACF）補回這個誤差：\n振幅 = |FFT(i)| × (2 / N) × ACF\n公式三個部分各司其職：\n• |FFT(i)| ── FFT 複數輸出的絕對值（模）\n• 2 / N ── FFT 正規化係數，同時補回正負頻率各佔一半的因素\nACF ── 窗函數專屬補償係數：Flat-top = 4.638、Hann = 2.0、Hamming = 1.852 圖 6 ── 淡色柱 = ACF 補償前，深色柱 = 補償後，紅色虛線 = 真實振幅（1.0 V）。補償後三種窗函數都能恢復正確峰值，但 Flat-top 在頻率不對齊 bin 時誤差最小。\n步驟六 諧波提取與 THD 找基頻 計算完所有振幅後，掃描頻譜（排除 DC bin）找到最大的峰值，那就是基頻 f₁。我們的示波器資料結果是 228.9 Hz。\n提取各次諧波 諧波是基頻的整數倍：2f₁、3f₁、…、10f₁。對每一個目標頻率，找到最近的 FFT bin 索引，讀取其振幅：\nbin 索引 = round(諧波次數 × 基頻 / 頻率解析度)\n總諧波失真（THD） THD 衡量訊號中非基頻成分佔整體的比例，是電力品質的關鍵指標：\nTHD = sqrt(A²² + A³² + … + A1⁰²) / A1\n圖 7 ── 左：log 刻度的諧波振幅。基頻（藍色）228.9 Hz 主導訊號，所有諧波（紅色）至少低 40 dB。右：能量佔比圓餅圖，THD = 1.37%，代表訊號非常純淨。\nTHD 1.37% 遠低於 IEC 61000–3–2 Class A 奇次諧波限值 15%，確認訊號來源具有高度線性。\n完整流程總結 以下是用 web 實作的完整諧波分析流程：\n• 讀取任何 Tektronix 示波器 CSV（D 欄 = 時間、E 欄 = 電壓）\n• 選擇窗函數：Flat-top、Hann、Hamming 或矩形（無窗）\n• 程式自動去直流、加窗、補零至 2 的次方、執行 Cooley-Tukey FFT、振幅補償、提取 10 次諧波並計算 THD\n輸出 csv，包含Harmonic Summary, THD等等資訊 有興趣歡迎使用!\nFFT Spectrum Analyser\n","permalink":"https://0Zhen.github.io/posts/2026-03-23/","summary":"\u003chr\u003e\n\u003cp\u003e\u003cem\u003e窗函數・補零・Cooley-Tukey・THD ── 從示波器 CSV 到 Excel 的完整流程\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e最後還有免費FFT 頻譜分析工具\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e每當你用示波器擷取波形並匯出成 CSV，你拿到的是一段訊號的\u003cstrong\u003e時域快照\u003c/strong\u003e。頻率內容──有哪些諧波、各自有多大、總諧波失真是多少──在你做**快速傅立葉轉換（FFT）**之前都是隱形的。\u003c/p\u003e\n\u003cp\u003e本文完整走過 FFT 分析流程的每一個步驟，從原始 CSV 資料到帶有完整標註的 Excel 輸出。我們會解釋每個步驟為什麼必要、Cooley-Tukey 如何讓 FFT 快到可以即時分析，以及窗函數的關鍵作用──特別是 Flat-top 窗在精確量測諧波振幅上的不可取代性。\u003c/p\u003e\n\u003ch2 id=\"步驟一-去直流remove-dcoffset\"\u003e步驟一 去直流（Remove DC Offset）\u003c/h2\u003e\n\u003cp\u003e示波器訊號常常帶有一個固定的直流偏移。如果不去掉它，FFT 會在 0 Hz 產生一個巨大的尖峰，把其他頻率的成分全部淹沒。解決方法很簡單：把所有樣本的平均值算出來，然後每個樣本都減去它。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e去直流後的值[i] = 原始訊號[i] — 平均值\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg alt=\"圖 1 ── 左：含 DC 偏移的原始訊號（均值 = 0.60 V）。右：減去均值後，波形歸零於中心線。\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*ZQ66C5L_VOuQLmv68i9vgA.png\"\u003e\n\u003cem\u003e圖 1 ── 左：含 DC 偏移的原始訊號（均值 = 0.60 V）。右：減去均值後，波形歸零於中心線。\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e去直流後，訊號的均值精確等於 0，所有 FFT 能量都正確代表\u003cstrong\u003e振盪成分\u003c/strong\u003e，而不是靜態偏移。\u003c/p\u003e\n\u003ch2 id=\"步驟二-補零zero-padding\"\u003e步驟二 補零（Zero-Padding）\u003c/h2\u003e\n\u003cp\u003eCooley-Tukey FFT 只有在 N 是 2 的次方時才能達到最佳效率。示波器擷取的點數幾乎不可能剛好是 2ⁿ。補零的做法是在訊號尾端填入 0，直到總長度達到下一個 2 的次方。10,000 個樣本對應的下一個值是 \u003cstrong\u003e16,384\u003c/strong\u003e。\u003c/p\u003e","title":"FFT 頻譜分析完全解析"},{"content":" 從統計基礎到製程能力分析，一次搞懂品質工程師必備的數據分析工具\n前言 在製造業與品質管理領域，標準差（Standard Deviation）、常態分佈（Normal Distribution） 和 CPK（製程能力指數） 是三個最基本也最重要的概念。本文將以實務導向的方式，從統計基礎出發，逐步建立完整的品質分析能力。\n無論您是品質工程師、製程工程師，還是需要進行數據分析的技術人員，這篇文章都能幫助您建立紮實的基礎，並應用在實際工作中。\n目錄 標準差：衡量數據分散程度 常態分佈：理解數據的分布規律 CPK：評估製程能力 為什麼 CPK ≥ 1.33？ 一、標準差 (Standard Deviation, σ) 定義 標準差是用來衡量數據分散程度的指標：\n標準差越大 → 數據越分散 標準差越小 → 數據越集中 計算公式 σ = √[Σ(xi - μ)² / (n-1)] 符號說明：\nxi = 第 i 個數據點 μ = 數據平均值 n = 樣本數 Σ = 加總符號 計算步驟 讓我們用系統化的方式理解計算流程：\n1.計算平均值 μ\n將所有數據加總後除以樣本數 2.計算偏差\n每個數據與平均值的差：(xi - μ) 3.平方偏差\n將每個偏差平方：(xi - μ)² 為什麼要平方？ 消除正負號，讓所有偏差都是正值 4.加總平方偏差\nΣ(xi - μ)² 5.除以自由度\n除以 (n-1) 而非 n 為什麼是 n-1？ 這是統計學上的「自由度修正」，使樣本標準差更接近母體標準差 6.開根號\n得到最終的標準差值 實際例子 情境： 測量 5 個零件的長度（單位：mm）\n數據： 98, 100, 99, 101, 102\n步驟計算：\n1. 計算平均值\nμ = (98 + 100 + 99 + 101 + 102) / 5 μ = 500 / 5 = 100 mm 2. 計算每個數據的偏差平方\n(98–100)² = 4 (100–100)² = 0 (99–100)² = 1 (101–100)² = 1 (102–100)² = 4 3. 加總平方偏差\nΣ(xi - μ)² = 4 + 0 + 1 + 1 + 4 = 10 4. 除以自由度\n10 / (5-1) = 10 / 4 = 2.5 5. 開根號\nσ = √2.5 ≈ 1.58 mm 結論： 這批零件的標準差為 1.58 mm，表示數據圍繞平均值的分散程度適中。\n實務工具 Excel 函數： =STDEV.S(範圍) 統計軟體： Minitab, JMP, R Python： numpy.std(data, ddof=1) Excel 範例：\n假設數據在 A1:A5 輸入：=STDEV.S(A1:A5) 結果：1.58 二、常態分佈 (Normal Distribution) 什麼是常態分佈？ 常態分佈是自然界和製程中最常見的數據分布形式，也稱為「高斯分佈」或「鐘形曲線」。\nhttps://kenddg.tw/wp-content/uploads/2025/04/20250422-07-1024x576.jpg\n核心特性 1.對稱的鐘形曲線\n以平均值為中心左右對稱 2.三值合一\n平均值 = 中位數 = 眾數 3.由兩個參數決定\nμ（平均值）：決定曲線中心位置 σ（標準差）：決定曲線寬窄 4.尾部無限延伸\n理論上數據範圍是 -∞ 到 +∞ Sigma 涵蓋範圍：核心記憶表 這是品質管理中最重要的表格，務必熟記！\n註：ppm = parts per million（百萬分之一）\n±3σ 法則：品質管理的黃金準則 核心概念： 在常態分佈下，99.73% 的數據會落在平均值的上下 3 個標準差範圍內。\n實務意義：\n只有 0.27% 的數據會超出 ±3σ 範圍 這相當於每 370 件產品約有 1 件不良 這是品質管理中最常用的基準線 不同 Sigma 水準的實務意義 讓我們用更直觀的方式理解：\n±1σ： 約 68% 合格率\n相當於每 3 件就有 1 件不良 這是不可接受的品質水準 ±2σ： 約 95% 合格率\n相當於每 20 件約 1 件不良 一般消費品的最低門檻 ±3σ： 約 99.73% 合格率\n相當於每 370 件約 1 件不良 傳統品質管理的標準 ±4σ： 約 99.99% 合格率\n相當於每 16,000 件約 1 件不良 一般製造業的目標（對應 CPK = 1.33） ±6σ： 約 99.9999998% 合格率\n相當於每 500 萬件約 1 件不良 Six Sigma 品質水準，近乎零缺陷 三、CPK (Process Capability Index) 製程能力指數 定義 CPK 是用來評估製程是否能穩定地生產符合規格的產品的關鍵指標。\n白話解釋： CPK 告訴我們「製程的實際表現」與「客戶規格要求」之間的關係。\n計算公式 主公式：\nCPK = min(CPU, CPL) 細部公式：\nCPU (上限能力指數) = (USL - μ) / (3σ) CPL (下限能力指數) = (μ - LSL) / (3σ) 符號說明：\nUSL = Upper Specification Limit（規格上限） LSL = Lower Specification Limit（規格下限） μ = 製程平均值 σ = 製程標準差 min() = 取最小值 為什麼取最小值？ 因為最弱的一邊決定了製程的整體能力。\n計算步驟 步驟 1：收集數據\n建議至少 30 個樣本 確保數據來自穩定製程 步驟 2：計算統計值\n計算平均值 μ 計算標準差 σ 步驟 3：確認規格\n明確 USL（規格上限） 明確 LSL（規格下限） 步驟 4：計算 CPU\nCPU = (USL - μ) / (3σ) 步驟 5：計算 CPL\nCPL = (μ - LSL) / (3σ) 步驟 6：取最小值\nCPK = min(CPU, CPL) 實際案例計算 情境描述：\n產品規格：100 ± 10 mm 規格上限 USL = 110 mm 規格下限 LSL = 90 mm 實測平均值 μ = 98 mm 標準差 σ = 2 mm 計算過程：\n1. 計算 CPU（上限能力）\nCPU = (USL - μ) / (3σ) CPU = (110 - 98) / (3 × 2) CPU = 12 / 6 CPU = 2.0 2. 計算 CPL（下限能力）\nCPL = (μ - LSL) / (3σ) CPL = (98 - 90) / (3 × 2) CPL = 8 / 6 CPL = 1.33 3. 取最小值得到 CPK\nCPK = min(2.0, 1.33) CPK = 1.33 結果分析：\nCPK = 1.33：剛好在合格邊緣 問題診斷： CPL \u0026lt; CPU，表示平均值偏離目標 改善方向： 將平均值從 98 mm 調整至 100 mm（目標中心值） 改善後的效果預估：\n假設調整後 μ = 100 mm，σ 維持 2 mm：\nCPU = (110 - 100) / 6 = 1.67 CPL = (100 - 90) / 6 = 1.67 CPK = min(1.67, 1.67) = 1.67 ✓（改善至「良好」等級） CPK 判讀標準 這是實務上最常用的判讀準則：\nCPK 與 Sigma 水準對照表 關鍵洞察：\nCPK = 1.33 → 製程能力達到 ±4σ CPK = 2.00 → 製程能力達到 ±6σ（Six Sigma） 四、為什麼 CPK ≥ 1.33？ 統計意義 CPK = 1.33 的數學意義：\nCPK = 1.33 (USL - μ) / (3σ) = 1.33 (USL - μ) = 1.33 × 3σ = 4σ 解讀： 製程平均值到規格界限的距離是 4 個標準差。\n在常態分佈下的含義：\n±4σ 涵蓋 99.9937% 的數據 ","permalink":"https://0Zhen.github.io/posts/2026-03-13/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e從統計基礎到製程能力分析，一次搞懂品質工程師必備的數據分析工具\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在製造業與品質管理領域，\u003cstrong\u003e標準差（Standard Deviation）\u003c/strong\u003e、\u003cstrong\u003e常態分佈（Normal Distribution）\u003c/strong\u003e 和 \u003cstrong\u003eCPK（製程能力指數）\u003c/strong\u003e 是三個最基本也最重要的概念。本文將以實務導向的方式，從統計基礎出發，逐步建立完整的品質分析能力。\u003c/p\u003e\n\u003cp\u003e無論您是品質工程師、製程工程師，還是需要進行數據分析的技術人員，這篇文章都能幫助您建立紮實的基礎，並應用在實際工作中。\u003c/p\u003e\n\u003ch2 id=\"目錄\"\u003e目錄\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e標準差：衡量數據分散程度\u003c/li\u003e\n\u003cli\u003e常態分佈：理解數據的分布規律\u003c/li\u003e\n\u003cli\u003eCPK：評估製程能力\u003c/li\u003e\n\u003cli\u003e為什麼 CPK ≥ 1.33？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"一標準差-standard-deviation-σ\"\u003e一、標準差 (Standard Deviation, σ)\u003c/h2\u003e\n\u003ch2 id=\"定義\"\u003e定義\u003c/h2\u003e\n\u003cp\u003e標準差是用來\u003cstrong\u003e衡量數據分散程度\u003c/strong\u003e的指標：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e標準差\u003cstrong\u003e越大\u003c/strong\u003e → 數據\u003cstrong\u003e越分散\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e標準差\u003cstrong\u003e越小\u003c/strong\u003e → 數據\u003cstrong\u003e越集中\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"計算公式\"\u003e計算公式\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eσ\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e√\u003c/span\u003e[\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eΣ\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003exi\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eμ\u003c/span\u003e)\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e²\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e (\u003cspan style=\"color:#a6e22e\"\u003en\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e符號說明：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003exi\u003c/code\u003e = 第 i 個數據點\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eμ\u003c/code\u003e = 數據平均值\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003en\u003c/code\u003e = 樣本數\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eΣ\u003c/code\u003e = 加總符號\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"計算步驟\"\u003e計算步驟\u003c/h2\u003e\n\u003cp\u003e讓我們用系統化的方式理解計算流程：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.計算平均值 μ\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e將所有數據加總後除以樣本數\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e2.計算偏差\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e每個數據與平均值的差：\u003ccode\u003e(xi - μ)\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e3.平方偏差\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e將每個偏差平方：\u003ccode\u003e(xi - μ)²\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e為什麼要平方？\u003c/strong\u003e 消除正負號，讓所有偏差都是正值\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e4.\u003cstrong\u003e加總平方偏差\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eΣ(xi - μ)²\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e5.除以自由度\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e除以 \u003ccode\u003e(n-1)\u003c/code\u003e 而非 \u003ccode\u003en\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e為什麼是 n-1？\u003c/strong\u003e 這是統計學上的「自由度修正」，使樣本標準差更接近母體標準差\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e6.開根號\u003c/strong\u003e\u003c/p\u003e","title":"品質管理核心指標完全指南：標準差、常態分佈與 CPK 實務應用"},{"content":" https://micro.rohm.com/tw/deviceplus/wp-content/uploads/2023/11/what-is-raspberrypi_01_2.jpg\n這是「跟我一起玩樹莓派」系列的第一篇。這個系列會帶你從完全不懂 Linux，一步一步打造自己的家用伺服器。\n為什麼要學 Linux？ 買了樹莓派，開機之後面對黑黑的終端機畫面，不知道要打什麼 — — 這是很多人的第一個障礙。\n但其實 Linux 的基本指令不多，學會二三十個就能應付日常操作。這篇文章會帶你從頭學起，每個指令都搭配實際的例子，讓你在樹莓派上邊做邊學。\n你需要準備什麼 Raspberry Pi（任何型號都可以） MicroSD 卡（建議 32GB 以上） 電源線 一台電腦 樹梅派我是從大陸的微雪電子購入，價格很優惠而且有很多相關套件可以買。\n先去官網下載 Raspberry Pi Imager，把 Raspberry Pi OS 燒錄到 SD 卡。燒錄時記得在設定裡：\n開啟 SSH 設定 Wi-Fi 帳號密碼 設定使用者名稱和密碼 這樣開機後就可以直接從電腦連線，不需要接螢幕。\n第一次開機 把 SD 卡插進樹莓派，接上電源，等待約 1 分鐘讓系統啟動。\n到路由器管理頁面，或用以下指令找到樹莓派的 IP：\n# Windows 在命令提示字元輸入 ping raspberrypi.local # 或是去路由器查看連線設備清單 找到 IP 之後，接下來就可以 SSH 連線了（下一篇會詳細介紹），但這篇我們先專注在 Linux 指令本身。\n檔案與目錄操作 Linux 的一切都是檔案，學會操作檔案就學會了一半的 Linux。\n看你在哪裡 pwd pwd 是 \u0026ldquo;Print Working Directory\u0026rdquo; 的縮寫，告訴你現在在哪個資料夾。\n/home/pi 看這裡有什麼 ls 列出當前目錄的所有檔案和資料夾。\nls -la 加上 -la 可以看到隱藏檔案（以 . 開頭的檔案）和詳細資訊，包括權限、大小、修改時間。\n移動位置 cd Documents # 進入 Documents 資料夾 cd .. # 回到上一層 cd ~ # 回到家目錄（/home/pi） cd / # 去到根目錄 建立資料夾 mkdir 我的資料夾 mkdir -p a/b/c # 一次建立多層資料夾 建立檔案 touch hello.txt # 建立一個空白檔案 複製、移動、刪除 cp 原檔案 目標位置 # 複製檔案 cp -r 原資料夾 目標位置 # 複製整個資料夾 mv 原檔案 新名稱 # 移動或重新命名 rm 檔案名稱 # 刪除檔案 rm -r 資料夾名稱 # 刪除整個資料夾（小心使用！） ⚠️ Linux 沒有資源回收桶，刪掉就是真的刪掉了。\n查看與編輯檔案 看檔案內容 cat 檔案名稱 # 顯示整個檔案內容 less 檔案名稱 # 可以上下捲動（按 q 離開） head -n 10 檔案名稱 # 看前 10 行 tail -n 10 檔案名稱 # 看後 10 行 tail -f 記錄檔 # 即時追蹤檔案更新（看 log 很好用） 編輯檔案 nano 檔案名稱 nano 是最簡單的文字編輯器：\nCtrl + O 儲存 Ctrl + X 離開 Ctrl + W 搜尋 系統資訊 硬碟空間 df -h 看每個磁碟的使用狀況，-h 讓數字以人類易讀的格式顯示（GB、MB）。\n記憶體使用 free -h 目前跑了什麼程序 top 即時顯示系統資源使用狀況，按 q 離開。\nps aux 列出所有正在執行的程序。\n停掉某個程序 kill 程序ID 先用 ps aux | grep 程式名稱 找到程序 ID，再用 kill 停掉它。\n套件管理 樹莓派用 apt 來安裝、更新、移除軟體。\nsudo apt update # 更新套件清單 sudo apt upgrade -y # 更新所有已安裝的套件 sudo apt install 套件名稱 # 安裝套件 sudo apt remove 套件名稱 # 移除套件 權限與 sudo Linux 有嚴格的權限控制，有些指令需要管理員權限才能執行。\nsudo 指令 sudo 讓你以管理員（root）身份執行指令，系統會要求你輸入密碼確認。\n了解檔案權限 ls -la 看到類似這樣的輸出：\n-rw-r--r-- 1 pi pi 1234 Jan 1 12:00 hello.txt drwxr-xr-x 2 pi pi 4096 Jan 1 12:00 Documents 前面的 rwxr-xr-x 是權限：\nr = 讀取 w = 寫入 x = 執行 分成三組：擁有者、群組、其他人 chmod 755 檔案名稱 # 改變權限 chown pi:pi 檔案名稱 # 改變擁有者 網路相關 ping google.com # 測試網路連線 curl https://example.com # 發送 HTTP 請求 hostname -I # 查看自己的 IP 位址 實用小技巧 Tab 自動補全 打指令或路徑時按 Tab，系統會自動補全，是省時間的好習慣。\n上下鍵查看歷史指令 按 ↑ 可以叫出上一個指令，不用重複輸入。\nCtrl + C 緊急停止 程式跑到一半想停掉，按 Ctrl + C 強制中斷。\n管道（Pipe） 指令1 | 指令2 把第一個指令的輸出，當作第二個指令的輸入。\n# 例如：列出所有程序，只顯示包含 docker 的行 ps aux | grep docker 重新導向 指令 \u0026gt; 檔案名稱 # 把輸出存到檔案 指令 \u0026gt;\u0026gt; 檔案名稱 # 把輸出附加到檔案末尾 練習題 學指令最好的方式就是動手做，試試看在樹莓派上完成這些任務：\n在家目錄建立一個叫 practice 的資料夾 進入這個資料夾，建立三個檔案：a.txt、b.txt、c.txt 用 nano 在 a.txt 裡寫一段文字 把 a.txt 複製成 a_backup.txt 刪除 b.txt 用 ls -la 確認資料夾裡的狀況 查看目前硬碟空間 小結 這篇學到的指令：\n","permalink":"https://0Zhen.github.io/posts/1-linux/","summary":"\u003cp\u003e\u003cimg alt=\"https://micro.rohm.com/tw/deviceplus/wp-content/uploads/2023/11/what-is-raspberrypi_01_2.jpg\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*wcaW8a5WYiSBKVaD.jpg\"\u003e\n\u003cem\u003e\u003ca href=\"https://micro.rohm.com/tw/deviceplus/wp-content/uploads/2023/11/what-is-raspberrypi_01_2.jpg\"\u003ehttps://micro.rohm.com/tw/deviceplus/wp-content/uploads/2023/11/what-is-raspberrypi_01_2.jpg\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e這是「跟我一起玩樹莓派」系列的第一篇。這個系列會帶你從完全不懂 Linux，一步一步打造自己的家用伺服器。\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"為什麼要學-linux\"\u003e為什麼要學 Linux？\u003c/h2\u003e\n\u003cp\u003e買了樹莓派，開機之後面對黑黑的終端機畫面，不知道要打什麼 — — 這是很多人的第一個障礙。\u003c/p\u003e\n\u003cp\u003e但其實 Linux 的基本指令不多，學會二三十個就能應付日常操作。這篇文章會帶你從頭學起，每個指令都搭配實際的例子，讓你在樹莓派上邊做邊學。\u003c/p\u003e\n\u003ch2 id=\"你需要準備什麼\"\u003e你需要準備什麼\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRaspberry Pi（任何型號都可以）\u003c/li\u003e\n\u003cli\u003eMicroSD 卡（建議 32GB 以上）\u003c/li\u003e\n\u003cli\u003e電源線\u003c/li\u003e\n\u003cli\u003e一台電腦\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e樹梅派我是從大陸的\u003ca href=\"https://www.waveshare.net/\"\u003e微雪電子\u003c/a\u003e購入，價格很優惠而且有很多相關套件可以買。\u003c/p\u003e\n\u003cp\u003e先去官網下載 \u003cstrong\u003eRaspberry Pi Imager\u003c/strong\u003e，把 Raspberry Pi OS 燒錄到 SD 卡。燒錄時記得在設定裡：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e開啟 \u003cstrong\u003eSSH\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e設定 \u003cstrong\u003eWi-Fi\u003c/strong\u003e 帳號密碼\u003c/li\u003e\n\u003cli\u003e設定使用者名稱和密碼\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e這樣開機後就可以直接從電腦連線，不需要接螢幕。\u003c/p\u003e\n\u003ch2 id=\"第一次開機\"\u003e第一次開機\u003c/h2\u003e\n\u003cp\u003e把 SD 卡插進樹莓派，接上電源，等待約 1 分鐘讓系統啟動。\u003c/p\u003e\n\u003cp\u003e到路由器管理頁面，或用以下指令找到樹莓派的 IP：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Windows 在命令提示字元輸入\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eping raspberrypi.local\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 或是去路由器查看連線設備清單\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e找到 IP 之後，接下來就可以 SSH 連線了（下一篇會詳細介紹），但這篇我們先專注在 Linux 指令本身。\u003c/p\u003e\n\u003ch2 id=\"檔案與目錄操作\"\u003e檔案與目錄操作\u003c/h2\u003e\n\u003cp\u003eLinux 的一切都是檔案，學會操作檔案就學會了一半的 Linux。\u003c/p\u003e\n\u003ch2 id=\"看你在哪裡\"\u003e看你在哪裡\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epwd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003epwd\u003c/code\u003e 是 \u0026ldquo;Print Working Directory\u0026rdquo; 的縮寫，告訴你現在在哪個資料夾。\u003c/p\u003e","title":"跟我一起玩樹莓派 #1：從零開始學 Linux 基本指令"},{"content":"從你按下 Enter 的那一刻起，資料包經歷了什麼？HTTP、DNS、IP、NAT、Port……這些詞彙每天出現在工程師的世界，卻對大多數人像咒語一樣陌生。\nhttps://www.freepik.com/free-vector/flat-internet-day-illustration_13184285.htm#fromView=search\u0026amp;page=1\u0026amp;position=7\u0026amp;uuid=a74753ec-8930-4529-bcc0-0d9ce684ef17\u0026amp;query=internet\n你每天都在用網路，但你知道當你在瀏覽器輸入 google.com 按下 Enter，接下來發生了什麼事嗎？這篇文章用你能理解的語言，把網路底層的運作方式講清楚。\n📍 IP 位址 — 網路世界的門牌號碼 在現實世界，每棟房子都有地址，快遞才能找到你。在網路世界，每一台連網的設備都需要一個 IP 位址（IP Address），它就是設備在網路上的「門牌號碼」。\n目前最常見的格式叫 IPv4，長這樣：192.168.1.100，由四組 0–255 的數字組成，用點隔開，總共 32 個 bit，理論上能表示約 43 億個地址。聽起來很多，但全球設備數早就超過了這個數字，所以現在也在推廣 128 bit 的 IPv6，地址數量幾乎是無限的。\n公網 IP 是你家的完整郵寄地址，全台灣只有你這一個；內網 IP 是社區公寓裡的房號，只在社區內部有意義，外面的人根本不知道。\n🗺️ 網段與子網路遮罩 — 劃分地盤 IP 位址不是一個個孤立存在的，它們被分成一組一組的「網段（Network Segment）」來管理。就像一個城市被劃分成不同的行政區，同一個網段的設備可以直接溝通，不同網段之間就要透過路由器才能往來。\n判斷哪些 IP 屬於同一個網段，靠的是「子網路遮罩（Subnet Mask）」，常見格式例如 255.255.255.0，或者寫成更簡潔的 CIDR 表示法：/24。\n遮罩中「255」的部分表示「這段 bit 屬於網路識別」，「0」的部分表示「這段 bit 是主機編號」。遮罩越大（如 /16），網段包含的 IP 就越多；遮罩越小（如 /30），網段裡能用的 IP 就越少。\n🚪 Gateway（閘道） — 離開的出口 當你的設備要傳資料到不同網段（或者上網）時，它不能直接衝出去，它要先把封包交給「預設閘道（Default Gateway）」。閘道通常就是你家路由器的內網 IP，例如 192.168.1.1。\n你住在一棟公寓裡。要去隔壁棟，你得先走到社區的大門口（閘道），讓警衛（路由器）幫你指路。沒有閘道，你就出不去。\n🔀 路由器 — 網路世界的交通指揮 路由器（Router）的工作就是幫封包找到最佳路徑，把資料從一個網段「路由」到另一個網段。你家的路由器身兼兩職：對內是所有設備的閘道，對外是你與 ISP（網路服務商）之間的橋樑。\n路由器內部有一張「路由表（Routing Table）」，記錄著「要到哪個網段，就往哪個介面送」的規則。網際網路上的骨幹路由器每天都在交換彼此的路由資訊（透過 BGP 協定），讓封包能夠在全球數萬個網路之間正確流動。\n🔁 NAT — 讓多台設備共用一個公網 IP 前面說到公網 IPv4 位址只有 43 億個，早就不夠用了。解決方法之一就是 NAT（Network Address Translation，網路位址轉換）。\n你家裡有手機、電腦、平板，但 ISP 只給你一個公網 IP。路由器用 NAT 把所有設備的內網 IP，統一翻譯成那一個公網 IP 對外發送；收到回應時，再根據記錄把封包分發給對應的內部設備。\n這也是為什麼你家的設備從外面無法被直接連線 — — NAT 擋在前面，外部請求不知道要找哪台設備。這其實也帶來了一定的安全性（雖然它不是防火牆）。\n🚢 Port（埠） — 同一個 IP 上的多個服務入口 一台伺服器的 IP 位址只有一個，但它可能同時跑著網站、郵件、SSH 等多種服務。那怎麼區分？靠的是 Port（埠） — — 一個 0 到 65535 的數字，附加在 IP 後面，指定要找哪一個服務。\nIP 是一棟大樓的地址，Port 是大樓裡各個部門的分機號碼。「台北市中山路 1 號，分機 80」 — — 你就找到網頁服務了。\n📖 DNS — 網路世界的電話簿 電腦只認識 IP 位址，但人類記不住 142.250.185.78，所以我們發明了好記的名字，叫做「網域名稱（Domain Name）」，例如 google.com。而 DNS（Domain Name System）就是負責把名字翻譯成 IP 位址的系統。\n整個查詢過程是分層的：從「根 DNS 伺服器」問 .com 在哪，再從 .com 的 DNS 問 google.com 在哪，最後拿到 IP。這個過程叫做「遞迴查詢」，通常在幾毫秒內完成，而且結果會被快取，所以你感覺不到延遲。\n🏷️ 網域（Domain） — 你在網路上的名字 網域名稱有層次結構，從右到左讀：blog.example.com 裡，.com 是「頂級域（TLD）」，example 是「二級域」，blog 是「子域（Subdomain）」。\n常見的頂級域有 .com（商業）、.org（組織）、.tw（台灣）、.edu（教育）等。你向「域名註冊商」付費購買的是二級域的使用權，之後你可以自己設定任意的子域。\n📡 HTTP 與 HTTPS — 資料怎麼傳 有了 IP、有了 DNS 找到伺服器地址，接下來要說「用什麼語言溝通」。HTTP（HyperText Transfer Protocol）就是瀏覽器和伺服器之間的共同語言，定義了如何請求資源、如何回應。\nHTTPS 就是 HTTP + TLS 加密。所有傳輸的內容都被加密，即使有人在中間攔截封包，也看不到你在看什麼、傳了什麼。現代瀏覽器對沒有 HTTPS 的網站會顯示「不安全」警告。\nHTTP 的請求方法中，GET 是讀取資料，POST 是送出資料，PUT/PATCH 是更新，DELETE 是刪除——這套規則也是現代 REST API 的基礎。\n📶 ISP — 幫你接上網際網路的那條線 ISP（Internet Service Provider，網際網路服務提供商）是讓你能上網的電信或網路公司，在台灣例如中華電信、台灣大哥大、遠傳、亞太電信等。\n你家的寬頻合約就是和 ISP 簽的。ISP 把自己的網路骨幹連接到全球的網際網路交換節點（IX），你的每一個網路請求都要先經過 ISP 的基礎設施才能到達外面的世界。ISP 也是分配你公網 IP 的那個角色。\n不同 ISP 的網路品質、速度、以及連往國際的線路品質都不同，這也是為什麼在台灣用某些 ISP 連美國伺服器特別快，用另一家卻很慢。\n🔗 把所有概念串起來：你按下 Enter 的那一刻 現在我們可以完整地描述「在瀏覽器輸入 https://google.com 按 Enter」這件事背後發生的一切：\n第一步，DNS 查詢。 瀏覽器先查本機快取，沒有的話就問路由器（閘道），路由器問 ISP 的 DNS 伺服器，遞迴查詢後拿到 Google 的 IP，例如 142.250.185.78。\n第二步，建立連線。 瀏覽器用你的內網 IP（如 192.168.1.100）加上一個臨時 Port，對 Google IP 的 Port 443（HTTPS）發起 TCP 連線。封包到達路由器，NAT 把你的內網位址替換成公網 IP。\n第三步，加密握手。 TLS 協定在瀏覽器和 Google 之間建立加密通道，雙方交換憑證和加密金鑰，確保接下來的通訊沒有人能竊聽。\n第四步，HTTP 請求與回應。 加密通道建立後，瀏覽器發送 HTTP GET 請求，Google 伺服器回應 200 OK 並傳回 HTML 內容，瀏覽器開始渲染頁面。\n第五步，封包回程。 Google 的回應封包帶著你的公網 IP，經過 ISP 路由回到你家路由器，NAT 查表找到是你的電腦發的請求，把封包送進來，頁面出現在你眼前。\n以上這一切，通常在 200 毫秒以內完成。\n📋 概念速查表 ","permalink":"https://0Zhen.github.io/posts/2026-02-24/","summary":"\u003cp\u003e從你按下 Enter 的那一刻起，資料包經歷了什麼？HTTP、DNS、IP、NAT、Port……這些詞彙每天出現在工程師的世界，卻對大多數人像咒語一樣陌生。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"https://www.freepik.com/free-vector/flat-internet-day-illustration_13184285.htm#fromView=search\u0026amp;page=1\u0026amp;position=7\u0026amp;uuid=a74753ec-8930-4529-bcc0-0d9ce684ef17\u0026amp;query=internet\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*oE8jTY4Q73u-0CQEqCrhfw.png\"\u003e\n\u003cem\u003e\u003ca href=\"https://www.freepik.com/free-vector/flat-internet-day-illustration_13184285.htm#fromView=search\u0026amp;page=1\u0026amp;position=7\u0026amp;uuid=a74753ec-8930-4529-bcc0-0d9ce684ef17\u0026amp;query=internet\"\u003ehttps://www.freepik.com/free-vector/flat-internet-day-illustration_13184285.htm#fromView=search\u0026amp;page=1\u0026amp;position=7\u0026amp;uuid=a74753ec-8930-4529-bcc0-0d9ce684ef17\u0026amp;query=internet\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e你每天都在用網路，但你知道當你在瀏覽器輸入 \u003ccode\u003egoogle.com\u003c/code\u003e 按下 Enter，接下來發生了什麼事嗎？這篇文章用你能理解的語言，把網路底層的運作方式講清楚。\u003c/p\u003e\n\u003ch2 id=\"-ip-位址網路世界的門牌號碼\"\u003e📍 IP 位址 — 網路世界的門牌號碼\u003c/h2\u003e\n\u003cp\u003e在現實世界，每棟房子都有地址，快遞才能找到你。在網路世界，每一台連網的設備都需要一個 IP 位址（IP Address），它就是設備在網路上的「門牌號碼」。\u003c/p\u003e\n\u003cp\u003e目前最常見的格式叫 IPv4，長這樣：\u003ccode\u003e192.168.1.100\u003c/code\u003e，由四組 0–255 的數字組成，用點隔開，總共 32 個 bit，理論上能表示約 43 億個地址。聽起來很多，但全球設備數早就超過了這個數字，所以現在也在推廣 128 bit 的 IPv6，地址數量幾乎是無限的。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"公網 IP 是你家的完整郵寄地址，全台灣只有你這一個；內網 IP 是社區公寓裡的房號，只在社區內部有意義，外面的人根本不知道。\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*zR1KXF2OVCbPSkBfsoIjvg.png\"\u003e\n\u003cem\u003e公網 IP 是你家的完整郵寄地址，全台灣只有你這一個；內網 IP 是社區公寓裡的房號，只在社區內部有意義，外面的人根本不知道。\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"-網段與子網路遮罩劃分地盤\"\u003e🗺️ 網段與子網路遮罩 — 劃分地盤\u003c/h2\u003e\n\u003cp\u003eIP 位址不是一個個孤立存在的，它們被分成一組一組的「網段（Network Segment）」來管理。就像一個城市被劃分成不同的行政區，同一個網段的設備可以直接溝通，不同網段之間就要透過路由器才能往來。\u003c/p\u003e\n\u003cp\u003e判斷哪些 IP 屬於同一個網段，靠的是「子網路遮罩（Subnet Mask）」，常見格式例如 \u003ccode\u003e255.255.255.0\u003c/code\u003e，或者寫成更簡潔的 CIDR 表示法：\u003ccode\u003e/24\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*5ltFIHEXFnDvYxLcMSWltw.png\"\u003e\u003c/p\u003e\n\u003cp\u003e遮罩中「\u003ccode\u003e255\u003c/code\u003e」的部分表示「這段 bit 屬於網路識別」，「\u003ccode\u003e0\u003c/code\u003e」的部分表示「這段 bit 是主機編號」。遮罩越大（如 \u003ccode\u003e/16\u003c/code\u003e），網段包含的 IP 就越多；遮罩越小（如 \u003ccode\u003e/30\u003c/code\u003e），網段裡能用的 IP 就越少。\u003c/p\u003e\n\u003ch2 id=\"-gateway閘道離開的出口\"\u003e🚪 Gateway（閘道） — 離開的出口\u003c/h2\u003e\n\u003cp\u003e當你的設備要傳資料到不同網段（或者上網）時，它不能直接衝出去，它要先把封包交給「預設閘道（Default Gateway）」。閘道通常就是你家路由器的內網 IP，例如 \u003ccode\u003e192.168.1.1\u003c/code\u003e。\u003c/p\u003e","title":"網路不是魔法 一次搞懂 15 個核心概念"},{"content":" Image by freepik\n寫給需要制定馬達規格的工程師：如何從功率需求推算電流，並留下合理的設計餘裕\n前言 在馬達選型或規格制定初期，我們經常面臨這樣的問題：已知輸入功率和電壓，如何計算所需電流？ 更具挑戰的是，當馬達尚未選定時，該如何估算功率因數？本文將從基礎公式出發，逐步建立完整的計算方法論，並提供實務規格制定的建議。\n目錄 基礎理論：三相功率與電流 功率因數：未知時如何估算 從扭矩到電流：使用效率地圖 實務案例：3kW 馬達規格制定 一、基礎理論：三相功率與電流 核心公式 三相交流電的功率關係式：\nP = √3 × V_L × I_L × cos φ 反推電流：\nI_L = P / (√3 × V_L × cos φ) 符號說明：\nP：功率 (W) V_L：線電壓 (V) I_L：線電流 (A) cos φ：功率因數 √3 ≈ 1.732 簡化計算（380V 三相） 當電壓固定為 380V 時：\nI_L = P / (658.16 × cos φ) 或更簡潔的形式：\nI (A) ≈ P (kW) / (0.658 × cos φ) 計算範例：\n假設輸入功率 3 kW，功率因數 0.82：\nI = 3000 / (1.732 × 380 × 0.82) I = 3000 / 539.5 I ≈ 5.56 A 二、功率因數：設計初期的估算方法 問題的本質 功率因數 (cos φ) 表示電力系統的效率，但在馬達尚未選定時，我們如何知道這個值？\n答案是：使用業界經驗值。\n按馬達功率分類 經過多年工程實踐，業界總結出以下經驗值：\n馬達功率範圍 滿載功率因數 (cos φ) \u0026lt; 1 kW 0.65 ~ 0.75 1 ~ 5 kW 0.80 ~ 0.85 5 ~ 15 kW 0.85 ~ 0.88 15 ~ 50 kW 0.87 ~ 0.90 \u0026gt; 50 kW 0.88 ~ 0.92\n關鍵洞察： 馬達功率越大，功率因數越好。這是因為大型馬達的設計更優化，漏磁和銅損相對更小。\n按負載狀況分類 同一台馬達在不同負載下，功率因數也會變化：\n負載狀況 功率因數 說明 滿載運轉 0.80 ~ 0.85 設計最佳點 75% 負載 0.75 ~ 0.82 常見運轉區 50% 負載 0.65 ~ 0.75 效率下降 空載/輕載 0.20 ~ 0.40 極低效率\n設計建議： 對於 3 kW 級馬達，建議使用 cos φ = 0.82 作為設計基準值。\n不同運轉區域的功率因數 如果您有效率地圖，可以根據運轉區域細分：\n高扭矩區（接近最大扭矩）：cos φ = 0.75 ~ 0.85 額定點附近：cos φ = 0.82 ~ 0.87 低扭矩區（輕載）：cos φ = 0.60 ~ 0.75 三、從扭矩到電流：使用效率地圖計算 為什麼需要效率地圖？ 當您需要精確計算特定工況下的電流時，僅有功率規格是不夠的。效率地圖提供了 （轉速、扭矩、效率） 的三維關係，讓我們能夠：\n從機械輸出推算電氣輸入 驗證設計餘裕是否足夠 確認最壞工況下的電流峰值 計算流程 步驟一：從扭矩計算軸輸出功率\n完整公式：\nP_out (W) = T (N·m) × ω (rad/s) 實用簡化公式：\nP_out (kW) = T (N·m) × n (rpm) / 9549 步驟二：從效率地圖查找效率\n在效率地圖上找到對應的 (轉速, 扭矩) 點，讀取效率 η。\n步驟三：計算輸入功率\nP_in = P_out / η 步驟四：選擇功率因數\n優先從效率地圖讀取（如有提供） 否則使用前面章節的經驗值 步驟五：計算輸入電流\nI_L = P_in / (√3 × V_L × cos φ) 實際案例計算 給定條件：\n轉速：800 rpm 扭矩：23 N·m 效率：89% 電壓：380V 三相 功率因數：0.80（估計值） 計算過程：\n1. 計算軸輸出功率\nP_out = 23 × 800 / 9549 P_out = 18,400 / 9549 P_out = 1.93 kW 2. 計算輸入功率\nP_in = 1.93 / 0.89 P_in = 2.17 kW 3. 計算輸入電流\nI_L = 2170 / (1.732 × 380 × 0.80) I_L = 2170 / 526.5 I_L = 4.11 A 結論： 在此工作點下，輸入電流約為 4.1 A。\n四、實務案例：3kW 馬達規格制定 設計情境 假設我們需要制定一份馬達規格書，要求如下：\n輸入功率上限：3 kW 最大扭矩：23 N·m 電源：380V 三相 設計餘裕的重要性 從前面的計算可知，實際運轉點（800 rpm, 23 N·m）的輸入功率為 2.17 kW。為什麼規格要定為 3 kW？\n設計餘裕 = (3.0–2.17) / 2.17 = 38%\n這個餘裕涵蓋了：\n✅ 效率隨溫度、老化的變化（±5~10%） ✅ 瞬態過載需求（短時間 120~150% 負載） ✅ 不同工況的變化（不同轉速/扭矩組合） ✅ 供應商選型彈性（不同品牌效率差異） 經驗法則： 設計餘裕建議在 20~40% 之間。\n額定電流計算 基於 3 kW 輸入功率，計算不同功率因數下的電流：\n功率因數 (cos φ) 輸入電流 (A) 適用場景 0.80 5.70 保守估計 0.82 5.56 建議值 ⭐ 0.85 5.36 優質馬達 0.90 5.07 理想狀態\n規格書範例 馬達電氣規格表\n項目 規格值 備註 額定輸入功率 3 kW (max) 連續運轉 電源電壓 380V AC ±10% 三相，50/60 Hz 額定電流 ≤ 5.6 A @380V, cos φ ≥ 0.82 最大扭矩 23 N·m 功率因數 0.80 ~ 0.85 滿載時 最低效率 ≥ 85% 額定工作點\n說明：\n額定電流基於 cos φ = 0.82 計算 若需更保守，可標註 ≤ 6.0 A（基於 cos φ = 0.80） 快速查表：3 kW 輸入電流對照 cos φ 電流 (A) 適用場景 1.00 4.56 理想（純電阻） 0.90 5.07 高效馬達 0.85 5.36 優質馬達 0.82 5.56 建議設計值 ⭐ 0.80 5.70 保守估計 0.75 6.08 低效或輕載\n總結 本文提供了從基礎公式到實務規格制定的完整流程：\n掌握核心公式：I = P / (√3 × V × cos φ) 使用經驗值：3 kW 級馬達建議 cos φ = 0.82 活用效率地圖：從扭矩精確計算實際電流 保留設計餘裕：20~40% 功率餘裕確保系統可靠性 最終建議：\n輸入功率 3 kW，380V 三相 額定電流約 5.6 A（基於 cos φ = 0.82） 實際運轉電流約 4.1 A（800 rpm, 23 N·m） 設計餘裕 38% ✓ 希望這份指南能幫助您順利完成馬達規格制定！\n","permalink":"https://0Zhen.github.io/posts/2026-02-11/","summary":"\u003cp\u003e\u003cimg alt=\"Image by\\u00a0freepik\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*jgNxg5_OG21jdLsx7XrazA.jpeg\"\u003e\n\u003cem\u003eImage by freepik\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e寫給需要制定馬達規格的工程師：如何從功率需求推算電流，並留下合理的設計餘裕\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在馬達選型或規格制定初期，我們經常面臨這樣的問題：\u003cstrong\u003e已知輸入功率和電壓，如何計算所需電流？\u003c/strong\u003e 更具挑戰的是，當馬達尚未選定時，該如何估算功率因數？本文將從基礎公式出發，逐步建立完整的計算方法論，並提供實務規格制定的建議。\u003c/p\u003e\n\u003ch2 id=\"目錄\"\u003e目錄\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e基礎理論：三相功率與電流\u003c/li\u003e\n\u003cli\u003e功率因數：未知時如何估算\u003c/li\u003e\n\u003cli\u003e從扭矩到電流：使用效率地圖\u003c/li\u003e\n\u003cli\u003e實務案例：3kW 馬達規格制定\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"一基礎理論三相功率與電流\"\u003e一、基礎理論：三相功率與電流\u003c/h2\u003e\n\u003ch2 id=\"核心公式\"\u003e核心公式\u003c/h2\u003e\n\u003cp\u003e三相交流電的功率關係式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eP\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e√3 × V_L × I_L × cos φ\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e反推電流：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eI_L\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eP / (√3 × V_L × cos φ)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e符號說明：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eP\u003c/code\u003e：功率 (W)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eV_L\u003c/code\u003e：線電壓 (V)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eI_L\u003c/code\u003e：線電流 (A)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecos φ\u003c/code\u003e：功率因數\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e√3 ≈ 1.732\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"簡化計算380v-三相\"\u003e簡化計算（380V 三相）\u003c/h2\u003e\n\u003cp\u003e當電壓固定為 380V 時：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eI_L\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eP / (658.16 × cos φ)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e或更簡潔的形式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eI\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003eA\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e≈\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eP\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003ekW\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e0\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e658\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ecos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eφ\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e計算範例：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e假設輸入功率 3 kW，功率因數 0.82：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eI \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3000\u003c/span\u003e / \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e1.732 × \u003cspan style=\"color:#ae81ff\"\u003e380\u003c/span\u003e × 0.82\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eI \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3000\u003c/span\u003e / 539.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eI\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e≈\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e5.56\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"二功率因數設計初期的估算方法\"\u003e二、功率因數：設計初期的估算方法\u003c/h2\u003e\n\u003ch2 id=\"問題的本質\"\u003e問題的本質\u003c/h2\u003e\n\u003cp\u003e功率因數 (cos φ) 表示電力系統的效率，但在馬達尚未選定時，我們如何知道這個值？\u003c/p\u003e","title":"三相馬達電流計算完全指南：從理論到實務規格制定"},{"content":"在數位世界與類比世界的橋樑中，ADC（類比數位轉換器）扮演著關鍵角色。而在眾多ADC架構中，Sigma Delta ADC以其獨特的設計理念和卓越的性能表現，成為高精度量測和音訊應用的首選方案。\n今天我們來深入探討這個看似複雜，但實際上相當優雅的技術。\nSigma Delta的巧妙設計哲學 反直覺的設計思維 當我們需要高精度ADC時，直覺的想法可能是：\n使用更精密的硬體組件 提高比較器的精度 增加參考電壓的穩定性 但Sigma Delta ADC採用了截然不同的策略：用時間換精度，用速度換解析度。\n核心概念：過取樣與雜訊整形 過取樣（Oversampling） 想像你要測量一個人的身高，但手邊只有一把不太準確的尺。怎麼辦？\n最簡單的方法就是多量幾次，然後取平均值。Sigma Delta ADC就是這個原理：以遠高於需要的頻率進行取樣，然後透過平均化來提高精度。\n雜訊整形（Noise Shaping） 但光是多取樣還不夠，Sigma Delta更進一步：它不僅多取樣，還巧妙地將雜訊「推」到我們不關心的高頻段，讓目標頻帶內的雜訊大幅降低。\n技術原理深度剖析 基本架構 輸入信號 → [Σ 積分器] → [Δ 量化器] → 數位輸出 ↑ ↓ └── [1-bit DAC] ←┘ （負回饋迴路） 運作機制：\n積分器（Σ）：持續累積輸入信號與回饋信號的差值 量化器（Δ）：將積分結果轉換為1位元輸出（0或1） 回饋DAC：將數位輸出轉回類比信號進行負回饋 數位濾波：對高速1位元串流進行處理 數學原理 過取樣的效果：\n量化雜訊功率密度降低：雜訊分散到更寬的頻譜 SNR改善：每增加4倍過取樣率，SNR提升6dB 理論上：每增加1位元解析度需要4倍過取樣率 雜訊整形的威力：\n一階雜訊整形：每增加4倍過取樣率，SNR提升9dB 二階雜訊整形：每增加4倍過取樣率，SNR提升15dB 高階系統：效果更顯著，但穩定性是挑戰 實際運作範例 假設我們要設計一個16位元、1kHz取樣率的ADC：\n傳統方法：\n需要16位元精度的比較器和DAC 取樣率：1kHz 硬體複雜度：極高 Sigma Delta方法：\n使用1位元量化器（簡單） 過取樣率：256 × 1kHz = 256kHz 透過數位濾波獲得16位元精度 硬體複雜度：低 核心優勢分析 卓越的線性度 傳統ADC的挑戰：\nDNL（微分非線性）誤差 INL（積分非線性）誤差 溫度漂移 元件老化 Sigma Delta的解決方案：\n量化誤差被隨機化和平均化 1位元DAC幾乎完全線性 對元件精度要求低 長期穩定性佳 抗干擾能力 雜訊免疫性：\n工頻干擾：50/60Hz可被有效濾除 時脈抖動：對系統影響較小 電源雜訊：透過過取樣獲得改善 EMI干擾：數位處理提供更好防護 成本效益 硬體簡化：\n不需要高精度類比組件 主要功能在數位域實現 製程要求相對寬鬆 整合度高，外部組件少 應用領域深度探討 精密工業量測 溫度量測系統：\n# 典型的熱電偶讀取系統 # Sigma Delta ADC: 24位元解析度 # 輸入範圍: ±100mV # 解析度: 100mV / 2^24 ≈ 6nV # 溫度解析度: 約0.0001°C class ThermocoupleMeter: def __init__(self): self.adc = SigmaDeltaADC(resolution=24, sample_rate=10) def read_temperature(self): voltage = self.adc.read_voltage() temperature = self.voltage_to_temperature(voltage) return temperature 應用案例：\n工業爐溫控制：±0.1°C精度 材料研究：微小溫度變化偵測 食品加工：嚴格溫度監控 高品質音訊系統 專業錄音設備：\n動態範圍：\u0026gt;120dB THD+N：\u0026lt;-110dB 取樣率：192kHz/32位元 應用：錄音室、廣播電台 消費電子：\n智慧音響：語音識別前端 藍牙耳機：高品質編解碼 汽車音響：路噪環境下的清晰度 電力監測系統 智慧電錶：\n// 電力監測系統示例 typedef struct { float voltage_rms; float current_rms; float power_factor; float frequency; } power_measurement_t; power_measurement_t measure_power(void) { // 使用Sigma Delta ADC同時採樣電壓和電流 int32_t voltage_samples[1000]; int32_t current_samples[1000]; // 高精度採樣確保功率計算準確性 sigma_delta_read_dual_channel(voltage_samples, current_samples, 1000); return calculate_power_parameters(voltage_samples, current_samples); } 醫療設備應用 生理信號監測：\nECG（心電圖）：微伏級信號檢測 EEG（腦電圖）：極低雜訊要求 血糖儀：高精度生化感測 血壓計：壓力變化精確測量 設計考量與挑戰 關鍵設計參數 過取樣比（OSR）選擇：\nOSR 解析度提升 轉換速度 功耗 適用場合 64 +3位元 快 低 一般精度 256 +4位元 中等 中等 高精度 1024 +5位元 慢 高 極高精度\n濾波器階數權衡：\n一階：穩定、簡單，但性能有限 二階：性能提升明顯，複雜度可接受 高階：最佳性能，但穩定性挑戰大 實際應用挑戰 延遲問題：\n數位濾波引入群延遲 影響即時控制系統 解決方案：選擇適當的濾波器拓樸 穩定性考量：\n高階雜訊整形可能不穩定 過載恢復時間長 需要仔細的系統設計 功耗管理：\n高過取樣率增加功耗 數位處理功耗不可忽略 需在性能和功耗間平衡 與其他ADC架構的比較 SAR ADC vs Sigma Delta ADC 特性 SAR ADC Sigma Delta ADC 解析度 8–16位元 16–32位元 轉換速度 快（μs級） 慢（ms級） 硬體複雜度 中等 低 線性度 中等 優異 成本 中等 低 適用頻率 寬頻 窄頻\nPipeline ADC vs Sigma Delta ADC Pipeline ADC優勢：\n高速轉換（MSPS等級） 適合寬頻應用 延遲低 Sigma Delta ADC優勢：\n超高解析度 優異線性度 抗雜訊能力強 成本低 未來技術趨勢 混合架構發展 連續時間Sigma Delta：\n消除前置抗混疊濾波器 更高的轉換速度 降低功耗 多位元量化：\n平衡速度和精度 降低過取樣要求 但增加DAC精度需求 AI輔助最佳化 智慧校正：\n自動補償非線性 適應性雜訊消除 預測性維護 參數自調整：\n根據信號特性調整OSR 動態濾波器係數 功耗最佳化 整合趨勢 SoC整合：\n完整的類比前端 內建數位信號處理 系統級解決方案 多通道系統：\n同步取樣 通道間隔離 共用數位處理資源 選擇指南與最佳實務 何時選擇Sigma Delta ADC？ 理想應用場景： ✅ 需要高解析度（\u0026gt;12位元） ✅ DC或低頻信號（\u0026lt;100kHz） ✅ 對精度要求嚴格 ✅ 成本敏感的應用 ✅ 抗雜訊要求高\n不適合的場景： ❌ 高頻寬應用（\u0026gt;MHz） ❌ 快速轉換需求（\u0026lt;μs） ❌ 延遲敏感系統 ❌ 功耗嚴格限制\n設計最佳實務 系統層級考量：\n前端設計：適當的抗混疊濾波 參考電壓：低雜訊、高穩定性 PCB布局：數位和類比分離 軟體濾波：選擇合適的數位濾波器 性能最佳化：\n過取樣比選擇：平衡精度和速度 時脈設計：低抖動、穩定頻率 校正演算法：補償系統誤差 測試驗證：全面的性能測試 實際應用案例分析 案例一：智慧農業土壤監測 需求：\n多參數同時監測（pH、濕度、養分） 戶外環境抗干擾 長期穩定性 低功耗要求 解決方案：\n使用16位元Sigma Delta ADC OSR=128，平衡精度和功耗 內建溫度補償 無線傳輸節省連線 結果：\n測量精度：±0.1 pH，±2%濕度 電池壽命：\u0026gt;2年 維護週期：大幅延長 案例二：精密天平系統 需求：\n0.1mg解析度 快速穩定時間 震動干擾免疫 溫度補償 解決方案：\n24位元Sigma Delta ADC 差動輸入降低共模干擾 數位濾波器抑制機械震動 多點校正演算法 結果：\n解析度：0.01mg 穩定時間：❤秒 線性度：±0.02% F.S. 溫度係數：\u0026lt;10ppm/°C 結語 Sigma Delta ADC體現了工程設計中「巧勁勝過蠻力」的哲學。它不依賴昂貴的高精度硬體，而是透過聰明的系統架構和數位信號處理技術，實現了卓越的性能表現。\n隨著IoT、工業4.0和精準農業等應用的快速發展，對高精度、低成本ADC的需求將持續增長。Sigma Delta ADC憑藉其獨特優勢，必將在未來的智慧感測系統中發揮更重要的作用。\n對於工程師而言，深入理解Sigma Delta ADC的原理和應用，不僅能幫助我們做出更好的設計選擇，更能啟發我們用創新的思維解決複雜的技術挑戰。\n在這個類比與數位交融的時代，Sigma Delta ADC告訴我們：有時候，最優雅的解決方案往往來自最意外的角度。\n","permalink":"https://0Zhen.github.io/posts/sigma-delta-adc/","summary":"\u003cp\u003e在數位世界與類比世界的橋樑中，ADC（類比數位轉換器）扮演著關鍵角色。而在眾多ADC架構中，Sigma Delta ADC以其獨特的設計理念和卓越的性能表現，成為高精度量測和音訊應用的首選方案。\u003c/p\u003e\n\u003cp\u003e今天我們來深入探討這個看似複雜，但實際上相當優雅的技術。\u003c/p\u003e\n\u003ch2 id=\"sigma-delta的巧妙設計哲學\"\u003eSigma Delta的巧妙設計哲學\u003c/h2\u003e\n\u003ch2 id=\"反直覺的設計思維\"\u003e反直覺的設計思維\u003c/h2\u003e\n\u003cp\u003e當我們需要高精度ADC時，直覺的想法可能是：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用更精密的硬體組件\u003c/li\u003e\n\u003cli\u003e提高比較器的精度\u003c/li\u003e\n\u003cli\u003e增加參考電壓的穩定性\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e但Sigma Delta ADC採用了截然不同的策略：\u003cstrong\u003e用時間換精度\u003c/strong\u003e，\u003cstrong\u003e用速度換解析度\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"核心概念過取樣與雜訊整形\"\u003e核心概念：過取樣與雜訊整形\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e過取樣（Oversampling）\u003c/strong\u003e 想像你要測量一個人的身高，但手邊只有一把不太準確的尺。怎麼辦？\u003c/p\u003e\n\u003cp\u003e最簡單的方法就是多量幾次，然後取平均值。Sigma Delta ADC就是這個原理：以遠高於需要的頻率進行取樣，然後透過平均化來提高精度。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e雜訊整形（Noise Shaping）\u003c/strong\u003e 但光是多取樣還不夠，Sigma Delta更進一步：它不僅多取樣，還巧妙地將雜訊「推」到我們不關心的高頻段，讓目標頻帶內的雜訊大幅降低。\u003c/p\u003e\n\u003ch2 id=\"技術原理深度剖析\"\u003e技術原理深度剖析\u003c/h2\u003e\n\u003ch2 id=\"基本架構\"\u003e基本架構\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e輸入信號\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003eΣ\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e積分器\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003eΔ\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e量化器\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e數位輸出\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e↑\u003c/span\u003e              \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e↓\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e└──\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e1-bit\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eDAC\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e←┘\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e（\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e負回饋迴路\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e運作機制：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e積分器（Σ）\u003c/strong\u003e：持續累積輸入信號與回饋信號的差值\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e量化器（Δ）\u003c/strong\u003e：將積分結果轉換為1位元輸出（0或1）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e回饋DAC\u003c/strong\u003e：將數位輸出轉回類比信號進行負回饋\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e數位濾波\u003c/strong\u003e：對高速1位元串流進行處理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"數學原理\"\u003e數學原理\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e過取樣的效果：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e量化雜訊功率密度降低：雜訊分散到更寬的頻譜\u003c/li\u003e\n\u003cli\u003eSNR改善：每增加4倍過取樣率，SNR提升6dB\u003c/li\u003e\n\u003cli\u003e理論上：每增加1位元解析度需要4倍過取樣率\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e雜訊整形的威力：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一階雜訊整形：每增加4倍過取樣率，SNR提升9dB\u003c/li\u003e\n\u003cli\u003e二階雜訊整形：每增加4倍過取樣率，SNR提升15dB\u003c/li\u003e\n\u003cli\u003e高階系統：效果更顯著，但穩定性是挑戰\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"實際運作範例\"\u003e實際運作範例\u003c/h2\u003e\n\u003cp\u003e假設我們要設計一個16位元、1kHz取樣率的ADC：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e傳統方法：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e需要16位元精度的比較器和DAC\u003c/li\u003e\n\u003cli\u003e取樣率：1kHz\u003c/li\u003e\n\u003cli\u003e硬體複雜度：極高\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSigma Delta方法：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用1位元量化器（簡單）\u003c/li\u003e\n\u003cli\u003e過取樣率：256 × 1kHz = 256kHz\u003c/li\u003e\n\u003cli\u003e透過數位濾波獲得16位元精度\u003c/li\u003e\n\u003cli\u003e硬體複雜度：低\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"核心優勢分析\"\u003e核心優勢分析\u003c/h2\u003e\n\u003ch2 id=\"卓越的線性度\"\u003e卓越的線性度\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e傳統ADC的挑戰：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDNL（微分非線性）誤差\u003c/li\u003e\n\u003cli\u003eINL（積分非線性）誤差\u003c/li\u003e\n\u003cli\u003e溫度漂移\u003c/li\u003e\n\u003cli\u003e元件老化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSigma Delta的解決方案：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e量化誤差被隨機化和平均化\u003c/li\u003e\n\u003cli\u003e1位元DAC幾乎完全線性\u003c/li\u003e\n\u003cli\u003e對元件精度要求低\u003c/li\u003e\n\u003cli\u003e長期穩定性佳\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"抗干擾能力\"\u003e抗干擾能力\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e雜訊免疫性：\u003c/strong\u003e\u003c/p\u003e","title":"Sigma Delta ADC 深度解析：從原理到實際應用"},{"content":"上週參加了Renesas的技術研討會，演講中不斷提到DSP和ARM的應用差異，讓我開始思考這兩種架構在實際應用中的選擇考量。會後與幾位資深工程師交流，發現這個話題比想像中更複雜也更有趣。於是決定做一個系統性的調查，整理出這篇技術分析報告。\nmouser.tw\n研討會上的啟發 印象深刻的技術討論 音訊處理應用的架構選擇 演講者提到：「對於即時音訊處理應用，我們推薦使用RX系列DSP，在性能和功耗上都比一般ARM方案更優。」\n這引發了我的思考：在什麼情況下DSP確實比ARM更適合？\nFFT運算性能比較 有工程師提問Cortex-M33在FFT運算上與專用DSP的性能差距，這讓我意識到不同架構在特定運算上的差異可能比想像中更顯著。\n架構融合趨勢 午餐時聽到的討論最有趣：「現在ARM也整合DSP指令了，未來可能不需要單獨選擇。」\n這些對話促使我深入研究兩種架構的技術特性。\n技術架構深度分析 DSP架構特性 核心設計理念 DSP（Digital Signal Processor）專為數位信號處理而設計，其架構針對大量數學運算進行優化。\n關鍵技術特徵：\n哈佛架構 程式記憶體和資料記憶體分離 允許同時存取指令和資料 大幅提升運算密集型應用的效能 2. 專用MAC單元\n乘法累加器（Multiply-Accumulate） 單一時脈週期完成乘法和加法 是濾波器、FFT等演算法的核心 3. 特殊定址模式\n循環緩衝區定址 位元反轉定址（用於FFT） 多種自動增減定址模式 4. 管線優化\n深度管線設計 指令並行執行 零額外開銷迴圈 主要應用領域：\n音訊/語音處理：編解碼、降噪、音效 影像處理：濾波、壓縮、識別 通訊系統：調變解調、通道編碼 控制系統：馬達控制、電力轉換 ARM架構特性 核心設計理念 ARM基於RISC原理，強調指令簡潔、低功耗和高效率。\n關鍵技術特徵：\nRISC架構 精簡指令集 大多數指令單週期執行 優秀的編譯器支援 2. 靈活的系列產品\nCortex-A：高性能應用處理器 Cortex-R：即時系統處理器 Cortex-M：微控制器系列 3. 先進製程支援\n從28nm到5nm製程 優秀的功耗控制 高整合度設計 4. 豐富的周邊生態\n完整的開發工具鏈 廣泛的作業系統支援 豐富的第三方IP 主要應用領域：\n行動裝置：智慧手機、平板 嵌入式系統：IoT、汽車電子 工業控制：自動化、機器人 消費電子：智慧家電、穿戴裝置 性能比較分析 實際測試數據 為了驗證理論分析，我收集了一些公開的基準測試數據：\nFFT運算性能比較（1024點復數FFT）：\n處理器 執行時間 功耗 相對性能 TI TMS320C6748 DSP 0.8ms 456mW 基準 ARM Cortex-M7 @400MHz 2.1ms 180mW 0.38x ARM Cortex-A53 @1.5GHz 1.2ms 750mW 0.67x\nFIR濾波器性能比較（128階）：\n處理器 處理時間/樣本 MIPS消耗 ADI ADSP-21489 0.3μs 128 ARM Cortex-M4 @168MHz 1.2μs 201 ARM Cortex-A9 @1GHz 0.5μs 500\n性能分析結論 數學密集運算：DSP在純數學運算上仍有明顯優勢 功耗效率：DSP在特定任務下功耗效率更高 通用性能：ARM在系統整體性能上更均衡 可程式性：ARM開發門檻較低，生產力更高 開發體驗比較 DSP開發特點 優勢：\n針對信號處理優化的編譯器 豐富的DSP函式庫 優秀的即時性能 成熟的演算法實現 挑戰：\n學習曲線較陡峭 除錯工具相對專業 記憶體管理較複雜 移植性有限 ARM開發特點 優勢：\n豐富的開發工具和IDE 廣泛的社群支援 完整的軟體生態系統 良好的程式碼可攜性 挑戰：\n在特定領域性能不夠優化 需要更多系統資源 即時性能可能不足 成本效益分析 總體擁有成本比較 DSP方案成本結構：\n晶片成本：中高（$5–50） 開發成本：高（需專業人才） 工具授權：中等 量產優勢：在特定應用有優勢 ARM方案成本結構：\n晶片成本：低中（$1–20） 開發成本：低（人才容易取得） 工具成本：低（多數免費） 生態系統：成熟完整 ROI分析 對於不同規模的專案：\n小量產品（\u0026lt;10K）：ARM通常更經濟 大量產品（\u0026gt;100K）：DSP在特定應用可能更合適 原型開發：ARM開發速度更快 性能關鍵應用：DSP的性能優勢值得投資 選擇決策框架 技術需求評估 選擇DSP的情境：\n1. 性能要求\n即時信號處理需求 複雜數學運算密集 低延遲要求（\u0026lt;1ms） 2. 應用特性\n專業音訊/影像處理 通訊基頻處理 高精度控制系統 3. 團隊能力\n有DSP專業背景 能接受較長開發週期 重視最終產品性能 選擇ARM的情境：\n1. 系統需求\n需要豐富的周邊整合 複雜的軟體系統 多功能整合需求 2. 開發考量\n快速上市需求 團隊技術背景廣泛 成本預算有限 3. 市場因素\n大量生產 標準化需求 後續維護考量 混合架構解決方案 異構運算趨勢 現代系統設計越來越傾向使用混合架構：\n典型配置：\n主控處理器（ARM）：系統管理、使用者介面、通訊 協處理器（DSP）：特定演算法加速 專用加速器：AI推理、加密等 成功案例：\n智慧音響：ARM負責系統，DSP處理音訊 5G基地台：ARM控制，DSP處理基頻 汽車ADAS：ARM做決策，DSP處理感測器資料 ARM的DSP擴展 Cortex-M系列DSP功能：\nCortex-M4/M7內建DSP指令 支援SIMD運算 硬體浮點單元 在某些應用可取代專用DSP 性能提升：\n相比純ARM架構提升2–4倍 功耗控制更好 開發複雜度大幅降低 未來技術趨勢 架構融合發展 ARM持續增強DSP能力 更強的向量處理 專用加速單元 AI推理加速 2. DSP增加通用運算能力\n更好的作業系統支援 豐富的周邊介面 改善開發工具 3. 新興架構影響\nRISC-V的開源替代 專用AI加速器 量子運算的長期影響 應用領域變化 邊緣AI興起\n推理加速需求增長 NPU專用處理器 DSP在AI前處理的角色 5G/6G通訊\n更複雜的信號處理需求 超低延遲要求 大規模MIMO處理 實用建議總結 評估檢查清單 技術需求評估： □ 主要運算類型（信號處理 vs 通用） □ 即時性要求（延遲容忍度） □ 功耗預算限制 □ 成本目標設定\n開發資源評估： □ 團隊技術背景 □ 開發時程要求 □ 工具預算限制 □ 後續維護能力\n市場因素評估： □ 預期產量規模 □ 競爭對手方案 □ 技術差異化需求 □ 供應鏈穩定性\n最終建議 對於大多數應用，建議的評估順序：\n先考慮ARM方案：開發風險低，上市快 評估性能是否足夠：進行關鍵演算法測試 考慮混合方案：在性能瓶頸處加入專用處理 最後考慮純DSP：僅在性能要求極高時選擇 結語 經過這次深入調查，我認為DSP和ARM的選擇不再是非此即彼的問題，而是如何在性能、成本、開發效率間找到最佳平衡點。\n隨著ARM處理器DSP能力的增強，以及異構運算的普及，未來的系統設計將更加靈活多樣。重要的是理解各種架構的特性，根據具體需求做出明智選擇。\n對於工程師而言，掌握多種架構的特點和應用場景，將是未來技術發展中的重要競爭優勢。\n本文基於公開資料和技術分析，如有不同觀點或補充資訊，歡迎在評論區討論交流。\n","permalink":"https://0Zhen.github.io/posts/renesas-dsp-vs-arm/","summary":"\u003cp\u003e上週參加了Renesas的技術研討會，演講中不斷提到DSP和ARM的應用差異，讓我開始思考這兩種架構在實際應用中的選擇考量。會後與幾位資深工程師交流，發現這個話題比想像中更複雜也更有趣。於是決定做一個系統性的調查，整理出這篇技術分析報告。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"mouser.tw\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*4gAWPzeq0RarnfgSZaEw6A.jpeg\"\u003e\n\u003cem\u003emouser.tw\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"研討會上的啟發\"\u003e研討會上的啟發\u003c/h2\u003e\n\u003ch2 id=\"印象深刻的技術討論\"\u003e印象深刻的技術討論\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e音訊處理應用的架構選擇\u003c/strong\u003e 演講者提到：「對於即時音訊處理應用，我們推薦使用RX系列DSP，在性能和功耗上都比一般ARM方案更優。」\u003c/p\u003e\n\u003cp\u003e這引發了我的思考：在什麼情況下DSP確實比ARM更適合？\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFFT運算性能比較\u003c/strong\u003e 有工程師提問Cortex-M33在FFT運算上與專用DSP的性能差距，這讓我意識到不同架構在特定運算上的差異可能比想像中更顯著。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e架構融合趨勢\u003c/strong\u003e 午餐時聽到的討論最有趣：「現在ARM也整合DSP指令了，未來可能不需要單獨選擇。」\u003c/p\u003e\n\u003cp\u003e這些對話促使我深入研究兩種架構的技術特性。\u003c/p\u003e\n\u003ch2 id=\"技術架構深度分析\"\u003e技術架構深度分析\u003c/h2\u003e\n\u003ch2 id=\"dsp架構特性\"\u003eDSP架構特性\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e核心設計理念\u003c/strong\u003e DSP（Digital Signal Processor）專為數位信號處理而設計，其架構針對大量數學運算進行優化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e關鍵技術特徵：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e哈佛架構\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e程式記憶體和資料記憶體分離\u003c/li\u003e\n\u003cli\u003e允許同時存取指令和資料\u003c/li\u003e\n\u003cli\u003e大幅提升運算密集型應用的效能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e2. 專用MAC單元\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e乘法累加器（Multiply-Accumulate）\u003c/li\u003e\n\u003cli\u003e單一時脈週期完成乘法和加法\u003c/li\u003e\n\u003cli\u003e是濾波器、FFT等演算法的核心\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e3. 特殊定址模式\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e循環緩衝區定址\u003c/li\u003e\n\u003cli\u003e位元反轉定址（用於FFT）\u003c/li\u003e\n\u003cli\u003e多種自動增減定址模式\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e4. 管線優化\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e深度管線設計\u003c/li\u003e\n\u003cli\u003e指令並行執行\u003c/li\u003e\n\u003cli\u003e零額外開銷迴圈\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e主要應用領域：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e音訊/語音處理：編解碼、降噪、音效\u003c/li\u003e\n\u003cli\u003e影像處理：濾波、壓縮、識別\u003c/li\u003e\n\u003cli\u003e通訊系統：調變解調、通道編碼\u003c/li\u003e\n\u003cli\u003e控制系統：馬達控制、電力轉換\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"arm架構特性\"\u003eARM架構特性\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e核心設計理念\u003c/strong\u003e ARM基於RISC原理，強調指令簡潔、低功耗和高效率。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e關鍵技術特徵：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eRISC架構\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e精簡指令集\u003c/li\u003e\n\u003cli\u003e大多數指令單週期執行\u003c/li\u003e\n\u003cli\u003e優秀的編譯器支援\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e2. 靈活的系列產品\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCortex-A：高性能應用處理器\u003c/li\u003e\n\u003cli\u003eCortex-R：即時系統處理器\u003c/li\u003e\n\u003cli\u003eCortex-M：微控制器系列\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e3. 先進製程支援\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e從28nm到5nm製程\u003c/li\u003e\n\u003cli\u003e優秀的功耗控制\u003c/li\u003e\n\u003cli\u003e高整合度設計\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e4. 豐富的周邊生態\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e完整的開發工具鏈\u003c/li\u003e\n\u003cli\u003e廣泛的作業系統支援\u003c/li\u003e\n\u003cli\u003e豐富的第三方IP\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e主要應用領域：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e行動裝置：智慧手機、平板\u003c/li\u003e\n\u003cli\u003e嵌入式系統：IoT、汽車電子\u003c/li\u003e\n\u003cli\u003e工業控制：自動化、機器人\u003c/li\u003e\n\u003cli\u003e消費電子：智慧家電、穿戴裝置\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"性能比較分析\"\u003e性能比較分析\u003c/h2\u003e\n\u003ch2 id=\"實際測試數據\"\u003e實際測試數據\u003c/h2\u003e\n\u003cp\u003e為了驗證理論分析，我收集了一些公開的基準測試數據：\u003c/p\u003e","title":"參加Renesas研討會後的思考：DSP vs ARM 技術調查報告"},{"content":" fom Freepik\n為什麼要自己做網站？ 身為一個熱愛騎自行車的上班族，我經常需要計算爬坡時需要多少功率，或是分析 GPS 軌跡檔案來規劃騎乘時間。特別是工作上常常需要分析電輔腳踏車的性能，要多少瓦數才能爬什麼坡，市面上雖然有一些工具，但總是缺少我想要的功能，而且大多是英文介面。\n於是我想：「不如自己做一個？」\n這個想法讓我開始了一個有趣的學習之旅。從完全不懂網站架設，到現在有了一個自己用得順手的專業工具，這個過程不僅讓我學到了技術，更重要的是學會了如何將工作需求變成實用工具。\n我做了什麼？ 🚴‍♂️ 自行車功率計算器 我的網站主要功能很簡單：\n輸入你的體重、功率，就能算出在不同坡度能騎多快 反過來，輸入目標速度，就知道需要多少功率 可以上傳 Strava 或 Garmin 的 GPX 檔案，自動分析整條路線需要多久時間 特別針對電輔腳踏車的功率需求進行分析 聽起來很專業？其實核心就是一些物理公式的計算，任何人都能理解。\n🌟 與眾不同的地方 為什麼不直接用現有工具？\n大部分工具都是英文，台灣騎士用起來不方便 很少支援 GPX 檔案直接拖拉上傳分析 計算結果不夠詳細，看不出各種阻力的影響 沒有針對台灣常見路線（像武嶺、陽明山）優化 缺乏電輔腳踏車的專門分析功能 所以我做的不只是一個計算器，而是專為自己（和可能有同樣需求的人）設計的實用工具。\n技術選擇：簡單就是美 💻 為什麼不用複雜的框架？ 一開始我也想過要用 React 或 Vue 這些熱門框架，但後來發現：\n載入更快：沒有多餘的程式庫，網頁開啟飛快 SEO 更好：Google 更容易理解和收錄 維護簡單：不用擔心框架版本更新問題 成本更低：不需要複雜的建置流程 最終我選擇了最簡單的技術：HTML + CSS + JavaScript，但這不代表功能陽春。\n🚀 為什麼選擇 Firebase？ 在比較了各種主機服務後，我選擇了 Google 的 Firebase：\n費用考量\n完全免費（每月 10GB 流量） 對個人工具來說綽綽有餘 目前流量不大，免費額度就夠用 技術優勢\n全球加速，台灣用戶載入很快 自動 HTTPS 安全連線 與 Google 服務整合完美 未來彈性\n之後如果有需要可以輕鬆升級 可以串接其他 Google 服務 部署流程簡單 版本控制：為什麼 Git 這麼重要？ 🔄 我的工作流程 剛開始我也不懂版本控制，每次改程式都是直接覆蓋檔案。直到有一次改壞了，找不回原來的版本，才深刻體會到 Git 的重要性。\n現在我的工作方式是：\n平常開發：在 develop 分支實驗新功能 本地測試：確認功能正常運作 正式發佈：合併到 main 分支，自動部署上線 這樣的好處是：\n🛡️ 絕對不會弄壞正式網站 🔄 可以隨時回到之前的版本 📋 清楚記錄每次的修改內容 💡 給新手的建議 如果你也想開始用 Git：\n不用一開始就學複雜的指令 先學會基本的 add、commit、push 養成經常備份的習慣 用 GitHub Desktop 這類圖形介面工具 自動化部署：讓機器人幫你工作 ⚙️ 什麼是自動部署？ 簡單說，就是當我把程式碼上傳到 GitHub 後，系統會自動幫我更新網站，不需要手動操作。\n以前的流程：改程式 → 手動上傳檔案 → 手動部署 → 測試網站 ❌ 現在的流程：改程式 → 推送到 GitHub → 自動部署 → 收到完成通知 ✅\n🎯 實際效益 節省時間\n每次部署從 10 分鐘縮短到 3 分鐘 可以更專注在功能開發 減少錯誤\n不會因為手動操作失誤 每次部署流程都一致 現況與學習心得 📊 目前狀況 說實話，網站才剛上線不久，瀏覽量還很少，主要還是我自己在用。但這其實沒關係，因為一開始的目的就是解決自己的需求，能夠順便幫到其他有相同需求的人更好。\n🤔 遇到的困難 技術挑戰\n不同 GPS 設備的檔案格式差異 複雜的物理公式計算 跨瀏覽器相容性問題 電輔腳踏車功率計算的特殊考量 功能完善\n如何讓計算結果更準確？ 怎樣讓介面更直觀好用？ 如何處理各種特殊情況？ 🚀 解決方案 技術方面\n多看文件，多試錯 在自行車社群請教專業知識 找朋友幫忙測試不同裝置 針對工作需求持續調整功能 📚 最大的收穫 這個專案讓我學到的不只是技術：\n技能成長\n全端網站開發基礎 使用者體驗設計思考 問題分析與解決能力 將工作需求轉化為工具的能力 心態轉變\n從「我不會」到「我可以學」 從「湊合著用」到「做個好用的」 從「只有我用」到「也許能幫到別人」 未來想法 🎯 短期目標 持續完善現有功能 修正使用上發現的問題 增加更多電輔腳踏車相關的分析功能 讓工具更符合實際工作需求 📈 如果有機會 也許會嘗試簡單的 SEO 優化 如果真的有其他人覺得有用，會考慮加入更多功能 可能會寫一些騎車相關的實用文章 給想開始的人的建議 🎯 從解決自己的問題開始 你不需要一開始就想著要做給很多人用：\n先解決你自己真正遇到的問題 快速做出能用的版本 用起來順手比功能複雜更重要 🛠️ 選擇適合的工具 技術選擇\n不一定要用最新最炫的技術 選擇你能掌握的工具 優先考慮簡單穩定 平台選擇\nFirebase 適合新手入門，而且免費額度很夠用 GitHub 是必學的版本控制 簡單的 HTML + CSS + JavaScript 就能做很多事 💪 保持學習動機 設定實際的目標\n第一週：網站能正常運作 第一個月：自己用起來很順手 之後：根據需求持續改進 享受過程\n學習新技術的成就感 解決問題的滿足感 工具越來越好用的開心 🌐 工具分享 如果你也有類似的需求，歡迎試用我做的工具：\n🚴‍♂️自行車功率計算器\n這個工具完全免費使用，功能包括：\n功率與速度計算 GPX 檔案路線分析 電輔腳踏車功率需求分析 適合台灣路線的爬坡計算 雖然還在持續改進中，但基本功能都很穩定。如果使用上有任何問題或建議，也歡迎聯絡我！\n總結：從需求到工具 這個專案從想法到能用，花了我大約3天的業餘時間。雖然現在瀏覽量還不大，但每次用自己做的工具解决工作問題時，那種滿足感是很特別的。\n🌟 核心心得 技術不是門檻\n你不需要是資深工程師 現在的工具讓開發變得很簡單 重要的是解決真實的問題 實用至上\n功能不用多，但要真的有用 自己用得順手最重要 能幫到別人是額外的驚喜 持續改進\n不要等到完美才開始用 邊用邊改，邊改邊學 小步快跑比規劃完美更實際 🚀 如果你也想開始 找到你的需求：什麼工作或生活問題一直困擾著你？ 簡單開始：不要想著一次解決所有問題 快速上手：先做出能用的版本 持續改進：根據使用經驗不斷優化 記住，最好的工具往往是從解決自己的小問題開始的。你的需求可能也是別人的痛點，說不定你的小工具就能幫到更多人！\n這篇文章記錄了一個普通上班族如何將工作需求和業餘興趣結合，做出實用工具的過程。希望能鼓勵更多人動手解決自己遇到的問題。\n","permalink":"https://0Zhen.github.io/posts/2025-06-27/","summary":"\u003cp\u003e\u003cimg alt=\"fom Freepik\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*E4j5diJ46S2L3xnmMN9OtQ.jpeg\"\u003e\n\u003cem\u003efom Freepik\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"為什麼要自己做網站\"\u003e為什麼要自己做網站？\u003c/h2\u003e\n\u003cp\u003e身為一個熱愛騎自行車的上班族，我經常需要計算爬坡時需要多少功率，或是分析 GPS 軌跡檔案來規劃騎乘時間。特別是工作上常常需要分析電輔腳踏車的性能，要多少瓦數才能爬什麼坡，市面上雖然有一些工具，但總是缺少我想要的功能，而且大多是英文介面。\u003c/p\u003e\n\u003cp\u003e於是我想：「不如自己做一個？」\u003c/p\u003e\n\u003cp\u003e這個想法讓我開始了一個有趣的學習之旅。從完全不懂網站架設，到現在有了一個自己用得順手的專業工具，這個過程不僅讓我學到了技術，更重要的是學會了如何將工作需求變成實用工具。\u003c/p\u003e\n\u003ch2 id=\"我做了什麼\"\u003e我做了什麼？\u003c/h2\u003e\n\u003ch2 id=\"-自行車功率計算器\"\u003e🚴‍♂️ 自行車功率計算器\u003c/h2\u003e\n\u003cp\u003e我的網站主要功能很簡單：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e輸入你的體重、功率，就能算出在不同坡度能騎多快\u003c/li\u003e\n\u003cli\u003e反過來，輸入目標速度，就知道需要多少功率\u003c/li\u003e\n\u003cli\u003e可以上傳 Strava 或 Garmin 的 GPX 檔案，自動分析整條路線需要多久時間\u003c/li\u003e\n\u003cli\u003e特別針對電輔腳踏車的功率需求進行分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e聽起來很專業？其實核心就是一些物理公式的計算，任何人都能理解。\u003c/p\u003e\n\u003ch2 id=\"-與眾不同的地方\"\u003e🌟 與眾不同的地方\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e為什麼不直接用現有工具？\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e大部分工具都是英文，台灣騎士用起來不方便\u003c/li\u003e\n\u003cli\u003e很少支援 GPX 檔案直接拖拉上傳分析\u003c/li\u003e\n\u003cli\u003e計算結果不夠詳細，看不出各種阻力的影響\u003c/li\u003e\n\u003cli\u003e沒有針對台灣常見路線（像武嶺、陽明山）優化\u003c/li\u003e\n\u003cli\u003e缺乏電輔腳踏車的專門分析功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e所以我做的不只是一個計算器，而是專為自己（和可能有同樣需求的人）設計的實用工具。\u003c/p\u003e\n\u003ch2 id=\"技術選擇簡單就是美\"\u003e技術選擇：簡單就是美\u003c/h2\u003e\n\u003ch2 id=\"-為什麼不用複雜的框架\"\u003e💻 為什麼不用複雜的框架？\u003c/h2\u003e\n\u003cp\u003e一開始我也想過要用 React 或 Vue 這些熱門框架，但後來發現：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e載入更快\u003c/strong\u003e：沒有多餘的程式庫，網頁開啟飛快\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSEO 更好\u003c/strong\u003e：Google 更容易理解和收錄\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e維護簡單\u003c/strong\u003e：不用擔心框架版本更新問題\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e成本更低\u003c/strong\u003e：不需要複雜的建置流程\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e最終我選擇了最簡單的技術：HTML + CSS + JavaScript，但這不代表功能陽春。\u003c/p\u003e\n\u003ch2 id=\"-為什麼選擇-firebase\"\u003e🚀 為什麼選擇 Firebase？\u003c/h2\u003e\n\u003cp\u003e在比較了各種主機服務後，我選擇了 Google 的 Firebase：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e費用考量\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e完全免費（每月 10GB 流量）\u003c/li\u003e\n\u003cli\u003e對個人工具來說綽綽有餘\u003c/li\u003e\n\u003cli\u003e目前流量不大，免費額度就夠用\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e技術優勢\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e全球加速，台灣用戶載入很快\u003c/li\u003e\n\u003cli\u003e自動 HTTPS 安全連線\u003c/li\u003e\n\u003cli\u003e與 Google 服務整合完美\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e未來彈性\u003c/strong\u003e\u003c/p\u003e","title":"從零開始打造自己的網站：一個騎車愛好者的實用工具分享"},{"content":"當你在家上網、傳訊息給朋友，或是看Netflix時，有沒有想過你的資料是如何穿越複雜的網路世界，最終到達目的地的？這背後的功臣，就是我們今天要介紹的主角 — — 路由器。\n什麼是路由器？網路世界的GPS導航員 想像一下，如果網際網路是一個巨大的城市，那麼路由器就像是每個路口的智慧交通號誌。當你要寄一封電子郵件給遠在日本的朋友時，你的資料就像一輛車，需要經過無數個路口（路由器），每個路口的交通號誌都會告訴你的資料：「要到日本的話，請往這個方向走。」\n路由器的核心任務很簡單：\n檢查每個經過的資料封包 看看目的地是哪裡 決定下一步該往哪個方向送 但這個「簡單」的任務，在全球數十億台設備互聯的網路世界中，變得極其複雜和重要。\n為什麼需要路由器？不同通信方式的比較 在現代網際網路出現之前，人們使用過許多不同的通信方式。理解這些差異，能幫我們更好地欣賞路由器的價值。\n簡單網路：以CAN Bus為例 在汽車工業中，有一種叫做CAN（Controller Area Network）的通信系統。CAN就像一輛公車上的乘客對話：當有人在車上大聲說話時，每個人都聽得到，自己決定要不要理會這個訊息。\nCAN的特點：\n所有設備都在同一條「巴士」上 訊息採用廣播方式，每個設備都會收到 主要用於汽車內部或小型區域網路 簡單、可靠，但規模受限 這種方式在小範圍內很有效，但如果要連接全世界的設備就行不通了。\n為什麼全球網路需要路由器？ 想想看，如果全世界每台電腦都要直接連接到其他電腦會發生什麼？假設有10億台設備，每台都要連到其他設備，那就需要約5000億條連線！這在物理上根本不可能。\n路由器提供了優雅的解決方案：\n階層式網路架構：就像城市道路系統，有主幹道、次要道路、小巷 智慧路徑選擇：自動找出最佳路徑，避開壅塞或故障路段 無限可擴展性：可以輕鬆加入新的網路節點 路由器網路 vs 廣播網路：\n廣播型網路（如CAN）：\nA → [所有人都聽到] → B, C, D, E 就像在巴士上大聲說話，每個人都聽得到，自己決定要不要理你。\n路由型網路（如Internet）：\nA → 路由器1 → 路由器2 → 路由器3 → B 就像寄信，郵差要一站一站地轉送，每個郵局都要看地址決定下一步怎麼走。\nOSI模型：理解網路通信的層次 在討論路由器的具體功能之前，我們需要了解網路通信的基本架構 — — OSI七層模型。\nOSI模型就像一棟7層樓的建築：\nOSI Model from wiki\n第7層 — 應用層：你直接接觸的應用程式（如瀏覽器、Line） 第6層 — 表現層：資料格式轉換、加密解密 第5層 — 會議層：管理連線的建立和終止 第4層 — 傳輸層：確保資料可靠傳輸（TCP/UDP） 第3層 — 網路層：路由選擇和邏輯定址（IP） 第2層 — 資料鏈路層：相鄰節點間的資料傳輸 第1層 — 實體層：實際的傳輸媒介（網路線、Wi-Fi）\n路由器主要工作在第3層，處理IP位址和路由選擇，但也會涉及第2層的資料轉發。不同的網路技術在這個模型中佔據不同位置，例如CAN主要在第1、2層，提供基礎的區域網路通信，適合汽車內部或小型區域網路使用。\nTCP/IP：現代網路的通用語言 TCP/IP不是單一協議，而是一套協議家族，就像一個大家庭中每個成員各司其職：\nIP（Internet Protocol）：負責邏輯定址和路由選擇\n將資料分割成封包 為每個封包標上目的地址 提供「盡力而為」的傳輸服務 TCP（Transmission Control Protocol）：提供可靠的端對端連接\n確保資料按順序到達 提供錯誤檢測和重傳機制 控制傳輸流量 現代網際網路之所以需要這麼複雜的協議棧，是因為它要解決全球性的通信問題。像CAN這樣的簡單協議雖然在局部環境很有效，但無法處理跨越大洲的資料傳輸挑戰。\n路由的神奇之處：沒有總管的智慧系統 這裡是路由器最令人驚嘆的地方：整個網際網路沒有中央控制者！\n分散式決策系統 每個路由器都是獨立的決策者，就像城市中每個路口的交通號誌。當你要從台中到東京時：\n家用路由器：「這不是我管的範圍，送給ISP處理」 ISP路由器：「目的地是日本，走國際海纜」 國際路由器：「走太平洋海底電纜最快」 日本路由器：「這個IP在東京，往那邊送」 路由器如何「學習」網路狀態？ 路由器就像一群愛八卦的鄰居，不斷交換資訊：\nHello封包機制：\n路由器A: \u0026#34;嗨，我還活著，我連接到192.168.1.0網段\u0026#34; 路由器B: \u0026#34;收到！我連接到10.0.0.0網段\u0026#34; 路由器C: \u0026#34;注意！我到路由器D的連線斷了\u0026#34; 動態路由更新：\n每個路由器維護一張「路由表」 當網路拓撲改變時，自動重新計算最佳路徑 就像GPS導航遇到塞車時自動改路線 實際的資料傳輸過程 讓我們追蹤一下，當你在台中要傳送資料到日本時會發生什麼：\n步驟1：離開你的電腦\n你的電腦(192.168.1.100) → 家用路由器(192.168.1.1) 家用路由器想：「目的地210.152.xxx.xxx不在我的區域，送給ISP」 步驟2：ISP處理\n家用路由器 → 中華電信台中機房 ISP路由器想：「這是日本IP，走國際線路」 步驟3：跨國傳輸\n台中 → 台北國際交換中心 → 海底電纜 → 東京 步驟4：到達目的地\n東京ISP → 目標伺服器所在機房 → 目標伺服器 神奇的是，每個路由器只知道「下一站」該往哪走，不需要知道完整路徑！\n你購買的究竟是什麼？理解ISP服務 很多人在購買網路服務時會有個疑問：我到底是在買什麼？設備嗎？服務嗎？\nISP：你的網路服務提供商 ISP = Internet Service Provider（網際網路服務提供商）\n中華電信、台灣大寬頻、遠傳電信等，它們都是ISP業者。當你跟他們簽約時，你購買的是ISP服務，不是設備。\n你實際購買的服務內容：\n網路連線 — 從你家到Internet的專用通道 頻寬 — 你能使用的網路速度（如100M、300M、1G） IP位址 — 你在網路上的身份證號碼 路由服務 — 幫你的資料找到正確的傳送路徑 ISP在網路架構中就像「網路房東」：\n你的設備 → 你家網路 → ISP網路 → 其他ISP → 目的地 ISP服務 vs 設備採購 常見混淆： 很多人以為跟電信公司買的是「設備」，其實主要是買「服務」。\n實際關係：\nISP服務（必需）：網路連線能力 ← 這是你主要購買的 設備（工具）：數據機、路由器等硬體 ← 這是實現服務的工具 生活化比喻：\n你跟電力公司買「電力服務」，不是買電線 你跟自來水公司買「供水服務」，不是買水管 你跟ISP買「網路服務」，不是買路由器 路由器的硬體實體：從家用到企業級 路由器不是什麼神秘的魔法盒子，它實際上就是一台專門處理網路封包的電腦。\n硬體組成 基本組件：\nCPU：處理路由計算（家用通常是ARM，企業級可能是專用網路處理器） 記憶體：儲存路由表和暫存封包 交換晶片：高速轉發封包的專用硬體 網路介面：各種連接埠（乙太網路、光纖、Wi-Fi） 不同等級的差異：\n家用路由器: ARM處理器 + 幾個乙太網路埠 + Wi-Fi 企業路由器: 多核心CPU + 數十個高速介面 + 大容量記憶體 核心路由器: 專用ASIC + 數百個光纖埠 + TB級處理能力 路由器與5G衛星的關係 現代5G衛星網路讓路由器面臨全新挑戰：\n低軌道衛星的動態特性：\n衛星每90分鐘繞地球一圈 用戶與衛星的連接持續變動 路由表需要即時更新 路由器的應對策略：\n時間T1: 用戶A → 衛星X → 地面站1 時間T2: 用戶A → 衛星Y → 地面站2 (自動切換) 路由器必須智慧地在地面光纖和衛星鏈路之間選擇最佳路徑。\n家用網路設置：數據機與路由器的分工 理解了ISP服務的概念後，讓我們看看家中的網路設備是如何協作的。\n安裝順序很重要 正確連接：\nISP網路 → 數據機 → 路由器 → 你的設備 功能分工：\n數據機：訊號轉換器，將ISP的專用訊號轉換成標準網路訊號 路由器：分享器，將一個網路連接分給多個設備 ISP提供的設備服務 月租費組成：\nISP服務費：網路連線和頻寬（主要費用） 設備租借費：數據機、路由器等硬體（通常另計） 設備選擇：\n租借ISP設備：有技術支援，故障免費更換 自購設備：效能通常更好，長期較省錢 家用網路的最佳配置 一般原則：一台數據機 + 多台路由器\n為什麼只有一台數據機？\n每個家庭只有一條對外網路線 ISP只分配一個對外IP給你家 數據機是唯一的對外出入口 多台路由器的情境：\n大型住宅：不同樓層各一台 Mesh網路：主節點+多個子節點 訊號延伸：覆蓋死角區域 解約時會發生什麼？ 服務終止：\n網路連線立即中斷 無法存取Internet 設備處理：\n租借的數據機要歸還給ISP 自購的設備可以保留（但沒有ISP服務就無法上網） 路由器對網路速度的實際影響 很多人花大錢升級網路速度，卻忽略了家用路由器可能是瓶頸。\n常見的速度限制因素 硬體瓶頸：\nISP提供: 300Mbps光纖 舊路由器實測: 只有50-80Mbps ← 瓶頸在這裡 新路由器實測: 250-290Mbps Wi-Fi標準差異：\nWi-Fi 4 (802.11n): 最高150Mbps Wi-Fi 5 (802.11ac): 最高1.3Gbps Wi-Fi 6 (802.11ax): 最高9.6Gbps 如何判斷路由器是否為瓶頸？ 簡單測試方法：\nISP數據機直連測速：繞過路由器直接測速 有線連接測速：電腦直接接路由器 無線連接測速：同樣位置用Wi-Fi測速 判斷原則：\nISP直連正常，但透過路由器變慢 → 路由器問題 有線快但無線慢 → Wi-Fi功能需升級 整體都慢 → ISP或路由器硬體問題 結語：路由器，網路世界的無名英雄 路由器可能是現代生活中最被低估的設備之一。它們默默地在背景工作，讓我們能夠享受無縫的網路體驗。從你家中的小盒子，到電信商機房中的大型設備，再到連接各大洲的核心路由器，它們組成了一個沒有中央控制、卻能自我組織和修復的智慧網路。\n理解路由器和ISP服務的關係，就像理解現代網路文明的基石。當你知道自己購買的是ISP的專業服務，而路由器是實現這項服務的工具時，你就能：\n選擇合適的ISP和服務方案 理解費用結構 做出明智的設備購買決定 在遇到問題時知道該找誰解決 下次當你順利收到朋友的訊息、看到網頁瞬間載入，或是視訊通話清晰無延遲時，記得感謝這些網路世界的交通管制員。它們用分散式的智慧和不間斷的協作，讓全世界的資訊能夠自由流動，也讓你能夠透過ISP服務連接到這個神奇的全球網路世界。\n***理解路由器，就是理解現代網路文明的基石。***在這個萬物互聯的時代，每個人都應該對這個改變世界的技術有基本的認識。希望這篇文章能幫你揭開路由器神秘的面紗，讓你在享受網路便利的同時，也能欣賞背後精巧的技術藝術。\n","permalink":"https://0Zhen.github.io/posts/2025-06-18/","summary":"\u003cp\u003e當你在家上網、傳訊息給朋友，或是看Netflix時，有沒有想過你的資料是如何穿越複雜的網路世界，最終到達目的地的？這背後的功臣，就是我們今天要介紹的主角 — — \u003cstrong\u003e路由器\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"什麼是路由器網路世界的gps導航員\"\u003e什麼是路由器？網路世界的GPS導航員\u003c/h2\u003e\n\u003cp\u003e想像一下，如果網際網路是一個巨大的城市，那麼路由器就像是每個路口的智慧交通號誌。當你要寄一封電子郵件給遠在日本的朋友時，你的資料就像一輛車，需要經過無數個路口（路由器），每個路口的交通號誌都會告訴你的資料：「要到日本的話，請往這個方向走。」\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*lDeEgqhDWVEJripeYHyggw.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e路由器的核心任務很簡單：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e檢查每個經過的資料封包\u003c/li\u003e\n\u003cli\u003e看看目的地是哪裡\u003c/li\u003e\n\u003cli\u003e決定下一步該往哪個方向送\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e但這個「簡單」的任務，在全球數十億台設備互聯的網路世界中，變得極其複雜和重要。\u003c/p\u003e\n\u003ch2 id=\"為什麼需要路由器不同通信方式的比較\"\u003e為什麼需要路由器？不同通信方式的比較\u003c/h2\u003e\n\u003cp\u003e在現代網際網路出現之前，人們使用過許多不同的通信方式。理解這些差異，能幫我們更好地欣賞路由器的價值。\u003c/p\u003e\n\u003ch2 id=\"簡單網路以can-bus為例\"\u003e簡單網路：以CAN Bus為例\u003c/h2\u003e\n\u003cp\u003e在汽車工業中，有一種叫做CAN（Controller Area Network）的通信系統。CAN就像一輛公車上的乘客對話：當有人在車上大聲說話時，每個人都聽得到，自己決定要不要理會這個訊息。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCAN的特點：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e所有設備都在同一條「巴士」上\u003c/li\u003e\n\u003cli\u003e訊息採用廣播方式，每個設備都會收到\u003c/li\u003e\n\u003cli\u003e主要用於汽車內部或小型區域網路\u003c/li\u003e\n\u003cli\u003e簡單、可靠，但規模受限\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e這種方式在小範圍內很有效，但如果要連接全世界的設備就行不通了。\u003c/p\u003e\n\u003ch2 id=\"為什麼全球網路需要路由器\"\u003e為什麼全球網路需要路由器？\u003c/h2\u003e\n\u003cp\u003e想想看，如果全世界每台電腦都要直接連接到其他電腦會發生什麼？假設有10億台設備，每台都要連到其他設備，那就需要約5000億條連線！這在物理上根本不可能。\u003c/p\u003e\n\u003cp\u003e路由器提供了優雅的解決方案：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e階層式網路架構\u003c/strong\u003e：就像城市道路系統，有主幹道、次要道路、小巷\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e智慧路徑選擇\u003c/strong\u003e：自動找出最佳路徑，避開壅塞或故障路段\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e無限可擴展性\u003c/strong\u003e：可以輕鬆加入新的網路節點\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e路由器網路 vs 廣播網路：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e廣播型網路（如CAN）：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eA\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e所有人都聽到\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eB\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eC\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eD\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e就像在巴士上大聲說話，每個人都聽得到，自己決定要不要理你。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e路由型網路（如Internet）：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eA\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e路由器1\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e路由器2\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e路由器3\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e→\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e就像寄信，郵差要一站一站地轉送，每個郵局都要看地址決定下一步怎麼走。\u003c/p\u003e\n\u003ch2 id=\"osi模型理解網路通信的層次\"\u003eOSI模型：理解網路通信的層次\u003c/h2\u003e\n\u003cp\u003e在討論路由器的具體功能之前，我們需要了解網路通信的基本架構 — — OSI七層模型。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型就像一棟7層樓的建築：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OSI Model from\\u00a0wiki\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*NvDRAgkfWWHnZy7u.jpg\"\u003e\n\u003cem\u003eOSI Model from wiki\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第7層 — 應用層\u003c/strong\u003e：你直接接觸的應用程式（如瀏覽器、Line） \u003cstrong\u003e第6層 — 表現層\u003c/strong\u003e：資料格式轉換、加密解密 \u003cstrong\u003e第5層 — 會議層\u003c/strong\u003e：管理連線的建立和終止 \u003cstrong\u003e第4層 — 傳輸層\u003c/strong\u003e：確保資料可靠傳輸（TCP/UDP） \u003cstrong\u003e第3層 — 網路層\u003c/strong\u003e：路由選擇和邏輯定址（IP） \u003cstrong\u003e第2層 — 資料鏈路層\u003c/strong\u003e：相鄰節點間的資料傳輸 \u003cstrong\u003e第1層 — 實體層\u003c/strong\u003e：實際的傳輸媒介（網路線、Wi-Fi）\u003c/p\u003e","title":"路由器完全指南：從零開始理解網路世界的交通管制員"},{"content":" 如何透過 AI 協助快速建立一個支援多人協作、即時同步的點餐網站\n專案背景：解決真實痛點 相信大家都有過這樣的經驗：公司要訂飲料，負責人在群組裡貼了菜單，然後大家開始接龍，結果…\n接龍接到被別人刪到訂單 忘記打甜度冰塊 知道想喝甚麼，但還要去看菜單多少錢 要接龍的時候，被別人搶先 不知道總共有幾杯，還要慢慢算 即使大家都乖乖地照格式打，還是必須手動整理、算錢，這樣的混亂又麻煩的場面是否很熟悉？身為一個工程師，我決定用技術來解決這個日常問題，減少沒有飲料喝的日子。\n我不會寫網頁所以我用Claude來開發。總共花了3個小時就從構思到部屬完成。\nAI 輔助開發：從想法到實現 第一次對話：需求分析與架構建議 我的需求：\n我想要一個網頁，大家可以點飲料，有很多選項像甜度冰塊那些，然後大家都能看到其他人點了什麼，最後可以統計總金額”\nClaude 的技術建議：\nClaude 主動分析需求並建議了最適合的技術架構：\nGitHub Pages（免費網站託管） Firebase Firestore（即時資料庫） 純前端架構（簡化部署） 第二次對話：成本考量與安全防護 我的關切：\n這樣會不會需要付費？有什麼成本風險？\nClaude 的解決方案：\n詳細的免費額度分析：計算實際使用量 vs 免費限制 成本控制建議：密碼保護限制使用者、用量監控設定 多層防護方案：Firebase 安全規則 + 前端限制 第三次對話：功能優化 持續迭代需求：\n可以加上甜度、冰塊選項嗎？還有加料的價格計算？\nClaude 立即：\n擴展菜單資料結構 實作動態價格計算 優化使用者體驗流程 AI 協作的關鍵優勢：上下文理解 整個開發過程中，Claude 始終記得：\n專案的技術選型原因 之前討論的成本考量 每次功能迭代的背景 用戶體驗的優先級考量 工程師視角的 AI 協作指南 💡 高效的 AI 協作技巧 ✅ 清晰的需求描述：\n❌ 「幫我做個網站」 ✅ 「我想做一個點飲料的網頁，需要有菜單選擇、客製化選項、多人即時協作功能」\n❌ 「加個功能」 ✅ 「我希望加入密碼保護，只有知道密碼的人才能使用系統」\n❌ 「有問題」 ✅ 「我按照步驟設定但出現『permission denied』錯誤，這是 Firebase 規則設定的問題嗎？」\n🎯 善用 AI 在開發流程中的價值： 快速原型開發：從想法到 MVP 的快速實現 技術選型建議：基於需求推薦合適的技術棧 程式碼生成：減少重複性的 boilerplate 代碼 問題診斷：快速定位和解決開發中的問題 5.最佳實踐指導：安全性、效能、維護性的建議 🔄 敏捷的迭代開發流程 第一版：基本功能 → AI 協助生成 MVP 第二版：安全防護 → AI 設計密碼和規則 第三版：體驗優化 → AI 改善 UI/UX 第四版：功能擴展 → AI 實現新需求\n核心優勢：快速迭代，即時反饋，持續改進！\n技術架構：AI 推薦的完美組合 GitHub Pages：免費的靜態網站託管 AI 推薦理由：\n✅ 完全免費：無須任何費用 ✅ 自動部署：Push 代碼即自動更新 ✅ HTTPS 支援：內建 SSL 憑證 ✅ 對新手友善：網頁介面操作，無需命令行 Firebase Firestore：即時資料庫 AI 推薦理由：\n✅ 即時同步：多人協作無衝突 ✅ 慷慨的免費額度：日常使用綽綽有餘 ✅ NoSQL 靈活性：無需預先定義表結構 ✅ 內建安全規則：AI 可以幫忙設計規則 純前端架構：簡化部署流程 AI 推薦理由：\n✅ 無需後端：降低架構複雜度 ✅ 易於維護：單一 HTML 檔案 ✅ 快速迭代：修改即時生效 ✅ AI 友善：適合 AI 生成和修改 核心功能實現：AI 輔助的完整解決方案 以下展示 Claude AI 如何協助快速實現複雜功能\n🔐 密碼保護系統 // AI 建議的安全防護方案 const SYSTEM_PASSWORD = \u0026#39;tea2025\u0026#39;; function checkPassword() { if (inputPassword === SYSTEM_PASSWORD) { localStorage.setItem(\u0026#39;teaOrderAuth\u0026#39;, \u0026#39;true\u0026#39;); showMainPage(); } } 設計背景： 基於成本控制的考量，Claude 建議加入密碼保護：\n限制使用者範圍，控制 Firebase 用量 LocalStorage 記住登入狀態，優化體驗 可隨時修改密碼重新部署 提供了多種安全等級供選擇 🧋 完整的點餐流程 const menuData = { \u0026#34;原萃小茶館\u0026#34;: { \u0026#34;夜韻紅茶\u0026#34;: 35, \u0026#34;金萱蜜香紅茶\u0026#34;: 35, // … 更多品項 }, // … 更多分類 }; 功能亮點：\n分類式菜單結構，易於管理 甜度、冰塊、加料客製化選項 自動價格計算（基本價 + 加料費） 即時表單驗證 ⚡ 即時資料同步 // Firebase 即時監聽 const q = query(ordersRef, orderBy(\u0026#39;timestamp\u0026#39;, \u0026#39;desc\u0026#39;)); unsubscribe = onSnapshot(q, (querySnapshot) =\u0026gt; { const orders = []; querySnapshot.forEach((doc) =\u0026gt; { orders.push({ id: doc.id, …doc.data() }); }); updateOrderTable(orders); }); 技術重點： 使用 onSnapshot 實現即時更新 任何人新增訂單，所有人立即看到 自動處理網路中斷重連 Firebase 安全規則：平衡安全與易用 rules_version = \u0026#39;2\u0026#39;; service cloud.firestore { match /databases/{database}/documents { match /orders/{orderId} { // 營業時間限制 allow read: if isWithinBusinessHours(); // 資料驗證 allow create: if isWithinBusinessHours() \u0026amp;\u0026amp; isValidOrder(request.resource.data); allow delete: if isWithinBusinessHours(); allow update: if false; // 不允許修改 } function isWithinBusinessHours() { let hour = request.time.hours() + 8; // UTC+8 return hour \u0026gt;= 9 \u0026amp;\u0026amp; hour \u0026lt;= 22; } function isValidOrder(data) { return data.customerName is string \u0026amp;\u0026amp; data.quantity \u0026lt;= 10 \u0026amp;\u0026amp; data.subtotal \u0026lt;= 500; } } } 安全考量： 營業時間限制（9:00–22:00） 資料格式驗證 數量與金額合理性檢查 禁止修改已提交訂單 部署流程：跟著 AI 一步步完成 我的實際操作經驗\nStep 1: 建立 GitHub Repository 我的困惑：「GitHub 是什麼？怎麼用？」Claude 的指導：\n前往 GitHub.com 註冊帳號 點擊 “New repository” 命名：tea-order-system 設定為 Public（重要！） 點擊 “Create repository” **結果：**5 分鐘完成，比想像中簡單！\nStep 2: 上傳程式碼 我的困惑：「程式碼怎麼上傳？」Claude 的指導：\n複製 AI 生成的完整程式碼 貼到記事本，儲存為 index.html 在 GitHub 點擊 “uploading an existing file” 拖曳檔案上傳 結果：3 分鐘完成，完全不需要命令行！\nStep 3: 啟用 GitHub Pages 我的困惑：「網站怎麼上線？」 Claude 的指導：\nSettings → Pages → Source: Deploy from a branch Branch: main → Save 等待 2–3 分鐘即可訪問\n結果：網址自動生成 [https://myusername.github.io/tea-order-system](https://myusername.github.io/tea-order-system`)\nStep 4: Firebase 設定 我的困惑：「Firebase 設定看起來很複雜…」 Claude 的解決方案：\n提供了詳細的圖文教學 自動生成 Firebase 設定代碼 甚至幫我寫好了安全規則 總耗時：第一次設定 30 分鐘，之後更新只需 1 分鐘！\n實際使用體驗 使用者角度 簡單登入：輸入密碼即可使用 直觀操作：選分類 → 選品項 → 客製化 → 確認 即時反饋：看到其他人的訂單即時出現 手機友善：響應式設計，手機使用無障礙 管理者角度 即時監控：統計面板顯示訂單數量、金額 一鍵匯出：CSV 格式，方便後續處理 靈活管理：可刪除錯誤訂單、清空重來 成本分析：真的完全免費嗎？ GitHub Pages 費用：$0 限制：100GB 流量/月，100GB 儲存空間 評估：對於內部使用綽綽有餘 Firebase Firestore 免費額度： — 50,000 次讀取/天 — 20,000 次寫入/天 — 1GB 儲存空間 實際用量（50人團隊）： — 讀取：~500 次/天 — 寫入：~50 次/天 — 儲存：~10KB 評估：完全在免費範圍內 遇到的挑戰與 AI 協助解決 挑戰 1：Firebase 權限錯誤 問題描述：「出現 permission-denied 錯誤」\n提供給 Claude 的資訊：錯誤截圖 + 具體操作步驟\nClaude 的診斷與解決：\n這是 Firebase 安全規則的問題，原因是\u0026hellip; 建議的解決方案：\n前往 Firebase Console → 規則 替換為以下規則：[提供具體程式碼] 點擊發佈 挑戰 2：成本控制需求 我的考量：「Firebase 的用量計費讓我有點擔心」\nClaude 的回應：\n詳細分析免費額度 vs 預期使用量 設計多層防護機制（密碼 + 安全規則） 提供用量監控和預算警告設定方法 結果：完整的成本控制策略 AI 協作的技術優勢 傳統除錯流程： 發現問題 → Google 搜尋 → 閱讀文檔 → 嘗試解決 → 測試驗證\nAI 協助流程： 描述問題 → AI 分析診斷 → 提供解決方案 → 直接實施\n效率提升：問題解決速度提升 5-10 倍\n專案成果：AI 協作的開發效率 開發時間分析\n傳統獨立開發預估：\n技術選型研究：2-4 小時 架構設計：2-3 小時 前端開發：8-12 小時 Firebase 整合：3-5 小時 安全規則設計：2-4 小時 測試與除錯：4-6 小時 總計：21-34 小時 AI 協作實際：\n需求討論與架構設計：30 分鐘 AI 程式碼生成與調整：1.5 小時 部署與設定：1 小時 功能測試與優化：30 分鐘 總計：3 小時 給非技術人員的 AI 開發建議 💡 與 AI 協作的黃金原則\n1. 詳細描述需求\n❌ 「做個網站」 ✅ 「我想做一個內部點飲料的系統，需要有密碼保護、即時同步、手機友善，大概40人使用」\n2. 提供具體的使用場景\n✅ 「我們公司每週五會集體訂飲料，之前都在LINE群組統計很麻煩，希望有個系統可以讓大家直接選擇，最後自動統計總金額和數量」\n3. 不要害怕問細節\n✅ 「你剛剚提到 Firebase，可以詳細解釋一下是什麼嗎？」 ✅ 「這個步驟我不太懂，可以更詳細一點嗎？」 ✅ 「有沒有更簡單的方法？」\n4. 及時反饋問題\n✅ 貼出錯誤截圖 ✅ 描述具體的操作步驟 ✅ 說明期望的結果 vs 實際結果\n🚀 AI 開發的未來可能性 這次經驗讓我看到，AI 正在降低技術門檻：\n人人都能是創造者：想到就做，執行力跟想法比擁有技術更重要 快速原型驗證：幾小時內從想法到產品 持續迭代改進：隨時提出新需求，AI 立即實現 學習成本極低：邊做邊學，無需預先投資 📈 適合 AI 輔助開發的專案類型 ✅ 高度適合：\n內部工具（如點餐系統、投票系統） 個人專案（如記帳、待辦清單） 原型驗證（快速測試想法） 靜態網站（如作: 結語：AI 協作的工程實踐) 三個重要體悟： AI 加速了從想法到實現的過程：讓我們能更快驗證技術方案 人機協作創造了新的開發模式：AI 負責執行，人類負責決策和創意 工程師的價值在於系統思維：技術實現變簡單了，架構設計變更重要 對工程實踐的啟發 短期影響：\n提高開發效率，縮短產品迭代週期 降低重複性工作，增加創新時間 改善代碼品質，減少低級錯誤 長期趨勢：\n工程師角色從「實現者」轉向「設計者」 跨領域協作變得更加重要 持續學習和適應能力成為核心競爭力 最重要的是，這個專案讓訂飲料變得不再那麼麻煩。看到同事們不再為統計訂單而嫌麻煩時，那種成就感提醒我：技術的價值始終在於解決真實問題，讓生活變得更美好。\n在 AI 時代，我們有了更強大的工具，但工程師的本質沒有改變：用技術創造價值，用代碼改變世界。\n網頁截圖\n2025/6/5上線後的Firebase使用量\n","permalink":"https://0Zhen.github.io/posts/claude-ai-github-firebase/","summary":"\u003cblockquote\u003e\n\u003cp\u003e如何透過 AI 協助快速建立一個支援多人協作、即時同步的點餐網站\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"專案背景解決真實痛點\"\u003e專案背景：解決真實痛點\u003c/h2\u003e\n\u003cp\u003e相信大家都有過這樣的經驗：公司要訂飲料，負責人在群組裡貼了菜單，然後大家開始接龍，結果…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e接龍接到被別人刪到訂單\u003c/li\u003e\n\u003cli\u003e忘記打甜度冰塊\u003c/li\u003e\n\u003cli\u003e知道想喝甚麼，但還要去看菜單多少錢\u003c/li\u003e\n\u003cli\u003e要接龍的時候，被別人搶先\u003c/li\u003e\n\u003cli\u003e不知道總共有幾杯，還要慢慢算\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e即使大家都乖乖地照格式打，還是必須手動整理、算錢，這樣的混亂又麻煩的場面是否很熟悉？身為一個工程師，我決定用技術來解決這個日常問題，減少沒有飲料喝的日子。\u003c/p\u003e\n\u003cp\u003e我不會寫網頁所以我用Claude來開發。總共花了3個小時就從構思到部屬完成。\u003c/p\u003e\n\u003ch2 id=\"ai-輔助開發從想法到實現\"\u003eAI 輔助開發：從想法到實現\u003c/h2\u003e\n\u003ch3 id=\"第一次對話需求分析與架構建議\"\u003e第一次對話：需求分析與架構建議\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e我的需求\u003c/em\u003e：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我想要一個網頁，大家可以點飲料，有很多選項像甜度冰塊那些，然後大家都能看到其他人點了什麼，最後可以統計總金額”\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eClaude 的技術建議：\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eClaude 主動分析需求並建議了最適合的技術架構：\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub Pages（免費網站託管）\u003c/li\u003e\n\u003cli\u003eFirebase Firestore（即時資料庫）\u003c/li\u003e\n\u003cli\u003e純前端架構（簡化部署）\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"第二次對話成本考量與安全防護\"\u003e第二次對話：成本考量與安全防護\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e我的關切：\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e這樣會不會需要付費？有什麼成本風險？\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eClaude 的解決方案：\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e詳細的免費額度分析\u003c/strong\u003e：計算實際使用量 vs 免費限制\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e成本控制建議\u003c/strong\u003e：密碼保護限制使用者、用量監控設定\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e多層防護方案\u003c/strong\u003e：Firebase 安全規則 + 前端限制\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"第三次對話功能優化\"\u003e第三次對話：功能優化\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e持續迭代需求：\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e可以加上甜度、冰塊選項嗎？還有加料的價格計算？\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eClaude 立即：\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e擴展菜單資料結構\u003c/li\u003e\n\u003cli\u003e實作動態價格計算\u003c/li\u003e\n\u003cli\u003e優化使用者體驗流程\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ai-協作的關鍵優勢上下文理解\"\u003eAI 協作的關鍵優勢：上下文理解\u003c/h3\u003e\n\u003cp\u003e整個開發過程中，Claude 始終記得：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e專案的技術選型原因\u003c/li\u003e\n\u003cli\u003e之前討論的成本考量\u003c/li\u003e\n\u003cli\u003e每次功能迭代的背景\u003c/li\u003e\n\u003cli\u003e用戶體驗的優先級考量\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"工程師視角的-ai協作指南\"\u003e工程師視角的 AI 協作指南\u003c/h2\u003e\n\u003ch3 id=\"-高效的-ai協作技巧\"\u003e💡 高效的 AI 協作技巧\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e✅ 清晰的需求描述：\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e❌ 「幫我做個網站」\n✅ 「我想做一個點飲料的網頁，需要有菜單選擇、客製化選項、多人即時協作功能」\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e❌ 「加個功能」 \n✅ 「我希望加入密碼保護，只有知道密碼的人才能使用系統」\u003c/p\u003e","title":"🧋 不會寫程式? 用 Claude AI + GitHub + Firebase 打造即時茶飲點餐系統"},{"content":"\n在忙碌的日常生活中，我們常常需要重複執行一些瑣碎的電腦操作，例如定期備份、然後資料同步等等。其實，Windows內建的工作排程器可以幫我們自動完成這些任務！無論您是學生、上班族，還是家庭用戶，這個簡單易用的工具都能讓您的電腦變得更加智能，為您省下寶貴的時間。\n本文將介紹10個簡單實用的Windows工作排程器應用方案，這些都不需要複雜的技術知識，只要按照步驟操作，就能讓您的日常電腦使用更加輕鬆便利。\n1. 定時開啟日常應用程式 早上開機後，是否需要手動開啟郵件、行事曆和瀏覽器查看新聞？使用工作排程器，您可以一次性自動啟動所有常用程式：\n@echo off echo 自動啟動日常應用程式 - %date% %time% start \u0026#34;\u0026#34; \u0026#34;C:\\Program Files\\Mozilla Firefox\\firefox.exe\u0026#34; \u0026#34;https://news.google.com\u0026#34; timeout /t 3 start \u0026#34;\u0026#34; \u0026#34;C:\\Program Files\\Microsoft Office\\root\\Office16\\OUTLOOK.EXE\u0026#34; start \u0026#34;\u0026#34; \u0026#34;C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE\u0026#34; 將這個指令碼保存為morning_routine.bat，設定在每天早上電腦開機後5分鐘自動執行，讓您的工作日有個輕鬆的開始。\n2. 定時自動更新GitHub個人資料庫 想要維護個人的GitHub資料庫，但經常忘記提交變更？設定一個自動提交的工作：\n@echo off echo 開始自動更新GitHub資料庫 - %date% %time% cd /d C:\\Users\\您的用戶名\\Documents\\我的筆記資料庫 echo 更新今日日期到日誌文件... echo 上次更新：%date% %time% \u0026gt; update_log.txt git add . git commit -m \u0026#34;自動更新：%date%\u0026#34; git push origin main echo GitHub資料庫已成功更新！ 將此指令碼設定為每天晚上10點自動執行，即使您忘記手動提交，您的筆記、日記或學習資料也會定時更新到GitHub，保持資料庫的活躍度，也為您的貢獻圖(Contribution Graph)增添綠色方塊。這對於維護個人知識庫、學習筆記或開源項目特別有用。\n3. 自動備份重要照片和文件 害怕突然電腦故障而丟失珍貴家庭照片和重要文件？這個簡單的指令碼能幫您定期備份到外接硬碟：\n@echo off echo 開始備份家庭照片和重要文件 - %date% %time% xcopy \u0026#34;C:\\Users\\您的用戶名\\Pictures\\家庭照片\u0026#34; \u0026#34;E:\\備份\\家庭照片\u0026#34; /D /E /Y /I xcopy \u0026#34;C:\\Users\\您的用戶名\\Documents\\重要文件\u0026#34; \u0026#34;E:\\備份\\重要文件\u0026#34; /D /E /Y /I echo 備份完成！ 設定每週六晚上自動執行，您的珍貴回憶和重要文件就有了額外的保障，不必擔心意外丟失。\n4. 定時網路連線檢查與提醒 在家工作或上網課時，擔心突然網路斷線而錯過重要會議或課程？這個簡單的檢查工具能及時提醒您：\n@echo off echo 檢查網路連線中... ping -n 3 www.google.com \u0026gt;nul if errorlevel 1 ( msg * 警告：您的網路連線似乎有問題！請檢查您的WiFi連線或網路線。 ) else ( echo 網路連線正常。 ) 設定每30分鐘執行一次，在網路出現問題時及時收到提醒，避免錯過重要的線上活動。\n5. 定時播放音樂或提醒休息 長時間使用電腦工作或學習，容易忘記休息？設定一個定時播放音樂或提醒休息的工作：\n@echo off echo 已工作1小時，該休息一下了！ msg * 已連續使用電腦1小時，建議您站起來活動5分鐘，讓眼睛休息一下。 start wmplayer \u0026#34;C:\\Users\\您的用戶名\\Music\\輕鬆音樂.mp3\u0026#34; /play /close 設定每隔1小時執行一次，提醒您適時休息，保護視力和身體健康。也可以在固定時間播放喜愛的音樂，讓工作或學習更加愉快。\n6. 自動整理下載資料夾 下載資料夾總是亂七八糟？設定一個自動整理下載資料夾的任務：\n@echo off echo 開始整理下載資料夾... md \u0026#34;C:\\Users\\您的用戶名\\Downloads\\文件\u0026#34; 2\u0026gt;nul md \u0026#34;C:\\Users\\您的用戶名\\Downloads\\圖片\u0026#34; 2\u0026gt;nul md \u0026#34;C:\\Users\\您的用戶名\\Downloads\\音樂\u0026#34; 2\u0026gt;nul md \u0026#34;C:\\Users\\您的用戶名\\Downloads\\視頻\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.pdf\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\文件\\\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.docx\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\文件\\\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.jpg\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\圖片\\\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.png\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\圖片\\\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.mp3\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\音樂\\\u0026#34; 2\u0026gt;nul move \u0026#34;C:\\Users\\您的用戶名\\Downloads\\*.mp4\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Downloads\\視頻\\\u0026#34; 2\u0026gt;nul echo 下載資料夾整理完成！ 設定每週五晚上自動執行，讓您的下載資料夾始終保持整潔有序。\n7. 開機自動運行常用檔案 想開機就自動打開您的課表、讀書清單或工作計畫表？這個簡單的設定能滿足您的需求：\n@echo off echo 開機自動開啟重要檔案 start \u0026#34;\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Documents\\2025年度計畫.xlsx\u0026#34; start \u0026#34;\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Documents\\每日待辦事項.docx\u0026#34; start \u0026#34;\u0026#34; \u0026#34;C:\\Users\\您的用戶名\\Documents\\學習筆記.pdf\u0026#34; 將此指令碼設定為「在使用者登入時」觸發，您每次開機登入後，就能立即看到這些重要文件，不必在檔案總管中尋找。\n8. 定時顯示今日天氣與待辦事項 每天早上開機後，想立即看到今天的天氣和待辦事項？使用這個簡單的提醒指令碼：\n@echo off echo ================================================ echo 今日提醒 - %date% echo ================================================ echo. echo 打開天氣網頁... start \u0026#34;\u0026#34; \u0026#34;https://www.weather.com/zh-TW/weather/today/\u0026#34; echo. echo 今日待辦事項： echo 1. 9:30 線上會議 echo 2. 12:00 午餐約會 echo 3. 15:00 繳交電費 echo 4. 18:00 購買晚餐食材 echo. msg * \u0026#34;別忘了今天15:00要繳交電費！\u0026#34; 您可以每天手動更新待辦事項列表，並設定在每天早上電腦開機後自動執行。\n9. 定時清理暫存檔案釋放空間 電腦運行變慢？自動清理暫存檔案可以幫您釋放空間並提升系統效能：\n@echo off echo 開始清理暫存檔案 - %date% %time% echo 清理Windows暫存檔案... del /q /f /s %temp%\\*.* del /q /f /s C:\\Windows\\Temp\\*.* echo 清理瀏覽器暫存檔案... del /q /f /s \u0026#34;C:\\Users\\您的用戶名\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cache\\*.*\u0026#34; del /q /f /s \u0026#34;C:\\Users\\您的用戶名\\AppData\\Local\\Microsoft\\Edge\\User Data\\Default\\Cache\\*.*\u0026#34; echo 清理已完成！您的系統現在應該更加流暢了。 設定每週一次自動執行，讓您的電腦保持最佳狀態，不必擔心暫存檔案佔用寶貴的硬碟空間。\n10. 定時關機提醒與自動關機 常常熬夜使用電腦而忘記休息？設定一個貼心的關機提醒和自動關機功能：\n@echo off echo 已經晚上11點了，該休息了！電腦將在30分鐘後自動關機。 echo 如需取消自動關機，請運行「shutdown -a」指令。 msg * 已經晚上11點了，該休息了！電腦將在30分鐘後自動關機。 shutdown -s -t 1800 -c \u0026#34;電腦將在30分鐘後自動關機，請記得保存您的工作。\u0026#34; 將此指令碼設定在每晚11:00執行，幫助您養成良好的作息習慣，同時也能節省電力。\n開始使用Windows工作排程器（圖文教學） 讓我們以「定時開啟日常應用程式」為例，教您如何設置工作排程：\n按下Win + R鍵，輸入taskschd.msc並按回車打開工作排程器 在右側面板點擊「建立基本工作」 輸入工作名稱，例如「早上自動開啟應用程式」，然後點擊「下一步」 選擇「每天」，然後點擊「下一步」 設定開始時間，例如「早上8:30」，然後點擊「下一步」 選擇「啟動程式」作為動作，然後點擊「下一步」 點擊「瀏覽」，選擇您已創建的.bat檔案（例如 morning_routine.bat） 點擊「下一步」，然後點擊「完成」 恭喜！您已成功設置了您的第一個自動化任務。電腦將在每天早上8:30自動為您開啟所需的應用程式。\n結語：讓電腦成為您的智能助理 Windows工作排程器雖然看似簡單，但卻能為您的日常生活帶來極大便利。透過本文介紹的10種簡單實用的自動化方案，您已經可以讓電腦自動執行各種任務，從而節省時間、提高效率、減少重複勞動。\n這些方案不需要復雜的編程知識，只要按照步驟設置，就能讓您的電腦變成一個貼心的智能助理：準時提醒您、自動整理檔案、保護您的資料安全、幫助您養成良好習慣。\n開始嘗試這些簡單的自動化設定吧，您會驚訝於這個被忽視的工具能為您帶來多少便利！\n","permalink":"https://0Zhen.github.io/posts/windows-10/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*MxfZyovc51d5Dc8pcqfxYw.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在忙碌的日常生活中，我們常常需要重複執行一些瑣碎的電腦操作，例如定期備份、然後資料同步等等。其實，Windows內建的工作排程器可以幫我們自動完成這些任務！無論您是學生、上班族，還是家庭用戶，這個簡單易用的工具都能讓您的電腦變得更加智能，為您省下寶貴的時間。\u003c/p\u003e\n\u003cp\u003e本文將介紹10個簡單實用的Windows工作排程器應用方案，這些都不需要複雜的技術知識，只要按照步驟操作，就能讓您的日常電腦使用更加輕鬆便利。\u003c/p\u003e\n\u003ch2 id=\"1-定時開啟日常應用程式\"\u003e1. 定時開啟日常應用程式\u003c/h2\u003e\n\u003cp\u003e早上開機後，是否需要手動開啟郵件、行事曆和瀏覽器查看新聞？使用工作排程器，您可以一次性自動啟動所有常用程式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e@\u003c/span\u003eecho \u003cspan style=\"color:#66d9ef\"\u003eoff\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e自動啟動日常應用程式\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003edate\u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003etime\u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003estart\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;C:\\Program Files\\Mozilla Firefox\\firefox.exe\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;https://news.google.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etimeout \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003et \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003estart\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;C:\\Program Files\\Microsoft Office\\root\\Office16\\OUTLOOK.EXE\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003estart\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e將這個指令碼保存為morning_routine.bat，設定在每天早上電腦開機後5分鐘自動執行，讓您的工作日有個輕鬆的開始。\u003c/p\u003e\n\u003ch2 id=\"2-定時自動更新github個人資料庫\"\u003e2. 定時自動更新GitHub個人資料庫\u003c/h2\u003e\n\u003cp\u003e想要維護個人的GitHub資料庫，但經常忘記提交變更？設定一個自動提交的工作：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e@echo off\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho 開始自動更新GitHub資料庫 - %date% %time%\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd /d C:\u003cspan style=\"color:#ae81ff\"\u003e\\U\u003c/span\u003esers\u003cspan style=\"color:#ae81ff\"\u003e\\您\u003c/span\u003e的用戶名\u003cspan style=\"color:#ae81ff\"\u003e\\D\u003c/span\u003eocuments\u003cspan style=\"color:#ae81ff\"\u003e\\我\u003c/span\u003e的筆記資料庫\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho 更新今日日期到日誌文件...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho 上次更新：%date% %time% \u0026gt; update_log.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit add .\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit commit -m \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;自動更新：%date%\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit push origin main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho GitHub資料庫已成功更新！\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e將此指令碼設定為每天晚上10點自動執行，即使您忘記手動提交，您的筆記、日記或學習資料也會定時更新到GitHub，保持資料庫的活躍度，也為您的貢獻圖(Contribution Graph)增添綠色方塊。這對於維護個人知識庫、學習筆記或開源項目特別有用。\u003c/p\u003e\n\u003ch2 id=\"3-自動備份重要照片和文件\"\u003e3. 自動備份重要照片和文件\u003c/h2\u003e\n\u003cp\u003e害怕突然電腦故障而丟失珍貴家庭照片和重要文件？這個簡單的指令碼能幫您定期備份到外接硬碟：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e@echo off\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho 開始備份家庭照片和重要文件 - %date% %time%\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003excopy \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;C:\\Users\\您的用戶名\\Pictures\\家庭照片\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;E:\\備份\\家庭照片\u0026#34;\u003c/span\u003e /D /E /Y /I\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003excopy \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;C:\\Users\\您的用戶名\\Documents\\重要文件\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;E:\\備份\\重要文件\u0026#34;\u003c/span\u003e /D /E /Y /I\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho 備份完成！\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e設定每週六晚上自動執行，您的珍貴回憶和重要文件就有了額外的保障，不必擔心意外丟失。\u003c/p\u003e","title":"Windows工作排程器：10種提升日常效率的實用自動化方案"},{"content":"本文是我在研究電磁兼容性測試時，通過蒐集相關資料後整理而成的內容。希望能為對這一領域感興趣的讀者提供一個通俗易懂的入門指南。\n在我們日常使用的電子產品世界中，有一個看不見的戰場正在進行：電磁兼容性的挑戰。從智能手機到電動自行車，每一個電子設備都必須在充滿電磁干擾的環境中和平共處。本文將帶您深入了解電磁兼容性測試的核心概念，特別聚焦於靜電放電(ESD)和電磁兼容性(EMC)測試，揭示這些看不見但卻至關重要的技術保障。\n靜電放電(ESD)：看不見的威脅 想像一個寒冷乾燥的冬日，你穿著合成纖維外套騎著電動自行車。在這樣的環境中，靜電特別容易產生：乾燥的空氣讓電荷不容易自然流走，而你的身體與合成纖維外套之間的摩擦則不斷產生電荷。這個過程中，電子從一個表面移動到另一個表面，就像是小小的電子在你身體和衣物間跳來跳去。因為合成纖維外套不導電，這些電荷無法立即消失，而是在你身體上慢慢堆積起來。當你騎行時，你的身體與座椅、衣物之間的持續摩擦讓更多電荷累積。當你下車時，手指輕觸控制面板 — 瞬間，這些堆積在你身體上的電荷找到了一條通向地面的路，一個小小的火花閃過，伴隨著幾千伏的電壓釋放，自行車的顯示螢幕突然黑屏。這就是靜電放電(ESD)現象，它可能在毫無預警的情況下讓電子設備突然失靈。\n為什麼ESD測試如此重要？ 靜電放電測試正是為了模擬並防範這樣的情況。對於電動助力自行車(EPAC)等產品，EN 15194標準要求進行嚴格的ESD測試，確保產品能夠在面對日常生活中可能遇到的靜電干擾時保持穩定工作。\n靜電的神秘物理學 人體靜電電壓可輕易達到數千伏，這個數字聽起來驚人，但為什麼它不會對我們造成致命傷害？答案與電荷、電壓和電容的微妙關係有關。\n人體對地的電容非常小，約為100–200皮法拉(pF)。作為參考，1皮法拉僅為10^-12法拉，是一個極其微小的數值。根據電容公式：\nV = Q/C\n其中V是電壓(伏特)，Q是電荷量(庫侖)，C是電容(法拉)。\n這個公式清楚地表明，相同電荷量下，電容越小，電壓越高。這解釋了為什麼人體能夠積累如此高的電壓，而實際上儲存的能量和產生的電流卻很有限，不足以造成嚴重傷害。即使人體帶有數千伏的靜電，由於電容極小，實際儲存的總能量(E = 1/2 × C × V²)仍然很低，通常只有幾毫焦耳，遠低於對人體造成傷害的閾值。\n電磁兼容性(EMC)：電子設備的和平共處之道 電磁兼容性測試關注的是更廣泛的電磁干擾問題，它評估兩個關鍵方面：\n設備自身產生的干擾（輻射和傳導干擾） 設備抵抗外部干擾的能力（電磁抗干擾性） 這兩方面共同確保電子設備能在複雜的電磁環境中正常運作，不受干擾也不干擾他人。\n電磁輻射的物理原理 電磁輻射聽起來很複雜，但我們可以用日常生活的例子來理解。想像一顆石頭丟進平靜的湖面 — 水波會向四周擴散。電磁輻射也是類似的原理，只不過「丟石頭」的是電子，「波紋」則是電磁波。\n每當電子在導體中移動、加速或改變方向，就像是在湖面丟了石頭，會產生向外擴散的電磁波。在我們的電子設備中，這種情況無處不在：每次手機處理器運算、每次電動自行車的馬達轉動，都有無數電子在移動，產生各種各樣的電磁波。\n這些電磁波由兩部分組成：電場（就像靜電產生的力）和磁場（就像磁鐵產生的力）。在靠近電子設備的地方（近場），這兩種力可能不均衡，有點像剛丟下石頭的湖面，波紋還很混亂。而在離設備較遠的地方（遠場），它們會形成穩定的電磁波向外傳播，就像湖面上逐漸擴散開的整齊波紋。\n這種區別對EMC測試很重要，因為我們需要使用不同的方法和工具來測量近處和遠處的電磁干擾，確保我們的設備既不會干擾他人，也不會被外界干擾。\nEMI測量方法的科學基礎 電磁干擾(EMI)的測量是一個精密的過程，涉及多種檢測模式，每種模式都能反映干擾的不同特性：\nPeak vs. Average vs. Quasi-peak：不同的觀察視角 EMI測量通常使用三種不同的檢測模式，每種都反映干擾的不同特性：\nPeak(峰值)檢測捕捉瞬態干擾和尖峰，相當於捕捉風暴中的閃電。它顯示的是最壞情況下的干擾水平，通常用於快速初步測試。 Average(平均值)檢測反映持續性干擾的平均強度，相當於測量長時間的雨量。它更能代表干擾對通訊系統的實際影響。 Quasi-peak(準峰值)檢測是介於峰值和平均值之間的一種測量方式，它同時考慮干擾的強度和頻率。Quasi-peak檢測器對短時間干擾的反應較弱，但對重複發生的干擾反應較強，類似於人耳對噪音的感知方式 — 偶爾的噪音不太惱人，但重複的噪音即使強度較低也會讓人煩躁。 這三種檢測模式各有其應用場景。快速識別問題時，Peak檢測最為有效；評估對廣播等傳統通訊系統的實際影響時，Quasi-peak檢測更為相關；而在評估對數字通訊系統的影響時，Average檢測則提供更有價值的信息。\n水平與垂直測量：全方位捕捉 電磁波具有極化特性，就像光波在不同方向振動一樣。想像一下，陽光中的光波是朝各個方向振動的，但當它通過偏振片（例如某些太陽眼鏡鏡片或偏光濾鏡）時，只有特定方向振動的光波能夠通過。偏振片就像一個柵欄，只允許與柵欄方向平行的光波通過，而阻擋其他方向的光波。\n同樣地，電磁波也有不同的振動方向，為了全方位捕捉可能的輻射，EMI測試必須同時進行水平和垂直兩種極化方向的測量。\n這就像在黑暗中搜尋一個反光物體 — 你需要從不同角度照射光線，才能確保不會錯過它。這種全方位的測量方法確保了測試結果的全面性和可靠性。\n解讀EMI測量單位 EMI測量涉及多個專業單位，它們共同構成了完整的測量體系：\nReading (dBµV) — 接收器直接讀取的原始電壓值 Antenna Factor (dB/m) — 將接收電壓轉換為電場強度的校正因子 測量值 (dBµV/m) — 最終的電場強度，是評估EMI輻射符合性的實際指標 這些單位的轉換關係是： 電場強度(dBµV/m) = 接收器讀數(dBµV) + 天線因子(dB/m) + 其他校正因子\n理解這些單位及其轉換關係，是專業EMC測試人員必備的知識。\n專業測試機構的關鍵角色 像SGS這樣的專業測試機構扮演著確保產品電磁兼容性的關鍵角色。他們通過嚴格的標準化測試流程、專業的設備和嚴謹的測試方法，確保測試結果的準確性和可重複性。\n測試過程中，設備需要在各種工作模式下進行測試，並且會從多個角度進行輻射測量，以確保捕捉到最大可能的輻射值。這種全面而嚴謹的測試方法，是產品獲得市場認可的重要保障。\n結論：看不見的保護者 電磁兼容性測試，無論是ESD還是EMC，都在默默保護著我們的電子設備和系統。它們確保了我們的設備能夠在日益複雜的電磁環境中可靠工作，減少了因電磁干擾導致的設備故障和安全風險。\n隨著電子設備變得更加複雜和普及，電磁兼容性的重要性只會增加。理解這些測試的原理和方法，不僅有助於設計更好的產品，也能幫助我們更好地理解和使用這些產品。\n在這個數字化時代，電磁兼容性測試是電子產品質量和安全的重要保障，也是技術進步的無形推動力。我們日常使用的每一個電子設備，都經過了這些嚴格的測試，確保它們能在複雜的電磁環境中正常工作，為我們的數字生活提供可靠的基礎。\n","permalink":"https://0Zhen.github.io/posts/esd-emc/","summary":"\u003cp\u003e\u003cem\u003e本文是我在研究電磁兼容性測試時，通過蒐集相關資料後整理而成的內容。希望能為對這一領域感興趣的讀者提供一個通俗易懂的入門指南。\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e在我們日常使用的電子產品世界中，有一個看不見的戰場正在進行：電磁兼容性的挑戰。從智能手機到電動自行車，每一個電子設備都必須在充滿電磁干擾的環境中和平共處。本文將帶您深入了解電磁兼容性測試的核心概念，特別聚焦於靜電放電(ESD)和電磁兼容性(EMC)測試，揭示這些看不見但卻至關重要的技術保障。\u003c/p\u003e\n\u003ch2 id=\"靜電放電esd看不見的威脅\"\u003e靜電放電(ESD)：看不見的威脅\u003c/h2\u003e\n\u003cp\u003e想像一個寒冷乾燥的冬日，你穿著合成纖維外套騎著電動自行車。在這樣的環境中，靜電特別容易產生：乾燥的空氣讓電荷不容易自然流走，而你的身體與合成纖維外套之間的摩擦則不斷產生電荷。這個過程中，電子從一個表面移動到另一個表面，就像是小小的電子在你身體和衣物間跳來跳去。因為合成纖維外套不導電，這些電荷無法立即消失，而是在你身體上慢慢堆積起來。當你騎行時，你的身體與座椅、衣物之間的持續摩擦讓更多電荷累積。當你下車時，手指輕觸控制面板 — 瞬間，這些堆積在你身體上的電荷找到了一條通向地面的路，一個小小的火花閃過，伴隨著幾千伏的電壓釋放，自行車的顯示螢幕突然黑屏。這就是靜電放電(ESD)現象，它可能在毫無預警的情況下讓電子設備突然失靈。\u003c/p\u003e\n\u003ch2 id=\"為什麼esd測試如此重要\"\u003e為什麼ESD測試如此重要？\u003c/h2\u003e\n\u003cp\u003e靜電放電測試正是為了模擬並防範這樣的情況。對於電動助力自行車(EPAC)等產品，EN 15194標準要求進行嚴格的ESD測試，確保產品能夠在面對日常生活中可能遇到的靜電干擾時保持穩定工作。\u003c/p\u003e\n\u003ch2 id=\"靜電的神秘物理學\"\u003e靜電的神秘物理學\u003c/h2\u003e\n\u003cp\u003e人體靜電電壓可輕易達到數千伏，這個數字聽起來驚人，但為什麼它不會對我們造成致命傷害？答案與電荷、電壓和電容的微妙關係有關。\u003c/p\u003e\n\u003cp\u003e人體對地的電容非常小，約為100–200皮法拉(pF)。作為參考，1皮法拉僅為10^-12法拉，是一個極其微小的數值。根據電容公式：\u003c/p\u003e\n\u003cp\u003eV = Q/C\u003c/p\u003e\n\u003cp\u003e其中V是電壓(伏特)，Q是電荷量(庫侖)，C是電容(法拉)。\u003c/p\u003e\n\u003cp\u003e這個公式清楚地表明，相同電荷量下，電容越小，電壓越高。這解釋了為什麼人體能夠積累如此高的電壓，而實際上儲存的能量和產生的電流卻很有限，不足以造成嚴重傷害。即使人體帶有數千伏的靜電，由於電容極小，實際儲存的總能量(E = 1/2 × C × V²)仍然很低，通常只有幾毫焦耳，遠低於對人體造成傷害的閾值。\u003c/p\u003e\n\u003ch2 id=\"電磁兼容性emc電子設備的和平共處之道\"\u003e電磁兼容性(EMC)：電子設備的和平共處之道\u003c/h2\u003e\n\u003cp\u003e電磁兼容性測試關注的是更廣泛的電磁干擾問題，它評估兩個關鍵方面：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e設備自身產生的干擾\u003c/strong\u003e（輻射和傳導干擾）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e設備抵抗外部干擾的能力\u003c/strong\u003e（電磁抗干擾性）\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e這兩方面共同確保電子設備能在複雜的電磁環境中正常運作，不受干擾也不干擾他人。\u003c/p\u003e\n\u003ch2 id=\"電磁輻射的物理原理\"\u003e電磁輻射的物理原理\u003c/h2\u003e\n\u003cp\u003e電磁輻射聽起來很複雜，但我們可以用日常生活的例子來理解。想像一顆石頭丟進平靜的湖面 — 水波會向四周擴散。電磁輻射也是類似的原理，只不過「丟石頭」的是電子，「波紋」則是電磁波。\u003c/p\u003e\n\u003cp\u003e每當電子在導體中移動、加速或改變方向，就像是在湖面丟了石頭，會產生向外擴散的電磁波。在我們的電子設備中，這種情況無處不在：每次手機處理器運算、每次電動自行車的馬達轉動，都有無數電子在移動，產生各種各樣的電磁波。\u003c/p\u003e\n\u003cp\u003e這些電磁波由兩部分組成：電場（就像靜電產生的力）和磁場（就像磁鐵產生的力）。在靠近電子設備的地方（近場），這兩種力可能不均衡，有點像剛丟下石頭的湖面，波紋還很混亂。而在離設備較遠的地方（遠場），它們會形成穩定的電磁波向外傳播，就像湖面上逐漸擴散開的整齊波紋。\u003c/p\u003e\n\u003cp\u003e這種區別對EMC測試很重要，因為我們需要使用不同的方法和工具來測量近處和遠處的電磁干擾，確保我們的設備既不會干擾他人，也不會被外界干擾。\u003c/p\u003e\n\u003ch2 id=\"emi測量方法的科學基礎\"\u003eEMI測量方法的科學基礎\u003c/h2\u003e\n\u003cp\u003e電磁干擾(EMI)的測量是一個精密的過程，涉及多種檢測模式，每種模式都能反映干擾的不同特性：\u003c/p\u003e\n\u003ch2 id=\"peak-vs-average-vs-quasi-peak不同的觀察視角\"\u003ePeak vs. Average vs. Quasi-peak：不同的觀察視角\u003c/h2\u003e\n\u003cp\u003eEMI測量通常使用三種不同的檢測模式，每種都反映干擾的不同特性：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePeak(峰值)檢測\u003c/strong\u003e捕捉瞬態干擾和尖峰，相當於捕捉風暴中的閃電。它顯示的是最壞情況下的干擾水平，通常用於快速初步測試。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAverage(平均值)檢測\u003c/strong\u003e反映持續性干擾的平均強度，相當於測量長時間的雨量。它更能代表干擾對通訊系統的實際影響。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eQuasi-peak(準峰值)檢測\u003c/strong\u003e是介於峰值和平均值之間的一種測量方式，它同時考慮干擾的強度和頻率。Quasi-peak檢測器對短時間干擾的反應較弱，但對重複發生的干擾反應較強，類似於人耳對噪音的感知方式 — 偶爾的噪音不太惱人，但重複的噪音即使強度較低也會讓人煩躁。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e這三種檢測模式各有其應用場景。快速識別問題時，Peak檢測最為有效；評估對廣播等傳統通訊系統的實際影響時，Quasi-peak檢測更為相關；而在評估對數字通訊系統的影響時，Average檢測則提供更有價值的信息。\u003c/p\u003e\n\u003ch2 id=\"水平與垂直測量全方位捕捉\"\u003e水平與垂直測量：全方位捕捉\u003c/h2\u003e\n\u003cp\u003e電磁波具有極化特性，就像光波在不同方向振動一樣。想像一下，陽光中的光波是朝各個方向振動的，但當它通過偏振片（例如某些太陽眼鏡鏡片或偏光濾鏡）時，只有特定方向振動的光波能夠通過。偏振片就像一個柵欄，只允許與柵欄方向平行的光波通過，而阻擋其他方向的光波。\u003c/p\u003e\n\u003cp\u003e同樣地，電磁波也有不同的振動方向，為了全方位捕捉可能的輻射，EMI測試必須同時進行水平和垂直兩種極化方向的測量。\u003c/p\u003e\n\u003cp\u003e這就像在黑暗中搜尋一個反光物體 — 你需要從不同角度照射光線，才能確保不會錯過它。這種全方位的測量方法確保了測試結果的全面性和可靠性。\u003c/p\u003e\n\u003ch2 id=\"解讀emi測量單位\"\u003e解讀EMI測量單位\u003c/h2\u003e\n\u003cp\u003eEMI測量涉及多個專業單位，它們共同構成了完整的測量體系：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eReading (dBµV)\u003c/strong\u003e — 接收器直接讀取的原始電壓值\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAntenna Factor (dB/m)\u003c/strong\u003e — 將接收電壓轉換為電場強度的校正因子\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e測量值 (dBµV/m)\u003c/strong\u003e — 最終的電場強度，是評估EMI輻射符合性的實際指標\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e這些單位的轉換關係是： 電場強度(dBµV/m) = 接收器讀數(dBµV) + 天線因子(dB/m) + 其他校正因子\u003c/p\u003e","title":"電磁兼容性測試：深入理解ESD與EMC的世界"},{"content":"前言 最近因為全球關稅議題升溫，股市大幅波動，我的投資組合也遭受了不小的衝擊。在這段資金緊張的時期，我開始思考一個問題：面對市場波動，是應該堅持每月定期定額投入，還是設法借貸一筆資金「逢低加碼」？\n這個問題引發了我對投資策略的深度思考。我花了些時間整理數據，做了一系列分析，希望用理性的方式找到答案。在此分享我的研究成果，希望對同樣面臨類似困惑的投資者有所啟發。\n在投資世界中，「時間在市場的時間」(Time in the market)常被視為關鍵成功因素。但對於普通投資者而言，面對有限的資金，應該採取每月定期定額(DCA)投入，還是藉貸款一次性大筆投入市場？本文將以數據和分析來解答這個問題，並特別聚焦於台灣投資環境。\n兩種投資策略簡介 定期定額投資(DCA) 定期定額投資是指每月固定金額投入市場，無論市場漲跌。這種策略的優點是平均成本，降低市場時機風險，適合大多數投資者長期執行。\n貸款一次性投入 這種策略是先向銀行借一筆款項，一次性全部投入市場，同時每月還款。這種做法本質上是利用金融槓桿放大投資效果，但同時也增加了風險。\n關鍵變數：投資報酬率vs貸款利率 決定兩種策略優劣的關鍵在於投資報酬率和貸款利率的差距。讓我們首先透過兩個理論案例來分析：\n案例一：投資報酬率4%，貸款利率6% 假設以下條件：\n每月投資/還款金額：4,000元 投資年化報酬率：4% 貸款年化利率：6% 投資期間：30年 30年後的結果 定期定額(DCA)： 總投入：1,440,000元 最終餘額：2,741,082元 淨收益：1,301,082元 貸款一次性投入： 初始貸款金額：678,690元 總支付利息：761,310元 最終投資餘額：2,201,263元 淨收益：761,263元 差距： DCA比貸款投資多獲利539,820元\n階段性比較 當投資報酬率低於貸款利率時，DCA策略在所有時間點都優於貸款投資，且差距隨時間擴大。\n案例二：投資報酬率10%，貸款利率6% 現在，讓我們看看投資報酬率提高到10%時的情況：\n30年後的結果 定期定額(DCA)： 總投入：1,440,000元 最終餘額：8,251,373元 淨收益：6,811,373元 貸款一次性投入： 初始貸款金額：678,690元（不變） 總支付利息：761,310元（不變） 最終投資餘額：11,842,741元 淨收益：10,402,741元 差距： 貸款投資比DCA多獲利3,591,367元\n階段性比較 當投資報酬率大幅高於貸款利率時，情況完全逆轉，貸款投資在所有時間點都優於DCA，且優勢隨時間擴大。\n槓桿效應的雙面刃 貸款投資本質上是運用金融槓桿，而槓桿是把雙面刃：\n正向槓桿：當投資報酬率 \u0026gt; 貸款利率時，槓桿放大收益 負向槓桿：當投資報酬率 \u0026lt; 貸款利率時，槓桿放大虧損 實際情況中，多數投資不太可能30年穩定維持10%的回報率，市場波動性會大幅影響貸款投資策略的結果。\n如何選擇適合你的策略？ 選擇定期定額(DCA)的情況： 投資報酬率預期低於或接近貸款利率 風險承受能力較低 收入不夠穩定 希望保持財務彈性 市場波動較大 選擇貸款投資的情況： 投資報酬率預期顯著高於貸款利率（至少4%以上的差距） 風險承受能力較高 有穩定收入來源確保按時還款 投資期限較長（10年以上） 有管理槓桿投資的經驗和知識 混合策略：平衡風險與報酬 實際應用中，一個平衡的策略可能是：\n部分資金採用定期定額投入 部分資金採用適度槓桿投資 根據市場環境和個人財務狀況動態調整比例 台灣市場實證分析：以0050 ETF為例 讓我們將理論應用到實際的台灣市場環境中，選擇台灣最知名的0050 ETF作為投資標的進行分析。\n0050 ETF歷史報酬率 0050自2003年6月成立以來，至2024年4月的表現如下：\n首個淨值約15元，目前淨值約130元 加上歷年配息累計約45元 經計算，年化報酬率約為12.52% 台灣歷史貸款利率 根據台灣央行及主要銀行的歷史數據，近20年台灣貸款利率大致如下：\n平均房貸利率：2.09% 平均消費性貸款利率：3.83% 從數據來看，0050的報酬率與房貸利率差距高達10.42個百分點，與消費性貸款利率差距也有8.69個百分點。這樣的利差相當可觀，使得貸款投資策略在台灣市場理論上非常具有吸引力。\n台灣實際情境模擬 假設我們以每月4,000元進行投資，模擬期間為20年：\n方案1：每月DCA 4000元投資0050 總投入：960,000元 最終餘額：3,880,189元 淨收益：2,920,189元 方案2：房貸方式一次性投入 可貸款並投入金額：785,520元 最終投資餘額：8,312,886元 淨資產(扣除貸款)：8,312,886元 比DCA多：4,432,697元 (114%) 方案3：消費性貸款方式一次性投入 可貸款並投入金額：673,813元 最終投資餘額：7,130,730元 淨資產(扣除貸款)：7,130,730元 比DCA多：3,250,541元 (84%) 不同年份的比較 台灣市場特殊因素分析 從以上數據可以明顯看出，在台灣市場，利用貸款槓桿投資0050的策略收益遠高於定期定額。這主要基於以下幾個台灣特有的市場因素：\n0050高報酬：0050由台灣前50大權值股組成，包含台積電等科技巨擘，過去表現優異。 台灣低利率環境：台灣長期處於低利率環境，尤其是房貸利率，長期保持在極低水平。 利差優勢：台灣的投資報酬率與貸款利率差距在全球範圍內都較為罕見，創造了良好的槓桿投資環境。 台股結構性成長：台灣股市受益於科技產業長期結構性成長，特別是半導體產業的全球領導地位。 結論與個人反思 股市因最近的全球關稅爭端大幅震盪，讓我在現金流吃緊的情況下不得不重新審視自己的投資策略。經過這次深入分析後，我得出以下幾點思考：\n數據不會說謊：投資報酬率與貸款利率的差距確實是決定策略優劣的關鍵因素。在台灣市場的特殊環境下，過去20年間利用低利率貸款投資高報酬率的0050，確實能帶來顯著優於定期定額的投資結果。 心理承受力同樣重要：雖然數據顯示貸款投資策略回報更高，但我必須誠實面對自己：在市場大跌時，看著貸款金額不變但投資價值縮水，我能否保持冷靜？如果急需用錢，被迫在低點賣出會怎樣？ 個人財務安全網：任何投資策略都必須建立在穩固的個人財務基礎上。在考慮槓桿投資前，我需要確保有足夠的應急資金、穩定的收入來源和合理的保險保障。 市場環境變化的可能：過去的表現不代表未來，市場隨時可能發生變化。尤其是當全球正面臨貿易壁壘提高、地緣政治緊張和通膨等多重挑戰時，過去20年的經驗可能不會完全重演。 經過這次研究，我決定採取一個平衡的做法：將資金分配給不同的策略，部分繼續定期定額，部分考慮適度的槓桿投資，但絕不超過我的心理及財務承受能力。同時，確保自己有足夠的現金緩衝，以應對像最近這樣的市場波動。\n投資是一場長期的旅程，最重要的是找到適合自己的節奏和方法，讓財富能夠穩健成長，同時不犧牲生活品質和心理健康。\n免責聲明：本文基於個人經歷和研究整理而成，僅供參考，不構成投資建議。投資有風險，入市需謹慎。槓桿投資風險更高，請根據個人財務狀況審慎決策。過去的投資表現不代表未來結果。\n","permalink":"https://0Zhen.github.io/posts/2025-04-10/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e最近因為全球關稅議題升溫，股市大幅波動，我的投資組合也遭受了不小的衝擊。在這段資金緊張的時期，我開始思考一個問題：面對市場波動，是應該堅持每月定期定額投入，還是設法借貸一筆資金「逢低加碼」？\u003c/p\u003e\n\u003cp\u003e這個問題引發了我對投資策略的深度思考。我花了些時間整理數據，做了一系列分析，希望用理性的方式找到答案。在此分享我的研究成果，希望對同樣面臨類似困惑的投資者有所啟發。\u003c/p\u003e\n\u003cp\u003e在投資世界中，「時間在市場的時間」(Time in the market)常被視為關鍵成功因素。但對於普通投資者而言，面對有限的資金，應該採取每月定期定額(DCA)投入，還是藉貸款一次性大筆投入市場？本文將以數據和分析來解答這個問題，並特別聚焦於台灣投資環境。\u003c/p\u003e\n\u003ch2 id=\"兩種投資策略簡介\"\u003e兩種投資策略簡介\u003c/h2\u003e\n\u003ch2 id=\"定期定額投資dca\"\u003e定期定額投資(DCA)\u003c/h2\u003e\n\u003cp\u003e定期定額投資是指每月固定金額投入市場，無論市場漲跌。這種策略的優點是平均成本，降低市場時機風險，適合大多數投資者長期執行。\u003c/p\u003e\n\u003ch2 id=\"貸款一次性投入\"\u003e貸款一次性投入\u003c/h2\u003e\n\u003cp\u003e這種策略是先向銀行借一筆款項，一次性全部投入市場，同時每月還款。這種做法本質上是利用金融槓桿放大投資效果，但同時也增加了風險。\u003c/p\u003e\n\u003ch2 id=\"關鍵變數投資報酬率vs貸款利率\"\u003e關鍵變數：投資報酬率vs貸款利率\u003c/h2\u003e\n\u003cp\u003e決定兩種策略優劣的關鍵在於\u003cstrong\u003e投資報酬率\u003c/strong\u003e和\u003cstrong\u003e貸款利率\u003c/strong\u003e的差距。讓我們首先透過兩個理論案例來分析：\u003c/p\u003e\n\u003ch2 id=\"案例一投資報酬率4貸款利率6\"\u003e案例一：投資報酬率4%，貸款利率6%\u003c/h2\u003e\n\u003cp\u003e假設以下條件：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e每月投資/還款金額：4,000元\u003c/li\u003e\n\u003cli\u003e投資年化報酬率：4%\u003c/li\u003e\n\u003cli\u003e貸款年化利率：6%\u003c/li\u003e\n\u003cli\u003e投資期間：30年\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"30年後的結果\"\u003e30年後的結果\u003c/h2\u003e\n\u003ch3 id=\"定期定額dca\"\u003e定期定額(DCA)：\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e總投入：1,440,000元\u003c/li\u003e\n\u003cli\u003e最終餘額：2,741,082元\u003c/li\u003e\n\u003cli\u003e淨收益：1,301,082元\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"貸款一次性投入-1\"\u003e貸款一次性投入：\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e初始貸款金額：678,690元\u003c/li\u003e\n\u003cli\u003e總支付利息：761,310元\u003c/li\u003e\n\u003cli\u003e最終投資餘額：2,201,263元\u003c/li\u003e\n\u003cli\u003e淨收益：761,263元\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"差距\"\u003e差距：\u003c/h3\u003e\n\u003cp\u003eDCA比貸款投資多獲利539,820元\u003c/p\u003e\n\u003ch2 id=\"階段性比較\"\u003e階段性比較\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*fIARzL6xYSlFgCMsT15d4Q.png\"\u003e\u003c/p\u003e\n\u003cp\u003e當投資報酬率低於貸款利率時，DCA策略在所有時間點都優於貸款投資，且差距隨時間擴大。\u003c/p\u003e\n\u003ch2 id=\"案例二投資報酬率10貸款利率6\"\u003e案例二：投資報酬率10%，貸款利率6%\u003c/h2\u003e\n\u003cp\u003e現在，讓我們看看投資報酬率提高到10%時的情況：\u003c/p\u003e\n\u003ch2 id=\"30年後的結果-1\"\u003e30年後的結果\u003c/h2\u003e\n\u003ch3 id=\"定期定額dca-1\"\u003e定期定額(DCA)：\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e總投入：1,440,000元\u003c/li\u003e\n\u003cli\u003e最終餘額：8,251,373元\u003c/li\u003e\n\u003cli\u003e淨收益：6,811,373元\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"貸款一次性投入-2\"\u003e貸款一次性投入：\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e初始貸款金額：678,690元（不變）\u003c/li\u003e\n\u003cli\u003e總支付利息：761,310元（不變）\u003c/li\u003e\n\u003cli\u003e最終投資餘額：11,842,741元\u003c/li\u003e\n\u003cli\u003e淨收益：10,402,741元\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"差距-1\"\u003e差距：\u003c/h3\u003e\n\u003cp\u003e貸款投資比DCA多獲利3,591,367元\u003c/p\u003e\n\u003ch2 id=\"階段性比較-1\"\u003e階段性比較\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*Ea7U275H7Y9gR4at1Pd9jw.png\"\u003e\u003c/p\u003e\n\u003cp\u003e當投資報酬率大幅高於貸款利率時，情況完全逆轉，貸款投資在所有時間點都優於DCA，且優勢隨時間擴大。\u003c/p\u003e\n\u003ch2 id=\"槓桿效應的雙面刃\"\u003e槓桿效應的雙面刃\u003c/h2\u003e\n\u003cp\u003e貸款投資本質上是運用金融槓桿，而槓桿是把雙面刃：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e正向槓桿\u003c/strong\u003e：當投資報酬率 \u0026gt; 貸款利率時，槓桿放大收益\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e負向槓桿\u003c/strong\u003e：當投資報酬率 \u0026lt; 貸款利率時，槓桿放大虧損\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e實際情況中，多數投資不太可能30年穩定維持10%的回報率，市場波動性會大幅影響貸款投資策略的結果。\u003c/p\u003e\n\u003ch2 id=\"如何選擇適合你的策略\"\u003e如何選擇適合你的策略？\u003c/h2\u003e\n\u003ch2 id=\"選擇定期定額dca的情況\"\u003e選擇定期定額(DCA)的情況：\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e投資報酬率預期低於或接近貸款利率\u003c/li\u003e\n\u003cli\u003e風險承受能力較低\u003c/li\u003e\n\u003cli\u003e收入不夠穩定\u003c/li\u003e\n\u003cli\u003e希望保持財務彈性\u003c/li\u003e\n\u003cli\u003e市場波動較大\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"選擇貸款投資的情況\"\u003e選擇貸款投資的情況：\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e投資報酬率預期顯著高於貸款利率（至少4%以上的差距）\u003c/li\u003e\n\u003cli\u003e風險承受能力較高\u003c/li\u003e\n\u003cli\u003e有穩定收入來源確保按時還款\u003c/li\u003e\n\u003cli\u003e投資期限較長（10年以上）\u003c/li\u003e\n\u003cli\u003e有管理槓桿投資的經驗和知識\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"混合策略平衡風險與報酬\"\u003e混合策略：平衡風險與報酬\u003c/h2\u003e\n\u003cp\u003e實際應用中，一個平衡的策略可能是：\u003c/p\u003e","title":"定期定額vs貸款一次性投入：如何用數據決定最佳投資策略"},{"content":"\n在現代軟體開發環境中，技術文件的管理和維護常常被視為一項繁瑣的任務。作為一名開發者，我曾經為撰寫和更新各種專業規格文件（如Error Code Table、SOP、Protocol等）而煩惱。這些文件有著共同的特點：高度重複性和頻繁的版本變化。\n在本文中，我將分享一套完整的文件自動化解決方案：利用JSON作為資料來源，通過Python處理資料，使用LaTeX生成格式精美的PDF文件，並通過Git實現版本控制和自動發布。\n為什麼選擇JSON + LaTeX + Git的組合？ 在探索各種技術文件解決方案後，我發現這個組合具有以下優勢：\nJSON：結構化數據存儲，易於程式讀取和修改 LaTeX：專業排版系統，產出高質量PDF文件 Git：完善的版本控制，支持協作和發布流程 雖然HTML也是一個選項，但對於正式文件來說，PDF格式往往更受青睞，它具有固定的排版和更專業的外觀。\n工作流程概述 整個自動化工作流程可以概括為以下幾個步驟：\n建立JSON文件作為數據源 使用Python處理JSON數據 將處理後的數據轉換為LaTeX格式 使用MiKTeX編譯LaTeX文件生成PDF 利用Git進行版本控制和發布 讓我們深入了解每個步驟的具體實現。\n步驟一：建立JSON文件 首先，我們需要設計一個適合我們文件需求的JSON結構。以錯誤代碼表（Error Code Table）為例：\n{ \u0026#34;document_info\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;系統錯誤代碼表\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;1.2.0\u0026#34;, \u0026#34;last_updated\u0026#34;: \u0026#34;2025-04-07\u0026#34;, \u0026#34;author\u0026#34;: \u0026#34;工程團隊\u0026#34; }, \u0026#34;error_codes\u0026#34;: [ { \u0026#34;code\u0026#34;: \u0026#34;E001\u0026#34;, \u0026#34;severity\u0026#34;: \u0026#34;ERROR\u0026#34;, \u0026#34;message\u0026#34;: \u0026#34;連接數據庫失敗\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;無法建立與數據庫的連接\u0026#34;, \u0026#34;solution\u0026#34;: \u0026#34;檢查數據庫連接字符串和網絡狀態\u0026#34; }, { \u0026#34;code\u0026#34;: \u0026#34;E002\u0026#34;, \u0026#34;severity\u0026#34;: \u0026#34;WARNING\u0026#34;, \u0026#34;message\u0026#34;: \u0026#34;配置文件不完整\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;系統配置文件缺少必要參數\u0026#34;, \u0026#34;solution\u0026#34;: \u0026#34;參考文檔補全配置文件中的必要參數\u0026#34; } // 更多錯誤代碼... ] } 這種結構化的格式使得更新和維護變得非常簡單。需要添加新的錯誤代碼？只需在陣列中添加一個新對象即可。\n步驟二：使用Python處理JSON 接下來，我們編寫Python腳本來處理JSON數據。這一步的目的是：\n讀取JSON文件 驗證數據完整性 進行必要的數據轉換 為LaTeX生成做準備 以下是處理JSON的示例Python代碼：\nimport json import datetime import os def process_error_code_table(json_file_path): # 讀取JSON文件 with open(json_file_path, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: data = json.load(f) # 驗證數據完整性 required_fields = [\u0026#39;document_info\u0026#39;, \u0026#39;error_codes\u0026#39;] for field in required_fields: if field not in data: raise ValueError(f\u0026#34;JSON缺少必要欄位: {field}\u0026#34;) # 數據處理和轉換 # 例如：按照錯誤代碼排序 data[\u0026#39;error_codes\u0026#39;] = sorted(data[\u0026#39;error_codes\u0026#39;], key=lambda x: x[\u0026#39;code\u0026#39;]) # 更新版本信息 if \u0026#39;auto_update_date\u0026#39; in data[\u0026#39;document_info\u0026#39;] and data[\u0026#39;document_info\u0026#39;][\u0026#39;auto_update_date\u0026#39;]: data[\u0026#39;document_info\u0026#39;][\u0026#39;last_updated\u0026#39;] = datetime.datetime.now().strftime(\u0026#39;%Y-%m-%d\u0026#39;) return data # 使用函數 error_data = process_error_code_table(\u0026#39;error_codes.json\u0026#39;) 步驟三：將JSON轉換為LaTeX 現在是時候將處理好的JSON數據轉換為LaTeX格式了。我們可以使用Python的字符串模板或專門的模板引擎來實現：\ndef generate_latex(data): # LaTeX文檔頭部 latex_content = r\u0026#39;\u0026#39;\u0026#39;\\documentclass{article} \\usepackage[utf8]{inputenc} \\usepackage{booktabs} \\usepackage{longtable} \\usepackage{xcolor} \\usepackage{hyperref} \\usepackage{geometry}\\geometry{a4paper, margin=1in} \\title{\u0026#39;\u0026#39;\u0026#39; + data[\u0026#39;document_info\u0026#39;][\u0026#39;title\u0026#39;] + r\u0026#39;\u0026#39;\u0026#39;} \\author{\u0026#39;\u0026#39;\u0026#39; + data[\u0026#39;document_info\u0026#39;][\u0026#39;author\u0026#39;] + r\u0026#39;\u0026#39;\u0026#39;} \\date{版本 \u0026#39;\u0026#39;\u0026#39; + data[\u0026#39;document_info\u0026#39;][\u0026#39;version\u0026#39;] + r\u0026#39;\u0026#39;\u0026#39; - 更新日期: \u0026#39;\u0026#39;\u0026#39; + data[\u0026#39;document_info\u0026#39;][\u0026#39;last_updated\u0026#39;] + r\u0026#39;\u0026#39;\u0026#39;} \\begin{document} \\maketitle \\tableofcontents \\newpage \\section{錯誤代碼表} \\begin{longtable}{|p{0.08\\textwidth}|p{0.10\\textwidth}|p{0.22\\textwidth}|p{0.3\\textwidth}|p{0.3\\textwidth}|} \\hline \\textbf{代碼} \u0026amp; \\textbf{嚴重性} \u0026amp; \\textbf{錯誤訊息} \u0026amp; \\textbf{描述} \u0026amp; \\textbf{解決方案} \\\\ \\hline \\endhead \u0026#39;\u0026#39;\u0026#39; # 添加每個錯誤代碼的行 for error in data[\u0026#39;error_codes\u0026#39;]: # 根據嚴重性設置顏色 severity_color = \u0026#39;red\u0026#39; if error[\u0026#39;severity\u0026#39;] == \u0026#39;ERROR\u0026#39; else \u0026#39;orange\u0026#39; if error[\u0026#39;severity\u0026#39;] == \u0026#39;WARNING\u0026#39; else \u0026#39;black\u0026#39; latex_content += f\u0026#34;{error[\u0026#39;code\u0026#39;]} \u0026amp; \u0026#34; latex_content += f\u0026#34;\\\\textcolor{{{severity_color}}}{{{error[\u0026#39;severity\u0026#39;]}}} \u0026amp; \u0026#34; latex_content += f\u0026#34;{error[\u0026#39;message\u0026#39;]} \u0026amp; \u0026#34; latex_content += f\u0026#34;{error[\u0026#39;description\u0026#39;]} \u0026amp; \u0026#34; latex_content += f\u0026#34;{error[\u0026#39;solution\u0026#39;]} \\\\\\\\\\n\\\\hline\\n\u0026#34; # 文檔結尾 latex_content += r\u0026#39;\u0026#39;\u0026#39;\\end{longtable} \\end{document} \u0026#39;\u0026#39;\u0026#39; return latex_content # 生成LaTeX文檔 latex_content = generate_latex(error_data) # 保存LaTeX文件 with open(\u0026#39;error_codes.tex\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: f.write(latex_content) 步驟四：使用MiKTeX編譯LaTeX生成PDF 現在我們有了LaTeX文件，接下來使用MiKTeX（或其他LaTeX發行版）將其編譯為PDF。我們可以在Python腳本中調用系統命令來完成這一步：\nimport subprocess def compile_latex_to_pdf(tex_file_path): try: # 調用pdflatex兩次以確保目錄和參考正確生成 subprocess.run([\u0026#39;pdflatex\u0026#39;, tex_file_path], check=True) subprocess.run([\u0026#39;pdflatex\u0026#39;, tex_file_path], check=True) # 獲取PDF文件名（去掉.tex後綴） pdf_file = tex_file_path.replace(\u0026#39;.tex\u0026#39;, \u0026#39;.pdf\u0026#39;) if os.path.exists(pdf_file): print(f\u0026#34;PDF生成成功: {pdf_file}\u0026#34;) return pdf_file else: print(\u0026#34;PDF生成失敗\u0026#34;) return None except subprocess.CalledProcessError as e: print(f\u0026#34;LaTeX編譯錯誤: {e}\u0026#34;) return None # 編譯PDF pdf_file = compile_latex_to_pdf(\u0026#39;error_codes.tex\u0026#39;) 步驟五：使用Git進行版本控制和發布 最後，我們將整個流程與Git整合，實現版本控制和自動發布：\ndef git_publish_document(pdf_file, version): try: # 添加所有文件到Git subprocess.run([\u0026#39;git\u0026#39;, \u0026#39;add\u0026#39;, \u0026#39;.\u0026#39;], check=True) # 提交變更 commit_message = f\u0026#34;Update documentation to version {version}\u0026#34; subprocess.run([\u0026#39;git\u0026#39;, \u0026#39;commit\u0026#39;, \u0026#39;-m\u0026#39;, commit_message], check=True) # 添加版本標籤 tag_name = f\u0026#34;v{version}\u0026#34; subprocess.run([\u0026#39;git\u0026#39;, \u0026#39;tag\u0026#39;, \u0026#39;-a\u0026#39;, tag_name, \u0026#39;-m\u0026#39;, f\u0026#34;Version {version}\u0026#34;], check=True) # 推送到遠端倉庫 subprocess.run([\u0026#39;git\u0026#39;, \u0026#39;push\u0026#39;, \u0026#39;origin\u0026#39;, \u0026#39;master\u0026#39;], check=True) subprocess.run([\u0026#39;git\u0026#39;, \u0026#39;push\u0026#39;, \u0026#39;origin\u0026#39;, tag_name], check=True) print(f\u0026#34;文檔已發布，版本 {version}\u0026#34;) return True except subprocess.CalledProcessError as e: print(f\u0026#34;Git操作錯誤: {e}\u0026#34;) return False # 發布文檔 if pdf_file: git_publish_document(pdf_file, error_data[\u0026#39;document_info\u0026#39;][\u0026#39;version\u0026#39;]) 將所有步驟整合 最後，我們可以將上述所有步驟整合到一個完整的Python腳本中，實現一鍵式文檔生成和發布：\nimport json import datetime import os import subprocess def main(): # 1. 處理JSON數據 error_data = process_error_code_table(\u0026#39;error_codes.json\u0026#39;) # 2. 生成LaTeX latex_content = generate_latex(error_data) with open(\u0026#39;error_codes.tex\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: f.write(latex_content) # 3. 編譯PDF pdf_file = compile_latex_to_pdf(\u0026#39;error_codes.tex\u0026#39;) # 4. Git發布 if pdf_file and input(\u0026#34;是否發布文檔? (y/n): \u0026#34;).lower() == \u0026#39;y\u0026#39;: git_publish_document(pdf_file, error_data[\u0026#39;document_info\u0026#39;][\u0026#39;version\u0026#39;]) if __name__ == \u0026#34;__main__\u0026#34;: main() 自動化的進階選項 除了基本的文檔生成流程外，我們還可以進一步優化自動化程度：\n使用GitHub Actions或Jenkins：設置CI/CD管道，在JSON變更時自動觸發文檔生成和發布 添加審核流程：在發布前添加文檔審核步驟 多語言支持：在JSON中添加多語言數據，生成不同語言版本的文檔 文檔差異比較：實現對比新舊版本文檔的差異功能 結論 通過這套JSON → Python → LaTeX → PDF → Git的自動化工作流程，我們成功地將技術文檔的維護工作簡化為JSON數據的更新。這不僅提高了效率，還確保了文檔的一致性和專業性。\n對於那些需要頻繁更新的專業規格文件，如錯誤代碼表、SOP、協議文檔等，這種自動化方法尤為有效。它使團隊可以專注於內容本身，而不是文檔格式和發布過程。\n您也可以根據自己的需求調整此工作流程，或者擴展它以支持更多類型的技術文檔。重要的是找到適合您團隊的文檔自動化策略，並堅持使用它。\n","permalink":"https://0Zhen.github.io/posts/json-pdf/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*NOkUwKcevr-3zzBM-b6mnQ.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在現代軟體開發環境中，技術文件的管理和維護常常被視為一項繁瑣的任務。作為一名開發者，我曾經為撰寫和更新各種專業規格文件（如Error Code Table、SOP、Protocol等）而煩惱。這些文件有著共同的特點：高度重複性和頻繁的版本變化。\u003c/p\u003e\n\u003cp\u003e在本文中，我將分享一套完整的文件自動化解決方案：利用JSON作為資料來源，通過Python處理資料，使用LaTeX生成格式精美的PDF文件，並通過Git實現版本控制和自動發布。\u003c/p\u003e\n\u003ch2 id=\"為什麼選擇json--latex-git的組合\"\u003e為什麼選擇JSON + LaTeX + Git的組合？\u003c/h2\u003e\n\u003cp\u003e在探索各種技術文件解決方案後，我發現這個組合具有以下優勢：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eJSON\u003c/strong\u003e：結構化數據存儲，易於程式讀取和修改\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLaTeX\u003c/strong\u003e：專業排版系統，產出高質量PDF文件\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGit\u003c/strong\u003e：完善的版本控制，支持協作和發布流程\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e雖然HTML也是一個選項，但對於正式文件來說，PDF格式往往更受青睞，它具有固定的排版和更專業的外觀。\u003c/p\u003e\n\u003ch2 id=\"工作流程概述\"\u003e工作流程概述\u003c/h2\u003e\n\u003cp\u003e整個自動化工作流程可以概括為以下幾個步驟：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e建立JSON文件作為數據源\u003c/li\u003e\n\u003cli\u003e使用Python處理JSON數據\u003c/li\u003e\n\u003cli\u003e將處理後的數據轉換為LaTeX格式\u003c/li\u003e\n\u003cli\u003e使用MiKTeX編譯LaTeX文件生成PDF\u003c/li\u003e\n\u003cli\u003e利用Git進行版本控制和發布\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e讓我們深入了解每個步驟的具體實現。\u003c/p\u003e\n\u003ch2 id=\"步驟一建立json文件\"\u003e步驟一：建立JSON文件\u003c/h2\u003e\n\u003cp\u003e首先，我們需要設計一個適合我們文件需求的JSON結構。以錯誤代碼表（Error Code Table）為例：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;document_info\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;系統錯誤代碼表\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;1.2.0\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026#34;last_updated\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;2025-04-07\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;工程團隊\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;error_codes\u0026#34;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;E001\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;severity\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;ERROR\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;連接數據庫失敗\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;無法建立與數據庫的連接\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;solution\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;檢查數據庫連接字符串和網絡狀態\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;E002\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;severity\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;WARNING\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;配置文件不完整\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;系統配置文件缺少必要參數\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003e\u0026#34;solution\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;參考文檔補全配置文件中的必要參數\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e// 更多錯誤代碼...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e這種結構化的格式使得更新和維護變得非常簡單。需要添加新的錯誤代碼？只需在陣列中添加一個新對象即可。\u003c/p\u003e\n\u003ch2 id=\"步驟二使用python處理json\"\u003e步驟二：使用Python處理JSON\u003c/h2\u003e\n\u003cp\u003e接下來，我們編寫Python腳本來處理JSON數據。這一步的目的是：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e讀取JSON文件\u003c/li\u003e\n\u003cli\u003e驗證數據完整性\u003c/li\u003e\n\u003cli\u003e進行必要的數據轉換\u003c/li\u003e\n\u003cli\u003e為LaTeX生成做準備\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以下是處理JSON的示例Python代碼：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e json\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e datetime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e os\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eprocess_error_code_table\u003c/span\u003e(json_file_path):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 讀取JSON文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e open(json_file_path, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, encoding\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eas\u003c/span\u003e f:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        data \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e json\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eload(f)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 驗證數據完整性\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    required_fields \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;document_info\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error_codes\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e field \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e required_fields:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e field \u003cspan style=\"color:#f92672\"\u003enot\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e data:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eValueError\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;JSON缺少必要欄位: \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003efield\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 數據處理和轉換\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 例如：按照錯誤代碼排序\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    data[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error_codes\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e sorted(data[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error_codes\u0026#39;\u003c/span\u003e], key\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003elambda\u003c/span\u003e x: x[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;code\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 更新版本信息\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;auto_update_date\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e data[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;document_info\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003eand\u003c/span\u003e data[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;document_info\u0026#39;\u003c/span\u003e][\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;auto_update_date\u0026#39;\u003c/span\u003e]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        data[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;document_info\u0026#39;\u003c/span\u003e][\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;last_updated\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e datetime\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edatetime\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003enow()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrftime(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;%Y-%m-\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e%d\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e data\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 使用函數\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror_data \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e process_error_code_table(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error_codes.json\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"步驟三將json轉換為latex\"\u003e步驟三：將JSON轉換為LaTeX\u003c/h2\u003e\n\u003cp\u003e現在是時候將處理好的JSON數據轉換為LaTeX格式了。我們可以使用Python的字符串模板或專門的模板引擎來實現：\u003c/p\u003e","title":"工程師必備：從JSON到PDF的技術文件自動化工作流程"},{"content":"在進行符合EN-15194與R200等標準的電輔車測試時，準確計算自行車阻力是至關重要的。不同的坡度、自行車重量以及其他因素都會影響阻力計算。讓我們一起探討如何運用簡單的物理學原理來更有效地計算這些力。\n自行車阻力的物理基礎 自行車阻力並非單一的力，而是騎士必須克服的多種不同力的組合。了解每個組成部分有助於工程師設計更好的測試方案和更高效的電輔車。\n騎行功率計算 在騎腳踏車時，總共會遇到風阻、摩擦力還有重力，這三個力的總和，就是總阻力。當我們知道總阻力，就能夠換算爬這個坡所需要的速度與扭力。\nCreate by ChrisLee\n總阻力 = 空氣阻力 + 滾動摩擦力 + 爬坡阻力 騎行功率則是總阻力乘以速度：\n騎行功率 = 總阻力 × 速度 在實際應用中，我們通常知道的是車輪的轉速(RPM)而非線性速度。因此，我們計算：\n車輪周長 = 車輪直徑 × π 等效轉速 = 速度 / 車輪周長 騎行功率 = 總阻力 × 車輪半徑 × 等效轉速 × 2π / 60 其中2π/60是將每分鐘轉數轉換為每秒角速度的因子。\n接著我們針對這三總力進行分析。\n1. 空氣阻力 空氣阻力是自行車在空氣中運動時，空氣對自行車產生的阻礙作用。根據流體力學方程式：\n空氣阻力 = 0.5 × 空氣密度 × 阻力係數 × 迎風面積 × 速度平方 其中：\n空氣密度：單位體積空氣的質量(kg/m³)，在標準狀況下約為1.225 kg/m³ 阻力係數：與自行車和騎士的空氣動力學特性有關，無量綱，可以參考維基百科以及文獻進行設定。(根據DOVAL, Peter Nicholas. Aerodynamic analysis and drag coefficient evaluation of time-trial bicycle riders. 2012.文獻，公路車騎士風阻係數約為0.7) 迎風面積：自行車和騎士迎風的投影面積(m²) 速度：自行車的速度(m/s)，計算中通常從km/h轉換而來 Weiki\n空氣阻力隨速度的平方增加，因此在高速時它是主要的阻力來源，這也是為什麼跑車空力車的形狀都會扁扁奇形怪狀的XD。\n2. 滾動摩擦力 滾動摩擦力來自輪胎與地面的接觸。它與輪胎的材料、胎壓、路面狀況等因素有關：\n滾動摩擦力 = 摩擦係數 × 總重量 × 重力加速度 × cos(坡度角) 其中：\n摩擦係數：與輪胎材質、胎壓、路面狀況等有關，無量綱(維基百科說明約為0.0022) 總重量：騎士和自行車的總重量(kg) 重力加速度：通常取9.8 m/s² 坡度角：道路的坡度角，計算中從百分比坡度轉換為弧度 Wiki\n餘弦項考慮了在坡度上略微減小的正向力分量。\n3. 重力阻力(爬坡阻力) 在爬坡時，自行車需要克服平行於坡面方向的重力分量：\n爬坡阻力 = 總重量 × 重力加速度 × sin(坡度角) 這一力在較陡的坡度上變得顯著，並且與總重量成正比。\n綜合以上數據，我們可以得到坡度、車重、風阻等等數字，得到當下的阻力，進一步計算出目標功率，以下我用了二分搜索算法，計算如何得到目標功率。\n尋找等效坡度的二分搜索算法 在測試電輔車時，我們經常需要找到需要特定目標功率的坡度。不直接解複雜方程，二分搜索算法提供了更通用的解決方案：\n從最小和最大可能坡度值開始 計算中點坡度所需的功率 如果計算功率高於目標，則減小坡度 如果計算功率低於目標，則增加坡度 重複直到計算功率收斂至目標功率 這種數值方法更為實用，因為像空氣阻力這樣的參數可能會隨速度變化，使直接求解方程變得困難。\n在電輔車測試中的應用 了解這些物理原理對於EN-15194和R200電輔車測試至關重要，精確的阻力計算決定了：\n電池續航估計 馬達輔助等級 各種條件下的性能表現 符合法規標準的程度 通過建立準確的自行車阻力模型並使用數值方法求解，我們可以分析自行車在不同條件下的性能，優化電輔車設計和測試方法。\n結論 自行車阻力的物理學乍看之下可能很複雜，但將其分解為組成部分 — — 空氣阻力、滾動摩擦力和重力阻力 — — 使計算變得更加容易理解。無論您是設計電輔車、進行合規測試，還是純粹對自行車物理學感興趣，了解這些原理都能為騎行性能提供寶貴的見解。\n這種方法不僅有助於標準化測試，還可以設計出更高效的電輔車，以適應特定的騎行條件和用戶需求。我根據以上內容，也建立了Excel巨集，使用者可以直接輸入設定值，就能得到相關的數據，若有需求的，可以留言給我~我在提供給你!\n","permalink":"https://0Zhen.github.io/posts/2025-03-24/","summary":"\u003cp\u003e在進行符合EN-15194與R200等標準的電輔車測試時，準確計算自行車阻力是至關重要的。不同的坡度、自行車重量以及其他因素都會影響阻力計算。讓我們一起探討如何運用簡單的物理學原理來更有效地計算這些力。\u003c/p\u003e\n\u003ch2 id=\"自行車阻力的物理基礎\"\u003e自行車阻力的物理基礎\u003c/h2\u003e\n\u003cp\u003e自行車阻力並非單一的力，而是騎士必須克服的多種不同力的組合。了解每個組成部分有助於工程師設計更好的測試方案和更高效的電輔車。\u003c/p\u003e\n\u003ch2 id=\"騎行功率計算\"\u003e騎行功率計算\u003c/h2\u003e\n\u003cp\u003e在騎腳踏車時，總共會遇到風阻、摩擦力還有重力，這三個力的總和，就是總阻力。當我們知道總阻力，就能夠換算爬這個坡所需要的速度與扭力。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Create by\\u00a0ChrisLee\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*H9HCEB-EKs_bkaQtzj4bDg.png\"\u003e\n\u003cem\u003eCreate by ChrisLee\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e總阻力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e空氣阻力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e滾動摩擦力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e爬坡阻力\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e騎行功率則是總阻力乘以速度：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e騎行功率\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e總阻力\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e速度\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在實際應用中，我們通常知道的是車輪的轉速(RPM)而非線性速度。因此，我們計算：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e車輪周長\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e車輪直徑\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eπ\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e等效轉速\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e速度\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e車輪周長\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e騎行功率\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e總阻力\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e車輪半徑\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e等效轉速\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eπ\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e60\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其中2π/60是將每分鐘轉數轉換為每秒角速度的因子。\u003c/p\u003e\n\u003cp\u003e接著我們針對這三總力進行分析。\u003c/p\u003e\n\u003ch2 id=\"1-空氣阻力\"\u003e1. 空氣阻力\u003c/h2\u003e\n\u003cp\u003e空氣阻力是自行車在空氣中運動時，空氣對自行車產生的阻礙作用。根據流體力學方程式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e空氣阻力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0.5\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e空氣密度\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e阻力係數\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e迎風面積\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e速度平方\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其中：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e空氣密度\u003c/strong\u003e：單位體積空氣的質量(kg/m³)，在標準狀況下約為1.225 kg/m³\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e阻力係數\u003c/strong\u003e：與自行車和騎士的空氣動力學特性有關，無量綱，可以參考維基百科以及文獻進行設定。(根據DOVAL, Peter Nicholas. Aerodynamic analysis and drag coefficient evaluation of time-trial bicycle riders. 2012.文獻，公路車騎士風阻係數約為0.7)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e迎風面積\u003c/strong\u003e：自行車和騎士迎風的投影面積(m²)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e速度\u003c/strong\u003e：自行車的速度(m/s)，計算中通常從km/h轉換而來\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Weiki\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*xgs1ERxPCIWlo1BMcDKl6w.png\"\u003e\n\u003cem\u003eWeiki\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e空氣阻力隨速度的平方增加，因此在高速時它是主要的阻力來源，這也是為什麼跑車空力車的形狀都會扁扁奇形怪狀的XD。\u003c/p\u003e\n\u003ch2 id=\"2-滾動摩擦力\"\u003e2. 滾動摩擦力\u003c/h2\u003e\n\u003cp\u003e滾動摩擦力來自輪胎與地面的接觸。它與輪胎的材料、胎壓、路面狀況等因素有關：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e滾動摩擦力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e摩擦係數\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e總重量\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e重力加速度\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e cos(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e坡度角\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其中：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e摩擦係數\u003c/strong\u003e：與輪胎材質、胎壓、路面狀況等有關，無量綱(維基百科說明約為0.0022)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e總重量\u003c/strong\u003e：騎士和自行車的總重量(kg)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e重力加速度\u003c/strong\u003e：通常取9.8 m/s²\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e坡度角\u003c/strong\u003e：道路的坡度角，計算中從百分比坡度轉換為弧度\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Wiki\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*YQG0oC4J9ZNd3iKisDd6QA.png\"\u003e\n\u003cem\u003eWiki\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e餘弦項考慮了在坡度上略微減小的正向力分量。\u003c/p\u003e\n\u003ch2 id=\"3-重力阻力爬坡阻力\"\u003e3. 重力阻力(爬坡阻力)\u003c/h2\u003e\n\u003cp\u003e在爬坡時，自行車需要克服平行於坡面方向的重力分量：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e爬坡阻力\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e總重量\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e重力加速度\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e×\u003c/span\u003e sin(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e坡度角\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e這一力在較陡的坡度上變得顯著，並且與總重量成正比。\u003c/p\u003e\n\u003cp\u003e綜合以上數據，我們可以得到坡度、車重、風阻等等數字，得到當下的阻力，進一步計算出目標功率，以下我用了二分搜索算法，計算如何得到目標功率。\u003c/p\u003e\n\u003ch2 id=\"尋找等效坡度的二分搜索算法\"\u003e尋找等效坡度的二分搜索算法\u003c/h2\u003e\n\u003cp\u003e在測試電輔車時，我們經常需要找到需要特定目標功率的坡度。不直接解複雜方程，二分搜索算法提供了更通用的解決方案：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e從最小和最大可能坡度值開始\u003c/li\u003e\n\u003cli\u003e計算中點坡度所需的功率\u003c/li\u003e\n\u003cli\u003e如果計算功率高於目標，則減小坡度\u003c/li\u003e\n\u003cli\u003e如果計算功率低於目標，則增加坡度\u003c/li\u003e\n\u003cli\u003e重複直到計算功率收斂至目標功率\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e這種數值方法更為實用，因為像空氣阻力這樣的參數可能會隨速度變化，使直接求解方程變得困難。\u003c/p\u003e","title":"了解電輔車測試中的自行車阻力物理學"},{"content":"在嵌入式系統開發中，串列通訊（特別是UART/USART）是與外部設備連接的常用方式。本文將探討如何設計高效的UART驅動程式，重點關注兩個核心技術：函數指標和環形緩衝區。\n函數指標：實現靈活的回調機制 什麼是函數指標？ 函數指標是C語言中一個強大特性，允許我們在運行時動態選擇執行的函數。在UART驅動中，它特別適合實現回調（callback）機制。\n// 定義函數指標類型 typedef void (*uart_rx_callback_t)(char data); // 全域函數指標變數 static uart_rx_callback_t g_rx_callback[PORT_NUM] = {NULL}; // 註冊回調函數 void uart_register_callback(uint8_t port, uart_rx_callback_t callback) { if (port \u0026lt; PORT_NUM) { g_rx_callback[port] = callback; } } 為什麼使用函數指標？ 在UART驅動中，函數指標提供了以下優勢：\n解耦合：硬體驅動層與應用層之間實現松耦合 事件驅動：實現中斷驅動的事件處理模型 多通道支持：每個UART埠可配置不同的處理邏輯 靈活性：應用程式可以在運行時改變處理函數 環形緩衝區：高效的數據管理 什麼是環形緩衝區？ 環形緩衝區（Circular Buffer或Ring Buffer）是一種固定大小的緩衝區，當達到尾部時會自動環繞回開始位置，形成一個邏輯上的環。\ntypedef struct { uint8_t data[UART_BUFFER_SIZE]; // 緩衝區數據 uint16_t read_index; // 讀指針 uint16_t write_index; // 寫指針 bool is_full; // 滿標誌 bool is_empty; // 空標誌 } uart_ring_buffer_t; 高效的緩衝區操作 在環形緩衝區實現中，有一個關鍵的優化技巧：使用位元運算代替模運算。\n// 寫入一個字節到緩衝區 bool uart_buffer_write(uart_ring_buffer_t *buffer, uint8_t data) { if (buffer-\u0026gt;is_full) { return false; // 緩衝區已滿 } // 存儲數據 buffer-\u0026gt;data[buffer-\u0026gt;write_index] = data; // 更新寫指針，關鍵優化在這裡！ buffer-\u0026gt;write_index = (buffer-\u0026gt;write_index + 1) \u0026amp; (UART_BUFFER_SIZE - 1); // 更新緩衝區狀態 if (buffer-\u0026gt;write_index == buffer-\u0026gt;read_index) { buffer-\u0026gt;is_full = true; } buffer-\u0026gt;is_empty = false; return true; } 為什麼UART_BUFFER_SIZE必須是2的冪次方？ 注意上面代碼中的這一行：\nbuffer-\u0026gt;write_index = (buffer-\u0026gt;write_index + 1) \u0026amp; (UART_BUFFER_SIZE - 1); x%16\n當 UART_BUFFER_SIZE是2的冪次方（如16, 32, 64, 128）時，(UART_BUFFER_SIZE-1)的二進位表示全為1位元（如15的二進位是01111）。這使得位元與運算\u0026amp;等同於取模運算%，但效率高出許多：\nx%16 等同於 x\u0026amp;15 x%32 等同於 x\u0026amp;31 x%64 等同於 x\u0026amp;63 在嵌入式系統中，位元運算通常比模運算快5–15倍，這對於中斷處理程序中的時間關鍵型操作尤為重要。\n整合設計：完整的UART驅動實現 現在，讓我們看看如何將函數指標和環形緩衝區結合起來，設計一個完整的UART驅動程式。\n// 緩衝區定義 #define UART_BUFFER_SIZE 64 // 必須是2的冪次方！ static uart_ring_buffer_t rx_buffer[PORT_NUM]; static uart_ring_buffer_t tx_buffer[PORT_NUM]; // 回調函數指標 static uart_rx_callback_t rx_callback[PORT_NUM] = {NULL}; static uart_tx_complete_callback_t tx_complete_callback[PORT_NUM] = {NULL}; // 中斷處理函數 void UART1_IRQHandler(void) { uint8_t port = 0; // 接收中斷 if (UART_GetITStatus(UART1, UART_IT_RXNE)) { char rx_data = UART_ReceiveData(UART1); // 1. 存入環形緩衝區 uart_buffer_write(\u0026amp;rx_buffer[port], rx_data); // 2. 調用用戶回調函數 if (rx_callback[port] != NULL) { rx_callback[port](rx_data); } } // 發送完成中斷 if (UART_GetITStatus(UART1, UART_IT_TC)) { UART_ClearITPendingBit(UART1, UART_IT_TC); if (!uart_buffer_is_empty(\u0026amp;tx_buffer[port])) { // 還有數據要發送 uint8_t tx_data; uart_buffer_read(\u0026amp;tx_buffer[port], \u0026amp;tx_data); UART_SendData(UART1, tx_data); } else if (tx_complete_callback[port] != NULL) { // 發送完成，調用回調 tx_complete_callback[port](); } } } 初始化和註冊回調 void uart_init(uint8_t port, uint32_t baudrate) { // 硬體初始化代碼省略… // 初始化緩衝區 uart_buffer_init(\u0026amp;rx_buffer[port]); uart_buffer_init(\u0026amp;tx_buffer[port]); // 開啟中斷 UART_ITConfig(UART_INSTANCE[port], UART_IT_RXNE, ENABLE); } // 註冊接收回調 void uart_register_rx_callback(uint8_t port, uart_rx_callback_t callback) { rx_callback[port] = callback; } // 非阻塞式發送函數 bool uart_send_data(uint8_t port, const uint8_t *data, uint16_t length) { for (uint16_t i = 0; i \u0026lt; length; i++) { if (!uart_buffer_write(\u0026amp;tx_buffer[port], data[i])) { return false; // 緩衝區已滿 } } // 如果發送器空閒，啟動發送 if (UART_GetFlagStatus(UART_INSTANCE[port], UART_FLAG_TXE)) { uint8_t tx_data; if (uart_buffer_read(\u0026amp;tx_buffer[port], \u0026amp;tx_data)) { UART_SendData(UART_INSTANCE[port], tx_data); UART_ITConfig(UART_INSTANCE[port], UART_IT_TC, ENABLE); } } return true; } 實際應用示例 以下是一個使用這個UART驅動程式的簡單應用示例：\n// 自定義接收處理函數 void my_rx_handler(char data) { // 回顯接收到的字符 uart_send_data(0, (uint8_t*)\u0026amp;data, 1); // 其他處理邏輯… } int main(void) { // 系統初始化… // 初始化UART，設置波特率為115200 uart_init(0, 115200); // 註冊接收回調 uart_register_rx_callback(0, my_rx_handler); // 發送歡迎訊息 uart_send_data(0, (uint8_t*)\u0026#34;Hello UART!\\r\\n\u0026#34;, 13); while (1) { // 主循環 // … } } 性能與優化考慮 在設計UART驅動程式時，有幾個關鍵的性能考慮點：\n中斷延遲：中斷處理程序應該盡可能快速完成。使用環形緩衝區和位元運算可以最小化中斷處理時間。\n緩衝區大小：需要根據應用需求選擇合適的緩衝區大小。太小可能導致溢出，太大會浪費RAM。\n防止溢出：對於高速通訊，應該監測緩衝區狀態，必要時實現流控制。\n多UART管理：使用函數指標陣列可以統一管理多個UART埠，減少代碼冗餘。\n結論 高效的UART驅動程式設計需要結合多種技術：\n函數指標提供靈活的回調機制 環形緩衝區實現高效的數據管理 位元運算優化提升性能 中斷驅動模型實現非阻塞操作 這些技術不僅適用於UART，也可以擴展到其他嵌入式通訊介面，如SPI、I2C等。掌握這些核心概念，將幫助你設計出更高效、可靠的嵌入式驅動程式。\n— -\n本文討論的技術雖然基於C語言和裸機編程，但其核心理念也適用於RTOS環境或更高階的嵌入式系統開發。希望這些知識能幫助你在實際嵌入式項目中構建更高效的通訊模塊。\n","permalink":"https://0Zhen.github.io/posts/uart/","summary":"\u003cp\u003e在嵌入式系統開發中，串列通訊（特別是UART/USART）是與外部設備連接的常用方式。本文將探討如何設計高效的UART驅動程式，重點關注兩個核心技術：\u003cstrong\u003e函數指標\u003c/strong\u003e和\u003cstrong\u003e環形緩衝區\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"函數指標實現靈活的回調機制\"\u003e函數指標：實現靈活的回調機制\u003c/h2\u003e\n\u003ch3 id=\"什麼是函數指標\"\u003e什麼是函數指標？\u003c/h3\u003e\n\u003cp\u003e函數指標是C語言中一個強大特性，允許我們在運行時動態選擇執行的函數。在UART驅動中，它特別適合實現回調（callback）機制。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 定義函數指標類型\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etypedef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003evoid\u003c/span\u003e (\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003euart_rx_callback_t\u003c/span\u003e)(\u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e data);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 全域函數指標變數\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euart_rx_callback_t\u003c/span\u003e g_rx_callback[PORT_NUM] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {NULL};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 註冊回調函數\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003euart_register_callback\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003euint8_t\u003c/span\u003e port, \u003cspan style=\"color:#66d9ef\"\u003euart_rx_callback_t\u003c/span\u003e callback) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (port \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e PORT_NUM) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e g_rx_callback[port] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e callback;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"為什麼使用函數指標\"\u003e為什麼使用函數指標？\u003c/h3\u003e\n\u003cp\u003e在UART驅動中，函數指標提供了以下優勢：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e解耦合\u003c/strong\u003e：硬體驅動層與應用層之間實現松耦合\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e事件驅動\u003c/strong\u003e：實現中斷驅動的事件處理模型\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e多通道支持\u003c/strong\u003e：每個UART埠可配置不同的處理邏輯\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e靈活性\u003c/strong\u003e：應用程式可以在運行時改變處理函數\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"環形緩衝區高效的數據管理\"\u003e環形緩衝區：高效的數據管理\u003c/h2\u003e\n\u003ch3 id=\"什麼是環形緩衝區\"\u003e什麼是環形緩衝區？\u003c/h3\u003e\n\u003cp\u003e環形緩衝區（Circular Buffer或Ring Buffer）是一種固定大小的緩衝區，當達到尾部時會自動環繞回開始位置，形成一個邏輯上的環。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etypedef\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003euint8_t\u003c/span\u003e data[UART_BUFFER_SIZE]; \u003cspan style=\"color:#75715e\"\u003e// 緩衝區數據\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003euint16_t\u003c/span\u003e read_index; \u003cspan style=\"color:#75715e\"\u003e// 讀指針\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003euint16_t\u003c/span\u003e write_index; \u003cspan style=\"color:#75715e\"\u003e// 寫指針\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003ebool\u003c/span\u003e is_full; \u003cspan style=\"color:#75715e\"\u003e// 滿標誌\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003ebool\u003c/span\u003e is_empty; \u003cspan style=\"color:#75715e\"\u003e// 空標誌\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e} \u003cspan style=\"color:#66d9ef\"\u003euart_ring_buffer_t\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"高效的緩衝區操作\"\u003e高效的緩衝區操作\u003c/h3\u003e\n\u003cp\u003e在環形緩衝區實現中，有一個關鍵的優化技巧：使用位元運算代替模運算。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 寫入一個字節到緩衝區\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003ebool\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003euart_buffer_write\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003euart_ring_buffer_t\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003ebuffer, \u003cspan style=\"color:#66d9ef\"\u003euint8_t\u003c/span\u003e data) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eis_full) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e false; \u003cspan style=\"color:#75715e\"\u003e// 緩衝區已滿\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 存儲數據\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003edata[buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ewrite_index] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e data;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 更新寫指針，關鍵優化在這裡！\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ewrite_index \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ewrite_index \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e (UART_BUFFER_SIZE \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 更新緩衝區狀態\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ewrite_index \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eread_index) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eis_full \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e true;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e buffer\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eis_empty \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e false;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e true;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"為什麼uart_buffer_size必須是2的冪次方\"\u003e為什麼UART_BUFFER_SIZE必須是2的冪次方？\u003c/h3\u003e\n\u003cp\u003e注意上面代碼中的這一行：\u003c/p\u003e","title":"深入理解嵌入式UART驅動程式設計：從函數指標到環形緩衝區"},{"content":" Image by kjpargeter on Freepik\nAs a firmware engineer, I frequently encounter filtering problems in various applications. Whether it’s smoothing sensor data, implementing motor controls, or designing PID controllers, these all fundamentally relate to second-order systems. After years of practical experience, I’ve come to realize that understanding the underlying principles of first and second-order filters is crucial for any engineer working with real-world signals.\nVisual Demonstration Before diving into the theory, let’s look at a practical demonstration of how first and second-order filters behave:\nThis visualization shows:\nTop: Original signal (blue) with added noise (gray) Middle: First-order filter output (red, k=0.100) Bottom: Second-order filter output (green, f0=0.500, ζ=0.707) Notice how each filter type handles the noisy signal differently, with the second-order filter providing more sophisticated control over the response characteristics. Try to change the k, f0 on you own!\nThe Evolution of Second-Order Filters Engineers first noticed that many natural systems exhibited second-order characteristics through studying spring-mass-damper systems. This physical system comprises three essential elements:\nA spring providing restoration force (position-related) Mass providing inertia (acceleration-related) A damper providing resistance (velocity-related) As a firmware engineer, I’ve found this physical analogy particularly helpful when tuning PID controllers. The proportional term (P) acts like the spring, the derivative term (D) like the damper, and the integral term (I) accumulates error similar to how mass accumulates momentum.\nThese observations led to the development of mathematical models described by second-order differential equations:\nm(d²x/dt²) + c(dx/dt) + kx = F where:\nm is mass c is the damping coefficient k is the spring constant F is the external force x is displacement From First to Second-Order Digital Filters First-Order Filter In my experience, first-order filters are excellent for simple smoothing tasks where minimal delay is crucial. The basic equation is:\ny[n] = y[n-1] + k*(x[n]-y[n-1]) or alternatively:\ny[n] = (1-k)*y[n-1] + k*x[n] where k is the filtering coefficient between 0 and 1. I often start with first-order filters for basic sensor noise reduction because they’re intuitive to tune and computationally efficient.\nSecond-Order Filter When I need more control over the response characteristics, especially in motor control applications or when dealing with resonant systems, I turn to second-order filters:\nY[n] = a1*Y[n-1] + a2*Y[n-2] + b0*X[n] + b1*X[n-1] + b2*X[n-2] This equation corresponds to three physical aspects:\nPosition (signal value) Velocity (first-order rate of change) Acceleration (second-order rate of change) Key Parameters and Characteristics Critical Parameters Cutoff Frequency (f0): Determines the system’s “elasticity” Damping Coefficient (ζ): ζ \u0026lt; 1: Underdamped, exhibits oscillation ζ = 1: Critically damped, fastest non-oscillating response ζ \u0026gt; 1: Overdamped, slowly approaches target In my firmware work, I’ve found that starting with critically damped settings (ζ = 1) and then adjusting based on system response is often the most practical approach.\nCoefficient Meanings Feedback Coefficients (a1, a2): Control system dependency on previous output values Determine system \u0026#34;memory\u0026#34; capability Influence resonance characteristics and stability Feedforward Coefficients (b0, b1, b2): Control system response to input signals Determine weights for current and past inputs Affect sensitivity to input changes Applications in Firmware Engineering In my experience, these filters are essential in:\nSensor data processing Accelerometer/gyroscope data smoothing Temperature sensor reading stabilization Position encoder noise reduction Motor control Speed regulation Position control Torque smoothing Signal processing Audio processing Vibration analysis Power supply regulation Practical Implementation Tips From my years of firmware development, here are some key insights:\nStart Simple Begin with a first-order filter Only move to second-order if you need more control Document your tuning process Resource Considerations First-order filters are computationally lighter Second-order filters need more memory (previous states) Consider fixed-point arithmetic for embedded systems Tuning Process Start with conservative parameters Increase responsiveness gradually Always test with real-world signals Interactive Comparison Tool To help engineers better understand these concepts, I’ve created an interactive tool using Streamlit that allows you to:\nVisualize both filter responses in real-time Adjust filter parameters and see immediate effects Compare filtering performance on various input signals Conclusion After years of working with these filters in firmware development, I’ve come to appreciate their elegant simplicity and power. While the mathematics might seem daunting at first, understanding the physical analogies and having proper visualization tools makes them much more approachable.\nWhether you’re working on motor control systems, processing sensor data, or implementing PID controllers, having a solid grasp of first and second-order filters will significantly improve your ability to design robust and efficient systems.\n","permalink":"https://0Zhen.github.io/posts/understanding-first-and-second-order-filters-from-physical-systems-to-digital-implementation/","summary":"\u003cp\u003e\u003cimg alt=\"Image by kjpargeter on\\u00a0Freepik\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*aN2ag3geLYT2T_QgElIToA.jpeg\"\u003e\n\u003cem\u003eImage by kjpargeter on Freepik\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAs a firmware engineer, I frequently encounter filtering problems in various applications. Whether it’s smoothing sensor data, implementing motor controls, or designing PID controllers, these all fundamentally relate to second-order systems. After years of practical experience, I’ve come to realize that understanding the underlying principles of first and second-order filters is crucial for any engineer working with real-world signals.\u003c/p\u003e\n\u003ch2 id=\"visual-demonstration\"\u003eVisual Demonstration\u003c/h2\u003e\n\u003cp\u003eBefore diving into the theory, let’s look at a practical demonstration of how first and second-order filters behave:\u003c/p\u003e","title":"Understanding First and Second-Order Filters: From Physical Systems to Digital Implementation"},{"content":"一開始在學C 語言的時候，常遇到有些功能可以使用，有些不行，後來才知道，標準函式庫的存在。標準函式庫是每個 C 程式設計師必須掌握的基礎工具。本文將詳細介紹各個重要的標準函式庫、引入方式及其常用函數。\nInclude 指令說明 在 C 語言中，我們使用 #include 預處理指令來引入標準函式庫。有兩種主要的引入方式：\n1. 使用尖括號 \u0026lt; \u0026gt; #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; 這種方式用於引入標準函式庫 編譯器會在系統的標準函式庫目錄中查找頭文件 建議用於引入所有標準函式庫 2. 使用雙引號 “ “ #include \u0026#34;myheader.h\u0026#34; 這種方式主要用於引入自定義的頭文件 編譯器會先在當前目錄查找，如果找不到才會到系統目錄查找 適用於引入專案中自己創建的頭文件 常見引入示例 // 基本程序常用引入 #include \u0026lt;stdio.h\u0026gt; // 輸入輸出相關 #include \u0026lt;stdlib.h\u0026gt; // 工具函數相關 // 字符串處理相關 #include \u0026lt;string.h\u0026gt; // 字符串函數 #include \u0026lt;ctype.h\u0026gt; // 字符類型判斷 // 數學計算相關 #include \u0026lt;math.h\u0026gt; // 數學函數 #include \u0026lt;float.h\u0026gt; // 浮點數限制 #include \u0026lt;limits.h\u0026gt; // 整數限制 // 時間相關 #include \u0026lt;time.h\u0026gt; // 時間函數 // 錯誤處理相關 #include \u0026lt;errno.h\u0026gt; // 錯誤碼 #include \u0026lt;assert.h\u0026gt; // 斷言 // 國際化支持 #include \u0026lt;locale.h\u0026gt; // 本地化設置 #include \u0026lt;wchar.h\u0026gt; // 寬字符支持 最佳實踐 1. 避免重複引入 #ifndef MYHEADER_H #define MYHEADER_H // 頭文件內容 #endif 2. 引入順序建議 — 標準 C 函式庫 — 系統相關標準庫 — 第三方函式庫 — 專案自定義頭文件\n3. 只引入需要的 — 避免引入不必要的標準庫 — 可以減少編譯時間和可能的命名衝突\n1. stdio.h — 標準輸入輸出函式庫 基本輸入輸出函數 printf(format,...) — 格式化輸出 scanf(format,..) — 格式化輸入 printf(format,...) — 格式化輸出 scanf(format,...) — 格式化輸入 putchar(char) — 輸出單個字符 getchar() — 讀取單個字符 puts(str) — 輸出字符串並換行 gets(str) — 讀取一行（不建議使用，因為不安全） 檔案操作函數 fopen(filename,mode) — 開啟檔案 — 模式：”r”（讀取），”w”（寫入），”a”（追加） fclose(file) — 關閉檔案 fprintf(file,format,...) — 格式化寫入檔案 fscanf(file,format,...) — 從檔案格式化讀取 fgets(str,n,file) — 從檔案讀取一行 fputs(str,file) — 寫入字符串到檔案 fseek(file,offset,whence) — 移動檔案指針 ftell(file) — 獲取當前檔案位置 rewind(file) — 將檔案指針重置到開頭 2. stdlib.h — 標準工具函式庫 記憶體管理 malloc(size) — 分配指定大小的記憶體 calloc(num,size) — 分配並清零記憶體 realloc(ptr,size) — 重新分配記憶體 free(ptr) — 釋放記憶體 字符串轉換 atoi(str) — 字符串轉整數 atol(str) — 字符串轉長整數 atof(str) — 字符串轉浮點數 strtol(str,endptr,base) — 字符串轉長整數，可指定進制 strtod(str,endptr) — 字符串轉雙精度浮點數 亂數生成 rand() — 生成偽隨機數 srand(seed) — 設置隨機數種子 RAND_MAX — 隨機數的最大值 其他工具函數 abs(n) — 整數絕對值 labs(n) — 長整數絕對值 div(numer,denom) — 整數除法，返回商和餘數 qsort(base,num,size,compar) — 快速排序 bsearch(key,base,num,size,compar) — 二分查找 exit(status) — 終止程序 3. string.h — 字符串處理函式庫 字符串操作 strlen(str) — 計算字符串長度 strcpy(dest,src) — 複製字符串 strncpy(dest,src,n) — 複製指定長度的字符串 stract(dest,src) — 連接字符串 strncat(dest,src,n) — 連接指定長度的字符串 strcmp(str1,str2) — 比較字符串 strncmp(str1,str2,n) — 比較指定長度的字符串 字符串搜索 strchr(str,char) — 查找字符第一次出現的位置 strrchr(str,char) — 查找字符最後一次出現的位置 strstr(haystack,needle) — 查找子字符串 strtok(str,delim) — 分割字符串 記憶體操作 memcpy(dest,src,n) — 複製記憶體區域 memmove(dest,src,n) — 移動記憶體區域（處理重疊） memset(ptr,value,n) — 填充記憶體區域 memecmp(ptr1,ptr2,n) — 比較記憶體區域 4. math.h — 數學函式庫 基本數學運算 pow(x,y) — x 的 y 次方 sqrt(x) — 平方根 cbrt(x) — 立方根 ceil(x) — 向上取整 floor(x) — 向下取整 round(x) — 四捨五入 fabs(x) — 浮點數絕對值 三角函數 sin(x) , cos(x) , tan(x) — 基本三角函數 asin(x), acos(x), atan(x) — 反三角函數 sinh(x), cosh(x), tanh(x) — 雙曲三角函數 對數與指數 exp(x) — e 的 x 次方 log(x) — 自然對數 log10(x) — 以 10 為底的對數 log2(x) — 以 2 為底的對數 5. time.h — 時間處理函式庫 時間獲取 time(time_t*) — 獲取當前時間戳 clock() — 獲取程序執行時間 difftime(time1,time2) — 計算時間差 時間轉換 localtime(const time_t*) — 轉換為本地時間 gmtime(const time_t*) — 轉換為 GMT 時間 mktime(struct tm*) — 轉換時間結構為時間戳 strftime() — 格式化時間字符串 6. ctype.h — 字符類型函式庫 字符檢測 isalpha(c) — 檢查是否為字母 isdigit(c) — 檢查是否為數字 isalnum(c) — 檢查是否為字母或數字 isspace(c) — 檢查是否為空白字符 ispunct(c) — 檢查是否為標點符號 isupper(c) — 檢查是否為大寫字母 islower(c) — 檢查是否為小寫字母 字符轉換 toupper(c) — 轉換為大寫字母 tolower(c) — 轉換為小寫字母 最佳實踐 1. 記憶體管理 — 使用 malloc() 時必須檢查返回值是否為 NULL — 釋放記憶體後將指針設為 NULL — 使用 free() 釋放記憶體時要確保指針有效\n2. 檔案操作 — 開啟檔案後要檢查是否成功 — 操作完成後要及時關閉檔案 — 使用 fgets() 代替不安全的 gets()\n3. 字符串處理 — 使用 strncpy() 代替 strcpy() 防止緩衝區溢出 — 使用 strncat() 代替 strcat() 控制連接長度 — 字符串操作前檢查目標緩衝區大小\n4. 錯誤處理 — 合理使用 errno 進行錯誤處理 — 函數返回值要進行適當的檢查 — 使用 perror() 輸出錯誤信息\n結語 C 語言標準函式庫提供了豐富的功能，掌握這些函式庫可以大大提高編程效率。在實際使用中，要注意：\n安全性：避免緩衝區溢出，注意內存洩漏 效率：選擇合適的函數，避免不必要的計算 可靠性：做好錯誤處理，確保程序穩定運行 ","permalink":"https://0Zhen.github.io/posts/2025-02-13/","summary":"\u003cp\u003e一開始在學C 語言的時候，常遇到有些功能可以使用，有些不行，後來才知道，標準函式庫的存在。標準函式庫是每個 C 程式設計師必須掌握的基礎工具。本文將詳細介紹各個重要的標準函式庫、引入方式及其常用函數。\u003c/p\u003e\n\u003ch2 id=\"include-指令說明\"\u003eInclude 指令說明\u003c/h2\u003e\n\u003cp\u003e在 C 語言中，我們使用 \u003ccode\u003e#include\u003c/code\u003e 預處理指令來引入標準函式庫。有兩種主要的引入方式：\u003c/p\u003e\n\u003ch3 id=\"1-使用尖括號-\"\u003e1. 使用尖括號 \u0026lt; \u0026gt;\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e這種方式用於引入標準函式庫\u003c/li\u003e\n\u003cli\u003e編譯器會在系統的標準函式庫目錄中查找頭文件\u003c/li\u003e\n\u003cli\u003e建議用於引入所有標準函式庫\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-使用雙引號-\"\u003e2. 使用雙引號 “ “\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026#34;myheader.h\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e這種方式主要用於引入自定義的頭文件\u003c/li\u003e\n\u003cli\u003e編譯器會先在當前目錄查找，如果找不到才會到系統目錄查找\u003c/li\u003e\n\u003cli\u003e適用於引入專案中自己創建的頭文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"常見引入示例\"\u003e常見引入示例\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 基本程序常用引入\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 輸入輸出相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 工具函數相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 字符串處理相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;string.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 字符串函數\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;ctype.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 字符類型判斷\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 數學計算相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;math.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 數學函數\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;float.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 浮點數限制\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;limits.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 整數限制\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 時間相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;time.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 時間函數\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 錯誤處理相關\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;errno.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 錯誤碼\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;assert.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 斷言\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 國際化支持\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;locale.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 本地化設置\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#include\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e\u0026lt;wchar.h\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e \u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e// 寬字符支持\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"最佳實踐\"\u003e最佳實踐\u003c/h2\u003e\n\u003ch3 id=\"1-避免重複引入\"\u003e1. 避免重複引入\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#ifndef MYHEADER_H\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#define MYHEADER_H\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 頭文件內容\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#endif\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"2-引入順序建議\"\u003e2. 引入順序建議\u003c/h3\u003e\n\u003cp\u003e— 標準 C 函式庫\n — 系統相關標準庫\n — 第三方函式庫\n — 專案自定義頭文件\u003c/p\u003e","title":"C 語言標準函式庫完整指南"},{"content":"In this digital era, monitoring personal assets is crucial for financial management. Today, I’ll share how to create a practical asset tracking web application by combining GitHub and Streamlit.\nWhy GitHub + Streamlit? GitHub provides: Free and reliable data storage Version control Collaborative environment Streamlit offers: Simple Python web development framework Rich data visualization tools Free cloud hosting Project Architecture The project consists of three main components:\nGitHub repository storing asset data in JSON format Python scripts for data processing Streamlit web interface for data visualization Implementation Steps 1. GitHub Setup First, we need to:\nCreate a GitHub repository Generate a Personal Access Token Enable automated data read/write 2. Building the Streamlit App Key code example:\nimport streamlit as st import pandas as pd import plotly.express as px from datetime import datetime import json # Page configuration st.set_page_config(page_title=\u0026#34;Asset Tracking Dashboard\u0026#34;, layout=\u0026#34;wide\u0026#34;) # Data loading @st.cache_data def load_data(): # Logic for reading data from GitHub … # Main interface def main(): st.title(\u0026#34;Asset Tracking Dashboard\u0026#34;) # Data input section with st.sidebar: st.header(\u0026#34;Add/Update Record\u0026#34;) # Input form … # Chart display section st.header(\u0026#34;Asset Trends\u0026#34;) # Using Plotly for visualization … 3. Deploying to Streamlit Cloud Deployment steps:\nSign up for Streamlit Cloud Connect GitHub account Select repository for deployment Set up environment variables (e.g., GitHub Token) Features 1. Data Management Automatic GitHub synchronization Historical record tracking Secure data storage 2. Visualization Asset trend charts Daily profit statistics Overall return analysis 3. User Interface Clean input forms Real-time data updates Responsive design Extension Ideas Add more asset categories Implement data backup mechanisms Include additional analysis metrics Add alert functionality Results Profit tends.\nAdd the Input add current value of the asset.\nConclusion This project demonstrates how to quickly build a practical personal application using modern tools. By combining GitHub and Streamlit, we’ve not only solved the challenges of data storage and visualization but also created a scalable application architecture.\nIf you’re interested in this project, feel free to leave a comment below. I’m happy to share more details about the implementation or source code upon request.\nAfterword The purpose of this article is to help others understand how to use free tools to build their own asset tracking system. Technology shouldn’t be a barrier to financial management but rather a tool to help us make better decisions.\nIf you have similar project ideas or experiences, please share them in the comments section!\n","permalink":"https://0Zhen.github.io/posts/building-a-personal-asset-tracking-dashboard-with-github-streamlit/","summary":"\u003cp\u003eIn this digital era, monitoring personal assets is crucial for financial management. Today, I’ll share how to create a practical asset tracking web application by combining GitHub and Streamlit.\u003c/p\u003e\n\u003ch2 id=\"why-github--streamlit\"\u003eWhy GitHub + Streamlit?\u003c/h2\u003e\n\u003ch3 id=\"github-provides\"\u003eGitHub provides:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFree and reliable data storage\u003c/li\u003e\n\u003cli\u003eVersion control\u003c/li\u003e\n\u003cli\u003eCollaborative environment\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"streamlit-offers\"\u003eStreamlit offers:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSimple Python web development framework\u003c/li\u003e\n\u003cli\u003eRich data visualization tools\u003c/li\u003e\n\u003cli\u003eFree cloud hosting\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"project-architecture\"\u003eProject Architecture\u003c/h2\u003e\n\u003cp\u003eThe project consists of three main components:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGitHub repository storing asset data in JSON format\u003c/li\u003e\n\u003cli\u003ePython scripts for data processing\u003c/li\u003e\n\u003cli\u003eStreamlit web interface for data visualization\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"implementation-steps\"\u003eImplementation Steps\u003c/h2\u003e\n\u003ch3 id=\"1-githubsetup\"\u003e1. GitHub Setup\u003c/h3\u003e\n\u003cp\u003eFirst, we need to:\u003c/p\u003e","title":"Building a Personal Asset Tracking Dashboard with GitHub + Streamlit"},{"content":"In motor systems, observing abnormally high no-load current can be puzzling. This article explores a commonly overlooked cause: excessive viscous coefficient.\nCredit:https://images.app.goo.gl/YQU4uTSiz9EaLQSv8\nRelationship Between No-Load Current and Viscous Friction During motor no-load operation, the dynamic equation can be simplified to:\nJ(dω/dt) + Bω = Tem\nAt steady-state speed, with zero acceleration, the equation further simplifies to:\nBω = Tem\nAt this point, the electromagnetic torque primarily overcomes viscous friction, and the electromagnetic torque is proportional to current:\nTem = KtI\nTherefore:\nI = (B/Kt)ω\nWhy Might the Viscous Coefficient Be Abnormally High? 1. Mechanical Causes — Poor bearing lubrication — Overtight seals — Excessive bearing preload — Gearbox lubricant viscosity too high\nEnvironmental Factors — Low temperature causing increased lubricant viscosity — Dust contamination — Humid environment\nDesign Issues — Insufficient clearance — Improper seal design — Inadequate lubrication system design\nHow to Diagnose Viscous Coefficient Issues? 1. Free Deceleration Test ω(t) = ω₀e^(-Bt/J)\nObserve deceleration time after power-off Should not decay too quickly under normal conditions 2. No-Load Power Analysis P = Bω²\nMeasure input power at different speeds Plot P-ω² curve Compare with standard values 3. Temperature Effect Testing Measure no-load current at different temperatures Observe temperature-current relationship Solutions Mechanical Adjustments — Check and adjust bearing preload — Replace with appropriate viscosity lubricant — Clean and re-lubricate 2.Environmental Improvements — Enhance sealing — Control ambient temperature — Regular cleaning\nDesign Optimization — Optimize clearance — Improve seal design — Enhance lubrication system Measurement Methods 1. Viscous Coefficient Determination Using three previously mentioned methods:\nFree deceleration method Constant speed power method Torque-speed method 2. Experimental Considerations\nEnsure stable measurement temperature Use calibrated measuring instruments Take multiple measurements for averaging Record environmental conditions Viscous Coefficient Reference Values The normal range of viscous coefficients depends on several factors:\nMotor type and design Bearing type and size Lubrication method and lubricant properties Operating speed range Ambient temperature Recommended reference sources:\nMotor manufacturer technical specifications Bearing manufacturer design manuals Relevant industrial standards Laboratory test data For system diagnostics, the best reference values are historical data from the motor under normal operating conditions.\nConclusion High no-load current can indeed be caused by abnormal viscous coefficients. Through systematic testing and analysis, we can:\nConfirm if the viscous coefficient is abnormal Identify specific causes Implement appropriate improvement measures Regular monitoring and maintenance can prevent such issues and ensure motor system performance and longevity.\n— -\nThis article provides technical reference for analyzing and solving motor high no-load current issues. Specific applications require consideration of actual system characteristics and operating conditions.\n","permalink":"https://0Zhen.github.io/posts/analysis-of-high-no-load-current-and-viscous-coefficient-correlation/","summary":"\u003cp\u003eIn motor systems, observing abnormally high no-load current can be puzzling. This article explores a commonly overlooked cause: excessive viscous coefficient.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Credit:https://images.app.goo.gl/YQU4uTSiz9EaLQSv8\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*JgE5PQKxktI2HKGz.jpg\"\u003e\n\u003cem\u003eCredit:https://images.app.goo.gl/YQU4uTSiz9EaLQSv8\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"relationship-between-no-load-current-and-viscousfriction\"\u003eRelationship Between No-Load Current and Viscous Friction\u003c/h2\u003e\n\u003cp\u003eDuring motor no-load operation, the dynamic equation can be simplified to:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJ(dω/dt) + Bω = Tem\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAt steady-state speed, with zero acceleration, the equation further simplifies to:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBω = Tem\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAt this point, the electromagnetic torque primarily overcomes viscous friction, and the electromagnetic torque is proportional to current:\u003c/p\u003e","title":"Analysis of High No-Load Current and Viscous Coefficient Correlation"},{"content":"Memory management in C can be tricky, especially for beginners. In this article, we’ll explore the differences between malloc and calloc, and look at some common mistakes developers make when using these functions.\nThe Basics: malloc vs calloc Let’s start with the basic differences between these two memory allocation functions:\nmalloc (Memory Allocation) Allocates memory but doesn’t initialize it Takes one parameter: the total number of bytes needed Faster execution as it doesn’t initialize memory Memory contains garbage values after allocation int *arr = malloc(100 * sizeof(int)); // Allocates memory for 100 integers calloc (Contiguous Allocation) Allocates memory and initializes all bytes to zero Takes two parameters: number of elements and size of each element Slower than malloc because it initializes memory Memory is guaranteed to be zero after allocation int *arr = calloc(100, sizeof(int)); // Allocates and zeros memory for 100 integers Why Use malloc + memset in Firmware Development? In firmware development, developers often prefer using malloc followed by memset instead of calloc. Here’s why:\nBetter Memory Control — You can initialize memory to any value, not just zero — You can initialize specific portions of memory — More explicit control over the initialization process\nDebugging — Easier to add checks between allocation and initialization — Better control over error handling — More visible memory management flow\nFlexibility — Can initialize memory in sections — Can use different values for different sections — More control over the initialization timing\nExample of malloc + memset:\nint *arr = malloc(100 * sizeof(int)); if (arr != NULL) { memset(arr, 0, 100 * sizeof(int)); // Initialize to zero } Common Mistakes to Avoid Mistake 1: Wrong sizeof with Pointers One of the most common mistakes is using sizeof on a pointer instead of the allocated memory:\n// WRONG int *arr = malloc(100 * sizeof(int)); memset(arr, 0, sizeof(arr)); // This only clears pointer size (4 or 8 bytes)! // CORRECT int *arr = malloc(100 * sizeof(int)); memset(arr, 0, 100 * sizeof(int)); // This clears the entire allocated memory Mistake 2: Not Checking for NULL Always check if memory allocation was successful:\nint *arr = malloc(100 * sizeof(int)); if (arr == NULL) { // Handle error return; } memset(arr, 0, 100 * sizeof(int)); Mistake 3: Forgetting to Free Memory Always free allocated memory when you’re done with it:\nint *arr = malloc(100 * sizeof(int)); // Use the array… free(arr); // Don\u0026#39;t forget this! Best Practices Always check for allocation failures Keep track of allocated memory size Always free memory when you’re done Use calloc when you need zero-initialized memory Use malloc + memset when you need more control Conclusion Understanding the differences between malloc and calloc, and knowing how to use them correctly, is crucial for C programming. While calloc provides a convenient way to allocate and initialize memory, using malloc with memset gives you more control and flexibility, especially in firmware development.\nRemember to always manage your memory carefully and avoid common pitfalls like using sizeof on pointers instead of the actual allocated memory size. Happy coding!\n","permalink":"https://0Zhen.github.io/posts/understanding-memory-management-in-c-malloc-calloc-and-common-mistakes/","summary":"\u003cp\u003eMemory management in C can be tricky, especially for beginners. In this article, we’ll explore the differences between \u003ccode\u003emalloc\u003c/code\u003e and \u003ccode\u003ecalloc\u003c/code\u003e, and look at some common mistakes developers make when using these functions.\u003c/p\u003e\n\u003ch2 id=\"the-basics-malloc-vscalloc\"\u003eThe Basics: malloc vs calloc\u003c/h2\u003e\n\u003cp\u003eLet’s start with the basic differences between these two memory allocation functions:\u003c/p\u003e\n\u003ch3 id=\"malloc-memory-allocation\"\u003emalloc (Memory Allocation)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAllocates memory but doesn’t initialize it\u003c/li\u003e\n\u003cli\u003eTakes one parameter: the total number of bytes needed\u003c/li\u003e\n\u003cli\u003eFaster execution as it doesn’t initialize memory\u003c/li\u003e\n\u003cli\u003eMemory contains garbage values after allocation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003earr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emalloc\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e100\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003esizeof\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e)); \u003cspan style=\"color:#75715e\"\u003e// Allocates memory for 100 integers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"calloc-contiguous-allocation\"\u003ecalloc (Contiguous Allocation)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAllocates memory and initializes all bytes to zero\u003c/li\u003e\n\u003cli\u003eTakes two parameters: number of elements and size of each element\u003c/li\u003e\n\u003cli\u003eSlower than malloc because it initializes memory\u003c/li\u003e\n\u003cli\u003eMemory is guaranteed to be zero after allocation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003earr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ecalloc\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e100\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003esizeof\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e)); \u003cspan style=\"color:#75715e\"\u003e// Allocates and zeros memory for 100 integers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"why-use-malloc--memset-in-firmware-development\"\u003eWhy Use malloc + memset in Firmware Development?\u003c/h2\u003e\n\u003cp\u003eIn firmware development, developers often prefer using \u003ccode\u003emalloc\u003c/code\u003e followed by \u003ccode\u003ememset\u003c/code\u003e instead of \u003ccode\u003ecalloc\u003c/code\u003e. Here’s why:\u003c/p\u003e","title":"Understanding Memory Management in C: malloc, calloc, and Common Mistakes"},{"content":" Credit: Hyena\nMarket Challenges and Strategic Imperatives In 2025, Taiwan’s bicycle industry confronts significant market challenges, particularly the potential implementation of a 60% tariff on exports to the United States market. This development has accelerated the urgency to enhance Made in Taiwan (MIT) production capabilities and reevaluate strategic positioning in the global market.\nStrategic Differentiation Initiatives 1. Enhanced Value Proposition The industry is strategically pivoting from pure price competition to delivering superior value propositions. Manufacturers are focusing on optimizing the balance between product quality and cost efficiency to establish sustainable competitive advantages.\n2. Comprehensive Service Integration A key differentiator lies in the development of an integrated service ecosystem encompassing:\nStrategic pre-sales consultation Enhanced sales support mechanisms Comprehensive after-sales service infrastructure This systematic approach ensures seamless customer experience throughout the product lifecycle.\n3. Innovation Ecosystem Development The industry is fostering an open development environment that:\nEncourages technological innovation Facilitates collaborative development Accelerates solution implementation Business Model Transformation The industry is undertaking a significant transformation in its business model, evolving from a traditional B2B focus to an integrated B2B+B2C approach:\nEstablishing a comprehensive service ecosystem Implementing sophisticated direct-to-consumer digital platforms Creating seamless integration between B2B and B2C channels Human Capital Challenges and Strategic Response Competitive Landscape for Talent The industry faces intensifying competition for talent, primarily driven by:\nAggressive recruitment from high-technology sectors Competitive compensation packages in the tech industry Shifting workforce preferences towards emerging industries Strategic Human Capital Initiatives To address these challenges, companies are implementing comprehensive strategies:\nDeveloping robust industry-academic collaboration programs Accelerating smart manufacturing implementation Restructuring compensation frameworks to enhance talent retention Investing in workforce development and specialized training programs Forward-Looking Perspective The Taiwan bicycle industry stands at a critical juncture of transformation. Through strategic initiatives in product development, service enhancement, and business model innovation, the industry is positioning itself for sustainable growth.\nSuccess in this evolving landscape will depend on maintaining strategic agility while executing operational excellence. The industry’s commitment to differentiation and innovation continues to reinforce Taiwan’s position as a leading force in the global bicycle market.\nThe combination of strategic foresight and practical implementation capabilities will be crucial in navigating through current challenges while capturing emerging opportunities in the global marketplace.\n","permalink":"https://0Zhen.github.io/posts/2025-taiwan-bicycle-industry-navigating-challenges-and-transformation/","summary":"\u003cp\u003e\u003cimg alt=\"Credit: Hyena\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*u48DwOPcSnO5lVN8\"\u003e\n\u003cem\u003eCredit: Hyena\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"market-challenges-and-strategic-imperatives\"\u003eMarket Challenges and Strategic Imperatives\u003c/h2\u003e\n\u003cp\u003eIn 2025, Taiwan’s bicycle industry confronts significant market challenges, particularly the potential implementation of a 60% tariff on exports to the United States market. This development has accelerated the urgency to enhance Made in Taiwan (MIT) production capabilities and reevaluate strategic positioning in the global market.\u003c/p\u003e\n\u003ch2 id=\"strategic-differentiation-initiatives\"\u003eStrategic Differentiation Initiatives\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003e1. Enhanced Value Proposition\u003c/strong\u003e\u003c/em\u003e\nThe industry is strategically pivoting from pure price competition to delivering superior value propositions. Manufacturers are focusing on optimizing the balance between product quality and cost efficiency to establish sustainable competitive advantages.\u003c/p\u003e","title":"2025 Taiwan Bicycle Industry: Navigating Challenges and Transformation"},{"content":"\nHave you ever wondered how your sensitive information stays secure when you browse the internet? The answer lies in a remarkable encryption system called RSA, named after its brilliant creators: Ron Rivest, Adi Shamir, and Leonard Adleman. In 1977, while working at MIT, these three mathematicians developed what would become one of the most fundamental building blocks of modern digital security.\nThe Simple Yet Powerful Idea Behind RSA At its core, RSA is based on an elegant mathematical principle: multiplying two large prime numbers is easy, but working backwards to figure out which prime numbers were multiplied together is incredibly difficult. This asymmetry — easy in one direction, nearly impossible in the reverse — is what makes RSA such a powerful encryption system.\nHow RSA Works: A Peek Under the Hood Imagine you have two massive prime numbers, each hundreds of digits long. Multiply them together, and you get an even larger number. This product becomes part of your public key — the key that anyone can use to encrypt messages for you. The fascinating part? Even if someone knows this large number, they can’t practically figure out the original prime numbers that created it. This mathematical challenge is known as the factorization problem.\nHow to Generate Public and Private Keys The Public-Private Key Dance RSA introduces an ingenious system of key pairs:\nA public key that anyone can use to encrypt messages A private key that only you possess to decrypt those messages Think of the public key as an open padlock that you distribute widely. Anyone can put a message in a box and lock it using this padlock. However, only you, with your private key (the unique key to that padlock), can open it and read the message.\nThe Relationship Between Public and Private Keys Why It’s Practically Unbreakable Let’s put the security of RSA into perspective:\nA typical RSA key today uses numbers that are 2048 or 4096 bits long In 1991, factoring a 409-digit number (RSA-129) took 8 months In 2020, breaking a 829-digit number (RSA-250) required 2700 core-years of computing power Modern RSA keys are significantly larger and more secure than these examples The Quantum Computing Challenge While RSA has proven remarkably resilient against traditional computing attacks, the advent of quantum computing poses new challenges. Theoretical quantum computers could potentially factor large numbers much more quickly than classical computers. However, practical quantum computers capable of breaking RSA are still far from reality.\nStaying Ahead of the Game The beauty of RSA lies in its scalability. As computing power increases, we can simply use larger prime numbers to maintain security. This adaptability has helped RSA remain secure for over four decades, and it continues to protect millions of digital transactions every day.\nWhy This Matters Every time you:\nCheck your email Make an online purchase Access your bank account online Send a secure message You’re likely using RSA encryption or one of its variants. It’s the invisible guardian of our digital lives, ensuring that our sensitive information remains private and secure.\nThe Human Element Perhaps the most remarkable aspect of RSA is how it transformed a profound mathematical concept into a practical solution for digital security. It’s a testament to human ingenuity — how three mathematicians at MIT took an abstract mathematical principle and used it to solve one of the most fundamental challenges of the digital age: secure communication.\nLooking Forward As we move deeper into the digital age, the importance of encryption systems like RSA only grows. While quantum computing may eventually necessitate new approaches to encryption, the fundamental principles behind RSA — mathematical complexity and computational asymmetry — will likely continue to influence how we think about and implement digital security.\nThe next time you send a secure message or make an online purchase, remember the elegant mathematical dance happening behind the scenes, keeping your information safe through the simple yet powerful principle of prime number factorization.\n","permalink":"https://0Zhen.github.io/posts/rsa-encryption-the-mathematical-magic-behind-digital-security/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*X0DqfXoYNn2iJ955CGdsEQ.png\"\u003e\u003c/p\u003e\n\u003cp\u003eHave you ever wondered how your sensitive information stays secure when you browse the internet? The answer lies in a remarkable encryption system called RSA, named after its brilliant creators: Ron Rivest, Adi Shamir, and Leonard Adleman. In 1977, while working at MIT, these three mathematicians developed what would become one of the most fundamental building blocks of modern digital security.\u003c/p\u003e\n\u003ch2 id=\"the-simple-yet-powerful-idea-behindrsa\"\u003eThe Simple Yet Powerful Idea Behind RSA\u003c/h2\u003e\n\u003cp\u003eAt its core, RSA is based on an elegant mathematical principle: multiplying two large prime numbers is easy, but working backwards to figure out which prime numbers were multiplied together is incredibly difficult. This asymmetry — easy in one direction, nearly impossible in the reverse — is what makes RSA such a powerful encryption system.\u003c/p\u003e","title":"RSA Encryption: The Mathematical Magic Behind Digital Security"},{"content":"Setting up a Python development environment can be challenging, especially when managing multiple projects with different Python versions and dependencies. This comprehensive guide will walk you through using pyenv and Poetry to create a robust, maintainable Python development environment.\nThe Dynamic Duo: pyenv and Poetry Before diving into the setup process, let’s understand why we need these tools and how they work together:\npyenv manages your Python interpreters:\nInstalls and manages multiple Python versions on your system Allows you to specify different Python versions for different projects Handles seamless switching between Python versions Poetry handles your project dependencies:\nManages virtual environments for your projects Handles package installation, updates, and removal Ensures dependency version consistency Generates lock files to freeze dependency versions Together, they create a powerful workflow that makes Python development more efficient and reliable.\nGetting Started System Requirements Windows 7 or newer PowerShell 5.0 or newer Git (recommended) Installing pyenv-win First, let’s install pyenv for Windows. Open PowerShell and run:\nInvoke-WebRequest -UseBasicParsing -Uri \u0026#34;https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1\u0026#34; -OutFile \u0026#34;./install-pyenv-win.ps1\u0026#34;; \u0026amp;\u0026#34;./install-pyenv-win.ps1\u0026#34; Verify the installation:\npyenv --version If you need to manually add Poetry to your PATH:\n$env:Path += \u0026#34;;C:\\Users\\$env:USERNAME\\AppData\\Roaming\\Python\\Scripts\u0026#34; Setting Up Your Development Environment Installing Python Versions With pyenv installed, you can now manage multiple Python versions:\n# View available Python versions pyenv install --list # Install a specific version (e.g., 3.8.10) pyenv install 3.8.10 # Check installed versions pyenv versions Creating a New Project Let’s set up a new Python project:\n# Create and enter project directory mkdir my-project cd my-project # Set local Python version pyenv local 3.8.10 # Initialize project (choose one): poetry new project-name # Create new project # or poetry init # Initialize in existing directory # Configure virtual environment in project directory (recommended) poetry config virtualenvs.in-project true # Install all packages from lock file poetry install IDE Configuration (PyCharm) Open Project Settings (File → Settings → Project → Python Interpreter) Click the gear icon → Add Select “Poetry Environment” Choose the virtual environment in your project directory Managing Dependencies with Poetry Basic Package Management Here are the essential commands for managing packages:\n# Installing packages poetry add package_name # Install single package poetry add package_name==1.2.3 # Install specific version poetry add \u0026#34;package_name\u0026gt;=1.2.3\u0026#34; # Install minimum version poetry add package1 package2 # Install multiple packages poetry add pytest --dev # Install development dependency # Removing packages poetry remove package_name poetry remove package1 package2 poetry remove pytest --dev # Remove development dependency # Updating packages poetry update # Update all packages poetry update package_name # Update specific package poetry update --dev # Update development dependencies Environment Management Manage your project’s environment with these commands:\n# Environment information poetry show # Show all installed packages poetry show --outdated # Show outdated packages poetry show --tree # Show dependency tree poetry show package_name # Check specific package info # Environment synchronization poetry install # Install all packages from lock file poetry install --no-dev # Install only main dependencies poetry lock # Update lock file poetry lock --no-update # Update lock file without updating version Exporting Dependencies Need to share your dependencies? Here’s how:\npoetry export -f requirements.txt \u0026gt; requirements.txt poetry export -f requirements.txt --dev \u0026gt; requirements-dev.txt poetry export -f requirements.txt --without-hashes \u0026gt; requirements.txt Best Practices Version Control Files that should be version controlled:\n.python-version pyproject.toml poetry.lock Files to ignore:\n.venv/ __pycache__/ Dependency Management Best Practices Always use Poetry commands to manage dependencies Install development dependencies with the --dev flag Regularly run poetry update Use poetry add instead of manually editing pyproject.toml Environment Isolation Use separate virtual environments for each project Keep virtual environments in project directories Pay special attention when using different Python versions across projects Troubleshooting Common Issues Dependency Conflicts If you encounter dependency conflicts:\n# Check dependencies poetry check # Update lock file poetry lock --no-update # Reinstall packages poetry install Environment Issues For environment-related problems:\n# Remove and rebuild environment poetry env remove python poetry env use python poetry install Cache Problems When dealing with cache issues:\n# Clear cache poetry cache clear . --all poetry install Python Version Issues Check your .python-version file Reset local version: pyenv local desired-version poetry env remove python poetry install Conclusion Setting up a Python development environment with pyenv and Poetry might seem complex at first, but it pays dividends in the long run. These tools help you maintain clean, isolated environments and manage dependencies effectively. By following this guide and adhering to the best practices, you’ll have a robust development setup that scales with your projects.\nRemember that the key to success is consistency in using these tools and following the established patterns. Happy coding!\n","permalink":"https://0Zhen.github.io/posts/python-development-environment-setup-a-comprehensive-guide-to-pyenv-and-poetry/","summary":"\u003cp\u003eSetting up a Python development environment can be challenging, especially when managing multiple projects with different Python versions and dependencies. This comprehensive guide will walk you through using pyenv and Poetry to create a robust, maintainable Python development environment.\u003c/p\u003e\n\u003ch2 id=\"the-dynamic-duo-pyenv-andpoetry\"\u003eThe Dynamic Duo: pyenv and Poetry\u003c/h2\u003e\n\u003cp\u003eBefore diving into the setup process, let’s understand why we need these tools and how they work together:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epyenv\u003c/strong\u003e manages your Python interpreters:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInstalls and manages multiple Python versions on your system\u003c/li\u003e\n\u003cli\u003eAllows you to specify different Python versions for different projects\u003c/li\u003e\n\u003cli\u003eHandles seamless switching between Python versions\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003ePoetry\u003c/strong\u003e handles your project dependencies:\u003c/p\u003e","title":"Python Development Environment Setup: A Comprehensive Guide to pyenv and Poetry"},{"content":"Recently, I’ve noticed my body is recovering much slower than before. I used to be the one always inviting everyone to work out, but now I don’t want to leave home or change into workout clothes. After CrossFit last Friday, my whole body was sore. Quite funny actually — I even had trouble scratching my head because my shoulders and triceps were so sore. Unable to go out and train, seeing friends actively training makes me feel down. Combined with today’s pessimistic cryptocurrency and stock market, I just can’t lift my spirits.\nI originally wanted to develop a writing habit, publishing on Medium daily, but I didn’t do it yesterday. All in all, negative emotions are overwhelming me, and the pressure is immense, but I know I need to pull myself together.\nI know this is just the pressure of life that everyone faces. The body will recover with proper rest and care, and the economy will improve because what goes up must come down. Habits can be developed slowly — the key is not to give up on yourself, not to harshly criticize yourself over small setbacks and difficulties, and not to make excuses to avoid moving forward.\nYou’re not alone in facing pressure — everyone is dealing with their own challenges. Some people learn from these experiences, using them to enrich themselves and as stepping stones, while others collapse and allow themselves to sink into a pool of negative emotions, eventually drowning themselves. So no matter how you’re doing right now, you’re doing great! This is just an episode in life. As Chris Bumstead mentioned, increase your motivation, don’t overthink, and keep pushing forward! Break through that wall — it’s just made of paper, you can do it!\n","permalink":"https://0Zhen.github.io/posts/life-sucks-but-here-s-why-we-keep-going/","summary":"\u003cp\u003eRecently, I’ve noticed my body is recovering much slower than before. I used to be the one always inviting everyone to work out, but now I don’t want to leave home or change into workout clothes. After CrossFit last Friday, my whole body was sore. Quite funny actually — I even had trouble scratching my head because my shoulders and triceps were so sore. Unable to go out and train, seeing friends actively training makes me feel down. Combined with today’s pessimistic cryptocurrency and stock market, I just can’t lift my spirits.\u003c/p\u003e","title":"Life Sucks… But Here’s Why We Keep Going"},{"content":" Author: Eric Jorgenson Translator: 謝佩妏 Publisher: 天下雜誌 Publication Date: April 20, 2021 Credits:https://www.books.com.tw/products/0010977461\nThe Art of Building Wealth and Finding Peace Naval Ravikant’s wisdom collection offers a fresh take on building wealth and finding happiness. His ideas are both simple and deep, making complex topics easy to understand while keeping their power.\nKey Ideas About Wealth Creation Build Your Own Path The book teaches us that real wealth isn’t about working for money — it’s about having assets that make money while you sleep. Naval suggests focusing on ownership rather than trading time for money. This could mean starting a business or owning part of one through stocks.\nUse the Power of Leverage Naval talks about three types of leverage that can help create wealth:\nMoney (capital) People (workers) Products that can be copied at no cost (like software) The key is learning how to use these tools wisely. As he puts it, “To build wealth, you need to use leverage. Business leverage comes from capital, people, and products that don’t cost more to copy (like software and media).”\nDevelop Rare Skills One of the book’s most useful ideas is about building “specific knowledge” — skills that are hard to teach and can’t be outsourced. He suggests:\nLearn to sell Learn to build If you can do both, you’ll be unstoppable. Wisdom for Life The Power of Patience “Act quickly, but be patient with results.” This simple but powerful idea shows up throughout the book. Naval teaches that while you should start working on your goals right away, you shouldn’t expect quick results.\nFinding Your Path The book suggests asking yourself important questions like:\n“Is life a show and am I just watching?” “What do I really want in life?” “What am I best at?” Making Better Decisions Naval shares practical wisdom about decision-making:\nWhen facing two choices you can’t decide between, pick the harder one in the short term Base your decisions on clear thinking, not just memories or feelings Watch out for bias, especially when making big choices The Nature of Happiness The book offers deep insights about finding happiness:\nHappiness isn’t about getting what you want, it’s about wanting what you have Most suffering comes from wanting things True peace comes from seeing things as they are Practical Life Advice Career Development Work with the right people — it matters more than how hard you work Build your independence rather than just focusing on income The 40-hour work week is outdated — knowledge work is more like sports, with sprints and rest periods Learning and Growth Read science, math, and philosophy for one hour daily Build strong foundations instead of trying to learn many things quickly Take your time with good books — it’s not a race Building Relationships Think about what you can offer to others Build real connections before you need them Choose carefully who you work with Final Thoughts What makes this book special is how it combines practical advice about making money with deeper wisdom about living a good life. Naval shows us that wealth and happiness aren’t opposite goals — they can work together if approached the right way.\nThe book teaches us that true wealth isn’t just about money — it’s about having freedom, knowledge, and peace of mind. It’s about building a life where you can be yourself and create value for others.\nMost importantly, it reminds us that everything worthwhile takes time. Whether you’re building wealth or seeking happiness, the key is to start now, be patient, and keep learning along the way.\n","permalink":"https://0Zhen.github.io/posts/book-review-the-almanack-of-naval-ravikant-a-guide-to-wealth-and-happiness/","summary":"\u003cul\u003e\n\u003cli\u003eAuthor: Eric Jorgenson\u003c/li\u003e\n\u003cli\u003eTranslator: 謝佩妏\u003c/li\u003e\n\u003cli\u003ePublisher: 天下雜誌\u003c/li\u003e\n\u003cli\u003ePublication Date: April 20, 2021\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Credits:https://www.books.com.tw/products/0010977461\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*6cm69m_2GhHXWkN8\"\u003e\n\u003cem\u003eCredits:https://www.books.com.tw/products/0010977461\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"the-art-of-building-wealth-and-findingpeace\"\u003eThe Art of Building Wealth and Finding Peace\u003c/h2\u003e\n\u003cp\u003eNaval Ravikant’s wisdom collection offers a fresh take on building wealth and finding happiness. His ideas are both simple and deep, making complex topics easy to understand while keeping their power.\u003c/p\u003e\n\u003ch2 id=\"key-ideas-about-wealthcreation\"\u003eKey Ideas About Wealth Creation\u003c/h2\u003e\n\u003ch2 id=\"build-your-ownpath\"\u003eBuild Your Own Path\u003c/h2\u003e\n\u003cp\u003eThe book teaches us that real wealth isn’t about working for money — it’s about having assets that make money while you sleep. Naval suggests focusing on ownership rather than trading time for money. This could mean starting a business or owning part of one through stocks.\u003c/p\u003e","title":"Book Review: “The Almanack of Naval Ravikant” — A Guide to Wealth and Happiness"},{"content":" Author: David Brooks Translator: 廖月娟 Publisher: 天下文化 Credits:https://www.books.com.tw/products/0010987343\nThe Art of Being Present In David Brooks’ thoughtful book “The Second Mountain,” we discover a beautiful truth about human connections: true companionship isn’t about fixing others or being their guide. Instead, it’s about simply being there, walking beside them through life’s ups and downs.\nThe Gentle Nature of True Connection One of the book’s most touching insights is how we should approach relationships. Brooks uses a lovely image to explain this: approaching life is like walking up to a mother deer and her fawn resting under a tree. You must move quietly and carefully. Any sudden movement or forceful action will scare them away. This perfectly captures how we should approach our relationships with others — with gentleness and respect.\nThe Power of Witnessing The book tells us that the real test of friendship isn’t about making yourself or others better. Instead, it’s about being a witness to their life and letting them witness yours. Sometimes, all someone needs is a companion for just a small part of their journey — but without that companionship, they might not be able to continue.\nKey Lessons About Human Connection The book offers several important insights about building meaningful relationships:\nPatience is Essential The author emphasizes that trust takes time to build. You can’t rush real connections — they need space and time to grow naturally. Focus on Others True companionship means putting others at the center of your attention. It’s not about what you want to say or do, but about truly seeing and understanding the other person. The Value of Simple Questions Sometimes, a simple, broad question can be better than a clever one. It opens up conversation rather than showing off knowledge. Understanding Human Nature Brooks shares a beautiful comparison: like rivers, all humans share the same basic nature, but each person has their own unique flow — sometimes narrow, sometimes wide, sometimes clear, sometimes muddy. This helps us understand why we need to approach each person as an individual.\nThe Quiet Power of Presence One of the most powerful messages in the book is about the importance of quiet presence. As one story in the book shows, sometimes people don’t need advice or solutions — they just need someone to sit with them in silence. This kind of presence can be more healing than any words.\nBuilding Bridges in a Divided World The book also touches on how important it is for people to connect across differences. In our diverse world, we need to build trust and understanding between different groups. Being curious about others’ experiences is more important than deciding who’s right or wrong.\nLearning to See More Deeply Brooks encourages readers to develop a deeper awareness of the world around them. This means looking at life with more understanding, wisdom, and grace. It’s about growing not just in knowledge, but in our ability to connect with others.\nConclusion: The Simple Power of Being There What makes this book special is its focus on the simple yet profound act of being present for others. In a world that often pushes us to fix, change, or improve everything, Brooks reminds us that sometimes the most powerful thing we can do is simply be there, listening and witnessing with an open heart.\nThe book teaches us that real connection doesn’t require grand gestures or perfect words. Instead, it needs patience, genuine interest in others, and the willingness to simply be present. These are lessons that can help us all build deeper, more meaningful relationships in our lives.\n","permalink":"https://0Zhen.github.io/posts/book-review-how-to-know-a-person-the-art-of-seeing-others-deeply-and-being-deeply-seen/","summary":"\u003cul\u003e\n\u003cli\u003eAuthor: David Brooks\u003c/li\u003e\n\u003cli\u003eTranslator: 廖月娟\u003c/li\u003e\n\u003cli\u003ePublisher: 天下文化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Credits:https://www.books.com.tw/products/0010987343\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*kUYXVhCjxxz_72bz\"\u003e\n\u003cem\u003eCredits:https://www.books.com.tw/products/0010987343\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"the-art-of-beingpresent\"\u003eThe Art of Being Present\u003c/h2\u003e\n\u003cp\u003eIn David Brooks’ thoughtful book “The Second Mountain,” we discover a beautiful truth about human connections: true companionship isn’t about fixing others or being their guide. Instead, it’s about simply being there, walking beside them through life’s ups and downs.\u003c/p\u003e\n\u003ch2 id=\"the-gentle-nature-of-true-connection\"\u003eThe Gentle Nature of True Connection\u003c/h2\u003e\n\u003cp\u003eOne of the book’s most touching insights is how we should approach relationships. Brooks uses a lovely image to explain this: approaching life is like walking up to a mother deer and her fawn resting under a tree. You must move quietly and carefully. Any sudden movement or forceful action will scare them away. This perfectly captures how we should approach our relationships with others — with gentleness and respect.\u003c/p\u003e","title":"Book Review: How to Know a Person: The Art of Seeing Others Deeply and Being Deeply Seen"},{"content":" Author: 謝孟恭 Publisher: 天下文化 Publication Date: April 20, 2021 Credits:https://www.books.com.tw/products/0010888435\nIn this age of information overload, we are often trapped in oversimplified binary thinking: Should we go all-in on Tesla? Should we hold Bitcoin exclusively? Will the market surge or crash? However, through Meng-Kung Hsieh’s “Gray Scale Thinking,” I discovered a more intelligent approach to investment thinking.\nInvestment Is a Journey of Self-Discovery What resonated with me most was the book’s assertion that there are several ways to understand yourself, and your account statement serves as an investor’s “manual.” This made me realize that investing isn’t just about managing money; it’s about managing ourselves. Our reactions to market volatility often reflect our truest selves.\nHsieh suggests that beginners start with a portfolio allocation of 70% passive ETF investment and 30% active stock picking. This is a well-balanced recommendation that maintains a safety margin while giving investors room to explore and learn. It reminds me of Warren Buffett’s famous quote: “Diversification is protection against ignorance” — indeed, moderate diversification is wise before we fully understand ourselves.\nThe Art of Optimism, Patience, and Risk-Taking The book highlights three crucial virtues of successful investors: optimism, patience, and risk-taking. This particularly struck a chord with me. As the author notes, optimism isn’t blind confidence but rather “having eyes that foresee the future and feet that move forward steadily.” This kind of optimism is built on solid research and deep insights.\nPatience might be the virtue most lacking in modern investors. Under the bombardment of real-time information, we’re easily tempted by short-term trading. The author points out how dangerous it is to “learn a little today and go all-in tomorrow” — such forced growth only hinders the accumulation of experience and compound returns.\nBuilding a Personal Investment Methodology What impressed me was the author’s emphasis on reading. He particularly stresses the importance of reading prototype knowledge as fundamental training for developing judgment. Investment isn’t an exam with standard answers, but through extensive reading, we can build our own judgment system.\nThe author reminds us to pay special attention to Guidance and Catalysts when researching companies, which are key focus areas for professional investors. More importantly, he reminds us: “The key often isn’t what we see, but what we don’t see.” This reflective thinking approach is crucial in helping us avoid investment pitfalls.\nConclusion: Finding Wisdom in the Gray Areas The greatest value of “Gray Scale Thinking” lies in helping readers break free from binary thinking frameworks. The investment world is full of uncertainties, and what we need isn’t perfect answers but rather building an investment system that suits us. As reflected in the author’s three investment principles: avoid heavy positions, enter positions gradually, and admit mistakes when wrong — these all embody the wisdom of maintaining flexibility amid uncertainty.\nInvestment is a lifelong learning journey, and “Gray Scale Thinking” is not just an investment guide but a book that teaches us how to think in a complex world. As Einstein said, the only thing that interferes with learning is education — perhaps we all need to occasionally break free from existing frameworks and seek new possibilities in the gray areas.\n","permalink":"https://0Zhen.github.io/posts/book-review-of-gray-scale-thinking-investment-is-not-a-black-and-white-choice/","summary":"\u003cul\u003e\n\u003cli\u003eAuthor: 謝孟恭\u003c/li\u003e\n\u003cli\u003ePublisher: 天下文化\u003c/li\u003e\n\u003cli\u003ePublication Date: April 20, 2021\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Credits:https://www.books.com.tw/products/0010888435\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*h8KfoNunsUO4mJcK\"\u003e\n\u003cem\u003eCredits:https://www.books.com.tw/products/0010888435\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIn this age of information overload, we are often trapped in oversimplified binary thinking: Should we go all-in on Tesla? Should we hold Bitcoin exclusively? Will the market surge or crash? However, through Meng-Kung Hsieh’s “Gray Scale Thinking,” I discovered a more intelligent approach to investment thinking.\u003c/p\u003e\n\u003ch2 id=\"investment-is-a-journey-of-self-discovery\"\u003eInvestment Is a Journey of Self-Discovery\u003c/h2\u003e\n\u003cp\u003eWhat resonated with me most was the book’s assertion that there are several ways to understand yourself, and your account statement serves as an investor’s “manual.” This made me realize that investing isn’t just about managing money; it’s about managing ourselves. Our reactions to market volatility often reflect our truest selves.\u003c/p\u003e","title":"Book Review of “Gray Scale Thinking”: Investment Is Not a Black and White Choice"},{"content":" CrossFit gym\nSports isn’t just a hobby for me — it’s an essential part of who I am. If you asked me what I couldn’t live without, my answer would be simple: my daily workout. This deep connection with physical activity didn’t happen by chance; it was carefully cultivated during my childhood.\nMy journey into the world of sports began with my mother’s guidance. She made a deliberate choice to expose me to various athletic activities from an early age. Swimming lessons taught me discipline and breath control, while badminton honed my reflexes and strategic thinking. Through these diverse experiences, what started as structured activities gradually transformed into a natural part of my daily routine.\nThis foundation of athletic diversity continues to serve me well today. Just recently, I embarked on a new athletic adventure — my first CrossFit class. The session introduced me to air squats, front squats, thrusters, and burpees, pushing my limits far beyond what I expected. The workout followed a challenging 21–15–9 rep scheme, combining thrusters with burpees for a total of 45 repetitions of each exercise. Despite my years of athletic experience, this new challenge left my anterior deltoids burning and my lungs gasping for air — yet I loved every moment of it.\nWhat struck me most about the CrossFit experience was how it reminded me of those early days of trying new sports. Just like when I first learned swimming or badminton, I found myself in a supportive environment where everyone encouraged each other. What I thought would be a small class of six people turned into a dynamic group of ten, all pushing each other to reach new heights. The energy was electric, bringing back memories of why I fell in love with sports in the first place.\nEven the struggles felt familiar — like gripping the bar too tightly during thrusters, causing early forearm fatigue. These learning experiences echo the challenges I faced in my earlier athletic endeavors, reminding me that growth in sports is a never-ending journey. Each new activity brings its own set of challenges and rewards, contributing to my ongoing development as an athlete.\nToday, sports remains my constant companion, a non-negotiable part of my daily schedule. It’s not just about maintaining physical fitness; it’s about continuing the journey my mother helped start — exploring new challenges, pushing boundaries, and growing stronger with each passing day. As I eagerly anticipate my next CrossFit session, I’m reminded that the love for sports my mother instilled in me continues to open doors to new adventures and achievements.\n","permalink":"https://0Zhen.github.io/posts/how-sports-shaped-my-life-a-continuing-journey/","summary":"\u003cp\u003e\u003cimg alt=\"CrossFit gym\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*3vhcziQGryDqSplYDN76EA.jpeg\"\u003e\n\u003cem\u003eCrossFit gym\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSports isn’t just a hobby for me — it’s an essential part of who I am. If you asked me what I couldn’t live without, my answer would be simple: my daily workout. This deep connection with physical activity didn’t happen by chance; it was carefully cultivated during my childhood.\u003c/p\u003e\n\u003cp\u003eMy journey into the world of sports began with my mother’s guidance. She made a deliberate choice to expose me to various athletic activities from an early age. Swimming lessons taught me discipline and breath control, while badminton honed my reflexes and strategic thinking. Through these diverse experiences, what started as structured activities gradually transformed into a natural part of my daily routine.\u003c/p\u003e","title":"How Sports Shaped My Life: A Continuing Journey"},{"content":"A firmware engineer’s perspective on the competitive landscape of Taiwan’s electric-assisted bicycle market\nCredits: https://www.environmentenergyleader.com/stories/e-bike-market-to-reach-715-billion-by-2030,54374\nPersonal Perspective As a firmware engineer working for an e-bike component supplier in Taiwan, I often find myself wondering about the future trajectory of our industry. This uncertainty led me to conduct a Porter’s Five Forces analysis of Taiwan’s e-bike industry, aiming to better understand the competitive dynamics and future opportunities in this rapidly evolving sector.\nTaiwan has long been known as the “Bicycle Kingdom,” and now stands at the crossroads of traditional manufacturing excellence and modern electric mobility innovation. Through this analysis, I hope to share insights that could be valuable for other industry professionals, whether they’re engineers, business strategists, or industry observers.\nThe Power Play: Understanding Industry Competition 1. Intense Battlefield: Current Competitive Landscape The e-bike market in Taiwan presents a fascinating mix of traditional bicycle giants and innovative tech startups. Local champions like Giant and Merida compete alongside tech-savvy newcomers and established motor system providers like Bosch and Yamaha.\nWhat makes this space particularly interesting:\nMarket concentration shows the top three brands commanding 45% market share A surge of innovative small and medium-sized brands is reshaping the landscape Taiwan’s unique position as both a manufacturer and innovator in the global supply chain The competition isn’t just about the product anymore. While basic functionalities remain similar, the battleground has shifted to:\nAdvanced motor systems integration Battery life and charging solutions Design aesthetics and user experience After-sales service networks 2. The Supply Chain Challenge Perhaps one of the most critical aspects of the e-bike industry lies in its supply chain dynamics. With battery costs comprising 30–40% of total production costs, suppliers wield significant influence.\nKey supply chain insights:\nCore component suppliers maintain strong bargaining positions through technological expertise Battery and motor system suppliers are highly concentrated General component suppliers offer more competitive pricing Supply chain localization efforts are gradually reducing dependency 3. The Consumer Perspective Today’s e-bike consumer is more informed and demanding than ever. The market serves diverse segments:\nIndividual commuters seeking sustainable transportation Business users in delivery and logistics Shared mobility service providers Consumer behavior shows interesting patterns:\nGrowing brand loyalty despite numerous options High emphasis on after-sales service Increasing focus on total ownership cost 4. New Entrants: Opportunity and Challenge The e-bike industry presents an interesting paradox for new entrants. While technical barriers are relatively low, building a successful brand requires significant investment.\nEntry considerations include:\nR\u0026amp;D capabilities Manufacturing scale Brand development Service network establishment Regulatory compliance 5. The Substitute Challenge E-bikes face competition from various transportation alternatives:\nTraditional bicycles (lower cost) Electric scooters (greater range) Public transportation (convenience) Shared mobility solutions (flexibility) Strategic Implications for Industry Players Success in the e-bike industry requires a multi-faceted approach:\nProduct Innovation Focus on unique features Enhance user experience Improve battery technology Brand Development Build strong service networks Engage community building Establish trust through quality Supply Chain Optimization Diversify supplier relationships Consider vertical integration Invest in local supply networks Market Expansion Target specific user segments Develop service-based models Build omnichannel presence From an Engineer’s Perspective As a firmware engineer, I see firsthand how technological innovation drives industry dynamics:\nMotor control systems becoming increasingly sophisticated Integration of IoT and smart features Battery management systems growing in complexity Growing emphasis on software differentiation Looking Ahead The e-bike industry in Taiwan stands at a fascinating crossroads of traditional manufacturing excellence and modern technology innovation. For those of us working in component suppliers, success will depend on our ability to:\nStay ahead of technological trends Maintain strong relationships with both domestic and international partners Continue innovating while maintaining quality Adapt to changing market demands The future may be uncertain, but understanding these industry forces helps us better prepare for what’s ahead.\nAbout the Author: A firmware engineer in Taiwan’s e-bike industry, passionate about understanding both the technical and business aspects of the electric mobility revolution.\n","permalink":"https://0Zhen.github.io/posts/a-firmware-engineer-s-deep-dive-porter-s-five-forces-analysis-of-taiwan-s-e-bike-industry/","summary":"\u003cp\u003e\u003cem\u003eA firmware engineer’s perspective on the competitive landscape of Taiwan’s electric-assisted bicycle market\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Credits: https://www.environmentenergyleader.com/stories/e-bike-market-to-reach-715-billion-by-2030,54374\" loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/0*4FilH3ljQvb9cW97.jpg\"\u003e\n\u003cem\u003eCredits: \u003ca href=\"https://www.environmentenergyleader.com/stories/e-bike-market-to-reach-715-billion-by-2030,54374\"\u003ehttps://www.environmentenergyleader.com/stories/e-bike-market-to-reach-715-billion-by-2030,54374\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"personal-perspective\"\u003ePersonal Perspective\u003c/h2\u003e\n\u003cp\u003eAs a firmware engineer working for an e-bike component supplier in Taiwan, I often find myself wondering about the future trajectory of our industry. This uncertainty led me to conduct a Porter’s Five Forces analysis of Taiwan’s e-bike industry, aiming to better understand the competitive dynamics and future opportunities in this rapidly evolving sector.\u003c/p\u003e","title":"A Firmware Engineer’s Deep Dive: Porter’s Five Forces Analysis of Taiwan’s E-Bike Industry"},{"content":"\nAs a beginner tackling HackerRank’s C programming challenges, my first day was both challenging and enlightening. After completing three exercises, I discovered some fascinating aspects of C programming, particularly regarding character and string handling.\nThe Surprising Difference Between ‘A’ and “A” One of the most interesting discoveries was understanding the fundamental difference between single quotes (‘A’) and double quotes (“A”) in C. This distinction is crucial for any C programmer to understand:\n'A' represents a single character and occupies1 byteof memory \u0026quot;A\u0026quot; is actually a string (char array) containing \u0026lsquo;A\u0026rsquo; and a null terminator \u0026lsquo;\\0\u0026rsquo;, occupying 2 bytes This might seem like a minor detail, but it significantly impacts how we handle data in our programs.\nThe Magic of ASCII and Number Conversion Another fascinating concept I learned was about ASCII values and their practical applications in number conversion. Here’s an interesting trick I discovered:\nWhen you receive a character representing a digit (like ‘5’), its ASCII value is actually 53 in hexadecimal. To convert this character to its actual numerical value, you simply subtract the ASCII value of ‘0’ (which is 48):\nchar digit = \u0026#39;5\u0026#39;; // ASCII value: 53 (hex: 0x35) int num = digit - \u0026#39;0\u0026#39;; // 53 - 48 = 5 This elegant solution works because:\nDigit characters (‘0’ to ‘9’) are stored sequentially in ASCII Subtracting the ASCII value of ‘0’ gives us the actual numerical value This method is more readable and maintainable than using magic numbers Why This Matters Understanding these concepts is fundamental for:\nString parsing and manipulation Input processing Data conversion Algorithm implementation These insights have not only helped me solve HackerRank challenges more effectively but have also deepened my appreciation for C’s elegant design. While C might seem low-level compared to modern programming languages, its direct handling of memory and characters provides valuable insights into how computers actually process and store data.\nMoving Forward As I continue my journey with C programming, I look forward to discovering more such interesting features. These fundamental concepts serve as building blocks for more complex programming challenges and help develop a deeper understanding of computer science principles.\nRemember: What might seem like simple character manipulation actually reveals the elegant architecture of both the C language and computer systems in general.\n","permalink":"https://0Zhen.github.io/posts/my-first-day-learning-c-understanding-characters-and-ascii/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn-images-1.medium.com/max/800/1*hhg7D80EwOc1heQFVPBcbg.png\"\u003e\u003c/p\u003e\n\u003cp\u003eAs a beginner tackling HackerRank’s C programming challenges, my first day was both challenging and enlightening. After completing three exercises, I discovered some fascinating aspects of C programming, particularly regarding character and string handling.\u003c/p\u003e\n\u003ch2 id=\"the-surprising-difference-between-a-anda\"\u003eThe Surprising Difference Between ‘A’ and “A”\u003c/h2\u003e\n\u003cp\u003eOne of the most interesting discoveries was understanding the fundamental difference between single quotes (‘A’) and double quotes (“A”) in C. This distinction is crucial for any C programmer to understand:\u003c/p\u003e","title":"My First Day Learning C: Understanding Characters and ASCII"},{"content":"Have you ever wondered how elite athletes maintain their incredible discipline? Not just during competition, but in their everyday lives? Recently, I found myself captivated by a video featuring Chris Bumstead, the legendary bodybuilder. What struck me wasn’t just his physical achievements, but the profound wisdom he shared about personal transformation and habit building.\nWhile many of us struggle to maintain New Year’s resolutions beyond January, Chris has mastered the art of sustainable discipline. His insights resonated deeply with me, not because they were revolutionary, but because they were real, tested, and proven in the crucible of world-class competition.\nThe Challenge We All Face Here’s a familiar scenario: During crucial periods (like competition prep for athletes or project deadlines for professionals), we find ourselves incredibly focused and disciplined. Yet, once the pressure subsides, we often drift back to our old habits. Chris noticed this pattern in himself and developed strategies to maintain consistency year-round. His approach isn’t just for athletes — it’s for anyone seeking lasting personal growth.\nFive Pillars of Sustainable Change 1. The SMART Way to Dream Big The foundation of any transformation begins with proper goal setting. Chris emphasizes the SMART framework: **Specific:**Pinpoint exactly what you want to achieve Measurable: Define concrete ways to track progress Achievable: Set challenging but realistic goals **Relatable:**Ensure goals align with your values **Time-based:**Create clear deadlines\nBut here’s the catch — many of us struggle with this first step because we haven’t figured out what we truly want. This leads us to the most crucial aspect of transformation…\n2. Identity: The Game-Changer Chris shares a perspective that changed everything for me: Stop focusing on what you want to achieve and start focusing on who you want to become. This shift in thinking transforms goals from external achievements to internal evolution.\nYour identity comprises multiple dimensions: Personal Traits: Your core values and characteristics **Social Roles:**How you interact with others and contribute to society **Cultural Identity:**Your connection to your heritage and community **Abilities and Interests:**Your skills and passions **Physical Dimension:**Your health and body goals\nFor Chris, it wasn’t about “winning Mr. Olympia” — it was about becoming someone who embodies the discipline, dedication, and humility of a champion.\nThe Power of Small Beginnings Here’s where Chris’s story gets really interesting. During college, he enjoyed the typical student life — parties, late nights, and irregular schedules. When he decided to pursue bodybuilding seriously, he didn’t immediately transform his entire lifestyle. Instead, he made one crucial change: he stopped drinking alcohol.\nThis single decision created a domino effect: No drinking→ Better morning energy Better mornings→ Earlier bedtimes Regular sleep→ More consistent training Consistent training → Better nutrition choices\nThe lesson? Start with one manageable change and let momentum build naturally.\n4. Mastering the Inner Dialogue Perhaps the most powerful insight Chris shares is about self-talk. He suggests approaching yourself as a mentor would an apprentice — firm but compassionate. This means: Celebrating progress without becoming complacent\nAddressing setbacks without self-condemnation Taking full ownership of your journey Finding strength in personal responsibility 5. The Habit Highway Think of habits as the autopilot of personal growth. Once established, they require minimal willpower to maintain. Chris emphasizes that:\nStrong habits are your anchor during challenging times They free up mental energy for new growth They create stability in chaos The Deeper Truth About Transformation\nThrough Chris’s insights, I’ve learned that true transformation isn’t about the destination — it’s about the daily journey. Here are the key principles that stand out:\nSuccess is an Evolution: Your achievements matter less than who you become while pursuing them Actions Trump Intentions: You are defined by your consistent behaviors, not your occasional aspirations Two-Phase Learning: Growth comes from both experiencing and reflecting **Consistency Beats Perfection:**Better to maintain 80% effort consistently than 100% sporadically **Mindset is Everything:**Your internal dialogue shapes your external reality Putting It Into Practice Ready to apply these lessons? Here’s your action plan:\nStart with Identity * Write down who you want to become * List the daily behaviors that person would exhibit * Choose one behavior to focus on first\nBuild Your Foundation * Select your keystone habit — the one change that will trigger others * Make it small enough to be sustainable * Track it daily\nMaintain Momentum * Journal your progress * Celebrate small wins * Adjust strategies based on results\nRemember, the goal isn’t perfection — it’s progress. As Chris demonstrates, legendary results come from consistent, intentional daily actions aligned with your desired identity.\nWhat small step will you take today toward becoming your future self?\n","permalink":"https://0Zhen.github.io/posts/lessons-in-discipline-what-chris-bumstead-taught-me-about-building-a-legendary-life/","summary":"\u003cp\u003eHave you ever wondered how elite athletes maintain their incredible discipline? Not just during competition, but in their everyday lives? Recently, I found myself captivated by a video featuring Chris Bumstead, the legendary bodybuilder. What struck me wasn’t just his physical achievements, but the profound wisdom he shared about personal transformation and habit building.\u003c/p\u003e\n\u003cp\u003eWhile many of us struggle to maintain New Year’s resolutions beyond January, Chris has mastered the art of sustainable discipline. His insights resonated deeply with me, not because they were revolutionary, but because they were real, tested, and proven in the crucible of world-class competition.\u003c/p\u003e","title":"Lessons in Discipline: What Chris Bumstead Taught Me About Building a Legendary Life"},{"content":"鋼品製程 http://www.jfe-21st-cf.or.jp/\n中鋼鋼品生產流程圖 https://www.csc.com.tw/csc/pd/prs.htm\n煉鋼 根據含碳量的不同，可以將鋼鐵分為以上幾種。當含碳量增加，會使得鋼的硬度提高，變得比較脆。\nhttps://www.phyworld.idv.tw/Nature/Jun_2/B4_CH2/2-2_POINT.htm\n煉鋼的原料包含鐵礦、煤焦以幾灰石。煤焦經過高溫燃燒，會產生一氧化碳，與氧化鐵產生化學反應，使得鐵礦還原成鐵。此時的鐵仍由較高的含碳量，為生鐵。 而鐵礦中的泥沙則會與灰石形成熔渣，熔渣密度較低，會浮於生鐵上。\n轉爐 https://www.csc.com.tw/csc/pd/prs.htm\n在轉爐中會以大量氧氣吹向鋼液，使其燃燒產生二氧化碳與一氧化碳，進一步地降低鋼液的碳含量。 此時鋼液中仍有空氣，因此要對其進行真空處裡。 降低碳含量之後，會對鋼液進行二次精煉，並在此步驟調整鋼液成份。以電磁鋼片為例，會加入矽並進行攪拌。\n連續鑄模 https://www.csc.com.tw/csc/pd/prs.htm\n調整後的鋼液，會經過分配器，倒入鑄模，如圖所示，最後根據不同應用場合，形成扁鋼胚或是大鋼坯，再進行熱軋。\n熱軋 經過煉鋼步驟後，在進行熱軋以及冷軋和多種熱處理與表面處理，最後產出鋼品電磁鋼捲。\nhttps://www.csc.com.tw/csc/pd/prs.htm\n分條 矽鋼片裁切 現今馬達定、轉子之製程，主要有雷射切割、線切割或沖壓加工如圖四所示，將矽鋼片裁切成定、轉子所須的形狀後，再進行壓接的製程。雷射切割與線切割之差異，在於雷射切割是聚焦高功率的雷射光束到物件上，使物件達到燃點進行熱切割；而線切割則是利用金屬線通電，在物件上放電腐蝕物件，進行放電切割。根據切割精準度，雷射切割精度誤差值可小於0.1mm，而線切割技術，分為快走絲、中走絲和慢走絲，其中慢走絲精度可達0.01mm。雷射切割與線切割兩者相比，雖然線切割精度較高，但製造成本與操作難度較高，較常用於高精密工業的加工製程。沖壓加工與前兩者相比，其產品精度與線切割接近，但施工時間短、生產速度快，適合於大量生產，而本文內容將以沖壓製程之介紹為主。\n沖壓 (Stamping) 沖壓製程屬於金屬塑性加工的方法之一，可使產品品質一致性高，並且適合少樣大量之薄金屬加工，常用於製造生產馬達定、轉子之矽鋼片。使用高結構強度、設計良好的模具，能夠維持產品品質均一；而高速沖床是能增加沖壓速度，提高單位時間的產量。然而模具的製作技術與成本較高，且一組模具只能生產一種成品，加工適應性差，除此之外，產品精度亦會受模具的影響。沖床為進行沖壓製程的主要設備，由模墊(Bolster)及滑塊(Ram)所組成，其上模鎖固在滑塊、下模鎖固在模墊上，將金屬薄片置於上模與下模之間，藉由閉合上模與下模的作動，將衝頭壓入於衝模穴，對金屬薄片進行分離或成形的加工作動。\n沖壓加工依照加工方式與產品特徵，大致可分為分離加工(沖切加工)、成形加工及壓合加工等三大類。分離加工是藉著沖壓機械之能量及模具設計，將金屬板料加以分離，而得到所要的尺寸及形狀。成形加工則是將金屬板料之全部或部分區域施以永久變形或塑行變形，而得到所要的尺寸及形狀；壓合加工則是將二件以上之零件施以壓合，而得到一個組合件，馬達矽鋼片之製程主要為分離與壓合之加工。\n分離加工 (Shearing) 分離加工又稱沖切加工(shearing)，利用沖頭與沖模，使材料產生應力，造成破裂分離。常見的加工方式包含有沖孔、落料、切邊、切斷等。其中沖孔與落料之差別，在於前者之沖下部分為廢料，後者沖下的部分為工件。切斷加工則是使用剪刃或模具，切斷板料或條料的部分周邊；切邊是使用切邊模，將坯件邊緣的多餘材料沖切下來。以上為馬達定、轉子常用的沖壓製程之加工方式。\n壓合加工 矽鋼片在經過落料後，會進行壓合加工，以堆疊矽鋼片的方式，來處理定、轉子的渦流問題。常見的堆疊製程包含拉扣、焊接、疊鉚、點膠以及自黏等。\n拉扣(Cleating) 係使用條狀金屬材料，放置在定子鐵芯外徑的槽內，再以滾輪將其壓入，最後成為扣住的方式，以固定矽鋼片，缺點為矽鋼片堆疊上可能會產生不夠緊密的問題。\n鉚接(Interlocking) 為在矽鋼片上，沖出鉚點，但不沖破，然後兩矽鋼片透過鉚點之凸部與凹部過盈配合，而固定在一起。鉚接形式可以分為圓形鉚接、V形鉚接、梯形、方型、扭斜型等，其中以圓形鉚接以及V形鉚接為最具代表性。圓形鉚點在預成型時，板材並未發生破裂；V形鉚點在預成形時，則是由兩邊材料發生破裂以及兩邊材料拉伸組成之矩形。在電磁特性上，未發生破裂之圓形鉚點性能會較好，但若材料之延展性較差，或是材料之厚度較薄，會使預成形之深度受限，進而降低鉚接品質時，當使用V形之鉚接，因為V形鉚接之預成形深度可超過一個板厚，會有較佳的鉚接性。一般鉚接所使用的鉚點，會造成過大的磁阻，因此鉚點的設計位置，應避開主要磁通迴路。\n焊接(Welding) 係以加熱於欲接合之矽鋼片，使之局部融化而形成熔池(Weld pool)，熔池冷卻凝固之後，便會自然接合。有時會在熔池附近，引入不會與金屬起化學反應的惰性氣體，例如氬氣，藉此形成保護罩，使得電弧、熔池等，以處於高溫之金屬，不與空氣接觸，進而防止氧化與產生有害氣體。然而焊接方式所產生的焊縫(Weld Bead)，易造成矽鋼片間短路，焊縫的大小與渦流損呈現正向相關。\n點膠(Glued) 顧名思義是通過膠水，例如AB膠，來牢固矽鋼片。點膠與前三者相比，會擁有較好的絕緣與結構特性，使定、轉子之渦流損較低，然而在加工上，對於定子齒部較細或是轉子的設計較複雜，點膠位置的選擇較為困難。如改以噴膠的方式解決，亦會遇到溢膠的問題，導致殘膠留於沖壓模具內，易增加生產成本。\n目前新發展的自黏矽鋼片，能有效避免溢膠問題，在矽鋼片沖壓完成後，係以烘烤或加熱的方式，使得矽鋼片塗層產生黏性，進而變得牢固。然而，自黏矽鋼片在製程上，因為需要進行烘烤或加熱，如需將其整合進沖床時，會遇到矽鋼片升溫較慢，無法與落料速度匹配的問題，故現今自黏矽鋼片的加工大都使用模外加溫。\n斜槽製程 一般徑向式設計的永磁同步馬達(PMSM)，因為槽開口之設計，造成徑向各點的磁阻變化，導致會有頓轉轉矩的產生。斜槽之設計能改善磁阻變化，進而降低頓轉轉矩。從圖中可看到齒部為傾斜的，當馬達旋轉時，磁鐵的等效磁阻幾乎不會隨著位置而有明顯的變化，利用軸向的斜槽設計，來降低徑向的頓轉轉矩的影響。\n分段斜槽(Step Skew)與線性斜槽(Linear Skew)\n斜槽之設計種類主要可分為分段斜槽(Step Skew)和線性斜槽(Linear Skew)兩種，其中因為磁鐵多為長方體，故轉子在設計上，可使用分段斜槽，而定子為了配合繞線，是使用線性斜槽。\n定子線性斜槽之製程，會在矽鋼片進入落料槽後，使用束緊環搭配馬達，將矽鋼片做旋轉，再進行接合的動作，亦可使用旋轉之沖頭，進行沖壓。而轉子之分段式斜槽為使用鍵槽進行角度對位，在每段轉子上，沖壓出依序旋轉的鍵槽，在與軸心凸鍵進行對位組裝。\n沖壓自動化生產線主要包含料架、S形整平機、滾輪送料機以及沖床等。矽鋼片薄金屬通常會以捲料的形式販售，故在自動化產線上，除了料架，須經S型整平機先將矽鋼片整平，再藉由滾輪送料機，將矽鋼片推入沖床，進行沖壓加工。\n馬達製造上，定、轉子電磁鐵芯的製程，扮演著極為重要的角色。良好的矽鋼片加工方式，能製造出所需的高結構強度、低渦流損鐵芯，提升馬達的強健性及其效率。本文簡介現今馬達鐵芯的製程，從金屬原料煉製成電磁鋼捲，再從電磁鋼捲沖壓成定、轉子鐵芯。每一項加工製程都有其優缺點及適合的場域，只有對製程先有充分的了解，才能以更快速且有效的方式，製造出優質的馬達定、轉子鐵芯。\n致謝 本文的完成特別感謝國立成功大學馬達科技研究中心謝旻甫教授的指導，與黃柏維博士、高子睿工程師與中鋼陳冠銘博士的協助。\n","permalink":"https://0Zhen.github.io/posts/%E9%9B%BB%E7%A3%81%E9%8B%BC%E7%89%87%E8%A3%BD%E7%A8%8B%E4%BB%8B%E7%B4%B9/","summary":"\u003ch2 id=\"鋼品製程\"\u003e鋼品製程\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/LlDFMPh.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://www.jfe-21st-cf.or.jp/\"\u003ehttp://www.jfe-21st-cf.or.jp/\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"中鋼鋼品生產流程圖\"\u003e中鋼鋼品生產流程圖\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.csc.com.tw/csc/pd/prs.htm\"\u003ehttps://www.csc.com.tw/csc/pd/prs.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"煉鋼\"\u003e煉鋼\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/o3huKmi.png\"\u003e\u003c/p\u003e\n\u003cp\u003e根據含碳量的不同，可以將鋼鐵分為以上幾種。當含碳量增加，會使得鋼的硬度提高，變得比較脆。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/O3qOENo.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.phyworld.idv.tw/Nature/Jun_2/B4_CH2/2-2_POINT.htm\"\u003ehttps://www.phyworld.idv.tw/Nature/Jun_2/B4_CH2/2-2_POINT.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e煉鋼的原料包含鐵礦、煤焦以幾灰石。煤焦經過高溫燃燒，會產生一氧化碳，與氧化鐵產生化學反應，使得鐵礦還原成鐵。此時的鐵仍由較高的含碳量，為生鐵。\n而鐵礦中的泥沙則會與灰石形成熔渣，熔渣密度較低，會浮於生鐵上。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"轉爐\"\u003e轉爐\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/f6CzeU7.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.csc.com.tw/csc/pd/prs.htm\"\u003ehttps://www.csc.com.tw/csc/pd/prs.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在轉爐中會以大量氧氣吹向鋼液，使其燃燒產生二氧化碳與一氧化碳，進一步地降低鋼液的碳含量。\n此時鋼液中仍有空氣，因此要對其進行真空處裡。\n降低碳含量之後，會對鋼液進行二次精煉，並在此步驟調整鋼液成份。以電磁鋼片為例，會加入矽並進行攪拌。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"連續鑄模\"\u003e連續鑄模\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/7CXeRFe.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.csc.com.tw/csc/pd/prs.htm\"\u003ehttps://www.csc.com.tw/csc/pd/prs.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e調整後的鋼液，會經過分配器，倒入鑄模，如圖所示，最後根據不同應用場合，形成扁鋼胚或是大鋼坯，再進行熱軋。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"熱軋\"\u003e熱軋\u003c/h2\u003e\n\u003cp\u003e經過煉鋼步驟後，在進行熱軋以及冷軋和多種熱處理與表面處理，最後產出鋼品電磁鋼捲。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/8l2ihO4.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/d0yhd9y.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/gIfTdAe.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/UULoxzk.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.csc.com.tw/csc/pd/prs.htm\"\u003ehttps://www.csc.com.tw/csc/pd/prs.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"分條\"\u003e分條\u003c/h2\u003e\n\u003cdiv style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\"\u003e\n      \u003ciframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube.com/embed/OEVHWsbNsvM?autoplay=0\u0026amp;controls=1\u0026amp;end=0\u0026amp;loop=0\u0026amp;mute=0\u0026amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"\u003e\u003c/iframe\u003e\n    \u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"矽鋼片裁切\"\u003e矽鋼片裁切\u003c/h2\u003e\n\u003cp\u003e現今馬達定、轉子之製程，主要有雷射切割、線切割或沖壓加工如圖四所示，將矽鋼片裁切成定、轉子所須的形狀後，再進行壓接的製程。雷射切割與線切割之差異，在於雷射切割是聚焦高功率的雷射光束到物件上，使物件達到燃點進行熱切割；而線切割則是利用金屬線通電，在物件上放電腐蝕物件，進行放電切割。根據切割精準度，雷射切割精度誤差值可小於0.1mm，而線切割技術，分為快走絲、中走絲和慢走絲，其中慢走絲精度可達0.01mm。雷射切割與線切割兩者相比，雖然線切割精度較高，但製造成本與操作難度較高，較常用於高精密工業的加工製程。沖壓加工與前兩者相比，其產品精度與線切割接近，但施工時間短、生產速度快，適合於大量生產，而本文內容將以沖壓製程之介紹為主。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/elzfRPL.png\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"沖壓-stamping\"\u003e沖壓 (Stamping)\u003c/h2\u003e\n\u003cp\u003e沖壓製程屬於金屬塑性加工的方法之一，可使產品品質一致性高，並且適合少樣大量之薄金屬加工，常用於製造生產馬達定、轉子之矽鋼片。使用高結構強度、設計良好的模具，能夠維持產品品質均一；而高速沖床是能增加沖壓速度，提高單位時間的產量。然而模具的製作技術與成本較高，且一組模具只能生產一種成品，加工適應性差，除此之外，產品精度亦會受模具的影響。沖床為進行沖壓製程的主要設備，由模墊(Bolster)及滑塊(Ram)所組成，其上模鎖固在滑塊、下模鎖固在模墊上，將金屬薄片置於上模與下模之間，藉由閉合上模與下模的作動，將衝頭壓入於衝模穴，對金屬薄片進行分離或成形的加工作動。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/fZPrch1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e沖壓加工依照加工方式與產品特徵，大致可分為分離加工(沖切加工)、成形加工及壓合加工等三大類。分離加工是藉著沖壓機械之能量及模具設計，將金屬板料加以分離，而得到所要的尺寸及形狀。成形加工則是將金屬板料之全部或部分區域施以永久變形或塑行變形，而得到所要的尺寸及形狀；壓合加工則是將二件以上之零件施以壓合，而得到一個組合件，馬達矽鋼片之製程主要為分離與壓合之加工。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"分離加工-shearing\"\u003e分離加工 (Shearing)\u003c/h2\u003e\n\u003cp\u003e分離加工又稱沖切加工(shearing)，利用沖頭與沖模，使材料產生應力，造成破裂分離。常見的加工方式包含有沖孔、落料、切邊、切斷等。其中沖孔與落料之差別，在於前者之沖下部分為廢料，後者沖下的部分為工件。切斷加工則是使用剪刃或模具，切斷板料或條料的部分周邊；切邊是使用切邊模，將坯件邊緣的多餘材料沖切下來。以上為馬達定、轉子常用的沖壓製程之加工方式。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/nTiCUKY.png\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"壓合加工\"\u003e壓合加工\u003c/h2\u003e\n\u003cp\u003e矽鋼片在經過落料後，會進行壓合加工，以堆疊矽鋼片的方式，來處理定、轉子的渦流問題。常見的堆疊製程包含拉扣、焊接、疊鉚、點膠以及自黏等。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.imgur.com/tx72KTs.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003e拉扣(Cleating)\u003c/strong\u003e\u003c/em\u003e 係使用條狀金屬材料，放置在定子鐵芯外徑的槽內，再以滾輪將其壓入，最後成為扣住的方式，以固定矽鋼片，缺點為矽鋼片堆疊上可能會產生不夠緊密的問題。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003e鉚接(Interlocking)\u003c/strong\u003e\u003c/em\u003e 為在矽鋼片上，沖出鉚點，但不沖破，然後兩矽鋼片透過鉚點之凸部與凹部過盈配合，而固定在一起。鉚接形式可以分為圓形鉚接、V形鉚接、梯形、方型、扭斜型等，其中以圓形鉚接以及V形鉚接為最具代表性。圓形鉚點在預成型時，板材並未發生破裂；V形鉚點在預成形時，則是由兩邊材料發生破裂以及兩邊材料拉伸組成之矩形。在電磁特性上，未發生破裂之圓形鉚點性能會較好，但若材料之延展性較差，或是材料之厚度較薄，會使預成形之深度受限，進而降低鉚接品質時，當使用V形之鉚接，因為V形鉚接之預成形深度可超過一個板厚，會有較佳的鉚接性。一般鉚接所使用的鉚點，會造成過大的磁阻，因此鉚點的設計位置，應避開主要磁通迴路。\u003c/p\u003e","title":"電磁鋼片製程介紹"},{"content":"","permalink":"https://0Zhen.github.io/photos/","summary":"","title":"照片牆"},{"content":"嗨，我是箴 電機系碩士，專注於馬達設計領域，日常工作圍繞電機系統的分析、測試與優化。\n熱愛鐵人三項，享受游泳、騎車、跑步三種運動交織的挑戰。訓練的過程讓我學到工程師最需要的事：數據不會說謊，但你得先學會讀懂它。\n這裡記錄馬達技術、韌體開發、工程思維，以及偶爾的生活感悟。希望這些內容對你有幫助。\nContact: jameslkk8613@email.com\nGitHub: github.com/0Zhen\n作品 三鐵訓練工具 bike-power-calculator.web.app\n補給規劃 bike-power-calculator.web.app/nutrition.html\n補給品資料庫 bike-power-calculator.web.app/products.html\nFFT 頻譜分析工具 0zhen.github.io/fft-analyser\n","permalink":"https://0Zhen.github.io/about/","summary":"about","title":"關於我"}]