Devops

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 讀書筆記 (四)

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 讀書筆記(二)

Classic Shell Scripting 讀書筆記(一)

  • Devops

入門

printf

  • 格式聲明 (format specfications) 是一種佔位符號 (placeholder),結構包含 1) 百分比符號 (%) 2) 指示符 (specifier),常用的有字符串 %s 及十進位整數 %d

tr

範例:Translate DOS file to UNIX

  • tr -d: 自 stdin 刪除 source-char-list 的字符
  • \r: ASCII carriage return

/dev/tty

範例:Read password via /dev/tty

  • 當程序打開 /dev/tty 時,UNIX 會將它重定向到一個終端再與程序結合,該終端可以是 1)實體的 console 2) 串行端口 (serial port) 3) 偽終端 (pseudoterminal)
  • stty (set tty) 用來控制終端的設置,echo/-echo 選項用來開關自動打印輸入的功能

i18n and l10n

  • 當 i18n 作為設計軟體的過程時,無須再修改軟體或重新編譯程式代碼,就可以給特定的群體使用
  • 當 l10n 作為設計軟體的過程時,目的是讓特定的使用者可以使用軟體。其中包含翻譯輸出的文字、貨幣、日期、時間、單位等格式
  • 對使用者來說,用來控制讓哪種語言或文化環境生效的功能,叫做 locale
  • 除了 CPOSTFIX 以外,locale 名稱並未標準化
  • BSD 與 Mac OS X 完全不支援 locale
  • locale 的支援仍未成熟:Shell 腳本常受到 locale 影響;在大多數 UNIX 系統下,很難從 locale 文件與工具來判定字元集 (character class)、等價字元集 (equivalence class) 實際上包含了哪些字元,以及有哪些排序符號 (collating symbol) 可用。
  • Shell 腳本開發者應了解 locale 對他們代碼所造成的影響

列出所有 locales

取得特定 locale 的資訊

定義 LC_ALL 來覆寫預設的 locale,可查詢的變量有日期時間格式 LC_TIME、貨幣格式LC_MONETARY

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

深入理解 Nginx 讀書筆記 (第二章)

進程間的關係

  • Nginx 支持僅單進程(master)提供服務
  • 常態的部署是使用一個 master 進程來管理多個 worker 進程
  • Worker 數量與 CPU 核心數相等,進程切換代價最小

使用多進程的好處

  1. master 進程僅專注於純管理工作,為管理員提供命令行服務(啟動、停止、重配置、升級)
  2. master 進程需要比較大的權限,通常會以 root 使用者啟動
  3. 一個 worker 進程出錯後,其他 worker 仍然可以正常服務
  4. 充分利用 SMP(Symmetric multiprocessing) 多核架構,實現微觀上真正的多核併發處理
  5. Worker 通常不會進入睡眠狀態:可以同時處理多個請求,不像 Apache 每個進程只能同時處理一個請求,以致進程切換代價大

配置語法

每個模組都有自己感興趣的配置項,大部分模組都必須在 nginx.conf 中讀取到某個配置後才會啟用,例如只有當配置 http {…} 時, ngx_http_module 模組才會啟用,其他依賴的模組也才能正常使用

區塊配置項

  • 由名稱及一對大括號組成,如 http, server, location 都屬於區塊配置項
  • 傳入的參數取決於解析這個區塊配置項的模組
  • 大括號表示包含其中的配置同時生效
  • 可以嵌套,內層配置直接繼承外層
  • 當內外層配置發生衝突,以哪層配置為準,取決於解析這個區塊配置項的模組,例如範例的 gzip 開關

配置項語法格式

  • 名稱必須合法的(是某個 Nginx 模組想要處理的)
  • 傳入的參數取決於解析這個區塊配置項的模組
  • 若任一參數包含空格符,須要用單引號或雙引號包住
  • 以分號結尾

Read More »深入理解 Nginx 讀書筆記 (第二章)

BigQuery Short Notes

  • Devops, Misc

Dataset

Datasets are top-level containers that are used to organize and control access to your tables and views.

location

BigQuery processes queries in the same location.

Location cannot be changed after creation.

Use BigQuery Data Transfer Service or Cloud Composer to transfer data accross different locations.

There are two types of locations:

  • A region is a specific geographic place, such as us-central1.
  • A multi-region is a large geographic area, such as EU, US

considerations

  • Colocate with external data source
    • If dataset is in the US multi-regional location, GCS bucket must be in a multi-regional bucket in the US.
    • If dataset is in Cloud Bigtable, your dataset must be in the US or the EU multi-regional location.
  • Colocate with GCS buckets for loading and exporting data
    • The GCS bucket must be in a regional or multi-regional bucket in the same location. Except US multi-regional location, you can load data from a GCS bucket in any regional or multi-regional location.

availability and durability

Failure domains

  • Machine-level
  • Zonal
  • Regional

Failure types

  • Soft: power failure, network partition, or a machine crash, should never lose data.
  • Hard: damage from floods, terrorist attacks, earthquakes, and hurricanes, data might be lost.

Single region

  • No backup or replication to another region.
  • Better considering create cross-region backups.

Multi region

  • Data is stored in a single region but is backed up in a geographically-separated region to provide resilience to a regional disaster.

Read More »BigQuery Short Notes