2011/12/23

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.
}

下象棋 除了帥之外 每一子都是可以犧牲的

長官一直認為他是帥 這沒錯
下屬都是棋子 下象棋 除了帥之外 每一子都是可以犧牲的
不管他幫你吃了多少黑子

2011/12/22

C#: Covariance與Contravariance的不同

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.
Func<object> del = GetString;

// Contravariance. A delegate specifies a parameter type as string,
// but I can assign a method that takes an object.
Action<string> del2 = SetObject;

// But implicit conversion between generic delegates is not supported
until C# 4.0.
Func<string> del3 = GetString;
Func<object> del4 = del3; // Compiler error here until C# 4.0.
}

Future reading:
http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contrava
riance-faq.aspx

C#資料型態的轉型與運算子優先順序

今天我寫了一C#段程式碼,目地是要抓取DrowDownList1被挑選的順序,然後加一就是
資料庫內的定義。
String sql = "insert into tablename (field1, field2) values " +
DrowDownList1.SelectedIndex + 1 + ", 'abc'";
看似上面的code沒有問題,如果不把sql印出來看,我想很多人不知道問題所在。恍然
一看完全抓不出頭緒,
一開始我還以為是URL編碼問題,很顯然一直抓錯方向,浪費時間,一直到我把DB
Server內所有的資料Select出來之後
才發現怎麼會有field1的value是11的,這時我才恍然大悟,原來
DrowDownList1.SelectedIndex是int ,1也是int,
自然會以為它們會先相加,結果錯了,不知道甚麼規定,
DrowDownList1.SelectedIndex與1都被轉型成string,然後用字串的加,也就是字串合
併。
好難抓的BUG喔,如果是C或C++這種不提供加號作為字串合併的語言,就不會有這種問
題,方便性之外,也提供了犯錯的方便性。
怎麼解自然不用多說了,(DrowDownList1.SelectedIndex + 1)前後加上,讓他先算就
好了。
順道一提一個在C# C++ C都會犯上的錯誤習慣
並不是說這樣寫是錯的 是很容易犯錯 所以是壞習慣
Response.Write(i++);
Printf("debug i=%d", gdb(&i));
本來上面的程式碼只是拿來除錯用
但是卻在裡面進行的區域變數的變動或者呼叫其他函數,而且還是call by address
這樣萬一以後取消這些print或dump的程式碼時 往往容易忘記裡面又進行了區域變數的
變動或者呼叫其他函數
特別是當要dump的information很長時

2011電信創新應用大賽冠軍榮耀誕生 激發創意能量 提升台灣軟實力

2011電信創新應用大賽 25萬冠軍得主榮耀誕生

激發創意能量 提升台灣軟實力 迎向全民數位新生活

中華電信今年首度擴大舉辦的「2011電信創新應用大賽」歷經9個月的激戰,即將進入最終高潮,其中『網路擂台』報名人數一舉突破23萬人次,並87日完成頒獎,而『創作擂台』7大主題共10,547組隊伍報名角逐,作品以生活應用為最大宗,其中休閒娛樂、觀光旅遊、居家監控、健康照護、商務管理等應用範疇最受評審肯定,最終由117組優秀隊伍進入頒獎典禮的殿堂,迎接屬於自己的創新榮耀!為讓入圍之優勝隊伍秀出令人驚豔的創意作品,頒獎典禮除安排音樂創作組冠、亞軍樂團LIVE表演外,主辦單位更首次結合中華電信雲端環境,打造整合展示區,公開展示創意傑作!此外,9月份完成決賽的音樂創作冠、亞、季軍作品,於專業評審老師的指導育成後,已上架至HiNet 音樂網、KKBOXhami music,歡迎消費者免費收聽或下載。

中華電信董事長呂學錦先生表示:「中華電信連年舉辦電信創新的比賽,我們藉由『網路擂台』讓數位學習向下扎根,使e化學習更加普及,而透過『創作擂台』提供高中職、大專院校學生及社會人士完備的創作環境與應用軟體開發工具,激發創新創意,提升資通訊軟實力,我們期待透過激發想像力與推動全民創作風潮,期許台灣成為創新發明的寶島

掌握時勢 行動遊戲、應用 豐富數位新生活

2011電信創新應用大賽-創作擂台」7大組別「行動應用」、「雲端應用」、「智慧家庭」、「音樂創作」、「文學創作」、「整合行銷」、「應用創意」,其中「行動應用組」共報名1,333隊競爭最激烈,首創【創新遊戲】類別,作品多元富創意,從集結想像力與實體的聲控遊戲、RPG角色扮演與模擬養成遊戲,此外【創新應用】類別則充分融入生活中最夯的隨身閱讀、健康塑身、綠能環保減碳需求,實際應用能力令評審激賞!而「文學創作組」也為首次舉辦,分【簡訊】、【散文】、【小說】3類,共收到6,415件作品響應熱烈,其中【簡訊文學】收件近5,500件,作品巧妙反映社會現象及日常生活省思,參賽者將細膩巧思以簡短的文字表達,勾起評審共鳴。

交通部長毛治國受邀見證榮耀時刻表示,「中華電信多年來積極帶動數位內容產業蓬勃發展,成就有目共睹。看到台灣的創意人才有這麼優質的平台可以展現自己的創新軟實力,感到十分的欣慰。今天在台下的每一位都是菁英,我相信有這麼多優秀的台灣之光,絕對可以讓台灣數位內容產業再向前邁進一大步。」

展現三平台整合實力 電信創意放眼2012

為配合政府的數位雨林政策,中華電信今年開放雲端hicloud、行動Hami及光世代MOD等三大平台完備的創作環境與應用軟體開發工具,鼓勵全國各系所領域的青年學子與社會人士都能共同發揮創意進行創作,有效提升國內資通訊的軟實力明年將邁入高畫質數位電視元年,中華電信除將繼續舉辦2012電信創新應用大賽推廣行動、網路等電信應用創新外,也將同步鼓勵創新數位電視應用程式,希望能鼓勵更多的學子及社會人士投入,開創電信應用新契機。

#  #  #

關於電信創新應用大賽

「腦袋放亮點!」中華電信配合政府的數位雨林政策,鼓勵創新應用發展,自2003年開始,每年舉辦電信加值應用大賽,推動電信創新服務開發風潮、發掘培育大專院校軟體開發人才及促進數位內容產業之蓬勃發展。2011年更首度整合十年有成的「HiNet網路擂台大賽」以及歷時八年的「電信加值應用大賽」兩大賽事,推出規模擴及國中小、高中職、大專院校及社會人士的「2011電信創新應用大賽」。