互聯社交網絡是除了互聯即時通信系統/IM以外的另一主要互聯系統類型。從來沒有接觸過這類系統的人可以類比互聯的效果爲:直接在新浪微博關注騰訊微博的人(而不需要去騰訊微博重新註冊賬號)。

之前在跟人介紹時,我發現有人會將互聯系統和SSO的效果搞混。事實上,兩者完全不同。仍然以上面在新浪微博S關注騰訊微博T爲例:SSO的本質仍然是在T上註冊了一個新賬戶,然後使用T上的賬戶去關注T上的另一個賬戶,而你的S賬戶上仍然是沒有對T上的關注;但互聯SNS的效果是你直接在S上關注T上的人,不需要在T上重新生成一個賬戶。如果仍然不理解,那請思考在你不登錄T時,即使你做過了“關注”,在你的S賬戶能否看到T上被你關注的人的消息。

幾大比較知名的互聯SNS系統爲:

既然叫互聯系統,每個互聯SNS之內各個不同實例/服務器間的用戶可以互操作。事實上,這些系統主要分爲兩種協議(以及HubZilla的Zot),每個協議內不同系統也可互操作。

下文將以協議爲主要線索串聯不同互聯SNS系統特點與分別、大概歷史、以及我個人對其看法。其中內容來自我對不同互聯SNS系統的瞭解(包括使用),以及背景閱讀(尤其是下文中將會經常引用其圖片的這篇文章)。

The Federation與The Fediverse

(來自https://medium.com …

Rust中可允許自定義的類型僅有兩種: 結構體枚舉 。其中枚舉用於特定場景,而結構體被設計用來支持廣泛場景。

Rust的結構體不支持繼承,所以雖然struct和trait的組合看起來像但其實不是通常意義(C++/Java)上的面向對象實踐。不過trait支持默認方法,可以部分填補該差別。

未完待續...

壽元 是Rust因對堆棧的抽象及保證內存安全而生的( 所有權 外的)另一概念。

基本而言,壽元代表的是值的有效範圍。許多語言(如C++)中的 作用域 即是壽元的一個方面,但Rust中的壽元是一更通用/抽象且明確要求的概念。

Rust中,對壽元的需求存在於引用之上——只有引用的值纔會有壽元不確定的情況,而所 擁有 的值壽元永遠足夠。理論上來說,每一引用均包含壽元,且每個引用的壽元均會被檢查;但出於方便考慮,許多情況下壽元不需要顯式標明(見後文)。

壽元與所有權

所有權 一節介紹過,值的所有權僅歸屬於一個變量,其他變量只能對其進行引用(或複製產生新值)。Rust規定值的壽元和其所歸屬變量的壽元是統一的。因而,如下代碼不合法:

{
    let r;

    {
        let x = 5;
        r = &x;
    }

    println!("r: {}", r);
}

其原因就是 x 的值( 5 )的壽元和其所歸屬的變量 …

在今年Increase Rust's Reach中,我參與Rust新網站的i18n及l10n。其中新網站要基於 Rocket 構建,所以也就(跟着 官方教程 )學習了一下Rocket。 既然學了,就順便記錄一點心得和體會,以方便後來者。

Rocket是一個 web框架 。我個人對web編程(尤前端)並不太感興趣(主要是感到 web技術棧 太過麻煩/複雜),所以涉及不太多,之前也只用過Python那邊的Flask以及(一小段時間)Django以及Go自帶的http服務器,故而本文不怎麼會涉及和其他web框架的對比。

本文不打算成爲通常意義上的Rocket教程,而只是打算給有興趣者一個快速的(對rocket的)觀感。其中也會有一些個人的經驗教訓等。

Rocket概覽

類似我之前用過的框架,Rocket也將函數作爲不同的路由的處理器。Rocket在每個函數之前使用形如 #[get("/myroute")]屬性 作爲標記,之後在Rocket入口對象/結構體上對所需要的路由(函數)進行 mount 即可。

#[get("/")]
fn …

Rust的一大特色(甚至在官方教程中 被稱爲the most unique feature )就是其借用及所有權機制。這兩個機制由編譯器進行強制,並且可以極大限度地保證變量安全(並行安全)。

所有權

前面說過,同C/C++一樣,Rust中區分堆和棧(但不直接提及)。C/C++中語義上禁止從函數中返回指向局部變量的指針,是因爲當離開函數時,棧會被回收,所以局部變量也會被回收,導致指針失效。

在C/C++中,該禁止並非語法上的禁止。而在Rust中,所有權機制將該概念顯式表達,編譯器會拒絕編譯不滿足所有權機制的代碼。並且Rust設計者們希望通過所有權機制讓程序員不需要考慮堆棧,只需要考慮所有權即可(應當是出於一致性以及或許對未來自動優化的考量?)。

Rust中的 壽元 機制也涉及堆棧的區別。 兩者共同使得Rust不需要GC也可以保證內存安全。

所有權機制實際上就是三條規則:

  • 每個值具有唯一的所有者變量

  • 在同一時刻,所有者唯一

  • 所有者離開作用域時,值會被丟棄

    或者說(我個人的記法):每個值在每個時刻只有唯一的所有者,且有效性跟隨所有者。

所有權本身不涉及特殊語法,只要記住上面三條規則即可 …

理所當然地,Rust提供了 if 等控制流程。

if 表達式

if 後接一個 bool 類型的表達式(不需要括號),且 ifelse 子句(均爲表達式)均需要大括號。特殊地,如要書寫 else-if ,則 else if 合併爲一個表達式。

...
let m = if a < 5 {
  println!("a小於5");
  4
} else if a < 8 {
  println!("a小於8");
  7
} else {
  10
}
println!("m={}", m);

注意 if 各子句(表達式)的返回值應當是相同的類型 …

Rust提供元組和數組兩種複合數據類型。

元組

元組可將一系列數據(不需要是相同類型)“綁”在一起,以方便後續處理。

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {}", y);

    let five_hundred = tup.0;

    let six_point_four = tup.1;

    let one = tup.2;
}

(抄自 官方教程元組部分

  • 使用 () 將多個數據合在一起組成元組
  • 元組的類型依賴於其各組成元素的數據類型
  • 解包操作可以一次性將元組中所有元素賦予某個值
  • 使用 .N …