2008年3月17日 星期一

CMake

CMake - Cross-Platform Make

它的makefile就是一個txt檔, 可以在不同平台上產生不同的makefile, 例如在VC8裡它就可以產生sln和vcproj, 在linux上就會產生unix-style的makefile (而且還有彩色的進度呈現......cool)

簡單易上手, 很多人在用(KDE也採用), 所以文件資源豐富, 跟我之前在用的Boost Build比起來, CMake真的是比較好找到需要的文件或解答, 所以我跳槽了= ="

2008年2月22日 星期五

ClamAV - open source的防毒軟體

ClamAV AntiVirus

Wow, 連防毒軟體都有open source的(其實也沒啥大驚小怪的, 整個OS都可以open source了不是嗎), 想知道防毒軟體怎麼運作的, 這是個很好學習的對象。不過這是專門用來在gateway上掃毒的, 所以可能跟一般個人用防毒軟體有點差距。

其實是因為最近open source社群有件事情, 才讓我注意到這個軟體, 請看Boycott Trend Micro。起因就是Barracuda Networks這家公司想要把他們產品內的掃毒引擎由趨勢的東西換成ClamAV, 乍看之下好像沒啥問題 - 我不想用你們的東西, 換個東西用應該沒犯法吧? 但是!! 重點就在於趨勢手上握有一項專利 - 在gateway上掃毒。所以趨勢要求Barraccda要付給他們patent fee, 就因為Barracuda在gateway上掃毒侵犯了他們的專利權= =

趨勢之前好像也靠這個專利告贏了幾家廠商, 沒辦法, 這就是法律。坦白講我自己覺得這是專利權危害軟體發展的最好例子, 在gateway上掃毒只是個概念而已吧? 又不是像光碟片有自己特殊的製造技術, 所以擁有這個製造技術的專利。趨勢這樣搞法, 以後大家想要實做一項在gateway上掃毒的技術, 不就都綁手綁腳的嗎?

2008年2月21日 星期四

Wubi

Wubi - unofficial Ubuntu installer for Windows

1. 直接在Windows安裝, 不用燒安裝CD
2. 不用分割硬碟, 它把Ubuntu裝在一個資料夾裡, 所以反安裝也很簡單
3. 不用安裝bootloader, 安裝完直接重開機就可以選擇Windows或Ubuntu
4. 效能幾乎一樣, 差別只在硬碟存取可能比較慢, 這跟磁區的defragment有關

很無痛的玩法......

2008年2月4日 星期一

dbgdel.cpp的錯誤......

code老是無預警當掉, 用VC的debug build來run, 卻總是出現以下訊息
_ASSERT(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
而且還是dbgdel.cpp的錯誤......

google了一下, 原來double free記憶體或是buffer overflow都是這樣子的exception, VC這樣寫還真的是看不懂啊
而且, VC的release build並不會馬上對double free做出反應, 而是在不定時間crash = ="
參考以下簡單的一段code



int main(void)
{
char *n = new char[32];
delete n;
delete n;
return 1;
}


這樣的double free用VC 2005的release build來run沒有問題, gcc 4.1.1倒是會印出double free or corruption。不過, 寫作習慣比較好(這表示...偷懶的時候常常會省略)的coding方法應該要避免這種dangling pointer:




int main(void)
{
char *n = new char[32];

delete n;
n = NULL;

delete n;
n = NULL;

return 1;
}


free前先檢查是不是null pointerThe ANSI standard ANSI X3.159-1989 "Programming Language C." specifies that free(NULL) is a no op. "free deallocates the space pointed to by p: it does nothing if p is NULL." Quoted from "The C Programming Language" second edition by Kernighan and Ritchie with the subtitle "ANSI C"., free完的pointer一律設為null pointer(free完就不理它的話, 就叫做dangling pointer啦) 很麻煩的寫法, 不過卻可以保命......抓這種bug可是會要人老命的。

2008年1月29日 星期二

Floating Point Exception

參考文件


今天用FC6的機器compile了一隻程式, 丟到FC4的機器上跑, 想不到一開始就給了我一串令人挫折的訊息 - Floating Point Exception。原來FC6以後版本的gcc現在在link的時候會採用--hash-style=gnu這個hash方式, 據信可以提昇動態鍊結50%的效率。然而, 舊的glibc版本並不支援, 所以想要在舊的glibc版本上跑的話, link的時候記得加上 -Wl, --hash-style=sysv。

2008年1月28日 星期一

C++ STL - Iterator的erase



std::vector<int> v;
v.push_back(0);
std::vector<int>::iterator vi = v.begin();
while(vi != v.end())
{
if(*vi == 0)
{
v.erase(vi++);
continue;
}
++vi;
}


以上這段code在VC2003上run是正常的, 用gcc 3.2.2的話會造成segmentation fault。

很明顯的, vi++這個iterator的運算在兩個平台上有不同的implementation, gcc是先erase才做++的動作, 因為erase後iterator會指向無法預測的地方, 所以才會產生seg-fault。而VC2003則是先++才把原iterator傳進去, 所以沒有問題。

正確的寫法應該是 vi = v.erase(vi);

2008年1月16日 星期三

破冬感言

破冬是軍中術語, 指的是役期只剩下一年了, 所以我也可以使用破冬這個詞了
感想很多, 當然都是不好的, 我只想講一個對後進比較有用的結論
那就是剛出社會的年輕人不要一開始就綁死自己, 像我一開始就必須要留在同一個地方四年
如果這個地方是好的, 那四年或許還可以持續的學習與成長, 甚至累積財富
如果是不好的, 那真的很浪費, 因為年輕人的時間很寶貴, 這段時間的頭腦還很清楚, 體力也比較充沛
應該要好好的利用, 畢竟人生中這段精華的時間不會再有了

剩下一年的時間, 我打算把還沒學到的部份都學一學看一看, 作一個我可以引以自豪的東西
開會臨時硬湊出來的神奇idea, 居然就成為以後產品的主軸, 讓人覺得不知所措
整天寫super-specialized demo code去搶案子, 真的讓人很沒成就感
人家說工作的動力是來自成就感和金錢, 兩者都沒有的情況下, 真的會覺得很沮喪

聽說接下來這裡又接了很多案子, 但是我可以保證, 這一切一定又只有一個結果 - 失敗
失敗之前的掙扎想必又是一陣腥風血雨, 但是沒關係, 這一切都還有個望得到的盡頭
羅馬書上面寫著『忍耐生老練,老練生盼望』, 聖經上寫的過程居然和我這三年不謀而合
沒錯!! 開始擺老之後接下來就是盼望了, 姆哈哈