內容選單標籤

2022年1月11日 星期二

網路指令

 Winows10


PS C:\Users\kk> ping  /?

使用方式: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
            [-r count] [-s count] [[-j host-list] | [-k host-list]]
            [-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
            [-4] [-6] target_name

選項:
    -t             Ping 指定的主機,直到停止。
                   若要查看統計資料並繼續,請按 Control-Break;
                   若要停止,請按 Control-C。
    -a             將位址解析為主機名稱。
    -n count       要傳送的回應要求數目。
    -l size        傳送緩衝區大小。
    -f             在封包中設定 Don't Fragment 旗標 (僅 IPv4)。
    -i TTL         存留時間。
    -v TOS         服務類型 (僅 IPv4。此設定已過時,而且對 IP 標頭中的
                   服務類型欄位沒有影響)。
    -r count       記錄路由以供計算躍點 (僅 IPv4)。
    -s count       供計算躍點的時間戳記 (僅 IPv4)。
    -j host-list   鬆散的主機清單的來源路由 (僅 IPv4)。
    -k host-list   嚴格的主機清單來源路由 (僅 IPv4)。
    -w timeout     每個回覆的等候逾時 (單位為毫秒)。
    -R             也使用路由標頭測試反向路由 (僅 IPv6)。
                   根據 RFC 5095,已不再使用此路由標頭。如果使用此標頭,某些
                   系統可能會捨棄回應要求。
    -S srcaddr     要使用的來源位址。
    -c compartment 路由區間識別碼。
    -p             對 Hyper-V 網路虛擬化提供者位址執行 Ping。
    -4             強制使用 IPv4。
    -6             強制使用 IPv6。



PS C:\Users\kk> ping  www.google.com

Ping www.google.com [2404:6800:4012:1::2004] (使用 32 位元組的資料):
回覆自 2404:6800:4012:1::2004: 時間=35ms
回覆自 2404:6800:4012:1::2004: 時間=24ms
回覆自 2404:6800:4012:1::2004: 時間=29ms
回覆自 2404:6800:4012:1::2004: 時間=31ms

2404:6800:4012:1::2004 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 24ms,最大值 = 35ms,平均 = 29ms



PS C:\Users\kk> ping -4 www.google.com

Ping www.google.com [172.217.160.100] (使用 32 位元組的資料):
回覆自 172.217.160.100: 位元組=32 時間=20ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=18ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=7ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=11ms TTL=114

172.217.160.100 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 7ms,最大值 = 20ms,平均 = 14ms



PS C:\Users\kk> ping  172.217.160.100

Ping 172.217.160.100 (使用 32 位元組的資料):
回覆自 172.217.160.100: 位元組=32 時間=31ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=51ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=36ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=45ms TTL=114

172.217.160.100 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 31ms,最大值 = 51ms,平均 = 40ms




PS C:\Users\kk> ping  -a 172.217.160.100

Ping tsa03s06-in-f4.1e100.net [172.217.160.100] (使用 32 位元組的資料):
回覆自 172.217.160.100: 位元組=32 時間=15ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=17ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=24ms TTL=114
回覆自 172.217.160.100: 位元組=32 時間=25ms TTL=114

172.217.160.100 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 15ms,最大值 = 25ms,平均 = 20ms









C:\Users\kk>arp /?

顯示和修改位址解析通訊協定 (ARP) 使用的 IP 對
實際位址轉譯表格。

ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr] [-v]

  -a            質詢目前的通訊協定資料來顯示目前的
                ARP 項目。如果指定 inet_addr,只會顯示指定電腦的
                IP 及實體位址。如果有多個網路介面使用 ARP,便會顯示每個 ARP
                表格的項目。
  -g            與 -a 相同。
  -v            以詳細資訊模式顯示目前的 ARP 項目。將會顯示
                所有無效項目和回路介面上的項目。
  inet_addr     指定網際網路位址。
  -N if_addr    顯示 if_addr 指定之網路介面的 ARP
                項目。
  -d            刪除 inet_addr 指定的主機。使用萬用字元 * 取代 inet_addr
                可刪除所有主機。
  -s            新增主機並將網際網路位址 inet_addr 與實體位址
                eth_addr 相關聯。實體位址是
                6 個以連字號分隔的十六進位位元組。該項目
                永久不變。
  eth_addr      指定實體位址。
  if_addr       如果存在,這會指定介面的網際網路位址,
                應修改此介面的位址轉譯表格。
                如果不存在,將會使用第一個適用的介面。
範例:
  > arp -s 157.55.85.212   00-aa-00-62-c6-09  .... 新增靜態項目。
  > arp -a                                    .... 顯示 ARP 表格。




C:\Users\kk>arp -a

介面: 172.31.147.32 --- 0x10
  網際網路網址          實體位址               類型
  172.31.147.254        e8-1c-ba-c9-09-68     動態
  172.31.147.255        ff-ff-ff-ff-ff-ff     靜態
  224.0.0.2             01-00-5e-00-00-02     靜態
  224.0.0.22            01-00-5e-00-00-16     靜態
  224.0.0.251           01-00-5e-00-00-fb     靜態
  224.0.0.252           01-00-5e-00-00-fc     靜態
  239.255.255.250       01-00-5e-7f-ff-fa     靜態
  255.255.255.255       ff-ff-ff-ff-ff-ff     靜態

2022年1月2日 星期日

ALPHA Camp Blog 技術主題

https://tw.alphacamp.co/javascript-web-development-topics

認識演算法(Algorithm)與運算思維(Computational Thinking)

什麼是運算思維(Computational Thinking)?

微軟研究院全球副總裁周以真(Jeannette Wing)對運算思維的定義如下:
「 運算思維是一個思考的程序。它的目的是闡明問題,並呈現其解決方案,因而讓「運算器」(包括機器與人) 能夠有效率地執行。」

為什麼要談運算思維呢?因為程式設計基本上就是和電腦溝通。更確切地說,學習寫程式就是學習如何下指令給電腦執行。因此,在學習程式語言之前,我們必須先了解、熟悉撰寫程式背後的「思考模式」

為什麼要學運算思維?

培養運算思維能訓練邏輯思考、提升問題解決能力。你會學習如何拆解問題,一步一步找到最有效的解決方法。學習運算思維也有助於了解電腦的運作模式,也就是電腦如何「思考」和執行指令。有了這些知識,你就更能有效運用科技解決問題。

無論你想解決什麼問題,運算思維能幫助你分析問題、找到核心議題,並採取適合的解決方法或工具(例如程式語言)。需要和工程師或技術團隊合作時,發揮運算思維能促進彼此之間的溝通、增加你的工作效率,也有助培養跨領域的技能。

運算思維的四大步驟定義如下:

1. 拆解 (decomposition)
將複雜的問題或系統分解成更⼩、更易於管理的問題。

2. 辨識規律 (pattern recognition)
將每個⼩問題分別檢視,思考之前是否有解過類似的問題。

3.抽象化 (abstraction)
抓出重要的細節,將它轉化爲解決⽅案中的步驟。

演算法 (algorithm)設計

歸納出簡單的步驟或原則來解決每個⼩問題。在這個階段,你會定義要給電腦的輸入,以及電腦傳回的輸出。你也會定義電腦將執行的演算法。
輸入 --> 演算法 --> 輸出

如果以這四個步驟套回去剛剛的案例:其實在日常生活中,我們常常會用到運算思維。重要的是讓自己習慣用這個思考過程 (thinking process) 去拆解問題,然後把解決方案 (也是演算法) 透過程式碼去跟電腦溝通,讓電腦執行。

運算思維並不能回答我們遇到的所有問題,但提供了一個模式,讓我們能遵循清楚的流程,有系統地描述問題並加以解決。不只如此,運算思維也幫助我們找到能輕鬆轉換成程式碼的解決方法。所以,我們應該從日常生活的問題開始,培養運算思維的能力。

什麼是演算法(Algorithm)?

「演算法是一系列有條理的步驟,能用於計算解決問題做出決定。」
演算法的重點在於,如果環境和輸入不變,每次執行同一組指令時, 會得到相同的輸出。除了電腦程式之外,食譜和樂譜也是演算法的例子。

設計演算法

在設計演算法前,必須清楚定義輸入輸出
舉例來說,烤蛋糕時,你首先需要正確份量的原料(輸入),之後你會按照食譜(演算法)製作,最後烤出蛋糕(輸出)。

如何知道自己的演算法是否正確?

檢測演算法的方式之一是將輸出未知的輸入放進演算法中。從輸出結果可以觀察演算法的效用,看看演算法是否產生理想輸出。如果沒有的話,我們能觀察輸出的規律,進而修正演算法,直到獲得理想輸出為止。

演算法類型

演算法就和問題一樣有許多種類。以下是電腦科學領域常見的幾種演算法:
  • 簡單遞迴演算法 (Simple recursive algorithms:):這些演算法使用遞迴計算來找答案。這個方法用於解決古典問題,例如「計算到 n 次方」。

  • 回溯法 (Backtracking):為了找到解決方法,一個問題先劃分為多個計算用的路徑。如果路徑方向錯誤,便回到上一個位置,從另一個方向開始計算。常見的使用案例需要從大量數據中找到特定資訊。這個方法通常用來找出每一條路徑。如果一條路徑不包含目標資訊,則演算法會回到上一個連接點。

  • 動態法 (Dynamic): 這個演算法的獨特之處在於演算法會記憶之前解決過的問題,並藉由之前解決問題的經驗更快找到類似問題的解決方法。如果之前你計算過 n 的 1,000,000 次方,這個演算法不需從頭重新計算,而是能根據之前計算 n 的 1,000,001 次方的答案,更快找到解答。

  • 分而治之法 (Divide and conquer):排序是分而治之演算法常見的類型。這種演算法將一系列數字切分為多個部分,然後在每個部分進行比較排序。所有部分之後合併起來,整個組合會再次進行比較排序。這種方法的操作速度比只排序不分割的演算法還要快上好幾倍。

  • 暴力法 (Brute force):這是駭客最常使用的演算法。如果駭客想要駭入你的帳戶,大概會一次就嘗試所有可能的密碼組合。之所以稱為暴力演算法,是因為這個方法靠電腦速度暴力破解密碼。

  • 貪婪法 (Greedy):貪婪演算法和暴力演算法類似。這個解決方法會根據當前狀況找出最佳解決方法,常用來尋找與決定行駛路線。演算法不會計算抵達目的地的所有可能路線,只選擇距離下一個檢查點最短的路線,而且不會考慮檢查點之後的其他路線。

如何評估演算法?

演算法除了能否正確解決問題之外,還有「好、壞」之分嗎?答案是有的。不同的演算法,雖然都能正確達成目標,但還是有效能 (efficiency) 之分。主要的考量點有兩個:

時間複雜度 (Time complexity) - 它代表一個演算法的執行時間。針對同一個問題,有些演算法會比別的用更短的時間(也是更快速)去解決問題。

空間複雜度 (Space complexity) - 它指的是要執行該演算法 (或是程式碼) 所需的記憶體量。

可以理解,效能越好的演算法,它所需要的時間會越短、空間也越少。衡量時間、空間複雜度的方法我們叫 BigO notation. 你可能看過像這種符號:

總結

軟體開發其中一個核心技能,就是把我們想解決的問題 (或想完成的事情),整理成有條理的指令,再用電腦的邏輯與語言去跟它溝通,讓它用最有效的方法去執行。當你認識並開始深入學習演算法和運算思維,你也更能夠順利地和電腦溝通、更有效地解決問題。







前端 JavaScript | HTML | CSS| Bootstrap | RWD | DOM | API | AJAX | Postman | jQuery

後端 HTTP |  HTTPS | Node.js | MongoDB | Git | SQL |  NoSQL | Docker | React

其他 VSCode | Web App | Leetcode




Bootstrap 是什麼?

Bootstrap 是一個由 HTML、CSS 和 JavaScript 寫成的前端框架,核心的設計目標是達成RWD響應式與行動優先,也就是讓你的網站排版可以自動適應螢幕大小。它預先做好一套網站的基礎建設,讓你能在框架的基礎上進行開發,不需要再去煩惱瑣碎的設定。



什麼是 Ajax? 搞懂非同步請求 (Asynchronous request)概念

Ajax 是 Asynchronous JavaScript and XML 的縮寫
Asynchronous:非同步
JavaScript:使用的程式語言
XML:Client 與 Server 交換資料用的資料與方法,近年由於 JSON 等格式的流行,使用 Ajax 處理的資料並不限於 XML。

Ajax 並不是單一的技術,而是一套綜合性的瀏覽器端網頁開發技術,因 Google 在 2005 年推出 Gmail 服務時採用此技術大獲成功而知名。

非同步

當你在使用 DOM 事件時,其實你已經在運用非同步的概念,你不知道事件什麼時候會發生,但你可以先把要發生的函式準備好,等到事件發生時,就進行處理。
click event ----->> function
上述這種流程稱為「非同步」。由於 JavaScript 可以把函式當成值來傳遞,因此執行程序可以非同步的發生。

當我們在串接第三方 API 時,由於要等待遠端伺服器回應,等待的時候有可能會大幅影響到使用者的體驗,因此「非同步請求」變得更加重要。

同步請求 v.s. 非同步請求

同步請求 (Synchronous request): 
客戶端 (client) 對伺服器端 (server) 送出 request ,並且在收到伺服器端的 response 之後才會繼續下一步的動作,等待的期間無法處理其他事情。這個作法並不理想,因為通常伺服器端的運算速度比本地電腦慢上好幾倍。

非同步請求 (Asynchronous request):
客戶端 (client) 對伺服器端 (server) 送出 request 之後,不需要等待結果,仍可以持續處理其他事情,甚至繼續送出其他 request。Responese 傳回之後,就被融合進當下頁面或應用中。

Ajax 實現非同步請求 (Asynchronous Request)

在非同步請求 (Asynchronous request) 還沒被開發之前,如果我們要瀏覽一則留言,就必須向 Server 重新 request 一個完整的頁面。等待頁面切換的這段時間畫面往往會卡住不動,直到接收 response,才會重新渲染 (render) 畫面。
而 Ajax 技術的出現,讓瀏覽器可以向 Server 請求資料而不需費時等待。當瀏覽器接收到 response 之後,新的內容就會即時地添入原本網頁。這也是為什麼當我們瀏覽 Facebook、Twitter 內容時,不會看見整個網頁一直重新整理。

最早期的 Ajax 會利用一個 XMLHttpRequest 物件 (簡稱為 XHR ) 來實作,首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。

由於 XHR 使用起來很麻煩,所以實務上很少直接使用原生的 XMLHttpRequest。取而代之的方法有很多種,過去較流行的是 jQuery 的 $.ajax(),然而在 JavaScript 日趨成熟之後,許多新的替代方案應運而生,例如 HTML5 提供了 Fetch API,而我們使用的 axios 是一個非常受歡迎的 JavaScript 函式庫,他有許多重要功能如:
  • 廣泛的瀏覽器支持
  • 可支援 Node.js 從後端發送的 Http request,這意味著 axios 可以兼用於前端與後端專案。
  • 直接將回應的 JSON 資料轉換成 JavaScript 的 Object,這十分方便!

使用 AJAX 提高使用者體驗

在一般的情境下,瀏覽器每次發出請求,都會接收到一個完整的 HTML 網頁,而伺服器回傳新網頁、瀏覽器重新演算網頁的過程,有一小段空白的等待時間。若使用者在網路不穩定的地方連線,或者傳遞的資料量龐大時,這一小段的空白時間就會嚴重影響到使用者體驗。
另外,從效率考量,有些請求/回應其實只更新了局部的畫面,不需要每次都重新載入一個全新的網頁。因此,為了提升使用者體驗、並提高網頁的效率,而有了 AJAX 技術。透過 AJAX 技術,client 可以向 server 發出非同步請求,索取局部內容的資料進行抽換,大幅度降低每次請求與回應的資料量,從而提高了瀏覽速度。
使用 AJAX 不僅可以讓使用者在不刷新畫面的情況下繼續操作,不會有在操作途中「中斷」與「等候」的時間,創造了更佳的使用者體驗。






認識JSON

資料格式是 Web API 的要素之一,API 的設計者可以自行決定資料回傳的格式,而這個格式稱之為 —— Response Format
HTTP 是 Server 及 Cilent 資料傳遞時所使用的溝通媒介,而 HTTP 使用 HTML 作為最初網路伺服器與電腦瀏覽器間傳遞資料的格式,但如今使用者可以在電腦、手機,甚至是穿戴式裝置上使用網路,不同的裝置也讓處理資料的方式更多元,所以 HTML 不再是唯一用來傳遞資料的格式。
在使用 Web API 交換資料時,目前最常見的回應格式有二:

XML:Extensible Markup Language

是一種標記式 (markup) 語言,使用 < > 定義標記,標記的頭尾之間夾帶著內容,可以想像成是 HTML 標籤語法的延伸。

JSON: JavaScript Object Notation 的縮寫

它參考了 JavaScript 中物件結構的表示方式。
與 XML 相較之下,JSON較為輕量、易於閱讀,幾乎所有網頁開發相關的語言都有解析 JSON 資料的函式庫,故本課程將使用 JSON 作為 Web API 資料交換的主要格式。
JSON 看起來很像 JavaScript 的 object,但其實是不同的資料格式,使用的時候需要經過解析,下文介紹 JSON 的使用方法。
JSON 的語法建立在 JavaScript 對於 ArrayObject 的表示方式,同樣地,JSON 的資料結構中通常也會運用 array 和 object 的嵌套關係,例如:

外層是 array,裡頭包含其他 object
外層是 object,裡頭還有其他 object
以上兩種模型可以被自由地混合使用。除了 Array 和 Object,JSON 還可以處理字串 (String)、數字、布林值 (Booleans) 以及空值 (null)。

你可以運用 JavaScript 來撰寫 JSON。例如:

{
 "name": "John",
 "age": 29,
 "employed": false,
 "car": null,
 "friends":
 [
   { "name":"Mary", "status":"close friends" },
   { "name":"Robert", "status":"close friends" },
   { "name":"Linda", "status":"acquaintance" }
 ]
}






現在的前端都在用 JavaScript「框架」?前端框架的功能與優點

目前的三大框架:ReactVueAngular;或著也可以到 GitHub 上搜尋 Awesome Javascript,其中的 Framework 數量也是琳瑯滿目;但到底為什麼好像全世界都在用「框架」呢?

沒有框架的日子

先回想一下在沒有框架的時候,開發者的日常會長什麼樣子吧。
那時最流行的「套件」非 jQuery 莫屬了,語法簡潔、直覺好用的元素選取器,語法便捷的事件監聽註冊,豐富的開發者生態系產出大量的開源套件,以及最重要的,弭平瀏覽器 XHR 差異的 ajax 函式,將複雜的瀏覽器差異藏在套件中,讓開發者只需要專注在想實作的邏輯即可。

透過好用的元素選取器及事件監聽,開發者們可以依據使用者的行為,靈活操作 DOM 元素的結構及樣式,jQuery 的這些特色直到 2019 的現在,都仍是很實用的功能,甚至 程式碼本身 也有許多值得開發者學習的地方;但隨著專案規模逐漸增大,程式複雜度不斷上升,直接操作 DOM 的缺點也就逐漸浮出檯面:
  • 難以維護
HTML、CSS、JavaScript 無法維持原先的各司其職,因為需要透過 JavaScript 處理互動內容,勢必要將結構、樣式寫到 JavaScript 的部份中,也就因此造成架構耦合度提高,程式碼管理困難。
  • 效能低落
在 Reflow 及 Repaint 是什麼? 中有提到 Render Tree 的概念,當 DOM 被改變,勢必要觸發整個 Reflow & Repaint 的流程,頻繁的改動觸發重複渲染,便會讓頁面效能被消耗殆盡。

框架的功能

既然有前述的問題,自然會有強者試圖解決它。現今的「框架」其實就是一種提升開發效率、降低維護難度的開發架構。主流的框架如 React、Vue 等,大都擁有這些特性:
  • 資料與 UI 分離
在原先,我們想要顯示一筆資料,可能必須寫死在 HTML 的結構中,若是動態的資料,可能要透過 JavaScript 將資料動態塞入 DOM 元素上。但在 Vue 中,相對來說會比較容易閱讀及維護吧?透過 Vue 的寫法,讓頁面結構的部份仍然由 HTML 決定,並由資料來決定畫面該如何呈現。由資料決定畫面 ,這就是現代框架至關重要的核心概念;將資料從介面中抽取出來,每個畫面都是對資料處理過後的呈現。
  • 模組化的 UI
一個網站總是會有一些重複出現的元素,例如按鈕、輸入表單、表格、對話框等等,像是 FaceBook 的按讚按鈕,可能一個頁面出現數十個都不為過;而在現代框架的概念中,我們會把這些重複出現的元素稱為 組件(Components),每個組件內包含了組件自己需要用的結構、樣式、邏輯。
例如前述的例子,我們可以將 .card 這個元素抽成單獨的組件,再從外部組件引入它,這樣一來,各組件只需要處理組件內的事,外部引用的組件來決定怎麼使用、提供什麼資料給組件,藉由簡單的切分權責,加上前述的由資料決定畫面,就能讓各個組件的任務單一,並且能被重複使用。甚至現在有許多完成度很高的前端 UI 組件庫,讓開發者有如玩樂高一樣,能快速地用組件堆出想要的畫面,大幅度降低了組織畫面所需要的時間,讓工程師能更專注在處理商業邏輯上。
  • 提升效能
如同前述,在複雜的頁面中,如果頻繁透過操作 DOM 的方式改變畫面,可能會造成全頁面的 Reflow 及 Repaint;不過在使用框架時,開發者不用太擔心這個問題。
原因是在各主流框架的實作中,幾乎都包含了 Virtual Dom 的概念,也就是用 JavaScript 物件來表達當前的頁面結構;藉由與 UI 分離的資料及 Virtual Dom 之間的關係,當資料變動時,事先計算好這次畫面需要變動的地方,如此一來便能抵銷掉無意義的更動,並重複利用已存在的 DOM 元素;當真的要進行 DOM 更新時,也會一次將所有需要更新的局部組件更新,讓效能的耗損盡可能降低。

結語

現代的瀏覽器已經逐漸符合標準規範,使得 jQuery 的重要性漸漸式微;框架的橫空出世,也無疑為前端工程帶來的巨大的轉變。從原先在乎檔案功能的關注點分離,變成組件權責單一的關注點分離;從單純的頁面呈現,到越來越複雜的頁面流轉資料串接
當前端開發者社群的能量越來越強大,也代表著網頁前端需要接手處理的事情越來繁雜;幸好得以透過框架強大的功能,大幅度的減輕開發者的負擔。當然,框架同時也代表著限制,唯有理解框架背後的核心思想,才能在限制中找到最適合的方向。





SQL/NoSQL是什麼?認識資料庫管理系統DBMS

SQL (Structured Query Language 結構化查詢語言) 是一種專門用來管理與查詢關聯式資料庫(Relational database)的程式語言。
NoSQL資料庫的意思是 "Not Only SQL",也就是不限定為「關聯式資料庫」的資料庫管理系統的統稱。
今天,大部分的人提到「資料庫」的時候,通常指的其實是資料庫管理系統(database management system,簡稱 DBMS):一套讓我們能方便使用資料庫的軟體,作為使用者(或是使用資料庫的應用程式)與資料庫之間溝通的平台。

關聯式資料庫(Relational Database Menagement System, RDBMS)有三個特質:

  • 資料是以一個或是多個資料表 (table) 的方式存放。
在關聯式資料庫裡,每一筆資料都是在 table 中的一個 record,然後再把不同的 table 集合起來,就成為一個關聯式資料庫。
Record --> Table --> Database

  • 資料之間有明確的關聯。
關聯式資料庫一般都用來儲存結構化的資料,而資料之間大多會有清楚的關聯。

  • 關聯式資料庫以 SQL 語言操作
SQL (Structured Query Language 結構化查詢語言) 是一種專門用來管理與查詢關聯式資料庫的程式語言。透過 SQL,我們能在關聯式資料庫裡新增、查詢、更新和刪除資料,同時也能建立和修改資料庫模式。

NoSQL 非關聯式資料庫

隨著電腦、行動裝置、與互聯網的普及,網路應用程式的流量大幅地增長,同時 互聯網也進入「使用者生產內容 (user generated content)」為主流的時代。對於 Youtube、Facebook 這些社交網站來說,每分每秒需要處理的資料量是過去一般網站的非常多倍。
而從使用者的角度來看,他們在這些平台上對於資料的需求也跟過去不太一樣。資料庫的主要功能,從過去的「能夠無錯誤地同步處理結構清楚的資料」,到現在慢慢有新需求誕生:「處理高速大量產生的資料,但不需要即時同步,也不需絕對地零錯誤。」為了呼應這個需求,NoSQL 資料庫就隨之興起了。


Not Only SQL (NoSQL)

NoSQL 的意思是 "Not Only SQL",也就是不限定為「關聯式資料庫」的資料庫管理系統的統稱,在操作上,NoSQL 並不支持 SQL 語法 與 SQL 的邏輯。所以,NoSQL 資料庫通常不使用關聯模型,也並不需要固定的結構 (也就是 schema-free)。但有需要時, NoSQL 也可以使用關聯模型與 schema。
NoSQL 將聚集後的資料,作為儲存的最小單位,透過縝密豐富的資料結構,有利於將資料分散到多個節點;比起資料的關聯,NoSQL 更關注資料所代表的人(例如使用者)與物(例如一篇分享在社交平台上的文章)的「狀態」變動,例如文章被分享、按讚等。


文件資料庫 (document database)

文件資料庫是NoSQL資料庫的一種,顧名思義,是把資料存放成「文件 (documents)」,這些文件會組成為「集合 (collection)」並放在一起,在文件資料庫 (database)裡,文件會存成 JSON 格式,而資料物件會由「屬性-值」 (attribute-vaule pair) 或陣列組成。圖示如下:。
Documents  -->  Collections  -->  Database




































2021年12月15日 星期三

CentOS8 指令練習與網路管理


system information
------------------------------------------------------

//uname - print system information
# uname -a
Linux centos.kk 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Tue Nov 16 14:42:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux



# cat /etc/redhat-release
CentOS Linux release 8.5.2111



# cat /proc/version
Linux version 4.18.0-348.2.1.el8_5.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)) #1 SMP Tue Nov 16 14:42:35 UTC 2021







------------------------------------------------------
[root@centos ~]#
root:使用者
centos:主機名
~ :使用者家目錄
# :最高權限管理者



[kk1@centos ~]$
$:一班使用者


// show who is logged on
# who
root     pts/0        2021-12-16 08:21 (172.31.147.33)



//  Show who is logged on and what they are doing
# w
 08:22:27 up 32 min,  1 user,  load average: 0.09, 0.07, 0.02
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.31.147.33    08:21    0.00s  0.01s  0.00s w




// 關機馬上 halt
# shutdown -h now

// 關機10分鐘後
# shutdown -h 10

//重開機 reboot
# shutdown -r

#reboot


//list directory contents
// 列出 檔案系統 根目錄 下
# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr


// print name of current/working directory
# pwd
/root


// .. 上一層目錄,目前在 /root
# ls ..
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


# ls ../
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var boot  etc  lib   media  opt  root  sbin  sys  usr


// . 目前所在目錄,目前在 /root ,同 # ls
# ls .
 anaconda-ks.cfg

# ls ./
 anaconda-ks.cfg



//Change  the current directory to dir
# cd /
# pwd
/
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var




# date
四 12月 16 08:51:36 CST 2021



# echo $LANG
zh_TW.UTF-8




//取得語區資料特定的資訊
# locale --help

# locale
LANG=zh_TW.UTF-8
LC_CTYPE="zh_TW.UTF-8"
LC_NUMERIC="zh_TW.UTF-8"
LC_TIME="zh_TW.UTF-8"
LC_COLLATE="zh_TW.UTF-8"
LC_MONETARY="zh_TW.UTF-8"
LC_MESSAGES="zh_TW.UTF-8"
LC_PAPER="zh_TW.UTF-8"
LC_NAME="zh_TW.UTF-8"
LC_ADDRESS="zh_TW.UTF-8"
LC_TELEPHONE="zh_TW.UTF-8"
LC_MEASUREMENT="zh_TW.UTF-8"
LC_IDENTIFICATION="zh_TW.UTF-8"
LC_ALL=




# vi /etc/hostname
centos.kk


# hostnamectl set-hostname centos85.kk

# hostnamectl
   Static hostname: centos85.kk
         Icon name: computer-vm
           Chassis: vm
        Machine ID: d9fabbd997c54e8f8c8520cd37b792e1
           Boot ID: 79aaab2bf6d6447dbad2d71295dfb97c
    Virtualization: vmware
  Operating System: CentOS Linux 8
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-348.2.1.el8_5.x86_64
      Architecture: x86-64




------------------------------------------------------cp, mv, rm
# pwd
/root

# ls ./
 anaconda-ks.cfg


# ls /etc/yum.conf
/etc/yum.conf


//copy files and directories
# cp /etc/yum.conf ./

# ls
 anaconda-ks.cfg  yum.conf



//--recursive 可用複製資料夾
# cp -r /etc/ssh ./
# ls ./
 anaconda-ks.cfg ssh  yum.conf



// move (rename) files
# mv yum.conf aa.conf
# ls
aa.conf  anaconda-ks.cfg  ssh


//remove files or directories
# rm aa.conf
rm:是否移除普通檔案'aa.conf'? y
# ls
anaconda-ks.cfg  ssh


// --recursive   --force
# rm -rf ssh
# ls
anaconda-ks.cfg







------------------------------------------------------ touch, cat, more, less, head, tail
// concatenate files and print on the standard output
//--number
# cat /etc/yum.conf
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False

# cat -n /etc/yum.conf
     1  [main]
     2  gpgcheck=1
     3  installonly_limit=3
     4  clean_requirements_on_remove=True
     5  best=True
     6  skip_if_unavailable=False



// 產生 test.txt , > 將輸入文字寫入 test.txt 中
# cat>test.txt
I love linux !            //輸入完成按 Ctrl+D

# ls
anaconda-ks.cfg  test.txt

# cat test.txt
I love linux !



//SPACE     Display next k lines of text.  Defaults to current screen size.
//RETURN    Display next k lines of text.  Defaults  to  1    
// more - file perusal filter for crt viewing
# more anaconda-ks.cfg



//less - opposite of more
# less anaconda-ks.cfg


//head - output the first part of files
//預設10 列
# head anaconda-ks.cfg


//tail - output the last part of files
// 指定3列
# tail -3 anaconda-ks.cfg


// ----follow 持續監控記錄檔,有新資料馬上顯示    ^C 中斷
# tail -f anaconda-ks.cfg



//產生空白檔案
# touch kk1.txt
# ls -l
總計 4
-rw-------. 1 root root 1167 10月 15 19:05 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 12月 16 09:38 kk1.txt


//change file timestamps
# touch anaconda-ks.cfg
# ls -l
總計 4
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 12月 16 09:38 kk1.txt






------------------------------------------------------mkdir, rmdir
// make directories
# mkdir dir1
# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 12月 20 13:36 dir1

# touch dir1/file1.text

// remove empty directories
// -f, --force   -r, -R, --recursive
# rm -r dir1
rm: descend into directory 'dir1'? y
rm:是否移除普通空白檔案'dir1/file1.text'? y
rm:是否移除目錄'dir1'? y

# ls -l
總計 4
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg







------------------------------------------------------link

++++++++++++++++++++++softLink
# echo "Hello" > data.text

// -i, --inode
# ls -li
34576503 -rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
33576578 -rw-r--r--. 1 root root    6 12月 20 13:42 data.text

//-s, --symbolic make symbolic links instead of hard links
# ln -s data.text softLink

# ls -li
34576503 -rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
33576578 -rw-r--r--. 1 root root    6 12月 20 13:42 data.text
33577152 lrwxrwxrwx. 1 root root    9 12月 20 13:44 softLink -> data.text

// l: link    rwx: link 沒自己權限,視真實檔案為主
//2個 inode 編號不同

# cat softLink
Hello


# rm -f data.text
# ls -l softLink
lrwxrwxrwx. 1 root root 9 12月 20 13:44 softLink -> data.text

// slink 變成紅色警戒,表連結無效
//刪除 真實檔案的檔名
//符號連結 symbolic link 就無法取得真實檔案的 inode 資訊內的 Block 區塊位置

# cat softLink
cat: softLink: 沒有此一檔案或目錄


# rm softLink
rm:是否移除符號連結'softLink'? y
# ls -li
34576503 -rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg





++++++++++++++++++++++hardLink
# echo "World" >data2.text
# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
-rw-r--r--. 1 root root    6 12月 20 14:05 data2.text

# ln data2.text hardLink
# ls -li
34576503 -rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
33576578 -rw-r--r--. 2 root root    6 12月 20 14:05 data2.text
33576578 -rw-r--r--. 2 root root    6 12月 20 14:05 hardLink

//2個 inode 編號相同

# rm -f data2.text
# ls -li
34576503 -rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
33576578 -rw-r--r--. 1 root root    6 12月 20 14:05 hardLink

# cat hardLink
World

// 硬連結 hard link 複製真實檔案的 inode 資訊,所以刪除 真實檔案的檔名
//硬連結仍可以取得真實檔案的 inode 資訊內的 Block 區塊位置 


symbolic link(軟)       可跨越分割區       支援目錄   刪除真實檔案後成無效連結   無法自訂權限
hard         link(硬)   不可跨越分割區   不支援目錄   刪除真實檔案後仍有效連結   可以自訂權限




------------------------------------------------------執行檔

//執行檔的絕對路徑
# ls /usr/bin/du
/usr/bin/du
#  /usr/bin/du
44      .


//環境變數 PATH 設定 自動搜尋目錄裡的執行檔
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# du
44      .



# echo "HelloWorld!!" > runMe
# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
-rw-r--r--. 1 root root   13 12月 20 14:21 runMe

# chmod u+x runMe
# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
-rwxr--r--. 1 root root   13 12月 20 14:21 runMe

# runMe
-bash: runMe:命令找不到


//執行目前所在目錄下的執行檔
# ./runMe
./runMe: 列 1: HelloWorlddu:命令找不到







------------------------------------------------------硬碟空間使用情形

//report file system disk space usage 各分割區使用情況
//-h, --human-readable
# df -h
檔案系統                     容量  已用  可用 已用% 掛載點
devtmpfs                     886M     0  886M    0% /dev
tmpfs                        904M     0  904M    0% /dev/shm
tmpfs                        904M  8.7M  895M    1% /run
tmpfs                        904M     0  904M    0% /sys/fs/cgroup
/dev/mapper/cl_centos8-root  6.2G  1.4G  4.9G   23% /
/dev/sda1                    976M  136M  774M   15% /boot
tmpfs                        181M     0  181M    0% /run/user/0



//estimate file space usage 目前目錄下( 含子目錄)已用空間
 # du -h
32K     .


# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

 //-s, --summarize
# du -sh /var/
115M    /var/
# du -sh /var/*
0       /var/adm
24M     /var/cache
0       /var/crash
...







------------------------------------------------------重導輸出 redirect ,重導輸入
//若導向到的檔案已經存在,則會被覆蓋
# echo "this is old data" > myfile
# cat myfile
this is old data

//  >> 新增至尾端
# echo "this is new data" >> myfile
# cat myfile
this is old data
this is new data



# ls
anaconda-ks.cfg 
# ls kk1.txt
ls: 無法存取 'kk1.txt': 沒有此一檔案或目錄

// stdin:0   stdout:1   stderr:2
# ls kk1.txt 2> myError

# ls
anaconda-ks.cfg  myError

# cat myError
ls: 無法存取 'kk1.txt': 沒有此一檔案或目錄




# echo "電腦使用筆記,記錄相關重點" > myData
# cat myData
電腦使用筆記,記錄相關重點


// wc - print newline, word, and byte counts for each file
//行數   字數   byte數
# wc < myData
 1  1 40

# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg
-rw-r--r--. 1 root root   40 12月 20 14:49 myData



# ls -l
-rw-------. 1 root root 1167 12月 16 09:39 anaconda-ks.cfg


//  -l, --lines       print the newline counts
// -w, --words   print the word counts
//  -c, --bytes    print the byte counts
# wc -lwc anaconda-ks.cfg
  47  103 1167 anaconda-ks.cfg








------------------------------------------------------迴路介面 loopback interface
//ifconfig 替換為 ip addr
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 2001:288:8241:1::276/128 scope global dynamic noprefixroute
       valid_lft 603954sec preferred_lft 603954sec
    inet6 2001:288:8241:1:20c:29ff:fea9:bcb0/64 scope global dynamic noprefixroute
       valid_lft 2591946sec preferred_lft 604746sec
    inet6 fe80::20c:29ff:fea9:bcb0/64 scope link noprefixroute
       valid_lft forever preferred_lft forever



# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# ping localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.097 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.091 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2071ms
rtt min/avg/max/mdev = 0.048/0.078/0.097/0.024 ms




------------------------------------------------------nmcli 設定IP 相關

//nmcli - command-line tool for controlling NetworkManager

# nmcli device status
DEVICE  TYPE      STATE     CONNECTION
ens33   ethernet  已連線    ens33
lo      loopback  不受管理  --


# nmcli device show ens33
GENERAL.DEVICE:                         ens33
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         00:0C:29:A9:BC:B0
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (已連線)
GENERAL.CONNECTION:                     ens33
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveCon>
WIRED-PROPERTIES.CARRIER:               開
IP4.ADDRESS[1]:                         172.31.147.99/24
IP4.GATEWAY:                            172.31.147.254
IP4.ROUTE[1]:                           dst = 172.31.147.0/24, nh = 0.0.0.0, mt =>
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 172.31.147.254, mt >
IP4.DNS[1]:                             163.28.136.21
IP4.SEARCHES[1]:                        168.95.1.1
IP6.ADDRESS[1]:                         2001:288:8241:1:20c:29ff:fea9:bcb0/64
IP6.ADDRESS[2]:                         2001:288:8241:1::276/128
IP6.ADDRESS[3]:                         fe80::20c:29ff:fea9:bcb0/64
IP6.GATEWAY:                            fe80::ea1c:baff:fec9:968
IP6.ROUTE[1]:                           dst = 2001:288:8241:1::/64, nh = ::, mt =>
IP6.ROUTE[2]:                           dst = ::/0, nh = fe80::ea1c:baff:fec9:968>
IP6.ROUTE[3]:                           dst = fe80::/64, nh = ::, mt = 100
lines 1-21...skipping...



# nmcli connection modify ens33 ipv4.address 192.168.2.103/24
# nmcli connection modify ens33 ipv4.gateway 192.168.2.1
# nmcli connection modify ens33 ipv4.dns 192.168.2.1


# nmcli device connect ens33
裝置「ens33」已成功以「9cb77588-c78e-40b0-acbe-3be164c3e385」啟用。
# nmcli device disconnect ens33


# nmcli connection up ens33
連線已成功啟用(D-Bus 啟用路徑:/org/freedesktop/NetworkManager/ActiveConnection/3)
# nmcli connection down ens33





//CLI 下的圖形設計工具
# nmtui edit ens33

# systemctl restart NetworkManager.service









------------------------------ ip 工具  由命令所做的設定,不會存至系統組態檔,所只適合測試用。

# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
...




//顯示特定設備的統計資料
// -s, -stats, -statistics
# ip -s link show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode                                     DEFAULT group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped missed  mcast
    13869549   13640    0       42      0       0
    TX: bytes  packets  errors  dropped carrier collsns
    409974     4014     0       0       0       0


# ip addr add 172.31.147.90/24 brd + dev ens33
# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group                                     default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 172.31.147.90/24 brd 172.31.147.255 scope global secondary ens33
       valid_lft forever preferred_lft forever
...


# ping 172.31.147.99
PING 172.31.147.99 (172.31.147.99) 56(84) bytes of data.
64 bytes from 172.31.147.99: icmp_seq=1 ttl=64 time=0.051 ms
^C
--- 172.31.147.99 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2068ms
rtt min/avg/max/mdev = 0.051/0.098/0.152/0.042 ms

# ping 172.31.147.90
PING 172.31.147.90 (172.31.147.90) 56(84) bytes of data.
64 bytes from 172.31.147.90: icmp_seq=1 ttl=64 time=0.043 ms
^C
--- 172.31.147.90 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2031ms
rtt min/avg/max/mdev = 0.043/0.067/0.094/0.022 ms



若 Host is Wondows7 無法 ping :
 控制台\系統及安全性\Windows 防火牆 --> 進階設定 --> 輸入規則 --> 檔案及印表機共用 (回應要求 - ICMPv4-In) --> 私人,公用 --> 已啟用 --> 是




# ip addr del 172.31.147.90/24 dev ens33

# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group                                     default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
...



//啟用
# ip link set ens33 up

//停用
# ip link set ens33 down






------------------------------------------------------NetworkManager 工具

# systemctl status NetworkManager
● NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendo>
   Active: active (running) since Thu 2021-12-23 11:05:35 CST; 34min ago
     Docs: man:NetworkManager(8)
 Main PID: 1760 (NetworkManager)
    Tasks: 3 (limit: 36804)
   Memory: 3.1M
   CGroup: /system.slice/NetworkManager.service
           └─1760 /usr/sbin/NetworkManager --no-daemon

12月 23 11:05:35 centos85.kk NetworkManager[1760]: <info>  [1640228735.2369] devi>
12月 23 11:05:35 centos85.kk NetworkManager[1760]: <info>  [1640228735.2371] mana>
...




# ls /usr/lib/systemd/system
...
NetworkManager.service 
...





# ls /etc/sysconfig/network-scripts/
ifcfg-ens33

# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none                //是否自動取的IP;若是,dhcp 。若否,static 或 none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens33
UUID=faff608e-1af3-4d6d-a3f8-85123c116ffd
DEVICE=ens33
ONBOOT=yes                //開機是否啟用此網路卡
IPADDR=172.31.147.99
PREFIX=24
GATEWAY=172.31.147.254
DNS1=163.28.136.21
DOMAIN=168.95.1.1
IPV6_PRIVACY=no



# systemctl restart NetworkManager.service









------------------------------------------------------網路測試工具

//hostnamectl 取替 hostname
# hostnamectl
   Static hostname: centos85.kk
         Icon name: computer-vm
           Chassis: vm
        Machine ID: d9fabbd997c54e8f8c8520cd37b792e1
           Boot ID: 2b7aaf930d3c44f3be99ecf65cf7c62e
    Virtualization: vmware
  Operating System: CentOS Linux 8
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-348.2.1.el8_5.x86_64
      Architecture: x86-64

# hostnamectl set-hostname centos8.kk

# hostnamectl
   Static hostname: centos8.kk
         Icon name: computer-vm
           Chassis: vm
        Machine ID: d9fabbd997c54e8f8c8520cd37b792e1
           Boot ID: 2b7aaf930d3c44f3be99ecf65cf7c62e
    Virtualization: vmware
  Operating System: CentOS Linux 8
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-348.2.1.el8_5.x86_64
      Architecture: x86-64





//測試主機回應 Hinet 的 DNS
# ping 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=244 time=3.49 ms
^C
--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2008ms
rtt min/avg/max/mdev = 3.488/3.695/3.818/0.155 ms




//ss is used to dump socket statistics. It allows showing information similar to netstat.  It can display more TCP  and  state  information  than other tools.

//ss 取替 netstat
//t:tcp協定   u:udp協定   n:不用名稱以port顯示   p:連線由哪個行程處理   l:在傾聽的連線

# ss -tunpl
Netid     State      Recv-Q     Send-Q                             Local Address:Port           Peer Address:Port     Process
udp       UNCONN     0          0                                      127.0.0.1:323                 0.0.0.0:*         users:(("chronyd",pid=918,fd=6))
udp       UNCONN     0          0                                          [::1]:323                    [::]:*         users:(("chronyd",pid=918,fd=7))
udp       UNCONN     0          0               [fe80::20c:29ff:fea9:bcb0]%ens33:546                    [::]:*         users:(("NetworkManager",pid=990,fd=25))
tcp       LISTEN     0          128                                      0.0.0.0:22                  0.0.0.0:*         users:(("sshd",pid=1007,fd=5))
tcp       LISTEN     0          32                                             *:21                        *:*         users:(("vsftpd",pid=1247,fd=4))
tcp       LISTEN     0          128                                         [::]:22                     [::]:*         users:(("sshd",pid=1007,fd=7))



//檢視tcp連線
# ss -t
State       Recv-Q       Send-Q              Local Address:Port                Peer Address:Port        Process
ESTAB       0            52                  172.31.147.99:ssh                172.31.147.29:59484




//  -u, --udp   Display UDP sockets.
# ss -u
Recv-Q         Send-Q                  Local Address:Port                   Peer A




//tracepath, tracepath6 - traces path to a network host discovering MTU along this path
//tracepath 取替  traceroute/traceroute6
# tracepath 168.95.1.1
 1?: [LOCALHOST]                      pmtu 1500
 1:  _gateway                                              0.905ms
 1:  _gateway                                              0.933ms
 2:  10.241.3.153                                          1.653ms
 3:  192.192.69.248                                        7.524ms
 4:  192.192.69.242                                        4.005ms
 5:  no reply
 6:  skc1-3311.hinet.net                                   9.962ms asymm  9
...




//route  - routing table entry.
//ip route 取替  route
# ip route show | column -t
default                  via     172.31.147.254    dev    ens33   proto  static  metric  100
172.31.147.0/24   dev     ens33                   proto  kernel  scope  link    src       172.31.147.99  metric  100


# ip -6 route show | column -t > kkRouteTable.text
# cat kkRouteTable.text
::1                   dev  lo                        proto  kernel  metric  256  pref    medium
2001:288:8241:1::276  dev  ens33                     proto  kernel  metric  100  pref    medium
2001:288:8241:1::/64  dev  ens33                     proto  ra      metric  100  pref    medium
fe80::/64             dev  ens33                     proto  kernel  metric  100  pref    medium
default               via  fe80::ea1c:baff:fec9:968  dev    ens33   proto   ra   metric  100     pref  medium







# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 2001:288:8241:1::276/128 scope global dynamic noprefixroute
       valid_lft 602717sec preferred_lft 602717sec
    inet6 2001:288:8241:1:20c:29ff:fea9:bcb0/64 scope global dynamic noprefixroute
       valid_lft 2591950sec preferred_lft 604750sec
    inet6 fe80::20c:29ff:fea9:bcb0/64 scope link noprefixroute
       valid_lft forever preferred_lft forever



# ip addr add 10.150.15.88/24 brd + dev ens33

# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.150.15.88/24 brd 10.150.15.255 scope global ens33
       valid_lft forever preferred_lft forever
   ...


# ip route show
default via 172.31.147.254 dev ens33 proto static metric 100
10.150.15.0/24 dev ens33 proto kernel scope link src 10.150.15.88         // 靜態路由 
172.31.147.0/24 dev ens33 proto kernel scope link src 172.31.147.99 metric 100

# ping 10.150.15.88
PING 10.150.15.88 (10.150.15.88) 56(84) bytes of data.
64 bytes from 10.150.15.88: icmp_seq=2 ttl=64 time=0.145 ms
^C




//直接刪除ip addr
# ip addr del 10.150.15.88/24 dev ens33
# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever




或者

# ip addr add 10.150.15.77/24 brd + dev ens33

# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.150.15.77/24 brd 10.150.15.255 scope global ens33
       valid_lft forever preferred_lft forever
    ...



# ip route show
default via 172.31.147.254 dev ens33 proto static metric 100
10.150.15.0/24 dev ens33 proto kernel scope link src 10.150.15.77
172.31.147.0/24 dev ens33 proto kernel scope link src 172.31.147.99 metric 100

# ping 10.150.15.77
PING 10.150.15.77 (10.150.15.77) 56(84) bytes of data.
64 bytes from 10.150.15.77: icmp_seq=1 ttl=64 time=0.042 ms
^C


//只刪除路由
# ip route del 10.150.15.0/24


//ip addr 還在
# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.150.15.77/24 brd 10.150.15.255 scope global ens33
       valid_lft forever preferred_lft forever
   ...



# ip route show
default via 172.31.147.254 dev ens33 proto static metric 100
172.31.147.0/24 dev ens33 proto kernel scope link src 172.31.147.99 metric 100


//沒有靜態路由,還可ping
# ping 10.150.15.77
PING 10.150.15.77 (10.150.15.77) 56(84) bytes of data.
64 bytes from 10.150.15.77: icmp_seq=1 ttl=64 time=0.041 ms
^C


# ip addr del 10.150.15.77/24 dev ens33

# ip addr show
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever

















------------------------------------------------------ARP 、RARP
//ARP 
//Address Resolution Protocol 位址解析協定,由已知的 IP 位址查問其相對應的網路實體位址MAC
 //RARP 
//Reverse Address Resolution Protocol 反向位址解析協定,由已知的網路實體位址(MAC 位址)查詢其相對應的 IP 位址

//ip neighbor 取替  arp

# ip neighbor show
172.31.147.29 dev ens33 lladdr 00:e0:4c:27:08:5b REACHABLE
172.31.147.254 dev ens33 lladdr e8:1c:ba:c9:09:68 STALE
fe80::ea1c:baff:fec9:968 dev ens33 lladdr e8:1c:ba:c9:09:68 router STALE



////
被淘汰的工具只是不在預設安裝所包含的,所以是可以利用 yum 把他安裝回來
Note:在 yum 中不知道套件的名稱,可以用 provides 和 list 直接搜尋 package 裡面的工具
////



//DNF  is the next upcoming major version of YUM
# dnf provides */ifconfig
上次中介資料過期檢查:0:00:34 前,時間點為西元2021年12月24日 (週五) 12時02分18秒。
net-tools-2.0-0.52.20160912git.el8.x86_64 : Basic networking tools
軟體庫  :baseos
符合來源:
檔案名稱:/usr/sbin/ifconfig

# dnf list */ifconfig
上次中介資料過期檢查:0:00:48 前,時間點為西元2021年12月24日 (週五) 12時02分18秒。
可用的軟體包
net-tools.x86_64                             2.0-0.52.20160912git.el8  



# ifconfig
-bash: ifconfig:命令找不到

# dnf -y install net-tools

# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.31.147.99  netmask 255.255.255.0  broadcast 172.31.147.255
        inet6 2001:288:8241:1::276  prefixlen 128  scopeid 0x0<global>
        inet6 2001:288:8241:1:20c:29ff:fea9:bcb0  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fea9:bcb0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a9:bc:b0  txqueuelen 1000  (Ethernet)
        RX packets 29601  bytes 3163995 (3.0 MiB)
        RX errors 0  dropped 329  overruns 0  frame 0
        TX packets 4474  bytes 590794 (576.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 38  bytes 3192 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 3192 (3.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



# dnf provides */netstat
上次中介資料過期檢查:0:28:28 前,時間點為西元2021年12月24日 (週五) 12時02分18秒。
net-tools-2.0-0.52.20160912git.el8.x86_64 : Basic networking tools
軟體庫  :@System
符合來源:
檔案名稱:/usr/bin/netstat

net-tools-2.0-0.52.20160912git.el8.x86_64 : Basic networking tools
軟體庫  :baseos
符合來源:
檔案名稱:/usr/bin/netstat


# netstat -r | column -t
Kernel        IP        routing        table
Destination   Gateway   Genmask        Flags  MSS  Window  irtt  Iface
default       _gateway  0.0.0.0        UG     0    0       0     ens33
172.31.147.0  0.0.0.0   255.255.255.0  U      0    0       0     ens33


# dnf provides */dig
上次中介資料過期檢查:0:30:23 前,時間點為西元2021年12月24日 (週五) 12時02分18秒。
bind-utils-32:9.11.26-6.el8.x86_64 : Utilities for querying DNS name servers
軟體庫  :appstream
符合來源:
檔案名稱:/usr/bin/dig

kernel-debug-devel-4.18.0-348.el8.x86_64 : Development package for building kernel modules to match the
                                         : debug kernel
軟體庫  :baseos
符合來源:
檔案名稱:/usr/src/kernels/4.18.0-348.el8.x86_64+debug/arch/ia64/dig

kernel-debug-devel-4.18.0-348.2.1.el8_5.x86_64 : Development package for building kernel modules to
                                               : match the debug kernel
軟體庫  :baseos
符合來源:
檔案名稱:/usr/src/kernels/4.18.0-348.2.1.el8_5.x86_64+debug/arch/ia64/dig

kernel-devel-4.18.0-348.el8.x86_64 : Development package for building kernel modules to match the kernel
軟體庫  :baseos
符合來源:
檔案名稱:/usr/src/kernels/4.18.0-348.el8.x86_64/arch/ia64/dig

kernel-devel-4.18.0-348.2.1.el8_5.x86_64 : Development package for building kernel modules to match the
                                         : kernel
軟體庫  :baseos
符合來源:
檔案名稱:/usr/src/kernels/4.18.0-348.2.1.el8_5.x86_64/arch/ia64/dig




# dnf -y install bind-utils

# dig 168.95.1.1

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> 168.95.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 63268
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: a9f575096485cf010f37025261c54ddc525b72fcbab80909 (good)
;; QUESTION SECTION:
;168.95.1.1.                    IN      A

;; AUTHORITY SECTION:
.                       10800   IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2021122301 1800 900 604800 86400

;; Query time: 11 msec
;; SERVER: 163.28.136.21#53(163.28.136.21)
;; WHEN: 五 12月 24 12:34:36 CST 2021
;; MSG SIZE  rcvd: 142





# dnf provides */traceroute
上次中介資料過期檢查:0:33:14 前,時間點為西元2021年12月24日 (週五) 12時02分18秒。
traceroute-3:2.1.0-6.el8.x86_64 : Traces the route taken by packets over an IPv4/IPv6 network
軟體庫  :baseos
符合來源:
檔案名稱:/bin/traceroute
檔案名稱:/usr/share/doc/traceroute



# dnf -y install traceroute


# traceroute www.google.com.tw
traceroute to www.google.com.tw (142.251.42.227), 30 hops max, 60 byte packets
 1  _gateway (172.31.147.254)  1.011 ms  0.932 ms  0.885 ms
 2  10.241.3.153 (10.241.3.153)  4.345 ms  4.283 ms  0.938 ms
...





------------------------------------------------------Firewalld

//查詢啟用狀態
# firewall-cmd --state
running

# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work

# ls /usr/lib/firewalld/zones
block.xml  drop.xml      home.xml      nm-shared.xml  trusted.xml
dmz.xml    external.xml  internal.xml  public.xml     work.xml


# firewall-cmd --get-active-zone
public
  interfaces: ens33





//了解目前zone的詳細設定
# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:




// 名稱 vsfpt 、vsftpd 都不是
# firewall-cmd --get-services | grep ftp
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-apiserver ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server


# ls /usr/lib/firewalld/services | grep ftp
ftp.xml
tftp-client.xml
tftp.xml




//將服務加入規則

# firewall-cmd --zone=public --add-service=ftp
success

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:




//將埠口加入規則

# firewall-cmd --zone=public --add-port=8080/tcp
success

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports: 8080/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:







//將服務與埠口移除

# firewall-cmd --zone=public --remove-port=8080/tcp
success

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:







# firewall-cmd --zone=public --remove-service=ftp
success

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:







// firewalld.service 開機是否啟動

# systemctl is-enabled firewalld.service
enabled

# systemctl disable firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# systemctl is-enabled firewalld.service
disabled

# systemctl enable firewalld.service
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.

# systemctl is-enabled firewalld.service
enabled







# ls /usr/lib/systemd/system | grep firewall
firewalld.service







//停止FirewallD服務

# systemctl start firewalld.service
# systemctl is-active firewalld.service
active

# systemctl stop firewalld.service
# systemctl is-active firewalld.service
inactive

# systemctl start firewalld.service




# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-12-27 14:15:19 CST; 3min 26s ago
     Docs: man:firewalld(1)
 Main PID: 1892 (firewalld)
    Tasks: 2 (limit: 36804)
   Memory: 23.8M
   CGroup: /system.slice/firewalld.service
           └─1892 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
...




------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------







------------------------------------------------------