前言:
硬體簡介:
- 電源是5V
- 內嵌Ethernet是Realtek r8168
- 界面是SD
- 儲存是eMMC
- WiFi是特規SDIO WiFi
PS: 如果希望只有rootfs是read-only,參數用:
前言:
硬體簡介:
前言:
最近興趣在寫這東西,想說這不是老黃曆了嗎,但沒關係,就自己用AI尻尻看。
目前進度約4~5成,還早,但這幾個有趣的過程可以貼。
ONVIF Client完全免費並開發友善的其實就SharpOnvif,最難得的是,作者目前非常熱血,更新頻率很高,支援的ONVIF Profile也非常完整,License是MIT,相當佛。
緣由:
我希望有個AOT-safe、License Free的ONVIF Client,C/C++或c#都可以,結果發現非常難找,C/C++幾乎沒有,原因是ONVIF官方網站與SOAP幾乎都推薦gSOAP,這是正確的,但gSOAP是雙授權,明言GPLv2/Commercial,產生的程式碼也是,要嘛付費給它解鎖,否則就是GPL,這種寫明授權的做法,就是開源商業化。
c#反而友善,Microsoft的svcutil沒有授權問題,但這個有年代了,使用的是依靠反射的WCF和XmlSerializer,設計聰明,但如果AOT-safe會更好。
於是,在繼mediasdk_h264/h265_parser之後,我讓Claude-Code嘗試看看。
成果:
過程:
雜談:
前言:
最近在寫H264和H265的硬體編碼解碼器程式。
發現在Linux選項不多,只有FFMpeg的libav、GStreamer,但我想找授權乾淨的(無GPL、Library GPL),並且支援VA-API的,於是就試著讓AI寫看看。
成果:
過程:
雜談:
前言:
在我百寶箱中,JWT不常用,但幾乎每個實做都用了,因為JWT基本上已經嵌入在.NET中開箱即用了。😁
說明:
特殊用法:
var token = new AuthToken() {JWT用法:
前言:
在我百寶箱中,最近新入的是ECC(橢圓曲線加密),它可以做為RSA非對稱加密的平替。
ECC的特點是,它是開放的,不是公司產品。
ECC相關的實做和過程學習,基本上完全是AI實做,但因為要進入百寶箱,我有查核和測試過程式碼。
程式碼:
這份程式碼裡面包括多個程式語言的ECDH和ECIES實做,也是我百寶箱中新加入的工具。https://gitlab.com/ycfunet/my_ecdh_ecies_code_test
說明:
ECDH邏輯是,我有我的公鑰和私鑰,你有你的公鑰和私鑰,我用「我的私鑰+你的公鑰」可以生成共享金鑰,你用「你的私鑰+我的公鑰」可以生成相同的共享金鑰,沒錯,這就是神奇的地方,「我的私鑰+你的公鑰」,「你的私鑰+我的公鑰」都可以生成相同金鑰。那麼這個共享金鑰就可以拿來當AES金鑰加密和解密資料。
ECDH使用時,不會直接給共享金鑰,而是雙方會把公鑰給對方,加密和解密前,才會組合出共享金鑰後,再用共享金鑰以AES加密解密資料,所以ECDH又稱為「交換金鑰加密系統」。
ECIES可以做為RSA的平替,它是以ECDH為基礎的擴展。使用概念上,一樣是接收端先建立一組公鑰和私鑰,然後把公鑰給對方,自己保留私鑰。
但在邏輯上,如何套入ECDH?ECIES引入「臨時金鑰」的概念,我(後稱接收端)會先產生一組公私鑰,公鑰提供,私鑰保存。發送端拿著我的公鑰,在每次傳送資料時,都先產生一組公私鑰,這組公私鑰就稱為「臨時金鑰」,發送端會用「臨時金鑰的私鑰+我的公鑰」「產生共享金鑰」,用這組共享金鑰以AES加密資料。
還記得AES提到加鹽的IV技巧嗎?這裡一樣的行為,發送端會把加密後的資料,在最前面加上「臨時金鑰的公鑰」,因此整個資料變成臨時金鑰的公鑰 + AES編碼後密文
接收端收到後,用「我的私鑰 + 臨時金鑰的公鑰」產生共享金鑰後,用共享金鑰以AES解密密文。因為臨時金鑰的公鑰長度不一定,AI在最前面加上4 Bytes,記載臨時金鑰的字元數,所以完整資料變成
臨時金鑰的公鑰長度數值(4Bytes) + 臨時金鑰的公鑰 + AES密文
前言:
在我百寶箱中,使用頻率也很高的,就是RSA加解密。
程式碼:
這份程式碼裡面包括多個程式語言的RSA實做,也是我自己常用的百寶箱工具。https://gitlab.com/ycfunet/my_rsa_code_test
說明:
前言:
這篇不會跟你解釋AES裡面怎麼XOR、怎麼移位,這篇我想說的是哪幾個規格以及怎麼寫。
在我的百寶箱中,使用頻率最高也最重要的莫過於加密相關,其中AES是重點之一。
程式碼:
這份程式碼裡面包括多個程式語言的AES實做,是我自己常用的百寶箱工具。https://gitlab.com/ycfunet/my_aes_code_test
說明:
結論:
這次的文章放了一陣子,圖片是Claude-Code (GLM-5/GLM-4.7) 用Excalidraw MCP畫的。
前言:
延續上次的 MustOn Cluster。
實做進行中,這次先把開發中的PostgresqlLib、DeployLib以及FSM Sample Code放上來。
另外,覺得MustOn這名字不錯,順手把mustoncluster.com註冊了。
成果:
https://gitlab.com/mustoncluster/messagelib_clusterapp
https://gitlab.com/mustoncluster/postgresqllib
https://gitlab.com/mustoncluster/deploylib
https://gitlab.com/ycfunet/my_csharp_fsm_test
實做過程:
幾個點,首先,上次放上gitlab的MessagesLib & ClusterApp有問題,AI騙了我,我跟它說要用Raft Cluster的Metadata進行狀態共享,結果AI偷雞用Thrift API實做,好笑的是,我跟它說:「你好髒喔」,它還知道用Thrift API偷雞是不正確的作法。
這次一樣是用Claude Code搭配GLM-4.7開發,寫到後來基本上有點崩。Cluster目錄\用submodule的方式加入MessagesLib、PostgresqlLib、DeployLib,AI光是用git就差點把本地程式碼和遠端repo(家裡的)的程式碼給刪了。
再來,這樣的架構目前開發,AI經常卡住,改程式碼容易亂改,要嘛改錯東西,要嘛刪除無關的程式碼。感覺這樣的程式碼體積和複雜度,GLM-4.7就有點頂不住了,正好最近GLM-5.0剛發表,初步可能伺服器資源不太夠,反應非常慢,一個問題可能要5分鐘才回覆,但品質看起來不錯,等它穩定性好些,反應速度快些,說不定能提昇目前的處理能力。
再一點是,我嘗試用OpenCode替代Claude-Code進行開發,變成OpenCode + GLM的開發模式,目前還在熟悉和習慣中,OpenCode有不少特異功能,它直接內置Server,讓界面和操作可分離,界面可以是應用程式,也可以是CLI,Model不綁定,可直接用Google Gemini、GLM系列,彈性比較大。
程式還在開發中,正如上面講的,架構比較大,程式碼比較複雜,開始寫得卡卡的,今天情人節,就用這些更新來過吧,農曆新年也要繼續努力。
前言:
上次提到想嘗試開發分散式儲存系統 - GreeStorage,分散式儲存系統有很多塊,但不論哪一塊,分散式系統的基底,訊息中心和通訊層是最核心的部份,這部份也是分散式系統的主軸,因此先從這個部份開始。
成果:
整份專案在
https://gitlab.com/mustoncluster/messagelib_clusterapp
設計過程:
在和AI討論的過程和Storage思考設計過程,避免不了WAL,所有儲存系統的資料寫入都是強一致性行為,無法迴避WAL,而在分散式儲存系統中,WAL就不只跨磁碟,也需要跨網路,跨網路的WAL必定會有Cluster和Message Layer,先攻破這塊。實做過程:
這次基本上都是Claude Code搭配GLM-4.7開發,設計階段則是用Google AI Studio聊天方式討論設計的。
因為現在新的Cluster好像從Paxos演算法改用Raft演算法,因此實做就用Raft的Cluster套件實做,但實做發現,Raft演算法只有Leader -> Follower,並沒有Follower -> Leader,所有訊息都是由Leader往外推送,而不是往內收,因此,基本上無法透過Raft層進行資料傳輸,說人話就是,dotNext Raft的實做就是Raft Cluster的實做,不包括其他API訊息處理,因此dotNext自己另外有一包ASP.NET Core的版本,透過ASP.NET HTTP API做這塊,dotNext官方網站也提到它們有多種傳輸方式,顯然意思都是,Raft Cluster只有Raft唷~其他傳輸行為要另外定義API,這既合理又方便。
我在設計選型階段,就考慮用Apache Thrift當API訊息層傳輸,因為Thrift跟gRPC一樣直接有IDL可以定義出API名稱和參數(gRPC是protobuf),這會讓API設計更乾淨、清楚,我認為這在Cluster的通訊層設計很重要,因為既然是通訊層,就很容易設計一堆通訊用API和Model,如果不透過IDL或protobuf管理,寫到後面就整個大混亂,完全不知道API有哪些,作用是什麼。
而不用gRPC的原因很簡單,Thrift是binary格式,而gRPC是json文字格式,這表示要傳遞檔案或資料,Thrift也能處理,傳輸內容也會稍微小一點。
結論:
GLM-4.7開發後端的確相當不錯,穩定性很好,趁著特價,我也入坑了。😂
最近好像有龍蝦之亂,看起來能用GLM玩龍蝦,最近很熱門,過陣子有心得,如果很特別再貼吧。
前言:
之前曾在Threads上分享過別人寫的AI-Agent聊天室的MCP工具,但我用起來總覺得沒有很好用。
我在開發時,會遇到需要不同AI-Agent間通訊的問題,常見的就是跟AI-Agent說:
你給我一段說明,我轉給另一個處理的AI-Agent,然後問另一個AI-Agent,你看了有什麼疑問要我轉達?
或者是跟AI-Agent說:
你撰寫一份串接文件,我給其他AI-Agent閱讀和實做。
不論哪種,都要人工轉發,那是否能夠有一個聊天室,讓每個AI-Agent在裡面自己對話,我也能在裡面參與或了解對話內容呢?能夠紀錄更好。
於是,就有了寫個聊天室的念頭。
成果:
整份專案在
https://gitlab.com/ycfunet/songaichat
設計過程:
這套聊天室的設計過程很復古。😆實做過程:
這次實做換成Gemini-CLI實做。
Gemini-CLI使用感覺反應慢很多,可能是現在很多人在使用,很容易忙碌吧。
但以寫程式碼的穩定性,尤其是前端,感覺比GLM-4.7穩,React + FluentUI基本上一次完成,版型也沒什麼大問題,配色也是標準正常。
不過Gemini-CLI很多時候問它問題,它想到就直接改下去了,然後改的方向或作法可能是錯的,這時候就得從git退版,因此Gemini-CLI和GLM-4.7的git版控很重要,要經常讓它commit,有問題隨時退版。
雜談:
DotPusher之後,我原本寫OmniPusher,實做Electron版的WebFcm和WebPush推播,但實做差不多了才發現,Electron在WebFcm與WebPush相容性有問題,靠~於是就放著了。
另一點是,OmniPusher用GLM-4.7實做前端,寫的有點卡,讓它計劃書內畫Wireframe都畫了,結果實做時直接偷工,Sidebar沒處理乾淨,Main Content直接沒做,叫它用FluentUI做,又做成HTML簡易版,連基本的標題列和副標題列樣式都沒處理,變成單純的HTML,然後越改越撞busy,蠻昏倒的,寫到真的是不想看。
另一個點是這樣的,SongAiChat主要作用是AI-Agent間對話用的,我在考慮撰寫用AI開發比較大的專案,目前打算寫套名為GreeStorage的儲存系統,GreeStorage名字取自Great Storage的諧音。
以前有段時間專門在弄Ceph,Ceph是Object Storage分散式儲存系統,架構比較大,那個作者很妙,作者就寫Ceph,一路寫一路發Paper,寫了10幾篇寫完博士讀完😆,然後就成立了公司賣儲存系統,接著又被RedHat收購。重點是,因為架構比較大,各組件也多,我在想有沒有可能定好架構後,一段一段讓AI寫,可能每個AI負責一段,然後就透過聊天室互相溝通和串接。這目前還在初期想法階段,如果能做出來,應該很屌😆。
前言:
手機要收通知,通常需要個Line、Telegram、DCard之類的通訊軟體,或者是pushover之類的推播軟體,如果是Line、Telegram串接太複雜,pushover要收費,原理不難,而且有現成的gorush可以參考,乾脆自己做。
成果:
整份專案在
https://gitlab.com/ycfunet/dotpusher
實做過程:
結論:
這次結論比較特殊 😄
這次的專案實做有個很大的不同點,這次第一次用GLM-4.7的Claude-Code開發,使用心得是:
以程式開發來說,GLM-4.7和Opus, Sonnet相比,基本上差異不大。
但Opus, Sonnet的語句理解能力的確比GLM-4.7精確,另外一個有趣的點是,GLM-4.7比較不討論,直接就做了,對話的語句比較少,跟它說,按照「這樣這樣」修改,它就改成「這樣這樣」,如果是Opus, Sonnet則會潤飾後寫出。
Opus, Sonnet通常會討論,會回應,你是否想這麼做,或者說,你覺得下面這些方案如何,GLM-4.7則比較直接回覆「你想要怎麼做?」,也比較不幽默 😄,我跟它說作者要寫你唷,它就只是把作者加上它名字,但在Opus, Sonnet則會說,我感到很榮幸。