我有個用 .NET Core 開發的案子,需要透過 MQTT 取得設備狀態後顯示在螢幕上。
最近在新增可用設備後,遭客戶回報主程式顯示設備未回應,但指定設備實際上還在運作的狀況。
我仔細分析了程式工作期間的 log 內容,發現是主程式訂閱的訊息中途失聯了。
主程式剛開始都有收到設備發佈的狀態,一段時間後就收不到了。而執行緒仍然活著好好的,顯然不是程式錯誤。
在解決過程中,我才發現被 System.Net.Mqtt 套件坑了。
它有一個不知該說是臭蟲、或是陷阱的特性。
若沒有正確設置 MqttConfiguration 的 MaximumQualityOfService 屬性,則訂閱者收到 20 次訂閱訊息後,就不再通知訂閱者新的訊息。
本文內容以 .NET Core 3 / .NET 5 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。
設計程式時,對於具有常數性質的內容,我們通常允許從外部檔案載入其值。
而使用者也可以藉由編輯外部檔案,在不修改程式碼的情況下改變程式工作方式。
這種外部檔案,我們通常稱為「設定檔」、「組態檔」、「ini 檔」或「config 檔」。
組態檔最普遍且傳統的內容格式是用純文字檔。在 Linux 系統中,可以在 /etc 目錄下找到一大堆這種組態檔。
而 Windows 系統中,也可以搜尋副檔名 .ini 或 .cfg 找到它們的踨跡。
本文示範用 C# 的反射機制,實作這種組態檔的載入工作。
本文內容以 .NET Core 3 / .NET 5 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。
現代程式語言很強調 callback 能力, JavaScript 是其中代表。
雖然 callback 本質上是把函數當一個參數傳遞給另一個函數,連 C 語言都能做這事。
但有些程式語言並不把函數與變數視為同等地位,因此不能直接把函數當參數傳遞,而需要特定的語法支持。
C# 就是這類程式語言。
對於 callback 能力,C# 基本上提供了兩種語法支持。
其一是委派(delegate),其二是事件(event)。事件也可說是較複雜的委派。
本文示範如何為自己的類別添加自行定義的事件。
標準的 SQL UPDATE 敘述只回傳受到影響的資料筆數。
如果更新敘述是 UPDATE table SET n = n + 1 這種更新動作,你得要再下一個 SELECT 敘述撈出新的資料結果。
但是各家資料庫系統通常有自已獨特的擴充語法,可讓 UPDATE 敘述直接回傳更新後的資料結果。
本文只說明 PostgreSQL 和 MS SQL Server 兩家的更新欄位並回傳資料結果的擴充語法。
《戰國權兵衛》是日本漫畫家宮下英樹創作的日本歷史系列漫畫第四部,已於2022年2月完結。
戰國權兵衛在後期花了不少章節描寫 豊臣秀次謀反事件。因為在近代史料中,基本認定這是豊臣家在關原之戰失敗的遠因,是豊臣家走向衰敗的關鍵點。
《戰國權兵衛》是日本漫畫家宮下英樹創作的日本歷史系列漫畫第四部,已於2022年2月完結。
本文內容是在沒有本能寺之變的前提下,和島民進行假設性討論留下的紀錄。
起因是明智光秀轉封到石見、出雲的政治經濟因素,最後止於銀幣通貨歷史。
那這樣說起來光秀最後的還有打完毛利後的預訂轉封點是在哪裡?
光秀佔有畿內。那經濟文化圈內的繁華度,可不是啥銀礦可以比的。文化可不是砸錢就有。
織田信長在擴張勢力時,習慣將攻下的領地封給負責攻略的大將。
例如明智光秀最後的領地「丹波」,就是他負責攻略的。
故有一說就是織田信長預訂將明智光秀轉封到他負責打下的毛利領地。主要是「出雲」、「石見」。
在日本戰國初期,出雲的鐵礦、石見的銀礦,是大內和尼子爭奪「中国地方」(指日本山陽山陰地區)的資源本錢。
大內及其後的毛利,靠著對中國大陸貿易,大量輸入文物,文化繁華程度不比京都差。
當時的「大內文化」在大內義興和大內義隆父子時達到高峰。
在這部漫畫中的描寫中,豐臣秀吉的許多政策皆延續自織田信長。
按秀吉的政策推斷,如果沒有本能寺之變,信長必然走向海外擴張,以及改革貨幣政策。
那麼掌握銀、鐵,又靠西邊海域的出雲、石見,會比明智光秀原本在內陸的丹波重要吧。
露營地點:福壽山農場露營區。
露營日期:民國111年 (2022年) 2 月 11 日至 2 月 13 日。兩晚。
第三次來福壽山農場露營。
原本計畫在武陵農場露營,但整個2月份的營位都滿了。所以訂了福壽山農場的營位。
這兩個農場棧板營位的差別在福壽山農場的棧板附近沒有電源插座。
以自行開車計算距離的話,兩個農場相距約一小時車程。
我第一天先去武陵農場賞櫻,下午到福壽山農場露營區紮營,住兩晚。
第二天是福壽山農場千櫻園賞櫻期間的開放首日,到千櫻園賞櫻。
在 Linux 用戶圈中, CloneZilla 和 GParted (GNOME Partition Editor) 可說是系統備份轉移與磁區管理的兩大神器。就算是 Windows 系統的管理者,也應該準備好這兩個工具的開機用 USB 碟 (Live USB),以備不時之需。
只是現在的 USB 隨身碟容量普遍超過 8 GB 。而 CloneZilla 或 GParted 的 Live USB 的容量要求不會超過 500 MB 。為此各自使用一隻 USB 碟很浪費。所以時不時有人想用多重開機管理工具把這些工具放在同一隻 USB 碟。
我個人試過一些多重開機 USB 碟的管理工具,例如 MultiBootCD 。但都有各自的缺點。不是很久未曾維護,就是和 UEFI 不相容。最後我找到了 Ventoy 。Ventoy 自介是「新一代多系统启动U盘解决方案」。操作簡單,而且支援的規格也很新。
不要再用便條紙記帳號和密碼。你應該使用密碼管理工具。例如:
Firefox 瀏覽器並不是最好用的密碼管理工具,但至少好過完全不用。
Google 也有密碼管理服務,整合在 Android 手機和 Chrome 瀏覽器的自動填入項目。
只是不提供手動新增登入資訊的按鈕,故本文不列入。
《現實主義勇者的王國重建記》是2016年出版的日本輕小說。2021年改編電視動畫。
相馬一也從現代日本被「艾爾孚利登王國」以「勇者召喚儀式」召喚到異世界。
相馬面對王國目前的困境,對眾人提出富國強兵的論述。相馬登上王位後,雖然想打理好內政,卻有感人才不足,於是對全國發出「唯才令」,招攬各地專才。
動畫第4話,相馬一也在招募來的人才中,發現一位美食家。這位美食家的最大興趣是發掘各種食材,將原本人們不吃的東西變成美食。正逢王國處於主要食糧短缺的狀況,相馬一也決定利用全國廣播系統公開播放各地域的獨家食材與料理手法。藉此讓人民有更多的食物來源。
《Vivy -Fluorite Eye’s Song-》是2021年播映的日本原創電視動畫。故事設定在一個 AI 技術得到高度發展的社會。劇情是該社會像電影「魔鬼終結者」一樣出現 AI 開始消滅人類的開局。松本博士在絕境之中開發出時間跳躍裝置,將一個神秘的 AI 個體傳送回到100年前,希望它能找到改變 AI 發展歷史的機會。
三月去溪頭露營後沒多久,就因為新冠病毒疫情進入三級警戒而停止出門旅遊。
等啊等、盼啊盼,等了半年才宣布開放國內戶外觀光景區的旅遊活動。
我又繼續等到打滿兩劑BNT疫苗,這都到12月了。
好久沒出門,這次選擇杉林溪一日遊健行行程,看看落羽松。下午再到溪頭露營一夜。
CommonGateway 在 cg namespace 內定義了一個 View 類別 (cg\View)。
使用 cg\View 類別,讓控制項方法自行指定視圖,而不是由 CommonGateway Framework 決定視圖,減少重複的視圖文件。
前言
Novell NetWare 是一套在三、四十年前相當流行的網路檔案服務系統。
當時許多 DOS 電腦就是靠這套服務系統共用檔案,讓 DOS 系統也能架構多人共同作業的環境。
雖然 NetWare 系統相當古老了,但資訊界有一個傳統法則,「東西沒壞就不要動」。
秉持這個傳統法則,仍有些中小企業的資訊系統就是用 DOS 加 NetWare 的環境在運作。
堪稱中小企業的 COBOL。
不過 NetWare 真的太老了。它能安裝的硬體規格也都跟著過時了。
客戶怕有朝一日他家的 NetWare 電腦掛掉沒零件可換,希望我能幫他找一個現代化的解決方案。
也方便他日後將資訊系統轉移到現在流行的 Web 架構上。
客戶提供了一台 NetWare 電腦(備品)和一台連線作業的 DOS 電腦。
客戶需求是把 NetWare 電腦裡的資料都轉移到新的系統上,而且 DOS 電腦一樣能上線作業。
我們設計資料庫應用時,都會遇到新增資料後產生一個識別代號(ID)的設計需求。但遺憾的是, SQL Standard 並沒有定義任何產生識別代號的型態或函數。但這種需求實在普遍,於是各種資料庫系統都發展了自己的一套做法。
我在「SQL Datatypes 相容性整理」一文中,整理了 SQL Server, PostgreSQL, MySQL, SQLite 四種資料庫各自產生識別代號的方法。這種各家不相容的狀況,使得識別代號這種普遍的設計需求,存在可攜性陷阱。
2022-12-10 更新,補充 Time-Sorted Unique Identifier (TSID) 內容。
我在「透過NB-IoT電信模組發送MQTT訊息」說到有些 NB-IoT 模組只提供最基本的 TCP/UDP 封包傳輸指令,不提供 MQTT 等應用協定的傳輸指令。大部份 NB-IoT 模組的也沒有 NTP 指令 (查詢網路時間) 。
本文說明在這種情形之下,取得網路時間的經驗。
NB-IoT 或 LTE-M 都是 3GPP 電信組織針對 IoT 應用制訂的低功耗廣域無線電技術(LPWAN)。NB-IoT 資料透過 LTE/4G 電信網路傳遞。簡單說就是和 LTE/4G 共用基地台。你的手機收得到 LTE/4G 訊號的地方,你的 IoT 裝置就能使用 NB-IoT 電信模組發送資料。而 NB-IoT 模組也可以直接插一般 LTE/4G SIM 卡使用,只是資費比 NB-IoT 貴。
我在前公司接觸過兩家廠商的 NB-IoT 模組,一為 u-blox 的 SARA-N/SARA-R4系列,另一為 SIMCOM 的 SIM7000系列。因為是公司產品,不是我的著作權,所以不能公開程式碼。但可以說使用經驗,以及如何透過 NB-IoT 模組的 AT 指令發送原始的 MQTT 封包。
朋友前兩天問了個 C# 語法問題:
問個蠢問題
`public static byte[] xxxxxxxx(this short x)`
這種場合this的用意是甚麼?
第一眼,我的想法是「很像 Python 的語法」。
事實上,打從 C++ 開始,我用過的 OOPL 的 method call ,其隱含的意義都是 method(this) 。
表面上,我們寫成 個體.method() ,但實際上,編譯器是弄成 method(個體) 。「個體」 是函數方法隱含的第一個參數。因為這樣,這個函數才知道操作對象是哪個東西。
CommonGateway 是我多年前設計的迷你框架。我最初用它實作 RESTful API 項目,並沒有放太多用於網頁設計的內容。最近兩年用它設計一些網站專案。為了方便工作,增加了兩項關於網頁設計的功能: