隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年10月31日 星期二

解決 BTF: .tmp_vmlinux.btf: pahole (pahole) is not available


問題

錯誤消息

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

Failed to generate BTF for vmlinux

Try to disable CONFIG_DEBUG_INFO_BTF

make: *** [Makefile:1227: vmlinux] Error 1

意思是在編譯時找不到pahole工具



解決方法

pahole工具是用來生成BTF訊息

而這個工具被包在dwarves下

輸入

 sudo apt-get install dwarves

應該不會再次出現這個錯誤訊息


2023年10月30日 星期一

解決 fatal error: gelf.h: No such file or directory


問題 

編譯時出現

fatal error: gelf.h: No such file or directory

   10 | #include <gelf.h>

      |          ^~~~~~~~

compilation terminated.



解決方法

發生這個原因是缺少libelf資料庫

此資料庫主要用來創建或修改ELF文件

輸入 sudo apt-get install libelf-dev

安裝libelf後應該不會出現這個問題





2023年10月29日 星期日

解決 make: *** No rule to make target 'xxx'. Stop.


問題

 輸入 make相關指令時

發生make: *** No rule to make target 'xxx'.  Stop. 

例如輸入sudo make modules_install

出現make: *** No rule to make target 'modules_install'.  Stop. 

或輸入sudo make install

出現make: *** No rule to make target 'install'.  Stop.                                                                      


解決方法

此問題為資料夾錯誤

先回cd /home/<user name>

<username>是Ubuntu的名字,例如我就是Lagee

此時應該會看到在"~"的資料夾

輸入 cd WSL-Linux-Kernel 到這個資料夾

再次輸入指令即可成功





2023年10月27日 星期五

Rust 迭代find概述 - 找到數組中滿足條件的元素


這篇文章會稍微講述find的用法

find用於找到第一個滿足特定的值的迭代器方法

先看看文件[1]

    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
    where
        P: FnMut(&Self::Item) -> bool,

predicate是一個閉包,會回傳一個結果的bool值

最後整個fn會返回一個Option

Option值包含兩個

如果bool值是false,也就是找不到指定條件的值,則回傳None。

若bool值是true,則回傳Some值


一個例子

假設想要找到一個數組中第一個偶數

可以使用find尋找

    let numbers: Vec<i32> = vec![1, 3, 5, 2, 4, 6, 7, 9];
    let first_even: Option<&i32> = numbers.iter().find(|&x| x % 2 == 0);
    match first_even {
        Some(even) => println!("First even number: {}", even),
        None => println!("No even numbers found."),
    }

第一行創建一個名為number的數組

第二行將numbers傳入迭代器,透過find尋找除二餘數為零的,並回傳一個Option

find只需要找元素,因此不需要變數所有權,用&x取引用值

第三行match則是判斷Option結果,如果有數值則輸出第一個偶數,None為找不到偶數。

Rust 迭代map概述 - 操作數組中每個元素


最近打程式打到現在

真的覺得map太好用了

這一篇會先稍微講述map的用法

如果有時間會在講進階用法


Map

Map被歸類在iter下

先看看文件[1]

    fn map<B, F>(self, f: F) -> Map<Self, F>
    where
        Self: Sized,
        F: FnMut(Self::Item) -> B,

建立一個迭代器,該迭代器在每個元素呼叫閉包

簡單來說就是可以對數組中每個值做處理


實際舉一個例子

有一個數組,希望對每個數值加一

常見會這樣做

let mut num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    for i in num {
        num[i] += 1;
    }

但透過map可以將程式碼簡化

    let mut num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    let mut res: Vec<_> = num.iter().map(|x| x + 1).collect();
    assert_eq!(vec![2, 3, 4, 5, 6, 7], res);

第一行創建數組

第二行先將num傳入iter迭代器中

透過map將數組裡面的值+1後

透過collect重組回一個數組中

第三行則做確認

2023年10月26日 星期四

Rust 迭代filter概述 - 用於過濾資料


最近寫Rust用到迭代的次數比較多

把整個用法心得寫下來讓大家也可以學


這篇先講filter

filter主要用於過濾資料

文件[1]這樣表示

    fn filter<P>(self, predicate: P) -> Filter<Self, P>
    where
        Self: Sized,
        P: FnMut(&Self::Item) -> bool,

self為一個迭代器

透過閉包找出符合得值

當不符合條件則為false會把資料過濾掉

最後回傳一個迭代器


舉一個例子來說

假設我有一變數num,為1, 2, 3, 4, 5, 6

把奇數過濾掉,只想要留下偶數

最快的方法就是使用filter

filter用法通常搭配閉包

閉包內的值為true才會存取值

    let num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    let res: Vec<_> = num.into_iter().filter(|x| x % 2 == 0).collect();
    assert_eq!(vec![2, 4, 6], res);

上述程式一行一行分析

第一行會創建一Vec數組

第二行為num.into_iter().filter(|x| x % 2 == 0).collect();

into_iter: 表示將數組轉化為迭代器,類似for迴圈[2]

filter(|x| x%2):設變數x,並對迭代器中所有數值取二餘數,若為偶數則不過濾[3]

collect:將過濾完成後的存進Vec

最後比較結果


若使用for迴圈則需要這樣寫

    let num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    let mut res: Vec<_> = Vec::new();
    for x in num {
        if x % 2 == 0 {
            res.push(x);
        }
    }
    assert_eq!(vec![2, 4, 6], res);

但軟體工程師總是會希望自己程式帥一點

一行解決的程式 帥!

2023年10月25日 星期三

解決 fatal error: openssl/bio.h: No such file or directory


問題

make用於自動化軟體編譯和建構過程

當使用make時系統系統會根據Makefile的目標、依賴項和相應命令而自動執行

但有可能會出現錯誤訊息 

scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory

   21 | #include <openssl/bio.h>

      |          ^~~~~~~~~~~~~~~

compilation terminated.

make[1]: *** [scripts/Makefile.host:95: scripts/extract-cert] Error 1

make: *** [Makefile:1247: scripts] Error 2




解決方法

發生這個原因有可能是沒安裝OpenSSL函示庫

可以透過

sudo apt install libssl-dev

安裝

並確保文件路徑使編譯器能夠找到相關標頭文件

2023年10月24日 星期二

解決 Unable to find the ncurses package.


問題

輸入make menuconfig更改硬體、網路等配置時時,出現

*

* Unable to find the ncurses package.

* Install ncurses (ncurses-devel or libncurses-dev

* depending on your distribution).

*

* You may also need to install pkg-config to find the

* ncurses installed in a non-default location.

*

make[1]: *** [scripts/kconfig/Makefile:211: scripts/kconfig/mconf-cfg] Error 1

make: *** [Makefile:627: menuconfig] Error 2


解決方法

其原因為找不到ncurses

ncurses用於創建和管理文本,常用於終端的圖形介面、文本編輯器等

允許開發者在終端創建具有文本屆面的程序,並提供介面控制和螢幕管理功能,使能夠創建友好介面的終端程序

透過輸入

sudo apt-get install ncurses-dev

即可解決



2023年10月23日 星期一

解決HOSTCC scripts/basic/fixdep /bin/sh: 1: gcc: not found


問題

使用make menuconfig更改硬體、網路等配置時,發生

HOSTCC  scripts/basic/fixdep

/bin/sh: 1: gcc: not found

make[1]: *** [scripts/Makefile.host:95: scripts/basic/fixdep] Error 127

make: *** [Makefile:563: scripts_basic] Error 2



問題cc: not found,有可能是因為缺少C編譯器



解決方法

安裝bison以及flex

sudo apt-get install bison

sudo apt-get install flex

bison為用於生成解析器和編譯器,用於編譯相關

flex用於生成詞法分析器,常與bison配合編譯器開發以及文本分析


若以上方法沒效

可嘗試更新並直接安裝C編譯器

sudo apt-get update

sudo apt-get install build-essential



2023年10月21日 星期六

【讀後心得】原子習慣 - 原來養成習慣可以這麼簡單


  人們常在某個時候會突然想精進自已,有時候總想要健身、有時總想要吃得健康、有時總想著要趕快把功課工作做完。雖然有想法也有幻想到結局,妄想一步登天改善自己,卻沒想過中間的過程需要一步一步地去培養。也許一個原子用處不大,但一個物質是由多個原子組成。如同習慣一樣,生活中也許一個小習慣大家不會在意,但多個習慣造就了我們平常的生活。本書靠著四個訣竅,讓讀者可以有規劃的養成一個習慣,亦可以把壞習慣去除。

奇怪的傳教士


   今天在北車等人的時候遇到奇怪的傳教士,跟我Battle二十分鐘耶穌和死後靈魂,最後爆氣離開,一來就問我

他:你信不信耶穌

我:我不信,但認為宗教是自由的

他:那你不信耶穌,你信不信靈魂

我:我不能相信靈魂這種沒科學根據的東西,因為我的職業是工程師,必須講求根據,對就是對,錯就是錯,不能有沒科學根據的東西

他:何謂對?何謂錯

我:我認為他是對的東西他就該對,我認為他是錯的東西他就得錯。

他:那你不就是跟上帝一樣嗎

我:對於我做出來的東西,他們看我本來就是跟看上帝一樣。就跟我們如果是神創造出來的,我們看神就是上帝,他們會視我們如螻蟻一般。

他:你不能這樣說,神愛世人,我們生在這個地球就是有罪,我們必須償還罪過,死後才可以回到神的身邊。

我:神絕對不愛世人,神不可能愛世人。而且你活著開心嗎?活著的事情做不完了為甚麼有心力去管死後的事。

他:所以我們才必須償還罪過,神愛世人,神對大家都是平等的,死後才可以有歸屬。

我:(???)

我:如果神愛世人,要怎麼解釋大洪水?神把其他人都殺了就叫做愛世人嗎?就如同你說我是神,神看待我們如同看待螻蟻,他想我們毀滅就毀滅,他想我們活著就活著。

他:神會放大洪水,是因為我們有罪過,但神是很寬恕的,神才會指點迷津,讓諾雅建造大方舟,讓大家可以避難。

我:大家指的是誰?神說,把一對純潔的和一對不純潔的動物放在方舟上。因為人類的罪過神把所有的動物都用大洪水殺掉,這個叫做愛世人嗎?動物因為無關緊要的人類被殺掉,這不就是看待螻蟻的行為?

他:跟你講這麼多你也不會相信耶穌啦,浪費我時間

我:你知道為什麼我不信耶穌嗎?因為我們家就是天主教世家,我從小接觸耶穌都不相信了怎麼可能你講我就會相信


然後他就氣走了。笑死,沒碰過讀過聖經但不是信天主教的瘋狗嗎

因為太好笑了趕快打起來,以後看一次笑一次