2019年4月30日 星期二

2019 年第 17 周記事

今天已經週二, 時序來到四月底了, 這幾天在準備 Logic Design 授課資料, 大部分學習研究進度都暫停下來, 希望未來一周至少要能完成一半進度才不會太趕, 早一點弄完簡報便能早一點回歸正軌.

過去兩周二哥先後收到嘉義大學電物系與東華大學物理系錄取通知, 目前還在想要去哪兒, 好像較偏向東華. 明日高雄大學也要放榜, 據說與中山大學合併已經有眉目了, 說是明年就能併, 是否因此拉高今年高雄大學錄取成績也說不定.

週日早上去屏東殯儀館參加同事大雄尊翁告別式, 適逢假日大部分只送奠儀而不去公祭, 我因要回鄉下原本猶豫去或不去, 但想到母親告別式雄哥有來鄉下弔唁, 沒去與禮不合. 經探詢僅六人參加, 好像人數單薄些, 週六臨時決定參加公祭. 不過太久沒去屏東, 又太晚出發, 導航繞錯路差一點就趕不上公祭時間. 以後這種場合務必提早出發, 誤了時辰就失禮了.

晒穀場前龍眼樹上的蘭花最近三種都盛開, 非常好看 :




週六下午回到鄉下巡菜園時又發現好多顆芒果沒套袋, 趕緊找舊袋子來套, 沒想到也用掉了 20 多個袋子. 四季芒果已經非常大顆, 但掛在百香果藤架上面看不到, 結果已有一顆熟到爛掉了, 索性全部採下再用蘋果催熟.

2019年4月28日 星期日

好書 : Best Django Books (2019)

今天在網路上看到 Will Vicent 部落格介紹的 Django 好書 :

Best Django Books (2019)

最近因為準備 Logic Design 簡報暫停 Django 學習, 要六月份才能回來, Just wait!

2019年4月27日 星期六

邏輯設計線上教材

這兩周在準備邏輯設計課的上課簡報時找到了一些很棒的線上教材, 可以提供給學生們課後複習之用 :
  1. Tutorialspoint : Digital Sequential Circuits  
  2. Electronics Tutorials : Sequential Logic Circuits 
  3. Slide : Sequential Logic Circuit  
  4. Introduction to Digital Logic
邏輯設計的重心是序向電路, 組合邏輯只是必要的餐前菜.

2019年4月26日 星期五

東華大學個人申請入學放榜

今早收到二哥傳訊, 東華個人申請入學放榜, 二哥是物理系正取, 這下他要傷腦筋要去嘉義大學電子物理系還是東華物理系了.

東華校園美, 但是在花蓮交通不便, 在開學前要上網先修 Python 與 R 這點表示教學單位蠻用心的; 嘉義電物去面試時覺得那邊的老師與教學環境很不錯, 所以有點難選.

購買二哥的 Surface Laptop 2 筆電

之前二哥跟我提說上大學要買一台筆電, 最近一直提醒我微軟 Surface 筆電學生優惠專案快到期, 但這回他改成想買 Book 2, 前天去燦坤看機, 哇塞, Book 2 也太重了吧? 而且價格高達 78000 元也是高貴價, 我認為這麼重的筆電攜帶不方便, 可拆式螢幕雖說可當作平板看電子書, 但太大塊很重不實用, 例如在火車上突然要看時還得開機按下脫離鈕才能將螢幕與鍵盤分離, 還不如一般平板方便.

討論後覺得還是買原先的 Laptop 2, 閱讀電子書另外買 Sony 的電子紙閱讀器 DPT-RP1 兩種用途分開比較好. 昨天下班經過全國電子進去確定有學生九折方案; 飯後去燦坤問也有, 但只到 4/25 為止, 只要影印學生證正反面即可, 但二哥學生證不知是放在學校還是掉了, 所以還是照程序在網路上列印購買單之後去全國電子購買. 全國的好處是連加購藍芽滑鼠也是打九折.

https://www.microsoft.com/zh-tw/surface/business/surface-laptop-2

規格 : i7-8650U 8GB DRAM 256GB SSD
螢幕 : 13.5 吋 10 點觸控 2256*1504 (201 ppi)
重量 : 1252g
電池 : 14.5 小時
內顯 : Intel UHD620
定價 : $51488 打九折=46339 元

參考 :

# PChome :Surface Laptop2 LQQ-00050 (i7-8650U/8G/256G/W10/鈷藍)

加購藍芽滑鼠定價 : 2490 打九折=2241

合計 46339 + 2241=48580 元 刷卡可五期無息, 每期 9716 元.

2019-04-26 補充 :

在露天購買 Laptop 2 專用電腦包 :

# ANCASE surface laptop2 / book2 13.5 內層棉 電腦包保護套殼電腦包 $1190

含運 60 共 1250 元.



2019年4月25日 星期四

好書 : Hands-on machine learning with scikit-learn and tensorflow

此書從母校高科大借來有一段時間了, 最近翻開來看覺得寫得還不錯, 理論與實作兼有之, 打算有空按圖索驥研究練習, 打好 ML 基本功. 此書分兩部分, 前 8 章為基礎篇, 主要講述機器學習基本演算法 (使用 Scikit-learn 函式庫); 第 9 章以後則為 TensorFlow 部分, 例如深度學習與捲積神經網路.


Source : Oreilly


此書中譯本為機械工業出版的簡體版, 參考 :

機器學習實戰 : 基於Scikit-Learn和TensorFlow
https://www.tenlong.com.tw/products/9787111603023


Source : 天瓏


此書範例檔可在 GitHub 下載 :

# http://github.com/ageron/handson-ml

在 /dataset 目錄下有三個資料集目錄 :

1. 目錄 /dataset/lifesat 下存放的是加州普查的住房資料 :

https://github.com/ageron/handson-ml/blob/master/datasets/housing/housing.csv


2. 目錄 /dataset/lifesat 底下存放了兩個資料集, 一個是世界貨幣組織 (IMF) 的國民生產毛額各國 GDP 資料 :

https://github.com/ageron/handson-ml/blob/master/datasets/lifesat/gdp_per_capita.csv

另一個是經濟合作發展組織 (OECD) 2015 年的全球生活滿意度指數統計資料 :

https://github.com/ageron/handson-ml/blob/master/datasets/lifesat/oecd_bli_2015.csv

3. 目錄 /dataset/inception 下存放的是 ImageNet 的分類資料 :

# https://github.com/ageron/handson-ml/blob/master/datasets/inception/imagenet_class_names.txt


下面是在樹莓派進行的加州住房資料測試 :

1. 首先下載 housing.tgz 壓縮檔 :

pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.tgz 
--2019-04-25 08:18:03--  https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.tgz
正在查找主機 raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.228.133
正在連接 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.228.133|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 409488 (400K) [application/octet-stream]
Saving to: ‘housing.tgz’

2019-04-25 08:18:10 (469 KB/s) - ‘housing.tgz’ saved [409488/409488]


2. 使用 tar 解壓縮即可得到 housing.csv 檔 :

pi@raspberrypi:~ $ tar -zxvf housing.tgz 
housing.csv 
pi@raspberrypi:~ $ ls -ls housing.csv 
1392 -rw-r--r-- 1 pi pi 1423529  5月  3  2016 housing.csv

也可以直接下載 csv 檔, 例如 :

pi@raspberrypi:~ $ wget https://github.com/ageron/handson-ml/blob/master/datasets/housing/housing.csv 
--2019-04-25 14:42:43--  https://github.com/ageron/handson-ml/blob/master/datasets/housing/housing.csv
正在查找主機 github.com (github.com)... 192.30.253.112, 192.30.253.113
正在連接 github.com (github.com)|192.30.253.112|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 未指定 [text/html]
Saving to: ‘housing.csv’

2019-04-25 14:42:45 (104 KB/s) - ‘housing.csv’ saved [58348]

pi@raspberrypi:~ $ ls -ls housing.csv 
60 -rw-r--r-- 1 pi pi 58348  4月 25 14:42 housing.csv

3. 進入 Python Shell 讀取 csv 檔 : 

pi@raspberrypi:~ $ python3 
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 pandas as pd   
>>> df=pd.read_csv('housing.csv') 
>>> df.head() 
   longitude  latitude  ...  median_house_value  ocean_proximity
0    -122.23     37.88  ...            452600.0         NEAR BAY
1    -122.22     37.86  ...            358500.0         NEAR BAY
2    -122.24     37.85  ...            352100.0         NEAR BAY
3    -122.25     37.85  ...            341300.0         NEAR BAY
4    -122.25     37.85  ...            342200.0         NEAR BAY

[5 rows x 10 columns]
>>> df.info() 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
longitude             20640 non-null float64
latitude              20640 non-null float64
housing_median_age    20640 non-null float64
total_rooms           20640 non-null float64
total_bedrooms        20433 non-null float64
population            20640 non-null float64
households            20640 non-null float64
median_income         20640 non-null float64
median_house_value    20640 non-null float64
ocean_proximity       20640 non-null object
dtypes: float64(9), object(1)
memory usage: 1.5+ MB

閱讀此書的前提是必須有 Python 基礎, 特別是熟悉 Numpy, Pandas, Matlabplot 等科學運算套件. 作者的序有一段話值得記下 : 雖然在機器學習中深度學習無疑是令人驚奇的領域, 但切莫急於跳下去, 你應該先熟習機器學習的基本功才對. 事實上許多問題只要用較簡單的技術例如隨機森林等就能漂亮地解決. 深度學習比較適合用在較複雜的問題, 例如影像處理, 語音識別, 或者自然語言處理等領域, 只要你有足夠的資料, 計算力, 以及耐力.

嗯, 有道理, 先把 Scikit-learn 好好學完再說吧.

博客來買簡體書三本

今天在找尋 "機器學習實戰:基於Scikit-Learn和TensorFlow" 這本書時看到博客來在促銷北京大學簡體書 3 本 75 折 (到 6 月底) :

# 北京大學出版社,精選3本75折

從中挑了看來還不錯的三本書 :

Python 3數據分析與機器學習實戰 $414 打 75 折=$311
應用統計分析與R語言實戰 $414  打 75 折=$311
Raspberry Pi入門與機器人實戰 $354 打 75 折=$266




合計 311+311+266=888 元 (博客來滿 350 元免運費). 現在簡體書也不便宜了, 其中光是第一本在露天買含運就要 460 元左右, 參考 :

[尋書網] Python 3 資料分析與機器學習實戰(簡體書sim2a)

輝達迷你開發板 Jetson Nano 已可預購

今天想起不久前 Nvidia 預定今年六月將推出的 Jetson Nano 開發板, 電詢台灣代理商 EDOM 得知目前已可下單訂購, 未稅價 3143 元, 含稅價 3300 元, 個人購買可先寄電郵給  alexh@edom.com.tw 告知數量, PM 會回寄匯款帳號, 不過現在訂購者多, 需等到貨後再安排出貨. 參考 :

Nvidia 推出 99 美元的迷你 AI 電腦

3300 元約當 110 美元, 代理商這價格與 Nvidia 當初說的相去不遠. 另外, 我在 TaiwanIoT 公司網站也看到 Jetson Nano 的預購訊息, 但報價貴上 1000 塊, 未稅價 4181 元.

NVIDIA® Jetson Nano™ Developer Kit 開發板 Seeed原廠公司貨




打算先買一塊來玩玩看. 3300 元的價位可買三塊 Raspberry Pi 3A+ 耶! 但效能卻不可以道里計. 不過這樣比也不公道, 因為樹莓派的原先目標其實是教育用的.

2019年4月22日 星期一

購買樹莓派 3A+ 與 GPIO 轉接板/CSI 攝像頭等模組

上周對發票中了四張, 總共是 800 元, 打算拿來買樹莓派 Pi 3A+. 我之前有比較過, 發現 3A+ 效能不輸 3B+, 體積迷你功耗小, 如果不需要太多 USB, 也用不到 LAN 的話買 3A+ 經濟又實惠, 參考 :

樹莓派 Pi 3A+ 與 3B+, Zero W 之比較

我在露天找到下面賣家莓亞科技 Pi 3A+ 一塊 938 元最便宜, 但加上郵資 60 元就要近 1000 元了, 擴展板加排線需 106 元 :

【莓亞科技】2018 全新 英國製 樹莓派 Raspberry Pi 3 Model A+ (含稅現貨NT$938)
【莓亞科技】最新版樹莓派GPIO 40P 轉板 V2.4(含稅現貨NT$68)
【莓亞科技】樹莓派GPIO 40P彩虹排線(20cm, 含稅現貨NT$38)

另一賣家則是 Pi 3A+ 一塊 960 免運 (加殼也是免運) :

NEW! RASPBERRY PI 3 A+ (Raspberry Pi樹莓派3 Model A+),PI3A+ $960
樹莓派 Pi3A+ (外殼+風扇) $160
樹莓派raspberry pi攝像頭模組CSI 500萬畫素 $200
樹莓派raspberry pi攝像頭模組用固定架 $45
樹莓派T型擴展板 Raspberry Pi GPIO ,3B+ (擴展板+排線) $75
樹莓派 PI3 3B ,3B+ ZUK 5V/2.5A 電源 + 開關線 $180*2=360

感覺這家免運較優, 所以就跟他買了 :




合計 960+160+200+45+75+360=1800

2019年4月21日 星期日

2019 年第 16 周記事

今天聽爸說大馬路邊的波蘿蜜被偷摘四顆, 依去年價格估計每顆可賣到 400~500 元, 損失至少 1600 元, 看樣子不在門口裝個樹莓派攝影機不行. 打算忙完 Fintech 後來做這件事, 計畫用樹莓派 + 攝影機 + OpenCV 來做影像偵測識別, 並裝上擴音器做錄影警告. 若有人車進來, 可在識別後傳送至室內的語音電鈴, 截圖記錄在樹莓派資料庫裡, 並傳送 Line 訊息至手機. 

本周三四陪二哥去東華大學面試, 週六去高雄大學, 個人申請入學總算忙完了, 就等放榜. 時序來到四月下旬, 必須開始為五月中的邏輯設計備課, 去花蓮的火車上看完了整本邏輯設計, 功力恢復得差不多了. 不過這陣子手裡進行的 Python 與樹莓派學習研究要暫停一下, 直到六月中才能恢復.

IC 設計是我老本行, 多年未用時代早已進化到 FPGA 與 VHDL 了, 但基本觀念還是不變. 這授課外務雖然會干擾我的專案步調, 但不妨當作一種挑戰, 也是刺激自己成長的方式.

市圖還書 4 本

本周還掉下面四本書 :
  1. 徹底研究jQuery全能權威指南 :jQuery Core + jQuery Plugin + jQuery UI + jQuery Mobile
  2. PhoneGap+Node.js整合實作! :用JavaScript做出跨平臺手機App和雲端運用
  3. 人人都能學會存成長股全圖解
  4. 創客高手報到 :17個超吸睛Maker實作全收錄
其中第 3 本有人預約先還, 以後有時間看時再借.

2019年4月20日 星期六

好書 : 創客高手報到

此書是大陸簡體書 "創客們的超級開源製作項目" 繁體版 (人民郵電), 裡面收錄了 17 個有趣的創客項目, 大部分採用 Arduino 實作, 有些則使用 STM32板子 :

http://webpac.ksml.edu.tw/bookDetail.do?id=1599873
創客高手報到:17個超吸睛Maker實作全收錄


Source : 博客來


其中我比較想做的是第 15 項的 "體感遙控的直升機" 以及第 16 項的 "自製微型四軸飛行器", 前者使用 Arduino 做主控板做下位機, 以 PC 上的 Processing 撰寫下位機程式呼叫 SimpleOpenAI 函式庫以取得 Kinet 人體資訊傳遞給 Arduino. 而後者則使用 STM32F103C8T6 板主控, 採用 MPU6050 六軸陀羅儀加速度計作慣性導航控制, 無線射頻則使用 NRF24L01 模組. 

不過這些好玩的東西現在都不能做, 權且記在此處過過乾癮.

備份樹莓派 Pi 3B 系統映像檔

傍晚回到鄉下, 吃過晚飯後將鄉下這台 Pi 3B 樹莓派停機, 取下 32GB SD 卡拿到 PC 用 Win32 Disk Imager 程式備份映像檔, 因為上週已將全部要用的 Python 套件都裝齊了, 也安裝了 Nginx 伺服器, 為了以後複製系統方便, 先備份系統映像檔保存再說, 程序參考 :

備份樹莓派 SD 卡的方法

不出所料, 映像檔是將整張 SD 卡複製成單一 img 檔, 所以 32GB 的 SD 卡備份出來的 img 檔就是 32GB, 好大啊! 真的很佔硬碟空間, 要不是安裝整個系統要花蠻多時間, 實在沒必要做出這麼大的東西出來. 不知道可否用 8GB SD 卡做系統備份, 然後將 8GB 的映像檔寫到 16 或 32 GB 的 SD 卡上呢? 目前鄉下這片 SD 卡安裝完所需套件用掉 5.4 GB :

pi@raspberrypi:~ $ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root        30G  5.4G   23G   20% /
devtmpfs        460M     0  460M    0% /dev
tmpfs           464M     0  464M    0% /dev/shm
tmpfs           464M   13M  452M    3% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   23M   22M   51% /boot
tmpfs            93M     0   93M    0% /run/user/1000

有空來試試看, 硬碟裡還存放著 2017 年製作的 8 GB 映像檔, 先用這個來燒錄 16 GB 卡看看.

二哥申請入學高雄大學面試

今天早上載二哥去後昌高雄大學面試, 我是第三度來這裡了, 幾年前是坐學姊的車來她任教的西語系演講, 介紹如何運用 Praat 語音分析軟體於實驗語音學研究上. 第二次是去年載二哥來參加第二次 APCS 檢測.

早上報到後由系主任簡報介紹學習環境與方向, 然後由助教分組帶開參觀各實驗室, 主要是光電與材料方面與物理本科為主. 參觀完考生領餐盒就結束了. 參加了三個學校的面試之後, 我覺得程序雖然差不多, 但作法是不一樣的.

2019年4月19日 星期五

高科大還書 2 本

這兩本書是強國人林沛滿寫的, 很早以前在明儀的書架上看到 "實戰 Wireshark" 就很喜歡, 因我那時在研究 SIP 協定, 也有一些 TCP/IP 網路基礎, 但看了這本書第一章就受到震撼了, 原來自以為懂的 TCP/IP 其實是似懂非懂. 多年來一直想要找時間再把網路打底一下都沒時間 (現在還是一樣).
  1. 實戰Wireshark : 網路分析其實很簡單
  2. Wireshark網路分析技術
借這兩本書回來是想找零碎時間看, 因為林沛滿文筆很好, 筆調詼諧又臭屁應該很好讀, 但一個月下來就是沒時間, 避免佔據書架還是先還了吧. 這兩本都是在建功分館借得.

嘉義大學個人申請入學放榜

早上收到二哥傳訊, 嘉義大學個人申請入學放榜了, 正取. 一起去的另外兩個同班同學一個正取, 另外一個備取.

明天早上是高雄大學面試, 等全部都放榜後再來決定.

2019年4月18日 星期四

東華面試驚逢花蓮地震記

昨天請假一天半陪二哥去花蓮東華大學面試, 近中午 11:30 結束後兩人在湖畔餐廳吃過午飯, 逛了一大圈校園再信步走到圖書館, 因預定前往花蓮火車站的校車登車處就在圖書館大門口.

進圖書館後上頂樓六樓西文書區參觀, 不到兩分鐘就感到整棟建物左右搖晃起來, 哇咧, 地震哪! 兩人面面相覷也只能原地看它搖. 只見天花板掉下來好幾塊, 架上的書也被搖下來掉在走道上. 我跟二哥一一撿起來放回書架, 但看時間已近 1 點 10 分, 便搭電梯下樓準備搭校車. 哪知電梯門一關竟然不動了, 哇, 我們被困在電梯下不去也出不去, 趕緊拿緊急電話呼救, 圖書館警衛趕來安撫說已通知電梯公司趕來救援, 要我們稍安勿躁.

我們只好乖乖待在電梯裡等待救援, 這一待就超過半小時, 約 1 點 45 分終於脫困, 但 1:15 分的校車已開走, 向接待人員說明後改搭 2 點的校車離校. 還好趕得上 3 點 24 分的自強號, 也還好火車沒有停開, 不然又要在花蓮多住一晚.

在電梯裡面待援時才想到, 以前公司消防演習時, 消防局教官有說過, 火災地震時絕不可搭電梯, 但今天卻一時忘記了, 貿然進入尚可操作的電梯, 哪知地震可能觸動了電梯保全機制而進入 "保養中" 狀態. 還好沒停電, 要不然待在又暗又熱的電梯裡一定讓人心慌慌.

之前與二哥聊到去花蓮讀書一怕颱風, 二怕地震, 三怕連假買不到火車票, 沒想到第一次到東華就遇上超有感地震. 但東華校園真的好美, 據圖書館牆上的校史說明, 原來當初建校前, 籌備人員有到美國名校去考察觀摩, 所以規劃設計的校舍都有歐風的美感.

2019年4月16日 星期二

樹莓派 Pi 3A+ 與 3B+, Zero W 之比較

前陣子在露天看到樹莓派 Pi 3A+ 板子, 價格不到 1000 元, 此為樹莓派最新產品. 經比較規格發現, 除了 RAM 少一半 (512MB) 外, 其實 Pi 3A+ 等同於 Pi 3B+ (就是去掉乙太與 USB 介面, 只留一個 USB), 但價格約少 200~300 元 (Pi 3B+ 約 1200~1300 元, 而 Pi 3A+ 約 900~1000 元), 待機功率消耗是 3B+ 的一半, 負載時是 3B+ 的 73% 左右.

另外一個選項是 Pi Zero W, 此板價位約 600~700 元, 又比 Pi 3A+ 便宜約 300 元, 以前是我非常喜歡的板子, 因為體積小功耗低 (樹莓派功耗最低的是 Zero 與 A+, 負載僅 0.714W), 價錢又便宜, 適合裝在無人機或自走車等依賴鋰電池工作且要求輕量的場合, 但拿來做運算密集應用效能有點偏低.

Pi Zero W 還有一個不方便的地方是它使用 Micro SD 與 Mini HDMI 介面, 要接鍵鼠組或 HDMI 線必須另外購置轉接頭. 另外, Pi Zero W 沒有 AV jack, 需另外準備語音卡. 所以整體評估下來, 如果不是要用在輕量低耗場合, 其實多花 300 元買 Pi 3A+ 較划算, 因為 Pi 3A+ 是 64 位元四核心 1.4GHz CPU, 而 Pi Zero W 是 32 位元單核心 1GHz. 此外 WiFi 效能也較快.

這三款的硬體規格比較如下表 :

 Pi 3B+ Pi 3A+ Pi Zero W
 SoC BCM2837B0 BCM2837B0 BCM2835 ARMv6
 CPU ARM Cortex-A53 1.4GHz
 64 位元四核
 ARM Cortex-A53 1.4GHz
 64 位元四核
 ARM1176JZF 1 1GHz
 32 位元單核
 GPU Broadcom Videocore-IV Broadcom Videocore-IV Broadcom Videocore-IV
 DRAM 1 GB LPDDR2 SDRAM 512 MB LPDDR2 SDRAM 512 MB
 WiFi Cypress CYW43455
 802.11b/g/n/ac 雙頻
 Cypress CYW43455
 802.11b/g/n/ac 雙頻
 Cypress CYW43438
 802.11 b/g/n/ac
 Bluetooth v4.2 v4.2 v4.1
 Ethernet LAN7515 Gigabit No  No
 USB  USB 2.0 * 4 USB 2.0 * 1 Micro USB * 1
 AV jack Yes Yes No
 DSI  Yes Yes No
 Power 6.25W 4.1W 0.8W

參考 :

Raspberry Pi Comparison Table
Raspberry Pi 3 A+ offers the same 3 B+ performance for $10 less

Pi 3 A+ 雖然只有一個 USB, 但在 WiFi 內建情況下, 會用到 USB 埠的大概就是鍵鼠組或外接硬碟, 若用 Headless 方式存取則不需要鍵鼠組, 有藍芽滑鼠的話更好, 只要用滑鼠設定 WiFi 連線即可用 Headless 遠端操控.

不過 Pi 3A+ RAM 只有 3B+ 的一半 (512 MB), 效能是不是比不上 3B+ 呢? 根據 MagPi 雜誌的評比, 事實上兩個效能沒有甚麼差別, 甚至在 Python GPIO 與記憶體寫入方面還小贏 3B+ 哩, 參考 :

RASPBERRY PI SPECS AND BENCHMARKS: 3A+, 3B+, ZERO W

因此都內建藍芽與 WiFi 下, 選擇板子主要是看應用 :

1. 輕低耗 : 買 Pi Zero W
2. 高效能 : 買 Pi 3A+

除非需要多個 USB 埠或以太介面, 買 3A+ 就可以了.

好站 : AI 從頭學

今天最大的收穫是找到 Mr.hemingwang 的部落格, 作者閱讀量豐富, 文章涵蓋面廣泛, 特別是也研究過王唯工的書, 就讓我有遇到知音的感覺. 不過其中最吸睛的寶貝是作者不藏私精心整理的機器學習筆記 "AI 從頭學" :

https://hemingwang.blogspot.com/2016/12/ai_20.html

從筆記目錄看, 作者的興趣非常廣泛, 與我重疊度極高 (佛學, 術數, 中醫等等), 且自 2005 年即不間斷發文, 我素以超強毅力自傲 (幻想即使空降到胡志明小徑的叢林中與越共鬥爭也要能存活, 呵呵), 但最佩服的是這種毅力與能力兼具的人. 有幸找到這寶貝, 趕快收起來好好施展吸星大法功夫吧.

2019年4月14日 星期日

2019 年第 15 周記事

過去這一周還是繼續忙樹莓派平台的搭建, 大致都就緒了, 就剩下將 Django 掛上 Nginx 就可以開始建構網站系統, 主要用途是作為物聯網私有雲端以及 Fintech 分析用. 今天應該暫停下來, 準備 Logic Design 備課簡報了.

本周菁菁與水某一起回鄉下, 順便試試菁菁的亞太門號, 結果在鄉下竟然信號還不錯, 真的出乎我意料, 反而是在文自路要上國十前網路信號不佳.

上週芒果套袋工作還剩下路邊那幾棵樹尚未完成, 昨日下午回到鄉下就去資材行再買兩包共 200 個袋子, 這兩天下午忙下來竟然 200 個全用完, 總計這一個月下來已買了 4 包, 天啊, 原以為今年結果率不佳, 可能 300 個不到, 沒想到超過 400 個哩!

好書 : 穿戴式裝置-智能化如何改變人類的生活方式

此書借來已久, 在還之前做個簡單的摘要.


Source : 博客來



  1. "擊敗莊家" 一書的作者索普 Thorp 在書中提到, 他與夏農 Shannon 合製了一個可穿戴電腦在 21 點賭局中作弊而贏了錢. 穿戴式裝置在 1960 年代的萌芽是為賭徒服務的.
  2. 矽谷大咖也陸續加入穿戴式裝置市場, 例如 Google Wear 作業系統的推出, 高通也為此開發 Cortex-M3 架構的低功耗處理器.
  3. 穿戴式產品成功的條件 :
    (1). 時尚感
    (2). 具實用性
    (3). 續航力長
    (4). 異質性
  4. MEMS (Micro Electro-Mechanical System) 微機電系統主要感測器 :
    (1). 運動感測器 : 慣性 (加速度+陀螺儀), 影像
    (2). 生理健康感測器 : 心跳, 血氧, 血壓
    (3). 環境感測器 : 溫溼度, 氣壓, 紫外線
  5. MEMS 感測器領導廠商 : 博世 Bosch, 意法半導體, 應美勝 InvenSense
  6. 穿戴式裝置主晶片分為 MCU 與 AP (應用處理器) 兩種, 手環多採用 MCU, 手錶多採用 AP. 高通的 MCU 效能從低到高有 Cortex-M0~M4, 以及更省電高效的 M0+.  而 AP 多沿用手機晶或 ASIC , 如高通驍龍與 MTK6532, Astro SoC 等.
  7. 常見的 MCU 晶片 : STM32 (三星 Gear), EFM32, Dialog DA1458
  8. 常見的 AP : MTK6253, 驍龍 400, TI OMAP4430 等.
  9. 穿戴式裝置電池形式有兩種, 一是傳統鈕扣電池 (手環常用), 不可充電需定期更換, 成本較低; 二是可充電鋰電池, 需配充電線與充電座, 成本較高, 大多數採用此形式. 
  10. 柔性元件包括 : 柔性電路, 柔性螢幕與柔性電池. 柔性螢幕技術目前有柔性 LCD 與 AMOLED, 後者為主流, 主要掌握在三星與 LG 手上. 
  11. 手環中較特殊的設計是華為 TalkBand B1, 內建了一個藍芽聽筒, 可取下當作藍芽耳機用.  
  12. 行動醫療設備常見的是動態血糖監測, 例如 Medtronic 的 CGM, 由植入皮下的葡萄糖感應探針隨時監測組織液的葡萄糖濃度. 另外還有紋身貼紙型監測方式, 特定形狀之電極以絲網印刷技術被印製在紋身貼紙上, 在皮膚上施加特定電壓, 含有特定酶的感測器可據此測量血糖濃度. 俄羅斯 Healbe 公司的 GoBe 手環則宣稱只要配戴其手環即可用無創方式測量血糖. 
  13. 美國 Frog 公司推出的 AirWave 智慧口罩內建微粒感應器, 可即時檢測吸入的空氣品質並將數據傳送至手機上, App 可將其與雲端之鄰近城鎮資料進行比較分析.
  14. 可穿戴醫療雲端服務的核心是資料採擷, 健康管理就是資料管理. 雲端, App, 硬體是一體的.  
  15. 可穿戴裝置目前遇到的問題 :
    (1). 感測器不精確
    (2). 電磁輻射
    (3). 電池續航力差
    (4). 依賴智慧型手機
    (5). 使用者介面不友善
    (6). 手機相容性不佳
    (7). 缺少殺手級應用
  16. 除了運動, 醫療, 娛樂等應用外, 寵物類穿戴裝置市場潛力也非常大, 技術上無門檻, 需求大但產品少, 客製性較強. 這類裝置除記錄寵物健康資料, 運動量, 活動力, 能量消耗, 睡眠時間等資訊外, 需求最大的是需有 GPS 等定位功能, 可自行設定活動範圍, 超出範圍時透過 App 通知主人避免走失, 例如高通的 Tagg. 波蘭的智慧貓伴 Egg 則可發出聲響左右移動, 讓主人不在時貓咪不會感到孤獨等.


樹莓派安裝 ipython, pandas 時出現 urllib3, requests 等模組執行錯誤問題

今天在樹莓派 Pi 3 上安裝 IPython 與 Pandas 時出現了 urllib3 模組執行錯誤訊息 :

pi@raspberrypi:~ $ pip3 install ipython 
Collecting ipython
  Downloading https://files.pythonhosted.org/packages/46/b5/ca080401b8dbde51a0f4377b4e22ce02b266340a1cda389b6dea702d06d1/ipython-7.4.0-py3-none-any.whl (769kB)
Collecting traitlets>=4.2 (from ipython)
  Downloading https://files.pythonhosted.org/packages/93/d6/abcb22de61d78e2fc3959c964628a5771e47e7cc60d53e9342e21ed6cc9a/traitlets-4.3.2-py2.py3-none-any.whl (74kB)
Collecting jedi>=0.10 (from ipython)
  Downloading https://files.pythonhosted.org/packages/25/2b/1f188901be099d52d7b06f4d3b7cb9f8f09692c50697b139eaf6fa2928d8/jedi-0.13.3-py2.py3-none-any.whl (178kB)
Collecting setuptools>=18.5 (from ipython)
  Using cached https://files.pythonhosted.org/packages/c8/b0/cc6b7ba28d5fb790cf0d5946df849233e32b8872b6baca10c9e002ff5b41/setuptools-41.0.0-py2.py3-none-any.whl
Collecting pygments (from ipython)
  Downloading https://files.pythonhosted.org/packages/13/e5/6d710c9cf96c31ac82657bcfb441df328b22df8564d58d0c4cd62612674c/Pygments-2.3.1-py2.py3-none-any.whl (849kB)
Collecting backcall (from ipython)
  Downloading https://www.piwheels.org/simple/backcall/backcall-0.1.0-py3-none-any.whl
Collecting prompt-toolkit<2.1.0,>=2.0.0 (from ipython)
  Downloading https://files.pythonhosted.org/packages/f7/a7/9b1dd14ef45345f186ef69d175bdd2491c40ab1dfa4b2b3e4352df719ed7/prompt_toolkit-2.0.9-py3-none-any.whl (337kB)
Collecting decorator (from ipython)
Exception:
Traceback (most recent call last):
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 391, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 387, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1198, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python3/dist-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 554, in _prepare_file
    require_hashes
  File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 278, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 465, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 423, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python3/dist-packages/pip/index.py", line 568, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 683, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 792, in get_page
    "Cache-Control": "max-age=600",
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python3/dist-packages/pip/download.py", line 386, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/adapter.py", line 47, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 643, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

下面是安裝 Pandas 時遇到的錯誤 :

pi@raspberrypi:~ $ pip3 install pandas 
Collecting pandas
  Using cached https://files.pythonhosted.org/packages/b2/4c/b6f966ac91c5670ba4ef0b0b5613b5379e3c7abdfad4e7b89a87d73bae13/pandas-0.24.2.tar.gz
Collecting python-dateutil>=2.5.0 (from pandas)
  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl
Collecting pytz>=2011k (from pandas)
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Collecting numpy>=1.12.0 (from pandas)
Collecting six>=1.5 (from python-dateutil>=2.5.0->pandas)
Exception:
Traceback (most recent call last):
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 391, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 387, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1198, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python3/dist-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 554, in _prepare_file
    require_hashes
  File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 278, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 465, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 423, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python3/dist-packages/pip/index.py", line 568, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 683, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python3/dist-packages/pip/index.py", line 792, in get_page
    "Cache-Control": "max-age=600",
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python3/dist-packages/pip/download.py", line 386, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/adapter.py", line 47, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 643, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

從錯誤訊息研判, 似乎跟 urllib3, requests, pip 等模組有關, 可能是網路連線有甚麼問題. 搜尋網路發現下面這篇, 有人在安裝其他模組時也遇到類似的錯誤訊息 :

Exceptions while trying to `pip3 install python-binance`

有人建議更新 requests 模組即可, 指令如下 :

python3 -m pip install --user --upgrade requests 

我更新 requests 後再次安裝 IPython 與 pandas 果然就能順利完成了 :

pi@raspberrypi:~ $ python3 -m pip install --user --upgrade requests 
Collecting requests
  Using cached https://files.pythonhosted.org/packages/7d/e3/20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/requests-2.21.0-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached https://files.pythonhosted.org/packages/60/75/f692a584e85b7eaba0e03827b3d51f45f571c2e793dd731e598828d380aa/certifi-2019.3.9-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests)
  Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting urllib3<1.25,>=1.21.1 (from requests)
  Using cached https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: certifi, idna, urllib3, chardet, requests
Successfully installed certifi-2019.3.9 chardet-3.0.4 idna-2.8 requests-2.21.0 urllib3-1.24.1

再次安裝 IPython 成功 :

pi@raspberrypi:~ $ pip3 install ipython 
Collecting ipython
  Using cached https://files.pythonhosted.org/packages/46/b5/ca080401b8dbde51a0f4377b4e22ce02b266340a1cda389b6dea702d06d1/ipython-7.4.0-py3-none-any.whl
Collecting traitlets>=4.2 (from ipython)
  Using cached https://files.pythonhosted.org/packages/93/d6/abcb22de61d78e2fc3959c964628a5771e47e7cc60d53e9342e21ed6cc9a/traitlets-4.3.2-py2.py3-none-any.whl
Collecting decorator (from ipython)
  Downloading https://files.pythonhosted.org/packages/5f/88/0075e461560a1e750a0dcbf77f1d9de775028c37a19a346a6c565a257399/decorator-4.4.0-py2.py3-none-any.whl
Collecting pexpect; sys_platform != "win32" (from ipython)
  Downloading https://files.pythonhosted.org/packages/0e/3e/377007e3f36ec42f1b84ec322ee12141a9e10d808312e5738f52f80a232c/pexpect-4.7.0-py2.py3-none-any.whl (58kB)
Collecting pickleshare (from ipython)
  Downloading https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl
Collecting backcall (from ipython)
  Using cached https://www.piwheels.org/simple/backcall/backcall-0.1.0-py3-none-any.whl
Collecting prompt-toolkit<2.1.0,>=2.0.0 (from ipython)
  Using cached https://files.pythonhosted.org/packages/f7/a7/9b1dd14ef45345f186ef69d175bdd2491c40ab1dfa4b2b3e4352df719ed7/prompt_toolkit-2.0.9-py3-none-any.whl
Collecting jedi>=0.10 (from ipython)
  Using cached https://files.pythonhosted.org/packages/25/2b/1f188901be099d52d7b06f4d3b7cb9f8f09692c50697b139eaf6fa2928d8/jedi-0.13.3-py2.py3-none-any.whl
Collecting pygments (from ipython)
  Using cached https://files.pythonhosted.org/packages/13/e5/6d710c9cf96c31ac82657bcfb441df328b22df8564d58d0c4cd62612674c/Pygments-2.3.1-py2.py3-none-any.whl
Collecting setuptools>=18.5 (from ipython)
  Using cached https://files.pythonhosted.org/packages/c8/b0/cc6b7ba28d5fb790cf0d5946df849233e32b8872b6baca10c9e002ff5b41/setuptools-41.0.0-py2.py3-none-any.whl
Collecting ipython-genutils (from traitlets>=4.2->ipython)
  Downloading https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl
Collecting six (from traitlets>=4.2->ipython)
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting ptyprocess>=0.5 (from pexpect; sys_platform != "win32"->ipython)
  Downloading https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Collecting wcwidth (from prompt-toolkit<2.1.0,>=2.0.0->ipython)
  Downloading https://files.pythonhosted.org/packages/7e/9f/526a6947247599b084ee5232e4f9190a38f398d7300d866af3ab571a5bfe/wcwidth-0.1.7-py2.py3-none-any.whl
Collecting parso>=0.3.0 (from jedi>=0.10->ipython)
  Downloading https://files.pythonhosted.org/packages/a7/bd/e2f4753c5fa93932899243b4299011a757ac212e9bc8ddf062f38df4e78b/parso-0.4.0-py2.py3-none-any.whl (94kB)
Installing collected packages: decorator, ipython-genutils, six, traitlets, ptyprocess, pexpect, pickleshare, backcall, wcwidth, prompt-toolkit, parso, jedi, pygments, setuptools, ipython
Successfully installed backcall-0.1.0 decorator-4.4.0 ipython-7.4.0 ipython-genutils-0.2.0 jedi-0.13.3 parso-0.4.0 pexpect-4.7.0 pickleshare-0.7.5 prompt-toolkit-2.0.9 ptyprocess-0.6.0 pygments-2.3.1 setuptools-41.0.0 six-1.12.0 traitlets-4.3.2 wcwidth-0.1.7

再次安裝 pandas 也沒問題 :

pi@raspberrypi:~ $ pip3 install pandas 
Collecting pandas
  Using cached https://files.pythonhosted.org/packages/b2/4c/b6f966ac91c5670ba4ef0b0b5613b5379e3c7abdfad4e7b89a87d73bae13/pandas-0.24.2.tar.gz
Collecting python-dateutil>=2.5.0 (from pandas)
  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl
Collecting pytz>=2011k (from pandas)
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Collecting numpy>=1.12.0 (from pandas)
Collecting six>=1.5 (from python-dateutil>=2.5.0->pandas)
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: pandas
  Running setup.py bdist_wheel for pandas ... done
  Stored in directory: /home/pi/.cache/pip/wheels/47/0a/bf/fd3647f5bc74698ed95dbdbb3d8d120cfe0280969c212cdb6c
Successfully built pandas
Installing collected packages: six, python-dateutil, pytz, numpy, pandas
Successfully installed numpy-1.16.2 pandas-0.24.2 python-dateutil-2.8.0 pytz-2019.1 six-1.12.0

用 pip3 list 查看 requests 版本 :

requests (2.21.0)

可見將 requests 原先 2.12.4 版更新為 2.21.0 版就可順利安裝 pandas 與 IPython 了.

參考 :

樹莓派安裝 Python3 scikit-learn 函式庫
Windows 安裝 Python 機器學習工具

本周還書 5 本

借的書太多了, 本周清理一批, 凡一個月內沒空看的優先還掉 (像 PHP 就不太可能常用了, Python 這麼好用幹嘛還用 PHP) :

  1. 徹底研究 :jQuery Mobile + PHP 手機程式及網站開發
  2. 為何有錢人都用Excel輕鬆存1000萬? :富爸爸教你33招致富祕笈,就算薪水2萬5也能翻身!
  3. 挑戰PHP/MySQL程式設計與超強專題特訓班
  4. 穿戴式裝置 :智能化如何改變人類的生活方式
  5. JavaScript+jQuery Mobile+Node.js跨平臺網頁設計範例教本

每周都要跑圖書館, 我真的像某人說的, 我如果沒在圖書館, 就是在前往圖書館的路上.

想看的書很多, 但每周能消化的卻不多.

2019年4月13日 星期六

樹莓派安裝 Selenium 自動化套件

之前曾在 Windows 上測試過 Python 自動化模組 Selenium 模組, 參考 :

# Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (一)
Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (二)

在樹莓派上也可以安裝 Selenium 來自動執行網頁操作, 對於網路爬蟲無法企及, 必須模擬人工實際操作瀏覽器才能獲取的資料就必須仰賴 Selenium 了, 樹莓派的好處就是低功耗可全年開機運作, 身為 Automata 控的我怎會放過它呢, 哈哈哈.

pi@raspberrypi:~ $ pip3 install selenium   
Collecting selenium
  Downloading https://files.pythonhosted.org/packages/80/d6/4294f0b4bce4de0abf13e17190289f9d0613b0a44e5dd6a7f5ca98459853/selenium-3.141.0-py2.py3-none-any.whl (904kB)
Collecting urllib3 (from selenium)
  Using cached https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl
Installing collected packages: urllib3, selenium
Successfully installed selenium-3.141.0 urllib3-1.24.1

然後需安裝樹莓派預設瀏覽器 Chromium 的網頁驅動程式 (webdriver) :  chromium-chromedriver, 參考下面這兩篇文章 :

树莓派 python+selenium+chromium 安装及使用
Success: How to run Selenium Chrome webdriver on Raspberry pi

可找到 chromium-chromedriver 的下載網頁 :

https://launchpad.net/ubuntu/trusty/+package/chromium-chromedriver





樹莓派應下載 armhf (Updates) 的版本, 用 wget 下載 deb 檔 (2.7 MB) :

pi@raspberrypi:~ $ wget http://launchpadlibrarian.net/361669488/chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb 
--2019-04-12 21:07:14--  http://launchpadlibrarian.net/361669488/chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
正在查找主機 launchpadlibrarian.net (launchpadlibrarian.net)... 91.189.89.229, 91.189.89.228, 2001:67c:1560:8003::8008, ...
正在連接 launchpadlibrarian.net (launchpadlibrarian.net)|91.189.89.229|:80... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 2787410 (2.7M) [application/x-debian-package]
Saving to: ‘chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb’

chromium-chromedriv 100%[===================>]   2.66M   251KB/s    in 14s   

2019-04-12 21:07:28 (197 KB/s) - ‘chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb’ saved [2787410/2787410]

然後用 sudo dpkg 指令來安裝 deb 檔 :

pi@raspberrypi:~ $ sudo dpkg -i chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb 
選取了原先未選的套件 chromium-chromedriver。
(讀取資料庫 ... 目前共安裝了 139090 個檔案和目錄。)
Preparing to unpack chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb ...
Unpacking chromium-chromedriver (65.0.3325.181-0ubuntu0.14.04.1) ...
設定 chromium-chromedriver (65.0.3325.181-0ubuntu0.14.04.1) ...
pi@raspberrypi:~ $

dpkg 會將 chromium-chromedriver 安裝到 /usr/lib/chromium-browser/ 下的 chromedriver 檔 :

pi@raspberrypi:~ $ ls /usr/lib/chromium-browser/chromedriver -ls 
6188 -rwxr-xr-x 1 root root 6334180  3月 23  2018 /usr/lib/chromium-browser/chromedriver 

這樣便可以在 Python 程式中使用 Selenium 來控制 Chromium 瀏覽器了, 參考下面這篇文章 :

树莓派 python+selenium+chromium 安装及使用

不過我用下列指令會出現錯誤 :

browser=webdriver.Chrome(chromedriver,chrome_options=chrome_options)

錯誤訊息如下 :

>>> browser = webdriver.Chrome(chromedriver,chrome_options=chrome_options)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at localhost:9222
from chrome not reachable
  (Driver info: chromedriver=2.35 (0),platform=Linux 4.14.98-v7+ armv7l)

但用下面這個被註解掉的指令卻可以 :

# browser=webdriver.Chrome(executable_path=chromedriver)   

測試紀錄如下 :

pi@raspberrypi:~ $ python3 
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.
&gt;&gt;&gt; from selenium import webdriver 
&gt;&gt;&gt; from selenium.webdriver.chrome.options import Options 
&gt;&gt;&gt; import os   
&gt;&gt;&gt; chromedriver='/usr/lib/chromium-browser/chromedriver'    #Cromium 驅動程式位置
&gt;&gt;&gt; chrome_options=webdriver.ChromeOptions() 
&gt;&gt;&gt; chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")   #連接已開啟之瀏覽器, 避免每次開啟
&gt;&gt;&gt; os.environ["webdriver.chrome.driver"]=chromedriver    #指定驅動程式位置
&gt;&gt;&gt; browser = webdriver.Chrome(executable_path=chromedriver)    #開啟瀏覽器
&gt;&gt;&gt; browser.get("http://www.google.com")    #連線網站
&gt;&gt;&gt; browser.quit()     #關閉瀏覽器




執行 browser = webdriver.Chrome(executable_path=chromedriver) 指令時即開啟瀏覽器, 並傳回一個 WebDriver 物件. 注意, 這會花一點時間, 大約 5~10 秒左右. 另外, 瀏覽器開啟後, 上方會顯示 "Chrome 目前受到自動測試軟體控制" :




執行 browser.get("http://www.google.com") 指令即連線指定網站 :




呼叫 WebDriver 物件的 quit() 方法會關閉所開啟的瀏覽器.

以 Selenium 開啟瀏覽器後便可以進行操控, 參考之前於 Windows 上的測試 :

Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (二)

以下主要測試操控網頁元素部分, 操作的網頁對象為 :

http://inventwithpython.com/

以下是在 Python Shell 下執行的結果 :

pi@raspberrypi:~ $ python3 
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.
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>> import os
>>> chromedriver='/usr/lib/chromium-browser/chromedriver'
>>> chrome_options=webdriver.ChromeOptions()
>>> chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")
>>> os.environ["webdriver.chrome.driver"]=chromedriver
>>> browser = webdriver.Chrome(executable_path=chromedriver)
>>> browser.get("http://inventwithpython.com/") 
>>> browser.set_window_size(720, 640)
>>> divEle=browser.find_element_by_id("navbarSupportedContent")
>>> print(divEle.tag_name)
div
>>> print(divEle.get_attribute("class"))
collapse navbar-collapse
>>> print(divEle.location)
{'x': 0, 'y': 0}
>>> print(divEle.text)

>>> classEles=browser.find_elements_by_class_name("nav-link")
>>> for ele in classEles:
...     print(ele.get_attribute("href"))
...
None

None
None
https://www.youtube.com/user/Albert10110
https://www.reddit.com/r/inventwithpython
http://inventwithpython.com/blog
http://inventwithpython.com/#donate
>>> browser.quit()

或者寫成 Python 程式檔案如下 :

#selenium_test.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
chromedriver='/usr/lib/chromium-browser/chromedriver'
chrome_options=webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")
os.environ["webdriver.chrome.driver"]=chromedriver
browser = webdriver.Chrome(executable_path=chromedriver)
browser.get("http://inventwithpython.com/")
browser.set_window_size(720, 640)
divEle=browser.find_element_by_id("navbarSupportedContent")
print(divEle.tag_name)
print(divEle.get_attribute("class"))
print(divEle.location)
print(divEle.text)
classEles=browser.find_elements_by_class_name("nav-link")
for ele in classEles:
    print(ele.get_attribute("href"))

用 Python3 執行結果 :

pi@raspberrypi:~ $ python3 selenium_test.py 
div
collapse navbar-collapse
{'x': 0, 'y': 0}

None
None
None
https://www.youtube.com/user/Albert10110
https://www.reddit.com/r/inventwithpython
http://inventwithpython.com/blog
http://inventwithpython.com/#donate

瀏覽器會開啟操作後自動關閉, 輸出結果與上面相同.

Bingo! 以後就可以在 24 小時開機的樹莓派上執行自動化的網頁操作了.

參考 :

套件: chromium-chromedriver
树莓派折腾selenium + chrome记录

Windows Update 後 Win10 無法喚醒問題

前天 4/11 做完 Windows Update 後我的筆電 Win 10 出現奇怪現象, 一是原本用得好好的藍芽滑鼠無法連線了 (無法辨識的設備), 其次是昨晚要喚醒休眠中的 Swift 5 SF515 筆電時竟然說因為發生嚴重錯誤而重新啟動修正錯誤,

然後是今天早上, 乾脆陷入沉睡中根本喚不醒, Ctrl+Alt+Del 也無反應, 我還以為筆電有問題, 打算拿去給店家看看. 但看了下面這篇文章才知道只要長按筆電的電源鍵就可以強迫電腦關機重開 :

# Computer Won’t Wake Up From Sleep Windows 10 [FIXED]




果真電腦重開機可用了. 買電腦時店家就提過 Windows 的睡眠做得不好, 比 Mac Book 爛, 可能會有喚不醒的狀況出現. 但以前我都沒遇到過, 該不會就是 Windows Update 搞的鬼呢?

此文後面 "Fix 3: Turn off fast startup" 建議關掉 Win 10 預設的快速啟動功能, 先開啟 "控制台/電源選項" 設定頁面 (或執行 powercfg.cpl 亦可), 點按 "選擇按下電源按鈕的行為" 超連結, 然後將 "關機設定" 中的第一項 "開啟快速啟動" 取消勾選 :





儲存設定後依照 "Fix 4: Re-enable hibernation" 建議的方法將休眠設定關閉再啟動. 先用系統管理員身分開啟命令列視窗, 然後依序輸入下列指令 :

Microsoft Windows [版本 10.0.17763.437]
(c) 2018 Microsoft Corporation. 著作權所有,並保留一切權利。

C:\WINDOWS\system32>powercfg.exe /hibernate off 
C:\WINDOWS\system32>powercfg.exe /hibernate on
C:\WINDOWS\system32>




命令列下 powercfg /a 可檢視睡眠狀態 :

C:\Users\User>powercfg /a
此系統有以下幾種睡眠狀態:
    待命 (S0 低電源閒置) 網路已中斷連線
    休眠
    快速啟動

此系統缺乏以下幾種睡眠狀態:
    待命 (S1)
        系統韌體不支援此待命狀態。
        支援 S0 低電源閒置時,會停用此待命狀態。

    待命 (S2)
        系統韌體不支援此待命狀態。
        支援 S0 低電源閒置時,會停用此待命狀態。

    待命 (S3)
        支援 S0 低電源閒置時,會停用此待命狀態。

    混合式睡眠
        無法使用待命 (S3)。

    待命 (S0 低電源閒置) 網路已連線
        不支援待命中的連線。

其實 Win10 要跑得順暢還有許多撇步, 參考 :

【教學】Windows10 系統優化
Windows 10最佳化校調 助終端系統飛快運行(上)
Windows 10最佳化校調 助終端系統飛快運行(下)
春眠不覺曉,電腦醒不了…
Windows10如何禁止鍵盤滑鼠喚醒電腦?

2019-04-13 補充 :

我發現 INHON 筆電裝置管理員的鍵盤有電源管理選項 :




但 Swift 5 卻沒有 :




Why?

不是電腦比較卡,而是你沒有關閉這幾個功能

購買羅技藍芽滑鼠 M337

前幾天藍芽滑鼠疑似因為 Windows Update 後無法連線 (連接藍芽設備時顯示無法辨識的裝置), 只好拿以前 INHON 筆電使用的 USB 無線滑鼠 M545 來用, 但是因為占用一個 USB 埠, 且 USB 連線插頭會凸出來一點, 所以還是決定再買一個藍芽滑鼠, 這次不買中國製阿沙布魯牌的便宜貨了, 羅技貴還是有道理的 :

<現貨>Logitech 羅技 M337 藍芽滑鼠(黑色) $570




含運 570+6-=630 元

M545 還是回歸 INHON Carbon book 筆電使用, 現在這台退役下來變成代用機, 我一直想找時間在上面安裝虛擬環境模擬跑 macOS 卻還在 Pending 中. 它自 2014 年 11 月開始為我工作了整整五年, 有點感情了, 我沒有想要以中古機便宜賣掉. 其實性能還是很好, 就是螢幕太小而已.


2019-04-15 :

今天去 7-11 取貨, 回來測試 OK, 還是羅技的好.

2019年4月12日 星期五

樹莓派 Raspbian 升版與軟體安裝程序

這此趁更換 Raspberry Pi 3 SD 卡到最大 32GB 之便, 重新整理了樹莓派上常用軟體的安裝程序, 其中大部分是 Python 套件. 透過 VNC Cloud Connect 就可以進行遠端存取, 完全不需要在路由器上設定, 解決了無法遠端存取位於社區網路內的樹莓派的麻煩 (社區網路不可能會讓我們在路由器上打洞). 另外, 透過安裝 Nginx + uWSGI + Django, 可在樹莓派上建構後端網站系統, 透過 no-ip 就可以用 DNS 連線樹莓派上的網站了.

裝載了新版 Raspbian 的樹莓派開機後, 會先跳出視窗要求設定區域 (Taiwan/Taipei) 與語系 (中文), 更改樹莓派預設帳號 pi 的密碼, 以及無線基地台的 SSID 與密碼. 設定完後開啟 "偏好設定 (Preference)/Raspberry Pi 設定" 將 SSH 與 VNC 打開, 然後用 sudo nano 編輯 /etc/dhcpcd.conf 加入如下固定 IP 設定, 樹莓派 IP 一律設為 192.168.2.192, routers 與 domain_name_servers 一律設為無線基地台 IP) :

$ sudo nano /etc/dhcpcd.conf     
$ sudo cat /etc/dhcpcd.conf 
interface wlan0
static ip_address=192.168.2.192 
static routers=192.168.2.1 
static domain_name_servers=192.168.2.1 

但是對於尚未確定要安裝到哪裡的 SD 卡而言, 燒錄韌體後我會在有鍵盤滑鼠組與顯示器的環境將其 Gateway 與 Router IP 設定為我的手機 Note 8 路由器的 IP 192.168.43.1, 因為要換裝到現場樹莓派時, 可以先連上手機 WiFi, 再利用手機的 VNC Viewer 連線進去改為連上現場基地台.

參考 :

樹莓派 Pi 3 主機更換 SD 卡升版
樹莓派重新安裝 Raspbian 作業系統


一. 安裝常用套件 : 

$ sudo apt-get install zip unzip    (壓縮解壓縮)
pip3 install ipython                    (Python Shell)
pip3 install requests                   (網頁擷取)
pip3 install beautifulsoup4        (網頁解析)
pip3 install selenium                  (自動化工具)
$ pip3 install django                      (網頁開發框架)
$ sudo apt-get install sqlite3         (SQLite 資料庫)
sudo apt-get install r-base          (R 語言)
sudo apt-get install nginx           (Web 伺服器)
sudo pip3 install uWSGI            (WSGI 伺服器)
pip3 install numpy                      (科學計算)
$ pip3 install scipy                         (科學計算)
$ pip3 install matplotlib                (2D 繪圖)
$ pip3 install pandas                      (數據處理)
$ pip3 install scikit-learn              (機器學習)


二. 安裝台股技術分析套件 TA-Lib :

$ wget https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz 
$ tar -xvf ta-lib-0.4.0-src.tar.gz 
$ cd ta-lib 
$ ./configure --prefix=/usr 
$ sudo make 
$ sudo make install 
$ sudo pip3 install ta-lib 

三. 安裝台股行情擷取套件 twstock : 

pip3 install analytics      (相依套件)
sudo apt-get install python3-lxml python-lxml     (相依套件)
pip3 install twstock     


四. 安裝台銀外匯行情擷取套件 twder :

sudo apt-get install libxml2-dev libxslt-dev   (相依套件)
pip3 install twder    (比較久)

或安裝好 libxml2 與 libxslt 後編譯 twder 原始碼 :

wget  https://files.pythonhosted.org/packages/d9/f6/c8c8683aa1c3599d0168bb9476d94af43f0248c0be86b53e2c796614a120/twder-0.1.4.tar.gz     (下載原始碼)
tar -xvf twder-0.1.4.tar.gz           (解壓縮)
cd twder-0.1.4                              (切換目錄)
sudo python3 setup.py install     (安裝) 


安裝好上面所有套件, 高雄 Pi 3 的 32GB 的 SD 卡用掉了 5.6 GB (21%), 即大約是 1/5 的硬碟空間 :

pi@raspberrypi:~ $ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root        30G  5.6G   23G   21% /
devtmpfs        460M     0  460M    0% /dev
tmpfs           464M  6.6M  458M    2% /dev/shm
tmpfs           464M   47M  417M   11% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   23M   22M   51% /boot
tmpfs            93M     0   93M    0% /run/user/1000

鄉下的 Pi 3 則用掉 6.7 GB (24%) :

pi@raspberrypi:~ $ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root        30G  6.7G   22G   24% /
devtmpfs        460M     0  460M    0% /dev
tmpfs           464M     0  464M    0% /dev/shm
tmpfs           464M   13M  452M    3% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   22M   22M   50% /boot
tmpfs            93M     0   93M    0% /run/user/1000

忘記鄉下的多安裝了甚麼. 

參考 :

Raspberry Pi 筆記(45):安裝R語言及互動介面的 Shiny Server

2019年4月11日 星期四

二哥嘉義大學團體面試

今天請假載二哥去嘉義大學蘭潭校區參加電子物理系個人申請團體面試, 早上 10:50 出發,  12:00 到, 車程約一小時. 因登記下午場 13:30, 因此先去民族路的民主火雞肉飯吃午餐. 嘉義市區停車大不易, 這家雖有停車場, 但大約只有 7, 8 個位子, 且要等.

嘉義大學為原農專升格為技術學院後與嘉義師範合併, 蘭潭為最大校區. 電子物理大樓位於學校正中央, 離學生餐廳很近, 但離圖書館很遠, 本想去逛圖書館, 但下午結束時又已近五點, 所以也沒去逛.

聽完系主任簡介與導覽後讓我與二哥印象為之改觀, 覺得這可能是三家應用物理系中最接近工程的一個, 因為電機系電子系的電路學, 電子學, 電磁學都列必修, 且強調專題製作, 要求學生動手做實驗. 此系較偏向光電, 材料, 與固態物理, 校友投入竹科, 中科, 南科半導體公司居多. 今年個人申請收 22 個, 4/19 日放榜.

下周 4/18 是東華面試, 這幾天要去取票.

樹莓派安裝 SQLite 資料庫

SQLite 資料庫是一個廣受歡迎的嵌入式 (embedded, 非 client-server 架構) 輕量級 SQL 關聯式資料庫, 被許多軟體用來儲存系統資料 (例如 Android 平台, 瀏覽器), 它具有如下特點 :
  1. 開源 (免費)
  2. 無伺服器 (無須啟動, 不占用程序)
  3. 單一檔案 (備份方便)
  4. 零設定 (使用簡單)
  5. 跨平台 (可移植性佳)
  6. 自我完善 (無外部相依軟體)
參考 :

https://zh.wikipedia.org/wiki/SQLite

樹莓派 Raspbian 並未預載 SQLite, 需自行安裝.


一. 安裝 SQLite :

安裝 SQLite 指令如下 :

sudo apt-get install sqlite3 

pi@raspberrypi:~ $ sudo apt-get install sqlite3 
正在讀取套件清單... 完成
正在重建相依關係       
正在讀取狀態資料... 完成
建議套件:
  sqlite3-doc
下列【新】套件將會被安裝:
  sqlite3
升級 0 個,新安裝 1 個,移除 0 個,有 0 個未被升級。
需要下載 709 kB 的套件檔。
此操作完成之後,會多佔用 1,991 kB 的磁碟空間。
下載:1 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf sqlite3 armhf 3.16.2-5+deb9u1 [709 kB]
取得 709 kB 用了 5s (136 kB/s)                     
選取了原先未選的套件 sqlite3。
(讀取資料庫 ... 目前共安裝了 136703 個檔案和目錄。)
Preparing to unpack .../sqlite3_3.16.2-5+deb9u1_armhf.deb ...
Unpacking sqlite3 (3.16.2-5+deb9u1) ...
設定 sqlite3 (3.16.2-5+deb9u1) ...
Processing triggers for man-db (2.7.6.1-2) ...

整個程式只有 709KB, 實在非常輕巧啊! 


二. 建立 SQLite 資料庫 :   

在命令列下 sqlite3 test.db 可建立或載入資料庫, 若 test.db 不存在則在目前目錄下建立名為 test.db 的 SQLite 資料庫, 若已存在載入資料庫, 並進入 sqlite3 的 shell 介面, 下 .help 指令會顯示使用說明, 例如 :

pi@raspberrypi:~ $ sqlite3 test.db 
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite>

資料庫操作指令除 SELECT 外需用 BEGIN; 開始, 用 COMMIT; 結束. 以下操作參考了下面文章 : 


關於 SQL 指令可參考之前整理的筆記 :

最常用的 SQL 指令


三. 建立資料表 : 

建立資料表用 CREATE TABLE 指令, 例如 :

sqlite> BEGIN;   
sqlite> CREATE TABLE dhtreadings(id INTEGER PRIMARY KEY AUTOINCREMENT, temperature NUMERIC, humidity NUMERIC, currentdate DATE, currentime TIME, device TEXT); 
sqlite> COMMIT;   

上面建立了一個 dhtreadings 資料表. 用 .table 指令可列出目前資料庫已有哪些資料表, 而 .fullschema 則列出全部資料表的結構, 例如 :

sqlite> .tables   
dhtreadings
sqlite> .fullschema 
CREATE TABLE dhtreadings(id INTEGER PRIMARY KEY AUTOINCREMENT, temperature NUMERIC, humidity NUMERIC, currentdate DATE, currentime TIME, device TEXT);
/* No STAT tables available */

以下為資料表的 CRUD 操作 :


四. 新增與查詢紀錄 :

在資料表中新增資料使用 INSERT 指令, 而查詢則用 SELECT 指令, 例如 : 

sqlite> BEGIN; 
sqlite> INSERT INTO dhtreadings(temperature, humidity, currentdate, currentime, device) values(22.4, 48, date('now'), time('now'), "manual"); 
sqlite> COMMIT;     

這樣就新增了一筆紀錄到資料表 dhtreadings, 可用 SELECT 查詢資料表 :

sqlite> SELECT * FROM dhtreadings;   
1|22.4|48|2019-04-10|02:59:32|manual   

可知目前整個資料表只有一筆紀錄. 再新增一筆紀錄 :

sqlite> BEGIN;   
sqlite> INSERT INTO dhtreadings(temperature, humidity, currentdate, currentime, device) values(22.5, 48.7, date('now'), time('now'), "manual"); 
sqlite> COMMIT; 

用 SELECT 查詢已有兩筆紀錄 :

sqlite> SELECT * FROM dhtreadings;   
1|22.4|48|2019-04-10|02:59:32|manual
2|22.5|48.7|2019-04-10|03:00:40|manual


五. 更新紀錄 : 

更新紀錄使用 UPDATE 指令, 可同時更新一個以上欄位, 每個欄位用逗號隔開, 例如更改上面第二筆紀錄之溫濕度 :

sqlite&glt; BEGIN; 
sqlite&glt; UPDATE dhtreadings SET temperature='33', humidity='66' WHERE id='2'; 
sqlite&glt; COMMIT; 
sqlite&glt; SELECT * FROM dhtreadings;   
1|22.4|48|2019-04-10|02:59:32|manual
2|33|66|2019-04-10|03:00:40|manual 

可見 id=2 的溫溼度都被修改了.


六. 刪除紀錄 :

刪除紀錄使用 DELETE 指令, 必須用 WHERE 限定刪除對象, 否則資料表內的紀錄會全部被刪除, 例如刪除上面第一筆紀錄 :

sqlite&glt; BEGIN;
sqlite&glt; DELETE FROM dhtreadings WHERE id='1'; 
sqlite&glt; COMMIT; 
sqlite&glt; SELECT * FROM dhtreadings; 
2|33|66|2019-04-10|03:00:40|manual

可見第一筆資料已被刪除.


七. 刪除資料表 : 

刪除資料表用 DROP TABLE 指令, 與 SELECT 一樣不需要用 BEGIN 與 COMMIT, 例如 :

sqlite&glt; .tables 
dhtreadings 
sqlite&glt; DROP TABLE dhtreadings;   
sqlite&glt; .tables 
sqlite&glt;

可見資料表 dhtreadings 已經被刪除了. 但如果資料表不存在會出現錯誤訊息, DROP TABLE 指令最好加上 IF EXISTS, 例如上面已刪除資料表 dhtreadings, 若再刪除一次就會報錯 :

sqlite&glt; DROP TABLE dhtreadings; 
Error: no such table: dhtreadings   
sqlite&glt; DROP TABLE IF EXISTS dhtreadings;   
sqlite&glt;


八.  跳出 SQLite Shell : 

在 SQLite Shell 輸入 .quit 或 .exit 均可跳出 Shell 回到命令列 :

sqlite&glt; .quit   
pi@raspberrypi:~ $


以上是用 SQLite Shell 直接操作資料庫, 亦可用 Python, Java 等程式語言存取 SQLite 資料庫, 參考 :

Python 學習筆記 : 資料庫存取測試 (一) SQLite
Java使用JDBC操作SQLite
# SQLite Java

2019年4月10日 星期三

Win10 的 Windows Update 在哪裡?

今天下午要用筆電時發覺藍芽滑鼠不動了, 我想會不會是今天有系統更新導致藍芽出問題? 但控制台怎麼找就是沒有, 奇怪 Win10 把 Windows Update 藏哪去了? 後來查網路才知道在 "電腦設定" 裡 :






點下方的 "進階設定" 可以選擇關閉自動更新, 改為手動更新 :




自動更新的好處是方便, 壞處是可能成為更新白老鼠.

完成系統更新後藍芽滑鼠還是無法連線, 我看恐怕是滑鼠本身有問題了. 還是買羅技的品質好, 我以前搭配 Inhon 筆電的 M545 現在都還很好用, 目前就暫時用這個吧 (要占用一個 USB 埠).

目前有看到下面兩個 M337 還不錯, 600 元左右 :

Logitech 羅技 M337 藍芽滑鼠(黑色) $570
羅技(原廠盒裝) M337藍牙滑鼠(藍) $600

270 元買來的中國製藍芽滑鼠, 不到三個月就 GG 了.