2007年7月25日 星期三

Boost 1.34.1 Released

http://www.boost.org/index.htm

It is a recommended upgrade for all users of Boost 1.34.0


那些新的lib還沒被納入,例如asio等。據mail-list上的可靠消息指出,要等到1.35.0才會加進來......

2007年7月24日 星期二

How to interpret complex C/C++ declarations

http://www.codeproject.com/cpp/complex_declarations.asp

C時代的指標已經夠複雜了, C++時代又加入了const和reference這兩個東西, 事情愈來愈複雜了。

int const * n;

像const被塞在中間, 我想初學者一定會很不確定說這個const到底是修飾int, 還是指標? 上面那篇文章提了一個"讀懂宣告"的秘訣......就是由右往左讀。所以, n是一個指標指向一個const int。

int *&p;

那這個呢? 一樣由右往左讀, p是一個reference參考到一個int指標。

const char * const * const s;

這個例子就比較極端了......正常情況下應該要避免這種複雜的宣告。但是, 還是給他解讀一下, s是一個const pointer to const pointer to const char。這個宣告等於下面這個宣告:

char const * const * const s;

const char變成char const而已, 不過這樣的宣告方式就讓由右向左的讀法比較通順了, 所以, 宣告的時候要盡量寫成這種讀起來比較通順的style。

2007年7月11日 星期三

2007年7月9日 星期一

Boost Pointer Container

http://www.boost.org/libs/ptr_container/doc/ptr_container.html

顧名思義就是存放pointer的container,exception-safe。以前我們會用這樣的方法來存放pointer:

std::vector<MyClass*> myvector;
myvector.push_back(new MyClass());
myvector[0]->do_something();

上面這段code還沒寫完喔,因為我們存的是pointer,所以之後還要去注意釋放那些pointer所allocate的memory。

現在Boost Pointer Container裡面有個ptr_vector可以對應std::vector

boost::ptr_vector<MyClass> myvector;
myvector.push_back(new MyClass());
myvector[0].do_something();

code有點不一樣,可以看到的是,我們無法從Pointer Container取回pointer了,這可以避免一些意外情況發生。另外,所有的Pointer Container都會在解構時自動釋放pointer所佔的記憶體。

看到這邊有人可能會想:不過是自動釋放記憶體嘛......我自己寫code都很細心,都會注意memory的釋放,這個pointer container沒多大用處嘛。不過,Pointer Container最重要的重點是exception-safe,何謂exception-safe?參考下面這一段code:

void func()
{
std::vector<MyClass*> myvector;
myvector.push_back(new MyClass());

try
{
// Exceptions may occur here
}
catch(...)
{
throw;
}

// I'm a good programmer
delete myvector[0];
}

在exception發生時,還沒到釋放memory的地方就跳出function了,這裡就會造成memory leak。雖然我們可以在catch裡都加上處理記憶體問題的code,但這樣的作法可能會非常的tedious(沒有人會想在每個catch裡都寫一次release memory的code吧?)。所以,有人會用std::auto_ptr或boost::shared_ptr這種smart pointer來解決這種問題:

std::vector<boost::shared_ptr<MyClass> > myvector;

C++ exception handling保證跳出function以前,所有的stack object都會被正常清除。所以上述的smart pointer都能夠保證在exception發生時,自動釋放pointer所指的memory。不過,使用smart pointer會多出一些overhead,而Pointer Container內部的實做則是直接將指標轉換成void*來儲存,顯然比smart pointer的效率要高。

基本上每個STL container在Boost Pointer Container都有互相對應的類別可以使用,例如vector對應ptr_vector,map對應ptr_map,操作方法也一樣,還擴充了一些便利的方法,例如我們可以直接用ptr_map.insert(k, v),不必像以前的std::map還要先create出一個pair object。

2007年7月4日 星期三

ClickClickClick的後續......

Click*3續觀察 : 圖形驗證與網路分工

Mr./Ms. Days上的一篇文章,詳細的解說了各個兵器的技術細節。

原本以為只是一個無聊遊戲,就像以前有一個自動練功的online game,只要掛著縮小到系統列就會自動升級,非常的空虛......那時候剛開始也是很流行,不過沒多久鄉民們就玩膩了。這次的click*3巧妙的把競爭層級拉到國與國之間的戰爭,因此在民族情感的發酵作用下,各國鄉民(宅宅?)們前仆後繼,就算是如此空虛的滑鼠點擊比賽也一直樂此不疲。

值得一提的是,網站主人並沒有刻意限制web robot(或許這才是他的目的?),於是讓各方人馬相繼開發出各種不錯的自動化兵器,看起來還蠻有趣的耶。真希望我還是學生,那我就有時間可以來玩玩這個了......

2007年7月2日 星期一

青山瀑布

在台北縣石門鄉,很好走的山路,沿途都是樹蔭,瀑布水量大,而且底下沒有深潭,比較適合玩水。



















還有人直接在瀑布底下作SPA...




















樹蔭非常多,多到會冷......


























6/30從青山瀑布下來後,順道去淡水花海節,非常後悔......花種少不說,一堆雜草都沒有清掉,儼然就像是把花種撒下去任它長一樣。而且因為烈日照射,唯一可以看的向日葵都枯乾的差不多了,還有......連個主題攤位都沒有,就是一堆枯掉的野花,和很多賣涼的攤販,總之我建議沒事不要去啥花海節了。

態度問題

蔡明里的棒球相對論


最近常常在想,有人就是從來不會檢討自己,失敗的原因絕對是其他因素。愈來愈對這種態度感觸良多,沒想到今天看一下Yahoo的Blog摩人,就看到蔡明里的文章一開頭就講到跟我一樣的觀點,這該說是巧合,還是真的很多這種人呢?

古人說:「滿招損,謙受益」,講是這樣講,可以做到的好像不多,我有時候也是很自命清高,不知道在屌什麼的樣子XD