外掛大腦:讓 AI 成為你的第二大腦,而不是替你思考
每次開新對話,AI 都不記得你是誰。你要重複解釋背景、重複說明偏好,就像每次看診都要從頭填病歷。
「外掛大腦」是一個解決這個問題的系統:讓 AI 能讀取你的知識庫,記住你是誰、在做什麼、喜歡什麼。
:::tip 立即下載 GitHub: rhincodon-studio/obsidian-brain-template
點擊 Use this template → 建立你的私人知識庫 :::
每次開新對話,AI 都不記得你是誰。你要重複解釋背景、重複說明偏好,就像每次看診都要從頭填病歷。
「外掛大腦」是一個解決這個問題的系統:讓 AI 能讀取你的知識庫,記住你是誰、在做什麼、喜歡什麼。
:::tip 立即下載 GitHub: rhincodon-studio/obsidian-brain-template
點擊 Use this template → 建立你的私人知識庫 :::
Diffoci 來自 reproducible-containers/diffoci,它把容器的每一層、清單和設定拆解成容易比較的片段,用以檢查本地建構或 CI 執行是否真的可重複輸出同樣的映像。這篇分享 Diffoci 的角色、驗證流程與 CI 整合思路,讓你不必再用人工 diff 無數個 tarball。
Diffoci 的核心概念是「解構」容器映像。它會把 OCI image layout 和映像內部的檔案系統逐一展開成 tarball,再比對 metadata(manifest、config)與物理內容,這樣就能照顧到檔案權限、時間戳與層順序等細節,而不是只比較映像 ID。
比較時,Diffoci 會提供可經驗證的差異報表(包括檔案新增/刪除、二進位內容差異、metadata 不一致),也能把結果存成檔案以供追查。若你在本地手動 build 出來的映像與上游 CI 給的 artifact 有差異,Diffoci 能指出是哪一層、哪個檔案不對,甚至反推是否是建構參數或 buildkit cache 導致。
Diffoci 支援把驗證拆成幾個步驟,方便串到工作流程:
docker save + umoci unpack),作為 baseline。diffoci diff(或類似指令)比較兩個 OCI layout,差異會分門別類地列出檔案層、metadata 層與 config 層的差異。這種分層比較讓你不必猜測哪個檔案被改寫,也避免單純比較 digest 時疏漏時間戳或權限的變化。此外,這個流程也可套用在多平台建構(例如 amd64 與 arm64),只要把不同平台的映像各自解構,就能逐層對齊差異。
在 CI(比如 GitHub Actions、GitLab CI)中,只要把 Diffoci 當成一個步驟來執行,就能在建構完成後立刻驗證結果:
透過 Diffoci 的報告還可以自動化產生監控告警,例如「新映像多出了私密金鑰」或「某系統套件版本被升級」,以便在 release 前即時攔截潛在風險。
Diffoci 並非單純把映像 tarball 做 diff,而是把 OCI 元素拆解成會被 CI 消費的維度(metadata、層、檔案內容),再提供可讀報告與 exit code,讓可重現性從「理想」變成「pipeline guard」。若你的團隊在意每次 build 的 bitwise 相同性,或希望在多個環境比對結果,Diffoci 是一個值得納入的檢查步驟。
短網址的核心目標,是用有限字元表達最多的唯一值。本篇釐清常見的三種生成思路,並談碰撞、資訊洩漏與可追蹤性的差異。
把原始 URL 投射到如 SHA256 或 MD5 的雜湊值,再取前面幾個字元做為短網址。這種做法的好處是每次只要有 URL 就能快速產生對應值,不需先寫入資料庫即可比較是否重複。但缺點也很明顯:
若需求是臨時、開發測試用的短網址,hash 方案能快速上手;但正式服務需要加強碰撞處理與 idempotency,才能避免重複導向。
最常見的方式是讓資料庫自增 id,再把值轉成 base62(0-9a-zA-Z)。成品的特徵如下:
id 不會重複,短網址就一定獨一無二。id,進一步查出原始 URL。id 的最大範圍,轉成 base62 之後落在 6~8 個字元內。缺點是需要中心化的資料庫或序列器來協調 id 的分配。若要擴展到多個節點,有額外的分區或跨節點同步成本。此外,字串會隨時間遞增,若想躲避暴露資料量或流量模式,就需要加些混淆手法。
進階系統會採用分散式序列產生器,例如 Twitter 的 snowflake 或新的 uuidv7,它們把時間戳、節點編號、序號組合起來,再轉成 base62。這類方案的優勢包括:
將這種 id 再 encode 成 base62,就能在不犧牲可排序性的前提下得到可分享的短網址。如果想更短,可以只取時間戳與序號部分、再加 checksum,降低使用者手動輸入錯誤的風險。這類做法適合高吞吐、跨區域部署或需要追蹤來源的產品級服務。
可以把短網址系統想成兩層:儲存層負責維護短碼與原始 URL 的對應,邏輯層負責產生 id、判斷歸戶、追蹤與排程。常見的架構要素包括:
short_links 包含 id、short_code、target_url、creator_id、created_at、expires_at、status(例如 active/disabled)、usage_count、last_accessed_at。若衍生功能如 A/B 測試或廣告導流,可再加 campaign_id、variant_tag。建議以 short_code 為唯一索引,加速查找。usage_count/last_accessed_at,再回傳 302 redirect 到 target_url。這個流程可以部署在 edge 或 CDN 層,盡量維持低延遲;複雜的條件(驗證、廣告插頁)可交由後端服務處理。redirect_type 欄位控制返回值。short_code -> target_url,並設定 TTL。若有分散寫入,應設計事件或 stream(Kafka/Change Data Capture)同步至快取節點以免 stale。redirect 前插入檢查,例如 campaign_id 决定是否先導至吸引頁、再透過 client-side script 紀錄曝光後跳轉。也可在 short_links 加 landing_page_html 選項,讓某些短碼呈現自訂落地頁再跳轉。referer/utm 欄位、IP 黑名單、rate limit,讓濫用時能降載。另外可以記錄 fingerprint 或 user_agent 供分析使用頻率與地域。若是單機、初期方案,id + base62 提供簡單可逆、長度易控的產出;想快速實驗或不想自己維護序列器,就可考慮 hash function(記得補上碰撞處理與 retry)。若系統將來會分散部署、需排序或高可用,snowflake / uuidv7 + base62 是比較周全的選項。也可以混搭,例如用 uuidv7 生成原始 id,再 encode 成 base62,最後加 checksum,兼顧易讀與健壯性。整體架構應涵蓋儲存表、快取、redirect 處理、狀態控制與廣告/觀察擴充,才能支援不同使用情境。
當你需要說明重點提示、互動範例或分頁程式碼等更豐富的敘事方式時,可以在 Markdown 中混用 React 元件;而一般文字仍維持純 Markdown,兼顧易寫與彈性。
讓 MDX 區塊維持精簡(建議 40 行內),並替所有媒體提供描述性的 alt 文字,方便後續翻譯與在地化。
npm install。npm run start 在本機確認頁面載入正常。Props 型別,方便其他作者複用。@site/src/components/ 匯入。<Tabs groupId="language">
<TabItem value="checklist" label="CLI 檢查清單">
1. 下載最新範本並執行 `npm install`。
2. 透過 `npm run start` 在本機確認頁面載入正常。
3. 將遇到的錯誤與重現步驟加到 issue 描述中。
</TabItem>
<TabItem value="notes" label="TypeScript 筆記">
- 先在 Markdown 定義所有可翻譯字串,再用 props 傳入 React 元件。
- 為 MDX 互動元件設計 `Props` 型別,方便其他作者複用。
- 若多篇文章都用到相同邏輯,可移到 `@site/src/components/` 匯入。
</TabItem>
</Tabs>
Tabs 與 TabItem 能在同一區塊切換語言或平台CodeBlock 方便加上區塊標題或切成 live editorAdmonition 與 Details 可凸顯警示或折疊補充說明團隊在規劃測試策略時,往往需要兼顧開發體驗、既有 CI/CD 工具與瀏覽器支援度。這篇文章整理 Vitest、Jest、Karma 與 Jasmine 的定位差異,讓你快速判斷哪一套最符合專案需求。
| 框架 | 核心定位 | 執行環境 | 亮點 | 適合情境 |
|---|---|---|---|---|
| Vitest | Vite 生態系預設測試框架 | Node.js(可透過 Vitest UI 觸發瀏覽器) | 與 Vite 設定共享、原生 ESM、啟動極快 | 使用 Vite/Vue/React 並追求極速回饋的專案 |
| Jest | Facebook 推出的通用測試框架 | Node.js、JSDOM | Snapshot 測試、模組模擬、社群資源豐富 | 需要穩定 API、搭配 React/React Native 的團隊 |
| Karma | 利用真實瀏覽器跑測試的 Test Runner | 真實瀏覽器(Chrome、Firefox 等) | 可整合 Webpack/SystemJS,適合舊專案 | 必須驗證瀏覽器 API 或需要大量整合測試 |
| Jasmine | 早期 BDD 風格測試框架 | 瀏覽器或 Node.js | 零依賴、語法簡潔 | 嵌入式或低依賴場景、AngularJS 舊專案 |
若專案使用 Angular 14+ 並維持 CLI 預設,通常會同時搭配 Karma + Jasmine;若改用 Vite 驅動專案,就可考慮 Vitest 取代 Jest/Karma。
vitest run --coverage 即可整合 CI。選擇測試框架時請先盤點:
只要釐清上述條件,就能在 Vitest、Jest、Karma、Jasmine 之間做出更符合團隊節奏的決策。
Codex 是 OpenAI 提供的程式碼生成助手,能解讀自然語言並輸出程式碼、指令或文字。本文示範如何在 WebStorm 中透過 Codex CLI 建立一個以對話驅動的工作流程。
WebStorm 已經提供完善的 TypeScript/React 體驗,但若再結合 Codex CLI,就能以對話方式生成模板、整理文件或批次修改檔案。這讓日常的重複性動作(例如建立部落格、填寫 front matter、插入多國語系內容)都能在同一個 IDE 視窗完成。
Codex 維持在同一個版本最容易除錯,建議專案以 package.json script 管理,例如 "codex": "npx codex",避免團隊成員版本不一致。
npm install -g @openai/codex-cli
.context/(例如 docusaurus-guidelines.md),把前置規範寫入,並於每次執行前指示 Codex 先閱讀。package.json 中加入腳本(底層仍呼叫全域 codex 或 npx codex):
{
"scripts": {
"codex": "codex",
"codex:plan": "codex --plan"
}
}
codex,Working directory 指向專案根目錄。codex 配快捷鍵,例如 Ctrl + Shift + ;。透過以上設定,就能在任意檔案按一次快捷鍵,立即呼叫 Codex 完成編輯或回覆。
npm run codex -- "create blog on webstorm",Codex 會依照 .context 中的規範與當天日期產生檔案,再由你在 WebStorm 內調整。codex --plan 整理多步驟修改,把輸出貼進 .mdx 檔案,並利用 WebStorm Diff 介面快速檢查。做法是先在終端執行 npm run codex:plan -- \"<需求描述>\",依序執行計畫並將 Codex 產生的內容貼回對應文件,最後用 Diff 檢查每一步是否符合預期。/bin/zsh -l。CODEx_SANDBOX=workspace-write(依專案需求)或檢查 repository 權限。.context,並提醒 Codex 每次編輯前重新閱讀該檔案。善用這套流程,就能在 WebStorm 中持續保持專注,同時享受到 Codex 的自動化與解題效率。
Nx monorepo 內通常包含多個前端或後端應用,例如:
apps/
app1/
app2/
app3/
透過 Nx build 後,你會得到:
dist/apps/app1/
dist/apps/app2/
dist/apps/app3/
本篇文章將教你如何把這些 apps 同時部署到同一個 Nginx 下,並使用不同路徑或不同子網域。
例如:
server {
listen 80;
server_name example.com;
location /app1/ {
alias /usr/share/nginx/html/app1/;
try_files $uri $uri/ /app1/index.html;
}
location /app2/ {
alias /usr/share/nginx/html/app2/;
try_files $uri $uri/ /app2/index.html;
}
}
nx build app1 --configuration production --base-href=/app1/
nx build app2 --configuration production --base-href=/app2/
/usr/share/nginx/html/
app1/
app2/
例如:
server {
server_name app1.example.com;
root /usr/share/nginx/html/app1;
try_files $uri $uri/ /index.html;
}
server {
server_name app2.example.com;
root /usr/share/nginx/html/app2;
try_files $uri $uri/ /index.html;
}
由於每個 app 直接掛在根目錄(/),baseHref 設為 / 即可:
nx build app1 --configuration production --base-href=/
nx build app2 --configuration production --base-href=/
如果你的 Nx monorepo 中包含後端服務(例如 NodeJS API),你可以使用 proxy_pass:
讓 Nginx 將 /api 相關請求導向後端 server。
server {
listen 80;
server_name example.com;
# 前端 Angular App
location / {
root /usr/share/nginx/html/app1;
try_files $uri $uri/ /index.html;
}
# API Proxy
location /api/ {
proxy_pass http://localhost:3333/; # Nx serve / NodeJS 的 API port
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Nx + Angular 前端 + NodeJS API
/ → 前端/api → 後端(NodeJS)多後端服務(微服務結構)
/auth → Auth service/order → Order service/payment → Payment servicenx serve api
nx build api
SPA(如 Angular)本身沒有真正的路徑,因此 Nginx 需要設定:
try_files $uri $uri/ /index.html;
這會讓所有路徑回到 Angular 的 router 處理。
檢查:
3333)proxy_set_header Host $hostproxy_redirect off;你可以透過三種方式把多個 Nx apps 與後端部署在同一個 Nginx:
只要正確設定:
即可達成完整的 Nx monorepo 部署架構。
目前前端專案採用 Nx monorepo,原本僅有單一應用程式 shopping-app,同時承載:
隨著功能擴充與角色複雜度提升,單一 App 逐漸出現以下問題:
為解決上述問題,我們規劃將前端拆分為兩個獨立 App,並保留既有路由邏輯與使用者習慣。
拆分後我們會有兩個應用:
shopping-app:前台,面向一般使用者backoffice-app:後台,面向管理者/營運人員優勢:
在 Nx 下,拆分多個 App 可以搭配:
實際效果:
backoffice-app未來可實現:
本次拆分採用「Clone & Carve」策略:
先完整複製,再在複製版本中慢慢「削減」成新形狀,而不是直接改原本的 App。
流程概念:
好處:
shopping-app 在拆分初期完全不被動到[現有 shopping-app]
|
v
[複製為 backoffice-app]
|
v
[確認兩者可獨立 serve & build]
|
v
[在 backoffice-app 內刪除前台頁面]
|
v
[建立兩者 routing / 部署分流]
|
v
[未來再抽出 shared libs]
|
v
[Build / 部署 / 權限 全面分離]
拆分前:
apps/
shopping-app/
pages/
home
note
article
tag
search
backoffice
admin
transcript
拆分後:
apps/
shopping-app/
pages/
home
note
article
tag
search
backoffice-app/
pages/
backoffice
admin
transcript
未來再視需求抽出 libs:
libs/
shared-model
shared-api
shared-domain
shared-ui
shared-utils
以下步驟以 Nx + Angular 為例,重點在「最小異動」與「可隨時回退」。
在 repo 根目錄複製:
cp -R apps/shopping-app apps/backoffice-app
確認複製後目錄存在:
apps/
shopping-app/
backoffice-app/
此時兩個 App 的內容完全相同。
server {
listen 80;
server_name yourdomain.com;
# 前台路由
location / {
proxy_pass http://localhost:4200;
}
# 後台路由
location /backoffice/ {
proxy_pass http://localhost:4300;
}
# 避免 Angular 路由錯誤
location /backoffice {
return 301 /backoffice/;
}
}
說明:
backoffice-app[加上 nginx proxy → 建立 / 與 /backoffice 路由分流]
|
v
[確認分流可正常把流量導向不同開發 port]
|
v
[複製 shopping-app → backoffice-app]
在 backoffice-app 底下,調整下列檔案:
project.json
shopping-app 調整為 backoffice-appsourceRoot 指向 apps/backoffice-app/srctsconfig.app.json
extends、files、include 等路徑指向 backoffice-appindex.html
<title> 例如:Backoffice Admin調整完成後,在本機執行:
nx serve shopping-app
nx serve backoffice-app
確認兩個 App 都能啟動且畫面正常,即可進入下一步。
目標:在不影響 shopping-app 的前提下,慢慢把 backoffice-app 修剪成「只有後台功能」的應用。
做法:
在 backoffice-app 中,先確定 routing 結構與檔案位置
針對明顯前台功能(例如:home, note, article, tag, search),依序:
每移除一組路由/頁面,都進行一次:
nx build backoffice-app
nx serve backoffice-app
確認:
/backoffice, /admin, /transcript)仍可正常運作完成後,目錄大致會變成:
apps/
backoffice-app/
pages/
backoffice
admin
transcript
在 gateway / nginx / 前端部署設定中,將路由切開,例如:
/ 或 /app → 指向 shopping-app build 出來的 bundle/backoffice 或 /admin → 指向 backoffice-app build 出來的 bundle如此一來:
拆分前期不建議直接抽 libs,以免一次改動太大。
當兩個 App 穩定運作後,可以開始評估:
再逐步抽到 libs/ 底下的 shared 專案中,搭配 Nx 提供的 dependency graph 逐步優化結構。
每一個拆分步驟都建議至少做:
nx build shopping-app
nx build backoffice-app
| 風險類型 | 說明 | 對應策略 |
|---|---|---|
| build 爆炸 | 一次改太多檔案 | 每次只做小步驟,改完就 build 一次 |
| 路由錯亂 | path 指到錯的 App | 將前後台 routing 寫在文件與設定中統一管理 |
| 共用程式被誤刪 | 後台仍需要前台某段邏輯 | 初期只刪除「明顯純 UI」頁面,不動 domain / service |
| 難以回退 | 多步驟混在同一 commit | 每個重要步驟分開 commit,必要時可 git revert |
本次 Nx App 拆分的目標,不是追求一次到位的「完美架構」,而是:
核心心法:
Keep it working → Keep it separated → Keep it evolving
先讓系統穩定分家,再持續演進結構,是目前最務實、風險最低的拆分路線。
跟著人生攻略研究所所長的腳步,正式踏進 n8n Course Level 1 的測驗流程。
整體難度不算高,但實際作答時,還是有幾題需要重新確認邏輯與分類方式。
事前準備按著所長的教學完成註冊與金鑰取得:
https://lifecheatslab.com/n8n-course/#第一步:註冊_Level_1_測驗,取得個人金鑰
在整份題庫裡,理論題的第 4 題與第 6 題特別容易讓人猶豫。
第 4 題:What can you do if there is no n8n node for an app/service that you want to use in a workflow?
第 6 題:Which of the following are Trigger Nodes?
依題目列出的選項來看,除了 Schedule node;Airtable node 實作上也可以。
其他題目主要檢查對 n8n 基礎概念的掌握:哪些節點能啟動 workflow、Code node 必須回傳什麼格式、資料結構怎麼判讀等等。
多利用官方文件與搜尋,大部分都能順利作答。
實作題的部分只要掌握流程邏輯,其實不算太複雜。
最方便的方式,是先匯入官方提供的完成版 workflow,再依照題目逐步調整即可。
官方 workflow JSON:
https://docs.n8n.io/_workflows/courses/level-one/finished.json
匯入後,照題目要求調整各個節點:補上 IF 條件、調整資料格式、確認流程順序。
Airtable 在這份測驗裡不需要真的去操作,直接略過就好,不會影響作答結果。
整體流程清楚、節點之間的連動也好檢查,照著步驟實作很快就能完成。
搭配課程文件的補充說明:
https://docs.n8n.io/courses/level-one/chapter-7/
雖然只是 Level 1,但完成後看到進度亮起來,還是有種踏出第一步的成就感。
