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

<channel>
	<title>程式設計 遇上 小提琴 &#187; 設計</title>
	<atom:link href="http://blog.ez2learn.com/category/%E8%A8%AD%E8%A8%88/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ez2learn.com</link>
	<description>Victor&#039;s個人部落格，關於程式設計與小提琴</description>
	<lastBuildDate>Thu, 26 Aug 2010 10:49:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Python使用HGE引擎</title>
		<link>http://blog.ez2learn.com/2009/08/25/python-hge/</link>
		<comments>http://blog.ez2learn.com/2009/08/25/python-hge/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 13:24:55 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[設計]]></category>
		<category><![CDATA[遊戲設計]]></category>
		<category><![CDATA[2D引擎]]></category>
		<category><![CDATA[2D硬體加速]]></category>
		<category><![CDATA[遊戲開發]]></category>
		<category><![CDATA[開源]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Game design]]></category>
		<category><![CDATA[HGE]]></category>
		<category><![CDATA[Open source]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=718</guid>
		<description><![CDATA[大家肯定都知道在Python下面寫2D遊戲有個眾所階知的選擇就是pygame，雖然它簡單好寫，對於簡單的遊戲來說已經足夠，但是他有一個致命的缺點，就是速度太慢了，在pygame的背後是SDL，用純軟體畫圖的函式庫，既然為純軟體繪圖，遇上旋轉、半透明等等需求，更顯得吃力和不切實際，所以該怎麼辦才好呢? 答案是用Haaf&#8217;s Game Engine，它是一款用DirectX做為backend的Open source遊戲函式庫，我在先前的文章裡已經有做簡單的介紹，就不再重覆，那這函式庫和Python又有什麼關聯呢? 他是用C++寫的，Python沒辦法用，正因為這樣，我一直一來想幫他寫一個python的binding，我一直想如果Python也能用HGE寫起來一定很開心，我試著找了一下有沒有已經存在這樣的專案，有找到一個，但是居然是在萬惡的GNU授權下的，讓我百思不得其解，那專案的作者到底在想什麼? 想讓大家寫Open source的Game嗎? 我們都知道GNU是大名頂頂的病毒授權，任何程式使用了用GNU的函式庫都會被感染，代表你的主程式一樣得變成GNU的開源授權，我個人非常討厭打著自由名義但是卻有強烈的強迫性質的GNU授權，況且HGE的授權是非常寬鬆的 zlib/libpng License，實在想不透為什麼一個binding可以用超嚴格的GNU，不過那是那作者的自由，我也管不著，在不能接受那惡心的授權，加上我看了一下他的專案似乎好像也沒有很完整的進度，於是我還是決定自己開了一個新的專案 Python HGE 在這樣的情況下，我前些天抽空開了一個新的Open source專案: Python-HGE，把一些最核心的程式碼都用boost.python包裝給Python使用，最核心的部份完成度很高，剩下的需要我在未來有空慢慢補上，License是MIT，如果你問我為什麼選MIT，我想答案應該是商業用途一樣也可以，不像GNU那種假腥腥的自由，還有一個重點就是，我覺得麻省理工這名字聽起來很酷，讓我想起每次在Discovery看到的東西 效能問題 我照著原本HGE的Tutorial7的程式寫了一個Python的版本，這個範例的目的就是在展示HGE的效能，純C++的版本速度當然是很快，而Python的版本FPS掉了不少，一開始讓我覺得有點失望，讓我開始懷疑如果效能掉很多的話，那用Python寫HGE還有價值嗎? 後來仔細思考了一下，對於一般的2D遊戲來說，要像這demo整畫面跑來跑去的圖片加透明效果的情況實在不多，就算有也很難到這樣上千張的圖片，再者我都還沒進行最佳化、跑profile等等，而且雖說FPS掉不少，但是那是和C++數百的FPS比起來，在60以上其實都是可以接受的，加上我測試的這台電腦已經有點年代，對現代的電腦和GUP來說情況只會更好，在如此的考量之下，Python HGE還是有搞頭的 python版的tutorial 7截圖 這個demo可以在這裡下載 目前狀況 目前雖然核心部份已經高度完成，不過我還沒有把編出來的pyd釋放的打算，如果想嘗鮮的話可以直接從那個demo裡面找pyd出來用，又或著自己check out原始碼進行編譯 參與開發 如果有興趣的話，歡迎參與專案的開發，如同我上面所提到的，我用的是boost.python，一款基於C++的python binding函式庫，如果你熟悉boost.python的話當然是最好，就算沒有也沒關系，因為其實大部份工作都是剪下貼上之類的，可以參考我已經寫好的部份，有些函數回傳例如指標之類的東西需要特別處理，除此之外都只是很簡單無腦工作]]></description>
			<content:encoded><![CDATA[<p>大家肯定都知道在Python下面寫2D遊戲有個眾所階知的選擇就是pygame，雖然它簡單好寫，對於簡單的遊戲來說已經足夠，但是他有一個致命的缺點，就是速度太慢了，在pygame的背後是SDL，用純軟體畫圖的函式庫，既然為純軟體繪圖，遇上旋轉、半透明等等需求，更顯得吃力和不切實際，所以該怎麼辦才好呢?</p>
<p>答案是用<a href="http://hge.relishgames.com/">Haaf&#8217;s Game Engine</a>，它是一款用DirectX做為backend的Open source遊戲函式庫，我在<a href="http://blog.ez2learn.com/2009/01/10/intro-to-hge/">先前的文章</a>裡已經有做簡單的介紹，就不再重覆，那這函式庫和Python又有什麼關聯呢? 他是用C++寫的，Python沒辦法用，正因為這樣，我一直一來想幫他寫一個python的binding，我一直想如果Python也能用HGE寫起來一定很開心，我試著找了一下有沒有已經存在這樣的專案，有找到一個，但是居然是在萬惡的GNU授權下的，讓我百思不得其解，那專案的作者到底在想什麼? 想讓大家寫Open source的Game嗎? 我們都知道GNU是大名頂頂的病毒授權，任何程式使用了用GNU的函式庫都會被感染，代表你的主程式一樣得變成GNU的開源授權，我個人非常討厭打著自由名義但是卻有強烈的強迫性質的GNU授權，況且HGE的授權是非常寬鬆的<a href="http://www.opensource.org/licenses/zlib-license.php" target="_blank"> zlib/libpng License</a>，實在想不透為什麼一個binding可以用超嚴格的GNU，不過那是那作者的自由，我也管不著，在不能接受那惡心的授權，加上我看了一下他的專案似乎好像也沒有很完整的進度，於是我還是決定自己開了一個新的專案<a href="http://www.opensource.org/licenses/zlib-license.php" target="_blank"></a></p>
<h2>Python HGE</h2>
<p>在這樣的情況下，我前些天抽空開了一個新的Open source專案: <a href="http://code.google.com/p/python-hge/">Python-HGE</a>，把一些最核心的程式碼都用boost.python包裝給Python使用，最核心的部份完成度很高，剩下的需要我在未來有空慢慢補上，License是MIT，如果你問我為什麼選MIT，我想答案應該是商業用途一樣也可以，不像GNU那種假腥腥的自由，還有一個重點就是，我覺得麻省理工這名字聽起來很酷，讓我想起每次在Discovery看到的東西</p>
<h2>效能問題</h2>
<p>我照著原本HGE的Tutorial7的程式寫了一個Python的版本，這個範例的目的就是在展示HGE的效能，純C++的版本速度當然是很快，而Python的版本FPS掉了不少，一開始讓我覺得有點失望，讓我開始懷疑如果效能掉很多的話，那用Python寫HGE還有價值嗎? 後來仔細思考了一下，對於一般的2D遊戲來說，要像這demo整畫面跑來跑去的圖片加透明效果的情況實在不多，就算有也很難到這樣上千張的圖片，再者我都還沒進行最佳化、跑profile等等，而且雖說FPS掉不少，但是那是和C++數百的FPS比起來，在60以上其實都是可以接受的，加上我測試的這台電腦已經有點年代，對現代的電腦和GUP來說情況只會更好，在如此的考量之下，Python HGE還是有搞頭的</p>
<p>python版的tutorial 7截圖</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/08/t7.png"><img class="alignnone size-medium wp-image-719" title="t7" src="http://blog.ez2learn.com/wp-content/uploads/2009/08/t7-300x235.png" alt="t7" width="300" height="235" /></a></p>
<p>這個demo可以在<a href="http://python-hge.googlecode.com/files/t7.zip">這裡下載</a></p>
<h2>目前狀況</h2>
<p>目前雖然核心部份已經高度完成，不過我還沒有把編出來的pyd釋放的打算，如果想嘗鮮的話可以直接從那個demo裡面找pyd出來用，又或著自己check out原始碼進行編譯</p>
<h2>參與開發</h2>
<p>如果有興趣的話，歡迎參與專案的開發，如同我上面所提到的，我用的是boost.python，一款基於C++的python binding函式庫，如果你熟悉boost.python的話當然是最好，就算沒有也沒關系，因為其實大部份工作都是剪下貼上之類的，可以參考我已經寫好的部份，有些函數回傳例如指標之類的東西需要特別處理，除此之外都只是很簡單無腦工作</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/08/25/python-hge/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>哇，好漂亮，可是請問按鈕到底在哪裡?</title>
		<link>http://blog.ez2learn.com/2009/03/29/it-is-beautiful-but-where-is-the-button/</link>
		<comments>http://blog.ez2learn.com/2009/03/29/it-is-beautiful-but-where-is-the-button/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 09:28:48 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[設計]]></category>
		<category><![CDATA[可用性]]></category>
		<category><![CDATA[網頁]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=556</guid>
		<description><![CDATA[介紹很多設計師網頁的通病，可用性0分的網頁設計]]></description>
			<content:encoded><![CDATA[<h2>美術苦手</h2>
<p>一直一來，寫程式是我的專業，但偶爾會有需要撈過界的時候，也是我最頭痛的時候，美術設計，像是網頁程式寫完，要開始把網頁美化，我發現這對我來說比什麼都還來得困難，光是配色就是門很大的學問，以前我對顏色一點概念都沒有，配出來的顏色很常是一些大便色，連我自己看了都想吐，畫圖也是一樣的，畫出來不是很難看，而是根本就不能看，我除了寫程式還得做美術? 我也沒有那樣的時間，或許正因為沒有花時間下去，這個世界是公平的，花多少時間下去，才會有多少的能力，一直一來我腦中響起ptt鄉民最愛講的話之一&#8230;.</p>
<h2>閃開! 讓專業的來</h2>
<p>是的，沒有人是萬能的，該交給專業的人時就該這麼做，但是問題出在於，專業的人到底要去哪裡找? 自稱設計師的人滿山遍野，到底要從何找起? 我這陣子逛了不少設計師的網頁，大部份都相當漂亮，有些甚至是美到讓人讚嘆，但是卻大部份都有一個致命的通病&#8230;.，<strong>那就是可用性0分</strong></p>
<h2>華麗但可用性0分網頁</h2>
<p>大部份設計師的網頁開起來都是華麗的Flash滿天飛舞，我們先不論用<strong>Flash做網頁對SEO的殺傷性</strong> (搜尋引擎應該是難以找到Flash裡的內容)，就只從可用性來看</p>
<p>看網頁要先下載超過20秒以上的Flash是常態，很多我在開啟的過程中不耐煩就把網頁給關了，沒理由的跳出新視窗的更是數不清，<strong>經由廣告視窗的訓練，大家對於那種跳出來的視窗很常第一個直覺反應就是關掉它</strong>，我也不例外，好好的普通網頁可以用，跳出一個新視窗來到底是要做什麼我也搞不懂，<strong>最誇張的還有遇到用Flash擴成全營幕，我真的不知道什麼網站可以偉大到擴成全螢幕讓使用者專心來看你的網頁</strong>，如果遇到不知道怎麼跳出的使用者就糗大了，你可能會說，他進入時會顯示"按Esc跳出"阿，是這樣嗎? 以自己的觀點來設計網頁就是失敗之處，我們都認為Esc跳出好像是理所當然的事情，但是<strong>如果遇到Esc在哪裡都不知道的使用者呢?</strong> 是這樣的話可能會遇到下列情況</p>
<blockquote><p>使用者不知道要怎樣跳出全螢幕模式，找了三分鐘都找不到，然後罵了:</p>
<p><strong><span style="font-size: large;">幹! 爛網站</span></strong></p>
<p>接著按電腦重開機鈕&#8230;.</p></blockquote>
<p>這不是不可能發生的事情，接著還有其它常見的通病，<strong>很多網站都喜歡用一些五四三的方式來代替按鈕</strong>，人物、物品、動物、阿貓阿狗之類的什麼鬼都有，看起來是很酷沒有錯，<strong>但是請問先生，我要怎麼知道哪個東西可以按?</strong> 是阿，我可以用滑鼠移過去點點看是嗎? 這似乎也是蠻有趣的驚喜不是嗎? 沒想到這東西居然可以按，呵呵，真有趣</p>
<p>大錯特錯! 如果你做的是遊戲，藏一些異想不到的東西在畫面裡，這還說得通，但可惜我們不是在玩遊戲，使用者也是，沒有使用者有那種美國時間來慢慢品嘗探索你網頁的樂趣，對於使用者來說，他們只想找到他們要的東西，其餘的東西都是雜訊，以這些設計師的網頁來說，我想找到的是他們的作品集，這下可好了，作品集的按鈕到底是哪一個? 一個一個試嗎? <strong>不，關掉網頁，找下一個，這是最快的做法</strong>，所以，請不要挑戰使用者的耐心</p>
<p>除了不知所云的按鈕，你追我跑的設計也是頗受歡迎，很多人喜歡讓滑鼠移動靠近某些東西會有不同的變化，像是有些是越靠近圖片越大，我發現我想看那張圖片，但是我非得把滑鼠移到圖片的最中心才能把圖片停住且放到最大的樣子，我只能說我可能走錯網頁了，我以為我來到了CS甩槍訓練的Flash網頁，這只是一個例子，還有很多類似的設計，很酷，但是很難用</p>
<h2>那創意怎麼辦?</h2>
<p>我知道想要突破常規是很多設計人的心願，但是在那之前還有一個前提是可用性，如果說做出來的東西是藝術品，只要用眼睛看就好的純欣賞用的作品，那便沒有什麼可用性好說的，但是如果說做出來的是網頁，網頁的目的如果是要讓人使用，那麼天大地大不是台科大，而是使用者，一切都是為了使用者而打造的，使用者必須被擺在第一個順位，賞心悅目、有創意，但是一樣要有可用性，除非你的網頁做出來只是孤芳自賞的藝術網頁</p>
<h2>值得一看的好書 : Don&#8217;t make me think</h2>
<p>我不是什麼可用性的專家，但是我知道有針對網頁可用性的好書，叫做Don&#8217;t make me think，已經算是經典的好書，他的最高原則就是直覺，也就是讓使用者不需要思考就能使用的設計，如果你的網頁在我說的範圍裡，可以參考看看這本書，或是當做沒聽到，以上只是打打嘴砲，請別在意</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/03/29/it-is-beautiful-but-where-is-the-button/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>替功能設定優先順序</title>
		<link>http://blog.ez2learn.com/2008/11/13/set-priority-for-functions/</link>
		<comments>http://blog.ez2learn.com/2008/11/13/set-priority-for-functions/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 07:39:13 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[設計]]></category>
		<category><![CDATA[程式設計]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=326</guid>
		<description><![CDATA[實作永遠比空想困難 實作所需要花的時間，永遠比單純想而已來得長太多了，再加上有許多在思考過程中難以發現的問題，因此實作通常都追不上想出新點子的速度，在實作的過程中時常很容易又突然想到一些點子，然而先前的點子明明都還沒有完成，我寫過無數個半途而廢的程式，往往就是在實作的過程中太貪心，實作的時間無限制地往後延，然後又想到新點子，於是最後終於受不了丟下目前的程式跑去開發新的程式，週而復始，時間久了，專案的資料夾都快可以改名成為專案塚了，而直到最近我開始明白了一件事情，讓這樣的情況有了很大的改善 替你的專案功能設定優先順序 在以往開發專案都是以貪心的心態進行開發，想法一股腦地想一口氣實現出來，但一個人的人月有限，所能做的事有限，有限的人力去實現無止盡不停冒出來的想法，專案永遠沒辦法結束是理所當然的情況，我在 深入淺出軟體開發 一書中學到了，替專案的目標設立優先順序，換言之也就是對於程式的功能設立優先順序，而在這次開發Walele中我就實際運用了這樣的想法，試想一個投票機產生器網站最重要的功能是什麼? 如果拿掉了這樣功能，這樣的系統便失去了意義，那就是系統最重要最核心的目標，不管如何都要做出來的，剩下的細節，仔細觀察他們之間的相依關係，以及對於專案的重要性，再決定要優先先寫哪些項目，Walele就是在這樣情況下產生的產物，事實上從現在看到的Walele和規劃中的Walele還有小一段距離，那就是優先順位較低的項目，在有限的時間內，我們必須把最重要的功能先行實作完成，先行完成的功能可能是1.0版，或是第一個里程碑，而剩下沒完成的功能往後面的里程碑或是版本排，沒有這樣做，貪心地想完成所有當初設下的目標，往往會超過期限，專案卻遲遲未能上線，因此替專案的目標、功能設下優先順序是必要的，這就是我從深入淺出軟體開發和Walele的實作過程中所學到的]]></description>
			<content:encoded><![CDATA[<h2>實作永遠比空想困難</h2>
<p>實作所需要花的時間，永遠比單純想而已來得長太多了，再加上有許多在思考過程中難以發現的問題，因此實作通常都追不上想出新點子的速度，在實作的過程中時常很容易又突然想到一些點子，然而先前的點子明明都還沒有完成，我寫過無數個半途而廢的程式，往往就是在實作的過程中太貪心，實作的時間無限制地往後延，然後又想到新點子，於是最後終於受不了丟下目前的程式跑去開發新的程式，週而復始，時間久了，專案的資料夾都快可以改名成為專案塚了，而直到最近我開始明白了一件事情，讓這樣的情況有了很大的改善</p>
<h2>替你的專案功能設定優先順序</h2>
<p><span id="more-326"></span></p>
<p>在以往開發專案都是以貪心的心態進行開發，想法一股腦地想一口氣實現出來，但一個人的人月有限，所能做的事有限，有限的人力去實現無止盡不停冒出來的想法，專案永遠沒辦法結束是理所當然的情況，我在 <a href="http://www.books.com.tw/exep/assp.php/victorlin/exep/prod/booksfile.php?item=0010407558">深入淺出軟體開發</a> 一書中學到了，替專案的目標設立優先順序，換言之也就是對於程式的功能設立優先順序，而在這次開發Walele中我就實際運用了這樣的想法，試想一個投票機產生器網站最重要的功能是什麼? 如果拿掉了這樣功能，這樣的系統便失去了意義，那就是系統最重要最核心的目標，不管如何都要做出來的，剩下的細節，仔細觀察他們之間的相依關係，以及對於專案的重要性，再決定要優先先寫哪些項目，Walele就是在這樣情況下產生的產物，事實上從現在看到的Walele和規劃中的Walele還有小一段距離，那就是優先順位較低的項目，在有限的時間內，我們必須把最重要的功能先行實作完成，先行完成的功能可能是1.0版，或是第一個里程碑，而剩下沒完成的功能往後面的里程碑或是版本排，沒有這樣做，貪心地想完成所有當初設下的目標，往往會超過期限，專案卻遲遲未能上線，因此替專案的目標、功能設下優先順序是必要的，這就是我從<a href="http://www.books.com.tw/exep/assp.php/victorlin/exep/prod/booksfile.php?item=0010407558">深入淺出軟體開發</a>和Walele的實作過程中所學到的</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/11/13/set-priority-for-functions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>設計才是王道</title>
		<link>http://blog.ez2learn.com/2008/10/11/to-design-is-the-king-way/</link>
		<comments>http://blog.ez2learn.com/2008/10/11/to-design-is-the-king-way/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 04:45:58 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[設計]]></category>
		<category><![CDATA[程式設計]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=157</guid>
		<description><![CDATA[最初 我第一次接觸程式語言，是在國一的時候，學習的是VB6.0，在一開始，我什麼都不懂，大概讀懂簡單的程式，然後靠著剪剪貼貼拼湊出我想要的程式，我還留著我的第一個程式 Private Sub Command1_Click() If A.Text &#38;gt; B.Text Then Label1.Caption = &#34;a大&#34; End If If A.Text &#38;lt; B.Text Then Label1.Caption = &#34;b大&#34; End If If A.Text = B.Text Then Label1.Caption = &#34;一樣&#34; End If End Sub 我還記得第一次它正確如我預期地運作時的感動，如你所見，當時我連什麼是縮排都不知道，隨著程式越寫越多，野心漸漸地也越來越大，當時有款很紅的線上遊戲叫天堂，我想要寫出那樣的遊戲，於是就在國中時埋頭苦幹式地硬寫出了一個遊戲的雛形，我把它叫做夢想線上(Dream On Line) 這遊戲沒什麼可以玩，只能走來走去，有很多的bug，事實上我有寫過一個伺服器找來網友一起連線，不過那伺服器的穩定度實在糟糕得可以，隨時都有可能當機 回頭再寫 因為已經上了高中，能寫的時間只有寒暑假，當這遊戲放了一陣子，我想再回去繼續寫時，只有心煩的感覺，完全寫不下去，太多硬拼湊出來的東西，完全沒有什麼組織可言，重寫似乎反而來得痛快多了，於是就重頭寫過，雖然每次都越寫越快，越寫越好，但最後都是一樣的下場，重寫，每次我回過頭去想繼續寫都覺得以前為什麼用這麼蠢的方式在寫，重寫似乎都是最好的方法 認識演算法與資料結構 原本我完全不了解什麼是演算法與資料結構，在這個過程中我開始了解到什麼是演算法和資料結構，原來我一開始想出來貼地圖磚塊的方式可以說就是演算法，而儲存地圖的方式也是資料結構，在重寫的過程中不停的加入我所學到的，可是最後還是重寫，是不是少了什麼? 我開始懷疑，這樣幾年過去了，這個遊戲我居然重寫了5次還6次，我自己都算不清楚了 八年過去了 寫程式開始到現在，在一路上我一直在探索到底什麼才是好的，什麼才是正確的，從一開始只會剪貼程式碼片段，來完成想要的程式，瞭解什麼是演算法和資料結構，漸漸學會查文件，程式我都寫得出來，硬寫也是寫出來，但總是少了什麼，無法維護、總是有很多問題，直到這些年我發現 設計 原來我的程式一直少了設計，程式設計師的設計這兩字並不是平白無故加上去的，在用硬寫寫出程式的日子裡，從我不知道演算法、資料結構，但不知不覺地用了演算法和資料結構，不知道什麼叫做觀察者設計樣式，但是卻想出來並使用，在這些不懂設計的日子裡，我只是一個程式黑手，憑著七拼八湊硬是湊得出成品，但那樣的成品並沒辦法維護、擴充，同樣的也容易產生很多問題，離所謂的設計師還很遙遠，一個程式的好壞，設計才是重點，對於玩語法把戲，更顯得離設計更遠，一個程式如果有好的設計，在細節上就算用很笨的方法寫一樣可以運作得很好，正因為我寫過爛程式，我才能體會什麼叫做好的程式設計 設計，才是王道]]></description>
			<content:encoded><![CDATA[<h2>最初</h2>
<p>我第一次接觸程式語言，是在國一的時候，學習的是VB6.0，在一開始，我什麼都不懂，大概讀懂簡單的程式，然後靠著剪剪貼貼拼湊出我想要的程式，我還留著我的第一個程式</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> Command1_Click()
<span style="color: #000080;">If</span> A.Text &amp;gt; B.Text <span style="color: #000080;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;a大&quot;</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
<span style="color: #000080;">If</span> A.Text &amp;lt; B.Text <span style="color: #000080;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;b大&quot;</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
<span style="color: #000080;">If</span> A.Text = B.Text <span style="color: #000080;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;一樣&quot;</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></div></div>

<p>我還記得第一次它正確如我預期地運作時的感動，如你所見，當時我連什麼是縮排都不知道，隨著程式越寫越多，野心漸漸地也越來越大，當時有款很紅的線上遊戲叫天堂，我想要寫出那樣的遊戲，於是就在國中時埋頭苦幹式地硬寫出了一個遊戲的雛形，我把它叫做夢想線上(Dream On Line)</p>
<div id="attachment_158" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-11_115307.png"><img class="size-medium wp-image-158" title="夢想線上登入畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-11_115307-300x225.png" alt="夢想線上登入畫面" width="300" height="225" /></a><p class="wp-caption-text">夢想線上登入畫面</p></div>
<div id="attachment_159" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-11_115338.png"><img class="size-medium wp-image-159" title="夢想線上遊戲畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-11_115338-300x225.png" alt="夢想線上遊戲畫面" width="300" height="225" /></a><p class="wp-caption-text">夢想線上遊戲畫面</p></div>
<p>這遊戲沒什麼可以玩，只能走來走去，有很多的bug，事實上我有寫過一個伺服器找來網友一起連線，不過那伺服器的穩定度實在糟糕得可以，隨時都有可能當機</p>
<p><span id="more-157"></span></p>
<h2>回頭再寫</h2>
<p>因為已經上了高中，能寫的時間只有寒暑假，當這遊戲放了一陣子，我想再回去繼續寫時，只有心煩的感覺，完全寫不下去，太多硬拼湊出來的東西，完全沒有什麼組織可言，重寫似乎反而來得痛快多了，於是就重頭寫過，雖然每次都越寫越快，越寫越好，但最後都是一樣的下場，重寫，每次我回過頭去想繼續寫都覺得以前為什麼用這麼蠢的方式在寫，重寫似乎都是最好的方法</p>
<h2>認識演算法與資料結構</h2>
<p>原本我完全不了解什麼是演算法與資料結構，在這個過程中我開始了解到什麼是演算法和資料結構，原來我一開始想出來貼地圖磚塊的方式可以說就是演算法，而儲存地圖的方式也是資料結構，在重寫的過程中不停的加入我所學到的，可是最後還是重寫，是不是少了什麼? 我開始懷疑，這樣幾年過去了，這個遊戲我居然重寫了5次還6次，我自己都算不清楚了</p>
<div id="attachment_160" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/map_editor_test.jpg"><img class="size-medium wp-image-160" title="某個重寫版本的地圖編輯器" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/map_editor_test-300x225.jpg" alt="某個重寫版本的地圖編輯器" width="300" height="225" /></a><p class="wp-caption-text">某個重寫版本的地圖編輯器</p></div>
<div id="attachment_161" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/client_test_01.jpg"><img class="size-medium wp-image-161" title="某個重寫版本的Client" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/client_test_01-300x225.jpg" alt="某個重寫版本的Client" width="300" height="225" /></a><p class="wp-caption-text">某個重寫版本的Client</p></div>
<div id="attachment_163" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/mapeditor3.jpg"><img class="size-medium wp-image-163" title="更晚的重寫版本的地圖編輯器" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/mapeditor3-300x225.jpg" alt="更晚的重寫版本的地圖編輯器" width="300" height="225" /></a><p class="wp-caption-text">更晚的重寫版本的地圖編輯器</p></div>
<div id="attachment_162" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/client2.jpg"><img class="size-medium wp-image-162" title="更晚的重寫版本的Client" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/client2-300x225.jpg" alt="更晚的重寫版本的Client" width="300" height="225" /></a><p class="wp-caption-text">更晚的重寫版本的Client</p></div>
<div id="attachment_164" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/client3.jpg"><img class="size-medium wp-image-164" title="更晚的重寫版本的Client 2" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/client3-300x223.jpg" alt="更晚的重寫版本的Client 2" width="300" height="223" /></a><p class="wp-caption-text">更晚的重寫版本的Client 2</p></div>
<div id="attachment_165" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/last_map_editor.jpg"><img class="size-medium wp-image-165" title="最後的重寫版本的地圖編輯器" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/last_map_editor-300x240.jpg" alt="最後的重寫版本的地圖編輯器" width="300" height="240" /></a><p class="wp-caption-text">最後的重寫版本的地圖編輯器</p></div>
<div id="attachment_166" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/last_map_editor2.jpg"><img class="size-medium wp-image-166" title="最後的重寫版本的地圖編輯器" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/last_map_editor2-300x240.jpg" alt="最後的重寫版本的地圖編輯器" width="300" height="240" /></a><p class="wp-caption-text">最後的重寫版本的地圖編輯器</p></div>
<h2>八年過去了</h2>
<p>寫程式開始到現在，在一路上我一直在探索到底什麼才是好的，什麼才是正確的，從一開始只會剪貼程式碼片段，來完成想要的程式，瞭解什麼是演算法和資料結構，漸漸學會查文件，程式我都寫得出來，硬寫也是寫出來，但總是少了什麼，無法維護、總是有很多問題，直到這些年我發現</p>
<h2>設計</h2>
<p>原來我的程式一直少了設計，程式設計師的設計這兩字並不是平白無故加上去的，在用硬寫寫出程式的日子裡，從我不知道演算法、資料結構，但不知不覺地用了演算法和資料結構，不知道什麼叫做觀察者設計樣式，但是卻想出來並使用，在這些不懂設計的日子裡，我只是一個程式黑手，憑著七拼八湊硬是湊得出成品，但那樣的成品並沒辦法維護、擴充，同樣的也容易產生很多問題，離所謂的設計師還很遙遠，一個程式的好壞，設計才是重點，對於玩語法把戲，更顯得離設計更遠，一個程式如果有好的設計，在細節上就算用很笨的方法寫一樣可以運作得很好，正因為我寫過爛程式，我才能體會什麼叫做好的程式設計</p>
<blockquote>
<h1>設計，才是王道</h1>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/11/to-design-is-the-king-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>抓取網頁程式的架構設計</title>
		<link>http://blog.ez2learn.com/2008/10/11/design-of-web-grabing-program/</link>
		<comments>http://blog.ez2learn.com/2008/10/11/design-of-web-grabing-program/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 17:24:54 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[設計]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[抓取網頁]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=138</guid>
		<description><![CDATA[截取網頁的架構設計 我們先前談到了抓取網頁用的工具，但是光有工具是不夠的，良好的設計也是必要的，這次我們就來談談設計 最早我寫一個抓取amazon.com商品資料的程式，當時沒仔細思考設計的問題，而且在一開始低估了問題的複雜程度，導至後來在修改時整個是一團混亂，我把抓取網頁的流程分成幾個部份，然而這些流程之間有著很多細小複雜的溝通和互相依賴的關係，到了後來我發現我哪裡在寫程式，這根本是一團義大利麵! 此時我終於深刻體會到什麼叫漣漪效應，當我修改一小部份程式，有很多依賴此的程式也跟著需要修改，間接依賴的程式片段一樣需要修改，程式的改變有如投入池子中的石子，修改在程式碼間散播開來，再也沒有比這個更糟的設計了，除了修改的問題，測試更是一個嚴重的問題，當我發現一個錯誤，我無法確定這個錯誤到底是屬於誰的，它們之間有這麼多關係，每個人都有嫌疑，我明白這程式繼續寫下去就只有死路一條，於是我開始思考怎樣的設計才是正確的 最明顯的錯誤 最明顯的錯誤就是，流程和流程之間有太多關係了，它們互相依賴，造成藕合度大大提升，牽一髮動全身，因此我意識到每個流程應該都要和其它任何流程沒有任何關係，它們只在乎它們的輸入，以及如何處理它們，於是我就聯想到了責任鏈設計模式，以及工廠的生產線，我想像資料進來，從最先的原料，進入一開始的工廠加工，接著被送到下一個工廠處理，每個工廠只知道如何對進入的產品加工，對於前一個工廠、後一個工廠，對所有工廠都一無所知，這才是將處理流程從藕合的關係中鬆綁的正確設計，於是我做出了設計上的修改，重新寫過了程式，我將幾個大流程分開成獨立的物件，並單獨做測試，確定每個流程都如預期般，有如預期的正確輸出，最後再將這些流程串起來，果然這樣的做法果然解決了問題，但是問題還沒有結束 一直有種強烈的直覺 很多時候沒辦法明白的說出來，但就是有些強烈的直覺，感覺到設計上可以做到某種程度，但卻還無法用言語表達，將每個流程分開程獨立的程式處理，雖然鬆綁藕合，但是卻沒有良好的重用性，到後來我發現Twisted，使用它的Deferred物件，從getPage的Deferred物件中增加parsing的callback，我意識到，不止一個大的流程，從抓取網頁、解析網頁、儲存資料，每一個步驟事實上應該都是獨立的，如果以一大流程做為單位，當我需要使用其它抓取網頁的機制，解析網頁的程式卻要從那個大流程中取出來，很明顯地，以大流程做為單位太大了，而且流程應該是由幾個小步驟組合而成，不應該把它們綁在一起，在這時我還沒有明確的想法，直到&#8230; 遇到GStreamer 為了寫某些程式的需要，我找到了一款Open source的影音串流處理的函式庫，我看到了它Pipeline的機制，此時我眼睛為之一亮，這不就是我想要的設計嗎? 由元素組成串在一起的pipeline，每個元素只有特定處理資料的方式，然後往後面的元素傳 引用自 : http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-intro-basics-bins.html#section-pipeline-img 我的設計 於是我開始構思我的網頁抓取的pipeline，起先我試著模仿它那種pipeline的設計方式，但是它的Element相當複雜，並不適合網頁抓取的pipeline，於是我把心思拉回處理網頁的每個單一步驟該有的特性，最後我做出了這樣的設計 在這其中，我除了考慮到藕合上的問題，同樣也考慮到效率等等的問題，Element本身只專注在於處理資料這件事，資料由input方法輸入，而handleData處理資料，當資料處理完成需要輸出使用outputEvent來通知外界資料處理完成，當資料都處理完成也輸出完成時，就用requestEvent通知外界可以輸入更多資料，然而如果在handleData的過程中發生問題，就使用failureEvent告知外界錯誤訊息，大至上的行為是如此，但在細節上還有一些問題沒想清楚 而Bin本身是一個Element的容器，負責接受來自Element的事件通知，然後做出對應的處理，Pipeline就是一個Bin的子類別，它負責轉送到對應的Element去，或是放入queue中等待request事件再送出，它都使用CallInThread來呼叫element的input方法，這表示，所有工作都是非同步進行的，不需要等一筆資料被處理完成後，才能接受新的資料，只要一個Element的資料處理完，可以馬上再處理下一筆，這是提升效率的方法之一 值得注意的是，Pipeline和Bin本身一樣也是一個Element，這表示它可以被當做Element和其它Element串在一起，或是加入其它Bin中，這讓設計上更有彈性 Retry裝飾者 有了這樣的概念確立後，我引進了更多設計上的應用，例如裝飾者設計樣式，我設計了一個Retry的裝飾者，可以把getPage等等可能會失敗的Element包裝起來，自動進行特定次數的重試，而不必為了getPage特地重寫重試的版本，有其它可能出錯的Element都可以用此裝飾者包裝起來 Dispatcher 然而，到目前為止我們的效能還是不夠好，因為同一個時間裡只有一條pipeline在運行，我們需要的是在同一個時間內可以有多條的pipeline運作，因此設計了一個Dispatcher的Bin，可以新增很多條Pipeline在其中，然後input資料就會自動分派給pipeline If判斷元素 只有這樣還不夠，考慮一下我們如果需要抓取分頁的網頁，我們一頁一頁往下抓，要判斷是否有下一頁，繼續網下抓取或是停止，為此我設計了If判斷用的Element，它會根據一個條件函數來決定輸出的port 當這一切組合在一起 到目前為止所有提到的都是Element，這表示他們可以被替換掉在任何以上的結構中，Dispatcher所分派的對象不一定要是Pipeline，也可以是其它Element，我為了我目前工作用這樣的東西重新組合重寫一次，組合起來像是這樣 而Dispatcher在外面將這個Pipeline重覆了幾次，因此同時可以執行很多個Pipeline，GetPage、Parser等等都是常用的Element，而只有Get book page detail等Element是我們自行設計的Element，這將重覆利用發揮到了極緻，有強大的彈性，你可以在裡面看到一個迴圈，事實上它只是串接著一個If的Element然後Link條件為真的Port和為假的Port到不同元素而已 我最早的設計是如上圖所示，但是後來考慮到Amazon網路書店的Review頁面，往往是商品資料頁面的好幾百倍和千倍，因此，到後來我將商品資料和Review資料的Pipeline分開，分別用Dispatcher包裝起來後串接在一起，Review的Pipeline數量應該要是商品資料的很多倍，如此一來才能更快消化完Review頁面的工作 未來 到此，相信已經可以感受到這樣設計的威力，我希望將我的程式整理成函式庫，釋放出來成為Open source的Project，專案的名字我還在想，目前考慮用中文字"川"或是DStreamer之類的名字，如果有任何想法，也歡迎提供給我 :P 除此之外，如果你有玩過GStreamer，應該知道它有一個用指令來播放串流媒體的功能，像這樣子 gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! alsasink 就可以播放ogg的音樂檔案，這只是簡單的例子，它還可以做更複雜的事，例如從麥克風讀取音訊即時壓縮成ogg或mp3格式，且同時播放出來之類的 除了Library，我同樣希望寫出一個像這樣的工具程式，讓某些抓網頁的程式可以被簡化成像這樣的指令，例如 dst-launch GetPage url="http://www.google.com" [...]]]></description>
			<content:encoded><![CDATA[<h1>截取網頁的架構設計</h1>
<p>我們先前談到了抓取網頁用的工具，但是光有工具是不夠的，良好的設計也是必要的，這次我們就來談談設計</p>
<p><span id="more-138"></span></p>
<p>最早我寫一個抓取amazon.com商品資料的程式，當時沒仔細思考設計的問題，而且在一開始低估了問題的複雜程度，導至後來在修改時整個是一團混亂，我把抓取網頁的流程分成幾個部份，然而這些流程之間有著很多細小複雜的溝通和互相依賴的關係，到了後來我發現我哪裡在寫程式，這根本是一團義大利麵! 此時我終於深刻體會到什麼叫漣漪效應，當我修改一小部份程式，有很多依賴此的程式也跟著需要修改，間接依賴的程式片段一樣需要修改，程式的改變有如投入池子中的石子，修改在程式碼間散播開來，再也沒有比這個更糟的設計了，除了修改的問題，測試更是一個嚴重的問題，當我發現一個錯誤，我無法確定這個錯誤到底是屬於誰的，它們之間有這麼多關係，每個人都有嫌疑，我明白這程式繼續寫下去就只有死路一條，於是我開始思考怎樣的設計才是正確的</p>
<h2>最明顯的錯誤</h2>
<p>最明顯的錯誤就是，流程和流程之間有太多關係了，它們互相依賴，造成藕合度大大提升，牽一髮動全身，因此我意識到每個流程應該都要和其它任何流程沒有任何關係，它們只在乎它們的輸入，以及如何處理它們，於是我就聯想到了責任鏈設計模式，以及工廠的生產線，我想像資料進來，從最先的原料，進入一開始的工廠加工，接著被送到下一個工廠處理，每個工廠只知道如何對進入的產品加工，對於前一個工廠、後一個工廠，對所有工廠都一無所知，這才是將處理流程從藕合的關係中鬆綁的正確設計，於是我做出了設計上的修改，重新寫過了程式，我將幾個大流程分開成獨立的物件，並單獨做測試，確定每個流程都如預期般，有如預期的正確輸出，最後再將這些流程串起來，果然這樣的做法果然解決了問題，但是問題還沒有結束</p>
<h2>一直有種強烈的直覺</h2>
<p>很多時候沒辦法明白的說出來，但就是有些強烈的直覺，感覺到設計上可以做到某種程度，但卻還無法用言語表達，將每個流程分開程獨立的程式處理，雖然鬆綁藕合，但是卻沒有良好的重用性，到後來我發現Twisted，使用它的Deferred物件，從getPage的Deferred物件中增加parsing的callback，我意識到，不止一個大的流程，從抓取網頁、解析網頁、儲存資料，每一個步驟事實上應該都是獨立的，如果以一大流程做為單位，當我需要使用其它抓取網頁的機制，解析網頁的程式卻要從那個大流程中取出來，很明顯地，以大流程做為單位太大了，而且流程應該是由幾個小步驟組合而成，不應該把它們綁在一起，在這時我還沒有明確的想法，直到&#8230;</p>
<h2>遇到GStreamer</h2>
<p>為了寫某些程式的需要，我找到了一款Open source的影音串流處理的函式庫，我看到了它Pipeline的機制，此時我眼睛為之一亮，這不就是我想要的設計嗎? 由元素組成串在一起的pipeline，每個元素只有特定處理資料的方式，然後往後面的元素傳</p>
<div id="attachment_140" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/simple-player.png"><img class="size-medium wp-image-140" title="GStreamer的Pipeline" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/simple-player-300x110.png" alt="GStreamer的Pipeline" width="300" height="110" /></a><p class="wp-caption-text">GStreamer的Pipeline</p></div>
<p>引用自 : <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-intro-basics-bins.html#section-pipeline-img">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-intro-basics-bins.html#section-pipeline-img</a></p>
<h2>我的設計</h2>
<p>於是我開始構思我的網頁抓取的pipeline，起先我試著模仿它那種pipeline的設計方式，但是它的Element相當複雜，並不適合網頁抓取的pipeline，於是我把心思拉回處理網頁的每個單一步驟該有的特性，最後我做出了這樣的設計</p>
<div id="attachment_145" class="wp-caption alignnone" style="width: 278px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/element1.jpg"><img class="size-medium wp-image-145" title="Element 的UML設計圖" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/element1-268x300.jpg" alt="Element 的UML設計圖" width="268" height="300" /></a><p class="wp-caption-text">Element 的UML設計圖</p></div>
<p>在這其中，我除了考慮到藕合上的問題，同樣也考慮到效率等等的問題，Element本身只專注在於處理資料這件事，資料由input方法輸入，而handleData處理資料，當資料處理完成需要輸出使用outputEvent來通知外界資料處理完成，當資料都處理完成也輸出完成時，就用requestEvent通知外界可以輸入更多資料，然而如果在handleData的過程中發生問題，就使用failureEvent告知外界錯誤訊息，大至上的行為是如此，但在細節上還有一些問題沒想清楚</p>
<p>而Bin本身是一個Element的容器，負責接受來自Element的事件通知，然後做出對應的處理，Pipeline就是一個Bin的子類別，它負責轉送到對應的Element去，或是放入queue中等待request事件再送出，它都使用CallInThread來呼叫element的input方法，這表示，所有工作都是非同步進行的，不需要等一筆資料被處理完成後，才能接受新的資料，只要一個Element的資料處理完，可以馬上再處理下一筆，這是提升效率的方法之一</p>
<p>值得注意的是，Pipeline和Bin本身一樣也是一個Element，這表示它可以被當做Element和其它Element串在一起，或是加入其它Bin中，這讓設計上更有彈性</p>
<h2>Retry裝飾者</h2>
<p>有了這樣的概念確立後，我引進了更多設計上的應用，例如裝飾者設計樣式，我設計了一個Retry的裝飾者，可以把getPage等等可能會失敗的Element包裝起來，自動進行特定次數的重試，而不必為了getPage特地重寫重試的版本，有其它可能出錯的Element都可以用此裝飾者包裝起來</p>
<h2>Dispatcher</h2>
<p>然而，到目前為止我們的效能還是不夠好，因為同一個時間裡只有一條pipeline在運行，我們需要的是在同一個時間內可以有多條的pipeline運作，因此設計了一個Dispatcher的Bin，可以新增很多條Pipeline在其中，然後input資料就會自動分派給pipeline</p>
<div id="attachment_147" class="wp-caption alignnone" style="width: 301px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/dispatcheractivity.jpg"><img class="size-medium wp-image-147" title="Dispatcher的活動示意圖" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/dispatcheractivity-291x300.jpg" alt="Dispatcher的活動示意圖" width="291" height="300" /></a><p class="wp-caption-text">Dispatcher的活動示意圖</p></div>
<h2>If判斷元素</h2>
<p>只有這樣還不夠，考慮一下我們如果需要抓取分頁的網頁，我們一頁一頁往下抓，要判斷是否有下一頁，繼續網下抓取或是停止，為此我設計了If判斷用的Element，它會根據一個條件函數來決定輸出的port</p>
<h2>當這一切組合在一起</h2>
<p>到目前為止所有提到的都是Element，這表示他們可以被替換掉在任何以上的結構中，Dispatcher所分派的對象不一定要是Pipeline，也可以是其它Element，我為了我目前工作用這樣的東西重新組合重寫一次，組合起來像是這樣</p>
<div id="attachment_148" class="wp-caption alignnone" style="width: 193px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/activitydiagram1.jpg"><img class="size-medium wp-image-148" title="Amazon 活動圖" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/activitydiagram1-183x300.jpg" alt="Amazon 活動圖" width="183" height="300" /></a><p class="wp-caption-text">Amazon 活動圖</p></div>
<p>而Dispatcher在外面將這個Pipeline重覆了幾次，因此同時可以執行很多個Pipeline，GetPage、Parser等等都是常用的Element，而只有Get book page detail等Element是我們自行設計的Element，這將重覆利用發揮到了極緻，有強大的彈性，你可以在裡面看到一個迴圈，事實上它只是串接著一個If的Element然後Link條件為真的Port和為假的Port到不同元素而已</p>
<p>我最早的設計是如上圖所示，但是後來考慮到Amazon網路書店的Review頁面，往往是商品資料頁面的好幾百倍和千倍，因此，到後來我將商品資料和Review資料的Pipeline分開，分別用Dispatcher包裝起來後串接在一起，Review的Pipeline數量應該要是商品資料的很多倍，如此一來才能更快消化完Review頁面的工作</p>
<h2>未來</h2>
<p>到此，相信已經可以感受到這樣設計的威力，我希望將我的程式整理成函式庫，釋放出來成為Open source的Project，專案的名字我還在想，目前考慮用中文字"川"或是DStreamer之類的名字，如果有任何想法，也歡迎提供給我 :P</p>
<p>除此之外，如果你有玩過GStreamer，應該知道它有一個用指令來播放串流媒體的功能，像這樣子</p>
<blockquote>
<pre class="programlisting">gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! alsasink</pre>
</blockquote>
<p>就可以播放ogg的音樂檔案，這只是簡單的例子，它還可以做更複雜的事，例如從麥克風讀取音訊即時壓縮成ogg或mp3格式，且同時播放出來之類的</p>
<p>除了Library，我同樣希望寫出一個像這樣的工具程式，讓某些抓網頁的程式可以被簡化成像這樣的指令，例如</p>
<blockquote><p>dst-launch GetPage url="http://www.google.com" ! RegexParser re="&lt;title&gt;(.*?)&lt;/title&gt;" output="$1&#8243; ! FileOutput filename="google_title.txt"</p></blockquote>
<p>像這樣簡單的指令就能抓取Google網頁的標題然後存成文字檔，除此之外，甚至是GUI介面來像UML那樣設計抓取網頁的流程</p>
<p>有興趣參與或有任何想法都歡迎給個評論，謝謝</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/11/design-of-web-grabing-program/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>這個網站的主機商 : WebFaction</title>
		<link>http://blog.ez2learn.com/2008/09/28/hosting-of-this-site/</link>
		<comments>http://blog.ez2learn.com/2008/09/28/hosting-of-this-site/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 15:28:41 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[Unix-Like]]></category>
		<category><![CDATA[網站]]></category>
		<category><![CDATA[設計]]></category>
		<category><![CDATA[主機商]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Plone]]></category>
		<category><![CDATA[Rail on Ruby]]></category>
		<category><![CDATA[TurboGears]]></category>
		<category><![CDATA[WebFaction]]></category>
		<category><![CDATA[架站]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=20</guid>
		<description><![CDATA[主機商WebFaction 今天我要介紹我的網站所使用的主機商 : WebFaction 為什麼選擇這家主機商 我會選擇這家主機商的最主要原因，是因為他們有提供TurboGears、Django、Plone等各種我需要的Python網頁開發框架，或程式的虛擬主機服務，市面上最常見的主流虛擬主機服務都是以PHP為主，因此較難找到我需要能夠執行TurboGears和Plone的主機商，在經過找尋了一陣子，最後終於找到了這家主機商，其中也搜尋了不少在TurboGears的Google group的討論和評價，他們對於此主機商的評價都相當高，他們說這主機商盡力想讓他們的客戶高興，於是我就決使用這家主機商，用線上刷卡訂購了虛擬主機的服務，幾個小時內，網站就啟用了，相當地有效率 出色的控制面版 因為是較非主流的應用，所以不會看到常見的cPanel等虛擬主機的控制面版，而是他們自行研發的控制面版，他們在網站上有提供許多控制面版的示範影片，其中包括如何用來建置TurboGears的網站，或是Plone之類的程式，有興趣可以參考看看 面版控制示範影片 相信看完就可以大約了解，這控制面版相當地好用，操作很簡單，加上有示範影片可以看，帳戶開通沒多久我立刻成功地建立了一個Plone的站台 不可思議的優秀客服支援 如同我所見到的評價，他們的客服真的是盡力讓他們客戶高興的客服，因為有六十天無條件退款的保證，所以我決定當一個澳客，帳戶一開通我就毫不客氣地盡量使用客服，他們都很友善的回答，技術上的問題，他們都答得出來，他們建置了一個專門的知識庫 WebFaction 的客服 這網頁是開放的，即使你沒有帳號，你一樣可以在裡面找到很多有用的問題的解決方法，我發了幾個問題，他們都找到在裡面的解決方案然後跟我說明要如何解決，當一個發問不爬文的澳客感覺還真不錯 :P 以下是一封我題出問題和客服的對話，就可以明白他們的客服都相當友善，而且都有相當程度的專業知識 victorlin Hi, I configure Plone mail setting by following this article: https://help.webfaction.com/index.php?_m=knowledgebase&#38;_a=viewarticle&#38;kbarticleid=82 But I always got a " Error Please correct the indicated errors. " error when sending a mail from plone. What am I doing wrong? [...]]]></description>
			<content:encoded><![CDATA[<h2>主機商WebFaction</h2>
<p>今天我要介紹我的網站所使用的主機商 : <a href="http://www.webfaction.com/?affiliate=victorlin">WebFaction</a></p>
<p><span id="more-20"></span></p>
<h3>為什麼選擇這家主機商</h3>
<p>我會選擇這家主機商的最主要原因，是因為他們有提供TurboGears、Django、Plone等各種我需要的Python網頁開發框架，或程式的虛擬主機服務，市面上最常見的主流虛擬主機服務都是以PHP為主，因此較難找到我需要能夠執行TurboGears和Plone的主機商，在經過找尋了一陣子，最後終於找到了這家主機商，其中也搜尋了不少在TurboGears的Google group的討論和評價，他們對於此主機商的評價都相當高，他們說這主機商盡力想讓他們的客戶高興，於是我就決使用這家主機商，用線上刷卡訂購了虛擬主機的服務，幾個小時內，網站就啟用了，相當地有效率</p>
<h3>出色的控制面版</h3>
<p>因為是較非主流的應用，所以不會看到常見的cPanel等虛擬主機的控制面版，而是他們自行研發的控制面版，他們在網站上有提供許多控制面版的示範影片，其中包括如何用來建置TurboGears的網站，或是Plone之類的程式，有興趣可以參考看看</p>
<p><a href="http://www.webfaction.com/demos/control-panel?affiliate=victorlin">面版控制示範影片</a></p>
<p>相信看完就可以大約了解，這控制面版相當地好用，操作很簡單，加上有示範影片可以看，帳戶開通沒多久我立刻成功地建立了一個Plone的站台</p>
<h3>不可思議的優秀客服支援</h3>
<p>如同我所見到的評價，他們的客服真的是盡力讓他們客戶高興的客服，因為有六十天無條件退款的保證，所以我決定當一個澳客，帳戶一開通我就毫不客氣地盡量使用客服，他們都很友善的回答，技術上的問題，他們都答得出來，他們建置了一個專門的知識庫</p>
<p><a href="https://help.webfaction.com/?affiliate=victorlin">WebFaction 的客服</a></p>
<p>這網頁是開放的，即使你沒有帳號，你一樣可以在裡面找到很多有用的問題的解決方法，我發了幾個問題，他們都找到在裡面的解決方案然後跟我說明要如何解決，當一個發問不爬文的澳客感覺還真不錯  :P</p>
<p>以下是一封我題出問題和客服的對話，就可以明白他們的客服都相當友善，而且都有相當程度的專業知識</p>
<p><strong><span class="ticketpostname">victorlin</span></strong></p>
<blockquote><p><span class="mediumtext">Hi, I configure Plone mail setting by following this article:</span></p>
<p>https://help.webfaction.com/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;kbarticleid=82</p>
<p>But I always got a " Error Please correct the indicated errors. " error when sending a mail from plone. What am I doing wrong?</p>
<p>This is the configuration I set.</p>
<p>SMTP : *******<br />
SMTP port : 25<br />
ESMTP username : ********<br />
ESMTP password : (the password I set)<br />
From name : Site Administrator<br />
From e-mail : *********</p>
<p>Thanks.</p></blockquote>
<p><strong><span class="ticketpostname">Sime Ramov</span></strong></p>
<blockquote><p><span class="mediumtext">Hi,</span></p>
<p>&gt; But I always got a " Error Please correct the indicated errors. "<br />
&gt; error when sending a mail from plone. What am I doing wrong?</p>
<p>Does anything gets indicated? With red color or something? Could you<br />
post a screenshot?</p>
<p>&gt; This is the configuration I set.<br />
&gt;<br />
&gt; [...]</p>
<p>By the looks of it, the configuration looks fine.</p>
<p>Hope this helps and thanks for using WebFaction!</p>
<p>Best regards,<br />
&#8211; Sime</p></blockquote>
<p><strong><span class="ticketpostname">victorlin</span></strong></p>
<blockquote><p><span class="mediumtext">That bar says "Error Please correct the indicated errors.", but I don&#8217;t see any thing in errors of plone site setup. I have no idea where to see the error.</span></p>
<p>Thanks.</p></blockquote>
<p><strong><span class="ticketpostname">Sean Fulmer</span></strong></p>
<blockquote><p><span class="mediumtext">Hi Victor,</span></p>
<p>&gt; That bar says "Error Please correct the indicated errors.", but I don&#8217;t see<br />
&gt; any thing in errors of plone site setup. I have no idea where to see the<br />
&gt; error.</p>
<p>I&#8217;ve just sent myself an email from your site<br />
(http://ez2learn.com/99969801/sendto_form) and encountered no errors. I<br />
received the email a few seconds after I submitted the form.</p>
<p>It looks like this is working fine, but if you are still having trouble,<br />
please let us know the exact steps we can take to reproduce the error.</p>
<p>Thanks,</p>
<p>Sean Fulmer<br />
WebFaction Support</p></blockquote>
<p><strong><span class="ticketpostname">victorlin</span></strong></p>
<blockquote><p><span class="mediumtext">Oh, I send a article to my email without error, too. But I encounter that problem that I just mentioned before, when I use contact of my Plone site</span></p>
<p>http://www.ez2learn.com/contact-info</p>
<p>Once I send a mail by contact page, here comes the problem.</p></blockquote>
<p><strong><span class="ticketpostname">Sean Fulmer</span></strong></p>
<blockquote><p><span class="mediumtext">&gt; Oh, I send a article to my email without error, too. But I encounter that problem that I just mentioned before, when I use contact of my Plone site<br />
&gt;<br />
&gt; http://www.ez2learn.com/contact-info<br />
&gt;<br />
&gt; Once I send a mail by contact page, here comes the problem.</span></p>
<p>I just sent a test message from http://www.ez2learn.com/contact-info and did not encounter an error.</p>
<p>I&#8217;ve just noticed that your email address did not include your mailbox as a target, so I added your &#8216;victorlin&#8217; mailbox as a target for the address: https://panel.webfaction.com/email/read/24069</p>
<p>Can you tell if if that solved the problem for you?</p>
<p>Regards,</p>
<p>Sean Fulmer<br />
WebFaction Support</p></blockquote>
<p><strong><span class="ticketpostname">victorlin</span></strong></p>
<blockquote><p><span class="mediumtext">Nope. I still encounter that problem.</span></p>
<p>Wow! That&#8217;s so strange!<br />
It doesn&#8217;t make sense. I have never send a mail successfully by that contact page, how do you do that? What language do you use to browser my contact page?</p>
<p>By the way, I love your nice service and fantastic supporting! Nice job! :P</p></blockquote>
<p><strong><span class="ticketpostname">Sean Fulmer</span></strong></p>
<blockquote><p><span class="mediumtext">Hi Victor,</span></p>
<p>&gt; Nope. I still encounter that problem.<br />
&gt;<br />
&gt; Wow! That&#8217;s so strange!<br />
&gt; It doesn&#8217;t make sense. I have never send a mail successfully by that contact<br />
&gt; page, how do you do that? What language do you use to browser my contact<br />
&gt; page?</p>
<p>My browser is set to use English, but your site appears in Chinese for me.</p>
<p>Can you tell me the email &#8216;from&#8217; address that your Plone user account is<br />
using? I&#8217;ll try another test message from that address.</p>
<p>Also, if you could switch the site over to English, I might be better able to<br />
troubleshoot this.</p>
<p>&gt; By the way, I love your nice service and fantastic supporting! Nice job! :P</p>
<p>Thanks :)</p>
<p>Regards,</p>
<p>Sean Fulmer<br />
WebFaction Support</p></blockquote>
<p><strong><span class="ticketpostname">victorlin</span></strong></p>
<blockquote><p><span class="mediumtext">Oops! How stupid am I XD<br />
I login as my account, and that account did&#8217;t setup e-mail. That should be why I can&#8217;t send mail from contact page, but you can. Now I setup my e-mail, and everything works fine.</span></p>
<p>Thanks your help! :P</p></blockquote>
<p><strong><span class="ticketpostname">Sean Fulmer</span></strong></p>
<blockquote><p><span class="mediumtext">Hi Victor,</span></p>
<p>&gt; Oops! How stupid am I XD<br />
&gt; I login as my account, and that account did&#8217;t setup e-mail. That should be<br />
&gt; why I can&#8217;t send mail from contact page, but you can. Now I setup my e-mail,<br />
&gt; and everything works fine.</p>
<p>Aha! That would explain it :)</p>
<p>&gt; Thanks your help! :P</p>
<p>You&#8217;re very welcome!  Thanks for using WebFaction :)</p>
<p>Regards,</p>
<p>Sean Fulmer<br />
WebFaction Support</p></blockquote>
<p>結果到最後發現是自己在耍笨，但是整個過程中客服還是盡力的想幫我解決問題</p>
<h3>我原本所擔心的</h3>
<p>其實我原本最擔心的問題是，虛擬主機會不會有太多限制讓我沒辦法使用某些東西，例如某些Python的模組，可是我發現他們有提供SSH的連線，可以遠端登入到自己的帳號下指令，這讓使用上沒有太大的限制，如下圖所示的，使用遠端登入帳號來下指令</p>
<div id="attachment_28" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/09/2008-09-28_233501.png"><img class="size-medium wp-image-28" title="遠端登入WebFaction帳號" src="http://blog.ez2learn.com/wp-content/uploads/2008/09/2008-09-28_233501-300x188.png" alt="遠端登入WebFaction帳號" width="300" height="188" /></a><p class="wp-caption-text">遠端登入WebFaction帳號</p></div>
<h3>結論</h3>
<p>結論就是，這家主機商真的很不錯，值得推薦:P</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/09/28/hosting-of-this-site/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
