Monday, December 26, 2022

[Protocol] D-Bus introduction

D-Bus,數據總線,是一個低延遲,低開銷,高可用性的 IPC 機制,协议传递的是二进制数据,, 而不是其他的文本格式 (如JSON/XML), 协议是基于消息处理的, 而不是基于流


相较于传统意义上的 IPC 机制(例如PIPE/FIFO/Socket/共享内存/SysvIpc),D-Bus提供了更高层次的抽象

目前也透過 kobject 與 kernel 做整合,如此一來,D-BUS 便能輕易整合 kernel、application 與 desktop,真正解決以往「系統整合」所遇到的障礙。

http://dbus.freedesktop.org/doc/dbus-glib/index.html

1. 方法调用(Method Call):用来实现跨进程的方法(函数)调用,配合代码生成工具,可以做到让进程间的函数调用和普通的函数调用几无区别

2. 信号(Signal):发布订阅(Pub-Sub)模式的通信机制,发送进程注册并发送(广播)信号,接收进程订阅自己感兴趣的信号。

3. 属性(Property):可类比 C++ 类中成员变量的 Getter-Setter,如果进程A提供了一个属性,那么其他进程可以通过D-Bus来读取、写入该属性。

在架構上分位三層

1. Layer 1 libdbus :freedesktop 機構提供的一個免費開源的一個由C語言編寫的 low-level API 。是提供dbus功能的庫。是高階API繫結的低階API

2. Layer 2 dbus daemon :dbus實現的IPC守護進行,隨Linux啟動,通過不通程序對其的連線,實現了多程序間訊息的路由(包含核心、網路、桌面等)

3. Layer 3 Wapper libraries (high-level API): 對 low-level API libdbus 的封裝 ,例如 libdbus-qt libdbus-python github.com/godbus/dbus ,這些不同程式語言實現的 Wapper 是不同開發者應該使用的lib,其簡化了D-Bus的開發難度。最基础的是 C,有官方提供的参考代码,也有 Java、Python等,每种语言的实现被称为 D-Bus Binding。

[Protocol] WebRTC

 

WebRTC

[Protocol] AirPlay 原理

基本概念

AirPlay 是一個用來與 Apple TV溝通的協定,可用 iOS 設備或 itunes將資料交給 Apple TV進行播放,其實作使用 Multicast DNS, HTTP, RTSP, RTP or NTP 等協定,並加上些許的修改


Unofficial AirPlay Protocol Specification

Saturday, December 10, 2022

Code that Fits in Your Head

筆記:

軟體開發方法論:

Test-driven development (TDD,測試驅動開發)

Behaviour-driven development (BDD,行為驅動開發)

Domain-driven development (DDD,領域驅動開發)

Type-driven development (型別驅動開發)

Property-driven development (特性驅動開發)


封裝

描述物件和呼叫者之間有效互動的一種契約。指出有效性的一種方式是說明什麼是無效的。

Design by Contract

封裝的想法:你應該能夠與一個物件進行互動而不需要對它的實作細節有深入的了解。這目的有 2 個:

1. 它使你能夠改變實作,也就是進行重構。

2. 它允許你以抽象的方式思考一個物體

在設計時要明確指出哪些是有效的輸入,哪些是無效的輸入,以及你能對輸出提供哪些保證


Martin Fowler:如果不關注內部品質,你很快就會失去在合理時間內進行改善的能力。

內部品質差勁的狀況。起初進展很快,但隨著時間的推移,要增加新的功能變得越來越困難。即使是小型的變更,也需要程式設計師去了解大面積的程式碼,而且是很難理解的程式碼。

當他們進行改動時,會出現意想不到的損害,導致測試時間長,還有需要修復缺陷

Page 51

J.B. Rainsberger 的說法:程式碼不是一種資產,而是一種責任。

Page 98 

參數化的測試

Page 112

Postel' Law

慎重考慮先決與後置條件:對你發送出去的東西要保守,對你所接受的東西則要寬容。

輸入 null,轉換為空字串 

Page 117

試圖用1個無效的人數初始化某個物件,應該要丟出1個例外。+

Page 119

封裝的概念:

並不是禁止直接對外開放類別的欄位:類別的欄位應該被「封裝」在 getXX 和 setXXX。

主要是 1 個物件應該保證它永遠不會處於無效的狀態。這不是呼叫者的責任。物件最清楚「有效」意味者什麼,以及如何做出這種保證。

物件和呼叫者之間的互動應該遵守一個契約。這是一組先決條件和後置條件。

先決條件述述了呼叫者的責任。然後,如果呼叫程式碼履行了那些義務

後置條件就描述了物件所給予的保證。

[Refactoring]Introduction

 

1. 重構有時候,讓你可以在犯錯時,輕鬆找到 bug 的位置

2. 呆子都寫得出電腦可以了解的程式,但只有優利的程式寫得出人看得懂的程式

3. 決定程式好壞的關鍵在於它有多麼容易被修改。


重構目的:

1. 軟體更容易了解

2. 較快找出 bug

3. 協助提升程式編寫速度 (良好的模組化讓我們只要了解1小部分程式就可以)

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能