---
# System prepended metadata

title: 名詞解釋

---

---
title: '名詞解釋'
disqus: hackmd
---

名詞說明
===
[TOC]

OS
---

### Process vs Thread
***process（進程、程序、處理序、行程）***
每個應用程式至少都是一個 process
對作業系統來說，它是資源分配的最小單位
『 上下文切換 ( context switch ) 』，它是由作業系統的核心 ( kernel ) 來處理這工作

***thread（線程、執行緒）***
對作業系統來說，它是最小的操作單位，也是 cpu 的最小執行單位，且它包含在 process 中。
thread 是程式碼片段實際的執行者，它可以存取 process, OS resources 等等提供的記憶體。
在執行程式碼時，thread 會將變數保存在記憶體空間中，稱作 stack。stack 會在程式 runtime 執行，通常有固定容量（1 - 2MB），
但在 thread 中的 stack 只有它自己可以使用，並不能含其它 thread 共享（可以想成變數有 scope 的概念？）
heap 則是 process 中的另一個屬性，它可以被該 process 中的任何 thread 取用，也就是 heap 是共享的記憶體空間。
作業系統可以分配 cpu 直接給 thread 來進行工作，然後在同一個 process 中的 thread 都可以共享 process 的記憶體空間
process 是 OS 分配資源的最小單位，而 thread 則是作業系統能夠進行運算排程的最小單位，也就是說實際執行任務的並不是進程，而是進程中的線程。
一個進程有可能有多個線程，其中多個線程可以共用進程的系統資源，可以把進程比喻為一個工廠，線程則是工廠裡面的產線，負責任務的實際執行

### Kernel Mode / User Mode
![](https://i.imgur.com/EPrlOnu.png)
1. 之所以要有 Kernel mode 和 User mode 之分，是因為我們希望作業系統可以壟斷所有的硬體操作，讓一般的程式不能亂搞。
2. Kernel mode 就是萬能的，只要是 CPU 能管的硬體，Kernel mode 的程式就可以透過 machine code 來操作該硬體。
3. User mode 基本上就是「受限」的模式。除了一些沒有傷害的行為之外什麼都不能做。

### System Call
在電腦中，系統呼叫（英語：system call），指運行在使用者空間的程式向作業系統核心請求需要更高權限運行的服務。 系統調用提供使用者程式與作業系統之間的介面。 大多數系統互動式操作需求在核心態執行。 如裝置IO操作或者行程間通訊。
簡單來說，system call 是 process 和 OS 之間的介面，當使用者程式需要 OS 的服務時，使用者程式便去呼叫 system call

System call 的種類大致分為
* Process Control：對 process 做控制
* File Management：對檔案做控制
* Device Management：電腦系統各項硬體資源與周邊設備均為 device，當 process 在執行時會去要求取得資源或存取資料
* Information Maintenance：對系統資料的更新與維護
* Communication：當裝置以連線連通，執行訊息傳遞等 I/O 存取的行為
    
### CPU/Process Scheduling
CPU Scheduling是為了要讓CPU在多處理器的架構下，能有最好的運用效能。在執行時，CPU跟I/O burst會輪流執行，形成CPU-I/O Burst Cycle，在這兩者之中，CPU burst的分配是最主要的，而且短時間內CPU跟I/O互相作用(幾乎在10 milliseconds 內作用完成)。
![](https://i.imgur.com/dBSVe46.png)

Process Scheduling 的目的是讓 CPU 在每個時刻都有工作可以做，增加使用效率
Process 基本上不是在執行 instruction，就是在執行 I/O，執行一連串的 instrunction 又稱為 burst(CPU burst & I/O burst)
一般來說，多數的 CPU burst 時間很短，少部份的 CPU burst 時間很長
一個 I/O Bound(I/O 密集) 的 Program 通常有很多短的 CPU burst (若沒有很長的 CPU burst，則通常是 I/O Bound)
一個 CPU Bound(計算密集) 的 Program 可能有一些很長的 CPU burst (如很長的 for loop)
![](https://i.imgur.com/oU9XkLJ.png)

### hypervisor / vm
Hypervisor >>>虛擬機器監視器（英語：virtual machine monitor，縮寫為 VMM）：建立與執行虛擬機器的軟體、韌體或硬體
被hypervisor用來執行一個或多個虛擬機器的電腦稱為宿主機（host machine），這些虛擬機器則稱為客戶機（guest machine）。Hypervisor 提供虛擬的作業平台來執行客戶作業系統（guest operating systems），負責管理其他客作業系統的執行階段；這些客作業系統，共同分享虛擬化後的硬體資源。


Networking
---
### OSI 7 layers
![](https://i.imgur.com/tHvDUg9.png)
OSI模型是一種制定網路標準都會參考的概念性架構，依據網路運作方式，OSI模型共切分成7個不同的層級，每級按照網路傳輸的模式，定義所屬的規範及標準。
所謂的OSI，是由國際化標準組織（ISO）針對開放式網路架構所制定的電腦互連標準，全名是開放式通訊系統互連參考模型（Open System Interconnection Reference Model），簡稱OSI模型。該模型是一種制定網路標準都會參考的概念性架構，並非一套標準規範，也不是用來提供實現的方法，而是透過觀念描述，協調各種網路功能發展時的標準制定。

依據網路運作方式，OSI模型共切分成7個不同的層級，每級按照網路傳輸的模式，定義所屬的規範及標準。由具體到抽象的網路傳輸方式層次來看，7層分別為實體層、資料連結層、網路層、傳輸層、會議層、展示層及應用層。

### L4 / L7 LB
***第四層︰傳輸層（Transport Layer）***
傳輸層主要負責電腦整體的資料傳輸及控制，是OSI模型中的關鍵角色，它可以將一個較大的資料切割成多個適合傳輸的資料，替模型頂端的第五、六、七等三個通訊層提供流量管制及錯誤控制。

傳輸控制協定（Transmission Control Protocol，TCP）是我們常接觸具有傳輸層功能的協定，它在傳輸資料內加入驗證碼，當對方收到後，就會依這個驗證碼，回傳對應的確認訊息（ACK），若對方未及時傳回確認訊息，資料就會重新傳遞一次，以確保資料傳輸的完整性。

***第七層︰應用層（Application Layer）***
應用層主要功能是處理應用程式，進而提供使用者網路應用服務。這一層的協定也很多。使用者常見的通訊協定，有DHCP（Dynamic Host Configuration Protocol）、FTP（File Transfer Protocol）、HTTP（HyperText Transfer Protocol）及POP3（Post Office Protocol-Version 3）等，依據不同的網路服務方式，這些協定能定義各自的功能及使用規範等細部規則。

屬於第七層的應用軟體，像是網路瀏覽器（IE、Firefox）、電子郵件、線上遊戲、即時通訊（MSN Messenger、ICQ）等。上述軟體均透過單一或多種通訊協定，提供各類網路應用服務，像是網路瀏覽器藉由HTTP的溝通，即可呈現圖文並茂的網頁

### proxy / reverse proxy
Proxy 這字是『代理』的意思。這字最早應是出現在網路的 Firewall (防火牆)功能中。防火牆簡單的說是用來保護網路的安全，在你的內部網路與外 部網路之間建立一道像牆般的保護，使內外有所區隔，所有的進出動作都必需要 經過這道牆(基本上與萬里長城的關口是相同的)。因此對外面網路世界中的 機器來說，它們只看的到這道牆，而看不到這牆內的機器，而牆內的機器也必需 透過這道牆才能出去，因此這道做為牆的機器我們就可以稱它為一 Proxy Server『代理主機』。而相對的因為要記錄著進出資料的內容及來源目的，做這道 牆的機器就需要有極大的硬碟空間來儲存進出資料的內容及來源目的。

反向代理的主要作用為： 對客戶端隱藏伺服器（叢集）的IP位址 安全：作為應用層防火牆，為網站提供對基於Web的攻擊行爲
（例如DoS/DDoS）的防護，更容易排查惡意軟體等 為後端伺服器（叢集）統一提供加密和SSL加速（如SSL終端代理）
像 Github、Facebook 這些大型網站的流量很大，為了要處理大流量他們背後的機器也非常多，那大家在網址輸入 github.com 時要怎麼 平均分配流量 到每一台機器呢？這時候就要靠 Reverse Proxy 了
Reverse Proxy 會把背後的機器藏起來，當瀏覽器發出請求到 github.com 時，他就把請求轉發給後面有空的機器處理，處理完再回覆給瀏覽器。
對於使用者（瀏覽器）來說，他只知道 Reverse Proxy 這台機器的 IP 位址，至於這台機器是怎麼把他的請求轉發給背後的機器處理，使用者（瀏覽器）完全不需要也沒辦法知道

https://www.apeiro8.com/how-does-reverse-proxy-work-in-cdn/

### session vs cookie
http本身是個無狀態( Stateless)的協議，可以在Client與Server兩端進行溝通，但是無法紀錄網路上的行為
***Cookie(限定在同一個瀏覽器中)*** 
由瀏覽器處理，具有兩個特性：
特定網域：只針對原本的 網域(domain) 起作用。舉例: 在 *.myExample.com 存入的 cookie，不會出現在 *.not-myExample.com
有生命期限: 到了所設定的生命期限之後會失效。
在向該 domain 的 server 發送請求時，也會被一併帶進去該請求中。
cookie 有一個很大的弊端，cookie 中的所有數據在Client端就可以被修改，數據非常容易被偽造，那麼一些重要的數據就不能存放在cookie 中了，而且如果cookie中數據字段太多會影響傳輸效率
***Session***
Session 負責紀錄在 server端上的使用者訊息，會在一個用戶完成身分認證後，存下所需的用戶資料，接著產生一組對應的 ID，存入 cookie 後傳回用戶端。 Session泛指有始有終的系列動作/消息，好比會話一般
***小結:***
session：帳號登錄驗證過後，Server端所發的識別證
cookie：是瀏覽器存放資料的地方，可以存放seesion之類的資料

### DNS
DNS，也就是網域名稱系統，它將人們可讀取的網域名稱 (例如，www.amazon.com) 轉換為機器可讀取的 IP 地址
***DNS 遞迴程式*** - 遞迴程式可視為被要求前往圖書館某處尋找特定書籍的圖書館員。DNS 遞迴程式是一種伺服器，其設計是為了透過網頁瀏覽器等應用程式接收來自用戶端機器的查詢。通常遞迴程式隨後會負責進行其他請求，以便滿足用戶端的 DNS 查詢。
***根名稱伺服器*** - 根伺服器是將人們可讀的主機名稱轉譯 (解析) 為 IP 位址的第一個步驟。可將其視為指向不同書架的圖書館中的索引 - 一般其作為對其他更具體位置的引用。
***TLD 名稱伺服器*** —— 頂層網域名稱伺服器（TLD）可看做是圖書館中一個特殊的書架。此名稱伺服器是搜尋特定 IP 位址的下一步，其代管主機名稱的最後一部分（例如，在 example.com 中，TLD 伺服器為「com」)。
***權威名稱伺服器*** - 這個最終名稱伺服器可視為書架上的字典，其中特定名稱可轉譯為其定義。權威名稱伺服器是名稱伺服器查詢中的最後一站。如果權威名稱伺服器能夠存取請求的記錄，則其會將已請求主機名稱的 IP 位址傳回到發出初始請求的 DNS 解析程式 (圖書管理員)。


### NAT
***網路位址轉譯（英語：Network Address Translation，縮寫：NAT；又稱網路掩蔽、IP掩蔽）*** 在網路中是一種在IP封包通過路由器或防火牆時重寫來源IP地址或目的IP位址的技術

NAT 伺服器的連接方式如＜圖一＞所示，一端連接私有網路（內部網路），由企業內部網管人員自行設定私有 IP，可以自由設定但是不可以重覆，不需要支付費用，而且可以減少真實 IP 的使用量；一端連接外部網路（網際網路），由企業向網際網路服務供應商（例如：中華電信）申請真實 IP，必須支付費用。
![](https://i.imgur.com/i0CKEX0.png)

基本網路位址轉譯（Basic NAT）
![](https://i.imgur.com/noiQG1o.png)
網路位址埠轉換（NAPT）
![](https://i.imgur.com/leGc0Al.png)

NAT 伺服器的功能
➤封包偽裝（IP masquerade）：可以將私有 IP（內部IP）改變成真實 IP（外部 IP）再傳送到網際網路，使網路上的人無法得知私有網路的 IP 分配情形而增加網路安全性。

➤封包過濾：可以攔截網際網路進入私有網路的封包，阻擋怪客（Cracker）的攻擊，所以 NAT 伺服器是最重要的防火牆成員，也是一種「封包過濾器（Packet filter）」。

➤平衡負載：通常使用在網頁伺服器（Web server），一般公司的網頁伺服器同時可能會有數千人連線上來，如果只使用一台主機，一定無法負荷這麼多電腦的連線，我們可以在入口處加裝一台 NAT 伺服器，改變網際網路（外部網路）進入私有網路（內部網路）封包表頭的接收端 IP 位址，使進入的封包分散到不同的主機上，可以減輕單一主機的負擔，也可以增加網路安全性，如＜圖二＞所示。
![](https://i.imgur.com/fiP1Zoh.png)

### SDN
軟體定義的網路 (SDN) 是一種網路方法，會使用網路架構的控制器或應用程式設計介面 (API) 來引導網路流量，並與底層硬體基礎架構進行通訊。
此一方法與傳統網路不同，不會使用專屬的硬體裝置 (路由器與交換器) 來控制網路流量。軟體定義的網路可使用軟體來建立與控制虛擬網路，或控制傳統硬體網路。

一般的軟體定義的網路架構，共包含三個部分：
***應用程式*** 會負責傳達資源請求，或有關網路整體的資訊
***控制器*** 會使用應用程式提供的資訊，判斷如何路由資料封包
***網路裝置*** 會接收來自控制器的資料移動目的地資訊

相較於傳統網路，軟體定義的網路可提供更多優勢，包括：
透過出色的速度與彈性提供更好的掌控力：開發人員只需設計一款採開放式標準的軟體架構控制器，就能控制網路流量，無需手動設計多個限定廠商的硬體裝置。此外，網路管理員也能選用開放式原始碼通訊協定，透過中央控制器與不限數量的硬體裝置進行通訊，進而在網路設備選擇上享有更多彈性。
自訂網路基礎架構：軟體定義的網路可讓管理員透過一個集中化位置來設定網路服務並配置虛擬資源，以即時變更網路基礎架構。這樣一來，網路管理員就能將網路的資料流量最佳化，優先處理需要較高可用性的應用程式。
穩健的安全性：軟體定義的網路可提供整個網路的能見度，更全面地查看安全性威脅。隨著智慧型連網裝置急速增加，軟體定義的網路提供了傳統網路所望塵莫及的顯著優勢。開發人員可針對需要不同安全性層級的裝置建立個別區域，或立即隔離遭到入侵的裝置，以避免網路中的其他裝置遭到感染。

### FQDN
***全域名（fqdn，fully qualified domain name）是指主機名加上全路徑***，全路徑中列出了序列中所有域成員。全域名可以從邏輯上準確地表示出主機在什麼地方，也可以說全域名是主機名的一種完全表示形式。從全域名中包含的資訊可以看出主機在域名樹中的位置，由「主機名稱」與「網域名稱所組成」
以 mail.ithome.com.tw 為例：
主機名稱就是 mail
網域名稱就是 ithome.com.tw

### CDN
***內容傳遞網路（CDN） 是指一組分佈在不同地理位置的伺服器，協同工作以提供網際網路內容的快速交付。***
CDN 允許快速傳輸載入網際網路內容所需的資源，包括 HTML 頁面、javascript 檔、樣式表、圖像和視訊。 CDN 服務已得到不斷普及。如今，大多數 web 流量都通過 CDN 提供服務，包括來自Facebook、Netflix 和亞馬遜等主要網站的流量。
正確設定的 CDN 也能協助保護網站，對抗常見的惡意攻擊，例如分散式阻斷服務 (DDOS) 攻擊。

主要優點可分為 4 個不同部分：
***改善網站載入時間*** - 通過將內容分發到訪問者附近的 CDN 伺服器（以及其他優化措施），訪問者體驗到更快的頁面載入時間。由於訪客更傾向離開載入速度慢的網站，CDN 可以減少退回率並增加人們在網站上花費的時間長度。換言之，網站速度越快，使用者停留的時間越長。
***減少頻寬成本*** - 網站代管的頻寬取用成本是網站的主要費用。透過快取和其他最佳化，CDN 可以降低來源伺服器必須提供的資料量，藉此減少網站擁有者的代管成本。
***增加內容可用性和備援*** - 大量流量或硬體故障會中斷正常網站運作。由於 CDN 的分佈性質，CDN 可以處理更多流量，且對於硬體故障的承受情況也比許多來源伺服器更好。
***改善網站安全性*** - CDN 可提供 DDoS 防護、改善安全性憑證及其他最佳化，以改善安全性。
https://www.cloudflare.com/zh-tw/learning/cdn/what-is-a-cdn/

### WAF
WAF是Web Application Firewall的縮寫，為針對網站服務內容的防護，WAF與傳統Firewall的最主要差異在於辨識特徵的資料層級不同。

傳統Firewall主要辨識的範圍為封包傳輸位置（IP address）與應用程式的傳輸埠號（port number），而這兩個資訊分屬OSI模型的第三層（Ｎetwork layer）與第四層（Transport layer），因此一般也稱傳統Firewall為 L4 Firewall，意指它的工作層級最多到第四層，所以無法辨識包在傳輸資訊裡的第七層應用程式內容。

WAF主要的防護目標為OSI 7 layer第七層的Web應用服務，意味著WAF能辨識包在傳輸資訊內的Web應用程式內容

### https vs http
***HTTP***的全名是「超文本傳輸協定 (Hyper Text Transfer Protocol)」，簡單來說是以TCP作為網路資料傳輸的方式。
***HTTPS***，全名為「超文本傳輸安全協定 (Hyper Text Transfer Protocol Secure)」，HTTPS基本上同樣是資料傳輸的工具，但在傳輸過程中是使用SSL或TLS，多了一道加密的手續，如此一來就算有心人士要竊取，看到的也只是加密符號或一堆亂碼而已
但是HTTPS在剛推出的時候有個缺點，就是因為加密需要運算的資料較多，導致網路速度變得很慢。因此後來才又發明金鑰功能，讓網路資料在進行傳輸時既安全、速度也不會太慢。

如果是HTTP開頭的網站，旁邊會顯示一個驚嘆號，有些甚至會有彈跳視窗告訴你「這個網站不安全，是否還要繼續瀏覽？」；如果是HTTPS開頭的網站，旁邊則會出現一個鎖頭，點擊鎖頭就會告訴你「已建立安全連線，若需要輸入個資或信用卡資料，將會以加密方式進行傳輸，所以不需擔心外洩。」

HTTPS常被拿來跟SSL一起討論，SSL並不是HTTPS裡面的「S」，而是一種傳輸過程。
簡單來說，HTTPS是使用者透過電腦傳輸資料到伺服器時的一道資安防護罩；SSL則是為了防止資料傳輸過程被有心人士破解或修改的工具。

### SSL/TSL
SSL 全名為 Secure Sockets Layer，TLS 全名為 Transport Layer Security。
***TLS 在 OSI 模型裡，它屬於傳輸層的協定***，而簡介 HTTP 是有提到 HTTP 是應用層協定。而 OSI 模型在設計上是符合里氏替換原則與依賴反轉原則的，這代表傳輸層是否有 TLS 是不會影響應用層的 HTTP；反之，不管應用層是 HTTP、FTP 或 SMTP 等，都能使用 TLS 加密。
![](https://i.imgur.com/kKLkB9b.png)

SSL/TLS 主要的目的包括：
***認證網站***，確保數據確實發送到正確的網站，而非假冒的釣魚網站。
***建立加密連線***，以防止數據中途被竊取。
***確保數據的完整性***，確保數據在傳輸過程中不會被改變。

***SSL：（Secure Socket Layer，安全套接字層）***，位於可靠的面向連線的網路層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性，以實現客戶端和伺服器之間的安全通訊。該協議由兩層組成：SSL記錄協議和SSL握手協議。
***TLS：（Transport Layer Security，傳輸層安全協議）***，用於兩個應用程式之間提供保密性和資料完整性。該協議由兩層組成：TLS記錄協議和TLS握手協議。

TLS
![](https://i.imgur.com/kWAEsQj.png)


### DMZ
為一種網絡架構的布置方案，常用的架設方案是在不信任的外部網絡和可信任的內部網絡外，
建立一個面向外部網絡的物理或邏輯子網，該子網能設置用於對外部網絡的服務器主機。

### Firewall
***防火牆（英語：Firewall）*** 在電腦科學領域中是一個架設在網際網路與內網之間的資安系統，根據持有者預定的策略來監控往來的傳輸。防火牆可能是一台專屬的網路裝置，也可執行於主機之上，以檢查各個網路介面的網路傳輸。它是目前最重要的一種網路防護裝置，從專業角度來說，防火牆是位於兩個或以上網路間，實行網路間存取或控制的一組元件集合之硬體或軟體
能阻擋惡意攻擊和病毒蔓延到內部網路，並防止未經授權的用戶進入系統

防火牆的作用包括：
* 隔離內部網路（私有網路）與網際網路的流量，以保護內網的安全。
* 控管內部網路傳入和傳出的封包，避免未經授權存取內部網路的資源。
* 紀錄與監控內部網路的活動。

https://zh.wikipedia.org/zh-tw/%E9%98%B2%E7%81%AB%E5%A2%99

### port
***通訊埠（英語：port）***，又稱為連接埠、埠、協定埠（protocol port）在電腦網絡中是一種經由軟件建立的服務，在一個電腦作業系統中扮演通訊的端點（endpoint）。每個通訊埠都會與主機的IP地址及通訊協定關聯。通訊埠以16位元數字來表示，這被稱為通訊埠編號（port number）。

埠號有兩種用途：
* 標識伺服器上提供特定網絡服務的行程。客戶機可以按照伺服器IP與埠號與相應的伺服器行程建立網絡連接，獲得相應的網絡服務。例如，通常使用80埠號提供http服務，使用23埠號telnet服務。伺服器的這種功能叫做listening。客戶機通常使用動態指定的埠號與伺服器建立連接。
* 由本機地址、本機埠號、目標機地址、目標機埠號、通訊協定組成的五元組，用於唯一確定正在使用的網絡連結。因此，對於不同的協定、不同的目標機地址，本機的不同地址（如果本機使用多個網卡）等多種情形，同一個埠號可以復用。因此對於1對1通訊，且本機與目標機之間只能建立一個通訊連接，則不需要使用埠號。

### ipv4, ipv6
![](https://i.imgur.com/hp28qjD.png)
IPv4 是目前用於建立、分配和使用 IP 位址的協定。IP 位址的首個通用版本是 IPv4。這種網路協定使用 32 位元長度的數字位址，能提供 2 的 32 次方個唯一的 IP 位址，換算後約為 43 億個 IP 位址。

1996年，IPv6 位址的升級採用了 128 位元組成的 IP 位址，提供了 2 的 128 次方個唯一位址。遠超過 IPv4 的數量，足夠讓全球每個人都分配到 100 萬個 IP 位址。IPv6 位址幾乎無法用完。不過，自從 IPv6 出現以來，仍未完全普及。為什麼呢？
***設備升級才能使用 IPv6。***
如果網站執行 IPv4 協定，但設備和 ISP 僅支援 IPv6，您將無法存取該網站。要存取該網站，設備也需要支援 IPv4。
現在多數現代路由器和電子設備都支援 IPv6；不過，為了在全球實現無縫轉換，所有設備、作業系統和 ISP 都需要進行系統升級。為了避免任何服務中斷，將必須在一段時間內同時支援這兩個協定，這可能代價高昂。
***對普通使用者的好處並不明顯。***
如果客戶不了解新技術的直接影響，或者不了解新技術的價值，公司就很難證明投資新技術的合理性。建立更多的 IP 位址是重要而長遠的目標，但在 IP 位址用完之前，不會影響使用者的日常使用。

Data structure
---
### stack / queue
***Stack是一種資料結構***，遵循著後進先出的原則，最晚放入堆疊的資料會被最先取出(LIFO Last-In-First-Out)，最早放入堆疊的資料會被最後取出(FILO First-In-Last-Out)

***佇列是先進先出(FIFO First-In-First-Out)***，跟堆疊的後進先出(LIFO Last-In-First-Out)是不一樣的，佇列有兩種操作:push — 從後面新增和shift — 從前面移除

### array
陣列在程式語言裡的定義是：***陣列(Array)是一組相同型態的連續變數***，它們使用同一個變數名稱，而另外用一個索引值來指定使用第幾個變數。且陣列本質上是有序的，索引是從零開始計算的
型別有數字(Number)、字串(String)、布林(Boolean)、空(null)、未定義(undefined)、符號(Symbol)、陣列(Array)、物件(Object)

### hashing
***雜湊（英語：Hashing）是電腦科學中一種對資料的處理方法***，通過某種特定的函式/演算法（稱為雜湊函式/演算法）將要檢索的項與用來檢索的索引（稱為雜湊，或者雜湊值）關聯起來，生成一種便於搜尋的資料結構（稱為雜湊表）。舊譯哈希（誤以為是人名而採用了音譯）。它也常用作一種資訊安全的實作方法，由一串資料中經過雜湊演算法（Hashing algorithms）計算出來的資料指紋（data fingerprint），經常用來識別檔案與資料是否有被竄改，以保證檔案與資料確實是由原創者所提供

***雜湊函數 (Hash function)***
主要是將不定長度訊息的輸入，演算成固定長度雜湊值的輸出，且所計算出來的雜湊值必須符合兩個主要條件：
* 由雜湊值是無法反推出原來的訊息
* 雜湊值必須隨明文改變而改變。

***雜湊表 (Hash table)***
在用雜湊函數運算出來的雜湊值，根據 鍵 (key) 來儲存在數據結構中。而存放這些記錄的數組就稱為 雜湊表。

### tree
***樹（Tree）是一種無順序的資料結構***，方便快速找資料。為什麼會叫 Tree，因為這種資料結構的確像極倒過來的樹．在生活中也常看到 Tree 的應用，例如 web sitemap、淘汰賽比賽圖、族譜等。
相關專有名詞
1. 樹根結點 (root): 就是最上面的结點 (node)。每個 tree 只會有一個 root
2. 子樹 (child tree): 由结點 (node) 和其後代構成
3. 子结點（child node): 有父结點的结點，所以基本上除了 root 都是
4. 葉结點或稱外部结點（leaf): 沒有子结點的結點
5. 结點深度（depth): 祖先結點數量。以下圖來說 body depth 就是 0， img depth 是 2
6. 樹的高度（height): 最大深度到第幾層。以下圖來說 body height 就是 2， img height 是 0
https://medium.com/starbugs/%E8%B3%87%E6%96%99%E7%B5%90%E6%A7%8B-%E6%A8%B9-tree-1cfddf5685ce

Alogrithm
---
### time complexity
***時間複雜度 (Time Complexity)***： 執行演算法時須花費的時間。

須算出每一段的功能的執行次數
將所有執行次數加總起來後
求出此演算法的時間複雜度 ── Big-O

Big-O 用來表示***演算法的複雜度的執行效率***。
Big-O 只顯示演算法執行次數部分的最大指數、最高次方數或是常數1，並以大 O 符號表示，例如
陣列加總的執行次數為4n+5，Big-O 則是 O(n)
印出 n*n 的正方型的執行次數為n^2+7n+6，Big-O 則是 O(n^2)
![](https://i.imgur.com/jQuHE6o.png)
![](https://i.imgur.com/y8qwCLO.png)
如上圖所示，可以知道 Big-O 複雜度越高，隨著數據規模增長，效率就會越來越差。
因此 n 越大時，寫好演算法就越重要，尤其是那種一秒鐘幾十萬人次上下的系統。

### space complexity
***空間複雜度 (Space Complexity)***： 執行演算法時須花費的記憶體空間
空間複雜度就跟前言所說的一樣，是計算演算法執行時所花費的記憶體空間成本。
其計算方式與時間複雜度相似，也使用 Big-O 來表示其複雜度。
一般來說「時間複雜度」與「空間複雜度」之間是可以相互 trade off 的
***trade off*** 在某些情況底下，我們是可以讓程式多用一些記憶體空間來多記一些資訊，就可以省去一些重複的運算來加速程式的執行時間；或者我們完全沒有多餘的記憶體資源可以使用，也可以透過把一些原本可以靠記憶體存儲的資訊改用重複計算的方式來取得。
![](https://i.imgur.com/raU5qYk.png)

### greedy
greedy
貪婪演算法(Greedy algorithm)是指在對問題求解時，總是做出在當前看來是最好的選擇。也就是說，
不從整體上最優(global optimization)加以考慮，他所做出的僅是在某種意義上的局部上最優的解(local optimization)。
貪心演算法不是對所有問題都能得到整體最優解，但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

### dynamic programming
動態規劃（英語：Dynamic programming，簡稱DP）是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的，通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題和最佳子結構性質的問題，動態規劃方法所耗時間往往遠少於樸素解法。 動態規劃背後的基本思想非常簡單


Data / Database
---
### RDBMS vs NOSQL
***RDBMS (Relational Database Management System) 又為關聯式資料庫管理系統***，意即資料庫是由多個資料表(Table)所組成，並且可以將資料表關聯起來，去連結多個資料表之間的關係。諸如 MySQL, PostgreSQL, MS SQL, … 都是關聯式資料庫。以下列出幾個關聯式資料庫的特點：
* 由資料表(Table)組成，其中 row 代表一筆資料，column 代表資料欄位名稱
* Schema 必須先定義好，並且只接受同樣格式資料的插入與修改。往後如果要修改 schema，必須對於已存在的資料做相對應的處理較為麻煩
* 可以使用 JOIN 來連結多個資料表，做較複雜的查詢
* 具備 ACID 特性
* 使用 SQL(Structured Querying Language) 來管理及查詢資料
***ACID特性***
* Atomicity (原子性) : 資料操作不能只有部分完成。一次的 transaction 只能有兩種結果：成功或失敗
* Consistency (一致性)：transaction 完成前後，資料都必須永遠符合 schema 的規範，保持資料與資料庫的一致性
* Isolation (隔離性)：資料庫允許多個 transactions 同時對其資料進行操作，但也同時確保這些 transaction 的交叉執行，不會導致數據的不一致
* Durability (耐久性)：transaction 完成後，對資料的操作就是永久的，即便系統故障也不會丟失

***NOSQL(Non-SQL，又為 Not only SQL) 稱為非關聯式資料庫***，跟關聯式資料庫不一樣，不需要定義 schema、沒有關聯的關係。諸如 MongoDB, Redis, … 都是非關聯式資料庫的一種。以下為非關聯式資料庫的幾個特點：
* 資料庫由 collection 組成
* collection 中每筆資料為一份 document，document 的資料格式不需一致
* 以 CAP theorem 為概念設計
* 常用於分散式雲端系統

***什麼時候要用 RDBMS? 什麼時候要用 NOSQL?***
**為什麼使用 RDBMS?**
* 需要確保 ACID 特性的情境。RDBMS 類型的資料庫，保證了 ACID，保證了資料的一致性。舉例在金融類型的應用，你會希望匯入匯出的錢，能夠同步一致的更新到資料庫上，以防重複扣款或是餘額顯示錯誤等等的狀況。而 NOSQL 是沒有保證 ACID 的，所以在這種情況下，RDBMS 相較於 NOSQL 更適合。

**為什麼使用 NOSQL?**
* 由於 NOSQL 的 schema 不需要固定，且資料可以為任意結構。所以在 schema 需要頻繁變動或者是 schema 不固定的時候，NOSQL 提供更有彈性的開發。比如在開發初期，schema 會需要頻繁更新，這時候 NOSQL 就比較適合。
* 需要儲存大量資料，利用分散式系統以及雲端儲存的時候。由於 NOSQL 相較於 RDBMS 更容易做 horizontal scaling，且本身的設計就是分散式系統的設計。因此對於未來有大量擴充需求的系統，會更容易的去擴充，且擴充的成本也較低。

### ER diagram
![](https://i.imgur.com/mYeyfuH.png)

### normalization
其目的是為了降低資料的「重覆性」與避免「更新異常」的情況發生
* 提昇儲存資料與資料庫操作效率
* 減少資料異常
* 使資料庫維護更容易

正規化的資料庫特性，經過正規化後的資料庫，應具備以下特性：
* 欄位唯一性：每個欄位只儲存一項資料
* 主關鍵欄位：每筆資料都擁有一個主鍵，來區別這些資料
* 功能關聯性：欄位之間的關聯應該要明確
* 欄位獨立性：欄位之間不應存在遞移相依

1NF(First normal form)
一格(每一列每一欄)只能有一筆資料
每筆資料都有一個唯一的主鍵作為識別

2NF (Second normal form)
符合1NF
消除部分相依

3NF (Third normal form)
符合1NF及2NF
消除遞移相依

### column-base vs row-base
![](https://i.imgur.com/LTaMQnL.png)

column-base MySQL  PostgreSQL  MSSQL
row-base Amazon Redshift  BigQuery
![](https://i.imgur.com/cGFMzgQ.png)
![](https://i.imgur.com/zSnXUtm.png)

### Data Warehouse vs Data Lake
![](https://i.imgur.com/XaWgc97.png)
![](https://i.imgur.com/rGp3pNs.png)
![](https://i.imgur.com/sZ7Lsge.png)

### ETL / ELT
***ETL，是英文 Extract-Transform-Load 的縮寫***，用來描述將數據從來源端經過抽取（extract）、轉換（transform）、加載（load）至目的端的過程。

***ELT是一個比較新潮的概念***，相比於ETL，從功能上來說沒有差異，只是換了一個順序。差別在於，如果採用ELT的方案，
首先把數據用一種高效的方式從數據源抽取出來，然後在數據倉庫中進行數據的轉換處理。這種ELT的方式相比於ETL有很大的優勢，
而本文介紹的偶數數據中臺Lava中的數據同步工具，使用的就是ELT這種理念。

![](https://i.imgur.com/D0BM6pY.png)
![](https://i.imgur.com/uXwBbve.png)
https://rivery.io/blog/etl-vs-elt/

### schema on read
### schema on write
![](https://i.imgur.com/gq3Kj9l.png)


### data silo
### DAG

Container
---
### vm vs container
Virtual Machine（以作業系統為中心）：
OS可以隨意選擇
配置好CPU、RAM與Storage的作業系統
有獨享的虛擬資源，包括處理器、記憶體、硬碟、網路介面和其他配件

Container（以應用程式為中心）
依賴Host OS的核心(kernel)來運行
封裝了相依性資源與應用程式的執行環境
改善VM因為需要裝 Guest OS導致啟動慢、佔較大記憶體的問題

### cgroups / namespace
### container platform
### k8s / pod
### deployment / service
### ingress / egress

Cloud
---
### VPC
### IAM
### resources
### region / zone

AI
---
### Machine Learning
### Deep Learning