看看今天的奧運(yùn)概念股和北京概念股的漲勢。都是靠前的。今年8月8日才開始的奧運(yùn),在股市中現(xiàn)在就開始了。再看看這些股在前期的準(zhǔn)備,就可知,開始的時間更早了。今年股市會圍繞奧運(yùn)展開嗎?要留意拉。想想在這個大事下,有多少消費(fèi)會被迸發(fā)出來,有哪些概念會讓人感興趣,有什么行業(yè)會收益呢,他們會在什么時候會一一表現(xiàn)出來呢?
posted @
2008-01-02 15:47 walkspeed 閱讀(488) |
評論 (0) |
編輯 收藏
對于程序開發(fā),解依賴是很重要的。設(shè)計時要考慮到程序中有那些依賴關(guān)系,如何將他們解開。解依賴并不是說將這些依賴關(guān)系打斷,不要依賴了。而是接觸對實(shí)現(xiàn)的依賴。當(dāng)一個模塊的實(shí)現(xiàn)變了,它的變化不會對這個模塊有依賴的模塊產(chǎn)生大的影響,這就是解依賴了。
解依賴有利于大規(guī)模的程序開發(fā)。大規(guī)模的開發(fā),一個軟件被分成了很多的模塊,解依賴后,這些模塊才可能單獨(dú)開發(fā),對某模塊有深入了解的人才能更關(guān)注與這個模塊的開發(fā)。大家在交流是關(guān)注與依賴的交互,而不是實(shí)現(xiàn)的細(xì)節(jié),有利于在更高層次上討論問題。
解依賴有利于程序的修改和升級。
解依賴有利于模塊測試,集成測試。
解依賴有利于開發(fā)庫的形成。
解依賴中有兩個總要的概念。模塊和接口。模塊的規(guī)模可大可小。大的模塊可以是一個庫,甚至是一個軟件,小的模塊是一個函數(shù),或一個成員。模塊的目的是將一個確定的功能包裝起來,向外提供一個統(tǒng)一的訪問接口。接口是一種聲明,表示某個模塊有那些能力。
posted @
2007-12-29 09:50 walkspeed 閱讀(1308) |
評論 (3) |
編輯 收藏
頭文件 regex.hpp
常用的類
boost::regex 正則表達(dá)式
boost::cmatch 以char數(shù)組為容器,存儲匹配返回值。
boost::smatch 以std::string為容器,存儲匹配返回值。
boost::regex_match 匹配算法
boost::regex_search 查找算法
boost::regex_replace 替換算法
簡單例子
#include <iostream>
#include <boost/regex.hpp>
int main( int argc, char* argv[] )
{
char *buf = "This is boost::regex example";
boost::regex exampleregex( "boost::regex" );
boost::cmatch result;
if( boost::regex_search( buf, result, exampleregex ) )
{
std::cout << result.str() << std::endl;
}
return 0;
}
注意regex.hpp的包含。要在開發(fā)工具中設(shè)置boost頭文件所在位子。
posted @
2007-12-28 14:01 walkspeed 閱讀(9527) |
評論 (0) |
編輯 收藏
瑞銀事件好像讓大家知道了中石油為何表現(xiàn)如此。同時也告訴大家中石油是個好股票,只是
被人操縱了,才變成這樣。而問題又回來了,我們該買中石油嗎?
我想應(yīng)該沒有什么別的答案吧,買,一定要買。
看看中石化,神化都是什么價格。中石油就不應(yīng)該實(shí)在這個價格。
他壟斷。在這個關(guān)乎國家、民族根本利益的行業(yè)里,在可預(yù)期的時間里還是壟斷。壟斷就有
壟斷的利潤。
他是能源。石油是工業(yè)社會的血液,想一想吧。中國在加速工業(yè)化的過程,能少了石油嗎。
新能源在現(xiàn)在這個能源消費(fèi)體系里還是很少以部分(還是可憐的少),作為概念是沒有問題
可是從市場的角度,他們還沒有到動搖石油的底部。要不然美國不用打伊拉克啦。
他也是資產(chǎn)。每個國家都要儲備他,想黃金一樣,要儲備來穩(wěn)定市場。
買它,一定要買。
什么時候買。看自己啦。
posted @
2007-12-28 13:15 walkspeed 閱讀(603) |
評論 (0) |
編輯 收藏
要在分布式系統(tǒng)中找到一個對象,甚至是對象的某個實(shí)例,我們必須給他們一個唯一標(biāo)識。
可以領(lǐng)用UUID來生成我們需要的唯一標(biāo)識。但是在snmp中并沒有選著UUID來標(biāo)識每個對象,而是使用
了自己設(shè)計的Oid。這是為何呢?本人認(rèn)為,UUID雖可以唯一表示對象及其實(shí)例,但是UUID之間沒有什么
關(guān)系,不能形成一種結(jié)構(gòu)來表示對象之間的關(guān)系。而Oid的顯現(xiàn)卻能滿足以上兩點(diǎn),唯一表示對象和顯示
對象之間的結(jié)構(gòu),甚至是對象的實(shí)例的唯一標(biāo)識和實(shí)例之間的關(guān)系。
這也給我們一個啟示,分布式系統(tǒng)中對象的標(biāo)識除了具有唯一性外,要有一定顯示對象之間關(guān)系的能
力,會更好。
posted @
2007-08-31 14:01 walkspeed 閱讀(2594) |
評論 (1) |
編輯 收藏
當(dāng)我們使用函數(shù)時習(xí)慣于C函數(shù)的格式,即如下形式
resulttype funname( arglist );
返回值類型 函數(shù)名( 參數(shù)列表 );
在Boost.Function中,我們可以方便的定義定義函數(shù)對象。不過在定義用來表示類成員函數(shù)的函數(shù)對象時
第一個參數(shù)是類指針。而且在調(diào)用時,要傳入一個類實(shí)例的指針。這樣用起來并不是很方便,因?yàn)檎{(diào)用者
要知道類實(shí)例。這實(shí)際上沒有實(shí)現(xiàn)解耦。而解耦是我們使用回調(diào)或委托設(shè)計的一個目標(biāo)。
為了解決這個問題,我們要使用Boost.Bind庫
Boost.Bind是一個函數(shù)對象工廠。他用來產(chǎn)生我們需要的函數(shù)對象。好了,有了它,你可以在你設(shè)計中大
量使用Boost.Function。不用再去定義類成員函數(shù)形式的函數(shù)對象啦,只用定義普通函數(shù)對象。
一個簡單的例子
class CExample
{
public:
bool printstr( const std::string &str )
{
std::cout << "CExample::printstr" << str << std::endl;
return true;
}
};
//定義一個函數(shù)對象
boost::function< bool ( const std::string& ) > printstr;
//用Boost.Bind創(chuàng)建一個函數(shù)對象,賦給printstr
CExample example;
printstr = boost::bind( &CExample::printstr, &example, _1 );
好了,我們創(chuàng)建了一個函數(shù)對象,而且調(diào)用時不再需要類實(shí)例拉。用Boost.Function和Boost.Bind大大
的簡化了Command模式的實(shí)現(xiàn)。
在上面的例子中要個古怪的對象"_1"。這個叫做站位符,他代表這個位置有個參數(shù),但現(xiàn)在還不知道參
數(shù)是什么。_1代表參數(shù)列表中的第一個位置上的參數(shù)。Boost.Bind一共定義了9個站位符對象。如下
_1,_2,_3,_4,_5,_6,_7,_8,_9。分別代表參數(shù)列表中位子。
Boost.Bind產(chǎn)生的函數(shù)對象可以直接使用,利用上面的例子。
bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );
posted @
2007-07-20 17:15 walkspeed 閱讀(12856) |
評論 (3) |
編輯 收藏
Boost.Function庫用來提供一個對象化的函數(shù)指針。
函數(shù)指針對設(shè)計很有用。它使調(diào)用者可以延期調(diào)用,調(diào)用時機(jī)由調(diào)用者確定。而且可以改變
響應(yīng)者,以應(yīng)對不同的要求。
C中的函數(shù)指針只能用于自由函數(shù)。在C++中除了自由函數(shù)還有函數(shù)對象和類成員函數(shù),這些
C的函數(shù)指針是無法用的。這要求能適應(yīng)C++語言的函數(shù)指針。既然C++語言本身沒有提供,
那就提供一個庫。stl提供了,但是定義了很多類型,使用起來并不是很方便,而且函數(shù)參數(shù)
的個數(shù)被限定在兩個以下,更能是備受限制。Boost.Function庫提供了一個好的解決方案。
Boost.Function庫可以支持自由函數(shù),函數(shù)對象,類成員函數(shù)。而且參數(shù)個數(shù)多達(dá)10個。
Boost.Function庫利用模板技術(shù)來實(shí)現(xiàn)。生成的代碼有很高的運(yùn)行效率。本庫可以不用編譯
直接使用。
Boost.Function的頭文件。
function.hpp
定義一個Boost.Function的對象(是一個返回值類型為int,第一個參數(shù)是std::string類型
第二個參數(shù)是float類新)
boost::function< int ( std::string, float ) > funptr;
上面這個定義方式是一種容易理解的定義方式。但有些編譯器不支持,如果想更多的編譯器
支持,則用下面這種定義方式
boost::function2< int, std::string, float > funptr;
注意模板中有3個類型,而function類卻是boost::function2。應(yīng)為返回值類型不計算在參數(shù)
類型中(原因很簡單,C++的編譯器不會根據(jù)返回類型不同來區(qū)分函數(shù)定義的不同)。
int freefun( std::string str, float f )
{
std::cout << str << " : " << f << std::endl;
return 0;
}
class CFun
{
public:
int operator() ( std::string str, float f )
{
std::cout << str << " : " << f << std::endl;
return 0;
}
}
上面定義了一個自由函數(shù)和一個函數(shù)對象。下面將把他們付給function對象。
賦值為自由函數(shù)
funptr = &freefun;
賦值為函數(shù)對象
CFun fun;
funptr = fun;
以上兩種情況的調(diào)用方法一致,如下
funptr( "float =", 10.0 );
Boost.Function對象要能指向類型原函數(shù),其定義要如下
class FreeClass
{
public:
int out( std::string str, float f )
{
std::cout << str << " : " << f << std::endl;
return 0;
}
};
boost::function< int ( FreeClass*, std::string, float ) > funptr;
跨平臺的定義方法
boost::function3< int, FreeClass*, std::string, float > funptr;
賦值方法
funptr = &FreeClass::out;
調(diào)用方法
FreeClass fc;
funptr( &fc, "float =", 10.0 );
posted @
2007-07-18 13:28 walkspeed 閱讀(10612) |
評論 (2) |
編輯 收藏
領(lǐng)域分析--認(rèn)識領(lǐng)域分析
軟件分析的開端一般是需求分析。但是在實(shí)踐中,發(fā)現(xiàn)了很多的問題。
1 用戶的需求并不是有用戶提出。在和用戶或軟件的風(fēng)險承擔(dān)者交談后,會常發(fā)現(xiàn),他們對自己想要的
軟件并不是很清楚,會提出一些籠統(tǒng)的要求。在開發(fā)出一個原型后,他們會修正或更改,甚至推翻他們
的需求。你會發(fā)現(xiàn)是你在不斷的提出、完善需求,用戶或風(fēng)險承擔(dān)者只是在裁決你的需求。而這樣下去
你的軟件要不斷的改,好像遙遙無期。
2 需求多是一種功能的集合。軟件出來后,如果有了改動,或在新的項(xiàng)目中去復(fù)用以前的軟件會發(fā)現(xiàn)很
難。對每個需求,你不得不從頭開始。
領(lǐng)域分析和需求分析不同,它不是面向功能的。而是面向問題的。這有些像考試中解題。針對特定的問
題,來提供解決方案,并在這個方案的直接指導(dǎo)下解出題目。這個直接指導(dǎo)很有意義,應(yīng)為直接指導(dǎo)表
示解題的方案將被應(yīng)用到解題的過程中(即是可實(shí)現(xiàn)的)。
領(lǐng)域分析不是對要構(gòu)造的軟件進(jìn)行全面的分析。而是對軟件涉及到的特定的領(lǐng)域進(jìn)行分析(如寫多媒體
軟件,你要對音視頻領(lǐng)域進(jìn)行分析)。而領(lǐng)域是與特定的知識相關(guān)聯(lián)的(如音視頻領(lǐng)域中關(guān)于音頻、視
頻編解碼知識,領(lǐng)域分析要搞清楚這個領(lǐng)域中的知識,找出各知識點(diǎn)中的關(guān)系,并對它們進(jìn)行抽象,形
成模型。領(lǐng)域分析強(qiáng)調(diào)的是問題域。這就是說它面對的是一個相對確定的范圍。軟件要解決的是一個相
對確定的范圍。也有利于測試軟件。
領(lǐng)域分析不能代替需求分析,但是可以脫離需求來對特定的領(lǐng)域進(jìn)行分析。領(lǐng)域分析后產(chǎn)生的設(shè)計要直
接指導(dǎo)實(shí)現(xiàn),可以映射到軟件中。由于領(lǐng)域分析是面對問題的,它產(chǎn)生的軟件不一定能滿足需求,可能
根本就對應(yīng)不上需求。但是它是特定問題的解決方案,可以作為一個機(jī)制來支持需求的實(shí)現(xiàn)。而且特定
的問題或著說這種反應(yīng)某個領(lǐng)域中的知識關(guān)系的軟件其對應(yīng)的是一種穩(wěn)定的需求,比較容易復(fù)用、測試
和發(fā)展。
面對需求分析得到是一種應(yīng)用的要求。而根據(jù)軟件涉及的領(lǐng)域進(jìn)行分析,得到的是它的基本機(jī)制。應(yīng)用
是多樣的,而機(jī)制其實(shí)就只有那么幾個。根據(jù)應(yīng)用的要求來組合這些機(jī)制。這樣需求的變化,并不會去
過多的沖擊你通過領(lǐng)域分析得到的模型和實(shí)現(xiàn)。你要做的是對他們進(jìn)行組合。
posted @
2007-07-11 15:54 walkspeed 閱讀(2778) |
評論 (3) |
編輯 收藏
new出來的空間如果沒有主動銷毀,在程序退出時仍可能有內(nèi)存的泄露。
操作系統(tǒng)描述到,在進(jìn)程退出時會銷毀它所使用的所有內(nèi)存空間,但這只是
一個模型上的構(gòu)想和描述。在實(shí)際的操作系統(tǒng)的實(shí)現(xiàn)上并不能做到這一點(diǎn)。
因?yàn)椋獙?shí)現(xiàn)在進(jìn)程退出時銷毀它所使用的內(nèi)存空間,就要給每個被使用的
內(nèi)存空間打一個標(biāo),表示這段內(nèi)存空間被那個進(jìn)程使用。在這種情況下,如
果有多個使用小內(nèi)存量的進(jìn)程,并且被頻繁的創(chuàng)建和銷毀,那么光記住那些
進(jìn)程標(biāo)致就要占用很大的內(nèi)存空間,這是一個很不劃算的方案。所以在實(shí)際
中,操作系統(tǒng)并沒有給每個進(jìn)程使用的內(nèi)存空間打標(biāo)。這樣,有些小內(nèi)存是
沒有被回收的,如果多次開關(guān)這個程序就會發(fā)現(xiàn),有內(nèi)存被大量的占用,而
不能被釋放。
所以那些在程序中只有一個實(shí)例,并且是被new出來的對象,也應(yīng)該主動
的去手動銷毀,而不能依賴程序退出時由系統(tǒng)銷毀。
被new出來的對象其銷毀是兩個步驟。
1 析構(gòu)對象。條用對象的析構(gòu)函數(shù),將對象占用的資源釋放掉。
2 釋放內(nèi)存。將對象所占用的內(nèi)存釋放掉。
如果new出來的對象沒有被銷毀,會造成連個層面上的泄露。
1 對象泄露。他會造成背對象占用的資源也沒有銷毀或釋放。比如在對象
中占有文件的句柄,在析構(gòu)時才釋放。如果對象泄露了,這個句柄是不會被釋
放的。那個文件會一直被占用。如果文件打開時是獨(dú)占的,那么及時對象所在
的程序退出了,別的程序也別想訪問這個文件。
2 內(nèi)存泄露。所占用的內(nèi)存不能被釋放。
posted @
2007-05-31 10:50 walkspeed 閱讀(2705) |
評論 (5) |
編輯 收藏