2025年12月31日 星期三

市圖還書 1 本 : Python自學聖經 (第二版)

此書被預約, 因到期日 1/2 我還在台北為免逾期故須先還 :
此書第一版我多年前開始學 Python 時有買, 但新版添加了一些新內容. 

購買 Google AI Pro 一年份

聖誕節前夕表弟小安通知我說 Google AI Pro 有特價優惠, 原價 $6500 特價 $3250 約 58 折, 附 2TB 雲端硬碟, 可以加親友 6 人一起使用, 問我有沒有要買, 我事情一忙差點忘了, 今天上谷歌發現特價活動還在, 就刷卡買一年份, 到 2026/12/31 止, 結束前 6 天會通知是否續約 (恢復原價), 參考 :


這標題說不到半價, 其實是 58 折喔!




按底下按鈕前往 Gemini 網站果然已升級為 Pro 版 : 




2026 是 AI Agent 元年, 我也要好好地來擁抱 AI, 同時把過去兩年所學反芻. 

購買 HiSKIO 平台的 Vibe Coding 全能實戰課

最近看到林彥文老師在 HiSKIO 開 vebe coding 的課, 昨天報名參加了體驗課覺得蠻有趣的, 今天是年底了想說投資明年的自己, 決定報名模組一的影音課 :


先註冊 HiSKIO 帳號 (我用 Hinet 信箱) : 


然後驗證信箱與綁定社群等任務獲得兩張 300 元抵用券, 但一次只能抵用一張, 所以學費總共是 3040 元 : 



明年 1/5 開課. 

高科大還書 1 本 : 持續買進

今天中午去母校還這本書 (被預約) : 


此書非常誇張, 市圖有十幾館進此書, 全部都被超過 7 個人預約, 現在排隊要半年才輪得到; 母校有四本也全部被借走 (包括我這本), 我也還沒看完就被預約了, 但至少下個月我可以借回來, 市圖就別想了. 還書前我大致記了一些章節的摘要筆記 :

第 9 章 你何時可以退休 ?
  • 決定退休並非只是財務上的考量, 也是生活方式的決定. 你必須想清楚退休後要做甚麼? 如何打發時間? 和哪些團體網來? 最終目的是甚麼? 有好答案你就可以退休, 否則會步入一個失望與失敗的未來, 這也是我不熱衷 FIRE (Financial Independence Retire Early) 運動的原因之一. 擁抱 FIRE 的生活方式, 表示你已接受你不再是個相關或重要的人, 你如今是介於存在與不存在之間的以太. 
  • 金錢能解決你的許多問題, 但無法解決你的所有問題. 金錢只是幫你或得想要的東西的一種工具而已, 在你的人生中想清楚究竟要甚麼才是最困難的環節. 
  • 作家 Ernie Zelinsky 說 : 關於退休, 你最需要關心的不是財務危機, 而是存在危機. 
  • 加拿大企業家 Kevin O'Leary 說 : 我何時退休? 我絕不退休, 絕不. 我不知道我死後會去哪裡, 但到了那裏, 我也會繼續工作. 
第 10 章 為何你應該投資?
  • 世界上第一個政府支持的退休金制度為德意志帝國首相俾斯麥於 1889 年首創, 他規定年滿 70 歲的人都可獲得政府資助的退休金.
  • 投資讓你年老時有一個可以汲取的資源池, 也能抵抗通膨對購買力的侵蝕. 長期持有非應急的大量現金是非常糟糕的做法. 
  • 通膨會讓財富的購買力下降, 年通膨 2% 下貨幣購買力會在 35 年後減半; 年通膨 5% 下則在 14 年後就減半. 在溫和通膨下, 日用品的價格約每 20~30 年就會翻倍. 美國喜劇演員 Henrry Yongman 曾這樣比喻通膨 : 美國人越來越壯了, 20 年前兩個人能提得動 10 美元的雜貨; 現在 5 歲的小孩就提得動了. 
  • 隨著退休年齡接近, 你的人力資本 (未來薪水收入) 現值將逐年降低, 你必須投資積攢財務資本 (被動收入) 以維持退休後的生活水準. 
第 11 章 你應該投資甚麼?
  • 創造財富的方法有很多, 你應該探索這些途徑找出適合你需要的方法. 想要致富必須持續買進多種多樣的生財工具, 例如股票, 債券, 房地產, REIT, 農地, 加盟店, 權利金, 自己的產品, ... 但不要列入黃金, 加密貨幣, 藝術品, 或葡萄酒等不會產生現金流的工具上, 它們不是生財資產 (雖然它們也是可以賺到錢). 
  • 權利金是為了持續使用一特定資產而支付的款項, 通常是指有版權的作品, 有一些媒合平台例如 RoyaltyExchange.com 可以交易音樂, 影片, 與商標的權利金所有權. 音樂品味與文化變遷都會影響投資權利金的風險, 可以參考權利金交易網站的 Dollar Age 測試與量化指標來評估某個作品可能持續流行多久. 投資權利金的缺點是會對賣方索取高額的服務與手續費. 
第 12 章 你應該投資甚麼?
  • 散戶千萬不要嘗試選股這種高難度與危險的行為, 因為你不夠格. 選股需熟讀財務基本原理, 了解產業趨勢, 並透過歷史資料實證. 在 1926~2016 年間, 只有 4% 的股票創造了高於美國國庫券的報酬, 你有把握找出這 4% 嗎? 別再做如此高度取決於運氣的事了, 人生中已經有太多全憑運氣的事了, 選股思維使太多散戶受到傷害, 你應該買一籃子股票的 ETF 而非個股. 指數型投資的單純性可以讓你把注意力放在生命中遠比投資組合更重要的事情上. 
  • 投資的最佳市場擇時方法是盡快, 而不是等待低點或分批買進. 歷史資料顯示, 不管是等低點還是分批買, 長期而言都沒有比現在就買績效好. 
~~ 待續 ~~

露天購買 HDMI 二進一出分享器

由於在鄉下老家做樹莓派測試的需要, 必須與 Pi 400 共享一台顯示器, 所以上露天買了下面這款二進一出 HDMI 分享器 :





萊爾富取貨付款免運 110 元.

此賣家評價 OK, 有支付連, 應可信賴. 在露天網購需注意不良賣家利用超商取貨準詐騙伎倆, 他們會寄來仿製品, 甚至更惡劣的是一包小面紙之類的, 他們使用超商金流而非露天平台, 所以要求露天處理通常就只是停權而已無法退款. 
 

2025年12月30日 星期二

如何調整樹莓派 VNC Connect 遠端桌面螢幕為滿版

上週高雄家的樹莓派 Pi 3B 灌 Bulleye OS 滿血復活後, 將其移回鋼琴後面的原位置, 但用 VNC Cloud 連線遠端桌面時卻發現與之前測試時有接 HDMI 螢幕不同, 左右兩邊出現黑框而不是滿版 :




我詢問 ChatGPT 為什麼不接 HDMI 時螢幕沒有滿版, 原因如下 : 
  1. EDID 機制缺失 :
    樹莓派啟動時會讀取 HDMI 螢幕的 EDID (Extended Display Identification Data), EDID 告訴 Pi 支援的解析度和刷新率. 沒接螢幕 → Pi 讀不到 EDID → 無法決定解析度.
  2. Framebuffer fallback :
    沒有 EDID 時, X11 / Linux 會自動選擇安全的低解析度 (例如 640×480、1152×864), VNC Server 只是轉播 framebuffer, 畫面就自然變小.
  3. X11 與 Wayland 行為不同 :
    X11 legacy framebuffer 依賴 HDMI EDID → 沒螢幕解析度低, Wayland / KMS 可以自動建立虛擬顯示器 → 無 HDMI 也能滿版, 關掉 Wayland 後 Pi 就只能依靠 framebuffer → 問題更明顯.
  4. VNC 不是解析度生成器 :
    VNC 只傳播 Pi 當前 framebuffer, 解析度小 VNC 畫面也小, 無法靠 VNC 自行放大或補償
總之, 原因是不接 HDMI → 沒 EDID → framebuffer fallback → VNC 畫面變窄. 解決辦法是用 Xorg dummy driver 強制固定解析度. 

首先編輯 /boot/config.txt 開機設定檔 : 

pi@kaopi3:~ $ sudo nano /boot/config.txt   

在尾端輸入如下設定 :

# ==== Force HDMI resolution for VNC (no monitor) ====
hdmi_force_hotplug=1




按 Ctrl+O 存檔後按 Ctrl+X 跳出 nano.

接下來建立 /etc/X11/xorg.conf.d y 資料夾 : 

pi@kaopi3:~ $ sudo mkdir -p /etc/X11/xorg.conf.d  

用 nano 在此資料夾下編輯一個 10-dummy-monitor.conf 設定檔 : 

pi@kaopi3:~ $ sudo nano /etc/X11/xorg.conf.d/10-dummy-monitor.conf    

輸入如下設定 :

Section "Device"
    Identifier "DummyDevice"
    Driver "dummy"
EndSection

Section "Monitor"
    Identifier "DummyMonitor"
    HorizSync 28.0-80.0
    VertRefresh 50.0-75.0
    Modeline "1920x1080_60.00"  173.00 1920 2040 2248 2576 1080 1083 1088 1120 -hsync +vsync
EndSection

Section "Screen"
    Identifier "DummyScreen"
    Device "DummyDevice"
    Monitor "DummyMonitor"
    DefaultDepth 24
    SubSection "Display"
        Depth 24
        Modes "1920x1080_60.00"
    EndSubSection
EndSection




按 Ctrl+O 存檔後按 Ctrl+X 跳出 nano.

然後是安裝 xserver-xorg-video-dummy 套件, 先更新套件清單 : 

pi@kaopi3:~ $ sudo apt update   
已有:1 http://archive.raspberrypi.org/debian bullseye InRelease                
已有:2 http://raspbian.raspberrypi.org/raspbian bullseye InRelease             
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成  
3 packages can be upgraded. Run 'apt list --upgradable' to see them.

安裝 xserver-xorg-video-dummy 套件 : 

pi@kaopi3:~ $ sudo apt install xserver-xorg-video-dummy     
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列【新】套件將會被安裝:
  xserver-xorg-video-dummy
升級 0 個,新安裝 1 個,移除 0 個,有 3 個未被升級。
需要下載 18.4 kB 的套件檔。
此操作完成之後,會多佔用 43.0 kB 的磁碟空間。
下載:1 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf xserver-xorg-video-dummy armhf 1:0.3.8-1+b3 [18.4 kB]
取得 18.4 kB 用了 2s (10.2 kB/s)                  
選取了原先未選的套件 xserver-xorg-video-dummy。
(讀取資料庫 ... 目前共安裝了 120629 個檔案和目錄。)
正在準備解包 .../xserver-xorg-video-dummy_1%3a0.3.8-1+b3_armhf.deb……
Unpacking xserver-xorg-video-dummy (1:0.3.8-1+b3) ...
設定 xserver-xorg-video-dummy (1:0.3.8-1+b3) ...

最後重開機 : 

pi@kaopi3:~ $ sudo reboot  

再次連線就可以看到滿版的桌面了 : 




經過這樣設定, 以後不管有沒有接 HDMI 螢幕都會呈現滿版螢幕. 

2025年12月28日 星期日

2025 年第 52 周記事

終於來到 2025 年尾啦! 我也正式向 5 字頭告別, 邁向 6 旬歐姬桑之路, 雖然菁菁與二哥都說我看起來差不多 50 歲而已, 如果頭髮染一下應該 40 左右, 呵呵, 應該是安慰我的啦. 

花了兩周時間終於把兩塊樹莓派板子 (Pi 3B 與 Pi 3A+) 都灌了 Bulleye Desktop, 又可以投入爬蟲作業了, 這是資產活化, 放著不用就浪費算力了, 雖然不怎麼強大. 另外也把上回從老張家帶回來要重新設定網站的 Pi 4 先拿來灌 Bookworm, 等 Logitec C270 攝像頭到或就來測試 OpenCV + YOLO. 

週六早上明賢表弟又再次向我介紹 Claude Code, 我已充分感受到它的威力, 但我目前只是把系統裝起來而已, 要忙的事情很多, 等告一段落再拿之前舊專案改版來當試金石試試看. 

鄉下家的貓小乖上周不知何故右前腿受傷, 走路一跛一跛的, 今天拿普維酮碘給它上藥, 但隨即被它舔掉. 這周沒時間, 下周從台北回來若傷口未復原, 打算找出貓籠周六帶它來高雄看動物醫生. 

之前安裝在前門左側籃球架上的太陽能燈因為有樹蔭遮擋, 下午兩點後無日照, 所以亮到晚上 9~10 點就沒電了. 下午拆燈具改裝在庫房, 太陽能板則安裝在車庫鐵皮屋頂 :





這樣以後太陽一下山, 庫房就有自動照明了. 

週三行憲紀念日放假一天, 我週二晚上就回鄉下, 週三早上 10:30 送報生練小姐來時我趕緊衝出去付報費, 要不然都碰不到面 (訂一年自由時報 $3600 送兩個月, 114/11/12~116/1/11 到期). 週三整天都在家, 早上完成廚房小米攝影機安裝, 下午則完成延宕已久的廚房太陽能燈. 午睡起來帶齊工具到頂樓開始施工, 太陽能板兩周前已經固定好, 剩下線路加長與佈放, 最後是安裝廚房的燈座  :






在年尾的最後一周終於把所有太陽能照明燈都裝齊了, 下周要將前門左右兩側的日光燈改裝成 LED 燈. 然後就可以著手門口影像辨識與電子門鈴警示器專案了. 

新的一年要在周記持續追蹤管理待辦事項 : 

學研 todo list :
  • Hahow & Tibame 線上課程
  • PyTorch
  • Pandas
  • LangChain
專案 todo list :
  • 博客來新書爬蟲
  • 市圖爬蟲增加呼叫 Gemini API 預約書規劃功能
  • 樹莓派 OpenCV + YOLO 影像辨識測試
  • 大門進出偵測與通報
  • 舊豬舍 PIR 移動感測器
雜項 todo list :
  • 老家浴廁馬桶管線改接工程
  • 車庫採光罩更新工程
  • 設定高雄 ASUS WiFi 分享器
  • 陽台植栽自動澆水系統
  • 清理 Hinet 信箱
  • 安裝衣櫥
  • 整理庫房
之前曾偶而記錄一下, 沒有持續追蹤舊很容易忘記, 管理是生活中最重要的一件事. 

市圖還書 1 本 : 迎接人形機器人時代

這本書有人預約須還 : 

  1. 迎接人形機器人時代 : 解讀未來語言的機械奇蹟 /

此書主要介紹人形機器人的產業發展與未來願景, 這領域的領頭羊是麻省理工學院的 Mark Raibert 於 1983 年創立 的波士頓動力公司. 該公司於 1992 年從 MIT 獨立出來, 2005 年與美國國防部 DARPA 合作開發四足機器人, 陸續推出 Big Dog, Wild Cat, Petman, Atlas, Spot, Handle 等令全世界驚艷的成果. 不過由於無法滿足實際應用需求, 來自美國軍方的支援減少, 於 2014 年被谷歌收購, 但礙於技術遲遲無法商業化, 2017 年被轉賣給日本軟銀, 2020 年第三度轉手, 被南韓現代集團併購. 

人形機器人的上游核心零部件與工業機器人相同, 包含驅動系統 (伺服機, 減速機), 控制系統 (控制器), 與感測器構成, 這三大系統成本占比約七成 (減速機:伺服機:控制器=35:20:15), 但人形機器人自由度高, 減速機與電機成本占比會更高. 人形機器人產業鏈中以減速機的毛利最高 (約 40%), 日本哈默那科是諧波減速器的領頭羊; 控制器部分日本發那科則為世界龍頭. 

值得注意的是, 在 2014 年之前, 日本與南韓在人行機器人專利申請上占據主導地位, 起步較晚的中國則在 2014 之後逐漸趕上, 複製了在 5G 發展上同樣的態勢後來居上, 2022 年中國超越日本成為專利數量世界第一, 不過主要集中在基礎結構方面, 在感知器部分則落後於日韓等國. 在專利集中度 (該國專利數量前三申請人專利數量占該國申請總數比數) 方面以日本最高, 表示日本已在人形機器人專利上形成壟斷態勢. 

在 Windows 上安裝 Gemini CLI

繼 Anthropic 於 2025 年 3 月推出高階工程師用的 AI coding 代理 Claude Code 後, 谷歌也在 2025 年 6 月 25 日推出了命令列 AI 代理工具 Gemini CLI, 最主要的差別是, Claude Code 採商業付費訂閱制, 而 Gemini CLI 則是開放原始碼專案, 可免費使用. 

Gemini CLI 的主要目標是將谷歌的 Gemini AI 模型 (尤其是 Gemini 2.5 Pro 推理模型) 直接整合到開發者的終端機 (terminal) 上, 讓開發者能以最直接的方式在終端機中呼叫 AI 來生成程式碼與一般內容, 具有如下特點 : 
  • 支援超大 context, 適合處理大型軟體, 可整倉分析與進行一次性複雜重構 (refactor).
  • 插件豐富, 可自訂插件並輕易整合在腳本與自動化流程中.
  • 速度快, 適合快速原型生成, 無需訂閱費用.
  • 整合了 Gemini Code Assist 與 Model Context Protocol (MCP) 等技術.
  • 支援多種內建指令例如 /bug, /chat, /tools, !shell 等, 可直接控制 CLI 本身行為, 儲存歷史, 或執行系統命令, 提高終端機互動性與控制力. 
詳情請參考 Gemini CLI 官網, GitHub repo, 與教學文件 :


中文教學文件參考 :


Gemini CLI 原始碼是用 Node.js 寫的, 安裝 Gemini CLI 必須要有 Node.js 18 版以上的執行環境, 我在前一篇安裝 Claude Code 時使用 scoop 套件管理工具, 所以下面安裝程序先使用 scoop 安裝 Node.js 的版本管理工具 nvm, 然後再用 nvm 安裝最新版的 Node.js, 參考 :  


1. 安裝 Node.js : 

為了管理不同版本的 Node.js, 先用 scoop 安裝 Node 版本管理工具 nvm (Node Version Manager) :

PS C:\Users\tony1> scoop install nvm   
Updating Scoop...
Updating Buckets...
INFO  Converting 'main' bucket to git repo...
The main bucket was removed successfully.
Checking repo... OK
The main bucket was added successfully.
Scoop was updated successfully!
Installing 'nvm' (1.2.2) [64bit] from 'main' bucket
nvm-noinstall.zip (6.0 MB) [==================================================================================] 100%
Checking hash of nvm-noinstall.zip ... ok.
Extracting nvm-noinstall.zip ... done.
Running pre_install script...done.
Linking ~\scoop\apps\nvm\current => ~\scoop\apps\nvm\1.2.2
Adding ~\scoop\apps\nvm\current to your path.
Adding ~\scoop\apps\nvm\current\nodejs\nodejs to your path.
Persisting nodejs
Persisting elevate.cmd
Persisting elevate.vbs
Persisting settings.txt
'nvm' (1.2.2) was installed successfully!
Notes
-----
You'll need to restart powershell/cmd to have it reload Environment Variables so nvm will work correctly

安裝完須關閉 Power Shell 視窗重啟, 檢視 nvm 版本 : 

PS C:\Users\tony1> nvm --version  
1.2.2

接下來就可以用 nvm install 來安裝指定版本的 Node.js 了, 指令格式如下 : 

nvm install <version | node | --lts>  

其中 version 為版本號碼例如 25.2.1, 用 node 表示安裝最新版, lts 表示安裝長期支援的穩定版本. 注意, 這三個參數只能擇一使用. 

PS C:\Users\tony1> nvm install node   
25.2.1
Downloading node.js version 25.2.1 (64-bit)...
Extracting node and npm...
Complete
Installation complete.
If you want to use this version, type:

nvm use 25.2.1

透過 nvm 可以在電腦中安裝多個不同版本的 Node.js, 然後用 nvm use 指令啟用指定的版本 (這就是 nvm 版本管理的功能), 指令格式如下 : 

nvm use <version | node | --lts>   

PS C:\Users\tony1> nvm use node   
25.2.1
Now using node v25.2.1 (64-bit)

檢視目前使用中的 Node.js 版本 :

PS C:\Users\tony1> node --version   
v25.2.1


2. 安裝 Gemini CLI : 

確認 Node.js 已安裝完成後便可用下列指令安裝 Gemini CLI :

npm install -g @google/gemini-cli  

PS C:\Users\tony1> npm install -g @google/gemini-cli   
npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead

added 577 packages in 2m
npm notice
npm notice New minor version of npm available! 11.6.2 -> 11.7.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.7.0
npm notice To update run: npm install -g npm@11.7.0
npm notice

這樣就安裝成功了 (只要沒有 ERR/failed/permission denied 等致命錯誤即可, 那個 deprecated 警告是 Gemini CLI 的某個相依套件將來會被淘, 不影響目前使用 Gemini CLI). 


3. 啟動互動式 Gemini CLI : 

在 PS 視窗輸入 gemini 就會啟動互動式 Gemini CLI, 這樣是執行 Gemini CLI 的主程式, 進入一個類似於聊天室的介面, 可讓使用者輸入提示詞 (prompt), 模型會即時回應 : 

PS C:\Users\tony1> gemini  




中間出現黃框提示 " You are running Gemini CLI in your home directory. It is recommended to run in a project-specific directory." 是因為目前在作業系統的主目錄下執行 gemini CLI, 它建議應在一個專案目錄 (例如虛擬環境) 下執行為宜, 但目前只是測試, 在哪個路徑都沒關係. 

接下來是要選擇一個方式來授權 Gemini CLI 存取此專案資料夾, 預設是使用 Google 帳號登入, a此方式免費帳戶每分鐘可向 Gemini 請求 60 次, 每天最多請求 1000 次, 選 1 按 Enter 後在彈出視窗按 "允許" 移除防火牆對 Node.js 之封鎖 :




然後選擇一個 Google 帳號登入 : 





完成 Google 登入後, PS 視窗底下會出現一個交談框讓我們輸入指令或提示詞 :




2025年12月27日 星期六

茶米老師的 NotbookLM 課

昨天參加茶米老師的 NotobookLM 線上課程, 簡報與資料檔連結如下 :


雖然上回茶米老師來公司授課時我已上過, 但每次都會學到新的東西, 例如 NotebookLM 可以將報告做成心智圖, 但是只能匯出圖檔, 這時可以用 NotebookLM 讀圖功能轉成 Markup 後再用下面的免費心智圖網站轉成 HTML :


明天早上 09:00 有 Gemini 新手村完結篇 (我錯失了前面三堂, 殘念) :

Google Meet 搖滾區 (名額有限額滿為止) : 
YouTube 直播區 (人數不限) : 


2026-01-12 更新 :

今天參加第二集課程 :


2025年12月26日 星期五

露天購買羅技 Logitech C270 Webcam

12/19 在蝦皮購買了兩個 USB Webcam, 在 Windows 可正常使用, 今天在樹莓派 Pi 4B (Bookworm) 上測試無法抓到, 可能是樹莓派不支援, 盒內說明書亦無型號, 所以也無法找尋驅動程式, 只好上網買 Logitech C270, 這在很多樹莓派書上都有提到. 我在露天找到這賣家有開啟支付連, 應該是可靠賣家 (注意, 露天有很多準詐騙賣家-可能是中國人混進來, 上回買小米攝影機給我寄來中國雜牌爛貨, 要求換貨拖了兩個多月至今沒寄來, 跟露天反映也不了了之, 這種網購詐騙你也不能告詐欺, 本來不想用露天了, 但後來覺得有些東西蝦皮沒上架但露天有, 只要慎選賣家應該還可以偶一為之, 但只要我有在露天買東西一定會再次回顧被騙歷史, 提醒自己在露天交易千萬要小心, 直到露天進步超越蝦皮為止) :





全家取貨免運 500 元. 


2025-12-27 補充 :

市面上還有一款樹莓派支援的 Rapoo C200 :


2025年12月25日 星期四

小米裕誠店購買除塵蟎機 (補記)

因為我有鼻子過敏, 對塵蹣非常敏感 (有一次全家去清境農場民宿住宿, 晚上被子拿出來一鋪馬上狂打噴嚏), 上週三下班後去河堤取書順著裕誠路到小米店買了一台小米除蹣機 Pro 版, 此款有一個顯示面板顯示除蟎強度與塵蹣濃度, 附紫外線殺菌與 50 度熱風乾燥功能 : 





回家先給床墊與睡袋除蟎, 哇, 吸出好多粉塵. 周五晚上帶回鄉下吸, 更恐怖. 

2025年12月24日 星期三

K 線圖套件 kbar 升版 v0.1.5

這兩天在樹莓派 Pi 3B 與 3A+ 這兩塊主機的 Bulleye OS 上安裝套件時都在安裝 kbar 的依賴套件 pyarrow 時失敗, 再次詢問 ChatGPT 才知道根本不需要將 pyarrow 列入依賴套件, 因為 kbar 原始碼既沒有 import pyarrow, 用來處理資料的 pandas 與畫 K 線的 mplfinance 也沒用到, 為何當時 ChatGPT 幫我寫  project.toml 時會列入 pyarrow? 為了拿掉 pyarrow 依賴只好升版為 v0.1.5 (同時也把版本上限加回去避免依賴套件大升版時出問題). 本系列之前文張參考 :



1. 修改 project.toml :  

黃底色部分為修改之處 : 

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "kbar"
version = "0.1.5"
description = "A lightweight K-line (candlestick) plotting tool with matplotlib and mplfinance."
readme = "README.md"
requires-python = ">=3.9"
license = { file = "LICENSE" }
authors = [
  { name = "Tony Y.H. Huang" }
]
keywords = ["finance", "candlestick", "mplfinance", "k-line", "stock"]
classifiers = [
  "Development Status :: 3 - Alpha",
  "Intended Audience :: Developers",
  "Intended Audience :: Financial and Insurance Industry",
  "Programming Language :: Python :: 3",
  "License :: OSI Approved :: MIT License",
  "Operating System :: OS Independent"
]


dependencies = [
  "numpy>=1.23,<3.0",
  "pandas>=2.0,<3.0",
  "matplotlib>=3.7,<4.0",
  "mplfinance>=0.12.10b0,<1.0",
]

[project.optional-dependencies]
dev = [
  "pytest>=8.0",
  "coverage>=7.0"
]

[tool.pytest.ini_options]
addopts = "-v --maxfail=3 --disable-warnings"
testpaths = ["tests"]

[tool.coverage.run]
branch = true
source = ["kbar"]

[tool.coverage.report]
show_missing = true
skip_covered = true

[tool.setuptools.packages.find]
where = ["src"]  

[project.urls]
"Homepage" = "https://github.com/tony1966/kbar/"
"Bug Tracker" = "https://github.com/tony1966/kbar/issues"
"Documentation" = "https://github.com/tony1966/kbar/#readme"


2. 修改 src/kbar/__init__.py :

修改版本號碼 :

"""
KBar: A lightweight stock candlestick plotting utility with Chinese font auto-detection.
"""

from .kbar import KBar, detect_font

__all__ = ["KBar", "detect_font"]
__version__ = "0.1.5"


3. 修改版本異動記錄檔 CHANGELOG.md : 

修改為 :

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),  
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

---

## [0.1.5] - 2025-12-24

### Changed
- 更新依賴,增加上限限制:
  - `numpy>=1.23,<3.0`
  - `pandas>=2.0,<3.0`
  - `matplotlib>=3.7,<4.0`
  - `mplfinance>=0.12.10b0,<1.0`
- 移除對 `pyarrow` 的依賴。
- 修正 `addplot()` 測試錯誤。
- 更新 `README.md` 說明與範例。

---

## [0.1.4] - 2025-11-22

### Changed
- 初版限制:
  - `numpy<2`
  - `pandas<3.0`
  - `matplotlib<4.0`
  - `pyarrow>=14.0.2`

---


4. 清理專案資料夾 & Build 專案 : 

刪除專案資料夾下前次 Build 子目錄 :
  • __pycache__ : 存放 Python 產生的 bytecode 暫存檔的目錄
  • build : 執行 python -m build 生成的中間建構資料夾
  • dist : 上次打包生成的 wheel 與 sdist
  • *.egg-info : setuptools 生成的套件資訊資料夾 (在 src 資料夾下)
用 tree 指令查看是否乾淨 :

D:\PyPi>tree kbar /f  
列出磁碟區 新增磁碟區 的資料夾 PATH
磁碟區序號為 1258-16B8
D:\PYPI\KBAR
│  .gitignore
│  CHANGELOG.md
│  LICENSE
│  pyproject.toml
│  README.md
├─src
│  └─kbar
│          kbar.py
│          __init__.py
└─tests
        test_kbar.py
        __init__.py


5. 打包專案 : 

用 python -m build 指令打包專案 : 

D:\PyPi>cd kbar

D:\PyPi\kbar>python -m build
* Creating isolated environment: venv+pip...
* Installing packages in isolated environment:
  - setuptools>=61.0
  - wheel
* Getting build dependencies for sdist...
C:\Users\tony1\AppData\Local\Temp\build-env-zqe2az72\lib\site-packages\setuptools\config\_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated
!!
... (略) ...

running install
running install_lib
creating build\bdist.win-amd64\wheel
creating build\bdist.win-amd64\wheel\kbar
copying build\lib\kbar\kbar.py -> build\bdist.win-amd64\wheel\.\kbar
copying build\lib\kbar\__init__.py -> build\bdist.win-amd64\wheel\.\kbar
running install_egg_info
Copying src\kbar.egg-info to build\bdist.win-amd64\wheel\.\kbar-0.1.5-py3.10.egg-info
running install_scripts
creating build\bdist.win-amd64\wheel\kbar-0.1.5.dist-info\WHEEL
creating 'D:\PyPi\kbar\dist\.tmp-j3a6fidi\kbar-0.1.5-py3-none-any.whl' and adding 'build\bdist.win-amd64\wheel' to it
adding 'kbar/__init__.py'
adding 'kbar/kbar.py'
adding 'kbar-0.1.5.dist-info/licenses/LICENSE'
adding 'kbar-0.1.5.dist-info/METADATA'
adding 'kbar-0.1.5.dist-info/WHEEL'
adding 'kbar-0.1.5.dist-info/top_level.txt'
adding 'kbar-0.1.5.dist-info/RECORD'
removing build\bdist.win-amd64\wheel
Successfully built kbar-0.1.5.tar.gz and kbar-0.1.5-py3-none-any.whl

用 tree 指令檢視專案目錄 : 

D:\PyPi\kbar>cd ..  
D:\PyPi>tree kbar /f     
列出磁碟區 新增磁碟區 的資料夾 PATH
磁碟區序號為 1258-16B8
D:\PYPI\KBAR
│  .gitignore
│  CHANGELOG.md
│  LICENSE
│  pyproject.toml
│  README.md
├─dist
│      kbar-0.1.5-py3-none-any.whl
│      kbar-0.1.5.tar.gz
├─src
│  ├─kbar
│  │      kbar.py
│  │      __init__.py
│  │
│  └─kbar.egg-info
│          dependency_links.txt
│          PKG-INFO
│          requires.txt
│          SOURCES.txt
│          top_level.txt
└─tests
        test_kbar.py
        __init__.py

可見已產生打包好的 whl 檔與 gz 原始碼壓縮檔. 


6. 安裝 whl 檔進行發佈前測試 :  

先解除安裝舊版 kbar :

D:\PyPi>pip uninstall kbar   
Found existing installation: kbar 0.1.4
Uninstalling kbar-0.1.4:
  Would remove:
    c:\users\tony1\appdata\local\programs\thonny\lib\site-packages\kbar-0.1.4.dist-info\*
    c:\users\tony1\appdata\local\programs\thonny\lib\site-packages\kbar\*
Proceed (Y/n)? y
  Successfully uninstalled kbar-0.1.4

從 whl 檔安裝新版 v0.1.5 版 kbar : 

D:\PyPi>cd kbar  

D:\PyPi\kbar>pip install dist\kbar-0.1.5-py3-none-any.whl  
Processing d:\pypi\kbar\dist\kbar-0.1.5-py3-none-any.whl
Requirement already satisfied: numpy<3.0,>=1.23 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from kbar==0.1.5) (1.26.4)
Requirement already satisfied: pandas<3.0,>=2.0 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from kbar==0.1.5) (2.3.1)
Requirement already satisfied: matplotlib<4.0,>=3.7 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from kbar==0.1.5) (3.10.5)
Requirement already satisfied: mplfinance<1.0,>=0.12.10b0 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from kbar==0.1.5) (0.12.10b0)
Requirement already satisfied: contourpy>=1.0.1 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (1.3.2)
Requirement already satisfied: cycler>=0.10 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (4.59.1)
Requirement already satisfied: kiwisolver>=1.3.1 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (1.4.9)
Requirement already satisfied: packaging>=20.0 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (25.0)
Requirement already satisfied: pillow>=8 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (11.3.0)
Requirement already satisfied: pyparsing>=2.3.1 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from matplotlib<4.0,>=3.7->kbar==0.1.5) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from pandas<3.0,>=2.0->kbar==0.1.5) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from pandas<3.0,>=2.0->kbar==0.1.5) (2025.2)
Requirement already satisfied: six>=1.5 in c:\users\tony1\appdata\local\programs\thonny\lib\site-packages (from python-dateutil>=2.7->matplotlib<4.0,>=3.7->kbar==0.1.5) (1.17.0)
Installing collected packages: kbar
Successfully installed kbar-0.1.5

進入 REPL 檢視 kbar 的 __version__ 屬性 : 

d:\PyPi\kbar>python     
Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import kbar     
>>> kbar.__version__    
'0.1.5'

用 kbar 繪製 K 線圖 : 

# kbar_test.py
from kbar import KBar   
import yfinance as yf   
df=yf.download('0050.TW', start='2024-07-01', end='2024-08-21', auto_adjust=False)   
df.columns=df.columns.map(lambda x: x[0])    # 改成舊版單層索引
kb=KBar(df)    # 未傳 font 參數預設使用正黑體
kb.plot(title='台灣五十(0050.TW)', volume=True)




7. 發佈到 PyPI 進行升版 :  

利用 twine 套件將專案上傳到 PyPI : 

D:\PyPi\kbar>python -m twine upload dist/*    
Uploading distributions to https://upload.pypi.org/legacy/
Enter your API token:   (按 Ctrl+V 貼上 PyPI API Token 按 Enter )
Uploading kbar-0.1.5-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.2/17.2 kB • 00:00 • ?
Uploading kbar-0.1.5.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 19.2/19.2 kB • 00:00 • ?

View at:




然後到 Pi 3 主機安裝 kbar : 

pi@kaopi3:~ $ pip install kbar
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting kbar
  Using cached kbar-0.1.5-py3-none-any.whl.metadata (6.1 kB)
Requirement already satisfied: numpy<3.0,>=1.23 in ./.local/lib/python3.9/site-packages (from kbar) (1.26.4)
Requirement already satisfied: pandas<3.0,>=2.0 in ./.local/lib/python3.9/site-packages (from kbar) (2.0.3)
Requirement already satisfied: matplotlib<4.0,>=3.7 in ./.local/lib/python3.9/site-packages (from kbar) (3.9.4)
Requirement already satisfied: mplfinance<1.0,>=0.12.10b0 in ./.local/lib/python3.9/site-packages (from kbar) (0.12.10b0)
Requirement already satisfied: contourpy>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (1.3.0)
Requirement already satisfied: cycler>=0.10 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (4.60.2)
Requirement already satisfied: kiwisolver>=1.3.1 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (1.4.7)
Requirement already satisfied: packaging>=20.0 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (25.0)
Requirement already satisfied: pillow>=8 in /usr/lib/python3/dist-packages (from matplotlib<4.0,>=3.7->kbar) (8.1.2)
Requirement already satisfied: pyparsing>=2.3.1 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (3.3.1)
Requirement already satisfied: python-dateutil>=2.7 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (2.9.0.post0)
Requirement already satisfied: importlib-resources>=3.2.0 in ./.local/lib/python3.9/site-packages (from matplotlib<4.0,>=3.7->kbar) (6.5.2)
Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas<3.0,>=2.0->kbar) (2025.2)
Requirement already satisfied: tzdata>=2022.1 in ./.local/lib/python3.9/site-packages (from pandas<3.0,>=2.0->kbar) (2025.3)
Requirement already satisfied: zipp>=3.1.0 in ./.local/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib<4.0,>=3.7->kbar) (3.23.0)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib<4.0,>=3.7->kbar) (1.16.0)
Using cached kbar-0.1.5-py3-none-any.whl (7.9 kB)
Installing collected packages: kbar
Successfully installed kbar-0.1.5

少了不需要的 pyarrow 很快就把 kbar 裝好了. 

升版完成收工. 

2025年12月23日 星期二

樹莓派 Pi 3 A+ 燒錄 Bulleye OS

昨天將高雄 Pi 3 改裝 Raspberry Pi OS Bulleye 後順利讓這塊主機滿血復活, 又可以重新投入爬蟲作業了. 我其實是先找一片放了很久的 8GB TF 卡來測試, 成功後把原本的 32GB 卡 (Buster) 改燒 Bulleye, 取下來的 8GB Bulleye 就拿來給 Pi 3A+ 用吧! 之前因為考量它只有 512GB DRAM 跑桌面效能不佳, 所以改燒錄 Trixie Lite 來用, 但沒桌面環境必須透過 ngrok 提供 TCP 連接真的有點麻煩, 參考 :


由於 Pi 3B 與 Pi 3A+ 除了 USB 等介面埠差異外, 硬體上只有 DRAM 容量不同 (1GB vs 512MB) 而已, 所以 TF 卡直接移過去就可以用了, 由於 DRAM 少一半, 用 pip 安裝較大的套件時可能會爆掉, 所以要利用 TF 卡記憶體來分擔暫存區負荷. 

先在使用者根目錄下建立一個 disk_tmp 資料夾 :

pi@pi3aplus:~ $ mkdir -p ~/disk_tmp  

用 nano 編輯 .bashrc 檔 : 

pi@pi3aplus:~ $ nano ~/.bashrc 

在檔案最末端加上如下設定 :

export TMPDIR=~/disk_tmp
export TMP=~/disk_tmp
export TEMP=~/disk_tmp

存檔後跳出 nano, 執行 .bashrc 檔 : 

pi@pi3aplus:~ $ source ~/.bashrc  

由於之前此 8GB TF 卡在 Pi 3B 上就已重新安裝好 numpy 與 pandas, 所以可以直用 : 

pi@pi3aplus:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd  
>>> import numpy as np  
>>> np.__version__  
'1.26.4'
>>> pd.__version__   
'2.0.3'
>>> exit()   

其他可安裝套件與 Pi 3B 一樣, 參考 :



2025-12-30 補充 :

今天終於把要安裝的套件都順利裝完了, 準備離開五斗櫃測試台, 移到客廳去了. 


1. 爬蟲相關 :  

Bulleye 內建的 requests 與 urllib3 太舊, 執行 selenium 會報錯, 需更新 :

pip install --upgrade requests urllib3 
pip install selenium

另外需安裝 chromium 與其 web driver :

sudo apt install -y chromium chromium-driver 

安裝 scrapy 之前須先安裝 libffi-dev 套件, 否則會因缺失 cffi 而失敗 :

sudo apt-get update
sudo apt-get install libffi-dev
pip install scrapy


2. 資料科學 & 機器學習 :  

Bulleye 內建 numpy (無 pandas), 但版本太舊安裝 pandas 會失敗, 先移除 : 

pip uninstall -y numpy
pip uninstall -y numpy --user 
sudo apt remove -y python3-numpy

檢查有無殘餘垃圾 & 清理 cache : 

find ~/.local/lib/python3.9/site-packages/ -name "numpy*" -o -name "pandas*"
pip cache purge

安裝 pandas 要用到的 C 擴充套件 :

sudo apt-get install libatlas-base-dev 

安裝指定版本的 numpy 與 pandas :

pip install --no-cache-dir "numpy<2.0" "pandas<2.1" 

其他套件 : 

pip install bokeh
pip install plotly

seaborn, scipy, scikit-learn 是 pyfolio-reloaded 的依賴套件, matplotlib 是 gradio 依賴套件, 不需要單獨安裝. 


3. 架站套件 :  

Bulleye 已內建 Flask, 但無 Django 與 gradio :

pip install django

在 Bulleye 的 Python 3.9 安裝 gradio 只能到 4.44.1, 無法到最新版, 安裝完須將依賴的 markupsafe 版本降至 2.0.1 與把 huggingface_hub 降至舊版 0.36, 否則匯入 gradio 時會報錯 :  

pip install gradio
pip install markupsafe==2.0.1
python -m pip install "huggingface_hub<1.0" --upgrade --no-cache-dir 

這會安裝 huggingface_hub-1.2.3, 完成後用下列指令檢查是否可正常匯入 :

pi@kaopi3:~ $ python -c "import gradio; print('成功!版本:', gradio.__version__)"   
成功!版本: 4.44.1


4. 量化投資 :

pip install twstock
pip install mplfinance
pip install ta
pip install kbar
pip install backtrader
pip install pyfolio-reloaded

yfinance 雖然可安裝, 但在 Bulleye 上無法搭配 curl_cffi 抓到股票資料, 故放棄安裝. 


5. Bot 套件 : 

pip install line-bot-sdk
pip install python-telegram-bot


6. LLM 套件 : 

pip install openai
pip install google-generativeai

用 df -h 檢查 SD 卡使用情形 :

pi@pi3aplus:~ $ df -h  
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root       7.1G  4.0G  2.8G   60% /
devtmpfs         85M     0   85M    0% /dev
tmpfs           214M     0  214M    0% /dev/shm
tmpfs            86M  1.1M   85M    2% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
/dev/mmcblk0p1  255M   51M  205M   20% /boot
tmpfs            43M   20K   43M    1% /run/user/1000

用掉 6 成, 剩下 2.8GB 可用. 

2025年12月22日 星期一

樹莓派 Pi 3 燒錄 Bulleye OS (Debian 11)

月初高雄家裝了光世代後, 高雄這台 Pi 3 主機就連不上新網路, 原因是我之前設定了固定 IP 192.168.2.193, 想改卻因為 X11 視窗異常無法進入終端機, 兩周前乾脆找了一張 TF 卡燒錄 32 位元的新版 Trixie OS, 測試發現Trixie OS 較吃記憶體, 跑 Selenium 爬蟲程式跑了超長的 20 幾分鐘才跑完 (Pi 400 大約 3 分鐘). 我想還是燒錄較舊的 OS 為宜, 就問 AI 在 Bookworm 以前的 Legacy Raspberry Pi OS 是 Buster 嗎? 它回覆是 Bulleye, 於是我去官網下載映像檔來燒錄 :




Bulleye 最後一版是 2025-05-07 發布的, 下載 .xz 檔解壓縮為 .img 檔 :





然後用 Raspberry Pi Imager 軟體選擇自定義映像檔來燒錄 :





注意要選對 drive 為 TF 卡驅動 :







燒錄完畢放入 Pi 3 開機, 依導引做完國家, 語系, 鍵盤, 與 WiFi 設定後重開機, 再用 sudo raspi-config 指令設定 :
  • 開啟 SSH
  • 開啟 VNC Viewer/Server
  • 設定 hostname
完成後重開機, 桌面如下 :




用 sudo vnclicensewiz 指令或直接按右上角 VNC 圖示登入 VNC Cloud 帳戶以便進行遠端桌面存取, 使用 yahoo 郵件帳號登入 (目前收容 Mapleboard 而已), 完成後改用筆電遠端無頭存取. 

先檢查系統與 OS :

pi@kaopi3:~ $ uname -a  
Linux kaopi3 6.1.21-v7+ #1642 SMP Mon Apr  3 17:20:52 BST 2023 armv7l GNU/Linux 
pi@kaopi3:~ $ lsb_release -a  
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
pi@kaopi3:~ $ cat /etc/issue  
Raspbian GNU/Linux 11 \n \l
pi@kaopi3:~ $ cat /etc/debian_version   
11.11
pi@kaopi3:~ $ cat /etc/os-release   
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

可見 CPU 為 ARMv71 架構, OS 為代號 Bulleye 的 Raspberry Pi OS (Debian 11.11), 檢查內建 Python 為 3.9.2 版, 應該還不算太舊 : 

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()   

檢查內建 Python 套件 : 

pi@kaopi3:~ $ pip list  
Package           Version
----------------- ---------
arandr            0.1.10
astroid           2.5.1
asttokens         2.0.4
automationhat     0.2.0
beautifulsoup4    4.9.3
blinker           1.4
blinkt            0.1.2
buttonshim        0.0.2
Cap1xxx           0.1.3
certifi           2020.6.20
chardet           4.0.0
click             7.1.2
colorama          0.4.4
colorzero         1.1
cryptography      3.3.2
cupshelpers       1.0
dbus-python       1.2.16
distro            1.5.0
docutils          0.16
drumhat           0.1.0
envirophat        1.0.0
ExplorerHAT       0.4.2
Flask             1.1.2
fourletterphat    0.1.0
gpiozero          1.6.2
html5lib          1.1
idna              2.10
isort             5.6.4
itsdangerous      1.1.0
jedi              0.18.0
Jinja2            2.11.3
lazy-object-proxy 0.0.0
logilab-common    1.8.1
lxml              4.6.3
MarkupSafe        1.1.1
mccabe            0.6.1
microdotphat      0.2.1
mote              0.0.4
motephat          0.0.3
mypy              0.812
mypy-extensions   0.4.3
numpy             1.19.5
oauthlib          3.1.0
pantilthat        0.0.7
parso             0.8.1
pexpect           4.8.0
pgzero            1.2
phatbeat          0.1.1
pianohat          0.1.0
picamera          1.13
picamera2         0.3.12
pidng             4.0.9
piexif            1.1.3
piglow            1.2.5
pigpio            1.78
Pillow            8.1.2
pip               20.3.4
psutil            5.8.0
pycairo           1.16.2
pycups            2.0.1
pygame            1.9.6
Pygments          2.7.1
PyGObject         3.38.0
pyinotify         0.9.6
PyJWT             1.7.1
pylint            2.7.2
PyOpenGL          3.1.5
pyOpenSSL         20.0.1
PyQt5             5.15.2
PyQt5-sip         12.8.1
pyserial          3.5b0
pysmbc            1.0.23
python-apt        2.2.1
python-prctl      1.7
rainbowhat        0.1.0
reportlab         3.5.59
requests          2.25.1
requests-oauthlib 1.0.0
responses         0.12.1
roman             2.0.0
RPi.GPIO          0.7.0
RTIMULib          7.2.1
scrollphat        0.0.7
scrollphathd      1.2.1
Send2Trash        1.6.0b1
sense-hat         2.6.0
setuptools        52.0.0
simplejpeg        1.6.4
simplejson        3.17.2
six               1.16.0
skywriter         0.0.7
sn3218            1.2.7
soupsieve         2.2.1
spidev            3.5
ssh-import-id     5.10
thonny            4.0.1
toml              0.10.1
touchphat         0.0.1
twython           3.8.2
typed-ast         1.4.2
typing-extensions 3.7.4.3
unicornhathd      0.0.4
urllib3           1.26.5
v4l2-python3      0.3.2
webencodings      0.5.1
Werkzeug          1.0.1
wheel             0.34.2
wrapt             1.12.1

樹莓派 OS 是自下一版 Bookworm 才開始遵循 PEP 668 規範, 因此可以直接用 pip 安裝套件. 由於 Pi 3 主機我主要是拿來當爬蟲用, 爬靜態網頁用的 requests 與 beautifulsoup 都已內建, 但爬動態網頁用的 selenium 卻沒有, 所以先安裝此套件 : 

pi@kaopi3:~ $ pip install selenium   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting selenium
  Downloading https://www.piwheels.org/simple/selenium/selenium-4.36.0-cp39-cp39-linux_armv7l.whl (3.0 MB)
... (略) ...
Successfully installed attrs-25.4.0 certifi-2025.11.12 exceptiongroup-1.3.1 h11-0.16.0 outcome-1.3.0.post0 pysocks-1.7.1 selenium-4.36.0 sniffio-1.3.1 sortedcontainers-2.4.0 trio-0.31.0 trio-websocket-0.12.2 typing-extensions-4.15.0 urllib3-2.6.2 websocket-client-1.9.0 wsproto-1.2.0

跑 selenium 爬蟲還需安裝 chromium 與其 web driver : 

pi@kaopi3:~ $ sudo apt install -y chromium chromium-driver   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra libfuse2
Use 'sudo apt autoremove' to remove them.
... (略) ...
設定 chromium-driver (106.0.5249.119-1~deb11u1) ...
執行 man-db (2.9.4-2) 的觸發程式……
執行 mailcap (3.69) 的觸發程式……
執行 fontconfig (2.13.1-4.2) 的觸發程式……
執行 desktop-file-utils (0.26-1) 的觸發程式……
執行 hicolor-icon-theme (0.17-2) 的觸發程式……
執行 gnome-menus (3.36.0-1) 的觸發程式……
執行 libc-bin (2.31-13+rpt2+rpi1+deb11u11) 的觸發程式……

此外爬蟲結果會利用 Telegram 與 LINE 傳送訊息, 所以要安裝 SDK 套件 :

pi@kaopi3:~ $ pip install python-telegram-bot   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting python-telegram-bot
... (略)...
Requirement already satisfied: typing_extensions>=4.5 in ./.local/lib/python3.9/site-packages (from anyio->httpx<0.29,>=0.27->python-telegram-bot) (4.15.0)
Installing collected packages: httpcore, anyio, httpx, python-telegram-bot
  WARNING: The script httpx is installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed anyio-4.12.0 httpcore-1.0.9 httpx-0.28.1 python-telegram-bot-22.5

pi@kaopi3:~ $ pip install line-bot-sdk   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: line-bot-sdk in ./.local/lib/python3.9/site-packages (3.21.0)
... (略)...

然後將最新版市圖爬蟲程式 ksml_lib_12.py 上傳到 Pi 3, 參考 :


執行結果如下 :

pi@kaopi3:~ $ python ksml_lib_12.py faxxxxxx 5xxxxx  
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': 'faxxxxxx 的資料已更新', 'status': 'success'}
執行時間:688.519543170929
pi@kaopi3:~ $ python ksml_lib_12.py 0xxxxx8 9xxxx7   
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': '0xxxxx8 的資料已更新', 'status': 'success'}
執行時間:117.28702139854431
pi@kaopi3:~ $ python ksml_lib_12.py 0xxxxx9 8xxxx6  
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': '0xxxxx9 的資料已更新', 'status': 'success'}
執行時間:90.50973629951477

借的書越多耗費時間越長 (第一個帳號約 10 分鐘), 但比 Trixie 下要快些了. 

最後上傳母校圖書館爬蟲 :


pi@kaopi3:~ $ python nkust_lib_10.py   
按其他讀者 ... OK
登入系統 ... OK
按名字顯現選單 ... OK
按我的借閱 ... OK
按全部續借 ... OK
搜尋被預約書籍 ... OK
訊息傳送成功!

2025-12-20 21:02:03
被預約的書:
 1. 持續買進 : 資料科學家的投資終極解答, 存錢及致富的實證方法 / 尼克.馬朱利(Nick Maggiulli)著 ; 李芳齡譯 (c.3) 到期日: 12/31/2025
執行時間:401.9524688720703

這樣算是把這片 Pi 3 主機拉回運行軌道了. 


2025-12-22 補充 :

在用 pip 安裝套件時出現如下 warning :

  WARNING: The script wsdump is installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

消除此警告的方法是執行下列兩個指令 : 

pi@kaopi3:~ $ export PATH=$PATH:/home/pi/.local/bin    
pi@kaopi3:~ $ source ~/.bashrc

其次是內建套件無 pandas, 但有 numpy 1.19.5, 與此 numpy 搭配的是 pandas 1.3.5 :

pi@kaopi3:~ $ pip install pandas==1.3.5  
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pandas==1.3.5
... (略) ...
Installing collected packages: pytz, python-dateutil, pandas
Successfully installed pandas-1.3.5 python-dateutil-2.9.0.post0 pytz-2025.2

但安裝完匯入 pandas 卻出現錯誤 :

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/__init__.py", line 22, in <module>
    from pandas.compat import (
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/compat/__init__.py", line 15, in <module>
    from pandas.compat.numpy import (
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/compat/numpy/__init__.py", line 7, in <module>
    from pandas.util.version import Version
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/util/__init__.py", line 1, in <module>
    from pandas.util._decorators import (  # noqa
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/util/_decorators.py", line 14, in <module>
    from pandas._libs.properties import cache_readonly  # noqa
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/_libs/__init__.py", line 13, in <module>
    from pandas._libs.interval import Interval
  File "pandas/_libs/interval.pyx", line 1, in init pandas._libs.interval
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 48 from C header, got 40 from PyObject

解決之道是須先安裝 libatlas-base-dev 套件 :

pi@kaopi3:~ $ sudo apt-get install libatlas-base-dev   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra libfuse2
Use 'sudo apt autoremove' to remove them.
下列的額外套件將被安裝:
  libatlas3-base
建議套件:
  libatlas-doc liblapack-doc
下列【新】套件將會被安裝:
  libatlas-base-dev libatlas3-base
升級 0 個,新安裝 2 個,移除 0 個,有 0 個未被升級。
需要下載 5,055 kB 的套件檔。
此操作完成之後,會多佔用 26.5 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] y
下載:1 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libatlas3-base armhf 3.10.3-10+rpi1 [2,454 kB]
下載:2 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libatlas-base-dev armhf 3.10.3-10+rpi1 [2,601 kB]
取得 5,055 kB 用了 8s (664 kB/s)                                                            
選取了原先未選的套件 libatlas3-base:armhf。
(讀取資料庫 ... 目前共安裝了 107532 個檔案和目錄。)
正在準備解包 .../libatlas3-base_3.10.3-10+rpi1_armhf.deb……
Unpacking libatlas3-base:armhf (3.10.3-10+rpi1) ...
選取了原先未選的套件 libatlas-base-dev:armhf。
正在準備解包 .../libatlas-base-dev_3.10.3-10+rpi1_armhf.deb……
Unpacking libatlas-base-dev:armhf (3.10.3-10+rpi1) ...
設定 libatlas3-base:armhf (3.10.3-10+rpi1) ...
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so.3 來提供 /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf)
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so.3 來提供 /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf)
設定 libatlas-base-dev:armhf (3.10.3-10+rpi1) ...
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so 來提供 /usr/lib/arm-linux-gnueabihf/libblas.so (libblas.so-arm-linux-gnueabihf)
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so 來提供 /usr/lib/arm-linux-gnueabihf/liblapack.so (liblapack.so-arm-linux-gnueabihf)
執行 libc-bin (2.31-13+rpt2+rpi1+deb11u13) 的觸發程式……

然後移除內建的 numpy, 重新安裝 numpy 1.19.5 :

pi@kaopi3:~ $ pip3 uninstall -y pandas numpy  
pip3 uninstall -y pandas numpy --user  
sudo apt remove -y python3-numpy python3-pandas   
Found existing installation: pandas 1.3.5 
Uninstalling pandas-1.3.5:
  Successfully uninstalled pandas-1.3.5
Found existing installation: numpy 1.19.5
Uninstalling numpy-1.19.5:
  Successfully uninstalled numpy-1.19.5

Usage:   
  pip3 uninstall [options] <package> ...
  pip3 uninstall [options] -r <requirements file> ...

no such option: --user
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
Package 'python3-numpy' is not installed, so not removed
Package 'python3-pandas' is not installed, so not removed
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra freeglut3 libfuse2 libglu1-mesa libmikmod3 libportmidi0
  libqt5designer5 libqt5help5 libqt5test5 librtimulib-dev librtimulib-utils librtimulib7
  libsdl-mixer1.2 libsdl-ttf2.0-0 libturbojpeg0 python3-kms++ python3-libcamera
  python3-opengl python3-piexif python3-prctl python3-pyqt5 python3-pyqt5.sip
  python3-rtimulib python3-v4l2
Use 'sudo apt autoremove' to remove them.
升級 0 個,新安裝 0 個,移除 0 個,有 0 個未被升級。

檢查有無殘餘垃圾 & 清理 cache : 

pi@kaopi3:~ $ find ~/.local/lib/python3.9/site-packages/ -name "numpy*" -o -name "pandas*"
pi@kaopi3:~ $ pip cache purge  
Files removed: 6

重新安裝 numpy 與 pandas :

pi@kaopi3:~ $ pip3 install --no-cache-dir "numpy<2.0" "pandas<2.1"  
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting numpy<2.0
  Downloading https://www.piwheels.org/simple/numpy/numpy-1.26.4-cp39-cp39-linux_armv7l.whl (5.6 MB)
Collecting pandas<2.1
  Downloading https://archive1.piwheels.org/simple/pandas/pandas-2.0.3-cp39-cp39-linux_armv7l.whl (38.7 MB)
  Downloading https://www.piwheels.org/simple/tzdata/tzdata-2025.3-py2.py3-none-any.whl (348 kB)
Requirement already satisfied: python-dateutil>=2.8.2 in ./.local/lib/python3.9/site-packages (from pandas<2.1) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas<2.1) (2025.2)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.8.2->pandas<2.1) (1.16.0)
Installing collected packages: tzdata, numpy, pandas
Successfully installed numpy-1.26.4 pandas-2.0.3 tzdata-2025.3

此處指定 numpy 低於 2.0; pandas 低於 2.1 是因為 numpy 2.x 目前在 ARM 舊系統很容易出現衝突錯誤, 而 pandas 2.1+ 則會拉高 numpy 需求, 安裝版本為 numpy-1.26.4 pandas-2.0.3.

測試已可正常匯入 :

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd  
>>> import numpy as np    
>>> pd.__version__  
'2.0.3'
>>> np.__version__  
'1.26.4'

以下整理在 Bulleye OS 下安裝的套件模組, 先更新 pip : 

python -m pip install --upgrade pip  


1. 爬蟲相關 :  

Bulleye 內建的 requests 與 urllib3 太舊, 執行 selenium 會報錯, 需更新 :

pip install --upgrade requests urllib3 
pip install selenium

另外需安裝 chromium 與其 web driver :

sudo apt install -y chromium chromium-driver 

安裝 scrapy 之前須先安裝 libffi-dev 套件, 否則會因缺失 cffi 而失敗 :

sudo apt-get update
sudo apt-get install libffi-dev
pip install scrapy


2. 資料科學 & 機器學習 :  

Bulleye 內建 numpy (無 pandas), 但版本太舊安裝 pandas 會失敗, 先移除 : 

pip uninstall -y numpy
pip uninstall -y numpy --user 
sudo apt remove -y python3-numpy

檢查有無殘餘垃圾 & 清理 cache : 

find ~/.local/lib/python3.9/site-packages/ -name "numpy*" -o -name "pandas*"
pip cache purge

安裝 pandas 要用到的 C 擴充套件 :

sudo apt-get install libatlas-base-dev 

安裝指定版本的 numpy 與 pandas :

pip install --no-cache-dir "numpy<2.0" "pandas<2.1" 

其他套件 : 

pip install bokeh
pip install plotly

seaborn, scipy, scikit-learn 是 pyfolio-reloaded 的依賴套件, matplotlib 是 gradio 依賴套件, 不需要單獨安裝. 


3. 架站套件 :  

Bulleye 已內建 Flask, 但無 Django 與 gradio :

pip install django

在 Bulleye 的 Python 3.9 安裝 gradio 只能到 4.44.1, 無法到最新版, 安裝完須將依賴的 markupsafe 版本降至 2.0.1 與把 huggingface_hub 降至舊版 0.36, 否則匯入 gradio 時會報錯 :  

pip install gradio
pip install markupsafe==2.0.1
python -m pip install "huggingface_hub<1.0" --upgrade --no-cache-dir 

這會安裝 huggingface_hub-1.2.3, 完成後用下列指令檢查是否可正常匯入 :

pi@kaopi3:~ $ python -c "import gradio; print('成功!版本:', gradio.__version__)"   
成功!版本: 4.44.1


4. 量化投資 :

yfinance 雖然可安裝, 但在 Bulleye 上無法搭配 curl_cffi 抓到股票資料, 故放棄安裝. 

pip install yfinance
pip install twstock
pip install mplfinance
pip install ta
pip install kbar
pip install backtrader
pip install pyfolio-reloaded


5. Bot 套件 : 

pip install line-bot-sdk
pip install python-telegram-bot


6. LLM 套件 : 

pip install openai
pip install google-generativeai

除了爬蟲套件以外, 其他都只是測試看看 Bulleye 多舊而已, 備而不用.