2009年12月19日 星期六

Tutorial for DHCP Ptotocol

(TCP/IP 網路教學)

http://www.pcnet.idv.tw/

(DHCP 協定)
http://www.pcnet.idv.tw/pcnet/network/network_ip_dhcp.htm

2009年12月15日 星期二

Cross-Browser Web Application testing

(part1)
[ IBM> * developerWorks > * Web development > * Technical library >]
(Cross-browser Web application testing made easy)

http://www.ibm.com/developerworks/web/library/wa-crossbrowser/?S_CMP=cn-a-wa&S_TACT=105AGX52


(part2)
[comes from the below link: "http://www.minwt.com/?p=1286"]

http://www.minwt.com/?p=1286

~[PC]網頁設計小幫手免安裝瀏覽器大集合~

...來分享個好東西,先前也曾分享過類似的工具,但像IE的部分,就時常會出現問題,因此xx花一些時間,找到了更優的免安裝瀏覽器,且經xx測試許久後,即時在Win7 也可正常用的啟用IE6等版本,雖然它很方便,但建議各位,拿來作測試用就好,穩定度當然還是安裝版會比較優些,所以有這些免安裝版後,讓電腦不用再裝一大堆的瀏覽器。


(part3)
[Browsershots makes screenshots of your web design in different browsers]

http://browsershots.org/

Browsershots makes screenshots of your web design in different browsers. It is a free open-source online service created by Johann C. Rocholl. When you submit your web address, it will be added to the job queue. A number of distributed computers will open your website in their browser. Then they will make screenshots and upload them to the central server here.

2009年12月5日 星期六

Tutorial for XML

(MSDN, Data Developer Center -> Learn -> XML)
http://msdn.microsoft.com/en-us/data/bb190600.aspx

2009年12月3日 星期四

Tutorial for AJAX

Asynchronous JavaScript + XML(Ajax)無疑是 2006 年最熱門的技術術語,且有望在 2007 得到進一步發展。但是對您的應用程式來說它究竟有什麼意義呢?Ajax 應用程式中哪一種常見架構模式應用最廣泛呢?本文將介紹五種常見 Ajax 設計模式,可以使用它們作為工作的基礎。

的確,Ajax 是 Web 2.0 熱門術語,所有人都希望將其應用於自己的站點。但是它對我們究竟有什麼意義?工程師該如何在架構的層面上將其集成到自己的站點中?在這篇文章中,我將介紹 Ajax 的基本知識,並展示一些已經成為 Web 2.0 開發最佳實踐的 Ajax 設計模式。

首先,Ajax 僅僅是一個涉及一組技術的術語,包括 Dynamic HTML(DHTML)和 XMLHTTPRequest 對象。DHTML 由三個元素組合而成,它們分別是超文本標記語言(Hypertext Markup Language,HTML)、JavaScript 代碼和級聯樣式表(Cascading Style Sheet,CSS)。在 Web 頁面使用 JavaScript 代碼,可以動態地改變頁面,包括添加、刪除或更改頁面內容。這就是 DHTML 的動態 部分。JavaScript 代碼使用 XMLHTTPRequest 物件在載入頁面後向伺服器請求資料。

這兩種元素的組合 —— 從伺服器動態請求資料然後使用這些資料更改頁面 —— 就是 Ajax 的本質,也是 Web 2.0 站點的動態特性。

在一般的 Web 應用程式中,用戶填寫表單字段並單擊 Submit 按鈕。然後整個表單發送到伺服器,伺服器將它轉發給處理表單的腳本(通常是 PHP 或 Java,也可能是 CGI 進程或者類似的東西),腳本執行完成後再發送回全新的頁面。該頁面可能是帶有已經填充某些資料的新表單的 HTML,也可能是確認頁面,或者是具有根據原來表單中輸入資料選擇的某些選項的頁面。當然,在伺服器上的腳本或程式處理和返回新表單時用戶必須等待。屏幕變成一片空白,等到伺服器返回資料後再重新繪製。這就是交互性差的原因,用戶得不到立即回饋,因此感覺不同于桌面應用程式。

Ajax 基本上就是把 JavaScript 技術和 XMLHttpRequest 物件放在 Web 表單和伺服器之間。當用戶填寫表單時,資料發送給一些 JavaScript 代碼而不是直接發送給伺服器。

接著, JavaScript 代碼捕獲表單數據並向伺服器發送請求。同時用戶螢幕上的表單也不會閃爍、消失或延遲。換句話說,JavaScript 代碼在幕後發送請求,用戶甚至不知道請求的發出。
更好的是,請求是非同步發送的,就是說 JavaScript 代碼(和用戶)不用等待伺服器的回應。因此用戶可以繼續輸入資料、滾動螢幕和使用應用程式。

然後,伺服器 將資料返回 JavaScript 代碼(仍然在 Web 表單中),後者決定如何處理這些資料。它可以迅速更新表單數據,讓人感覺應用程式是立即完成的,表單沒有提交或刷新而用戶得到了新資料。 JavaScript 代碼甚至可以對收到的資料執行某種計算,再發送另一個請求,完全不需要用戶干預!這就是 XMLHttpRequest 的強大之處。它可以根據需要自行與伺服器進行交互,用戶甚至可以完全不知道幕後發生的一切。結果就是類似于桌面應用程式的動態、快速回應、高交互性的體驗,但是背後又擁有互聯網的全部強大力量。



(JavaScript 入門)
http://web.nchu.edu.tw/~jlu/classes/www/examples/javascript/javascript.html



(JAVASCRIPT 線上教學)
http://wellsli.com/htm/js/index.htm



(AJAX 入門)
http://web.nchu.edu.tw/~jlu/classes/xml/ajax/ajax.shtml



(AJAX 上手篇)
http://wiki.moztw.org/index.php/AJAX_上手篇


(Ajax)
https://developer.mozilla.org/en/AJAX



(AJAX 上手篇, 英文版)
https://developer.mozilla.org/en/AJAX/Getting_Started



(Using XMLHttpRequest)
https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest



(jQuery Ajax)
http://webdesign.piipo.com/jquery/jquery_ajax


(AJAX 教學大合集)
http://chiahu.com/blog/?p=220


(42 Recent AJAX Tutorials)
http://www.maxkiesler.com/2006/07/04/42-recent-ajax-tutorials/


(AJAX 上手篇)
http://wiki.moztw.org/index.php/AJAX_%E4%B8%8A%E6%89%8B%E7%AF%87


(Ajax內部交流文檔)
http://www.dragonson.com/doc/ajax.html


(非常重要的參考來源: Ajax 技術資源中心)
http://www-128.ibm.com/developerworks/cn/xml/ajax/


(非常重要的參考來源: Ajax 資源中心, IBM/中國)
http://www.ibm.com/developerworks/cn/ajax/newto.html?S_TACT=105AGX52&S_CMP=content#N102BF


(非常重要的參考來源: 掌握 Ajax 系列, IBM/中國)
http://www.ibm.com/developerworks/cn/web/wa-ajaxintro/


AJAX深度歷險1(Getting Started)
http://blog.xuite.net/jameschih/ ... mp;p=1&w=262779


Ajax內部交流文檔
http://www.dragonson.com/doc/ajax.html


Ajax 技術資源中心
http://www-128.ibm.com/developerworks/cn/xml/ajax/


AJAX - Asynchronous Javascript And Xml
http://www.xul.fr/en-xml-ajax.html


(AJAX - Asynchronous javascript And Xml)

http://www.xul.fr/en-xml-ajax.html
http://www.maxkiesler.com/2006/07/04/42-recent-ajax-tutorials/


================================================
AJAX 算是一種技術,技術攙雜愈多只會讓網頁愈來愈複雜。
入門是瞭解 AJAX 的運作原理用,事實上,在開發時,建議挑選一種 AJAX framework (用 google 搜一下)開發。
這類 AJAX framework 大都幫你做好跨 browser 工作,否則自己寫可能要寫死。

Web 2.0 一瞥?!

(資料參考, 來自於: "http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/", 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 發出非同步請求, [IBM/中國])


在深入研究代碼之前, 首先看看最近的觀點 —— 務必要十分清楚 Web 2.0 這個概念。

聽到 Web 2.0 這個詞的時候,應該首先問一問 “Web 1.0 是什麼?” 雖然很少聽人提到 Web 1.0,實際上它指的就是具有完全不同的請求和回應模型的傳統 Web。比如,到 Amazon.com 網站上點擊一個按鈕或者輸入搜索項。就會對伺服器發送一個請求,然後回應再返回到流覽器。該請求不僅僅是圖書和書目列表,而是另一個完整的 HTML 頁面。因此當 Web 流覽器用新的 HTML 頁面重繪時,可能會看到閃爍或抖動。事實上,通過看到的每個新頁面可以清晰地看到請求和回應。

Web 2.0(在很大程度上)消除了這種看得見的往復交互。比如訪問 Google Maps 或 Flickr 這樣的站點(到這些支持 Web 2.0 和 Ajax 站點的鏈結請參閱 參考資料)。比如在 Google Maps 上,您可以拖動地圖,放大和縮小,只有很少的重繪操作。當然這裏仍然有請求和回應,只不過都藏到了幕後。作為用戶,體驗更加舒適,感覺很像桌面應用程式。這種新的感受和範型就是當有人提到 Web 2.0 時您所體會到的。

需要關心的是如何使這些新的交互成為可能。顯然,仍然需要發出請求和接收回應,但正是針對每次請求/回應交互的 HTML 重繪造成了緩慢、笨拙的 Web 交互的感受。因此很清楚,我們需要一種方法使發送的請求和接收的回應只 包含需要的資料而不是整個 HTML 頁面。惟一需要獲得整個新 HTML 頁面的時候就是希望用戶看到 新頁面的時候。

但多數交互都是在已有頁面上增加細節、修改主體文本或者覆蓋原有資料。這些情況下,Ajax 和 Web 2.0 方法允許在不 更新整個 HTML 頁面的情況下發送和接收資料。對於那些經常上網的人,這種能力可以讓您的應用程式感覺更快、回應更及時,讓他們不時地光顧您的網站。

隨著 Web 2.0 浪潮的到來,用戶體驗得到了全新的關注。用戶體驗的一部分就是以新穎的方式與用戶交互以及為用戶提供資訊。這些新的介面常常被稱作小部件,它們使用 Asynchronous JavaScript + XML (Ajax) 與伺服器通信。
Web 2.0 強調以獨特、新穎的方式與網站的客戶交互。其中很多創新技術都使用圖形和小部件,它們與伺服器進行通信,獲取用於顯示網頁的資料(ex, 圖檔, 數值..)更新。

2009年12月1日 星期二

[Programming C] bit field/ bit-accessing

之前使用過CC5X,裡頭有一個功能非常好用,就是可以針對記憶體(RAM)的位元個別設定,例如
char a
a.0=1; //設定變數a的bit0為1
也可以個別做位元判斷,例如
if(a.0==1)
.....

這對MCU有限的RAM可以有效的利用,但到了MPLAB C18 C Compiler卻無法直接這樣使用,經筆者測試可以透過宣告的方式來使用,例如:





1 typedef struct char
2 {
3 unsigned bit0:1;
4 unsigned bit1:1;
5 unsigned bit2:1;
6 unsigned bit3:1;
7 unsigned bit4:1;
8 unsigned bit5:1;
9 unsigned bit6:1;
10 unsigned bit7:1;
11 }uns8_bits;
12
13 union
14 {
15 uns8_bits t_temp;
16 char char_t_temp;
17 }union_flag;
18
19
20 #define bit_12_pm union_flag.t_temp.bit0
21 #define bit_1sec_action union_flag.t_temp.bit1
22 #define bit_count_sec_begin union_flag.t_temp.bit2



1~11 為結構宣告,並令uns8_bits為新的資料型態
13~17 為共用空間的使用,目的是讓uns8_bits資料型態宣告的資料變數,能與char資料型態其他變數做資料的交換,例如
char a;
a=1;
union_flag.char_t_temp = a; //相當於 union_flag.t_temp.bit0=1 或者 bit_12_pm=1;
20~22 為了簡化輸入一長串英文字母的麻煩,又可讓整個程式看起來簡單明瞭有意義

以上為使用bit的相關設定,希望對各位有幫助!!

////////////////////////////////////
[結構化的資料型態二]

位元欄(Bit Field)是C語言中一個很特別資料型態

2.位元欄


位元欄(Bit Field)是C語言中一個很特別資料型態 ,在很多他之前的語言都沒有,之後的則有抄襲這一個型態的。使用位元欄有很多好處,一、可以節省記憶體空間,布林運算值直接取用,相類似的資料放在同一組字(Word)中,不用一一佔不同字的空間。二、與硬體觀念中的旗標可以輕鬆配合使用。三、有益於與系統硬體,與周邊硬體直接做暫存器位元的傳輸與指定。

好用強大的功能通常都會伴隨著更強大的限制使用與更多的注意事項,底下我們將一一講解位元欄的規則:

位元欄的使用

位元欄是以結構為基礎的資料型態。他的表示方法,在結構元素後面加一個冒號:以及一個正整數的欄位長度。例如下面的範例,我們將看到一個ALU(Arithmetic Logic Unit 計算邏輯處理單元)的相關旗標,每一個旗標都佔一個位元的空間。zero代表某一輸入有零,overflow代表溢位,underflow代表不足位,carryout代表有進位。
struct bitfield
{
unsigned zero:1;
unsigned overflow:1;
unsigned underflow:1;
unsigned carryout:1;
}
位元欄中的資料多半以unsigned型態來宣告,你也可以使用signed或是int的方式來宣告,即使如此一般的編譯器也都換自動將位元欄的資料型態轉換成unsigned的型態。為了程式的相通性,最好還是以unsigned的寫法。
位元欄一樣會佔據適當的記憶體空間,至於佔用的順序,是由表示方法的由上到下,對應到記憶體的高位元到低位元;或者是由低位元到高位元,這必須由系統製造商決定。x86的相容PC與工作站剛好相反。怎麼擺其實不重要,重要的是千萬不要依賴他的順序
位元欄的大小有沒有限制?有的。一般以一個字為限,一般字都是由兩個位元組所構成,共十六位元。
一起宣告的位元欄,並不一定是連續的記憶體空間。當前面的位元欄使用剩的空間不足以放下這一組位元欄,則這一組位元欄會放在下一組字中,而不會讓該位元欄跨越字。
位元欄沒有相對應的指標型態,所以也無法以陣列表示。
位元欄可以與其他型態的資料共同運算,這時位元欄的資料型態會先轉換成整數型態,以整數為基準再作適當調整。
同一結構中,即使有位元欄還是可以有其他的資料型態。

要瞭解一個東西有多好用,就是拿起來用用看就知道。底下我們看一個簡單的例子,這一個程式模擬兩個數做加法的動作(參看邏輯設計與Verilog寫作手冊)。

/*
Bitwise addition . Action as 8-bits a ripple adder
bitadd.c
*/
#include

#include

main()
{
int i, j, k;
struct unit
{
unsigned a0:1;
unsigned a1:1;
unsigned a2:1;
unsigned a3:1;
unsigned a4:1;
unsigned a5:1;
unsigned a6:1;
unsigned a7:1;
}input1, input2, sum;
printf ("Please input addend and augend ranged from 1 ~ 255\n");
printf ("First, input addend = ");
scanf ("%d", &i);
while(i<0> pow(2.0, 8.0))
{
printf ("Wrong input value range. Again, input addend = ");
scanf ("%d", &i);
}

input1.a0=i%2;k=(i-input1.a0)/2;
input1.a1=k%2;k=(k-input1.a1)/2;
input1.a2=k%2;k=(k-input1.a2)/2;
input1.a3=k%2;k=(k-input1.a3)/2;
input1.a4=k%2;k=(k-input1.a4)/2;
input1.a5=k%2;k=(k-input1.a5)/2;
input1.a6=k%2;k=(k-input1.a6)/2;
input1.a7=k%2;k=(k-input1.a7)/2;
printf("%3d --> %d%d%d%d%d%d%d%d\n", i, input1.a7, input1.a6, input1.a5 \
, input1.a4, input1.a3, input1.a2, input1.a1, input1.a0);
j=i;
printf ("Second, input augend = ");
scanf ("%d", &i);
while(i<0> pow(2.0, 8.0))
{
printf ("Wrong input value range. Again, input addend = ");
scanf ("%d", &i);
}

input2.a0=i%2;k=(i-input2.a0)/2;
input2.a1=k%2;k=(k-input2.a1)/2;
input2.a2=k%2;k=(k-input2.a2)/2;
input2.a3=k%2;k=(k-input2.a3)/2;
input2.a4=k%2;k=(k-input2.a4)/2;
input2.a5=k%2;k=(k-input2.a5)/2;
input2.a6=k%2;k=(k-input2.a6)/2;
input2.a7=k%2;k=(k-input2.a7)/2;
printf("%3d --> %d%d%d%d%d%d%d%d\n", i, input2.a7, input2.a6, input2.a5 \
, input2.a4, input2.a3, input2.a2, input2.a1, input2.a0);
/* addition */
sum.a0=input1.a0^input2.a0^0;k=input1.a0&input2.a0;
sum.a1=input1.a1^input2.a1^k;k=(input1.a1&input2.a1)|(k&input1.a1)|(k&input2.a1);
sum.a2=input1.a2^input2.a2^k;k=(input1.a2&input2.a2)|(k&input1.a2)|(k&input2.a2);
sum.a3=input1.a3^input2.a3^k;k=(input1.a3&input2.a3)|(k&input1.a3)|(k&input2.a3);
sum.a4=input1.a4^input2.a4^k;k=(input1.a4&input2.a4)|(k&input1.a4)|(k&input2.a4);
sum.a5=input1.a5^input2.a5^k;k=(input1.a5&input2.a5)|(k&input1.a5)|(k&input2.a5);
sum.a6=input1.a6^input2.a6^k;k=(input1.a6&input2.a6)|(k&input1.a6)|(k&input2.a6);
sum.a7=input1.a7^input2.a7^k;k=(input1.a7&input2.a7)|(k&input1.a7)|(k&input2.a7);
printf("%3d --> %d%d%d%d%d%d%d%d\tcarry =%d\n", i+j, sum.a7, sum.a6, sum.a5\
, sum.a4, sum.a3, sum.a2, sum.a1, sum.a0, k);

}

程式執行結果如下
Please input addend and augend ranged from 1 ~ 255
First, input addend = 127
127 --> 01111111
Second, input augend = 100
100 --> 01100100
227 --> 11100011 carry =0
Please input addend and augend ranged from 1 ~ 255
First, input addend = 200
200 --> 11001000
Second, input augend = 223
223 --> 11011111
423 --> 10100111 carry =1


3.共用


共用(Union)型態可以讓多種不同型態的變數共用同樣的記憶體空間。使用方法如下
union name
{
datatype name1;
....
datatype namen;
}
n個元素共用同樣的記憶體空間,記憶體空間的大小由佔空間最大的資料型態決定。他的型態與結構相同,所以結構有的他都有。他有:一、有指標。二、每一個元素都可以使用,但是同一時間只有一個是有效的。三、共用型態內的資料型態,每一種你學過的都可以用。

底下來一個例子看看,怎樣利用這一個結構來取出字元的二進位值。
/*
transfer the char to binary form
union.c
*/
#include
#include

main()
{
char c;
struct unit
{
unsigned a0:1;
unsigned a1:1;
unsigned a2:1;
unsigned a3:1;
unsigned a4:1;
unsigned a5:1;
unsigned a6:1;
unsigned a7:1;
};

union bits
{
char word;
struct unit bit;
}digit;

printf ("Please input a character = ");
c= getchar();
while(!isalpha(c))
{
fflush(stdin); /* clean Standard input buffer */
printf ("Wrong input value range. Again, character = ");
c=getchar();
}
digit.word=c;
printf("\n%c=%3d --> %d%d%d%d%d%d%d%d\n", c, c,digit.bit.a7, digit.bit.a6,\
digit.bit.a5, digit.bit.a4, digit.bit.a3, digit.bit.a2, \
digit.bit.a1, digit.bit.a0);

}

程式執行結果如下
Wrong input value range. Again, character = 9
Wrong input value range. Again, character = 0
Wrong input value range. Again, character = =
Wrong input value range. Again, character = -
Wrong input value range. Again, character = f
f=102 --> 01100110



////////////////////////////////////

[How to initial bit-field for the data-type declaration..]
Especially checking for color[8] array

struct
{
unsigned char red :1;
unsigned char orange :1;
unsigned char yellow :1;
unsigned char green :1;
unsigned char blue :1;
unsigned char violett :1;
}color[8]={
1,0,1,0,1,0,
0,1,0,1,0,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
1,1,1,1,1,1,
};
//***************************************************************************
int main (void)
{
//***************************************************************************
unsigned int i;
PLL_init();
RS232_init(115200);
printf("Bitfield array in C\n");
for(i=0;i<8;i++)
{
color[i].orange = ~color[i].red;//"~" or "!" which i correct?
color[i].yellow = !color[i].red;
}
for(i=0;i<8;i++)
{
printf("%u ",color[i].red);
printf("%u ",color[i].orange);
printf("%u ",color[i].yellow);
printf("%u ",color[i].green);
printf("%u ",color[i].blue);
printf("%u ",color[i].violett);
printf("\n");
}
while(1){}
}



////////////////////////////////////

Take the Dev-C++ (Win32Intel) compiler do the following testing..

Herewith the below whole code in "main.C":

===========================
#include
#include

#define FALSE 0
#define TRUE 1

typedef struct
{
unsigned char : 7;
unsigned char bIsDataChange: 1;
} _MY_APP_NET_DATA_FLAG;


typedef struct
{
unsigned char : 4;
unsigned char bIsEEPROM: 1;
unsigned char bIsState: 1;
unsigned char bIsNumeric: 1;
unsigned char bIsStringBuf: 1;
} _MY_APP_NET_DATA_TYPE;


_MY_APP_NET_DATA_TYPE MyAppNetValueType[3] = {
{0, 1, 0, 0}, //0: EEPROM/x, IsState/v, IsNumeric/x, IsStringBuf/x
{1, 1, 0, 0}, //1: EEPROM/v, IsState/v, IsNumeric/x, IsStringBuf/x
{1, 0, 0, 1} //2: EEPROM/v, IsState/x, IsNumeric/x, IsStringBuf/v
}
;


int main(int argc, char *argv[])
{

printf("MyAppNetValueType[0]: %d (%c) \r\n", MyAppNetValueType[0], MyAppNetValueType[0]);
printf("MyAppNetValueType[1]: %d (%c) \r\n", MyAppNetValueType[1], MyAppNetValueType[1]);
printf("MyAppNetValueType[2]: %d (%c) \r\n", MyAppNetValueType[2], MyAppNetValueType[2]);

if(1 == MyAppNetValueType[1].bIsState)
printf("MyAppNetValueType[1] has state-type \r\n");


if(FALSE == MyAppNetValueType[2].bIsState)
printf("MyAppNetValueType[2] has no state-type \r\n");



system("PAUSE");
return 0;
}
===========================

(that's ALL)
////////////////////////////////////