顯示具有 programming 標籤的文章。 顯示所有文章
顯示具有 programming 標籤的文章。 顯示所有文章

8月 12, 2013

Visual Studio 顏色配置主題

蠻酷的網站:Studio Styles,供 Visual Studio 使用的環境配色檔。
" Create and share Visual Studio color schemes "
下載現成的環境設定檔(.vssettings)後執行「匯入和匯出設定」

五分鐘內處理好配色問題,再搭配上 Consolas 字型,一整個棒。

7月 29, 2011

XML XQuery DOM

[ XML, eXtensible Markup Language ]

一個容易理解閱讀,同時也能讓電腦進行解析辨識的語言。

整個XML文件可以視為一個樹狀結構的文件,文件實體(document entity)視為根節點
加上其他的宣告與標籤稱之為此XML文件的物質結構(Physical Structures),其中須
注意其根節點與根標籤是不同的。

XML的前身是SGML,但是SGML是一種非常嚴謹的檔案描述法,導致過於龐大複雜,
難以理解和學習,進而影響其推廣與應用。

專家們使用SGML精簡製作,並依照HTML的發展經驗,產生出一套使用上規則嚴謹,
但是簡單的描述資料語言:XML

XML被廣泛用來作為跨平台之間互動數據的形式,主要針對數據的內容。
XML設計用來傳送及攜帶資料資訊,不用來表現或展示資料,HTML語言則用來表現資料,
所以XML用途的焦點是它說明資料是什麼,以及攜帶資料資訊。

[ XHTML, eXtensible HyperText Markup Language ]

表現方式與超本文標記語言(HTML)類似,不過語法上更加嚴格。
HTML語法要求比較鬆散,這樣對網頁編寫者較方便,但對於機器來說,語言的語
法越鬆散,處理起來就越困難。

XHTML是一個基於XML的置標語言,看起來與HTML有些相象,本質上說,
XHTML是一個過渡技術,結合了XML(有幾分)的強大功能及HTML(大多數)的簡單特性。
XHTML 就是一種XML應用。它採用XML的DTD文件格式定義


當XML越來越成為一種趨勢,就出現了這樣一個問題:
「如果我們有了XML,我們是否依然需要HTML?」

結論是:需要。因為大量的人們已經習慣使用HTML來作為他們的設計語言。
而 XHTML是一種為適應XML而重新改造的HTML。

XHTML 解決HTML語言所存在的嚴重制約其發展的問題:
HTML 發展到今天存在三個主要缺點:
1. 不能適應現下越多的網路設備和應用的需要,比如手機、PDA。
2. 由於HTML代碼不規範,瀏覽器需要足夠智能和龐大才能夠正確顯示。
3. 數據與表現混雜,這樣你的頁面要改變顯示,就必須重新製作HTML

XHTML的優點是,嚴謹:
當前網路上的 HTML 的糟糕情況讓人震驚,早期的瀏覽器接受私有的HTML標籤,
所以人們在頁面設計完畢后必須使用各種瀏覽器來檢測頁面,看是否兼容。



[ XML DOM , Document Object Models ]

XML DOM 是用於獲取、更改、添加或刪除 XML 元素的標準。
DOM 讓您以程式設計方式讀取、操作和修改 XML 文件。
XML 文檔中的每個成分都是一個節點。

[XQuery]

XQuery 相對於 XML,等同於 SQL 相對於數據庫。XQuery 被設計用來查詢 XML 數據。
XQuery 是用來從 XML 文件找尋、提取元素及屬性的語言。

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

doc("books.xml") ... 用於打開 "books.xml" 文件

XQuery 使用 XPath 來選取 XML 文檔中的節點或節點集。

下面的路徑表達式用於在 "books.xml" 文件中選取所有的 title 元素:
doc("books.xml")/bookstore/book/title ,執行結果:

<title lang="en">Everyday Italian</title>
<title lang="en">Learning XML</title>

在 XQuery 中提供了 FLWOR 語法,讓查詢功能更強大

FLWOR 是 "For, Let, Where, Order by, Return" 字母縮寫。

for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title

for 語句把 bookstore 元素下的所有 book 元素提取到名為 $x 的變量中。
where 語句選取了 price 元素值大於 30 的 book 元素。
order by 語句定義了排序次序。將根據 title 元素進行排序。
return 語句規定返回什麼內容。在此返回的是 title 元素。
let 針對特定反覆運算的給定變數指派值 (此例中未用到)

6月 16, 2011

XML XQuery DOM

[ XML, eXtensible Markup Language ]

一個容易理解閱讀,同時也能讓電腦進行解析辨識的語言。

整個XML文件可以視為一個樹狀結構的文件,文件實體(document entity)視為根節點
加上其他的宣告與標籤稱之為此XML文件的物質結構(Physical Structures),其中須
注意其根節點與根標籤是不同的。

XML的前身是SGML,但是SGML是一種非常嚴謹的檔案描述法,導致過於龐大複雜,
難以理解和學習,進而影響其推廣與應用。

專家們使用SGML精簡製作,並依照HTML的發展經驗,產生出一套使用上規則嚴謹,
但是簡單的描述資料語言:XML

XML被廣泛用來作為跨平台之間互動數據的形式,主要針對數據的內容。
XML設計用來傳送及攜帶資料資訊,不用來表現或展示資料,HTML語言則用來表現資料,
所以XML用途的焦點是它說明資料是什麼,以及攜帶資料資訊。

[ XHTML, eXtensible HyperText Markup Language ]

表現方式與超本文標記語言(HTML)類似,不過語法上更加嚴格。
HTML語法要求比較鬆散,這樣對網頁編寫者較方便,但對於機器來說,語言的語
法越鬆散,處理起來就越困難。

XHTML是一個基於XML的置標語言,看起來與HTML有些相象,本質上說,
XHTML是一個過渡技術,結合了XML(有幾分)的強大功能及HTML(大多數)的簡單特性。
XHTML 就是一種XML應用。它採用XML的DTD文件格式定義

當XML越來越成為一種趨勢,就出現了這樣一個問題:
「如果我們有了XML,我們是否依然需要HTML?」

結論是:需要。因為大量的人們已經習慣使用HTML來作為他們的設計語言。
而 XHTML是一種為適應XML而重新改造的HTML。

XHTML 解決HTML語言所存在的嚴重制約其發展的問題:
HTML 發展到今天存在三個主要缺點:
1. 不能適應現下越多的網路設備和應用的需要,比如手機、PDA。
2. 由於HTML代碼不規範,瀏覽器需要足夠智能和龐大才能夠正確顯示。
3. 數據與表現混雜,這樣你的頁面要改變顯示,就必須重新製作HTML

XHTML的優點是,嚴謹:
當前網路上的 HTML 的糟糕情況讓人震驚,早期的瀏覽器接受私有的HTML標籤,
所以人們在頁面設計完畢后必須使用各種瀏覽器來檢測頁面,看是否兼容。

[ XML DOM , Document Object Models ]

XML DOM 是用於獲取、更改、添加或刪除 XML 元素的標準。
DOM 讓您以程式設計方式讀取、操作和修改 XML 文件。
XML 文檔中的每個成分都是一個節點。

[XQuery]

XQuery 相對於 XML,等同於 SQL 相對於數據庫。XQuery 被設計用來查詢 XML 數據。
XQuery 是用來從 XML 文件找尋、提取元素及屬性的語言。

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

doc("books.xml") ... 用於打開 "books.xml" 文件

XQuery 使用 XPath 來選取 XML 文檔中的節點或節點集。

下面的路徑表達式用於在 "books.xml" 文件中選取所有的 title 元素:
doc("books.xml")/bookstore/book/title ,執行結果:

<title lang="en">Everyday Italian</title>
<title lang="en">Learning XML</title>

在 XQuery 中提供了 FLWOR 語法,讓查詢功能更強大

FLWOR 是 "For, Let, Where, Order by, Return" 字母縮寫。

for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title

for 語句把 bookstore 元素下的所有 book 元素提取到名為 $x 的變量中。
where 語句選取了 price 元素值大於 30 的 book 元素。
order by 語句定義了排序次序。將根據 title 元素進行排序。
return 語句規定返回什麼內容。在此返回的是 title 元素。
let 針對特定反覆運算的給定變數指派值 (此例中未用到)

好的程式語言評量指標

1. 可讀性:容易閱讀了解

2. 可寫性:容易建立程式

3. 可靠性:語言設計能讓使用者不易犯錯,即使犯錯也容易找出

4. 成本:學習成本、撰寫成本、編譯成本、執行程本、維護成本

4月 02, 2011

FTP 協定介紹

FTP 的連線模式分兩種:主動模式(Active mode) 與 被動模式(Passive mode)

[主動模式] Client 這邊開個 port 之後 Server 要主動連過來

Client 與 Server 連線後,Client 會主動利用 PORT 這個指令來告訴
Server ,未來 Data Channel 請你連線到我這個 port 這邊

指令: PORT 69,171,224,13,17,35 (17*256+35=4387)
回應: 200 Port command successful.

在這邊,Client 告訴 Server:
將來若是你有資料(像是檔案列表)要送給我,那麼就送 port: 17*256 + 35 這邊。所以 Server 會主動利用 Server 主機的 Port 20 發出連線到 FTP Client 的主機

C:4386 ----myPort:17*256+35----> S:21
C:4387 <--真正有 Data 要送來---- S:20

[被動模式] 因為 Client 在防火牆內,所以 Server 只能被動等他連過來

如果 Client 在防火牆或者 NAT 下面,那麼Server 的主動連線就會被擋掉
此時就要採用 Passive 被動連線方式:麻煩 Server 額外開一個 port 之後我會連過去

指令: PASV
回應: 227 Entering Passive Mode (173,221,21,38,32,89)

C:X ----你開個 Port 給我,之後會連過去 ----> S:21
C:X <---我會開個 port 在 32*256+89等你 ----- S:21
C:Y ----主動送出 SYN 連線請求--------------> S:8281


note:
(1) 不要再被 port 20 與 21 搞混了,這兩個 port 是 Server 在主動模式用的
(2) 如果是在被動模式下,除了 Server port 21 是確定的之外其他的 port 都是動態指定,並沒有固定要在哪個位置

3月 22, 2011

DHCP 協定

DHCP (Dynamic Host Configuration Protocol)
功能:動態的分配 IP 位址、指定 TCP/IP 的其它參數

[ DHCP 角色 ]

1. DHCP Client:發 DHCP request 取得 IP
2. DHCP Server:收到請求,提供可用 IP
3. Scope:可以用的 IP (想成 IP pool)

[ DHCP 運作原理 ] ... 以下流程全是以廣播完成 (因尚未取得 IP)

1. client 廣播送出 DHCP discovery
2. server 廣播回答 DHCP offer
3. client 收到 offer 後會決定是否採用該 IP (通常 client 會收到很多 offer)
4. client 決定使用之後會廣播 DHCP request 通知 server (順便也通知其他人落選)
5. server 在收到 request 之後,會用 DHCP ACK 來最終確定,如果該 IP 提前
被其他主機搶用,則 server 會回應 NACK

[ DHCP 租約更新 ]

使用 DHCP request 以 unicast 的方式通知 server
當租約超過 1/2 時會進行 Renewal
當租約超過 7/8 時會進行 Rebinding

[ DHCP relay agent ]

如果 DHCP server 與 client 是在不同網段,就要使用到 relay agent
DHCP client <--broadcast--> relay agent <--unicast--> DHCP server

或者 router 願意做 DHCP forwarding,不會把封包擋下來:
client -> Router(DHCP Fw) -> server

[ DHCP snooping ]

為了加強 DHCP 機制,在 switch 上加入功能,當 DHCP server 核發 IP 時
switch 會去確保這個 IP 是由當初提 request 的 client 所使用,
即 IP/MAC 的對應要正確。

1. 記憶主機的 MAC 位址
2. 只允許特色的 DHCP server 被存取
3. 主機只能使用核發的 IP 而不可任意使用其他 IP

**

[ BOOTP ]

Bootstrap Protocol

架構在 UDP/IP 之上的協定,允許一台無磁碟主機,透過網路送出請求,
藉由自己的 MAC 位置查詢對應 IP,並得到開機印象檔(boot file) 進行開機。

RARP 只能在 LAN 裡面運作,而 BOOTP 可以經由 Router 轉送。
BOOTP 使用的 port Server:UDP67 , Client:UDP68

3月 04, 2011

函數型程式語言 (functional language)

函數型程式語言(functional language),主要由函數組成,系統會提供一組基本的函數供使用者呼叫,使用者亦可自行定義所需的函數;在函數中以運算式作為組成單元,而運算式是由各種函數呼叫所構成;程式在執行時,採用順序的方式將運算式依序執行,選擇結構通常是由條件運算函數 (像是 LISP 中的 COND函數) 來執行,而重複結構主要是由條件運算式,配合函數自身的遞迴呼叫所組成。

**

物件導向程式語言,主要是由物件所組成,物件是一種資料抽象化的單元,
其中包含有資料的定義與相關的操作。

每一個物件都有它所屬的類別,而類別間可以繼承,藉由此種關係達成類別階層如此可以讓子類別繼承父類別中所定義的資料和程序,以達到程式碼共享的目的。另外物件導向語言,通常會有動態繫結的功能,在執行時期動態地決定要執行哪段程式碼。

3月 03, 2011

物件導向的特性 (OOP)

如果人家問 OOP 的三大特性,那麼就寫:

1. 資料抽像化 (Data Abstraction)
將要處理的資料及作用在這些資料上的操作方法,封裝在一個語法單元中,例如像:類別(class),以達到資訊隱藏的功能。

2. 繼承(inheritance)
一個新的類別,可以定義為一個現有類別的子類別,這個現有類別稱為父類別,而子類別可以繼承父類別的資料與方法。

使用繼承的好處,父類別的程式碼可以在子類別中重複使用,可以節省開發時間。因為父類別為子類別的一般化,而子類別則是父類別的特殊化。

3. 多型 (動態繫結)
同一個函數呼叫,在執行時期可以繫結到不同的函數定義。

以動態繫結的方式來決定「程序呼叫」與「程序定義」之間的繫結。對於類別中的方法呼叫,與其方法的定義為動態繫結,是在程式執行時才能真正決定要叫用的方法為何。

在 c++ 中可透過「虛擬函數(virtual function)」來達到動態繫結的功能,
父類別的 virtual function 在子類別中重新定義後,則在呼叫虛擬函數時
會依照訊號的接收個體為何,決定執行哪個類別中定義的虛擬函數。
note: 透過繼承與動態繫結,可用來實現物件導向中的多型概念。
4. 抽象資料型態 (ADT,Abstract Data Type)
是使用資料抽象化的方法建立的自訂資料型態

5. 封裝
主要是將物件的內外部份分開,其他物件只能藉由外部界面,取得資料,
物件內部的細節資料則隱藏起來,其他物件無法瞭解此物件的內部細節。

6. 覆載 (Overloading) 屬於靜態繫結,編譯時就會知道
函式覆載是指,相同的函式名稱,但能有不同的函式定義。不過這同名函式,必須具有不同的參數個數,編譯程式才可以此為區分,決定哪一個 overloaded function 才是真正要執行的函數。

7. 覆寫 (Overriding)
子類別將由父類別繼承來的屬性變數、資料結構或方法重新定義的動作。

2月 24, 2011

使用 '==' 和 String.equals() 的不同

當比較兩個字串(String)時,
使用 '==' 運算子和 java.lang.String.equals()這兩個 method有什麼不同呢?

'=='這個運算子會看看這兩個字串的references是不是指向同一個字串object。而 java.lang.String.equals() 這個method則會比較這兩個字串的"值"是不是一樣的。

換句話說,比較這兩個字串是不是有相同的字元序列。
當使用String literals(一串被雙引號括住的字元)時,使用 '=='運算子和使用equals method 的結果會是一樣的。

所有的String literals都是指向同一個String 類別的 instances。
系統中有一個pool,當有新的String literals出現時,系統會先去檢查 pool 之中,是不是已經存在一個和這個新的String literals有相同內容的物件。

如果存在,則會傳回一個指向這個此物件的reference。
若不存在,則會將此String literals放到 pool中,然後傳回這個物件的reference。

舉個例子:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"這個關鍵字所造出來的時候,則不是這麼一回事。

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

傳用"new"這個關鍵字時,會造出兩個不同的物件,所以會有兩個不同的references,即使在底層的string literal是一樣的。
在上面的例子中,'=='運算子傳回false,因為兩個 references 是不同的。
而equals method則傳回true,因為這兩個物件所代表是同樣的字元序列。

2月 13, 2011

c 語言中 #define 與 Preprocessor

#define 的用途:

1. 定義巨集 #define sqr(x) (x)*(x)
2. 定義符號 symbol 例如: #define PI 3.14

所以 #define PI 3.14 與 float PI=3.14 有何不同?

ans:

使用 define 只是定義了一個 symbol 不佔memory 空間
在編譯前,預先處理器(Preprocessor) 先進行處理,將程式碼中出現的 PI
代換成 3.14 後再丟給編譯器進行 compile。

而使用 float 宣告的變數,會佔記憶體空間(4bytes) 其值為 3.14

--

那麼談談 Preprocessor 的用途吧

1. 引入 inclusion file → #include
2. 處理 conditional compilation → #ifdef / #if / #endif ...
3. macro 代換成 code → #define PI 3.14

1月 17, 2011

reference and lvalue

int num [] = {1,2,3,4};
int *ptr = num;
cout << &(ptr++); /* ERROR: & need l-value */
cout << &(++ptr); /* 正確 */
ptr++ 會把 ptr 的原值塞到一個「暫存變數」之後 ptr 的值再往下一格。所以當使用 &(暫存變數) 要取位址就錯了。

++ptr 則是把 ptr 向下移一格後,去取 ptr 變數的位址,所以編譯可以通過。

使用 new 動態建立二維陣列



1. 使用 new 來建立出 data[m][n] 二維陣列
int **data;
data = new int* [m]; /* 宣告一個陣列,其元素都是指標 */
for(int i = 0; i< m ; i++)
data[i] = new int[n];
2. 亂塞一些值(1~100 亂數)到陣列中
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
data[i][j] = 1+ rand() % (100-1+1);
3. 不用時要記得歸還空間
for(i=0; i<m; i++)
delete [] data[i];
delete [] data;

1月 08, 2011

Rhino shell - JavaScript shell

https://developer.mozilla.org/en/Rhino_Shell
The JavaScript shell provides a simple way to run scripts in batch mode or an interactive environment for exploratory programming.

解開壓縮檔,執行 " java -jar js.jar " 就會出現提示符號
js> print('hi')
hi
js> 6*7
42

11月 26, 2010

程式語言文法

<id> → A | B | C

<assign> → <id> = <exp>

<exp> → <id> * <exp>
| <id> + <exp>
| ( <exp> )
| <id>

**************************

<S> → <A><B><C>
<A> → a<A> | a
<B> → b<B> | b
<C> → c<C> | c

可展開得到 a^ib^jc^k , i,j,k >=1

**************************
文法:
<exp> → <exp> + <exp> | <id>
<id> → a

口訣:只要看到 <x> → <x> + <x> 這個 pattern 就是模糊文法!!

模糊文法定義:若一語言可接受的一個句子,依照語言文法產生的剖析樹
可產生兩個或以上的剖析樹,則稱此文法為模糊文法。

原因:當計算 A+A+A 時,
可以有兩種 parse tree 分別是:(A+A)+A 與 A+(A+A)
因為 <exp> → <exp> + <exp> 表示展開前面/後面 都允許

**************************


思考 <exp> → <exp> + <term> 與
<exp> → <term> + <exp> 差異點
假設 <term> → A | B | C

這兩個不同的式子,決定了左結合或右結合,
以 A+B+C 例子來看,上式呈現 (A+B)+C 而下式呈現 A+(B+C)
先被展開的,會較晚計算,位於 parse tree 上端
較晚展開的,會較先計算,位於 parse tree 底端

在 <exp> + <term> 式子中,位於右手邊的 term 表示先被展開,所以較晚計算
也就是說 A+B+C 中,右手邊的 C 會在 parse tree 上端,最晚計算。
此一結果形成「左結合」的優先權。

同理在 <term> + <exp> 中,位於左邊的 term 先被展開,右邊的 exp 較晚展開
所以在 A+B+C 例子中,會呈現 A+(B+C) 的現象,左邊的 A 先展開,較晚算。

底下這個文法,可以滿足優先權 ( 括號 > 乘法 > 加法 )

<exp> → <exp> + <term> | <term> (想一想 A+B+C 要怎麼算: (A+B)+C )
<term> → <term> * <factor> | <factor> (想一下 A*B*C 要怎麼算: (A*B)*C )
<factor> → ( <exp> ) | <id>
<id> → a | b | c


有一點要小心,如果將乘號與括號放在同個式中,
表示優先權 [括號] 等於 [乘號] 這是不對的。
像下面這個例子來說,乘號與括號的優先權會是一樣的。

<term> → <term> * <factor> | ( <factor> )

所以要分層步進,加號 → 乘號 → 括號
別忘了老原則,愈先展開者位在 parse tree 的上層,會愈晚算。

***************

下列的 E 是左遞迴,這個東西不好,因為不曉得他要展開幾次

E → E + T | T

展開的結果可以是:
(E)+T
(E+T)+T
(E+T+T)+T
(E+T+T+T)+T


實際的式子中不會有括號,這邊是為了標記出 "E" 可延伸的變化。

可以想像,光是 E 去做遞迴展開,這個式子就會很長。問題是他會有多長?

換個角度想:整個式子最後展開,得到的結果是 T+T+T+T+T (很多 T 加相加)

如果問 E 要展到何時才會停? 答案是 " E + T " 中的 E 如果展成 T 了

那麼式子就宣告結束。所以很簡單:這個 E 最終會變成 T 的。

所以我們可以這樣看事情 E → T (+T) (+T) (+T) (+T) 括號是為了分組而寫出來的

試著用下面的邏輯表達這個結果:

E → TE' | T /* 第一個 T 打頭陣,後面 (+T) 則用 E' 帶出來 */
E' → +T /* 這邊的 E' 只能展出一個 +T */

這樣就可以創造出 "T+T" 的結果了,更重要的是排除了左因子。

現在把威力加強一點,讓這個文法可以展出 T+T+T+T 這麼長的東西

E → TE' | T
E' → +TE' /* 遞迴用 E' 去產生很多組 (+T) (+T)... 的效果 */


***************************

左因子 - 文法產生規則不可以有「左因子」 下面的例子中 α 就是左因子

A → αB | αC

因為在判斷要選用何條規則時,因為都是α開頭,會不知道該選何者。

舉個例子:

<stmt> → if <exp> then <stmt> else <stmt> |
if <exp> then <stmt>

(想法:數學提公因式,應該會吧 A= PQ + PR = P(Q+R) )

<stmt> → if <exp> then <stmt> <term>
<term> → else <stmt> | ε

11月 25, 2010

使用 BNF 表示二進位3的倍數

設計文法產生二進位數字,其值為3的倍數

hint:

(1) 在 3 的世界中只會有三種數字 3n, 3n+1, 3n+2
(2) 切割子問題時,只要考慮 1位數 與 多位數

令所求 <3n> 表示三的倍數,則有下面幾個可能

0 ( 單純只有一個數字,又要是三的倍數,所以只能選0 )
<A>0 ( 真正值為 2*A+0 為三的倍數,所以取 A 的值為 <3n> )
<B>1 ( 真正值為 2*B+1 為三的倍數,所以取 B 的值為 <3n+1> )

所以整理一下可以得到:
<3n> → 0 | <3n>0 | <3n+1>1

在這邊要討論 <3n+1> 的部份(三的倍數+1),仿照上面的論述法:
1 ( 如果單純只有一位數,又要是三的倍數+1,那麼只能選1 )
<C>0 ( 如果 2*C+0 要為三的倍數+1,那麼 C 的值要取 <3n+2> )
<D>1 ( 如果 2*D+1 要為三的倍數+1,那麼 D 的值要取 <3n> )

所以這個階段整理一下:
<3n+1> → 1 | <3n+2>0 | <3n>1

剩最後是 <3n+2> 的部份(即三的倍數+2),依照上面論述法:
從缺 ( 如果只有一位數字,但又要是三的倍數+2,基本上不可能 )
<P>0 ( 如果 2*P+0 要為三的倍數+2,那麼 P 的值要取 <3n+1> )
<Q>1 ( 如果 2*Q+1 要為三的倍數+2,這種 Q 要選<3n+2> )

整理一下可得:
<3n+2> → <3n+1>0 | <3n+2>1

**

總結上面論述
<3n> → 0 | <3n>0 | <3n+1>1
<3n+1> → 1 | <3n+2>0 | <3n>1
<3n+2> → <3n+1>0 | <3n+2>1

11月 14, 2010

DFS and BFS

DFS(x)   /* O(n+e) , O(n^2) */
{
node *ptr;
visit[x] = true;
ptr = A[x]->next;

while (ptr != NULL)
{
if (visit[ptr->data] == false)
{ DFS(ptr->data); }

ptr=ptr->next;
}
}

BFS(x) /* O(n+e) , O(n^2) */
{
visit[ ]=false; /* init */

visit[x]= true;
ENQUEUE(x);

while (Q != empty)
{
v = DEQUEUE(Q);

for (w, each neighbor of v)
{ if (visit[w] != true)
{ ENQUEUE(w); visit[w]=true; }
}
}
}

10月 06, 2010

SOA 是啥

最近一年多以來,SOA(Service-Oriented Architecture,服務導向架構)成為IT界的當紅炸子雞。

隨著媒體與IT大廠的炒作,好像一談到「整合」就非SOA不可。很多技術詞彙(例如:BPEL、ESB、BAM…)也在這個過程中不斷地被創造出來,但這些一技術詞彙好像並不會幫助我們對於SOA在應用上的了解,甚至只會令人更懷疑這些名詞只是IT產業又拿出來行銷的噱頭而已。

事實上,技術出身的我不得不承認,SOA有一種架構性美很容易讓技術人員醉心。但在同事朋友們討論SOA的時候,總覺得少了什麼?這樣的美可以幫助我們解決什麼樣的問題呢?如果只是架構上的美,終究也只限於技術架構的美而已,有什麼資訊問題是無法用傳統EAI(Enterprise Application Integration)技術手法來解決而一定要採用SOA嗎?還是它的美只存在於IT學院的象牙塔之中呢?

面對業界許多(非IT領域)朋友的疑惑,我決定寫這一篇文章來重新為SOA「正名」,從IT在商業運作上應用的角度來闡述SOA主要所要解決的問題,讓大家再從另一個角度來看SOA。

定義:不只是技術,是IT架構

或許已經有讀者注意到了,我們通常談到IT,大部份都會說是XX「技術」,但為什麼沒有聽過有人說SOA「技術」呢?如果我們看SOA(Service- Oriented Architecture)這三個英文字母,會發現SOA中的「A」竟然是Architecture(架構)這個字。單就語句結構上來看,如果在「架構」這個字詞後面再扯上「技術」兩個字,還真有點奇怪。

嚴格說來,SOA這一個詞並不是指一種「技術」,而是指一種IT架構,當然,這樣架構下會有各種不同的技術,來解決企業在面對商業自動化的所面臨的各種不同的問題。

本文將先介紹SOA對企業的意義,主要在藉由商業自動化,以協助企業解決一個千古不變的難題:變。

自動化服務元件是商業自動化的第一步

SOA(Service-Oriented Architecture,服務導向架構)顧名思義,以「服務」做為導向來出發,以設計並建構我們的系統構架。簡單來說,我們可以說:「服務導向架構」目的是要達到一個自動化的商業行為。

首先,讓我們舉個例子說明。澳圖美德(Automated)科技是一個系統整合廠商,在他的商業行為中,他需要經常對他的供應商(例如SUN Microsystems)來進行詢料(特別是在庫存中並沒有足夠的備料時)。

早期這樣的一個行為,是由純人工的方式來處理,需要再透過SUN業務同仁處理(包括報價及答覆商品的Delivery Time),但在整個商業流程中,商品的報價與Delivery Time並不會有經常性的異動,因此這樣的做法是一種人力資源的浪費。

為了避免這樣的問題,我們可以將上下流兩個公司的系統做適當的調整,讓SUN公司在系統中建架一個服務元件來提供價格與Delivery Time 的資料查詢直接利用在澳圖美德內部的系統來呼叫SUN公司所提供的服務元件,澳圖美德的同仁即可完成報價與Delivery Time(交期)的詢問。所以可以認知到的是,在商業自動化的前提下,SOA需提供一個「跨系統的資料交換與傳遞的規範與方法」,以便商業上的資訊交換。而在整個架構中,被實做出來以負責資訊的交換與傳遞的程式一個個的模組,我們可稱為服務元件。

或許有些讀者會發現,這樣的做法,不就是幾年前 Web Service的技術觀念下就已經提出來的做法嗎?這跟SOA 有什麼關係呢?

當然,如果只是上述的例子中所提到的需求,其實只要用 Web Service就可以做到了。那SOA可以再解決什麼樣的問題呢?藉由上面的例子,我們再來拉大企業的需求,以再進一步認識 SOA。

「服務元件」結合「流程」提供更多樣的自動化服務

由上述的例子,如果單純從資料流的角度來看,我們可以說:「澳圖美德公司與SUN公司在做資料交換的動作,讓澳圖美德員工可以很輕易得到他需要的資料。」但其實自動化的商業行為並不只是資料交換那麼單純;例如,以身份認証而言:是不是所有的廠商都不需經過認証就可以呼叫SUN公司所提供的元件來取得SUN的報價與 Delivery Time 呢?或者不同的協力廠商所取得報價會相同嗎(不同的協力廠商有可能會因不同的規範而有不同的報價)?再從流程的角度來看,整個商業行為並不是在取得報價後就結束了–是不是要有詢價記錄(以便未來的追蹤)?

或者,如果價格合理,那就會進入採購的程序。如果價格不被接受,那則有可能進行到議價的程序,如果該項商品還有多個供應商的話,那也有可能進入到詢價、比較的不同的程序。甚至不同供應商也有可能有不同的作業流程或程序,有些一定要先下單再出貨,有些關係好的則可以先出貨再下單。有的商品則有可能要先下樣品單,甚至樣品交貨的同時也要先付貨款等等。

因此很單純地由一個服務元件來進行資料交換,並無法滿足商業行為自動化的所有需求在一個完整的商業自動化行為中,往往需要由一組(多個)可能由多個不同系統提供的服務元件來進行服務

例如,系統應該先進行身份確認(這裏是一個身份確認的服務元件),再來才進行詢報價程序(這裏應該又是另外一個服務元件),最後,當買方確認要進行下單的時候,才會進入採購程序(進入採購流程應該又是另外一組服務元件,甚至有可能對應到另外一個獨立的系統中)。而組織、整合並決定所有的服務元件的使用順序地即是「流程」。因此商業自動化的目的下,如何進行跨程式語言、跨系統、跨組織、甚至跨企業的流程架構、規劃、設計與實作,也是SOA 要思考與規範的重點項目。

我一開始說SOA有種架構性的美,是指它作為一種IT架構,竟與哲學中的現象學具有同樣的世界觀 。現象學提到「存有」與「關係」。「存有」在OO(物件導向,Object-Oriented)中(註),可以視為是物件,而在SOA中,我們可以說它是服務元件。而關係,在OO中就是那個方法,而在SOA中,就是跟時間一起被定義在流程之中。SOA即是結合服務元件及流程的很嚴謹、很工整的架構(待續)。



Service-Oriented 與 Object-Oriented:

看到Service-Oriented,IT產業較熟悉的人應該就會直接覺得想到OO(Object-Oriented,物件導向)。確實,從觀念上來說,這兩個概念是雷同的,只不過它們所關切並要解決的問題是屬於不同層面的:SOA是從商業邏輯成層面來看,以減少系統中服務元件設計與開發的時間;而 OO則是關注程式設計與開發的層面,以減少程式元件重新開發的時間

昨天談到SOA之所以不同,是因為它結合服務元件及流程,而形成嚴謹而具有美感架構的IT概念。但它是不是僅只是於「比較美」而已呢?它對企業運作,是不是真的發揮效益呢?讓我們再隨著昨天的例子繼續走下去。

「變」才是自動化IT最大挑戰

伴隨著澳圖美德跟Sun 原廠生意往來的增加,他們的合作關係越來越密切,也越來越有信任感,因此在兩邊老闆與業務同仁熱切期望與鼓吹下,在短短一個禮拜會議討論後,老闆們握手作出以下決議:「面對市場的快速反應,某些單期的商品,只要是澳圖美德業務人員確認後的訂單,Sun原廠這邊就可以直接出貨,澳圖美德的同仁只要事後在一個月內補上訂單及貨款即可,以縮短整體的交期。」

這樣的消息對兩個公司的業務同仁而言都是一個普天同慶的大好消息,特別在信任感足夠的前提下,交期縮短的做法會讓客戶滿意度增加,並相對地提升業績,特別對澳圖美德而言,這樣的做法會縮短貨品在途與減少庫存,可大大提升兩個公司在整體銷售上的執行力。

但獲得執行力是要付出代價的。

老闆又繼續說了下去:「為符合這樣的需求,請IT人員於半個月內修改系統…」一語未閉,資訊部門的同仁全都當場傻眼(並考慮要不要遞出辭呈):天啊,當初為了達到整體的商業自動化,花了澳圖美德公司與Sun原廠的資訊同仁們三個月時間的系統分析以及六個月的程式撰寫,最後逐一的測試,直到上個月才剛算完全測試完成的系統,半個月要怎麼改啊?瘋了嗎?

IT主管們(特別是資訊長與技術長)所面臨的最大挑戰並不是一個固定的商業行為,其實大部份跨企業/組織的商業流程自動化需求都可以利用傳統EAI所使用的IT技術手法來完成;講白了,IT人員只要把商業的作業流程定義清楚,不管採用什麼技術(VB、JAVA、N-tier、 mainframe、有資料庫就用資料庫,沒有資料庫就用最笨的方式,像是TEXT file等),大部份商業上的需求都還是可以硬生生--不論用苦力技術或高級的方式(例如物件導向加XML)來實作出來,但最大的挑戰往往發生在商業流程改變的時候

「規劃永遠趕不上商業變化。」這是所有IT人的痛,因此當我們談到商業自動化,「流程」只是故事的一半而已。也是SOA的切入點所在。

在瞬息萬變的經營環境中,SOA目的在更深一層去關切並預想商業流程的變異性,並思考、定義與切割一個個服務與流程,以強化企業商業自動化的靈活度。

是行銷名詞還是真的有用?

談到這邊,我想「為什麼要SOA?」或「SOA是不是一個行銷術語?」應該會得到較清楚的答案。在商業自動化為前提下,「服務元件」與「流程」可視為商業自動化的基本元素面對商業行為的變異性,在「服務元件」與「流程」的設計與實作上,應該要達到彈性並且可以重複被使用的水準,以減少系統重複開發的時間,這樣子以商業服務為基本元素來做為的出發點,而設計出來的IT架構,我們就稱之為「服務導向架構」(SOA)。
而在這樣一個約定而成、公開規範的SOA架構下,企業便可藉由「服務元件」與「流程」靈活組合(就像玩樂高積木一般),因應瞬息萬變的商業行為需求。
理解SOA的本質後,我們再來看SOA中各個資訊原廠或SI廠商所提出的各種五花八門資訊名詞時,應該就會比較清楚個中差異。例如:BPEL(Business Process Execution Language,商業流程執行語言),簡單說就是特定資訊語言可以用定義及規範各個服務元件的執行的先後順序與因果關係(也就是流程)。再如 ESB(Enterprise Service Bus,企業服務匯流排)則是服務被實踐的地方,ESB在系統與系統間、企業與企業間,負責整合的作業,讓「服務」的串連形成一個匯流排(Bus),如同巴士(Bus)一般地,傳遞跨系統、組織與企業的資訊服務。

面對企業資訊「整合」的需求,SOA並不是唯一的答案,但無疑地,隨著SOA技術逐漸發展成熟,新的概念與技術可以讓企業面對商業整合時可擁有更大的彈性與效率。而接下來的專欄文章中,我們將陸續探討SOA對企業內人事、流程、甚至CEO角色職權的衝擊。

10月 05, 2010

懸置指標(dangling pointer) 與 懸置物件(dangling object)

[Dangling Pointer]
空間 free 掉,我還在用
函式呼叫結束,空間還回去了

解法 tombstone , locks-and-keys
[Dangling Reference]

[Dangling object]
heap dynamic variable 才會發生
可用 garbage collection 去解(投影片)
(1)參考計數法(reference-counting)
配置記憶體時,為所配置的記憶體額外提供一個計數器,用來紀錄
參考到此記憶體的指標變數,每增加一個指標參考此位址時,則計
數器加一,當指標變數不再指向此位址時,則計數器減一。
當計數器為零時,系統會收回此記憶體。

實做簡單,需要參考計數欄位

(2)標記追蹤法(mark tracing)
目前最廣被採用的演算法
在記憶體不足時執行,會掃描整個記憶體兩次,
第一次掃描時會判斷記憶體中的每一個物件是否仍在使用
如果仍在使用則做一個標記,否則就不做標記
第二次掃描清除沒有做標記的物件

C 語言指標:Reference & Dereference 運算

& reference operator
* dereference operator
foo()
{
int x, *ptr;

/* store the address of x into the ptr */
ptr = &x;

/* dereference here */
*ptr=18;
}