highlight.js

星期一, 12月 23, 2019

Maixduino 編譯 selfie 範例出現 "cannot declare variable 'camera' to be of abstract type 'Sipeed_OV2640'" 錯誤

在編譯 Maixduino 板的 selfie 範例時, 竟然出現以下錯誤:
cannot declare variable 'camera' to be of abstract type 'Sipeed_OV2640'
經過查證, 在這一篇文章中提到在 0.3.11 版的原始碼中, Sipeed_OV2640 類別的內容把虛擬函式的名字 setRotation 打錯字變成 setRotaion, 導致繼承自 Camera 類別的 setRotation 虛擬函式沒有實作的內容, 讓 Sipeed_OV2640 類別仍舊是虛擬類別, 無法用來建立物件。解決的方法很簡單, 就是自己去 c:\users\你的使用者名稱\AppData\Local\Arduino15\packages\Maixduino\hardware\k210\0.3.11\libraries\Sipeed_OV2640\src 下, 把 Sipeed_OV2640.h 以及 Sipeed_OV2640.cpp 中的錯字 setRotaion 更正為 setRotation 就可以了。

星期二, 11月 26, 2019

MacOS Catalina App 『已損毀,無法打開。你應該將其丟到「垃圾桶」』的錯誤訊息

MacOS 升級到 Catalina 後, 一定會被他嚴密的安全控管驚嚇, 比如說, 你從 Arduino 官網下載了 Arduino, 可以正常執行, 但如果你把這個 Arduino 上傳到 Google 雲端硬碟, 然後再從雲端硬碟下載回來, 一執行可能就會遇到這樣的畫面:


這是因為 Catalina 會自動幫不是從註冊網站下載回來的 App 加上註記, 執行時會根據註記的資料, 判斷是否可安全執行。你可以透過以下的指令觀察註記資料:
xattr -l Arduino.app/
com.apple.quarantine: 0181;5ddd072e;Firefox;BCD73B6E-DE9E-4821-93E6-C73238A5F5AF
xattr 是操作檔案延伸屬性的指令, 這裡可以看到 Arduino.app 有一項延伸屬性, 屬性名稱是 com.apple.quarantine, 而屬性內容是雖然是編碼過的資料, 但可以看到註記了此 App 是使用 Firefox 下載回來的, 只要將此註記資料刪除, Catalina 就不會檢查 App 是不是從註冊網站下載的, 也就可以正常執行了。刪除此註記資料的指令如下:
xattr -rd com.apple.quarantine Arduino.app
-d 選項是刪除後面指定的延伸屬性, 而 -r 選項是遞迴處理資料夾內的所有檔案與子資料夾。

星期五, 9月 27, 2019

APDS9930 程式庫造成使用 bearssl 程式庫時編譯錯誤

如果你使用 ESP8266 為基礎的開發板, 例如 D1 mini, 搭配 APSD9930 程式庫, 同時又有使用到 ESP8266Wifi 程式庫的話, 依照以下順序撰寫 #incldue 敘述:

#include <APDS9930.h>
#include <ESP8266WiFi.h>
就會出現以下的編譯錯誤:
In file included from D:\FlagsBlockSketch.ino:3:0:
D:\arduino\libraries\APDS9930-master\src/APDS9930.h:134:33: error: expected ',' or '...' before numeric constant
#define B                       1.862
                                ^
D:\arduino\hardware\esp8266com\esp8266/tools/sdk/include/bearssl/bearssl_ec.h:412:60: note: in expansion of macro 'B'
uint32_t (*muladd)(unsigned char *A, const unsigned char *B, size_t len,
                                                          ^
這主要是因為 APDS9930.h 中定義了巨集 B 為 1.862, 而在 bearssl_ec.h 中個地方定義了函式的原型為:
uint32_t (*muladd)(unsigned char *A, const unsigned char *B, size_t len,
const unsigned char *x, size_t xlen,
const unsigned char *y, size_t ylen, int curve);
所以前置處理器會把 B 展開替換成 1.862, 所以這個函式原型就變成:

uint32_t (*muladd)(unsigned char *A, const unsigned char *1.862, size_t len,
const unsigned char *x, size_t xlen,
const unsigned char *y, size_t ylen, int curve);
而造成編譯錯誤, 錯誤訊息為:
error: expected ',' or '...' before numeric constant
這個問題我已經通知程式庫的原作者, 也發了 pull request 給他, 你可以自己把程式庫中的巨集 B 改名字, 或者是更改 #include 的順序, 把 APDS9930.h 放到最後就可以了。

使用 id 名稱直接存取 DOM 物件

同事問了我一個問題, 為什麼我們總是要叫用 document.getElementById() 來取得 HTML 網頁上的物件?不是明明就可以直接用 id 名稱嗎?由於我的知識停留在古時候, 一查 HTML 標準才發現原來可以直接用 id 或是 name 屬性定義的名稱直接存取, 不需要叫用 document.getElementById(), 例如:

See the Pen
TestID
by 黃昕暐 (@meebox)
on CodePen.



不過在文件中寫到, 到底是哪些名稱會對應到 window 物件的屬性在未來可能會變化, 因此並不建議這樣用, 還是請乖乖的用 document.gettElementById(), 既然如此, 那幹嘛提供這個功能呢?

星期四, 8月 01, 2019

macOS 上執行 Arduino 出現奇怪的錯誤

同事協助測試 macOS 版軟體時, 遇到從 Python 執行 Arduino 1.8.5 就會掛掉, 看到以下的錯誤:


實在搞不懂怎麼回事, 根據網路上找到的相關問題, 似乎和 MacBook Pro 的 touchbar 衝突, 後來改成 1.8.9 版的 Arduino 就沒事了, 算是先解決了, 但還是不很確定原因。

星期一, 7月 29, 2019

Arduino 的整數字面值寫法

雖然根據 Arduino 自己的參考文件, 整數字面值若是 2 進位, 要用 'B' 開頭, 不過實際上測試, 例如 B112, 在某些地方會編譯器當成變數名稱, 導致發生此名稱尚未定義的錯誤。由於 Arduino 是採用 C++ 程式語言, 因此回頭查 C++ 程式語言, 會發現改成加上開頭的 0B112, 就可以正常編譯了。另外, 你也可以用小寫的 b, 例如 0b112。

順道一提, 文件中對於以 16 進位格式表示時, 是用大寫的 0X, 不過根據查 C++ 程式語言, 一樣可以使用小寫的 0x, 至於 16 進位數字則可以隨意大小寫混用, 因此 0XFF 或是 0Xff, 甚至 0XFf 都是可以的。

星期一, 1月 28, 2019

MicroPython 的記憶體限制

MicroPython 由於是跑在資源有限的單晶片控制板上, 所以寫程式時必須錙銖必較, 在 MicroPython ESP8266 的文件上有提到一種作法是避免建立不必要的物件, 原文是這樣說的:

There are a number of situations where objects may unwittingly be created and destroyed. This can reduce the usability of RAM through fragmentation.

底下有舉例, 一個常見的例子就是字串的串接操作, 每次使用 '+' 來串接字串時, 就會牽涉到 3 個字串物件, '+' 號左右各一個, 以及串接後建立的新字串物件。最近就剛好遇到一個案例, 使用 urequests.get 向 OpenWeatherMap 網站查詢器項資料, 為了讓人看清楚整個參數的結構, 所以寫成這樣 (整個程式不只這樣):


結果程式一執行, 雖然可以看到結果, 但是程式結束後要回到交談模式時, ESP8266 就會當掉。只要把其中 "q=" + ... 這邊改成不要串接, 直接寫成 "q=Taipei,TW" + 就可以了, 還害我找了好久的問題。畢竟在單晶片控制板上跑的 Python 和在一般電腦上跑得不一樣, 撰寫程式時要特別小心。

星期二, 1月 01, 2019

Python 中跨平台播放固定頻率聲音的模組--pysine

找了很久, 終於找到了, Windows 平台上有 winsound 模組簡單易用, 可是這是 Windows 專屬, 如果需要跨平台, 可以使用 pysine
from pysine import sine
sine(frequency=440.0, duration=1.0)

被誤解的亞里斯多德--爛翻譯的可怕

之前看到這一篇文章《提倡寫故事,貝佐斯禁止開會用PPT》時, 只覺得這是一篇誤會 PowerPoint 的文章, 你的投影片上只有條列項目, 當然效果差。不過今天老婆看到同一篇文章, 問我文章裡面提到亞里斯多德說:
有說服力的論據必須有效的3個要素,分別為精神、標誌和悲觀情緒
是什麼意思?一看直覺就是這一定是譯者亂翻, 找到原來的文章 Jeff Bezos Banned PowerPoint in Meetings. His Replacement Is Brilliant一看, 原來這三個要素是 "ethos, logos, and pathos.", 我會翻譯為『中心思想、邏輯與感染力』, 譯者顯然把 "logos" 當成 "logo+s", 所以翻成『標誌』, 也把 "pathos" 隨便查字典就譯為『悲觀情緒』, 完全不顧邏輯性, 真的是用自己的翻譯打臉自己的譯文。

附記:數位時代的文章是從科技新報而來, 但顯然沒有人審稿。