davidlei published on 2021-08-15 included in c 這最近在看 jserv 大神的 linux 核心設計講座,因為之前比較少寫 c,所以對於 function pointer 只有一點概念但沒有真正寫過,所以趁這個機會寫個筆記來紀錄一下用法。
之後在學習的過程中如果遇到 function pointer 的應用也會一併整理在這篇文章中。
function pointer function pointer 顧名思義就是指向某個 function 的 pointer,有了 function pointer 我們就可以實現把 function 當作參數,傳進一個 function 之中,或者更加彈性的設計我們的程式,減少多餘的 if/else, switch case。
我們先從一個簡單的 function pointer 宣告開始講起
int (*myFunc)(int, int); 上面就是一個基本的 function pointer 宣告
一個 function pointer 變數名稱為 myFunc,可以這麼解讀
myFunc 是一個指標指向一個 function 該 function 有兩個 int 的 parameters 該 function 會回傳 int 假設今天我有個 function 宣告成以下這種形式
void parseFunc(float f1, int i1, char c1); 我們要怎麼宣告一個 pointer 去指向這個 function 呢?
這次新架的 blog 使用了 LoveIt 這個主題
詳細的架設參數設定都是參考其官方部落格,寫的算是滿詳細的,值得參考。
至於跟 github page 連動的部份,這方面很多文章都有不同的解決方案,我在這篇分享一下我的解決方法。
因為 github page 只認得 docs 或者 public 兩個資料夾存放靜態檔案,所以我們勢必要把 hugo 生成的靜態檔案放到專案根目錄的 /docs 或者 /public 之中,底下是我 github page 專案的架構
其中 blog 是主要 hugo 生成的目錄,docs 是給 github page 辨識靜態檔案的目錄。
在 /blog 添加完新的文章之後,用指定目錄的方式,讓靜態檔案生成到 /docs 底下,讓 github page 讀取
hugo -d ../docs cd .. git add . git commit -m "update" git push reference 使用 GitHub Pages 展示你的 Single Page Application 使用 Github Pages 和 Hugo 搭建个人博客教程 使用hugo生成静态博客并部署在GitHub上 LoveIt 官方 blog
因為 side project 可能會用簡單的資料庫,為了方便包成 docker 讓大家試玩,想要使用 Volume 的方式對資料庫做持久化。在這邊紀錄一下 Docker Volume 相關的一些用法。
很多篇文章都不推薦使用 docker 存放資料庫,我也認為 Volume 比較適合使用在本地端或者非生產環境的小專案上。
Volume 是什麼 Volume 可以想成一個可供單個或多個容器使用的特殊目錄,有以下特性:
Volume 可以在容器間共享資源,檔案 更新 Volume 內的檔案並不會影響 Image Volume 會持續存在,並不會隨著容器刪除而消失 有點類似 Linux 底下的掛載,Image 中被指定掛載的目錄/檔案會複製到 Volume 中。
創建 Volume ~$ docker volume create volume_name 查看所有 Volume ~$ docker volume ls 查看指定 Volume 資料 ~$ docker volume inspect volume_name 運行一個掛載 Volume 的 Container ~$ docker run -d -P \ --name web \ # -v my-vol:/usr/share/nginx/html \ --mount source=v1,target=/usr/share/nginx/html \ nginx:alpine 在使用 docker run 指令的時候可以使用 --mount 參數來將創建好的 Volume 掛載到容器內部,一次 docker run 可以掛載多個 Volume。
假設今天我們常用的資料夾路徑是在 /path1/workdir/project1/module... 每次登入 linux 環境都要切換到這個資料夾我們就需要重新輸入路徑
$ cd /path1/workdir/project1/module... 我們這時候就可以用一個變數來取代常用的字串
在這之前先介紹一下變數的取用
echo $ echo $HOME /home/davidlei $ echo ${HOME} /home/davidlei 取出 Home 這個變數的值並且顯示出來
在 Linux 底下變數前面都需要加上 $ 符號來做辨識 也可以在 $ 符號後面用 {} 把變數名稱框起來
回到一開始提到的案例,我們現在想要設置一個變數 work 來存放 /path/workdir/project1/module
$ echo $work // 還未設置的變數默認為空,echo 出來的結果是空 $ work=/path1/workdir/project1/module $ echo $work /path1/workdir/project1/module 變數的設定規則 設定變數中間以 “=” 連結,並且等號兩側不能有空格 $ var=something // 正確 $ var = something // 等號兩邊不得有空格 變數開頭不能是數字 變數內容含有空白字元可以用 "" 雙引號 或者 '’ 單引號包起來 如果變數內容包含著其他變數,需要用 "" 包起來,請看下方範例 用 ’’ 包起來 bash 就不會把 $變數 置換成該變數的內容。
很多範例都是參考鳥哥的教材,再自己實際操作一次,文末有附上連結。
read 讀取從鍵盤輸入的變數,常常會出現在 shell script 之中
$ read [-pt] 變數名稱 // 參數 // -p 後面接提示字元 // -t 後面接等待時間,超過時間沒輸入則取消指令 $ declare 可以宣告變數的類型,我們上面提到有關變數的操作很多都只是單純的字串,但有些場合我們需要整數或者陣列時就要使用這個指令去指定變數的類型
$ declare [-aixr] 變數名稱 // 參數 // -a 宣告陣列型態的變數 // -i 宣告整數型態的變數 // -x 同 export 指令,宣告的變數變成全域變數(可以讓子程序讀取) // -r 宣告 readonly, 不可更改變數內容,也無法被 unset 取消 // -p 列出變數資料型態 $ 接著試著把 num 轉成全域變數,並且用 export 指令觀察一下:
列出指定變數的資料型態
array 以 arr[index]=content 的形式來指定 array Index 所代表的值。
reference 鳥哥的 Linux 私房菜
此專案用來整理一些學習 SDN 的相關知識以及參考資料。 由於剛開始學習沒多久,所以會著重於個人學習的順序,希望在寫心得的同時也可以幫助到一些想要研究 SDN 的朋友。
當然,由於我也是剛開始學習,所以整理的心得如果有誤也請各位前輩們指點
預備知識 在學習 SDN 之前我準備先複習了一輪 computer networking a top-down approach 7th,之前大學學過的很多部份已經有點忘記了,所以先把傳統的網路概論複習一輪,之後進入SDN的學習時,才會比較清楚知道為什麼要提出SDN的概念,SDN具體來說是要解決哪些傳統架構無法解決的問題。
之後會陸續整理一點網路的基礎理論心得,讓之後SDN的一些概念比較好解釋。
什麼是 SDN 以及 SDN 的發展歷史 參考文章
SDN 簡介 SDN 發展趨勢 傳統網路的一些特點:
每個節點是由設備單獨控制,屬於分散式架構。 控制面以及轉接面放在同一個設備上。 管理員無法直接的操作封包轉送行為,僅能控制設備的通訊協定,再藉由通訊協定的規則去操作設備。 通訊協定對於設備的影響是固定的,無法控制非自己協定內的規則。 SDN 想要採取集中式控制,要求轉接面跟控制面分離,實際上由遠端的 controller 計算以及分送每一個路由器的轉送表,管理員可以直接操作設備轉接封包的行為。
SDN 並非一種技術,而是一種設計的理念,只要符合控制面以及轉接面的分離,以及開放的可程式化設計界面,就可以稱為 SDN 架構。通常 SDN 也伴隨著集中控制的特性,藉由在 controller 獲得的網路全局資料(並非傳統只能獲得局部資料),根據其業務邏輯進行調整及優化。
常用名詞解釋 Network Device 網路設備 網路設備不僅限於實體的設備(例如 switch ,路由器等等),也有可能是虛擬的 switch (例如 OVS),封包在網路設備之前被處理以及轉送。網路設備藉由 Southbound Interface 接收 controller 發過來的指令配置轉送的規則,也可以透過 Southbound Interface 來將一些資料回傳給 controller。
有時候網路設備也被稱為 Data Plane。
支援 OpenFlow 的 switch 會有以下功能