網站改版通知

前情提要……個頭

簡單來說就是普通的 SSG 已經無法滿足我了(o
我決定用現代前端框架等重寫整個網站,所以近期暫時不會有新文章。
(合理化自己拖稿的最佳藉口)

總之,期待新網站與各位見面的那一天。
(不過可能會等暑假過後吧不然我真的快忙死)

火山 / Kazan
2023.05.09

Read More

KDE Plasma vs GNOME —— 桌面環境使用心得

前情提要

桌面環境用了一年多的 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 Plasma 是屬於 KDE project 的一部分,KDE 是一個開源的圖形套件專案社群,其中 Plasma 是他們主力推廣的 DE 專案,
並且與 FreeDesktop.org 合作,可以使用他們釋出的小工具程式,通常還會配合 KDE 自家的系統應用程式,例如純文字編輯器 Kate、終端機模擬軟體 Konsole 等。

Plasma 預設使用的 DM 是 SDDM(Simple Desktop Display Manager),配合視窗管理器 kwin,預設界面類似 Windows 桌面(如下圖)。

優點

Read More

Rust 學習筆記第四章 - 結構體

前情提要

上次我們已經大略討論完 Rust 最重要的概念:所有權,
這次要討論的則是結構體(structure),是很常見的資料結構。
如果學過 C/C++ 大概會很有印象。

結構體

結構體與元組類似,兩者都可以擁有多種數值,
但結構體的每個資料部份都需要被命名以表達意義;
這同時允許我們不用依賴資料的順序存取結構體實例的值。

如果要定義結構體,使用 struct 關鍵字並命名,
然後在 {} 內定義欄位(fields),也就是每個資料部份的名稱與型別。
以下是一個簡單的例子:

1
2
3
4
5
6
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}

定義完結構體,接著就可以在其他地方建立擁有實際數值的實例(instance)

1
2
3
4
5
6
7
8
9
10
fn main() {
let user1 = User {
active: true,
email: String::from("someone@example.com"),
username: String::from("someusername123"),
sign_in_count: 1,
};

user1.email = String::from("anotheremail@example.com");
}

如上,我們對每個欄位指定實際的數值以建立一個實例;
若是實例可變,可以用 . 存取指定的欄位並賦值更改。
注意,整個實例可變才能更改單一欄位,Rust 不允許一個實例中僅有特定欄位被標記為可變。

另外如同表達式,函式本體最後的表達式可以回傳一個新的結構體實例:

Read More

Rust 學習筆記第三章 - 所有權(下)

前情提要

接續上篇,我們想要讓函式使用變數的數值,同時不希望它取得所有權,
也嘗試透過回傳元組解決,但這樣還是太繁瑣,很不 Rust(o
到底該如何同時達到乾淨而且不失去變數所有權呢?

這就是今天要討論的第一件事:引用與借用

引用(Reference)

在前面的例子,我們會失去所有權是因為把變數傳遞給函式,
但若是只提供數值呢?

這就是引用的作用:追蹤、存取特定記憶體位址的資訊,同時該位址仍被其他變數擁有。
另外,Rust 的引用保證所指向的特定型別數值一定有效(避免如 C 可能發生空指標的狀況)。

我們可以更改上篇的例子:

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let s1 = String::from("hello");

let len = calculate_length(&s1);

println!("'{}' 的長度為 {}。", s1, len);
}

fn calculate_length(s: &String) -> usize {
s.len()
}

我們會注意到元組都被拿掉了;
同時,我們會傳遞 &s1 給函式,這裡的 & 就是引用,
引用允許我們不用獲取所有權也能使用數值。

&s1 這個語法建立一個指向 s1 數值的引用,
但是因為沒有所有權,所以引用不再被使用後 s1 並不會被丟棄。
我們稱呼這樣的動作為借用(borrowing),因為與現實的借用行為非常接近。

Read More

Rust 學習筆記第二章 - 所有權(上)

前情提要

上次學到了 Rust 的基本概念,這次則進入 Rust 最大的特色————所有權
因為比較難理解,我這次打算分上下篇來紀錄,絕對不是寫不完拖更

注意:這個概念一定要理解,才能更有效的利用 Rust!

所有權是什麼?

我們在學習任何語言時,都會需要知道它們如何使用與管理記憶體的資源,以免造成浪費或者更糟糕的情形。
一般而言會有下列兩種流派:

  • 垃圾回收機制(garbage collector),程式在執行時會尋找不再被使用的記憶體並釋放,例如 Java、Python
  • 開發者親自分配,在程式碼中明確指出何時分配、何時釋放,例如 C(我相信對很多人來說 malloc 是個無法跨過的夢魘

但是 Rust 選擇了第三種方式:由所有權系統管理記憶體資源,
同時在編譯時檢查規則,違反規則會無法編譯,且規則不影響執行速度。

這就是 Rust 最大的特點:所有權(Ownership)。

所以簡單來說,所有權是 Rust 中用以管理程式記憶體的一系列規則

(註:如果要更深入理解所有權的原理,會需要理解堆疊(Stack)堆積(Heap)的運作,可以參考官方文件的這篇

Read More

Rust 學習筆記第一章 - 基礎概念篇

前情提要

上次我們學習如何安裝 Rust,以及利用 Cargo 管理 Rust 專案,
今天則是要介紹 Rust 的變數概念、基本資料型別、函式以及控制流程,也就是常見的程式設計概念。

變數與可變性

相信大家對「變數(variable)」已經有基本概念,今天特別要說明的是在 Rust 中變數的特性。

變數

首先建立一個專案叫做 variables,並且編輯 src/main.rs

1
2
3
4
5
6
fn main() {
let x = 5;
println!("x is:{x}");
x = 6;
println!("x is:{x}");
}

然後 cargo run,應該會得到以下輸出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: consider making this binding mutable: `mut x`
3 | println!("x 的數值為:{x}");
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` due to previous error

錯誤訊息告訴我們,「cannot assign twice to immutable variable」。

Read More

Rust 學習筆記 - 序篇

前情提要

因為 jserv 老師今年預計會在 Linux 系統核心課程教學 Rust,加上近幾年許多老牌 CLI 程式開始以 Rust 改寫,
用 Rust 開發系統程式」似乎成為主流了,於是在傳統的 C 之外,我也決定開始學習 Rust,反正技多不壓身www
為了避免忘記學到的東西,並且分享學習心得,
我決定把學習的過程寫成文章放上來,便開始這系列的文章(同時也是逼自己更新,不然我真的太容易怠惰了)。

本系列文章皆參考自 Rust 程式設計語言電子書,同時會加上我在學習過程中的心得與發現。

Rust 語言簡介

Rust 是以「賦權(empowerment)」為重點的程式語言,「能賦予你更多能力,在更廣泛的領域中帶有自信地向前邁進」(來自電子書前言

在過去,程式語言往往會在「上層的易讀易用性」與「底層的掌控性」之間難以取捨,
而 Rust 對此做出挑戰,嘗試讓開發者可以控制底層的實作細節,但又能免去以往的麻煩細節。

同時,Rust 更加強調安全性記憶體組態並行處理
這讓 Rust 程式變得更適合用於設計大型網路伺服器與客戶端、以及更安全的系統程式。

Rust 適合什麼樣的人?

先簡單總結:幾乎全部

Rust 雖然重視底層實作,但同時也具備現代化的開發工具,提高開發者的生產力:

Read More

Arch Linux 安裝紀錄 2023

前情提要

天啊上一篇竟然是兩個多月前……,我好爛喔嗚嗚嗚嗚。

經過幾個月的練習(好啦其實不需要那麼久,只是還在學期中我沒那麼多時間備份資料),趁著過年我終於做好準備,正式要跟陪伴我一年多的 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

Read More

Welcome!

很高興你找到這裡了!
目前網站初步建置完畢,歡迎大家來這裡玩!
當然還有不足的地方也歡迎聯繫我給我建議!

我是火山,請多指教。

火山 / Kazan
2022.09.15

Read More

Arch Linux 安裝練習筆記 2022 - BIOS+MBR

前情提要

上一篇竟然是上個月了……我果然怠惰了(跪

上次練習裝機,因為目標主機用了近年主流的 UEFI+GPT,大部分東西都蠻好處理的;
但這次的機器很麻煩,竟然是類似傳統 DOS 機器的 BIOS+MBR(還是 2018 的機器,ASUS 真的可以吃大便),
所以很多步驟都需要更動,
而且那台的狀態更是慘烈,如果沒裝好可能就真的回不去了……
所以老樣子,用 VM 來練習裝吧!

※注意:本次安裝步驟大部分會沿用上次,只是部份步驟或設定參數有所不同,所以可以先參考上次的文章練習一次!

VM 設定

跟上次一樣使用 Oracle VM VirtualBox,在新增 VM guest 的部份基本沿用上次的設定;
但有個不同的地方是,
System -> Motherboard 下面不需要選擇 “Enable EFI (special OSes only)”,
這樣才能製造出傳統 BIOS 開機環境。

Arch 安裝

跟上次一樣,只有少部份步驟需要調整,
以下就列出需要更動的地方:

硬碟分割與格式化

BIOS 開機不需要 /boot 分區,所以分割時基本上只需要主硬碟跟 Swap 分區:

Read More