2020年12月31日 星期四

露天購買暖腳寶

這兩天寒流來襲, 我體質偏寒的人在辦公室即使穿著襪子都覺得腳冷, 我上回抽的露天免運券還剩一張須年底前用完, 所以就用來買了這款暖腳寶 :






此款為 5V 低壓 USB 款, 插 1A 的豆腐頭即可使用. 另外一個龍貓款本也考慮, 但還是選造型素一點的好了 :


高雄市圖網站改版

 今天登入市圖網站檢視借還書情況時發現市圖網站已改版, 版面變漂亮了 : 




但我覺得舊版的借閱書籍列表較好用, 它的表格較簡約緊湊, 一眼即知那些書將到期, 而新版這個將書的細節全部顯示在條目中, 需要拉上拉下很大幅度才能知道哪些書本周或下周將到期. 新版還有一個缺點, 不管是查詢已借之書或任何書目所花的時間都比以前要久. 

糟糕的是, 除了家庭卡可以登入外, 姐姐他們的帳號都無法登入, 剛剛打電話去詢問, 似乎蠻多人在抱怨, 好像剛上線有些問題待解決. 

2020-01-02 補充 :

可能升版不順, 今天退回原版了 :




還是原版簡約扼要, 不要升版吧!

汽車險 2021 續保

昨天下班想順路去尚運驗車, 還好有先打電話詢問發現強制險效期不足一個月無法驗車, 不然又白跑一趟. 今天聯絡和泰業務請她幫我處理, 項目跟往年一樣, 但保費略增, 今年的保單內容為 :




明年的內容為 :



任意險 4355 比今年的 4121 多出 234 元. 

同事建議可用明台的網路投保, 公司有專屬優惠, 但進入該網站後要輸入一堆汽車相關資訊, 例如出廠年月, 排氣量, 引擎號碼等, 實在很麻煩. 不知道的欄位隨便填試算結果也是 5000 多元, 乾脆還是打電話請來往多年的和泰業務處理較省事. 

最近處理車子保養保險得到兩幾個一直記不牢的重要經驗, 最好要盡早馬上處理, 不然會很麻煩 :
  • 保養技師建議換電瓶與輪胎時最好聽從, 因為電瓶超出年限時可能隨時會讓車子無法啟動; 而老輪胎在高速公路爆胎很危險. 
  • 收到驗車廠簡訊通知應該要驗車時最好盡快去, 因為這時該年度的強制險效期還有一個月以上, 可以順利驗車; 若拖到不足效期一個月時就得先買明年度的強制險才可以驗車 (今天就是這情況). 
  • 機車保養時順便做排氣檢測, 否則超過一定期限會收到罰單 (前陣子水某的機車就是接到警告信, 再不去檢驗就開單). 
愛拖拖拉拉的我常常忽視該立即處理的這些雜事, 常常到限期當天才急急忙忙處理, 徒增許多麻煩, 而這些都是可以避免的. 我的時間管理態度實在很糟糕, 即使用日曆提醒有時還是會忽視其重要性, 要改要改.  

2020年12月30日 星期三

Python 學習筆記 : 安裝外部函式庫 (套件)

自從上周在 "Python資料可視化之美" 這本書上看到 "人生苦短, 我用 Python" 這句話後, 決心收斂一統天下的野心, 之前熱中的 R 與 Julia 就暫時打住, 專心於學習 Python 技術. 首先就是把之前向母校借的幾本 Python 書看完 (其實是複習), 老老實實寫完筆記後就趕快歸還吧! 
Python 安裝後就已內建許多套件 (packages), 可以直接用 import 指令匯入使用, 這些內建套件稱為標準函式庫 (standard library). 我們也可以將自行開發的模組打包成套件分享給別人使用, 這種函式庫稱為外部函式庫或第三方套件 (third party packages), 例如 Pypi 網站即有許多高手上傳之第三方套件供人免費下載安裝, 目前已有高達 28 萬個函式庫專案 :



1. 安裝外部函式庫 :

在連網情況下可直接在命令列用 pip 指令安裝外部套件 (macOS 請用 pip3 指令) :

pip instal 套件名稱 

Python 在 3.4 版後內建了 pip 模組, 可以用下列指令更新 pip 版本, 例如 :

python -m pip install --upgrade pip      

C:\Users\User>python.exe -m pip install --upgrade pip  
Requirement already satisfied: pip in c:\python37\lib\site-packages (20.3.1)
Collecting pip
  Downloading pip-20.3.3-py2.py3-none-any.whl (1.5 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.3.1
    Uninstalling pip-20.3.1:
      Successfully uninstalled pip-20.3.1
Successfully installed pip-20.3.3

安裝套件指令如下 (macOS 用 pip3) :

pip install 套件名稱    

例如安裝媲美 R 語言繪圖函式庫 ggplot2 的 plotnine 繪圖套件 :

C:\Users\User>pip install plotnine   
Collecting plotnine
  Downloading plotnine-0.7.1-py3-none-any.whl (4.4 MB)
Requirement already satisfied: patsy>=0.5.1 in c:\python37\lib\site-packages (from plotnine) (0.5.1)
Requirement already satisfied: matplotlib>=3.1.1 in c:\python37\lib\site-packages (from plotnine) (3.2.1)
Requirement already satisfied: numpy>=1.16.0 in c:\python37\lib\site-packages (from plotnine) (1.16.0)
Requirement already satisfied: statsmodels>=0.11.1 in c:\python37\lib\site-packages (from plotnine) (0.12.1)
Requirement already satisfied: scipy>=1.2.0 in c:\python37\lib\site-packages (from plotnine) (1.4.1)
Collecting descartes>=1.1.0
  Downloading descartes-1.1.0-py3-none-any.whl (5.8 kB)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\python37\lib\site-packages (from matplotlib>=3.1.1->plotnine) (1.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\python37\lib\site-packages (from matplotlib>=3.1.1->plotnine) (2.3.1)
Requirement already satisfied: python-dateutil>=2.1 in c:\python37\lib\site-packages (from matplotlib>=3.1.1->plotnine) (2.7.5)
Requirement already satisfied: cycler>=0.10 in c:\python37\lib\site-packages (from matplotlib>=3.1.1->plotnine) (0.10.0)
Requirement already satisfied: six in c:\python37\lib\site-packages (from cycler>=0.10->matplotlib>=3.1.1->plotnine) (1.12.0)
Requirement already satisfied: setuptools in c:\python37\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=3.1.1->plotnine) (51.0.0)
Collecting mizani>=0.7.1
  Downloading mizani-0.7.2-py3-none-any.whl (62 kB)
Collecting pandas>=1.1.0
  Downloading pandas-1.2.0-cp37-cp37m-win_amd64.whl (9.1 MB)
Requirement already satisfied: pytz>=2017.3 in c:\python37\lib\site-packages (from pandas>=1.1.0->plotnine) (2018.9)
Collecting numpy>=1.16.0
  Using cached numpy-1.19.4-cp37-cp37m-win_amd64.whl (12.9 MB)
Collecting palettable
  Downloading palettable-3.3.0-py2.py3-none-any.whl (111 kB)
Installing collected packages: numpy, pandas, palettable, mizani, descartes, plotnine
  Attempting uninstall: numpy
    Found existing installation: numpy 1.16.0
    Uninstalling numpy-1.16.0:
      Successfully uninstalled numpy-1.16.0
  Attempting uninstall: pandas
    Found existing installation: pandas 0.24.0
    Uninstalling pandas-0.24.0:
      Successfully uninstalled pandas-0.24.0
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
tensorflow 2.3.1 requires numpy<1.19.0,>=1.16.0, but you have numpy 1.19.4 which is incompatible.
Successfully installed descartes-1.1.0 mizani-0.7.2 numpy-1.19.4 palettable-3.3.0 pandas-1.2.0 plotnine-0.7.1

注意, 最後的警語提示了可能的版本衝突問題, 因安裝 plotnine 過程中將原來的 Numpy 1.16.0 移除了, 改為安裝 plotnine 需要的 Numpy 1.19.4, 這可能造成 Tensflow 執行時出問題. 這種相依套件版本衝突的問題可用虛擬環境來解決. 

如果電腦無法連網或因為防火牆阻擋等原因導致安裝失敗, 則必須從連網電腦下載後再用 USB 複製過去用檔案離線安裝, 以安裝 plotnine 為例, 可先在 Pypi 網站下載檔案 : 




由圖可知 Pypi 提供 plotnine 的兩種安裝檔 : 上面那個是檔案型態為 wheel 的安裝包 (副檔名 .whl), 這是個二進位安裝檔不需編譯直接安裝 (速度較快), 但會與作業系統與 Python 版本有關, 故應下載環境相符之 wheel 檔才能正常安裝. 下面那個則是原始碼壓縮的安裝包 (副檔名 tar.gz,  .zip, 或 .tar 等), 安裝時會先解壓縮再編譯 (速度較慢). 

離線安裝指令是在 pip install 後面指定套件檔案路徑與名稱 :

pip install 套件安裝包檔案名稱   

例如 : 

pip install C:\Users\User\Downloads\plotnine-0.7.1-py3-none-any.whl   

有些套件若用在線方式一直無法順利安裝, 而 Pypi 網站又沒有提供 wheel 檔, 可以到加州大學爾灣分校流體力學實驗室的 Windows 二進位檔網站尋找, 下載適合之 wheel 檔下載 :


例如台股技術分析套件 TA-lib 的 wheel 檔如下 :




其中 cp38 表示適用於 CPython 版本 3.8, amd64 表示 64 位元的 Windows, 請選擇與電腦所安裝之 Python 版本相符之 wheel 檔, 否則無法安裝 (會出現版本不符訊息).


2. 顯示已安裝之套件列表 :

下列指令會顯示目前 Python 執行環境下已經安裝的套件與版本列表 :

 pip list    

例如 :

C:\Users\User>pip list    
Package                 Version
----------------------- -----------
-illow                  5.4.1
absl-py                 0.11.0
adafruit-ampy           1.0.7
appdirs                 1.4.4
astunparse              1.6.3
attrs                   19.3.0
backcall                0.1.0
beautifulsoup4          4.7.1
bleach                  3.1.0
bokeh                   2.2.3
cachetools              4.1.1
certifi                 2018.11.29
chardet                 3.0.4
Click                   7.0
colorama                0.4.1
control                 0.8.3
cycler                  0.10.0
Cython                  0.29.14
decorator               4.3.2
defusedxml              0.6.0
descartes               1.1.0
distlib                 0.3.1
Django                  1.11.27
django-contrib-comments 1.9.2
ecdsa                   0.13.2
eli5                    0.10.1
entrypoints             0.3
esptool                 2.6
filebrowser-safe        0.5.0
filelock                3.0.12
Flask                   1.1.1
........


3. 顯示某已安裝套件之資訊 :  

下列指令可顯示指定之已安裝套件資訊 :

pip show 套件名稱 

例如查詢數值運算套件 numpy 資訊 : 

C:\Users\User>pip show numpy    
Name: numpy
Version: 1.19.4
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: c:\python37\lib\site-packages
Requires:
Required-by: xgboost, torchvision, tensorflow, tensorboard, statsmodels, seaborn, scipy, scikit-learn, plotnine, patsy, pandas, opt-einsum, mizani, matplotlib, Keras-Preprocessing, h5py, gensim, eli5, control, bokeh

可見這些資訊包含作者, 目前安裝之版本, 套件摘要說明, 官網首頁, 以及哪些套件是基於此套件而建構的 (稱為相依套件) 等等. 


4. 移除已安裝之套件 : 

下列指令可移除已安裝之套件 :

pip uninstall 套件名稱   

例如移除圖片處理套件 pillow :

C:\Users\User>pip uninstall pillow   
Found existing installation: Pillow 8.0.1
Uninstalling Pillow-8.0.1:
  Would remove:
    c:\python37\lib\site-packages\pil\*
    c:\python37\lib\site-packages\pillow-8.0.1.dist-info\*
Proceed (y/n)? y
  Successfully uninstalled Pillow-8.0.1

移除前會用 Proceed 確認是否真的要移除. 

參考 : 


2020年12月29日 星期二

好書 : 我畢業五年用 ETF 賺到 400 萬

這本書已經續借第二次了, 後面有一票預約者必須歸還, 所以就快速翻過並做一下筆記. 此書作者是一位警大畢業的刑警, 雖然因為家境關係放棄國立大學而選警大, 但公務員穩定的收入卻成為可定期定額投資的優勢, 漸漸地用投資獲得的被動收入提升財務自由度. 作者曾擔任刑警與派出所所長等職務, 目前已辭警職轉任理財顧問. 他將自己的投資心得記錄在部落格, 對於初學理財者很有啟發性, 參考 :


心得與筆記摘要如下 :
  1. 指數股票型基金 (ETF) : 在股票市場交易的指數型基金. ETF 交易稅 0.1% 比股票的 0.3% 低. ETF 的管理費 (0~0.04%) 也比主動型基金 (1.5~2.5%) 低. ETF 追求與指數 (大盤) 一致的報酬, 而主動型基金則以打敗大盤為目標. 
  2. 儲蓄險的年化報酬率比定存還低 (唯一的好處是微薄的保障而已).
  3. 書是所有想致富的人最好的槓桿, 讀者只花了一本書的錢就能拜個大師學武功 (當然是要正確適合的好書), 比起上千, 上萬元的投資課程, 幾百塊就能讓我們不受時空限制學習理財知識. 
  4. "漫步華爾街" 的作者默基爾最推薦 "不需動腦的投資法", 即投資標的範圍廣泛, 買一檔即可分散風險的 ETF (指數股票型基金), 這尤其適合沒有時間研究與看盤的年輕上班族. 因為 :
    (1). 年輕人沒有足夠的資金去分散投資, 無法做投資組合
    (2). 年輕人沒有大筆資產可單筆投資, 必須逐月累積
    投資 ETF 不用煩惱投資組合也不用時時盯盤, 隨著時間推移錢會自己慢慢長大.
  5. 指數化被動投資最大的好處是多了很多時間, 不必再汲汲營營學一些用不上的技術追逐快錢, 反而能專心投資自己進修提升本業技能, 進而在工作上獲得晉級加薪, 創造更穩定更豐厚的主動收入 (開源), 可以擴大被動投資所需的資金池. 只有被動投資才能讓我們遠離焦慮, 認真生活. 
  6. 巴菲特名言 : 人生就像滾雪球, 你只要找到夠濕的雪 (5% 以上的穩定殖利率) 與夠長的山坡 (及早投資), 雪球就會越滾越大 (複利效應). 指數化投資就是那夠濕的雪, 你只要做好忽略短期波動的心理建設, 專注長期成長趨勢 (至少十年), 就能靠複利效果 (股息再投資) 累積可觀財富.  
  7. 決定我們是否幸福的不是金錢, 而是我們能否擁有生活上的自主權, 能否有足夠的人際交流, 以及能否充分發揮所長. 
  8. 巴菲特曾於 2006 年進行為期 10 年的一百萬美元 ETF 投資實驗, 並接受主動投資高手挑戰, 比賽於 2017 年結束時巴菲特的指數型被動投資以總報酬率 94%, 年化報酬率 8.5% 大勝挑戰者經理人賽德斯的總報酬率 24%, 年化報酬率 2.96%. 巴菲特勝利的原因在於被動投資的 "低成本", 只要時間一拉長, 低成本的效益就會展現其投資效益
  9. 投資 ETF 可用極低且合理成本拿到各投資市場的平均報酬率, 而且具有分散投資風險效果, 例如先鋒 Vanguard 的 VTI 投資美股 3680 檔股票; 而 VT 則投資全球 8167 檔股票. 
  10. 元大台灣五十 (0050) 總管理費用 0.44%; 中型 100 (0051) 則為 0.71%. 而投資全球的先鋒 VT 僅 0.09%, 故推薦用 VT 達到低成本全球分散投資目的 (投資美國中小型股的 VTI 與標普 500 的 VOO 總管理費用都是 0.03%, SPY 則是 0.0945%). 
  11. 作者推薦的六檔股票 ETF :
    VT (全球)
    VTI, SPY (美國)
    VXUS, IXUS, VEA (美國以外全球)
  12. 作者推薦的七檔美國債券 ETF :
    VGSH, SHY (短期 1~3 年)
    VGIT, IEI, IEF (中期 3~10 年)
    VGLT, TLT (長期 20 年期)
  13. 作者推薦的兩檔房地產 ETF (REITs) :
    VNQ (美國)
    VNQI (美國以外全球)
  14. 資產配置的三個面向 : 報酬, 風險, 流動性
  15. 作者給 ETF 新手的叮嚀 :
    (1). 總費用需低於 0.3%, 最好找免手續費券商
    (2). 要持續追蹤績效, 偏離度應小於 0.3%
    (3). 選擇資產規模大的 ETF 以避免清算
    (4). 每日成交量應大於10萬股, 買賣價差越小越好
    (5). 成立時間應滿三年. 
    (6). 選市場領導者例如 Vanguard 或 iShares
  16. 學者 Gary Brinson 研究發現, 資產配置決定了 91.5% 的投資報酬, 選股占了 4.6%, 而交易時機則僅貢獻 1.8%.
  17. 投資組合設計 Portfolio Viisualizer (點 Backtest Potforlio)
  18. ETF 定期定額報酬率試算 
  19. 作者個人的投資組合 :
    (1). 股 : VT
    (2). 債 : BND 
    可各占 50%, 獲利超過設定值後進行再平衡. 
  20. Harry Browne 的永久投資組合 (不追求高回報, 追求長期穩定獲利)
    VTI (25%) : 整體回報
    IEI (25%) : 穩定收益
    SHY (25%) : 避險
    IAU (25%) : 避險
書末有一段值得記一下, 亞馬遜的老闆貝佐斯曾經問巴菲特, 說您的投資理念簡單易懂, 也靠此成為世界第二富有的人, 為什麼大家不按照你的方法做呢? 巴菲特的回答是 : 因為沒有人想要慢慢變有錢! (都想快速致富). 投資觀念與做法正確與否決定了我們一生是否都要為錢煩惱, 而這正是我們教育中最缺乏的部分. 

2020年12月28日 星期一

好書 : Python 資料可視化之美

上周五去逛明儀時看到下面這本書 : 



Source : 博客來


此書特點是除了基本的 matplotlib/seaborn 外, 還介紹了 plotnine 繪圖套件, 這是比美 R 語言的 ggplot2 的專業繪圖函式庫 (本書還獲得 plotline 套件開發者親自寫序推薦), 看範例才知道原來還有這麼多看都沒看過的專業圖形, 這些是 matplotlib 畫不出來的. 但自覺目前沒時間看, 所以就拍封面存檔, 以後再買, 但昨天拆箱上回跟 momo 買的書, 赫然發現原來我已經買了 (66 折嘿嘿), 好險沒重複買同一本書. 

此書原始碼可在 GitHub 下載 :


在書店看了作者序言中提到的 "人生苦短, 我用 Python" 後, 突然從狂妄中醒過來, 我的興趣實在太廣泛了, 新技術見一個愛一個, 結果藝多不精. 回來後馬上把 R 語言收起來, 把借來的 Julia 書拿去還, Python 都學不完了, 哪有這麼多時間學別的, 真的.

向 AliExpress 購買 TL866II Plus 燒錄器

上周在露天對 TL866II Plus 做了一番市調, 確認可用來燒錄手上的 GAL ATF20V10/16V8 等 SPLD 晶片, 本來打算向露天一個附 6 個 IC 座的賣家下標, 但昨天打算再問詳細點時發現該賣家居然被停權, 真是傻眼 (但也好險沒下標). 參考 : 


看了其他賣家都價格在 2000 元以上, 今天改在 AliExpree 搜尋找到下面這家免運費的, 我選擇了其中附 17 件組的價格為美金 57.99 元, 約合台幣 1640 元左右, 跟那個被停權露天賣家價格差不多, 附件還多近三倍 (但須 20~40 天海運運送才能交貨) : 








訂單編號 Order ID: 8123744956431953, 所附的 17 個配件如下圖 : 


Source : AliExpress


其實我原本要跟另外一家買, 主要是其貨品圖片中有附光碟, 但後來看客戶留言才發現其實盒裝內並未附光碟 (因此被負評), 所以就 bye-bye 了 : 
參考 :



2021-01-15 補充 :

今天收到包裹了, 從下訂到收到或大約近三周, 還蠻快的, 從新加坡樟宜貨運中心發貨 (空運).

2020 年第 52 周記事

終於來到第 52 周, 2020 的最後一周. 最近在新聞上陸續看到先知與專家預言, 因為出現武肺變種病毒, 加上大國角力持續, 來年 2021 的世界似乎並不樂觀云云. 但我覺得沒有人能真正未卜先知, 與其窮擔心, 不如做好準備, 投資方面至少保有一半現金, 這是今年三月股災給我上的一課, 價值投資者最重要的是資金控管, 否則在跌勢中很快就彈盡援絕, 微笑曲線只走一半不到, 沒辦法笑到最後. 今天趁著 0056 回到填息價將持股出脫 1/4 左右. 

週六提早回鄉下, 因為婷婷說想跟我聊一下了解一下投資理財, 我想 40 歲才開始也不算晚 (應該說任何時候開始投資都不算晚). 其實對於還在為育兒忙得焦頭爛額的他們, 就是跟我一樣買 0050 跟 0056 就好, 具有輕鬆分散投資效果, 尤其 0056 對小資族有入手容易的好處, 但現在開放盤中買零股, 則買 0050 零股更好 (比 0056 更具成長性), 但考慮交易成本 (券商最低手續費是 20 元), 最好每次交易要超過 14030 元較划算, 以 0050 目前 119 元價格, 大概是買 118 股左右. 懶人投資法原則如下 : 
  1. 將交割理財戶設為聚寶盆帳戶, 閒錢或配息都匯進此帳戶且只進不出. 
  2. 0056 宜做差價交易, 除息日之後貼息時低價買進, 次年除息前幾日賣出, 即使沒來得及賣掉, 參加除息亦基本上有 5% 殖利率. 
  3. 0050 宜存股 (成長性較大), 只買不賣. 
  4. 不論 0056/0050, 秉持買黑不買紅, 股價大跌時才進場買進以降低持股成本. 
上周日雄太群組來鄉下家外燴時, 老張說湘雲想邀我為客家語文學會幫忙網路與資訊事務, 因為鍾老師今年被選為理事長, 她則是秘書長. 老師有交待的話當然義不容辭. 同時也應允當她的研究計畫助理, 幫忙處理網站與 Praat 語音處理. 客家語文學會網址 :


看來我要加緊 NLP 學研腳步, 希望多年來在資工方面的學習可應用在語言學研究上.

週三終於看完韓劇 "KAIROS (化時為機)", 看這部戲真的會燒死不少腦細胞, 因為時空不斷地在一個月前與一個月後切換, 有時都搞不清楚這一幕是現在還是過去. 在一直無法取得 18 年前的錄音證據情況下, 最後金瑞鎮以一個月後的自己當賭注, 透過 10:33 分的跨時空通話讓一個月前的韓艾莉以手機錄下劉會長親口承認的罪證. 看完後在 Wiki 查詢劇中姜炫彩的演出者為南奎里, 怎麼覺得有點眼熟, 原來她演出過 "我身後的陶斯" 中被暗殺的北韓核物理學家. 看完這部真的要停下來暫時不追劇了, 因為要學的東西還蠻多的, 追劇太浪費時間了. 

週日早上去種子行買了 40 株大陸妹與 30 株茼蒿來種, 算算應該可以趕上過年煮火鍋之用. 周日下午把菜園紅龍果旁的小舅種的那排玉米全採收了, 因為上回他把網架旁我種的玉米搜刮乾淨 (說等我周末回鄉下會太老云云), 作為交換囑我本周換我採收. 總共摘了約 20 支玉米, 分兩次用大鍋煮, 剛採下就入鍋味道最新鮮甜美, 種完菜苗跟爸在龍眼樹下大快朵頤連吃三支玉米. 





2020年12月27日 星期日

市圖還書 4 本

本周市圖還書 4 本 :
其中 Tableau 我只是借來翻翻看 Tableau 到底長怎樣, 結果 : 要學這軟體來做資料分析還得花很多時間, 如果會寫 Python 幹嘛多此一舉? 此書適合文科企管類學生使用, 且 Tableau 是付費商用軟體, 那就謝謝再聯絡. 

明儀買書一本 (俄語家教課)

前天逛明儀時看到 12 月剛出版的這本書 : 



Source : 博客來


因為姊姊大二開始就選修台大的俄語課, 問她要不要幫買這本給她, 她說 ok, 所以昨天回鄉下前去還書順路就過去買了. 

2020年12月26日 星期六

Google 密碼更改後須為應用程式重新申請密碼問題 (以利用 Gmail SMTP 寄信為例)

很久沒有遠端登入鄉下的樹莓派 Pi 3 了, 前幾天想更新裡面的 Python 套件版本, 這時才發現從上周四起就沒有收到樹莓派整點送出的 IP 通知信, 原以為是 Pi 3 當機, 打電話請爸幫我重開機還是一樣沒收到信. 昨晚用 VNC Connect 連線回鄉下的 Pi 沒問題, 可見應該是送信程式出問題. 

今天回到鄉下檢查 Pi 3, 執行 reportip3.py 發現問題出在登入 Gmail SMTP 伺服器失敗 : 

pi@raspberrypi:~ $ python3 reportip3.py   
current ip: 1.173.51.69 192.168.2.192
Traceback (most recent call last):
  File "reportip3.py", line 49, in <module>
    smtp.login("yhhuang1966@gmail.com", "yguxhsurqwpseksw")
  File "/usr/lib/python3.5/smtplib.py", line 729, in login
    raise last_exception
  File "/usr/lib/python3.5/smtplib.py", line 720, in login
    initial_response_ok=initial_response_ok)
  File "/usr/lib/python3.5/smtplib.py", line 641, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials i25sm32526844pgb.33 - gsmtp')

回想上周曾經改了 Google 登入密碼, 似乎是從那之後就沒收到 Pi 3 的信了. 有可能改 Gmail 密碼後原先為了應用程式申請的 SMTP 伺服器登入密碼也隨之失效, 必須重新申請. 但太久沒有用到 Google 兩階段驗證中的這個功能, 在帳戶管理頁面找了好久都不得其門而入, 最後在下面這篇文章找到答案 : 


原來要幫應用程式申請登入密碼的入口在此 : 


操作程序則參考 : 


輸入 Google 帳戶密碼登入後出現如下頁面 : 



  
按 "選取應用程式" 下拉式選單, 點選 "其他 (自訂名稱)" :




輸入可資識別之名稱後按 "產生" 鈕即可 :





黃色框中的字串就是應用程式登入 Google 的密碼, 複製下來貼到 Python 寄信程式 reportip3.py 的 smtp.login() 第二參數即可恢復整點寄信通報 IP 的功能了 : 

pi@raspberrypi:~ $ nano reportip3.py     
pi@raspberrypi:~ $ python3 reportip3.py     
current ip: 1.173.51.89 192.168.2.192   
Send mail successfully!
pi@raspberrypi:~ $

這次學到一個教訓, Google 帳戶登入密碼更改之後, 所有需要登入 Google 的第三方應用程式也必須隨之重新申請登入密碼, 否則可能無法運作. 

關於用 Python 傳送 email 參考 :


MicroPython on ESP8266 學習筆記 (二十五) : 安裝 logging (日誌) 模組

昨天收到一個網友留言詢問 MicroPython 是否能夠使用 logging 日誌功能, 這我倒從來沒測試過. 今天就用 D1 mini (ESP8266) 來測試看看, 使用的是 MicroPython 1.12 版韌體. 關於 logging 模組參考 CPython 的測試紀錄 :


D1 mini 開機後用 Putty 連線 COM 埠, 直接下 import logging 指令結果報錯, 可見 MicroPython 核心並未將此模組納入標準內建模組 :

MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
Type "help()" for more information.
>>> import logging    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: no module named 'logging'

到 Pypi 網站查詢發現其實已經有大德寫好了 micropython-logging 套件, 參考 :


根據說明, 這個套件只是 CPython 在嵌入式設備上的縮小版實作, 用來實現 MicroPython 上基本的事件紀錄功能 (event logging), 但它只是 CPython 的一個子集 (subset), 不支援下列功能 : 
  • 不支援事件傳播 (event propogation) : 亦即事件不會向上傳遞到上層.
  • 不支援過濾器 (filter) 功能
在 MicroPython 安裝第三方套件須先連網後用 upip.install() 安裝, 關於 ESP8266/ESP32 連接 WiFi 基地台方法可參考 :


MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
Type "help()" for more information.
>>> import network    
>>> sta=network.WLAN(network.STA_IF)   
>>> sta.active(True)   
>>> sta.connect('TonyNote8', '123456')   
>>> sta.ifconfig()   
('192.168.43.227', '255.255.255.0', '192.168.43.1', '192.168.43.1')

可見 ESP8266 已獲得路由器配發 192.168.43.227 位址, 表示已順利連網了. 此處是連上我三星 Note8 手機分享的熱點, 透過行動網路連上 Internet.  

接著用 os 模組檢視檔案系統 :

>>> import os   
>>> os.listdir()   
['boot.py']    

可見根目錄下只有一個 boot.py 開機程式而已. 

接著匯入 upip 模組並呼叫其 install() 函數來安裝 micropython-loggin 套件 :

>>> import upip   
>>> upip.install('micropython-logging')   
Installing to: /lib/
Warning: micropython.org SSL certificate is not validated
Installing micropython-logging 0.3 from https://micropython.org/pi/logging/logging-0.3.tar.gz

這樣就順利安裝 micropython-logging 套件了, 用 os.listdir() 再次檢視根目錄可發現多了一個 lib 目錄, 切換到此 lib 子目錄即可找到 logging.py 模組 : 

>>> os.listdir()  
['boot.py', 'lib']
>>> os.chdir('lib')    
>>> os.listdir()     
['logging.py']

所以雖然套件名稱是 micropython-logging, 但安裝進來的模組名稱仍與 CPython 一樣是 logging, 所以用法與 CPython 完全相同. 先將路徑切回根目錄 : 

>>> os.chdir('..')   
>>> os.listdir()   
['boot.py', 'lib']

然後就可以直接匯入 logging 模組, 並用 dir 觀察其結構 :

>>> import logging   
>>> dir(logging)    
['__class__', '__name__', 'info', 'sys', 'debug', 'DEBUG', 'getLogger', 'CRITICAL', 'ERROR', 'WARNING', 'INFO', 'NOTSET', '_level_dict', '_stream', 'Logger', '_level', '_loggers', 'basicConfig']

跟 CPython 比起來, MicroPython 版的 logging 真的是縮小集 : 

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.
>>> import logging  
>>> dir(logging)  
['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR', 'FATAL', 'FileHandler', 'Filter', 'Filterer', 'Formatter', 'Handler', 'INFO', 'LogRecord', 'Logger', 'LoggerAdapter', 'Manager', 'NOTSET', 'NullHandler', 'PercentStyle', 'PlaceHolder', 'RootLogger', 'StrFormatStyle', 'StreamHandler', 'StringTemplateStyle', 'Template', 'WARN', 'WARNING', '_STYLES', '_StderrHandler', '__all__', '__author__', '__builtins__', '__cached__', '__date__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__status__', '__version__', '_acquireLock', '_addHandlerRef', '_checkLevel', '_defaultFormatter', '_defaultLastResort', '_handlerList', '_handlers', '_levelToName', '_lock', '_logRecordFactory', '_loggerClass', '_nameToLevel', '_register_at_fork_acquire_release', '_releaseLock', '_removeHandlerRef', '_showwarning', '_srcfile', '_startTime', '_warnings_showwarning', 'addLevelName', 'atexit', 'basicConfig', 'captureWarnings', 'collections', 'critical', 'currentframe', 'debug', 'disable', 'error', 'exception', 'fatal', 'getLevelName', 'getLogRecordFactory', 'getLogger', 'getLoggerClass', 'info', 'io', 'lastResort', 'log', 'logMultiprocessing', 'logProcesses', 'logThreads', 'makeLogRecord', 'os', 'raiseExceptions', 'root', 'setLogRecordFactory', 'setLoggerClass', 'shutdown', 'sys', 'threading', 'time', 'traceback', 'warn', 'warning', 'warnings', 'weakref']

不過核心功能還是有的, 例如六個安全等級常數 : 

>>> logging.NOTSET  
0
>>> logging.DEBUG   
10
>>> logging.INFO   
20
>>> logging.WARNING    
30
>>> logging.ERROR   
40
>>> logging.CRITICAL     
50

但不能呼叫 addLevelName() 函數自訂安全等級與其名稱, 例如 :

>>> logging.addLevelName(35, 'MINOR')    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'addLevelName'

從上面 dir(logging) 結果可知, micropython-logging 套件僅支援 debug() 與 info() 這兩個日誌輸出函數, 且預設安全等級為 DEBUG, 等級高於此的 INFO 才會被記錄, 更高的 WARNING, ERROR, 與 CRITICAL 都不支援輸出 :

>>> logging.debug("debug message")    #未超過預設安全等級 DEBUG : 不輸出訊息
>>> logging.info("info message")            #超過預設安全等級 DEBUG : 輸出訊息
INFO:None:info message
>>> logging.warning("warning message")      #不支援 WARNING
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'warning'
>>> logging.error("error message")                 #不支援 ERROR
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'error'
>>> logging.critical("critical message")           #不支援 CRITICAL 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'critical'
 
可見目前僅支援 DEBUG 與 INFO 這兩種安全等級, 且預設為 DEBUG, 其他等級尚未支援. 

從上面 dir(logging) 中可知支援 basicConfig() 函數以設定日誌之安全層級設定, 例如預設為 DEBUG, 若改為 WARNING 的話, 呼叫 logging.info() 就不會輸出訊息了 :

>>> logging.info("info message")      #預設為 DEBUG, 而 INFO 等級超出 DEBUG 故會輸出
INFO:None:info message
>>> logging.basicConfig(level=logging.INFO)    #更改安全等級為 INFO 還是會輸出 INFO ???
>>> logging.info("info message")     
INFO:None:info message 
>>> logging.basicConfig(level=logging.WARNING)     #可設為 WARNING, 但不支援 warning()
>>> logging.info("info message")        #等級低於 WARNING 不輸出
>>> logging.warning("warning message")     #不支援 warning() 輸出
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'warning'

此處我覺得不解的是, 將安全等級設為 INFO 後再呼叫 info() 還是會輸出, 奇怪.  

另外 basicConfig() 也不支援 format 參數, 例如 : 

>>> logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(levelname)s : %(message)s') 
logging.basicConfig: format arg is not supported

糟糕的是竟然也未支援最重要的 filename 參數 :

>>> logging.basicConfig(level=logging.DEBUG,filename='mylog.txt')   
logging.basicConfig: filename arg is not supported

亦即只能顯示在 REPL 介面上, 無法儲存到檔案裡. 

呼叫 logging.getLogger() 會傳回一個 Logger 物件 : 

>>> logger = logging.getLogger(__name__)    
>>> logger    
<Logger object at 3fff1720>
>>> type(logger)    
<class 'Logger'>

用 Logger 輸出訊息時使用者欄位會變成 __main__ :

>>> logger.debug("hello1")   
DEBUG:__main__:hello1

總結來說, 雖然只有兩個安全層級且欠缺 filename 參數來指定紀錄檔, 但基本上還是堪用的. 不過我在下面這篇文章中卻發現可以設定 filename 且可呼叫 error(), critical() 等方法, 不清楚其測試環境是甚麼 :


2020年12月25日 星期五

加購手機 Type C 磁吸式充電傳輸頭

昨天發現三星 Note8 手機的磁吸式充電頭外殼掉了無法吸住充電線, 向露天原賣家加購磁吸頭一個 39 元, 參考 2018 年底的購買記錄 :


我只買三個 Type C 磁吸頭, 總價 39*3=117 元, 用 1212 抽取的四張免運券 OK 取貨付款免運費. 




其實還有圓頭的似乎也不錯, 可參考 : 


向 Aliexpress 購買 W2812 燈條 (2835 燈珠)

我在 2014 年開始玩 Arduino 時便曾經想過利用 Arduino 製作 LED 聖誕燈控制器, 將鄉下晒穀場旁的龍眼樹以及大門口的波蘿蜜樹掛上閃閃發亮, 韻律獨特的聖誕燈, 但想歸想, 一年復一年都沒有時間付諸實行, 乾脆先買現成的. 今天是 2020 年的聖誕節, 雖然來不及趕上佳節, 但可以用在農曆春節啊! 我在露天找到一家 :


這家產品使用 RF 遙控, 有 80 種閃爍模式, 最長 10 米 300 燈價格 $1490 元,  5 米 300 燈 $1190 元, 1 分 2 各兩米 $701 元, 1 分 4 各一米 $780 元. 五米以下是 USB 款, 以上都是插電款, 燈條具 IP65 防水功能附 3M 背膠, 需要時可撕掉隔離紙黏貼在牆壁上. 效果參考影片 :






但我在 AliExpress 找到更便宜的 : 


(2835 Waterproof, US Plug, 20m, Bluetooth) $23.36 (15m) 

此為中國賣家, 提供 2835 與 5050 兩種燈條, 兩者尺寸與功率不同, 2835 燈珠較小 (2.8*3.5*0.8mm), 5050 燈珠較大 (5*5*1.6mm). 2835 燈珠具有體積小散熱快亮度高與成本低等優點, 參考 : 


此產品燈珠壽命長達 50000 小時 (近六年), 使用 12V 變壓器. 遙控方式有三種 : 紅外線, 藍芽 (比紅外線貴約 1 美金), 以及 WiFi (比藍芽貴約 3 美金), 遙控距離與價格成正比 (WiFi 可遙控距離約 100~200 公尺). 遙控器使用 CR2025 鈕扣電池 (未附). 

可掃描 QR code 下載 Home Magic App 控制燈條 :




因為是 Apk 檔, 所以必須開啟允許安裝不明 App 選項, 安裝完成後自動顯示繁中介面 : 




考慮我家龍眼樹高度, 決定買 15m + WiFi 遙控這款, 它是 5m 一捲, 因此交貨會有三捲燈條, 以及 1 對 3 分接線 : 







總價 US$23.36 元 (訂單編號 Order ID: 8123429794791953), 以今天匯率 28.36 計, 約合台幣 663 元, 這是露天價格的 1/3 左右, 但交貨期約 30~40 天, 預計農曆春節前可收到. 

2020-01-06 補充 :

今天收到包裹, 12 天就收到了, 算快的. 本周拿回鄉下試試. 

2020年12月24日 星期四

國家實驗研究院台灣半導體研究中心研習課程

昨天二哥傳了國研院台灣半導體研究中心的研習課程單給我, 想在下個暑假報名參加 :


二哥自上大學後對半導體晶片設計就有興趣, 大一讀應用物理系時, 四年課程表著重在製程與材料方面; 大二轉入電機系後課程較多元, 可走製程或設計, 不過師資並不多, 如果想走晶片設計, 國研院這個學習課程可以嘗試看看 (南部上課地點在成大). 

如果向隅或時間所限也可以上網透過免費線上課程來學習 : 


不論是上實體課還是線上課都要先加入會員 :


不過申請資格僅限學校教職員/學生, 國研院, 業界 (限工業技術研究院), 其他研究單位 (限中研院/同步輻射中心), 我想加入會員都沒資格耶 : 




上過 IC 設計課程, 二哥打算去考國研院與經濟部工業局舉辦的 IC 布局設計能力檢定 : 


參考書籍 :


其中 "VLSI設計概論/實習(李博明, 唐經洲, 2005) 這本母校圖書館可借. "CMOS: Circuit Design, Layout, and Simulation" 這本 Wiley 在 2019 已出第四版

2020-12-26 補充 :

IC 設計是一個拚進度的高壓工作, 當年的磨練還是深深地烙印在我心裡, 驅動著我不斷學習新知識, 感謝當年給我機會的老長官.  

2020年12月23日 星期三

Python 3 內建的伺服器模組 http.server

週日雄太群組在鄉下家外燴, 與同學老張閒聊談到儀表板 (Dashboard) 技術, 一般常見的是使用 Excel 或 Tableau 等軟體, 但如果要在網站上使用, 使用 D3.js 可能較方便, 例如下面這本就是 :



Source : Amazon


此書的範例只需要放在靜態網頁伺服器即可, 因此作者推薦使用 Node.js 與 Python 3 內建的 http-server 模組即可, 如果電腦內本來就安裝了這兩種開發工具就不需要大費周章安裝 Apache 或 IIS 等伺服器了. 關於 http.server 模組參考 :


以 Python 3 為例, 只要在範例網頁所在的目錄以下列指令啟動 HTTP 伺服器即可 :

D:\test\html>python -m http.server 8080   
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [23/Dec/2020 16:01:08] "GET / HTTP/1.1" 200 -

我在此目錄下已放置了一個名為 index.htm 的網頁 :

<!DOCTYPE html>
<html>
<head>
  <title>HTML 測試</title>
  <meta charset="utf-8">
</head>
<body>
  <h1>Home</h1>
</body>
</html>

然後在 Chrome 網址列輸入 http://localhost:8080, 卻出現如下畫面 :




我明明是輸入 http 但最終卻被強制改為 https, 然後抱怨無法提供安全連線, 傻眼. 爬文發現 Chrome 可能是安全性考量會強制改為 https, 底下這篇有說明解除之方法 :


但我覺得要改這個有點麻煩, 改用 Edge 就可以完成測試了 :



如果是 Python 2 則使用 SimpleHTTPServer 模組, 參考 :


好書 : Math for Programmers

今天在 Manning 找到一本很棒的數學參考書 : 



Source : Manning


此書作者是一家資料科學軟體公司 Tachyus 的創辦人兼 CTO, 主要業務是利用物理學與機器學習工具幫能源產業 (石油與天然氣) 開發流量模擬軟體. 在招募人才的過程中發現要找到兼具深厚數學底子的軟體工程師並不容易, 因此改變策略為替公司的軟體工程師補強數學能力, 但作者發現市面上卻沒有一本適合的教材, 於是就自己著手寫了這本給程式員的數學課本. 

此書挑選了廣用且具備豐富數學函式庫的 Python 作為語言工具, 內容主要包含微積分與線性代數課題 (Part 1: 向量與圖形, Part 2 : 微積分與物理模擬, Part 3 : 機器學習), 例如多維空間, 函數空間, 導數與梯度, 函數優化, 以及資料預測等, 但很可惜地, 由於篇幅限制, 無法納入機率與統計 (可能會出第二集). 

2020年12月22日 星期二

好書 : Machine Learning with the Raspberry Pi

今天在天瓏看到使用一本好書, 談如何使用樹莓派做機器學習 (Apress, 2019) :



Source : 天瓏


雖然以前在 Pi 3 上跑機器學習的經驗是效能不太給力 (樹莓派的影像卡不是 nVidia 的, 不能跑 cuda), 但樹莓派內建視訊介面, 做 ML 影像處理還是可以的. 此書不會詳細講樹莓派使用上的方方面面, 只在第一章介紹如何讓樹莓派跑起來後, 第二章開始即切入 ML 主題, 包含 CNN/RNN 等. 

作者在介紹 ML 基本概念時為機器學習做了一個言簡意賅的定義 : 

"Machine learning is the science and art of creating algorithms to enable computers to learn from data without being explicitly programmed."

"機器學習是科學也是藝術, 透過創建的演算法來使電腦能從資料中學習規則之模型, 而非以程式寫出明確的規則."

程式的 if else 判斷敘述只能寫出有限且可掌握的模型, 但像人臉辨識或語音處理這種變幻莫測, 無法以有限的規則掌握其模型的應用, 就要靠機器學習才能辦到了. 

2020年12月21日 星期一

2020 年第 51 周記事

週五姐姐回到高雄, 大家去聯上 (就是之前的大八) 吃飯, 覺得跟以前比起來好多了, 不僅內部有改裝, 食物品項似乎也較多, 但我還是秉持八分飽原則, 只挑好吃想吃的, 否則就是虐待胃了. 

週六預約 QRV 10500 公里保養, 技師說電池從 106 年至今已超過三年, 雖然檢查結果還堪用, 但建議我應更換為宜, 我看數據還好, 就說那下次再換好了. 中午保養完成後經過河堤順路進去還書, 但上車發動卻似乎動不起來, 試了三次才啟動, 我想這可不行, 萬一開回大樓地下室下午要回鄉下時發不動那就麻煩了. 馬上將車開回廠, 但技師已午休, 故等到下午 1 點多才換電池, 以後電池方面還是聽技師的意見為好. 

週日雄太敬老團來到我家煮菜, 我一早就去退伍軍人拿豬腳, 這次前腳份量大 300 元, 因人數眾多, 請老闆切成較多塊. 這次改用滷可樂豬腳, 口感較甜些, 比上回好吃. 阿琪師一到我家便迅速卸貨備料, 開始煮起來, 因為峰大師的尊翁有糖尿病, 不宜太晚吃中飯. 我不知阿琪師要做炒飯, 理應少放一杯水, 這次炒飯有點像糯米糕, 但也很少吃幾乎完銷. 




本周學研進度還是繼續在讀 Python 正規式, 已看完四本書的相關章節了, 本周可以來做個測試與整理了. 

2020年12月15日 星期二

安裝 PLD 開發工具 WinCUPL

今天下載了 Atmel 的 PLD 開發工具 WinCUPL, 此公司於 2016 年被設計製造 PIC 微控器微聞名的 Microchip 併購, 下載網址如下 :


注意, 按 "Download WinCUPL" 似乎不會下載, 要在按鈕上按滑鼠右鍵選 "另存連結為" 才行, 安裝序號 60008009 也要記下來, 安裝完畢啟動程式時要輸入序號 : 




執行下載之 awincupl.exe (約 21MB) 會安裝 WinCUPL 與 WinSim 這兩個程式, 前者用來編輯 PLD 設定檔, 後者用來模擬電路, 安裝過程如下 :





注意這裡 User Name 與 Company Name 必須輸入才能進行下一步 : 








安裝完畢重啟電腦即可. 點選開始程式集中的 WinCUPL 會先彈出註冊視窗, Organization 欄輸入安裝時填寫的 Company Name, 序號欄填入 60008009 即可啟動程式了, 雖然此軟體已經有點舊了 (從聲明可於 XP/NT/Window 7 可知), 但仍能順利於 Win10 中執行 :




建立一個新專案後即可編輯 PLD 設定檔並將其編譯成 JEDEC 檔, 再用燒錄器寫入 PLD 中即可 :




我主要是使用 ATF16V8 與 ATF22V10 這兩款 GAL, 可燒錄此兩款 GAL 的燒錄器參考 :


WinCUPL 使用參考 : 

Introduction to Atmel ATF16V8C and WinCUPL (lecture notes): PDF (~287KB)
WinCUPL User's Guide: PDF (~350KB)
WinCUPL Tuturial and Supporting Docs: ZIP (~134KB)

CUPL 語法參考 :


Youtube 教學頻道 :


下面這篇論壇文章中談到 CUPL 語法比 Verilog/VHDL 容易學習 : 

"Compared to VHDL or Verilog, CUPL is much simpler. Just give each pin a name, provide a logic equation for each output, and you're done!"


其他 : 


好站 : PhD. Linden McClure 的嵌入式教學網站

PhD. Linden McClure 是科羅拉多州立大學 (CU) 電機系兼任教授, 我今天在找尋 GAL16V8 的資料時意外逛到他的教學網站, 哇, 資料超豐富, 大部分是授課教材與給實驗室學生的參考資料, 主要是嵌入式元件相關的, 例如 8051 與 ARM 晶片等, 我要找的是 ATF16V8 的 JEDEC 檔編輯軟體 WinCUPL 以及其燒錄方法資料 (他使用 NEI EMP-100 燒錄器), 轉貼如下 :

ATF16V8C SPLD Programming Guide for Phyton ChipProg-48: PDF (~343KB)
Introduction to Atmel ATF16V8C and WinCUPL (lecture notes): PDF (~287KB)
WinCUPL User's Guide: PDF (~350KB)
ATF16V8C Datasheet: PDF (~512KB) . Atmel ATF16V8C Link
WinCUPL Tuturial and Supporting Docs: ZIP (~134KB)

上面這些文件要好好來研讀一下, 我想先安裝 WinCUPL 熟悉一下軟體用法之後再來買 TL866II Plus 燒錄器, 參考 :