<?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>哇寶部落格</title>
	<atom:link href="http://blog.wabow.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.wabow.com</link>
	<description>Wabow Information Inc. Blog</description>
	<lastBuildDate>Thu, 25 Feb 2010 04:45:47 +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>家的大小事　一輩子都是特力的事</title>
		<link>http://blog.wabow.com/archives/2277</link>
		<comments>http://blog.wabow.com/archives/2277#comments</comments>
		<pubDate>Thu, 25 Feb 2010 04:45:47 +0000</pubDate>
		<dc:creator>abu</dc:creator>
				<category><![CDATA[工作雜談]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2277</guid>
		<description><![CDATA[Trihome 是個以靜態頁面為主的網站，需要管理介面的功能也是少之又少。


在和Neo討論之後，想試試看"內嵌前台"方式來製作這次的管理介面，一開始思索了一下，首先是"如何進入管理模式"，一般正常的方式，不外乎就是進到一個有帳號&#38;密碼欄位的畫面，輸入帳密之後，導向進管理後台，而這次想挑戰的內嵌式，當然要嚐試看看新鮮的寫法，相信有玩過魂斗羅的骨灰級玩家都知道，只要在一開始遊戲畫面中輸入上、上、下、下、左、右、左、右、B、A、B、A，，就可以得到30隻，對於想破關的朋友，莫不是一大福音，根據這樣的"取得隻數"的方式，"取得權限"亦可如法炮制，於是就出現了，魂斗羅內嵌Trihome的想法，在網站的任意位置，只要管理者突然有想進入管理介面的衝動，只要輸入密碼按下Enter，就可以神不知鬼不覺的偷偷進入管理介面，以下即為進入管理介面之後的畫面：


眼尖的朋友應該注意到了，在畫面上有隱約透露出神秘綠光的區塊，這部份是提示管理者，目前頁面上"即將被編輯的區域"，而點擊右上的綠勾，就可以進入真正的編輯區塊了，如下圖：

在編輯區塊內全部採取ajax即時更新資訊方式，讓管理者更能直覺的輸入修改資料。
在一開始構思的時候，本來預定是要真的在網頁上，即時編輯所有內容，不過第一頁就遇到問題了，在首頁的Banner，一次需要上多張Banner，系統判斷上下檔期後，要自動替換，那要可以即時編輯的話，難道要把全部已經上傳的圖都秀出來，版面應該會破的亂七八糟吧，所以才借助了blockUI，把需要編輯的部份通通丟在裡面，以不破壞原始版面為主；在這次撰寫過程，遇到很多問題需要解決，也連帶吸收了不少EXP，整個管理的方式進步空間還很大，不過算是處女作就....勉強算ok，未來有機會的話，可以再嚐試看看不同的方式，朝更人性、更直覺的設計介面前進吧~
]]></description>
			<content:encoded><![CDATA[<p>Trihome 是個以靜態頁面為主的網站，需要管理介面的功能也是少之又少。</p>
<p><img class="alignnone size-full wp-image-2279" src="http://blog.wabow.com/wp-content/uploads/2010/02/tri1.png" alt="" width="500" height="319" /></p>
<p><span id="more-2277"></span></p>
<p>在和Neo討論之後，想試試看"內嵌前台"方式來製作這次的管理介面，一開始思索了一下，首先是"如何進入管理模式"，一般正常的方式，不外乎就是進到一個有帳號&amp;密碼欄位的畫面，輸入帳密之後，導向進管理後台，而這次想挑戰的內嵌式，當然要嚐試看看新鮮的寫法，相信有玩過魂斗羅的骨灰級玩家都知道，只要在一開始遊戲畫面中輸入上、上、下、下、左、右、左、右、B、A、B、A，，就可以得到30隻，對於想破關的朋友，莫不是一大福音，根據這樣的"取得隻數"的方式，"取得權限"亦可如法炮制，於是就出現了，魂斗羅內嵌Trihome的想法，在網站的任意位置，只要管理者突然有想進入管理介面的衝動，只要輸入密碼按下Enter，就可以神不知鬼不覺的偷偷進入管理介面，以下即為進入管理介面之後的畫面：<br />
<img src="http://blog.wabow.com/wp-content/uploads/2010/02/tri2.png" alt="" /><br />
<img src="http://blog.wabow.com/wp-content/uploads/2010/02/tri2_1.png" alt="" /></p>
<p>眼尖的朋友應該注意到了，在畫面上有隱約透露出神秘綠光的區塊，這部份是提示管理者，目前頁面上"即將被編輯的區域"，而點擊右上的綠勾，就可以進入真正的編輯區塊了，如下圖：<br />
<img src="http://blog.wabow.com/wp-content/uploads/2010/02/tri3.png" alt="" /></p>
<p>在編輯區塊內全部採取ajax即時更新資訊方式，讓管理者更能直覺的輸入修改資料。</p>
<p>在一開始構思的時候，本來預定是要真的在網頁上，即時編輯所有內容，不過第一頁就遇到問題了，在首頁的Banner，一次需要上多張Banner，系統判斷上下檔期後，要自動替換，那要可以即時編輯的話，難道要把全部已經上傳的圖都秀出來，版面應該會破的亂七八糟吧，所以才借助了blockUI，把需要編輯的部份通通丟在裡面，以不破壞原始版面為主；在這次撰寫過程，遇到很多問題需要解決，也連帶吸收了不少EXP，整個管理的方式進步空間還很大，不過算是處女作就....勉強算ok，未來有機會的話，可以再嚐試看看不同的方式，朝更人性、更直覺的設計介面前進吧~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2277/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>哇寶 2010 尾牙宴 - 台北京華酒店三燔本家</title>
		<link>http://blog.wabow.com/archives/2270</link>
		<comments>http://blog.wabow.com/archives/2270#comments</comments>
		<pubDate>Sun, 14 Feb 2010 18:53:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[工作雜談]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2270</guid>
		<description><![CDATA[公司這次的尾牙選在台北京華酒店的三燔本家，日期則是訂在1/20。

三燔本家在網路上許多吃過的人都極力推薦，甚至可以說是一生當中一定要吃一次的店。經過哇寶挑嘴團這次尾牙的實地品嚐，雖然價格較高，但的確非常值得親身前往一探究竟。
有多值得呢? 從第一道菜開始沒多久，身邊陸續傳來同事們此起彼落的聲音「好好吃喔~」「嗯~這個真好吃」「喔~太好吃了」...(每道新的菜上來，重覆的戲碼也不斷的上演 XD)
(不只沙拉做的美味，連裝沙拉的碗都又脆又香，吃的不亦樂乎)
(極度受好評的開胃菜)
(生魚片好吃到大家都在用搶的)
(這道牛肉的料理鮮嫩多汁，對牛肉最挑嘴的 Jace 都大力推薦)
(龍蝦海鮮的美妙滋味實在讓人難以忘懷)
(這隻魚一出現沒多久就只剩下骨頭了 XD)

(燒烤的味道也不是蓋的)
這次的主角"和牛"更是不可少，甚至加點了一份頂級和牛來吃。

(用鍋底的蒸氣來吃，這真的是人間美味呀~)
最後的甜點水果一搬進來，真的就是異口同聲的「哇噢~~~」

(照片看起沒什麼，但現場看這個真的非常大一鍋)
雖然有遇到牛小排吃到飽的優惠，但同事有的不吃牛、不吃肉...點吃到飽的並不划算 (註)，所以這次以尾牙以三燔本家的套餐為主。以上的照片也只列出部份餐點，由於現場吃的種類很多，加上平常難得有機會吃到高級料理，只顧著吃都來不及了，能保持理性的人記得每樣菜的人已經不多了。XD
註:使用吃到飽的優惠，包廂全場的每個人都要加一份牛小排吃到飽的價格。

(最後每個人幾乎飽到走不太動了，飽到不行的合照)
今年大家也要一起好好努力，明年繼續吃大餐。^^




 









// 

























 

























]]></description>
			<content:encoded><![CDATA[<p>公司這次的尾牙選在台北京華酒店的三燔本家，日期則是訂在1/20。</p>
<p><img src="http://farm3.static.flickr.com/2694/4290936974_1f8c9a9327.jpg" alt="" /></p>
<p><span id="more-2270"></span>三燔本家在網路上許多吃過的人都極力推薦，甚至可以說是一生當中一定要吃一次的店。經過哇寶挑嘴團這次尾牙的實地品嚐，雖然價格較高，但的確非常值得親身前往一探究竟。</p>
<p>有多值得呢? 從第一道菜開始沒多久，身邊陸續傳來同事們此起彼落的聲音「好好吃喔~」「嗯~這個真好吃」「喔~太好吃了」...(每道新的菜上來，重覆的戲碼也不斷的上演 XD)</p>
<p><img src="http://farm3.static.flickr.com/2745/4290197289_8754e88cdd.jpg" alt="" />(不只沙拉做的美味，連裝沙拉的碗都又脆又香，吃的不亦樂乎)</p>
<p><img src="http://farm3.static.flickr.com/2735/4290197427_5f7c7215e1.jpg" alt="" />(極度受好評的開胃菜)</p>
<p><img src="http://farm3.static.flickr.com/2711/4290197679_23f20a3af1.jpg" alt="" />(生魚片好吃到大家都在用搶的)</p>
<p><img src="http://farm5.static.flickr.com/4025/4290199727_b7dba19bf6.jpg" alt="" />(這道牛肉的料理鮮嫩多汁，對牛肉最挑嘴的 Jace 都大力推薦)</p>
<p><img src="http://farm5.static.flickr.com/4056/4290943170_e2e2849e44.jpg" alt="" />(龍蝦海鮮的美妙滋味實在讓人難以忘懷)</p>
<p><img src="http://farm5.static.flickr.com/4039/4290942708_eb4588439f.jpg" alt="" />(這隻魚一出現沒多久就只剩下骨頭了 XD)<br />
<img src="http://farm5.static.flickr.com/4001/4290942938_3d047d7726.jpg" alt="" /></p>
<p>(燒烤的味道也不是蓋的)</p>
<p>這次的主角"和牛"更是不可少，甚至加點了一份頂級和牛來吃。</p>
<p><img src="http://farm5.static.flickr.com/4012/4290943382_fd702a16c3.jpg" alt="" /></p>
<p>(用鍋底的蒸氣來吃，這真的是人間美味呀~)</p>
<p>最後的甜點水果一搬進來，真的就是異口同聲的「哇噢~~~」</p>
<p><img src="http://farm5.static.flickr.com/4051/4290204809_7283a5f1e5.jpg" alt="" /></p>
<p>(照片看起沒什麼，但現場看這個真的非常大一鍋)</p>
<p>雖然有遇到牛小排吃到飽的優惠，但同事有的不吃牛、不吃肉...點吃到飽的並不划算 (註)，所以這次以尾牙以三燔本家的套餐為主。以上的照片也只列出部份餐點，由於現場吃的種類很多，加上平常難得有機會吃到高級料理，只顧著吃都來不及了，能保持理性的人記得每樣菜的人已經不多了。XD</p>
<p>註:使用吃到飽的優惠，包廂全場的每個人都要加一份牛小排吃到飽的價格。</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2010/02/CIMG0093.jpg"><img class="alignnone size-large wp-image-2271" title="CIMG0093" src="http://blog.wabow.com/wp-content/uploads/2010/02/CIMG0093-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p>(最後每個人幾乎飽到走不太動了，飽到不行的合照)</p>
<p>今年大家也要一起好好努力，明年繼續吃大餐。^^</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<div id="photo_notes" class="photo_notes" style="visibility: visible;">
<div id="notes_text_div" style="z-index: 1000; display: none; position: relative; width: 220px; margin-top: -5px; padding-top: 5px;">
<div id="notes_text_table">
<div class="td_note_yeller  td_note_yeller_container"><span id="notes_text_span"> </span></p>
<form id="notes_text_form">
<input name="magic_cookie" type="hidden" value="c966c9f1b441bcdc11bd05e0739d139b" /><textarea id="notes_text_area" style="height: 58px;" onkeydown="_limit_textarea(this, 300);  _ge('photo_notes').check_note_for_prop()" onkeyup="place_notes_text_div(); adjust_textarea_height(this);  _limit_textarea(this, 300); _ge('photo_notes').check_note_for_prop()" rows="1"></textarea></form>
</div>
</div>
<form id="notes_text_buttons_form">
<input class="Butt" onclick="_ge('photo_notes').save_editing(); this.blur();" type="button" value="儲存" />
<input class="CancelButt" onclick="_ge('photo_notes').cancel_editing(); this.blur();" type="button" value="取消" />
<input id="delete_note_button" class="DeleteButt" onclick="_ge('photo_notes').delete_note();  this.blur();" type="button" value="刪除！" /></form>
</div>
<p><script type="text/javascript">// <![CDATA[
var page_note_ratio = 1;
// ]]&gt;</script><script type="text/javascript"></script></p>
</div>
<div id="comm_div" style="z-index: 1002; display: none;">
<table id="comm_table" style="width: 200px; background: none repeat scroll 0% 0% #ffffff; padding: 3px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="td_white"></td>
<td class="td_white" style="padding: 3px 0px 0px;" width="1" valign="top"><img id="comm_pulser_img" src="http://l.yimg.com/g/images/pulser2.gif" border="0" alt="" width="32" height="15" /></td>
<td id="comm_td" class="td_white" style="padding: 3px; font-size: 12px;"></td>
<td class="td_white"></td>
</tr>
<tr id="comm_button_tr">
<td class="td_white"></td>
<td class="td_white"></td>
<td class="td_white" style="padding: 3px;">
<form>
<input id="comm_button_ok" class="Butt" style="margin: 5px 5px 0pt 0pt;" onclick="this.onclick_func();" type="button" value="OK" />
<input id="comm_button_cancel" class="CancelButt" style="margin: 5px 5px 0pt 0pt;" onclick="this.onclick_func();" type="button" value="取消" /></form>
</td>
<td class="td_white"></td>
</tr>
</tbody>
</table>
</div>
<div id="rotate_div" style="z-index: 1003; display: none;">
<div id="rotate_table" style="width: 218px; background: none repeat scroll 0% 0% #ffffff; padding: 1px;">
<div class="td_note_white" style="padding: 0px; text-align: center; margin-top: 3px;"><span id="rotate_span" style="font-family: arial; font-size: 12px;"> </span></div>
</div>
</div>
<div id="shadow_div" style="z-index: 999; display: none;">
<table class="shadow_table" style="padding: 0px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="11"><img class="shadow_sprite shadow_tl" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="11" /></td>
<td id="shadow_width_controller"><img class="shadow_sprite  shadow_t" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="100%" height="11" /></td>
<td width="11"><img class="shadow_sprite  shadow_tr" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="11" /></td>
</tr>
<tr>
<td id="shadow_height_controller" height="30"><img class="shadow_sprite  shadow_l" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="100%" /></td>
<td></td>
<td><img class="shadow_sprite  shadow_r" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="100%" /></td>
</tr>
<tr>
<td><img class="shadow_sprite  shadow_bl" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="11" /></td>
<td><img id="shadow_width_controller2" class="shadow_sprite  shadow_b" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="100%" height="11" /></td>
<td><img class="shadow_sprite  shadow_br" src="http://l.yimg.com/g/images/spaceout.gif" alt="" width="11" height="11" /></td>
</tr>
</tbody>
</table>
</div>
<p><img class="reflect" src="http://farm3.static.flickr.com/2694/4290936974_1f8c9a9327.jpg" alt="jaceju 拍攝的 P1020432。" width="500" height="333" /></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2270/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HOLA 的網站改版會議</title>
		<link>http://blog.wabow.com/archives/2212</link>
		<comments>http://blog.wabow.com/archives/2212#comments</comments>
		<pubDate>Sat, 09 Jan 2010 09:15:36 +0000</pubDate>
		<dc:creator>Neo</dc:creator>
				<category><![CDATA[工作雜談]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2212</guid>
		<description><![CDATA[回顧去年的時候，特力集團的電子商務團隊負責人跑來我們公司。
會議開始後，從投影機之中映出了一網站，問我們能不能做到這樣的效果?

(這個網站是 Pixazza 。發音 Pix-a-zza 音似: "皮克斯阿殺")

Pixazza 在去年成立時就引發國外媒體關注，這個連 Google 也名列股東之一的公司，做的事看起來明白易懂:「即使是新聞圖片也可以購物」。
雖然很多人笑稱這只是 Flickr + EDM 的變形，國外早年已有類似的應用在型錄上，但實際應用於購物網站在台灣還沒見到。
特力的團隊同時也帶來了 IKEA 的網站做為參考:

 
看完之後，我請另一位同事先放下手邊的工作，從電腦拿出個東西給他們看，我們其實很早就開發出雛形來了。

(這個雛形不只有"點"，甚至可以延伸到"面"。上圖是 Email 給特力團隊時改為廚房情境照)
接著跟特力的團隊討論完技術層面，並且參考 HOLA 的實體型錄內容之後，特力團隊的負責人認為還有一件事要解決，以圖片為購物主軸來結合購物網站並不容易，在國內外都沒有這樣的案例可以參考，也希望我們能提供一些意見。
這次就輪到我來做展示了，其實在討論的過程中就已經想到我們的客戶 BlingCandy 的網站首頁非常適合呈現這樣的購物模式:

首頁上方遠大於一般購物網站的圖片尺寸，可以左右切換不同的圖片來進行購物。
這樣情境圖片便能成為網站購物的主體，網頁下方再規畫為展示及促銷訊息區塊。
就這樣，客戶帶著滿意的微笑離去， HOLA 的新版計畫也就從這裡開始了。
]]></description>
			<content:encoded><![CDATA[<p>回顧去年的時候，特力集團的電子商務團隊負責人跑來我們公司。</p>
<p>會議開始後，從投影機之中映出了一網站，問我們能不能做到這樣的效果?</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2010/01/pixazza3.jpg"><img class="alignnone size-large wp-image-2219" title="pixazza3" src="http://blog.wabow.com/wp-content/uploads/2010/01/pixazza3-500x465.jpg" alt="" width="500" height="465" /></a></p>
<p>(這個網站是 <span style="font-size: x-small;"><a href="http://www.pixazza.com/" target="_blank">Pixazza</a> 。發音 </span>Pix-a-zza 音似: "皮克斯阿殺"<span style="font-size: x-small;">)<br />
</span></p>
<p><span style="font-size: x-small;"><a href="http://www.pixazza.com/" target="_blank"><span id="more-2212"></span>Pixazza</a> 在去年成立時就引發國外<a href="http://news.cnet.com/8301-1023_3-10203588-93.html" target="_blank">媒體關注</a>，</span>這個連 Google 也名列股東之一的公司，做的事看起來明白易懂:「即使是新聞圖片也可以購物」。</p>
<p>雖然很多人笑稱這只是 <a href="http://www.flickr.com" target="_blank">Flickr</a> + EDM 的變形，國外早年已有類似的應用在型錄上，但實際應用於購物網站在台灣還沒見到。</p>
<p>特力的團隊同時也帶來了 <a href="http://www.ikea.com/ca/en/" target="_blank">IKEA </a>的網站做為參考:</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2010/01/ikea1.png"><img class="alignnone size-large wp-image-2215" title="ikea1" src="http://blog.wabow.com/wp-content/uploads/2010/01/ikea1-500x288.png" alt="" width="500" height="288" /></a></p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2010/01/ikea2.jpg"><img class="alignnone size-medium wp-image-2216" title="ikea2" src="http://blog.wabow.com/wp-content/uploads/2010/01/ikea2-300x225.jpg" alt="" width="300" height="225" /></a> <a href="http://blog.wabow.com/wp-content/uploads/2010/01/ikea3.jpg"><img class="alignnone size-medium wp-image-2217" title="ikea3" src="http://blog.wabow.com/wp-content/uploads/2010/01/ikea3-300x226.jpg" alt="" width="300" height="226" /></a></p>
<p>看完之後，我請另一位同事先放下手邊的工作，從電腦拿出個東西給他們看，我們其實很早就開發出雛形來了。</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2010/01/washow.jpg"><img class="alignnone size-full wp-image-2220" title="washow" src="http://blog.wabow.com/wp-content/uploads/2010/01/washow.jpg" alt="" width="470" height="388" /></a></p>
<p>(這個雛形不只有"點"，甚至可以延伸到"面"。上圖是 Email 給特力團隊時改為廚房情境照)</p>
<p>接著跟特力的團隊討論完技術層面，並且參考 HOLA 的實體型錄內容之後，特力團隊的負責人認為還有一件事要解決，以圖片為購物主軸來結合購物網站並不容易，在國內外都沒有這樣的案例可以參考，也希望我們能提供一些意見。</p>
<p>這次就輪到我來做展示了，其實在討論的過程中就已經想到我們的客戶 <a href="http://www.blingcandy.com.tw/" target="_blank">BlingCandy</a> 的網站首頁非常適合呈現這樣的購物模式:</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2009/06/new-2009-4-29-e4b88be58d88-12-28-28.jpg"><img class="alignnone size-large wp-image-1297" title="new-2009-4-29-e4b88be58d88-12-28-28" src="http://blog.wabow.com/wp-content/uploads/2009/06/new-2009-4-29-e4b88be58d88-12-28-28-500x411.jpg" alt="" width="500" height="411" /></a></p>
<p>首頁上方遠大於一般購物網站的圖片尺寸，可以左右切換不同的圖片來進行購物。<br />
這樣情境圖片便能成為網站購物的主體，網頁下方再規畫為展示及促銷訊息區塊。</p>
<p>就這樣，客戶帶著滿意的微笑離去， HOLA 的新版計畫也就從這裡開始了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2212/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Yahoo! 2009 網路爆紅品牌之最</title>
		<link>http://blog.wabow.com/archives/2191</link>
		<comments>http://blog.wabow.com/archives/2191#comments</comments>
		<pubDate>Sun, 03 Jan 2010 16:01:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[客戶紀事]]></category>
		<category><![CDATA[最新消息]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2191</guid>
		<description><![CDATA[回顧 2009 年，Yahoo! 做了一系列的網路活動調查，網路爆紅品牌之最 TOP 10 也是其中之一:

(第1名"天母嚴選"及第10名"御家族"正好都是我們的客戶)
我們非常了解網路市場的經營不易，因此對能入榜 Yahoo! TOP10 的商家都深感佩服。
在這邊也同時祝福台灣所有的電子商務網站在 2010 年能有更好的成績。TAIWAN UP!
相關網頁:
Yahoo! 奇摩2009之最
]]></description>
			<content:encoded><![CDATA[<p>回顧 2009 年，Yahoo! 做了一系列的網路活動調查，<a href="http://yahoo.atlaspost.com/Tw.promotions.yahoo.com/YIR2009/top10.php?cid=31" target="_blank">網路爆紅品牌之最 TOP 10</a> 也是其中之一:</p>
<p style="text-align: center;"><a href="http://blog.wabow.com/wp-content/uploads/2010/01/yahoo2009bestbrand.png" target="_blank"><img class="alignnone size-large wp-image-2192" title="yahoo2009bestbrand" src="http://blog.wabow.com/wp-content/uploads/2010/01/yahoo2009bestbrand-322x500.png" alt="" width="322" height="500" /></a></p>
<p style="text-align: center;">(第1名"<a href="http://www.gotobuy.com.tw/" target="_blank">天母嚴選</a>"及第10名"<a href="http://www.ace-88.com/" target="_blank">御家族</a>"正好都是我們的客戶)</p>
<p><span id="more-2191"></span>我們非常了解網路市場的經營不易，因此對能入榜 Yahoo! TOP10 的商家都深感佩服。</p>
<p>在這邊也同時祝福台灣所有的電子商務網站在 2010 年能有更好的成績。TAIWAN UP!</p>
<p>相關網頁:<br />
<a href="http://yahoo.atlaspost.com/Tw.promotions.yahoo.com/YIR2009/index.php?PAGE_TAG_ID=64" target="_blank">Yahoo! 奇摩2009之最</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2191/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>御家族網站上線，喚醒體內的零食基因</title>
		<link>http://blog.wabow.com/archives/2149</link>
		<comments>http://blog.wabow.com/archives/2149#comments</comments>
		<pubDate>Sat, 02 Jan 2010 08:28:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[客戶紀事]]></category>
		<category><![CDATA[最新消息]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2149</guid>
		<description><![CDATA[

上線日期: 2009/11/30
沒吃過御海苔，等於這輩子沒吃過海苔。
御海苔有多好吃? Google 搜尋 "御海苔" 所出現的一大串團購、勸敗文:
小華兒愛瞎拼_【團購】御家族的御海苔~忍不住想吃咧

喵喵の簡單生活 ::【團購】御家族的味付海苔&#38;手工達人之黃金蛋捲

[團購]板橋市。寬泓御海苔@ 佳莉。心情:: 痞客邦PIXNET ::
yumi的隨意札記: 【零食】味付御海苔- yam天空部落
御家族除了海苔很有名之外，陸續推出了許多不同種類的零食。
這次很高興能有機會跟御家族的團隊合作，他們真的很在乎每一位網友的反應，對於自家購物網站也要求一定要做到最好、最方便訂購。
御家族網站在2009 年尾很順利的上線了，但偷偷告訴大家，這個網站的重頭戲還沒來，2010 年初將提供一般購物網站難得一見的新功能，敬請期待。

御家族官方購物網站: 

http://www.ace-88.com/
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="upload.php"><img class="alignnone size-large wp-image-2157" title="ace88-wabow" src="http://blog.wabow.com/wp-content/uploads/2010/01/ace88-wabow-306x499.png" alt="" width="306" height="499" /><br />
</a></p>
<p style="text-align: center;">上線日期: 2009/11/30</p>
<h2><span id="more-2149"></span>沒吃過御海苔，等於這輩子沒吃過海苔。</h2>
<p>御海苔有多好吃? Google 搜尋 "御海苔" 所出現的一大串團購、勸敗文:</p>
<h3><a onmousedown="return rwt(this,'','','res','6','AFQjCNFh-muqBAlFWkzVC_kcli6dhzNUCw','&amp;sig2=Ht5gwvz4c6ThHUayhKTLvQ','0CB8QFjAF')" href="http://www.calldoor.com.tw/myblog/nimi57/articles/17523" target="_blank">小華兒愛瞎拼_【團購】<em>御家族</em>的御<em>海苔</em>~忍不住想吃咧<br />
</a></h3>
<h3><a onmousedown="return rwt(this,'','','res','1','AFQjCNH7wUHWX9jjLKuv2dpSLz8YatpOMQ','&amp;sig2=HbVkLjDdLmogY1RdMsEBNA','0CAcQFjAA')" href="http://nicole0726.pixnet.net/blog/post/24458083" target="_blank">喵喵の簡單生活 ::【<em>團購</em>】御家族的味付海苔&amp;手工達人之黃金蛋捲<br />
</a></h3>
<h3><a onmousedown="return rwt(this,'','','res','13','AFQjCNGDyWDZ1JrOClPR-u-gRYxthlmlQw','&amp;sig2=0XLo6DfWddfAAZMKb2DT6Q','0CBAQFjACOAo')" href="http://www.google.com.tw/url?sa=t&amp;source=web&amp;ct=res&amp;cd=13&amp;ved=0CBAQFjACOAo&amp;url=http%3A%2F%2Fchialy.pixnet.net%2Fblog%2Fpost%2F23714440&amp;ei=8vw-S__XI8GHkQWQ-vGDCQ&amp;usg=AFQjCNGDyWDZ1JrOClPR-u-gRYxthlmlQw&amp;sig2=0XLo6DfWddfAAZMKb2DT6Q" target="_blank">[團購]板橋市。寬泓<em>御海苔</em>@ 佳莉。心情:: 痞客邦PIXNET ::</a></h3>
<h3><a onmousedown="return rwt(this,'','','res','8','AFQjCNGqKZgpaeil5bftV03kdGuLNjtksQ','&amp;sig2=PfFD3fsPtOguxidvsbd46g','0CCgQFjAH')" href="http://www.google.com.tw/url?sa=t&amp;source=web&amp;ct=res&amp;cd=8&amp;ved=0CCgQFjAH&amp;url=http%3A%2F%2Fblog.yam.com%2Fyumi721%2Farticle%2F3329132&amp;ei=dPw-S4n6GM6LkAWtkPT3CA&amp;usg=AFQjCNGqKZgpaeil5bftV03kdGuLNjtksQ&amp;sig2=PfFD3fsPtOguxidvsbd46g" target="_blank">yumi的隨意札記: 【零食】味付<em>御海苔</em>- yam天空部落</a></h3>
<p>御家族除了海苔很有名之外，陸續推出了許多不同種類的零食。</p>
<p>這次很高興能有機會跟御家族的團隊合作，他們真的很在乎每一位網友的反應，對於自家購物網站也要求一定要做到最好、最方便訂購。</p>
<p>御家族網站在2009 年尾很順利的上線了，但偷偷告訴大家，這個網站的重頭戲還沒來，2010 年初將提供一般購物網站難得一見的新功能，敬請期待。<a href="http://www.ace-88.com/" target="_blank"></p>
<p></a></p>
<p>御家族官方購物網站: <a href="http://www.ace-88.com/" target="_blank"><br />

http://www.ace-88.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2149/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>美麗華 IMAX 3D 體驗阿凡達的真實世界</title>
		<link>http://blog.wabow.com/archives/2141</link>
		<comments>http://blog.wabow.com/archives/2141#comments</comments>
		<pubDate>Fri, 01 Jan 2010 06:22:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[工作雜談]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2141</guid>
		<description><![CDATA[阿凡達 AVATAR 這部劃時代的電影上映，許多企業紛紛包場體恤辛苦的工作同仁們。

哇寶當然不能錯過這個新時代 3D 電影的響宴，阿凡達在台正式上映前便已預訂在台灣螢幕最大的美麗華 IMAX 影廳，讓全體同仁體驗身歷其境的 IMAX 3D 的潘朵拉星球之旅。

(哇寶夥伴們在阿凡達立牌前合影)
阿凡達這部電影成功的寫下影史的新頁，相信台灣未來也能做出更多舉世刮目相看的革命性產品。
TAIWAN UP!
]]></description>
			<content:encoded><![CDATA[<p>阿凡達 AVATAR 這部劃時代的電影上映，許多企業紛紛包場體恤辛苦的工作同仁們。</p>
<p><a href="http://www.atmovies.com.tw/movie/film.asp?action=now&amp;film_id=faen00499549" target="_blank"><img class="alignnone size-full wp-image-2142" title="3170" src="http://blog.wabow.com/wp-content/uploads/2010/01/3170.jpg" alt="" width="383" height="572" /></a></p>
<p><span id="more-2141"></span>哇寶當然不能錯過這個新時代 3D 電影的響宴，阿凡達在台正式上映前便已預訂在台灣螢幕最大的美麗華 IMAX 影廳，讓全體同仁體驗身歷其境的 IMAX 3D 的潘朵拉星球之旅。</p>
<p><img class="alignnone size-large wp-image-2143" title="CIMG9542" src="http://blog.wabow.com/wp-content/uploads/2010/01/CIMG9542-500x375.jpg" alt="" width="500" height="375" /></p>
<p>(哇寶夥伴們在阿凡達立牌前合影)</p>
<p>阿凡達這部電影成功的寫下影史的新頁，相信台灣未來也能做出更多舉世刮目相看的革命性產品。</p>
<p>TAIWAN UP!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2141/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>噗浪備份工具 BKPlurk Beta 上線</title>
		<link>http://blog.wabow.com/archives/2124</link>
		<comments>http://blog.wabow.com/archives/2124#comments</comments>
		<pubDate>Sat, 12 Dec 2009 11:51:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最新消息]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2124</guid>
		<description><![CDATA[Plurk 的官方API 出來之後，第一件事當然就是要用來好好的備份噗浪啦。


噗浪備份工具 BKPlurk Beta 測試上線網址:
http://www.wabow.com/bkplurk/
在噗浪官方 API 發布前，備份工具大多只能備份自己的噗，因此這次在做 BKPlurk 時就把備份"回噗"列為重點。
為了觀看方便，所以備份檔案採用 HMTL 格式，點一下就可以看到回噗了。
(至於 CSV 的格式目前還在規畫中)
使用上有任何問題或意見也歡迎大家提出來一起討論。^^
更新記錄:
12/15: 感謝 Jace 做的新畫面 (點此回顧初版的畫面)
]]></description>
			<content:encoded><![CDATA[<p>Plurk 的<a href="http://www.plurk.com/API" target="_blank">官方API</a> 出來之後，第一件事當然就是要用來好好的備份噗浪啦。</p>
<p><a title="http://www.wabow.com/bkplurk/" href="http://www.wabow.com/bkplurk/" target="_blank"><img class="alignnone size-large wp-image-2131" title="bkplurk2" src="http://blog.wabow.com/wp-content/uploads/2009/12/bkplurk2-460x500.png" alt="bkplurk2" width="460" height="500" /></a></p>
<p><span id="more-2124"></span></p>
<p>噗浪備份工具 BKPlurk Beta 測試上線網址:<br />
<a href="http://www.wabow.com/bkplurk/" target="_blank">http://www.wabow.com/bkplurk/</a></p>
<p>在噗浪官方 API 發布前，備份工具大多只能備份自己的噗，因此這次在做 BKPlurk 時就把備份"回噗"列為重點。</p>
<p>為了觀看方便，所以備份檔案採用 HMTL 格式，點一下就可以看到回噗了。<br />
(至於 CSV 的格式目前還在規畫中)</p>
<p>使用上有任何問題或意見也歡迎大家提出來一起討論。^^</p>
<p><span style="color: #ff0000;">更新記錄</span>:<br />
12/15: 感謝 Jace 做的新畫面 (<a href="http://blog.wabow.com/wp-content/uploads/2009/12/bkplurk.png" target="_blank">點此</a>回顧初版的畫面)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2124/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>天母嚴選 Gotobuy 網站上線</title>
		<link>http://blog.wabow.com/archives/2116</link>
		<comments>http://blog.wabow.com/archives/2116#comments</comments>
		<pubDate>Wed, 18 Nov 2009 11:57:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[客戶紀事]]></category>
		<category><![CDATA[最新消息]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2116</guid>
		<description><![CDATA[Yahoo! 購物中心最大的女裝品牌「天母嚴選」購物網站在 11/15 正式上線了。

不就是個服裝購物網站嘛?
如果這麼想可就大大的錯囉。
只要在 Yahoo! 購物中心 或 Gotobuy 網站消費，都可以累積紅利積點兌換好康商品喔。接下來即將登場的優惠折扣機制，讓網友即使在實體通路也能享受到天母嚴選異業合作的大優惠，真的是賺翻啦。
在建置的過程當中，最複雜的地方在於庫存的調撥機制，為了讓天母嚴選在不同的通路都能有正確的數量，花了很多時間跟天母嚴選的團隊一起討論、修正、討論、再修正，過程當中天母嚴選的倉管、物流、客服人員也很用心的提出作業的流程建議參考，在雙方不斷的努力下，最後終於讓網站順利的完成上線了。
上線後才驚覺天母嚴選的團隊更是臥虎藏龍，有人在家隨手就畫出了這張 Gotobuy 的 7-11 取貨圖。

別再等啦~ 想親身體驗各種不同風格的時尚穿搭，來 Gotobuy 就對了! ^^
天母嚴選 Gotobuy 網址:
http://www.gotobuy.com.tw/
同場加映，網站開發中畫面:

]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Yahoo! 購物中心最大的女裝品牌「<a href="http://buy.yahoo.com.tw/?sub=231" target="_blank">天母嚴選</a>」購物網站在 11/15 正式上線了。</p>
<p style="text-align: left;"><a href="http://www.gotobuy.com.tw" target="_blank"><img class="size-large wp-image-2115 aligncenter" title="gotobuy" src="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy-278x499.png" alt="gotobuy" width="278" height="499" /></a><br />
<span id="more-2116"></span>不就是個服裝購物網站嘛?</p>
<p style="text-align: left;">如果這麼想可就大大的錯囉。</p>
<p style="text-align: left;">只要在 Yahoo! 購物中心 或 Gotobuy 網站消費，都可以累積紅利積點兌換好康商品喔。接下來即將登場的優惠折扣機制，讓網友即使在實體通路也能享受到天母嚴選異業合作的大優惠，真的是賺翻啦。</p>
<p>在建置的過程當中，最複雜的地方在於庫存的調撥機制，為了讓天母嚴選在不同的通路都能有正確的數量，花了很多時間跟天母嚴選的團隊一起討論、修正、討論、再修正，過程當中天母嚴選的倉管、物流、客服人員也很用心的提出作業的流程建議參考，在雙方不斷的努力下，最後終於讓網站順利的完成上線了。</p>
<p>上線後才驚覺天母嚴選的團隊更是臥虎藏龍，有人在家隨手就畫出了這張 Gotobuy 的 7-11 取貨圖。</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy7-11.jpg"><img class="alignnone size-large wp-image-2117" title="gotobuy7-11" src="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy7-11-500x222.jpg" alt="gotobuy7-11" width="500" height="222" /></a></p>
<p>別再等啦~ <strong>想親身體驗各種不同風格的時尚穿搭，來 <a href="http://www.gotobuy.com.tw/" target="_blank">Gotobuy</a> 就對了!</strong> ^^</p>
<p>天母嚴選 Gotobuy 網址:<br />
<a href="http://www.gotobuy.com.tw/" target="_blank">http://www.gotobuy.com.tw/</a></p>
<p><strong><span style="color: #ff6600;">同場加映，網站開發中畫面</span></strong>:<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy-develop.png"><img class="alignnone size-thumbnail wp-image-2121" title="gotobuy-develop" src="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy-develop-150x150.png" alt="gotobuy-develop" width="150" height="150" /></a><a href="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy-develop2.png"><img class="alignnone size-thumbnail wp-image-2120" title="gotobuy-develop2" src="http://blog.wabow.com/wp-content/uploads/2009/11/gotobuy-develop2-150x150.png" alt="gotobuy-develop2" width="150" height="150" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2116/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[轉載][SVN] 為 Subversion 的 post-commit mail 加入專案名稱</title>
		<link>http://blog.wabow.com/archives/2112</link>
		<comments>http://blog.wabow.com/archives/2112#comments</comments>
		<pubDate>Fri, 02 Oct 2009 12:21:06 +0000</pubDate>
		<dc:creator>jaceju</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2112</guid>
		<description><![CDATA[本文轉載自：[SVN] 為 Subversion 的 post-commit mail 加入專案名稱
問題
目前我們公司是用 Subversion 做為版本控管系統，在 commit 時都會需要把版本更新訊息寄送給相關人員，當然這就會用到 post-commit 這個 hook 指令；而在 post-commit 中，我們可以利用 bash 語法去呼叫寄信程式。

不過預設建立好的 Repository 下的 hooks 目錄並沒有這個檔案，我們可以把預設的 post-commit.tmpl 複製成 post-commit ：

# cp /path-to-svn-repository/project_name/hooks/post-commit.tmpl /path-to-svn-repository/project_name/hooks/post-commit

至於寄信程式的部份，在 Subversion 的 Source code 裡就提供了一個很有用的 mailer.py ，它可以協助我們寄送 commit 後的訊息。
原來的 post-commit 內容如下：

#!/bin/sh
&#160;
# POST-COMMIT HOOK
# (略)
&#160;
REPOS=&#34;$1&#34;
REV=&#34;$2&#34;
&#160;
commit-email.pl &#34;$REPOS&#34; &#34;$REV&#34; commit-watchers@example.org
log-commit.py --repository &#34;$REPOS&#34; --revision &#34;$REV&#34;

將它修改為：

#!/bin/sh    
&#160;
# [...]]]></description>
			<content:encoded><![CDATA[<p>本文轉載自：<a href="http://www.jaceju.net/blog/?p=733">[SVN] 為 Subversion 的 post-commit mail 加入專案名稱</a></p>
<h2>問題</h2>
<p>目前我們公司是用 Subversion 做為版本控管系統，在 commit 時都會需要把版本更新訊息寄送給相關人員，當然這就會用到 post-commit 這個 hook 指令；而在 post-commit 中，我們可以利用 bash 語法去呼叫寄信程式。</p>
<p><span id="more-2112"></span></p>
<p>不過預設建立好的 Repository 下的 hooks 目錄並沒有這個檔案，我們可以把預設的 post-commit.tmpl 複製成 post-commit ：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># cp /path-to-svn-repository/project_name/hooks/post-commit.tmpl /path-to-svn-repository/project_name/hooks/post-commit</pre></div></div>

<p>至於寄信程式的部份，在 Subversion 的 Source code 裡就提供了一個很有用的 mailer.py ，它可以協助我們寄送 commit 後的訊息。</p>
<p>原來的 post-commit 內容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># POST-COMMIT HOOK</span>
<span style="color: #666666; font-style: italic;"># (略)</span>
&nbsp;
<span style="color: #007800;">REPOS</span>=<span style="color: #ff0000;">&quot;$1&quot;</span>
<span style="color: #007800;">REV</span>=<span style="color: #ff0000;">&quot;$2&quot;</span>
&nbsp;
commit-email.pl <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REPOS</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REV</span>&quot;</span> commit-watchers<span style="color: #000000; font-weight: bold;">@</span>example.org
log-commit.py <span style="color: #660033;">--repository</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REPOS</span>&quot;</span> <span style="color: #660033;">--revision</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REV</span>&quot;</span></pre></div></div>

<p>將它修改為：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh    </span>
&nbsp;
<span style="color: #666666; font-style: italic;"># POST-COMMIT HOOK </span>
<span style="color: #666666; font-style: italic;"># (略) </span>
&nbsp;
<span style="color: #007800;">REPOS</span>=<span style="color: #ff0000;">&quot;$1&quot;</span>
<span style="color: #007800;">REV</span>=<span style="color: #ff0000;">&quot;$2&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">/</span>path-to-subversion-source<span style="color: #000000; font-weight: bold;">/</span>tools<span style="color: #000000; font-weight: bold;">/</span>hook-scripts<span style="color: #000000; font-weight: bold;">/</span>mailer<span style="color: #000000; font-weight: bold;">/</span>mailer.py commit <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REPOS</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REV</span>&quot;</span>
<span style="color: #666666; font-style: italic;"># log-commit.py --repository &quot;$REPOS&quot; --revision &quot;$REV&quot;</span></pre></div></div>

<p>不過用原始的 mailer.py 有個缺點，主要是它寄送的訊息主旨範例如下：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">r3214 - branches/2.0</pre></div></div>

<p>這樣在多個專案時，我們就不容易識別這次的更新是哪個專案。</p>
<p>所以我就想透過修改 mailer.py ，讓它產生如下的主旨：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[project_name] r3214 - branches/2.0</pre></div></div>

<h2>修改方式</h2>
<p>改法很簡單，有兩個地方要改： (針對 Subversion 版本 1.4.4 原始檔)</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> commondir:
  <span style="color: #008000;">self</span>.<span style="color: black;">output</span>.<span style="color: black;">subject</span> = <span style="color: #483d8b;">'r%d - in %s: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>repos.<span style="color: black;">rev</span>, commondir, dirlist<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
  <span style="color: #008000;">self</span>.<span style="color: black;">output</span>.<span style="color: black;">subject</span> = <span style="color: #483d8b;">'r%d - %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>repos.<span style="color: black;">rev</span>, dirlist<span style="color: black;">&#41;</span></pre></div></div>

<p>改成：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> commondir:
  <span style="color: #008000;">self</span>.<span style="color: black;">output</span>.<span style="color: black;">subject</span> = <span style="color: #483d8b;">'[%s] r%d - in %s: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>repos.<span style="color: black;">project_name</span>, repos.<span style="color: black;">rev</span>, commondir, dirlist<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
  <span style="color: #008000;">self</span>.<span style="color: black;">output</span>.<span style="color: black;">subject</span> = <span style="color: #483d8b;">'[%s] r%d - %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>repos.<span style="color: black;">project_name</span>, repos.<span style="color: black;">rev</span>, dirlist<span style="color: black;">&#41;</span></pre></div></div>

<p>也就是這裡我多加了一個 repos.project_name ，讓信件主旨可以多一個專案名稱。不過 projects_name 並不是 repos 的屬性，所以我們還要再修改一個地方。</p>
<p>往下找到：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #008000;">self</span>.<span style="color: black;">author</span> = <span style="color: #008000;">self</span>.<span style="color: black;">get_rev_prop</span><span style="color: black;">&#40;</span>svn.<span style="color: black;">core</span>.<span style="color: black;">SVN_PROP_REVISION_AUTHOR</span><span style="color: black;">&#41;</span></pre></div></div>

<p>然後在底下加入一行：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #008000;">self</span>.<span style="color: black;">project_name</span> = repos_dir<span style="color: black;">&#91;</span><span style="color: #ff4500;">10</span>:<span style="color: black;">&#93;</span></pre></div></div>

<p>其中 10 這個數字是指 /path-to-svn-repository/ 的長度，因為 repos_dir 的內容會是 /path-to-svn-repository/project-name ，而字串是由 0 開始算起，那麼 project_name 的起始位置就會剛好是 /path-to-svn-repository/ 的長度。 (所以請自行計算並更改之)</p>
<p>至於為什麼我會知道 repos_dir 的內容，這是因為我在一開始就用了以下的程式去印出它：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;mailer.log&quot;</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
f.<span style="color: black;">write</span><span style="color: black;">&#40;</span>repos_dir<span style="color: black;">&#41;</span>
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>當然這邊要注意縮排。</p>
<h2>結論</h2>
<p>Python 對我來說，其實是一個不熟悉的語言。不過它的語法也不是那麼難以理解，以我這種三流能力，竟然還能看懂並修改它。</p>
<p>而 mailer.py 也大量使用了物件導向的寫法，所以未來有機會在開發 Python 程式時，在物件導向的基礎也是不可或缺的。</p>
<p>就這樣啦~謝謝收看~再會~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2112/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP]免費的檔案瀏覽工具 fileNice</title>
		<link>http://blog.wabow.com/archives/2106</link>
		<comments>http://blog.wabow.com/archives/2106#comments</comments>
		<pubDate>Thu, 27 Aug 2009 07:34:03 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[軟體測試]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2106</guid>
		<description><![CDATA[
官方網站  http://filenice.com/
展示網頁  http://filenice.com/demo/
介紹
filenice是一套用php編寫的檔案瀏覽工具，作用在你本身如果有架設網站並有某個資料夾提供上傳檔案，當你想要查看這個資料夾中有哪些檔案時，filenice提供使用瀏覽器就可以查看的功能。
安裝
到官網下載檔案(http://filenice.com/demo/fileNice.zip)，下載完畢將解壓縮後的檔案放到網站伺服器上你想要瀏覽檔案的資料夾下即可。
優點
官方的說明是filenice是使用php+javascript也就是所謂的Ajax技術編寫的，因此速度比較快，而且當應用程式忙碌時可以返回而不會整個畫面當掉。此外使用filenice不需要安裝任何資料庫。
感想
filenice提供了無須安裝其他軟體，僅需使用瀏覽器就可觀看主機上提供upload的資料夾下的內容，也可自訂瀏覽檔案的一些排列等細節，另外也提供搜尋的功能。不過個人比較覺得可惜的是，因為無須登入帳密即可觀看，在安全性上稍顯不足，不過或是也因此除了觀看以外，並沒有額外提供刪除或是上傳的功能吧!?介紹給大家用看看!
]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.wabow.com/wp-content/uploads/2009/08/sample10-500x260.gif" alt="sample10" width="500" height="260" class="aligncenter size-large wp-image-2107" /></p>
<p>官方網站  <a href="http://filenice.com/">http://filenice.com/</a><br />
展示網頁  <a href="http://filenice.com/demo/">http://filenice.com/demo/</a><span id="more-2106"></span></p>
<h3>介紹</h3>
<p>filenice是一套用php編寫的檔案瀏覽工具，作用在你本身如果有架設網站並有某個資料夾提供上傳檔案，當你想要查看這個資料夾中有哪些檔案時，filenice提供使用瀏覽器就可以查看的功能。</p>
<h3>安裝</h3>
<p>到官網下載檔案(http://filenice.com/demo/fileNice.zip)，下載完畢將解壓縮後的檔案放到網站伺服器上你想要瀏覽檔案的資料夾下即可。</p>
<h3>優點</h3>
<p>官方的說明是filenice是使用php+javascript也就是所謂的Ajax技術編寫的，因此速度比較快，而且當應用程式忙碌時可以返回而不會整個畫面當掉。此外使用filenice不需要安裝任何資料庫。</p>
<h3>感想</h3>
<p>filenice提供了無須安裝其他軟體，僅需使用瀏覽器就可觀看主機上提供upload的資料夾下的內容，也可自訂瀏覽檔案的一些排列等細節，另外也提供搜尋的功能。不過個人比較覺得可惜的是，因為無須登入帳密即可觀看，在安全性上稍顯不足，不過或是也因此除了觀看以外，並沒有額外提供刪除或是上傳的功能吧!?介紹給大家用看看!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2106/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PHP] PHP 密技： include 與 require</title>
		<link>http://blog.wabow.com/archives/2104</link>
		<comments>http://blog.wabow.com/archives/2104#comments</comments>
		<pubDate>Thu, 27 Aug 2009 07:25:54 +0000</pubDate>
		<dc:creator>jaceju</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2104</guid>
		<description><![CDATA[轉載自：[PHP] PHP 密技： include 與 require
可以接受回傳資料？
先調查一下，知道 include 或 require 可以取得回傳資料的請舉手... (眺望)
呃...不知道的朋友也不用煩惱，我來解釋一下。

如何回傳資料呢？假設現在有個 php 檔叫做 config.php ，內容如下：

&#60;?php
return array&#40;'123', '456'&#41;;

咦？那邊有人說 return 放錯地方了？不不不， PHP 能接受這樣的寫法。
好，現在我們來證明 include 或 require 能取得 config.php 所 return 回來的資料。請建立一支 test.php ，其內容是：

$config = require 'config.php';
var_dump&#40;$config&#41;;

執行看看，是不是可以跑呀？
所以我們可以在某支 PHP 程式中 return 一個資料 (任何型態) ，然後在另一支 PHP 程式中用 include 或 require 來取得這個資料。 
把 require 放在參數裡 
什麼？這不是密技？不不不，密技在底下：

function test&#40;$config&#41; &#123;
    [...]]]></description>
			<content:encoded><![CDATA[<p>轉載自：<a href="http://www.jaceju.net/blog/?p=316">[PHP] PHP 密技： include 與 require</a></p>
<h2>可以接受回傳資料？</h2>
<p>先調查一下，知道 include 或 require 可以取得回傳資料的請舉手... (眺望)</p>
<p>呃...不知道的朋友也不用煩惱，我來解釋一下。</p>
<p><span id="more-2104"></span></p>
<p>如何回傳資料呢？假設現在有個 php 檔叫做 config.php ，內容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'123'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'456'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>咦？那邊有人說 return 放錯地方了？不不不， PHP 能接受這樣的寫法。</p>
<p>好，現在我們來證明 include 或 require 能取得 config.php 所 return 回來的資料。請建立一支 test.php ，其內容是：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>執行看看，是不是可以跑呀？</p>
<p>所以我們可以在某支 PHP 程式中 return 一個資料 (任何型態) ，然後在另一支 PHP 程式中用 include 或 require 來取得這個資料。 </p>
<h2>把 require 放在參數裡 </h2>
<p>什麼？這不是密技？不不不，密技在底下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
test<span style="color: #009900;">&#40;</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>對！你沒看錯！直接把 require 放在函式的參數裡！</p>
<p>還沒完呢，再看：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Test
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Test<span style="color: #009900;">&#40;</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>連 new 建構子的參數都可以接受 require ！</p>
<p>所以只要能放變數的地方，都可以放 include 或 require ，例如：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>而且不僅是 include 及 require ，連 include_once 和 require_once 都可以這麼做。</p>
<p>我在<a href="http://blog.astrumfutura.com/archives/340-The-Zend-Framework,-Dependency-Injection-and-Zend_Di.html">某篇文章</a>發現這個密技以後，分享給辦公室裡的同事們；沒想到玩了 PHP 這麼多年的他們也沒看過這個方法，看來大家對 PHP 的瞭解需要更深入一點囉！</p>
<h2>Scope 的問題 </h2>
<p>接著我同事問了我一個問題：如果在參數使用 require 敘述，而且被 require 的 PHP 程式裡如果有定義全域變數的話，那麼這個變數在執行的 PHP 程式裡，它的 scope 在哪裡呢？</p>
<p>答案是：它還是全域。</p>
<p>怎麼說呢？現在我們在剛剛的 config.php 的 return 敘述前加上一行程式，如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'789'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 加上這行</span>
<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'123'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'456'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>然後在 test.php 裡的 Global 部份 (也就是不在函式或類別定義裡) 的任意處加入：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>是不是也可以正確顯示 config.php 中 $data 變數所指定的內容呢？這就表示在參數中使用 require 不會影響全域變數的 scope 。</p>
<p>還有其他 include 或 require 的密技嗎？歡迎大家一起討論囉~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2104/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用 PHP 查 DOMAIN 的 CNAME 紀錄</title>
		<link>http://blog.wabow.com/archives/2066</link>
		<comments>http://blog.wabow.com/archives/2066#comments</comments>
		<pubDate>Thu, 27 Aug 2009 06:44:34 +0000</pubDate>
		<dc:creator>suzy</dc:creator>
				<category><![CDATA[軟體測試]]></category>
		<category><![CDATA[cname]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2066</guid>
		<description><![CDATA[接獲一項來自 Neo 的任務, "用PHP 實作由 CNAME 去判定新加入服務的 DOMAIN 為申請人所有" (證明他不是來亂的).
For Example:
Google Apps 就是用這個方式去作驗證

CNAME 是 DOMAIN or SUB DOMAIN 指向另一個 DOMAIN 的方式. (跟 alias 一樣)
那麼如果要用 PHP 實作呢? 有兩種方式 :
1. PHP5 內建的 dns_get_record() (Windows &#38; BSD &#38; Mac 不適用)
2. PEAR NET_DNS
NET_DNS 原理是用 fsockopen("你的 DNS SERVER IP", 53),
但是要先自己組合出 "封包的header data" 再丟過去, DNS Server 才會理你唷.
這些複雜的部份 NET_DNS 已經都幫我們做好了.
我們只要:

require_once&#40;'Net/DNS.php'&#41;;
$ndr = new [...]]]></description>
			<content:encoded><![CDATA[<p>接獲一項來自 Neo 的任務, "用PHP 實作由 CNAME 去判定新加入服務的 DOMAIN 為申請人所有" (證明他不是來亂的).</p>
<p>For Example:<br />
<a href="http://www.google.com/support/a/bin/answer.py?hl=b5&amp;answer=92354">Google Apps 就是用這個方式去作驗證</a><br />
<span id="more-2066"></span></p>
<p><a href="http://www.google.com.tw/search?hl=zh-TW&amp;q=CNAME">CNAME</a> 是 DOMAIN or SUB DOMAIN 指向另一個 DOMAIN 的方式. (跟 alias 一樣)</p>
<p>那麼如果要用 PHP 實作呢? 有兩種方式 :<br />
1. PHP5 內建的 dns_get_record() (Windows &amp; BSD &amp; Mac 不適用)<br />
2. PEAR <a href="http://pear.php.net/package/Net_DNS">NET_DNS</a></p>
<p>NET_DNS 原理是用 fsockopen("你的 DNS SERVER IP", 53),<br />
但是要先自己組合出 "封包的header data" 再丟過去, DNS Server 才會理你唷.<br />
這些複雜的部份 NET_DNS 已經都幫我們做好了.</p>
<p>我們只要:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Net/DNS.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ndr</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Net_DNS_Resolver<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$answer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ndr</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">search</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;www.OOO.com&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;CNAME&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;pre&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$answer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 獲得的結果</span>
<span style="color: #990000;">Array</span>
<span style="color: #009900;">&#40;</span>
    <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Net_DNS_RR_CNAME Object
        <span style="color: #009900;">&#40;</span>
            <span style="color: #009900;">&#91;</span>name<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> www<span style="color: #339933;">.</span>OOO<span style="color: #339933;">.</span>co<span style="color: #339933;">.</span>nz
            <span style="color: #009900;">&#91;</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> CNAME
            <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> IN
            <span style="color: #009900;">&#91;</span>ttl<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">86400</span>
            <span style="color: #009900;">&#91;</span>rdlength<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">18</span>
            <span style="color: #009900;">&#91;</span>rdata<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> store	XXX�<span style="color: #cc66cc;">3</span>
            <span style="color: #009900;">&#91;</span>cname<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> store<span style="color: #339933;">.</span>XXX<span style="color: #339933;">.</span>com
        <span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>PS, 在 Windows 環境, 請修改 PEAR/NET/DNS/Resolver.php 裡的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$resolv_conf</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/etc/resolv.conf'</span><span style="color: #339933;">;</span></pre></div></div>

<p>改成</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$resolv_conf</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'D:\Appserv\resolv.conf'</span><span style="color: #339933;">;</span></pre></div></div>

<p>resolv.conf 要加入你的 DNS Server (請用 ipconfig /all 查詢)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">nameserver 168<span style="color: #339933;">.</span>95<span style="color: #339933;">.</span>192<span style="color: #339933;">.</span>1</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2066/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Subversion] Setup In Windows</title>
		<link>http://blog.wabow.com/archives/2067</link>
		<comments>http://blog.wabow.com/archives/2067#comments</comments>
		<pubDate>Thu, 27 Aug 2009 06:41:19 +0000</pubDate>
		<dc:creator>abu</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2067</guid>
		<description><![CDATA[版本控管是個相當方便的程式開發好幫手，不管檔案被改到多爛，甚至不小心誤殺，都能輕鬆救回。
平常使用的安裝在哇寶主機上的subversion，這次想嘗試看看將subversion架設在windows平台上，於是開始了尋找資料之旅。
基本上，這裡有很詳細的說明，只要按照個人系統，修改部份設定，以下就紀錄一下我自己的步驟：
(因為已經寫的超白話了，所以就不另外附圖)  

 安裝apache，我是用懶人包xampp直接裝好apache、php、mysql，apache版本2.2.9。  (  範例懶人包安裝的路徑是在c:\xampp\ )     點我下載xampp (版本 1.7.2 )
下載subversion windows版本，點我下載  (版本 1.6.5 ) ， 安裝很容易，狂點next就對了。
打開C:\xampp\apache\conf\httpd.conf ，隨便找個地方 加入

  &#60;Location /svn/repository&#62;
    DAV svn
    SVNPath D:\svn\repository
  &#60;/Location&#62;

其中 /svn/repository 是你想對應到的網址，像是 http://localhost/svn/repository， 而D:\svn\repository 則是實際svn專案檔案放置的位置。
最後，請到windows提供的"命令提示字元"模式下，輸入 svnadmin create d:/svn/repository ，完成建立專案，到這裡算是完成建立整個專案。
打開瀏覽器，輸入http://localhost:8080/svn/repository/ ，可以看到 『 repository - Revision 0: / 』，代表該專案目前版號為0 (還沒開始動工，當然是0)
測試一下，先隨便找個地方，例如 D:\wwwroot\ ，滑鼠右鍵選擇『 SVN [...]]]></description>
			<content:encoded><![CDATA[<p>版本控管是個相當方便的程式開發好幫手，不管檔案被改到多爛，甚至不小心誤殺，都能輕鬆救回。<span id="more-2067"></span></p>
<p>平常使用的安裝在哇寶主機上的subversion，這次想嘗試看看將subversion架設在windows平台上，於是開始了尋找資料之旅。<br />
基本上，<a href="http://liangkuo.blogspot.com/2007/03/svn-subversion-tortoisesvn.html">這裡</a>有很詳細的說明，只要按照個人系統，修改部份設定，以下就紀錄一下我自己的步驟：</p>
<p>(因為已經寫的超白話了，所以就不另外附圖)  </p>
<ul>
<li> 安裝apache，我是用懶人包xampp直接裝好apache、php、mysql，apache版本2.2.9。  (  範例懶人包安裝的路徑是在c:\xampp\ )     <a href="http://www.apachefriends.org/download.php?xampp-win32-1.7.2.exe">點我下載xampp</a> (版本 1.7.2 )</li>
<li>下載subversion windows版本，<a href="http://subversion.tigris.org/files/documents/15/46531/Setup-Subversion-1.6.5.msi">點我下載</a>  (版本 1.6.5 ) ， 安裝很容易，狂點next就對了。</li>
<li>打開C:\xampp\apache\conf\httpd.conf ，隨便找個地方 加入
<pre lang="html4strict" escaped="ture">
  &lt;Location /svn/repository&gt;
    DAV svn
    SVNPath D:\svn\repository
  &lt;/Location&gt;
</pre>
<p>其中 /svn/repository 是你想對應到的網址，像是 http://localhost/svn/repository， 而D:\svn\repository 則是實際svn專案檔案放置的位置。</li>
<li>最後，請到windows提供的"命令提示字元"模式下，輸入 svnadmin create d:/svn/repository ，完成建立專案，到這裡算是完成建立整個專案。</li>
<li>打開瀏覽器，輸入http://localhost:8080/svn/repository/ ，可以看到 『 repository - Revision 0: / 』，代表該專案目前版號為0 (還沒開始動工，當然是0)</li>
<li>測試一下，先隨便找個地方，例如 D:\wwwroot\ ，滑鼠右鍵選擇『 SVN 取出 』，檔案庫URL 請輸入 『 http://localhost:8080/svn/repository 』，取出目錄按照預設即可，按下確定。</li>
<li>到D:\wwwroot\repository，測試建立一個文字檔， aaa.txt ，同樣路徑下按滑鼠右鍵『 SVN 送交 』，將更新的檔案傳送至SVN檔案庫，完成測試SVN上傳。</li>
<li>同樣來到 http://localhost:8080/svn/repository/ ，會看到『 repository - Revision 1: / 』，版號以由0變成1，代表剛上傳的svn紀錄已完成。</li>
<p>以上就是依照個人設定，完成subversion安裝在windows的過程，看到專案是使用自己架設的subversion，檔案成功被建立、刪除修改後更新，感覺還不錯～</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2067/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class PART2</title>
		<link>http://blog.wabow.com/archives/2072</link>
		<comments>http://blog.wabow.com/archives/2072#comments</comments>
		<pubDate>Thu, 27 Aug 2009 06:32:14 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[NoSpamNX]]></category>
		<category><![CDATA[垃圾留言]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2072</guid>
		<description><![CDATA[感謝上一篇文章中前輩們的熱心回覆；垃圾留言果然是大家心中的痛啊（噗）～雖然 CAPTCHA 可以透過各式各樣的 OCR 破解（最新版的 JDownloader 也已經能忽略大部分免費空間所用的圖像辨識...扯遠了），不過它仍是目前阻擋機器人最直接也最簡單的解決方案；當然更複雜的 CAPTCHA 還是能夠達到阻擋的目的，但是使用 CAPTCHA 的方式對使用者來說就已經是不友善了。
後來在討論中 Jace 提到，其實 SESSION 是有可能被機器人知道的；所以我後來綜合了 fillano 提供的演算法概念，稍微改良了一下之前的 NoSpamNX class。利用隨機產生的隱藏欄位順序，用不同的演算法再對隱藏欄位的數值作編碼；讓 SESSION 內存的未編碼的值，與 POST 過來的已編碼的值不一樣。最後再將 SESSION 內存的值編碼，與 POST 的已編碼的值作比較，判斷留言的使用者是不是機器人。
SESSION 紀錄的值是未編碼的值，但在產生隱藏欄位時，input 的值是已經編碼過後的值

/**
&#xa0;* 建立隱藏欄位 HTML；利用隱藏欄位先後順序不同，使用 md5 or sha1 編碼
&#xa0;* 
&#xa0;*/
public function addHiddenFields()
{
&#xa0;&#xa0;&#xa0;&#xa0;$nospamnx = $_SESSION[$this-&#62;_sessionName];

&#xa0;&#xa0;&#xa0;&#xa0;if (1 === rand(1,2)) {
&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;return '&#60;input type="text" name="nospamnx['.$nospamnx['nospamnx-1'].']" value="" class="locktross" /&#62;&#60;input type="text" name="nospamnx['.$nospamnx['nospamnx-2'].']" value="'.md5($nospamnx['nospamnx-2-value']).'" class="locktross" /&#62;';
&#xa0;&#xa0;&#xa0;&#xa0;} [...]]]></description>
			<content:encoded><![CDATA[<p>感謝<a href="http://blog.wabow.com/archives/1974" target="_blank">上一篇文章</a>中前輩們的熱心回覆；垃圾留言果然是大家心中的痛啊（噗）～雖然 <a href="http://zh.wikipedia.org/w/index.php?title=CAPTCHA&amp;variant=zh-tw" target="_blank">CAPTCHA</a> 可以透過各式各樣的 <a href="http://zh.wikipedia.org/zh-tw/%E5%85%89%E5%AD%A6%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB" target="_blank">OCR</a> 破解（最新版的 <a href="http://jdownloader.org/home/index" target="_blank">JDownloader</a> 也已經能忽略大部分免費空間所用的圖像辨識...扯遠了），不過它仍是目前阻擋機器人最直接也最簡單的解決方案；當然更複雜的 CAPTCHA 還是能夠達到阻擋的目的，但是使用 CAPTCHA 的方式對使用者來說就已經是不友善了。</p>
<p>後來在討論中 Jace 提到，其實 SESSION 是有可能被機器人知道的；所以我後來綜合了 fillano 提供的演算法概念，稍微改良了一下之前的 NoSpamNX class。利用隨機產生的隱藏欄位順序，用不同的演算法再對隱藏欄位的數值作編碼；讓 SESSION 內存的未編碼的值，與 POST 過來的已編碼的值不一樣。最後再將 SESSION 內存的值編碼，與 POST 的已編碼的值作比較，判斷留言的使用者是不是機器人。</p>
<p><span id="more-2072"></span>SESSION 紀錄的值是未編碼的值，但在產生隱藏欄位時，input 的值是已經編碼過後的值</p>
<pre style='color:#000020;background:#cceeee;overflow:auto;border:1px solid silver'>
<span style='color:#595979;background:#cceeee'>/**</span>
<span style='color:#595979;background:#cceeee'>&#xa0;* 建立隱藏欄位 HTML；利用隱藏欄位先後順序不同，使用 md5 or sha1 編碼</span>
<span style='color:#595979;background:#cceeee'>&#xa0;* </span>
<span style='color:#595979;background:#cceeee'>&#xa0;*/</span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>public</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>function</span><span style='color:#000000;background:#cceeee'> addHiddenFields</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#007d45;background:#cceeee'>$_SESSION</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#007d45;background:#cceeee'>$</span><span style='color:#200080;background:#cceeee;font-weight:bold'>this</span><span style='color:#308080;background:#cceeee'>-&gt;</span><span style='color:#007d45;background:#cceeee'>_sessionName</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#008c00;background:#cceeee'>1</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>rand</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#008c00;background:#cceeee'>1</span><span style='color:#308080;background:#cceeee'>,</span><span style='color:#008c00;background:#cceeee'>2</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#1060b6;background:#cceeee'>'&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="" class="locktross" /&gt;&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="'</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#400000;background:#cceeee'>md5</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>'" class="locktross" /&gt;'</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>else</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#1060b6;background:#cceeee'>'&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="'</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#400000;background:#cceeee'>sha1</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>'" class="locktross" /&gt;&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="" class="locktross" /&gt;'</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
</pre>
<p>驗證時根據 POST 過來的 nospamnx 順序不同，以不同的演算法編碼後再做比較</p>
<pre style='color:#000020;background:#cceeee;overflow:auto;border:1px solid silver'>
<span style='color:#595979;background:#cceeee'>// 根據 POST 過來的值順序不同，以 md5 or sha1 判斷</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>current</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#400000;background:#cceeee'>array_keys</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$postData</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>md5</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>else</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>sha1</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$postData</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>!</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>false</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
</pre>
<p>最後提供<a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_090827.zip">範例程式下載</a>，分為一般 POST 與 AJAX 二種方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2072/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Washop] 用 Word 合併列印 7-11 取貨標籤</title>
		<link>http://blog.wabow.com/archives/1986</link>
		<comments>http://blog.wabow.com/archives/1986#comments</comments>
		<pubDate>Thu, 20 Aug 2009 07:42:23 +0000</pubDate>
		<dc:creator>suzy</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[washop]]></category>
		<category><![CDATA[word]]></category>
		<category><![CDATA[合併列印]]></category>
		<category><![CDATA[標籤列印]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1986</guid>
		<description><![CDATA[今天要介紹的是 如何用 MS Office Word 的 合併列印 列出 相關訂單資料 及 條碼(barcode), 然後再用 標籤貼紙 印出來, 格式必須要符合 7-11 取貨的規則. 這個功能將會整合在 Washop 的訂單出貨功能.
其實就是一些很簡單的操作步驟, 但是摸索的過程也花了一些時間, 所以就紀錄下來, 供大家參考.

標籤貼紙是為了直接貼在包裹上, 讓出貨流程更有效率.
我們選A4大小的標籤貼紙, 市面上有販售各式各樣的規格.
1. 合併列印精靈:
郵件 -&#62; 啟動合併列印 -&#62; 逐步合併列印精靈

選取文件類型, 請選擇 "標籤"

2. 定訂標籤的格式
7-11 規定, 每張貼紙大小必須至少8cmX8cm, 依照A4的大小(210X297mm), 我們決定用 2欄 X 3列 來劃分, 每小格為 9.9cmX10.5cm
紙匣, 請選擇 "預設紙匣(自動選取)". 註: 它預設是 "手動送紙器", 如果沒修改此項, 在列印時會變成要手動塞紙到印表機喔!

標籤編號, 請選擇 "自訂標籤", 請依照圖中所示, 輸入標籤的規格.

3. 匯出資料
由 [...]]]></description>
			<content:encoded><![CDATA[<p>今天要介紹的是 如何用 MS Office Word 的 合併列印 列出 相關訂單資料 及 條碼(barcode), 然後再用 標籤貼紙 印出來, 格式必須要符合 7-11 取貨的規則. 這個功能將會整合在 Washop 的訂單出貨功能.<br />
其實就是一些很簡單的操作步驟, 但是摸索的過程也花了一些時間, 所以就紀錄下來, 供大家參考.</p>
<p><span id="more-1986"></span><br />
標籤貼紙是為了直接貼在包裹上, 讓出貨流程更有效率.<br />
我們選A4大小的標籤貼紙, 市面上有販售<a href="http://store.pchome.com.tw/2b/S027339.htm">各式各樣的規格</a>.</p>
<h3>1. 合併列印精靈:</h3>
<p>郵件 -&gt; 啟動合併列印 -&gt; 逐步合併列印精靈<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word1.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word1.jpg" alt="word1" width="444" height="398" class="alignnone size-full wp-image-1994" /></a></p>
<p>選取文件類型, 請選擇 "標籤"<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word2.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word2.jpg" alt="word2" width="360" height="375" class="alignnone size-full wp-image-1995" /></a></p>
<h3>2. 定訂標籤的格式</h3>
<p>7-11 規定, 每張貼紙大小必須至少8cmX8cm, 依照A4的大小(210X297mm), 我們決定用 <a href="http://store.pchome.com.tw/2b/M00467147.htm">2欄 X 3列</a> 來劃分, 每小格為 9.9cmX10.5cm</p>
<p>紙匣, 請選擇 "預設紙匣(自動選取)". 註: 它預設是 "手動送紙器", 如果沒修改此項, 在列印時會變成要手動塞紙到印表機喔!<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word3.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word3.jpg" alt="word3" width="500" class="alignnone size-full wp-image-1996" /></a></p>
<p>標籤編號, 請選擇 "自訂標籤", 請依照圖中所示, 輸入標籤的規格.<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word4.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word4.jpg" alt="word4" width="500" class="alignnone size-full wp-image-1997" /></a></p>
<h3>3. 匯出資料</h3>
<p>由 Washop 後台生成 CSV 訂單資料<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word5.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word5.jpg" alt="word5" width="504" height="376" class="alignnone size-full wp-image-1999" /></a></p>
<p>範例資料顯示如下:<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word6.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word6.jpg" alt="word6" width="500" class="alignnone size-full wp-image-2000" /></a></p>
<h3>4. 合併列印</h3>
<p>選取收件者, "使用現有清單".<br />
瀏覽, 請選取剛剛匯出的 CSV 檔. 直接按確定即可.<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word7.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word7.jpg" alt="word7" width="332" height="360" class="alignnone size-full wp-image-2002" /></a></p>
<h3>5. 編輯第一個標籤內容</h3>
<p>所有內容置中, 用標楷體（如何顯示條碼請見第九）<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word8.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word8.jpg" alt="word8" width="476" height="441" class="alignnone size-full wp-image-2004" /></a></p>
<h3>6. 安排標籤</h3>
<p>點選其他項目, 手動插入欄位<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word9.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word9.jpg" alt="word9" width="490" height="470" class="alignnone size-full wp-image-2005" /></a></p>
<p>完成後按 "更新所有標籤", 神奇的事就發生了<br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/word10.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word10.jpg" alt="word10" width="500" class="alignnone size-full wp-image-2006" /></a></p>
<h3>7. 預覽標籤</h3>
<p><a href="http://blog.wabow.com/wp-content/uploads/2009/08/word11.jpg"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/word11.jpg" alt="word11" width="500" class="alignnone size-full wp-image-2007" /></a></p>
<h3>8. 完成, 列印, 大功告成</h3>
<p><a href='http://blog.wabow.com/wp-content/uploads/2009/08/文件1.pdf'>列印結果範例</a><br />
印出來後可試著用條碼機試刷, 如果有聽到 B 的一聲, 那恭喜你, 成功啦. (灑花 <img src="http://blog.wabow.com/wp-content/uploads/2009/08/1775465354.jpg.gif" /></p>
<h3>9. 關於 條碼(barcode)</h3>
<ul>
<li>條碼是39碼, 規定前後都要加 *</li>
<li>條碼字型 <a href="http://www.barcodesinc.com/free-barcode-font/">可在此下載</a>.</li>
<li>條碼字體的大小: 我是設 34, 字元比例: 72%. 這樣才能保持在規定的 寬 = 7cm-7.5cm, 高 = 大於0.8cm 之間.
<li>如果條碼一直刷不過, 試試看條碼後面空一格, 空格轉成別的字型, 因為我們家的印表機印出來會把換行當作條碼印 (螢幕顯示正常, 印出來就不對了).</li>
<li>要用雷射印表機印, 條碼機才能感應.</li>
</ul>
<p>謝謝收看 <img src="http://blog.wabow.com/wp-content/uploads/2009/08/escape.gif" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1986/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery Plugin]抓取YouTube影片的截圖 jYouTube</title>
		<link>http://blog.wabow.com/archives/1985</link>
		<comments>http://blog.wabow.com/archives/1985#comments</comments>
		<pubDate>Thu, 20 Aug 2009 07:38:13 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1985</guid>
		<description><![CDATA[
官方網站  http://jquery-howto.blogspot.com/2009/05/jyoutube-jquery-youtube-thumbnail.html
js下載點  http://plugins.jquery.com/files/jyuotube.zip

介紹
YouTube(http://www.youtube.com/)是一個非常知名的影像網站，影片瀏覽起來速度還蠻快的，也因此很多網站在想要顯示影片時，都會連到這個網站。作法上有很多種，假使我們今天希望在自己的網站放置某個YouTube影片的截圖，然後點截圖才連到YouTube網站去瀏覽影片，這個截圖的動作有沒有比較簡單的做法呢?jQuery的Plugin--jYouTube提供了很簡單就可以達到目的的方法，讓我們來看看要怎麼處理吧!
程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
small : use video URL&#60;br /&#62;
&#60;img src='' id='img1'&#62;&#60;br /&#62;
big   : use video ID &#60;br /&#62;
&#60;img src='' id='img2'&#62;
&#160;
&#60;script type=&#34;text/javascript&#34; src=&#34;jquery-1.2.6.min.js&#34;&#62;&#60;/script&#62;
&#60;script type=&#34;text/javascript&#34; src=&#34;jyuotube.js&#34;&#62;&#60;/script&#62;
&#60;script type=&#34;text/javascript&#34;&#62;
&#160;
$(function(){
&#160;
    var imgSrc = $.jYoutube('http://www.youtube.com/watch?v=hPzNl6NKAG0', 'small');
    var imgSrc2 = $.jYoutube('hPzNl6NKAG0');
&#160;
	$('#img1').attr('src',imgSrc);
	$('#img2').attr('src',imgSrc2);
&#160;
})
&#160;
&#60;/script&#62;

解說

1
2
&#60;script type=&#34;text/javascript&#34; src=&#34;jquery-1.2.6.min.js&#34;&#62;&#60;/script&#62;
&#60;script type=&#34;text/javascript&#34; src=&#34;jyuotube.js&#34;&#62;&#60;/script&#62;

這兩行是載入必要的js。
jYouTube的寫法很簡單，如下：

1
2
$.jYoutube&#40;'hPzNl6NKAG0'&#41;; //指定YouTube的影片ID後回傳一個大的截圖網址
$.jYoutube&#40;'http://www.youtube.com/watch?v=hPzNl6NKAG0', 'small'&#41;; //指定YouTube的影片網址後回傳一個小的截圖網址

也就說，jYoutube會使用到兩個參數，第一個參數你可以設定為YouTube的影片ID(如:hPzNl6NKAG0)或是YouTube的影片網址(如:http://www.youtube.com/watch?v=hPzNl6NKAG0)；第二個參數則是希望顯示的截圖大小，如果保留空白則顯示較大的截圖，相對的如果輸入small則顯示小的截圖。實際顯示的效果可參照本文開頭的範例圖。
總結
jYouTube提供了很簡單就能取得YouTube影片的截圖，在需要大量引用時比用printscreen來的快速，提供給大家做個參考。
]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.wabow.com/wp-content/uploads/2009/08/sample.JPG" alt="sample" width="331" height="379" class="aligncenter size-full wp-image-2025" /><br />
官方網站  <a href="http://jquery-howto.blogspot.com/2009/05/jyoutube-jquery-youtube-thumbnail.html">http://jquery-howto.blogspot.com/2009/05/jyoutube-jquery-youtube-thumbnail.html</a><br />
js下載點  <a href="http://plugins.jquery.com/files/jyuotube.zip">http://plugins.jquery.com/files/jyuotube.zip</a><br />
<span id="more-1985"></span></p>
<h3>介紹</h3>
<p>YouTube(<a href="http://www.youtube.com/">http://www.youtube.com/</a>)是一個非常知名的影像網站，影片瀏覽起來速度還蠻快的，也因此很多網站在想要顯示影片時，都會連到這個網站。作法上有很多種，假使我們今天希望在自己的網站放置某個YouTube影片的截圖，然後點截圖才連到YouTube網站去瀏覽影片，這個截圖的動作有沒有比較簡單的做法呢?jQuery的Plugin--jYouTube提供了很簡單就可以達到目的的方法，讓我們來看看要怎麼處理吧!</p>
<h3>程式碼</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;">small : use video URL<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">''</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'img1'</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
big   : use video ID <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">''</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'img2'</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-1.2.6.min.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jyuotube.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
&nbsp;
$(function(){
&nbsp;
    var imgSrc = $.jYoutube('http://www.youtube.com/watch?v=hPzNl6NKAG0', 'small');
    var imgSrc2 = $.jYoutube('hPzNl6NKAG0');
&nbsp;
	$('#img1').attr('src',imgSrc);
	$('#img2').attr('src',imgSrc2);
&nbsp;
})
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></td></tr></table></div>

<h3>解說</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-1.2.6.min.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jyuotube.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></td></tr></table></div>

<p>這兩行是載入必要的js。</p>
<p>jYouTube的寫法很簡單，如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">jYoutube</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hPzNl6NKAG0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//指定YouTube的影片ID後回傳一個大的截圖網址</span>
$.<span style="color: #660066;">jYoutube</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http://www.youtube.com/watch?v=hPzNl6NKAG0'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'small'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//指定YouTube的影片網址後回傳一個小的截圖網址</span></pre></td></tr></table></div>

<p>也就說，jYoutube會使用到兩個參數，第一個參數你可以設定為YouTube的影片ID(如:hPzNl6NKAG0)或是YouTube的影片網址(如:http://www.youtube.com/watch?v=hPzNl6NKAG0)；第二個參數則是希望顯示的截圖大小，如果保留空白則顯示較大的截圖，相對的如果輸入small則顯示小的截圖。實際顯示的效果可參照本文開頭的範例圖。</p>
<h3>總結</h3>
<p>jYouTube提供了很簡單就能取得YouTube影片的截圖，在需要大量引用時比用printscreen來的快速，提供給大家做個參考。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1985/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Open Flash Chart] 無痛繪製統計圖表</title>
		<link>http://blog.wabow.com/archives/1984</link>
		<comments>http://blog.wabow.com/archives/1984#comments</comments>
		<pubDate>Thu, 20 Aug 2009 06:21:07 +0000</pubDate>
		<dc:creator>abu</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1984</guid>
		<description><![CDATA[電子商務網站的後台，統籌管理了一堆訂單相關資訊，相對的，客戶對於產品銷售部份，若能搭配上統計圖表，更是一目了然，為了簡易製作出方便快速又美麗的成品，就是借重Open Flash Chart力量的時候....

在官網上可以看到各式各樣的圖表，不管是長條圖、曲線圖、圓餅圖等等，都只要把統計數值拋給他，就會產生出美美的圖表，
首先必須先下載library 點我，解壓縮後丟到你的專案裡面，找個地方擺好
接著在你要輸出的樣板裡面，加上這堆↓

swfobject.embedSWF(&#34;自訂解壓縮路徑/open-flash-chart.swf&#34;, &#34;chart1&#34;, &#34;800&#34;, &#34;500&#34;, &#34;9.0.0&#34;, &#34;expressInstall.swf&#34;,	{&#34;data-file&#34;:&#34;預定產生資料程式&#34;} );

請依照專案狀況修改上述中文部份，就完成了畫面產生部份設定。
接著是資料產生部份，還記得上面剛填寫的"預定產生資料程式"嗎，就是準備編輯他，以下是部份主要程式的範例：

include(&#34;自訂解壓縮路徑/php-ofc-library/open-flash-chart.php&#34;); // 載入
$chart = new open_flash_chart();
$title = new title($product-&#62;name.'三個月內銷售狀況');
$chart-&#62;set_title( $title );
$x = new x_axis();
$x-&#62;set_colour( 'gray' );
$x-&#62;set_grid_colour( '#86BF83' );
$y = new y_axis();
$y-&#62;set_range( 0, 1000, 100);
$chart-&#62;set_y_axis( $y );
$bar = new bar();
$output  = new Array('1','2','3');
$bar-&#62;set_values( $outpu ); // 欲輸出的資料陣列 
$t = new tooltip( 'Hello&#60;br&#62;val = #val#' );
$t-&#62;set_shadow( true [...]]]></description>
			<content:encoded><![CDATA[<p>電子商務網站的後台，統籌管理了一堆訂單相關資訊，相對的，客戶對於產品銷售部份，若能搭配上統計圖表，更是一目了然，為了簡易製作出方便快速又美麗的成品，就是借重Open Flash Chart力量的時候....</p>
<p><span id="more-1984"></span></p>
<p>在<a href="http://ofc.net23.net/">官網</a>上可以看到各式各樣的圖表，不管是長條圖、曲線圖、圓餅圖等等，都只要把統計數值拋給他，就會產生出美美的圖表，</p>
<p>首先必須先下載library <a href="http://sourceforge.net/projects/openflashchart/files/open-flash-chart/1.9.7/open-flash-chart-1.9.7.zip/download" />點我</a>，解壓縮後丟到你的專案裡面，找個地方擺好</p>
<p>接著在你要輸出的樣板裡面，加上這堆↓</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">swfobject.embedSWF(&quot;自訂解壓縮路徑/open-flash-chart.swf&quot;, &quot;chart1&quot;, &quot;800&quot;, &quot;500&quot;, &quot;9.0.0&quot;, &quot;expressInstall.swf&quot;,	{&quot;data-file&quot;:&quot;預定產生資料程式&quot;} );</pre></div></div>

<p>請依照專案狀況修改上述中文部份，就完成了畫面產生部份設定。</p>
<p>接著是資料產生部份，還記得上面剛填寫的"預定產生資料程式"嗎，就是準備編輯他，以下是部份主要程式的範例：</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">include(&quot;自訂解壓縮路徑/php-ofc-library/open-flash-chart.php&quot;); // 載入
$chart = new open_flash_chart();
$title = new title($product-&gt;name.'三個月內銷售狀況');
$chart-&gt;set_title( $title );
$x = new x_axis();
$x-&gt;set_colour( 'gray' );
$x-&gt;set_grid_colour( '#86BF83' );
$y = new y_axis();
$y-&gt;set_range( 0, 1000, 100);
$chart-&gt;set_y_axis( $y );
$bar = new bar();
$output  = new Array('1','2','3');
$bar-&gt;set_values( $outpu ); // 欲輸出的資料陣列 
$t = new tooltip( 'Hello<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span>&gt;</span>val = #val#' );
$t-&gt;set_shadow( true );
$t-&gt;set_stroke( 5 );
$t-&gt;set_colour( &quot;gray&quot; );
$t-&gt;set_background_colour( &quot;#FFFFFF&quot; );
$t-&gt;set_title_style( &quot;{font-size: 14px; color: #000000;}&quot; );
$t-&gt;set_body_style( &quot;{font-size: 14px;  color: #000000;}&quot; );
$chart-&gt;add_element( $bar );
$chart-&gt;set_tooltip( $t );
echo $chart-&gt;toPrettyString();</pre></div></div>

<p>這邊只是簡易說明，詳細內容官網都可以查到，&amp; 範例也是一大堆，修改一下就能輕鬆呈現你要的樣式~ 算是很方便的圖表繪製外掛，感謝作者。  m（＿ ＿）m </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1984/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class</title>
		<link>http://blog.wabow.com/archives/1974</link>
		<comments>http://blog.wabow.com/archives/1974#comments</comments>
		<pubDate>Thu, 20 Aug 2009 05:06:42 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[NoSpamNX]]></category>
		<category><![CDATA[垃圾留言]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1974</guid>
		<description><![CDATA[目前大部分網站在表單發送時，判斷機器人發送廣告、垃圾留言的方法是採用 CAPTCHA 的方式；然而如同之前在部落格上分享過的文章所述，額外的驗證碼機制反而造成使用者在參予留言或討論時望之卻步。同篇文章中也提到 WordPress 用來防治垃圾留言的 Plugin NoSpamNX；最近剛好客戶有阻擋垃圾留言的需求，所以就稍微研究了一下，順便改成 class 讓使用上能更具彈性。


基本的流程是在建構式中，將隨機產生的隱藏驗證碼存入 SESSION，同時利用這些值建立隨機順序的 HTML 碼，在使用者 POST 的時候加以驗證。
首先要在網頁的最上面先開啟 SESSION，並建立 NoSpamNX 物件，同時寫入 SESSION，產生 HTML 碼

// 啟動 SESSION
session_start&#40;&#41;;
&#160;
// 載入 NoSpamNX class
include_once&#40;'NoSpamNX.php'&#41;;
// 建立物件時可以指定 SESSION 的名稱，或不輸入使用預設值
$noSpamNX = new NoSpamNX&#40;'test_for_NoSpamNX'&#41;;
&#160;
// 產生隨機順序的隱藏欄位
$hidden_fields_for_NoSpamNX = $noSpamNX-&#62;addHiddenFields&#40;&#41;;

將 HTML 碼嵌入表單中

echo $hidden_fields_for_NoSpamNX;

在送出表單後，根據：
1. 檢查 POST 過來的資料中，是否有 'nospamnx-1' 產生的 MD5 Name；不存在=機器人
2. 檢查 POST 過來的 'nospamnx-1' MD5 Name，其值是否為零；不為零=機器人
3. 檢查 POST 過來的資料中，是否有 'nospamnx-2' 產生的 [...]]]></description>
			<content:encoded><![CDATA[<p>目前大部分網站在表單發送時，判斷機器人發送廣告、垃圾留言的方法是採用 <a href="http://zh.wikipedia.org/w/index.php?title=CAPTCHA&amp;variant=zh-tw" target="_blank">CAPTCHA</a> 的方式；然而如同之前在<a href="http://blog.wabow.com/archives/713" target="_blank">部落格上分享過的文章</a>所述，額外的驗證碼機制反而造成使用者在參予留言或討論時望之卻步。同篇文章中也提到 <a href="http://zh.wikipedia.org/w/index.php?title=WordPress&amp;variant=zh-tw" target="_blank">WordPress</a> 用來防治垃圾留言的 Plugin <a href="http://www.svenkubiak.de/nospamnx/" target="_blank">NoSpamNX</a>；最近剛好客戶有阻擋垃圾留言的需求，所以就稍微研究了一下，順便改成 class 讓使用上能更具彈性。<br />
<span id="more-1974"></span><br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949.png"></a><a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949.png"><img class="aligncenter size-large wp-image-1975" src="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949-500x303.png" alt="nospamnx_class949" width="500" height="303" /></a><br />
基本的流程是在建構式中，將隨機產生的隱藏驗證碼存入 SESSION，同時利用這些值建立隨機順序的 HTML 碼，在使用者 POST 的時候加以驗證。</p>
<p>首先要在網頁的最上面先開啟 SESSION，並建立 NoSpamNX 物件，同時寫入 SESSION，產生 HTML 碼</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 啟動 SESSION</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 載入 NoSpamNX class</span>
<span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NoSpamNX.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 建立物件時可以指定 SESSION 的名稱，或不輸入使用預設值</span>
<span style="color: #000088;">$noSpamNX</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NoSpamNX<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test_for_NoSpamNX'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 產生隨機順序的隱藏欄位</span>
<span style="color: #000088;">$hidden_fields_for_NoSpamNX</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$noSpamNX</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addHiddenFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>將 HTML 碼嵌入表單中</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$hidden_fields_for_NoSpamNX</span><span style="color: #339933;">;</span></pre></div></div>

<p>在送出表單後，根據：</p>
<blockquote><p>1. 檢查 POST 過來的資料中，是否有 'nospamnx-1' 產生的 MD5 Name；不存在=機器人<br />
2. 檢查 POST 過來的 'nospamnx-1' MD5 Name，其值是否為零；不為零=機器人<br />
3. 檢查 POST 過來的資料中，是否有 'nospamnx-2' 產生的 MD5 Name；不存在=機器人<br />
4. 檢查 POST 過來的 'nospamnx-2' MD5 Name，其值是否為 SESSION 中 'nospamnx-2' MD5 Value；不相等=機器人</p></blockquote>
<p>每次通過檢查後就會清空 SESSION，所以每一個留言所使用的隱藏驗證碼都是不一樣的。</p>
<p>距離之前介紹 NoSpamNX，已經有一段時間；而作者在新版加入了選擇性的 <a href="http://zh.wikipedia.org/zh-tw/HTTP_referrer" target="_blank">HTTP referrer</a> 判斷。不過因為難免會造成誤判的情況，以及程式寫起來有點醜（誤）等種種原因，所以並沒有放在這次的 class 裡面。</p>
<p>最後關於範例程式下載，請參考《<a href="http://blog.wabow.com/archives/2072" target="_blank">[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class PART2</a>》。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1974/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[PHP] 瞭解 static 關鍵字</title>
		<link>http://blog.wabow.com/archives/1972</link>
		<comments>http://blog.wabow.com/archives/1972#comments</comments>
		<pubDate>Wed, 19 Aug 2009 02:48:26 +0000</pubDate>
		<dc:creator>jaceju</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1972</guid>
		<description><![CDATA[本文轉載自：[PHP] 瞭解 static 關鍵字
先前同事詢問有關 PHP static 關鍵字的用法，這裡我簡單整理一下。
static 主要用途在於定義一個變數空間，讓函式或類別可以保留住該變數的值，直到下次的存取。
以下就各別來探討 static 在函式與類別中的用法。

函式裡的 static 關鍵字
先來看看以下的例子：

function getCount&#40;&#41;
&#123;
    static $count = 0;
    $count ++;
    return $count;
&#125;
&#160;
for &#40;$i = 0; $i &#60; 10; $i ++&#41; &#123;
   echo getCount&#40;&#41;, &#34;\n&#34;;
&#125;
&#160;
/* output:
1
2
3
4
5
6
7
8
9
10
*/

首先我們在 getCount() 這個方法中定義了一個 static 變數 $count ，然後每次呼叫 getCount() 時，就會對 $count 作累加的動作。
接著我們透過迴圈執行十次 [...]]]></description>
			<content:encoded><![CDATA[<p>本文轉載自：<a href="http://www.jaceju.net/blog/?p=670">[PHP] 瞭解 static 關鍵字</a></p>
<p>先前同事詢問有關 PHP static 關鍵字的用法，這裡我簡單整理一下。</p>
<p>static 主要用途在於定義一個變數空間，讓函式或類別可以保留住該變數的值，直到下次的存取。</p>
<p>以下就各別來探討 static 在函式與類別中的用法。</p>
<p><span id="more-1972"></span></p>
<h2>函式裡的 static 關鍵字</h2>
<p>先來看看以下的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    static <span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$count</span> <span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">echo</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* output:
1
2
3
4
5
6
7
8
9
10
*/</span></pre></div></div>

<p>首先我們在 getCount() 這個方法中定義了一個 static 變數 $count ，然後每次呼叫 getCount() 時，就會對 $count 作累加的動作。</p>
<p>接著我們透過迴圈執行十次 getCount() 方法，便可得到了 1 ~ 10 的輸出結果。</p>
<p>這是因為將變數宣告為 static 後，第一次呼叫 getCount() 這個方法時，會為 $count 保留一塊記憶體空間；而當脫離了 getCount() 的變數作用域後，這個記憶體空間並不會被消滅掉，而會在下一次呼叫 getCount() 方法時，再次被配置進來，並還原先前的變數值。</p>
<p>因此，除了第一次呼叫 getCount() 方法外，接下來的每次呼叫都會讓 $count 值累加，而得到 1 ~ 10 的輸出結果；如果把 static 關鍵字拿掉，就會輸出十次的 1 。</p>
<h2>應用在遞迴上的 static 關鍵字</h2>
<p>瞭解函式中的 static 關鍵字用法後，我們來看一個應用的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fibV1<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> fibV1<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> fibV1<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>這是 PHP 版的 Fibonacci Sequence 遞迴函式，原理我就不多說明了。先來看看它在參數為 20 時所需要的執行時間：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$start_time</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>float<span style="color: #009900;">&#41;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> fibV1<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$end_time</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>float<span style="color: #009900;">&#41;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Spent Time: &quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$end_time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start_time</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;(s)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* output:
6765
Spent Time: 0.26100397109985(s)
*/</span></pre></div></div>

<p>這裡代入的數字越大，執行時間會越長。</p>
<p>現在我們用 static 關鍵字來改寫：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fibV2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    static <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> fibV2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> fibV2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>然後再來看執行的時間：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$start_time</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>float<span style="color: #009900;">&#41;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> fibV2<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$end_time</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>float<span style="color: #009900;">&#41;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Spent Time: &quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$end_time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start_time</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;(s)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* output:
6765&lt;br /&gt;Spent Time: 0.0009009838104248(s)
*/</span></pre></div></div>

<p>速度竟然差了快三百倍！為什麼？</p>
<p>其實是因為這裡的 static 關鍵字扮演了 cache 的角色，讓程式不用重新計算已經算好的結果。而使用了 static 關鍵字後，也使得執行時間不會再隨著代入數字變大而變長。</p>
<p class="note">註：不是任何遞迴函式都可以用 static 變數來做 cache ，在使用上要特別注意這一點。</p>
<h2>類別裡的 static 關鍵字</h2>
<p>在類別裡的 static 關鍵字，也扮演了類似的角色。我們利用 static 在類別裡定義的屬性，會佔用類別的記憶體空間。而透過同一類別所生成的物件，會彼此共享這個 static 屬性；所以不論我們產生多少同類別的物件，它們都會存取到同一個 static 類別屬性。</p>
<p>來看看以下的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> DB
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000088;">$_instance</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000088;">$_instanceCount</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$_instanceCount</span> <span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$_instance</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$_instance</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$_instance</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getInstanceCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$_instanceCount</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$db1</span> <span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$db1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getInstanceCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 1</span>
<span style="color: #000088;">$db2</span> <span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$db2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getInstanceCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 1</span></pre></div></div>

<p>範例即為經典的 Singleton 模式，原理這裡先不多做說明。</p>
<p>這裡我們定義了兩個類別 static 屬性，分別是 $_instance 及 $_instanceCount ；而透過 static 定義的類別屬性，在類別裡存取時要用 self 關鍵字加上雙冒號 (::) ，例如 self::$_instance 。</p>
<p>接著我們可以看到在 getInstance() 方法中，如果 self::$_instance 是 null 的話，表示是第一次呼叫，那麼程式就會透過私有的建構式產生一個 DB 物件指定給 self::$_instance 變數，最後再將它回傳出去。這時雖然 getInstance() 裡的變數作用域已經結束，但 self::$_instance 卻會保留下來。</p>
<p>下一次 getInstance() 呼叫時，因為 self::$_instance 已經不再是 null 值，所以就會直接將其內容回傳給呼叫的程式了。</p>
<p>也因為這個原因，所以整個程式執行下來， DB 的 __construct() 方法也只被執行過一次，使得 self::$_instanceCount 也只累加一次，其結果永遠為 1 。</p>
<h2>結論</h2>
<p>一般 PHP 開發者很少會去使用 static 關鍵字，因為平常會用到 static 的場合其實也不多。這裡我再做一次 static 使用時機的重點整理：</p>
<ol>
<li>需要記住上一次函式執行的結果。</li>
<li>某些可以保留執行結果的遞迴函式。</li>
<li>不希望因為物件個體不同，進而被影響的類別屬性。</li>
<li>類別的 Singleton 模式。</li>
</ol>
<p>希望透過上面的說明，能讓大家對 static 關鍵字有進一步的瞭解。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1972/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>建立簡易的線上影片播放系統</title>
		<link>http://blog.wabow.com/archives/1964</link>
		<comments>http://blog.wabow.com/archives/1964#comments</comments>
		<pubDate>Thu, 13 Aug 2009 07:45:28 +0000</pubDate>
		<dc:creator>jaceju</dc:creator>
				<category><![CDATA[技術分享]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/archives/1964</guid>
		<description><![CDATA[最近有個小需求是要建立一個簡單的線上影片播放系統，不需要太複雜，只要能播放 FLV 即可。
本文就來為大家介紹一些免費的製作工具，包含轉檔以及播放；不需要有複雜的伺服端環境，也不會有麻煩的設定。
註：如果有線上自動轉檔這方面的需求，建議使用 YouTube API ，或參考 FFmpeg 來架設線上轉檔系統。

軟體下載
我們會用到以下兩個軟體與套件：

Riva FLV Encoder ： FLV 轉檔轉體。
Flowplayer ：線上播放影片。

轉檔
其實就是照著介面操作：

在來源檔案的部份，我們可以選擇 FFmpeg 所支援的各種影片類型檔案。
然後轉完檔案後，再把轉好的 flv 檔放在網頁可以存取的地方。
嵌入影片
嵌入影片的方法也很簡單，首先把 Flowplayer 下載回來的 JavaScript 和 Flash 檔案放在適當的地方，然後在 HTML 中載入 JavaScript 即可。
接著利用一個 A 標籤，將連結指向我們的 flv 影片檔；最後再利用 Flowplayer 的指令來載入 Flash 播放器，並將播放位址指向剛剛的連結即可。

&#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&#62;
&#60;head&#62;
&#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&#62;
&#60;title&#62;線上影片播放範例&#60;/title&#62;
&#60;script type=&#34;text/javascript&#34; src=&#34;js/flowplayer.js&#34;&#62;&#60;/script&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;a href=&#34;video/golfers.flv&#34; style=&#34;display:block;width:480px;height:325px;&#34; id=&#34;player&#34;&#62;&#60;/a&#62;
&#60;script type=&#34;text/javascript&#34;&#62;
flowplayer(&#34;player&#34;, &#34;./swf/flowplayer.swf&#34;);
&#60;/script&#62;
&#60;/body&#62;
&#60;/html&#62;

當然這樣的方案就顯得簡單很多，所以只適合在客戶影片不多，而且較不常更新的專案上使用。不過這個方案還有一個很明顯的缺點，那就是影片是公開的。這時如果需要影片不公開，就需要透過伺服端技術來下載位址做一些特別的處理。
完畢收工，謝謝收看。
]]></description>
			<content:encoded><![CDATA[<p>最近有個小需求是要建立一個簡單的線上影片播放系統，不需要太複雜，只要能播放 FLV 即可。</p>
<p>本文就來為大家介紹一些免費的製作工具，包含轉檔以及播放；不需要有複雜的伺服端環境，也不會有麻煩的設定。</p>
<p class="note">註：如果有線上自動轉檔這方面的需求，建議使用 <a href="http://code.google.com/intl/zh-TW/apis/youtube/overview.html" target="_blank">YouTube API</a> ，或參考 <a href="http://ffmpeg.org/" target="_blank">FFmpeg</a> 來架設線上轉檔系統。</p>
<p><span id="more-1964"></span></p>
<h2>軟體下載</h2>
<p>我們會用到以下兩個軟體與套件：</p>
<ul>
<li><a href="http://rivavx.com/?encoder">Riva FLV Encoder</a><strong> ：</strong> FLV 轉檔轉體。</li>
<li><a href="http://flowplayer.org/">Flowplayer</a> ：線上播放影片。</li>
</ul>
<h2>轉檔</h2>
<p>其實就是照著介面操作：</p>
<p><a href="http://blog.wabow.com/wp-content/uploads/2009/08/riva_encoder.png"><img src="http://blog.wabow.com/wp-content/uploads/2009/08/riva_encoder.png" alt="Riva FLV Encoder" /></a></p>
<p>在來源檔案的部份，我們可以選擇 FFmpeg 所支援的各種影片類型檔案。</p>
<p>然後轉完檔案後，再把轉好的 flv 檔放在網頁可以存取的地方。</p>
<h2>嵌入影片</h2>
<p>嵌入影片的方法也很簡單，首先把 <a href="http://flowplayer.org/">Flowplayer</a> 下載回來的 JavaScript 和 Flash 檔案放在適當的地方，然後在 HTML 中載入 JavaScript 即可。</p>
<p>接著利用一個 A 標籤，將連結指向我們的 flv 影片檔；最後再利用 Flowplayer 的指令來載入 Flash 播放器，並將播放位址指向剛剛的連結即可。</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>線上影片播放範例<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/flowplayer.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;video/golfers.flv&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;display:block;width:480px;height:325px;&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;player&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
flowplayer(&quot;player&quot;, &quot;./swf/flowplayer.swf&quot;);
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>當然這樣的方案就顯得簡單很多，所以只適合在客戶影片不多，而且較不常更新的專案上使用。不過這個方案還有一個很明顯的缺點，那就是影片是公開的。這時如果需要影片不公開，就需要透過伺服端技術來下載位址做一些特別的處理。</p>
<p>完畢收工，謝謝收看。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1964/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
