[Python] 判斷是否有來自標準輸入的內容傳入

一個處理資料的 CLI command 一定會有資料輸入,而輸入來源可以是檔案,也可以是從標準輸入(Standard Input, STDIN)而來,若需要同時支援標準輸入與指定參數(檔案路徑),則需要判斷輸入來源為何。參數判斷的部分,若是使用 argparse 開發的話,則在呼叫 argparse.add_argument() 時就可以設定好參數,最後呼叫 argparse.parse_args() 時即可得知是否有參數輸入,那標準輸入要如何判斷?

Read more “[Python] 判斷是否有來自標準輸入的內容傳入”

Leave a comment

[PHP] 如何判斷關聯式陣列與循序式陣列?

PHP 陣列索引預設為由 0 開始遞增的循序數列,同時也支援自行設定索引值。

// 序列式
$sequentialArray = ['A', 'B', 'C'];
/*
Array
(
    [0] => A
    [1] => B
    [2] => C
)
*/

// 關聯式
$associativeArray = ['a' => 'A', 'b' => 'B', 'c' => 'C'];
/*
Array
(
    [a] => A
    [b] => B
    [c] => C
)
*/

判斷兩者的方式為檢查陣列索引是否為一公差為 1 的循序數列。先利用 array_keys() 取得所有陣列索引值後,再利用 range() 產生一個循序整數陣列,比對兩者內容即可判斷:

function is_assoc( array $array ) {
    if ( [] === $array ) return false;
    return array_keys($array) !== range(0, count($array) - 1);
}

var_dump( is_assoc(['a', 'b', 'c']) ); // false
var_dump( is_assoc(['0' => 'a', '1' => 'b', '2' => 'c']) ); // false
var_dump( is_assoc(['1' => 'a', '0' => 'b', '2' => 'c']) ); // true
var_dump( is_assoc(['a' => 'a', 'b' => 'b', 'c' => 'c']) ); // true

Reference: How to check if PHP array is associative or sequential? – Stack Overflow

Leave a comment

[Python] 標準串流控制(STD-IN、STD-OUT、STD-ERR)

標準串流(Standard Streams) 是作業系統底層的一個資料交換機制,各個 process 處理資料時皆需要透過它進行輸入與輸出資料,舉凡讀取檔案、寫入檔案或鍵盤輸入等都是。在程式開發上雖然各種語言都已經把這層的處理給包裝起來,已經可以應付日常大部分的用途,但有些需求下還是需要直接操作標準串流才能達成(尤其是開發 CLI Utility)。

在 Python 操作標準串流

# 操作標準串流需要透過 sys package,在程式的開頭先 import 進來
import sys

# 讀取單行
sys.stdin.readline()

# 讀取多行
sys.stdin.readlines()

# 迴圈讀取
for line in sys.stdin:
    print(line)

# 將標準輸出從 console 轉到 stdout.log
fh_stdout = open('stdout.log', 'w')
sys.stdout = fh_stdout

# 輸出字串,但是不會在 console 顯示,而是被寫到 stdout.log 這個檔案
print('Test output to ./stdout.log')

# 將標準輸出從 console 轉到 stderr.log
fh_stderr = open('stderr.log', 'w')
sys.stderr = fh_stderr

# 使用 raise 拋出一個 RuntimeError,錯誤訊息會被寫入到 stderr.log
raise RuntimeError('test stderr')

References

30.1. sys — System-specific parameters and functions — Python 3.7.0 documentation

How do you read from stdin in Python? – Stack Overflow

Leave a comment

[Linux] dig/nslookup/nsupdate 指令安裝

dignslookupnsupdate 是在進行域名解析除錯時常用到的工具,這三個指令是隸屬於 BIND DNS Server  的 Utility,如果安裝套件時直接搜尋指令,應該是看不到套件名稱上會有指令名稱的,應該會是 bind-utilsdnsutils

 

安裝方式

Debian/Ubuntu:

sudo apt install -y dnsutils

 

Red Hat (CentOS/Fedora/RHEL):

sudo yum install bind-utils

 

Cygwin: 可透過 EXE 安裝檔安裝 bind-utils,有 apt-cyg  可以使用下列指令安裝:

apt-cyg install bind-utils

 References
BIND Open Source DNS Server | Internet Systems Consortium

Leave a comment

[Cygwin] 使用 apt-cyg 管理 Cygwin 的套件

Cygwin 可以安裝許多套件,不過都需要透過 EXE 安裝檔來進行安裝,如果想要直接在 Cygwin CLI 內進行安裝,可以使用 apt-cyg

 

apt-cyg 安裝到 /usr/local/bin

wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg -O /usr/local/bin/apt-cyg
chmod +x /usr/local/bin/apt-cyg

 

這裡列出常用的指令,完整指令說明可參考  apt-cyg

# 在已安裝的套件中搜尋與 dns 相關的套件
apt-cyg search dns

# 線上搜尋(cygwin.com)與 dns 相關的套件
apt-cyg searchall dns

# 安裝 bind-utils 套件
apt-cyg install bind-utils

# 移除 bind-utils 套件
apt-cyg remove bind-utils

 

 

Leave a comment