系統(tǒng)會(huì)用到下面幾種寄存器: 1.EIP 2.ESP 3.EBP。三者的作用。
1.EIP寄存器里存儲(chǔ)的是CPU下次要執(zhí)行的指令的地址。
2.EBP寄存器里存儲(chǔ)的是是棧的棧底指針,通常叫?;?,而這個(gè)地址是由ESP在函數(shù)調(diào)用前傳遞給EBP的。等到調(diào)用結(jié)束,EBP會(huì)把其地址再次傳回給ESP。所以ESP又一次指向了函數(shù)調(diào)用結(jié)束后,棧頂?shù)牡刂贰?br />3.ESP寄存器里存儲(chǔ)的是棧的棧頂。并且始終指向棧頂。
Eax – arithmetic, default location where division occurs (accumulator)是很多加法乘法指令的缺省寄存器。
Ebx – base index for arrays
Ecx – couner (used with the loop instruction)重復(fù)(REP)前綴指令和LOOP指令的內(nèi)定計(jì)數(shù)器。
Edx – data/general 總是被用來(lái)放整數(shù)除法產(chǎn)生的余數(shù)。
Edi, esi – used as indices in string operations
Ebp – positive offsets are the arguments, negative offsets are the local variables
posted @
2011-11-27 23:15 鷹擊長(zhǎng)空 閱讀(152) |
評(píng)論 (0) |
編輯 收藏
最近碰到一個(gè)特別奇怪的bug,程序不能正常退出,GDB追蹤到最后發(fā)現(xiàn)是動(dòng)態(tài)鏈接庫(kù)卸載時(shí)不能正確調(diào)用detach函數(shù),懷疑是引用計(jì)數(shù)的問(wèn)題。弄了半天還是添加手工調(diào)用析構(gòu)函數(shù)解決了問(wèn)題。 這不由讓我想起兩年前一個(gè)同樣的bug讓我頭疼了很長(zhǎng)時(shí)間,也是程序退出時(shí)不能卸載動(dòng)態(tài)鏈接庫(kù),看來(lái)這個(gè)問(wèn)題真是個(gè)普遍的問(wèn)題, 以后寫(xiě)代碼要多注意,不要再依賴(lài)析構(gòu)函數(shù)的實(shí)現(xiàn)了,要適時(shí)完成清理工作。
posted @
2011-11-14 21:33 鷹擊長(zhǎng)空 閱讀(359) |
評(píng)論 (0) |
編輯 收藏
問(wèn)題實(shí)例:給你A,B兩個(gè)文件,各存放50億條URL,每條URL占用64字節(jié),內(nèi)存限制是4G,讓你找出A,B文件共同的URL。如果是三個(gè)乃至n個(gè)文件呢?
根據(jù)這個(gè)問(wèn)題我們來(lái)計(jì)算下內(nèi)存的占用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯(cuò)率0.01算需要的大概是650億個(gè)bit。現(xiàn)在可用的是340億,相差并不多,這樣可能會(huì)使出錯(cuò)率上升些。另外如果這些urlip是一一對(duì)應(yīng)的,就可以轉(zhuǎn)換成ip,則大大簡(jiǎn)單了。
問(wèn)題實(shí)例:
1).海量日志數(shù)據(jù),提取出某日訪(fǎng)問(wèn)百度次數(shù)最多的那個(gè)IP。
IP的數(shù)目還是有限的,最多2^32個(gè),所以可以考慮使用hash將ip直接存入內(nèi)存,然后進(jìn)行統(tǒng)計(jì)。
問(wèn)題實(shí)例:
1)已知某個(gè)文件內(nèi)包含一些電話(huà)號(hào)碼,每個(gè)號(hào)碼為8位數(shù)字,統(tǒng)計(jì)不同號(hào)碼的個(gè)數(shù)。
8位最多99 999 999,大概需要99m個(gè)bit,大概10幾m字節(jié)的內(nèi)存即可。
2)2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。
將bit-map擴(kuò)展一下,用2bit表示一個(gè)數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上?;蛘呶覀儾挥?bit來(lái)進(jìn)行表示,我們用兩個(gè)bit-map即可模擬實(shí)現(xiàn)這個(gè)2bit-map。
問(wèn)題實(shí)例:
1)100w個(gè)數(shù)中找最大的前100個(gè)數(shù)。
用一個(gè)100個(gè)元素大小的最小堆即可。
問(wèn)題實(shí)例:
1).2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。
有點(diǎn)像鴿巢原理,整數(shù)個(gè)數(shù)為2^32,也就是,我們可以將這2^32個(gè)數(shù),劃分為2^8個(gè)區(qū)域(比如用單個(gè)文件代表一個(gè)區(qū)域),然后將數(shù)據(jù)分離到不同的區(qū)域,然后不同的區(qū)域在利用bitmap就可以直接解決了。也就是說(shuō)只要有足夠的磁盤(pán)空間,就可以很方便的解決。
2).5億個(gè)int找它們的中位數(shù)。
這個(gè)例子比上面那個(gè)更明顯。首先我們將int劃分為2^16個(gè)區(qū)域,然后讀取數(shù)據(jù)統(tǒng)計(jì)落到各個(gè)區(qū)域里的數(shù)的個(gè)數(shù),之后我們根據(jù)統(tǒng)計(jì)結(jié)果就可以判斷中位數(shù)落到那個(gè)區(qū)域,同時(shí)知道這個(gè)區(qū)域中的第幾大數(shù)剛好是中位數(shù)。然后第二次掃描我們只統(tǒng)計(jì)落在這個(gè)區(qū)域中的那些數(shù)就可以了。
實(shí)際上,如果不是int是int64,我們可以經(jīng)過(guò)3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個(gè)區(qū)域,然后確定區(qū)域的第幾大數(shù),在將該區(qū)域分成2^20個(gè)子區(qū)域,然后確定是子區(qū)域的第幾大數(shù),然后子區(qū)域里的數(shù)的個(gè)數(shù)只有2^20,就可以直接利用direct addr table進(jìn)行統(tǒng)計(jì)了。
問(wèn)題實(shí)例:
1).有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過(guò)16個(gè)字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。
這個(gè)數(shù)據(jù)具有很明顯的特點(diǎn),詞的大小為16個(gè)字節(jié),但是內(nèi)存只有1m做hash有些不夠,所以可以用來(lái)排序。內(nèi)存可以當(dāng)輸入緩沖區(qū)使用。
問(wèn)題實(shí)例:
1).有10個(gè)文件,每個(gè)文件1G, 每個(gè)文件的每一行都存放的是用戶(hù)的query,每個(gè)文件的query都可能重復(fù)。要你按照query的頻度排序 。
2).1000萬(wàn)字符串,其中有些是相同的(重復(fù)),需要把重復(fù)的全部去掉,保留沒(méi)有重復(fù)的字符串。請(qǐng)問(wèn)怎么設(shè)計(jì)和實(shí)現(xiàn)?
3).尋找熱門(mén)查詢(xún):查詢(xún)串的重復(fù)度比較高,雖然總數(shù)是1千萬(wàn),但如果除去重復(fù)后,不超過(guò)3百萬(wàn)個(gè),每個(gè)不超過(guò)255字節(jié)。
1. 給你A,B兩個(gè)文件,各存放50億條URL,每條URL占用64字節(jié),內(nèi)存限制是4G,讓你找出:A,B文件共同的URL。
解法一:Hash成內(nèi)存大小的小塊文件,然后分塊內(nèi)存內(nèi)查交集。
解法二:Bloom Filter(廣泛應(yīng)用于URL過(guò)濾、查重。參考http://en.wikipedia.org/wiki/Bloom_filter、http://blog.csdn.net/jiaomeng/archive/2007/01/28/1496329.aspx)
2. 有10個(gè)文件,每個(gè)文件1G, 每個(gè)文件的每一行都存放的是用戶(hù)的query,每個(gè)文件的query都可能重復(fù)。要你按照query的頻度排序。
解法一:根據(jù)數(shù)據(jù)稀疏程度算法會(huì)有不同,通用方法是用Hash把文件重排,讓相同query一定會(huì)在同一個(gè)文件,同時(shí)進(jìn)行計(jì)數(shù),然后歸并,用最小堆來(lái)統(tǒng)計(jì)頻度最大的。
解法二:類(lèi)似1,但是用的是與簡(jiǎn)單Bloom Filter稍有不同的CBF(Counting Bloom Filter)或者更進(jìn)一步的SBF(Spectral Bloom Filter,參考http://blog.csdn.net/jiaomeng/archive/2007/03/19/1534238.aspx)
解法三:MapReduce,幾分鐘可以在hadoop集群上搞定。參考http://en.wikipedia.org/wiki/MapReduce
3. 有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過(guò)16個(gè)字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。
解法一:跟2類(lèi)似,只是不需要排序,各個(gè)文件分別統(tǒng)計(jì)前100,然后一起找前100。
posted @
2011-03-14 14:25 鷹擊長(zhǎng)空 閱讀(1225) |
評(píng)論 (0) |
編輯 收藏
不知不覺(jué),離我去年入職差五天就是一周年了,冥冥之中,注定如此吧!想當(dāng)初,年輕氣盛,桀驁不馴;嘆如今,心灰意冷,銳氣全無(wú)。話(huà)說(shuō)回來(lái),一年中,不論是技術(shù)還是心態(tài)都有所提升,技術(shù)上能做些小事,心態(tài)變得更加成熟了。
暫時(shí)的離開(kāi)是為了更好的未來(lái),努力吧!與諸君共勉!
感謝我的頭,感謝我的同事,祝你們工作順利!
posted @
2010-04-15 11:18 鷹擊長(zhǎng)空 閱讀(478) |
評(píng)論 (0) |
編輯 收藏
聲明
#include <bitset>
using std::bitset;
bitset的定義和初始化
bitset<32> bitvec; //32位,全為0。
給出的長(zhǎng)度值必須是常量表達(dá)式。正如這里給出的,長(zhǎng)度值必須定義為整型字面值常量或是已用常量值初始化的整數(shù)類(lèi)型的const對(duì)象。
這條語(yǔ)句把bitvec定義為含有32個(gè)位的bitset對(duì)象。和vector的元素一樣,bitset中的位是沒(méi)有命名的,程序員只能按位置來(lái)訪(fǎng)問(wèn)它們。位集合的位置編號(hào)從0開(kāi)始,因此,bitvec的位序是從0到31。以0位開(kāi)始的位串是低階位(low-order bit),以31位結(jié)束的位串是高階位(high-order bit)。
表3-6 初始化bitset對(duì)象的方法
bitset<n> b;
|
b有n位,每位都為0
|
bitset<n> b(u);
|
b是unsigned long型u的一個(gè)副本
|
bitset<n> b(s);
|
b是string對(duì)象s中含有的位串的副本
|
bitset<n> b(s, pos, n);
|
b是s中從位置pos開(kāi)始的n個(gè)位的副本
|
1.
用unsigned值初始化bitset對(duì)象
當(dāng)用unsigned long值作為bitset對(duì)象的初始值時(shí),該值將轉(zhuǎn)化為二進(jìn)制的位模式。而bitset對(duì)象中的位集作為這種位模式的副本。如果bitset類(lèi)型長(zhǎng)度大于unsigned long值的二進(jìn)制位數(shù),則其余的高階位置為0;如果bitet類(lèi)型長(zhǎng)度小于unsigned long值的二進(jìn)制位數(shù),則只使用unsigned值中的低階位,超過(guò)bitet類(lèi)型長(zhǎng)度的高階位將被丟棄。
bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
// bitvec2 same size as initializer
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
// on a 32-bit machine, bits 0 to 31 initialized from 0xffff
bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero
上面的三個(gè)例子中,0到15位都置為1。由于bitvec1位數(shù)少于unsigned long的位數(shù),因此bitvec1的初始值的高階位被丟棄。bitvec2和unsigned long長(zhǎng)度相同,因此所有位正好放置了初始值。bitvec3長(zhǎng)度大于32,31位以上的高階位就被置為0。
2. 用string對(duì)象初始化bitset對(duì)象
當(dāng)用string對(duì)象初始化bitset對(duì)象時(shí),string對(duì)象直接表示為位模式。從string對(duì)象讀入位集的順序是從右向左:
string strval("1100");
bitset<32> bitvec4(strval);
bitvec4的位模式中第2和3的位置為1,其余位置都為0。如果string對(duì)象的字符個(gè)數(shù)小于bitset類(lèi)型的長(zhǎng)度,則高階位將置為0。
string對(duì)象和bitset對(duì)象之間是反向轉(zhuǎn)化的:string對(duì)象的最右邊字符(即下標(biāo)最大的那個(gè)字符)用來(lái)初始化bitset對(duì)象的低階位(即下標(biāo)為0的位)。當(dāng)用string對(duì)象初始化bitset對(duì)象時(shí),記住這一差別很重要。
不一定要把整個(gè)string對(duì)象都作為bitset對(duì)象的初始值。相反,可以只用某個(gè)子串作為初始值:
string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100
bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters
這里用str中從str[5]開(kāi)始包含四個(gè)字符的子串來(lái)初始化bitvec5。照常,初始化bitset對(duì)象時(shí)總是從子串最右邊結(jié)尾字符開(kāi)始的,bitvec5的從0到3的二進(jìn)制位置為1100,其他二進(jìn)制位都置為0。如果省略第三個(gè)參數(shù)則意味著取從開(kāi)始位置一直到string末尾的所有字符。本例中,取出str末尾的四位來(lái)對(duì)bitvec6的低四位進(jìn)行初始化。bitvec6其余的位初始化為0。這些初始化過(guò)程的圖示如下:

3.5.2 bitset對(duì)象上的操作
多種bitset操作(表3-7)用來(lái)測(cè)試或設(shè)置bitset對(duì)象中的單個(gè)或多個(gè)二進(jìn)制位:
表3-7 bitset操作
b.any()
|
b中是否存在置為1的二進(jìn)制位?
|
b.none()
|
b中不存在置為1的二進(jìn)制位嗎?
|
b.count()
|
b中置為1的二進(jìn)制位的個(gè)數(shù)
|
b.size()
|
b中二進(jìn)制位的個(gè)數(shù)
|
b[pos]
|
訪(fǎng)問(wèn)b中在pos處的二進(jìn)制位
|
b.test(pos)
|
b中在pos處的二進(jìn)制位是否為1?
|
b.set()
|
把b中所有二進(jìn)制位都置為1
|
b.set(pos)
|
把b中在pos處的二進(jìn)制位置為1
|
b.reset()
|
把b中所有二進(jìn)制位都置為0
|
b.reset(pos)
|
把b中在pos處的二進(jìn)制位置為0
|
b.flip()
|
把b中所有二進(jìn)制位逐位取反
|
b.flip(pos)
|
把b中在pos處的二進(jìn)制位取反
|
b.to_ulong()
|
用b中同樣的二進(jìn)制位返回一個(gè)unsigned long值
|
os << b
|
把b中的位集輸出到os流
|
1. 測(cè)試整個(gè)bitset對(duì)象
如果bitset對(duì)象中有一個(gè)或多個(gè)二進(jìn)制位置為1,則any操作返回true,也就是說(shuō),其返回值等于1;相反,如果bitset對(duì)象中的二進(jìn)制位全為0,則none操作返回true。
bitset<32> bitvec; // 32 bits, all zero
bool is_set = bitvec.any(); // false, all bits are zero
bool is_not_set = bitvec.none(); // true, all bits are zero
如果需要知道置為1的二進(jìn)制位的個(gè)數(shù),可以使用count操作,該操作返回置為1的二進(jìn)制位的個(gè)數(shù):
size_t bits_set = bitvec.count(); // returns number of bits that are on
count操作的返回類(lèi)型是標(biāo)準(zhǔn)庫(kù)中命名為size_t的類(lèi)型。size_t類(lèi)型定義在cstddef頭文件中,該文件是C標(biāo)準(zhǔn)庫(kù)的頭文件stddef.h的C++版本。它是一個(gè)與機(jī)器相關(guān)的unsigned類(lèi)型,大小可以保證存儲(chǔ)內(nèi)存中對(duì)象。
與vector和string中的size操作一樣,bitset的size操作返回bitset對(duì)象中二進(jìn)制位的個(gè)數(shù),返回值的類(lèi)型是size_t:
size_t sz = bitvec.size(); // returns 32
2. 訪(fǎng)問(wèn)bitset對(duì)象中的位
可以用下標(biāo)操作符來(lái)讀或?qū)懩硞€(gè)索引位置的二進(jìn)制位,同樣地,也可以用下標(biāo)操作符測(cè)試給定二進(jìn)制位的值或設(shè)置某個(gè)二進(jìn)制位的值:
// assign 1 to even numbered bits
for (int index = 0; index != 32; index += 2)
bitvec[index] = 1;
上面的循環(huán)把bitvec中的偶數(shù)下標(biāo)的位都置為1。
除了用下標(biāo)操作符,還可以用set、test和reset操作來(lái)測(cè)試或設(shè)置給定二進(jìn)制位的值:
// equivalent loop using set operation
for (int index = 0; index != 32; index += 2)
bitvec.set(index);
為了測(cè)試某個(gè)二進(jìn)制位是否為1,可以用test操作或者測(cè)試下標(biāo)操作符的返回值:
if (bitvec.test(i))
// bitvec[i] is on
// equivalent test using subscript
if (bitvec[i])
// bitvec[i] is on
如果下標(biāo)操作符測(cè)試的二進(jìn)制位為1,則返回的測(cè)試值的結(jié)果為true,否則返回false。
3. 對(duì)整個(gè)bitset對(duì)象進(jìn)行設(shè)置
set和reset操作分別用來(lái)對(duì)整個(gè)bitset對(duì)象的所有二進(jìn)制位全置1和全置0:
bitvec.reset(); // set all the bits to 0.
bitvec.set(); // set all the bits to 1
flip操作可以對(duì)bitset對(duì)象的所有位或個(gè)別位按位取反:
bitvec.flip(0); // reverses value of first bit
bitvec[0].flip(); // also reverses the first bit
bitvec.flip(); // reverses value of all bits
4. 獲取bitset對(duì)象的值
to_ulong操作返回一個(gè)unsigned long值,該值與bitset對(duì)象的位模式存儲(chǔ)值相同。僅當(dāng)bitset類(lèi)型的長(zhǎng)度小于或等于unsigned long的長(zhǎng)度時(shí),才可以使用to_ulong操作:
unsigned long ulong = bitvec3.to_ulong();
cout << "ulong = " << ulong << endl;
to_ulong操作主要用于把bitset對(duì)象轉(zhuǎn)到C風(fēng)格或標(biāo)準(zhǔn)C++之前風(fēng)格的程序上。如果bitset對(duì)象包含的二進(jìn)制位數(shù)超過(guò)unsigned long的長(zhǎng)度,將會(huì)產(chǎn)生運(yùn)行時(shí)異常。本書(shū)將在6.13節(jié)介紹異常(exception),并在17.1節(jié)中詳細(xì)地討論它。
5. 輸出二進(jìn)制位
可以用輸出操作符輸出bitset對(duì)象中的位模式:
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
cout << "bitvec2: " << bitvec2 << endl;
輸出結(jié)果為:
bitvec2: 00000000000000001111111111111111
6. 使用位操作符
bitset類(lèi)也支持內(nèi)置的位操作符。C++定義的這些操作符都只適用于整型操作數(shù),它們所提供的操作類(lèi)似于本節(jié)所介紹的bitset操作。5.3節(jié)將介紹這些操作符。
posted @
2010-03-26 16:40 鷹擊長(zhǎng)空 閱讀(19722) |
評(píng)論 (0) |
編輯 收藏
最近 和另外兩個(gè)同事A,B做一個(gè)項(xiàng)目,其實(shí)只是一件很簡(jiǎn)單的事情,但由于原來(lái)的軟件架構(gòu)設(shè)計(jì)的很復(fù)雜,我調(diào)用A的接口,A再調(diào)用B的接口。但由于A的原因,功能遲遲不能使用。我后來(lái)發(fā)現(xiàn)可以直接調(diào)用B的接口的,事情很快解決了。
從這件小事,我深刻明白了功能內(nèi)聚的必要性,一個(gè)功能模塊最好是一個(gè)人處理完,不要牽涉到多人,最多不要到兩人以上。而且一個(gè)功能牽扯到多人以后,多半會(huì)彼此推卸責(zé)任,導(dǎo)致效率無(wú)比低下。
posted @
2010-03-02 10:50 鷹擊長(zhǎng)空 閱讀(622) |
評(píng)論 (0) |
編輯 收藏
今天遇到了一件讓我難忘的事情:可能是升級(jí)程序的問(wèn)題,導(dǎo)致升級(jí)不成功,結(jié)果實(shí)施人員找到我,說(shuō)我程序有問(wèn)題,我一查發(fā)現(xiàn)版本不對(duì),就告訴了那個(gè)部門(mén)的負(fù)責(zé)人,結(jié)果那個(gè)工程人員被教訓(xùn)了一頓,我當(dāng)時(shí)沒(méi)覺(jué)得什么。事后, 那個(gè)實(shí)施人員向我訴苦,我才發(fā)現(xiàn)各人都有自己的苦衷。這也是一種管理之道吧!
深入下去,就是要在了解真相的前提下做判斷,耐心分析問(wèn)題,以理服人,也不要得理不饒人,人心都肉長(zhǎng)的。
posted @
2010-02-03 15:39 鷹擊長(zhǎng)空 閱讀(495) |
評(píng)論 (0) |
編輯 收藏
為了下面一行SQL語(yǔ)句,我弄了整整一下午
select * into dDB.dbo.wqq from openrowset('SQLOLEDB', '192.168.0.10'; 'sa'; 'pwd', sDB.dbo.er)
感慨下自己的SQL還有待加強(qiáng),下面是一些資料的整理
1、openrawset
openrawset函數(shù)從任何支持注冊(cè)O(shè)LE DB的遠(yuǎn)程或者本地?cái)?shù)據(jù)源獲取數(shù)據(jù),比如從SQL Server或Access的遠(yuǎn)程實(shí)例中提取數(shù)據(jù)
--查詢(xún)示例
select * from openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名)
--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名)
--把本地表導(dǎo)入遠(yuǎn)程表
insert openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名) select *from 本地表
--遠(yuǎn)程表導(dǎo)入本地
select * into 本地表 from openrowset('SQLOLEDB', 'sql服務(wù)器名'; 'sa'; 'pwd', 數(shù)據(jù)庫(kù)名.dbo.表名)
--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1
2、openquery
openquery在給定的鏈接服務(wù)器(一個(gè) OLE DB 數(shù)據(jù)源)上執(zhí)行指定的直接傳遞查詢(xún)??梢栽诓樵?xún)的 FROM 子句中像引用表名那樣引用 OPENQUERY 函數(shù)。
用法需要?jiǎng)?chuàng)建一個(gè)連接
--首先創(chuàng)建一個(gè)連接創(chuàng)建鏈接服務(wù)器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '遠(yuǎn)程服務(wù)器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'user', 'pwd'
--查詢(xún)
select * FROM openquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ')
--把本地表導(dǎo)入遠(yuǎn)程表
insert openquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A
posted @
2010-02-01 23:07 鷹擊長(zhǎng)空 閱讀(2007) |
評(píng)論 (0) |
編輯 收藏
一份優(yōu)美的代碼,猶如一棵平衡二叉樹(shù),錯(cuò)落有致,不蔓不枝。而在現(xiàn)實(shí)工作中,常常由于為了趕時(shí)間,代碼寫(xiě)得像懶婆娘的裹腳布-又臭又長(zhǎng),看起來(lái)特別不爽。那么這個(gè)代碼就需要重構(gòu)了。
當(dāng)清閑下來(lái)時(shí),看到以前的代碼如此凌亂,趕緊想著怎么重構(gòu)下,該寫(xiě)成函數(shù)的就寫(xiě)成函數(shù),該封裝的就封裝。
清理完畢,看著重構(gòu)后的代碼,真是神清氣爽啊!
posted @
2009-12-11 14:49 鷹擊長(zhǎng)空 閱讀(281) |
評(píng)論 (0) |
編輯 收藏
這篇文章可能不太合適發(fā)在這里,它只是我對(duì)學(xué)習(xí)過(guò)程的一點(diǎn)感悟,并沒(méi)有針對(duì)具體的某一方面,比如
C++,而且整個(gè)思路也比較混亂,不怎么連貫。我想可能跟程序人生有點(diǎn)關(guān)系。
到了一定年紀(jì),每個(gè)人不太一樣,一般是18-30歲以后,有很多人是不可改變的,他的本我已經(jīng)太強(qiáng),根本就不可能穿上對(duì)方的鞋子走路,站在對(duì)方的角度去思考,如果你覺(jué)得自己還能改變的話(huà),請(qǐng)保持并繼續(xù)往下看,否則就不用在這里浪費(fèi)寶貴的享受生命的時(shí)間。在走進(jìn)我們大陸這個(gè)光怪陸離的社會(huì)漩渦之后,如果還能有百分之一的人保持清醒,這也必然意味著痛苦,那他們就是未來(lái)的希望。做純粹的《麥田的守望者》總是痛苦的,如果你也能適應(yīng)并理解塵世的虛幻和不平,你就會(huì)活的輕松許多,畢竟我們的社會(huì)還是在進(jìn)步的。
可能這里沒(méi)有多少人有我的一些經(jīng)歷,我曾經(jīng)做過(guò)半天的醫(yī)生,更有幸目睹了一個(gè)新生命的誕生喜劇。伴隨嬰兒哭聲的是母親剖腹而來(lái)的滿(mǎn)身鮮血,和她的微笑。看到那一笑的時(shí)候,當(dāng)時(shí)我驚呆了,她肯定很痛很痛,但她的微笑是真正的幸福!
當(dāng)幸福需要人付出痛的代價(jià)的時(shí)候,還有多少人愿意去完成?
尼采說(shuō):
誰(shuí)終將聲震人間,必長(zhǎng)久深自緘默;
誰(shuí)終將點(diǎn)燃閃電,必長(zhǎng)久如云飄泊。
我把這句話(huà)送給繼續(xù)往下看的朋友。
同時(shí)我也不幸看到了一個(gè)鮮活生命的悲劇。一個(gè)十四歲的女孩輟學(xué)做童工,由于那種私營(yíng)企業(yè)主開(kāi)的廠(chǎng)是沒(méi)有什么安全保障的,她的右手被燒紅的鐵壓住了,整個(gè)手被壓的變形了,家里也比較困難,她的父親也是一個(gè)很軟弱的人,所以找老板也沒(méi)有要到多少錢(qián)(這是主治醫(yī)生跟我們講的)。受傷的右手的治療時(shí)間不及時(shí),所以基本上整個(gè)右手都?xì)垙U了,我去的那天整好是她第二次來(lái),主要是為手臂植皮。我必須承認(rèn),她是一個(gè)很好看,很可愛(ài)的女孩,只可惜臉上不應(yīng)該有她這個(gè)年紀(jì)所有的悲傷,她右手指上的白骨很清晰的可以看見(jiàn),只有一層皮還掛在上面。當(dāng)植皮的時(shí)候,首先從她大腿的內(nèi)側(cè)割下皮膚,然后在將其移植到手臂上去,盡管打了麻藥,但我知道,仍然是非常非常疼的,但那個(gè)女孩自始至終沒(méi)有說(shuō)一句話(huà),我一直托著她的手臂,可能是割皮的時(shí)候太疼了,她的呻吟聲我們都聽(tīng)見(jiàn)了,我們問(wèn)她疼不疼,她就不呻吟了,但還是不說(shuō)話(huà),但我分明看見(jiàn)她眼睛晶瑩的淚水順著臉淌下。十指連心,那種痛苦都經(jīng)歷過(guò)了,這點(diǎn)痛苦她已經(jīng)可以用沉默來(lái)承受了!我不是一個(gè)會(huì)講故事的人,原諒我仍然忘記了很多細(xì)節(jié)。
我不是一個(gè)容易難過(guò)的人,總試圖從反面看到正面,但那一刻,我突然好難過(guò),自己是不是對(duì)世界太苛責(zé),其實(shí)上天真的給我很多,我的不快樂(lè)是不是沒(méi)有多少理由,我有時(shí)候的沉淪是不是太不負(fù)責(zé)任。
前兩天我在小百合的Reading版寫(xiě)了幾百字的《浮萍的我》,表現(xiàn)了有時(shí)候我對(duì)世界的無(wú)奈,人在江湖,有時(shí)候身不由己的人生態(tài)度。我選擇媚俗,獲得關(guān)注。不過(guò)我還是愿意相信世界是美好的!上個(gè)星期周末晚上我們學(xué)校17個(gè)一起到北電去的碩士畢業(yè)生聚餐,大家聊的很開(kāi)心,生活也還是快樂(lè),并將繼續(xù)快樂(lè)!
朽木不可雕,糞土之墻不可圬。我們都不會(huì)承認(rèn)自己是朽木,糞土,至少在內(nèi)心深處不愿意被打倒。其實(shí)每個(gè)人的潛力都是巨大的,一定要給自己信心,這是成功的第一步。為避免重蹈覆轍,我說(shuō)一些自己的體驗(yàn)。
萬(wàn)事開(kāi)頭難,是的,開(kāi)始總是不知道該學(xué)什么,該做什么,不過(guò)這個(gè)過(guò)程也不會(huì)太難,只要你不是完全一個(gè)人從頭開(kāi)始的,在群體的慣性下,很快你就會(huì)入門(mén)。
它山之石,可以為錯(cuò)。這個(gè)入門(mén)的過(guò)程在如今的互聯(lián)網(wǎng)下面,可以極大的減少原本所需要的精力和時(shí)間,在網(wǎng)上,你可以知道你首先應(yīng)該做什么,學(xué)什么,教材的選擇都已經(jīng)有前面的人為你鋪好了路。你所要做的就是四個(gè)字:心如止水。但互聯(lián)網(wǎng)也是一個(gè)花花世界,它是天使也是魔鬼,里面有太多讓你流連忘返的地方,里面有漂亮的MM,里面有讓人無(wú)力自拔的《傳奇》……。但是隨欲浮沉的人生開(kāi)銷(xiāo)是很高昂的。放縱欲望的代價(jià)會(huì)在以后的人生中成指數(shù)性的增長(zhǎng),你所預(yù)支的所有快樂(lè),放高利貸的魔鬼會(huì)連本帶息一分不剩的從你身上拿回來(lái)——那就是帶給你的巨大痛苦。
我的建議是:都可以接觸一下,但什么事都要有輕重的掂量,而且應(yīng)該一直知道,世界是多姿多彩的,網(wǎng)絡(luò)永遠(yuǎn)不是全部,它甚至只是生活的一個(gè)極少的部分。《七宗罪》最后的臺(tái)詞——Ernest Hemingway(海明威)說(shuō)過(guò):“The world is a fine place, I will fight for it!”(這世界是個(gè)好地方,值得我為它奮斗?。?。前半部分有時(shí)候我不同意,但我會(huì)努力的實(shí)踐后半部分。
每一樣?xùn)|西都需要耐性,都需要努力的汗水,才能領(lǐng)略它的別有洞天,它的引人如勝。對(duì)許多東西,關(guān)鍵不在于它很難,而在于對(duì)付它的方法和必要的耐性,準(zhǔn)備工作最好做足,必要的基礎(chǔ)要先了解掌握,碰到難題的時(shí)候,可以找個(gè)人,或者一個(gè)布娃娃傾訴,說(shuō)不定你在訴說(shuō)的時(shí)候,也許會(huì)有很多收獲,也許你很快就可以獲得靈感,明白問(wèn)題的本質(zhì),進(jìn)而將問(wèn)題解決。
對(duì)初學(xué)計(jì)算機(jī)的讀者,我覺(jué)得應(yīng)該盡快的能夠閱讀英文原版教材。現(xiàn)在的條件真是太好了,計(jì)算機(jī)科學(xué)與技術(shù)的幾乎所有好教材都有英文影印版,我很后悔在大學(xué)的時(shí)候浪費(fèi)了太多的時(shí)間,應(yīng)該在大三以前就能夠流暢的閱讀英文。有些事是知難行易,告訴你一個(gè)秘密,我是在研究生二年級(jí)開(kāi)始買(mǎi)英文書(shū)看的,開(kāi)始的確是苦如煉獄,心浮氣燥,雜念如潮。但是不管學(xué)什么,都應(yīng)該先堅(jiān)持,然后才能考慮放棄。其實(shí)不需要太長(zhǎng)的時(shí)間,大約一個(gè)月的時(shí)間就夠了,我就發(fā)現(xiàn)技術(shù)書(shū)籍中的句子,語(yǔ)法,單詞都差不多,讀起來(lái)其實(shí)有時(shí)候比漢語(yǔ)還明白,從中我也學(xué)會(huì)了許多西方人的思維習(xí)慣,英文句子的邏輯性一般都很清晰。其實(shí)國(guó)內(nèi)的計(jì)算機(jī)教材是相當(dāng)差的,翻譯的也是錯(cuò)誤百出,而且一般是沒(méi)有勘誤表和索引的,對(duì)于我這種靠自學(xué)的學(xué)生來(lái)說(shuō),有時(shí)候碰到原書(shū)本身的錯(cuò)誤這種問(wèn)題,真是頭痛至極。也許有人會(huì)覺(jué)得我的英語(yǔ)很好,再告訴你一個(gè)秘密,其實(shí)我是在2003.1月那次考試才過(guò)英語(yǔ)六級(jí)的,你真的可以做到!
在入門(mén)之后,就會(huì)有一個(gè)比較快速的發(fā)展期,會(huì)覺(jué)得什么都不是很難,都能夠一步一步的來(lái)。但是過(guò)了這個(gè)階段,又會(huì)發(fā)現(xiàn)何時(shí)是盡頭,有那么多的東西等著去學(xué),我真的能堅(jiān)持嗎?前面還要那么多的高峰,我能逾越它們嗎?其實(shí)有時(shí)候平淡的心是很重要的,根據(jù)自己的情況選擇一個(gè)方向,每天都有進(jìn)步,過(guò)一段時(shí)間,信心就會(huì)回來(lái),人生的路不在于開(kāi)始跑的多快,而在于跑完。蘇東坡說(shuō):“古之成大事者,不唯有超世之才,亦必有堅(jiān)韌不拔之志。”其實(shí)小事情不一樣也需要有耐心嗎?
旦種暮成,朝花夕拾。事以密成,做什么事情有計(jì)劃成功的機(jī)會(huì)會(huì)大一些。
首先需要用文火培元固本。一點(diǎn)一點(diǎn)的慢慢去理解。張無(wú)忌學(xué)九陽(yáng)神功花了五年多,令狐沖沒(méi)有內(nèi)力的獨(dú)孤九劍只能在成人的童話(huà)中出現(xiàn),在現(xiàn)實(shí)的殘酷面前好比風(fēng)中之燭,轉(zhuǎn)瞬就逝。基礎(chǔ)的東西再怎么強(qiáng)調(diào)都不過(guò)分,比如操作系統(tǒng),如果你愿意花半年的時(shí)間好好看看Andrew S. Tanenbaum,Albert S. Woodhull的《Operating Systems:Design and Implementation》第二版。我相信你在大陸BBS上問(wèn)的關(guān)于操作系統(tǒng)內(nèi)核的問(wèn)題基本上沒(méi)有很多人能夠回答你了。
文火過(guò)后,也必須要用武火密集錘煉,集中大量的精力和時(shí)間去看很多書(shū),我就很喜歡許多書(shū)一起看,互相對(duì)比理解的很快,做比較多的題,編較多的程序,那樣也會(huì)達(dá)到一個(gè)質(zhì)的提高。如果你還有興趣去讀讀西方經(jīng)濟(jì)學(xué)和近代西方政治學(xué)。我想你會(huì)發(fā)現(xiàn)很多東西殊途同歸,學(xué)問(wèn)上的境界有時(shí)候是和思想上的境界一起提高的。我們也許會(huì)發(fā)現(xiàn),眾里尋她千百度,驀然回首,那人卻在燈火闌珊處?!哆吇膫髌妗分械难囡w武功上的每一次突破不都是因?yàn)榫窬辰绲倪M(jìn)步嗎?
每一個(gè)領(lǐng)域都有泰山北斗,我很喜歡了解他們的歷史,了解他們成長(zhǎng)的路標(biāo),從中學(xué)會(huì)很多我所要的經(jīng)驗(yàn),對(duì)他們,我很尊重,但從來(lái)不會(huì)謙卑下跪。真正的美德如河流,愈深愈無(wú)聲。他們是平靜而平易的。
不欲速,不欲小利。欲速則不達(dá),欲小利則大事不成。
做什么事情都應(yīng)該考慮成本與回報(bào),純粹情感的東西除外:)。無(wú)所事事的時(shí)候會(huì)花費(fèi)時(shí)間成本,可能也會(huì)得到偕意的心情。做一件事情的時(shí)候,就不能做別的事情,這就是機(jī)會(huì)成本。我想每個(gè)人都應(yīng)該至少了解一下西方經(jīng)濟(jì)學(xué),馬克思經(jīng)濟(jì)學(xué)除外:)
一龍一蛇與時(shí)游。
《莊子山木篇》云:一龍一蛇,與時(shí)俱化,一上一下,以和為量。當(dāng)?shù)靡忭樞牡臅r(shí)候,就如天上矯龍,當(dāng)失意煩悶的時(shí)候,也要學(xué)會(huì)像蛇一樣,隱匿潛藏。或龍或蛇,屈伸自如,順著時(shí)勢(shì)變化而行動(dòng),不偏滯專(zhuān)為。
當(dāng)你寂寞煩躁,無(wú)聊郁悶的時(shí)候,這種心情本來(lái)就是上天給人特別的禮物。你該歇歇了,聽(tīng)聽(tīng)鋼琴曲《致愛(ài)麗斯》,Saxophone《回家》、《茉莉花》。或者和好朋友去爬山、游泳。和女朋友去看一場(chǎng)浪漫的電影。早上起來(lái)晚一點(diǎn),看看喜歡的胖胖的加菲貓又在說(shuō):“如果早上能來(lái)的更晚一些的話(huà),我就會(huì)更喜歡它。”世界其實(shí)很可愛(ài)。你又會(huì)覺(jué)得人生也有別的更多的美好。還是應(yīng)該拿出時(shí)間與女孩子約會(huì)的!:)不要讓身在荊棘中跋涉的太久,不要讓心在苦澀中浸沒(méi)的太長(zhǎng),以至于失去了品味幸福的能力。
白云蒼狗,人生如白駒過(guò)隙,《流金歲月》中有一句臺(tái)詞:“做男人也好,做女人也好,不男不女也好,關(guān)鍵是做人要開(kāi)心。”我很喜歡這句話(huà),但人生在世,不如意者十之八九,對(duì)讓你不開(kāi)心的東西,最好學(xué)會(huì)去面對(duì),并解決它,不能面對(duì)的東西,我會(huì)選擇逃避并忘記。至緊是不要讓它影響你的心情太久。最好長(zhǎng)夜漫漫,無(wú)心睡眠的日子越少越好。
日暮途窮,山窮水竭的時(shí)候,是危機(jī)也是生機(jī)。做一個(gè)有影響力的人,做一個(gè)負(fù)責(zé)任的人,做一個(gè)靈活的人,柳暗花明的日子并不會(huì)太遙遠(yuǎn)。
一門(mén)學(xué)問(wèn)和藝術(shù),想要達(dá)到純青之境,需要的有時(shí)候不僅僅是努力和汗水,也需要機(jī)遇和天分。只要為此付出了努力,付出了汗水,那也就是你的快樂(lè),難道快樂(lè)還不夠嗎?
侯捷在《但教心似金鈿堅(jiān)》中說(shuō):基礎(chǔ)學(xué)問(wèn)如萬(wàn)古長(zhǎng)空,開(kāi)發(fā)工具如一朝風(fēng)月。不可萬(wàn)古長(zhǎng)空不明一朝風(fēng)月,不可一朝風(fēng)月昧卻萬(wàn)古長(zhǎng)空。
我加兩句注釋?zhuān)喝f(wàn)古長(zhǎng)空畢竟是萬(wàn)古的,它應(yīng)該是學(xué)問(wèn)中的主菜,學(xué)習(xí)的過(guò)程中每天都應(yīng)該吃的;一朝風(fēng)月畢竟是一朝,即使風(fēng)月無(wú)邊,它也還是學(xué)問(wèn)中的點(diǎn)心,但是整日浸沒(méi)在基礎(chǔ)的長(zhǎng)空之中,可能會(huì)喪失前進(jìn)的動(dòng)力和激情,偶爾吃一點(diǎn)點(diǎn)心也是很開(kāi)心的。:)
我非常羨慕南大計(jì)算機(jī)系的學(xué)生,那里對(duì)我非常喜歡的數(shù)學(xué)有非常的重視,我曾經(jīng)有好長(zhǎng)時(shí)間迷戀小百合的數(shù)學(xué)精華區(qū)。數(shù)學(xué)是屬于上帝的,高德納(Donald Ervin Knuth)這樣說(shuō)。我曾經(jīng)以為,現(xiàn)在仍然這樣希望,如果我本科時(shí)候讀數(shù)學(xué)專(zhuān)業(yè)就好了。因?yàn)槲艺J(rèn)為數(shù)學(xué)是最接近真理的!
Karl Popper 說(shuō)過(guò)一句我一直非常喜歡的話(huà):“You may be right ,I may be wrong ,but by a effort we are all get nearer to the truth!”(你也許對(duì),我也許錯(cuò),但是經(jīng)過(guò)溝通努力我們都能更接近真理?。C看闻c別人爭(zhēng)執(zhí)的時(shí)候,我都喜歡想起這句話(huà),如果我們多一份寬容,我們真的會(huì)開(kāi)心很多!
對(duì)他人的尊重,和自己責(zé)任的重視。其實(shí)在程序設(shè)計(jì)理念中有一個(gè)很有名的Design by Contract(按契約進(jìn)行設(shè)計(jì)),其實(shí)這是一個(gè)很容易理解的概念,一點(diǎn)也不高深,特別是對(duì)擁有西方思想的民主國(guó)家的人民。可惜我們中國(guó)的東方文化缺少了這些,我們幾千年的文明告訴我們:人一生下來(lái)就是有高低貴賤之分的。普天之下,莫非王臣,率土之濱,莫非王土。俠之大者,為國(guó)為民,國(guó)是在民之前的??上У氖沁@些東西已經(jīng)深深的扎根于我們的文化土壤并被用做統(tǒng)治國(guó)家的工具。
人人生而平等。享受權(quán)利的同時(shí)也要承擔(dān)義務(wù),承擔(dān)義務(wù)的同時(shí)也應(yīng)該享受權(quán)利。這就是契約(或者合同)的最基本概念。我來(lái)將其簡(jiǎn)單的映射于一個(gè)排序函數(shù),這個(gè)排序函數(shù)必須對(duì)其要接受的參數(shù)進(jìn)行檢查,這就是它的權(quán)利,如果參數(shù)不合格,也即不能滿(mǎn)足排序函數(shù)的要求,那這個(gè)排序函數(shù)也就不必要執(zhí)行它的義務(wù)——為傳進(jìn)來(lái)的參數(shù)進(jìn)行排序。Boost庫(kù)中有個(gè)concept_check,就是為了保證契約(contract)的正確履行。當(dāng)然,天下大事,必作于細(xì)。將其在程序語(yǔ)言中完整實(shí)現(xiàn)還是有許多工作要做,目前的各種語(yǔ)言中,Eiffel是做的最好的,Eiffel會(huì)強(qiáng)迫你考慮Contract、Precondition、Postcondition、Invariance。別的語(yǔ)言一般需要靠程序員的自覺(jué)。這里面就有民主憲政國(guó)家和獨(dú)裁國(guó)家的影子,在民主國(guó)家,每個(gè)公民有與生俱來(lái)的社會(huì)契約約束,獨(dú)裁國(guó)家則相反,有人不用承擔(dān)任何義務(wù),但卻有絕對(duì)無(wú)上的權(quán)利。有時(shí)候我不得不感嘆:“我們的國(guó)家進(jìn)步得太慢!”
寫(xiě)到這里,我的耳邊正好傳來(lái)齊秦在《自己的心情我自己感受》的聲音:
曾有太多不懂 襲擊著我
總有些許冷漠 凝聚眼眸
曾有太多哀愁 不避開(kāi)我
總有些許孤獨(dú) 涌上心頭
……
就這樣結(jié)束吧!
posted @
2009-11-08 22:39 鷹擊長(zhǎng)空 閱讀(364) |
評(píng)論 (0) |
編輯 收藏