顯示具有 資訊學院的30門課 標籤的文章。 顯示所有文章
顯示具有 資訊學院的30門課 標籤的文章。 顯示所有文章

2012/2/2

「多」、「穩」、「省」、「硬」、「強」之Windows XP為作業系統的萬里長城,歷萬世而不衰。

Windows XP為戰場老將,老馬識途,老當亦壯。XP為eXtra Performance的縮寫,言下
之意為超強效能。推薦其為最優秀之作業系統之原因為「多」、「穩」、「省」、
「硬」、「強」五大特點:
1. 多:累積最多的使用人口,使用界面為大眾所熟悉。
2. 穩:挾NT之優越架構,對於行程與記憶體管理有優越表現。
3. 強:經過十年的補強,經歷多年的病毒洗禮,嚴然為一最為穩定運作的作業系統。
4. 省:最重要是不必在增加支出費用,還能與大部份視窗軟體與遊戲穩定運作。
5. 硬:對硬體相容性佳,對記憶體需求亦較低。
結語:「多」、「穩」、「省」、「硬」、「強」之Windows XP為作業系統的萬里長
城,歷萬世而不衰。

2012/1/31

HASH

Open hash table:
Close hash table: rehashing, linear probing, quadratic probing, extendible
hashing

AVL tree, Splay tree, B-tree

An AVL tree is identiacal to a binary search tree, except that for every
node in the, the height of the left and right subtree can differ by at most
1.
The basic idea of the splay tree is that after a node is accessed, it is
pushed to the root by a series of AVL tree rotation. By restructuring we can
make future accesses cheaper on all these nodes.
A B-tree of order m is a tree with the following structural propertires:
The root is either a leaf or has between 2 and m children.
All non-leaf nodes (except the root) have between [m/2] and m children.
All leaves are at the same depth.

2011/10/16

資訊學院的30門課-演算法與google code jam

Google Code Jam 2009我參加過一次,依當時的評分標準,至少要能寫出一題,能夠在限定時間內跑完的code,才能晉級。但是幾乎都是要用dynamic programming的技巧,我用遞迴解一題後,想當然爾,效能不佳,所以我就放棄了。

大家可以上去看看
http://code.google.com/codejam/

既然是軟體,就不能不講到正在全球各地舉行的google code jam 2011,

難度極高,在資格賽的幾個題目中,解出來的難度不高,但是要在極嚴格的執行時間跑出來,

就不能夠亂寫囉,除了要有一台不錯的運算平台之外,挑選的程式語言也很重要,例如很多人用C/C++,

但是最重要的莫過於演算法了。因為這些題目都會讓人無意間進入一種迷思,大部分是divide and conquer的題目,

但是重複計算了一部的運算而不自知。而且某些題型在小範圍的資料中,可以使用遞迴解,但是太多層function call又往往使效能不彰。

演算法教科書提到dynamic programming,當初課本只有兩個範例,所以其實讀的不是很懂,這兩天我又去書局罰站了,翻了一下培養與鍛鍊程式設計的邏輯腦。其實只是用二維或者三維array把之前算過的值儲存起來,碰到一樣的狀況,就直接查表就好,大家都知道查表可以很快,就不用丟到遞迴裡或者loop裡去跑了。不過我相信以mis的programming應用角度而言,不要說dynamic programming,連遞迴我也只用過兩次。

另外瀏覽一下放在他隔壁的Short Coding 寫出簡捷好程式-短碼達人的心得技法
不過這本書是會讓人頭暈的書,很多觀念以前都讀過,
有些小技巧的確在不失可毒性的狀況下,可以讓程式更短,甚至縮短巢狀level,讓程式更好看,有空可以看看啦,但我真的如果如書這樣寫出來,我自己都會頭暈吧。




談到google程式大賽

雖然我不曉得程式怎麼寫效能才高,但可以分享為甚麼我的程式跑的慢,為甚麼大的資料集運算很慢,

一般網頁或視窗是程式設計課程中,都沒有注重在如何讓程式跑的最快,有志參加的coder,一定要記得這些重點才能晉級。

2011我做的是第三題

Problem C. Candy Splitting

http://code.google.com/codejam/contest/dashboard?c=975485#s=p2

提示一下,弟弟的加法就是XOR,哥哥才會進位的加法。這樣題目就容易理解了。

像我這種程式效能上的差異,不是單純使用高級硬體就能cover掉的。

#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int compute(int *candy, int candyNum, int s, int x, int p, int max);
FILE *input;
int i, j, x, sum, ans;
int looptime, candyNum;
int candy[1001];
input = fopen("D:\\Dev-Cpp\\3-test.txt","ro");
fscanf(input,"%d",&looptime);
for(i=0; i
fscanf(input,"%d",&candyNum);
sum = 0;
x = 0;
for(j=0; j
fscanf(input,"%d",&candy[j]);
// sum += candy[j];
}
for(j=0; j
//printf("%d ", candy[j]);
sum += candy[j];
x ^= candy[j];
}
//printf("=%d",sum);
ans = compute(candy, candyNum, sum, x, 0, 0);
printf("Case #%d: ", i+1);
if(ans==0) {
printf("NO\n");
}else{
printf("%d\n", ans);
}
fflush(stdout);
}
system("PAUSE");
return EXIT_SUCCESS;
}
int compute(int *candy, int candyNum, int s, int x, int p, int max) {
int max1,max2;
int a, b;
if( candyNum == 0 ) {
return max;
}
a = x ^ candy[0];
b = p ^ candy[0];
if(a == b) {
max = (max<(s - candy[0]))? (s - candy[0]): max;
}
//printf("[ a=%d, b=%d, x=%d, p=%d, max=%d ]", a, b, x, p, max);
max1 = compute(candy+1, candyNum-1, s-candy[0], a, b, max);
max2 = compute(candy+1, candyNum-1, s, x, p, max);
return (max1>max2)?max1:max2;
}
這邊用到recursive去解,雖然CS教科書上recursive的例子很多,但在google code jam的題目中,
幾乎都是效能殺手。
max1 = compute(candy+1, candyNum-1, s-candy[0], a, b, max);
max2 = compute(candy+1, candyNum-1, s, x, p, max);
因為例如「第三堆到第六堆的XOR」與「第四堆到第七堆的XOR」,其中「第四堆到第六堆的XOR」是不是被重複算了。
資料集越大,被重複算的運算就越多,程式就越慢。
到這邊是不是有大大已經想到,大的資料集要怎麼處理了呢?

2011/10/15

Intel 80286 80386 80486 Pentium 1 2 3 4 P6 core i發展史

80286處理器整合了大約13萬個電晶體,最大主頻為20MHz,採用16位元資料匯流排和24位元位址匯流排


80386處理器首次在x86處理器中實作了32位元系統。可配合使用80387數位輔助處理器增強浮點運算能力。首次採用外置快取解決內部記憶體速度瓶頸問題。


486家族的指令集與80386非常相似,只有增加少量的指令。


不過從硬體的觀點來看,486的結構有很大的突破。它有CPU內建資料快取晶片,DX還有一個浮點運算處理器和多重管線。在最佳的條件下,486的核心可以提供一個時間週期內處理一個指令。這會提供大約二倍同時脈的80386的效能。
Intel 80486DX2 - 以2倍倍頻來執行的處理器。
i486的時脈有16、20、25、33、40、50、66、75、100MHz。時脈範圍相當大。
486的製造商有IntelIBM德州儀器AMDCyrix聯華電子等。

因為不能註冊數字做為註冊商標586被英特爾取名為Pentium,一直成為Intel CPU的代名詞。原生的CISC超純量架構是Intel P5架構

  • 超純量(Superscalar)架構 -指CPU架構是使用一顆核心來做指令集並行並行運算。 Pentium擁有兩個管線,可以達到在一個時鐘週期內完成一個以上的指令。
  • 64位元資料路徑 - 這使得每一次從記憶體提取指令的資訊數量變成兩倍。這並不表示Pentium可以執行所謂的64位元應用程式;暫存器仍然是32位元寬度。所以當時Intel號稱Pentium是64元CPU顯然是世紀大笑話。
  • 後期的MMX指令。

P6 微架構Intel1995年推出的第六代 x86 架構微處理器。雖然短暫有人為686了。但後來以經沒有甚麼人再這樣稱呼了。第一個實作量產的CPU叫做Pentium Pro,在資訊電子業,先行試作的品質往往另人堪慮的,比如說60Mhz與66Mhz的Pentium、這個Pentium Pro乃至於Windows Vista。

不過P6微架構目前仍使用於現在Intel量產的CPU,並統一了桌面與行動的CPU產線。Pentium Pro的改進如下:
  • 兩個8KB的L1 Cache
  • 預測執行與亂序執行,可以降低管線延遲,而能夠使intel後來的 CPU 擁有不錯的性能。
  • 超級管線,增加到管線長度。
  • 與處理器核心同速的內建 L2 快取,就是把主機板上的L2 cache放到cpu中。
  • 達 36 位元寬的實體記憶體匯流排,能夠支援大於 4 GB 的主記憶體。
  • 暫存器更名

Pentium III又是一個行銷名詞,Pentium ProPentium II、Pentium III、Pentium M英特爾的P6架構之微處理器。剛推出的Pentium III版本與早期的Pentium II非常相似,主要加入SSE指令集,時脈上的提升就不用提了。很少看到1G以上的Pentium III,因為整合到內部的Cache無法在1GHz以上的速度運作。Intel花費了至少6個月來解決。而且不要小看後期Server版本的Pentium III,在大多數軟體中都可以超過主頻高得多的Willamette核心Pentium 4,NetBurst的覆亡由此已經可以看出端倪

Pentium 4Intel生產的第7代x86微處理器新的架構稱做NetBurst與P6架構有著截然不同的設計與下場。NetBurst這個Intel公開承認失敗的作品就不講了,還短暫讓AMD FX站上處理器效能王座。

Intel於2006年宣佈,Intel Core微架構(Intel Core Microarchitecture)取代舊有的NetBurstPentium M架構。
Intel Core微架構類似Pentium M的設計。它有14級流水線(Pipeline)跟Pentium Pro一樣,相比NetBurst架構Prescott的31級,足足少了17級。本架構亦是一個雙核心的設計,兩個核心的L1快取互相連接,分享的L2快取。使用以上設計的確有效達到較低功耗。

回顧CPU的發展史,可以了解到,往後x86 CPU的設計將越來越困難了。至於ARM呢?



2011/10/7

資訊學院的30門課-Internet Technology

Internet Technology這門課開在研究所,是極為應用的一門課,課程中沒有期中期末
考,每一兩週交一次作業,滿合適像我這種不喜歡背書的人。

事實上這門課是完全沒有點名的,我跟幾位修課的同學,上課只是要知道下次作業交甚
麼,然後就翹課了。這一門課一次教一種server side script或程式技巧,包含
Netscape Server Side Script
Active Server Page
Java Server Page
Servlet
PHP
CGI
DCOM
Cobra
老師也說明了這門課的重點,讓同學認識各種Server Side Script的不同,以利日後系
統設計時使用特定的解決方案。
期末有些同學選擇上台報告,可以加分,印像很深的是有人介紹了Fast-cgi跟IR。

2011/10/6

資訊學院的30門課-網路通訊概論

有一支運行中的視訊伺服器監控程式,使用Java開socket連到service的port看是否活著,
可是誤判率極高,並在視訊伺服器留下許多垃圾訊息。到底程式出了甚麼事?

---
網路通訊概論這門課開在大學二年級,是我唯一修過的網路相關課程,網路跟通訊是截
然不同的領域,1990年代,具圖型使用者界面的網頁瀏覽器無意間被發明,網際網路開
始大紅大紫,計算機概論中就使用了大量篇幅在介紹各個layer的不同,那時甚麼叫做
bridge?甚麼叫做router?甚麼叫做switch?實在有聽沒有懂,唯一可以摸到的網路設
備,就是自己的宿舍網路卡跟RG58那台同軸電纜集線裝置。

網際網路那麼盛行,不能免俗的,我也修了網路通訊概論,這門課已經比計算機網路教
的簡單多了。其中教到七層架構、token ring、FDDI、Ethernet。當時真的是用死背
的,我連課本都沒買,背的我真的不行,後來十年後去管理IPTV Server
Farm的兩部大門神時,才略懂一點網路。這門課比較特別的是,好像不教一下
programming,不算是資訊系。期末project是交一個berkeley socket寫出來的通訊程
式。

是的,這門課學到的socket programming技巧影響很深,出了社會,到了我們公司
後,別處我不知道,我發覺若不會socket programming,當framework沒有高階api讓你呼
叫時,事情就做不下去了。

當時有一個系統監控程式引,被監控端是同事K負責的視訊伺服器,監控程式卻是同事C撰寫的,
使用Java開socket連到service的port看是否活著,可是誤判率極高,
並在視訊伺服器留下許多垃圾訊息。

是的!同事C只是去看Port有沒有Daemon運作,但若Daemon裝死,整個Daemon要正常運作
的條件很多,首先DB要正常,主機的資源也要夠,但他這隻Java程式的作用只有Port
Scan,然後因為TCP連線沒有依照RTSP的規定關閉,每掃描一次,都在主機留下一個錯
誤訊息。

因為誤報率不堪其擾,所以決定自救。我首先我使用ethereal去抓取視訊伺服器跟用戶端的通話內容,
然後我去找RTSP(Real Time Streamming Protocol)的RFC來看,
使用學的到的berkeley socket,在一台Linux主機使用C語言重寫監控程式,
依照RTSP規定送出封包,完整模擬用戶端行為,判斷主機丟回的錯誤訊息,
最後呼叫之前以經開發好的傳送簡訊API、傳送郵件API。
正確率提升到接近100%,主機上也沒了垃圾訊息,終於可以快樂睡覺。

另外,socket programming的應用還有數例,將於課程Network Programming、
Internet Technology與Multimedia communication中分享。
其中包含使用舊型機上盒實作MPEG2協定分析儀。

2011/10/4

資訊學院的30門課-微積分(下) calculus

微積分上學期85分,以全班第二高分pass後,也因為高達五學分,別人是拉低分數,我
是拉高分數,拿到數學系第二名。
申請轉系時,資訊系教授是看不到下學期總成積,若錄取後只會依規定核對資格,也沒
必要那麼辛苦去拿書卷獎了。
一開始圖書館沒去了,後來連課都上的斷斷續續的,想說轉系只要70分,應該沒問題?
但我錯了,期末考前幾週,前面太混了,
我算一下我期末考要考93分才能轉系。我要哭了,我怎麼辦?

考前兩三週,我又蹲到圖書館了,當然裡面好多數學系的同學,每天看到關門才回到宿舍,
下學期教了甚麼,我真的忘了,我只記得green theorem:

沿著封閉曲線C之線積分可化為C所圍區域之一般雙重積分(面積分)。

上面那個連結的第一段:學習數學的經驗告訴自己「數學是很容易忘的」。真的是缺乏直觀,
而且生活上幾乎碰不到,我到大四時,就已經把三角函數與指對數的微積分還給老師了。

回到期末考,因為每個人有兩條命,第一次考只能說是緊張,還沒有絕望的感覺,就算期末要93分,
但大家都知到調分是怎麼回事,很認真的寫完後,真的說猜幾分,很難估,考完數學都是這種感覺。
很快的隔天就發了考卷,拿到後,30分,我震驚了一下,隔一週考的第二次是我的最後一條命,
騎機車回山上宿舍時,我也哭了,準備了一年的轉系,就這樣沒了。

我也不想去管別人幾分了,因為這是我跟自己的競賽,中間間隔的這一週就好笑了,也讓人想哭。
大家還是去圖書館,但是是做到外面去,坐在館前的大階梯(img)上,討論怎麼到教授辦公室偷考卷。
中間更諷刺的,我們還去麥當勞見了上學期被退學的同學。然後,另外一個要轉到會計系的同學在大家面前哭了起來。
我這一週怎麼渡過的?當然其他科也不能被當掉,加減準備別的,微積分反正我都盡全力了,
只考了30分,那就索性不要唸了,「超級賽亞人不是濱臨死亡時,戰鬥力不是會大增嗎?」
我想我真的快瘋掉了。

一科一科考完後,微積分的第二次期末考的前一晚,經過一週的沉澱後,最後一夜,
把課本拿出來翻個一個多小時,室友在complaint上學期58分被當。而我安安靜靜,
心裡有待在數學系四年的打算了,就在這麼複雜的心情睡著了,這已經是絕望了。

隔天考試當天記得還有人做小抄,老師親自來監考,要大家把書包拿到前面放,還說抓到做弊就死當,
然後做小抄的同學嚇到了,把小抄收到書包不敢拿出來。

很快的改好考卷,發考卷的當下,大家都好緊張,我拿到考卷時,看到分數70分,
以第一次的分數分佈來評估,我知道這70分在很前面,後來得知70分是全班最高分數。
至少我不用重修了,最後等待教授公佈調分,兩次期末考相加再開根號乘以10,
那這樣我不就是30+70=100,開根號乘以10還是100,最後以73分學期成積通過轉系。
最後一科離散數學,已經全無壓力,還有人開玩笑要我的考卷寫他的名字,
最後告別了數學系,同時我也很珍惜來到資訊系的日子。

10學分的課分成兩篇寫應該不過份吧,其實是看到各位的迴響,既然是分享,就要有人看
才有意義。如果真的要講到IT的話,當然調分方案是老師擬幾個公式,由助教用EXCEL算出來,
然後老師挑一個想當的人數,就把方案定案了,當然在大家分數都在60邊緣時,
採取的方案就很critical,搞不好A方案及格,B方案卻被當掉。

「超級賽亞人不是濱臨死亡時,戰鬥力不是會大增嗎?」這句話後來我用來鼓勵了許多學弟妹。
(img 七龍珠)

[資訊學院的30門課]-微積分(下) calculus

微積分上學期85分,以全班第二高分pass後,也因為高達五學分,別人是拉低分數,我
是拉高分數,拿到數學系第二名。
申請轉系時,資訊系教授是看不到下學期總成積,若錄取後只會依規定核對資格,也沒
必要那麼辛苦去拿書卷獎了。
一開始圖書館沒去了,後來連課都上的斷斷續續的,想說轉系只要70分,應該沒問題?
但我錯了,期末考前幾週,前面太混了,
我算一下我期末考要考93分才能轉系。我要哭了,我怎麼辦?

10分的課分成兩篇寫應該不過份吧,其實是看到各位的迴響,既然是分享,就要有人看
才有意義。

2011/10/3

資訊學院的30門課-微積分calculus

資訊學院的30門課-微積分calculus

微積分可以說是數學系的數學概論,不過在其他學院的學分數也不大相同,
數學這門課,從國小一年級開始教到大學,微積分的微積分可以說是做到承
先啟後的角色。

我的微積分是在數學系修的,除了高達一學期五學分的最恐怖程度外,
我印象很深刻的是,第一堂課老師就嗆聲:「同學可以都不來上課,
期末考會考兩次,只要及格一次就算你pass。」
而且第一堂課就開始教最大上界與最小下界,學長說那是高等微積分在教的,
使用的課本是微積分聖經calculus by Apostal,
故被學長稱之為介於大一微積分與高等微積分的中微,
另外很不一樣的,這一本書,可以叫作積微分,因為先上積分,在導入微分。

每小時的課我可以抄四面的筆記,所以一週是20頁,然後不知道老師在講什麼,
下課一定到圖書館K完上課的內容,這門課是我大學修的最認真的課。

上學期除了三角函數、指數或者對數的微分與積分,大量篇幅在教極限與連續,
這都還算ok,下學期已經講到令人頭昏眼花了,連座標軸是歪的都可以積。
連老師的名字都很數學,他叫做陳天進老師,天進不就是tan嗎?

微積分對於資訊系的學生有什麼幫助,良好的微積分基礎對於理解機率論與通訊理論
,很有幫助。更何況,多重積分、多重連加(sigma)與連乘,所訓練的腦力,跟迴圈是類似。
再或者,極限與連續,跟遞迴也有相關,因為你要考慮到遞迴程式無窮無盡的跑下去,
會變成什麼狀況。另一門課─離散數學就更不用說了。

昨天Computer graphics的答案
利用泰勒展開式把
課本提供的方程式先展開成多項式,然後再對多項式進行積分,最後結果是一個很接近的多項式,可以代表課本所說的那個錐形。

2011/10/1

資訊學院的30門課-離散數學

IT邦幫忙舉辦了鐵人賽按讚PK大賽,有人說太難贏了,有人說贏了沒感覺,
有人偷偸說一些暗黑技法,後來主辦單位決定那就PK成功賺8分。
玩法如下
http://ithelp.ithome.com.tw/event/ironman4/like

這種簡單的數學期望值,國中的機率與統計就教過,那資訊學院呢?
是在機率論嗎?一開始我也這樣認為,不過卻是在離散數學裡。

最最最與電腦有關的數學課,就是離散數學了,一開始導入集合論,在來教一點演算法,很簡單的演算法,再來教一點排列組合跟機率,我記得還有鴿籠原理,然後最重的圖論,還沒教到,學期就結束了,所以後來離散數學兼併了上學期的集合論,組成離散數學六學分。

對了,這門離散數學是在數學系大一修的,比資訊系的同學早兩年修。其實大部分的課程,都是複習,大半不是高中教過,就是集合論教過,在不然就是很簡單的程式設計題目,不過很多同學看了考古題還是考不好,實在不曉得甚麼原因?

2011/9/30

computer architecture and organization

主管:「把你前面的座位給整理一下,不要堆那麼多東西,看起來就像是垃圾堆一樣!」

Kradark:「桌面是L1 cache,抽屜是L2 cache,書櫃是主記憶體,我是在實作記憶體階層管理,表面上看起來是亂的,實際上卻大大的提升Access的效能啊!」

主管:「好吧,那我現在呼叫你這個API,進行garbage collection。」

Kradark:「......!」

資訊學院的30堂課-密碼學

crypto1是悠遊卡所使用的加密演算法則,居然在維基百科就有連結,而且開宗明義說,幾乎是沒有保護狀態。原來讀取我們的悠遊卡,跟讀取我們數位相機拍出來的照片一樣,幾乎是完全沒有保護狀態("the security of this cipher is ... close to zero")。到底crypto1演算法哪裡錯了?或者我們教的密碼學哪裡錯了?

資訊學院的30堂課-資料結構 Data Structure

Data Structure說是資訊學院的精華所在,如果有人反對,應該不是唸CS的吧。長官又指定一個其他組員搞不定的工作過來了,任務是因應組織調整,變動人事資料表,但是資料來源是LDAP,沒有開發大量讀取的權限,最棘手的是,資料來源不是常見的關聯式資料,如Oracle或Informix,不單單是搞定ODBC Driver就ok了,那該怎麼辦呢?
--

Data Structure說是資訊學院的精華所在,如果有人反對,應該不是唸Computer Science的吧。鏈結串列、Binary Tree、B-Tree、in-order、pre-order、post-order、recursive,等等不但是程式設計的延伸,還必須承接後續高年級課程,如人工智慧要用到決策樹,不但是計算機概論常出考古題的所在,在考研究所或國家考試時,也常是必選科目。

長官指定一個其他組員搞不定的工作過來了,任務是因應組織調整,變動人事資料表,但是資料來源是LDAP,沒有開放大量讀取的權限,一次只能抓一筆,最棘手的是,資料來源不是常見的關聯式資料,如Oracle或Informix,不單單是搞定ODBC Driver就ok了,那該怎麼辦呢?

我先到書局罰站了一下,帶回了一本Visual C++的書,然後我引入ladp的dll,連上ldap主機,先抓取一筆人員資料看一下,我所要的姓名、組織代碼,年齡,電話甚至學歷都有,另外再抓取一筆單位資料,發現了裏頭有上層組織的代碼,這不就是樹狀結構,這時候,求學時代所學的Data Structure就派上用場,要dump出來有兩個做法,一個是先深(DFS),一個是先淺(BFS),我比較懶惰,不想去寫queue或是找STL,我就利用遞迴呼叫就是一種堆疊的觀念,實作先深尋訪,抓出了六個分公司當root,呼叫完遞迴後,就成功的完成了這個專案,再排入這個AP後,後來的組織整併,就與我們沒有關係了,因為都自動處理好了。

昨天在PTT的Soft_Job板上爬文,看到有人抱怨,上104找來的面試的人,DFS與BFS都搞不清楚,還好至少我還記得修課時教什麼,因為期中考考過BFS。

資訊學院的30堂課-資料庫管理 DataBase

之前開發一套車輛管理系統,車籍資料超過80個欄位了,資深的長官指示車籍資料分成會異動的一個表格,不會變動的另外一個表格,當時剛到公司的被稱為小朋友,長官說甚麼,就只好幹甚麼,這卻是災難的開始。

資料庫管理系統,課程主要精神就是在教EDR與正規化,正規化很重要,一個系統的效能在於適當地切割資料表,沒有正規化的資料庫,很容易發生資料不匹配的問題,而導致於coding時事倍工半。修課當時,也只是照著課本做,其實對於如何合適地使用SQL語法,是上班之後的事了,不過我覺得對於語法效能最有幫助的課反而是Data Structure,order by就不用說了,排序最少是O(N*logN)當我下了一個group by或者union,腦袋瓜要馬上閃過,這樣子在實際上執行時,花費的時間複雜度是否可以接受。另外,偶而會幫忙同事turning語法,新手最容易犯的錯誤,就是查詢網頁時,資料看不到,原因就在於inner join與left join的不同。

再來是索引的運作,大部分的所以都是使用B-Tree結構來節省查詢的時間,樹狀結構可以把線性搜詢所需要的O(n)時間,reduce到O(logN),如果資料結構B-Tree的那個章節有認真學的話,使用B-Tree的好壞處很快就可以理解,自然也知道最適合加入索引的時間。

之前開發一套車輛管理系統,車籍資料超過80個欄位了,資深的長官指示車籍資料分成會異動的一個表格,不會變動的另外一個表格,當時剛出社會時,被年長20歲的前輩,稱為小朋友,長官說甚麼,就只好幹甚麼,這卻是災難的開始。這樣設計的下場是甚麼呢,就是超級慢的查詢速度,車籍資料有4000筆,兩個表格進行join後,產生4000*4000這麼大的笛卡耳積,先不論資料庫系統進行的什麼優化,或者有設定索引,光就時間複雜度的觀點,就慢了4000倍,這80欄的車籍資料,在大部分的頁面,都需要讀取兩個表格,後來跟我同組的同事討論後,決定合併這兩個表格,結果速度就馬上有明顯的提升,因為長官這一個決策錯誤,全部的code翻起來review一次。

不知道CS哪一門課,教把會變動的資料與不會變動的資料,分開來存放的,是!有的,剛好我們大學開了一門很冷門的課課,叫做檔案結構,不是資料結構喔,這樣存放的確可以減少讀取到記憶體的資料量,但是我們系統的最終儲存目的地是資料庫,而不是自己維護的檔案,所以長官應該是沒有修過資料庫管理系統,甚至於資料結構,經後來他的談話之後,還真的耶,他的開發經驗就是C語言加檔案結構,後來他就沒有再插手系統設計的部分了,只安排了我們做什麼工作,什麼時候交出來而已。

2011/9/29

資訊學院的30門課-作業系統

在於3-Tier與多人多工盛行的今日,很多人開發程式時,都是很直覺的設計一個功能,或者是以單一使用者的角度與立場,去自己塑造使用者的需求,表面上看來這樣可以設計出一套深具使用者親和力的系統或者網站,其實卻處處隱藏了危機….

-------

資訊學院的數位影像處理,絕對不是把主力放在教你怎麼修圖,那作業系統就不是教您怎麼重灌Windows 7。傳統的作業系統課程會包含磁碟管理、行程管理、快取記憶體、分頁管理。

傳統的磁碟管理最重要的就是RAID的觀念,這至少我在三門課聽過,計算機概論就不用說了,檔案結構、計算機組織與結構還有就是作業系統。RAID的觀念在系統規劃容錯時,是再重要的也不過,但是近年來因為SSD的價格越來越親民,新的磁碟管理課程應該要導入SSD乃至於混合式HDD

行程管理對於提高程式穩定度很重要,特別是在於3-Tier與多人多工盛行的今日,很多人開發程式時,都是很直覺的設計一個功能,或者是以單一使用者的角度與立場,去自己塑造使用者的需求,表面上看來這樣可以設計出一套深具使用者親和力的系統或者網站,其時確處處隱藏了危機,例如開發一個會議室預定網頁系統,A先去瀏覽了可供使用的會議室1001,然把資料導向下一頁,按確定後,這間會議室1001就被保留了下來,然後B重覆一樣的動作,瀏覽了可供使用的會議室1002,然把資料導向下一頁,按確定後,這間會議室1002就被保留了下來,看來程式完全沒問題對不對?大錯特錯,因為設計者假設了只有單一使用者使用系統的情境,且更深深的以為每一個向主機提出的需求,會立即的被執行完成,沒有延遲,不會會出甚麼錯。

會議室預定網頁系統實際上的狀況可能是,A先去瀏覽了可供使用的會議室1001,然把資料導向下一頁,但是B也重覆一樣的動作,瀏覽了可供使用的會議室1001。之後系統把Time Slice切給AA按確定後,這間會議室1001就被A保留了下來,A的需求被完成了,但是B重覆一樣的動作,把會議室1001的資料導向下一頁,按確定後,這間會議室1001最後變成B的,最後AB兩位USER到了會議時間,在會議室裡吵了一架,系統裡記錄的是B是合法登計者,但A卻是先看到這間會議室的,啞巴吃黃蓮啊。

怎麼解決就留著給有智慧的各位去想想吧,或者再翻翻這本很重要的教科書。

[光通訊時代] 資訊學院的30門課-數位影像處理

其實我沒有修過數位影像處理這門課,最最接近的是通訊理論,甚麼?通訊跟影像處理最接近?

沒錯真的就最接近,那圖型識別呢?圖型識別可以說是一門資料分群法,我還沒修之前也以為圖型識別是影像處理課程。

 

資訊學院的數位影像處理,絕對不是把主力放在教你怎麼修圖,把滿臉豆花的豆花妹修成吹彈可破的粉嫩美人,影像處理是上研究所後,因實驗室內要找研究題目,開始自修的,但後來也不是做影像相關的題目,真正認真讀時,卻是轉換到IPTV部門時,因為單純自己想知道,去K了這一本MPEG4的書,合併了MPEG2Standard Spec,慢慢自己理出了頭序。

 

數位影像處理一開始會導入線性轉換的概念,以及量化與無失真壓縮如賀夫曼編碼與Run-length encoding,哇!這些不是真的跟通訊系統講的理論,一樣的概念。當然還有許多技巧來消除空間與時間上的重覆資訊。

 

修這門課在生活上也有得到好處,為何我買的舊型藍芽耳機會破音?原因就在於藍芽傳輸的通道寬度以及雜訊干擾以至於頻寬不足啊。所以就需要資料壓縮了啊,然後資料壓縮在電腦或手機端有CPU來算是沒問題,但是解壓呢?這也是為何支援A2DP(https://www.bluetooth.org/Building/HowTechnologyWorks/ProfilesAndProtocols/A2DP.htm)的藍牙耳機,會比較大隻的原因,裡面有Codec

 

影像處理與通訊一樣之處在於,如何在有線的通道內穩定的傳輸最重要的資訊量。所以同樣用到線性轉換、編碼理論、資料壓縮甚至於是資料加密。跟這些相關的基礎課程有微績分、線性代數、演算法與工程數學。

資訊學院的30門課-電子計算機程式

我的計算機程式設計是在數學系修的,教很基本的C語言,算是修的有點勝之不武,學
期分數是97分。期中期末忙著顧5學分的微積分,沒有人把心思放在這科上,連我也不
例外,當然這科我永遠不可能被當掉的課,只是把作業打一打、交一交而以。
這科的重點在哪邊?最最大的重點在於怎麼寫出沒有memory leak的code,C語言乃至於
C++,很大的一個issue就是跟OS要了一塊Memory或者new了一個物件後,就算Memory沒
有歸還也不會產生錯誤。當然學生時期,只是交個Project,所謂的Project只要在交的
那一瞬間可以運作正常就算過關,code往往存在許多memory leak的問題,但是一個在
Production運作的code時,這樣是不行的,系統會crash掉,而且問題很難抓,在手機
廠的一個coder曾分享過一段話「有一些應用程式,過去有很嚴重的memory leak,後來
人走了,來一個新人,他不去修,後來就砍掉重練,流動性高就會變成這樣子呀」。原
來C語言沒學好會造成職場流動率高,真的是蝴蝶效應啊。
因為教的很基本,你可以當做資訊學院開的兩學期C語言的上學期,大概就一些基本語
法,後來教到指標陣列,陣列指標、函數指標、遞迴等等時,還有一些標準I/O函式
時,很多數學系的同學就投降了。這就是我所謂的勝之不武吧。
這一科在資訊學院的重要性,應該是重要到不能再重要了,如果指標的觀念沒有完全搞
懂時,大二時教授資料結構時,那些鏈結串列、堆疊、駐列、二元數很理所當然的就看
不懂code。然後後續許多交Project的課程,就要附著在某些熱血同學身上。
我們資訊系的C語言教上下兩學期,名稱叫做「計算機程式設計」,下學期我是在資訊
系修的,期中考滿分100分,當時只有三個人及格,這又是另一個勝之不武的故事了。
不過對於長期慣用指標,對我也是有副作用,我在大二時,Java開始流行,由於Java沒
有指標,我用起來就礙手礙腳的,例如對於一個字串的倒轉、合併等等的處理,我用C
只要把幾個指標加加減減就OK了,但是來到了Java,我居然不知道怎麼寫了,所以我的
Java說真著一直不熟。不過後來Java的出現對於資訊學院的學生來說,不見得是好事,
不是不用學有指標的C語言,而是要雙修C語言跟Java。真的是時代的洪流啊。
當然有個知名電腦作家說過「使用指標需要一點天份,因為他用到大腦雙重間接思考的
部份。」所以Java跟C#等比較不依賴指標的語言,對於擴增coder的數量有很大的助
益,但我不覺得這對於資訊學院學生來說帶來多少優勢,大家想想其他學院如管理學院
等等就知道我的意思了。

2011/9/26

computer graphics(2)

接下來還是computer graphics。
接下來教的是,也就是jserv大大講到的頂點著色單元(Vertex Shader)與像素著色單
元(Pixel Shader),shader這個詞在3D遊戲卡中常常聽到,
昨天anti-aliasing的解答如下:

2011/9/25

資訊學院的30門課 - computer graphics

computer graphics這一門課算是我比較認真的一門課,也是85+認證一族。

課堂一開始,就一直在教畫直線,有人會說,劃直線不就是給個起點與終點,然後呼叫隔壁老王(API),請他幫你油漆就好了嗎?但是如何內插中間的點,而且中間點會有小數,但是pixel位置都是整數,如果給定一個xy線性方程式,要以畫點的api劃出一條線,是相當容易的,但問題是,這個api用了多少次浮點運算,使用了多少個浮點數,這非常的重要,因為FPU比整數運算單元慢很多。學到最後,出社會也不要叫我們寫一個畫直線的api。但是卻很深刻地體認到,程式要跑得快,請注意浮點數的使用,數值程式要跑的正確,請注意浮點數的精確度。畫矩形就跳過去不講。

再還是畫直線,只是畫的是平滑直線,還要交project,沒有修這門課,我永遠搞不懂,大二時我數學系同學問我,為甚麼WINDOWS95的字都糊糊的,大二的我真的答不出來,還敢號稱是資訊系的。原因就是向量字型開啟平滑(ANTI-ALIASING)去鋸齒功能,而且當時解析度很低,例如640X480,邊緣捕的灰階點,看起來就像墨水暈開了,這問題後來怎麼解決的,不用解決啦,面板尺寸變大後,解析度拉高就看不出來了。回到PROJECT,課本只給了一個錐型的微積分方程式,然後老師跟我們說參數把離直線的垂直距離代進去就得到了灰階值。哭了,用C語言怎麼時做一個積分,而且距離直線的距離都是浮點數,也不能用手算後,讓程式查表,老師也沒教。念過數學系的我,這就是我的責任了,答案就留著明天講吧。