密碼學概論 – 交大修課心得

padlocks

課程資料

密碼學概論

開課:陳榮傑老師

修課年度:100資工系

探討加密背後的數學原理,如何在第三方可以攔截或假造訊息的情況下,加密訊息以保證僅有信任的人可以得知真正的內容。也會討論延伸的議題如 digital signature, secret sharing 等等。一些相關議題也可參考:〈密碼學概論〉

上課方式

老師會用自己的投影片,配合 Windows 筆記本的手寫講解,再加上課本頁面。平常不點名,只有一次要簽名,不過有事先提醒。由於要實做加密演算法,可能要稍微寫過 C/C++ 程式會較好。另外,若有學過離散數學的話,對 RSA中國餘式定理等等原理也會較熟悉。據說網路安全和電腦安全概論也和此課程有些重疊。老師也常向我們推薦下學期開的橢圓曲線密碼學,是這堂課中部份課題的延伸。這幾門課都是資安學程的課程。

評分方式

評分方式為:

  • Homeworks 25%
  • Midterm 35%
  • Final Exam 40%

作業主要分兩種,一種是紙筆作業,主要是一些計算題,考試大部分的題型都是作業習題,只有改動數字,所以作業值得反覆練習。另一種作業則是程式作業,實做各種加密演算法,透過 E3 繳交之後,助教會逕行批改,不過要一直到期末考結束後才知道自己的分數。似乎有不少人的程式作業分數因不明的原因偏低,不過向助教反應後都有提昇。

據稱每年的程式作業都會選擇不一樣的加密法,不過加密法的演算法老師都會給,這學期實做了 RC4 以及 SHA-1。筆者也把自己的程式碼釋出於 github,可以當作參考:100-crypto

考試方面,有一個期中考和一個期末考。總分都會超過 100 分,題目主要出自習題及考古題,不過也會有新的題目。期末考提前一個星期考完,所以最後一個星期都沒有課。

結語

老師說他本來沒有要教橢圓曲線密碼學,不過後來和助教討論之後,發現這學期同學的成績似乎比較好,所以最後就教了(笑)。筆者比較過兩個學期的期末成績,這學期的高分群真的比較多。

我也研究了一下老師使用的教科書,在上學期使用的是《An Introduction to Mathematical Cryptography》,這學期使用的則是《Cryptography, An Introduction》。後者省略了許多細節,而且完全沒有練習題。前者對數學背景寫得比較詳細,筆者多以那本配合老師的講義使用。不過其實兩本書的內容有些是沒有重疊的。

在課程大綱上特別標記了前者在圖書館有電子書下載,後者則是可自由下載的開放電子書。老師似乎是希望同學可以不用花那麼多錢買教科書。筆者剛開始為了能在上課時參考課本,到影印店影印了課本,不過到後半學期就幾乎沒看,而且整本書有教的部份其實也不多,現在覺得其實沒有影印的必要性。

作業習題和考古題得多做,考試題型大多數都從裡頭出來。

筆者一開始先是閱讀《An Introduction to Mathematical Cryptography》來打底,在上課時一開始是配合影印本,邊聽課、邊查閱資料。期中之後的數個星期,看完了《Intro. to Math Cryptography》,就比較少在課後複習,尤其老師恰巧一直沒派手寫作業,又覺期中這樣有很多考古題的考試型態尚可臨時抱佛腳,或許因此稍微懈怠。課程進入橢圓曲線後,上課便以老師的投影片為主,不再閱讀課本。到了期末時,其實讀起來覺得有點趕,現在想來應該要提前複習投影片才是。

心理疾病介紹 – 交大修課心得

medicines

課程資料

心理疾病介紹

開課:高之梅老師

修課年度:100通識(群己)

介紹各種心理疾病,一開始先簡介各大心理學派及其對心理疾病的解釋,接下來的主題分別是:

  • 焦慮及適應問題 - 畏懼症、恐慌症、強迫症
  • 情緒低落與憂鬱
  • 自我傷害行為
  • 創傷後壓力症候群及災難心裡反應
  • 悲傷與失落
  • 情感性疾患 - 躁鬱
  • 精神分裂症及相關知覺障礙
  • 發展心理問題:人格障礙發展心理問題 - 自閉症、阿茲海默氏症

參考書目為:《變態心理學(修訂版)》,這本書很大一本,我從浩然借來以後,因為難以閱讀,所以很快就還了。由於考試還滿簡單,沒看這本書應該也沒什麼關係。英文版為《Abnormal Psychology》

上課方式

用投影片上課,有時會小點名或者讓同學臨時分組討論。這學期是討論憂鬱症與自我傷害的故事,讓大家分享聽聞過的經驗。我覺得討論的經驗十分有趣。

因為老師語調有點緩慢,上課時有些同學其實在看自己的書。不過有時會播放疾病相關電影,這時大家多會專心觀影,確實有許多精彩橋段。放過的影片有愛你在心口難開、伴我情深、時時刻刻、飛越杜鵑窩等等。

評分方式

評量的方式為:

  • 出席 40%
  • 口頭報告 30%
  • 期末考 30%

平常偶爾會點名,也曾有早到的加分。

在一開始上課時就會請同學自行分組,約 7~8 個人一組。每組要決定報告一種心理疾病,會在接近期末時開始進行各組報告。報告的形式為簡報口頭報告,各組多會配合相關電影講解。

我們這組還演了小劇場 =w=b

報告的氣氛還算和諧,老師不會特別說各組的缺點。

期末考主要是是非題,最後還有問答題是要根據上課播放過的影片來敘述各種心裡疾病的症狀。題目寫起來還算簡單,不過也沒有信心可以完全寫對。無法得知最後期末考的成績,最後我的學期成績是 86 分。

結語

老師感覺很和善,她說最好要有修過普通心理學,不過感覺影響沒有很大。整學期下來 loading 不大。雖上課本身有點枯燥,不過因為分組報告,得到了一些團隊合作的經驗,也認識了一些人,真的很感謝組員的幫忙,也讓我學到不少。考完期末考時,老師還為我們的其他期末考加油打氣!

組合語言與系統程式 – 交大修課心得

assembly

課程資料

組合語言與系統程式

開課:陳永昇老師

修課年度:99資工系

組合語言的部份使用的是《Assembly Language for x86 Processors》,教了以下章節:

  • 1. Basic Concepts
  • 2. x86 Processor Architecture
  • 3. Assembly Language Fundamentals
  • 4. Data Transfers, Addressing, and Arithmetic
  • 5. Procedures
  • 6. Conditional Processing
  • 7. Integer Arithmetic
  • 8. Advanced Procedures
  • 9. Strings and Arrays
  • 10. Structures and Macros
  • 13. High-Level Language Interface
  • 14. 16-Bit MS-DOS Programming
  • 17. Expert MS-DOS Programming

系統程式的部份使用的是《System Software: An Introduction to Systems Programming》,教了以下章節:

  • 1. Background
  • 2. Assemblers
  • 3. Loaders and Linkers
  • 8. Software Engineering Issues

額外有出了一份寫 DOS 病毒的作業,可以學習一些感染 EXE 檔的技巧。

本門課的組語主要是用 MASM 組譯器的格式,同時也會運用到教科書中的諸多 routines。由於老師並不會特別教導組譯環境的設置,同學需自行閱讀教科書及作者網站,我寫了一種環境設置的方法和其他一些跟這門課相關的議題:〈組合語言與系統程式〉

上課方式

使用投影片上課,大抵上上課氣氛很自由,不會有什麼壓力。由配分可見它是以實作為主的課程,本文也以介紹作業為主。

每份作業都需 demo(包含期末 project 在暑假 demo),是在 demo 時從 E3 上下載之前上傳的程式碼,由於並不會事先公佈所有的測資,所以要細心一點。組語作業如果有多做功能可以主動向助教提出,可以得到不等的額外加分。

另外,事後會公佈全班的 code 供大家學習參考。上到最後一堂課時會有一張特別的投影片:師:「永生難忘」。

不點名,但是有來上課的話可以提早得知作業。作業投影片通常在宣佈後一星期放上E3。此外,死限延期或其他特殊事項也是只有在上課時公佈,或者在上課時提早公佈。

評分方式

這門課的配分是這樣的:

  • 60% 4次組語作業
  • 25% SIC/XE 組繹器(可用任意語言寫)
  • 15% 期末考

沒有期中考,不過另外有一個期中組語上機考,是考較為簡單組語程式題目,也可攜帶參考資料和作業原始碼,但若未通過則 4 次組語作業不能算分。

根據前人的經驗,只要作業都滿分,就算期末考六十幾分也能得到 99,有付出就有收穫。

考試作業

作業通常會在上課公佈,晚一點則會公佈在 E3,死限通常在星期日的夜晚。

第一個作業是三個組語小程式:

  1. 輸入兩個 32-bit 正整數,輸出其最小公倍數。
  2. 輸入一個日期,輸出那天星期幾。
  3. 輸入一個正整數,輸出所有比它小的質數。

第二個作業是用組語寫一個 finite-state machine 可以解析一行輸入的組合語言(MASM 格式),如:

1
2
3
4
5
6
7
8
9
Input=> L1: sub ecx, var   ; substract ecx by var

Result=>

        LABEL             L1
        INSTRUCTION       sub
        REGISTER          ecx
        IDENTIFIER        var
        COMMENT           substract ecx by var

如果有錯誤輸入,該錯誤 token 輸出 unknown,但其後的正確 token 仍需正確辨識。不需判斷 grammar 錯誤,如 mul 應該只能接受一個 operand:

1
2
3
4
5
6
7
Input=> mul eax, 5

Result=>

        INSTRUCTION       mul
        REGISTER          eax
        INTEGER           5

禁止使用 .IF .WHILE 等 directives

第三個作業是寫一個計算機,可以計算輸入運算式結果,支援 + - * / ( ),如 2+4-6*2 = -6。輸入運算式最長為 100 字,數字長度最長也是 100 位(需使用大數運算)。

第四個作業是 16-bit DOS programming:

  1. 寫一個 TSR 鋼琴程式,鍵盤需可正常輸入,但按下按鍵會發出聲音。
  2. bonus(這題本來不是 bonus,後來更改評分):寫一個 TSR 病毒程式,執行後會常駐於系統中,在你開啟另一個 exe 檔時感染該執行檔,使其執行被插入的程式碼(如列印一行字),但仍保持原有的功能。

期末 Project期限在期末考後的一個星期後。是要以如《 System Software: An Introduction to Systems Programming》 一書的格式,撰寫一個 SIC/XE 組譯器可以產生 relocatable object program。

其中 60% 要支援所有 addressing modes, 教到的 assembler directives,以及以下除外的指令:浮點數運算、SW register 相關指令,SIO, TIO, HIO,LPS, STI, SVC,SSK。

40% 佔分則為:Literals, Symbol-defining statements, Expressions, Program Blocks and Control Sections。

我有把一部分的作業原始檔放在 github 上,可供參考:99-asm

上機考有三題:

  1. 印出 Pascal’s triangle
  2. 給一個長度 4 字串,輸出任一重排後字串。
  3. 給兩個最多 40 位的二進位數字,輸出相減後結果。

不需全部解出也算通過。

期末考的題目主要配分是系統程式占的較重,所以不要只看組語的部份。仔細觀察可以發現,題目大多為課本習題,特別是系統程式的部份。這次的組語大多為選擇題,系統程式相對較難。老師會給考古題,不過有重疊的題數大概只有一兩題。

結語

想要預習或自修的話,《 Assembly Language for x86 Processors》 這本書每章背後都有程式練習題,筆者做過幾章,覺得挺有幫助,感覺跟程式語言有關的課練習都是十分重要。組語的教學也可以參考小木偶的網頁

系統程式部份可以邊寫組譯器邊看,這樣會有更深的理解。自己修這門課花了很多心思在作業上,不知不覺就會忘了讀系統程式。但這門課的系統程式部份實際上佔分滿多的。

雖然沒有期中考確實讓期中的壓力減輕不少。但對筆者而言,組譯器的撰寫顯得有些匆忙,逼近期末考周時,因為要準備考試,沒時間寫期末 Project。即使考完期末考,最後一個星期忙著搬宿舍,能寫的時間不是很有彈性,不得已得花很長得時間連續不斷寫 Project,寫到最後動力遞減,很容易想放棄。

現在想起來,我認為最好可以一開學就開始寫 SIC/XE 組譯器,一方面可以邊寫邊看課本來準備期末考,二方面透過時段的切割可以避免學期末擠在一起時的壓力。

況且其實一開學就會說期末 project 是什麼了,就算最後發現要求不太一樣,也依然有理解系統程式課程的好處。

延伸閱讀

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

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。

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

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

結語

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

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