<?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/tag/%e7%a8%8b%e5%bc%8f%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>Tue, 07 Feb 2012 03:26:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>開發wxPython的利器 : PyCrust</title>
		<link>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/</link>
		<comments>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:56:48 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[遊戲設計]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[好書]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=592</guid>
		<description><![CDATA[一直想做的事 最近我在用wxPython開發某些程式，隨著開發的過程中，難免需要一些直接的測試，改動程式碼來進行測式似乎不是很明智的選擇，即使Python是直譯式的語言，每改一次重新啟動整個程式也是一種浪費，而且狀態每次也會重置，於是我開始想，我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中，如此一來我就可以在開發時直接進行某些測試，對某些特定的模組操作，如此一來開發的效率可以提升，對於程式而言也會更好除錯，但是雖然寫一個console不是什麼太難的事，但也不是什麼太輕鬆的事，為了早點完成程式，於是我就沒有真的去做 直到某本書的出現 : wxPython in action 當有一天我訂的書: wxPython in action終於來了，這本書要1500元，實在是不便宜，但是我認為卻很值得，我在書中發現我以前一直都沒仔細去注意到的東西，PyCrust，在翻過這章節時我驚訝地發現，這不就是我想做的嗎? 一個控制臺，可以讓我操作、觀察、測試我的GUI，而且整合的方法超簡單，只要一行指令 python pywrap.py main.py 在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去，在我程式中執行的畫面就像這樣 在截圖中我利用pycrust將gui的背景換成了紅色，它不止是一款簡單的GUI，因為他是動態載入模組的name space，和一般IDE不同的是，他的自動完成是動態的，一般的IDE只抓得到靜態的成員，但是即然是動態載入又是在執行中，有什麼成員一清二楚，所以基本上自動完成功能感覺非常地強大，但相對的弱點是對於靜態的部份比較麻煩 它除了可以自動整合到現有的wxPython gui程式中，更可以把裡面各個元件分開來獨立使用 所以它可以幹麻? 對我來說，PyCrust將會是像神兵利器般好用的工具，像是開發遊戲之類需要大量的調校，一個console或是動態的機制是免不了的，而console提供了立即且互動式的環境，有了PyCrust，就等於有了現成的console可以使用，在遊戲的開發過程中，開發者可以利用這個console動態地改變各種參數來觀察反應等等，當然開發遊戲只是其中一個應用的例子，即使在一般的GUI中也會是很好用的工具 順帶一提 wxPython in action真的是難得一見的好書，有別於一般的書，它使用問句來當做標題，但是不會因為這樣而零散雜亂，相反的，你可以很正式地看完一次，也可以很快速地掃過一次，當你需要什麼東西時，那些問句可以幫助你很快地找到你需要的東西，豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子，或是想像到底是如何運作，如果要學wxPython，我覺得這本書真的是非常值得推薦，做為工具書，這本也是必備的一本]]></description>
			<content:encoded><![CDATA[<h2>一直想做的事</h2>
<p>最近我在用wxPython開發某些程式，隨著開發的過程中，難免需要一些直接的測試，改動程式碼來進行測式似乎不是很明智的選擇，即使Python是直譯式的語言，每改一次重新啟動整個程式也是一種浪費，而且狀態每次也會重置，於是我開始想，我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中，如此一來我就可以在開發時直接進行某些測試，對某些特定的模組操作，如此一來開發的效率可以提升，對於程式而言也會更好除錯，但是雖然寫一個console不是什麼太難的事，但也不是什麼太輕鬆的事，為了早點完成程式，於是我就沒有真的去做</p>
<h2>直到某本書的出現 : wxPython in action</h2>
<p>當有一天我訂的書: wxPython in action終於來了，這本書要1500元，實在是不便宜，但是我認為卻很值得，我在書中發現我以前一直都沒仔細去注意到的東西，PyCrust，在翻過這章節時我驚訝地發現，這不就是我想做的嗎? 一個控制臺，可以讓我操作、觀察、測試我的GUI，而且整合的方法超簡單，只要一行指令</p>
<blockquote><p>python pywrap.py main.py</p></blockquote>
<p>在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去，在我程式中執行的畫面就像這樣</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/06/pycrust.jpg"><img class="alignnone size-medium wp-image-593" title="pycrust" src="http://blog.ez2learn.com/wp-content/uploads/2009/06/pycrust-300x261.jpg" alt="pycrust" width="300" height="261" /></a></p>
<p>在截圖中我利用pycrust將gui的背景換成了紅色，它不止是一款簡單的GUI，因為他是動態載入模組的name space，和一般IDE不同的是，他的自動完成是動態的，一般的IDE只抓得到靜態的成員，但是即然是動態載入又是在執行中，有什麼成員一清二楚，所以基本上自動完成功能感覺非常地強大，但相對的弱點是對於靜態的部份比較麻煩</p>
<p>它除了可以自動整合到現有的wxPython gui程式中，更可以把裡面各個元件分開來獨立使用</p>
<h2>所以它可以幹麻?</h2>
<p>對我來說，PyCrust將會是像神兵利器般好用的工具，像是開發遊戲之類需要大量的調校，一個console或是動態的機制是免不了的，而console提供了立即且互動式的環境，有了PyCrust，就等於有了現成的console可以使用，在遊戲的開發過程中，開發者可以利用這個console動態地改變各種參數來觀察反應等等，當然開發遊戲只是其中一個應用的例子，即使在一般的GUI中也會是很好用的工具</p>
<h2>順帶一提</h2>
<p>wxPython in action真的是難得一見的好書，有別於一般的書，它使用問句來當做標題，但是不會因為這樣而零散雜亂，相反的，你可以很正式地看完一次，也可以很快速地掃過一次，當你需要什麼東西時，那些問句可以幫助你很快地找到你需要的東西，豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子，或是想像到底是如何運作，如果要學wxPython，我覺得這本書真的是非常值得推薦，做為工具書，這本也是必備的一本</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google C++ 程式風格指南</title>
		<link>http://blog.ez2learn.com/2009/01/21/google-coding-style-guide/</link>
		<comments>http://blog.ez2learn.com/2009/01/21/google-coding-style-guide/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 08:52:48 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[風格]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=482</guid>
		<description><![CDATA[介紹Google的 C++ 程式風格指南 <a href="http://blog.ez2learn.com/2009/01/21/google-coding-style-guide/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天在找比Boost.Test更好用的Unit Ttest Framework時，在看<a href="http://code.google.com/p/googletest/">Google Unit Test Framework</a>時，無意間發現了<a href="http://code.google.com/p/google-styleguide/">Google的程式風格指南</a>，裡面有<a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">C++的程式風格指南</a>，我看了一下覺得還蠻有參考價值的，他們不是沒有理由的規定編程的風格，每條理由都有清楚寫出優點、缺點、甚至討論等等，做為決定團隊程式語言風格的指南決定，或是看他們決定的理由，都很有幫助</p>
<p>學寫C++的人可以參考看看</p>
<p>註 : 每個條目要按一個向下的三角形會展開細節，優缺點和討論等等</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/01/21/google-coding-style-guide/feed/</wfw:commentRss>
		<slash:comments>0</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>
		<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/22/download-photos-of-wertch-album-example/</link>
		<comments>http://blog.ez2learn.com/2008/10/22/download-photos-of-wertch-album-example/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 13:34:10 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[範例]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=234</guid>
		<description><![CDATA[自動抓取相簿相片 為了示範WebChuan的威力，我寫了一個簡單的範例，可以下載無名小站的某個相簿裡的所有照片 範例 它會一頁接著一頁抓下去，舉個例子，例如這個相簿，只要輸入相簿第一張相片的網頁連結，它就會一頁一頁接著抓下去，然後圖片都存到相同的目錄下 包裝好的程式 為了方便沒有安裝Python和WebChuan也能使用這個簡單的小程式，我把它打包成.exe的執行檔，可以從這裡下載 自動抓取無名相簿照片程式 執行download_photos.exe再貼上相簿裡第一張相片的網址連結就可以開始下載相片 請注意，如果抓太凶可能會遇到一個錯誤 999 Unable to process request at this time 似乎是Yahoo把你抓照片當成攻擊，換個IP繼續抓應該就可以了]]></description>
			<content:encoded><![CDATA[<h1>自動抓取相簿相片</h1>
<p>為了示範WebChuan的威力，我寫了一個簡單的範例，可以下載無名小站的某個相簿裡的所有照片</p>
<p><a href="http://webchuan.ez2learn.com/wiki/Examples/DownloadPhotos">範例</a></p>
<p>它會一頁接著一頁抓下去，舉個例子，例如這個<a href="http://www.wretch.cc/album/show.php?i=Esta&amp;b=1&amp;f=1000826818&amp;p=0">相簿</a>，只要輸入相簿第一張相片的網頁連結，它就會一頁一頁接著抓下去，然後圖片都存到相同的目錄下</p>
<h1>包裝好的程式</h1>
<p>為了方便沒有安裝Python和WebChuan也能使用這個簡單的小程式，我把它打包成.exe的執行檔，可以從這裡下載</p>
<p><a href="http://static.ez2learn.com/download_photos.zip">自動抓取無名相簿照片程式</a></p>
<p>執行download_photos.exe再貼上相簿裡第一張相片的網址連結就可以開始下載相片</p>
<p>請注意，如果抓太凶可能會遇到一個錯誤</p>
<blockquote><p>999 Unable to process request at this time</p></blockquote>
<p>似乎是Yahoo把你抓照片當成攻擊，換個IP繼續抓應該就可以了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/22/download-photos-of-wertch-album-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>簡易Compiler(其實是Interpreter) : Micro 實作</title>
		<link>http://blog.ez2learn.com/2008/10/13/implement-of-micro-interpreter/</link>
		<comments>http://blog.ez2learn.com/2008/10/13/implement-of-micro-interpreter/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 03:47:08 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[程式設計]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=198</guid>
		<description><![CDATA[昨天 花了一個晚上的時間把Compiler作業Micro直譯器寫出來了，為啥說它是直譯器，因為光寫文法解析實在很無聊，它的語法又太簡單，反正讓它能執行也多沒幾行程式，就順手讓它可以直接執行，還蠻有趣的，第一次寫比較正規的語法解析器，我想起很久很久以前我寫過一個滑鼠鍵盤的巨集程式 就有解析自創的簡單語法，可是方法實在很暴力很蠢 XD，用了一些五四三的方法硬湊出來，現在我寫完這個作業覺得scanner和parser這樣才是比較正規的做法，我還用了Interpreter Pattern來實作 Micro 課本上的Micro語言實在有點簡單過頭了，只有輸入、輸出、運算而已，運算也只有加和減，本來想修改的，可是又要設計BNF和考慮運算優先順序等等麻煩的問題就打消念頭，只寫了兩個簡單的程式 begin read (a, b, c); sum := a + b + c; write (sum); end begin read (f1, f2); f3 := f1 + f2; f4 := f2 + f3; f5 := f3 + &#8230; <a href="http://blog.ez2learn.com/2008/10/13/implement-of-micro-interpreter/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>昨天</h2>
<p>花了一個晚上的時間把Compiler作業Micro直譯器寫出來了，為啥說它是直譯器，因為光寫文法解析實在很無聊，它的語法又太簡單，反正讓它能執行也多沒幾行程式，就順手讓它可以直接執行，還蠻有趣的，第一次寫比較正規的語法解析器，我想起很久很久以前我寫過一個滑鼠鍵盤的巨集程式</p>
<div id="attachment_199" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-13_113038.png"><img class="size-medium wp-image-199" title="滑鼠鍵盤巨集程式" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-13_113038-300x144.png" alt="滑鼠鍵盤巨集程式" width="300" height="144" /></a><p class="wp-caption-text">滑鼠鍵盤巨集程式</p></div>
<p>就有解析自創的簡單語法，可是方法實在很暴力很蠢 XD，用了一些五四三的方法硬湊出來，現在我寫完這個作業覺得scanner和parser這樣才是比較正規的做法，我還用了Interpreter Pattern來實作</p>
<h2>Micro</h2>
<p>課本上的Micro語言實在有點簡單過頭了，只有輸入、輸出、運算而已，運算也只有加和減，本來想修改的，可是又要設計BNF和考慮運算優先順序等等麻煩的問題就打消念頭，只寫了兩個簡單的程式</p>

<div class="wp_syntax"><div class="code"><pre class="pasical" style="font-family:monospace;">begin
    read (a, b, c);
    sum := a + b + c;
    write (sum);
end</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="pasical" style="font-family:monospace;">begin
    read (f1, f2);
    f3 := f1 + f2;
    f4 := f2 + f3;
    f5 := f3 + f4;
    f6 := f4 + f5;
    f7 := f5 + f6;
    write (f1, f2, f3, f4, f5, f6, f7);
end</pre></div></div>

<h2>下載</h2>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/micro.zip">micro直譯器</a></p>
<p>有興趣可以載回去玩玩看，不過<strong>同學請注意，參考看看就好，要拿來當作業交被逮到可不關我的事= =</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/13/implement-of-micro-interpreter/feed/</wfw:commentRss>
		<slash:comments>7</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>
		<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) &#8230; <a href="http://blog.ez2learn.com/2008/10/11/to-design-is-the-king-way/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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: #E56717; font-weight: bold;">Private</span> <span style="color: #E56717; font-weight: bold;">Sub</span> Command1_Click()
<span style="color: #8D38C9; font-weight: bold;">If</span> A.Text &amp;gt; B.Text <span style="color: #8D38C9; font-weight: bold;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;a大&quot;</span>
<span style="color: #8D38C9; font-weight: bold;">End</span> <span style="color: #8D38C9; font-weight: bold;">If</span>
<span style="color: #8D38C9; font-weight: bold;">If</span> A.Text &amp;lt; B.Text <span style="color: #8D38C9; font-weight: bold;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;b大&quot;</span>
<span style="color: #8D38C9; font-weight: bold;">End</span> <span style="color: #8D38C9; font-weight: bold;">If</span>
<span style="color: #8D38C9; font-weight: bold;">If</span> A.Text = B.Text <span style="color: #8D38C9; font-weight: bold;">Then</span>
Label1.Caption = <span style="color: #800000;">&quot;一樣&quot;</span>
<span style="color: #8D38C9; font-weight: bold;">End</span> <span style="color: #8D38C9; font-weight: bold;">If</span>
<span style="color: #8D38C9; font-weight: bold;">End</span> <span style="color: #E56717; font-weight: bold;">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>抓取網頁的最佳語言 : Python</title>
		<link>http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/</link>
		<comments>http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 06:51:01 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[抓取網頁]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=99</guid>
		<description><![CDATA[最初 最早我用C/C++語言慢慢寫抓網頁的用它來抓網頁真的是程式，一開始甚至打算自己寫抓取網頁的函式庫，想說當做練習，可是HTTP協定 雖然不難，可是煩，要處理的細節太多了，後來受不了，轉而使用現成的Library : cUrl，但是C/C++語言開發這類東西的效率實在太慢了，我的程式不停的修改、不停的修改，光是編譯的時間就吃掉了不知道多少，字串的處理C/C++ 沒有內建正規表示法或一些好用的字串函數之類的，處理起來也礙手礙腳，當時，我想將我寫好的函數庫寫成能讓Lua呼叫的形式，或著甚是C/C++來呼叫Lua，因為C/C++有很多細節要處理，Memory leak有的沒有的雜事，我想要的只是專注在寫抓取網頁的程式，因此用Lua包裝似乎是不錯的選擇，但是開發時間太久了，事情一直沒有變好 直到 我下了一個結論，C/C++不適合寫抓取網頁的程式，我開始思考我需要什麼，我想我既然要包裝成其它語言將細節藏起來，為何不直接使用script語言? 我最早一直擔心的是效率的問題，但是到後來想想反正真正沒效率的部份包給C/C++去做事實上沒有太大的差別，而且又有動態語言的彈性、除錯上的方便等等好處，何樂不為? 於是我開始尋找一款合適的語言 Perl 如何? 很早以前我有用Perl寫過一些CGI程式、留言版、網站管理系統、文章管理系統等等，有人說Perl是只能寫一次的語言，它有很多很簡短的符號所構成的表示法，可讀性不是很好，模組化設計也沒有非常好的支援，OO也是一樣，新版的Perl遲遲沒有推出，似乎已經有點變成遺產的感覺，或許是上面的理由還是偏見，總而言之我不喜歡Perl PHP? 做為一個以網頁為主要用途的語言，拿來當做其它用途總有種不太合適的感覺，從它的語法來看，很明顯是參考C語言、Perl等等而來的，但是卻沒有加以改進，我個人認為它可能沒有預料到PHP居然會紅成這樣，變成網頁程式設計的主流語言，後來有很多缺點就變得顯而易見，不夠嚴僅的語法、不夠好的模組化設計、不良的OO支援、容易寫出安全性有問題的程式等等，命名空間也是它一大缺點之一，光是看到一大堆前綴字開頭的函數就有種倒胃口的感覺，有人說 PHP is the BASIC of the 21st century 在這個影片裡，總合種種理由，做為抓取網頁的用途，PHP出局 Lua Lua做為輕量級的語言相當的優秀，可是你不會想用Lua來寫大型的程式，我也不會想這麼做，它語言的設計都是以速度為優先考量，寫起來並不怎麼順手的感覺，再加上目前的資源不多，可能很多東西都得自行包裝，這樣就和我原先想做的事是一樣的，因此不考慮Lua Java Java是和網路一起成長的程式語言，做為抓取網頁的用途，它絕對有能力勝任，但是&#8230;，我嫌它太囉唆了，還有太癡肥，當一款語言太囉唆和太癡肥往往會令人討厭，歐! 想到Java我就想起eclipse在我那台只有256扣掉分給顯示記憶體的筆電上執行的情況，讓我想把電腦砸掉，不好意思，我不喜歡Java 在前面的影片裡的老兄一樣也有提到，有興趣可以看看 Java is the COBOL of the 21st century Python &#8230; <a href="http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>最初</h2>
<p>最早我用C/C++語言慢慢寫抓網頁的用它來抓網頁真的是程式，一開始甚至打算自己寫抓取網頁的函式庫，想說當做練習，可是HTTP協定 雖然不難，可是煩，要處理的細節太多了，後來受不了，轉而使用現成的Library : <a href="http://curl.haxx.se/">cUrl</a>，但是C/C++語言開發這類東西的效率實在太慢了，我的程式不停的修改、不停的修改，光是編譯的時間就吃掉了不知道多少，字串的處理C/C++ 沒有內建正規表示法或一些好用的字串函數之類的，處理起來也礙手礙腳，當時，我想將我寫好的函數庫寫成能讓Lua呼叫的形式，或著甚是C/C++來呼叫Lua，因為C/C++有很多細節要處理，Memory leak有的沒有的雜事，我想要的只是專注在寫抓取網頁的程式，因此用Lua包裝似乎是不錯的選擇，但是開發時間太久了，事情一直沒有變好</p>
<h2>直到</h2>
<p><span id="more-99"></span></p>
<p>我下了一個結論，C/C++不適合寫抓取網頁的程式，我開始思考我需要什麼，我想我既然要包裝成其它語言將細節藏起來，為何不直接使用script語言? 我最早一直擔心的是效率的問題，但是到後來想想反正真正沒效率的部份包給C/C++去做事實上沒有太大的差別，而且又有動態語言的彈性、除錯上的方便等等好處，何樂不為? 於是我開始尋找一款合適的語言</p>
<h2>Perl 如何?</h2>
<p>很早以前我有用Perl寫過一些CGI程式、留言版、網站管理系統、文章管理系統等等，有人說Perl是只能寫一次的語言，它有很多很簡短的符號所構成的表示法，可讀性不是很好，模組化設計也沒有非常好的支援，OO也是一樣，新版的Perl遲遲沒有推出，似乎已經有點變成遺產的感覺，或許是上面的理由還是偏見，總而言之我不喜歡Perl</p>
<h2>PHP?</h2>
<p>做為一個以網頁為主要用途的語言，拿來當做其它用途總有種不太合適的感覺，從它的語法來看，很明顯是參考C語言、Perl等等而來的，但是卻沒有加以改進，我個人認為它可能沒有預料到PHP居然會紅成這樣，變成網頁程式設計的主流語言，後來有很多缺點就變得顯而易見，不夠嚴僅的語法、不夠好的模組化設計、不良的OO支援、容易寫出安全性有問題的程式等等，命名空間也是它一大缺點之一，光是看到一大堆前綴字開頭的函數就有種倒胃口的感覺，有人說</p>
<blockquote><p>PHP is the BASIC of the 21st century</p></blockquote>
<p>在這個<a href="http://ia301129.us.archive.org/3/items/SeanKellyRecoveryfromAddiction/Recovery_from_Addiction.mov">影片</a>裡，總合種種理由，做為抓取網頁的用途，PHP出局</p>
<h2><a href="http://www.lua.org/">Lua</a></h2>
<p>Lua做為輕量級的語言相當的優秀，可是你不會想用Lua來寫大型的程式，我也不會想這麼做，它語言的設計都是以速度為優先考量，寫起來並不怎麼順手的感覺，再加上目前的資源不多，可能很多東西都得自行包裝，這樣就和我原先想做的事是一樣的，因此不考慮Lua</p>
<h2>Java</h2>
<p>Java是和網路一起成長的程式語言，做為抓取網頁的用途，它絕對有能力勝任，但是&#8230;，我嫌它太囉唆了，還有太癡肥，當一款語言太囉唆和太癡肥往往會令人討厭，歐! 想到Java我就想起eclipse在我那台只有256扣掉分給顯示記憶體的筆電上執行的情況，讓我想把電腦砸掉，不好意思，我不喜歡Java</p>
<p>在前面的<a href="http://ia301129.us.archive.org/3/items/SeanKellyRecoveryfromAddiction/Recovery_from_Addiction.mov">影片</a>裡的老兄一樣也有提到，有興趣可以看看</p>
<blockquote><p>Java is the COBOL of the 21st century</p></blockquote>
<h2><a href="http://ez2learn.com/python-tutorial/what-is-python">Python</a></h2>
<p>最後，我在PTT的程式設計討論版上描述了我的需求，有人推文說 Python，我抓了抓頭髮，Python? WTF? 這是什麼? 我從來沒有聽過這款語言，於是上網找了一下資料，和問了一些問題，發現這款語言正是我想要的，它很容易被擴充，因此效能不足可以用C/C++補強，你想得到的函式庫幾乎都已經有人寫好了，光從下載網頁這件工作來看，它的標準函式庫已經有了這樣的功能，你覺得不夠好還有其它很多的選擇，開箱即用的哲學，讓安裝函式庫非常簡單，不像C/C++的編譯惡夢讓你抓光頭髮，而它最優秀的地方之一就是它的可讀性，寫起來相當順手、優雅，讀起來也一樣順眼，重要的是很有趣，那麼開發大型的程式呢? script語言常見的問題就是對於開發大型程式來說很不適合，但是Python卻不是如此，良好的OO、模組化等等它都有良好的支援，再加上Google也是Python的愛用者，YouTube也是用Python開發的，有了這些大咖背書，證明這款語言的確是相當優秀，在決定使用Python之後我就立刻訂購了一本<a href="http://www.books.com.tw/exep/assp.php/victorlin/exep/prod/booksfile.php?item=F011223401">Learning Python</a>，開始學習Python</p>
<h2>愛上Python</h2>
<p>Python並沒有讓我失望，能用Python寫的東西都不太想用C/C++去寫，開發效率非常高、寫起來很順手、豐富的資源，讓我覺得這真的是優秀的語言，它的確很適合拿來抓取網頁，不過抓取網頁還有更多東西要考慮</p>
<h2><a href="http://ez2learn.com/python-tutorial/third-party/twisted-tutorial/what-is-twisted">Twisted</a></h2>
<p>用Python抓取網頁的HTML只是小菜一盤，用Python標準函數庫就辦得到，但不是那麼好用，最後我發現了Twisted，就改用Twisted來抓網頁，它有優秀的非同步事件驅動的架構，常見的協定都已經有實做，包括HTTP、SMTP等等，用它來抓網頁真的是再容易不過了</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">getPage<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;http://www.google.com&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">addCallback</span><span style="color: black;">&#40;</span>printPage<span style="color: black;">&#41;</span></pre></div></div>

<p>是的，一行就可以抓網頁，夠簡單吧，而且你想要傳POST或GET等參數，或是修改HTTP的header都沒有問題</p>
<h2><a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a></h2>
<p>抓網頁事實上不是什麼難事，解析HTML要來得更麻煩，最初使用Python的標準函式庫內建的HTMLParser來解析網頁，但是功能太陽春，加上最頭痛的問題是，大部份的網頁都沒有完全尊照標準來寫，各種莫明奇妙的錯誤令人想要找出那個寫網頁的人痛打他一頓，為了解決容錯的問題，一開始我使用BeautifulSoup來抓取網頁，它是以容錯著名的HTML Parser，但是，它的效率很差，又或著說，找到目標HTML標籤的方式很沒效率，一般都用find等方式來找到所要的標籤</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">soup.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'div'</span>, <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=<span style="color: #483d8b;">'content'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>它真的很沒效率，當你抓取大一點的網頁時，多塞幾個一起抓和解析，你就會看見你的CPU使用率永遠是滿的狀態，原本我預計抓網頁的瓶頸都會落在網路IO上面，但是用它來抓取網頁卻超出我預料，沒想到它會這麼吃重，於是沒辦法，我開始尋找更好的選擇</p>
<h2><a href="http://codespeak.net/lxml/">lxml</a></h2>
<p>我找到一個Blog的文章 : <a href="http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/">Python HTML Parser Performance</a>，介紹了Python各種Parser的效能，效能最亮眼的，就是lxml，我最初擔心的是找到資料標籤會不會很困難，但是我發現它支援xpath，就試著改寫原本BeautifulSoup用find等等函數寫的尋找標籤程式，發現xpath遠比那種方式來得好用太多了，而且效率好太多了，BeautifulSoup的find極度的沒有效率，大部份的CPU時間都耗在一堆find函數走訪HTML樹上，而xpath篩選標籤的方式來得有效率多了，以下舉幾個我實際用在抓取網頁的案子中的例子</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> getNextPageLink<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, tree<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Get next page link
&nbsp;
    @param tree: tree to get link
    @return: Return url of next page, if there is no next page, return None
    &quot;&quot;&quot;</span>
    paging = tree.<span style="color: black;">xpath</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;//span[@class='paging']&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> paging:
        links = paging<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">xpath</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;./a[(text(), '%s')]&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">localText</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'next'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> links:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>links<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'href'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">listPrice = tree.<span style="color: black;">xpath</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;//*[@class='priceBlockLabel']/following-sibling::*&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> listPrice:
    detail<span style="color: black;">&#91;</span><span style="color: #483d8b;">'listPrice'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">stripMoney</span><span style="color: black;">&#40;</span>listPrice<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">text</span><span style="color: black;">&#41;</span></pre></div></div>

<p>原本使用BeautifulSoup在尋找標籤遇到麻煩的走訪羅輯上的問題還得寫程式解決，xpath本身就有豐富的語法可以提供各種篩選的條件，羅輯從程式碼被移到了xpath語法上，有了這樣的語法，尋找目標標籤輕鬆了許多，而且效率也很好，從此我就和BeautifulSoup說再見，改用lxml來找標籤</p>
<h2>配合FireFox的工具</h2>
<p>如果有一些工具可以幫助寫解析網頁的程式該有多好，這也是我希望能有的，使用了xpath之後，我找到了FireFox的插件，XPath checker等xpath的工具，可以先用它來確定抓到的元素是正確的，然後FireBug在檢視網頁結構上也有很大的幫助</p>
<div id="attachment_110" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-05_142302.png"><img class="size-medium wp-image-110" title="FireFox插件XPath checker畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-05_142302-300x238.png" alt="FireFox插件XPath checker畫面" width="300" height="238" /></a><p class="wp-caption-text">FireFox插件XPath checker畫面</p></div>
<div id="attachment_111" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-05_142402.png"><img class="size-medium wp-image-111" title="使用FireBug檢視網頁元素" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-05_142402-300x176.png" alt="使用FireBug檢視網頁元素" width="300" height="176" /></a><p class="wp-caption-text">使用FireBug檢視網頁元素</p></div>
<h2>結論</h2>
<p>就目前一路走過來的經驗來看，抓取網頁Python的確是最佳的選擇，不過我們到目前為止我們都只討論到工具，事實上還有設計上的問題要解決，留在下一次寫</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
<enclosure url="http://ia301129.us.archive.org/3/items/SeanKellyRecoveryfromAddiction/Recovery_from_Addiction.mov" length="18263101" type="video/quicktime" />
		</item>
		<item>
		<title>測試的好幫手: 虛擬機器</title>
		<link>http://blog.ez2learn.com/2008/10/04/virtual-machine-useful-tool-for-testing/</link>
		<comments>http://blog.ez2learn.com/2008/10/04/virtual-machine-useful-tool-for-testing/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 08:47:02 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[測試]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[虛擬機器]]></category>
		<category><![CDATA[Virtual Box]]></category>
		<category><![CDATA[Virtual PC]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=87</guid>
		<description><![CDATA[麻煩的測試 今天當我要把demo程式送到客戶手中前，我煩腦要如何測試demo程式，確保不會因為我少了某樣程式依賴的東西，但是我的開發環境因為都已經裝好了，但客戶的電腦未必是如此，因此最好找另外一台電腦來測試，我第一個想到就是用我的筆電來做測試，可是為了測試我還得裝好網路，又得花不少時間，於是我想到，為什麼我不用虛擬機器? 虛擬機器不正就是用來測試用的嗎? 我居然忘記有這樣好用的工具存在 Virtual Box 首先我使用了Virtual Box，一套Open source且跨平台的模擬程式，目前似乎由Sun接手主導，它的功能比起其它的模擬程式來得強大不少，速度聽說也比較快，不幸的是&#8230;，每次在安裝XP一進行格式化磁碟就會當機，不穩定似乎到目前還是它最大的問題，相信解決了之後應該是相當優秀的模擬軟體 不知道是跟什麼東西犯太歲，重開以後居然就不會當機了，也成功地安裝了XP 成功安裝XP的執行畫面 Virtual PC Microsoft的模擬程式，相較於Virtual Box，功能就陽春了許多，但是穩定度很好，不像Virtual Box不停當機，為了能夠測試，最後還是選擇了Virtual PC進行測試，缺點是要錢就是了，好在學校有買大量受權的軟體，一開始我還不知道如何跳離Virtual PC的OS控制權，將控制權交回給真正的OS，原來是要按右邊的Alt Virtual PC執行Windows XP的畫面]]></description>
			<content:encoded><![CDATA[<h2>麻煩的測試</h2>
<p>今天當我要把demo程式送到客戶手中前，我煩腦要如何測試demo程式，確保不會因為我少了某樣程式依賴的東西，但是我的開發環境因為都已經裝好了，但客戶的電腦未必是如此，因此最好找另外一台電腦來測試，我第一個想到就是用我的筆電來做測試，可是為了測試我還得裝好網路，又得花不少時間，於是我想到，為什麼我不用虛擬機器? 虛擬機器不正就是用來測試用的嗎? 我居然忘記有這樣好用的工具存在</p>
<p><span id="more-87"></span></p>
<h2>Virtual Box</h2>
<p>首先我使用了<a href="http://www.virtualbox.org/">Virtual Box</a>，一套Open source且跨平台的模擬程式，目前似乎由Sun接手主導，它的功能比起其它的模擬程式來得強大不少，速度聽說也比較快，不幸的是&#8230;，每次在安裝XP一進行格式化磁碟就會當機，不穩定似乎到目前還是它最大的問題，相信解決了之後應該是相當優秀的模擬軟體</p>
<p>不知道是跟什麼東西犯太歲，重開以後居然就不會當機了，也成功地安裝了XP</p>
<div id="attachment_91" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181116.png"><img class="size-medium wp-image-91" title="Virtual Box畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181116-300x225.png" alt="Virtual Box畫面" width="300" height="225" /></a><p class="wp-caption-text">Virtual Box畫面</p></div>
<p>成功安裝XP的執行畫面</p>
<div id="attachment_92" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181049.png"><img class="size-medium wp-image-92" title="Virtual Box Windows XP 執行畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181049-300x250.png" alt="Virtual Box Windows XP 執行畫面" width="300" height="250" /></a><p class="wp-caption-text">Virtual Box Windows XP 執行畫面</p></div>
<h2>Virtual PC</h2>
<p>Microsoft的模擬程式，相較於Virtual Box，功能就陽春了許多，但是穩定度很好，不像Virtual Box不停當機，為了能夠測試，最後還是選擇了Virtual PC進行測試，缺點是要錢就是了，好在學校有買大量受權的軟體，一開始我還不知道如何跳離Virtual PC的OS控制權，將控制權交回給真正的OS，原來是要按右邊的Alt</p>
<div id="attachment_93" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181409.png"><img class="size-medium wp-image-93" title="Virtual PC畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181409-300x212.png" alt="Virtual PC畫面" width="300" height="212" /></a><p class="wp-caption-text">Virtual PC畫面</p></div>
<p>Virtual PC執行Windows XP的畫面</p>
<div id="attachment_94" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181636.png"><img class="size-medium wp-image-94" title="Virtual PC執行Windows XP的畫面" src="http://blog.ez2learn.com/wp-content/uploads/2008/10/2008-10-04_181636-300x245.png" alt="Virtual PC執行Windows XP的畫面" width="300" height="245" /></a><p class="wp-caption-text">Virtual PC執行Windows XP的畫面</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2008/10/04/virtual-machine-useful-tool-for-testing/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

