2022年10月30日 星期日

儲能型太陽能系統安裝 (七)

本周末的安裝進度主要是週六車庫照明的配線, 今天則是頂樓配電盤的規劃與元件安裝. 昨天中午回到鄉下老家, 午飯後就開始拉車庫兩個照明燈的線, 為了保留用智慧插座進行自動與遠端控制的彈性, 所以採用兩孔插座而非分電盤, LED 燈接上插頭插在插座上, 等我智慧插座完成再串接智慧插座. 由於傍晚要去爬山 (趁沒下雨), 所以下午只完成一個 LED 燈配線, 晚飯後繼續拉第二個燈的線, 挑燈夜戰終於在九點半完成, 開關插座盒也鎖上牆壁, 然後做了一條兩頭都是插頭的線將市電從隔壁插座接進太陽能供電迴路, 測試浴室, 車庫與舊豬舍廁所的 LED 燈操控均正常. 表示這部分的配線沒問題 :  





由於 LED 燈裝在較低的鋼樑上, 所以 16W 的 LED 燈似乎比 40W 的日光燈還亮呢. 

今天下午則是轉移戰場回頂樓去規劃配電盤上各元件的位置, 這需要考量線路圖拉線的方便與電池線長度問題, 經過來回擺置確定最佳位置後將元件鎖在配電盤上 : 




無熔絲開關 NFB 的固定方式較特殊, 先盒內附的兩個鐵片折斷為四片, 然後插入上下方的四個溝槽再用螺絲鎖緊上下扣住即可 :




ATS 則是用左側上下兩個孔鎖緊即可, 它左側有六個接點兩個一組, 由上而下分別是 A 電源 (主電源), 負載, 以及 B 電源 (備用), 逆變器輸出經電表後接到 A 主電源, 市電接底下 B 副電源 (即平時由電池供電, 當電池電壓降到保護點後逆變器 OFF 改由市電供電), 中間的負載接點先拉到 NFB 後再接負載  :




鎖好元件後首先測試逆變器接電池功能正常, 其次測試充電控制器也正常, 這是今天最主要的項目, 因為上週到貨之後想測試卻沒時間, 所以蝦皮那邊我按了延後支付功能, 結案到期日就是今天, 所以務必今天完成開機測試. 做完這些已傍晚, 剩下的接線作業就留待下周完成了, 樂觀估計下周可上板送電, 配電盤各元件線路圖如下 : 




圖中的電壓電流功率表還沒安裝上去, 它沒有提供固定用的孔洞, 需要用一字鐵片箍住面板兩側鎖在木作的配電盤上, 其接點在右側共四個, 下方兩個接 AC 電源, 另附一個測電流的封閉式 CT 需穿過一條 AC 電源線, 兩條感應線要接在上方的兩個接點 :




今天跑了兩趟小漢, 買束線帶, 開關插座盒, 白鐵線, 分電盤, 開關, 螺絲等零件花了 426 元. 下周還得去一趟仁武剪兩條 150cm 的電池至逆變器接線. 

2022年10月29日 星期六

聞笛

最近想起學生時代聽過鳳飛飛唱過一首詩歌但忘記歌名, 只記得歌詞中有 "賦就一篇懷馬融", 查詢網路後才想起歌名為 "聞笛" : 





小調風格的曲非常悠揚, 詞則是晚唐詩人趙嘏寫的 "聞笛" : 

誰家吹笛畫樓中    斷續聲隨斷續風 
響遏行雲橫碧落    清和冷月到簾櫳 
興來三弄有桓子    賦就一篇懷馬融 
曲罷不知人在否    餘音嘹亮尚飄空

趙嘏屢試不第寓居長安多年, 終於在唐武宗會昌年間中進士, 他與詩人元稹交好, 在政治上卻懷才不遇, 終其一生只做到縣尉而已. 

詩中的馬融是東漢末年的經學家, 他是伏波將軍馬援的侄孫, 漢安帝時受車騎將軍鄧騭賞識入朝, 官至武都太守, 漢桓帝時遷為南郡太守, 後來得罪大將軍梁冀而遭到流放, 平反後回京任議郎. 觀其生平成就主要是經學注釋方面, 但其人似無大節, 所以還不清楚趙嘏到底懷馬融是懷念甚麼.

桓子指的是有笛聖美譽的東晉音樂家與軍事家桓伊,  據說他曾為王徽之吹奏梅花三弄, 參考 :

2022年10月28日 星期五

好書 : Mastering Financial Pattern Recognition

Oreilly 最近出版了一本 K 線形態學的好書 : 



Source : Oreilly


作者 Sofien Kaabar 是一位長期研究技術分析的美國金融分析師 (CFA), 他綜合了許多已知 K 線型態與自己發掘的證驗型態寫成本書, 書中以 Python 範例程式碼實作 (友善!), 提供可從數據中掃描與回測特定 K 線型態的演算法, 是一本不可多得的 rule-based 量化交易好書. 

書中範例可從 GitHub 下載 : 


2022年10月27日 星期四

煙雨唱揚州

我最近在臉書看到中國的短視頻作者 "鄉愁沈丹" 分享的料理與山居生活影片, 覺得她跟李子柒很像, 李子柒仙氣飄飄, 沈丹則親民些, 都是非常能幹的女人. 沈丹住在福建武夷山區, 煮菜, 製餅, 開貨車, 騎重機載貨, 感覺幾乎什麼活都很行. 

我在其中一集製作南瓜餅的影片中發現其配樂非常好聽但不知其名, 靈機一動往留言區一找, 果然早就有人問過了, 原來是李殊原唱的 "煙雨唱揚州" :





李殊唱的版本聽來溫柔婉約, 但我比較喜歡沈丹影片中葛漂亮唱的版本 :

她在高音的時候會轉假音, 蠻好聽的.  

詞 : 張子恩 & 童邊       曲 : 雷蕾

風吹雲動天不動
水推船移岸不移
刀切蓮藕絲不斷
山高水遠情不離
雨綿綿情依依
多少故事在心裡
五月煙雨濛濛唱揚州
百年巧合話驚奇

善惡皆會得報應
禍福自然有天理
姻緣樁樁似線牽
萬事幽幽當自立
雨綿綿情依依
多少故事在心裡
五月煙雨濛濛唱揚州
百年巧合話驚奇

雨綿綿情依依
多少故事在心裡
五月煙雨濛濛唱揚州
百年巧合話驚奇
百年巧合話驚奇

2022 年第 43 周記事

最近開始感受到寒意, 已經改洗熱水了. 秋分後晝短夜長, 傍晚下班後去河堤快走已夜色低垂, 同樣是五點半, 我比較喜歡夏天天色很亮, 陽光斜射時運動, 視線好遠遠就能看到自行車與行人, 感覺比較有安全感. 

兩周前拿到岳母種的南瓜, 體型超大, 剛拿來時是綠皮黃色條紋的, 看起來很亮眼, 但放了一陣子後綠皮不見了, 轉成灰色, 這周末要拿來煮南瓜濃湯, 保留種子丟菜園試種看看 : 




阿蘭膀胱結石問題周二下午住院, 週四出院, 住院費 2000 餘元, 看護費 3400 元. 感謝看護林大姐遠從萬丹過來幫忙, 也幫阿蘭擦背, 但只做一天實在不好意思, 因曾醫師說打完雷射也許可當天出院, 那我當個一日看護好了, 但這工作很專業, 我學鼻胃管灌食就手忙腳亂, 還是讓專業的來. 

過去的兩周周末都在忙鄉下老家的太陽能儲能系統安裝工程, 這周已收到逆變器與控制器, 但週日還在忙配線, 沒有時間做測試, 週六要一早回去先測試機子再施工, 目前只剩下電壓電流功率計還沒到貨, 希望下周就能完工送電. 

這兩天在看南宮岷主演的韓劇 "千元律師", 看到第七集他的無緣未婚妻終於出現了 (李清娥好有氣質,  越看越像崔智友), 他會棄檢察官改當律師應該跟前女友之死有關吧? 以前看 "監獄醫生" 就發現他演技真不錯, 聽說最近結婚了. 第六集李帝勳有出現客串(信號 2 怎還不出來, 哈哈).

這幾天想說把從母校借的 Bootstrap 書中範例剩下的兩個 (Jumbotron 與 Carousel) 測試一下, 把上回幫客家語文學會授課的 GitHub 架站教學網頁完善後就要還書了, 完成 Jumbotron 後喜孜孜地認為要搞定了, 卻在 Carrousel 踢到鐵板, 奇怪了, 圖片輪播效果就是出不來, 網頁碼也沒報錯, 置換 Javascript 也無效, 而測試書中範例就 OK, 太奇怪了, 受挫之餘只好看韓劇擺爛. 不過, 今天決定算了, 先到 Jumbotron 封存吧! 可能是版本問題, 有空再研究, 人生還是要前進, 也不能一直擺爛, 哈哈. 


本機專案資料夾 : D:\test\html\github_page 

2022年10月25日 星期二

Mapleboard MP510-50 開機測試 (一)

我在 6 月時買的 Mapleboard MP510-50 一直都沒時間用, 今天晚上備齊鍵鼠組與 WiFi 網卡進行首次開機測試, 順利開機後出現此電腦內建的 Ubuntu Mate 作業系統 v22.04 LTS 畫面 :





開啟終端機用 uname 指令查詢 OS 系統資訊 :

one@LX2438:~$ uname -a  
Linux LX2438 5.15.74-mp510+ #1 SMP PREEMPT Tue Oct 18 09:02:35 CST 2022 aarch64 aarch64 aarch64 GNU/Linux

可見這塊源自 Banana Pi 的板子是 64 位元的系統. 其中 Linux 後面的 LX2438 是主機名稱 (host name), 亦即當透過網路連線此電腦 (例如 TeamViewer 或 VNC 等) 時所顯示的主機名稱, 可以參考下面這篇文章用 sudo gedit /etc/hostname 指令修改 host name :


但這名稱也沒有很奇怪, 所以暫時保持預設不改.

這個微電腦是在 PCHome 上買的, 參考 : 


初步測試發現此微電腦預設有開啟 SSH, 可用 Putty 連線進去遠端操控, 預設帳號是 one, 密碼是 1234, 可見欣使用者後刪除此帳號以策安全, 參考 :

 
連線 IP 會顯示在面板上 : 




可見面板會依序顯示時間, 溫度, 以及 IP.

但是目前存在幾個問題 : 

1. WiFi 連線問題 :

插 WiFi 網卡 (Logitech, Fast, EDIMAX) 都沒抓到, 目前只能用有線網路上網. 參考下面這篇文章沒用, 也找不到網卡 :


明天再打電話問原廠要怎麼做. 



2. 螢幕有時可能會無信號 :

我關機重開都沒動到 HDMI 線, 螢幕卻顯示無信號, 解決辦法是參考官網教學關閉螢幕保護 :


2023-01-14 補充 :

此文件已被刪除, 參考 :



3. 無線鍵盤讀不到 :

i-rocks 的無線鍵鼠組只有滑鼠讀得到, 鍵盤無作用, 只好找一個 USB 鍵盤來用. 


4. 更新套件列表出現 'Unable to lock directory' 情況 : 

Last login: Tue Oct 25 23:46:39 2022 from 192.168.2.128
one@LX2017:~$ sudo apt update   
[sudo] one 的密碼:
正在讀取套件清單... 完成
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 7543 (apt-get)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/

可能還有其他問題, 等找到再補記. 

另外此電腦已搭載 Python 3.10.4 (使用 python3 指令啟動互動環境), 但 pip 要自行安裝 : 

login as: one
one@192.168.2.138's password:
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.43-mp510+ aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

324 updates can be applied immediately.
165 of these updates are standard security updates.
要檢查這些額外的更新,請執行 apt list --upgradable

Last login: Tue Oct 25 20:35:01 2022 from 192.168.2.128
one@LX2017:~$ python3   
Python 3.10.4 (main, Apr  2 2022, 09:04:19) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello')
Hello
>>> exit()  
one@LX2017:~$ pip3 list
Command 'pip3' not found, but can be installed with:
sudo apt install python3-pip

安裝 pip 的指令如下 :

sudo apt install python3-pip

one@LX2017:~$ sudo apt install python3-pip    
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成
下列的額外套件將被安裝:
  javascript-common libexpat1-dev libjs-jquery libjs-sphinxdoc
  libjs-underscore libpython3-dev libpython3-stdlib libpython3.10
  libpython3.10-dev libpython3.10-minimal libpython3.10-stdlib python3
  python3-dev python3-distutils python3-lib2to3 python3-minimal
  python3-setuptools python3-wheel python3.10 python3.10-dev
  python3.10-minimal zlib1g zlib1g-dev
建議套件:
  apache2 | lighttpd | httpd python3-doc python3-tk python3-venv
  python-setuptools-doc python3.10-venv python3.10-doc binfmt-support
下列【新】套件將會被安裝:
  javascript-common libexpat1-dev libjs-jquery libjs-sphinxdoc
  libjs-underscore libpython3-dev libpython3.10-dev python3-dev
  python3-distutils python3-pip python3-setuptools python3-wheel
  python3.10-dev zlib1g-dev
下列套件將會被升級:
  libpython3-stdlib libpython3.10 libpython3.10-minimal libpython3.10-stdlib
  python3 python3-lib2to3 python3-minimal python3.10 python3.10-minimal zlib1g
升級 10 個,新安裝 14 個,移除 0 個,有 313 個未被升級。
需要下載 15.3 MB/15.4 MB 的套件檔。
此操作完成之後,會多佔用 32.2 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] Y
下載:1 http://ports.ubuntu.com jammy-updates/main arm64 python3.10 arm64 3.10.6-1~22.04 [497 kB]
下載:2 http://ports.ubuntu.com jammy-updates/main arm64 python3-lib2to3 all 3.10.6-1~22.04 [77.6 kB]
下載:3 http://ports.ubuntu.com jammy-updates/main arm64 libpython3.10 arm64 3.10.6-1~22.04 [1,893 kB]
下載:4 http://ports.ubuntu.com jammy-updates/main arm64 libpython3.10-stdlib arm64 3.10.6-1~22.04 [1,829 kB]
下載:5 http://ports.ubuntu.com jammy-updates/main arm64 python3.10-minimal arm64 3.10.6-1~22.04 [2,244 kB]
下載:6 http://ports.ubuntu.com jammy-updates/main arm64 libpython3.10-minimal arm64 3.10.6-1~22.04 [807 kB]
下載:7 http://ports.ubuntu.com jammy-updates/main arm64 python3-minimal arm64 3.10.6-1~22.04 [24.3 kB]
下載:8 http://ports.ubuntu.com jammy-updates/main arm64 python3 arm64 3.10.6-1~22.04 [22.8 kB]
下載:9 http://ports.ubuntu.com jammy-updates/main arm64 libpython3-stdlib arm64 3.10.6-1~22.04 [6,910 B]
下載:10 http://ports.ubuntu.com jammy/main arm64 javascript-common all 11+nmu1 [5,936 B]
下載:11 http://ports.ubuntu.com jammy/main arm64 libexpat1-dev arm64 2.4.7-1 [129 kB]
下載:12 http://ports.ubuntu.com jammy/main arm64 libjs-jquery all 3.6.0+dfsg+~3.5.13-1 [321 kB]
下載:13 http://ports.ubuntu.com jammy/main arm64 libjs-underscore all 1.13.2~dfsg-2 [118 kB]
下載:14 http://ports.ubuntu.com jammy/main arm64 libjs-sphinxdoc all 4.3.2-1 [139 kB]
下載:15 http://ports.ubuntu.com jammy-security/main arm64 zlib1g-dev arm64 1:1.2.11.dfsg-2ubuntu9.2 [163 kB]
下載:16 http://ports.ubuntu.com jammy-updates/main arm64 libpython3.10-dev arm64 3.10.6-1~22.04 [4,661 kB]
下載:17 http://ports.ubuntu.com jammy-updates/main arm64 libpython3-dev arm64 3.10.6-1~22.04 [7,168 B]
下載:18 http://ports.ubuntu.com jammy-updates/main arm64 python3.10-dev arm64 3.10.6-1~22.04 [508 kB]
下載:19 http://ports.ubuntu.com jammy-updates/main arm64 python3-distutils all 3.10.6-1~22.04 [139 kB]
下載:20 http://ports.ubuntu.com jammy-updates/main arm64 python3-dev arm64 3.10.6-1~22.04 [26.0 kB]
下載:21 http://ports.ubuntu.com jammy/main arm64 python3-setuptools all 59.6.0-1.2 [339 kB]
下載:22 http://ports.ubuntu.com jammy/universe arm64 python3-wheel all 0.37.1-2 [31.9 kB]
下載:23 http://ports.ubuntu.com jammy/universe arm64 python3-pip all 22.0.2+dfsg-1 [1,306 kB]
取得 15.3 MB 用了 28s (552 kB/s)
(讀取資料庫 ... 目前共安裝了 244709 個檔案和目錄。)
正在準備解包 .../python3.10_3.10.6-1~22.04_arm64.deb……
Unpacking python3.10 (3.10.6-1~22.04) over (3.10.4-3) ...
正在準備解包 .../python3-lib2to3_3.10.6-1~22.04_all.deb……
Unpacking python3-lib2to3 (3.10.6-1~22.04) over (3.10.4-0ubuntu1) ...
正在準備解包 .../zlib1g_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb……
Unpacking zlib1g:arm64 (1:1.2.11.dfsg-2ubuntu9.2) over (1:1.2.11.dfsg-2ubuntu9) ...
設定 zlib1g:arm64 (1:1.2.11.dfsg-2ubuntu9.2) ...
(讀取資料庫 ... 目前共安裝了 244788 個檔案和目錄。)
正在準備解包 .../libpython3.10_3.10.6-1~22.04_arm64.deb……
Unpacking libpython3.10:arm64 (3.10.6-1~22.04) over (3.10.4-3) ...
正在準備解包 .../libpython3.10-stdlib_3.10.6-1~22.04_arm64.deb……
Unpacking libpython3.10-stdlib:arm64 (3.10.6-1~22.04) over (3.10.4-3) ...
正在準備解包 .../python3.10-minimal_3.10.6-1~22.04_arm64.deb……
Unpacking python3.10-minimal (3.10.6-1~22.04) over (3.10.4-3) ...
正在準備解包 .../libpython3.10-minimal_3.10.6-1~22.04_arm64.deb……
Unpacking libpython3.10-minimal:arm64 (3.10.6-1~22.04) over (3.10.4-3) ...
設定 libpython3.10-minimal:arm64 (3.10.6-1~22.04) ...
設定 python3.10-minimal (3.10.6-1~22.04) ...
(讀取資料庫 ... 目前共安裝了 244788 個檔案和目錄。)
正在準備解包 .../python3-minimal_3.10.6-1~22.04_arm64.deb……
Unpacking python3-minimal (3.10.6-1~22.04) over (3.10.4-0ubuntu2) ...
設定 python3-minimal (3.10.6-1~22.04) ...
(讀取資料庫 ... 目前共安裝了 244788 個檔案和目錄。)
正在準備解包 .../00-python3_3.10.6-1~22.04_arm64.deb……
running python pre-rtupdate hooks for python3.10...
Unpacking python3 (3.10.6-1~22.04) over (3.10.4-0ubuntu2) ...
正在準備解包 .../01-libpython3-stdlib_3.10.6-1~22.04_arm64.deb……
Unpacking libpython3-stdlib:arm64 (3.10.6-1~22.04) over (3.10.4-0ubuntu2) ...
選取了原先未選的套件 javascript-common。
正在準備解包 .../02-javascript-common_11+nmu1_all.deb……
解開 javascript-common (11+nmu1) 中...
選取了原先未選的套件 libexpat1-dev:arm64。
正在準備解包 .../03-libexpat1-dev_2.4.7-1_arm64.deb……
解開 libexpat1-dev:arm64 (2.4.7-1) 中...
選取了原先未選的套件 libjs-jquery。
正在準備解包 .../04-libjs-jquery_3.6.0+dfsg+~3.5.13-1_all.deb……
解開 libjs-jquery (3.6.0+dfsg+~3.5.13-1) 中...
選取了原先未選的套件 libjs-underscore。
正在準備解包 .../05-libjs-underscore_1.13.2~dfsg-2_all.deb……
解開 libjs-underscore (1.13.2~dfsg-2) 中...
選取了原先未選的套件 libjs-sphinxdoc。
正在準備解包 .../06-libjs-sphinxdoc_4.3.2-1_all.deb……
解開 libjs-sphinxdoc (4.3.2-1) 中...
選取了原先未選的套件 zlib1g-dev:arm64。
正在準備解包 .../07-zlib1g-dev_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb……
解開 zlib1g-dev:arm64 (1:1.2.11.dfsg-2ubuntu9.2) 中...
選取了原先未選的套件 libpython3.10-dev:arm64。
正在準備解包 .../08-libpython3.10-dev_3.10.6-1~22.04_arm64.deb……
解開 libpython3.10-dev:arm64 (3.10.6-1~22.04) 中...
選取了原先未選的套件 libpython3-dev:arm64。
正在準備解包 .../09-libpython3-dev_3.10.6-1~22.04_arm64.deb……
解開 libpython3-dev:arm64 (3.10.6-1~22.04) 中...
選取了原先未選的套件 python3.10-dev。
正在準備解包 .../10-python3.10-dev_3.10.6-1~22.04_arm64.deb……
解開 python3.10-dev (3.10.6-1~22.04) 中...
選取了原先未選的套件 python3-distutils。
正在準備解包 .../11-python3-distutils_3.10.6-1~22.04_all.deb……
解開 python3-distutils (3.10.6-1~22.04) 中...
選取了原先未選的套件 python3-dev。
正在準備解包 .../12-python3-dev_3.10.6-1~22.04_arm64.deb……
解開 python3-dev (3.10.6-1~22.04) 中...
選取了原先未選的套件 python3-setuptools。
正在準備解包 .../13-python3-setuptools_59.6.0-1.2_all.deb……
解開 python3-setuptools (59.6.0-1.2) 中...
選取了原先未選的套件 python3-wheel。
正在準備解包 .../14-python3-wheel_0.37.1-2_all.deb……
解開 python3-wheel (0.37.1-2) 中...
選取了原先未選的套件 python3-pip。
正在準備解包 .../15-python3-pip_22.0.2+dfsg-1_all.deb……
解開 python3-pip (22.0.2+dfsg-1) 中...
設定 javascript-common (11+nmu1) ...
設定 libpython3.10-stdlib:arm64 (3.10.6-1~22.04) ...
設定 libexpat1-dev:arm64 (2.4.7-1) ...
設定 zlib1g-dev:arm64 (1:1.2.11.dfsg-2ubuntu9.2) ...
設定 libjs-jquery (3.6.0+dfsg+~3.5.13-1) ...
設定 libpython3-stdlib:arm64 (3.10.6-1~22.04) ...
設定 libjs-underscore (1.13.2~dfsg-2) ...
設定 libpython3.10:arm64 (3.10.6-1~22.04) ...
設定 python3.10 (3.10.6-1~22.04) ...
設定 python3 (3.10.6-1~22.04) ...
running python rtupdate hooks for python3.10...
running python post-rtupdate hooks for python3.10...
設定 libpython3.10-dev:arm64 (3.10.6-1~22.04) ...
設定 libjs-sphinxdoc (4.3.2-1) ...
設定 python3.10-dev (3.10.6-1~22.04) ...
設定 python3-lib2to3 (3.10.6-1~22.04) ...
設定 python3-distutils (3.10.6-1~22.04) ...
設定 libpython3-dev:arm64 (3.10.6-1~22.04) ...
設定 python3-setuptools (59.6.0-1.2) ...
設定 python3-wheel (0.37.1-2) ...
設定 python3-dev (3.10.6-1~22.04) ...
設定 python3-pip (22.0.2+dfsg-1) ...
執行 bamfdaemon (0.5.6+22.04.20220217-0ubuntu1) 的觸發程式……
Rebuilding /usr/share/applications/bamf-2.index...
執行 desktop-file-utils (0.26-1ubuntu3) 的觸發程式……
執行 gnome-menus (3.36.0-1ubuntu3) 的觸發程式……
執行 mate-menus (1.26.0-2ubuntu2) 的觸發程式……
執行 libc-bin (2.35-0ubuntu3) 的觸發程式……
執行 man-db (2.10.2-1) 的觸發程式……
執行 mailcap (3.70+nmu1ubuntu1) 的觸發程式……

參考 :


用 pip list 指令檢視內建的 Python 3.10.4 已安裝那些套件 :

one@LX2017:~$ pip list   
Package                Version
---------------------- --------------
apturl                 0.5.2
ayatana-settings       21.1.28
bcrypt                 3.2.0
beautifulsoup4         4.10.0
blinker                1.4
Brlapi                 0.8.3
cajarename             21.11.24
chardet                4.0.0
click                  8.0.3
colorama               0.4.4
command-not-found      0.3
cryptography           3.4.8
cupshelpers            1.0
dbus-python            1.2.18
defer                  1.0.6
deja-dup-caja          0.0.9
distro                 1.7.0
distro-info            1.1build1
duplicity              0.8.21
fasteners              0.14.1
folder-color-caja      0.0.86
folder-color-common    0.0.86
future                 0.18.2
gpg                    1.16.0-unknown
html5lib               1.1
httplib2               0.20.2
importlib-metadata     4.6.4
jeepney                0.7.1
keyring                23.5.0
language-selector      0.1
launchpadlib           1.10.16
lazr.restfulclient     0.14.4
lazr.uri               1.0.6
lockfile               0.12.2
louis                  3.20.0
lxml                   4.8.0
Magnus                 1.0.3
Mako                   1.1.3
MarkupSafe             2.0.1
mate-hud               22.4.4
mate-tweak             22.4.8
monotonic              1.6
more-itertools         8.10.0
netifaces              0.11.0
numpy                  1.21.5
oauthlib               3.2.0
olefile                0.46
onboard                1.4.1
paramiko               2.9.3
pexpect                4.8.0
Pillow                 9.0.1
pip                    22.0.2
psutil                 5.9.0
ptyprocess             0.7.0
pulsemixer             1.5.1
pycairo                1.20.1
pycryptodomex          3.11.0
pycups                 2.0.1
PyGObject              3.42.0
PyJWT                  2.3.0
PyNaCl                 1.5.0
pyparsing              2.4.7
python-apt             2.3.0+ubuntu2
python-dateutil        2.8.1
python-debian          0.1.43ubuntu1
python-xlib            0.29
pyxattr                0.7.2
pyxdg                  0.27
PyYAML                 5.4.1
reportlab              3.6.8
scour                  0.38.2
SecretStorage          3.3.1
setproctitle           1.2.2
setuptools             59.6.0
six                    1.16.0
soupsieve              2.3.1
ssh-import-id          5.11
systemd-python         234
ubuntu-advantage-tools 27.8
ubuntu-drivers-common  0.0.0
ufw                    0.36.1
unattended-upgrades    0.1
urllib3                1.26.5
wadllib                1.3.6
webencodings           0.5.1
wheel                  0.37.1
xdg                    5
xkit                   0.0.0
youtube-dl             2021.12.17
zipp                   1.0.0


2022-10-26 補充 : 

今天打電話給 Mapleboard 的黃先生請教以上問題, 建議我做系統更新, 因自六月以來已有許多系統與韌體升版, 螢幕保護導致無信號問題有新的解決方法, 升版後應可解決. WiFi 網卡可能與 driver 有關, 可用 list usb 指令檢查網卡型號提供給他處理. 至於更新出現 Lock 問題, 是因為桌面的 Mate 鎖住, 等一陣子就會解開. 有問題可在論壇詢問 :


或寄信給黃先先 : jb@ces.com.tw 


2022-10-27 補充 : 

寫信將 MP510 無法抓到 WiFi 網卡問題告知黃先生後, 很快收到回信, 建議下載安裝新版韌體, 我用 apt-get 下載安裝後重開機, 果然網路連線就出現 WiFi 熱點, 已可無線上網, 但 Logitech K235 鍵鼠組的鍵盤仍無反應, 再研究.


2023-01-18 補充 : 

歡迎使用 MapleBoard MP510-50 Ubuntu-Mate 微型電腦

一、預設使用者:one  密碼:1234

二、root 預設密碼:1234

三、中英文輸入切換:Ctrl+Space;輸入法切換:Ctrl+Shift;簡繁切換:Ctrl+Shift+F

四、取消使用者 one 自動登入:
    1、打開終端機:螢幕左上角 選單->系統工具->Mate終端機
    2、編輯設定檔:
       $ sudo nano /etc/lightdm/lightdm.conf
    3、將第二行注解掉,亦即在最前面加上 # ,成爲
       #autologin-user=one
    4、按 Ctrl+O 寫入設定檔,按 Ctrl+X 離開 nano 編輯器,大功告成。
    
五、執行監看系統效能軟體 mtop,兩種方法:
    1、螢幕左上角 選單->系統工具->mtop
    2、打開終端機執行
       $ mtop
       
六、MP510-50微型個人電腦前方面板LED輪流顯示 Eth0 IP網址、CPU溫度、日期。
    亮度較低是正常的,主要是避免放螢幕下方時,干擾到視覺。           

七、進一步資訊,請參考 MapleBoard MP510-50 微型電腦網頁:

    https://www.MapleBoard.org/mp510-50     

Ubuntu 源自 Debian, 與樹莓派同源, 故 Linux 指令用法雷同, 參考 :


安裝 Julia 1.8.2

最近看到辦公桌書架上於 2020 年買的歐萊里 'Think Julia' 這本書, 兩年來只看了前兩章就打住了, 因為光是 Python 要學的東西就很多. 但書買來沒看太可惜, 所以打算利用零散時間加減看, 順便與 Numpy/Pandas 做對照, 此書篇幅不大, 用滴水穿石方法總有看完的時候. 

到官網下載最新版 Julia 發現已升至 1.8.2, 兩年前在筆電安裝時才 1.0.3 而已. 下載檔案大小約 85 GB, 一鍵安裝即可 :







記得要勾選 'Add Julia to PATH', 這樣就可以在 MS-DOS 視窗直接輸入 julia 進入解譯器視窗 : 




也可以從開始啟動 Julia :





也可以使用線上解譯器 Juliabox :

2022年10月24日 星期一

一向宗與聖戰思想

今天在一本佛書上看到日本一向宗 (即淨土真宗) 在日本戰國時代的角色, 驚訝地發現原來當時武田軍團能如此驍勇善戰, 竟然也是利用宗教力量! 一向宗認為只要執持阿彌陀佛名號即可往生西方 (與淨土宗類似, 但並非淨土宗), 與軍事結合就變成只要在戰場上念誦佛號勇敢殺敵, 即使戰死也無所謂, 反而能往生西方極樂! 難怪大河劇中德川家康出征時, 軍陣中搖曳的軍旗上寫的是 "厭離穢土, 欣求淨土", 原來諸侯大名都知道利用宗教力量, 不僅可以減低士兵對死亡的恐懼, 還能讓他們不怕死, 戰死剛好能速登極樂! 這就是最早的聖戰思想啊!

一向宗是日本鎌倉時代的僧人親鸞所創立, 親鸞出家後原本在比叡山修天台宗, 但多年後卻改宗淨土, 所創立的淨土真宗是日本佛教僧侶可以結婚生子的宗派, 其宗廟位於今天大阪中央區的石山本願寺. 到了鎌倉末期的戰國時代, 一向宗第 11 代門主顯如光佐把徒眾組建成軍隊, 以對抗織田信長的軍事擴張 (稱為一向一揆, 即一向宗的僧人起義), 由於他與甲斐的武田信玄是連襟關係且同為佛教徒 (織田信長則與天主教徒親善), 所以一向宗與武田軍結成軍事同盟, 由於一向宗僧兵受聖戰思想驅使不怕死, 讓原本就很勇猛的織田軍團吃了許多敗仗. 

顯如死後, 德川家康在背後操弄其兩子之分岐, 導致本願寺教派的分裂, 這就是京都東本願寺與西本願寺的由來. 以前台北也有一座東本願寺, 是淨土真宗在台灣的別院, 二戰後被保安司令部用做刑訊看守所, 後來原址改建成今天西門町的獅子林新光大樓, 參考 : 


2022年10月23日 星期日

儲能型太陽能系統安裝 (六)

周六下午回到鄉下已三點半, 馬上開始動手進行上週未完成的浴室配線, 主要是拉開關的回線, 弄到四點半看看外面沒下雨, 想說明天若下雨就無法爬山, 就出發去爬獅形頂了. 晚上吃過飯 (涼麵) 後繼續幹活, 因這間浴室是後來加蓋的, 全部都用鋁材, 所以要安裝 LED 燈座也很簡單, 只要在浴室頂上鑽個洞, 把電線拉下來鎖在燈座後面接點再將燈座鎖在浴室頂即可, 線路圖如下 :


 

浴室上方的分電盤電源來自車庫主分電盤, 主要的目的是要分出一條地線給浴室 LED 燈. 也可以不用此分電盤, 火地線直接拉到飯廳插座開關盒, 再從那邊拉地線回來, 但這樣回線就要多一條地線了, 門上邊的洞得要鑽大一些, 比較麻煩. 

下面這張是浴室上方分電盤, 外線從右邊進來 (來自車庫主分電盤), 分出一條地線向下到浴室頂的 LED 燈, 跟最右邊那條回線 (紅) 一起拉到浴室上方的燈座 :  




火地線從分電盤向左走線至木門上的小洞進入飯廳牆上的插座開關盒, 火線地線先到最左邊的插座, 不管插座或開關, 上面兩孔相通, 下面兩孔也相通, 所以要接電就用短線從旁邊跳過來即可, 但線頭剝線時不要太短 (> 1cm), 否則插入孔中時不會咬緊. 左邊兩個是插座, 最右邊是開關, 所以火線跳過來後, 底下的回線還是用紅線, 這是要拉到負載 (LED) 的線 :




完成後如下圖 : 




週日下午兩點繼續幹活, 這回主要是接車庫樑上的主分電盤的線, 線路圖如下 : 



從頂樓下來的 2mm 線先分電到上面施工的浴室. 然後拉火線與地線到側門的插座開關組, 包含一個插座與兩個開關, 中間的開關控制舊豬舍的 LED 燈; 右邊的開關控制車庫的 LED 燈. 花了三小時完成主分電盤接線, 以及舊豬舍 LED 燈的拉線與燈座安裝, 因已傍晚, 趕快收工去準備十全大補雞湯, 剩下的下周再繼續.

下面是主分電盤, 最左邊下方的紅黑線是拉到側門插座開關盒, 到浴室分電盤的線則與頂樓下來的 2mm 線接在一起 :  




下圖是側門插座開關盒, 只拉了插座用的火地線, 與舊豬舍 LED 的回線 :




此回線 (紅) 與主分電盤拉的地線一起沿著車庫鋼樑凹槽拉到舊豬舍, 上方架滿竹竿與木板, 我挑了一塊被壓得很實的木板, 將燈座鎖在上面 :




這是今天去上元時剛好看到的日象 10W LED, 黃光一顆 99 元. 今天就做到這裡暫時收工唄, 下周要繼續拉車庫三盞 LED 燈以及大門門口與車庫門口的 LED 燈的線, 為了保留用智慧插座自動控制車庫燈的彈性, 週日早上去小漢買了兩埠插座與插頭. 

2022年10月18日 星期二

好書 : 隱市致富地圖

此書借自市圖, 作者股市隱者不知其名, 曾任法人基金經理人, 管理過兩億美元部位. 後來辭掉工作成立臉書粉專匿名分享投資觀念, 此書為其文章彙集. 



Source : 博客來


以下是讀後摘要筆記 :
  1. 評估基本面:主要是計算目標價與停損價。停損價可用質性與量化方式評估,質性例如買進的理由是否消失,量化是決定虧損多少%才賣出。基本面看似枯燥乏味,但如果把基本面當作算命的看面相,就會相對有趣。基本面才是信心的根本。
  2. 基本面最重要的是放眼未來, 要預估未來的股價. 
  3. 美麗的事物都有類似的規則, 例如平衡, 和諧, 對稱, 層次等. 能長期獲利的投資方式也都有相似的模式.
  4. 計算目標價就是將公司的特質量化 例如去年 ESP 10 元, 今年預估成長 20% 即 12 元, 同業平均本益比 15 倍, 則目標價推估為 12*15=180 元. 
  5. 基本面評估買進價=目標價÷(1+期望報籌率)。
  6. 評估籌碼面:籌碼面與技術面的差異是,技術面看的是股價走勢,而籌碼面看的是買賣雙方是誰。但籌碼面缺點是容易過度解讀,同一個券商未必是同一群人的買賣。
  7. 價值股與定存股特徵很像,都要求公司營運穩健,現金流量充足,產業成長性低,不同的是價值股不強調現金股利殖利率,但共同點都是股價要相對便宜。
  8. 贏勢股投資首重趨勢,從趨勢中找贏家,此種股票類似成長股,但成長因素更具體,是因為產業趨勢而成長,且具有持續性,而非一次性成長,例如人工智慧,物聯網,自駕車等。
  9. 回購股與定存股,價值股特質也相似,差別在於回購股更願意將現金流拿來定期買回自家股票,而不是配發股息。
  10. 贏勢股投資首重趨勢,從趨勢中找贏家,此種股票類似成長股,但成長因素更具體,是因為產業趨勢而成長,且具有持續性,而非一次性成長,例如人工智慧,物聯網,自駕車等。
  11. 李小龍曾說,“我不怕曾經練過一萬種踢法的人,但我怕一種踢法練了一萬次的人”。
  12. 波段操作要兼顧基本面, 技術面, 與籌碼面分析, 才能不斷挖礦. 
  13. 技術分析有一定的效果,但其勝率也有限,因為可能受到人為操縱。技術分析的三法寶 : 成交量,K 線型態,與移動平均線。其他的技術指標如 KD, RSI, MACD, 布林通道等並非無效,而是不容易歸納出相同的使用準則,可能因為產業,市值,投資環境而有不同之判斷依據。
  14. 技術分析有一定的效果,但其勝率也有限,因為可能受到人為操縱。技術分析的三法寶 : 成交量,K 線型態,與移動平均線。其他的技術指標如 KD, RSI, MACD, 布林通道等並非無效,而是不容易歸納出相同的使用準則,可能因為產業,市值,投資環境而有不同之判斷依據。例如 RSI 在高低檔有鈍化現象,一般準則是要賣出,但也表示該股為強到不行的強勢股,同一指標判斷方向却完全相反。加工過多的指標容易有不同的見解,而較原始的指標如成交量,K 線型態與均線,它們只以投資人的心理層面出發反而更有效。
  15. 成交量是技術面最重要的指標,決定訊號是否有效。成交量爆量表示當日的訊號是有效的,背後的意義是買賣方都認同當日價格,也認同當日之交易訊號。而爆量一般是設定為月平均成交量的五倍。
  16. K 線型態用來觀察股價的慣性是否改變,可預測股價未來走勢。K 線型態有很多種,例如 M 頭, W 底,三角收斂,跳空缺口等。我主要看的是盤整區間 (前波高點,低點分別相連之兩條平行線) 與跳空缺口這兩種。
  17. 股票買點要從量縮盤整找起,量縮表示籌碼沈澱,買賣方相對理性,這時買股不容易買貴。當有外力 (重大利多或利空消息) 介入時,股價就會脫離盤整區間展開新行情。但有時會出現假突破,常見策略是突破區間買進,跌破區間就停損。也可以參考基本面在盤整下緣買進。
  18. 股市充斥不對稱資訊, 先知總是能在大漲錢買進, 在利多消息公布前布局, 等散戶看到時已是第十手了, 所以只看基本面就買進反而成了冤大頭, 而技術面與籌碼面的價值就是找出這些先知, 據以調整進出的洽當時機. 
  19. 籌碼分析的三大法寶 :
    (1). 內部人持股異動 : 董事, 監察人, 經理人與持股>10%大股東
    (2). 實施庫藏股 : 股價暴跌庫藏股買回是正面訊號, 但要注意管理層是否倒貨
    (3). 券商分行買賣超 : 找出過去買股時機掌握最好的分行, 他們賣股時是反轉指標
  20. 籌碼分析的輔助參考 :
    (1). 前10大股東持股變化 : 更新頻率低, 適合長投參考
    (2). 三大法人買賣超 : 法人不曾持有卻大買的股票值得注意
    (3). 融資/融券/借券 : 借券融資增加 (利空), 融券增加 (利多)
  21. 投資如探險, 要找到金礦需先找到對的方法. 
  22. 股票投資賺錢的三個方式 :
    (1). 買漲得多的股票 (漲幅大) : 找跌深反彈股
    (2). 買漲得快的股票 (漲速快) : 找妖股
    (3). 漲容易漲的股票 (勝率高) : 找穩健成長股
    漲幅與漲速都是衡量上漲後的報酬率, 基本假設是會上漲 (勝率高) 才有意義, 最穩當的應該是選勝率高的方式, 因為勝率比報酬率更可靠, 勝率會因為自己對個股的了解而增加, 而報酬率會走到哪是市場決定的. 而了解市場比了解公司要難得多. 
  23. 追求勝率而非報酬率高低的另一個優點是能維持贏家的氣勢, 畢竟虧損次數多會使信心下降, 也會變得猶豫不決而影響後續投資判斷. 
  24. 趨勢就是成長的動力, 成長動力持久不易被外力影響的股票有個共同特質, 那就是受惠於趨勢, 而其中的龍頭股勝率最高, 故稱為贏勢股. 追求勝率就是追求趨勢, 即追求贏勢股. 
  25. 投資趨勢有兩個特點 : 
    (1). 趨勢可以複製, 可複製是投資致富的必要條件
    (2). 趨勢是一個現象, 隨時都在發生隨處可見, 只要細心觀察就能找到, 可以從生活中找, 也可以在數據中找. 
    但趨勢不是今天觀察到買進後明天就會上漲. 
  26. 從數據中找趨勢好處是有效率, 但容易誤判, 需搭配個股研究, 可用的方法由易到難如下 :
    (1). 股價 : 創新高是趨勢受惠股, 創新低淘汰股, 但要整個族群創新高才算是趨勢形成
    (2). 財務條件 : 用毛利率, 獲利/營收成長率, 市佔率等篩選
    (3). 市場預期 : 從法人分析師的營運能力預估報告尋找
    用股價觀察的缺點是看出來時股價已漲一波且找不出贏勢股, 漲勢能延續多久要看基本面分析. 用財務條件可找出贏勢股, 市值最大者成為贏勢股之機率較高, 但財務數字需使用預估數字而非歷史數字. 使用財務條件的四個重點是 (可在法說會或券商報告中找到) :
    (1). 未來成長性 (未來兩年營收成長率/淨利成長率提升)
    (2). 獲利提升 (未來兩年淨利率/毛利率連續上升)
    (3). 市值大 (市值超過五十億)
    (4). 概念純 (趨勢產品佔營收五成以上)
  27. 贏勢股的保存期限決定於其進入門檻, 例如最大視訊軟體 Zoom 在微軟的 Teams 等介入後即從高點跌落. 
  28. 若無能力選股與判斷趨勢, 則美股的指數型 ETF 是很好的選擇, 例如那斯達克指數成分股中含有不少趨勢股 (不建議從道瓊找, 因其僅有 30 支股, 且偏向傳統產業).
  29.  
  30. 目標價評價方式有三種 :
    (1). 倍數評價法 : 適用一般企業
    (2). 分類加總估值法 : 適用擁有業務差異大之集團企業
    (3). 現金流折現法 (DCF) :  適用有穩定現金流之公用事業, 金融股, 電信股等
  31. 目標價是從基本面分析股價漲多少該獲利賣出的價格. 倍數評價法之主流算法有三種 :
    (1). 本益比法 : 目標價=每股盈餘*本益比 (適用產業成熟之業務成長股)
    (2). 股價淨值比法 : 目標價=每股淨值*股價淨值比 (適用景氣循環股或資產股)
    (3). 股價營收比法 : 目標價=每股營收*股價營收比 (適用新創產業股)
    但有些企業評價方式可能會改變, 例如台積電原本適用股價淨值比法, 但隨著半導體獲利波動變小, 成長趨於穩健, 改用本益比法來評價台積電更適合. 注意, 估算目標價要用未來的預估數字, 不可用過去 3~5 年數字. 
  32. 停損最大的目的在於看錯個股時, 能在可承擔虧損狀況下趕緊賣出以保留資金火種. 停損方式有兩種 :
    (1). 量化停損 : 直接設定停損價 (但要滾動式調整), 適合新手
    (2). 質性停損 : 設定停損條件嚴格執行, 適合老手
  33. 設定量化停損價時可考量三個因素彈性調整個股停損點 :
    (1). 股價波動 : 波動小的停損區間也要小, 避免太晚觸動停損
    (2). 風險報酬比 : 預期報酬越高風險越高, 停損區間也較大
    (3). 資產配比 : 以能承受之總資產減損為上限來設定個股停損點
    例如中華電股價波動小, 若持股一律設 10% 停損, 則觸及時可能基本面早已出現重大變化, 10% 才停損可能太晚 (也許 3~5% 較適合). 但像國巨這種波動大的個股, 10% 停損點可能太小而很快觸及而出場. 可以用風險係數 beta 值 (個股對比於大盤之波動度) 與權值股相比後設定, 例如台積電停損設 10%, 其風險係數為 1.09, 國巨風險係數是 1.74, 是 1.09 的 1.59 倍, 則其停損點可設為台積電的 1.59 倍, 即 15.9%.
    風險報酬比的概念是, 預期報酬越高風險也越高, 可容忍越高之虧損, 一般停損點可設為預期報酬率的 1/3. 例如若台積電預期報酬率為 30%, 停損點就設為 10%. 但停損價應該滾動式調整, 要以目前股價來計算, 不是用買進成本價計算. 
  34. 設定目標價與停損價都是在找賣出時機, 但某些時機賣出股票卻與價格無關, 成為質性停損, 可分為四種 :
    (1). 找到更好的標的
    (2). 原先買進理由消失
    (3). 技術指標出現賣出訊號
    (4). 籌碼指標出現賣出訊號
    基本面不變但股價一直跌, 可能有市場尚未發現的重大訊息, 這時可用技術面來判斷是否出場. 也可以用籌碼面來判斷賣股時機, 可分析盤後的券商分行買賣超, 將過去買股時機最好的分行當作指標, 當這些分行開始賣股時就要評估賣出時機. 賣股有時並非因為看壞, 而是因為股價到達滿足點, 或是有更好的投資機會.
  35. 了解股價是否反映市場預期最簡便的方式是, 在重大事件 (例如法說會, 月營收與財報公布) 之前, 看看股價有無大幅上漲或下跌. 另外觀察籌碼面有能看出端睨, 例如特定券商分行是否有人不斷買進拉升股價, 或三大法人有無積極賣出等.
  36. 研究股票最重要的不是預估每股盈餘, 而是管理市場預期, 再多的好消息未必能讓股價上漲, 因股價早已反應. 只有知道市場的預期在哪, 並與我們的認知比較, 才能判斷股價目前的水位是否還有投資空間. 
  37. 本益成長比 (PEG) 是將公司未來淨利成長考慮進去的本益比, 計算方式為本益比除以未來一年淨利成長率, 例如本益比 20 倍, 未來億年淨利成長率為 20%, 則本意成長比為 1, 此為成長股的合理本意成長比, 若 PEG > 1.2 表示股價偏貴; 低於 0.75 表示投資機會浮現. 
  38. 股票沒有絕對的價值, 各種計算股票價值的方法都只是計算出股票的相對價值. 價值都是比較出來的, 要經過比較才能評判股票是被低估還是高估 (例如成長性與競爭力一樣, 本益比較高的股票就是高估了). 
  39. 投資組合的關鍵是, 贏者寧缺勿濫, 而敗者偏愛濫竽充數. 持有股數不要太多, 最好是 3~5 支, 這樣才有時間深入研究. 股價就像棒球, 落入好球帶的才值得出手
  40. EP5 來賓訪談|用心於不交易價值投資法 ft. 林茂昌 (Podcast)
  41. EP9 來賓訪談|全職交易人高含金實戰解析 ft. 投資癮Wade  (Podcast)
  42. EP14 來賓訪談|從價值投資踏入瘋狗流的世界 ft. 升鴻  (Podcast)

好書 : Python 資料分析 (Python for Data Analysis)

上週五去逛明儀時看到歐萊里的 "Python 資料分析" 這本書 (第二版) : 


Source : 博客來


我發現母校有這本書ㄟ :


其實原文書 Oreilly 今年八月已經出第三版了 :



Source : Oreilly


書中範例 (ipynb 檔) 可在作者 Wes McKinney 的 GitHub 下載 : 

# https://github.com/wesm/pydata-book

CUE 100 與 GP 125 機車強制險續保

最近接到通知信說有兩台機車強制險到期, 一台是鄉下老家的光陽 CUE 100 (紅), 這是 2017/6 汰換媽那台二行程機車換購的, 這台我有抄錄車身號碼, 所以就很方便地在明台產險網路投保了 (兩年 990); 另一台是水某上下班騎的那台光陽機車, 由於沒有紀錄車身號碼, 所以只好等找到資料再繳, 或乾脆去超商繳算了, 雖然貴一點 (兩年 1200). 

仔細算一下, 我家居然有 6 台機車啊! 剛好一人一台 (雖然姐姐沒在騎機車), 鄉下兩台光陽 100, 一台爸在騎, 另一台我回去時要騎; 高雄我與水某各一台, 菁菁與二哥也各一台, 最近要整理這些機車強制險資料, 要不然到期了都不知道. 全部都用明台網路投保最優惠也方便, 填過一次車籍資料後以後都不需要填. 但菁菁與二哥的機車不在我名下 (我擁有四台機車ㄟ), 網路投保較麻煩 (不能刷卡, 必須傳真等). 

2022-10-20 補充 :

今天終於在機車坐墊下置物箱找到水某這台機車 (GP-125) 的資料袋, 順利在明台網站投保強制險 (兩年 990) 並建立檔案 :

投保後查詢 (三年內線上投保的訂單資料, 其他電洽 0800-069-889)

到期日為 2024 年 10 月 20 日.

高科大還書 1 本

這本書被預約昨天拿去還 : 
雖然還沒看完, 但基本用法已經會了, 此書特點就是將各種常遇到的 Excel 問題以 xlwings 來解決, 相當於是 VBA 的 Python 版, 有空再回借. 

2022年10月17日 星期一

Python 學習筆記 : 使用 xlwings 套件操作 Excel 試算表 (一)

我在 6/7 時因為上了高啟昌老師的課而首次接觸到 Python 的 Excel 處理套件 xlwings, 它最大的好處是可以在開啟 xlsx 試算表檔案的情況下操作工作表, 可以同步看到工作表上的資料跳動 (Python 與 Excel 雙向操作); 而另一個較老牌的 Openpyxl 套件則不行, 若 xlsx 檔案被 Excel 開啟中會被鎖住, OpenPyXL 將無法操作工作表.   

不過, OpenPyXL 的好處是, 即使沒有安裝 Excel 軟體仍可使用, 而 xlwings 則是必須依賴 Excel 軟體才能使用, 在樹莓派上雖然可以順利安裝 xlwings 套件, 但無法操作 xlsx 檔案 (因為 Excel 只有 Windows 與 macOS 版). 由於我主要的運算機器是樹莓派 (嵌入式設備, 可以 24 小時低功率運轉), 所以之前我著重於 OpenPyXL 的學習, 參考如下筆記 : 


在許多可操作 Excel 試算表檔案的套件中, xlwings 是唯一真正能編輯任何格式的 Excel 檔案的套件 (不會改變或丟棄既有內容與格式), 讓使用者可輕鬆地讀寫 Excel 試算表中的資料 (例如可以不必存檔就能動態地讀取 Excel 儲存格內容, 用 OpenpyXL 須先存檔關檔才能存取), 是 Excel VBA 的 Python 版, 最主要的用途是可利用 Excel 作為使用者介面來打造一個互動式應用. 

參考書籍 : 
最近從母校圖書館借到這三本好書, 所以要開始來學習 xlwings 套件了.


Source : 博客來


此書範例程式下載網址 :



Source : 博客來


此書範例程式下載網址 :



Source : 博客來


xlwings 有完整的 API 說明文件, 參考 :


以下是我讀這三本書的測試筆記 : 


1. 安裝 xlwings 套件 : 

在 Window 下直接用 pip install xlwings 套件 : 

C:\Users\User>pip install xlwings    
Collecting xlwings
  Downloading xlwings-0.27.8-py3-none-any.whl (1.0 MB)
Requirement already satisfied: pywin32>=224 in c:\python37\lib\site-packages (from xlwings) (227)
Installing collected packages: xlwings
Successfully installed xlwings-0.27.8

可見 xlwings 套件很小, 才 1MB 而已. 匯入時通常會取 xw 別名 :

>>> import xlwings as xw   
>>> xw.__version__      
'0.27.8'

Anaconda 已將 xlwings 預載, 故 Anaconda 使用者毋須安裝 xlwings. 

注意, 在 Windows 上使用 xlwings 至少須安裝 Excel 2007 以上版本; macOS 系統則須安裝 Excel 2016 版以上, 或者訂購 Microsoft 365 的桌面 Excel. 


2. 檢視 xlwings 套件之成員 : 

先來檢視 xlwings 套件的成員內容, 以下使用一個自訂模組 members, 其 list_members() 函式會列出模組或套件中的公開成員 (即屬性與方法), 參考 :

Python 學習筆記 : 檢視物件成員與取得變數名稱字串的方法

>>> import xlwings as xw     
>>> import members   
>>> members.list_members(xw)      
App <class 'type'>
Book <class 'type'>
Chart <class 'type'>
Engine <class 'type'>
LicenseError <class 'type'>
Name <class 'type'>
PRO <class 'bool'>
Picture <class 'type'>
Range <class 'type'>
RangeColumns <class 'type'>
RangeRows <class 'type'>
Shape <class 'type'>
ShapeAlreadyExists <class 'type'>
Sheet <class 'type'>
USER_CONFIG_FILE <class 'str'>
XlwingsError <class 'type'>
apps <class 'xlwings.main.ActiveEngineApps'>
arg <class 'function'>
books <class 'xlwings.main.ActiveAppBooks'>
constants <class 'module'>
conversion <class 'module'>
engines <class 'xlwings.main.Engines'>
expansion <class 'module'>
func <class 'function'>
gencache <class 'module'>
get_udf_module <class 'function'>
import_udfs <class 'function'>
load <class 'function'>
main <class 'module'>
os <class 'module'>
ret <class 'function'>
serve <class 'function'>
server <class 'module'>
sheets <class 'xlwings.main.ActiveBookSheets'>
sub <class 'function'>
sys <class 'module'>
udfs <class 'module'>
utils <class 'module'>
view <class 'function'>
wraps <class 'function'>

其中有四個類別用來建立 Excel 中的物件結構 :
  • App : 代表 Excel 應用程式實例
  • Book : 代表工作簿 (包含多個工作表)
  • Sheet : 代表工作表 (二維網格的資料表)
  • Range : 代表儲存格 (單一儲存格或矩形範圍內之儲存格)
這些 xlwings 的物件在結構上是階層式的, 與 Excel 物件的對應如下圖所示 :




最上層物件 App 代表 Excel 應用程式實例 (即 Excel 視窗), Book 為工作簿物件, 裡面包含一個以上的工作表 (Sheet 物件), 每一個工作表又由 Range 物件 (即儲存格) 構成, 不管是單一儲存格還是方形範圍內之多儲存格, 其類型都是 Range 物件. 


3. 用 xlwings 建立 Excel 工作簿 : 
 
呼叫 App 類別的的建構子 App() 即可建立一個 App 物件 : 
 
>>> import xlwings as xw    
>>> app=xw.App(visible=True, add_book=False)  
>>> type(app)   
<class 'xlwings.main.App'>      # 建立了一個 App 物件

此處傳入參數 visible=True 表示要顯示開啟之 Excel 視窗, 而 add_book=False 則是不要新增預設之工作簿, 通常是為了自行新增工作簿或開啟已存在的 xlsx 檔案, 不希望 App 裡面有預設之工作簿以免干擾. 以上述指令建立 App 後會自動開啟一個 Excel 視窗 :




這是一個空白的 Excel 應用程式實例, 裡面並無工作簿, 可以用 App 物件的 books 屬性檢視 :

>>> app.books    
Books([])
>>> type(app.books)    
<class 'xlwings.main.Books'>    


(1). 呼叫 app.books.add() 建立 Book 物件 : 

books 屬性類型為一個 Books 物件, 這是一個存放 Book 物件的容器, 此處內容為空 (因為在建立 App 時傳入 add_book=False 之故). 可以呼叫 Books 物件的 add() 方法建立工作簿 (此方法無傳入參數), 例如 : 

>>> wb=app.books.add()       # 建立工作簿 Book 物件
>>> type(wb)       
<class 'xlwings.main.Book'>      

可見 add() 方法會建立一個 Book 工作簿物件, 這時上面自動開啟的 Excel 視窗 (App 物件實例) 也會同步出現工作簿, 裡面有一個預設工作表 '工作表 1' :




這就是 xlwings 與 Excel 同步互動的效果, 對儲存格的操作也會同步反映在 Excel 視窗上. 


(2). 利用 wb.sheets[] 取得 Sheet 物件 : 

接著可以用工作簿 Book 物件的 sheets 屬性以索引 (0 起始) 取得工作表 Sheet 物件 :

>>> sheet=wb.sheets[0]     
>>> type(sheet)     
<class 'xlwings.main.Sheet'>     # 取得工作簿裡面的一個 Sheet 物件

由於目前只有一個工作表, 所以索引 0 即代表 '工作表1' 這張工作表. 也可以用工作表名稱 (例如此處是 '工作表1') 當作索引, 效果是一樣的 :

>>> sheet=wb.sheets['工作表1']   
>>> type(sheet)   
<class 'xlwings.main.Sheet'>      # 取得工作簿裡面的一個 Sheet 物件


(3). 呼叫 sheet.range() 取得 Range 物件 : 

接著便可以用 Sheet 物件的 range() 方法存取此工作表內的儲存格, 可傳入位置索引字串來定位儲存格, 與 Excel 用法一樣, 欄索引由左向右依序是 A, B, C, D, .... Z, AA, AB, AC, .... 而列索引則是由上而下依序為 1, 2, 3, 4, 5, .... 等, 位置索引之範例如下 : 


 range() 的儲存格定位字串 說明
 'A1' 儲存格 A1
 'A1:B2' 從 A1 至 B2 的儲存格 (範圍)
 'A:A' A 欄的所有儲存格
 'A:B' A 欄與 B 凡的所有儲存格
 '1:1' 第一列的所有儲存格
 '1:5' 第一列到第五列的所有儲存格


例如 : 

>>> rangeA1=sheet.range('A1')   
>>> rangeA1   
<Range [活頁簿2]工作表1!$A$1>   
>>> type(rangeA1)   
<class 'xlwings.main.Range'>   
>>> rangeA1B2=sheet.range('A1:B2')   
>>> rangeA1B2   
<Range [活頁簿2]工作表1!$A$1:$B$2>     
>>> type(rangeA1B2)   
<class 'xlwings.main.Range'>   

可見不管是單一儲存格或是矩形範圍內的多個儲存格, 其資料類型都是 Range 物件. 呼叫 Range 物件的 value() 法即可存取儲存格內容 (傳入參數為 setter, 不傳參數為 getter), 例如在 A1 儲存格填入一個 2*2 串列資料, 它會被存入 A1:B2 範圍內的儲存格裡, 在 A4 儲存格存入 'Hello World' 則只存在 A4 裡 :

>>> sheet.range('A1').value=[[1, 2], [3, 4]]    
>>> sheet.range('A4').value='Hello World'    

結果如下 :




工作表內容部分放大如下 : 




讀取儲存格內容 : 

>>> sheet.range('A1').value    
1.0
>>> sheet.range('A1:B2').value    
[[1.0, 2.0], [3.0, 4.0]]
>>> sheet.range('A4').value   
'Hello World'

Range 物件可以用中括號 [] 進行索引 (indexing, 0 起始), 例如 : 

>>> sheet.range('A1:B2')[0, 0]    
<Range [活頁簿2]工作表1!$A$1>
>>> sheet.range('A1:B2')[1, 1]   
<Range [活頁簿2]工作表1!$B$2>
>>> sheet.range('A4')[0, 0]      
<Range [活頁簿2]工作表1!$A$4>

呼叫 Sheet 物件的 range() 方法會傳回一個 Range 物件, 如果它是一個包含多儲存格的矩形範圍, 就可以用 0 起始的 [列, 行] 索引來存取儲存格, 如果傳入 range() 的是像 'A1' 這樣的單一儲存格, 就只能用 [0, 0] 存取, 否則就會出現 IndexError :

>>> sheet.range('A4')[0, 1]    
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
  File "C:\Python37\lib\site-packages\xlwings\main.py", line 2332, in __getitem__
    "Column index %s out of range (%s columns)." % (col, n)
IndexError: Column index 1 out of range (1 columns).

除了可以用索引來存取 Range 物件的儲存格資料外, 也可以用切片 (slicing), 切片的結果也是傳回一個 Range 物件. 注意, 切片的索引是 0 起始的 (0 為首列首欄), 例如 : 

>>> sheet.range('A1:B2')[:, 1]   
<Range [活頁簿2]工作表1!$B$1:$B$2>
>>> sheet.range('A1:B2')[1, :]   
<Range [活頁簿2]工作表1!$A$2:$B$2>

上面第一個例子用 [:, 1] 切片, 表示取出 Range 物件所包含的範圍中 B 欄 (A 欄為 0, B 欄為 1, C 欄為 2, ...) 所有列的儲存格, 所以結果會傳回 B1 與 B2 儲存格組成之 Range 物件. 第二例用 [1, :] 切片, 表示要取出 Range 物件所包含的範圍中列 1 所有欄的儲存格, 故傳回 A2 與 B2 儲存格組成之 Range 物件. 


(4). 使用 sheet[] 取得 Range 物件 : 

除了呼叫 Sheet 物件的 range() 方法取得指定範圍儲存格之 Range 物件外, 也可以直接在 Sheet 物件上使用中括號 [] 來取得, [] 內可用上面 range() 方法的儲存格定位字元, 也可以 0 起始的 [列, 行] 索引, 例如 :

>>> sheet['A1']   
<Range [活頁簿2]工作表1!$A$1>     
>>> sheet['A1:B2']    
<Range [活頁簿2]工作表1!$A$1:$B$2>
>>> sheet['A4']    
<Range [活頁簿2]工作表1!$A$4>   
>>> sheet['A1'].value    
1.0   
>>> sheet['A1:B2'].value       
[[1.0, 2.0], [3.0, 4.0]]    
>>> sheet['A4'].value      
'Hello World'

可見與上面呼叫 range() 方法的結果相同. sheet[] 比 range() 方法還多了可用 0 起始索引取得 Range 物件的方法, 例如 : 

>>> sheet[0, 0]       
<Range [活頁簿2]工作表1!$A$1>
>>> sheet[:2, :2]       
<Range [活頁簿2]工作表1!$A$1:$B$2>
>>> sheet[3, 0]           # A4 在列 3 欄 0                 
<Range [活頁簿2]工作表1!$A$4>
>>> sheet[0, 0].value    
1.0
>>> sheet[:2, :2].value    
[[1.0, 2.0], [3.0, 4.0]]
>>> sheet[3, 0].value   
'Hello World'

可見也與上面呼叫 range() 方法的結果相同. 既然用 [] 運算符也可取得相同的 Range 物件, 當然也可以使用索引, 例如 : 

>>> sheet['A1:B2'][0, 0]    
<Range [活頁簿2]工作表1!$A$1>
>>> sheet['A1:B2'][1, 1]      
<Range [活頁簿2]工作表1!$B$2>
>>> sheet[:2, :2][0, 0]      
<Range [活頁簿2]工作表1!$A$1>
>>> sheet[:2, :2][1, 1]     
<Range [活頁簿2]工作表1!$B$2>

也可以使用切片 : 

>>> sheet['A1:B2'][:, 1]   
<Range [活頁簿2]工作表1!$B$1:$B$2>
>>> sheet['A1:B2'][1, :]   
<Range [活頁簿2]工作表1!$A$2:$B$2>
>>> sheet[:2, :2][:, 1]   
<Range [活頁簿2]工作表1!$B$1:$B$2>
>>> sheet[:2, :2][1, :]    
<Range [活頁簿2]工作表1!$A$2:$B$2>

兩組中括號很容易讓人忘記其意義, 第一個中括號是從 Sheet 物件中取得指定範圍的 Range 物件; 而第二個中括號則是在 Range 物件中進行索引或切片. 


(5). 呼叫 sheet.cells() 取得 Range 物件 :

取得 Range 物件還可以使用 Sheet 物件的 cells(列, 行) 方法並傳入 1 起始的列與行索引 (所以 A 欄是行 1, 首列是列 1), 但這只能取得單一儲存格, 例如 :   

>>> sheet.cells(1, 1)    
<Range [活頁簿2]工作表1!$A$1>    
>>> sheet.cells(4, 1)  
<Range [活頁簿2]工作表1!$A$4>   
>>> sheet.cells(1, 1).value    
1.0
>>> sheet.cells(4, 1).value         
'Hello World' 


(6). 修改儲存格內容 :

以上面幾種存取 Range 物件的方式修改儲存格內容 : 

>>> sheet.range('A1').value=5                     # 修改 A1 儲存格之值
>>> sheet['B1'].value=6                                # 修改 B1 儲存格之值
>>> sheet.range('A2:B2').value=[7, 8]         # 修改 A2, B2 儲存格之值
>>> sheet.cells(4, 1).value='Hello Tony!'     # 修改 A4 儲存格之值  

結果如下 : 




可見原來的四個儲存格內容都被改變了. 

參考 :