羊圈機房
把工作上真的踩過的坑寫下來:怎麼發現、怎麼查、最後怎麼修。寫給下一個踩到的人,也寫給三個月後忘記的自己。
同一段程式碼改 29 個檔案,build 過了但其中 7 個是壞的|批次改多檔最危險的不是語法錯誤,是「能編譯的壞掉」。腳本吃掉一整行、內容插進註解裡,編譯器全部放行。要怎麼獨立驗證覆蓋率。
反向代理的三個經典坑:前綴被剝兩次、連到 ::1 被拒、整頁沒有樣式|用子路徑掛服務時 handle 跟 handle_path 差在哪、為什麼目標要寫 127.0.0.1 不能寫 localhost、X-Forwarded-Proto 沒被信任會怎麼壞。
在 Cloudflare Workers 免費層蓋一個站,設計時要守的四條規則|每天 10 萬次請求、每次 10ms CPU。靜態檔案不計次是最大的槓桿;KV 每天 1000 次寫入會殺掉任何個人化計數器。實際跑一個 100 多頁的站的作法。
Docker 容器裡的排程要放哪:四種放法,跟一個查了半天查錯機器的教訓|應用層排程放進服務行程、系統層工作放宿主機。為什麼容器裡不該裝 cron、開關要用環境變數、以及排程沒跑跟排程跑完沒事看起來一模一樣。
為深色頁做的共用元件掉到淺色頁上,文字直接消失——同一個 bug 我發作了五次|半透明深色卡被淺色底洗淡、讀主題的函式在第一次 render 拿不到值。console 全綠、版面沒壞、只有字不見了。附四個檢查點。
容器顯示 Up,網路卻是死的:network_mode 共用網路命名空間的陷阱|用 network_mode 讓容器共用另一個容器的網路。被依附的那個一重建,其他容器就綁在一個已經不存在的命名空間上,docker ps 完全看不出來。
你在容器裡裝的東西,下次 build 就沒了:怎麼量出哪些路徑真的會留下來|容器的可寫層不是 volume,rebuild 會整層丟掉。哪些路徑會存活不能用猜的,docker inspect 一行就能問出來。
docker restart 不會重讀 env_file,你改的設定沒有生效|restart 重啟的是容器裡的行程,不是容器本身。環境變數在建立容器那一刻就固定了,改完 .env 重啟看起來成功,值還是舊的。
GA4 上九成不是人:怎麼把真實訪客從機器人跟自己人裡面切出來|停留秒數只能擋掉爬蟲,擋不掉自己的手機。用解析度指紋、新舊訪客、城市三個維度看,才知道流量成長是不是假的。
「已檢索 - 目前尚未建立索引」跟「Google 無法辨識」是兩件事,處置完全相反|一個是爬過決定不收,一個是根本還沒被看到。搞混會做出完全錯誤的動作。附一支掃全站索引狀態的腳本,以及抽驗會錯位的陷阱。
接 thinking 模型的四個坑:think 標籤、max_tokens 反而害你、503 要重試、token 用量是模型換人的體溫計|推理模型會在回應前吐一大段思考。剝除函式只處理成對標籤不夠,設 max_tokens 會讓內容整個空掉,而輸出 token 暴增是最早的警報。
容器裡的 Node 打某個 API 一定 timeout,但 curl 測起來是通的|目標網域有 AAAA 紀錄、容器沒有 IPv6 出口,Node 的 Happy Eyeballs 會卡死在 IPv6。curl 會自己退回 IPv4,所以用 curl 排查一定得到錯誤結論。
NODE_ENV=production 讓 npm 跳過所有建置工具,然後 build 說找不到 vite|設 NODE_ENV=production 是為了讓執行時期更快,但它會讓 npm install 略過 devDependencies——而建置工具幾乎都住在那裡。
用 Playwright 自動量 UI,五個會給你「看起來像結果」的假數字|截圖座標系差一個 scrollY、PNG 不一定是 RGBA、disabled 按鈕、Tailwind v4 的 translate 是獨立屬性、捲動驅動的動畫等再久也沒用。
用 restic 加 rclone 把伺服器備份到 Google Drive,含無頭機器怎麼過 OAuth|沒有瀏覽器的機器要怎麼授權 Google Drive、保留策略為什麼用版次不用天數、量 repo 大小不能用 restic stats,以及只在失敗時通知的理由。
resvg 產圖沒有文字,而且不是豆腐字,是整段消失|SVG 轉 PNG 時字型找不到,resvg 不畫方框也不報錯,直接跳過那段文字。彩色 emoji 字型還會多一層陷阱。怎麼在 build 就擋下來。
接永豐 Shioaji 即時報價:官方限額、文件沒寫的三個資料坑,還有連線半死不會自己重登|snapshot 不能拿來輪詢、連線數只有五條所以一定要單例。時間戳要用 UTC 解、漲跌幅要自己算、昨收要 round。斷線之後它會安靜地降級繼續跑。
抓到 0 筆,但 HTTP 回 200:軟性限流長什麼樣、怎麼量、要等多久|不是 429、不是登入牆。頁面正常渲染,只有內容區塊換成一句「發生錯誤,請稍後再試」。探針要等 6 秒才看得到,而且測試本身會製造限流。
把 33 個子網域整併成子目錄:怎麼搬、要留什麼、以及我沒算到的代價|子網域換子目錄的 SEO 遷移實作。301 要永久留著、wrangler 會把不在清單裡的網域連 DNS 一起刪掉,還有搬完之後 Google 一個新網址都沒爬的那三個月。
一個 port 都不開,從外面連回家裡的服務|用 Tailscale 當 sidecar 容器,家裡的服務不必轉埠、不必 DDNS、不必公開憑證。連帶解決手機瀏覽器不給用剪貼簿與相機的問題。
櫃買中心的歷史資料在哪:OpenAPI 只給最新一天不代表沒有歷史|上櫃三大法人與逐檔當沖可以回溯到 2018 年,端點藏在網頁版而不是 OpenAPI。怎麼找、欄位名稱重複七組怎麼讀、HTTP 520 跟 302 各代表什麼。
一個 import 讓每個訪客多載 259 KB:barrel 檔案怎麼吃掉 code splitting|把 33 篇文章兜成一個 index 檔很方便,但只要有元件 import 它,Vite 就會把整包拉進 chunk。改成一檔一篇加 import.meta.glob 之後降到 4 KB。
量對比度遇上 Tailwind 4 的 oklch,寫錯的版本會算出 1.53 而正確答案是 10.83|用正則解析顏色在 oklch 時代已經失效。canvas 有兩種用法只有一種對,半透明要逐層疊,還有一個能讓壞版本也通過的反向驗證陷阱。
雨滴打在玻璃上的 WebGL 效果:折射公式的未知數是半徑,還有四個不報錯只畫錯的地方|CPU 跑模擬、GPU 只做折射取樣。半徑要編進貼圖的 B 通道,否則大水滴變黑半月、小水滴變泡泡。附首屏延後啟動與三層退路。
yfinance 抓台股 ETF 有一個假的 -75% 斷點,而且 splits 欄位是空的|0050 在 2014-01-02 有一個不存在的暴跌,成因是分割還原只套到某個日期之後。它會把整年的高點灌成四倍,把結論整個翻過來,而且不會噴任何錯誤。
批次檔裡放中文,cmd.exe 會從中間把那一行切開|cmd.exe 照開檔當下的字碼頁逐行讀批次檔,UTF-8 中文會讓行解析錯位,切出來的碎片還會被當成指令執行。
用指令碼裝 Office:winget 不行,只能走 ODT|winget 的 Microsoft.Office 挑不了語言、通道與大量授權版本。改用 Office 部署工具,把 configuration.xml 用參數生出來。
拿 JSON 當設定檔、拿 scriptblock 當外掛,PowerShell 咬我的四口|字串 -is [PSCustomObject] 回 True、空物件轉不出來、逗號後一個空白讓參數靜默綁錯、scriptblock 看不到定義它的檔案。
printbrm 被移除之後,印表機怎麼搬到新電腦|改用 Get-Printer 系列 cmdlet 自己做備份還原。LPR 埠會被靜默建成 RAW、驅動路徑爆 260 字元、WPP 擋掉第三方驅動。
跑完不等於生效:幫部署流程補一張交機檢查表|部署指令碼回報成功之後,回頭讀系統的實際狀態再比對一次。五種判定狀態怎麼分,以及 powercfg 輸出解析錯會得到的鬼數字。
新電腦交機自動化:一份設定檔跑完整台機器|從 UAC 提權、移除預裝、裝軟體與 Office、工作列到交機驗證的完整流程,以及每一段裡會靜默失效的地方。
三種你用管理員身分改不到使用者身上的 Windows 設定|HKCU 跟著執行帳號走、UserChoice 擋掉副檔名關聯、DISM 預設關聯只影響新帳號。三道牆,以及各自能繞到哪裡。
靜默安裝軟體的四個坑:msi 參數被吃掉、winget 說沒裝其實裝了|用指令碼無人值守裝軟體實際踩到的問題。msi 一定要走 msiexec、winget 認不出手動裝的軟體、3010 不是失敗、安裝程式會卡死。
Windows 11 的工作列釘選,只剩群組原則這條路|傳統 Taskband 登錄機碼在 Win11 會被忽略。改用 LayoutModificationXML 加鎖定原則,還得自己排一個登入後解鎖的排程。
AutoHotkey FPS 腳本:連點射擊與自動切槍(v2 範例,附 v1 對照)|兩個複製就能跑的 AutoHotkey 輔助腳本:按住左鍵自動連點、開一槍自動切槍。v2 語法,附 v1 對照與移植會壞掉的地方。
AutoHotkey 範圍掃怪腳本:自動練功用的圓形掃描(v2 重寫)|以滑鼠位置為圓心一圈圈往外點的掃怪腳本,v2 版可以直接用。附舊 v1 版本,以及它的圓其實從來沒畫出來過的原因。
在 Ubuntu 安裝 Cacti 1.2:從 apt 到 SNMP 的完整流程|Ubuntu 裝 Cacti 的每一步,含時區資料表、PHP 兩個 ini、snmpd 只綁 localhost 這三個一定會卡住的地方。
在 Ubuntu 安裝 Open-AudIT 6:資產盤點系統的最短路徑|Open-AudIT 6 現在只要跑一個 .run。安裝步驟、三個會讓它安裝失敗但不告訴你原因的環境問題,以及舊教學失效的部分。
我的 SPA 有 100 個網址,但爬蟲眼中只有 1 頁|client-only SPA 部署到 Cloudflare Workers 後,六個完全不同的網址抓下來的 body 內容 md5 一模一樣。問題在哪、怎麼量、怎麼修。
一次 wrangler deploy 拆掉了我 30 個網域的 DNS|wrangler.jsonc 的 routes 是宣告式的完整清單,不是增量。少列一個網域,deploy 就會連同 DNS 記錄一起刪掉。