<?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/%e5%bf%83%e5%be%97/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>VC++ 9.0的編譯器鬼打牆錯誤</title>
		<link>http://blog.ez2learn.com/2009/01/30/vc-strange-compiler-error/</link>
		<comments>http://blog.ez2learn.com/2009/01/30/vc-strange-compiler-error/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 12:34:05 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[腦殘]]></category>
		<category><![CDATA[WTF]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=498</guid>
		<description><![CDATA[VC++ 9.0的編譯器鬼打牆錯誤 : 這個時候不應有 的原因和解決方法 <a href="http://blog.ez2learn.com/2009/01/30/vc-strange-compiler-error/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天要將一些C++程式弄成Python模組，使用Boost.Python，以bjam編譯時一直跑出一堆鬼打牆的錯誤訊息</p>
<blockquote><p>這個時候不應有 \Utilities\Bin\x86&#8243;;F:\Inprise\vbroker\bin;F:\Borland\CBUILD~1\Bi<br />
n;F:\Borland\CBUILD~1\Projects\Bpl;"F:\Microsoft。</p></blockquote>
<p>這個時候不應有，到底是什麼鬼東西是這裡不應該有的，我仔細觀察了一下，把bjam呼叫的內容全印出來，可是都找不到有參數是那段一堆路徑，再仔細看看那堆路徑看起來像是Path裡的東西，想一想bjam應該丟參數給compiler而已，於是就懷疑是VC++ 9.0 Express的問題，花了好大的力氣，讓我找到了</p>
<p>這篇文章 :</p>
<h2><a id="viewpost_ascx_TitleUrl" title="Title of this entry." href="http://weblogs.sqlteam.com/mladenp/archive/2008/05/28/Serious-Visual-Studio-2008-install-bug-that-can-break-your.aspx">Serious Visual Studio 2008 install bug that can break your builds</a></h2>
<p>才解決這個問題，原來是安裝的SDK像"C:\Program Files\Microsoft DirectX SDK <strong>(June 2006)</strong>\Utilities\Bin\x86&#8243;有括號，在bat檔裡被錯誤解析的樣子</p>
<p>很多時候其實都希望程式設計相關的錯誤訊息不要中文化，像是這個，"這時候不應該有"，放到Google搜尋只會出現一堆不相關的東西，但是原文"was unexpected at this time." 下去找很快就能找到相關的資料，我記得之前在Ubuntu下編譯程式，就有遇到編譯器錯誤訊息輸出被中文化的情況&#8230;，真的是鬼打牆，沒翻還好，一翻根本不知道它在說什麼鬼，也沒辦法貼到Google找資料</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/01/30/vc-strange-compiler-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>六先生開課事件 : 我的看法</title>
		<link>http://blog.ez2learn.com/2009/01/26/mr-6-my-opinion/</link>
		<comments>http://blog.ez2learn.com/2009/01/26/mr-6-my-opinion/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 17:50:21 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[心得文]]></category>
		<category><![CDATA[嘴砲]]></category>
		<category><![CDATA[沒有八卦]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=489</guid>
		<description><![CDATA[關於Mr. 6六先生開課被罵得很慘的事件 : 我的看法 <a href="http://blog.ez2learn.com/2009/01/26/mr-6-my-opinion/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>話說，有玩過魔獸爭霸三國無雙之類的地圖的人都知道，看到數字人，也就是ID全由數字組成的玩家，有很大的機會中離，不過這一點都扯不上邊 XD</p>
<p>最近很熱鬧的事情是，知名部落客Mr.6先生開的程式設計課程被踢暴課程的內容很差勁</p>
<p><a href="http://mr6offline.com/">http://mr6offline.com</a></p>
<p>大約看了一下是教一些PHP MySQL之類老掉牙的東西，但驚人的是三堂課要$4500大洋，而且跟據上面的部落格暴料還教得不怎麼樣，但是廣告詞卻寫得非常動人，想創業沒法靠別人，所以只能靠自己寫程式，學完就能靠自己寫程式創業之類的巴拉巴拉&#8230;</p>
<p>那我們未來要靠寫程式吃飯的資工系學生們是不是全都要去喝西北風啦? 為什麼這次事件會被罵得那麼慘，原因很簡單</p>
<p>頂著史丹佛等的和一堆亮麗經歷的光環，收費4500，但教的卻都是一些老掉牙了無新意的東西，PHP不難，但是真的值得不懂程式想學寫程式的人學習用來創業，用來寫網頁嗎? 先不論教得好不好，我個人認為:</p>
<h2><strong>不值得&#8230;..</strong></h2>
<p>PHP是一個設計很差勁的程式語言(請參考<a href="http://blog.ez2learn.com/2008/12/13/dangerous-behavior-should-not-be-default-behavior/">別讓危險成為預設的行為，讓危險的行為比安全的行為更麻煩</a>)，但不可否認的它是目前用來寫網頁最流行的程式語言，它也有它許多的優點，中文資源隨手可得，對於初學者來說，要用PHP寫網頁卻實是不難，但是，要寫出合格的網頁程式，卻需要很多瑣碎的know-how，不是初學者三兩天就可以達成的事情，初學者可以用PHP寫出各種常見的網頁程式，但是裡面充滿無數的問題、臭蟲、漏洞，光是一個許功蓋問題初學者可能就覺得莫明奇妙，但遲早會遇到，聲稱要三堂課教會學生寫PHP到可以用來自行創業，我只能說胡扯</p>
<h2>老掉牙的PHP MySQL&#8230;</h2>
<p>一樣技術有多老掉牙，或許我們可以定一個指標，叫做天瓏書局中文書指標，用技術的名詞在天瓏書局搜尋中文書，看數量有多少</p>
<p>PHP的結果 118筆<a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchAdvancedAction.do"><br />
</a></p>
<p>有118筆符合的書，PHP到底有多老掉牙，這表示PHP的中文資源已經是唾手可得的地步，隨便找個有工程師的頭銜的人問他，你會不會PHP? 我想有八成的機會他都會回答Yes，即使是社交工程師(誤)，但在這裡我要強調的是，<strong>不是老掉牙、被用到爛掉就表示它不好，我一直都認為每種程式語言都各有優缺點，將他們用在正確的地方才是明確的選擇</strong>，而六先生聲稱想創業寫網頁教的居然是PHP土法煉鋼在寫網頁，這真的令人覺得不解，到底要寫到民國幾年，更何況既然PHP MySQL等已經那麼普遍，到底有什麼價值可以花4500元去學?</p>
<h2>那該教什麼好?</h2>
<p>真正想要快速寫能用的網頁，最好是學習網頁框架，隨便一款網頁框架都比用PHP土法鍊鋼做起來得好，收費昂貴教的卻是那麼落伍且不明智的方式，真令人覺得無法認同，但是姜太公釣魚，願者上勾，如果覺得真的有那個價值，去學也沒人能阻止，但在我看來，這就好像去用高價買一瓶平凡無奇的水，明明是隨手可得的東西，但是上面貼著"史丹佛雙碩士"，一樣的道理</p>
<p>以我的看法，如果教的是現代一點的東西還令人能接受，像TurboGears、Django、Ruby On Rails等等，我們來看看天瓏書局中文書指標</p>
<p>TurboGears 1 (簡體中文)</p>
<p>Django 0筆</p>
<p>Ruby On Rails 12筆</p>
<p>同樣是中文資源，差那麼多，我如果今天是初學者，也沒辦法靠自己學習最新的技術，中文書少得可憐，或著根本沒有，就算英文能力夠，礙於技術的背景知識的需要而學不了那些東西，如果是這樣的話，開課教這些網頁框架，快速開發、省略細節、更安全、更有生產力、更敏捷，也比較適合創業的目的，再者很少人會，才有那樣的價值，這樣看來花4500去學明明已經被用到爛掉，那麼多人會的東西其實蠻冤大頭的，真的要學PHP找家教一對一教學都來得便宜和實在，或是買本書來自學也便宜又實惠</p>
<p><strong>但是，再次的，我必須要強調，也不是越新的技術就越好，它們有比現有的東西更好的地方，但缺點就是因為很新資源比較少</strong>，可能有不夠穩定等問題，物以稀為貴，正因為很少人懂，才顯得有價值，我記得我以前我有個家教學生在討論價錢時這麼跟我說</p>
<blockquote><p>我去家樂福打工一個小時才多少</p></blockquote>
<p>我想了一想，就這麼回答他</p>
<blockquote><p>你去路邊隨便拉一個人都能去家樂福打工，但是你沒辦法路邊拉一個人來教你C語言</p></blockquote>
<p>這是同樣的道理，隨手可得的東西沒什麼價值，而學習最新技術的基本門檻是英文能力，英文能力不好，只能看中文書的話，等到有人翻譯通常又有更新更好的東西出來了，只會中文的話就永遠只能落在人後，六先生自稱</p>
<blockquote><p>美國史丹佛電機、管理雙碩士，14歲移民加拿大，而後移居美國矽谷</p></blockquote>
<p>即然有能力，為何不教一些較現代的技術，卻教PHP MySQL等土法鍊鋼的方式，想要創業，自己寫程式，這明明PHP+MySQL是個很不切實際的選擇，六先生如果真的有心想開課教人寫網頁創業，個人建議還是學一些現代一點的東西來教比較實在</p>
<h2>那自己學寫程式創業到底可不可能?</h2>
<p>我認為，可能，但機會很小，即然我們知道速成的程式設計能力是胡扯，那麼表示真的要能夠寫真正能用的程式需要時間，網路是瞬息萬變的，等你真的學會，寫出程式來，網路可能又是另一回事了，不過到了那個時候至少有技術，有能力可以實現自己的想法，視當時的情況實現也不是不可能，至於<strong>要花多久呢? 我想&#8230; 十年吧</strong>，我曾看過一篇文章這麼說，學習一樣專業，需要十年的時間，這文章我一時找不到，我個人覺得蠻認同這樣的說法，我個人從國一開始學寫程式，到今年差不多九年了，畢業的話就剛好十年了，但是我覺得我還是有很多東西要學，或許你覺得不認同，你說我照著六先生教的可能三天就能寫個留言版還什麼的，但是事實是，程式有分大小，小程式就算隨便亂寫、躺著寫、坐著寫、趴著寫、跳著寫，也硬是可以寫出來，但大程式就不一樣了，當你程式寫著寫著，規模越來越大，你會發現程式越來越混亂，越來越難以除錯，到最後你的程式變成一沱難以想像的東西，你這邊改了發現那邊居然跑出漏洞，那邊改了又跑出新的漏洞，為什麼我瞭解，原因很簡單，我寫過數不清的爛程式，從土法鍊鋼開始慢慢地摸索，因此我很清楚爛程式寫大的時候到底是什麼情況，但寫出來就算了，事情才剛開始，程式不是寫出來就結束了，你還得維護它，如果有新的功能要加進去怎麼辦? 使用者太多原本的系統沒辦法負擔又該怎麼辦? 又得想辦法改寫程式，現實是殘酷的，不是每個人都是你網站、程式的愛護者，會有一群無聊的、為了利益的人，想盡各種方法來玩你的系統，為了好玩、為了撈你的資料賣給詐騙集團，老練的設計師都有可能出錯導至系統被攻擊，更何況是半生不熟的設計師，所以為了要能創業而學寫程式，真的能成功的機會可能比中樂透還低，不過我相信真的有人能做到，但肯定是有過人毅力的奇才</p>
<h2>那程式設計的重點到底在哪裡?</h2>
<p>土法練鋼寫程式的人我個人稱為"黑手"，不可否認我當過很久的黑手，用各種笨方法硬寫程式，所以才會遇到各種問題，那到底缺少什麼? 程式設計師和程式黑手的差別到底在哪裡? 程式設計的重點在於設計，到底什麼是設計? <a href="http://mr6.cc/?p=2553">六先生提過</a>設計</p>
<blockquote><p>姚老師告訴對方，「啊，他在學程式設計！」</p>
<p>17歲的我，非常驕傲的抬起頭來。不是因為「程式」這個炫麗的字眼，而是「設計」。</p>
<p>加拿大沒有什麼好科系和壞科系的，沒有「選系不選校」的問題，我一點都不為「程式」而驕傲，我為「設計」而驕傲。</p>
<p>17歲，只有考試，只有作業，只有報告…什麼，「設計」？所以，以後我真的可以這個叫「程式」的東西來「設計」囉？</p>
<p>從那隻會動的蟲子以後，我果然就發現，原來，用程式要實現自己的任何點子，是這麼容易的一件事！</p></blockquote>
<p>六先生說對了重點，程式設計真正重要的的確是設計而不是程式，但是我很懷疑他到底懂不懂得設計，我承認我對於設計還差很遠，有人曾這樣說過</p>
<blockquote><p>有才華洋溢的年輕編程人員，但沒有年輕的程式設計師</p></blockquote>
<p>原文是英文，我記得似乎是在某本書上看到的，一時也想不起來，我寫的語意用詞可能也沒有那麼正確，但是他想表達的大概是這樣，寫程式這件事情要寫得好其實不難，很多程式設計師很年輕就表現出很強的編程能力，但是很少有程式設計師在年輕時就能表現出設計能力，這表示設計不是很短的時間內可以學會的，需要的是長時間的累積，不是說設計兩個字就真的會設計</p>
<h2>還有什麼? 團隊合作?</h2>
<p>除此之外六先生還有提到</p>
<blockquote><p>所謂速成，就是一個月內就開始寫點子。</p>
<p>我們希望找到一群志同道合的人或許一起創業。</p>
<p>我們希望一邊寫，一邊還討論現在網路最新的狀況與可用的API。</p>
<p>我們還一邊交換自己使用的機房與SEO的建議。</p>
<p>甚至，我們互相幫對方寫對方的程式，整個課程就像一個超大的創業團隊，各有各的目標，但各自之間是互相幫忙的。</p></blockquote>
<p>這問題就更大了，團隊寫程式和一個人寫程式是兩回事，著名的軟體專案開發經驗談的書 "人月神話" 裡有提到，軟體的開發不像是收割小麥，人越多就越有效率，而是人越多，所需要付出的溝通成本就越多，反而會更沒有效率，一個人寫程式，你自己怎麼寫，你自己知道，所有的東西都在你的掌控中，歐~ 不，連你自己都可能忘記自己以前寫的程式，更何況是和別人合作，你得讀別人的程式，他寫出來的如果是天書，你也要能讀懂天書才能夠和他合作，而且程式的開發，如果需求是自己想，自己來實現會最有效率，如果是別人的需求，經過溝通，很容易發生寫出來的程式不是需求者要的東西，從六先生所謂的互相幫對方寫對方的程式，真的是莫名奇妙， 一整個團隊成員們都有不一樣的目標，但是卻又能共同開發來達成這些目標，真的能辦到，我只能說六先生太神了&#8230;.</p>
<h2>最後</h2>
<p>我沒有史丹佛學歷，也沒待過知名企業，只有自學程式九年，寫程式不怎樣，打嘴砲還有點自信的小小阿宅，以上純屬嘴砲&#8230;.僅供參考，看看就好 XD</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/01/26/mr-6-my-opinion/feed/</wfw:commentRss>
		<slash:comments>9</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>
	</channel>
</rss>

