目前分類:[程式開發] (25)

瀏覽方式: 標題列表 簡短摘要

[ Quick Solution Mode ]

$ cat test.log
aaaaa
bbbbb
ccccc
ddddd

# Way I
$ wc -l ./test.log         # -l, --lines: print the newline counts
4 ./test.log

# Way II
$ grep -c '' ./test.log    # -c, --count: print a count of matching lines
4

# Way III
$ sed -n '$=' ./test.log   # $: match last line, =:print current line number
4


[ Verbose Mode ] 

由以上三種方法可以看出用 grep 或 sed 時只會回傳總行數,
如果需要用行數來做一些處理時就會比用 wc 來的方便

sed 的 -n 指的是 silent (安靜模式),
表示只顯示匹配的結果,
若不加就會將檔案內容也給輸出了,
所以通常使用 sed 時都會加上 -n 的參數

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

在許多的情況之下,我們都需要固定一組可以重覆或判斷資訊的指令,
而把這些指令存被在文字檔中,再交由Shell執行,就是Script。
一般會將Shell Script的副檔名命名為.sh,雖然副檔名在Linux中並非必要,
但是有副檔名可以讓我們更容易管理這些檔案。

假設有一個名為test.sh 的 Shell Script,首先用文字編輯器來撰寫內容如下:
#!/bin/bash
echo Hello World

第一行是必需的,它是用來定義你要使用的 shell。Linux中有許多的Shell可以使用,
如:ksh、bash,但是彼此之間語法有所差異,所以我們首先需要定義使用哪一個Shell。
而第二行的 echo 代表列出一個字串,預設會把後面的字串「Hello World」顯示在螢幕上。
將test.sh存檔後,可以用下列其中一種方式執行它:


1、直接輸入 sh test.sh
2、改變test.sh的權限,加上可以執行的權限,
   chmod a+x test.sh
   接著直接執行它:
   ./test.sh

在Shell Script中,「#」表示註解,在#後面將視為註解並且被程式忽略。
例如:
#pwd
ls -l
Shell只會執行ls -l,而不會執行ls -l

而「;」 則代表指令的分隔,例如:
pwd;ls -l

pwd
ls -l
都是一樣執行pwd及ls -l。

二、變數的使用
在Shell Script中,所有的變數都視為字串,因此不需要在定義變數類型。
在Shell中定義和使用變數時並不一樣。
例如,定義一個變數id並且設定值為2013001,接著還要將印出變數的值:
id=2013001 -> 定義變數時前面不加「$」符號
echo $id   -> 使用變數時前面要加「$」符號
注意,在等號的二邊不可以有空白,否則將出現錯誤。

再介紹一個範例:
dir=/home/oracle
ls $dir

這裡我們定義了變數dir的值為/home/oracle,接著用ls指令來印出變數dir,
此時指令會變為ls /home/oracle,所以就把目錄中所有檔案都列出來。


我們再來看一個例子,說明如何使用變數來定義變數:
$ tmppath=/tmp$ tmpfile=$tmppath/abc.txt$ echo $tmpfile
/tmp/abc.txt

我們也可以把指令的輸出傳回給變數,指令前後加上關鍵字「`」,
它是位於鍵盤左上角「數字鍵1」左邊的按鍵:
now=`date` 
echo now
結果會秀出「Mon Dec 16 09:31:44 EAT 2013」

此外,雙引號與單引號字串對變數解釋有不同的意義,
如果是使用單引號,則變數會當成一般文字;雙引號才會解譯成變數,例如:
a=123
echo "$a" ->結果是123
echo '$a' ->結果是$a

Script也可以要求使用者輸入資料,利用read指令來讀取輸入的資料。如下:
#!/bin/sh
printf "Please input your name:"
read Name
echo "Your name is $Name"

由於echo指令內定會自動換行,所以我們使用printf這個指令來輸出字串。
我們將上述內容存成檔案test01.sh,接著執行它:
[root@oel62 test]# sh test01.sh
Please input your name: Job ->提示要輸入名字,此時輸入的是Job
Your name is Job

Shell Script有一些預設的特殊變數如下:
$? :表示上一個指令的離開狀況,一般指令正常離開會傳回 0。不正常離開則會傳回 1、2 等數值。
$1 :表示輸入的第一個參數,$2 則為第二個參數,依此類推。
$0 :shell script的檔名。
$@ :即代表 $1, $2,....直到所有參數結束。也就是說 $@ 代表了 "$1" "$2" "$3"....。
$* :所有參數無間隔的連在一起,成為單一個參數。也就是說 $* 代表了 "$1 $2 $3..."

三、運算符號
在 shell 中的四則運算必須使用 expr 這個指令來輔助。注意,在 + - * / 的二邊都有空白,如果沒有空白將產生錯誤:
expr 6 - 2
sum=`expr 10 + 20`
echo $sum
結果:
4
30

還有要特別注意的是乘號 * 。因為 * 有其他意義,所以要使用 \* 來代表。另外,也可以用 % 來求餘數。
count=`expr 9 \* 3`
echo $count
echo `expr $count % 3`
結果:
27
0

簡單的條件判斷是以 && 及 || 這二個符號來表示。
a && b如果 a 是真,則執行 b。如果 a 是假,則不執行 b。
a || b如果 a 是假,則執行 b。如果 a 是真,則不執行 b。
例如:
ls /home && echo YES
ls /dev/aaaa && echo YES
結果:
YES
ls: /dev/aaaa: No such file or directory

接著我們使用 test 及 [ 來做運算,運算所傳回的結果是真 (true) 或假 ( false)。
我們可以將它應用在條件判斷上。test 和 [ 都是一個指令,我們可以使用 test 並在其後加上參數來判斷真假。
或者也可以使用 [ 表達式 ] 來替代 test,要注意的是 [ ] 中的必須有空白間隔。

表達式說明如下:
-n str1      :如果字串 str1 的長度大於 0 則傳回 true。
-z str1      :如果字串 str1 的長度等於 0 則傳回 true。
str1  = str2 :如果字串str1等於字串str2則傳回 true,等號二邊有空白。
str1 != str2 :如果 str1 不等於 str2 則傳回 true。!= 的二邊有空白。
a -eq b      :Equal,a 等於 b 則傳回真 (true)。
a -ne b      :Not equal,a 不等於 b 則傳回真 (true)。
a -gt b      :Grwater than,a 大於 b 則傳回真 (true)。
a -lt b      :Less Than,a 小於 b 則傳回真 (true)。
a -ge b      :Greater or equal,a 大於或等於 b 則傳回真 (true)。
a -le b      :Less or equal,a 小於或等於 b 則傳回真 (true)。

我們舉例來說明:
test 5 -eq 5 && echo true
test abc!=cde && echo true
[ 6 -lt 10 ] && echo true
結果:
true
true
true

四、流程控制
1、if 的條件判斷
基本語法:
if condition-list
  then list
elif condition-list
  then list
else list
fi

範例:
if [ $1 = "aa" ]
  then
  echo "YES"
else
  echo "NO"
fi

範例二:
$ ee test.sh
#!/bin/sh
if [ $1 -gt 10 ]
      then echo " $1 is bigger then 10"
elif [ $1 -ge 0 ]
      then echo " $1 is between 5 and 0. "
else echo "$1 is less then 0."
fi


2、while 及 until 迴圈
基本語法:
while condition-list
   do list
   done

until condition-list
   do list
   done
範例一:
#!/bin/sh
i=1
while [ $i -le 10 ]
   do
       echo $i
       i=`expr $i + 1`
   done
說明:首先令變數 i=1,接著在當i小於等於10執行迴圈的內容,而每次執行迴圈一次,則i加1。

範例二:
#!/bin/sh
i=1
until [ $i -gt 10 ]
   do
       echo $i
       i=`expr $i + 1`
   done

說明:首先令變數 i=1,接著迴圈會判斷,一直執行到i大於10才停止。
      每跑一次迴圈就i就加1。
 
3、for 迴圈
基本語法:
for name in word1 word2 …
   do do-list
   done

for name
   do do-list
   done
  
範例一:
#!/bin/sh
for color_name in blue red green
    do
       echo $color_name
    done

說明:這個Script中,會在每一次迴圈中將關鍵字in後面的字串分配給變數color_name,
      然後印出變數 color。
 
4、case 判斷
基本語法:
case word in
    pattern1) list1 ;;
    pattern2) list2 ;;
    …
esac

範例:
case $num1 in
  1|2|3)       echo $num1 is between 0~3;;
  4|5|6|7)       echo $num1 is between 4~7;;
  8|9)           echo $num1 is 8 or 9;;
  *)             echo $num1 is not on the list;;
esac

6、函式的運用
Shell Script中也可以使用函式 (function) 來將程式模組化。
基本語法:
name ( )
{
    statement
}

函式有幾個要注意的地方:
  A、在使用函式之前一定要先定義它,也就是在一個 Shell Script 中,一定要先寫函式的內容,
     在函式之後再寫一般的程式部份。
  B、在Script中的變數全部都是全域變數 (Global),所以函式中的變數會影響函式之外的其他部份。
  C、在命令列中輸入的參數是以 $1,$2來讀取,但是這些參數並沒有辦法在函式中使用。
     傳給函式的方法和在命令列中一樣,例如:[函式名稱] arg1 arg2..。
 傳進函式的變數一樣會以 $1,$2來儲存並使用。

範例:
addnum1 ( )
{
  echo 'Function $1 is' $1
  echo 'Function $2 is' $2 
}

echo 'Command $1 is' $1
echo 'Command $2 is' $2

a=`expr $1 + 10`
b=`expr $2 + 10`
addnum1 $a $b

程式執行:
[root@oel62 test]# ./test01.sh 2 3
結果:
Command $1 is 2
Command $2 is 3
Function $1 is 12
Function $2 is 13


文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

在linux環境中,不管是程式設計還是其他維護,時間是必不可少的,也經常會用到時間的運算,熟練運用date命令來表示自己想要表示的時間,肯定可以給自己的工作帶來諸多方便。

1命令格式:

  date [參數]... [+格式]

2命令功能:

date 可以用來顯示或設定系統的日期與時間。

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

1. 開啟Google Chrome Console

打開Chrome -> 按F12 -> 選擇標籤[Console]

 

2. 貼上語法

文章標籤

NoSleep 發表在 痞客邦 留言(2) 人氣()

配置文件中經常用到ini文件,在VC中其函數分別為:

寫入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);

讀取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);

讀取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

其中個參數的意思:

LPCTSTR lpAppName ------- INI文件中的一個字段名
LPCTSTR lpKeyName -------- lpAppName 下的一個鍵名,也就是裡面具體的變量名
LPCTSTR lpString ---------是鍵值,也就是變量的值, 必須為LPCTSTR或CString類型
LPCTSTR lpFileName --------完整的INI文件路徑名
LPCTSTR lpDefaut ----------如果沒有其前兩個參數值,則將此值賦給變量
LPSTR lpReturnedString --------接收INI文件中的值的CString對象,即接收緩衝區
DWORD nSize ------接收緩衝區的大小

例子:

CString StrName,Strtemp;

int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");

結果:(INI文件中顯示如下:)

[Student]
Name=jacky

讀取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");

結果:SName = "jacky";這裡需要注意點就是用完GetBuffer函數後一定要釋放(用SName.ReleaseBuffer()函數),不然後面再用到SName的其他子函數就會失靈。

讀整數比較簡單,如下

int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即為所讀取的結果!

在GetPrivateProfileString最後一個參數是配置文件路徑的參數,此路徑只能是絕對路徑,不能是相對路徑,但現在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函數。


原代碼如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();

注意:在這裡使用CString變量時,在使用完GetBuffer後,緊接著一定要使用ReleaseBuffer()函數,才可以進行其他的諸如字符串+操作


文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

一. gettimeofday()基本介紹

 

1.簡介:
在C語言中可以使用函數gettimeofday()函數來得到時間。

它的精度可以達到微妙

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

Static variable

  1. A static variable inside a function keeps its value between invocations.
  2. A static global variable or a function is "seen" only in the file it's declared in

意思就是

1. 如果在function裡面定義一個Local的static變數時:

    每當離開function之後, 這個static變數的數值仍然會保留, 因為用static把這個變數定義的memory位置固定住了,

    也不會被別的變數所使用! 

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()


文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()


文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

判斷作業系統是32位元或64位元

 

32位元作業系統尚未淘汰,64位元系統日益漸多的時代,我們的程式需要滿足最大的相容性,

勢必需要同時支援32/64bit作業系統,以服務更多使用者需求,

 

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

1.CString::IsEmpty

BOOL IsEmpty( ) const;
回傳值:如果CString 物件的長度為0,則回傳非零值;否則回傳0。
說明:此成員函數用來測試一個CString 物件是否是空的。

範例:

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

MFC Timer範例 (SetTimer, KillTimer, OnTimer)

 

幾乎所有一定規模的程式裡, 都會使用定時器(Timer)這個令人愛不釋手的功能,

可能是倒數計時器, Socket定時心跳包, 定時偵測裝置狀態, 也可能是UI介面定時更新,

電腦程式靠著定時器不眠不休地, 忠誠地完成一次次任務,

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

UI  
 
 
當我提到一個工具"對用戶不友好"(user-unfriendly)的時候,我總是被人"鄙視"。
文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

 

好些人來信問我,要成為一個好的程序員,數學基礎要達到什麼樣的程度?十八年前,當我成為大學計算機系新生的時候,也為同樣的問題所困擾。面對學數學,物理等學科的同學,我感到自卑。經常有人說那些專業的知識更加精華一些,難度更高一些,那些專業的人畢業之後如果做編程工作,水平其實比計算機系畢業的還要高。直到幾年前深入研究程序語言之後,對這個問題我才得到了答案和解脫。由於好多編程新手遇到同樣的困擾,所以我想在這裡把這個問題詳細的闡述一下。

  數學並不是計算機科學的基礎

  很多人都錯誤的認為,計算機科學是數學的一個分支,數學是計算機科學的基礎,數學是更加博大精深的科學。這些人以為只要學會了數學,編程的事情全都不在話下,然而事實卻並非如此。

文章標籤

NoSleep 發表在 痞客邦 留言(1) 人氣()

VC/MFC下使用MessageBox()AfxMessageBox()的比較整理

 

使用區別:

類別庫:

 MessageBox()是標準的Windows API函數;

文章標籤

NoSleep 發表在 痞客邦 留言(1) 人氣()

終極dos批處理循環命令詳解
格式:FOR [參數] %%變量名 IN (相關文件或命令)   DO 執行的命令
  作用:對一個或一組文件,字符串或命令結果中的每一個對象執行特定命令,達到我們想要的結果。
  注意:在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable,而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同於 %I.
  關於:for命令可以帶參數或不帶參數,帶參數時支持以下參數:/d /l /r /f
  下面分別解釋一下

  ===
  零:無參數時:
  ---
  FOR %variable IN (set) DO command [command-parameters]
  %variable 指定一個單一字母可替換的參數。
  (set)      指定一個或一組文件。可以使用通配符。
  command    指定對每個文件執行的命令。
  command-parameters
  為特定命令指定參數或命令行開關。

  TTT示例:
  for %%i in (t*.*) do echo %%i --顯示當前目錄下與t*.*相匹配的文件(只顯示文件名,不顯示路徑) 
  for %%i in (d:\mydocuments\*.doc) do @echo %%i --顯示d:\mydocuments\目錄下與*.doc相匹配的文件
  ===
  一、參數 /d (參數只能顯示當前目錄下的目錄名字)
  ---
  格式:FOR /D %variable IN (set) DO command [command-parameters]
  這個參數主要用於目錄搜索,不會搜索文件,/D 參數只能顯示當前目錄下的目錄名字。(TTT特別說明:只會搜索指定目錄下的目錄,不會搜索再下一級的目錄。)

  TTT示例:
  for /d %%i in (c:\*) do echo %%i --顯示c盤根目錄下的所有目錄
  for /d %%i in (???) do echo %%i --顯示當前目錄下名字只有1-3個字母的目錄

  ===
  二、參數 /R (搜索指定路徑及所有子目錄中與set相符合的所有文件)
  ---
  格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
  此命令會搜索指定路徑及所有子目錄中與set相符合的所有文件,注意是指定路徑及所有子目錄。

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

Visual Studio 2005自動移除工具
Uninstalling Previous Versions of Visual Studio 2005網頁提供Run autouninstall tool now的移除工具。

Visual Studio 2008自動移除工具

解除安裝 Visual Studio 2008網頁提供立刻執行 AutoUninstallTool的移除工具。


文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

Visual Studio 2010 完整移除方法 VS2010 Full Uninstall

 
 
 
 
最近VS2010 一直出現錯誤,所以想要給他完整移除,FULL Uninstall重新安裝
文章標籤

NoSleep 發表在 痞客邦 留言(1) 人氣()

前一陣子,幫公司寫了一個自動化安裝系統的程式,
有一堆必要Component,x86、x64的安裝檔案不同,例如:Windows Installer 4.5。
於是,為了讓所有系統都可以達到自動辨識、安裝的目的,寫了以下一段程式,用來辨識OS是否為64位元。

先解說一下基本的原理:
辨識的原理,其實很簡單,基本的原理是透過檢查作業系統的『CPU定址長度』來判定。
32位元的作業系統,CPU定址長度會是32bit,即使使用的實體CPU是64位元的,OS仍會判定是32bit。
64位元,就沒有這種問題啦,不是64位元的CPU,應該也裝不了64位元的OS。

以下是判斷的程式碼:

  1. private bool DetectIf64bit()  
  2. {  
  3.   bool Is64Bit;  
  4.   ObjectQuery objQry;  
  5.   System.Management.ManagementScope mngScope;  
  6.   System.Management.ConnectionOptions connOpt = new ConnectionOptions();  
  7.   System.Management.ManagementObjectSearcher searcher;  
  8.   
  9.   //-----設定 WMI 連接資訊-----  
  10.   connOpt.Username = "";   // 登入系統的帳號  
  11.   connOpt.Password = "";   // 密碼  
  12.   connOpt.Authentication = AuthenticationLevel.Default;   // 連線驗證方式  
  13.   mngScope = new ManagementScope();  
  14.   mngScope.Path = new ManagementPath(@"\\.\root\cimv2");  
  15.   mngScope.Connect();  
  16.   
  17.   //----- 透過WMI擷取CPU定址長度資訊  
  18.   objQry = new ObjectQuery("SELECT * FROM Win32_Processor");  
  19.   searcher = new ManagementObjectSearcher(mngScope, objQry);  
  20.   Is64Bit = false;  
  21.   
  22.   foreach (ManagementObject QryObj in searcher.Get())  
  23.   {  
  24.     if (QryObj.GetPropertyValue("AddressWidth").ToString().Trim() == "64")  
  25.     {  
  26.       Is64Bit = true;  
  27.       break;  
  28.     }  
  29.   }  
  30.   
  31.   return (Is64Bit);  
  32. }  



這個辨識方法,已於Windows XP/Vista/2003/2008/7 實際測試

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

  VGA 是 Video Graphics Adapter(Array) 的縮寫,VESA 是 Video Electronics Standards Association 的縮寫,DDC 是 Display Data Channel 的縮寫,信號類型為模擬類型,顯示卡端的接口為 15 針母插座:

15 PIN HIGHDENSITY D-SUB FEMALE

顯示器連線端的接口為 15 針公插頭: 
15 PIN HIGHDENSITY D-SUB MALE

 

文章標籤

NoSleep 發表在 痞客邦 留言(0) 人氣()

1 2