Try   HackMD

2024q1 Homework5 (assessment)

contributed by < yu-hsiennn >

因為自動飲料機而延畢的那一年〉閱讀心得

看完這些文章,我對作者展現出的勇氣感到非常敬佩。他在計畫尚未確定可行性的情況下,選擇延後畢業以完成自己的計畫。這種精神,可能是每位創業者都必須經歷的階段。正如老師所指出的,我們通常對失敗感到恐懼,一旦遇到困難就會退縮,不斷質疑自己的選擇是否正確,擔心最終一無所有,只是白白浪費了時間和金錢。這樣的想法往往讓人在前進的路上感到迷茫。常言道:「失敗是成功之母」,這是人盡皆知的道理,但真正能夠面對失敗並從中學習的人卻不多。特別是在學習新技能或領域時,經常會遇到挑戰。我們應當努力理解問題所在,並嘗試解決它,甚至預見潛在的問題並避免它們發生。

老實說,在開始這門課程前,我曾經猶豫是否要冒這個險。畢竟目前以是碩士二年級,在尚未完成論文和實驗結果的同時,又要修一門相對耗時的課程,我不確定自己是否能夠應對。但我最終決定嘗試挑戰,希望透過加強對這個領域的理解,甚至能對未來的職業生涯有所助益。

修課至今,說自己不累是不真實的。每周都有大量教材需要研讀,常常追著作業跑,似乎永遠寫不完。但我確實感受到自己逐漸變強,從一開始的一無所知,到現在能夠理解一些基本原理。在寫作業的過程中,我也常去觀察同學的做法和自己的不同之處,從中發現自己未曾想到的點或對方忽略的細節。老師強調的注重細節的重要性也深深影響了我,提升效率必須從細節著手,深入了解並努力改進。

文章經歷同時也讓我認識到人脈的重要性。在現實世界中,很多事情不是一個人就能完成的。我們經常需要尋求不同領域專家的幫助來共同解決問題。工作也是如此,一個公司不可能只靠工程師運轉,需要多領域的人才合作。拓展人脈,未來這些人脈或許會在你最需要的時候提供幫助。

想投入的專案

  • 重做 lab0 並彙整學員成果
    lab0 是一個綜合了很多東西的專案,在之前作業中還是沒能將所有的部分了解並實作完成,故想藉此來重新投入此專案,並嘗試改善

  • 位元操作
    本身對於位元操作這一塊比較弱,想藉此來提升不足的地方

研讀教材

紀錄

## 用法
#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
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 定義如下

#define cbrt(X) \
    _Generic((X), \     
             long double: cbrtl, \
             default: cbrt,  \
             const float: cbrtf, \
             float: cbrtf  \
    )(X)

參閱 Generic selection (since C11) 後,不了解為什麼會需要有 const float: cbrtf ?

Block
// 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
#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;

為什麼此處是用 MULTICHAR_CONSTANT_L 而不是 MULTICHAR_CONSTANT

&& 用法

是 GCC Extension ,用於找到標籤的記憶體位址

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),