2010年3月17日 星期三

大量改檔名

若同一個資料夾裡,要用同樣的規則修改檔名,如所有為.dat副檔名要更名為.txt,可以寫一個簡單的shell script來完成。

先了解變數替換的方法
${var%word} - 由var變數內容的後端,向前刪除符合word關鍵字(最短部份)
${var%%word} - 由var變數內容的後端,向前刪除符合word關鍵字(最長份)
${var#word} - 由var變數內容的前端,向後刪除符合word關鍵字(最短部份)
${var##word} - 由var變數內容的前端,向後刪除符合word關鍵字(最長部份)

舉例:
變數$abc = howard, john, tom
# echo ${abc%,*}
howard, john
# echo ${abc%%,*}
howard

重新命名範例:將附檔名dat改為txt
#/bin/bash
for i in *.dat
do
mv $i "${i%dat}txt"
done

2010年3月14日 星期日

strtok in C++

C++來實作類似strtok()的function

class StrTok : public vector<std::string> {
public:
StrTok(const string & strInput, const string & strDelim = " ,") {
string::size_type nHead, nTail;
nHead = strInput.find_first_not_of(strDelim, 0);
nTail = strInput.find_first_of(strDelim, nHead);

while(nHead != string::npos || nTail != string::npos) {
push_back(strInput.substr(nHead, nTail - nHead));
nHead = strInput.find_first_not_of(strDelim, nTail);
nTail = strInput.find_first_of(strDelim, nHead);
}
}
};

兩個參數,第一個參數為預切割的字串,第二個參數為切割的符號(預設為逗號),因為是繼承vector,所以可以直接用vector的function去存取切割後的字串。範例如下:

StrTok tok("howard, john");
for(StrTok::size_type i = 0; i < tok.size(); i++)
cout << tok[i];

2010年3月11日 星期四

MySQL最大連線數

MySQL的最大連線數可以透過my.cnf設定檔來設定

max_connections = 200 (若沒有設定,預設值為100)。

上述方法需重新啟動MySQL才能套用設定,另一種方法則是直接下指令,缺點就是下次重啟動時還是會回到原設定
mysql> set global max_connections = 200;

透過以下指來可查看此參數設定。
mysql> show variables;

至於目前的連線數,可透過Threads_connected來得知,動態變化,可透過以下指令得知目前連線數
mysql> show status;

此外,若發現MySQL的連線數出現異常,如短時間爆增連線,可以用以下指令來找尋目前的連線狀態,找出當下SQL Query的指令與來源。
mysql> show full processlist;

若有異常的指令,可以下kill來刪除該指令
mysql> kill [id]

2010年3月7日 星期日

命令執行

在Shell Script常常會需要抓取或是儲存執行某個指令的結果。舊式的寫法是用反引號`cmd`,要注意的一點就是符號不是單引號(')。而新式的寫法是採用$(cmd)。

舊式:
echo The current date is `date`

新式
echo The current date is $(date)

F2 重新命名

在Windows作業系統,在圖示按兩下便可以更改檔名,然而在Linux下的桌面環境,點兩下卻是沒有回應,要按右鍵屬性去修改,感覺有些麻煩。現在才發現有一個更快的方法,那就是F2鍵就如同在圖示點兩下,Windows也適用。