2010年9月24日

XML 的第一堂課

概述:

可延伸標示語言eXtensible Markup Language,簡稱XML),又稱可延伸標記語言,指利用電腦所能理解的資訊符號,透過此種標記,電腦之間可以處理包含各種資訊的文章等。如何定義這些標記,既可以選擇國際通用的標記語言,比如HTML,也可以使用像XML這樣由相關人士自由決定的標記語言,這就是語言的可延伸性。XML是從標準通用置標語言(SGML)中簡化修改出來的。 HTML的使用目的是排版資料,修改資料的顯示,XML 並不是用來編排內容,而是用來描述資料,因此,它並沒有如同 HTML一般的預設標籤,使用者需要自行定義描述資料所需的各種標籤。

發展歷史:

XML是從1995年開始有其雛形,並向W3C(全球資訊網聯盟)提案,而在1998二月發佈為W3C的標準(XML1.0)。XML的前身是SGMLThe Standard Generalized Markup Language)。

1978年,ANSI將GML加以整理規範,發佈成為SGML,1986年起為ISO所採用(ISO 8879),並且被廣泛地運用在各種大型的檔案計劃中,但是SGML是一種非常嚴謹的檔案描述法,導致過於龐大複雜(標準手冊就有500多頁),難以理解和學習,進而影響其推廣與應用。

同時W3C也發現到HTML的問題:

  • 不能解決所有解釋資料的問題 - 像是影音檔或化學公式、音樂符號等其他形態的內容。
  • 效能問題 - 需要下載整份檔案,才能開始對檔案做搜尋。
  • 擴充性、彈性、易讀性均不佳。

為了解決以上問題,專家們使用SGML精簡製作,並依照HTML的發展經驗,產生出一套使用上規則嚴謹,但是簡單的描述資料語言:XML。 XML是在一個這樣的背景下誕生的——為了有一個更中立的方式,讓消費端自行決定要如何消化、呈現從服務端所提供的資訊。

XML與HTML

舉例來說,下面這段HTML碼,將成績結果以table的方式呈現:
       

       

姓 名國 文數 學
小 明9076
小 華8581
此時若是利用XML,則可以將此成績結果以下列的方式呈現:

由上面的例子我們可以很清楚的看到,XML並未如HTML包含了顯示的標記,無法讓瀏覽器依照其格式來顯示。但是它以巢狀結面清楚的標示了各元素之間的關係,但電腦可以很容易的判別各個元素。

2010年2月28日

使用案例圖

使用案例(use case)

使用案例(use case)可以展示系統功能或系統行為。使用案例是描述系統與使用者在特定情境與目標下的一系列互動行為。使用案例描述在不同的情境下,系統針對行為者要 求的回應。行為者對系統提出達成特定目標的需求,系統再根據要求回應行為者。使用案例的名稱可為現在式時態的動詞片語,包含動詞(系統應該做什麼)與動詞 的受詞(系統應該對哪一個對象進行操作)。

使用案例圖(use case diagram)

使用案例圖是UML最常用的三種圖之一,許多專家認為,如果把UML 2 的13款圖簡化一下,大概只會剩下3種圖,使用案例圖就是其中之一,而另外兩款則是類別圖以及循序圖。使用案例通常用來表達系統的功能觀,它的組成元素很 簡單,就是「使用案例」(use case)、行為者(actor)和兩者之間的關係線。簡單來說,使用案例代表系統對外提供的服務或功能,而參與者則是位於系統外部,會直接接觸系統並啟 動使用案例的使用者,或者是支援使用案例的其他連線系統。建構使用案例圖的步驟依序為:找出行為者、找出使用案例、描述使用案例、找出使用案例的關係,最 後繪出使用案例圖。









找出行為者

行為者可以從使用者與企業需求描述中的名詞、代名詞與名詞片語等,找出合乎行為者定義的人、組織或相關系統。

找出使用案例

許多專家建議,由行為者找出使用案例是一個有效的途徑。也就是說,先找出行為者,再逐一檢討行為者以找出其所參與的每一個使用案例,之後會有相關事 件的回應,直到完成使用系統的目的為止,將這一系列事件有組織的集合起來便成為一個使用案例,但這些事件間必須符合內聚力的原則。

描述使用個案

一個完整的使用個案內容應包括行為者、使用個案目標、使用個案發生之前提與結束狀態、一系統事件描述等。使用個案描述是從使用者的觀點,描述使用者 欲達成某項目標或功能的作業行為,此時應著重企業的作業處理或功能描述,而不應涉及電腦化的程式邏輯;一系列事件的描述除了正常程序外,最好也能包括例外 狀況的描述。

找出使用案例間的關係

使用案例間的關係主要可以分為三種:Include、Extend和Generalixation。Include可視為某一使用案例「A」會用到 另一個使用案例「B」,關係的箭頭符號應由A指向B。Extend的關係可視為是某個使用案例(例如 A )在某情況時會被插入至另一個使用案例的定義中(例如 B ),而形成一新的組合使用案例,則關係箭頭符號應由A指向B。Generalization的關係意味著使用案例間的繼承關係,例如子使用案例會繼承父使 用案例的行為與意義,且子使用案例可擁有其個別的行為與意義。

繪製使用案例圖

完成上述工作後,最後是繪製使用案例圖。繪製步驟為先繪出所有行為者與使用案例,將行為者與使用案例間有互動者以互動符號連結,接著再確定使用案例間的關係,並以適當的關係符號連結。

2010年2月23日

PHP與MySQL

實際的開發案中,PHP程式總是配合資料庫進行Web開發和應用,才能發揮出程式最大的效能,在這些資料庫之中,MySQL資料庫是PHP最強大的合作夥伴,絕大多數的PHP網站都是採用MySQL作為網站的資料庫,MySQL最著名的資料庫管理工具就是用PHP編寫的phpMyAdmin。

MySQL資料庫簡介
SQL是結構化查詢語言(Structured Query Language)的簡寫,SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言得到了廣泛的應用。如今像是Oracle、Sybase、Informix、SQL SERVER這些大型的資料庫系統,都支援SQL作為查詢語言。MySQL是基於SQL的目前世界上開源(Open Source)資料庫中最受歡迎的產品之一。由於它是免費的,而且在性能和穩定度上絲毫不遜於其他的商業資料庫,因此得到了廣泛的應用。同樣作為開源免費軟體的Apache、PHP和MySQL三者結合被認為是Web應用的最佳組合,分別用做Web伺服器、伺服器端程式解譯器和資料庫,這個組合被眾多使用者親切地稱為APM。

至於MySQL的資料管理、語法以及各項的操作都和SQL SERVER沒有太大的差異,圖資系有上過資料庫的同學應該很熟悉,這邊就不特別介紹。

PHP操作MySQL資料庫
PHP5內置了MySQL資料庫的用戶端,提供了大量的MySQL資料庫專用的函式來與其互動。在所有的互動指令之前,我們需要使用 mysql_connect()函式建立PHP和MySQL資料庫的連結。
與資料庫建立連結之後,我們就可以進行各種查詢操作,接下來,需要用 my_select_db() 函式來選擇使用的資料庫。
每次的PHP、MySQL程式設計,都是要以類似下面的語法來開始
在建立MySQL連結、選擇要使用的資料庫之後,就可以開始執行各種SQL查詢了。PHP查詢MySQL資料庫功能的函式是mysql_qurey()。他的語法是 mysql_query("$query"),其中$query是各種SQL語法。例如: mysql_query("SELECT id, name From tbl_name" )。
我們現在已經可以透過PHP來操作MySQL資料庫了,但要想在PHP中使用透過SELECT語法從資料庫查詢傳回的資料集,還需要使用 mysql_fetch_array() 函式。 mysql_fetch_array() 函式可以從 mysql_query() 函式執行 SELECT 語法查詢傳回的資源識別字的資料集中取得一筆資料作為陣列回傳,PHP程式就可以獲知MySQL資料庫的資料了。

2010年2月22日

循序圖 & 合作圖

物件導向系統的資料結構塑模主要以類別圖與物件圖表達物件間的靜態資料結構;而物件互動行為則主要以互動圖來表達物件間動態的互動行為。互動圖包含循序圖與合作圖,一個互動圖描述一個使用個案內物件間的互動行為。其中,循序圖著重以時間發生的先後順序來表達物件間的訊息傳遞與與處理之程序;而合作圖則著重表達物件間的連結結構,並能同時展現物件間的訊息傳遞與處理之程序。

循序圖(Sequence Diagram)
循序圖主要用於描述許多物件在單一使用個案中的互動行為,但不太適合用於對這些行為的精準定義(較精準的定義用狀態圖或活動圖來描述為佳)。循序圖強調以時間發生的先後順序表達物件間的訊息傳遞與處理程序,其重要元件包括類別的物件、訊息、操作與操作描述要生命線與控制焦點等。


物件
如果尚未建構類別圖,而先建構循序圖,循序圖上物件之確認準則與類別圖相同;如果先完成類別圖,再建構循序圖,則循序圖的物件可以直接用類別圖上類別之物件,其表達方式是在類別的名稱下劃一底線。原則上,循序圖的物件是放置在循序圖的上方。

訊息
循序圖的訊息(Message)或刺激(Stimuli)是由某一物件送至另一物件以啟動操作。一般來說,訊息常需與操作相結合。在循序圖中,訊息是以水平的箭頭表示,而且箭頭起始於傳送訊息的區域(也就是控制焦點),終止於接受訊息的區域。大部份的循序圖都由一個來自於系統外部的訊息所啟動。

操作與操作描述
循序圖的操作(Operation)在於描述循序圖中,某一物件接到另一物件送達的訊息,接收端的物件為了執行發送端物件送來的要求,所提供因應處理該訊息的方法。操作描述是操作的細部詳細說明,主要是從系統行為的觀點,描述系統的動作與邏輯順序所需的輸入與輸出。操作描述是往後程式設計的重要依據,程式編輯完成後,這些操作描述可作為程式的註解。

生命線
循序圖的生命線(Lifeline)是劃在物件底下與物件重直的虛線,用來表達物件在某時段的存在。

控制焦點
循序圖的控制焦點(Focus of Control)表達物件執行某動作的時段,包括由其執行或透過其附屬程式。控制焦點用長條圖表示,且與該物件的生命線重疊。

合作圖(Collaboration Diagram)
合作圖主要用來描述許多物件在單一使用個案中的互動行為,和循序圖一樣,不太適合用於描述這些行為的精準定義。但合作圖強調以物件的結構化組織表達物件間的訊息傳送/接收與處理程序。合作圖的重要元件包括類別的物件、連結、訊息與操作等。


物件
合作圖的物件與循序圖的物件相同,都是來自於類別圖上類別的物件,或直接由使用個案圖描述找出,其表達方式是在類別的名稱下劃一底線。

連結
合作圖的連結(Link)是用於表示一個物件如何與另一個物件連接,以直線來表示。合作圖上的連結也就是物件間的路徑(Path)。

訊息
合作圖的訊息(Message)包含兩物件間的訊息傳送/接收內容與操作,並且將這些訊息伴隨著一個箭頭來表示。訊息的發生順序可在訊息前面加一個序號來表示,在合作圖中這些序號都是唯一的。序號以自然數(1, 2, 3 ...)表示其發生順序;也可以用杜威數( Dewey Decimal Numbering, 1.1, 1.2, 1.3, ... )表示巢狀的發生順序。

2010年2月21日

PHP的會話管理--Cookie

Cookie的概念
Cookie是一種在客戶瀏覽器端儲存資料並以此來跟蹤和識別用戶的機制,與Session類似,Cookie變數的作用範圍同樣可以整站跨頁面有效,所不同的是,Cookie變數儲存於用戶端的瀏覽器,並可以指定有效時間,而Session變數則在結束網站連結時即告失效。
一般用Cookie來代表由網站伺服器發送出來儲存在用戶端瀏覽器上的小量資訊,從而使得訪客下次又連接該網站時,可從瀏覽器讀回這些資訊。這種機制是很有用的,可以讓瀏覽器訪住訪客的特定資訊,如上次連結的位置、花費的時間或使用者首選項。Cookie就是在瀏覽器目錄中儲存這些資訊的文件檔。

Cookie的傳遞流程是這樣的:
當在瀏覽器位址欄中輸入了一個Web網站的URL位址時,瀏覽器就會向該Web網站發送一個讀取網頁的請求,並將結果在顯示器上顯示。這時該網頁在你的電腦上尋找這個網站設置的Cookie文件,如果找到,瀏覽器會把Cookie文件中的資料連同前面輸入的URL一同發送到網站伺服器。伺服器收到 Cookie資料,就會在它的資料庫中檢索我們的ID、購物記錄、個人喜好等資訊,並記錄下新的內容,增加到資料庫和Cookie文件中。如果沒有檢索到 Cookie或你的Cookie資訊與資料庫中的資訊不符合,則說明我們是第一次瀏覽該網站,伺服器的CGI程式將為我們創建新的ID資訊,並保存到資料庫中。

Cookie是利用了網頁中的HTTP表頭資訊進行傳遞,瀏覽器的每一次網頁請求,都可以伴隨Cookie傳遞。Cookie在電腦上保存的時間是不一樣的,這些都是由伺服器的設置不同決定。Cookie有一個Expires(有效期)屬性,這個屬性決定了Cookie的保存時間,伺服器可以透過設定Expires欄位的數值,來改變Cookie的保存時間,如果不設置該屬性,那麼Cookie只在瀏覽網頁期間有效,關閉瀏覽器,這些Cookie自動消失,絕大多數網站屬於這種情況。

伺服器可以利用Cookie包含資訊的任意性來篩選並經常性維護所記錄的這些資訊,以判斷在HTTP傳輸中的狀態。Cookie最典型的應用是判定註冊用戶是否已經登錄網站,尤其是各大論壇登錄時都有有效時間的選項,使用者可能會得到提示,是否在下一次進入此網站時保留使用者資訊以便簡化登錄手續,這些都是Cookie的功用。另一個重要的應用場合是「購物車」之類處理,用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些資訊都會寫入Cookie,以便在最後付款時提取資訊。

Cookie雖然方便使用,但是在某種程度上已經嚴重危及用戶的隱私和安全。其中的一種方法是:當我們為了市場調查、商品搜索等目的透過搜尋引擎搜到一些陌生網站並連接時,這些網站包含了一種叫做網頁臭蟲的圖片,該圖片透明且只有一個像素大小以便隱藏,它們的作用是向所有連接過此頁面的電腦寫入 Cookie。而後,一些其他網站將讀取這些Cookie資訊,並尋找寫入這些Cookie的網站,就可能發送包含了針對這個網站相關產品廣告的垃圾郵件給我們,給我們的工作和生活帶來騷擾。

另外使用Cookie還會有Cookie欺騙的風險,儘管Cookie沒有病毒那麼危險,但它仍包含了一些敏感資訊:用戶名、電腦名、使用的瀏覽器和曾經連接的網站等,而使用者是不希望這些內容洩漏出去,尤其是當其中還包含有私人資訊的時候。Cookie所記錄的這些資訊,如果在網上傳遞,通常使用的是MD5方法加密以防被他人輕易讀取,雖然這些加密後的資訊在我們看來只是一些毫無意義的字母數字組合,只有伺服器的CGI處理常式才知道它們真正的含義,這些經過加密處理後的資訊,即使被網路上一些別有用心的人截獲,也看不懂,因為他看到的只是一些無意義的字母和數字,然而,問題是,截獲Cookie 的人不需要知道這些字串的含義,他們只要把別人的Cookie向伺服器提交,並且能夠通過驗證,他們就可以冒充受害人的身份,登錄網站。這種方法叫做 Cookie欺騙,Cookie欺騙實現有前提條件是伺服器的驗證程式存在漏洞,並且冒充者要獲得冒充的人Cookie資訊。目前網站的驗證程式要排除所有非法登錄是非常困難的,而且要獲得別人Cookie是很容易的,用支援Cookie的語言編寫一小段代碼就可以實現,只要把這段代碼放到網路裡,那麼所有人的Cookie都能夠被收集。目前還沒有特別的防範方法,我們也只能使用通當的防護方法,不要在論壇裡使用重要的密碼,也不要使用IE自動保存密碼的功能,以及儘量不登錄不瞭解底細的網站。

設置Cookie
PHP在HTTP協定的表頭資訊裡發送Cookie,必須在其他資訊被輸出到瀏覽器前設置Cookie,這和要header()、Session的初始化限制類似。設置Cookie的函式是setcookie()或setrawcookie(),還可以透過向用戶端直接發送HTTP表頭來設置。

接收和處理Cookie
PHP對Cookie的接收和處理的支援非常的好,是完全自動的。我們可以直接用PHP內建超級全域變數$_COOKIE來讀取瀏覽器端的Cookie。

刪除Cookie
可以呼叫只帶有name參數的setcookie()或者把有效時間設為小於當前時間和把值設置為空就可以刪除某個Cookie的值,這個Cookie在這個頁面瀏覽完之後就會被刪除了(其實是失效了)。

2010年2月12日

PHP的會話管理--session

PHP的變數作用範圍是侷限在同一個PHP文件中的,在函式主體中的變數作用範圍更是被侷限在函式主體{}中;form可以讓我們在兩個頁面中傳遞資訊,當我們需要在所有的頁面中都存在的資訊,則可以通過儲存於伺服器端和瀏覽器用戶端的Session和Cookie兩種變數,來實現全站有效的作用範圍。

Session的概念
使用者訪問一個網站時往往需要瀏覽許多網頁,對於一個PHP程式設計的網站來說,用戶在連結的過程中需要執行許多的PHP指令檔,然而由於HTTP協議本身的特點,使用者每執行一個PHP程式都需要和Web伺服器重新建立連結;又由於無狀態記憶的特點,此次連結無法得到上次連結的狀態,這樣,使用者在一個PHP程式中對一個變數進行了指派操作,而在另一個PHP程式中是無法得到這個變數的值的。
由於這兩個特點,我們無法得知使用者的瀏覽狀態,此時就需要透過Session 這樣的機制來記錄使用者的有關資訊,以供使用者再次以此身份對Web伺服器提出請求時做確認。Session解決方案,就是要提供在PHP程式中定義跨網頁全域變數的方法,使得這個全域變數在同一個Session中對所有的PHP程式都有效。
Session通常是和Cookie聯合工作的,首先在伺服器端PHP為建立Session的使用者產生一個獨一無二的字串,用來標識這個使用者的Session,一般將這個字串稱作Session ID,然後以”sess”+Session ID 為檔案名在伺服器的檔案系統中建立一個文件,在文件中保存用戶在Session 所定義的全域變數的變數名和值,最後再將Session ID作為一個名為PHPSession的Cookie保存在用戶端的檔案系統中。然後,當用戶再次連接伺服器訪問一個PHP程式時,PHP從用戶發來的PHPSession這個Cookie中得到用戶所有Session的Session ID,並根據Session ID從伺服器的檔案系統中找到保存Session資訊的文件,從這個文件中讀出用戶在上次連接時所設置的全域變數值。

使用Session
在PHP中,Session的變數是用文件的形式來儲存的,要想使用Session,需要先在php.ini中設置Session文件的位置,將其替換成我們自己設定的Session目錄。PHP程式中的Session變數不是直接就可以使用的,需要在程式碼中先通過session_start()函式來初始化Session。

設置Session生命週期
一般來說,瀏覽器結束訪問離開網站時其生命週期也同時結束,但是儲存Session資訊的文件仍然存在於Session儲存資料夾中,下次再重新打開瀏覽器連接該網站會重新分配Session ID,如果我們使用session_id()把以前的ID帶回來,則會去讀取殘存在Session儲存資料夾中的相應文件,取回先前所有已經設定的Session變數。

註冊Session
透過session_start()初始化Session後,我們就可以使用session_register()函式來註冊一個新的Session變數使用。
函式語法:boolean session_register(string name)
本函式增加一個新的變數到目前的Session之中,參數name就是新的Session變數名。成功註冊後則傳回true值。Session變數註冊成功後,即可通過$_SESSION[name]的方式呼叫此變數來使用。如果想確認某個名稱的Session變數是否已經被註冊,可以使用session_is_registered()函式來判斷。

刪除Session
與session_register()函式對應,session_unregister()函式可以刪除一個已註冊Session變數。
函式語法:boolean session_unregister(string name)
本函式在當前的Session中刪除參數name指定的Session變數。刪除成功則傳回true值。如果客戶要結束一個網站的連結,我們需要在伺服器中結束此用戶的Session,使用session_destroy()函式來關閉Session環境。

2010年2月11日

大家一起來打造年度計劃書

雖然已經是二月中,轉眼就到農曆新年,不過還沒好好規劃今年度計劃的大家,一起來打造自己的年度計劃書吧!

二次大戰期間艾森豪帶領同盟國聯運,跨越英倫海峽反敗為勝,靠的就是縝密的情報蒐和靈活應變。艾森豪的名言:「Planning is everything. Plans are nothing! 」可以理解為:必須隨時把「計劃」當作動詞,只是「計劃」當成名詞,是完全沒用的。若你只是抱著交差心情完成名詞的計劃書,那麼只是在浪費自己的時間。但是,若能夠藉著撰寫過程,培養計劃和企劃能力,把計劃當做動詞,將可反守為攻。

年度計劃書三大功能:
雖然大部份的同學都還不是上班族,但是在未來的不久,都會成為上班族。因此,我們可以試著以職場的方式來擬定年度計劃書,在職場每一個領域的每個人都需要計劃,上班族憑好的企劃力就可以翻身和加薪,所以,大家可以趁這個時候開始練習。好的年度計劃書,至少具備以下三大功能:
功能一:管理你的優先順序
當你的策略聚焦,資源分配也會更為精準、有效率。譬如你的時間和短期工作計劃,會投入到有助於達成長期目標相關的準備。其他和達成長期目標無關,甚至可能偏離長期目標的事,則可以暫時被擱置。
功能二:形成責任感
目標已經白紙黑字寫下,年度目標成為自我管理最好的工具,挑戰訂下的目標,也成為超越自己的成就感。
功能三:追蹤表現的指標
每一個星期、每一個月、每一季,都可以針對年度計劃書檢討達成進度。就外在變化,檢查目標達成的進度,隨時修正,才不至於偏離長期目標。

完全撰寫的三大祕訣
打破交差的心態,寫出一份充滿行動力的出色年度計劃,可以參考圖書館管理課程時,老師所提到的幾點訣竅,應該掌握以下三大訣竅:
訣竅一:目標導向
找到目標,也就是願景和使命,然後把目標具體化,目標就是年度計劃的主題,因此找到目標是第一件要務。
訣竅二:從結構入手
擬定年度計劃書,就是預先系統化的整理資訊,想要提出好的企劃書,應該嘗試把各式各樣的訊息系統化,將市場、顧客、商品、公司等各種關聯加以說明,再把架構清楚條列出來。最後,還要釐清自己在這個架構中的定位,也就是說,隨時都應該要學會掌握組織,並且看清楚從何處切入和施力可以有進展。
訣竅三:和人生計劃書契合
大多數人都認為在事業上隨時靜下心來撰寫計劃書是理所當然的事。但是讓自己的人生目標明確化,和在公事上把目標推動方式具體寫下是一樣的。你工作上的年度計劃書,應該和你長期的人生計劃書一致。如此,工作就不是責任,而是人生理想的一部份,工作起來一定會非常有勁。

大部份的同學在今年將面臨大學畢業的挑戰,不論是繼續升學或者是投入就業市場,一份好的計劃書將會有你的人生有相當大的助益。如果還沒擬定計劃書的同學,利用農曆年假期的這幾天,開始擬定自己的年度計劃書吧!!