highlight.js

星期五, 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 就沒事了, 算是先解決了, 但還是不很確定原因。

星期一, 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" 隨便查字典就譯為『悲觀情緒』, 完全不顧邏輯性, 真的是用自己的翻譯打臉自己的譯文。

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

星期六, 12月 08, 2018

Line Messaging API 在 Messaging Settings 頁面設定 Webhooks 時的陷阱

不知道從什麼時候開始, Line的 Messaging API在 Messaging Settings 頁面上出現一個古怪的陷阱:
如果您先設定 Use webhooks 為 Enabled, 然後才填入 Webhook URL,那麼剛剛修改的 Use webhooks就會被暗地設回 Disabled, 但是看到的仍然是 Enabled, 像是這樣:
實際上 webhook 並沒有生效, 會讓你的 Line Chatbot 已讀不回。這時候只要按 F5 重新載入頁面, 就會看到暗中被設回 Disabled 的 Use webhooks 選項:
 只要重新再設定為 Enabled 就好了。