2021年1月31日 星期日

露天購買零件模組一批 (MCP3008 等)

因為樹莓派測試學習以及二哥數位邏輯實驗需要, 向露天賣家 f0266703 購買零組件一批, 趁 1 月份免運券今日到期前下標 : 
  1. SYB-500 組合麵包板 (4塊組合套裝) 萬能板/實驗板 [316409]W8-200115 (21904711261015) $189X1=189
  2. [庫存20200203]MCP3008-I/P[406317] $116X2=232
  3. USB電流電壓測試儀USB電壓電流錶 USB電流電壓測試儀雙表顯示 W1 [119624] $122X1=122
  4. 麵包板線 連接線 麵包板 專用線 麵包板跳線 140條盒裝SUNLEPHANT W177 $45X1=45
  5. LM324 LM324N 直插 DIP-14 四路運算放大器 [334775]W81-200707 $3X7=21
  6. 量多更便宜-相容3/2代 B型 B+ raspberry pi GPIO 40P 排線 DIY [316857]w3 $21X2=42
  7. 匯承HC-12 SI4463無線單片機串口模組 433遠距離1000M替代藍牙 [313440]W8-200115 $151X2=302
  8. TW 74LS85 相容SN74LS85N/HD74LS85P 邏輯-比較器 [339351]W81-200115 $13X2=26
  9. 半導體鐳射管/束 紅色點狀 6MM外徑 紅外線 鐳射頭3V W2 [137472] $5X4=20
  10. SN74LS83N DIP封裝 相容HD74LS83P 計數/除法器 [339326]W81-200115 (21918308711292) $21X2=42
  11. 直插 74LS73 SN74LS73N HD74LS73P DIP-14 邏輯-觸發器 [336355]W81-2001 $9X2=18
  12. 現貨 DIY測試線 鱷魚夾線 包皮的鱷魚夾 雙頭測試線 鱷魚夾線 1條 [89107-032]  $5X6=30
  13. SN74LS93N HD74LS93P 直插 DIP14 計數器4位5二進位器 [339818]W81-200115 $13X6=78
  14. MPU-6050模組 三軸加速度 陀螺儀6DOF模組 GY-521 [361000]W313-20200210 $33X3=99
  15. 直插 74LS75 D 型透明鎖存器 DIP-16 W2-1 [293258]W2-200813 (21901450649135) $28X2=56
  16. GY-68 BMP180 新款 BOSCH溫度 氣壓感測器模組 代替BMP085 W1035 [367082]  $21X4=84
  17. 雙軸按鍵搖杆 PS2遊戲搖杆控制杆感測器 電子積木 [313457]W8-200115 $14X8=112
  18. GY-BMP280-3.3 高精度大氣壓強感測器模組 高度計感測器 W1035 [367448] $17X4=68
  19. BUY360-不銹鋼助焊劑 電池極片 焊接電池 焊接鎳片 液體助焊劑液體松香 [320715] $89X1=89
  20. ATF16V8B-15PC DIP20封裝 可程式設計邏輯器 ATF16V8B-15PC [340215]W81-200 $15X12=180
  21. SN74LS147N 10線-4線和8線-3線優先編碼器 直插 DIP-14 [339247]W81-200115 $21X6=126
  22. GY-68 BMP180 新款 BOSCH溫度模組 氣壓感測器模組 代替BMP085 W8 [217373] $35X2=70
  23. 量多更便宜-國產 74HC595 74HC595N SN74HC595N DIP-16 邏輯-移位寄存器 [31672 $2X10=20
  24. 現貨 直插 74HC595 8位元串列輸入/輸出/並行輸出寄存器DIP-16 1個一拍 [137552-032] $3X5=15
  25. XL6009DC-DC可調升壓模組4.5-32V升5-55V 帶電壓表顯示SUNLEPHANT [9011814] $98X2=196

總價 2390 元, 但第三項在去年 5/1 也有購買, 但賣家說運送途中壓壞故位出貨, 應允下次扣除, 故 2390-122=2268 元. 參考 :



2021-02-17 補充 : 

賣家原本說月底才能交貨, 年初三收到簡訊說已到貨, 因姐姐初四要搭高鐵回台北, 故初三晚上載她回高雄時領貨, 清點後發現第 15 項 7475 無貨未出貨, 故老闆應退 120 + 56=176 元.

2021 年第 5 周記事

好快! 又一周了! 本周可說是快樂的一周, 因為年關將近, 春節獎金與績效獎金陸續到位, 連尾牙停辦轉換成全聯禮券也發下來了, 再過兩周就是過年, 我昨天也將前陽台沖洗乾淨, 下周要開始用斷捨離法整理置物櫃, 過期的, 不再用的, 全部丟掉或回收. 

本周努力清借書, 陸續還掉沒時間看的, 以及努力看完的書, 向母校借的一堆 Python 基礎書籍在過年前希望能清掉一半, 今年希望把學習重心放在 Python + ML + IoT (ESP32/Raspberry) + NLP, Python 是這一切的源頭, 不徹底做個了結不行. 

週四下班時去大林電子幫二哥找上周禾樺沒找到的 IC, 順便買了四個 40P 排針, 晚上將手上四塊 Pi Zero 板子拿出來將 GPIO 排針都焊上去, 下周二所借的書取回來後就開始來玩 GPIO 吧! 




今天去市圖還書時, 館員問我是不是老師, 我說不是, 但已經很多人這樣問我了, 新來的大樓管理員, 河堤圖書館的館員, 店員, .... 我已經被問了很多次. 老實說, 如果一切重來, 我會選擇念屏東師專, 如果那時不堅持己見, 現在已經可以退休領月退啦! 嗚嗚.

昨晚我在伏案讀書時, 小雖貓又跳上窗櫺找我玩, 喵了老半天我只好出去曬穀場陪它, 它就是希望有人可以給它磨磨蹭蹭. 有時不見蹤影只要去菜園呼喚, 它就會從某處跑回來, 爸說這傢伙似乎聽得懂人話, 有它在生活比較不無聊.

好書 : 懶系投資

此書借自市圖, 不多久就被預約了, 查看發現進書這麼多居然每一本都被借出, 可見此書很受歡迎. 作者風中追風是 2017 年由香港移居台灣的專業投資人, 其懶系投資法強調以最閒適方法帶來穩定持續的被動收入, 追求 "穩賺慢贏" 的財務自由之道, 並將心得發表於其部落格 : 



Source : 博客來


作者的懶系投資法的主要投資標的為能創造穩定現金流的資產, 分為固定收益資產與穩定收益資產兩類 :
  • 固定收益資產 :
    保本且固定配息的標的, 例如國債, 公司債, 交易所交易債券 (ETD), 優先股 (特別股) 等. 
  • 穩定收益資產 :
    不保本但配息較穩定的資產, 例如房地產信託基金 (REIT), 高股息公用事業股票, 債券基金, 商業信託基金等.  
這兩種資產是國際投資市場的主流, 例如債券市場就比股票市場歷史悠久, 以美國來說債券市場市值是股票市場的一倍以上. 

由於我沒時間從頭到尾看完, 以下僅就讀完的 1~3 章後摘要一些重點筆記如下, 以後回借看完後面主要內容時再回頭補充 :
  1. 真正的富人都在操作債券.
  2. 25~40 歲是人生最有精力的黃金時段, 應該投入在學識, 經驗, 工作, 專業, 人際關係的建立上, 才能更快地累積投資的第一桶金以便投入到被動收入資產的累積上. 
  3. 股票市場不一定是一分耕耘一分收穫, 因為有太多不可計算的因素互相影響. 
  4. 懶系投資法是在實行前充分評估報酬率, 投資時間與風險, 投資後以最少的時間定期檢視, 其餘時間置之不理, 讓投資組合在背後自動為你帶來現金流或自動增值. 懶系投資的目的是在可控可算的風險下, 安穩地得到最高報酬率, 合理年化報酬率為至少 10% (5~15%).
  5. 財務自由的意思是, 持有的資產所產生的被動收入大於每月生活費加上通膨, 使一個人或家庭毋須為活開銷而拼命工作的狀態. 財務自由並非退休, 而是一種可以更好地選擇自己生活方式的財務狀態. 
  6. 財務自由有一個天敵 : 通貨膨脹, 如果通貨膨脹率為 3%, 則大約 23 年後, 被動收入的購買力將只剩下一半. 美國財務自由的計算基礎為 SWR (Safe Withdrawal Rate), 即每年可從投資組合中安全提取現金, 但不會耗盡資金的經驗法則, 其中 4% 提領率公認為成功機會最高的法則, 方式為第一年提領 4%, 往後每年提領率為通貨膨脹率. 依此首年 4% 提領準則, 最低總資產為每年生活費的 25 倍, 以每月日常開銷加保險費 8 萬元台幣計, 最低總資產為 8*12*25=2400 萬元. 
  7. SWR 經驗法則取決於三個變數 : 
    (1). 預期投資報酬率
    (2). 預期餘年
    (3). 通膨
    以 3% 通膨來說, 只要投資報酬率大於 8%, 資產就永遠花不完了. 
  8. 權證根本就是設計用來幫大戶收割散戶的工具, 而穩定贏面較大的工具如債券則被設立重重關卡, 淪為富人專屬的投資工具, 導致人越富賺錢越容易現象. 
  9. 懶系投資法的評分項目 :
    (1). 價格穩定性 (平均波動幅度與受市場氛圍影響程度)
    (2). 投資技術簡亦度 
    (3). 資金門檻
    (4). 交易方便度
    (5). 損益可預測性
    (6). 抗通膨能力
    (7). 綜合懶系指數 (上面六項之加權綜合分數)
  10. 公司債並非項股票那樣在統一交易平台掛牌交易, 而是透過 OTC (Over-The-Counter) 市場交易. 只要債券不違約, 會定期回報約定之利息, 到期則償還本金, 一般每半年配息一次, 每個債券有其票息率 (Coupon Rate) 與到期日 (Maturity Date). 投資公司債最重要的是 : 到期日之前公司倒閉的機率. 若公司不幸破產, 債券投資者的償還順序還在股票投資人. 
  11. 債券的報酬率不是以票息率計算, 而是以殖利率 (yield) 計算, 即以買入價, 票息率, 到期收回面值, 以及債券年期計算實際報酬率. 懶系投資中的選債心法目標是挑選高回報又不會違約的債券. 
  12. 交易所交易債券 (ETD, Exchange-Traded Debt) 是在證交所交易的債券, 與傳統公司債不同的是它是在直接在美國股票市場掛牌交易, 發行金額一般是 25 美元 (較一般公司債門檻低故稱為 baby bond), 與一般公司債每半年配息一次不同的是, ETD 是每季配息一次, 美國 ETD 配息屬於利息, 不需繳 30% 的股息稅 (此為很大之優點). 大部分 ETD 到期日很長 (> 30 年或無到期日), 故通常配息率較高, 但波動與風險較一般公司債高.  
  13. 優先股 (preferred stock) 是介於公司債與普通股之間的商品, 與 ETD  一樣 IPO 時也是每股 25 美元, 其配息高於同公司之債券, 但對公司經營沒有參與權 (即投票權), 清算受償順序在債券之後, 普通股之前. 優先股與 ETD 最大的不同是, ETD 屬於債券, 不配息就是違約, 而優先股屬於股票, 公司在經營困難時可暫停配息, 若為累積式優先股日後會補派股息. 其次, 優先股股息 (dividend) 非美國投資者須繳 30% 股息稅 (這很不優啊, 但有些優先股股息免稅).  
  14. 房地產信託基金 (REITs) 是房地產 (商辦大樓, 酒店, 旅館, 住宅等) 信託並以股票形式交易的商品, 主要收入為物業租金, 配息率較高, 收益穩定且可有效對抗通膨, 但是與股市連動性高, 波動幅度也比較大, 故 REITs 不算是固定收益資產, 而屬於穩定收益資產. 台灣目前只有七檔 REITs : 富邦 1/2 號, 國泰 1/2 號, 新光 1 號, 圓滿 1 號, 與樂富 1 號, 殖利率約在 2.5%~3%, 比全球 > 5% 平均殖利率要低 (主因為國內 REITs 多委由銀行信託部門操作, 經營方式較保守, 而國外多由專業經理人管理, 經營態度較積極). 
  15. 商業信託基金 (Business Trust) 類似 REITs 也是信託方式經營, 但投資範圍不限, 通常是較穩定的電信, 能源, 球場, 酒店等, 其配息政策不似 REITs 之限制那麼大, 配息率變化較靈活, 但與 REITs 一樣因為與股市連動度高, 故一樣屬於穩定收益資產, 而非固定收益資產.
  16. 封閉型高收益債券基金 (CEF, Close-End Fund) 類似股票, 僅在 IPO 時募資 (在美國證交所上市), 上市後不再有新資金進入, 其特色為無認購費, 贖回費, 保管費等, 在費用, 交易方便性, 結構穩定性, 流通性, 透明度, 交易量等方面都比開放型基金 (例如聯博環球高收益基金, 安聯美元高收益基金等) 還要優, 且可使用槓桿交易. 較知名的封閉型債券基金例如 GOF, PFL, AWF 等大都是月配息, 是現金流投資的好選擇, 且因使用槓桿, 每年配息超過 10% 者很多. 美中不足的是, 封閉型高收益債券基金配息要繳 30% 股息稅 (雖然投資對象是公司債). 
  17. 封閉型市政債券基金投資對象是美國各州政府發行的債券, 穩定性與還款能力無庸置疑, 因與其他市場商品連動性較低, 波動幅度不大, 報酬率略低於封閉型高收益債券基金, 但配息免稅, 是懶系投資法可創造穩定現金流的投資工具. 
  18. 股票期權屬於技術含量較高的工具, 也無法創造穩定現金流, 不屬於懶系投資法, 但若操作得宜則可以創造額外收益. 做法是選定一檔波幅穩定可長期持有的股票 (例如高息股, 公用事業等), 在其相對低點賣出價外認購權 (short put) 收取權利金, 到期時若股價高於行使價即可賺到權利金, 但若股價低於行使價, 反正是可長期持有的股票就不妨低接. 在持有股票情況下, 於較格相對高點賣出認購權 (short covered call) 收取權利金, 如此不斷循環收取權利金, 也可創造現金流.   
  19. 懶系投資法是以現金流角度來選擇工具, 而非以價差或成長性角度. 
  20. 投資債券最大的風險是公司違約的信用風險, 因此分散投資在債券投資中非常非常重要, 最好是持有 10 檔左右, 太少沒有效果, 太多無法兼顧, 且分散效應已無差別. 美國網路券商如 FirstTrade (第一證券), InterActive Broker (盈透) 都有提供客戶投資不同級別的公司債, 甚至低到 1000~2000 美元即可購買一檔. 特別是盈透 (IB) 單一平台 (Trade Workstation System) 即可投資美國乃至全球市場股票, 債券, 外匯, 期貨, 權證等商品. 其 TWS 平台提供客戶兩種介面 : Classic (類似 Excel) 與 Mosaic (可容納多重訊息), 還內建 Bond Scanner 協助客戶篩選債券. 
  21. 投資公司債須花點時間研究公司體質, 最好是業務穩定且民生必需的, 例如電信電力或公用事業等, 穩定勝過一切; 其次是選市值或資產較大的, 萬一營運不善也較易被收購
在最後一章番外篇 "股票投資必勝密笈" 中, 作者談到一起做股票多年的會計師朋友多年來輸多贏少, 作者不解為何不用自己專業研究公司財報來幫助投資獲利, 回答居然是 "就是因為我是做會計的, 所以根本不相信上市公司的會計報告, 那些會計數字與損益可以根據老闆心意左挪右挪, 想怎樣就怎樣, 根本信不過", 這真是令人目瞪口呆! 說實在的, 價值投資須要鑽研枯燥乏味的財報, 是一種費時的長期心力勞動, 對毫無會計背景的散戶來說實在是不可能的任務.

除了財報專業外, 價值投資的可行性還有一個問題, 依據效率市場理論, 有能力挖掘財報發現投資潛力的專家不少, 這些潛力股應該早已被價值投資專家買進而反映到價格上, 那市場上剩下未被發掘的潛力股還有多少? 即使被你找到了, 還要去研究經營者是否正派誠信, 這其實是不容易的 (還有財報不實問題, 特別是中資), 最後可能還是要訴諸主觀的信任成分, "股票變成估票"!

作者也不贊同投資開放型基金, 認為其缺點 "罄竹難書", 90% 以上的開放型基金明明跑輸大盤, 仍然要收取昂貴的認購費, 管理費, 贖回費, 行政費, 分銷費, 績效費 ... 總之, 基金贏時收錢, 輸時也收錢, 還會在年底作帳來製造獲利錯覺! 雖然作者認為買指數 ETF 基本上跑贏 90% 的投資人, 但香港股市陷阱太多, 報酬率不穩定的風險要考慮. 

作者認為, 第一桶金投資應該要安全穩定, 其懶系投資法說穿了就是現金流投資法, 重點不在增值, 資本利得與投資績效, 而是要在可控的風險下實現現金流的穩定性, 衡量資產的真正價值要看其所帶來的現金流效率是否穩定, 例如債券 ETF 或高息公用事業股票, 資產配置最重要的是不要押在單一市場與單一資產上面, 特別是波動最大的股票! 

2021年1月30日 星期六

Python 學習筆記 : 用 zipfile 模組壓縮與解壓縮 zip 檔

在 "Python 程式超入門 (旗標, 鎌田正浩, 2016)" 這本書的第四章介紹了如何使用 zipfile 這個內建的標準函式庫來壓縮與解壓縮 zip 檔, 今天就來實測一下吧!  套件 zipfile 的說明文件參考 :


書上建議到 Python 官網下載一個 zip 檔來測試 (大小約為 5.7MB) :


下載之後將此 python-3.5.1-embed-win32.zip 檔放到工作目錄下, 例如 D:\test\python 下, 就可以開始測試了. 因為 zipfile 是內建模組, 所以 zipfile 可以直接匯入使用 :

import zipfile 

測試紀錄如下 : 


1. 解壓縮檔案 : 

壓縮檔案有 3 個步驟 : 

(1). 呼叫 zipfile.ZipFile("欲解壓縮之 zip 檔檔名"), 它會傳回一個 ZipFile 物件
(2). 呼叫 ZipFile 物件的 extract("欲解壓縮之檔案名稱", r"存放目錄") 方法
(3). 呼叫 close() 方法關閉 ZipFile 物件

如果要解壓縮全部檔案, 則要呼叫 extractall(r"存放目錄"). ZipFile() 函數其實有一個第二參數 mode, 其預設值為 'r' (讀取 zip 檔, 即解壓縮模式), 要壓縮檔案時須使用 mode='w', 要添加檔案到 zip 檔則使用 mode='a'. 

呼叫 zipfile 模組的 ZipFile("zip 檔名") 函數並傳入要解壓縮之 zip 檔之檔名 (含路徑), 它會傳回一個 ZipFile 物件 :

>>> import zipfile  
>>> files=zipfile.ZipFile("python-3.5.1-embed-win32.zip")     
>>> files    
<zipfile.ZipFile filename='python-3.5.1-embed-win32.zip' mode='r'>

可見傳回了一個 ZipFile 物件, 呼叫此物件之 namelist('filename') 方法會傳回一個由 zip 內被壓縮檔案名稱組成的串列 :

>>> files.namelist()    
['pyexpat.pyd', 'python.exe', 'python3.dll', 'python35.dll', 'python35.zip', 'pythonw.exe', 'pyvenv.cfg', 'select.pyd', 'sqlite3.dll', 'unicodedata.pyd', 'vcruntime140.dll', 'winsound.pyd', '_bz2.pyd', '_ctypes.pyd', '_decimal.pyd', '_elementtree.pyd', '_hashlib.pyd', '_lzma.pyd', '_msi.pyd', '_multiprocessing.pyd', '_overlapped.pyd', '_socket.pyd', '_sqlite3.pyd', '_ssl.pyd']

呼叫 ZipFile 物件的 extract('extracted_file', r'folder') 方法可將欲解壓縮的檔案 (第一參數) 解壓縮至指定的目錄下, 其中目錄字串前面要冠 r 表示此為 raw 字串, 這是必要的, 沒有冠 r 會出現執行錯誤. 例如解壓縮其中的 sqlite3.dll 檔案 :

>>> files.extract('sqlite3.dll', r'.')       # 將 sqlite3.dll 接壓縮至目前目錄下
'sqlite3.dll'  

此處解壓縮目錄字串 r'.' 中的一個點號表示目前的工作目錄, 檢查檔案總管確實多了一個 sqlite3.dll 檔, 重複執行此指令會蓋掉原先的檔案而不會出現詢問或錯誤訊息. 此指令亦可明確指定目錄, 例如 :

>>> files.extract('sqlite3.dll', r'd:\test\python')    
'd:\\test\\python\\sqlite3.dll' 

雖然與上面效果相同, 但傳回值不同 (帶了路徑資訊). 

呼叫 extractall(r'folder') 方法則可以解壓縮全部檔案於指定目錄下 (該目錄若不存在會自動建立), 例如 : 

>>> files.extractall(r'd:\test\python\foo')   

檢查檔案總管檔案確實在解壓縮後放在 d:\test\python\foo 下, 該 foo 目錄為自動建立. 




解壓縮完畢須呼叫 close() 關閉檔案物件以清除所占用之資源 :

>>> files.close() 


2. 壓縮檔案 : 

壓縮檔案有 3 個步驟 : 

(1). 呼叫 zipfile.ZipFile(r"zip 檔檔名", mode="w"), 它會傳回一個 ZipFile 物件
(2). 呼叫 ZipFile 物件的 write(r"欲壓縮之檔案名稱", "檔案標題") 方法
(3). 呼叫 close() 方法關閉 ZipFile 物件

注意, "zip 檔檔名" 字串前面要冠 r.

例如要將上面解壓縮到 d:\test\python\foo 目錄下的 sqlite3.dll 壓縮成 tmp.zip :

>>> tmpzip=zipfile.ZipFile(r"d:\test\python\foo\tmp.zip", mode="w")  
>>> tmpzip.write(r"d:\test\python\foo\sqlite3.dll", "sqlite3.dll")   
>>> tmpzip.close()     

注意,  write() 方法的第二參數為 namelist() 回傳串列中的檔案標題. 這時檢查 foo 目錄下確實產生了一個 tmp.zip 壓縮檔, 用佳壓縮程式開啟可知裡面有一個檔案 :




如果要在 tmp.zip 中添加檔案, 則再次呼叫 ZipFile() 開啟 zip 檔時要傳入第二參數 mode='a'. 

用 ZipFile() 函數開啟此 tmp.zip 後再呼叫 namelist() 可看到 zip 檔內檔案之標題, 例如 :

>>> files=zipfile.ZipFile(r"d:\test\python\foo\tmp.zip")    
>>> files.namelist()    
['sqlite3.dll']

串列中的顯示的就是上面呼叫 write() 時所傳進去的第二參數.

市圖還書 3 本 (邏輯設計/CPLD/Verilog)

 本周持續清理借書, 還了三本 :
No.1 有人預約需還 (此書為新文京出版的教科書, 內容扼要精簡且附習題與期末考題, 最小項化簡有含 Quine-McCluskey 與 Patric 化簡法); No.2 與 3 目前用不到, 借來主要是給二哥翻看看硬體設計主要內容是啥而已, 我短期內也不會重操舊業搞 IC 設計, 頂多玩一玩 GAL 罷了. 

2021年1月29日 星期五

好書 : Python 技術者們:練功!(The Quick Python Book 3rd)

今天在市圖找到一本 Python 好書 (長隊預約中) :



Source : 博客來


此書譯自 Python 軟體基金會主席 Naomi Ceder  的著作 : 

The Quick Python Book 3rd (Manning, 2018)


Source : 天瓏


此書篇幅頗長共有 25 章分成初始, 基礎與實戰三篇, 內容鉅細靡遺詳述 Python 語法的眉角, 特別是中譯版有許多譯者註解使本書可讀性增色不少. 書中範例可在旗標網站下載 :


不過, 必須先回答問題才能下載, 甚麼第幾頁第一個字是甚麼之類的, 我覺得這實在是多此一舉, 原文書出版商也沒這樣限制. 博碩就大方多了, 所出版的書, 書中範例都免費直接下載. 旗標是我買過的書裡面品質 No.1 的出版商, 不知道為何會做此限制. 

Python 學習筆記 : 製作 QR code 圖片的方法

向母校圖書館借的 "Python 程式超入門 (旗標, 鎌田正浩, 2016)" 這本書最後面介紹了 qrcode 這個套件, 可用來產生 QR code 圖片, 此套件可以直接用 pip 或 pip3 (macOS) 安裝 :

D:\test>pip3 install qrcode    
Collecting qrcode
  Downloading qrcode-6.1-py2.py3-none-any.whl (31 kB)
Requirement already satisfied: colorama in c:\python37\lib\site-packages (from qrcode) (0.4.1)
Requirement already satisfied: six in c:\python37\lib\site-packages (from qrcode) (1.12.0)
Installing collected packages: qrcode
Successfully installed qrcode-6.1

不過 qrcode 套件有用到另一個第三方套件 Pillow, 但安裝 qrcode 時不會同時安裝此相依套件, 必須自行安裝 (否則 import qrcode 時會報錯) : 

pip3 install Pillow 

參考 : 


匯入 qrcode 後呼叫 make() 函數並傳入字串會傳回一個 Pillow 的圖片物件, 例如 :

>>> import qrcode   
>>> img=qrcode.make("Hello World")     # 製作 "Hello World" 的 QR code
>>> img   
<qrcode.image.pil.PilImage object at 0x0000017EAE6F21D0>  

可見 make() 方法會傳回一個 PilImage 圖片物件, 呼叫此物件的 show() 方法可顯示圖形 :

>>> img.show()    




用手機 QR code App 掃描可解讀此字串 :





QR code 最常被用來掃描網址, 例如 :

>>> img=qrcode.make("https://yhhuang1966.blogspot.com/")    
>>> img.show()   




掃描結果 :





我的 GitHub 測試網站 :

>>> img=qrcode.make("https://github.com/tony1966/test")    
>>> img.show()   

 



QR code 確實很方便. 

Python 學習筆記 : 圖像處理套件 Pillow

向母校圖書館借的 "Python 程式超入門 (旗標, 鎌田正浩, 2016)" 這本書借來已久, 今天想還回去以便取新書, 所以隨便翻翻看值得學習測試的項目, 其中第 6-2 節介紹圖像處理套件 Pillow, 這是以前 Python 知名影像處理函式庫 PIL (Python Imaging Library) 的後繼者, 因為 PIL 已在 2009 年因為無法支援 Python 3 而停止開發 (PIL 只支援到 Python 2.7), 原始碼改由 Pillow 接手繼續開發, 參考 :



1. 安裝 Pillow : 

用 pip install 指令即可安裝 Pillow (macOS 需用 pip3) :

pip3 install Pillow 

D:\test\python>pip3 install Pillow    
Collecting Pillow
  Downloading Pillow-8.1.0-cp37-cp37m-win_amd64.whl (2.2 MB)
Installing collected packages: Pillow
Successfully installed Pillow-8.1.0

在樹莓派安裝 :

pi@raspberrypi:~ $ pip3 install Pillow
Collecting Pillow
  Downloading https://www.piwheels.org/simple/pillow/Pillow-7.2.0-cp35-cp35m-linux_armv7l.whl (1.2MB)
Installing collected packages: Pillow
Successfully installed Pillow-7.2.0

安裝完畢進入 Python 互動執行環境, 從 PIL 套件匯入 Image 模組 :

from PIL import Image  

D:\test\python>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image   
>>> 

沒有錯誤訊息即可開始用 Image 模組處理影像. 注意, 大部分的 Python 套件都是匯入套件名稱, 由於 Pillow 是繼承自 PIL 套件, 基於能與使用舊版 PIL 的程式相容, Pillow 仍舊是從 PIL 匯入, 而不是從 Pillow 匯入. 


2. 顯示圖像 : 

顯示圖像需先呼叫 Image.open() 開啟指定圖檔, 它會傳回一個 xxxImageFile 圖檔物件 (xxx 為圖檔類型, 例如 Jpeg 或 Png 等), 然後呼叫此圖檔物件的 show() 方法即可顯示圖像. 

下面範例以 Photoshop 書上常用的 Lenna.jpg 圖檔為例進行測試, 關於 Lenna 圖參考 :


Lenna 圖可在 Wiki 百科下載 :


下載後可將其改名為 Lenna.jpg 比較方便 :

>>> from PIL import Image 
>>> img=Image.open("Lenna.jpg")     #開啟圖檔傳回圖檔物件
>>> img    
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=300x300 at 0x17EAC996A58>

可見此為一個 300x300 的 JPEG 格式圖檔. 呼叫圖檔物件的 show() 方法會開啟作業系統預設看圖軟體來顯示此圖片, 在我的 Win10 筆電為 "相片" 軟體 :  

>>> img.show()       # 顯示圖檔





3. RGB 分色與重組 : 

呼叫圖檔物件的 split() 方法可將圖像中的 RGB 三原色分離出來, 此方法會傳回 R, G, B 三原色的 Image 圖檔物件, 所以要用三個變數儲存傳回值 : 

>>> r, g, b=img.split()      # 拆成 R, G, B 三原色物件
>>> print(r)   
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7BA8>  # 傳回 Image 物件
>>> print(g)  
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7BE0>
>>> print(b)   
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7C18>

這三原色的 Image 圖檔物件也是可以呼叫 show() 方法來顯示 : 

>>> r.show()    # 顯示紅色成分




>>> g.show()    # 顯示綠色成分




>>> b.show()     # 顯示藍色成分




呼叫 Image 模組的 merge() 函數並於第二參數位置以 (r, g, b) tuple 形式傳入三原色的 Image 物件可以組合成新的圖像, 如果 RGB 順序一樣會重組成原來的圖片, 若調換順序即可更換顏色, 例如下面範例是將 r (紅色) 與 b (藍色) 位置對調, 組合出的圖片變成藍色系 : 

>>> img_rb_change=Image.merge('RGB', (b, g, r))    # 紅色與藍色互換
>>> img_rb_change.show()       




此處將原本 (r, g, b) 的順序改成 (b, g, r), 重組後的圖片變成藍色系. 


4. 轉成黑白圖片 : 

呼叫圖片物件的 convert() 方法並傳入字串 '1' (用 1 個 bit 可表示 pixel 是黑或白) 可將彩色圖片轉換成黑白圖片 :

>>> img_black_white=img.convert('1')     
>>> img_black_white.show()    




將圖片放大可清晰看出顆粒狀的黑或白圖點 (pixel). 原本彩色圖片中的每一個圖點係以 R, G, B 三原色 (以值 0~255 表示該色彩的強度) 套疊成色, Pillow 的 convert('1') 採用下列公式將其轉換成黑白亮度 : 

L=0.299*R + 0.587*G + 0.114*B


5. 圖像旋轉 :

呼叫圖片物件的 transpose() 方法可以將圖片以特定的角度旋轉, 旋轉的角度由傳入參數決定, 共有五種角度 :


 角度參數 說明
 Image.ROTATE_90 將圖片向左旋轉 90 度
 Image.ROTATE_180 將圖片向左旋轉 180 度
 Image.ROTATE_270 將圖片向左旋轉 270 度
 Image.ROTATE_FLIP_LEFT_RIGHT 將圖片左右翻轉
 Image.ROTATE_FLIP_TOP_BOTTOM 將圖片上下翻轉


各項參數的測試結果如下 :

>>> img_trans_90=img.transpose(Image.ROTATE_90)     # 將向左旋轉 90 度
>>> img_trans_90.show()     





>>> img_trans_180=img.transpose(Image.ROTATE_180)     # 將向左旋轉 180 度
>>> img_trans_180.show()     




>>> img_trans_270=img.transpose(Image.ROTATE_270)     # 將向左旋轉 270 度
>>> img_trans_270.show()     




>>> img_flip_left_right=img.transpose(Image.FLIP_LEFT_RIGHT)     # 將圖片左右翻轉
>>> img_flip_left_right.show()     




>>> img_flip_top_bottom=img.transpose(Image.FLIP_TOP_BOTTOM)     # 將圖片上下翻轉
>>> img_flip_top_bottom.show()  





6. 圖像物件存檔 : 

呼叫圖像物件的 save() 方法可將物件儲存為圖片檔案, 例如 : 

>>> img.save("Lenna_new.jpg")    

檢查工作目錄會看到產生了一個新圖檔 Lenna_new.jpg.

以上為書中所舉範例的測試, 更多用法參考官網說明文件 :

 

2021年1月28日 星期四

好用的 Python 編輯器 Atom

我在向母校圖書館借的 "Python 程式超入門" 這本書裡看到 Atom 編輯器的介紹, 這是 GitHub 以 Javascript 的 Electron 框架為核心技術開發的跨平台開放原始碼純文字編輯器, 可用來編輯開發各種語言的程式 (我目前主要是用來編輯 Python, 但 Atom 還可以編輯 Javascript, PHP, C, 以及 R 等任何程式語言), 其特點如下 : 
  • 內建 git
  • 介面簡潔易用
  • 具有智慧型自動完成功能
  • 可自訂佈景主題
  • 內建豐富套件, 亦可自行安裝, 可擴充性佳
參考 : 


我個人覺得它的暗色背景比較不會傷眼, 


1. 下載 Atom : 

連線 Atom 官網會自動判別作業系統顯示對應之下載按鈕 : 


例如在 Windows (約 181MB) : 





而在 macOS 則顯示 :





Linux 安裝方式參考 : 


指令如下 : 

$ curl -L https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add - 
$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list' 
$ sudo apt update 
$ sudo apt install atom


2. 安裝 Atom : 

Windows : 點擊下載之檔案 AtomSetup-x64.exe 即開始安裝, 與一般軟體不同的是沒有一個一個步驟, 而是一鍵迅速完成安裝, 結果顯示如下畫面 : 




按 yes 或直接關閉 atom://URL 處理器視窗, 以及 Telemetry consent, Welcome 與 Welcome tutorial 等頁籤, 只留下 Project 頁籤即可. 


3. 介面繁體中文化 :

Atom 預設為英文介面, 可以透過安裝 cht-menu 使整個介面變成繁體中文. 點選左上角的 "File/Settings" :




點選 "Install", 在 Install Packages 框中填入 "cht-menu"  後按 Install 鈕即下載安裝 :




完成後即變成繁中介面了 : 





3. 新增工作目錄 : 

按左方 Add folder 鈕, 指定檔案總管中的工作目錄 : 




這樣左邊就會出現該公作目錄下的檔案列表, 點選其中的 Python 文字檔開啟檔案 : 




5. 安裝 Python 自動完成套件 autocomplete-python :  

與安裝中文化套件 cht-menu 方式一樣, 搜尋 autocomplete-python 套件後安裝 : 





按底下的 Add kite 可下載安裝自動補齊增強版套件 kite. 但是, 我實際開啟一個空白檔案來編輯 Python 程式, 卻沒看到有自動補齊功能, 到底哪裡還要設定? 


6. 安裝 atom-python-run 套件 :

此套件可在 Atom 中執行 Python 程式 : 




購買樂捷一年份 (2021)

上週爸說樂捷剩下一盒, 所以今天在台視真享購網站買 12 盒 (一年份) : 




這價格比往年還要便宜, 參考 :

購買樂活樂捷 : 2018 年 16500 元
購買長春樂活樂捷 : 2019 年 15515 元
# 購買樂捷一年份 (12 盒) : 2020 年 16500 元

以前買過好關鍵, 2018 年改買樂捷, 爸說好像還不錯. 

2021年1月27日 星期三

生日手環

今天下班回到家水某說要帶菁菁去漢神看手環, 因為她從 15 歲起每年都用自己存的零用錢生日時去買一條手鍊 (聽來好像有點心酸), 現在 18 歲算成年了, 想買個 Pandora 手環給她當生日禮物, 姊姊也是一月壽星, 她滿 20 歲時在台北也沒買個禮物 (姊姊通常都說不用啦), 所以也買了一個給她, 當然還有水某她自己. 想想我好像只有姊姊她們小時候買過生日禮物耶 (慚愧), 上國中之後就都是去聚餐了 (因為買禮物很傷腦筋), 嗯, 為了寵一下家裡的三個女人, 那就老爸我買單吧 (突然覺得自己很霸氣, 呵呵)! 

樹莓派學習筆記 : GPIO 輸出入介面

樹莓派的 GPIO (General Purpose Input Output, 通用輸出入介面) 是樹莓派與外界感測器 (sensor, 例如溫溼度, 亮度, 聲音, 氣壓等) 與致動器 (actuator, 例如馬達, LED, 繼電器等) 溝通的介面, 早期第一代樹莓派 Pi B+ 的 GPIO 為 26 支接腳, 但 Pi 2 之後的樹莓派板子則都是 40 支腳, 前 26 支接腳與 Pi B+ 的完全一樣 (即腳位相容), 因此以前為 Pi 1 B+ 所寫的 GPIO 程式仍可在 Pi 2 以後的樹莓派上順利執行, 參考 :


參考書籍 :



1. GPIO 硬體接腳配置 : 

GPIO 腳的編號方式有兩種 : 
  • BCM : 與 CPU 的 IO 腳編號相同.
  • BOARD : 腳座在上, 下排最左為腳 1, 上排最左為 2, 上下交替排列至上排最右為腳 40.
通常使用 BCM 編號較方便. 




配合 RPi.GPIO 模組, 部分 GPIO 接腳有特定用途, 如下表所示  : 


 特定功能 說明
 UART 14 (TX), 15 (RX)
 I2C 0 (EEPROM Data), 1 (EEPROM clock), 2 (SDA), 3 (SCL)
 SPI0 7 (CE1), 8 (CE0), 9 (MISO), 10 (MOSI), 11 (SCLK) 
 SPI1 16 (CE2), 17 (CE1), 18 (CE2), 19 (MISO), 20 (MOSI), 21 (SCLK)
 PWM  12, 13, 18, 19 (硬體 PWM), 全部 GPIO 均可軟體設定為 PWM 功能


注意, 硬體 PWM 能提供誤差較小且穩定的輸出 (伺服馬達控制需要穩定之 PWM), 目前 RPi.GPIO 尚未支援硬體 PWM, 但 WiringPi2 函式庫則有. 其次, 基本上 SPI 有 MOSI,MISO, SCLK 與 SS (Slave Select) 這四支腳, SS 腳用來致能 (enable) 特定裝置 (即 Slave 設備) 用的, 但樹莓派不用 SS 這名稱,而是用 CE (chip select).

參考 : 


這些 GPIO 腳可用母-公杜邦線接到麵包板, 若杜邦線不夠長, 也可以先用 40P 母-母排線全部接出來, 再用公-公杜邦線接到麵包板上, 或搭配 T 型轉板 (擴展板).  參考 :



2. RPi.GPIO 模組 : 

樹莓派使用 RPi.GPIO 套件控制 GPIO 接腳, 此套件已內建於樹莓派 Raspbian 作業系統的 Python 中毋須安裝, 直接 import 即可使用 : 

>>> import RPi.GPIO as GPIO   
>>> GPIO.VERSION            #檢視 RPi.GPIO 版本 (也可以在終端機下 pip3 list)
'0.6.3'   
>>> dir(GPIO)      #檢視物件內容
['BCM', 'BOARD', 'BOTH', 'FALLING', 'HARD_PWM', 'HIGH', 'I2C', 'IN', 'LOW', 'OUT', 'PUD_DOWN', 'PUD_OFF', 'PUD_UP', 'PWM', 'RISING', 'RPI_INFO', 'RPI_REVISION', 'SERIAL', 'SPI', 'UNKNOWN', 'VERSION', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_event_callback', 'add_event_detect', 'cleanup', 'event_detected', 'getmode', 'gpio_function', 'input', 'output', 'remove_event_detect', 'setmode', 'setup', 'setwarnings', 'wait_for_edge']

目前最新版本為 0.7.0, 可以直接用 pip 附 upgrade 參數升級 RPi.GPIO 版本 : 

sudo pip install --upgrade RPi.GPIO

pi@raspberrypi:~ $ sudo pip install --upgrade RPi.GPIO    
Collecting RPi.GPIO
  Downloading https://www.piwheels.org/simple/rpi-gpio/RPi.GPIO-0.7.0-cp35-cp35m-linux_armv7l.whl (67kB)
Installing collected packages: RPi.GPIO
  Found existing installation: RPi.GPIO 0.6.3
    Not uninstalling rpi.gpio at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed RPi.GPIO-0.7.0

安裝好後再次進入 Python 環境檢查 :

pi@raspberrypi:~ $ python   
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO   
>>> GPIO.VERSION    
'0.7.0'   

可見確實已升級到最新版本.

參考 : 


但要注意的是, 由於 Linux 是多人多工作業系統, 所以 RPi.GPIO 模組不適合用在實時控制 (real time) 的場合, 對 timing 要求很高的話應該改用 RTOS 作業系統. 


3. 上拉電阻與下拉電阻 : 

GPIO數位輸入腳時應該視功能需要 (即預設值) 添加一個上拉電阻 (pull-up, 低態動作時) 或下拉電阻 (pull-down, 高態動作時), 如果懸空的話其位準為不確定, 雖然對於 CMOS 來說通常會是 High, 但那並不保證, 可能造成程式執行結果異常, 因為懸空的輸入腳宛如天線, 電磁干擾會使其處於非預期的位準. 外加的上拉或下拉電阻建議不要低於 10K 歐姆 (特別是電池供電時). 

樹莓派的 CPU 本身有內建上拉電阻或下拉電阻 (預設關閉, 需設定才會開啟), 利用此功能可以不需用外加電阻即可達到避免接腳浮接 (floating) 造成的位準不確定問題. 不過哪支 GPIO 腳具有上拉或下拉電阻是特定的, GPIO 0~8 內建上拉電阻, 而 GPIO 9~27 內建下拉電阻 : 


 內建電阻 GPIO 腳 (BCM 編號)
 上拉電阻 0 ~ 8
 下拉電阻 9 ~ 27


內建上拉與下拉電阻值大約是 50K~65K 歐姆 (接內部的 3.3V 或 GND), 但 GPIO2 與 GPIO3 例外, 因為此二腳內定為 I2C 的 SDA 與 SCL 接腳, 內部固定為 1.8K 歐姆上拉電阻, 且無法用軟體取消. 參考 :



4. 類比輸出入 : 

樹莓派 GPIO 全部都是數位輸出入腳, 沒有提供類比輸出入腳, 必須透過外接晶片支援類比輸出與讀取, 例如讀取類比輸入可用 MCP 3004/3008 (ADC),  輸出類比信號可用 MCP 4901/4911/4912 (DAC) 等晶片. 

參考 : 

2021年1月25日 星期一

ETF 0050 & 0056 報酬率試算

今天在整理 Chrome 書籤時發現之前瀏覽過 MoneyDJ 理財網的 ETF 報酬率試算網站, 只要填入標的代號, 投資起訖日期 (至今), 每月扣款金額, 就會算出投資期間的報酬率與資產總額, 可藉此預估未來投資效益與選擇適合之標的, 網址如下 :


以每月扣款 1 萬元為例, 元大 0056 從 2007 年底成立至今 13 年報酬率如下 : 




可見 13 年來總投入金額 157 萬元, 目前資產總額 295 萬元, 約投入金額的近 2 倍. 

而元大 0050.tw 自 2003 年中成立至今 17 年, 每月扣款 10000 元報酬率如下 :




可見 17 年來投入金額 212 萬, 目前資產總額 693 萬, 為投入金額的 3.2 倍, 且以年化報酬率 (即複利) 6.97% 無情輾壓 0056 的 4.92%; 雖然 0050 投資期間比 0056 多 4 年 (投入本金差 55 萬), 但資產總值卻是 0056 的 2.3 倍, 因此理財專家說 0050 較 0056 適合存股是有道理的, 只靠簡單的 buy and hold 傻瓜買進持有投資法就能以 200 萬成本創造出近 700 萬的資產, 這就是成長性+複利的威力. 而這 17 年你可以專心工作, 閒暇時經營你的生活與興趣, 根本不用去看甚麼線圖與技術指標, 也不須研究產業前景等等這些毫無生活情趣的東西. 

如果從 25 歲出社會開始買進持有 0050 到 65 歲退休, 假定年化報酬率固定為 6.97%, 每個月固定扣繳 10000 元, 可用鉅亨網的基金試算網站估算退休時的資產總值大約為 2618 萬元 : 





這 2618 萬元的 0050 股票退休後也不用賣掉, 光靠股息就可以過上舒服的退休生活了. 以歷年至今平均值利率 3.4% 計算, 每年領回股息為 2618 萬*3.4%=89 萬, 相當於月薪 7.4 萬元領到天年, 如果不想留太多遺產, 那就每個月賣一張股票, 以現在股價 130 元計, 2618 萬相當於 200 張股票, 一個月賣一張要近 17 年才賣得完, 那時已經 81 歲了. 每個月賣一張變現 13 萬元, 加上配息月入 7.4 萬, 合計 20.4 萬元似乎有點多 (更別說 40 年後股價不只 130 元), 那就兩個月賣一張, 那要 34 年才賣得完, 屆時已經 65+34=99 歲了, 所以不需要那麼累去研究股票, 只要 "趁早" 定期定額投資 0050 就可以輕鬆退休了, 難怪巴菲特要勸人買 ETF 就好. 

巴菲特說 : "投資如同滾雪球, 重點是要找到夠濕的雪以及夠長的坡", 這夠濕的雪即年化報酬率要夠好夠穩定 (6% 以上), 而夠長的坡就是要及早投資, 如果到了 45 歲才開始準備自己的退休金, 離 65 歲還有 20 年, 則同樣每月扣款投資 0050 退休時總資產只有 522 萬元, 是 25 歲開始投資的人的 1/5 而已 :





如果要達到 2610 萬資產規模, 則 45 歲開始每個月要扣款的金額是 50000 元 : 




所以投資要趁早, 複利的威力主要來自於時間的次方 (指數), 只要週期性地投資指數型資產, 時間的指數魔力就會漸漸發酵. 前陣子看到一篇文章說, 大意是說亞馬遜老闆貝佐夫曾經問巴菲特, 你的投資方法如此簡單有效, 讓你成為世界第二富有的人, 但是為什麼大家不跟你一樣做呢? 巴菲特答說, 因為沒人想要慢慢致富. 現在很多年輕人衝進市場玩起當沖, 為的就是要賺快錢, 但高頻交易就算有收穫, 也被稅費吃掉一大半, 汲汲營營最後肥的是莊家. 

0050 平均股息殖利率參考 GoodInfo :