2009年3月22日 星期日

如何在vim支援doxygen彩色語法

若在vim中, 可以支援doxygen的 彩色語法, 一定可以大大增加可讀性
沒想到, 這是真的, 這下子在註解時, 更可以把doxygen發揮到極限

其實步驟非常簡單:
  1. 於home directory下, 建立.vim/after/syntax的目錄
  2. 下載doxygen.zip (v1.15)
  3. 解壓縮上述檔案, 將doxygen.vim & doxygen.txt複製至~/.vim/after/syntax
  4. 針對每一個想到支援doxygen syntax coloring的檔案類型, 建立soft link
$> cd ~/.vim/after/syntax
ln -s doxygen.vim c.vim
ln -s doxygen.vim cpp.vim
ln -s doxygen.vim java.vim

參考來源:
Doxygen syntax coloring in vim

2009年3月14日 星期六

What is Twitter??

Twitter是在中山大學學分班課程中, 黃慶祥教授提及的名詞,
只是想不到全班30來人的資訊人, 知道這個名詞的人竟是小熊兩三隻,
想當然爾我是隻小狗, 而不是小熊!!

查了一下譯典通, Twitter = 吱吱喳喳 = 三姑六婆 = 閒話家常

google search 該字詞, 文字解釋不少, 但我喜歡以下這段影片以生動的情境描述,
Twitter可以在你我的日常生活中, 扮演著什麼樣的功能角色??







影片中, 一開場就說了句很關鍵的話, "What are you doing?" (你在做什麼呢??)
在日常生活中, 只是一句很直覺的關心語句, 但在網路上卻無法很直覺地回答朋友們,
又或者是, 想輕鬆簡單地分享一則資訊, 例如"今日的天空很湛藍",
也許有人會說, 透過e-mail、blog、msn...等等, 但這會不會太小題大作了呢??
我收e-mail最不喜愛看到一些無關要緊的信件,
而blog也不希望記錄下這毫無參考價值的訊息,
在msn要告訴大家, 就得一個一個開啟視窗, 一個一個地訊息傳送..
哇..這麼簡單的小事, 卻要歷經這麼繁瑣的過程, 這會不會本末倒置了!!

Twitter就是可以讓你輕易分享你的生活小事給周遭的朋友知道,
在一個頁面上, 就可以分享交流彼此朋友的生活點滴, 而且每則消息不超過140個字,
例如"我在高雄明誠星巴克享受午后咖啡時光", 透過Twitter分享,
你的朋友隨即可以知悉你最新的動態、心情、作息,
或許他也正巧在左營附近, 就可以順道前往與你共享一杯咖啡的悠閑時光

參考資料

2009年3月13日 星期五

How to format date and time by using C lib

在Linux中, 如何有效快速地格式化時間為字串格式呢??
原來有個系統函式可以簡易地達到這樣的目的,

size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);

s : 存放日期時間轉換為字串格式的buffer
max : 上述s的最大長度
format : 格式化符號
tm : 日期時間結構

example:

int main () {
char msg[256];
time_t now;
struct tm *timestr;

time (&now);
timestr = localtime (&now);
strftime (msg, sizeof(msg),"%Y%m%d%H%M%S", timestr);
printf ("the datetime is %s \n", msg);
}

則會輸出以下字串
the datetime is 20090315093045


出乎意料地簡單吧!!

2009年3月1日 星期日

TCP TIME_WAIT的釋義

在實務中, 許多情況下, 可能是Server Socket出現了問題, 勢必採取關閉原有的Sever Socket, 再隨即重新啟動新建的Server Socket. 但此刻會發生一個問題, 就是相隔時間過短, 在新建的Sever Socket進行bind()的程序時, 系統會出現一錯誤訊息"the address already in use".

照一般想法, Server Socket都已Close, 理應已釋放出該IP Address之資源, 怎會出現這個令人莫名的訊息呢??

關鍵在於TCP建立於多次的握手協定的基礎上, 以達到保證訊息傳遞的完整性.
由於TPC是全雙工傳輸, 換言之, 雙向的傳輸必須單獨進行關閉, 原則上主動請求關閉的一方A, 藉由發送FIN來請求終止這個方向的連接. 被動關閉的一方B, 收到FIN表示A-->B的方向已無資料進行傳送, 此時B-->A仍是可以進行資料傳送, 待B執行被動關閉.
簡言之, A欲進行關閉傳輸時, 必須通知B並確認, 而B欲進行關閉傳輸時, 也必須通知A並確認.



關閉連線:(如上圖所示)

(1) 當處於ESTABLISHED狀態時, TCP B欲主動關閉連線, 發送FIN至TCP A, 進入到FIN-WAIT-1狀態, 等待TCP A回應ACK, 表示等待確認TCP A得知TCP B要關閉連線

(2) 當TCP A收到TCP B的FIN時, 立即回應ACK給TCP B, 進入到CLOSE-WAIT狀態, 表示須等到應用程序沒有任何資料要傳送給TCP B, TCP A才決定關閉連線

(3) TCP B收到TCP A回應的ACK, 表示確認TCP A得知TCP B要關閉連線, 此刻等待TCP A發送FIN

(4) TCP A決定關閉連線, 發送FIN至TCP B, 進入到LAST-ACK狀態, 等待TCP B回應ACK, 表示等待確認TCP B得知TCP A要關閉連線

(5) TCP B收到TCP A的FIN後, 隨即回應ACK, 進入TIME_WAIT狀態, 表示TCP B得知TCP A要關閉連線, 且等待2MSL時間, 以防TCP A再次發送FIN

(6) TCP A收到TCP B回應的ACK後, 進入CLOSED狀態, 表示TCP A已確認TCP B已得知它要關閉連線, 才進行關閉連線

(7) TCP B等待2MSL時間, 才進入CLOSED狀態, 關閉連線, 並自連線表中移除

在上述的第(5),(7)點, 此刻TIME-WAIT的用意在於, 雖TCP B已確認TCP A要關閉連線, 且回應了ACK給TCP A, 但不保證TCP A會收到ACK, 一旦ACK遺漏, TCP A會再次發送FIN給TCP B, 再次進行確認, 所以TCP B須進入TIME-WAIT狀態, 等待2MSL時間, 預防TCP A會再次發送FIN, 進行連線關閉的確認


different states of a TCP connection:
LISTEN : awaiting a connection request from client (監聽客戶端的連線請求)
SYN-SENT : a SYN has been sent to server, and client is awaiting the ACK of SYN (發送SYN, 並等待服務端回應SYN的ACK)
SYN-RECEIVED : a SYN has been received from client, a SYN with ACK has been sent to client, and server is awaiting the ACK of SYN (接收客戶端的SYN, 另傳送SYN+ACK(SYN)給客戶端, 並等待客戶端回應SYN的ACK)
ESTABLISHED : the three-way handshake has been completed, and established the connection (完成握手協定, 並建立連線)
FIN-WAIT-1 : the local AP has issued a close. active TCP has sent a FIN to passive TCP, and is awaiting an ACK of FIN (主動端發出FIN至被動端, 並等待被動端回應FIN的ACK)
FIN-WAIT-2 : a previous FIN has been sent to passiveTCP, and received an ACK of FIN from passive TCP. active TCP is awaiting a FIN from the passive TCP (成功接收到先前傳送至被動端FIN的ACK, 此刻等待被動端傳送FIN)
CLOSE-WAIT : passive TCP has received a FIN from active TCP, and has sent an ACK of FIN to active TCP. passive TCP is awaiting a close request from remote AP before sending a FIN (被動端已接收主動端的FIN, 並傳送FIN的ACK至主動端, 此刻等待AP要求關閉連線)
LAST-ACK : previously a FIN has been received from active TCP, and an ACK of FIN has been sent to active TCP, and a FIN has been sent to active TCP. passive TCP is awaiting an ACK of FIN (先前收到主動端的FIN, 且傳送FIN的ACK給主動端, 另被動端傳送FIN給主動端, 此刻被動端等待主動端回應FIN的ACK)
TIME-WAIT : FINs have been received and ACK has been sent passive TCP. active TCP is waiting 2MSLs to remove the connection from the connection table (收到被動端的FIN, 並傳送ACK至被動端, 此刻主動端會等待2MSL的時間才將連線關閉)
CLOSED : a connection has been removed from the connection table (連線不存在於連線表)

參考資料:
Transmission Control Protocol
TCP State Diagram
TCP Connection Termination
Socket FAQ -- 2.7 please explain the TIME_WAIT state