2009年12月29日 星期二

C語言 - for' loop initial declaration used outside C99 錯誤訊息

今天下午遇到個問題,但我大概search下後發覺應該是C/C++的差別問題。問題出在我在寫個小for迴圈的時候習慣寫 (大概之前都寫C++居多吧)

for (int i=0; i < 15; i++)

的形式,但這樣compile會有問題,有如標題那個錯誤訊息。之後上網查了之後發現原來是因為以前的 c, 在 for 裡面是不能定義變數 ex: for ( int i, ...)。c99 以後才可以, 所以你必須告訴 compiler 是以何種標準來 compile 你的 c[1]

延伸閱讀:何謂C99
C99 是國際標準化組織(International Organization for Standardization, ISO) JTC1/SC22/WG14 於1999年對 C 語言做的標準更正 [2]


Reference:
[1]http://ppt.cc/Md-5
[2]http://www.student.tw/db/archive/index.php?t-135025.html

2009年12月24日 星期四

ARP (Address Resolution Protocol)

ARP, Address Resolution Protocol, is a computer networking protocol for determining a network host's link layer or hardware address when only its Internet Layer (IP) or Network Layer address is known.

In Ethernet network, packets use MAC address for transmission, but in TCP/IP network, each packet uses IP address for transmission. So we need a policy for address resolution. ARP is most frequently used to translate IP addresses to Ethernet MAC addresses. Each station will have an ARP Table in its ARP Cache. The table uses for recording IP address and MAC address.[1]


延伸閱讀:
RARP、PROXY ARP
ARP 的詳細資料可以查詢 RFC-826﹑RFC-814﹑以及 RFC-1166 等文件。而 RARP 的資料則可以參考 RFC-903﹑RFC-906﹑還有 RFC-1293 等文件。[2]

References:
[1]http://en.wikipedia.org/wiki/Address_Resolution_Protocol
[2]http://www.pcnet.idv.tw/pcnet/network/network_ip_arp.htm

2009年12月21日 星期一

SNMP 簡單網絡管理協議

簡單網絡管理協議 (SNMP: Simple Network Management Protocol) 是管理IP 網路上各種裝置的 Internet  標準協定。現實生活中有許多裝置支援 SNMP,包括路由器(router)、交換器(switch)、伺服器(server)、工作站(workstation)、印表機(printer)、數據機櫃(modem  rack)以及不斷電系統(uninterruptible  power supplier,簡稱 UPS)。SNMP  的應用範圍極廣:它讓路由器、伺服器以及其他網路硬體的監控易如反掌,你還可以用它來控制網路裝置,一旦發生問題,它甚至會自動送出傳呼訊息給你、或是採取其他行動。你所能監控的資訊從簡單如「進出介面的資料流量」等的標準項目,到隱密如「路由器內部氣溫」等的專屬項目,皆涵蓋在內。[1]


在目前日益複雜、分散、多元化的網絡環境中充斥著各式各樣網絡設備,這使得網絡的管理、除錯變得困難,簡單網絡管理協議 (SNMP: Simple Network Management Protocol) 是使用 UDP 協議對網絡設備進行管理的一個框架,屬於應用級協議,它提供一組簡單標準的操作去收集、修改及交換網絡設備之間的網絡管理資訊,以便於監察和維護網絡設備,透過標準的 SNMP,網管人員便可以更容易地管理複雜網絡,找出問題所在。

由於網絡管理資訊的急切性通常都不會很高,為了避免網絡管理資訊的傳輸對網絡造成負擔,SNMP 採用可靠性較低的 UDP 協議,UDP 並不能擔保資料包傳到目的地,但對網絡管理來說,間中掉包問題不大,通常我們會為管理軟件定下時間,如在一段時間來收不到回覆,便自動重發

簡易網路管理協定(SNMP)定義了管理控制程式和被管理物件間的管理資訊交換,其中管理資訊庫(MIB) 則用於描述一群被管理物件。[2]


網管資訊庫 (MIB)
SNMP 被設計成適用於各類型的網絡設備,故它所管理的資訊亦隨著設備的不同而千差萬別,每種網絡或設備對其資料的表達方式亦存在差異,為將這些資訊納入同一套管理系統,就須採用一套抽象的語法來描述所有類型的資訊,為此,SNMP 定義了網管資訊庫 (MIB) ,階層性描述所有受管理資訊的屬性,並稱這些受管理的資訊為 SNMP 物件(object)。MIB 可分為標準(Standard) MIB 及 私人 (Private) MIB 兩大類,標準 MIB 適用於所有網絡設備,而 Private MIB 則由廠家自行定義,以反映設備的獨特變量值,合法的 Private MIB 需要向有關機構申請,務求令每一個 Private MIB 都是世上獨一無二的。[3]


SNMP 物件由物件型別 (type)、存取 (access) 及語法 (syntax) 所構成,
‘型別’是組易於人類辨識的字串代碼,它附有編號,
‘存取’可控制對該物件的讀寫,
‘語法’是該物件的資料結構,由 ASN.1 語法所定義。
符合 ASN.1 定義的 MIB 都能被匯編到有名的 SNMP 管理軟件,如 HP OpenView, IBM Netview, Tivoli TME 或 CA Unicenter TNG,匯入不同網絡設備的 MIB,再經過一些簡單程式控制,用戶便可以製作出一套能管理所有網絡設備的系統。[4]

更多詳細介紹請看[3]。


SNMPc
是一個安全的分散式的通用網路管理系統平臺(distributed network management system),直觀顯示、監控和前瞻性地管理網路。能有效地監控整個網路的基礎架構。支援SNMP V3,無比的易用性,對小型或是大型網路提供相應的版本。這就是為什麼有超過120,000套SNMPc被部署在世界各地,用來管理各種網路。[5]

MG-SOFT
類似SNMPc的MIB Browser [6]


[1]www.oreilly.com.tw/preface/117.pdf
[2]http://etds.ncl.edu.tw/theabs/site/sh/detail_result.jsp?id=087TTIT0392011
[3]http://www.openplatform.com.hk/Knowledge/snmp_b.htm
[4]www.oreilly.com.tw/sample_chap/a030_03.pdf
[5]http://www.digimall.tw/goods-228.html
[6]http://www.mg-soft.com/mgMibBrowserPE.html

2009年12月18日 星期五

如何用WORD自動「生」出目錄

編目錄應該讓很多人很頭痛,當初我做論文的時候也是搞很久,沒想到現在工作又遇到了!
其實WORD的功能很強大,我還只是會用「皮毛」而已。
Google下有很多人都有寫word編頁碼的教學
我想Reference[1]寫的就夠清楚明瞭讓你作完目錄了。

如果是要做論文,那因為學術論文會有三個部份(封面、目錄摘要、本文) 所以要先學會如何「分割設定」。這邊可以參考Reference[2],我也不再贅述!

Reference:
[1]http://0rz.tw/2nwgU
[2]http://blog.yam.com/prettyjoy/article/9360881

C語言 - 轉型態

[例1, Convert string to long integer, argv[0]為string型態]

[prototype]
long int atol ( const char * str );


[sample code]
#include
#include

   int ch_num =0;
   ch_num = atol (argv[0]);

/*此例子會把argv[0]的型態從string轉成int存放到ch_num去 [1]
 *see Reference[1]
 */

-----------------------------------------------

[例2, 把IP位址從string型態轉成二進位的數字, argv[0]為string型態]

[prototype]
int inet_aton(const char * cp,struct in_addr *inp);


[sample code]
#include
#include
#include

int ch_num =0;
inet_aton(argv[0], &ch_num);  //存放變數記得用pointer

/*
 *此例子會把argv[0]的string型態從網路位址(ex.140.115.152.231)
 *轉成二進制的數字
 *延伸閱讀:inet_addr,inet_ntoa
 *see Reference[2]
*/

-----------------------------------------------
[例3. convert address from presentation format to network format ]

[sample code]
#include "inet.h"

int ip=0;

inet_pton(AF_INET, argv[0], &ip);

/*
* 把argv[0]的string型態轉成ipv4的位址型態
* see reference[4]
*/


-----------------------------------------------

[例4. 把int 轉成 string]  /* Convert integer to string (non-standard function) */

char * itoa ( int value, char * str, int base );


另一種用法為sprintf: [5]
ex.

  • sprintf(str,"%d",value) converts to decimal base.
  • sprintf(str,"%x",value) converts to hexadecimal base.
  • sprintf(str,"%o",value) converts to octal base.
-----------------------------------------------
[例5. 把type ip4a 轉成char[ ] ]  /* non-standard function) */

inet_ntoar(ip4a IP, char*[] )

ex.
ip4a IP;
char ip_str[INETADDR_LEN];

inet_ntoar(IP, ip_str);




References:
[1]http://www.cplusplus.com/reference/clibrary/cstdlib/atol/
[2]http://www.cs.nctu.edu.tw/~yslin/library/linuxc/function/14.html
[3]http://www.csie.ntnu.edu.tw/~u91029/libtech.html
[4]http://www.mkssoftware.com/docs/man3/inet_pton.3.asp
[5]http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

2009年12月16日 星期三

C語言 - argc 與 argv

今天被問說怎會沒用過!!! 我覺得好羞愧,趕快來做筆記跟記錄一下
以後就會了..... = =

C語言提供一個可以在命令列中將參數引入的功能。也就是說,我們可以在MS-DOS模式下,在執行檔名稱的後面,可以填入需要的參數。

常見的為主程式 main() 有兩個引數 argc 與 argv [1],即函數 main 標題的定義為
main( int argc, char *argv[] )
其作用是 執行該檔 及 所相隨的 option。

如果將一程式 file.c 編譯完之後, 產生一 執行檔 file.exe。 當執行 file.exe 如
c:> file option1 option2 option3
則執行 file.exe 時, argc 的值為 4, argv 則 含 4 個字串,即
argv[0]="file"、 argv[1]="option1"、 argv[2]="option2"、 argv[3]="option3"。
如此一來 程式的設計, 可以有 較多的彈性。


【說明】[4]:
1、argc 與 argv為C語言的關鍵字,是專門用在命令列的參數名。
2、argc是argument count(參數總和)的縮寫,代表包括指令本身的參數個數。系統會自動計算所輸入的參數個數。
3、argv則是argument value的縮寫。代表參數值。也就是使用者在命令列中輸入的字串,每個字串以空白相隔。同時,系統會自動將程式本身的名稱指定給argv[0],再將程式名稱後面所接續的參數依序指定給argv[1]、argv[2]….。


試試看這個例子[3]:
#include ;

int main(int argc, char *argv[])
{
    printf("%d\n",argc);
    while(argc)
    printf("%s\n",argv[--argc]);

   return 0;
}

假設將其編譯為test.exe,
在命令行下,
test hello
得到的輸出結果為:
2
hello
test

/*
main(int argc, char *argv[]),其中argc是指變量的個數,
本例中指test和hello,即為2,argc至少為1
argv是一個char *的數組,其中存放變量的內容,此處 argv[0]中存放test,argv[1]存放hello
*/



再來個例子,題目為把檔案file1 copy到檔案file2去
檔名為copyFile.c [1][2]
#include
   void main(int argc, char *argv[])
   {
       char c;
       int toScreen = 1;
       FILE *fpin, *fpout;

       if(argc < 2 || argc > 3)
       {
          printf("The correct format is: copyFile file1 file2\n");
          exit(1);
       }

       fpin = fopen(argv[1], "r");
       if( !fpin )
       {
           printf("The file: %s is not found!\n", argv[1]);
           return;
       }
       if(argc == 3)
       {
          fpout = fopen(argv[2], "w");
          if( !fpout )
          {
              printf("The file: %s is not found, or no available space!\n", argv[2]);
              return;
          }
          toScreen = 0;
       }

       while( (c=getc(fpin)) != EOF)
       {
           if( toScreen )
              putchar(c);
           else
              putc(c, fpout);
       }

       fclose(fpin);
       if( !toScreen)
          fclose(fpout);
   }



References:
[1]http://nknucc.nknu.edu.tw/~jwu/c/cpgch10.htm#third
[2]http://tw.myblog.yahoo.com/zentai-chang/article?mid=791&prev=797&next=-1
[3]http://www.lslnet.com/linux/f/docs1/i04/big5124525.htm
[4]http://www.eyny.com/thread-1158039-1-1.html

C語言- error: expected declaration or statement at end of input

通常會遇到這問題都是少了個)或者是},也就是縮排不正確所導致
他會錯誤的地方未必是在結尾,而是有可能會在程式中的任何一處(尤其是自己剛修改過的地方)

要避免這個錯誤就是要妥善利用縮排,Reference中有個例子可以做參考

Reference:
http://palib.info/wiki/doku.php?id=day2tw#errorexpected_declaration_or_statement_at_end_of_input

2009年12月15日 星期二

FLASH ROM vs. RAM

基本上最簡單的分別就在東西如果存在RAM如果遇到沒電了 資料就會不見;
反之FLASH ROM的話是沒電資料還在(扣除外力因素)


RAM[1]中文叫做隨機存取記憶體.按字面上的意思就是這個記憶體可以自由的存放和讀取資料
而RAM中又分DRAM和SRAM

DRAM是由電容所組成的所以會因為電力消失而記憶也跟著消失的情況.所以DRAM需要定期的做充電的動作
SDRAM是DRAM的後期的產品.內容大約跟DRAM相同.只是SDRAM多了能跟CPU的時脈週期同步的能力.讓RAM存取不需要再等待CPU的時脈週期.而增加RAM的讀取速度

SRAM是由正反器所組成的.所以不會像DRAM一樣需要充電才能維持記憶的能力.但是目前記憶空間不大.所以常用在CPU的快取記憶體





而FLASH ROM[1],快閃記憶體(Flash Memory或Flash ROM)是目前最新的ROM形式記憶體之一,它就是現在的隨身碟.CF卡.SD卡.等等的記憶材料,而它跟ROM不同的是Flash ROM能讀取也能儲存.算是ROM之中的突變種(ROM的家族裡只有能Flash ROM有儲存的能力.其他的只有讀取的能力)[2]。


FLASH ROM其內部材料已和最早的ROM有極大差異。ROM就是指唯讀記憶體,是只能讀取資料而不能再進行寫入的記憶裝置,但Flash Memory和ROM不同的是它可以寫入,但又不會輕易地讓資料從記憶體中流失。


它主要是由英特爾(Intel)所推出的記憶體,Intel是想藉由Flash Memory的提倡,來取代過去BIOS(基本輸出入系統)使用的EEPROM(電壓消除式可程式化唯讀記憶體),成為系統程式儲存及記錄的主要工具。


在電腦系統應用上,Flash Memory特別強調指令的快速讀取,及對系統的開機管理。由於Flash Memory並不需要充電來維持記憶體內的資料,所以Flash Memory內的資料其保存性也相當高,因此,雖然Flash Memory由EEPROM演化而來,但是價格較便宜且位元密度較高,所以會成為EEPROM的替代品。


References:
[1]http://www.mobile01.com/topicdetail.php?f=61&t=37040&last=244342
[2]http://nt3.ftm.ks.edu.tw/pc/e124135667m/rom.htm

2009年12月12日 星期六

C語言- 前置處理、STATIC、function pointer、string

這幾天在公司邊trace code邊複習C語言中的些東西,
查了些資料先在這裡做個紀錄
之後再整理自己的心得跟嘗試用自己的方式去寫篇教學跟比較


C 前置處理
http://140.127.40.1/~jwu/c/cpgch8.htm
http://www.cplusplus.com/doc/tutorial/preprocessor/
http://www.programmer-club.com.tw/showSameTitleN/c/39098.html

static變數與函數
http://140.127.40.1/~jwu/c/cpgch9.htm#fourth

extern
http://programming.im.ncnu.edu.tw/Chapter8.htm

函數指標 function pointer
http://msdn.microsoft.com/zh-tw/library/dd229207.aspx
http://squall.cs.ntou.edu.tw/cpp/94spring/lab03/Lab3-2.html

strchr  /*字串中找字元位置*/
http://www.cplusplus.com/reference/clibrary/cstring/strchr/

strlen /*Get string length*/
http://www.cplusplus.com/reference/clibrary/cstring/strlen/


strcpy /*Copy characters from string*/
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

strcmp /*Compare two strings*/
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

memset /*Fill block of memory*/
http://www.cplusplus.com/reference/clibrary/cstring/memset/
ex.


char buf[2046];
memset(buf, 0, sizeof(buf));


strcat /* 把第二個參數字串的接到第一個參數的字串後面,然後回傳第一個參數 */
http://www.cplusplus.com/reference/clibrary/cstring/strcat/

2009年12月7日 星期一

開工! 紀錄幾個工作會用到的軟體

今天裝了幾個軟體,都是工作需要的。先記錄下來之後在陸續補上操作以及找到的教學

1.source insight 3.5
http://www.wretch.cc/blog/hidex/8117748 (Source Insight - Trace Code的神兵利器)
http://huenlil.pixnet.net/blog/post/23271746 (Source Insight 教學) -> 有幾個小技巧

2.MKS Source Integrity (原始碼管理工具)+ExamDiff

3.Symantec ProComm Plus (終端機模擬程式)

4.Notepad++  (我認為比Ultraedit還好用的東西)
http://como0925.pixnet.net/blog/post/25256341
http://blog.udn.com/svetamechty/1597739
http://coz.tw/dz6/thread-10323-1-1.html

5.NAS (窮人的網路儲存架構)
http://ithelp.ithome.com.tw/question/10008373

6.TCC LE9.0  (DOS 命令工具 )
http://abin.twidv.com/2008/10/dos-tcc-le.html
(前身:4NT /*Windows命令提示字元cmd.exe的增強版 但這要$*/ http://www.ithome.com.tw/itadm/article.php?c=42856)
ps. 簡而言之 4NT之後會變身為 Free 的 TCC LE

7.SNMPc以及MG-SOFT
皆為MIB BROWSER
SNMPc  http://www.digimall.tw/goods-228.html
MG-SOFT http://www.mg-soft.com/mgMibBrowserPE.html

8.Wireshark
其實也就是Ethereal,藉由此軟體我們可以抓取資料封包,進一步分析封包內的摘要及詳細資訊
官方網站:http://www.wireshark.org/
安裝以及詳細操作說明範例:http://blog.shaolin.tw/2008/03/wireshark.html (作者:shaolin)

9.WinMerge 新舊檔案的比對軟體
改版程式的時候拿來比較的軟體。WinMerge採開放式原始碼方式,而且有個功能可以一次比對整個資料夾檔案的差異,對RD而言相當有用的一個軟體

官方載點:http://winmerge.org/downloads/index.php#current
基礎使用教學:http://aher.pixnet.net/blog/post/13171937



10.Smartbit
測網路設備經典超強測試機器,需要配合多種GUI軟體來做操控
常見的有Smart Flow、Smart Application、Smart Window .....etc
這可以寫篇教學了,待我更熟點之後補上