自架推播通知伺服器:ntfy
原本我的 NetAlertX 跟 Uptime Kuma 使用的通知方式都是透過 gmail,用 SMTP 的方式,自己寄信給自己。但後來發現,收件箱因為這樣而充滿了一堆通知,十分雜亂也不方便管理。 所以此篇我們要來架設 ntfy,並將 NetAlertX 跟 Uptime Kuma 的通知方式設定成 ntfy,最終透過 ntfy 的 ios app,從 iPhone 接收通知。 安裝 ntfy 此處我們採用 docker compose 的安裝方式,yaml 如下: 123456789101112131415161718192021222324services: ntfy: image: binwiederhier/ntfy container_name: ntfy command: - serve environment: TZ: Asia/Taipei # optional: set desired timezone NTFY_BEHIND_PROXY: true NTFY_BASE_URL: http...
台語小筆記:留意輕聲,詞義差很多
台語作為一門標準的聲調語言(tone language),不同的聲調會有不同的意思表達。 上次回外婆家被催婚,其中就有一句: senn nn̄g-ê--ah gín-ná(生兩個啊gín仔) 我就說好啦,不要急,但為什麼是兩個?才知道此處的 nn̄g-ê--ah 跟 nn̄g-ê 的意思可差多了。前者是「兩三個」的意思,而後者是切確的「兩個」。 讀音上,前者 nn̄g-ê--ah 的 ê 讀輕聲,後者 nn̄g-ê 的 ê 則讀五聲。 所以如果有人跟你說: lâi lim nn̄g pue(來喝兩杯) 這裡如果遇到 nn̄g--pue(三聲輕聲)就是喊你來喝個兩三杯,幾杯不重要。但如果遇到的是 nn̄g-pue(三聲一聲),那就真的是指「兩杯」了。 其他輕聲改變詞義的例子 買無 bué-bô(買不到) bué--bô(買不買?) 驚死 kiann-sí(害怕死亡) kiann--sí(嚇死) 有影無 ū-iánn-bô(真的沒有) ū-iánn--bô(真的假的?)
智能家居 EP11:用反向代理取代端口轉發(NPM+DuckDNS)
我們在 智能家居 EP9:利用DDNS、通訊埠轉發進行遠端控制 已經透過 Port Forwarding 的方法實現外網訪問,可以成功在外面控制家中設備。 但實際上,在網路安全的領域中,端口轉發意味著 port 的暴露,其實大家都看得到你有哪些 port 是開的。例如,我用外網透過 nmap 來掃描我家可以看到: 開放的 port 那是一個清清楚楚明明白白。 對此,我們使用 Nginx Proxy Manager (下稱 NPM)來替我們進行反向代理,減少我們直接開 port 的需求。假設我架設了五個服務,本來我要分別開五個 port 來訪問。現在透過 NPM,我可以只開 80 跟 443 出來給 NPM,往後需要訪問什麼服務,通通都去問 NPM,讓 NPM 統一替我們處理請求。這就是所謂的代理(proxy)。 在此架構中,NPM 可以運行在與 HA 同網路的另一個設備中、與 HA 同一個設備中的不同容器(如 docker)中、或甚至以 add-on 的形式裝在 HA 身上(該附加元件在這裡)。而我此處是運行在與 HA 同網路的另一個設備中,可以參考一下我目前的拓撲: 編輯...
讀書筆記:《為何三歲開始說謊?》
皮亞傑之前 在皮亞傑(大致在1960)之前,人們認為孩童的認知能力跟大人是一樣的,只是缺乏經驗跟知識。 皮亞傑顛覆大家的看法,表示孩童不是「小大人」,其實認知能力是要漸進發展並建立的。愛因斯坦曾說,皮亞傑的發現跟理論是「天才之作」。 一歲前就已擁有數感、物理常識、簡單的邏輯 皮亞傑發現九個月大的孩子才會動手排除遮擋物,找到後方的玩具,所以認為物體恆存是九個月大的里程碑。但後續透過「凝視時間」的觀察,其實五個月大的孩子,就會對違反物體恆存的狀況感到好奇。 同樣是五個月大,孩子至少具備 1+1 或 2-1 的概念。因為當我們用屏風遮擋一個物品,再放進一個物品,當我們秀出來居然還是只有一個物品,孩子會投以較長的凝視時間。兩個物品遮住,拿出一個後,秀出來還是兩個,一樣會得到較長的凝視時間。 物體違反地心引力往上飛時、兩物隔空互動時也會。 甚至,八個月大的孩子有機率的概念。一白四紅的獎池,我們抽出四白一紅給他看,你會得到凝視。 人腦是多功能瑞士刀,不是通用型處理器 這個概念我們在《我們真的有自由意志嗎》就討論過,我們只能學會我們能夠學會的能力。而通常,某個能力就是某個大腦模塊專門負責。如...
抉擇的心法
讀書會也成立兩年多了。綜合各家智慧,我們統整了此《抉擇的心法》。供猶豫不決中的你一個參考。 做或不做問題 舉例來說,如果你為「這個活動我該不該報名參加」而煩惱。那根據我們的心法,此時是個「做或不做問題」,建議選做。 根據蔡加尼克效應,相較於已完成的事情,人們更容易惦記著「未完成」的那些。因此,當你選擇「不做」,你可能會一直掛念「如果當初做了,會怎麼樣?」。 人是很「犯賤」的,我們往往最忘不掉未竟之事。(這也是為什麼蔡加尼克效應很常被用來解釋為何淺嘗而止的「初戀」總是最美好最難忘的) **《臨終前最後悔的五件事》**書中,在安寧病房工作多年的作者 Bronnie Ware 記錄了許多臨終老人們的心聲,發現他們的後悔大多來自「沒做到的事情」,而非「做了的事」。這說明,未曾嘗試的遺憾,比做錯了的懊悔更深刻。 另外,根據康奈爾大學於1995年發表的研究論文《The Experience of Regret: What, When, and Why》提到:「短期內人們更容易後悔行動(commission errors),但長期內更後悔不行動(omission errors)。」 其原文為...
讀書筆記:《知識的錯覺》
超憶症難道不是超能力嗎? 超憶症,擁有超常的情節記憶(我們在《最高學以致用法》討論過記憶的分類),可以記得一生中經歷過的所有事情。聽起來很屌,很像超能力,不是嗎?超強的記憶力,難道不具備十足的演化優勢嗎? 然而就結果論而言,並不是。(否則記憶力較差的群體應當早就被天擇掉了) 書中提到,如果這個世界鼓勵投機,那我們將會掌握機率與統計、如果鼓勵演繹推理,那我們將各個都是福爾摩斯。但事實是,我們在這兩方面都是一團糟。相反地,我們演化至今的世界由因果邏輯主導,這也是為什麼,人很擅長於因果分析。 後見之明告訴我們,人腦在這個世界必須具備的能力,相比「機率統計」、「演繹推理」、「強大的記憶力」,可能更偏向「因果分析」。 因果推理:不是任何刺激都能形成制約 巴甫洛夫的狗最後對鈴聲(中性刺激)產生了制約,巴甫洛夫認為此處的鈴聲可以替換成任意刺激,都會有效。(即,他認為狗勾沒有去思考兩者之間關係) 但後來針對老鼠的進一步實驗發現,閃光與電擊、噪音與電擊、糖水與胃痛可以形成制約,但閃光與胃痛、糖水與電擊,就沒辦法。(即,老鼠是有在進行簡易的因果推理的) 預測性推理/診斷式推理 預測性推理就是「由因...
利用 EasyButton 跟 OneButton 來防彈跳、判斷雙擊、長按
一句話解釋按鍵的彈跳: 你來不及放開按鍵之前,程式已經來問第二次了,所以程式不知道你是按了第二次,還是你單純還沒放開。 如果你懶得管那麼多,不妨直接在 loop 裡面加入 delay(100),避開明顯的彈跳問題。 如果你想嚴謹一點,那就引用一些現成的庫來用吧。 (以下用例中,我的 MCU 是 ESP32) EasyButton 如果你什麼都不要,就只要防彈跳,可以考慮 EasyButton 這個 library。 使用方法很簡單,如下: 12345678910111213141516171819202122232425#include <ezButton.h>const int led = 19;ezButton btn(23);void setup(){ pinMode(led, OUTPUT);//pinMode(btn, INPUT_PULLUP); //ezButton已經幫你預設上拉了 btn.setDebounceTime(50); //如果你手速夠快(50ms內點兩下),你依然可以讓彈跳發生 }void loop...
ESP32 小筆記
電源供應 可以直接從 VIN 供電。 但如果你接上 USB,VIN 就變成 5V 的輸出。 Touch(內建電容觸控) Touch 1 通常沒有 lay 出來。(因為共用了 GPIO0,很難正常作動) Touch 2 共用了 GPIO2 的內建 LED ,注意別一起用。 ADC ADC2 因為 wifi 驅動用了這隻腳,所以跟wifi不能同時使用 UART 通常只看得到 U0 跟 U2,因為 U1 沒有 lay 出來。 I2C 傳輸速度 I2C 比 UART 更快,但兩條線一條是數據、一條是時脈,所以只能是半雙工。相對的,UART 可以全雙工。 但 I2C 可以一對多。所以每個設備要有 I2C address。 while(!Serial) 若在 setup 裡面寫while(!Serial);,可以在你打開終端機之前,code 卡在這行等你。 Seiral.available() 當終端機有內容被輸入(按下enter後),Seiral.available()就會回傳大於零的訊息,可以利用這點拿來檢查是否有輸入。 硬體中斷 相較於 Arduino 只有兩個腳位有支援硬體中斷,ES...
Linux 系統架設 MQTT 伺服器
本篇利用 Mosquitto 設置一個 MQTT 伺服器,伺服器的 OS 為 Ubuntu 24.04.1 LTS。 在開始之前,MQTT 預設使用的 Port 號是 1883,防火牆的傳出傳入規則務必要設定一下,記得打開。 安裝 Mosquitto 此例為 Linux 環境,我們利用 apt 進行 Mosquitto 套件的安裝: 1sudo apt install mosquitto mosquitto-clients -y 其中 mosquitto 套件是主要的 Mosquitto 伺服器,而 mosquitto-clients 包含了指令工具如 mosquitto_sub, mosquitto_pub。 而指令開頭的 sudo 的意思是: Super Idol 的笑容,都沒你的甜。八月正午的陽光,都沒你耀眼。 我開玩笑的,其實是 superuser do。 接著我們透過 configuration 設定一下我們 Mosquitto 的規則。我們在 /etc/mosquitto/conf.d/ 中,加入一個設定檔: 1sudo nano /etc/mosquitto/c...
OrCAD Capture 利用電晶體實作 Not Gate
平常我們都把邏輯閘當做最小單位在把玩,但邏輯閘內部是怎麼實踐的呢?我們用電晶體來實作一個反向器看看,走起!(基礎操作請見使用 OrCAD Capture 設計電路) 本次的主角是這顆 Q2N2222,一顆 NPN 電晶體: 首先搜尋「Q2N2222」找到我們的電晶體: 組織一下電路: 我們搜尋「VPulse」來放置一個方波脈衝(簡單模擬一下數位訊號): 方波脈衝信號的參數分別代表什麼? V1:基準電壓 V2:脈衝電壓 TD:Time Delay,就是發出第一個 V2 之前的等待時間。 TR:Time Rise,就是 V1 上升到 V2 之間的時間差,值越小越陡峭。記得一定要設定,為 0 的話會報錯。 TF:Time Fall,同理,就是 V1 回到 V2 之間的時間差,一樣記得要設定。 PW:Pulse Width,每個 V2 的持續時間。 PER:Period,一個 V1 加上一個 V2 的持續時間。 理解之後,我們設置參數如下: 如此一來應該就看得懂了,這軟體真的也是很省字(汗顏)。 再來我們提供一個直流輸入源,設置為 3V: 根據我們的脈衝週期(100毫秒)...
