未知 的大頭貼

OpenWRT multi PPPoE, VLAN, banip, 多內網策略路由

banip

可以依照規則阻擋大量 IP,這個過濾會先於 port forwarding 發生,所以可以一併過濾 port forward 出來的內部伺服器的。設定上可以選擇 inbound / outbound ,互不影響,inbound 即使阻擋了,內部有連線要 outbound 往這些目標 IP 仍不受影響。

banip 目前不支援 OpenWRT 23 。

我的設定:

  • 阻擋部分高風險國家 IP
  • 阻擋高風險 ASN 的 IP,例如 AWS, DigitalOcean 等雲端主機商,很多掃 port 的行為
  • 阻擋 censys, shodan 等掃描程式的 ASN

設定邏輯是這樣:

  1. 啟動 banip 模組
  2. 去 Services > banIP > Overview 下方的 Feed/Set settings,選擇要啟動的 feed(country, asn)
    • inbound /outbound 分別是不同方向的過濾
  3. 然後去 Feed selection 選擇每一個 feed 裡面的設定,country feed 就是選國家,asn feed 就是選 asn
    • Feed selection > external blocklist feeds 裡面記得也要勾選 country, asn,也可額外勾選 drop (spamhaus), etcompromised 等

第一次啟動記得看一下 log,可能啟動會失敗。我第一次啟動就遇到 banip 抱怨 service autostart is disabled ,一開始沒發現 debug 了很久,還以為 banip 不支援 openwrt 24。

參考:

第二 WAN / 多個上游網路 / multi WAN

我的需求是這樣:

  • 僅使用一個 WAN 實體接孔連接數據機(數據機已經設為 bridge mode,因此 PPPoE 由 openwrt 撥號)
  • 使用同一個 WAN 接孔進行多個 PPPoE 撥號線程,建立多個 PPP tunnel device,拿到多個 public IP
  • 在內網依據不同 VLAN 來使用不同 public IP,將不信任的內網裝置由不同公網出口,避免 IP 位址追蹤

我的需求不包含

因此這個設定分為三個部分:

  1. 多 WAN 的鏈路要能夠並行接通,次要鏈路不能影響主要
  2. 次要內網要能夠拿到 DHCP IP 分配,且與主要內網隔離,這個我記錄在下一段落 “VLAN"
  3. 設定每個內網對應的 WAN 鏈路

這節先處理第一部分。以下設定可以自己調整的名稱和數字我會用底線表示。

要達到多個 PPPoE 線程,則需要在 WAN 孔設定虛擬界面,供第一個以外的 PPPoE 線程綁定:

  1. Network > Interfaces > Devices
  2. Add device configuration
  3. Device type = MAC VLAN
  4. Base device = wan 選擇要在哪一個實體界面上建立虛擬界面
  5. Mode = VEPA
  6. 預設的虛擬界面名稱會是 wanmac0

設定好裝置後開始設定第二個 PPPoE:

  1. Network > Interfaces > Interfaces
  2. Add new interface
  3. Name = wanb 名字可以自己調整,我是打算照 b c d e f 這樣編號
  4. Protocol = PPPoE
  5. Device = wanmac0
  6. 輸入 PAP/CHAP 使用者和密碼
  7. Advanced settings > Override IPv4 routing table = 10 這一步特別重要,這邊要手動設定一個自訂的路由表。Linux 系統內可以設置多張路由表,再藉由 ip rule 去設定哪一些封包要參照哪一張路由表。如果這邊不設定一張自訂的路由表,從這個 PPPoE 取得的 default route 就會直接新增到主路由表內,覆蓋掉原本主要 PPPoE 連線設定好的 default route,這樣會導致出口封包全部導至第二個 PPPoE 連線。如果設定一個自訂的路由表編號(除了 /etc/iproute2/rt_tables 裡面列出的預設路由表之外的編號都可以使用,數字上限多少我忘了),那這個 PPPoE 連線設定的 default route 就會跑去路由表 10,不會影響主路由表。
    另外一個相關但這邊用不到的設定是 Use gateway metric,metric 是一張路由表內的優先值,如果一張路由表內有抵達同一個目標 IP 段的多筆路由,則 metric 數字最小的那一筆會先套用。所以比如說如果要設定 PBR 的話就可以把主 PPPoE 設定 metric = 10 ,第二 PPPoE 設定 metric = 20。
  8. 續上, Override IPv6 routing table 同理設為 10
  9. Firewall Settings 這邊要指定這個 PPPoE 界面到一個 firewall zone,這邊我們還沒加入新的 zone 因此先留空。不過如果設為現有的 wan zone 應該也沒問題(不確定),如果兩個 wan 連線有不同的 zone 就可以設定不一樣的規則。

設定套用之後應該就可以看到 wanb 界面透過 PPPoE 取得 public IPv4 位址,但現在還沒有任何流量會使用因為我們還沒有把內網流量導入路由表10

設定對應的 wanB firewall zone

直接貼設定檔,懶得打網頁設定位置了:

config zone                   
        option name 'wanB'  
        option input 'REJECT'
        option output 'ACCEPT'  
        option forward 'REJECT'       
        option masq '1'    
        list network 'wanb' 
  • 要開 masquerading,才會啟動 NAT
  • Allow forward from source zones 等一下再加入 lanB zone

有一件事情不確定的是,這邊能不能把 wanb 界面直接指定給現有的 wan firewall zone,因為雖然都是要開 masquerading 但是 masquerade 的公網 IP 不一樣,之後實驗看看就知道了。

這邊新建了 wanB firewall zone,要複製一些 wan zone 的規則過去 wanB:

  1. Allow-MLD: 沒有設定的話 wanb 界面會無法拿到 public IPv6 位址
  2. 後面兩個我想應該也是需要就直接複製過去沒有另外實驗
config rule                   
        option name 'Allow-MLD'   
        option src 'wanB'      
        option proto 'icmp'    
        option family 'ipv6'   
        option target 'ACCEPT'    
        list src_ip 'fe80::/10'

config rule                     
        option name 'Allow-DHCP-Renew'
        option src 'wanB'       
        option proto 'udp'      
        option dest_port '68'     
        option target 'ACCEPT'        
        option family 'ipv4'      

config rule                   
        option name 'Allow-DHCPv6'
        option src 'wanB'      
        option proto 'udp'     
        option dest_port '546' 
        option family 'ipv6'      
        option target 'ACCEPT' 

設定 VLAN

設定重點邏輯如下:

  1. 開啟 br-lan 的 VLAN filtering,調整對應接孔的 tag / untag 需求
  2. 將主要 LAN 從綁定 br-lan 改為綁定 br-lan.1
  3. 新增及設定次要 VLAN
  4. 設定路由表及防火牆
  5. 設定 IPv6 , DNS

我一開始困惑了很久,如果我要主要 VLAN 維持 untagged(如此既有的客戶端設備就不需要任何設定調整,也比較不會出問題),那我到底該綁定 br-lan 還是要新增一個 VLAN ID 然後綁定到新的 ID 設成 untagged。網路上兩種資料似乎都有。結論是後者才是正確的。

另一困惑是,我原本想要把 interface 的網段設定為 10.0.10.0/24 ,卻發現這樣設定的時候 DHCP server 無法正常運作 (dhcp-range 選項問題),但 IPv6 SLAAC 有通,表示連接是正常的。似乎是因為 openwrt 從設定檔產生 dnsmasq 設定檔的產生器有些 bug,跟這個問題類似但是不一樣。我 debug 了很久想說直接設常見的 192.168.10.0/24 試試看,結果就成功了。我猜是 dnsmasq 設定檔產生的 script 對 IPv4 private range 有些過於簡單的假定。雖然理論上 10.0.10.0/24 也要可以運作(CIDR 都多久了),但實際上顯然支援還是不足。

設定 br-lan VLAN filtering

  1. Network > Interfaces > Devices
  2. br-lan 旁邊按下 Configure
  3. Bridge VLAN filtering > Enable VLAN filtering 打勾
  4. 新增 VLAN ID 1 untagged + primary 的接孔
  5. 新增次要 VLAN ID 10 tagged

轉移主 LAN 到 br-lan.1

  1. Network > Interfaces > Add device configuration
  2. 對話框選擇 Device type = VLAN 802.1q, VLAN ID =1, 儲存
  3. Network > Interfaces > Interfaces
  4. lan 旁邊按下 Edit
  5. Device 改選 br-lan.1

Wifi 通常沒有 VLAN,所以是直接綁定 lan interface,應該不需要修改任何設定,重新開機之後就可以正常運作。

新增 br-lan.10 裝置

  1. Network > Interfaces > Add device configuration
  2. 對話框選擇 Device type = VLAN 802.1q, VLAN ID = 10, 儲存

新增 lanB 界面

  1. Network > Interfaces > Interfaces
  2. Add new interface
  3. Name = lanB
  4. Protocol = static address
  5. Device = br-lan.10
  6. Create interface
  7. 新對話框
  8. IPv4 address = 192.168.10.1 , netmask = 255.255.255.0
  9. DHCP Server > Set up DHCP server

新增 lanB firewall zone

  1. Input, Output, Intra zone forward 全允許
  2. Covered networks 選 lanB 界面
  3. Allow forward to destination zones: wanB

設定自訂路由表規則 (ip rule)

接下來設定路由表套用規則,這部分可以說是整個設定裡面最關鍵的部分。上面我們將 wanB 指派給了路由表 10,不影響主路由表,在這邊,我們要設定路由表規則,將來自 lanB 網段 192.168.10.0/24 的封包都也指派給路由表 10,如此一來才會將流量轉送到 wanB 的閘道。

  1. Network > Routing > IPv4 Rules > Add
  2. Source = 192.168.10.0/24
  3. Advanced Settings -> Table = 10
  4. Save

這邊稍微注意,在有些類型的 WAN 連線中,上游可能不會派發 default route, 例如如果 WAN 是 Wireguard 界面就是這樣。這個時候還額外需要到 Static IPv4 Routes 裡面:

  1. Add
  2. Interface = WIREGUARD1
  3. Target = 0.0.0.0/0
  4. Advanced Settings > Table = 101

這邊 IPv6 相關設定也是同樣道理,但一個 lanB 內會有很多不同網段的 IPv6 (有本地的浮動 IP、全域、ULA 等等),這邊路由表要怎麼設定我還沒研究。

設定 IPv6 分配

相對於 IPv4 內外網轉換需要經過 NAT 設定,IPv6 需要設定 prefix delegation。我們現在有多個上游 IPv6 網段,要如何分配給多個內網就會是一個問題。

首先指定原本主 lan 的 prefix delegation:

  1. Network > Interfaces > Interfaces > lan > Edit
  2. Advanced Settings > IPv6 prefix filter = wan_6 , local (Local ULA)

再設定 lanB:

  1. lanB > Edit
  2. Advanced Settings > IPv6 prefix filter = wanb_6

lanB 我沒有設定 ULA,因為覺得不需要,但理論上也是可以設定另一段 ULA,參考 Multiple ULA ranges? – Software / SW help – Turris forum

設定 lanB DNS 伺服器分發

若沒有本地自訂的 DNS server 可以跳過。

這邊我額外設定了 lanB 的 DHCP server 派發我的 pi-hole 為 DNS server,直接填 pi-hole 在 lan 的 IPv4 位址看起來是可以運作的。

總結

  • 主 lan 維持原本行為,封包從主 wan 出口
  • 新增 lanB, 可以在 VLAN 10 內發 DHCP request, 會拿到 192.168.10.0/24 的 IP
  • lanB 封包會從 wanB 出口

參考

未知 的大頭貼

挑選新的 Wifi AP:三頻 Wifi 不等於有 6GHz

最近考慮把家中 AP 換成 Linksys MX4200,有 OpenWRT 支援。目前使用的另一臺 AP 僅支援 Freshtomato,而 Freshtomato 看來不支援 PPPoE 多撥。

仔細看規格的時候,看到一個奇怪的地方:

Wi-Fi SpeedAX4200 (600+1200+2400)

為什麼會是三個速度組合起來?這台 AP 並不支援 Wifi 6E (6GHz) 呀?

底下還寫了:

Wi-Fi TechnologyAX4200 Tri-Band Gigabit, 600+1200+2400 Mbps

三頻?沒有 6GHz 哪來的三頻?

Wikidevi 是這樣寫的:

574 Mbps – 2SS 2.4GHz 802.11ax (40MHz chan.)
1201 Mbps – 2SS 5GHz 802.11ax (80MHz chan.)
2402 Mbps – 4SS 5GHz 802.11ax (80MHz chan.) = AX4200 class

越看越奇怪,它的意思似乎是 5GHz 有兩個頻帶可以同時使用。

相較之下,另一台 OpenWRT 支援不錯的 Linksys E8450 的 Wikidevi 是這樣寫的:

800 Mbps – 4SS 2.4GHz 802.11n (40MHz chan., 256-QAM)
2402 Mbps – 4SS 5GHz 802.11ax (80MHz chan., 1024-QAM) = AX3200 class

查資料查了很久,後來找到這篇(其實整篇都寫得很讚,有很多重要觀念而且還算好讀):

Beware all of the marketing hype surrounding tri-band routers. Tri-band routers were created by the router industry so that marketing could (yet again) claim even higher Wi-Fi Gbps speeds for new routers (a single connected client can never achieve these high speeds).

A router is many devices in one: Remember, a wireless router is: (1) a router, (2) a switch, and (3) an AP — all in one box. The AP is almost always dual-band (2.4GHz + 5 GHz). But the latest marketing hype concerns the speeds of tri-band routers — where the AP inside the router is 2.4GHz + 5 GHz + 5 GHz.

But ‘dual 5 GHz’ is only useful if you are maxing out your current 5 GHz band, and need to support more (5 GHz only) devices. But are you? This is important to realize, It DOES NOT make one device faster. Rather, it allows 5 GHz devices connected to different 5 GHz bands to operate at the same time (two devices connected to the same band will have the same problem).

所以這意思是說:這個 AP 可以同時在兩個不同的 5GHz 頻道收發,若以單一頻道 80 MHz 寬來說,5 GHz 頻帶有 7 個互相不重疊的 80 MHz 頻道。所以 MX4200 應該就是可以同時在這 7 個(美國用戶可以用7個)裡面的 2 個收發資料。(下面的圖只有畫 6 個,第七個編號 171 的頻道沒有畫,不過 171 是 2019 FCC 才開放的所以可能支援的裝置也不多。)

Image

需要注意的是,5GHz 頻段裡面有許多部分有 DFS 限制,簡單來說就是為了避免干擾天氣雷達等其他應用,標準有規定在 DFS 限制的頻段裡面,裝置必須要偵測是否收的到天氣雷達之類的訊號,如果偵測到的話,就要降低發射功率。interline.pl 上面那篇裡面一樣有介紹如何檢查 wifi 裝置是否支援 DFS 頻段:去 FCC 網站上查該裝置是否有核可在 5250 MHz – 5725 MHz 發射,若有就表示有支援 DFS。然後許多不肖業者會說自己的 wifi 裝置支援 5 GHz 頻段,但是其實不支援 DFS,若不支援 DFS,那從上面的圖可以看到,就只有 U-NII-1 和 U-NII-3 兩個 5GHz 頻帶可以使用,也就是七個頻道裡面只有兩個可以用,與鄰居裝置的頻道衝突的可能性大增。

Qualcomm vs MediaTek

OpenWRT 對 Qualcomm 新晶片的支援似乎沒那麼完整,有許多限制

  • Ath11k 驅動程式非常吃記憶體,我看論壇上面很多人都提到必須要開 SWAP 才能正常使用
  • 會那麼吃記憶體的原因是 qualcomm 的 NSS 網路處理晶片不支援 openwrt,所以變成所有封包都要由核心的驅動程式在主處理器和記憶體處理
  • 社群分支的版本實驗性支援 NSS,就比較省記憶體
  • 不支援 DSA (Distributed Switch Architecture),會讓 VLAN 等進階設定比較麻煩一些,但不確定功能上會不會有什麼只有 DSA 能做到的(我查不到資料)

相較之下 MTK 的 wifi 晶片 Linux 支援就好很多,雖然我目前用 E8450 還是偶爾會有一些 wifi 裝置偶爾會秀逗,但算是小問題:

  • 舊 ipad 開機之後要過大約 5 分鐘才能連上 E8450 的 wifi
  • 5 GHz 的 radio 偶爾會突然掛掉,整個 station 直接消失,但重開之後就好了

我擔心買了 qualcomm 晶片的產品,小問題恐怕會比 mtk 更多。

相關資料

查詢 MCS PHY 速率可以參考這幾個網站:

查資料的時候另外有查到 Qualcomm 的規格上面這樣寫

5G-PPS (Per Packet Switching): 
8×8/80 MHz or 4×4/160 MHz  contiguous

5G-SBS (Single Band Simultaneous): 
4×4/80MHz and 4×4/80MHz

不知道這個 PPS 和 SBS 是不是就是上面我查到的可以同時在兩個不同頻道收發的區別?只有這個網站有提到 PPS SBS 這兩個詞,我也查不到更多資料無法確認。

未知 的大頭貼

Ubuntu 24.10 升級 25.04 zfs 踩 bug 記

這次 Ubuntu 24.10 升級 25.04 踩到大雷,但應該只有 zfs 用戶會受到影響,我 debug 了很久,以為踩到 zfs 的 bug (我想說怎麼可能,用 zfs 十五年我從沒踩過 bug)。

具體症狀是跑升級流程的時候只要跑到 update-grub 整個系統就會 hang 住。我試著重開機好幾次,重跑升級流程好幾次都還是一樣結果。(倒是幸好 apt / dpkg 很可靠,升級到一半要是當機回來可以繼續做到一半的步驟。)

去編輯了 /usr/sbin/grub-mkconfig 腳本加上 set -x 使其在執行指令前印出指令,以找出造成卡住的指令,發現 grub-mkconfig 的 hook 腳本 /etc/grub.d/10_linux_zfs 卡住,也把它加上 set -x ,發現是 ls .zfs/snapshot 這個指令卡住。

之前這台電腦 zfs 上特定 snapshot 有資料損毀,所以會卡住系統,我就去一一檢視系統上面的 snapshot,把會造成卡住的 snapshot 刪除通常就沒有問題了,奇怪的是我幾乎把每個 snapshot 刪掉了還是會遇到同樣卡住的問題,而且 zfs scrub 也回傳沒有資料損毀。

這下看來是暫時無解,只能先繞過這個問題先讓 apt 升級流程跑完,我先 chmod -x 10_linux_zfs 不執行這個 hook,然後再跑 update-grub 確定沒問題,再跑 apt upgrade 也成功了。

這時也沒有想太多就直接重開機,結果開機被丟進 memtest ,表示 grub 不知道為什麼無法啟動正常作業系統只能執行下一個 boot menu 項目。我花了一陣子研究怎麼進 grub recovery shell ,因為這台電腦的 UEFI 選單是 Esc 鍵進入,grub 也是,所以我一直抓不到正確的時機按按鈕,我也試了網路上說的 Shift 鍵沒效。後來發現是要在 UEFI 顯示的訊息 “Press Esc to enter setup menu" 消失之後馬上按 Esc 就會被 grub 吃到,終於可以進入 grub recovery shell。

看了一下目前的 boot menu,所有 linux 的項目都被不見了,大概是因為我跳過了 10_linux_zfs 的腳本,那個腳本可能是去搜尋 zfs snapshot 加進 boot menu 之類的。因此接下來就要想辦法手動輸入 grub 指令來開機回到原本的系統,基本的還算簡單,最重要的是 linux 指令後面要加 root=ZFS=... 。但麻煩就在於這臺電腦使用 Ubuntu 自己設計的加密 ZFS 架構:zfs 的加密金鑰是放在加密的 LUKS 分割區內,然後我不知道解密此 LUKS 分割區是不是由 grub 負責(事後看來不是),如果是的話就要加一些 grub 選項。找了很久找不到這些選項(事後看來確實是不存在)。

差不多是這時候我以外發現這個 bug report,和我遇到的問題一模一樣,裡面建議的 workaround 也是暫時跳過 10_linux_zfs 腳本。不過因為我是加密 ZFS 要重新建立 grub 選單會麻煩許多。

找不到我以為存在的 grub zfs 加密選項,我決定直接燒一顆 live USB 進去救援。這是很方便地找到了這個教學說明了在救援環境內怎麼掛載 Ubuntu 加密的 ZFS。在 chroot 內把 10_linux_zfs 腳本加回來,再次執行 apt upgrade,總算升級完成。重開機之後 grub boot menu 也回來了,可以正常開機。

解決了這次危機。

未知 的大頭貼

刷 FreshTomato, 考慮買新的 Wifi AP, 學習 MCS

最近 Asus Merlin 韌體停止支援我家 ASUS RT-66U_B1 了,因此決定改刷成 FreshTomato。

Merlin 韌體似乎會對上傳的韌體檔案做一些檢查,我如果直接上傳 Freshtomato 的 .trx 檔案會出現錯誤訊息說韌體錯誤。

因此再來我改用 TFTP 模式嘗試刷進去,但似乎也失敗了,我看它一直循環重開機。

幸好這款是用 Broadcom 的 SOC,有內建 CFE webserver,基本上就是回復模式,使用有線網路設定一個固定 IP 192.168.1.x 就可以連上 192.168.1.1 的 CFE webserver。

使用 CFE webserver 上傳 freshtomato 的 trx 之後就成功刷入了。

刷完之後馬上來測速,發現 WAN 端被限制在 330 Mbps 左右,發現是 Cut-through forwarding 沒開,開了就可以吃到 ISP 的 500Mbps。

刷完雖然也是可以用,但換換病有點發作,忍不住好奇現在最新的 802.11ax AP 速度可以到多快。目前這台速度只到 802.11ac 的 AC1750。

802.11ac Wifi 5 AC1750

讀完維基百科,瞭解到 AC1750 是 2.4GHz 450Mbps 加上 5GHz 1300 Mbps。而且沒有任何一個單一裝置可以吃到全部 1750Mbps 的頻寬,是所有裝置同時連線的吞吐量可以達到 1750Mbps。

然後 5GHz 1300 Mbps 是由 3 streams @ MCS 9 組成。MCS 是 Modulation and Coding Scheme,每個不同的 MCS 對應到不同的 modulation type (xxx-QAM) 和 coding rate 也就是 有用資料率 ÷ (有用資料率+錯誤糾正碼率)。這順便複習了我以前學過的網路通訊原理。

3 streams @ MCS 9 意思就是最多可以有 3 個並行的 MCS 9 通道(不確定 ac 下同一個 client 是否可以使用超過一個 stream,但 ax 可以),MCS 9 的編碼組合在 80MHz 的頻寬下(暫時不研究 GI)可以跑到 433 Mbps 的理論速率。

使用筆電的 Intel AX210 Wifi 6 網卡(應該支援所有較慢的 Wifi 5 802.11ac 速率),iperf3 測出 270 Mbps 的實際速度(距離天線 1 公尺,沒有遮蔽物)。這樣看起來似乎是只有一個 stream。

802.11ax Wifi 6

測了另一臺友人的 Wifi 6 AP, 據 iw dev wlan0 station dump 的資料:

rx bitrate: 1080.6 MBit/s 80MHz HE-MCS 10 HE-NSS 2 HE-GI 0 HE-DCM 0

距離天線約 5 公尺,有一道牆加一道木門。這邊顯示使用的是 MCS 10,NSS 是2,這應該是有 2 個 spatial stream 的意思。

實測 iperf3 是 450 Mbps。

然後 Wifi 6 是可以結合 2.4 GHz 和 5 GHz 的 stream 的(wifi 5 不行),但此 AP 是分開不同的 SSID 所以這功能沒有啟動。

結論

好像沒有比想像中快很多,我以為可以快個 2~3 倍吧(雖然說測試環境障礙也不一樣啦)。換換病症狀暫時好了一些。不過在拍賣網站看到一台二手支援 OpenWRT 的 Linksys AP 好便宜啊啊啊。

其他筆記

  • OpenWRT 目前還沒有正式支援 Qualcomm 的 NSS 加速功能,所以速度可能比不上原廠韌體
未知 的大頭貼

耗費半年修好了 Razor Ornata 鍵盤,下次不買雷蛇了

一年前,大約 2020 年購入的 Razor Ornata v2 鍵盤的部分按鍵變得無法感應,但覺得不想製造那麼多垃圾,於是決定嘗試自行維修。

這鍵盤平常是接在遊戲用桌機上面,平均每個禮拜的使用時數不超過 6 小時,沒想到才不到五年就壞掉了,可見這品質有多爛。至於當時為什麼會買?因為平常主力工作機是 Thinkpad,打習慣筆電的淺鍵盤了,覺得普通的桌機鍵盤太深沒有那麼順手,但普通巧克力鍵盤的觸感和回饋又太差,最後才找到 Ornata 這款短鍵程、觸感和回饋均佳的鍵盤。這款是薄膜鍵盤,但是按鍵的支撐是使用特別的立體橡膠膜,可以製造出類似機械式鍵盤的手感。

導電漆

差點買了 Bare Conductive,但仔細研究發現他官網有寫,Bare Conductive 的阻抗仍然高於銀漆(懶得找來源,但可能是這頁),畢竟他還是石墨為基礎的,不是金屬,但相較於金屬漆,有其他優勢。

然後嘗試了電子材料行買的銀漆,但他的銀漆是裝在針筒裡面,要很用力才能擠出來,讓我根本沒辦法在鍵盤薄膜上面精細畫線,因為沒辦法在用力壓針筒的時候瞄準,很容易就會碰到其他不該碰的線路。

最後去今華電子買了導電銀漆筆:

Image

使用電錶尋找斷點

我自己想出幾個比較快速的方法。

Image

因為導線比較細,所以每次要將測針對準、按在導線上其實比較慢。我想出這個方法:

  1. 左手測針按 [1],右手測針按 [2]
  2. 左手測針移至 [3],右手測針不動,聽電錶是否嗶嗶叫指示通路
  3. 左手不動,右手測針移至 [4],聽電錶

如此一來就可以快速判斷斷點位置。

然後,如果有一排導線平行,要用眼睛跟著導線再用手拿探針瞄準導線也需要花上比較多時間。但其實可以:

  1. 左手測針按 [2],右手測針照黃色路徑劃過,聽是否嗶嗶叫指示通路

這樣就省去瞄準的時間。

斷點?原來只是三用電錶通路標準不一樣

用這個方法一開始發現了很多斷點,我就興高采烈地把斷點補起來,其中有許多段的導線和其他導線距離太近 (1mm) ,銀漆筆又比較粗(2mm),所以我就用紙膠帶當 masking tape 才避免畫到臨近的導線。

折騰了一番,似乎把大部分線都補好了,但我意識到事情不太對勁,用電錶的時候,有些導線雖然沒有發出嗶聲指示通路,但他的電阻值顯示的是 50~150 ohm (我不確定電錶的單位是什麼但應該是歐姆),和真正完全的斷路顯示的 -- 不太一樣。

所以我猜測,其實 150 ohm 對鍵盤來說也是通路(我缺乏電學常識)?稍早白費心力了。

是 FPC 接頭的問題

原本以為的斷點其實原來都是通路,這下要重新尋找斷點。

四處測了半天,都是通的,才想到測試 PCB 板上面的針腳——發現有些斷路!

但 PCB 上面的針腳都是固態金屬線,不太可能斷吧?

仔細研究了電路薄膜,意識到我其實沒有測過薄膜插入 FPC 接頭的凸出部位接點,一測果然發現斷路在此!

用銀漆補畫了幾條導線(使用紙膠帶當 masking tape),最後測試確認修好了!!

又壞了

用了一陣子之後,有些按鍵開始黏在一起,Q+A , W+S 等上下相鄰排的按鍵會被同時觸發。

型號這個修補算是簡單:仔細檢查了之前在薄膜 FPC 接點上面畫的線,有其中兩條因為畫的銀漆太厚,擠壓後扁掉,接在一起了。用尖銳的鑷子把中間的銀漆劃開,就完成了維修。

結論:下次還是不要買雷蛇

目前找了很久還沒找到心目中下一隻想要的鍵盤,因為我想要一個特殊的排列,覺得很奇怪為什麼沒有廠商做:

  • 不要 numpad,太少用
  • 要有獨立 function key 和 media key,因為很多程式開發工具需要按 function key,獨立的話就不需要記一堆組合鍵,可能是開始用電腦的年代就習慣用 function key 了,現在 function key 幾乎都要用 Fn 組合出來,實在很不習慣(我知道有 Fn lock 這功能,但開了 Fn lock 我就不能一鍵調音量和亮度和下一首啦)
    • 到現在我還是覺得有些按鍵感覺不太自然:
      • 重新整理是 Ctrl+R 而不是 F5
      • 關閉視窗是 Alt+F4 最自然, 沒有 F4 的快捷鍵我根本記不得
      • 全螢幕是 F11,沒有 F11 的快捷鍵我根本記不得
      • vim paste mode 切換是 Ctrl+H 而不是 F2
  • 要有 ScrollLock PrintScr, Home, End, PageUp, PageDown
  • 要有旋鈕可以調音量或是自定義
  • 獨立媒體鍵超級重要,每一個功能我都覺得重要到不應該要按組合鍵:音量大小、靜音、麥克風、螢幕亮度大小、鍵盤亮度大小、上一首、暫停、下一首

好,現在覺得最適合我的鍵盤其實是 Dell Business Keyboard 哈哈哈哈,但他還是有 numpad 而且只是個不舒服的薄膜鍵盤。

Image

為什麼沒有機械式鍵盤廠商出這種排列啊?

未知 的大頭貼

我的 RSS 大法

記錄一下我的 RSS 全系統,從產生饋流到閱讀器。原則:盡量不花錢。

用爬蟲產生饋流

很多網站沒有提供饋流,所以就要用額外的爬蟲去產生。

這方面最有名的大概屬 RSSHub,不過我其實要反推它,雖然看起來是支援很多網站沒錯,但當中大半無法正常運作,也並沒有很多貢獻者去修復爬蟲,所以很多網站的爬蟲壞了半年一年也都沒有修復。雖然架設起來輕鬆方便但實在沒有它所聲稱的那麼美好。

類似 RSSHub 的還有 rss-bridge,我以前有使用但很多年沒有再使用了,不確定現在的狀況如何,我覺得受限於他的 PHP 架構,要跑一些比較有彈性的爬蟲會很麻煩,比如說如果要做一些背景定期任務,或是要起一個 headless browser 之類的都會很麻煩。

我強烈推薦 rss-proxy,他厲害的地方在於是用一個演算法分析網頁的 HTML 結構,自動抓出文章清單,幾乎適用於任何網站,都可以抓出文章清單、標題,甚至是預覽圖。它也提供一個非常讚的網頁介面可以輕鬆選擇不同演算法產出的文章清單候選,選擇一個候選項,它還會再網頁截圖上標示抓到的文章清單給你看。如此可以輕輕鬆鬆產出饋流,不用自己寫爬蟲。

rss-proxy 是純靜態的爬蟲,作者還有做了另一個進階版的,內嵌瀏覽器的爬蟲,支援 Javascript:feedless

除此之外,還有幾個方案:

  • Fetchrss.com:免費的帳號可以建立最多5個饋流
  • hnapp.com: 可以產生 Hacker News 的饋流,而且可以訂閱特定用戶的留言或是貼文,我發現有時候找到厲害的人,訂閱他們的留言,也可以學到不少

針對 Facebook,我自己寫了一個很髒的基於他們 GraphQL API 的靜態爬蟲,可以爬粉絲專頁和公開的社團。Instagram 則使用 Bibliogram 裡面內建的 RSS 產生器功能,雖然 Bibliogram 上游已停止維護一年以上了,但大部分的功能仍可以正常運作。

繞過反爬蟲 / IP 限流

Facebook 和 Instagram 有非常嚴格的反爬蟲機制,我想應該是有做一些 browser fingerprinting,但到頭來發現,其實還是 IP 聲譽佔最大影響。

最簡單的測試方法就是拿普通瀏覽器掛上不同 IP,看 Facebook 會給你什麼資料,我觀察有兩種可能:

  1. 顯示部分內容,覆蓋一個登入對話框,這個就可以用爬蟲拿到覆蓋底下的資料
  2. 直接重新導向至登入網址,這樣爬蟲什麼資料都拿不到

以前即使是拿雲端主機的 IP 去請求 Facebook 都會拿到結果一,數個請求過後才會拿到結果二。但最近雲端主機的 IP 已經不管用了,會直接回結果二。所以就要真的拿固網 IP 來使用才拿得到內容。

彙整

主要是使用 Inoreader,但我只用比較便宜的方案所以有限制500個饋流數量,而且 Inoreader 的 app 有幾個不足的地方:

  • 介面美觀不如其他閱讀器 app
    • 動畫讓人感覺有點陽春的感覺
    • 整體介面感覺沒有那麼原生
  • 對於只提供摘要的文章來說,沒辦法自動載入全文,一定要打開瀏覽器閱讀
  • 比較貴的方案才有離線功能
  • Inoreader 服務本身沒有動態 OPML 的功能,只能一次性匯入 OPML

倒是我覺得 Inoreader 網頁版就蠻不錯。

當初一開始其實是因為不想要自己架 RSS 相關的軟體,加上 Android 上面並沒有介面美觀功能齊全的 RSS 閱讀器(付費的我也沒找到),才選擇付費使用 Inoreader,不過現在訂閱的數量已經超過 Inoreader 500 的限制,所以今年還是開始自己架起來 FreshRSS。

因為 FreshRSS 網頁版的閱讀器我覺得還不如 Inoreader 美觀,而且萬一 FreshRSS 壞掉,我不太想要花太多時間維護這軟體,所以目前大概是這樣區分:

  1. 主要會閱讀的消息來源、資訊量比較多的消息來源放在 Inoreader
  2. 其他比較不重要,偏娛樂性質或是瞄過即可的消息來源放在 FreshRSS,壞掉的話也就不太影響

閱讀器

Capy reader

開源的 Android RSS 閱讀器,介面基本簡潔,功能也非常基本,但至少有 FreshRSS 同步功能。

在這之前我使用 Read You,也是開源的但沒有同步功能。

NetNewsWire, Reeder Classic

主要是在 iPad 上面使用這兩個,Reeder Classic 本來要錢但我某次拿到限時免費。

這兩個 app 就是我覺得目前 RSS 閱讀程式的頂點了,介面設計美觀、平台同步等各種功能齊全。

最近偏愛 NetNewsWire 更多一點,因為它是開源的。NetNewsWire 有個我最喜歡的功能是一個按鈕就可以載入全文,因為我使用的是很舊的 ipad 所以如果要看全文要打開瀏覽器的話要等很久。不知道這功能是如何實作的但我猜可能是簡單的靜態 HTTP 請求和解析器吧,因為有時候這全文解析出來的和網頁的內容還是有些不同,但大部分狀況下這樣也夠用了。

FreshRSS

比較不重要的饋流我放在 FreshRSS,客戶端使用 Capy Reader 閱讀。

架設起來相當簡單,就是一個簡單的 PHP 網頁程式。

FreshRSS 有個功能我很喜歡:動態 OPML。簡單來說 OPML 就是 RSS 饋流的清單,FreshRSS 可以訂閱一個 OPML 網址,啟用動態 OPML 的話,網址內的 OPML 如果增加了新的饋流,FreshRSS 也會自動訂閱。我的 Facebook RSS 爬蟲會讀一個粉專 ID 的清單,然後產出一系列的 RSS XML 檔案,同時我拿這個 ID 清單拿去產生 OPML,讓 freshrss 去訂閱,這樣若要追蹤新的粉專,只要去清單內增加 ID 就好了。

遺珠

Feedbin

是個付費服務,網頁版看起來不錯,介面美觀功能齊全,不幸的是沒有專屬的 Android app,所以在 Android 上面的閱讀體驗不佳,不過現在有了 Capy Reader 所以應該好很多。

另外 Feedbin 也有開源程式碼(似乎只有部分),但他部件很多,也沒有很好的說明讓你跟著自架,再加上它是 Ruby 寫的,如果出錯或是要改程式碼的話我不熟悉,會很麻煩。之前也嘗試自架過一次,但說明實在太缺乏了問題一堆,我也不會 Ruby。所以最後放棄。

Omnivore

後來才發現的閱讀器,主打功能是有很棒的文字轉語音產生器,是真的蠻厲害,這樣長篇文章就可以用聽的了。不過發現它過沒多久就被併購然後下架了。

Omnivore 被併購後的公司有提供一個 ElevenReader,但它的 Android app 產生語音時一直產生錯誤,無法使用。後來我好奇去拆開它看一下流量發現是有 Play Integrity API,所以有 root 的手機都過不了。它完全沒有提示,很爛。

結語

一個人所吸收的資訊會決定他的想法,因此控制自己所吸收的資訊,而不是被推薦演算法控制,對於培養思考和增廣見聞來說非常重要。這也是為什麼我決定花這麼多時間搞一整套 RSS 的資訊訂閱和閱讀系統。

未知 的大頭貼

Patching Ubuntu package and publishing on OBS

This is part 2 of a previous article.

I recently upgraded Kubuntu 24.04 to 24.10 and was plagued by this bug, which makes Konsole and Kate text look ugly because hinting is force-enabled by upstream. The upstream already has a fix, but for Ubuntu I have to wait until at least the next release to get the fix. The bug greatly annoys me and the fix looks rather simple so I decided to use my skills to patch it.

Preparation

  1. Created a new OBS subproject, because this package will only be published for 24.10, but my home project has configurations for 23.04 and 23.10.
  2. Configure the subproject with 24.10 package sources.
  3. Add a new package via OBS web interface.
  4. Install pkg-kde-tools and devscripts. pkg-kde-tools seems to be required when running dpkg-buildpackage for KDE packages. It will have the following complaint if not installed:
    dh: error: unable to load addon kf6: Can't locate Debian/Debhelper/Sequence/kf6.pm in @INC (you may need to install  
    the Debian::Debhelper::Sequence::kf6 module) (@INC entries checked: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5
    .38.2 /usr/local/share/perl/5.38.2 /usr/lib/x86_64-linux-gnu/perl5/5.38 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/p
    erl-base /usr/lib/x86_64-linux-gnu/perl/5.38 /usr/share/perl/5.38 /usr/local/lib/site_perl) at (eval 13) line 1.    
    BEGIN failed--compilation aborted at (eval 13) line 1.

Getting package source

Adding deb-src sources in Types in /etc/apt/sources.list.d/ubuntu.sources, should look like this:

Types: deb deb-src
URIs: http://tw.archive.ubuntu.com/ubuntu
Suites: oracular oracular-updates oracular-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Then apt update.

Check out the subproject:

osc co home:pellaeon:plasma6
cd home:pellaeon:plasma6/kf6-ktexteditor

Get package source:

apt source kf6-ktexteditor

Theoretically there we can also use osc dput.

Uploading unchanged sources for building

Add the unchanged sources:

osc add *.xz *.dsc

Commit:

osc commit

Now the first unchanged build shoud start. Observe the build process and add needed project config, there’s mine eventually:

Repotype: debian
Constraint: hardware:disk:size unit=G 30
Constraint: hardware:memory:size unit=G 8
Prefer: libncurses-dev gpg libavcodec61 libavformat61

Once the source package builds successfully, I can start modifying the source code.

Modifying the source code and making a debchange

This process is mostly taken from this DebConf talk 22:49 to 26:19.

First, set DEBEMAIL.

Make code changes to source code inside kf6-ktexteditor-6.6.0.

Make a debchange (pl is my postfix): debchange -l pl

Generate a debian patch using dpkg-source --commit.

Then generate the source package: dpkg-buildpackage -S -us -uc -d

osc rm the old source package files and add the new ones with osc add.

Commit with osc ci -m"message".

Installing on Ubuntu

The automatically generated download page (linked from the package page) shows no data. It’s because the generated link specifies the *source package name* while the output package name is needed. So this would be the correct link.

Once installed, I can verify that the bug is indeed fixed!

References

未知 的大頭貼

Spotify snap 沒有 MPRIS 不能使用媒體按鍵控制,換到 flatpak

Spotify snap 似乎不再提供 MPRIS 的功能,讓我無法用媒體按鍵控制他,這功能似乎已經壞掉一陣子,但我一直懶得檢查到底是哪裡壞掉,只記得以前應該是有這個功能的。官方只提供 snap 和 deb 兩種格式的套件而已,但想一想裝來路不明的 flatpak 的風險應該還是低於安裝來源已知但是閉源的 deb 檔,所以決定還是用 flatpak 安裝。

flatpak 安裝後確認有 MPRIS:

Image

確認可以使用媒體按鍵。

然後我又發現中文輸入 (fcitx) 壞掉了,不過以前我在 snap 版本修過一次這個問題,修 flatpak 應該如法炮製就可以了。

首先去 ~/.local/share/applications 裡面把 .desktop 檔案複製一份目前使用者可以編輯的版本,原始他是個 symlink 到 /var 裡面,不能編輯。

cd  ~/.local/share/applications
rm com.spotify.Client.desktop
cp /var/lib/flatpak/app/com.spotify.Client/current/active/export/share/applications/com.spotify.Client.desktop .

接下來把 Exec= 開頭那行改成這樣:

Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=spotify --file-forwarding com.spotify.Client --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime @@u %U @@

然後我發現還是不能開,發現是因為這個 flatpak 套件是使用 X11 模式。

使用 Flatseal 編輯 spotify flatpak 的權限,授予 Wayland 權限,啟動的時候應該就會自動使用 Wayland。

Image

改完就成功啦!

相關設定

另外還有個相關設定可能需要調整:Firefox 和 Chromium 等瀏覽器播放媒體的時候預設也會註冊 MPRIS ,因此媒體按鍵就會變成控制瀏覽器的媒體而不是 spotify,只要去 Firefox 設定裡面把「使用鍵盤、耳機或虛擬介面控制媒體內容播放行為 (V)」關掉就可以了。

還有,Spotify 應用程式登入的時候要開啟瀏覽器,如果沒有設定預設瀏覽器的話會沒有反應。我是使用 firefox-deflector 讓我可以選擇不同的 profile 來開啟連結。

未知 的大頭貼

為小米溫度計第三方韌體加上 Airtag 功能?

小米溫度計要使用的話預設得要搭配小米的手機應用程式,要使用這個應用程式得要註冊小米芭樂帳號,因此我當然不會使用。但這樣要用手機或是電腦看溫度就很麻煩,而且也沒辦法看溫度紀錄。

後來發現超讚的第三方韌體,用 Chromium 透過 WebBluetooth 功能,使用他提供的 OTA 網頁程式,很輕鬆就可以將溫度計刷上他的第三方韌體。就再也不需要使用小米芭樂app。

開心使用了一陣子,某天回想起我之前看到的 OpenHayStack 專案,Openhaystack 是個開源的 Apple Airtag 實作,讓任何 BLE 裝置可以變成一個 Airtag 被追蹤。我靈機一動,小米溫度計不也是 BLE?那不就可以把它變成一個 airtag 了!小米溫度計在台灣只賣 $135 ,比 Apple airtag 便宜多了。傳統上 Openhaystack 是設計給 ESP32 之類的藍牙開發板刷的,但如果真的要把這類開發板當成 airtag 使用,那一個方便的外殼和長效的電池就很重要,這個是一般 ESP32 開發板出廠沒有提供的。但如果使用小米溫度計的話就完美地解決了這個問題。於是我開始進行研究。

OpenHayStack 的 airtag 實作

Openhaystack 原始碼裡面目前提供 ESP32, Microbit 和 Linux HCI 的 airtag 實作,我看了很開心,就開始研究怎麼把這個實作移植到 ATC_MiThermometer 韌體上面,看來似乎主要需要修改 ble.c

Openhaystack 的實作意外地非常簡單,只有設定一個固定的廣播資料,也就是 key 而已。這個 key 是需要透過他們的程式來產生。

我看到一半準備開始移植的時候,想一想不對,我記得 Openhaystack 的論文裡面說到為了避免單一 airtag 被追蹤,airtag 廣播的 key 和 mac address 都會隨著時間改變。這就和我上面看到的實作只用固定 key 不一樣。仔細一看才發現 Openhaystack README.md 裡面寫著這些都只是 proof-of-concept 因此只會廣播固定 key。我心涼了一半,這就表示如果使用 openhaystack 的實作那麼雖然我可以追蹤這個裝置但其他任何人只要收的到這個裝置的廣播也都可以追蹤,顯然有巨大的隱私風險。

Openhaystack 的開發者有說想要開發完整的 rolling key 廣播實作但是不知道需要多久。目前也沒看到任何開發中的跡象。

其他 airtag 實作

於是我重新看了逆向 Apple FindMy 協定和實作 openhaystack 原始的論文,發現 airtag 廣播的 key derivation 是透過一連串的橢圓曲線公私鑰演算法來演算出隨著時間變化的 key。這個以我目前的嵌入式平台開發能力應該是辦不到。

我再找到了其他 airtag 的實作,主要有二:

  1. GitHub – dakhnod/FakeTag: firmware for nRF51 chips that is coincidentally compatible with the FindMy (AirTag) ecosystem (https://github.com/dakhnod/FakeTag)
  2. GitHub – biemster/FindMy: Query Apple’s Find My network (https://github.com/biemster/FindMy)

這兩個專案都支援廣播 rolling key,但他們其實都沒有實作上面提到的那個 key derivation 演算法,都用了一個很天才的方法繞過:先在電腦上產生好所有未來要使用的 key,然後 hard code 進韌體裡面,再刷進去就好啦,這樣就不需要在嵌入式硬體上面做橢圓曲線公私鑰運算了。

至於在電腦上如何預先演算這些 key?實作在 generate_keys.py 內。

我其實也有點懷疑這個 key generator 真的和 apple 使用的演算法相同。不過似乎 key derivation 演算法即使沒有和 apple 官方的實作完全相同應該也仍然可以使用 FindMy 網路,因為 FakeTag 的作者有提到他使用了自己的私有演算法,而且原始 Openhaystack 則根本是使用固定 key,所以很可能蘋果的伺服器其實不在意資料是怎樣加密的。

這倒是也蠻合理的,因為蘋果 FindMy 協定的設計是伺服器接受的是公鑰加密後的地理位置資料,而私鑰僅有 airtag 擁有者才擁有,所以伺服器無法解密任何上傳的內容,所以內容是啥對伺服器其實不重要。重要的是 airtag 擁有者必須要知道該跟伺服器下載哪一個編號的加密地理位置資料,這個只要客戶端實作正確應該就可以正常算出來。

想到這點就想到之前看到的另一個專案 send-my,就正是利用 Apple Findmy 伺服器可以接受任意藍牙資料的特性來做一個 data exfiltration 的概念驗證。

除此之外我還發現 micro-ecc,是個在嵌入式環境內實作橢圓曲線演算法的函式庫,如果未來我有時間的話可以考慮把這個整合進我寫的小米溫度計韌體。

Roadmap

釐清完技術細節,就可以列出實作里程碑了:

  1. 自行編譯未修改的 ATC_MiThermometer 的韌體刷入
  2. 修改韌體加入廣播固定 key 的功能
  3. 測試 biemster/FindMy 專案提供的程式來註冊修改後的小米溫度計,嘗試下載地理定位資料
  4. 修改韌體加入儲存一系列 key 並輪流廣播的功能,並測試下載資料
  5. 若有時間的話,整合 micro-ecc
未知 的大頭貼

近期雜學:FreshRSS, VLC+Chromecast, Fcitx5+Wayland, LeechBlockNG 吃 CPU, 小米溫度計開源韌體

FreshRSS, rss-proxy, 整理 RSS 訂閱

我一直以來都使用自己寫的爬蟲爬 Facebook 粉專和公開社團的貼文轉成 RSS 來閱讀,但訂閱的粉專越來越多,加上其他訂閱都逼近 Inoreader 初階付費方案的 500 個 feed 了,而且大部分 Facebook 訂閱的都不是什麼重要的內容,是瞄一眼即可的類型,一個粉專耗著一個 Inoreader 訂閱數其實有些不划算。

所以決定把 facebook 粉專的 RSS 全部移到新架設的 FreshRSS 上面,FreshRSS 還有一個很讚但其他商業服務似乎都沒有的功能:動態 OPML 訂閱。Inoreader 上面 OPML 只能拿來一次性匯入 RSS 訂閱,但沒辦法持續追蹤 OPML 的更動。FreshRSS 的動態 OPML 訂閱解決了這個問題。我的 facebook 爬蟲是直接吃一個文字列表輸入決定要爬什麼粉專,同時我也用這些列表產生 OPML 檔案,以前如果更動了那個列表,就要重新產生 OPML 然後在 Inoreader 重新訂閱一次,現在只要編輯列表 Freshrss 那邊就會自己更新了。

除此之外,也把 rss-proxy 架設起來使用,它可以幫沒有 RSS feed 的網頁產生一個 RSS feed,而且重點是他是用真的瀏覽器去爬,然後顯示一個元素選擇界面讓你選擇到底哪一些是個別文章,他也有預設的演算法可以推測哪一些是個別文章的 HTML 元素。如此一來,從網頁產生 RSS feed 就再也不需要手寫 HTML selector,可以輕鬆使用 no code 方式。

VLC+Chromecast

意外發現 VLC 支援直接輸出到 Chromecast,但原文裡面寫的用 resolvectl 抓 chromecast IP 位址的方法不知道為什麼在我的系統無法使用。所以我就寫了一個自己的 script:

#!/bin/bash

IP=$(avahi-browse -vrtp  _googlecast._tcp | grep IPv4 | grep '=' | awk -F';' '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}')
echo "Chromecast IP is $IP"
cvlc --sout "#chromecast" --sout-chromecast-ip="$IP" "$1"

awk 指令是直接請 copilot 生成的,copilot 平常沒什麼用倒是這方面很好用。

不過測完之後發現實際上播放效果非常差,大概播放一秒鐘就只剩下音訊,然後整個就斷了,後來還是直接在 Android TV 上面裝 VLC ,再加上使用 KDE Dolphin 檔案管理員直接設定 samba 分享給電視,播起來就很順了。

小米溫度計開源韌體

小米溫度計便宜好用又有藍牙,但開了 app 發現要登入才能看溫度和紀錄。搜尋了一下找到 MiTemperature2 專案可以和小米溫度計配對讀取溫度,他們介紹裡面有提到一個開源的韌體 ATC_MiThermometer ,刷了之後就可以讓溫度計以 BLE beacon 廣播溫度,不需要再配對,也比較省電。

刷起來非常簡單,就是透過 chromium 瀏覽器的 webbluetooth 功能,網頁很簡單就可以刷。刷了之後也可以讀取溫度計內建的兩萬筆約四個月的紀錄,這樣就不需要用小米app了。

其他學習

  • Fcitx5+Wayland+KDE 會提示 QT_IM_MODULE 環境變數不應該設定,調整之後 fcitx 選字框的顯示的速度比以前快很多,而且選字框也不會飄離輸入的位置了,但是 chromium 等應用程式都會遇到無法啟動輸入法的問題,也找到參數解法。
  • LeechBlockNG 吃 CPU 發現LeechBlockNG 很吃 CPU,調整設定後解決。
  • 發現 Sony 手機有個 Open Devices Program,在裝置上市之後會上傳建構 AOSP 所需的二進位檔,還有其他 device tree 之類的原始碼,而且還開了一個 github repo 給人回報建構 AOSP 的問題,這開發者關係真的是做足了。而且現在新的裝置也都有保障至少7年安全性更新。看來下一隻手機可以考慮買 Sony。