2011/12/28

轉學生的作業難題

轉學生與轉系生,很自然地要面對陌生環境的問題,原系的同學都有固定班底了。
我剛轉系時,還好有成功嶺同袍收留我,不然也是分不到組。
隔一年跟大家混熟之後,我要應付的卻是,全班一半都要跟我一組是怎樣。
所以,我只好每一科的組員都不相同。

回歸正傳,你要的作業,書上、網路上都有答案,
對你最好的方式就是,把這些內容內化成你的知識。
然後用自己的方式重新表達出來,
如果這樣,老師、同學、甚至網友都會幫你。

看過很多轉X生的例子,而我是可以在兩個系上自由穿梭的例子。
緣分這種事是不能刻意的,你的懷疑真的是多慮了。
如果你只是單純想要有各組員的話,系上多多少少會有翹課落單的,
主動出擊會比較容易。


我知道你要速成的方式,那我教你,你把網路上的東西,
重新修改弱化成你的版本。如果老師沒有口頭問你,可能ok。

好吧,我又來多管閒事了,分享一個很極端的例子,
我鄰居小朋友,讀南部某間私立技術學院機械科夜間部,
他的說法是,本來以為會落榜,結果還有學校,所以自稱黑馬!?
他不知道現在錄取率多高嗎?我們封他一個外號「白濫X」,

考試怎麼考的呢?老師都會洩題,
同學分兩種,一種比較認真的,就是會做小抄的,不是把題目背起來喔,是做小抄,因為考的一模一樣。
另外一種,比較不認真的,就是考試等著別人抄完小抄,然後傳給他的。不過他還是被當了。

為甚麼?他跟我說,因為坐的太遠,小抄還沒傳到他這邊時,已經下課了。
反正被當都是別人的錯,坐太遠是塞車的錯,小抄沒傳給他是同學的錯,
沒洩題都是老師的錯,考太難是課程的錯。

反正都不是「白濫X」自己的錯,至此我深深的思考,我們國家普及高等教育的政策,是哪裡錯了?

以下開放公幹,對象是我或者我鄰居都可以。

2011/12/27

C# Abstract override修飾子

Abstract修飾子修飾Animal 的MakeNoise函式,這跟C++的虛擬函式是一樣的,
只定義類別函式的名稱但沒有寫程式碼。而在子類別中用override修飾子修飾
MakeNoise函式,
覆寫了父類別所沒有寫的程式碼

abstract class Animal
{
public abstract void MakeNoise();
}
class Cat : Animal
{
public override void MakeNoise()
{
Console.WriteLine("Meow!");
}
}
class Dog : Animal
{
public override void MakeNoise()
{
Console.WriteLine("Woof!");
}
}

C#的資料型態對應到.NET結構,原因是為了讓C#能夠跟.net語言相容。

This design is a part of what makes your C# code portable to other .NET
languages. The C#
values map to .NET structures that can be used by any .NET language, because
any .NET
structure can be used by the CLR. Mapping C# keywords to .NET structures
also enables the
structures to use techniques such as operator overloading to define the
value's behavior when
the type is used in an expression with an operator. You'll examine operator
overloading when
you learn about C# classes.

原來C#的資料型態對應到.NET結構,原因是為了讓C#能夠跟.net語言相容。
因為.NET結構可以對應到CLR。

2011/12/26

C# 定義結構的索引

C# 定義結構的索引 感覺就像是[]的負載而以
Defining Indexers in Structures
Indexers are objects that enable a structure to be indexed in very much the
same way that
arrays do. With an indexer, you can declare several structures at the same
time and refer to
each structure using an index number. This is demonstrated in Listing 7-7,
which declares a
structure called MyStruct containing a string and an index.
Listing 7-7: Including an Indexer Within a Structure
class Listing7_7
{
struct MyStruct
{
public string []data ;
public string this [int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
}
public static void Main()
{
int x;
MyStruct ms = new MyStruct();
ms.data = new string[5];
ms[0] = "Brian D Patterson";
ms[1] = "Aimee J Patterson";
ms[2] = "Breanna C Mounts";
ms[3] = "Haileigh E Mounts";
ms[4] = "Brian W Patterson";
for (x=0;x<5;x++)
System.Console.WriteLine(ms[x]);
}
}

你的興趣與專長,從你的心去找,只有你知道。

現在是多元化的社會,法定時薪將由103元起跳,
沒有必要去追逐大家認為一樣的路,但卻不是你擅長的路。
每個人只要有一種專長達到專業程度,就能生存,不管是IT、英文、寫作、烹飪、公
關•••••,
你的興趣與專長,從你的心去找,只有你知道。

我舉個例子,玩線上遊戲時,
明明我就是一個魔法師,我的專業就是魔法攻擊,我要提高的就是MP,
我沒有必要去學戰士一樣,去加強力量,或者物理攻擊。
不人云亦云,要抓對自己的方向。

2011/12/23

如何壓縮Hyper-V的vhd檔

我發現光光刪除Hyper-V虛擬機器中的檔案不能減少vhd檔案大小,
這也沒錯,因為光光看名稱dynamically expanding virtual hard disk,動態擴展,
並沒有動態減少,
而且考慮到Disk固有的外部破碎(external fragmentation),直接縮減vhd大小也顯然
很奇怪。
直覺就是需要先做defragmentation,然後使用工具或hyper-v的功能去壓縮她,所以我
估到了這篇,
http://blogs.technet.com/b/tonyso/archive/2008/10/09/hyper-v-how-to-shrink-a
-vhd-file.aspx

covarience與contravariance千言萬語不如一段程式碼

Covariance(共變性)與contravariance(逆變性)講了半天,有沒有霧茫茫的感覺。
看一段程式碼就明白囉,varience就是不定型別的變數,像VB就是varience,
而傳統的C/C++包含VC++等等都是variable,也就是在編譯時期就決定了資料型態,
Integer就是integer,char就是char。而varience就是在必要時期,例如run-time時才
決定了資料型態,
使用varience的language很多,例如javascript等等。
下面這是由別的地方擷取出來的C#範例。Delegate是很像function point的東東,要先
懂Delegate才能理解covarience與contravariance,
其實我就把他當成函數參考來看,很少人提到這個,所以我也不翻了,就Delegate
四個函數如下:
static object GetObject() { return null; } static void SetObject(object obj)
{ }

static string GetString() { return ""; } static void SetString(string str) {
}

static void Main()
{
// Covariance. A delegate specifies a return type as object,
// but I can assign a method that returns a string.
//英文寫得很清楚 ==> 共變性就是使用delegate時,這個delegate指定傳回一個物件
(或是說varience),但是在statement中卻指定了一個函數是傳回有型別的變數(這邊是
variable)
Func<object> del = GetString;

// Contravariance. A delegate specifies a parameter type as string,
// but I can assign a method that takes an object.
//英文寫得很清楚 ==> 逆變性就是使用delegate時,這個delegate指定傳入一個
variable (這邊是string),但是在statement中卻指定了一個函數是傳入varience(無
型別的變數)
Action<string> del2 = SetObject;

// But implicit conversion between generic delegates is not supported
until C# 4.0.
//不過在下面這個delegate(函數參考)直接的指定,在C#4.0前卻是不合法的。
Func<string> del3 = GetString;
Func<object> del4 = del3; // Compiler error here until C# 4.0.
}

在給一段msdn的程式碼就懂了...
class Mammals{}
class Dogs : Mammals{}
class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();
public static Mammals MammalsHandler()
{
return null;
}

public static Dogs DogsHandler()
{
return null;
}

static void Test()
{
HandlerMethod handlerMammals = MammalsHandler;

// Covariance enables this assignment.
HandlerMethod handlerDogs = DogsHandler;
}
}
//////////////////////////////////
//contravairence
// Event hander that accepts a parameter of the EventArgs type.
private void MultiHandler(object sender, System.EventArgs e)
{
label1.Text = System.DateTime.Now.ToString();
}

public Form1()
{
InitializeComponent();

// You can use a method that has an EventArgs parameter,
// although the event expects the KeyEventArgs parameter.
this.button1.KeyDown += this.MultiHandler;

// You can use the same method
// for an event that expects the MouseEventArgs parameter.
this.button1.MouseClick += this.MultiHandler;

}

2011/12/1

以儒墨道法四家精神領袖的身份來分析,建置容錯移轉叢集與高可用性的觀點,哪一家學說最為完備?

以儒墨道法四家精神領袖的身份來分析,建置容錯移轉叢集與高可用性的觀點,哪一家學說最為完備?

儒家主張是「博愛」,其理想是「世界大同」,只從事資料備份,萬一系統發生錯誤,修復系統後將資料還原即可。

墨家主張「兼愛」、「非攻」,只需要資料本身隨時可用,萬一需要容錯移轉時,對於實際執行層級效能較不在乎。

道家主張「無為而治」,只在設備上放置乖乖,即可確保系統運作正確無誤。

法家主張「勢」、「術」、「法」,以強兵富國為資料中心之首要,制定完整的SOP與進行頻繁的切換演練,伺服器叢集會在 OS 層級運作,其中涉及重複的硬體及共用磁碟資源,以供叢集存取。

2011/10/27

4個人顧一隻魚顧到飛走

http://www.youtube.com/watch?v=WmtEeAd2DMU&feature=player_embedded

「畢業」

鳳凰木吐露的豔紅,又是候鳥南飛,莘莘學子畢業的時節,天下沒有不散的宴席,鐵人
賽也是,就用「畢業」兩字,做為第四屆鐵人賽分享的休止符。

本系列文章提及課程數,超過30個,課程之廣涵蓋軟體,硬體,應用及理論四大領域。
無非希望日後資訊科系的學弟妹,或者想要唸資訊系的高中畢業生,在搜尋到相關文章
時,能對科系與課程有一個更深入的了解。

也感謝由ithome的SEO做的相當傑出,讓這「資訊學院的30門課」一系列的原創文章,
能夠讓更多人看到。

人外有人,天外有天,一直是我追求知識的態度,天下無處無導師,每一個人,每一件
事,都有在下面的我可以學習的地方,鐵人賽中,百忙之中,協助我更正錯誤的每一位
邦友,都是我知識上的導師。我的學習態度就是,我不懂沒有關係,我只要知道哪裡錯
誤,把他更正過來,往後就是內化成自己的知識。在每個領域都有存在真正的大內高
手,只要能習得這些高手的千分一,就值得欣慰了。

畢業後,面臨的就是人生大轉折,大致上會有幾個方向!
1. 當兵。
2. 國防役或是替代役。
3. 國內或國外繼續深造。
4. 就業。
5. 嫁為人婦。
6. 家裡蹲。(俗稱失業)
而像我比較特別,我是選項六,在家養病,對於人生也有別的感觸,人生最最最重要的
莫過於一個健康的身體了。在鐵人賽的賽事中,真的有考慮過中途放棄,因為這樣每天
擠出一篇原創文章的辛苦,每一位認真的貼文的參賽大大應該最能體會,帶來身體上的
負荷,也與日俱增,不過也終於完成劣文30篇,畢業了。
我曾經想過,如果我沒有重大傷病,我現在人在哪呢?決對不是現在這個地點,這個位
置。而或許是老天爺覺得我人生過的太過於辛苦,要給我一個喘息的機會吧。

2011/10/26

RE: IPTV涵蓋了哪些大學課程

IPTV涵蓋了哪些大學課程,
機上盒 ==> 嵌入式系統 [url= http://ithelp.ithome.com.tw/question/10076053]計
算機組織與結構[/url]
機上盒內AP與遊戲 ==> [url=http://ithelp.ithome.com.tw/question/10074304]計算
機繪圖[/url] [url=http://ithelp.ithome.com.tw/question/10078221]電腦動畫
[/url] 網頁程式設計
機上盒內OS ==> [url=http://ithelp.ithome.com.tw/question/10073965]作業系統
[/url] 系統程式 [url=http://ithelp.ithome.com.tw/question/10073837]編譯器設
計[/url]
媒體撥放器 ==> [url=http://ithelp.ithome.com.tw/question/10074080]數位影像處
理[/url] 視訊壓縮 通訊理論
派送網路 ==> 多媒體通訊
頭端網路 ==> 計算機網路 [url=http://ithelp.ithome.com.tw/question/10074917]
網路與通訊概論[/url]
快取主機 ==> 網際網路技術 作業系統
入口網站 ==> [url=http://ithelp.ithome.com.tw/question/10075109]網際網路技術
[/url]
資料庫主機 ==> [url=http://ithelp.ithome.com.tw/question/10074591]資料庫系統
DBMS [/url]
監控程式 ==> [url=http://ithelp.ithome.com.tw/question/10075384]網路程式設計
[/url] [url=http://ithelp.ithome.com.tw/question/10074591]資料結構
DataStructure[/url]
使用報表分析 ==> 統計學 圖型識別 分群法
[url=http://ithelp.ithome.com.tw/question/10076977]演算法[/url]
VOD主機 ==> 網路程式設計 多媒體通訊
視訊編碼器 ==> [url=http://ithelp.ithome.com.tw/question/10079246]多媒體通訊
[/url] [url=http://ithelp.ithome.com.tw/question/10074080]數位影像處理[/url]
視訊壓縮
上片系統與儲存空間 ==> 網頁程式設計 [url=
http://ithelp.ithome.com.tw/question/10076053]計算機組織與結構[/url]
數位版權管理DRM ==> [url=http://ithelp.ithome.com.tw/question/10078926]密碼
學[/url] 資訊安全
哇咧,一個IPTV幾乎把CS傳統應用課程全用上了!!!!
當然如果拿PS3或XBOX 360來套上去,應該也是差不多。
但是我想要表達的是,真的真的學校這些課程真的用得上。

2011/10/25

多媒體通訊

多媒體通訊包含有多媒體的應用及不同網路的結構 這些包括很多不同媒體的數位表現
形式 還有它們不同的壓縮方法 以及不同媒體應用時它們在通訊上的不同需求 不同類
型通訊網路的操作 以及所需要的通訊規約 還有因應多媒體需求時 這些規約的演化
課程綱要 一 多媒體通訊
二 多媒體訊號表示法
三 多媒體壓縮
四 多媒體通訊的標準
五 公眾電話網路
六 區域網路
七 網際網路
八 無線網路
九 運送規約
http://www.cm.nctu.edu.tw/course/course_cm.php?Sn=33
上面是電機領域的課表,資訊學院的多媒體通訊著重於protocol與系統架構的介紹,以
有別於通訊理論這門較偏重於EE的課程,通訊理論這門課我大學時也有修過,覺得滿有
收獲的。
RTP
VoIP(VoBB)
VOD
IPTV

2011/10/24

密碼學

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

發行量超過一千六百萬張、號稱「絕對不可能被破解」的台北悠遊卡,不敗神話破滅!
前一陣子悠遊卡被破解的新聞,大家應該都還有印象吧。crypto1是悠遊卡所使用的加
密演算法則,居然在維基百科就有連結,而且開宗明義說,幾乎是沒有保護狀態。原來
讀取我們的悠遊卡,跟讀取我們數位相機拍出來的照片,保護等級一個是沒有保護狀
態,一個是幾乎是完全沒有保護狀態("the security of this cipher is ... close
to zero")。到底crypto1演算法哪裡錯了?或者我們教的密碼學哪裡錯了?
其實google的PageRank並無法去篩選文章的正確性,常見google把錯誤的文章放在搜尋
的第一位,比如: 你用RSA去咕台灣網頁的第一頁,他是一篇錯誤很多的文章,繁體中
文第一個連結,http://www.mathland.idv.tw/life/rsa576.htm,雖然RSA的演算法難
度基於質因數分解,但跟網站說的完全不同,RSA其中一支public key開宗明義說了由
兩個質數相乘而成,所以不是質數!!!

The RSA algorithm works as follows: take two large primes, p and q, and
compute their product
n = pq; n is called the modulus

不過這個網頁高懸在google search繁體中文第一位超過一年。RSA相關的連結很多,而
且這是屬於數論與演算法的範疇,我就曾經在演算法這門課Implement過RSA的
Project,只是,寫過的人都知道,實作一個基本的RSA加解密並不難,難的是如何使用
長整數,程式語言32位元長的整數或者64位元的整數都不足以提供足夠的保護,我當時
還很笨的去Implement超長整數的四則運算,很顯然的我的程式有bug,而且沒有適當處
理逸位問題,經過時空的演進,現在要在常見的軟體平台找到超超超長整數的函式庫,
已經不是難事,而且效能還不錯。而crypto1演算法的致命錯誤就在於???金鑰太短。

MIFARE Classic是近年來最廣泛被使用的非接觸式智慧卡,應用在門禁、大眾運輸工
具、電子錢包等系統上。MIFARE Classic上密碼保護機制與結構已被發表在許多的論文
上。在本論文中我們提出各式各樣在MIFARE Classic攻擊實作的經驗。我們實作兩類的
攻擊:一是假造讀卡機、二是側錄合法的交易。第一類的攻擊在兩天內利用NVIDIA高速
運算顯示卡上實作密鑰的窮舉搜尋法與隨機數和連認證的漏洞離線的破解卡片上所有的
金鑰。第二類是針對MIFARE Classic加解密器: CRYPTO-1上攻擊方法的改進。經過我們
的改進,攻擊者不僅可以破解自己的卡同時也能破解別人的卡。我們所實作的攻擊徹底
讓MIFARE Classic的密碼保護失去效用,讓未經授權的攻擊者能任意更改卡片上資料,
如同沒有任何保護的記憶卡。更進一步,我們提出有關防止目前已知的攻擊的建議,而
此防禦機制加強對卡片資料的防護並加強後端清算機制的效率。
http://ndltd.ncl.edu.tw/cgi-bin/gs32/gsweb.cgi/login?o=dnclcdr&s=id=%22098NT
U05442107%22.&searchmode=basic


http://www.rsa.com/rsalabs/faq/files/rsalabs_faq41.pdf

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」是不是被重複算了。
資料集越大,被重複算的運算就越多,程式就越慢。
到這邊是不是有大大已經想到,大的資料集要怎麼處理了呢?

如果您喜歡我的文章風格,歡迎加入FB粉絲專頁 [ kira3c產品評測團] !