前情提要……個頭
簡單來說就是普通的 SSG 已經無法滿足我了(o
我決定用現代前端框架等重寫整個網站,所以近期暫時不會有新文章。(合理化自己拖稿的最佳藉口)
總之,期待新網站與各位見面的那一天。
(不過可能會等暑假過後吧不然我真的快忙死)
火山 / Kazan
2023.05.09
桌面環境用了一年多的 KDE Plasma,最近想說換換口味去玩一下 GNOME,
在踩到不少雷後也算是逐漸上手了,就來分享一下使用的心得,順便懺悔自己又拖更。
如果是使用 Windows / macOS 的人可能比較不熟悉桌面環境這個概念。
桌面環境(Desktop Environment,DE),
是讓 *nix(這個名詞很常見,以後有機會來聊聊)類的作業系統可以有圖形界面的一個的重要系統套件類型。
以前 Linux 是純文字的作業系統,但後來為了方便操作,開發出了桌面環境讓 Linux 能夠像 Windows / macOS 一樣透過圖形界面操作系統。
DE 通常除了圖形界面外,還需要搭配視窗管理與顯示管理(Display Manager,DM)的工具,才能有堪用的視窗系統,
常見的 DE 如 GNOME、KDE Plasma、XFCE、i3 等。
KDE Plasma 是屬於 KDE project 的一部分,KDE 是一個開源的圖形套件專案社群,其中 Plasma 是他們主力推廣的 DE 專案,
並且與 FreeDesktop.org 合作,可以使用他們釋出的小工具程式,通常還會配合 KDE 自家的系統應用程式,例如純文字編輯器 Kate、終端機模擬軟體 Konsole 等。
Plasma 預設使用的 DM 是 SDDM(Simple Desktop Display Manager),配合視窗管理器 kwin,預設界面類似 Windows 桌面(如下圖)。
上次我們已經大略討論完 Rust 最重要的概念:所有權,
這次要討論的則是結構體(structure),是很常見的資料結構。
如果學過 C/C++ 大概會很有印象。
結構體與元組類似,兩者都可以擁有多種數值,
但結構體的每個資料部份都需要被命名以表達意義;
這同時允許我們不用依賴資料的順序存取結構體實例的值。
如果要定義結構體,使用 struct
關鍵字並命名,
然後在 {}
內定義欄位(fields),也就是每個資料部份的名稱與型別。
以下是一個簡單的例子:
1 | struct User { |
定義完結構體,接著就可以在其他地方建立擁有實際數值的實例(instance):
1 | fn main() { |
如上,我們對每個欄位指定實際的數值以建立一個實例;
若是實例可變,可以用 .
存取指定的欄位並賦值更改。
注意,整個實例可變才能更改單一欄位,Rust 不允許一個實例中僅有特定欄位被標記為可變。
另外如同表達式,函式本體最後的表達式可以回傳一個新的結構體實例:
接續上篇,我們想要讓函式使用變數的數值,同時不希望它取得所有權,
也嘗試透過回傳元組解決,但這樣還是太繁瑣,很不 Rust(o
到底該如何同時達到乾淨而且不失去變數所有權呢?
這就是今天要討論的第一件事:引用與借用。
在前面的例子,我們會失去所有權是因為把變數傳遞給函式,
但若是只提供數值呢?
這就是引用的作用:追蹤、存取特定記憶體位址的資訊,同時該位址仍被其他變數擁有。
另外,Rust 的引用保證所指向的特定型別數值一定有效(避免如 C 可能發生空指標的狀況)。
我們可以更改上篇的例子:
1 | fn main() { |
我們會注意到元組都被拿掉了;
同時,我們會傳遞 &s1
給函式,這裡的 &
就是引用,
引用允許我們不用獲取所有權也能使用數值。
&s1
這個語法建立一個指向 s1
數值的引用,
但是因為沒有所有權,所以引用不再被使用後 s1
並不會被丟棄。
我們稱呼這樣的動作為借用(borrowing),因為與現實的借用行為非常接近。
上次學到了 Rust 的基本概念,這次則進入 Rust 最大的特色————所有權。
因為比較難理解,我這次打算分上下篇來紀錄,絕對不是寫不完拖更。
注意:這個概念一定要理解,才能更有效的利用 Rust!
我們在學習任何語言時,都會需要知道它們如何使用與管理記憶體的資源,以免造成浪費或者更糟糕的情形。
一般而言會有下列兩種流派:
malloc
是個無法跨過的夢魘但是 Rust 選擇了第三種方式:由所有權系統管理記憶體資源,
同時在編譯時檢查規則,違反規則會無法編譯,且規則不影響執行速度。
所以簡單來說,所有權是 Rust 中用以管理程式記憶體的一系列規則。
(註:如果要更深入理解所有權的原理,會需要理解堆疊(Stack)與堆積(Heap)的運作,可以參考官方文件的這篇)
上次我們學習如何安裝 Rust,以及利用 Cargo 管理 Rust 專案,
今天則是要介紹 Rust 的變數概念、基本資料型別、函式以及控制流程,也就是常見的程式設計概念。
相信大家對「變數(variable)」已經有基本概念,今天特別要說明的是在 Rust 中變數的特性。
首先建立一個專案叫做 variables,並且編輯 src/main.rs
:
1 | fn main() { |
然後 cargo run
,應該會得到以下輸出:
1 | $ cargo run |
錯誤訊息告訴我們,「cannot assign twice to immutable variable」。
因為 jserv 老師今年預計會在 Linux 系統核心課程教學 Rust,加上近幾年許多老牌 CLI 程式開始以 Rust 改寫,
「用 Rust 開發系統程式」似乎成為主流了,於是在傳統的 C 之外,我也決定開始學習 Rust,反正技多不壓身www
為了避免忘記學到的東西,並且分享學習心得,
我決定把學習的過程寫成文章放上來,便開始這系列的文章(同時也是逼自己更新,不然我真的太容易怠惰了)。
本系列文章皆參考自 Rust 程式設計語言電子書,同時會加上我在學習過程中的心得與發現。
Rust 是以「賦權(empowerment)」為重點的程式語言,「能賦予你更多能力,在更廣泛的領域中帶有自信地向前邁進」(來自電子書前言)
在過去,程式語言往往會在「上層的易讀易用性」與「底層的掌控性」之間難以取捨,
而 Rust 對此做出挑戰,嘗試讓開發者可以控制底層的實作細節,但又能免去以往的麻煩細節。
同時,Rust 更加強調安全性、記憶體組態與並行處理,
這讓 Rust 程式變得更適合用於設計大型網路伺服器與客戶端、以及更安全的系統程式。
先簡單總結:幾乎全部。
Rust 雖然重視底層實作,但同時也具備現代化的開發工具,提高開發者的生產力:
天啊上一篇竟然是兩個多月前……,我好爛喔嗚嗚嗚嗚。
經過幾個月的練習(好啦其實不需要那麼久,只是還在學期中我沒那麼多時間備份資料),趁著過年我終於做好準備,正式要跟陪伴我一年多的 Debian 說再見了。
(而且我是在除夕夜吃年夜飯時裝機,誰能比我瘋)
這次總體來說非常成功,沒有發生洗掉硬碟重來的情況,感天謝地QQ
以下就來簡單敘述過程吧w
Computer: Lenovo IdeaPad 5 14ALC05
CPU: 12 X AMD Ryzen 5 5500U
首先,實體裝機就需要把安裝光碟映像檔(.iso
)寫入硬體內,考量到今日筆電大多數已經沒有光碟機,都會推薦使用 USB 隨身碟(當然也可以用 SD 卡);.iso
檔一般都是用燒錄的方式寫入光碟,至於隨身碟,Windows 上有個好用的小工具 Rufus,可以讓你把 .iso
映像檔燒進隨身碟,
不過我當時已經是在使用 Debian Linux,所以直接用 dd
指令寫入就可以了:
1 | sudo dd if=archlinux-x86_64.iso of=/dev/usb_location bs=1M |
再來原本的家目錄資料要備份,因為當時裝 Debian 時我並沒有另外切一塊硬碟空間掛載家目錄,而安裝時會洗掉整個硬碟(建議),
這花了我兩天的時間才弄好……仔細一看才發現原來我家目錄肥的要死(Orz
上一篇竟然是上個月了……我果然怠惰了(跪
上次練習裝機,因為目標主機用了近年主流的 UEFI+GPT,大部分東西都蠻好處理的;
但這次的機器很麻煩,竟然是類似傳統 DOS 機器的 BIOS+MBR(還是 2018 的機器,ASUS 真的可以吃大便),
所以很多步驟都需要更動,
而且那台的狀態更是慘烈,如果沒裝好可能就真的回不去了……
所以老樣子,用 VM 來練習裝吧!
※注意:本次安裝步驟大部分會沿用上次,只是部份步驟或設定參數有所不同,所以可以先參考上次的文章練習一次!
跟上次一樣使用 Oracle VM VirtualBox,在新增 VM guest 的部份基本沿用上次的設定;
但有個不同的地方是,
System -> Motherboard 下面不需要選擇 “Enable EFI (special OSes only)”,
這樣才能製造出傳統 BIOS 開機環境。
跟上次一樣,只有少部份步驟需要調整,
以下就列出需要更動的地方:
BIOS 開機不需要 /boot
分區,所以分割時基本上只需要主硬碟跟 Swap 分區: