星期二, 8月 12, 2008

有關物件導向的胡言亂語

老實說我也不知道我要下什麼標題比較好XD

昨天閒逛時發現,今年人次快要接近一萬了,想一想也沒什麼好高興的,從Google點進來的都是去年的文章居多XD 可以說今年到現在為止是過的比較懶散的生活,不過我想,寫blog還是一件相當有趣的事。

暑假過一個多月了,每天都在寫程式中與閱讀渡過,可謂是過的相當充實,目前只有滿心希望能夠把眼前這個專題完成。並不是每一次都可以遇到很好的合作對象的。

最近也沒什麼空在閱讀小說上,以前幾個禮拜看的"殺人本能"就覺得不甚讓人覺得緊張,還是戰慄遊戲比較提升我的腎上線素,應該是說,我最近的興趣是閱讀重構之類的書,書的清單如下。

  • 物件導向設計模式: 可再利用物件導向軟體之要素(Design Patterns)
  • Object-Oriented Analysis and Design with Applications 2/e (這本尚末閱讀)
  • 重構 - 改善即有的程式設計(Refactoring - Improving The Design of Existing Code)
  • 重構 - 向範式前進(Refactoring to Patterns)
  • 敏捷軟體開發 - 原則、樣式及實務(Agile Software Development: Principles, Patterns, and Practices)

其實看了好幾次Design Patterns,我從來沒有記得裡面的經典patterns,這種書本來就是看完就忘,如果為了pattern而pattern,很容易陷入一般教科書所謂的pattern happy,有幾本書提到使用XP(eXtreme Progarmming)來使用OO,對我而言,從這邊開始去了解整個思維是不錯的,雖然好像不是那麼多人注意就是了,在前陣子 "Refactoring to Patterns" 在天瓏暢銷排行榜上,我們只能保佑,不要有一堆人買回去供養XD。

以自己大膽的猜測而言,其實學習 OO 沒有入口,因為原則非常簡單,OOP 是一門藝術,但是並不科學,因為他並不像數學一樣,經過一連串的演算即可獲得結果。而是得靠一個一個unit testing去確認程式的正確性。其實進入這個世界,就有如木匠帶領學徒一樣,技巧只有幾樣,但是不斷的精練自己的能力,方能寫出有如藝術品的程式。雖然擁護者會說,OO 是最接近人類思考的方式,並輔以相當的科學佐證。

物件導向最重要概念為class hierarchy,利用class hierarchy方有可能把物件導向用到淋漓盡致,但是問題來了,要用多少技巧來包裝? 過或不及都會造成整隻程式的有趣現象。書上所提及的所有物件導向技術都是用以改善一個程式的class hierarchy,抓住這個重點再來閱讀,我的心思越辯越明。

此外再提及一個在學校有趣現象,大家都會說,物件導向很重要,要盡快學會,但是卻看不到幾人能夠善加利用而教授他人,或許過幾年我也會聽到XP很重要,programming的發展長時間在配合業界,而非配合科學。

何謂Computer Science,推薦ptt CSSE版上瞧瞧高手討論。也是不錯

---
果真是胡言亂語

星期六, 8月 09, 2008

感謝

不知道要下什麼標題才好

Clara's blog article about birthday

朋友提及才發現,升大四的時候,好像很少有人有過生日的習慣了,蠻感謝同組組員的,應該是說,我不是一個擅長表達的人,一直不知道怎麼說自己的感謝之情。還是很感謝eating, Clara, fire7617。

想想我們這組感情也不錯,始終都是自己白目了些。謝謝大家。

---
謝天

Josh Ko 與 scm


昨天得到甚為有趣的照片,為Josh Ko 和 scm 的合照,兩個人亦師亦友,不錯不錯

順便幫Josh Ko徵煮飯婆女友,需要長期飯碗熱情專注的人,可以出門左轉,歡迎歡迎(記得給介紹費)

---
紀念一下

星期二, 8月 05, 2008

生日

其實,每一年都會思考,我是否有足夠的資格過生日...

不知道從什麼時候開始,我覺得我少不更事的年紀太長,認為自己不甚好,從理所當然,到覺得自己應貢獻社會。在更多時候,覺得自己應該要會某些事,卻總是一事無成。雖有Josh鼎力相助,發現自己興趣為何,從imperative programming 跳到 functional programming 學習(我曾自嘲,這跟我打了九年的注音不打從嘸蝦米的基本學起其實差不多(笑))。不知為何想起國文課本所提及的一句話。

真實偉大的樸實無華

少不更事看書時,只是為了炫耀自己會了什麼,並不是一個可取的想法,現在看書的時候,只是單純想要了解一件事,到現在我不認為我理解了這句話,但是我所想,持續的努力,或許可以了解這件事。雖然一事無成,但努力前進,總有一天會找到答案,笨笨的前進,總可以讓一群人了解你笨笨的前進為何。

我曾跟Josh聊過一連串的事,才覺得自己總是浪費了一堆時間,不過我總是不後悔,因為因此我才會更珍惜當下與未來。就某個程度而言,有著一群我很感謝的朋友,我可以安靜的過生活,雖然實力不足,但更應該努力幫忙身邊的人。今年並不想和往年一樣列了一堆人名,大家不一定認識,且少列誰我都會覺得抱歉。我想說的是

希望,身邊的大家都活的平安快樂。

---
謝謝大家,今年是一個相當愉快的回憶。

星期一, 8月 04, 2008

列印

第一次買碳粉,才知道原來很貴,2650...Orz

人生因有夢想而為大,所以我正在K我印下來的兩份文件 "Introduction to lambda Calculus" 和 "Yet Another Haskell Tutorial"。

我的夢想很簡單,我想知道如何寫好程式,然後帶領一個團隊把程式寫好。我的兒時夢想很簡單,我想要寫出一個可以讓很多很多人用的好程式,我一直都因為這個原因前進。我不是一個有能力的人,我更不是聰明的人,但是我相信Randy Pausch說的兩句話

如果你認真過生活,那麼你的人生自然會帶給你答案
阻擋你的夢想必有其原因,而這道牆是讓你展示你有多麼想達成夢想。

其實在一兩個月前就知道有關Randy Pausch教授的事,但是腦中一直在思考非常多事,我想我有非常多的事想說,而這篇,只是一個開始


---
認真過生活,人生自然會帶給你答案。

星期日, 7月 27, 2008

Haskell Learning Note(2)

欠稿很大,預估要寫到folder後才能停一下。

環境
建議是用ghc(The Glasgow Haskell Compiler),大部分的環境都有提供binary,直接安裝即可,而ghci是一個互動介面,較為常用指令如下。

  • :q 離開ghci
  • :l xd.hs 載入某個module(Haskell副檔名為.hs)
  • :r 重新載入module
  • :e 編輯所載入的module的文字檔(我在mac上,預設是用vim開啟)

簡單的開始
如果撰寫了一個function,可以使用:t 來看其形別要求,舉個例子

Prelude> :t sum . map read . words
sum . map read . words :: (Read a, Num a) => String -> a
剛開始學習,學會看type是一件非常重要的事。然而,就此打住,想先講講一些別的東西

Just Function
在Haskell中最小的組成單位是function,想要表達一堆資料,可以用list(不知道對不對,不過倒是知道list沒有這麼簡單),一個function必有其input 和 output,然而,我學習的第一個問題,怎麼樣得知input和output的要求為何,如果跟C++ STL一樣,use type as an argument,必有其限制,所以:t非常的重要(因為就是拿來看型別要求),在Haskell裡,有著非常神奇的type system,有好幾次我問Josh,為什麼會如此時,卻超出我的範圍,以剛剛說的例子而言

Prelude> :t words
words :: String -> [String]
(yen3註:一個String為input,產生一個為String的List)

Prelude> :t read
read :: (Read a) => String -> a
(yen3註: 一個String為input,產生一個型別為a符合Read的要求)

Prelude> :t map
map :: (a -> b) -> [a] -> [b]
(yen3註: map是一個神奇的function,基本原理就是,input為一個list,output也是一個list,但是map會套用一個function,將list of a轉換到list of b,簡單的來說,就是對每個元素做同一個動作)

Prelude> :t sum
sum :: (Num a) => [a] -> a
(yen3註: input 為一個list,輸出後型別為a符合Num的要求)
接著再回來看看原來的例子
Prelude> :t sum . map read . words
sum . map read . words :: (Read a, Num a) => String -> a
(yen3註: 變的很明顯,輸入一個字串,而輸出一個型別為a符合 Read 和 Num,全部串起來做一次就會變成...)

Prelude> sum . map read . words $ "123 456"
579
(yen3註:把字串根據空白分開成為個一list,然後每個元素被讀取成某一個型別之後,sum把每個元素做一求和的動作。)
其實這一行沒有解釋的很清楚,何謂Read要求 ? 還有,轉型的時候為什麼要轉成a? 這就再說XD (因為我也不會XD) 其實就學到這裡的時候,可以猜到一件事,Haskell自己幫你做了非常多的事,很多事硬要推測到底,其實反正看不懂。看清楚一個function的要求為何,似乎變的很重要,看懂他的運作方式會更有趣



每次連載都不會寫太長,基本上都是利用專題空閒寫作,我就盡量寫啦XD


---
基本上這篇的註都是大膽的猜測,但是想不到要用什麼字XD

Haskell Learning Note(1)

原本想說要用什麼 Learing about fuctnional programming using Haskell 之類的標題,但是一則是標題太長,一則是,我沒這麼專業,受到Josh Ko幫忙甚多,如果有任何錯誤是我表達不好,如果你看的懂,請出門左轉到Joshsoft留言感謝XD

What? Why?
什麼是functional programming? 簡而言之,一個programming組成的最小元素為數學性的function,在真實世界中的數學函式是沒有任何side effect,也就是說,給你一個input就會產生一個output,中間不會改變其他事。所以就某種狀況而且,這種思維非常適合數學好的人學習(我數學不好XD)。

functional programming之所以紅不起來的原因有很多,主要原因有二,第一,比起現在大部分的主流語言都來的慢,第二,如果很習慣現代的主流語言,學FP就會很痛苦(我就是那一個...Orz),但是誰都不能忽略FP本身強大的特性。在Erlang本身而言,善用了No side effect特性,以較為簡單的方法寫出平行程式。最重要的原因,現在的FP不再像以前一樣這麼慢了,但是良好的特性還是存在的。

Haskell是一個不怎麼紅而且推廣者也不打算讓他紅的語言,紅的FPL很多,Erlang, ML, F#都是,但是這些較紅的語言都允許一些現代主流語言的特性,反正都要踏入這個不紅的領域了,學比較純的東西或許比較有趣?

為什麼要學Haskell,最重要的原因,Haskell is a pure functional programming language,次要的原因,Josh Ko誘拐我成功了XD,如果夠純,或許我會從裡面學到非常多有趣的東西。

參考資料
基本上Haskell的參考資料中文的不是很多,入門的更少,看英文是一個比較好的方法,網站參考資料如下


而我目前的參考書單只有兩本
  • Introduction to Functional Programming using Haskell 2/e
  • Real World Haskell
然後我都沒有看過XD

連載中XD

---
考慮要不要寫在GooglePage還是wiki上

訂書

剛剛透過在美國的姊姊訂了一本 Introduction to Functional Programming using Haskell只能說,便宜一點點,不過還是覺得天瓏的代訂價3227有點誇張。

---
耶~期待~XD

星期五, 7月 25, 2008

寫程式的胡言亂語

這是一篇有關programming的文章,不想看的可以跳過了XDXD,不過最近的我似乎很少寫這些文章。

最近一直在寫C# with .net compact framework,老實說,我一直被微軟的名詞搞的暈頭轉向,當我有問題只能靠著MSDN來解決的時候,有一種很深刻的無力感...不過我不得不說,Visual Studio .net 是一個很棒的軟體開發工具(雖然eating畫GUI時常常出現記憶體堆疊錯誤,她應該是畫太好...Orz),這部分是專題兼比賽關係,所以我大概等到比賽之後才會提及可以提及的部分,如果中華電信有保密條款之類的,我也只能說聲抱歉啦。

所以我想要提及一些我最近覺得很有趣的部分。寫程式越久只會覺得自己越來越不會寫程式,最近的興趣著重在兩個大重點functional programming 和 Refactoring。

functional programming 最近頗有復活的傾向,據我粗淺的知道(轉錄自某個老師告訴我的故事),上一次FP紅的時候是在一堆人瘋AI(Artificial Intelligence)時,Lisp是一個非常聞名的FPL,在1990年代附近一堆人在做這個題目,但是並不是有那麼實際的成果,結果做這類的題目變人人討打。FP其實專長並不止於此,就我的了解,讓你寫程式更像寫數學一樣,No side effect,lazy evaluation,等等之類的特性,使得近代的FPL極具威力,而跟現在主流的Imperative programming大異其趣,著實是一個讓我產生高度興趣學習的領域,據Josh Ko描述,有比較靠近主流的ML和pure FPL的Haskell,外加我自己所買的Erlang,我想我的學習會以後面兩個為主。到目前為止,我還是不會寫,或許過一陣子,可以自己試著寫出一堆有趣的東西。

舉個例子好了sum . map read . words $ "123 456"我當初看到這行程式碼我就哭了,這可是我第一次碰C寫的要死要活的題目,轉成簡單的C++ Code;

std::string s = "123 456";

s += " ";
int sum = 0, temp=0;
for(std::size_t i=0; i< s.length();i++){
if(s[i]>='0' && s[i]<='9') temp = temp*10 + s[i]-'0';
else{
sum += temp;
temp = 0;
}
}

當然,上述的程式碼沒有做任何的最佳化寫法,不然可以用C的atoi()之類的function,重點是,再看一次FP的程式碼,光看字面就可以猜到程式的意思了(要了解沒那麼簡單,我被Josh Ko搞死了好久...Orz),以後會盡量把自己學習寫FP的筆記放上來,我想我有很大的機率會喜歡上這種程式思維。

接下來回主流Imperative programming XD,昨天嘗試的把Refactoring從第二章推進到第八章,這是一本我很少數後會後悔大一沒有買來看的書(當初錯過Effective C++也沒那麼嚴重),裡面提到種種的方法太漂亮了,從function level的Composing Method到Object之間的Moving Features Between Objects& Organizing Data等等的方法,給我在OOP上很多體悟,也再一次深深的了解自己基本功的不足,舉個例子而言,一般寫身份字號產生器時,最難處理的是每個英文數字所代表的數字,我在寫作時就提出了一個很簡單的方法

// normal writing
char c = 'a';
int value = 0;
if(c=='a') value = 10;
else if(c=='b') value = 11;
/*...*/

// better writing
const int c_value[] = {10, 11 /*...*/};
char c = 'a';
int value = c_value[c-'a'];

這個方法在Refactoring也有收錄,名字為Substitute Algorithm(6.9),Refactoring並不會改變程式所要表現為何,很多時候會把一個複雜的function拆成由許多小function所組合,由專家告訴你如何測試及重構出一個更好的程式,在看這本書時,是一個很棒的體驗,縱使自己原本就會復審自己所寫的程式碼,我想我還是會不定期的看看這本書,會給我什麼體悟

學習相關OOP的運用最大的問題是,我一定得知道這些事(Design Patterns, Refactroing ...),但是我又得忘掉他,然後在需要的時候想起來,而不是為了運用而運用,但是我想,或許我會在Refactoring改變一下作法,或許我很難體會怎麼用Design Patterns,但是我想我會很樂意的使用Refactoring來學會Design Patterns,這時候就不得不提到 "重構-向範式前進(Refactoring to Patterns)",我還沒閱讀,但是我覺得或許是一個行的通的閱讀。

還有很多想提的沒有提及,就下次再說吧。

---
好長的一篇XD

星期三, 7月 23, 2008

無言

繼主機掛點之後,螢幕(Benq FP71Q+)又壞了,跟上一次死在同一個錯誤,螢幕的開關壞了,距離上一次送修一年多。

我的桌上型電腦大概整組壞完了...有一種懶的修的衝動...

---
有一種很衰的感覺...Orz

星期日, 7月 20, 2008

程式與人生

原本想要回彰中講Generic Programming的,不小心講成這個XD

只能說自己在認識的人面前都會爆走,顯然是一個不太好的現象,講解的主軸還是GP,不過中間穿插了許多小故事,也講解了許多自己的想法,我想在這個blog再講一次。

我遇到許多人都跟我說要努力達成某件事,但是只有少數人能達到,沒到的人不是沒有這樣子想。
如果想要對自己構成某件改變,不改變自己的生活形態是不可能的,如果只有想一想之後,生活仍然一模一樣,我想不會有什麼改變。

要認真是一件好事,我想以後如果有類似問題,我會這樣子回答的。

---
所以我連NFS都戒掉了XD

星期五, 7月 18, 2008

表達

以前可以暢所欲言的我,似乎漸漸的消失。或許因為知道世界之大而安靜,保持更好的觀察與學習能力,在前進。

明天準備回去講我忘的差不多泛型程式設計,今天因為颱風只有中部停止上班上課。想一想還是頗要有趣的,一般都是其他地方停課的。還是說我可以就此偷懶,讓他們今天的上明天的課XD 不過人得認清現實,有這麼好嗎XD

時間充足的狀況下,我蠻願意準備這堂課給大家的。

---
似乎不會有時間充足的狀況

星期四, 7月 17, 2008

電腦

我的桌上型電腦掛的差不多了。

現在想想,這台當初升大一買的時候,可是一個不錯的配備,Athlon64 3500 + 1 GB DDR + Geforce 6200,在這台寫程式,著實十分快樂(不過那時候寫的程式老實說也不吃重),但是大一心情不好的時候,每天拿它來跑Need For Speed: Most Wanted跑到顯卡熱當為止,到大二之後,就不會這麼操了(和efang在一起了,沒時間玩XD),現在想想,大一操這麼兇的電腦,不掛也困難。

這個學期當機頻傳,不是顯示卡出錯,就是記憶體掛掉,昨天徹底掛點,開機時連逼聲都沒有,初步推測,主機板掛了,記憶體掛了一條(學弟幫忙測試得到的結果),顯卡應該也差不多了。想想,以前電腦掛掉,就會很有活力的自己下海測試,換零件,直到好為止,漸漸的,我只是想安心的寫程式,這學期用MB的時間非常長,所以連這台什麼時候掛的,我都不甚清楚,想想也甚為慚愧,疏於照顧自己的電腦,電腦也不太可能會乖乖幫你忙。

或許暫時還是以MB為主工作,等比賽比完,再來好好的修理它,總是要盡心盡力照顧好每一台電腦的。

---
感觸良多。

星期六, 7月 12, 2008

男人

Clara: 朋友問,男人都用下半身思考嗎?
yen3: 是啊,但是大部分有色無膽。

---
(茶)

乖乖

看了Zerolex的blog,我明天去買一包乖乖回來放好了。

乖乖傳奇

今天順利的和eating把GUI相關部分取得一個初步成果,接下來還是得忙自己的事了,efang回家,很多事在暑假得適應。明天還有事要做,得買兩本書,還好都不是自己買的XD。

---
研究 pkizzy 中。

星期五, 7月 11, 2008

Visual Studio + svn

Visual Studio .net 2005 or 2008 雖有 Team Suite 協助做版本控制,但是並不是一個非常好的選擇,當然,Team Suite(2008稱為Team System)還包括版本控制以外的功能,例如說可以做單元測試(Unit Class Test),等等之類的,由於Team Suite太肥了,我決定還是朝向軟體來協助。最主要的原因,要做到Team Suite的版本控制,Server端要裝Windows Server 2003,什麼鬼...Orz

Subversion(svn) 在 OpenSource 界是一個非常常用的工具,如果在純Windows的環境下,伺服器端,可以使用Apache + svn,是一個不錯的選擇。也可使用IIS + VisualSvn,網路上可以爬文,我就不再多廢話,我是使用後者(因為Server原本就有裝IIS,不想相衝)。

在Visual Studio .net 2005, 2008,皆可使用 Ankhsvn,這個軟體為一個plug-in的形式存在於Visual Studio中,不過並不是那麼穩定,可以使用TortoiseSVN來做為輔助(雖然大部分的狀況下他比前者還重要XD)。

如何讓很多人用在Visual Studio 用svn寫同一個專案,我試出來的方法為,先讓其中一個人建好project,用svn上傳之後,其他人先用TrotoiseSVN下載下來,之後直接開啟裡面的專案檔,在Visual Studio裡面即可設定好,可直接Commit,非常方便,不建議使用Anksvn來做設定新專案的動作,通常會有一些奇怪的事發生。

設定好了,大家可以快樂的使用svn來寫同一個專案了。

---
為什麼我覺得這篇的口氣很怪啊...Orz

星期四, 7月 10, 2008

最近

其實很多事很難以解決,明明每天都忙到很晚,感覺上總是沒什麼進度。或許只能說自己太久沒有上緊發條了。

Qt其實是一個很有趣的東西,我建議自己的學弟去學習,我自己還是在Google Static Map API上打轉,pre-fetch map其實有很多事可以考慮,可以試試。

開始閱讀和運動習慣,算了,想到再寫,超多事可以寫的,下筆此刻竟一個思緒也無。

---
無狀態

星期三, 7月 02, 2008

架構

人跟人之間的問題果然非常難,還是生程式架構比較簡單...Orz

---
雖然這次要生的架構也超難就是了

星期一, 6月 30, 2008

新工作環境


這幾天一直忙著趕期末project,今天算是稍微告一段落,跟Clara借來相機照一下自己的工作環境,大概暑假都會在此定居了。

目前只差床墊了,明天就會有嘍。

---
持續寫程式~

星期日, 6月 29, 2008

今日

我決定叫自己 Event-Driven Yen3。

---
狀況還蠻像的