# 2024q1 Homework5 (assessment)
contributed by < `yu-hsiennn` >
## 〈[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1)〉閱讀心得
看完這些文章,我對作者展現出的勇氣感到非常敬佩。他在計畫尚未確定可行性的情況下,選擇延後畢業以完成自己的計畫。這種精神,可能是每位創業者都必須經歷的階段。正如老師所指出的,我們通常對失敗感到恐懼,一旦遇到困難就會退縮,不斷質疑自己的選擇是否正確,擔心最終一無所有,只是白白浪費了時間和金錢。這樣的想法往往讓人在前進的路上感到迷茫。常言道:「失敗是成功之母」,這是人盡皆知的道理,但真正能夠面對失敗並從中學習的人卻不多。特別是在學習新技能或領域時,經常會遇到挑戰。我們應當努力理解問題所在,並嘗試解決它,甚至預見潛在的問題並避免它們發生。
老實說,在開始這門課程前,我曾經猶豫是否要冒這個險。畢竟目前以是碩士二年級,在尚未完成論文和實驗結果的同時,又要修一門相對耗時的課程,我不確定自己是否能夠應對。但我最終決定嘗試挑戰,希望透過加強對這個領域的理解,甚至能對未來的職業生涯有所助益。
修課至今,說自己不累是不真實的。每周都有大量教材需要研讀,常常追著作業跑,似乎永遠寫不完。但我確實感受到自己逐漸變強,從一開始的一無所知,到現在能夠理解一些基本原理。在寫作業的過程中,我也常去觀察同學的做法和自己的不同之處,從中發現自己未曾想到的點或對方忽略的細節。老師強調的注重細節的重要性也深深影響了我,提升效率必須從細節著手,深入了解並努力改進。
文章經歷同時也讓我認識到人脈的重要性。在現實世界中,很多事情不是一個人就能完成的。我們經常需要尋求不同領域專家的幫助來共同解決問題。工作也是如此,一個公司不可能只靠工程師運轉,需要多領域的人才合作。拓展人脈,未來這些人脈或許會在你最需要的時候提供幫助。
## 想投入的專案
- 重做 lab0 並彙整學員成果
lab0 是一個綜合了很多東西的專案,在之前作業中還是沒能將所有的部分了解並實作完成,故想藉此來重新投入此專案,並嘗試改善
- 位元操作
本身對於位元操作這一塊比較弱,想藉此來提升不足的地方
## 研讀[教材](https://wiki.csie.ncku.edu.tw/linux/schedule)
#### 紀錄
##### `##` 用法
```c
#define DECLARE_OBJECT(name) \
struct __##name##_node; \
typedef struct __##name##_node *name##_node; \
struct __##name##_node { \
name element; \
name##_node next; \
}; \
void append_##name(const name *X, name##_node *list); \
void delete_##name##_list(name##_node *list);
DECLARE_OBJECT(light)
```
同等於
- light
```c
struct __light_node;
typedef struct __light_node *light_node;
struct __light_node {
light element;
light_node next;
};
void append_light(const light *X, light_node *list);
void delete_light_list(light_node *list);
```
##### _Generic
教材中 `cbrt` 定義如下
```c
#define cbrt(X) \
_Generic((X), \
long double: cbrtl, \
default: cbrt, \
const float: cbrtf, \
float: cbrtf \
)(X)
```
:::info
參閱 [Generic selection (since C11)](https://en.cppreference.com/w/c/language/generic) 後,不了解為什麼會需要有 `const float: cbrtf` ?
:::
##### Block
```c
// Double Evaluation
#define DOUBLE(a) ((a) + (a))
// one times evalution
#define DOUBLE(a) ({ \
__typeof__(a) _x_in_DOUBLE = (a); \
_x_in_DOUBLE + _x_in_DOUBLE; \
})
```
利用 `__typeof__` 來確保型態一致,並將值指定給一個區域變數,來避免重複呼叫的情形
##### String switch in C
```c
#define MULTICHAR_CONSTANT(a,b,c,d) \
((int32_t)((a) | (b) << 8 | (c) << 16 | (d) << 24))
enum {
EXT_JPG = MULTICHAR_CONSTANT_L('.','j','p','g'),
EXT_PNG = MULTICHAR_CONSTANT_L('.','p','n','g'),
EXT_HTM = MULTICHAR_CONSTANT_L('.','h','t','m'),
EXT_CSS = MULTICHAR_CONSTANT_L('.','c','s','s'),
EXT_TXT = MULTICHAR_CONSTANT_L('.','t','x','t'),
EXT_JS = MULTICHAR_CONSTANT_L('.','j','s',0),
} lwan_mime_ext_t;
```
:::info
為什麼此處是用 `MULTICHAR_CONSTANT_L` 而不是 `MULTICHAR_CONSTANT`
:::
##### `&&` 用法
是 GCC Extension ,用於找到標籤的記憶體位址
```c
void example_function() {
goto *&&label; // Jump to the label using a pointer to the label
label:
printf("This is a label");
}
```
---
https://hackmd.io/@sysprog/c-std-security
https://hackmd.io/@sysprog/CSAPP/https%3A%2F%2Fhackmd.io%2Fs%2FrJoxSsiuG
ID => identifier
major/minor number
LKM
simrupt
TODO: ksort,強調 workqueue / CMWQ / kernel thread 對於任務分配的效率 (CPU utilization),