未知 的大頭貼

挑選新的 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 才開放的所以可能支援的裝置也不多。)

需要注意的是,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 的阻抗仍然高於銀漆(懶得找來源,但可能是這頁),畢竟他還是石墨為基礎的,不是金屬,但相較於金屬漆,有其他優勢。

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

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

使用電錶尋找斷點

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

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

  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 而且只是個不舒服的薄膜鍵盤。

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

未知 的大頭貼

我的 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:

確認可以使用媒體按鍵。

然後我又發現中文輸入 (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。

改完就成功啦!

相關設定

另外還有個相關設定可能需要調整: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。

未知 的大頭貼

瀏覽器指紋與反追蹤的思考

一直以來我就對網頁瀏覽器的各種 feature creep,還有瀏覽器的設計很有意見。一直以來有個想法就是各種網頁的 Javascript API (例如 WebGL, WebAudio 等等)應該要如同定位服務一樣,預設停用,需要使用時再由網頁向使用者提出請求,這樣的話就會增加網頁開發者的壓力不要去濫用這些功能,因為這些 API 一旦需要使用者批准才能使用,開發者就會一定程度上被迫去解釋為什麼他們需要存取這些 API。並且因為權限是動態給予的,就像手機應用程式的動態權限系統一樣,開發者就會有壓力去讓即使這些權限被拒絕的時候應用程式的其他部分能夠正常運作。

顯然現在的瀏覽器並不是這樣運作的,因此產生了一詭異的現象:瀏覽器開發者所設計的各種厲害功能,被網頁開發者主流所使用的方式,都不是瀏覽器開發者原本設計的目的,而是被拿來追蹤識別使用者。例如,當今 WebGL 的主流應用,並不是拿來在網頁上繪製 3D 圖形,而是讓網頁來獲取瀏覽器的特徵值,用於追蹤使用者。畢竟,實在沒有多少情境下需要讓網頁繪製 3D 圖形,對吧?

綜合上述原因,我自己目前使用者的瀏覽器是刻意停用 WebGL 和 WebAssembly 等功能的。

反追蹤 vs 不爽 feature creep

所以綜合起來我的初始目的有兩個:

  1. 反網頁追蹤
  2. 我就是不爽瀏覽器開一堆功能給網頁去濫用所以我要把這些功能關掉

第二個目的有時候會破壞第一個,因為把這些特定功能關掉的話可能會產生一個獨特的信號讓你變得更容易被追蹤。不過…就我一直以來的觀察,從來沒看過哪個追蹤程式會去慢慢測試每一個功能可不可以用然後回報這項資訊,大部分都是直接用那個 DOM 全域物件,但因為停用的關係全域物件是 undefined,於是整個追蹤器就丟 exception 然後壞掉。¯\_(ツ)_/¯

瀏覽器的反追蹤策略

根據爬文,目前主流瀏覽器的反追蹤策略有兩種

  1. 差異化:讓瀏覽器特徵對每一次瀏覽、每一個網站都看起來不一樣,Brave 採行這種策略,換句話說就是一個人每次看起來都像是不同人。
  2. 一致化:讓用同一個瀏覽器的不同用戶看起來一模一樣,無法分辨,Tor Browser 採行這種策略,換句話說就是每個人看起來都像同一個人。

但這兩種策略都有缺點:

  1. 差異化:
    • 並不是每一個會被收集的資料項目都那麼容易差異化,比如說 CPU 核心數,合理的範圍大概就只有 2~32 ,而且當中的奇數也幾乎不可能,例如 5, 7, 9。但這個說法我覺得不合理,因為本來就不需要去差異化所有資料項目啊,比如說顯然目前幾乎所有瀏覽器都支援 HTML 5,那差異化這個幹嘛?
    • 因為差異化一般是拿資料項目真正的值進行隨機演算,進階的追蹤器有可能可以透過多次收集數據獲得平均值拿來追蹤,因為取多次平均值可以抵消隨機演算的效果。這我覺得合理,但是我猜應該很少有追蹤器願意做到這個地步,因為成本還有效能考慮。
  2. 一致化的缺點就比較明顯了:
    • 有些東西一致化之後會降級使用者體驗,比如說所有人都必須要使用 UTC+0 時區、固定的視窗大小
    • 所屬的一致化群體必須要夠大才有意義

仔細思考

就反追蹤來說,瀏覽時最大的識別資訊其實是 IP 位置,而平常我並無意隱藏這項資訊。而想要隱藏 IP 位置的時候我會直接用另一個 profile (搭配 VPN)。

我想要反制低階追蹤,但不打算反制高階追蹤。但其實這麼說也不對,我其實並不介意讓低階追蹤程式得知我在使用 Linux,所以話說回來其實我介意的只是部分個別資料項目的敏感性,攻擊方想要結合已經公開的資料來追蹤我其實並不介意。甚至,我還蠻樂意讓追蹤程式知道,我正在使用 Linux 上面的 Firefox ,而且不支援 WebGL 呢,因為如果我偽裝成 Chrome + Windows 的話,觀測到的 Firefox 的市佔率不就更低了嗎,這樣廠商可能會覺得支援 Firefox 的必要性更低了。

Feature Creep

那我會在意的資料項目有什麼?

我不喜歡的功能,大致上都是可以讓網頁直接存取低階硬體的功能。例如 WASM, WebGL。如果網頁你說想要用 JavaScript 做一些特效、甚至整個應用程式邏輯(像是 Single Page Application),我甚至也都沒什麼意見。但如果網頁可以直接以接近原生應用程式的方式使用我的硬體,這 RCE(遠端代碼執行)的感覺就強烈了許多。雖然瀏覽器都還是對這些功能有很多限制,避免影響使用者的其他資料,但程式碼終究是在我的硬體上面執行,網頁上的 WASM 程式一開啟即執行的模式,我總有一種沒有被徵詢同意的感覺。

雖然說 Javascript 本身就算是一種 RCE ,不過這麼行之有年而且基本上離硬體很遠我就覺得…好像還可以接受。

啊不過或許 WASM 也離硬體很遠?有這個可能但我還沒仔細研究,但總不會比 Javascript 更遠吧?

難道我真的不在意網頁追蹤嗎?

思考到這個地步,不免問自己這個問題。其實也不是不介意,只是覺得,目前 Firefox 的基礎防跨站追蹤已經夠好了,對於更厲害能夠打敗基礎防追蹤的追蹤器,就日常使用來說,並沒有必要花費更大心思和忍受體驗降級去防它們。而偶爾進行一些不想要被追蹤到的瀏覽,打開 Tor Browser 就幾乎可以完美防禦了。

瀏覽器設定檔用途區分

經過以上思考,我把我的瀏覽行為和反追蹤需求分為下列幾種:

  1. 主要日常瀏覽、工作瀏覽:留下痕跡比較沒有關係的網站。
  2. 不想要跟日常瀏覽被關聯,但是留下本地瀏覽紀錄、維持登入沒關係的網站。主要是任何牽涉到線上付款或是購物的網站,這個設定檔我會打開 VPN(利用 vopono),除了 VPN 之外還要反追蹤。這主要是想要防止我的日常瀏覽行為和關鍵字被拿來推薦我要買什麼東西。
  3. 允許 feature creep (WebGL, WebAudio, etc) 的瀏覽器設定檔,這主要是給合理使用 WebGL, WebAudio 的網頁應用程式。
  4. 完全不想要留下紀錄的瀏覽,這個用 Tor browser 就好了。

實測 Firefox 的 privacy.resistFingerprinting (RFP)

RFP 用起來最大的麻煩就是,他為了要達成一致化,裡面的防追蹤功能是不能個別關閉的,因為如果允許關閉一部分的防追蹤功能,那這個特徵就可以被用於追蹤。

Firefox 開啟了 RFP 基本上就有與 Tor Browser 相同的防護。但以往的經驗是會讓瀏覽器變得很難用,所以這次再實測了一次,使用心得:

  • 不能為個別網站設定不同的放大縮小比率
  • Imperva 的 CAPTCHA 沒辦法正常顯示(拼圖的那個),只能改用聲音
  • 好像沒有了耶?!

其實意外地可用性非常高。

實際修改設定

依照上述的設定檔用途區分,我將他們調成:

  1. 不使用 RFP,啟用一些不影響使用體驗的隱私設定,還有關閉 feature creep
  2. 使用 RFP,使用 VPN
  3. 全預設

這次設定檔管理我改用 arkenfox ,因為他有個方便的 GUI 一次看所有設定。不過他與我之前使用的 pyllyukko/user.js 細節差異在哪還有待研究。

Jshelter

這次設定檔修改我都把 Jshelter 移除了,主要是因為速度變慢太多(可能是因為我同時也停用了 WASM),而且 CPU 使用率提高不少。除此之外幾乎所有 Cloudflare CAPTCHA 都過不去,不同網站的狀況不一樣,但過不去的意思是會直接寫「你的瀏覽器已經過期」,沒機會人工解 CAPTCHA。

當時決定使用 Jshelter 的理由是:

  • 它允許針對不同網站個別開啟和關閉不同防護
  • 網站嘗試收集瀏覽器特徵的時候會跳通知,也可以自己點開來看個別網站是不是有在收集瀏覽器特徵(它會給一個分數
  • 其實最初的理由還是因為我不喜歡 feature creep,但大部分 feature creep 沒辦法針對個別網站開關,如果用 Jshelter 的話就可以

Jshelter 基本上提供了類似於 Brave 的特徵值模糊化功能 (farbling)。

Jshelter 還提供了一個 Network Boundary Shield 功能,Firefox 目前似乎還對此沒有防護?Brave 說沒有,但實情有待研究。

參考資料

思考問題筆記

以下是我思考的時候問自己的一些問題和小結。

  • 如果我用的大部分網站已經是 logged in 狀態使用,那反追蹤似乎不太有需要
    • google
    • reddit
    • twitter
    • github
  • cloudflare 的 fingerprinting 太強制,如果嘗試用 jshelter 阻擋則完全過不了
    • 如果直接允許 cloudflare 做 fingerprinting 的意義是什麼?
    • 但如果讓我知道我被 cloudflare 阻擋了,至少我可以決定這個網站不值得看
  • Web worker 似乎有很多合理用途
  • webgl, webaudio 是被濫用來 fingerprint 的標準,實際上只有少數場合需要用到
    • 可以開另一個支援 webgl 的瀏覽器
  • 瀏覽器市佔率如何影響整件事?
  • 普通 fingerprinter 及 進階 fingerprinter ,何者為我目標?
  • 因為 captcha 太嚴格,沒有fingerprint無法通過,所以其實只要去確認fingerprint的資訊都是你覺得讓對方知道沒關係的資訊就可以了?
    • 比如說我覺得讓網站知道我偏好台灣中文其實沒關係
  • 有什麼 fingerprint 是難以隱藏的?