Classic Shell Scripting 讀書筆記 (五)

  • Devops

AWK

  • 所有 UNIX 系統裡都至少有一套 awk
  • awk 是 POSIX 的一部分
  • 把輸入流看成一連串紀錄(record)的集合,每筆紀錄可以更進一步細分成字段(field)
  • 如何構成一筆紀錄和一個字段,是可控制的,甚至可以在處理期間修改
  • 替使用者妥善處理每個文件的開啟、讀取與關閉
  • 強大的功能大多是具備對正則表達式的支援

命令行

  • 慣例是將 -F 當作第一個選項,或者也可以設定變量 FS 來重新定義分隔符

    以上面例子來看,-F 應用到第一個文件組,而 FS 應用到第二個文件組

  • -- 是特殊選項,指出 awk 本身已經沒有更進一步的命令行選項

  • 初始化的 -v 必須放在 program 之前,在文件處理之前生效
  • program 使用單引號,保護內容不被 Shell 解釋,不過要特別注意程序是否本身包含單引號

程序元素

  • 提供標量(scalar)、陣列(array)兩種資料結構
  • 提供語句類型:賦值、註釋、條件、函數、輸入、循環、輸出

字串表達式

  • 以雙引號定界
  • 長度沒有任何限制,視內存而定
  • 賦值後舊字串的內存空間會自動回收
  • 字串的比較視字串長短而定,如 “A” < “AA” 返回 1
  • awk 無字串連接的運算符,多個連續的字串,會自動連接在一起
  • 數字轉字串,可透過連接空字串,如 s = “” + 123

正則匹配語句

  • 提供兩個運算符: ~!~ 分別代表匹配和不匹配
  • 正則常量可以用雙引號或斜槓 / 定界,斜槓形式比較常見,因為可以用來強調括起來的就是正則表達式
  • 字面意義的引號、斜槓、反斜槓在正則裡都應該被保護,兩種形式的保護方式可能不同,例如 "\\\\TeX"/\\Tex/ 都是表示正則的 \Tex

數值表達式

  • 所有 awk 裡的數字都以雙精確度的浮點值(對應於 C 的 double)表示
  • awk 在 IEEE 754 廣泛可用前就以開發,無法完整支持 Infinity 與 NaN
  • 浮點數可以包含一個末端以字母 e(或 E)所表示的十次方指數,例如 0.03125、3.125e-2、0.003125E1
  • 字串轉數字,可透過連接0,如 n = 0 + “123”

Read More »Classic Shell Scripting 讀書筆記 (五)

Dcard – Machine Learning Backend Engineer 面試紀錄

  • Misc
  • Title: Backend [email protected] Learning Team
  • Interviewer: Bruce(一面)Bruce, Chris, James, Hao cheng / HR Aria(二面)
  • Location: 遠端 Google Meets
  • Date: 2021.5.17 / 2021.06.04

Intro

透過內部的朋友介紹,因為有相關經歷決定投投看,準備的方向是:

  • 一面:

    • 快速刷了一個 leetcode 的線上課程,可以在短時間複習資料結構與演算法,以及歸納好的題目能更好掌握解法
    • 複習了 Redis In Action 如何設計 Twitter 系統的部份
  • 二面:

    • 複習了 DDIA (Design Data Intensive Application) 的批處理與串流處理章節
    • 重讀了 BigQuery 的文件
    • 統整之前做過的專案,找回已經忘記的經驗與知識點
    • 準備主流面試問題的回答

希望這份筆記能幫助到下一位挑戰者~

Questions

  • 一面

    1. 請你自我介紹
    2. 為什麼選擇使用 Kubeflow?
    3. 你設計的事件系統的 qps 多少?
    4. (子題)有沒有做負載測試?
    5. (子題)你設計的事件系統如果超過 BigQuery 的 insert quota,怎麼處理?
    6. 為什麼喜歡容器技術?
    7. 你所建制的 ML 基礎設施是否對團隊帶來實體的幫助?
    8. 你會怎麼實作一個 Set 資料結構?
    9. (子題)如果不用 Dictionary,要怎麼做?
    10. (子題)你使用 BST 的排序只適用 numeric,如果插入不同的 Data Type 要怎麼改?
    11. 如果要你設計一個 API 服務使用者資料,你會怎麼優化效能?
    12. (子題)使用 python lru cache 或連外部的 cache server 有什麼差別?
    13. (子題)如果想要針對快取做統一的設定,怎麼做?
    14. 有什麼問題想問?
  • 二面(HR)

    1. 請你自我介紹
    2. 之前為什麼會做農科院的研究助理?
    3. 為什麼想換工作?
    4. 未來五年生涯規劃?
    5. 有什麼問題想問?
  • 二面(ML Team)

    1. 請你自我介紹
    2. 你設計的事件系統如果造成阻塞,怎麼處理?
    3. 你設計的事件系統怎麼優化串流的速度?
    4. 你導入 ML 生產流程時,有幫 Data Engineer 解決過哪些問題?
    5. ML 生產流程的資源如何規劃?
    6. 如果 Log 量太大,怎麼處理?
    7. 你如何監控系統?
    8. 如果要你蒐集使用者點擊廣告的資料,並能在 1 分鐘內搜尋到結果,要怎麼設計?(白板題)
    9. (子題)如果要縮短時間,要怎麼優化?
    10. (子題)你的解決方案在查詢資料時要 scan,怎麼避免 scan?
    11. 有什麼問題想問?

Read More »Dcard – Machine Learning Backend Engineer 面試紀錄

Classic Shell Scripting 讀書筆記 (四)

  • Devops

波浪展開

  • 若命令行第一個字串開頭為波浪符號 (~),則執行波浪展開,目的是轉換使用者根目錄的絕對路徑
  • 可以直接或間接方式指定展開的使用者,使用 ~ 則轉換當前使用者,使用 ~{username} 則會從 /etc/passwd 查找特定用戶的根目錄並替換
  • 好處是簡潔,及避免在程序裡把路徑寫死,壞處是可移植性差,許多商用 UNIX 的 Bourne Shell 不支援

通配符 wildcard

  • Shell 會將命令行提供的模式,至換成符合模式的一組排序過的文件名
  • 範圍表示法雖然方便,但你不應該對包含在範圍的字串有太多的假設,比較安全的方式是:分別指定所有大寫字母、小寫字母、數字、或子範圍,避免使用像 [a-Z][A-z] 這樣的用法
  • 使用範圍更大的問題是不同 locale 間的可移植性
  • 習慣上,當執行通配符展開時,UNIX Shell 會忽略以點號(.)開頭的文件,這些文件通常是配置文件或啟動文件

基本通配符

命令替換 command substitution

  • 將命令替換語句替換為執行結果
  • 形式有兩種:使用反引號(`),或將命令括在 $() 裡,在內嵌的用法上,第二種用法有利於增加可讀性,且內嵌的雙引號不須再進行(\)轉義

範例:根據使用的 shell 歸類使用者

expr 命令

  • 「UNIX 少數設計得不嚴謹卻又難用的命令」,不建議使用,可以以 test 或 $((...)) 代替
  • 通常在命令替換語句中使用,通過打印的方式將值返回標準輸出
  • 支持 32 及 64 位元的算術運算,幾乎不會有 overflow 的問題

引用 quoting

用來防止 Shell 將某些你想要的東西解釋成不同意義,有三種方式:
* 反斜槓轉義
* 單引號:強制將字符都看作字面上的意義(即便是反斜槓),不可再內嵌單引號
* 雙引號:同單引號的引用功能,差別在於,使用雙引號引用會確切處理轉義字符、變量、算術、命令替換,雙引號其中的單引號不具特殊意義

Read More »Classic Shell Scripting 讀書筆記 (四)

LeetCode Cheat Sheet – 50 Problems

  • Misc, Python

Concepts

Sliding Window

Give n element and k window size, try to get max sum.

Bindary Search

  • Only work when data is sorted

Step:

  1. Use the left and right element as 2 pointers
  2. Find the middle pointer between 2 pointers
  3. Compare the middle element to search term
  4. If middle > search term, replace left pointer with middle pointer + 1
  5. If middle < search term, replace right pointer with middle pointer – 1

Hash Table

  • hash function
  • collusion

collusion handling

  • chaining: make each key point to a linked list, -> easy, never get full, use extra space and search O(N)
  • open addressing: if key exists, probe until available -> more computation(probing), can get full, better performance

If number of keys is unknown, use chain; other wise use open addressing.

probe methods

  • linear probing: probe to next slot
  • quadratic probing
  • double hashing

Read More »LeetCode Cheat Sheet – 50 Problems

Classic Shell Scripting 讀書筆記 (三)

  • Devops

test 命令

  • POSIX 將 test 的參數描述為「表達式」:
    • 一元(unary)表達式:由看似一個選項(如-d)與相對應的運算數組成(基本上是一個文件名)
    • 二元(binary)表達式:兩個運算數與一個內嵌的運算元組成,做某種比較操作
  • test 命令有另一種形式 [ expression ],方括號與表達式一定要以空白隔開
  • 表達式可以前置 ! 表示否定

在 XSI 兼容的系統裡,-a 意義等同於 &&; 為了可移植性,建議使用多重條件而非 -a, -o

使用 test 的訣竅

  • 須有參數(避免 null),因此變量展開都要以引號括起來
  • 為了可移植最大化,可以替比較字符串加上前綴 X,例如 if [ "X$answer" = "Xyes" ],可以避免字符串為空或開頭帶減號而混淆 test 命令
  • test 是可以被愚弄的,例如 test -r a_file && cat_file,a_file 可能會在執行 test 與執行 cat 之間改變
  • 只能做整數測試

範例:檢查輸入參數

Read More »Classic Shell Scripting 讀書筆記 (三)

Classic Shell Scripting 讀書筆記(二)

  • Devops

排序文本 sort

locale 對排序的影響

重音位置不同的法文單字

查看字元在 ISO 的八進位數值

分別用傳統 ASCII 和 Canadian-French(系統必須先安裝法文)排序,結果不同

注意空白

-k 指定排序字段時

  • 如未以 -t 指定分隔符號,預設以空白分隔並忽略開頭與結尾的空白
  • 如果指定 -t,則開頭與結尾的空白不會被忽略,例如 ” -X- ” 以 -t " " 分隔,會被分成三個字段: 空白, “-X-” 及空白
  • 如果僅指定一個字段編號,意思是「從該字段開始,一直比對到行的結尾」
  • -k{n},{m} 格式代表「從第 n 個字段開始,至第 m 個字段結尾」
  • -k{n.i},{m.j} 格式代表「從第 n 個字段第 i 個字元開始,至第 m 個字段第 j 個字元結尾」

穩定性

紀錄內的排序字段都相同,但輸出與輸出不一致,代表 sort 並不穩定。GNU 實現了 coreutils 套件,可透過 --stable 彌補這個不足

排除重複

使用 -u 排除重複是基於 key 而非整筆紀錄,如果是後者,則可以搭配 uniq 工具使用

Read More »Classic Shell Scripting 讀書筆記(二)