---
# System prepended metadata

title: 推甄筆記（甘芭爹！！！！）

---

# 推甄筆記（甘芭爹！！！！）

## 戊組
- 給定 n 跟 L，求 L 最後會是啥(略過)
```python=
def f(n, L):
    if n > 0:
        L.append(n)
        if n is odd:
            n = n - 1
        else:
            n = n / 2
        f(n, L)
```
- VM 跟 container 差異
VM 模擬整個作業系統（包含kernel），container 是建立在本機作業系統上的軟體
![](https://wac-cdn.atlassian.com/dam/jcr:92adde69-f728-4cfc-8bab-ba391c25ae58/SWTM-2060_Diagram_Containers_VirtualMachines_v03.png?cdnVersion=610)
容器(Container)：以應用程式(App)為單位的虛擬化技術，應用程式與其相依性資源(Dependency)會被封裝在容器(Container)中，使其可以重複利用與搬遷，容器間彼此獨立運行，互不干擾。
- 題目給 192.0.2.96/19 這類的東西，求子網路 IP 遮罩範圍

    範圍為 2^(32-19) - 2，2的部分為255.255.255.255, 255.255.255.0

    解釋：

    ![](https://www.netadmin.com.tw/upload/news/NP110208000220110208141649.jpg)
    網路位址是172.16.0.0，而後面的16則代表「網路遮罩的二進位表示法中，前面16個數字為1」

    如果把網路遮罩用二進位來表示，就是相當於下面這樣的表示方式：
    ![](https://www.netadmin.com.tw/upload/news/NP110208000320110208141659.jpg)

    前面16個都是1，若把這樣的網路遮罩轉換成10進位，也就是說，網路遮罩為255.255.0.0，因此16所代表的是網路遮罩。

    從上面這個例子來看，由於網路遮罩是255.255.0.0
    代表在分配IP位址時，前面16個數字不能變動，只有後面16個數字能夠變動，而前面不能變動的之處就是使用網路位址的部分。

    現在，來看網路位址，上面的範例中網路位址是172.16.0.0，轉成二進位就是：

    ![](https://www.netadmin.com.tw/upload/news/NP110208000820110208141749.jpg)

    而能夠分配的IP位址為：

    ![image alt](https://www.netadmin.com.tw/upload/news/NP110208000920110208141758.jpg)

    轉成十進位的話，就代表可使用的IP位址範圍為172.16.0.1到172.16.255.254。

    所以這個子網路中可以使用的IP數量為2的16次方減2，也就是216-2=65534個IP位址。減去兩個的部分分別是172.16.0.0和172.16.255.255這兩個IP位址，為什麼這兩個要減去呢？因為172.16.0.0已經被拿來使用成這個子網路的網路位址，而172.16.255.255則是廣播位址，不能被拿來分配成一般IP位址使用。現在讀者對於IP位址分配應該已經有初步的概念了。

- XSS 跟 SQL injection 是什麼？怎麼防禦？
    SQL Injection 的本質就是把「 輸入的惡意資料」 變成「 程式的一部分」
    XSS(Cross-Site Scripting) : 當網站沒有做好的驗證，就可以輕易輸入惡意程式碼(HTML or JS)在網站上，以此攻擊網站
    
    防禦：驗證使用者輸入訊息、request接收白名單
    第一關
        1. 意識到哪邊是使用者可以自己輸入資料的地方
        2. 針對不同情境去做 XSS 的防禦
        3. 可以考慮導入現成的 WAF（Web Application Firewall）
        4. cookie使用HttpOnly
        5. Two-factor authentication
    第二關
        CSP(Content Security Policy):
        用來跟瀏覽器講說哪些來源的資源可以被載入，哪些不行，可以利用 response header 或是 <meta> tag 來指定頁面的 CSP 規則
    
    
    ### 補充： CSRF
    ![](https://i.imgur.com/lIjAziF.png)
    
    防禦：
    ![](https://i.imgur.com/XP09mCt.png)
    

- 分別解釋
    - strong type
        每個變數型別在編譯時期就完全決定好(Java,C,C++)
        int a = 0;
    - weak type
        不需要宣告變數(python)
        a = 0;
    - static type
        變數會被綁定到某個型別，除非經過明顯的型別轉換，不然型別不會任意改變(Python)
        ```python
        x = 3
        y = '4'
        print(x+y) // wrong，因為 StaticType
        ```
    - dynamic type
        變數的型別可能隨時會經過隱性的轉換(JS)
        ```javascript
        var x = 3    
        var y = '4'
        alert(x + y) //Produces "34"
        ```

- 分別解釋
    - Object Oriented Programming
        1. 封裝 -> 一個物件封裝 (Encapsulation)
        2. 繼承 -> 繼承者擁有某些屬性或是方法
        3. 多型 -> 使用相同名稱的方法，傳入不同的參數，會執行不同的指令 (Constructor)
        4. 抽象 -> 將此物件的某些屬性與方法隱藏起來
    - Functional Programming
        1. pure function -> 避免在運算時發生「外部狀態改變」的情境
        2. First-class -> 直接賦予值或者存至陣列中當作參數傳遞
            ex: const a = (x,y) => x * y
            call a(2,4) return 8
        3. higher-order functions ->
            1. 可以將函式(至少一個)當成參數傳入另一個函式。
            2. 可以將函式當成另一個函式的回傳值。
            ex:
            ```javascript
            var add = function(x) {
              return function(y) {
                return x + y;
              };
            };

            var addFive = add(5);
            var addTen = add(10);

            addFive(2); // 7
            addTen(2); // 12
            ```
    - Concurrent Programming -> 使用不同 CPU 分別運行程式來提高效率 ，或是當程式在等待執行結果時 (如等待 request 請求)，先執行其他程式函式 (Coroutine)

    - Concurrent Programming 為什麼比 Object Oriented Programming 好 -> 因為它融合OO加上Concurrent，像是Java的Thread，使得程式效率更好。

- 你最常使用的 framework 是什麼？舉出三個，並說明你為什麼用它（略過）

- 使用任意三種語言達成下述功能：
    讀入一檔案 zero_one.in，只包含 0, 1 兩種字元，輸出 0 和 1 哪個較多次（不會有同樣多次的情況）

- 何謂雲端運算？舉出三大雲端廠商，並比較各自差異。
    |  | pros          | cons |
    | -------- | ----------------- | -------- |
    | AWS      | •**主導的市場地位**<br>•**廣泛而成熟的產品**<br>•對大型組織的支持<br>•廣泛的培訓<br>•全球影響力       | •使用困難<br>•**成本管理**<br>•壓倒性的選擇     |
    | Azure | •**與Microsoft工具和軟體結合**<br>•廣泛的功能集<br>•**混合雲**<br>•**支持開源**          | •文檔問題<br>•管理工具不完整 |
    | GCP      | •**專為雲原生業務設計**<br>•致力於開源和可移植性<br>•大幅折扣和靈活的合同<br>•**DevOps專業知識**       | •IaaS市場的新進入者<br>•功能和服務較少<br>•歷來並非以企業為中心     |

- Microservice 是什麼
    相較於Monolith，他將許多服務分解成微小的service，每個是獨立的元件，在部署及開發上達成優良的敏捷性以及良好的擴充性

- DevOps 是什麼？有哪些相關的工具？
    1. Development + Operations -> 開發、測試、維運三集合 CI/CD
    2. 工具：
        - Docker將架構服務容器化，幫助統一整合開發環境
        - K8S幫助管理多個容器
        - CI/CD相關 -> Jenkins、Github Actions、Travis CI、Drone CI

- SQL 將兩個 table 合併排序
    UNION 需要兩table同行數，不足用null補起來
    ```sql
    SELECT OrderID,CustomerID,EmployeeID,OrderDate,ShipperID FROM Orders
    UNION
    SELECT ShipperID,ShipperName,Phone,null,null FROM Shippers
    ORDER BY OrderID
    ```

選擇題:

- http vs https
    | HTTP | HTTPS |
    | -------- | -------- |
    | http://  | https:// |
    | unsecured | secured |
    | port 80 | port 443 |
    | application layer | transport layer |
    | no SSL certificate | SSL certificate |
    | no domain validation | domain validation |
    | no encryption | data is encrypted |

- Internet message control protocol
    網路七層協定中的第三層，解析網路封包或是分析路由的情況
    - ping: 由 Echo Request 及 Echo Reply 互相配合
    - traceroute: 以遞增的方式設定封包的 TTL，搭配 Router 在收到 TTL 為 1 的封包後，會傳送 Time Exceeded ICMP 封包給主機
- .com .edu .org
    為域名
    .net（網路技術公司或機構）
    .org（非營利組織）
    .edu（教育機構）
    .int（國際組織）
    .gov（政府機關）
    .com（國際網域／商業性質）

手寫
1. What is NaN in porgraming
    「解釋」那些無法定義或無法表現的浮點運算內容、無限、無意義數學式、非數字等
2. OOP 繼承 composition
    composition：has a（擁有） -> Car has a Handle
    Inheritance：is a（是） -> Car is a vehicle
    ![](https://i.imgur.com/9RkCutB.png)
3. List three popular cloud service
    AWS、GCP、Azure
4. What is cloud native computing 並舉特性
    在軟體開發初始，就使用以雲端為基礎的設施，並結合開發原則（DevOps)＋開發方法（微服務架構＋容器化技術），達成快速建置/測試/部署/維運的目的
5. 常用的框架，簡介及為何用他(至多三個)（略過）
6. Graph database
    使用節點、邊和屬性來表示和儲存資料
    1. Property Graphs
        Neo4j 就是這一類，藉由許多的 nodes、relations、properties 所組合而成
    2. Hypergraphs
        和前者的差別在於，一個 relation 可以連接多個 nodes，很適合用於資料彼此有大量的「多對多」關係的情境
    3. Triple Stores
        使用 W3C 的 RDF（資源描述框架）
7. 提出sql有那些join並舉範例比較產生結果
    ![](https://i.ytimg.com/vi/rRAiUdmcJEs/maxresdefault.jpg)
    1. inner Join 內部合併查詢 -> 顯示兩個資料表所重複的資料
    2. left (outer) Join 左外部合併查詢 -> 在左邊資料表中有這筆資料，才不管右邊的資料表有沒有這筆資料呢哼！
    3. right (outer) Join 右外部合併查詢 
        像2.的改右邊
    4. full (outer) Join 完全外部合併查詢 -> 全拿回來（UNION）
    5. cross Join 交叉合併查詢
        
8. Stack and Queue 的差異並用程式語言實作（略實作）
    Stack: First In Last Out
    Queue: First In First Out
9. C++結果，並解釋
    比較ASCII -> 兩個true -> print 11
    ```cpp
    int main()
    {
        std::cout << ("a" < "") << ("" < "b") << "\n"; //第一題
        return 0;
    }
    ```
10. C++結果，並解釋
    比較ASCII -> 兩個true -> print 10
    ```cpp
    int main()
    {
        std::cout << ('a' < 'c') << ('c' < 'b') << "\n"; //第二題
        return 0;
    }
    ```

11. immutable data type -> 不可變動的
    ![](https://www.maxlist.xyz/wp-content/uploads/2021/01/Immutable.jpg)
12. mutable data type -> 可變動的
    ![](https://www.maxlist.xyz/wp-content/uploads/2021/01/mutable-object-list-scaled.jpg)
13. What is NULL in C
    NULL就是系统定義特殊的0，NULL和0的值都是一樣的；但NULL用於指標和對象，0用於數值
14. NULL pointer in C exception
    嘗試存取空指標所指向之物件時，就會發生 NullPointerException
15. How to prevent NULL
    1. 避免使用null
    2. 如果必須使用null，應建立明確的null語意，開發程式時必須統一（例如沒有字串，到底應該是空字串或是null）

## 其他組（有趣題目）
- viewport 是什麼
    通過標籤控制用戶的 viewport (可見區域)，viewport 隨著設備的不同而變化

- promise 作用為何
    | Async | sync |
    | ----- | ---- |
    | one at a time | more one at a time |
    | 執行了就馬上換下一個指令 | 第一個執行完才執行下一個 |
    
    Promise 物件代表一個即將完成、或失敗的Async操作，以及它所產生的值。 -> 用此物件來處理完成或是失敗的Async操作
- Ajax(Asynchronous JavaScript and XML) 什麼時候使用? 有什麼好處? 舉一個程式範例
    Async Actions -> 可以僅向伺服器傳送並取回必須的資料
    
    因為在伺服器和瀏覽器之間交換的資料大量減少，伺服器回應更快了
    ```javascript
    function loadDoc() {
      var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          document.getElementById("demo").innerHTML =
          this.responseText;
        }
      };
      xhttp.open("GET", 檔案在伺服器上的位置, true);
      xhttp.send();
    }     
    ```
- 如果網頁有大量資料要渲染，如何加速（可從前後端角度敘述）
    前端：preload第三方資源及重要資源、圖片大小優化、Cache、Lazy Load Image
    後端：
- 闡述前端網頁模版使用經驗（略）
    
- JavaScript Callback Hell 是什麼
    如果一個function被作為參數傳進另一個function，這種行為稱為"Callback
    
    Callback被一層層嵌套，導致 程式碼難以閱讀和維護 的情況，就被稱作 Callback Hell。
    ![](https://i.ytimg.com/vi/fr67u98nckk/maxresdefault.jpg)
    
### css
- css selector 選取以下該行如何選取
```css=
<head> /* hello, im here */
```
- css id class 優先權
    id > class
    ![](https://selflearningsuccess.com/wp-content/uploads/2021/07/CSS%E6%A8%A3%E5%BC%8F6%E5%80%8B%E9%9A%8E%E7%B4%9A-1.jpg)
- css class="a b" 優先權
    a > b
- em, px, pt vh, vw 差別
    1. em -> 相對單位，繼承基準是父元素
    2. rem -> 相對單位，繼承基準是\<html\>根元素
    3. px -> 像素
    4. pt -> 相較於px，為一個絕對大小的單位
    5. vh, vw -> 它們的v是viewport，奠基在viewport寬、高度做百分比伸縮的單位
### backend
- 用過什麼Framwork?（略） 
- 什麼是Mvc?
    ![](https://www.infolight.com/news/Images/BOOK113/image001.png)
- 你做什麼專案用什麼技術? 目的是什麼?（略）
- 資料庫 RMDB Nosql 比較優缺點是啥?
    
    |  | pros | cons |
    | -------- | -------- | -------- |
    | Nosql     |- 資料可以為任意結構，提供彈性的開發<br>- 對於未來有大量擴充需求的系統，會更容易的去擴充，且擴充的成本也較低      |- 不確保 ACID 特性      |
    | RMDB     |- 可以使用 JOIN 來連結多個資料表，做較複雜的查詢<br>- 具備 ACID 特性      | - Schema 必須先定義好，往後如果要修改 schema 必須對於已存在的資料做相對應的處理較為麻煩<br>     |
    
    補充：NOSQL 本身就是基於分散式系統架構，且不具備 ACID 的特性，因此更適合 horizontal scaling。在做水平擴充之後，只需要把資料分散儲存到各個 server 中，不用去處理資料之間的關聯性。比起關聯式資料庫，能夠更簡單的做到 horizontal scaling。

- OAuth2.0 Access token是什麼?
    [連結](https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
- GitLab 是什麼?有什麼特性?
    1. 可以創建私人倉庫
    2. 允許用戶設置 project 的獲取權限，進一步提升安全性
- 比較 ORM 優缺點
    - pros:
        1. 安全簡單(可以做一些初步的防堵或者安全性檢查)
        2. 程式碼乾淨
        3. 泛用(因為ORM是介於程式與資料庫之間，會自行轉換成原生SQL)
    - cons: 
        1. 效能
        2. 複雜的SQL語法不好處理
- 如何加速網站（如上）
- 遇到 DDOS 怎辦
    1. 先了解正常和異常流量（透過分析個別封包僅接受合法的流量）
    2. 使用 Web 應用程式防火牆 (WAF) 來防止攻擊（SQL injection or CSRF）
### Linux/BSD
- 闡述你知道的 Linux 網路管理指令
    - ping -> ICMP echo request echo respond
    - traceroute -> 
    - curl -> 透過 HTTP Protocol 上傳或是下載
    - nslookup -> DNS 查詢
- Linux 如何做系統備援
    寫一個腳本＋cron task 執行腳本，定期做系統備份
- freeBSD, openBSD, NetBSD 講出優缺點
    - freeBSD -> 注重穩定
    - openBSD -> 注重安全
    - NetBSD -> 注重多平台
- 計中的主機有可能被學生惡意使用或是當跳板來攻擊他人主機？身為網管該如何防範，以及該如何偵測該行為（略，不確定）

- 講出你知道的 Linux Distribution 版本以及特性
    - Ubuntu -> 容易上手、良好桌面UI環境
    - Debian -> 穩定、多平台
    - Cent OS -> 非常穩定的系統，很適合作為伺服器作業系統使用
### DevOps
- 用過什麼CI/CD 軟體?
    - Github Actions
    - Jenkins

- K8s 中Pod service deployment node 什麼意思?
    ![](https://i.imgur.com/rsBTtXL.png)
    - pod -> K8S 運作的最小單位，可以有一個或是多個 Container
    - node -> K8S 運作的最小硬體單位，一個 Worker Node（簡稱 Node）對應到一台機器
    - Master Node -> 簡化看成一個特化的 Node 負責管理所有其他 Node。
    - Cluster -> K8S 中多個 Node 與 Master 的集合。基本上可以想成在同一個環境裡所有 Node 集合在一起的單位。
    - service -> K8S 中用來定義「一群 Pod 要如何被連線及存取」的元件。
    - deployment -> 複製多個相同的 Pod 在 Cluster 中同時提供服務，可以幫我們做到無停機的系統升級（Zero Downtime Rollout）
    - Ingress -> Ingress 可以透過 HTTP/HTTPS，在我們眾多的 Service 前搭建一個 reverse-proxy。這樣 Ingress 可以幫助我們統一一個對外的 port number，並且根據 hostname 或是 pathname 決定封包要轉發到哪個 Service 上![](https://miro.medium.com/max/1400/0*-41vn0u27YID9UzQ)
### 虛擬化
- docker 與 VM 差異（上）

- 闡述你知道的 vm 種類以及特性
    ![](https://i.imgur.com/cP9GSgh.png)
    ![](https://i.imgur.com/kh0dYdI.png)

- 使用 k8s 或是 openshift 相關經驗（略）

- Live migration ? 不同代cpu有什麼問題? 如何避免
    將正在運行的虛擬機器從一台實體機器移動到另一台實體機器，達到零停機狀態下遷移虛擬機器；
    可以在不同代同廠商下轉移，但需要先啟用處理器相容性設定

### git/軟工
- git pull, git fetch 差異
    pull = fetch + merge![](http://krishnaiitd.github.io/gitcommands/images/GitWorkflow-3.png)

- git 如何將刪除的 branch 找回
    1. git reflog 看 commitID
    2. git checkout commitID
    3. git checkout -b [branchname]
- 如何保持量好程式碼的品質
    （略）
- 團隊合作開發經驗？擔任什麼角色（略）
- Git 考題給你 graph log，問你 rebase -i 之後長怎樣，還有要怎麼還原
    （就像是複製貼上）
    ![](https://ithelp.ithome.com.tw/upload/images/20211005/20141010tyv3g0SN3s.png)
    
    取消：git reflog -> git reset 回到 rebase 前的 id
### switch
- vlan 使用以及切割經驗

### 其他
- Node.js 的出現有什麼很大的影響？他有什麼特色？
    
- 比較分析 React vs Vue or Angular or 你用過的前端框架 

- memory allocation 太慢怎麼 debug？可以用什麼工具如何解決？
    malloc debug工具
    
- 為什麼 hashing 在 linux kernel 那麼常見？
    透過設計良好的hash函數，可以將kernel的性能提高O(n/m) m為hash的項次

- IDS(Intrusion-detection system) 跟 AV(Anti virus)差在哪，各是檢查封包的什麼東西？為什麼很難擋住 APT ？
    
- Android 手機有辦法搞 IP Spoofing 嗎？怎麼做？
    
- Server虛擬化有甚麼好處？你用過什麼server虛擬化工具？(VMWare、VirtualBox)
    - 提高伺服器可用性
    - 降低營運成本
    - 消除伺服器複雜性
    - 增進應用程式效能
    - 加快工作負載部署速度
- 若你的程式以下環節效能不好，你會如何偵錯並解決？
    (a)program bottleneck (b)cache miss （c）locality issue
    
- DNS反射是一種攻擊手法，通常是利用大型DNS Server，將封包反射至目標電腦進行攻擊，請說明如何實作
    

## 演算法
- 一個 function int freq_mode(int a, int b, int c, int d)，回傳其眾數出現的次數。例如 freq_mode(1, 3, 3, 4) 要回傳 2，因為 3 出現 2 次。求最優雅的解法？

- 實作演算法：給三維平面上的 n 個點，求一個球型能包住所有點，半徑必須小於最小半徑解的 2 倍，要是 O(n) 解。

- 實作演算法：找出陣列 int A[n] 第二小的數， O(n) 解，並證明所有可能的解都不可能比 Ω(n) 好

- 舉出一個你會實作的較複雜的演算法，並用 30 字簡介

## mail
- Open relay 是什麼?

- SPF 作用

- IMAP, POP3 差異

- 如何防止垃圾郵件

- 畫出可擴展的 mail server 架構，並且以文字說明

- postfix table 使用過哪些

- Dovecot中userdb、passdb分別是什麼?

- 是否有管過G suite 、Line work?有什麼優點可以借鏡的?

- 追蹤Mail log 並且找出被退信的原因