Friday, April 12, 2024

[C++] 指標與引用的區別

指標與引用的區別

變數 Abc = abd  給值就是進行拷貝,指的是將一塊記憶體上的資料複製到另一塊記憶體


對於 char、bool、int、float 等基本型別的資料,佔用記憶體往往只有幾個位元組,拷貝時非常快速


但是陣列、結構體、物件一系統資料的集合,資料的數量沒有限制,可能會消耗很多時間。

所以c/c++禁止在函式呼叫時直接傳遞陣列的內容,而是強制傳遞陣列指標

結構體和物件沒有這種限制,呼叫函式時即可以傳遞指標,可以直接傳遞內容,為了提高效率,建議傳遞指標。


reference

通常引用在於函數傳遞參數時,實參和形參繫結在一起,讓它們都指代同一份資料

但在 c++中,我們有一種指標更多便捷的傳遞聚合型別資料方式,就是 reference。

引用的定義用 & 取代了 *, 

Int &ab = cd;

引用必須在定義的同時初始化,並且以後也要從一而終,不能再引用其它資料,這有點類似於 const。

#include <iostream>
using namespace std;
int main() {
    int a = 99;
    int &r = a;
    cout << a << ", " << r << endl;
    cout << &a << ", " << &r << endl;
    return 0;
}

執行結果:
99, 99
0x28ff44, 0x28ff44

注意:引用在定義時需要新增 &,在使用時不能新增 &,使用時新增 & 表示取地址


如果讀者不希望通過引用來修改原始的資料,那麼可以在定義時新增 const 限制,形式為:

const type &name = value;

也可以是:

type const &name = value;

這種引用方式為常引用

C++引用作為函式引數

在定義或宣告函式時,我們可以將函式的形參指定為引用的形式,這樣在呼叫函式時就會將實參和形參繫結在一起,讓它們都指代同一份資料。如此一來,如果在函式體中修改了形參的資料,那麼實參的資料也會被修改,從而擁有“在函式內部影響函式外部資料”的效果

#include <iostream>
using namespace std;
void swap1(int a, int b);
void swap2(int *p1, int *p2);
void swap3(int &r1, int &r2);
int main() {
    int num1, num2;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap1(num1, num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap2(&num1, &num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap3(num1, num2);
    cout << num1 << " " << num2 << endl;
    return 0;
}
//直接傳遞引數內容
void swap1(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}
//傳遞指標
void swap2(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
//按引用傳參
void swap3(int &r1, int &r2) {
    int temp = r1;
    r1 = r2;
    r2 = temp;
}
  1. swap1() 直接傳遞引數的內容,不能達到交換兩個數的值的目的。對於 swap1() 來說,a、b 是形參,是作用範圍僅限於函式內部的區域性變數,它們有自己獨立的記憶體,和 num1、num2 指代的資料不一樣。呼叫函式時分別將 num1、num2 的值傳遞給 a、b,此後 num1、num2 和 a、b 再無任何關係,在 swap1() 內部修改 a、b 的值不會影響函式外部的 num1、num2,更不會改變 num1、num2 的值。



  1. swap2() 傳遞的是指標,能夠達到交換兩個數的值的目的。呼叫函式時,分別將 num1、num2 的指標傳遞給 p1、p2,此後 p1、p2 指向 a、b 所代表的資料,在函式內部可以通過指標間接地修改 a、b 的值。我們在《C語言指標變數作為函式引數》中也對比過第 1)、2) 中方式的區別。



Saturday, April 6, 2024

OpenBMC 和 D-Bus 的關係

OData

 OData(The Open Data Protocol) 是一種基於REST的數據訪問方式,該標準由微軟發起,前三個版本1.0、2.0、3.0是微軟開放標準,第4.0版於2014年在OASIS投票通過成為 開放工業標準。

The Open Data Protocol (OData) enables the creation of REST-based data services which allow resources, identified using Uniform Resource Locators (URLs) and defined in a data model, to be published and edited by Web clients using simple HTTP messages.

This specification defines the core semantics and the behavioral aspects of the protocol.

OData - the Best Way to REST


OData‑URL

Odata定義了一組推薦的(但不是必需的)規則,用於構建URL以識別 OData 服務公開的數據和元數據,以及一組保留的URL查詢字串運算符。


  • Service root URL: url 的服務根是服務的基本 url。 當對該 url 發出 GET 請求時,它將返回一個服務文檔,該文件定義了通過該服務可用的所有資源。 Redfish 的Service root URL 是 /redfish/v1 這在redfish spec中有定義
  • Resource path : REST 定義的資源是可通過 HTTP 使用標準 GET、POST、PUT、PATCH 和 DELETE 方法訪問的物件。
  • Query options: 查詢選項本質上是標準化的查詢字串參數,可以傳遞給 OData 服務以對請求的資源運行查詢。 例如對資源的filter, count, skip, order, search 和 format。 所有 OData 查詢選項都以 $ 符號為前綴,並且不區分大小寫。

另外在service root URL後面加上$metadata可以看到Service的實體模型(entity model),內容根據 [OData-CSDLJSON] 或 [OData-CSDLXML]


OData-CSDLXML

OData 服務是根據實體模型來描述的。 CSDL(Common Schema Definition Language) 使用XML(Extensible Markup Language ) 定義了由 OData 服務公開的實體數據模型的表示法,以及來自 W3C XML 模式定義語言的進一步構建塊 (XSD) 。

簡單來說,就是定義我們常聽到的Redfish的Schema和Property,這樣消費者可以知道它會得到的訊息格式,進而先處理(微軟有些tool可以直接將CSDL轉為結構或資料庫),這部分DMTF有CSDL的教學文件,同時也有一個Redfish Service Validator 的tool 來驗證我們的Redfish Services有沒有符合定義的CSDL

Redfish_School-Introduction_to_CSDL (dmtf.org)

GitHub - DMTF/Redfish-Service-Validator: The Redfish Service Validator is a Python3 tool for checking conformance of any "device" with a Redfish service interface against Redfish CSDL schema


OData-JSON

OData 定義一些特定的property 來擴展 JSON。 舉一些常見的例子,詳細可以參閱Spec

  • @odata.id:entity-id與實體的規範URL相同,通常是必須存在的
  • @odata.count:計數控制資訊僅出現在回應中,可以註釋在任何集合中

定義 GitHub - openbmc/smbios-mdr


Redfish 简介

伺服器管理標準

基於 RESTful API

JSON 格式的 HTTPS

Schema-backed但可讀性高

Redfish 的誕生

Redfish 是在2015年由DMTF(Distributed Management Task Force) 這個組織開始著手建立的伺服器管理標準,官方的描述是

A standard, Redfish is designed to deliver simple and secure management for converged, hybrid IT and the Software Defined Data Center (SDDC).

作為一項標準,Redfish 旨在為converged, hybrid IT 和 SDDC 提供簡單而安全的管理

這邊的 SDDC 就是"Software Defined Data Center (SDDC) - 軟體定義數據中心",簡單來說就是希望未來能提供單一軟體工具集來管理這些虛擬化資源。 但在伺服器的領域,長期發展且成熟的協定一直是IPMI,對於數據中心的管理者/客戶端的反饋是他們並不瞭解IPMI這個協定,他們的人員都需要重新學習,而且很多現代化的管理工具並不能直接應用在IPMI上面,所以Redfish誕生的契機就出現了

What is Redfish

  • 用於 IT 基礎架構的行業標準 RESTful API
  • 基於 Odata v4 的 JSON 格式的 HTTPS
  • 應用程式、GUI 和腳本同樣可用
  • Schema-backed但可讀性高

Redfish Key technology HTTP

超文本傳輸協定 (HTTP) 是分散式、協作、超媒體資訊系統的應用層協定。 它是一種通用、無狀態的協定,透過擴展其請求方法(Method)錯誤代碼(Status-Code)頭標(Header),可用於超文本之外的許多任務。

底下是HTTP協定的概念圖,詳細可以參考Hypertext Transfer Protocol -- HTTP/1.1,例如我們想要看Redfish 的Service root URL ,Request-Line就是 GET /redfish/v1 HTTP/1.1

我們可以透過回傳回應中的錯誤代碼(Status-Code)來判斷請求的狀態



常用的Method(GET, POST, PATCH, DELETE)

  • GET:獲取,例如獲取系統帳戶訊息GET /redfish/v1/AccountService
  • POST:
    • 新增,例如新增一個帳戶 POST /redfish/v1/AccountService/Accounts {"id":"xxx" "password":"xxx"}
    • 執行,例如執行韌體更新,開關機等動作
  • PATCH:更新,例如更新帳戶名字 PATCH /redfish/v1/AccountService/Accounts/01 {"Name": "123"}
  • DELETE:刪除,例如刪除一個帳戶 DELETE /redfish/v1/AccountService/Accounts/01

常見的錯誤代碼(Status-Code)

Status-Code 是由三個數位所組合組成的,目的是企圖去理解和滿足請求

  • 1xx:Informational (資訊):提供協定級資訊
  • 2xx:Success(成功):用戶端請求被接受(成功)
    • 200:OK
    • 201: Created:申請資源創建成功
    • 202:Accepted (已接受):用於報告異步操作成功
    • 204:No content (無內容):當 API 想要發送空內容或沒有內容時響應體
  • 3xx:Redirection (重定向):用戶端請求由伺服器重定向到滿足客戶端請求的不同端點
    • 301:Moved Permanently (永久移動):用於重新定位的資源
    • 302:Found (找到)
  • 4xx:Client error(用戶端錯誤):客戶端錯誤
    • 400:Bad request (錯誤請求)
    • 401:Unauthorized (未經授權)
    • 403:Forbidden (禁止)
    • 404:Not found (未找到)
    • 405:Method not allowed (方法不允許)
  • 5xx:Server error (伺服器錯誤)
    • 500: Internal server error(內部伺服器錯誤)

HTTPS (Hyper Text Transfer Protocol Secure)

HTTPS 對在瀏覽器和網站之間發送的數據進行加密,使其比 HTTP 更安全,通信協定使用傳輸層安全性 (TLS) 或以前的安全套接字層 (SSL) 進行加密。 TLS的概念可以參考 [OpenBMC] LDAP 設定(三) - LDAPS(LDAP over TLS) TLS的部分

Restful API

OData


From: https://iris123321.blogspot.com/2022/02/10-redfish.html

n8n index

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