演算法概論 – 交大修課心得

computer

課程資料

演算法概論

開課:蔡錫鈞老師

修課年度:99資工系

這門課所使用的教科書是:《Introduction to Algorithms》,教到的主題大約為:

上課方式

使用投影片上課,作業通常得在上課前交,不接受遲交。所有的作業都會公佈在網頁上(在課堂公佈前就貼上課程網站了)投影片上有很多註解,有別班的同學說他自己覺得比他們班的投影片好理解,不妨參考:〈課程投影片〉

評分方式

成績主要由期中、期末考,手寫及程式作業,以及上機考所決定。不點名,作業會抓抄襲,

小道消息指出,程式作業會搜尋一下網路看你是否直接下載別人的程式。

期中考分數分布:

分數 人數
00∼ 09分 0 人
10∼ 19分 1 人
20∼ 29分 6 人
30∼ 39分 6 人
40∼ 49分 10 人
50∼ 59分 11 人
60∼ 69分 4 人
70∼ 79分 5 人
80∼ 89分 2 人
90~ 99分 1 人

考試作業

雖然老師一直強調注重實做的能力,認為修這班的學生一定要寫 code,不過覺得程式作業其實沒有想像中繁雜。(至少跟先前修吳育松老師的資料結構比起來,感覺 coding 時間少了很多)

第一個程式作業是實做 merge sort 和 heap sort。第二個是實做 Exercise 9.3-8:在 O(lg n) 時間找出兩個 sorted array 的中位數。第三個作業是修改老師寫到一半的程式碼,實做 chained hash table (事實上只要改數行)。第四個是 DP 有關的三個題目。第五個是實做 Huffman codes 並且作成一個可以壓縮和解壓縮檔案的程式(需要 demo)。第六個是實做跟 Maximum-flow 有關的題目以及跟 A* search algorithm 有關的題目。

大體上除了第五個作業外,都是純粹演算法的題目,而沒有很多實做的細節,所以通常在一百行內就結束,最長也差不多兩百多行。只是有些題目到底要怎麼套用演算法可能需要深切的思考跟那種沒有複雜演算法但實做起來要花很多時間的 project 大不相同。

而手寫的題目大多是證明題,助教對證明嚴謹度十分要求。由於課本後面的解答大多忽略很多細節,所以直接照著寫一定是會被扣分的。(就算用老師公佈的解答寫在期中考上也會被扣分,筆者親身經歷。)筆者覺得寫手寫作業的時間比 coding 長很多。

題外話,在這堂課的訓練之下,寫到後來慢慢自己對嚴謹度的要求也愈來愈高。像是這題:

16.3-7

Generalize Huffman’s algorithm to ternary codewords (i.e., codewords using the symbols 0, 1, and 2), and prove that it yields optimal ternary codes.

筆者為了達到十足的嚴謹度,足足寫了 A4 紙兩面半才證完。(雖然我覺得應該不可能要寫到這種地步才能拿滿分,並且數學好的人說不定可以用短一點又嚴謹的方法證明它吧)

考試方面有期中考和期末考,幾乎都是考考古題,主要仍以證明為主,少部份是操作演算法

還有一兩題是手寫短程式。

還有一個期中上機考,幾乎都是考作業題,如果上機考不好,最後還有個上機補考。

結語

演算法是資工最核心的學科之一,沒事可以多讀讀 Introduction to Algorithms。如果對 online judge 形式的作業不熟悉可以參考:〈基礎程式設計〉。學校的網站上有很多題目可供練習,未來應該會有很多課都採用此一介面來交作業及考試。

想看一下演算法的介紹可參考:演算法筆記

數位電路實驗 – 交大修課心得

electronics

課程資料

數位電路實驗

開課:陳健老師

修課年度:99資工系

這門課是教如何利用 Verilog 硬體描述語言來設計數位電路。感覺前半段很偏向數位電路設計的部份,一直關注 gate level。接著主要的主題是 finite-state machine。後來上機課開始使用 FPGA ,透過 Verilog 來設計並合成許多遊戲類的電路。最後上課的內容則是 coding style,debug 經驗談,以及一些 Intel 設計 CPU 的小故事等等。

主要教科書是《Digital Design》,但大體上除了最後有一個作業以外,幾乎是不會用上。不過感覺裡頭的 Verilog 練習題應該能提供不錯的訓練(寫完該作業後的心得)。

參考教科書有數本

  1. 《Verilog HDL》
  2. 《The Verilog Hardware Description Language》
  3. 《Verilog HDL Synthesis, A Practical Primer》

我看過的有第一和第三本,第一本是相當不錯的 Verilog 語言教材,第三本有些枯燥,不過看完對合成能有更多了解。基本上每本書內容都不多,Verilog 語言的語法會用到的部份其實是相當的少。

其他關於數位電路實驗的議題可參考:〈數位電路實驗〉

上課方式

上課是用投影片教學,一部分是《Digital Design》 的投影片,另一部分據稱是據稱是 MIT 的講義。最後還會有另一系列的投影片後來才出現。

助教會在上課時先公佈下週要 demo 的作業。而晚上是上機課,要在下課前 demo 上週派的作業。

考試作業

這學期的上機有 10 個:

Lab 0 是熟悉 Xilinx ISE 軟體的使用,只要複製助教的 code 即可。

Lab 1 是熟悉 FPGA 板的使用,它看起來很像一般的網路卡等等,上面有 LED 燈、按鈕、還有螢幕、滑鼠、鍵盤接頭。用上面的開關當作輸入,LED 當作輸出,實做一個 2-bit decoder。剛拿到板子真的很興奮,和跑軟體模擬感覺大不同。

Lab 2 是要用 gate level (直接用 and, or, not 等 gates) 來設計一個 4-bit comparator。

Lab 3 是做一個 Stack,和另一班的範例很像。

Lab 4 是用板子的 LED 燈顯示各種不同的閃燈,還可以切換速度!這裡一直遇到板子的問題,按鈕常常沒有反應,一直要換板子,懷疑怎麼有那麼多壞板子。到後來的 lab 6 助教提供 ucf 設定檔後,才不易再遇到同樣問題。

Lab 5 是撲克牌遊戲機,抽排比大小,用軟體模擬的方式檢查是否正確。

Lab 6 則是把 lab 5 小小修改使其可以合成到 FPGA 板上,讓兩個人能抽牌比大小。用板上的 LED 燈顯示排大小和勝負,用板上的按鈕決定是否抽牌。其實玩比大小也可以玩得很開心。

Lab 7 是利用板子上的旋鈕和 VGA 接頭,在螢幕上輸出一個可被旋鈕控制的圓圈。旋鈕的輸入助教都幫我們寫好了,只要直接讀取它的值就知道是左轉還是右轉。螢幕的輸出也是,只要讀取就能知道目前的座標,再給該座標應該輸出什麼顏色就行了。

VGA 的原理可參考〈Pong Game〉

Lab 8 是 OOXX 遊戲,也是透過螢幕輸出。這次最主要的主題是如何從 ROM 中讀取圈和叉的圖像並輸出至正確的位置。

Lab 9 是打磚塊遊戲。將之前 labs 所有技巧都用上,總分加倍,很多 bonus 的最後專題。

筆者當初的期末專題打磚塊遊戲已開放原始碼於 ArkanoidOnVerilog @ github,其中也包含了我們整個修改的歷史,歡迎參考。

考試方面有三次上機考,第一次上機是用 gate level 寫,考你如何把複雜的邏輯化簡成容易實做的邏輯。(會這麼說是因為筆者覺得時間非常短,光打字就很趕了)第二次上機難度降低,是 State Machine。第三次上機考的比較久,是用 FPGA 板,考 VGA 的使用,也是寫遊戲。

除此之外還有紙筆測驗期中考。期中考意外的出了很多算的上是「數位電路設計」那堂課的範疇,像是 State transition table 等等。本來有期末考,但取消了。

期末時派了幾題 Digital Design 課本的 Verilog 習題,老實說不是很好寫,我幾乎花了寫打磚塊一半的時間才完成。上課曾經小考過一還兩次,還有幾次是寫建議問題算是點名吧。

結語

有時有外籍生問老師問題後老師就會維持用英語授課一段時間,大家都會心一笑。偶而有小考或寫問題心得不會事先通知。

感覺修數位電路設計的時候就順便玩玩 Xilinx ISE 好像也不錯,在網站上就可以下載了:〈Xilinx Downloads〉

這門課要讀的東西不多但寫作業很花時間。實做類的課程就是多練習就有進步。

交通安全與生命教育 – 交大修課心得

traffic

課程資料

交通安全與生命教育

開課:吳宗修老師

修課年度:99通識

上課內容包含交通法規常識、如何保命、如何在交通事故中佔有有利的法律地位。還有持續的叮嚀:不要開快車、不要開快車、不要開快車。

「不急不急,天堂會等你」

〈吳宗修的交通安全與生命教育 理論與實務的完美結合〉

Driving is serious business.

When you are in driving, you are in danger.

有時會看到頗為驚悚的畫面,讓人心生警惕。

上課方式

看影片,有些是交通宣導廣告,也有一些行車紀錄畫面。此外還有老師針對影片的補充說明及閒聊。發作業後會抽同學上來講自己寫的東西,然後老師會據此補充講解。自己覺得上起課來十分沉悶。

評分方式

這門課沒有考試,不過有十個作業。

  1. 節錄三則交通事故報導,並重點摘錄與分析原因
  2. 撰寫自己曾遇過的交通工具故障經驗,這事件對你造成什麼影響?
  3. 紀錄馬路用路人行為
  4. 寫出五個開快車的理由,並分析是否值得。
  5. 勸導三名行經清華夜市未走天橋及斑馬線而直接穿越馬路的路人,並作成紀錄。向五名親友說明走天橋的理由。
  6. 訪問出車禍的親友,做成報告。
  7. 手寫千字以上文章,宣導生活中需注意交通知識的重要性。
  8. 如果你在車禍中喪生,你的親友會怎麼反應,有何改變?嚴肅的撰寫一篇文章探討。
  9. 至法院旁聽交通開庭,並撰寫心得。
  10. 上完課的心得與建議,對什麼影片印象深刻?這門課以後可以出些什麼作業?你想和以後的修課者說什麼(三百字以上)的話?

Bonus:投書至市政府反應一則交通意見,加總分2分。

我把一部分的作業放上來供大家參考:

根據多位同學的經驗,想要得高分,內容要豐富,字數不能少。把內容寫多就有機會9x分。此外,除手寫作文外,繳交格式皆為A4紙,多張時要訂好,否則會被扣分。筆者每次作業大概寫1~3張,分數約落在70~85。最後的期末成績為90。

老師會按座位表點名,據稱上課如果睡覺或做別的事會被登記。(似乎有作業分數高但總分比認真同學低的案例)上課嚴禁手機響起,否則會被當,若不幸響起聽聞有寫報告補救方案。此外不得食用零食飲料,中堂不下課,不過似乎可自行走出教室。

結語

我就從期末心得中節錄吧:

交通安全這堂課,可以學到一些很有價值的交通知識。老師很用心的想教會我們一些像是防衛性駕駛的觀念。不僅長常識,還能保命,謹記老師的話:「不急不急,天堂會等你。」可以避免發生不必要的交通事故,同時,還會學到一些發生事故時的處理方法,以後就不會手忙腳亂。

上課時主要是看各種交通宣導影片還有聽老師講解交通知識和一些事故案例。這門課的作業皆為書面,其中比較特別的是要去旁聽法院交通庭、到清大夜市勸阻不走斑馬線的行人,還有一個手寫的千字作文。

注意作業不要遲交,否則會扣分,就算你晚進教室也應該一進來就繳交,不要等到下課。並且紙張須使用固定的格式,不可使用任意大小。另外要注意的事項是不要在教室中飲食以及請把手機關機。

分享一下參觀法庭的經驗,想知道何時有開交通庭可以上新竹地方法院網站上的庭期查詢,而要進入法庭非常自由,只要直接走進去就好了,要離開時也是一樣。不過要注意不能喧嘩,手機最好也關機。

身處交通大學,怎可不修交通安全?十分推薦學弟妹來修這堂課。

作業系統概論 – 交大修課心得

computer

課程資料

作業系統概論

開課:黃世昆老師

修課年度:99資工系

課本是 《Operating System Concepts》

上課方式

這堂課的價值主要偏實做。上課主要是用投影片講解,有時老師會講 Linus 的故事。

評分方式

這學期老師只有點一次名,不過有算分。以前聽說這堂課有很多 lab, Bonus 可以做,到了期中,就有人已經 8x 了,還說學期末有六個人 100,不過這學期盛況不再, Bonus 只剩兩個。

即使如此,作業依然不少,確實可以學到許多。像是 user thread scheduler 若不是修這堂課,我大概也不會有機會寫吧。

bonus 佔 10 分,所以作業考試和 bonus 加一加,分數上限是 110 分。學期末還有調分,最後有及格的人的平均是 81。

考試作業

老師好像蠻喜歡 Linux 而不是 Windows,所以許多作業主要在 Linux 上進行。這學期有三個 online judge 的作業,越早寫完,寫出題數愈多,分數愈高。除了把題目解出來外,每份作業還要另外寫一份報告解釋自己的作法並附上相關討論。

第一個是要寫一個小型的 online judge 去 judge 老師的程式,主要是要透過 fork 執行程式並想辦法取得子程式的資源使用,及輸出入的重導。

第二個是一般基礎程設的題目:〈2009-04: On Disk Scheduling〉,相對而言比較簡單。

第三個是用 makecontext/setcontext/getcontext/swapcontext 實做 thread scheduler:〈OS-0002: A user thread scheduler〉。這個作業不太好想,一開始為了搞清楚題意費了不少心思,寫好的第一個版本異常複雜,後來跟同學討論才想出較簡單的寫法。

除此之外,還有一些程式作業:有一個是要寫個程式製造 zombie process,並寫個報告說明什麼是 zombie process。還有一個是要用 C++ 配合 pthread, semaphore 實做 monitor。還有一個是要寫程式印出在 stack, heap 等等的變數及 functions 的記憶體位址,並比較與/proc/xxx/maps 的關係。

最後還有兩個 Bonus:

第一個是要用虛擬機 (ex. VirtualBox)安裝任一 Linux,並且加入自訂 system call 重新編譯核心,同時要寫一份報告及 demo system call 的使用。

推薦使用 Ubuntu,無論是安裝,編譯核心,加 system call,網路上都有 step by step 的教學。(因為版本會一直更新,所以這裡就不附連結了)安裝起來並不困難,只要一直按下一步就好了,如果有修過 SA 的,一定會很感動,他跟 FreeBSD 比真是天壤之別。

第二個是要取得 child process 的記憶體使用量的資訊(實際上為了完成 onilne judge hw1,本來就一定要完成這件事。)

我有把自己的報告和作業程式碼放在 github 上,可供參考:

考試方面,一共有三次期中考,老師都會給考古題,雖然會考很多新東西。

第一次考試,是到系計中線上考試,題型主要是選擇、填充等等。有一些記憶和觀念的問題,也有計算題。還有一些老師說是常識。第二次難度加深,還出了一題佔分 25 的程式題,是作業 monitor 的延伸。第三次改成紙筆考試,考得又更難了一些,計算題比重變得很高,尤其出了 page replacement 的題目。這題雖然在老師給的考古題就有出現,不過計算起來相當耗時。看到他的一瞬間,就直覺認為這份考卷要寫完很難。

結語

因為很多人作業寫不完的緣故,所以作業的 deadline 一直在延。我也在期末堆了四份報告和一份 online judge 沒寫,結果寒假第一個禮拜幾乎都在寫 OS 作業 囧

老師寄來的信,說話總是很客氣。

Bonus 中要裝的 Linux 真的推薦用 Ubuntu,我自己電腦上的主要作業系統就是灌 Ubuntu,反而 Windows 7 才是裝在虛擬機裡。感覺最方便的就是,不管是要寫 Java, Perl, Pthyon, Lisp, 還是 Prolog,執行環境都是直接用內建的套件管理員就可以輕鬆裝好。而且他上面又有很多方便的程式開發工具。

我都用 Vim 寫程式、gcc 編譯、gdb 除錯、git 管理程式碼。特別是 gdb,介紹給幾個人後,他們都覺得很棒,推薦大家可以試試看。

另外介紹一個工具叫 valgrind 是我上吳育松老師的資料結構時得知的。在除錯用 pthread 寫的 multithreaded 程式時,valgrind 和 gdb 真是配合的天衣無縫。我寫 monitor 作業時,他們真的幫助良多,否則我真不知要除錯多久。

延伸閱讀

p.s. 這篇文章裡提到的工具,有些也可在 Windows 上使用,在資工系計中甚至資訊服務中心的工作站上也都有,大家可以試試看。

電路與電子學 – 交大修課心得

electronics

課程資料

電路與電子學

開課:林正中老師

修課年度:99資工系

教的內容有:

  • KVL and KCL
  • RL, RC, RLC and LC Circuits
  • Sinusoidal Steady States Analysis
  • Phasor Notation
  • Laplace Transform
  • Circuits Analysis in S-Domain, W-Domain, t-Domain
  • OPAMPs

上課主要的內容是從這本書出來的:《 Electric Circuits》 , 6th ed / Nilsson, James William。這本書圖書館有異常多本,除非大家突然都跑去借,否則每次去圖書館唸書時,直接從書架上拿下來就可以放心的看了。

我一開始還不知道所以自己買了一本,甚至還向浩然推薦了最新的第九版呢(差別就是色彩插圖鮮艷,讀起來心情好 (?)

老師最後教的 op-amp 雖然貌似 Electric Circuits 裡也有提到,不過可以看出形式上比較像是從下面這本書出來的:《 Microelectronic circuits》 / Adel S. Sedra, Kenneth C. Smith.

這本書本來我記得浩然好像有電子書的,不知道為什麼現在去查查不到,可能記錯了吧。雖然記錄上,這本也有很多本,不過多是已報銷、己遺失。還滿熱門的,要借要碰點運氣。

老師最後教的很快,有些觀念我也是看了這本書才清楚,雖然這學期只有考了這本書第二章的一部分,還是可以看一看。

雖然老師已經有很多東西來不及教了,感覺這一學期以來有很多東西還是沒讀透,要是有機會重來,我認為這科應該要事先預習才是。

後來這個老師比較少再開這堂課,且其他老師的上課風格非常不同,故本文僅是對過去做點紀錄。

上課方式

老師主要是寫黑板,然後大家抄筆記。一開始上課的進度其實不是很好抓,常常會在各章節跳來跳去的,一開始大家大概都還沒進入狀況吧。

老師說,他很不喜歡直接告訴同學那一章會考,那一章不會。老師會期待同學回去時自己要看課本。基本上老師不會點名,一次上兩堂課的時候中間不下課。

上課時如果回答問題,或者找到老師的錯有加分。一開始還有只要回答問題之後,可以不用考第一次試,自動計為全班最高呢!最後也有一回答就可以不用考最後三次試的,但最後改成計為自己考的最高的一次。

有時老師會出一些題目說如果寫 A4 紙交上來會有加分。有一次是說要寫 MATLAB 的使用心得,以後可以在學弟妹間流傳,成為傳說本來想要寫,卻忘了…

考試作業

這學期考了六次試,沒有其他作業,在課程網站上有以前的考古題。老師說以前考試不是在上課考,好像反應不太好,所以這學期就都是在上課時間考試,可能是因為這樣所以進度跟之前比起來少了很多。

雖然這堂課叫做電路與電子學,實際上幾乎只教了電路學。期末的最後兩次小考擠在同一個禮拜,進度蠻趕的。一學期考下來,可以發現:如果老師考了一次電路的話,通常會以同樣的題型再考一次二次電路。

書上的習題大多是有數字,老師的考題則是全部以未知數來表示,一開始可能會不太習慣。

結語

個人一直沒有抄筆記的習慣,一開始一直不太跟的上老師的上課方式。第一次考試時雖然只是勉強及格但是還沒有太大的警覺心,第二次考試考得非常的糟,才想到應該要好好的解決這個問題。

記得當初立下心願說要把剩下的小考全拿滿分(雖然沒有達到),還要自己自修微分方程(雖然結果只看了第一章),不過大體上還是有救上來。採用的方法就是多看課本,加上把之前考卷每次都重解一次。

某次上課時老師突然教了課本上比較之前的進度,也讓我意外的發現了比較適合自己的上課方法:有時老師上的頗快,跟不太上,就會變成只是抄筆記,而完全沒有思考。所以呢,在上課前最好先看過課本,事先讀過老師會教的部份(可惜由於無法掌握老師的進度,所以要做到這點,可能得大幅超越進度才行)。

再來,當上課老師開始解題時,最好跟著老師一起解,並且想辦法解的比老師快。如此一來,就可以輕易搶到一部分的加分題,而且寫題目也有助於提高專心程度。同時老師上課的題目也很可能是考題,事先練習應有幫助。

雖然一開始考的幾次試根本可以說就是在解微分方程,不過應該只是基礎的,課本裡也都有教。個人經驗,即使沒有修微分方程也應該不會有太大影響。

下課問老師問題時,老師都會熱心回答,記得有次因為出國的關係向老師請了兩個禮拜的假,老師一口就答應了,真的很感謝老師。

還記得倒數第二次考試的時候,考前和同學討論時才突然發現自己竟然沒有把前一張考卷重新寫過,考卷一發下來,發現果然是類似的題型。不知為何,那時的心情很煩躁,把該拿到的題目都寫完後,突然就沒有動力去解其他難題了。就這樣吧,我想。早早交了考卷,就回去讀別科了。或許吧,或許…當我有這種想法的瞬間,我就已經輸了呢._.

老師在考卷上都會寫一些打氣的話,記得有次上課回答問題,他也很誇獎我。感覺自己這樣很對不起老師 QAQ

題外話,因為這堂課,認識了很多上進用功的同學,覺得自己也有被激勵的感覺,一定要繼續努力加油 0.0/

計算機系統管理 – 交大修課心得

server-room

課程資料

計算機系統管理

開課:由多名助教上課

修課年度:99資工系

課程大概就是 FreeBSD 各種運用:安裝 FreeBSD編譯核心使用者管理怎麼架 FTP怎麼在 Windows 和 FreeBSD 間分享資料夾寫腳本過濾文字資料安裝網頁伺服器、架 blog、NFS 檔案系統分享,還有一些 OS 的基礎知識:Unix 檔案系統process 的概念、開機程序、硬體。

所有的講解檔都在課程網站上,而幾乎所有內容在 〈FreeBSD Handbook〉 上都有更詳盡的介紹。

評分方式

實際是由幾個助教上課,使用投影片上課,整堂課的重心其實是在作業上。正如課程網頁上的佔分比例暗示,是一門重實作的課:

  • Midterm: 15 ~ 20%
  • Final: 15 ~ 20%
  • Excercises + HWKs: 60 ~ 70%
  • Presentation and research strength: 0 ~ 10%

基本上是不會點名。

考試作業

考試的部分,有期中考和期末考,都是 open book,大家都把上課講義全印了出來,個人也印了好厚一疊,期末全變成計算紙。據說後來有改成可以攜帶電子檔案,不過筆者沒有特別確認。

期中考題大多是簡答題,期末的時候,考題竟都是選擇和填充,還有個佔分 100 的心得、意見呢!當時的期中考有很多都是從考古題出題,但困難度很高,期末考則幾乎是新的題目但十分簡易。無論紙筆考成績如何,似乎如果作業高分,期末成績也會很高分。

這學期的作業有 5 個,除了基本分外,幾乎每個作業都有額外加分,也就是說只要肯做,就有分數。

第一個作業是要安裝 FreeBSD 作業系統,並且編譯 kernel,然後再透過 ports 從原始碼安裝圖形介面的桌面環境。

這個作業實際上是最容易遇到問題,也花費最多時間的。可以想像為什麼要把這樣的作業放在期初,因為後期大概不會有那麼多的時間可以花在同一科上。可是或許也因為這樣,期中時嚇跑不少人吧…

第一個作業吃掉了我的許多週末,因為某個要求要使用實體機比較容易達成,所以我是直接灌在電腦上。雖然我在暑假時,就有透過 2009 年的課程網頁先預習過安裝 FreeBSD (那時我是安裝在虛擬機上),真正做時,還是遇到了意想不到的問題…(見最後的心得)

第一個作業交出去之後,我馬上用虛擬機(VirtualBox)再重灌了一個 FreeBSD,事後也證明這個作法是正確的。

第二個作業是架 FTP,還有用 samba 設定分享給 windows 的資料夾,還有神奇的 ZFS ,和自動監控資料夾幫你載 BT。這份作業要求大多要在網路上搜尋一陣,才能找到寫法。

第三個作業是 shell scripting:寫一個搜尋 Wikipedia 並擷取文章的腳本,還有分析 IP 登入資訊的腳本等等。

看完了講義之後,最主要的就是要熟悉 awk,這份網頁給我幫助很大: 〈Awk〉,接下來考驗的就是寫程式的能力了。

第四個作業主要就是架 blog 還有 HTTPS 的建置,大部分在 FreeBSD Handbook 上都有詳盡解釋,只要照做即可,小部份當然還是要 Google。

第五個作業是 NFS+NIS,就像資工系計中的工作站一樣,要在不同機器登入都共享同一個家目錄 (NFS),然後可以用一樣的帳號登入多台機器 (NIS)。

這份作業需要三台機器,是由1~3個人共同完成。這裡幾乎全部的步驟只要照 Handbook 和上課簡報即可完成,只是因為我和組員住在不同宿舍,要跨網段比較困難,最後實在趕不及,所以決定全部都放在一個網段裡才趕出來。

結語

這門課真的要花不少心思,由於會接觸到很多新指令,不太可能全部都記起來,一定要一直查他的 manual pages (man)

一開始編譯核心時,偶爾會遇到很奇怪的問題,非得使用搜尋引擎,才能在茫茫網海中撈出解法。作業有的要求是上課講義不會寫的,也是要使用 Google 才有答案,這大概就是為何配分中有個 research strength 吧。

以一位友人在版上問的問題為例,他的問題是,使用了 /etc/fstab 設定在開機時自動掛載 NTFS 格式的 Windows 硬碟,卻因為不明原因無法開機了。這問題一時之間也看不出解法,於是我就使用了 Google 來搜尋答案:(注意在中文版界面和英文版界面的搜尋結果可能會不一樣,此例中我想搜尋的是英文資料,故使用的是英文版本)

一開始我下的關鍵字是「freebsd fstab ntfs cannot boot」。雖然確實找到一些看似有用的訊息,但實際看過一遍,似乎都不是解答,於是我又試了「freebsd mount ntfs cannot boot」,再試了「freebsd ntfs fstab」

最後終於找到關鍵文章,在〈mount ntfs (windows) file system in /etc/fstab fails at boot〉文章中提到的,很可能就是問題所在。

雖然網路上已經有不少笑話文章來說明搜尋的重要性,像是〈為什麼一定要我幫你 Google?〉,不過說正經的,透過搜尋引擎,我們可以把整個網路資源納為己用,個人以為,搜尋能力,確實是很重要很核心的能力。若有心學習,這裡有篇使用 Google 的教學,或許會有幫助:Google Guide

我其實是哪種遇到問題會很堅持要找出解答的人,一開始作業1的時候,我遇到了非常奇怪的問題。為了解決這個問題,我用不同方法重灌系統兩三次、對記憶體做了詳細檢查,還另外用 Ubuntu 測試編譯核心,想盡各種方法,查遍網路資料,最後重割硬碟才終於解決。

想當年我還小的時候啊,曾經因為不能執行某個很有趣的小遊戲(小朋友其打交1),想說會不會是下載的來源有問題,就一直在網路上搜尋各種下載點,整整找了一整天,最後才終於承認是自己電腦的問題,或許那些幼稚的曾經也多少對我的搜尋能力有點小小幫助吧 orz。

雖然這門課的作業確實有點重,但也因為這些作業,使得 SA 比任何一門課都更能測試與磨練解決問題以及學習的能力。有心想修的同學可以透過課程網頁開始自行預習和做作業,相信一定會有不少收獲。

延伸閱讀

這本書是這堂課教科書的最新版,學期初就向浩然推薦這本書,最後終於進了。個人是沒有看完,覺得如果沒有特別接觸過 Unix/Linux 的話,把這本當故事書看過一遍或許可以稍微對 SA 這堂課有較大概的認知。

不過這本書在作業上或是考試都不是絕對必要的,個人經驗,它在期中考也不過是幫到我一題罷了。 * 《 Beginning Linux Programming》

這本書有一章提到 Shell Programming。我看了好多年,結果一直到修了 SA 才真正寫了 shell script,由此可知學分的驅策力還是有幫助的。 * 《 Learning the vi and Vim Editors》

雖然他和 SA 沒有直接相關,不過在操作 FreeBSD 的時候常常會使用 command line

這時一個好的文字編輯器常可以替你節省很多時間,個人喜歡使用 Vim,所以推薦這本書。 * 《 The Complete FreeBSD》

這本書滿舊的,但是它是我唯一找到內附大量 man pages 的書。期中期末 Open book 首選用書。(只可惜他舊到內容可能不符現狀的地步) * FreeBSD Handbook:非常非常重要,從第一份作業,甚至到最後的 Term Project,這裡幾乎都有細詳解說。 * Awk - A Tutorial and Introduction * HOWTO: Setup a Pure-FTPd server with virtual users * x11vnc: a VNC server for real X displays

計算機科學概論 – 交大修課心得

computer

課程資料

計算機科學概論(英語授課)

開課:胡毓志老師

修課年度:98資工系

使用的課本是 《Computer Science an Overview》,按照課本順序,中規中矩的上課。

最後的時候,老師跳過了很多章節,像 Software Engineering, Database(他說別的課會教),然後花了幾節課教人工智慧的部份(好像是他的專長?)。

評分方式

三次小考+期中期末考,考試內容大多都是課本內容,如果有把作業確實寫完,應該可以應付。

這學期有六次作業,都是課本習題,跟別班的各式 Projcet 比起來算是輕鬆很多。

最後的期末考總分很高,以至於有不少人學期原始成績超過100。老師還寄了一封信特地解釋要把分數調成 99。

不點名,所以可以不出席,不過一些作業之類的消息只有上課時會說。

老師不喜歡同學上課聊天,會停下來提醒說話的同學。還有作業不能遲交,超過期限就不收了。老師一開始會說一些規定,都是一定要遵守的(像是作業格式不對,也不能交,沒有商量餘地)。

結語

好像因為是英語授課不太有人選(真的就是完全英語授課),但是老師的英語還不錯,不會有口音怪怪的問題。這門課感覺非常的平穩,不會有意外的作業或者驚喜。

整個學期由固定的作業小考大考所貫穿,我每個禮拜都花固定的時間看課本,也沒有在期中期末特別準備,感覺上起來非常安心,最後的成績也相當不錯。

微積分 - 交大修課心得

calculator

課程資料

微積分(一)(二)

開課:王夏聲老師

修課年度:98

使用的課本是《Calculus: Early Transcendentals》

上課方式

寫板書,解同學問的問題。

評分方式

沒有期中/期末/習題/點名,不過有時老師會說哪些題目大家可以回去寫寫看。

有多次小考約6~7次(最低分的一次不算),小考不得補考(他說是為了避免影響算分模型的樣子?),評分比例為:全校大會考 30%、小考 70%。最後的學期成績會用一套超難的神祕公式換算,所以相對成績比絕對成績重要。

老師非常注重證明,考試會考很多證明。計算過程也很重要,就算答案錯了也可以拿到一定的分數。

雖然完全不點名,老師也說可以只考試就好(師:現在教室還滿擁擠的,不過接下來情況應該會好一點),不過老師會在上課時洩題… … (大概兩三題,除此之外很難猜題的)

結語

老師人很好,上課規則清楚,loading 可自己決定。我剛上微一的時候試圖把課本習題都全做完,結果失敗。上微二的時候就只寫寫微積分小組的共同習題而已。

修微一的時候我幾乎只有去考試,修微二的時候我大部分都有去,結果微(二)比微(一)高 5 分,不知是否有關聯。

老師上課跳很快,有些觀念可能講的不是很清楚,不可以放過,還是要自己把它搞懂(或者下課問老師)。老師對某部分微積分特別擅長,所以微二的某部分會教的比別班深(這是老師說的,我忘了哪部分了)。

話說大會考的時候我把微積分網站上的所有分類考古題都寫完了(花了我好多天!!!!!),結果還是輸我一個朋友好多分 QQ努力還不夠啊… … 考這麼難… …

不過算算習題還滿有成就感的,大家可以早一點開始算… …

物件導向與程式設計 - 交大修課心得

computer

課程資料

物件導向與程式設計

開課:黃問泙老師

修課年度:98資工系

這堂課的主要內容就是 C++, C++, 完全就是 C++。內容非常的細,也很深,像是:

對,一定要強調「細」這個字。原本通常被書放在最後面的 templates 被放到第一份講義啊!而且有些東西你翻一般的書還看不到呢,我覺得老師應該可以自己出書了。然後,這些很細的東西一定會出現在考試和作業裡

參考用課本有兩本,不過還是以講義為主,並不會直接上裡頭的內容:《C++ Primer》《C++ How to Program》

上課方式

主要是放自己的投影片講課,這學期上課沒有小考。除了上課以外,每週晚上還有一次上機課。在上機課時,每次會出一份作業,助教會先講解,然後就是自由寫作業時間。

然後在快下課時會開始 demo 上一次的作業(所以不能早走)

評分方式

7 次作業、一次期中、一次期末,還有個上機考。

作業的部份就是寫 C++ 程式,演算法幾乎都會給妳,主要是要自己寫 template 和 class,像是自己實做 list/vector/iterator 之類。

期中期末考的觀念大部分都在講義裡有,不過有幾題大概是上課才有講,一晃神考試時就寫不出來了。真的考很細,老師會給考古題,但感覺考得比考古題難。

上機考可以看老師的講義和作業解答的程式碼,而且考出來的內容都很類似,所以只要妳真的有用心寫完作業的話,有些部分只要複製貼上就好了。不過也考了一些要仔細思考才能解答的問題。因為沒有規定演算法,所以我是用暴力解(後來聽同學說正確解法才恍然大悟)。

老師會說一部分會考的題目(說會大概考什麼),作業和上機考有少許的 bonus。上課幾乎沒有點名,就算有也可以攔截的到(他會說等一下下課要點名),不過每次上機都要交作業,所以必須出席。

結語

我個人覺得,他的投影片寫的還算詳細,所以看投影片自學非常合適。不過他上課有點催眠(似乎不管你程度在哪裡這點都是不變的)。

上完這門課你真的可以學到非常多東西,不論你上課有沒有專心,我都建議要課後把他的投影片完全看懂,至少從頭到尾看過一遍,兩遍以上更好,絕對值得。

作業一定要自己寫完,如果在詢問同學/助教之後完成的話,要再從空白開始重打一次作業,這樣可以確認自己完全理解並且記住了,上機考時才不會一片空白。

人工智慧概論 - 交大修課心得

ai

課程資料

人工智慧概論

開課:王才沛老師

修課年度:100資工系

人工智慧,也就是研究如何用電腦實現智慧行為。整個課從 AI 的定義與歷史開始,像是知名的 Turing test,然後簡介一些 Intelligent agent 的基本架構。

接著處理以下課題:

接近期末時會以簡略的方式,快速帶過幾個課題,像是 Uncertainty、Learning 等等。因為老師對 Fuzzy Theorem 有特別的研究,所以最後也帶過一點 Fuzzy Logic (課本好像沒有)。

使用的課本是 《Artificial Intelligence: A Modern Approach》。這本課本雖然不難讀不過文字很多,而且很大一本,所以要讀完恐怕不容易。

AI 使用到的搜尋演算法如果在之前的演算法概論有些基礎的話應該會有幫助。

上課方式

老師是用投影片上課,自己覺得上課的風格比較隨興而非組織性的,老師很希望可以跟同學互動,所以有時會花不少時間找很多同學回答問題。老師也很希望有同學問他問題,像有一次我在課堂上和他討論了許久,他好像滿高興的。

不過如果寄 email 給老師的話,雖然據說老師都有在看,不過幾乎不會回信,所以若要問老師問題還是面對面比較好。

平常不點名,但好像有一次點名加分(其實我總覺得有兩次點名,不過最後成績只有一次)。

評分方式

成績的計算方式為:

  • 期中考+期末考 = 60% (較高分的35%, 較低分的25%)
  • 三次手寫作業 = 10% (取平均)
  • 程式 project 1: 1~8-puzzle = 12% (程式7%,報告5%)
  • 程式 project 2: Dala = 13% (程式競賽結果8%,報告5%)
  • 基本分 = 5%
  • 點名加分 = 2%
  • 調分方式:上述結果相加 = Total (所以最高可拿 105),然後經過公式運算,學期成績為 $latex {(\frac {Total}{100})}^{ \frac{2}{3}}\times100 $,超過 99 者以 99 計算。

老實說每項作業的佔分,還有像是其中報告和程式的佔分都很隨興,是依照同學表現而決定的,而點名感覺也是臨時起意。相信調分法也是最後才決定,原始成績大約47分就能及格。

值得注意的是兩次 projects 的程式和報告幾乎都拿不到滿分(不過第一次因為提早交會有加分,所以可以拿到),可能是因為老師認為永遠都有改進的空間。

考試作業

考試部份最重要的準備是寫老師出的 3 次手寫作業,題目有很高比例是從裡頭出來的,因為當時老師是第一次開課,所以也沒有考古題。課本方面因為文字敘述太多,有點不著邊際,所以在考前相對投資報酬率較小。期末考好像也會考部份期中考的範圍,不過題目不多。

基本上考試不會有意料之外的難題,所以只要有讀就能拿到一定分數,只是有些部份有點繁瑣,可能會有粗心被扣分。

3次手寫作業主要就是寫跟課本習題或範例類似的題型,主要是老師自己出的。

Project 1 是寫一個 1-puzzle ~ 8-puzzle 的解題程式,並比較分析 A* searchIterative deepening depth-first search 等不同演算法的優劣。

8-puzzle 是一個 9x9 方格,上面有 8 個標號為 1~8 數字的方塊和一個空格,要移動方塊直至順序呈 1~8 排列,可參考 15-puzzle 的介紹

1~7-puzzle 則是題目定義的變體,同樣是 9x9 方格,只是上面的方塊分別只有 1~7 塊,故是比較簡單的版本。對這部份的分析有興趣的話可以參考我的報告:〈1~8 Puzzles〉

Project 2 分為1~3人一組,寫一個 AI 去下類似 Dala 的棋,然後讓全班寫的AI互相對戰,依據比賽成績給予程式分數。

這次 project 我花了相當多的心力去完成,尤其一開始私下跟同學對戰的成績並不理想,所以我後來寫了個程式可以自動產生不同參數的子代 AI,然後再互相對戰不斷選出最好的子代,花了我不少時間,詳細的作法可以參考我的報告:〈The Dala Game〉

兩次 projects 的程式碼我都有放在 github 上,可供參考:100-ai

其實我本來想根據 project 2,寫一個簡易的 server 程式供後人繼續把玩這個 AI 遊戲的,不過一直沒有完成。

結語

說真的感覺這堂課普遍的反應其實沒有很好,不過或許是因為第一次開課所以還需要一點時間調整。成績方面因為有神秘調分所以不會太差。程式專題的部份,雖然要真正做好可能得花不少時間,不過即使只做基本要求也能拿到一定分數。

原本學期初程式 projects 的佔分是 50%,後來變成只有 25%,其實讓我有點失望,畢竟我花了不少心力去實做。不過整體來說寫這些程式雖然辛苦,但也滿有趣的。

雖然課本有點難看完,不過其實很有趣,畢竟用電腦創造智慧本來就是個有趣的議題。不禁會想未來到底能發展到何種地步呢?