<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; 程式設計</title>
	<atom:link href="http://blog.colorbase.tw/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Sun, 20 Jun 2010 10:06:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>開始HTML5 &#8211; Web Workers</title>
		<link>http://blog.colorbase.tw/web-development/888</link>
		<comments>http://blog.colorbase.tw/web-development/888#comments</comments>
		<pubDate>Fri, 23 Apr 2010 17:11:00 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[trend]]></category>
		<category><![CDATA[web-workers]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=888</guid>
		<description><![CDATA[HTML5帶來了許多的改變，除了標記語意上的增強之外，最令人震撼的莫過於它所附屬的Javascript APIs。而 Web Workers 是 HTML5 提供的一個多執行緒(Multi-Thread)的解決方案，讓我們可以把需要大量運算的程式交由Web Workers去做背景執行，如此的好處就是其他的工作仍可以順利進行。
Web Workes 目前支援的瀏覽器有：Firefox 3.5+ / Safari 4.0+ / Chrome 5.0+

 


HTML5 的不同
標記的不同
HTML5在標記上有著相當大的變化，其中最為明顯的即是語意上的標籤，在HTML5中，結構化網頁的語意更加清晰了，除了移除許多不必要的標記之外也增加了許多標記及有用的屬性，本文只簡述範例中會用到的部份。
若想知道自己編寫的HTML5是否有錯誤可以利用HTML5 validator來驗證。
DOCTYPE 變簡潔了
現在DOCTYPE只需簡短的這樣寫：

&#60;!DOCTYPE html&#62;

標籤不一定要閉合
在XHTML裡標籤必須要閉合，例如：

&#60;input type="text" id="name" /&#62;

而在HTML5中，以下的寫法也是正確的，而這也是比較建議的寫法：

&#60;input type="text" id="name"&#62;

同樣的方法也適用於meta，而且在指定content-type時，也只需要指定charset而不必定義文件類型text/html，例如：

&#60;meta charset="UTF-8"&#62;

Web Workers基本概念
在使用Web Workers時，我們必須建立一個Worker實體，並傳入要被呼叫的Javascript檔案所在URL，而我們必須把Worker要跑的程式寫在這個檔案中，例如：

var worker = new Worker("worker.js");

在worker.js中我們必須綁定onmessage來執行我們想要執行的動作，在這裡我們可以使用postMessage()來觸發Worker.onmessage事件，例如：

onmessage = function (evt) {
	for (var i=0; i&#60;100000000; i++) {
		//執行大量迴圈
		postMessage(i); // 觸發 Worker.onmessage() 並傳入 i
	};
};

Worker.onmessage(event) 事件
當在被呼叫的javascript裡呼叫postMessage()時，將會觸發這個事件，在這個事件中我們可以透過event.data來取得傳入資料。

worker.onmessage = function (e){
	// 由於在 worker.js 中使用了 ...]]></description>
			<content:encoded><![CDATA[<p>HTML5帶來了許多的改變，除了標記語意上的增強之外，最令人震撼的莫過於它所附屬的Javascript APIs。而 Web Workers 是 HTML5 提供的一個多執行緒(Multi-Thread)的解決方案，讓我們可以把需要大量運算的程式交由Web Workers去做背景執行，如此的好處就是其他的工作仍可以順利進行。</p>
<p>Web Workes 目前支援的瀏覽器有：Firefox 3.5+ / Safari 4.0+ / Chrome 5.0+</p>
</p>
<p> <span id="more-888"></span>
</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="html5_web_workers" border="0" alt="html5_web_workers" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/html5_web_workers.png" width="400" height="286" /></p>
<h2>HTML5 的不同</h2>
<p><strong>標記的不同</strong></p>
<p>HTML5在標記上有著相當大的變化，其中最為明顯的即是語意上的標籤，在HTML5中，結構化網頁的語意更加清晰了，除了移除許多不必要的標記之外也增加了許多標記及有用的屬性，本文只簡述範例中會用到的部份。</p>
<p>若想知道自己編寫的HTML5是否有錯誤可以利用<a href="http://html5.validator.nu/" target="_blank">HTML5 validator</a>來驗證。</p>
<p><strong>DOCTYPE 變簡潔了</strong></p>
<p>現在DOCTYPE只需簡短的這樣寫：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7714dd36-584e-40a1-a576-2010022e278a" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!DOCTYPE html&gt;</pre>
</div>
<p><strong>標籤不一定要閉合</strong></p>
<p>在XHTML裡標籤必須要閉合，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:30da56d4-5b66-4776-92e7-c7841d65385e" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;input type="text" id="name" /&gt;</pre>
</div>
<p>而在HTML5中，以下的寫法也是正確的，而這也是比較建議的寫法：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6a745a67-529f-448c-b2a7-2bc82d2f8685" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;input type="text" id="name"&gt;</pre>
</div>
<p>同樣的方法也適用於meta，而且在指定content-type時，也只需要指定charset而不必定義文件類型text/html，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9286ad54-8926-459b-9861-27a5d61f4915" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;meta charset="UTF-8"&gt;</pre>
</div>
<h2>Web Workers基本概念</h2>
<p>在使用Web Workers時，我們必須建立一個Worker實體，並傳入要被呼叫的Javascript檔案所在URL，而我們必須把Worker要跑的程式寫在這個檔案中，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6a92410e-2431-47f6-a787-a8e7379bf5cd" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">var worker = new Worker("worker.js");</pre>
</div>
<p>在worker.js中我們必須綁定onmessage來執行我們想要執行的動作，在這裡我們可以使用postMessage()來觸發Worker.onmessage事件，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f480ed37-4b24-4c84-b8a8-7897bf2b78ad" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">onmessage = function (evt) {
	for (var i=0; i&lt;100000000; i++) {
		//執行大量迴圈
		postMessage(i); // 觸發 Worker.onmessage() 並傳入 i
	};
};</pre>
</div>
<p><strong>Worker.onmessage(event) 事件</strong></p>
<p>當在被呼叫的javascript裡呼叫postMessage()時，將會觸發這個事件，在這個事件中我們可以透過event.data來取得傳入資料。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1ab754fb-e683-472a-9dae-a5245b080ffd" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">worker.onmessage = function (e){
	// 由於在 worker.js 中使用了 postMessage() 並傳入 i 值
	// 因此在這裡可以使用 event.data 來取得 i 值，並做出相關處理
	// 例如：
	console.log(e.data);
}</pre>
</div>
<p><strong>Worker.onerror(event) 事件</strong></p>
<p>當呼叫失敗時，將會觸發此事件，在這個事件中我們可以透過event來取得事件相關資訊。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1574452f-d5b9-4cfa-b25b-ad3f54dcdc1a" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">worker.onerror = function(e){
	alert("於第["+ e.lineno +"]行發生錯誤 : " + e.message); //顯示錯誤訊息
}</pre>
</div>
<p><strong>Worker.terminate()</strong></p>
<p>用以停止Worker的執行的成員函數。</p>
<p>因此Web Worker簡單的操作流程圖如下：</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="html5-web-workers" border="0" alt="html5-web-workers" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb11.png" width="400" height="422" /></a></p>
<h2>搭配jQuery的簡單Web Worker範例</h2>
<p><a href="/html5/web_workers_simple/worker.html" target="_blank">點我觀看Web Workers Demo</a></p>
<p>worker.html</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b8988b77-5fda-40a3-be29-4323ba204859" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!doctype html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta charset="UTF-8"&gt;
		&lt;title&gt;Worker Test&lt;/title&gt;
		&lt;link rel="stylesheet" href="worker.css" type="text/css" media="screen"&gt;
		&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"&gt;&lt;/script&gt;
		&lt;script src="init.js"&gt;&lt;/script&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;a href="#" id="startWorker"&gt;開始&lt;/a&gt;
		&lt;ul id="worker-list"&gt;&lt;/ul&gt;
		&lt;a href="#"&gt;回文章&lt;/a&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p>worker.css</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:99c7580b-12f5-4617-b64a-3c56c9060045" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">#worker-list {
	list-style-type: none;
	width: 400px;
}
#worker-list li {
	background-color: #FFE;
	margin: 3px;
	padding: 3px;
	border: 1px solid #C6BC9F;
	font-size: 16px;
	position: relative;
}

#worker-list .close {
	position: absolute;
	background-color: #FFF;
	display: block;
	height: 18px;
	width: 18px;
	border: 1px solid #CCC;
	text-align: center;
	vertical-align: middle;
	font-size: 12px;
	cursor:pointer;
	font-family: Arial, Helvetica, sans-serif;
	right: 3px;
	top: 3px;
}</pre>
</div>
<p>worker.js</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d61331df-90ac-4c5c-8e93-b5d67f6425b1" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">onmessage = function (e) {
	for (var i=0; i&lt;e.data; i++) {
		//觸發 worker.onmessage 傳入 i
		if(0 === i % 10 ) postMessage(i);
	};
};</pre>
</div>
<p>init.js</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:525d877f-fbc9-4f2a-a97d-fa21c2c5ed73" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">$(function(){

	function createWorker (msgObj) {

		// 建立 worker
		var worker = new Worker("worker.js");

		worker.onmessage = function (e){
			msgObj.html(e.data); // 更新資訊 (e.data可取得觸發傳入值)
		}

		worker.onerror = function(e){
			alert("於第["+ e.lineno +"]行發生錯誤 : " + e.message); //顯示錯誤訊息
		}

		return worker;
	}

	$("#startWorker").click(function(){
		for(var i=0;i&lt;5;i++){
			addworker();
		}
		$(this).remove();
		return false;
	});

	function addworker(){
		var newItem = $('&lt;li /&gt;');
		var msg = $('&lt;span class="message"&gt;Waitting...&lt;/span&gt;');

		//關閉鈕
		var close = $('&lt;span class="close"&gt;X&lt;/span&gt;').click(function(){
			var li = $(this).closest('li');
			li.data('worker').terminate(); //停止worker的執行
			li.remove();
		});;

		var worker = createWorker (msg);

		//儲存Worker在元素裡
		newItem.data('worker',worker);

		//執行Worker
		worker.postMessage(30000);

		$('#worker-list').append(newItem.append(msg).append(close))
	}
});</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/888/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>我一個半途夭折的想法</title>
		<link>http://blog.colorbase.tw/web-development/767</link>
		<comments>http://blog.colorbase.tw/web-development/767#comments</comments>
		<pubDate>Tue, 06 Apr 2010 10:33:51 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[作品分享]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=767</guid>
		<description><![CDATA[在2008年底，我突發奇想的開始做了一個名為「拓客基地」的網站，這是一個聊天室網站，大約在2009一月底完成一個簡易的beta版，但卻在辛辛苦苦做完之後一直擺著沒去裡它，也從未對外公開它的網址。
與一些聊天室不同的是，這個聊天架構不是由Client(Browser)不斷送出Request，而是由Server在有需求時才送出訊息或通知。
直到最近pigo大在他的部落格中提到一種叫做Comet架構的概念，我才發現原來有這樣一種架構概念，在這之前我倒是沒有聽過，真是後知後覺啊。
在稍微了解過這種概念後發現與我當初想的好像頗為相似，重點似乎都是Server的主動，而不是不斷的請求，但我不是很確定是否有何不同，不過很恰巧的是Server端都是用C#寫的（硬要攀關係 XD）。
仔細想想這樣的運作架構或許有它的存在的價值，重點在於用在什麼地方。
因此今天又重新把這個網站整理一下搬了出來，有興趣的人不妨隨意玩玩，或許可以激起你另一個想法。
Screenshots
Web 聊天介面

室長端介面

網址：
http://tbase.colorbase.tw/
帳號：test  密碼：test
概念
這個聊天室架構不是由Client(Browser)不斷發送Request請求，而是讓聊天室成員與室長端建立一個固定的連線，換句話說是在有需求時訊息才會被傳遞，而室長端就是一個Server端，訊息流量都由使用者（室長與成員）自行承擔，缺點是使用者如果要當室長必須需要下載一個Client端軟體。
在這樣架構之下總共會有兩種Server端（HTTP Server不納入計算），一是中介Server，用於室長與聊天成員之間建立連線的媒介，處理一些狀態訊息等等，二是室長端。
但事實上，中介Server的角色在某些應用底下，它並不是一定要存在的，因此若單指聊天室長端的Server與聊天成員的運作來看，這樣的運作就會很像所謂的comet（希望我沒有會錯意）。
由於是固定連線的關係，因此在訊息的傳遞上非常即時，實測的結果，室長端使用一般家用網路其即時的效果跟MSN似乎不相上下，當然這取決於連線數量的多寡與頻寬條件。
如下簡圖：

圖示來自：
http://www.iconshock.com/
http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm
關於comet架構
這有一些文章可以參考：

http://lightyror.thegiive.net/2007/06/comet-push-server.html
http://www.pigo.idv.tw/archives/761
http://blog.roodo.com/rocksaying/archives/12010463.html

PS. pigo大最近打算釋出他的原始碼，有興趣的人不妨留意一下他的消息。
]]></description>
			<content:encoded><![CDATA[<p>在2008年底，我突發奇想的開始做了一個名為「拓客基地」的網站，這是一個聊天室網站，大約在2009一月底完成一個簡易的beta版，但卻在辛辛苦苦做完之後一直擺著沒去裡它，也從未對外公開它的網址。</p>
<p>與一些聊天室不同的是，這個聊天架構不是由Client(Browser)不斷送出Request，而是由Server在有需求時才送出訊息或通知。</p>
<p><span id="more-767"></span>直到最近<a href="http://www.pigo.idv.tw" target="_blank">pigo</a>大在他的部落格中提到一種叫做<a href="http://www.pigo.idv.tw/archives/781" target="_blank">Comet架構的概念</a>，我才發現原來有這樣一種架構概念，在這之前我倒是沒有聽過，真是後知後覺啊。</p>
<p>在稍微了解過這種概念後發現與我當初想的好像頗為相似，重點似乎都是Server的主動，而不是不斷的請求，但我不是很確定是否有何不同，不過很恰巧的是Server端都是用C#寫的（硬要攀關係 XD）。</p>
<p>仔細想想這樣的運作架構或許有它的存在的價值，重點在於用在什麼地方。</p>
<p>因此今天又重新把這個網站整理一下搬了出來，有興趣的人不妨隨意玩玩，或許可以激起你另一個想法。</p>
<h2>Screenshots</h2>
<p><strong>Web 聊天介面</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/room_screen.png"><img class="alignnone size-medium wp-image-768" title="room_screen" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/room_screen-300x199.png" alt="" width="300" height="199" /></a></p>
<p><strong>室長端介面</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/screen_20090120180622.jpg"><img class="alignnone size-medium wp-image-777" title="screen_20090120180622" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/screen_20090120180622-300x250.jpg" alt="" width="300" height="250" /></a></p>
<p>網址：</p>
<p><a href="http://tbase.colorbase.tw/" target="_blank">http://tbase.colorbase.tw/</a></p>
<p>帳號：test  密碼：test</p>
<h2>概念</h2>
<p>這個聊天室架構不是由Client(Browser)不斷發送Request請求，而是讓聊天室成員與室長端建立一個固定的連線，換句話說是在有需求時訊息才會被傳遞，而室長端就是一個Server端，訊息流量都由使用者（室長與成員）自行承擔，缺點是使用者如果要當室長必須需要下載一個Client端軟體。</p>
<p>在這樣架構之下總共會有兩種Server端（HTTP Server不納入計算），一是中介Server，用於室長與聊天成員之間建立連線的媒介，處理一些狀態訊息等等，二是室長端。</p>
<p>但事實上，中介Server的角色在某些應用底下，它並不是一定要存在的，因此若單指聊天室長端的Server與聊天成員的運作來看，這樣的運作就會很像所謂的comet（希望我沒有會錯意）。</p>
<p>由於是固定連線的關係，因此在訊息的傳遞上非常即時，實測的結果，室長端使用一般家用網路其即時的效果跟MSN似乎不相上下，當然這取決於連線數量的多寡與頻寬條件。</p>
<p>如下簡圖：</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/conception.jpg"><img class="alignnone size-medium wp-image-799" title="conception" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/conception-300x176.jpg" alt="" width="300" height="176" /></a></p>
<p>圖示來自：</p>
<p><a href="http://www.iconshock.com/" target="_blank">http://www.iconshock.com/</a></p>
<p><a href="http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm" target="_blank">http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm</a></p>
<h2>關於comet架構</h2>
<p>這有一些文章可以參考：</p>
<ul>
<li><a href="http://lightyror.thegiive.net/2007/06/comet-push-server.html" target="_blank">http://lightyror.thegiive.net/2007/06/comet-push-server.html</a></li>
<li><a href="http://www.pigo.idv.tw/archives/761" target="_blank">http://www.pigo.idv.tw/archives/761</a></li>
<li><a href="http://blog.roodo.com/rocksaying/archives/12010463.html" target="_blank">http://blog.roodo.com/rocksaying/archives/12010463.html</a></li>
</ul>
<p>PS. <a href="http://www.pigo.idv.tw/" target="_blank">pigo</a>大最近打算釋出他的原始碼，有興趣的人不妨留意一下他的消息。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/767/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型</title>
		<link>http://blog.colorbase.tw/web-development/668</link>
		<comments>http://blog.colorbase.tw/web-development/668#comments</comments>
		<pubDate>Sun, 07 Mar 2010 08:49:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=665</guid>
		<description><![CDATA[今天看到 Detecting Ajax Events on the Server 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。
依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。
 
但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    例如： 


if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&#62; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo 'hello';
}

當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：

#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}



jQuery code
Accept header


$.getJSON(URL); 
$.ajax({url:URL, dataType :&#8217;json&#8217;});

application/json, text/javascript, */*


$.getScript(URL); 
$.ajax({url:URL, dataType :&#8217;script&#8217;}) ;
$.ajax({url:URL, dataType :&#8217;jsonp&#8217;}) ;

text/javascript, ...]]></description>
			<content:encoded><![CDATA[<p>今天看到 <a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Server</a> 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。</p>
<p>依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。</p>
<p> <span id="more-668"></span>
<p>但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    <br />例如： </p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&gt; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo '<strong>hello</strong>';
}</pre>
</div>
<p>當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：</p>
<style type="text/css">
<p>#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}</style>
<table id="table" cellspacing="3" cellpadding="2" width="90%">
<tbody>
<tr>
<th width="50%" align="center">jQuery code</th>
<th width="50%" align="center">Accept header</th>
</tr>
<tr>
<td>$.getJSON(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;json&#8217;});</p>
</td>
<td>application/json, text/javascript, */*</td>
</tr>
<tr>
<td>$.getScript(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;script&#8217;}) ;</p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;jsonp&#8217;}) ;</p>
</td>
<td>text/javascript, application/javascript, */*</td>
</tr>
<tr>
<td>$.get(<strong>URL</strong>);</td>
<td>*/*</td>
</tr>
<tr>
<td>$(&#8216;#result&#8217;).load(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;html&#8217;});</p>
</td>
<td>text/html, */*</td>
</tr>
<tr>
<td>$.ajax({url:<strong>URL</strong>, dataType :&#8217;xml&#8217;})</td>
<td>application/xml, text/xml, */*</td>
</tr>
</tbody>
</table>
<p>現在有了這個對照表，我們就可以根據Accept header來回應不同格式的結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">switch ($_SERVER['HTTP_ACCEPT']){
	case 'application/json, text/javascript, */*':
		// 回應 JSON 格式
		break;
	case 'text/javascript, application/javascript, */*':
		// 回應 javascript 或 JSONP 格式
		break;
	case 'text/html, */*':
		// 回應 HTML 格式
		break;
	case 'application/xml, text/xml, */*':
		// 回應 XML 格式
		break;
}</pre>
</div>
<p>參考文章：<a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Serve</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/668/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework 與 Library 的概念與不同</title>
		<link>http://blog.colorbase.tw/programming/660</link>
		<comments>http://blog.colorbase.tw/programming/660#comments</comments>
		<pubDate>Thu, 25 Feb 2010 12:29:20 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=657</guid>
		<description><![CDATA[Framework 中文常譯為「框架」、「架構」而 Library 中文常譯為「庫」。
很多 Framework 因為結構上的需求而帶有大量的 Library 所以很容易讓人對於這兩者的概念混淆不清。

Framework 在字義上帶有結構的意義。
它具備引導的作用，並透過預先規劃好的結構或機制以協助改善開發上的問題，例如：結構性、彈性、可維護性等等；為了引導到正確的開發方向 Framrework 甚至有時會做出適度或大量的限制開發方向、方法，在限制上來說意義就吻合了中文字義「框架」；對於結構而言，Framrewok 某些地方沒有顯著的以限制的方式引導，而是提供了某些機制，例如：.Net Framework 中提供了事件機制；Framework 中可能會包含大量類別或函數，這其中有一部是所謂的Library，另一部分則是因應 Framework 結構或機制而存在，例如：事件經常也是一個類別。
而 Library 在字義上帶有收藏或集合的意義。
因此 Library 很單純的收集常用或通用程式庫，若內容物為函數則常被稱之為「函式庫」，若內容物為類別則常被稱之為「類別庫」。Library完全不理會程式結構如何開發，它很單純的只是為了完成某些較為獨立的事，也完全不會限制或引導開發邏輯或流程。
個人觀點，僅供參考
2010/02/26 補充、 修改
]]></description>
			<content:encoded><![CDATA[<p>Framework 中文常譯為「框架」、「架構」而 Library 中文常譯為「庫」。</p>
<p>很多 Framework 因為結構上的需求而帶有大量的 Library 所以很容易讓人對於這兩者的概念混淆不清。</p>
<p><span id="more-660"></span></p>
<h2><span style="color: #008080;">Framework 在字義上帶有結構的意義。</span></h2>
<p>它具備引導的作用，並透過預先規劃好的結構或機制以協助改善開發上的問題，例如：結構性、彈性、可維護性等等；為了引導到正確的開發方向 Framrework 甚至有時會做出適度或大量的限制開發方向、方法，在限制上來說意義就吻合了中文字義「框架」；對於結構而言，Framrewok 某些地方沒有顯著的以限制的方式引導，而是提供了某些機制，例如：.Net Framework 中提供了事件機制；Framework 中可能會包含大量類別或函數，這其中有一部是所謂的Library，另一部分則是因應 Framework 結構或機制而存在，例如：事件經常也是一個類別。</p>
<h2><span style="color: #008080;">而 Library 在字義上帶有收藏或集合的意義。</span></h2>
<p>因此 Library 很單純的收集常用或通用程式庫，若內容物為函數則常被稱之為「函式庫」，若內容物為類別則常被稱之為「類別庫」。Library完全不理會程式結構如何開發，它很單純的只是為了完成某些較為獨立的事，也完全不會限制或引導開發邏輯或流程。</p>
<p>個人觀點，僅供參考</p>
<p>2010/02/26 補充、 修改</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/660/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lazybones PHP 開發框架 0.1 釋出</title>
		<link>http://blog.colorbase.tw/web-development/654</link>
		<comments>http://blog.colorbase.tw/web-development/654#comments</comments>
		<pubDate>Wed, 10 Feb 2010 17:03:52 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[作品分享]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[lazybones]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=654</guid>
		<description><![CDATA[最近因為需求而開始嘗試尋找一個合適的PHP開發框架，了解過幾個知名的框架之後發現每個框架都有其優點，但卻沒有符合我需求的框架，於是就便自行寫了一個開發框架，我把它命名為 Lazybones。
最後我決定以 new BSD license 釋出，希望可以讓有相同需求的人多個選擇。


Lazybones 吉祥物
名稱：藍惰蟲 (bluelazy)
分類：軟體生物
棲息地：每個人的心中
特性：可能促使宿主懶散不事生產，也可能促使宿主為了消除藍惰蟲所釋放的懶惰激素進而改進或創造新事物來滿足懶惰的慾望。
記得小時候被長輩罵懶時，總是以比喻的方式消遣「你是沒骨頭嗎？」
因此以這樣一個概念設計了這個沒有骨頭的生物「藍惰蟲」。
Lazybones 簡介
Lazybones 是一個微型PHP快速開發框架，它被設計的主要目的是減少小型架構網站所需撰寫的程式碼，加快開發的速度、增加可維護性，同時能兼具一定的執行的效能，努力在效能與核心功能間取得平衡點。
目前已實現的特色：

核心迷你，執行效能高
操作簡便，語法親和
MVC架構
具備可擴充性及開發彈性
存取控制清單 (ACL)
模型內建ORM
事件
URL路由器
視圖佈局
主題支援
資料驗證器
國際化


Lazybones 官方網站
Lazybones 討論區

]]></description>
			<content:encoded><![CDATA[<p>最近因為需求而開始嘗試尋找一個合適的PHP開發框架，了解過幾個知名的框架之後發現每個框架都有其優點，但卻沒有符合我需求的框架，於是就便自行寫了一個開發框架，我把它命名為 Lazybones。</p>
<p>最後我決定以 new BSD license 釋出，希望可以讓有相同需求的人多個選擇。<br />
<span id="more-654"></span><br />
<span class="thickbox"><img class="alignnone size-medium wp-image-655" title="bluelazy" src="http://blog.colorbase.tw/wp-content/uploads/2010/02/bluelazy.png" alt="" width="469" height="194" /></span></p>
<h2><strong><strong>Lazybones 吉祥物</strong></strong></h2>
<p>名稱：藍惰蟲 (bluelazy)</p>
<p>分類：軟體生物</p>
<p>棲息地：每個人的心中</p>
<p>特性：可能促使宿主懶散不事生產，也可能促使宿主為了消除藍惰蟲所釋放的懶惰激素進而改進或創造新事物來滿足懶惰的慾望。</p>
<p class="mgt10">記得小時候被長輩罵懶時，總是以比喻的方式消遣「你是沒骨頭嗎？」</p>
<p>因此以這樣一個概念設計了這個沒有骨頭的生物「藍惰蟲」。</p>
<h2><strong>Lazybones 簡介</strong></h2>
<p>Lazybones 是一個微型PHP快速開發框架，它被設計的主要目的是減少小型架構網站所需撰寫的程式碼，加快開發的速度、增加可維護性，同時能兼具一定的執行的效能，努力在效能與核心功能間取得平衡點。<br />
目前已實現的特色：</p>
<ul>
<li>核心迷你，執行效能高</li>
<li>操作簡便，語法親和</li>
<li>MVC架構</li>
<li>具備可擴充性及開發彈性</li>
<li>存取控制清單 (ACL)</li>
<li>模型內建ORM</li>
<li>事件</li>
<li>URL路由器</li>
<li>視圖佈局</li>
<li>主題支援</li>
<li>資料驗證器</li>
<li>國際化</li>
</ul>
<ul>
<li><a href="http://lazybones.colorbase.tw/" target="_blank">Lazybones 官方網站</a></li>
<li><a href="http://lazybones.colorbase.tw/forum/" target="_blank">Lazybones 討論區</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/654/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSScaffold &#8211; 幫助建構複雜CSS的「鷹架」</title>
		<link>http://blog.colorbase.tw/web-development/639</link>
		<comments>http://blog.colorbase.tw/web-development/639#comments</comments>
		<pubDate>Fri, 09 Oct 2009 17:20:04 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS Framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=639</guid>
		<description><![CDATA[今天發現一個好用的CSS的開發框架 &#8211; CSScaffold，瞭解完這個東西之後，我的感覺就如同官方提到的一句話「Simple, but powerful」，它是一款幫助撰寫CSS的快速開發框架，不同於許多CSS框架，它必須依靠PHP與Apache的mod_rewrite來執行，但也因為需要這兩種東西，讓CSScaffold變得很神奇、很方便，寫起CSS來又快又輕鬆！

ps. Apache的mod_rewrite不一定需要。
CSScaffold 的神奇之處：
強化標準CSS語法

讓CSS語法可以有常數(Constant)。
讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。
讓CSS語法可以巢狀結構(Nested Structure)。
讓CSS語法可以有插件(Plugin)。
讓CSS屬性可以用表達式(Expressions)指派其值。
讓CSS屬性可以用條件式(Conditionals)指派其值。

重複利用
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。
CSS結構化
標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。
CSScaffold 如何讓CSS變神奇的？
其實技術上它一點都不神奇&#8230;XD，說穿了他與PHP中的Smarty等等樣板引擎很像，但真正令人激賞的是他的概念。
它的運作原理就是在開發時原本直接寫CSS，變成寫 CSS 的樣板，然後在執行階段透過CSScaffold來編譯及抓取已經編譯好的CSS內容回傳給瀏覽器，有快取(Cache)的功能，因此整個執行的流程很像PHP中許多有Cache功能的樣板引擎。
因為透過CSScaffold這層的解析編譯，所以當然就會如同樣板引擎一樣，它訂製出自己的CSS樣板語法，而這它的語法基本上跟CSS 沒什麼兩樣，只是多了一些原本CSS 不提供的語法，使用上只需瞭解多出來的部分而不是重新學習CSS語法，因此也可以簡單的把它看做是CSS語法的改良進階版。
以下是CSScaffold官方的概念圖：

image from csscaffold
直接看官方教學介紹，簡單又明瞭



CSScaffold語法
來看幾個官方提供的語法介紹，瞭解一下CSScaffold的好用之處
常數(Constants)
大部分的程式語言都有常數這種東西，因此很容易理解，下面的例子body的color屬性會被替換成#555，常數最大的功能就是在於重複利用，也保持CSS屬性的一致性，以這個例子來說，如果以常數的方式撰寫，當需要更改文字顏色時，只需要更改常數的定義即可


/* 定義常數 */
@constants
{
text_color:#555;
color_1:#999;
}

body
{
/* 把color屬性設定為text_color常數 */
color:!text_color;
}


因此結果會是：


body
{
color: #555;
}


引入(include)
直接引入其他CSS檔案，增加重複利用的特性


/* 例如：引入常數定義檔 */
@include '/scaffold/snippets/constants.css';


巢狀結構(Nested Structure)
HTML本來就是巢狀的東西，而這東西更可以讓CSS結構化，編寫時不再混亂不堪，除了方便撰寫也有利於日後維護


#id
{
border:1px;

h1,h2,h3
{
color:red;

a div, blockquote, mark
{
margin:10px;
}

&#38;.span
{
padding:10px;
}
}
}


結果：
如果手工寫這些東西是很煩很累的&#8230;


#id
{
border: 1px;
}

#id h1,
#id h2,
#id h3
{
color: red;
}

#id h1 a div,
#id h1  blockquote,
#id h1  mark,
#id h2 a div,
#id h2  blockquote,
#id h2  mark,
#id h3 a div,
#id h3  ...]]></description>
			<content:encoded><![CDATA[<p>今天發現一個好用的CSS的開發框架 &#8211; CSScaffold，瞭解完這個東西之後，我的感覺就如同官方提到的一句話「<strong>Simple, but powerful</strong>」，它是一款幫助撰寫CSS的快速開發框架，不同於許多CSS框架，它必須依靠PHP與Apache的mod_rewrite來執行，但也因為需要這兩種東西，讓CSScaffold變得很神奇、很方便，寫起CSS來又快又輕鬆！</p>
<p><span id="more-639"></span></p>
<blockquote><p>ps. Apache的mod_rewrite不一定需要。</p></blockquote>
<h2><span style="color: #008080;">CSScaffold 的神奇之處：</span></h2>
<p><strong>強化標準CSS語法</strong></p>
<ul>
<li>讓CSS語法可以有常數(Constant)。</li>
<li>讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。</li>
<li>讓CSS語法可以巢狀結構(Nested Structure)。</li>
<li>讓CSS語法可以有插件(Plugin)。</li>
<li>讓CSS屬性可以用表達式(Expressions)指派其值。</li>
<li>讓CSS屬性可以用條件式(Conditionals)指派其值。</li>
</ul>
<p><strong>重複利用</strong><br />
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。</p>
<p><strong>CSS結構化</strong></p>
<p>標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。</p>
<h2><span style="color: #008080;">CSScaffold 如何讓CSS變神奇的？</span></h2>
<p>其實技術上它一點都不神奇&#8230;XD，說穿了他與PHP中的Smarty等等樣板引擎很像，但真正令人激賞的是他的概念。</p>
<p>它的運作原理就是在開發時原本直接寫CSS，變成寫 CSS 的樣板，然後在執行階段透過CSScaffold來編譯及抓取已經編譯好的CSS內容回傳給瀏覽器，有快取(Cache)的功能，因此整個執行的流程很像PHP中許多有Cache功能的樣板引擎。</p>
<p>因為透過CSScaffold這層的解析編譯，所以當然就會如同樣板引擎一樣，它訂製出自己的CSS樣板語法，而這它的語法基本上跟CSS 沒什麼兩樣，只是多了一些原本CSS 不提供的語法，使用上只需瞭解多出來的部分而不是重新學習CSS語法，因此也可以簡單的把它看做是CSS語法的改良進階版。</p>
<p>以下是CSScaffold官方的概念圖：</p>
<p><span class="thickbox"><img class="alignnone" title="CSScaffold概念圖" src="/wp-content/uploads/2009/10/scaffold-diagram1.png" alt="" width="500" height="417" /></span></p>
<p><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">image from csscaffold</a></p>
<p><strong>直接看官方教學介紹，簡單又明瞭</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="281" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=6175674&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="281" src="http://vimeo.com/moogaloop.swf?clip_id=6175674&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank"><br />
</a></p>
<h2><span style="color: #008080;">CSScaffold語法</span></h2>
<p>來看幾個官方提供的語法介紹，瞭解一下CSScaffold的好用之處</p>
<p><strong>常數(Constants)</strong><br />
大部分的程式語言都有常數這種東西，因此很容易理解，下面的例子body的color屬性會被替換成#555，常數最大的功能就是在於重複利用，也保持CSS屬性的一致性，以這個例子來說，如果以常數的方式撰寫，當需要更改文字顏色時，只需要更改常數的定義即可</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義常數 */
@constants
{
text_color:#555;
color_1:#999;
}

body
{
/* 把color屬性設定為text_color常數 */
color:!text_color;
}
</pre>
</div>
<p>因此結果會是：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
body
{
color: #555;
}
</pre>
</div>
<p><strong>引入(include)</strong><br />
直接引入其他CSS檔案，增加重複利用的特性</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">
/* 例如：引入常數定義檔 */
@include '/scaffold/snippets/constants.css';
</pre>
</div>
<p><strong>巢狀結構(Nested Structure)</strong><br />
HTML本來就是巢狀的東西，而這東西更可以讓CSS結構化，編寫時不再混亂不堪，除了方便撰寫也有利於日後維護</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
border:1px;

h1,h2,h3
{
color:red;

a div, blockquote, mark
{
margin:10px;
}

&amp;.span
{
padding:10px;
}
}
}
</pre>
</div>
<p>結果：<br />
如果手工寫這些東西是很煩很累的&#8230;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
border: 1px;
}

#id h1,
#id h2,
#id h3
{
color: red;
}

#id h1 a div,
#id h1  blockquote,
#id h1  mark,
#id h2 a div,
#id h2  blockquote,
#id h2  mark,
#id h3 a div,
#id h3  blockquote,
#id h3  mark
{
margin: 10px;
}

#id h1.span,
#id h2.span,
#id h3.span
{
padding: 10px;
}
</pre>
</div>
<p><strong>混合器(Mixins)</strong><br />
這東西的概念有點像函數，又有點像樣板，可以傳入變數替換值</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義混合器 */
=mixin-name(!param)
{
color:!param;
border: !param2 solid #eee;
}

#content
{
/* 使用混合器 */
+mixin-name(#eee);
padding:10px;
border:1px solid #eee;
}
</pre>
</div>
<p>因此結果會是：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#content
{
color: #eee;
border: #eee2 solid #eee;
padding: 10px;
border: 1px solid #eee;
}
</pre>
</div>
<p><strong>混合器的巢狀用法：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義混合器 */
=mixin-name(!param)
{
.test!param{
color:#555;
}
}

/* 使用混合器 */
+mixin-name(1);

#content
{
/* 使用混合器 */
+mixin-name(1);
padding:10px;
border:1px solid #eee;
}
</pre>
</div>
<p>巢狀Mixins結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
.test1
{
color: #555;
}

#content
{
padding: 10px;
border: 1px solid #eee;
}

#content .test1
{
color: #555;
}
</pre>
</div>
<p><strong>表達式(Expressions)：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
padding:#[10*4]px;
}
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
padding: 40px;
}
</pre>
</div>
<p><strong>條件式(Conditionals)：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
=column(!n, !last = false)
{
width:#[!n * 10]px;
/* 依據參數的不同設定不同的值 */
@if(!last === false)
{
margin-right:0;
}
@else
{
margin-right:10px;
}
}

.box
{
+column(2, true);
}
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
.box
{
width: 20px;
margin-right: 10px;
}
</pre>
</div>
<blockquote><p>目前條件式的解析似乎有些Bug</p></blockquote>
<p><strong>插件(Plugin)</strong><br />
官方預設提供了多個插件，並提供了<a href="http://wiki.github.com/anthonyshort/csscaffold/layout-plugin" target="_blank">排版插件(Layout Plugin)</a>使用教學，如果使用網格設計(Grid Design)的方式來編排CSS網頁，這個插件可以很方便快速的產出所需的CSS，當然除了官方提供的插件之外，也可以<a href="http://wiki.github.com/anthonyshort/csscaffold/plugin-development" target="_blank">自行設計插件</a>。</p>
<p>至此，應該可以了解到這個東西真的是Simple, but powerful，更多語法介紹及教學請至 <a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">CSScaffold</a> 觀看</p>
<h2><span style="color: #008080;">相關連結</span></h2>
<ul>
<li><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">CSScaffold官方網站</a></li>
<li><a href="http://github.com/anthonyshort/csscaffold/downloads" target="_blank">CSScaffold下載</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/639/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>好用的SQL語法編輯工具 &#8211; SQL Workbench</title>
		<link>http://blog.colorbase.tw/programming/627</link>
		<comments>http://blog.colorbase.tw/programming/627#comments</comments>
		<pubDate>Sun, 04 Oct 2009 12:10:47 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[軟體介紹]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=627</guid>
		<description><![CDATA[今天發現了一套幫助編寫SQL語法的好工具 &#8211; SQL Workbench，它支援各式各樣常見的資料庫，方便的欄位及資料表名稱自動完成提示，可以讓我們不用記憶資料表及欄位名稱，用來編寫又臭又長的SQL語句時，是一套相當好用的工具。

支援眾多資料庫
支援的資料庫有：PostgreSQL、Oracle、Microsoft SQL Server、MySQL、SQLite、Firebird SQL、Access、Excel、H2 Database Engine、Apache Derb、HSQLDB、IBM DB2&#8230;及其他更多。
SQL Workbench的特色

 可執行SQL查詢並顯示結果
 Open Source
 資料表及欄位名稱自動完成提示
 格式化SQL語法
 簡易查詢功能
 支援大部分常見資料庫
其他更多特色見 SQL Workbench官方特色列表

螢幕截圖
SQL語法編輯

Database Explorer

Database Explorer &#8211; 取得資料表結構語法

自動提示

SQL語法格式化

讓SQL Workbench支援MySQL等資料庫
由於SQL Workbench是使用Java開發的，因此如果要讓他支援如MySQL資料庫，必須下載對應的JDBC Driver
1.首先下載MySQL JDBC Driver。
2.從選單「File &#62;&#62; Manage Drivers&#8230;」中設定MySQL Driver。

3.在Library欄位，選擇下載的mysql-connector-java-5.1.10-bin.jar路徑。
4.在Sample URL可設定預設的JDBC連線字串 jdbc:mysql://主機:埠號/資料庫名稱。
如：jdbc:mysql://localhost:3306/name_of_db
相關連結

SQL Workbench官方網站
各種資料庫JDBC Driver
Java runtime environment

]]></description>
			<content:encoded><![CDATA[<p>今天發現了一套幫助編寫SQL語法的好工具 &#8211; SQL Workbench，它支援各式各樣常見的資料庫，方便的欄位及資料表名稱自動完成提示，可以讓我們不用記憶資料表及欄位名稱，用來編寫又臭又長的SQL語句時，是一套相當好用的工具。<br />
<span id="more-627"></span></p>
<h3><span style="color: #008080;">支援眾多資料庫</span></h3>
<p>支援的資料庫有：PostgreSQL、Oracle、Microsoft SQL Server、MySQL、SQLite、Firebird SQL、Access、Excel、H2 Database Engine、Apache Derb、HSQLDB、IBM DB2&#8230;及其他更多。</p>
<h3><span style="color: #008080;">SQL Workbench的特色</span></h3>
<ul>
<li> 可執行SQL查詢並顯示結果</li>
<li> Open Source</li>
<li> 資料表及欄位名稱自動完成提示</li>
<li> 格式化SQL語法</li>
<li> 簡易查詢功能</li>
<li> 支援大部分常見資料庫</li>
<li>其他更多特色見<a href="http://www.sql-workbench.net/index.html" target="_blank"> SQL Workbench官方特色列表</a></li>
</ul>
<h3><span style="color: #008080;">螢幕截圖</span></h3>
<p><strong>SQL語法編輯</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/10/main.png"><img class="alignnone size-medium wp-image-638" title="main" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/main-300x179.png" alt="" width="300" height="179" /></a></p>
<p><strong>Database Explorer</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/10/databaseexplorer.png"><img class="alignnone size-medium wp-image-631" title="databaseexplorer" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/databaseexplorer-300x179.png" alt="" width="300" height="179" /></a></p>
<p><strong>Database Explorer &#8211; 取得資料表結構語法</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/10/databaseexplorersource.png"><img class="alignnone size-medium wp-image-632" title="databaseexplorersource" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/databaseexplorersource-300x179.png" alt="" width="300" height="179" /></a></p>
<p><strong>自動提示</strong></p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2009/10/auto_completion.png"><img class="alignnone size-medium wp-image-633" title="auto_completion" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/auto_completion.png" alt="" width="214" height="232" /></a><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2009/10/auto_completion2.png"><img class="alignnone size-medium wp-image-634" title="auto_completion2" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/auto_completion2-350x198.png" alt="" width="350" height="198" /></a></p>
<p><strong>SQL語法格式化</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/10/reformatting.gif"><img class="alignnone size-medium wp-image-635" title="reformatting" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/reformatting-300x142.gif" alt="" width="300" height="142" /></a></p>
<h3><span style="color: #008080;">讓SQL Workbench支援MySQL等資料庫</span></h3>
<p>由於SQL Workbench是使用Java開發的，因此如果要讓他支援如MySQL資料庫，必須下載<a href="http://www.sql-workbench.net/databases.html" target="_blank">對應的JDBC Driver</a></p>
<p>1.首先<a href="http://dev.mysql.com/downloads/connector/j/5.1.html" target="_blank">下載MySQL JDBC Driver</a>。</p>
<p>2.從選單「File &gt;&gt; Manage Drivers&#8230;」中設定MySQL Driver。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/10/managedrivers.png"><img class="alignnone size-medium wp-image-636" title="managedrivers" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/managedrivers-300x220.png" alt="" width="300" height="220" /></a></p>
<p>3.在Library欄位，選擇下載的mysql-connector-java-5.1.10-bin.jar路徑。</p>
<p>4.在Sample URL可設定預設的JDBC連線字串 jdbc:mysql://主機:埠號/資料庫名稱。</p>
<p>如：jdbc:mysql://localhost:3306/name_of_db</p>
<h3><span style="color: #008080;">相關連結</span></h3>
<ul>
<li><a href="http://www.sql-workbench.net" target="_blank">SQL Workbench官方網站</a></li>
<li><a href="http://www.sql-workbench.net/databases.html" target="_blank">各種資料庫JDBC Driver</a></li>
<li><a href="http://www.java.com/zh_TW/download/manual.jsp" target="_blank">Java runtime environment</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/627/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[翻譯]如何使用單例設計模式(Singleton design pattern) for PHP</title>
		<link>http://blog.colorbase.tw/programming/625</link>
		<comments>http://blog.colorbase.tw/programming/625#comments</comments>
		<pubDate>Sun, 06 Sep 2009 07:48:16 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[翻譯]]></category>
		<category><![CDATA[設計模式]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=625</guid>
		<description><![CDATA[今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「How to use the Singleton design pattern」。
該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。

How to use the Singleton design pattern
作者：Karl
出處：How to use the Singleton design pattern
翻譯：阿育
單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。
思考一下以下的類別(Class)：


class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
   ...]]></description>
			<content:encoded><![CDATA[<p>今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a>」。</p>
<p>該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。</p>
<p><span id="more-625"></span></p>
<h2><span style="color: #008080;">How to use the Singleton design pattern</span></h2>
<p>作者：<a href="http://www.talkphp.com/members/karl.html" target="_blank">Karl</a></p>
<p>出處：<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a><a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank"></a></p>
<p>翻譯：<a href="http://blog.colorbase.tw/about" target="_blank">阿育</a></p>
<p>單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。</p>
<p>思考一下以下的類別(Class)：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
    ...
}
</pre>
</div>
<p>每當我們需要一個連線時，這個類別建立了一個資料庫連線的類別實例，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>假設我們在一個腳本的生命週使用上面的方法許多次，每當我們建立一個實例，也建立了一個新的資料庫物件（我們還建立了一個新的資料庫連線，但是以這個例子來說，這是沒必要的），同時也將耗費更多記憶體。</p>
<p>有時您可能想刻意建立多個類別實例，但在這裡我們不這麼做。</p>
<p>單例模式提供的方法便是去解決這個常見的問題。為了讓資料庫類別單一實例化，我們首先需要為這個類別添加一個新的屬性，我們將其命名為$m_pInstance：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    ...
}
</pre>
</div>
<p>此屬性將被用來存儲資料庫類別的單一實例。需注意，這個屬性必須是靜態(static)的。</p>
<p>接下來，我們需要將構造函數(constructor或稱建構函數、建構子)的存取範圍改為私有(private)。這是經常混淆視聽的陌生語法。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }
}
</pre>
</div>
<p>透過使用私有的構造函數，我們已經禁止了外部將類別實例化。因此如下面的程式碼將不可以被執行於類別之外。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
</pre>
</div>
<p>為了建立單例模式，我們現在需要增加一個方法。增加下面的方法到資料庫類別中：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
public static function getInstance()
{
    if (!self::$m_pInstance)
    {
        self::$m_pInstance = new Database();
    }

    return self::$m_pInstance;
}
</pre>
</div>
<p>這個看起來有趣的方法，它的責任是處理物件類別實例。請核對我們的靜態屬性$ m_pInstance，相對於此基本上這就容易理解了，如果建立資料庫物件透過呼叫建構函數，這是不合法的。請記住，我們已經讓__construct()方法成為私有的，所以物件實例的建立只能透過物件的方法。</p>
<p>這個方法函數最終將傳回一個靜態屬性的參照(reference)。在隨後呼叫了getInstance()將會回傳一個有效的$ m_pInstance參照，不會有新的物件實例被建立。</p>
<p>所以，我們的資料庫類別看起來差不多像這樣：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }

    public static function getInstance()
    {
        if (!self::$m_pInstance)
        {
            self::$m_pInstance = new Database();
        }

        return self::$m_pInstance;
    }
}
</pre>
</div>
<p>現在你可以在專案中的任何地方使用資料庫類別實例（不使用全域變數或函數的參數）。</p>
<p>(譯按：當然，你必須Include這個class啦 XD)</p>
<p>下面是範例與比較：</p>
<p>我們通常使用這種的方式建立物件：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>這則是單例模式所使用的方式：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = Database::getInstance();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>結論，單例模式是一種易於使用的設計模式，它限制了類別實例的數量。</p>
<p>範例檔詳見<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">原文</a>的附加檔案。</p>
<h3><span style="color: #008080;">翻譯後記</span></h3>
<p>如同作者所提，單例設計模式是一種很容易理解且容易使用的一種設計模式，目的在於確保一個類別只有一個實例，並提供對該實例的全域存取。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/625/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超好用的jQuery樣板引擎 &#8211; jBind</title>
		<link>http://blog.colorbase.tw/programming/592</link>
		<comments>http://blog.colorbase.tw/programming/592#comments</comments>
		<pubDate>Wed, 17 Jun 2009 11:43:50 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=592</guid>
		<description><![CDATA[我之前分享過過一篇jQuery樣板的文章 - jQuery的JavaScript 樣板引擎 &#8211; royTemplate  裡面有推薦兩個不錯的Javascript樣板，依舊推薦，但我自己寫的那個狗屁不通樣板如果已經使用的人就請勿再使用了，因為使用了這個jBind之後才發現我寫的那個效能奇差無比（差到讓我想噴血），原因是因為我的寫法對效能的影響很大。

今天要介紹的這個jBind樣板引擎的優點剛剛好符合我的需求：
操作簡單（我想沒有人不喜歡簡單吧？）。
要有區塊的功能（這是很常見的需求）。
檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。
執行效能要好。
甚至多了自定義處理的功能。
操作概念一樣是指派JSON變數給樣板，樣板的定義大約如下：
區塊
使用HTML註解表示。例如：




......區塊內的內容.....




若不經過特殊指定，每個樣板需至少指定一個&#60;!&#8211; data &#8211;&#62;為根區塊。
變數
使用大括號「{」及「}」涵蓋。
例如：{name}


{name}



{role}, {type}




一個完整的樣板定義如下




{name}

    

        {role}, {type}

    




一個完整的範例
HTML：




	


{thead1}
{thead2}



	


{bookName}
{author}



	


{tfoot1}
{tfoot2}



	





Javascript：


var vars =
{
	thead1:'書名',
	thead2:'作者',
	tfoot1:'書名',
	tfoot2:'作者',
	rows:
	[
		{
			bookName:'jQuery in Action',
			author:'Bibeault, Bear'

		},
		{
			bookName:'Learning jQuery',
			author:'Jonathan Chaffer、Karl Swedberg',

		}
	]
};

//指派樣板JSON變數，並把結果加入id為show的tag中
var node = $('#tableTemplate').bindTo(vars,{appendTo:'#show'});


結果：





書名
作者




jQuery in Action
Bibeault, Bear




Learning jQuery
Jonathan Chaffer、Karl Swedberg




書名
作者





更多完整、詳細的範例請直接上jBind官網觀看
相關連結：

jBind

]]></description>
			<content:encoded><![CDATA[<p>我之前分享過過一篇jQuery樣板的文章 - <a href="http://blog.colorbase.tw/programming/551" target="_blank">jQuery的JavaScript 樣板引擎 &#8211; royTemplate </a> 裡面有推薦兩個不錯的Javascript樣板，依舊推薦，但我自己寫的那個狗屁不通樣板如果已經使用的人就請勿再使用了，因為使用了這個<a href="http://www.arashkarimzadeh.com/index.php/jquery/11-jbind-jquery-bind-template.html" target="_blank">jBind</a>之後才發現我寫的那個效能奇差無比（差到讓我想噴血），原因是因為我的寫法對效能的影響很大。<br />
<span id="more-592"></span><br />
今天要介紹的這個jBind樣板引擎的優點剛剛好符合我的需求：</p>
<li>操作簡單（我想沒有人不喜歡簡單吧？）。</li>
<li>要有區塊的功能（這是很常見的需求）。</li>
<li>檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。</li>
<li>執行效能要好。</li>
<li>甚至多了自定義處理的功能。</li>
<p>操作概念一樣是指派JSON變數給樣板，樣板的定義大約如下：</p>
<p><strong>區塊</strong></p>
<p>使用HTML註解表示。例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<!-- data -->

......區塊內的內容.....

<!-- data -->
</pre>
</div>
<p>若不經過特殊指定，每個樣板需至少指定一個&lt;!&#8211; data &#8211;&gt;為根區塊。</p>
<p><strong>變數</strong></p>
<p>使用大括號「{」及「}」涵蓋。</p>
<p>例如：{name}</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
{name}

<!--roles-->

{role}, {type}

<!--roles-->
</pre>
</div>
<p>一個完整的樣板定義如下</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<!--data-->

{name}

    <!--roles-->

        {role}, {type}

    <!--roles-->

<!--data-->
</pre>
</div>
<p><strong>一個完整的範例</strong><br />
HTML：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<div style="display:none">
<table width="900" border="0" cellspacing="2" cellpadding="5" id="tableTemplate">
	<!--data-->
<thead>
<tr>
<td width="62%" bgcolor="#CCCCCC">{thead1}</td>
<td width="38%" bgcolor="#CCCCCC">{thead2}</td>
</tr>
</thead>

	<!--rows-->
<tbody>
<tr>
<td><strong>{bookName}</strong></td>
<td>{author}</td>
</tr>
</tbody>

	<!--rows-->
<tfoot>
<tr>
<td bgcolor="#CCCCCC">{tfoot1}</td>
<td bgcolor="#CCCCCC">{tfoot2}</td>
</tr>
</tfoot>

	<!--data-->
</table>
</div>
<div id='show'></div>
</pre>
</div>
<p>Javascript：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">
var vars =
{
	thead1:'書名',
	thead2:'作者',
	tfoot1:'書名',
	tfoot2:'作者',
	rows:
	[
		{
			bookName:'jQuery in Action',
			author:'Bibeault, Bear'

		},
		{
			bookName:'Learning jQuery',
			author:'Jonathan Chaffer、Karl Swedberg',

		}
	]
};

//指派樣板JSON變數，並把結果加入id為show的tag中
var node = $('#tableTemplate').bindTo(vars,{appendTo:'#show'});
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<table id="tableTemplate" border="0" cellpadding="5" cellspacing="2" width="900">
<thead>
<tr>
<td bgcolor="#cccccc" width="62%">書名</td>
<td bgcolor="#cccccc" width="38%">作者</td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>jQuery in Action</strong></td>
<td>Bibeault, Bear</td>
</tr>
</tbody>
<tbody>
<tr>
<td><strong>Learning jQuery</strong></td>
<td>Jonathan Chaffer、Karl Swedberg</td>
</tr>
</tbody>
<tfoot>
<tr>
<td bgcolor="#cccccc">書名</td>
<td bgcolor="#cccccc">作者</td>
</tr>
</tfoot>
</table>
</pre>
</div>
<p>更多完整、詳細的範例請直接上jBind官網觀看</p>
<p>相關連結：</p>
<ul>
<li><a href="http://www.arashkarimzadeh.com/index.php/jquery/11-jbind-jquery-bind-template.html" target="_blank">jBind</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/592/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>把C#與VB.Net當Script執行的兩個工具</title>
		<link>http://blog.colorbase.tw/programming/576</link>
		<comments>http://blog.colorbase.tw/programming/576#comments</comments>
		<pubDate>Tue, 02 Jun 2009 12:50:23 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[軟體介紹]]></category>
		<category><![CDATA[c＃]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[免費軟體]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=576</guid>
		<description><![CDATA[在寫C#時常常需要執行一小段測試用的程式碼，而不管是使用MS Visual Studio或者是SharpDevelop來寫C#，都需要以開新一個測試用專案的方式來寫，著實很麻煩。
今天看到暗黑執行緒於部落格中發佈了一個工具軟體Mini  C# Lab的更新訊息，這是一個可以把C#當成Script來執行的工具，同時它也是由暗黑執行緒所主導的Open Source Project，在同一篇文章中也發現了另一個有異曲同工之妙的工具Snippet  Compiler。

Mini C# Lab

Snippet Compiler 

Mini C# Lab 與 Snippet Compiler 是兩個屬性相同但用處不同的工具
舉例來說，如果你的測試碼是非常小的一段測試碼，就像它預設的範例碼：

using System;
using System.IO;
using System.Threading;

public class CSharpLab
{
    public static void Test()
    {
        for (int i = 0; i &#60; 20; i++)
    ...]]></description>
			<content:encoded><![CDATA[<p>在寫C#時常常需要執行一小段測試用的程式碼，而不管是使用MS Visual Studio或者是<a href="http://www.icsharpcode.net/OpenSource/SD/" target="_blank">SharpDevelop</a>來寫C#，都需要以開新一個測試用專案的方式來寫，著實很麻煩。</p>
<p>今天看到<a href="http://blog.colorbase.tw.darkthread.net/" target="_blank">暗黑執行緒</a>於部落格中發佈了一個工具軟體<a href="http://blog.colorbase.tw.darkthread.net/blogs/darkthreadtw/archive/2009/05/14/3305.aspx" target="_blank">Mini  C# Lab</a>的更新訊息，這是一個可以把C#當成Script來執行的工具，同時它也是由暗黑執行緒所主導的Open Source Project，在同一篇文章中也發現了另一個有異曲同工之妙的工具<a href="http://www.sliver.com/dotnet/SnippetCompiler/" target="_blank">Snippet  Compiler</a>。<br />
<span id="more-576"></span><br />
<strong>Mini C# Lab</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/06/mini-c-lab.gif"><img class="alignnone size-medium wp-image-578" title="mini-c-lab" src="http://blog.colorbase.tw/wp-content/uploads/2009/06/mini-c-lab-300x260.gif" alt="" width="300" height="260" /></a></p>
<p><strong>Snippet Compiler </strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2009/06/sinippet-compiler.gif"><img class="alignnone size-medium wp-image-579" title="sinippet-compiler" src="http://blog.colorbase.tw/wp-content/uploads/2009/06/sinippet-compiler-268x300.gif" alt="" width="268" height="300" /></a></p>
<p>Mini C# Lab 與 Snippet Compiler 是兩個屬性相同但用處不同的工具</p>
<p>舉例來說，如果你的測試碼是非常小的一段測試碼，就像它預設的範例碼：</p>
<div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="c#:nogutter">using System;
using System.IO;
using System.Threading;

public class CSharpLab
{
    public static void Test()
    {
        for (int i = 0; i &lt; 20; i++)
        {
            Thread.Sleep(500);
            Console.Write("Hello, World! ");
        }
        Console.WriteLine("\nDone!");
    }
}
</pre>
</div>
<p>這個時候應該使用Mini C#來測試，因為它是以直接擷取的Output的方式來做測試，簡單方便；而Snippet Compiler卻會跑出一個Console視窗。</p>
<p>但如果你的測試碼是比較完整的一段，通常可能是網路上看到的範例，像它預設的範例碼：</p>
<div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="c:nogutter">using System;
using System.Collections.Generic;

public class MyClass
{
	public static void RunSnippet()
	{

	}

	#region Helper methods

	public static void Main()
	{
		try
		{
			RunSnippet();
		}
		catch (Exception e)
		{
			string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
			Console.WriteLine(error);
		}
		finally
		{
			Console.Write("Press any key to continue...");
			Console.ReadKey();
		}
	}

	private static void WL(object text, params object[] args)
	{
		Console.WriteLine(text.ToString(), args);
	}

	private static void RL()
	{
		Console.ReadLine();
	}

	private static void Break()
	{
		System.Diagnostics.Debugger.Break();
	}

	#endregion
}
</pre>
</div>
<p>這時候就適合使用Snippet Compiler囉，因為Mini C#要求Script裡要有個CSharpLab的類別，並且包含一個Test的方法成員，所以並不適合完整一些的測試程式碼。</p>
<p>總之視情況選擇對的工具，就能加快效率。</p>
<p><strong><span style="color: #008080;">相關連結：</span></strong></p>
<p><a href="http://minicsharplab.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=15109" target="_blank">Mini C# Lab</a><br />
<a href="http://www.sliver.com/dotnet/SnippetCompiler/" target="_blank">Snippet Compiler</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/576/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
