2026年9月28日 星期一

TOEIC 630 → 920:我的三級跳心得

兩張證書放桌上,左邊是 2021 年 1 月的 630 分(L335 / R295),右邊是最近一次 920 分(L480 / R440)。同樣的耳朵、同樣的眼睛,中間只隔了一段時間和一整套「換了方法之後」的學習。把這段過程拆開寫,給還在 TOEIC 裡游泳的人作參考。


左:2021/01 的 630 分(L335 / R295)|右:近期的 920 分(L480 / R440)。

630 分時的我:聽力是最大短板

先看老成績單:聽力 335、閱讀 295。335 大約是「聽得出單詞、抓不住整句」的位置——Part 2 的句型題還在背、Part 3 的對話一長就開始漏、Part 4 的廣播講到中段就脫軌。

那時犯的三個錯:

  1. 只刷題、不聽課外。每天做一套 Part 1~4,聽力聽的是 TOEIC 腔,課後回到世界又是另一種英語,耳朵沒有「離場訓練」。
  2. 閱讀靠字彙。遇到生詞就查,一題查三次,時間全花在字典上。
  3. 沒有固定時段。早上聽力、晚上閱讀、周末才練,狀態全看當周忙不忙。

轉折:把目標拆成「耳朵」與「眼睛」兩條線

920 的成績是 L480 + R440 兩條腿撐起來的(920 通常要求兩科都 350 以上才有效),所以我的解法是把兩科拆開練,各自獨立計時:

聽力線(335 → 480)

  • 每天 30 分鐘「非 TOEIC」英文音訊:播客、新聞、影片都算,強制自己「不懂也要聽完」,耳朵先習慣連續語流,再回來做題。
  • Part 3/4 改用「聽寫一句、回一句」:不是一次聽完三題再猜,而是每停一次就默寫關鍵句,錯的字回聽第二遍。這一步最痛苦,也最有用——它把「聽懂」變成「聽出來」。
  • 固定題型反應時間:Part 2 練到「選項一出現、大腦先想問句類型」(What / Where / When / Why / How 五類),反應時間從 8 秒壓到 3 秒,整套聽力才救得回。
  • 考前三週只做整套,每天一套:保持「考試時長」的專注力,比零散練 10 套有效。

閱讀線(295 → 440)

  • 停止逐字閱讀,改「句群掃讀」:一篇文章先花 20 秒掃段落首句與數字,再回題。TOEIC 閱讀考的是「資訊位置」,不是文學理解。
  • 生詞策略翻轉:從「遇到就查」改成「先猜、三題後統查」。猜錯再查,成本只有多 10 秒;查得對,那 10 秒就是賺的。
  • Part 7 雙篇章固定顺序:先看較短的那篇建立語域,再看另一篇,把 75 分鐘的分配寫在考卷上,避免前鬆後緊。
  • 字彙不再背單字書,改成「錯誤字卡」:每次考後把不認識的詞抄一張卡,只背出過題的。兩週一輪,記憶效率翻倍。

心態上最大的兩個翻轉

1. 從「我英文很差」到「我聽力方法不對」

630 那次考完,我下了一個很傷自尊的結論:我語言天賦不行。後來想通:聽力 335 不是「耳朵問題」,是「訓練內容跟考試不同型」——聽力考的反應速度、閱讀考的資訊定位,兩件事都需要「針對訓練」,而我在做的是「泛泛而聞」。

2. 從「考前三月衝刺」到「每科 30 分鐘 × 90 天」

920 分不是一次爆發的成績,它是一個日復日 60 分鐘的複利。每天 30 分聽力 + 30 分閱讀,90 天就是 90 小時的有效訓練——遠比考前兩週每天 5 小時的衝刺更穩,因為耳朵和眼睛都需要「連續性」才能上線。

給還在 600 分區間的人

你的弱項 我的對解 每日投入
聽力 300 上下 非 TOEIC 音訊 30 min + Part2 反應速度 30 min
閱讀 280 上下 句群掃讀 + 生詞「先猜後查」 30 min
時間不夠 放棄 Part 7 後半篇,只保前 40 題 考場策略

一句話:TOEIC 不是考「你有多聰明」,是考「你有多熟悉它」。630 → 920 的差距,不是智商的差距,是「熟悉度」的差距。

兩張證書現在都釘在我的書房牆上。630 那張提醒我:方法不對的時候,再用力也只能拿到中場;920 這張提醒我:方法對了之後,堅持就會給答案。

2026年9月22日 星期二

Arduino Mega2560 測試治具學習

Purpose:

1. 兩個按鍵作為進出平台的開關 另一按鍵為平台上另一上下動作的開關
2. 完成所有動作後按任一進出按鍵就進行退出動作在退出時 蜂鳴器要發聲
3. 完成進入動作 COUNTER 要記數加一次為了控制頂針壓合次數
4. 手動跟程式控制同時可以動作

Architecture:

 
零件配置與用法詳解

以下針對本治具的 8 個核心零件,說明在實際製作測試治具時的多種用法、接線要點與常見陷阱

1. Arduino Mega2560 控制板

 

 

基本用法:本平台的中樞,負責读取按鍵輸入、驅動 Relay、控制蜂鳴器與記數器。建議用 5V 供電(USB 或 12V DC 经 LDO/regulator),板載穩壓器不要長期超過 1.5A 負載。
多用法:① 可同時開多個 UART(Serial/Serial1/Serial2/Serial3),其中一路可接 PC 做 HMI 監控、一 路接 PLC 或蜂鳴器驅動板;② FreeRTOS 多任務(本程式即用 Arduino_FreeRTOS)讓「手動按鍵」與「自動流程」並行不阻塞;③ 27 個數位腳位足以同時接 8 口 Relay + 3 按鍵 + 蜂鳴器,仍有餘裕擴充 sensors。
陷阱:按鍵輸入腳位務必用內部上拉(pinMode INPUT_PULLUP + 按鍵接地)避免浮空亂跳;5V 輸出腳位只能供 ≤40mA,不能直接驅動 Relay 線圈或蜂鳴器。

 

2. 8 Port Relay board

 

基本用法:以 Arduino 的低電平信號切換高電路——本治具用它控制 3 個氣壓閥與蜂鳴器的通斷。典型接法:Arduino 3.3V/5V → Relay 控制端 GND 接地、信號腳接對應輸入腳。
多用法:① 8 口可分成「氣動區(4 口)+ 馬達/電源區(4 口)」做不同功能分組;② Relay 的輔助触点可回授到 Arduino 數位腳,驗證動作是否真的完成(氣缸到位/閥實際切換);③ 串接光耦隔離型 Relay 板可承受工業現場的電湧。
陷阱:Relay 吸合瞬間電流 20~40mA,8 口同時動作 ≈300mA,Arduino 5V pin 不夠,要用 5V 外接電源給 Relay 板供電、與 Arduino 共地;控制大電流負載(馬達、燈)時要在負載側加二極體(續流)或接觸器。

3. 3 個 push button

 

基本用法:① 進/出平台開關(互斥邏輯,程式層面互鎖);② 平台上下動作開關。接法:一脚接 Arduino INPUT_PULLUP 腳位、另一脚接地,按壓時該腳位被拉低即為有效。
多用法:① 長按 vs 短按分辨——本程式可用 FreeRTOS 計時:短按触发單次動作、長按(>500ms)进入持續動作或模式切換;② 双按鍵組合指令(如「進+上」同時按 = 手動微調),實現不寫 HMI 的快捷手控;③ 加装自鎖按鍵(latching switch)做「手動/自動」模式切換。
陷阱:機械按鍵必有抖動(bounce 5~20ms),軟體要 debounce(延遲 20ms 複讀 或狀態機);ESD 敏感的工業環境建議並聯 100nF 電容 + 1kΩ 電阻。

4. 3個氣壓控制閥

 

基本用法:電磁閥得電 → 切換進/排氣 → 驅動氣缸單向動作。5V DC 電磁閥直接由 Relay 驅動是最常見做法(避免 Arduino 直接吸合線圈)。
多用法:① 二位三通閥做單向氣缸(回弹用彈簧或另一側氣壓);② 二位五通閥做雙向氣缸(進/出各一口);③ 串接電磁閥分層控制——主閥管總氣源、子閥分管路,任一子閥故障不影響其他回路;④ 加装減壓閥調工作壓力(一般治具 0.3~0.6 MPa 足夠),避免直接吃 0.7+ MPa 廠房氣源打穿氣缸密封。
陷阱:DC 電磁閥線圈有极性,接反不動作且可能燒線圈;高频吸放(>10次/分)會縮短線圈壽命,程式裡要限制最小動作間隔;管路要加消音器,否則每次換向的「呲—」聲非常擾民。

5. 1個蜂鳴器

 

基本用法:治具完成退出動作時報聲提示算術成功/失敗。有源蜂鳴器(內建振蕩)接 DC+/GND 即鳴;無源蜂鳴器要 Arduino PWM 給 2~4kHz 方波。
多用法:① 用不同節奏表達不同結果——1 短聲=PASS、3 短聲=FAIL、長鳴=急停/警示,這是測試治具的人機慣例;② 串联蜂鳴器+LED 做雙通道提示(視覺+聽覺),工廠噪音環境下視覺補償;③ 由 FreeRTOS 定時任務獨立控制,不阻塞主動作流程。
陷阱:蜂鳴器電流 15~40mA,可直串 220Ω 電阻接 5V;但持續鳴叫會發熱,報完應主動斷電(本程式做法);無源蜂鳴器若接有源的接法會完全沒聲。

6. 次數記數器

 

 

基本用法:每次完成「進入→動作→退出」循環,計數 +1,用來統計頂針壓合次數/治具稼動次數。硬體計數器(如 MAX7219+LED 或独立計數卡)由 Arduino 的 DIGITAL 腳位給 pulse 即可。
多用法:① 可設定目標值(如 100 次)Reached 時自動報警或鎖定,適合「定數生產」場景;② 結合 EEPROM/SD 卡存歷史稼動紀錄,產線可追溯;③ 双計數器設計——「總計數」+「班次計數」(班次可手動清零)。
陷阱:純軟體計數(變數+1)掉電即歸零,若要持久化要寫 EEPROM(有擦寫次數上限,每 1 万次更新一次才寫)或用硬體計數 IC(斷電保存型)。

7. 4個氣壓缸

 

基本用法:本平台用 4 個氣缸做頂針升降/平台進出的直線運動。行程、缸徑要按負荷選:頂針力 = 氣圧 × 活塞面積 − 負荷摩擦損耗(保守乘 0.7 安全係數)。
多用法:① 雙氣缸並聯可加倍出力(同一側);② 氣缸加磁簧開關(magnetic reed)回授行程位置,Arduino 讀取即可確認「到位」,比純延遲等待可靠;③ 气爪、旋转气缸、手指气缸等都是同一套電磁閥驅動方式的變體,本平台架構可直接移植;
陷阱:無行程開關時務必用「時間+延遲」做保護,避免氣缸撞端;緩衝墊/油封老化會漏氣→行程不足,定期維護;高頻動作場景(>50 次/分)建議選薄型氣缸,普通圓筒式行程反覆衝擊會缩短緩衝塞壽命。

8. ACto12VDC變壓器

 

基本用法:把 110V/220V 交流轉為 12V DC,供電給 Relay 板、電磁閥蜂鳴器、計數器等。Arduino Mega 的 Vin 也接受 7~12V,可用同一電源帶(注意總電流)。
多用法:① 選 12V/1A 以上是底线,若 8 口 Relay 同時吸合+電磁閥全動+蜂鳴器,峰值可達 0.8~1.5A;② 分 2 路輸出——12V 給電磁閥/Relay(功率負載)、5V USB 給 Arduino(數位電路),避免功率負載的電流波動干扰 MCU;③ 工業環境建議换成 24V DC 電源(PLC 生態標準) + 24V 電磁閥/Relay,抗干擾與配線距離都更好。
陷阱:AC-DC 變壓器若非隔離型(transformer 隔离 vs 非隔离),一次側與二次側共地會把雜波傳進Arduino;接地策略:整個電源箱的 GND 匯流排只接一點,與 Arduino GND 單點連,避免地環流。


整合提醒

    • 手動/自動並存:本架構的精髓——按鍵手動動作與程式自動流程同時可用,關鍵在 FreeRTOS 任務排程 + 互鎖旗標(避免手動與自動同時驱动同一口 Relay),这也是本程式 vFlag structure 存在的理由。

 

    • 配線安全:AC 側與 DC 側走不同線槽;DC 動力線(電磁閥、Relay 負載)用 12AWG 以上;所有接線端用接線頭+cage clamp,忌裸線壓接。


2026年9月21日 星期一

WP 當工坊 × Blogger 當公開面:我的雙引擎部落格分工實務


為什麼要分工?

我有一台本機 WordPress(192.168.1.25:8082,Docker + MySQL 8)和兩個 Blogger 部落格:

  • 軟硬體的天空(www-winson.blogspot.com)— 長年主站
  • Vic’s 疊代筆記(vic-iteration.blogspot.com)— 新開的分類站

如果把所有文章都堆在一個地方,會很雜。所以我的分工策略是:

「編輯在 WP,發布在 Blogger。」

WordPress 是工坊(後台),Blogger 是公開面(前台)。

三個分工角色

角色 平台 用途
編輯室 WordPress (本機) 撰寫、排版、存草稿、管理媒體庫
主站前台 Blogger – 軟硬體的天空 技術長文(AI 模型、硬體、工具鏈)
分類站前台 Blogger – Vic’s 疊代筆記 疊代筆記、專案流程

為什麼不在 WP 直接給全世界看?
– WordPress 跑在本機(無公網 IP、NAT 後、LTE AP 封入站),給外網看會遇到 Quick Tunnel 的痛:
– trycloudflare.com 網址每次重開機都變
– 任何拿到的人都能用(安全性差)
– 重連 58 次(我實測過)
– 要長期「給外網穩定入口」只有一條路:找回 giantpanda 帳號 或 買新域名+Cloudflare NS,成本高

所以 WordPress 只做我的編輯室,公開一律走 Blogger API。

實際發布流程(已跑通,一鍵可跑)

我寫了一支腳本 /home/gx/share-folder/blogger/vic/vic_publish_pipeline.py,兩步:

# Step 1: 用瀏覽器授權換 token(一次性,之後用 refresh_token 即可續)
python3 vic_publish_pipeline.py exchange <CODE>

# Step 2: 把 WP 的 4 篇文章按時間順全部推到 vic-iteration
python3 vic_publish_pipeline.py publish

實測結果

文章 WP 狀態 Blogger 狀態
Bluetooth Speaker 在 ✅ https://vic-iteration.blogspot.com/2026/09/bluetooth-speaker.html
ESP32CAM + 麥克納姆輪小车 在 ✅ https://vic-iteration.blogspot.com/2026/09/esp32cam-car.html
ASUS Ascent GX10 AI Agent 開發工具 在 ✅ https://vic-iteration.blogspot.com/2026/09/asus-ascent-gx10-ai-agent.html
在私人網路上把 WordPress 架給全世界看 在 ✅ https://vic-iteration.blogspot.com/2026/09/wordpress-vic.html

技術細節:踩了三個坑

坑一:Blogger 全域端點回 404

GET https://www.googleapis.com/blogger/v3/blogs 在 Vic 專案回 404 HTML 錯誤頁(不是 JSON)。改用 /blogger/v3/users/self → /users/{id}/blogs 拿到正確 blog ID(3082771447171742964)就正常。

坑二:wp-config.php 的殘留 define() 覆蓋 DB

之前為了 Quick Tunnel 在 wp-config.php 疊了 5 組 define('WP_HOME', ...)。PHP define 會蓋過 DB 的 siteurl/home,所以即使我改了 DB 也 301 跳轉。

解決:sed -i '/^define..\(WP_HOME\|WP_SITEURL\)/d' 清光,讓 DB 成為唯一 source of truth。

坑三:siteurl / home 不能設成 localhost

如果 siteurl 是 http://localhost:8082,別台機器(手機/筆電)一開 /wp-admin 就被 301 到「該機器自己的 localhost」,進不去。

解決:siteurl / home 設成區網 IP(http://192.168.1.25:8082),本機和區網都看得見,且別台機器不會被導走。

日常使用步驟

要做的事 操作
寫新文章 上 http://192.168.1.25:8082/wp-login.php 後台撰寫
存草稿 WP 內建(不會被 Blogger 同步)
發布到 Vic 分類站 跟我說「轉發到 vic」→ API 一鍵推
發布到 主站 同上,改 blog_id 即可
遠端(尾網外)管 WP 啟 Tailscale 或臨時 docker compose up -d quicktunnel

結論

這個分工的好處:
1. 本機零壓力 — WordPress 只跑一個 Docker,不需要公開、不需要 DDNS、不需要改 NS。
2. 公開面穩定 — Blogger 是 Google 基礎設施,給外網看比 trycloudflare 穩定 100 倍。
3. 多博客分流 — 用不同 blog_id 把內容分到不同 Blogger 部落格,不混雜。
4. 隨時可回滾 — WordPress 是 source of truth,刪了 Blogger 的重新推一次就好。

缺點是每個 Blogger 都要自己申請 client_id + token,但一次性的工作,之後 refresh_token 可以長期用。


這篇文章是實測結果,不是理論推導。想復現的可以把 vic_publish_pipeline.py 拿去改。

Bluetooth Speaker

Purpose:
利用現有BT audio receiver board來製作一台藍芽音箱, 從中學習到一些電子模組的焊接組合, Fusion360的3D繪製倒出圖檔到雷射切割機去做箱體的切割.

 

INTRODUCTION
1. Bluetooth 5.0 Audio Receiver Board – Controllable Volume
This is a small size and cost-effective Bluetooth 5.0 Audio Receiver module with the auto-reconnect feature. It supports a wide-range power supply of 3.7V~24V and comes with a function button. Dial the button to the left and right to adjust volume, and press it to pause or play. You can use this module to remake your loudspeaker into wireless.

 

2. Mini Boost DC DC Step Up 1.5A Tegangan Fix Output Pilihan 5V 8V 9V 12V
Basic parameters
The output voltage can be set to 5V/8V/9V/12V, the default is 12V
Input voltage range: 2.5V- 5V
Output performance: Take 3.7V lithium battery input
3. Power Amp MINI SFT-9718 Stereo 60 Watt RMS. DC 12 V. – 15 V.

4. 喇吧與箱體

 

 

 

Circuit:

 

ESP32CAM + 麥克納姆倫 + Car

Source: reposted from: 共同管理的Blog軟硬體的天空(original 2024-06-30).

Purpose:
這個專題結合了ESP32CAM影像Web傳輸及Web http Control Mecanum wheel Car to move.

 

 

Fundamental&BOM:
Mecanum wheel and TT motor
Reference https://en.wikipedia.org/wiki/Mecanum_wheel
方向控制:

 

L298N

 

Mega2560

Circuit:

 

 

 

 

 

 

Reference

ESP32-CAM Remote Controlled Car Robot Web Server

All source code put on:

YouTubeDemo:

 

ASUS Ascent GX10 AI agent 開發工具設定與安裝

入手一台ASUS Ascent GX10非常期待能夠做一些有用的專案, 在此之前先來把一些要用到的工具確認跟安裝好.

1. SSH 連線

可以不用連接螢幕用NB或是手機連進去GX10主機.
在GX10主機安裝好後, 就可以直接使用.
2. FTP 資料檔案傳輸
方便傳輸需要的檔案更新.
在GX10主機安裝好後, 就可以直接使用. 設定SFTP格式.
 
 
 
 
 
 
 
 
 
3. 遠端桌面連接
可直接進入主機的GUI畫面操作
 
4. TailScale 內外網路穿透工具
可在不同網路存取控制GX10主機
安裝後設定開機自動啟用Tailscale服務

sudo systemctl enable –now tailscaled

 
5. Openclaw
下載並安裝 Openclaw:

curl -fsSL https://openclaw.ai/install.sh | bash

 
6. Ollama
下載並安裝 Ollama:
curl -fsSL https://ollama.com/install.sh | sh
 
 
 
 
 
 
 
 


7. Docker
在GX10主機安裝好後, 就可以直接使用.
 
 
 

在 私人網路上把 WordPress 架給全世界看: Vic 的疊代筆記上線記

這一篇記錄在我這台 ASUS Ascent GX10 電腦上,把一個 WordPress 部落格從零架起來、並在「沒有路由器管理權」的限制下讓外網成功訪問的完整過程。有成功、有踩坑,失敗的部分恰恰是最有學習價值的。

一、環境與限制(先講難的)

項目 現況
主機 Ubuntu 24.04 ARM64,20 核 / 121GB RAM / NVIDIA GB10
對外網路 LTE AP,沒有管理權,改不了 port forward
對外 IP 223.143.242.85(動態,隨時可能換)
既有域名 duckdns.org(NS 在註冊商 giantpanda)+ Duck DNS 子域

核心限制只有兩句:① 入站 port forward 做不到;② 域名註冊商不給 NS 編輯權。這兩個限制直接決定後面的路線。

二、第一階:Docker Compose 把 WordPress 跑起來

三個容器一把梭:

services:
  db:        # MySQL 8
    image: mysql:8.0
  wordpress: # 網站本體
    image: wordpress:latest
    ports: ['8082:80']
  tunnel:    # Cloudflare 正式 tunnel(之後留作後備)
    image: cloudflare/cloudflared:latest
  quicktunnel: # Cloudflare Quick Tunnel(真正對外的通道)
    image: cloudflare/cloudflared:latest
    restart: always
    command: tunnel --no-autoupdate --url http://wordpress:80

WordPress 對外監聽 8082,本機 200 OK。這階沒有坑。

三、第二階:外網訪問的三段試錯(重點)

路徑 1:Duck DNS + 路由器 port forward

最經典的方案。Duck DNS 手動改成正確外網 IP,全球 DNS 都生效,外部打 80 埠回傳 522 —— 流量有到路由器,就是沒人把它轉發。

卡點在最後一步:LTE AP ,沒有管理權。此路正式封死。

路徑 2:Cloudflare Tunnel + 自有域名

「正統解」路線,我做到了 80%:

  • ✅ Tunnel 建立完成(token 模式、Healthy、自動重連)
  • ✅ Public hostname 路由:winson-blog.duckdns.org → http://wordpress:80
  • ✅ CNAME 指向 *.cfargotunnel.com,橘雲 Proxied 也開
  • ❌ NS 委派改不了:duckdns.org 的 NS 在 giantpanda,後台只有 A/CNAME 紀錄區,沒有「修改 NS」按鈕。Cloudflare 分配的 jewel / tim 兩個 NS 沒有人能寫進去

結論:註冊商不給 NS 編輯權 = Cloudflare 永遠停在 pending。卡了半天的最後 10%。

路徑 3:Cloudflare Quick Tunnel(採用 ⭐)

Quick Tunnel(trycloudflare.com)不需要任何 DNS、不需要改 NS、不需要路由器權限 —— 關鍵在於流量是家裡機器主動出站,LTE AP 完全不擋(它只擋入站)。一列命令:

command: tunnel --no-autoupdate --url http://wordpress:80

20 秒後拿到全球可解析的 HTTPS 網址。唯一代價:重啟容器隨機子域會換。寫了個 quicktunnel-url.sh,重開機跑一次就拿回新網址。

四、第三階:收尾(logo、主題、色調)

  • Logo:畫三個方向 —— A「疊層 V 字」(V = Vic + 版本堆疊)、B「收斂螺旋」、C「v1→v3 階梯」,選了 A
  • Favicon + 文章頭部:產出 16/24/32/48/180/192 全套,用 WP-CLI 導入媒體庫、設為 site_icon 和 custom_logo
  • 主題:Kadencia 不在 WP 官方庫(商業主題),改裝 GeneratePress 3.6.1 —— 極速、輕量、免費就夠
  • 色調:全套改成跟 logo 一致的 indigo 系 —— 連結 #4338CA、標題 #1E1B4B、code block 淺藍底,程式碼閱讀友善

五、現在能做到的

  • WordPress 本機 8082 常駐,Quick Tunnel 對全世界提供 HTTPS
  • 重開機 / 容器重啟:tunnel 自動重連,跑一次 quicktunnel-url.sh 拿回新網址
  • 外網 IP 換了?無所謂(出站流量,網址跟你家 IP 無綁定關係)

六、下一步(坦白講)

  1. 固定網址:Quick Tunnel 的隨機子域每次重啟都換。正解是找一個「改得到 NS 的域名」—— 花 $10 年在 Porkbun / Namecheap / Cloudflare Registrar 任買一個,接上現有的 tunnel token,網址就永久固定。這是最該做的下一步
  2. SMTP + 備份策略(目前 wp 只在 volume,還沒備份機制)

一句話總結:限制不會讓你做不成,只是在逼你選對工具。沒有 router 權限,就用出站 tunnel 替代入站轉發;沒有 NS 委派權,就用不需要 NS 的 tunnel。這篇部落格本身,就是那段試錯的產物。