fe-tool
2009/04/27
朱學恆不當富翁快樂做自己
(中央社記者吳素柔台北4日電)
「翻譯『魔戒』賺了3500萬元,從此過著幸福快樂的日子」,朱學恆的故事不是在這裡結束,他捐出版稅成立奇幻文化藝術基金會,推動麻省理工學院開放課程中譯計劃,還到處演講,這位常掛在網路的e世代創意人,其實是位公益宅男。
從小朱學恆就把「事業」做得很大。小時候用電腦玩Game,為了看懂英文介面,努力查單字,國一已可以寫攻略投稿。中央大學電機系畢業後,研究所沒考上,當兵接觸到奇幻小說系列「魔戒」,卻對中譯本品質失望,主動向出版社提重譯計畫,因譯筆一流,加上電影推波助瀾,「魔戒」讓他賺進人生的好幾桶金。
秉持對奇幻文學的熱愛和使命感,他用版稅成立奇幻文化藝術基金會,推動奇幻文學創作和賞析。後來看到可拉近數位落差的麻省理工學院開放式課程,深受感動,投身推動中譯計劃,並架設網站。這個中譯網站目前是除了麻省理工學院之外,全世界最大的開放課程綜合型網站,曾獲紐約時報、華爾街日報報導。
談到推動中譯計劃甘苦,朱學恆說,去學校洽談時,有教授臉上露出輕蔑表情,甚至說,「我們學校不需要這個東西,我們學校可以跟麻省理工相提並論」。朱學恆一臉很嘔的表情回憶,「明知道他在胡說八道,又不能辯解。我去麻省理工學院,人家都不會這麼冷漠對待,這很挫折」。
他說,過去4年寫了上百個企劃書,只有向兩個基金會募到款,但每次遞企劃書都要盡全力,不能預期會失敗。至於被拒絕的鬱卒心情,朱學恆只讓它短暫停留,「只能再試試看,不可能永遠沒有人認同你的看法,不能安慰自己『我盡力了』。100次是盡力,試到1000次、1萬次哪個盡力?很多人做到100次就告訴自己盡力了,那不是盡力,那只是做到100次。」
麻省理工開放課程中譯計劃從2004年開始迄今,目前有七個編輯,行政費用等每年約300萬元。朱學恆並持續在高中、大學演講創意和熱情,過去3年在大專院校和高中演講累計10萬人聽眾,800人規模以上的演講,還會自己帶燈光、音響設備。
很多人問演講賺多少錢?朱學恆說,去年60幾場演講,總結後淨支出近100萬元。「我覺得值得,做這些事情,我都心甘情願,所以心安理得」,他強調,付出不代表對方一定要感謝,這太八股了,1000人的演講,如果有500人願意聽,他就很感謝。
朱學恆也想去偏鄉、部落等學校演講,但他說,「他們不知道我是誰」。例如他曾去南投一所大學演講,請助理在行前聯繫附近高中,看有沒有任何一個學校、班級,願意免費聽創意、國際競爭力等演講,學校都說「沒聽過這個人」;他想突破障礙,但這些老師卻不知道他是誰。他苦笑說,只能繼續努力。
由於麻省理工開放課程時常更新內容,朱學恆和編輯群一直在追進度,中譯工作目前完成約6成。去年翻譯多場受歡迎的演講,下載次數都是十幾萬次,讓朱學恆頗感欣慰。
高學歷高失業率的年代,朱學恆指出,「熱情比任何時候都要重要」,年輕人遇到的問題,不是環境順不順利、遭遇什麼逆境的問題,而是根本不知道自己喜歡什麼,哪些事情值得犧牲時間和金錢去奮鬥,這才是最大問題。
談到熱情,朱學恆話匣子一開,「如果真的喜歡這件事情,你會願意為它付出很多東西,但如果不知道自己喜歡什麼東西,環境的考驗會是前所未有的大」。
他說,多少人能夠連續作一個工作做10幾個小時,除吃飯外不離開電腦?也許1天、2天這樣做,多少人可以連續1年都這樣做。翻譯「魔戒」時,每天工作超過 12 個小時,而且沒有假日,「我可以做到,這是我喜歡的東西」。大部分人做不到原因是,他只是拿一份薪水,會計較一天做多少小時,「對我來講,做喜愛的事情、靠熱情驅動的工作,是沒有投資報酬率的,因為投資就是報酬」。
朱學恆早些年還會在意別人的看法,自己是否成功、賺大錢、受人尊敬、是個好人等,但慢慢覺得討好社會那麼多人太困難。「自己明明知道做這件事情高不高興、愉不愉快、值不值得、想不想要,結果卻把評分標準交給家人、朋友、社會其他人,本身就是一件很荒謬的事情」,最重要的事情是「莫忘初衷」,投入是因為自己喜歡,不是因為別人想要。
去學校演講時,學生必提的問題是「如何拉進理想和現實的差距」?朱學恆總是不假思索表示,「理想和現實之間的差距,需要靠犧牲來補足」。
他舉例說,有學生表示想當漫畫家,家人和老師都反對,因為不會賺到錢,如何彌補這個理想和現實的差距?「很簡單,就去超商打工,其餘時間畫漫畫,這樣不會餓死,但又做到自己想要做的事情」。
朱學恆認為,大部分人認為理想是做喜歡的事情又賺到錢,但這是完美的狀況,只有少數人可以走到這一步。如果不願意去超商打工,其實是沒有那麼喜歡畫漫畫。他說,履歷出現長時間的空白,會被認為沒有工作意願,這才嚴重,「不會連超商都不缺人,只是你覺得值得的工作沒那麼好找,『輕鬆賺很多錢的工作』和『找不到工作』不能混為一談」。
翻譯「魔戒」時,朱學恆坦言「每天都想放棄」,但想到「如果連自己選擇的東西都無法堅持下去,那我還有什麼事情可以做」?翻譯「魔戒」版稅約3500 萬元,朱學恆幾乎全部花在基金會和麻省理工開放課程中譯計劃。沒當千萬富翁,朱學恆笑說,現在也餓不死,還住家裡,「我把錢花在應該花的地方,他們 (家人)不會覺得太丟臉」。
曾將打電玩學英文的經驗出書,朱學恆最近還將部落格文章出書,探究口耳相傳的傳說,分析原因和結果,喜歡筆耕的他,出書清單持續增加。朱學恆以「得要出門的阿宅」形容自己,生活重心就是上網、翻譯、開會、演講,沒有所謂上下班,他灑脫表示,「我選擇不要家累,才可以做這麼多事情」。
朱學恆對奇幻世界有浪漫情懷,人生築夢卻理性而實際,奇幻世界的天啟不存在現實世界,且每個人的狀況不一樣,想要開開心心做自己,「沒有做不到的事情,只有不願意付出的代價」。
2009/04/26
(原創) Google Insights for Search(關鍵字搜尋趨勢比較)
比如我查詢歷屆總統,看看他們的熱門程度,很明顯的,在520前後,馬英九的查詢次數最多,而陳水扁的流量也暴衝好幾次,李登輝則表現平平。
Google Insights for Search不只能限定國家,還可以限定地點,時間等等。是廣告主觀察趨勢的重要指標。更多功能請自行測試:http://www.google.com/insights/search/
FOXY 1.9.8 繁體中文免安裝版
【軟體名稱】:FOXY 1.9.8.繁體中文免安裝版 (已使用卡巴斯基防毒軟體掃描過)
【軟體分類】:檔案傳輸
【檔案大小】:1.33 MB
【放置空間】:BDG
【解壓密碼】:csie-tw.blogspot.com
【軟體介紹】:
操作簡單 - 人性化操作界面,簡單大方,使用起來粉Easy。
搜尋方便 - 只要輕輕按一下,各式各樣的檔案都能輕鬆找到。
下載超快 - 高速穩定的下載體驗,運用團體的力量,讓下載Hihg翻天。
絕對無駭 - 保證絕無木馬病毒、間諜程式或惡意廣告的侵害,保障系統安全。
軟體介紹FOXY是一套免費的軟體,支援市面上任何格式檔案的搜尋與傳輸, 是您不可或缺的最佳分享平台,因此成為最受歡迎的軟體。
* 優化下載來源的搜索方式,下載速度大幅加快
* 增加對於Firefox的支援,並改善一些與IE相容性的問題
* FOXY連結可直接貼進FOXY搜索文字欄位即可下載 重寫FOXY連結產生器,調整使用者介面
* 自動偵測磁碟、光碟等儲存媒介的變更 優化計算Hash值的速度
下載點 (mediafire空間,免費空間,請等待讀秒後下載)
2009/04/14
分享、記錄你的桌面影像 - CamStudio
◎ 關於桌面錄影軟體
桌面錄影軟體對一般大眾而言,其實並不像一般工具軟體那麼重要,但這一兩年來搭上 Youtube 的熱潮,分享影片越來越簡單,而類似的錄影軟體,開始吸引更多人的目光。
目前市面上常見桌面錄影軟體有兩種類型,第一種是全動態的錄製,從按下錄影鈕開始,滑鼠的移動、檔案的拖曳、文字的輸入,都會被忠實的記錄下來,讓使用者可以拍攝細膩的影片,缺點是反應太真實,反而讓教學類的影片後製處理很麻煩,對於講解軟體操作而言,多餘的滑鼠動作很容易影響效果呈現, TechSmith 的 Camtasia Studio 即為此類型的代表。
另一種錄影方式為投影片式,擷取一張一張的靜態畫面,在後製時,錄製者可自由加入註解且控制游標的落點,將這些投影片組合起來後,看起來像連續操作的動畫,觀眾可清楚瞭解作者想要表達甚麼,缺點是錄製連續動作會不知所云,以檔案拖曳為例,一張接一張的停格圖片真的很難表現,此類型的代表為 Adobe 的 Captivate。
兩種類型的軟體各有優缺點,沒有誰好或誰不好的問題,而是該如何使用軟體。假設您有一款電玩遊戲,你想分享一套高難度的過關技巧給朋友,使用 Camtasia Studio 拍攝是比較適合的。假設你想介紹一套新的軟體,需要慢慢解釋軟體介面、按鈕的用途,那 Captivate 的錄製方式會較容易說明。但以上我提到的兩個例子都是商業軟體,且價格不斐,自由軟體中有易學易用的桌面錄影軟體嗎?筆者在這邊向您推薦 CamStudio。
◎ CamStudio 介紹
CamStudio 屬於全錄製式的桌面錄影軟體,可以讓您錄製在桌面上的各種操作及聲音,並將影片儲存為 avi 檔或 swf 檔。它可以錄製桌面所有動作,適合動態畫面的拍攝但對於教學類的動畫拍攝會比較困難。它是一個綠色軟體,意即它具有可攜性,不必安裝即可使用,你可把它放在隨身碟中,帶到其他台電腦中使用。CamStudio 其實並不是一個新的軟體,它最後一個釋出版本為 2007 年 9 月,目前在尋找新的開發者,但由於它使用上的便利與彈性,在這個影音化的時代,讓它再度受到人們的青睞。
◎ CamStudio 功能簡介:
※ 將錄製的影片轉為 Flash 檔案 (*.swf),讓你可以輕易地將影片放置在網路上分享。
※ 可自行替換影片錄製的編碼格式,錄製畫質更好,檔案更小的影片。
※ 拍攝桌面時,可連結 webcam 和麥克風,同時錄製操作者的影像及聲音。
※ 基本的螢幕註解工具,讓您拍攝影片同時,加入影片註解。
◎ 下載及安裝
軟體名稱 CamStudio
軟體版本 2.5.b1
軟體授權 GNU General Public License (GPL)
官方網站 http://camstudio.org/
軟體下載 http://camstudio.org/dev/
開啟下載頁面,使用者必須分別下載兩個檔案,CamStudio.2.5.b1.bin.zip 與 mfc71.dll。
下載完成後,將 CamStudio.2.5.b1.bin.zip 解壓縮到新建立的資料夾中,並將 mfc71.dll 一起放入資料夾內,完成後,點選 Recorder.exe 即可開啟 CamStudio。
http://www.openfoundry.org/images/090414/camstudio/03.png />
◎ 錄製第一個影片
錄製很簡單,點選錄製鈕即開始錄製,你也可利用熱鍵來操作,開始錄影為 F8 鍵,結束錄影為 F9 鍵。
在錄製影片前,提醒大家幾個應注意的基本設定:
1. 錄影範圍
錄影範圍有四個選項:Region(自選範圍)、Fixed Region(固定範圍)、Window(視窗)、Full Screen(全螢幕),使用者可依照需求選擇範圍,但在這邊建議大家,使用 Fixed Region(固定範圍),主要原因是其他選項都有其無法忽視的缺點,以下說明:
※ 以 Region 而言,雖然使用者隨意可圈選想錄影的範圍,但螢幕比例不外乎4:3、16:9、16:10,不是這幾個比例的影片,很容易在播放時,產生一大塊黑邊。
※ Window、Full Screen 的錄影範圍比較不會遇到比例的問題,但由於現在大家使用的螢幕,動不動就 19 吋、21吋,解析度都在 1280×1024 以上,若您真的全螢幕拍攝,拍不到 30 秒,產生的檔案大小就相當可觀。
※ Youtube、無名影音等上傳影片網站,都有上傳影片尺寸的建議值,您在網頁上瀏覽影片,播放的視窗就那麼一小塊,雖然有全螢幕播放,但事實上那是變形後的播放,與其變形後影響畫質,不如根據建議值尺寸拍攝。
Fixed Region(固定範圍) 的設定:
1. 用選擇器得知視窗座標,圈選範圍的長寬。
2. 固定錄影範圍的左上角:
配合選擇器取得作標,將錄影範圍固定在螢幕中的某一個位置,方便作者錄製某一個視窗。
3. 輸入範圍的長度寬度:
控制錄影範圍,建議使用者以 4:3 或16:9 的比例縮放錄影範圍,範例:320×240 。
4. 在拍攝時,可拖曳攝影範圍。
2. 是否要錄製聲音
點選 Options 可選擇是否要錄製聲音。
聲音可增加影片的趣味與可看性,但相對的也會增加檔案的大小,不同的聲音壓縮格式產生的檔案大小和聲音品質也不同,使用者必須在之間取捨,以 DivX Codec 為例,10 秒鐘、 320×240 尺寸的無聲音影片錄製,檔案大小約 500 KB 左右,但若加上聲音錄製,將會提高至 1.5 MB,約原大小的三倍 (以上數據僅供參考,檔案大小會因錄製環境有所不同)。
3. 是否要加入游標
點選【Options】→【Cursor Options】 可選擇是否要加入游標,也可自訂游標的樣式。
1. 顯示實際的游標。
2. 顯示 CamStudio 提供的客製化游標,約有三十幾種選擇。
3. 顯示上傳的游標圖案,上傳檔案格式必須為 *.ico、*.cur。
除此之外,Camstudio 還提供游標高亮效果,突顯游標所在位置,它還能模擬游標點擊,顯示點擊滑鼠左鍵或右鍵時的落點。
1. 顯示游標高亮效果,你可以自定形狀,可以自定大小,個人使用時,習慣將範圍調小,讓游標點擊時,看其來像點擊落點。
2. 啟動虛擬的點擊顯示,當你按下滑鼠按鍵時,會以不同顏色顯示高亮效果,你可以自定點擊左鍵和右鍵的顏色。
4. 錄影時最小化視窗
點選【Options】→【Program Options】→【Minizine program on start rdcording】,當 CamStudio 開始錄影時,會自動將視窗自動最小化至右下角。
◎ 如何錄製畫質好,檔案小的影片
範圍、聲音等設定調整好,通常已滿足大部分使用者的需求。然而,其實以預設的影像設定與聲音設定拍攝出來的影片,檔案太大,且畫質與音質都不是最佳狀態,接下來我將教大家 CamStudio 的細部設定,拍攝出畫質更好,檔案更小的影片。
點選【Options】→【Video Options】可選擇 Codec (影片編解碼器) ,這是影響影片品質主要因素,CamStudio 預設的 Codec 為 Microsoft Video 1,它是早期影片編碼器,通常安裝任何一版 Windows 都會附帶此程式。雖然它方便取得,但以它編解的影片畫質並不佳,通常與實際拍攝對象會有一段差距,若想要製作畫質更佳的影片,第一步應該是替換 Microsoft Video 1。
網路上能找到的 Codec 相當得多,如 XviD、DivX、x264、QuickTime、RealVideo 等等。但 CamStudio 目前只支援 MPEG-4 的 avi 檔案格式,所以這裡推薦的 Codec 只剩下 Xvid、Divx,個人首選為是開放原始碼的 Xvid,不僅因為個人較編好開放原始碼,而是 DivX 在 CamStudio 的使用會有範圍限制問題,針對此問題,官網建議尺寸為 320×240 ,但事實上,不論 DivX 或 XviD 兩者產生的影片畫質與檔案大小都優於 Microsoft Video 1 相當多。
◎ XviD 的安裝
在 Xvid(http://www.xvid.org/) 的官網中,能下載最新的安裝程式,安裝方式跟一般軟體相同,按照指示說明即可安裝完成,有兩種方式可確認是否安裝成功,第一為檢視 Camstudio 的 Compressor 下拉式選單,安裝成功,可以看到 Xvid MPEG-4 Codec。
第二,如果你使用 Windows XP 作業系統,可開啟【裝置管理員】→【音效,視訊及遊戲控制器】→【視訊轉碼器】→【內容】,列表中會顯示你所有可用的 Codec。
安裝完 XviD 即可開始測試錄影的畫質,以下為分別以 Microsoft Video 1 與 XviD 錄製相同的桌面時的擷取畫面,使用者可大略知道畫質的相異程度,XviD 顏色表現較平滑,不會因壓縮後產生明顯的破損。
Windows Video 1
XviD MPEG-4 Codec
檔案大小也有相當的落差,以 Windows Video 1 拍攝白色背景桌面,10 秒,無聲音錄製,產生約 700 KB 的影片檔,以 XviD 拍攝相同環境產生的影片大小約 70 KB,雖然產生的數據大小必須看每個人的拍攝環境,但已看出兩者壓縮的影片大小的能力。
◎ 將拍攝好的影片上傳至 YouTube
拍攝完成後,分享檔案變成另一個問題,由於之前的拍攝建議,使用了 XviD 或 DivX 等 Codec 來拍攝影片,若要正常播放這些影片,對方的電腦也必須安裝這些 Codec,雖然安裝 Codec Pack 是解決方案之一,但不是所有的電腦用戶都會安裝這些軟體,當然你也可以將 avi 檔轉成 swf 檔案,但將影片上傳至 YouTube (或其他影音網站) 是我比較建議的分享方式。
由於 YouTube 能支援多種檔案格式,只要將檔案上傳至 YouTube 的個人帳號,被分享的朋友只要用瀏覽器即可觀看影片,如何[上傳檔案](http: //help.youtube.com/support/youtube/bin/answer.py?answer=57924&cbid=-1gnk7blkis2qp& src=cb&lev=topic),如何[最佳化上傳影片](http: //www.google.com/support/youtube/bin/answer.py?hl=b5&answer=132460) ,在 YouTube官網的說明文件中有詳盡的教學,不再多累述,值得一提的是,若要使用 CamStudio 拍攝 Youtube 上傳影片,要如何最佳化設定?以下提出個人建議的各項設定值:
1. Fixed Region:640×360
2. Compressor: XviD MPEG-4 Codec
3. Quality:100
4. Set Key Frames Every:25 frames
5. Capture Frames Every:40 millisecond
6. Palyback Rate:25 frames/second
7. Audio Compressed Format:Lame MP3
其實任何建議都比不上自己動手去測試,視訊來源、影片格式、甚至影片類型 (動畫、MV、軟體介紹) 都會影響錄製設定,唯有親手去玩,去拍攝,才能做出一部好的影片。
◎ CamStudio 應用範例
※ 軟體操作示範
CamStudio 設定簡介
http://www.youtube.com/watch?v=DJiTrbjtBU4
※ 擷取MSN對話與視訊
擷取MSN對話與視訊
http://www.youtube.com/watch?v=3PMqeRgBkZY
2009/04/07
C語言的extern的功能
//test2.cpp
int x = 100;
int y = 200;
-------------------------------------------------------------
// test.cpp
// extern 範例
#include
#include "test2.cpp" // 宣告 x 和 y
int a = 10;
extern int x; // 有效範圍; 整個程式
int main(int argc, char* argv[])
{
extern int y; // 有效範圍: 這個函數內
std::cout << a << std::endl; // 10
std::cout << x << std::endl; // 100
std::cout << y << std::endl; // 200
return 0;
}
假如沒有 #include "test2.cpp" ,編譯階段 test2.cpp 是可以過,但是連結時會發生 x 和 y 變數無法解析的錯誤。這就是 extern 的效用,宣告變數已經在某個地方定義過。
ARM開發環境建立
2.apt-get 以下
libncurses-dev
build-essential
mtd-tools
這樣一來你的開發環境就可以編譯大部分的軟件!!
C++中關於extern "C"的意義
為什麼C++會需要這樣的關鍵字組呢? 原因是C++它有一個複載(overloading)的功能,也就是說同樣的函式名稱可以有多個定義只要參數簽名不同即可。比如說C++裡可以有以下的二個宣告
bar(int i, int j);
bar(double i, double j);
這二個函式都是同樣的名字叫foo,僅參數型式不同。然而在C語言裡是不被允許的! C++是如何處理這同名的函式呢? 其實他在編譯時會偷偷的把這二個函式名變成不同的名字,舉例來說bar(int i, int j)可能會被改成_bar_int_int(每種compiler產生不太一樣),而另一個則被改成_bar_double_double。這技術稱 Mangling。
問題來了! 當我們希望C++不要偷換函式名時該怎麼辦? 於是就有了extern "C" 這個關鍵字組出現了。這個字組就是請C++不要自己又偷天換日,請它保留原名。所以當我們宣告一個函式如下時:
extern "C" bar(int i, int j);
編譯器就不會把bar變成_bar_double_double。
實際使用的注意事項:
1/ 當C++使用C的函式庫(library)時,C++不能直接套用C的header檔。因為他會把header裡的宣告給mangleing了。所以他必須使用如下:
extern "C"
{
#include "C_LIB.h" //C_LIB 是C語言所製告出來的。
}
2/ 相反的,在C語言的編譯器裡若要使用由C++所製告出來的C函式庫,那麼也不能直接的使用C++的header檔。因為此header檔必然存在 extern "C" 這個關鍵字組,而這字組C語言是不認識的。所以必需要把C++的header檔裡的extern "C" { } 移除後才可以讓C編譯器使用。
2009/04/06
寫程式到底需不需要懂數學?
數 學對於程式設計師來說到底重不重要?!類似這樣標題的討論,在網路上已經不知道被討論多少次了。前兩天又在老同事小白的blog上看到了他的看法。以前正 方總是喜歡拿演算法與效率來表明數學很重要的立場,反方或是最近普遍的觀點是要依照需求。兩方都沒錯,我也有一點小心得跟大家分享。
先來談談「數學」在大家的心中是長什麼樣子。我大學時念的是輔大應數,會選應數的原因是一、我的分數上不了資工,二、應數又跟純數不一樣,是比較偏電腦應 用的(事實上不是這麼回事),應數的全名是應用數學。三、高中時一位要好且電腦很強的同學也是唸輔大應數,所以我就這樣進了數學系。在一般人眼中是個很硬 的科系,那幾年全校1/2的名單中,數學系就佔了一半。數學系所學的數學,跟一般人所會用到的數學不太一樣。除了幾門工科必備的微積分、線性代數、機率統 計外,剩下的都是高深且抽象的數學理論,像是高等微積分、高等代數、幾何學(不是三角形、正方形那種簡單幾何)、拓撲學等。這幾門課程跟本像天書一樣,非 常的抽象(無法畫在直角座標系上),我能畢業也算是一種奇蹟啊~~我真懷疑我那學唸到博士班的同學們,他們的腦袋是不是跟我長得不一樣。
研究所順利考上的嚮往已久的資工所,成為名符其實的本科系學生,本以為可以不用再玩數學了,但我發現我錯了,是不用再玩那些抽久的高等數學沒錯,但線性代 數、機率統計、離散數學等…用了更多的數學,我想不出來有哪門資工研究所的課沒用到數學的。而且你最後的碩士論文要寫出來,數學更是不能少的。你以為玩網 路不需要數學?大錯特錯,裡面一堆機率統計的東西。電機需要數學嗎?當然需要!最基本的傅利葉轉換就夠搞死你了,所有工科的系所都逃不了數學的魔掌。就算 你到了管理學院,會計系要數學、經濟系要數學、連心理系有些領域也需要數學。雖然所需要的數學不盡相同,但都在數學的領域裡。我開始後悔當年沒把數學唸 好,博士班念到一半唸不下去了,其中一個原因是我數學太爛了。
寫程式需要數學嗎?要看程式的目的?那我們就像討論一個簡單的程式,算出1加到100的總和。
完全以程式結果為導向的人,或是訓練有素的程式女/男工,甚至有時連我都會很直覺的寫出這樣的程式:
int sum = 0;
for (int i=1; i<=100; i++) sum += i;
上面這個程式片段還算很容易讓人一眼就看懂,可是我們明明國中時就學過了這種數列級數的算法了,怎麼還會寫出上面這麼笨的程式呢?
int sum = ((1 + 100) * (100 - 1 + 1)) / 2;
或更精簡的
int sum = (101 * 100) >> 1;
這個例子已經被說爛了,我們來來看另一個例子,計算1加到10000,奇數和偶數的總和。用迴圈的話,一樣很直覺得就寫出來了:
int oddSum = 0;
int evenSum = 0;
for (int i=1; i<=10000; i++)
{
if (i % 2 == 0) evenSum += i;
else oddSum += i;
}
很簡單的程式吧!可是我們稍稍的用我們有12年(國小到高中)的數學背景想一下,你可以寫出更精簡的程式:
int sum = (10001 * 10000) >> 1;
int evenSum = 5001 * 5000;
int oddSum = sum - evenSum;
什麼?看不懂?!sum應該知道怎麼算出來吧?就剛剛第一個例子是1加到100,現在改加到10000而已。evenSum呢?簡單的推理一下,1到 10000之間的偶數總和是2+4+6+...+10000,把它們全部除以2的話會變成1+2+3+...+5000,所以1到10000偶數的總和 不就是1加到5000的兩倍嗎?
1加到5000是:
(5001 * 5000) >> 2 兩倍就不用除那個2了,所以不就是上面那個算式了嗎!
那1到10000奇數的總和不就是全部的總和減掉偶數的總合嗎!稍微動一下腦袋,可以讓你的程式變得很有效率。怕別人看不懂?是不會加個註解在程式碼裡面喔!
相信聰明的你,很容易就可以分析出來這兩個例子的兩種寫法,在效能上迶多大的差異,但這不是我在這裡想要表答數學是如何如何增加效率的。我想要表答的是, 我們明明辛苦了12年,學了一堆的數學,為什麼我們要放棄這樣的基本訓練?我們笑美國人的數學不好,請問你又用了多少的數學來幫助你的生活和你的工作?學 了又不用,那不如從小學開始就分科系好了,不喜歡數學、怕數學的,就選完全用不到數學的科系。
我今天不是要大家在寫程式是時鑽研那種演算法、功式等,去計較那些在現在動不動在2GHZ, 3GHZ,雙核心、四核心之下,所省下的那微小的效率。而是你的態度!你寧願多打一些code,也不願動一下腦筋,如果你的態度是這樣子的話,那也是活得 下去啦,不過你的水平就不過如此而已。
你會反駁說,需要用到演算法、要講求效率時,我再去研究一下就好了,幹嘛說的很嚴重似的。今天我們一時興起,要去爬陽明山,沒問題啊,那種程度的山,只要 雙腳健全走得動的人都能爬。如果換成現在流行的登山步道呢?這需要一點點體力才行。如果你要去爬台灣百岳呢?合歡山的東峰算是最簡單的吧?開車到山腳下, 穿個好一點的鞋子、好一點的衣服、多一點的體力,也還不是太大的問題。那爬玉山呢?雖然現在爬玉山已經很方便了,連行李都可以請人幫你背,但平常沒有一些 訓練,要爬上去不是那麼容易的事。你要站在世界的最高點,去挑戰聖母峰,那全世界沒幾個人辦得到,而且辦到的人事前可是經過了嚴格的訓練。
你想把自己擺在什麼位置?你想要成就到什麼樣的高度?如果你只想在小小的台灣,在二、三流的公司裡,打打專案游擊戰,賺個還算可以的薪水,那的確,你不怎 麼需要數學,連軟體工程的理論也不太需要,最重要的唬弄客戶的技術純熟就可以了。去年去了101的37樓面試後,我才知道我了不起只爬到阿里山而已,要登 上MountainView這座山,我必需十倍努力才行。而這個努力不是我在面試前,看看什麼教戰手冊、寫寫網路上的考古題我就能夠通過的,而是必需把一 些數學的訓練熟到變成很自然的反應才行。簡單的問你就好了啦,上面那個用迴圈寫的1加到10000的那個例子,如果10000改用n的話,那需要多少時 間,用大O(big O)來表示。如果你不能很快的推論出是O(n)的話,那你的履歷連投都不要投,在37樓問的問題比這難多了,而且你沒幾分鐘的時間可以作答。去年那次,是 我第二次後悔當初沒把數學學好。
為什麼Google會這麼重視演算法和效率?應該說世界級的大公司都重視,Yahoo、微軟、YouTube…,因為你寫的程式不是給幾十個人、幾百個人 用而已。而是同一時間有幾百萬,甚至上千萬人使用。一個人慢0.1秒好了,一百萬人就10萬秒,超過一天耶。瀏覽一個網頁,慢個幾秒鐘你都不能忍受了,更 何況是一天。你說能不計較演算法和效率嗎?!
你想過什麼樣的生活是你自己決定的,但你想要當個世界級的軟體工程師的話,把學數學就當作是一種修行吧!不要怕沒地方用,因為你時時刻刻都可以用到它。當你的修行到了某個程度,要挑戰高山,就比別人容易多了。
好好好,不想深入就算了,但你不覺得放棄12年的數學訓練很可惜嗎?至少花點腦筋用一下嘛~~,大家都多少用一點,台灣軟體的水平就會慢慢提升了,你說是嗎?
感覺起來大家還是對於我在上一篇文章中的論點不是那麼的了解,我想要表達的是我並沒有要求堅深、精美的數學演算法, 而是要大家在平常寫程式時,多想一分鐘,把你所約到的數學用上來,不需要多資深的數學背景,只要我們在大學以前所學的12年數學就夠了。目的是什麼呢?為 了有一天需要用到更深一層的數學來解決問題時,做好平日的練習和準備。呃...還是無法體會?我再舉個例子吧。
小明跟小華平常在班上的成績都不錯,但小華不愛小功課,常常到了要交功課的前一天,才向小明借來抄。小明基於朋友的立場,常告戒小華說,老師出功課的目的就 是讓我們平常就把學到的東西熟練,這樣到了考試時才會準備的比較輕鬆。小華腦袋不錯,有點小聰明,但就是愛玩,他覺得浪費時間寫那些功課不如拿去控電動, 功課有交出去就好了,老師也不知道是抄來的,考試?!考前三天再熬夜準備就好了。平常的小考、月考小華還應付的不錯,因為小華頭腦其實不差,所以臨時抱佛 腳的效果還不錯。但終於要到關鍵的基測大考了,小華花了一兩個禮拜來熬夜準備,但考試結果沒有比輕鬆準備的小明來的好。
實力是慢慢累積而來的,也許你很聰明,可以在短時間內硬塞進一些東西在腦子裡,但經驗告訴我們,臨時抱佛腳所讀到的書,在交卷後一秒鐘就全忘光 了。就像農夫為什麼平常要努力的耕田、翻土一樣,要播種時再耕就好了,幹嘛平常就要再那辛苦的挖來挖去呢?大家應到都知道這老掉牙的道理,沒有平常辛勤的 耕耘,怎麼會有豐收的成果。臨時翻土,種得活是運氣好,收成的爛是理所當然。
還是有人在「程式目的」這點上做文章,經過我再次的解釋,不知道大家了解了沒?煎荷包蛋不難吧?同樣是煎蛋,有沒有練習還是差很多的。不知道各位 爸爸們,換尿布的工作是不是你們負責?換尿布也沒什麼難的,但你平常沒熟練,臨時要你參加換尿布比賽,你也是會手忙腳亂的。程式目的不是我的重點,我要寫 的程式也不是專要來解決某個數學問題用的,程式裡本來就到處都有數學的影子。平常多練習一點,有一天需要用到大量的數學時,你就能很輕鬆的應付,而不是眼 睜睜地把機會交到熟練數學的人手上。
文言文?白話文?程式可讀性?信不信就是有人連簡單的迴圈也可以寫得亂七糟,也有寫得很複雜的迴圈,讓人很難了解在幹嘛。程式註解才是程式可讀性 的關鍵,我們不是天天都在一行一行的trace別人的code,事實上我們平常也很少看別人的code,除非你是要改作業、最佳化調整、找別人的Bug之 外。不靠註解,要看懂別人的程式真得很累。就像基測的作文,平平都是白話文,但是有人寫出來的文章就是讓人看不種一樣。
下面這個迴圈在做什麼呢?
int a = 1;
int b = 0;
int c = 0;
for(int i=1, j=-2; a<12346; i+=2, j+=2, a+=2, b+=i, c+=j);
2009/04/05
fork()與vfork()的比較
fork()和vfork()這兩個系統功能都可以複製出和呼叫者﹙parent﹚完全相同的process﹙child﹚,但呼叫vfork()後的parent process會被暫停,直到被複製出來的child process執行了exec()或exit();而呼叫fork()後的parent process會和新產生的child process平行﹙concurrent﹚執行。
接下來我們必須約略解釋一下fork()在Linux中的實現方式,旨在讓讀者知道為什麼這個系統功能沒法直接移植到沒有MMU的CPU上;首先我們必須先介紹一下”copy-on-write”這個觀念:
一個程式在執行時會佔據記憶體空間,粗略可分為程式段、資料段、堆疊段與常數段,其中程式段與堆疊段是唯讀的,資料段與堆疊段的內容則有可能在執行時期被改變。在Linux中,當某個process呼叫fork()產生child process時,系統只會為新的process配置堆疊段,其他的記憶體區段都是共用的;實際上在child process呼叫exec()去執行另一個程式前,諸如程式段以及常數段這些內容不可以被改變的記憶體區段始終可以共用。可是資料段就不能一直共用,如果parent與child process同時去操作某個變數勢必會引起混亂。
Child process被fork出來後馬上呼叫exec()去執行其他程式是最常用的流程,以此說來,雖然每個process都必須有獨立的資料段,但馬上為child process配置資料段是很不經濟的,因為在大部分的狀況下child process並不會去對資料段作寫入的動作,在執行exec()後,之前的資料段就沒用了。
為了解決這個問題,Linux(fork)採用”copy-on-write”的技術,在child process尚未對資料段作寫入的動作之前,parent與child process共用資料段;當child process對資料段記憶體作出寫入的要求時,系統會配置一塊實體記憶體﹙一個page﹚給child process,並將原本資料段中被要求寫入之page的內容複製到這塊新的page;接著系統會更改child process的page table,使要被寫入資料的虛擬位址可以對應到上述新配置的實體記憶體位址。
此時child process與parent process的資料段大部分都還是功用的,不同的地方只是這次要被寫入的page;這種演算法的好處很多,在最節省記憶體的前提下使得parent與child process不致互相影響。要達到這種效果,CPU沒有支援MMU是做不到的,所以uClinux無法直接支援fork()這個系統功能。
uClinux無法作到安全的資料段分享機制,產生child process後複製整塊資料段也顯得有點笨拙,於是只好讓parent process停止執行,直到child process結束執行或有了自己的資料段之後才能恢復執行,前者表示child process出現例外或呼叫了_exit(),而後者則表示child process呼叫了exec()去執行其他的程式。這樣妥協出來的功能,就是原本Linux中的vfork()系統呼叫。
如果讀者對copy-on-write的原理不清楚也沒關係,讀者在使用uClinux時只需知道一般Linux在實現fork()這個系統功能時必須用到MMU的機制,而uClinux執行在沒有MMU的CPU之上,所以fork()無法直接移植到uClinux上;uClinux提供vfork()以達到多工的效果。
必須注意的是,使用vfork()產生的child process很可能會破壞parent process原本的資料段,所以程式設計師在uClinux上使用vfork()時必須格外小心;而且沒有fork()系統功能的事實使得許多原本運行在Linux上的應用程式無法完全不經修改救執行於uClinux之上。
我的心得:在早期的fork會複製整個parent的address space,造成時間的浪費,使用vfork則不會複製parent的address space。近來的fork則使用copy-on-write的技術,但是這卻需要MMU的幫忙,才能將child process的page table修改成正確的physcial address,而在嵌入式系統上,uClinux並不支援MMU,所以只能使用vfork。
(原創) 誰說學英文要花錢?
1. 空中英語教室:包含三種等級的雜誌,可以線上收看影片,也可以聽廣播節目。算是口碑相當好的英語雜誌。
2. MIT WORLD:裡面包含了MIT邀請來的各知名專家,學者,企業家等的精采演講。不僅可以增加英語聽力,還可以聆聽大師們的知識經驗。
3. Youtube:Youtube是一個影片分享的網站,我訂閱了不少channel,裡面的內容可說是包羅萬象。
Google邀請的演講:http://www.youtube.com/user/AtGoogleTalks
卡內基美隆大學:http://www.youtube.com/user/carnegiemellonu
麻省理工學院:http://www.youtube.com/user/MIT
史丹福大學:http://www.youtube.com/user/stanforduniversity
加州大學柏克萊分校:http://www.youtube.com/user/ucberkeleyevents
4. ESL Lab:這個網站有很多短篇的聽力測驗,每篇都只有幾分鐘而已,適合用來練習英檢考試。
5. ICRT EZ News:RSS網址:http://www.icrt.com.tw/en/ext/rss/eznews.xml
6. CCN News: RSS網址:http://rss.cnn.com/services/podcasting/newscast/rss.xml
7. 天下雜誌英文版
8. ABC News: 即時更新的線上新聞網站,包含一些專訪,討論等等。
2009/04/01
(原創) Adsense廣告繞文效果
然而,要怎樣吸引使用者的目光呢?當然就是將Adsense廣告緊貼著文章內容,這樣往往可以吸引讀者觀看廣告。其效果有點像是MS word的圖繞文效果。藏經閣即是使用此模式。
以下將教你如何達到這樣的效果:
<p style="float: right;margin: 4px;">
你的Adsense廣告程式碼
</p>
如果想把廣告靠左則把right改成left。
margin則是本文與廣告間的空隙,一般設為4px。
Buddhism and Software Developer
In today's fast-paced society, we are often surrounded by work, goals, and external pressures. However, the wisdom found in Buddhism off...
-
如果你平時在玩線上遊戲或是工作中經常需要大量點擊滑鼠,那麼一定有大量點擊滑鼠的經驗,非常浪費時間與精力!這個小程式可以讓您免於在做這些無意義的工作了! MouseClick可以依據使用者需求設定點擊的頻率(毫秒)。並且在2.0版可以讓使用者自由選擇滑鼠左鍵,右鍵,中鍵的點擊...
-
如果你忘記即時通的密碼,MessenPass是一個可以顯示儲存在你電腦的密碼的軟體。他可以破解的密碼相當多種,可見下列表。 MSN Messenger Windows Messenger (In Windows XP) Windo...
-
Abstract The DrivingDirection package (com.google.googlenav.DrivingDirection) is removed since Android SDK 1.1. However, in this art...