2017年11月3日
64位操作系統安裝 MySQL-python-1.2.3.win 失敗,提示 fatal error C1083: Cannot open include file: 'config-win.h',網上方案均不可行,實際上只需要直接下載 MySQL-python-1.2.3.win-amd64-py2.7.exe 安裝即可。下載地址請自行搜索。
2012年9月16日
1、增加windows環境變量以下路徑
D:\Python26;D:\Python26\Tools\Scripts;D:\Program Files\Sublime Text 2
2、注銷并重新登錄,使用命令行敲入python可顯示出python的版本信息
3、使用ctrl+b 如果仍然未出現編譯信息,要查看ctrl+· 是否有錯誤信息,將錯誤的插件remove掉
2007年7月28日
一直以來都說ogre渲染效率很高,最近想研究一下3d,就下來ogre的代碼,看看有沒有可能改改就能做游戲,沒想到試了一個例子就被打擊了,SkeletalAnimation 中將#define NUM_JAIQUAS 50 設為渲染50 個角色模型,渲染就只剩下4幀了。
我的機器配置還是不錯的3.0的雙核intel 2G的內存 GF7600 gs 的顯卡。mmorpg中同屏100人以上是很平常的事情,4幀可真的是沒法玩。
2007年7月25日
1、父子二人經過五星級飯店門口,看到一輛十分豪華的進口轎車。兒子不屑地對他的父親說:「坐這種車的人,肚子里一定沒有學問!」父親則輕描淡寫地回答:「說這種話的人,口袋里一定沒有錢!」
(你對事情的看法,是不是也反映出你內心真正的態度?)
2、晚飯后,母親和女兒一塊兒洗碗盤,父親和兒子在客廳看電視。突然,廚房里傳來打破盤子的響聲,然后一片沉寂。是兒子望著他父親,說道:「一定是媽媽打破的。」「你怎么知道?」「她沒有罵人。」
(我們習慣以不同的標準來看人看己,以致往往是責人以嚴,待己以寬。)
3、有兩個臺灣觀光團到日本伊豆半島旅游,路況很壞,到處都是坑洞。其中一位導游連聲抱歉,說路面簡直像麻子一樣。而另一個導游卻詩意盎然地對游客說:諸位先生女士,我們現在走的這條道路,正是赫赫有名的伊豆迷人酒窩大道。」
(雖是同樣的情況,然而不同的意念,就會產生不同的態度。思想是何等奇妙的事,如何去想,決定權在你。)
4、同樣是小學三年級的學生,在作文中說他們將來的志愿是當小丑。中國的老師斥之為:「胸無大志,孺子不可教也!」外國的老師則會說:「愿你把歡笑帶給全世界!」
(身為長輩的我們,不但容易要求多于鼓勵,更狹窄的界定了成功的定義。)
5、在故宮博物院中,有一個太太不耐煩地對她先生說:「我說你為甚么走得這么慢。原來你老是停下來看這些東西。」
(有人只知道在人生的道路上狂奔,結果失去了觀看兩旁美麗花朵的機會。)
6、妻子正在廚房炒菜。丈夫在她旁邊一直嘮叨不停:慢些。小心!火太大了。趕快把魚翻過來。快鏟起來,油放太多了!把豆腐整平一下!「哎厎」妻子脫口而出,「我懂得怎樣炒菜。」「你當然懂,太太,」丈夫平靜地答道:「我只是要讓你知道,我在開車時,你在旁邊喋喋不休,我的感覺如何。」
(學會體諒他人并不困難,只要你愿意認真地站在對方的角度和立場看問題。)
7、理由充份:一輛載滿乘客的公共汽車沿著下坡路快速前進著,有一個人後面緊緊地追趕著這輛車子。一個乘客從車窗中伸出頭來對追車子的人說:“老兄!算啦,你追不上的!”“我必須追上它,”這人氣喘吁吁地說:“我是這輛車的司機!”
(有些人必須非常認真努力,因為不這樣的話,後果就十分悲慘了!然而也正因為必須全力以赴,潛在的本能和不為人知的特質終將充份展現出來。)
8、原來如此-甲:「新搬來的鄰居好可惡,昨天晚上三更半夜、夜深人靜之時跑來猛按我家的門鈴。」乙:「的確可惡!你有沒有馬上報警?」甲:「沒有。我當他們是瘋子,繼續吹我的小喇叭。」
(事出必有因,如果能先看到自己的不是,答案就會不一樣在你面對沖突和爭執時,先想一想是否心中有虧,或許很快就能釋懷了。)
9、誤會-某日,張三在山間小路開車,正當他悠哉地欣賞美麗風景時,突然迎面開來一輛貨車,而且滿囗黑牙的司機還搖下窗戶對他大罵一聲:“豬!”張三越想越納悶,也越想越氣,於是他也搖下車窗回頭大罵:“你才是豬!”才剛罵完,他便迎頭撞上一群過馬路的豬。
(不要錯誤的詮釋別人的好意,那只會讓自己吃虧,并且使別人受辱。在不明所以之前,先學會按捺情緒,耐心觀察,以免事後生發悔意。)
10、後生可畏-小男孩問爸爸:“是不是做父親的總比做兒子的知道得多?”爸爸回答:“當然啦!”小男孩問:“電燈是誰發明的?”爸爸:“是愛迪生。”小男孩又問:“那愛迪生的爸爸怎麼沒有發明電燈?”
(很奇怪,喜歡倚老賣老的人,特別容易栽跟斗。權威往往只是一個經不起考驗的空殼子,尤其在現今這個多元開放的時代。)
11、不必緊張-小明洗澡時不小心吞下一小塊肥皂,他的媽媽慌慌張張地打電話向家庭醫生求助。醫生說:“我現在還有幾個病人在,可能要半小時後才能趕過去。”小明媽媽說:“在你來之前,我該做甚麼?”醫生說:“給小明喝一杯白開水,然後用力跳一跳,你就可以讓小明用嘴巴吹泡泡消磨時間了。”
(take it easy,放輕松放輕松些,生活何必太緊張?事情既然已經發生了,何不坦然自在的面對。擔心不如寬心,窮緊張不如窮開心。)
12、鑰匙-一把堅實的大鎖掛在大門上,一根鐵桿費了九牛二虎之力,還是無法將它撬開。鑰匙來了,他瘦小的身子鉆進鎖孔,只輕輕一轉,大鎖就“啪”地一聲打開了。鐵桿奇怪地問:“為什麼我費了那麼大力氣也打不開,而你卻輕而易舉地就把它打開了呢?”鑰匙說:“因為我最了解他的心。”
(每個人的心,都像上了鎖的大門,任你再粗的鐵棒也撬不開。唯有關懷,才能把自己變成一只細膩的鑰匙,進入別人的心中,了解別人。)
2007年5月11日
摘要: 利用匿名管道在父子進程間傳遞數據
進程間傳遞數據有很多種方法,常用到的有命令行、共享內存、內存映射文件、剪貼板、windows消息、socket等。
命令行的缺點是數據長度限制。Windows2000只能傳遞256個字節,內存映射文件、共享內存都需要一些進程同步才能很好的配合讀寫數據,剪貼板可能會被其他進程擦數數據。當多開的時候很難控制進程間的對應關系。
一種解決方案是生成隨機命名的同步...
閱讀全文
用DX自繪Edit控件往往沒有真是的EDIT窗口存在,所以輸入法窗口無法跟隨,這里給出一個解決方案
計算當前光標的位置
用API ImmSetCompositionWindow指定IME 窗口到當前光標位置
在WM_KEYDOWN消息中處理
以下是代碼:
------------------------------------------------------------------------------------------------
int nSelStart = 0, nSelEnd = 0;
this->GetSel( nSelStart, nSelEnd );
CPoint pntCursor = this->PosFromChar( nSelEnd );

if ( pntCursor.x == -1)


{
nSelEnd -=1;
if ( nSelEnd < 0 )


{
nSelEnd = 0;
}
pntCursor = this->PosFromChar( nSelEnd );
}

HIMC hImc = ImmGetContext(m_hWnd);
COMPOSITIONFORM form;
form.dwStyle = CFS_RECT;
form.ptCurrentPos = CPoint(pntCursor.x,0);
form.rcArea = CRect(pntCursor.x,0,pntCursor.x+300,100);
ImmSetCompositionWindow(hImc,&form);
2007年3月27日
Dump
調用堆棧的原理以及異常信息的反饋
動機:
在游戲開發過程中,我們利用
QA
部門來做產品的質量保證,盡可能將絕大部分錯誤消化在內部,保證游戲的版本質量,但是
QA
部門畢竟有他的局限性,盡管經過嚴格的測試也很難保證將所有的問題一網打盡.
通過在
Log
中轉儲的錯誤信息,我們可以進一步找出問題,但是
Log
文件產生在終端,我們拿到的也僅僅是公司內部測試部門產生的
Log
文件,顯然公司內部得到的信息是很有限的,如果能從玩家那里拿到異常信息,我們才能最快的去解決問題,盡可能在錯誤產生重大影響之前將其解決,所以我們有必要從被動的獲取異常信息,轉為主動去獲取.
可行性
:
在錯誤發生時
Dump
調用堆棧,可以讓我們知道錯誤發生的位置,這比已往普通的
LOG
更加有效的多.我們可以將出錯的堆棧地址反饋回來.這一切在終端出現異常的時候自動進行.
Windows
操作系統提供的
SEH
結構化異常機制可能讓我們在程序崩潰的瞬間處理這些事情.
效率問題
:
SEH
是
windows
的異常機制,除非在編譯時候特別指定不使用,否則總有默認的
SEH
處理機制,
kernel32.dll
中有默認的
SEH
處理接口,當我們需要自己處理異常的時候,我們的處理點會掛接在異常處理鏈的最前端,這種鏈類似
Hook
的鏈.鏈的頭部放在
fs[0]
的位置.也就是說效率的問題是可以不必考慮,
具體實現
:
通過閱讀反匯編代碼可以了解函數調用過程中堆棧的結構
:
1
函數調用時
CALL
將下一行指令地址壓入堆棧
2
函數運行第一行會將
EBP
壓入堆棧
3
保存當前堆棧地址到
EBP (mov ebp,esp)
再遇到
call
時從第一步執行,所以每次第二步壓入堆棧的都是上一層函數調用的
ESP
地址,而這個地址
+4
字節偏移則是當前調用函數返回后的下一條指令,也就是上一層函數的地址,所以我們只要知道當前函數的
EBP
值
(
也就是當前函數的棧頂
)
就能夠遍歷得到所有調用堆棧層次.

我們將windows SEH 結構化異常引入后,可以在異常發生的時候得到當前的EBP值,從而通過這個值得到整個調用堆棧的地址.
在發布工程的時候,我們只需要生成map文件,就可以通過這個地址得到崩潰位置.使用HTTP GET 或POST方式可以將我們所需要的崩潰信息提交到我們指定的網站.這種方式只是通過URL參數來提交數據,只需要使用API InternetOpenUrl就可以很方便的將信息提交.此外如果不使用HTTP方式,我們也可以在這個時候創建新的socket 對指定的服務器進行連接來傳輸數據.
static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
static const TCHAR* accept= _T("Accept: */*");
static TCHAR action[]=_T("datecomit.aspx");//預提交的頁面
static TCHAR server[]=_T("192.168.9.119");//提交的server地址


static TCHAR frmdata[1024] ={0};
_tcscpy(frmdata,_T("message=this is a test message");
//提交數據, message為提交名字
// for clarity, error-checking has been removed
HINTERNET hSession = InternetOpen("MyAgent",
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, server,
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", action, NULL, NULL, &accept, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
此后我們只需要定期觀察所提交的內容,便可以立即得知是否有異常出現.根據同一異常出現的幾率可以得知是否是致命的錯誤,是否需要緊急更新.
2007年3月12日
成員函數的調用是編譯器內部使用的 __thiscall 即需要this指針,
所以我們調用成員函數必須滿足的條件是
1 需要this指針,
2 成員函數有固定的函數地址
先看條件 1 ?
this指針是在函數調用前用ECX寄存器傳入的,
所以我們只需要提前講this指針賦值給ECX即可
條件2
成員函數是有固定的地址的,也就是說我們可以直接調用,不過大多數情況下因為要訪問成員變量,所以如果沒有this指針,會在訪問時產生異常.對于不需要this指針的成員函數可以正常調用.
如類 CTest
class?CTest
{
public
:

?CTest()?:?m_nData?(
5
){}

?
int
?GetNum(){reutrn?
3
;]

?
int
?GetAmount(){return?
2
?
+
?m_nData;}
private
:
?
int
?m_nData;
};


//
可以這樣調用GetNum
return?((CTest
*
)
0
)
->
GetNum();

這兩個條件都可以滿足,所以代碼如下:
typedef?int?(CTest::*GETAMOUNT)();

void?Process(CTest&?t?,?GETAMOUNT?GetAmont)
{
??int?nResult?=0;
??__asm{
?????mov?ecx,[t]??????;傳入this指針
?????call?GetAmont????;調用成員函數
?????mov?nResult,?eax?;返回值在EAX中
????????}
??cout<<nResult<<endl;
}

int?main(int?argc,?char*?argv[])
{
??CTest?test;

??Process(test,?&CTest::GetAmount);????
??return?0;
}????

2007年2月2日
IRQ全稱為Interrupt Request,即是“中斷請求”的意思(以下使用IRQ稱呼)。IRQ的作用就是在我們所用的電腦中,執行硬件中斷請求的動作,用來停止其相關硬件的工作狀態,比如我們在打印一份圖片,在打印結束時就需要由系統對打印機提出相應的中斷請求,來以此結束這個打印的操作。在每臺電腦的系統中,是由一個中斷控制器8259或是8259A的芯片(現在此芯片大都集成到其它的芯片內)來控制系統中每個硬件的中斷控制。目前共有16組IRQ,去掉其中用來作橋接的一組IRQ,實際上只有15組IRQ可供硬件調用。這16組IRQ的主要用途如下表:
IRQ編號
設備名稱
用途
IRQ0
Time
電腦系統計時器
IRQ1
KeyBoard
鍵盤
IRQ2
Redirect IRQ9
與IRQ9相接,MPU-401 MDI使用該IRQ
IRQ3
COM2
串口設備
IRQ4
COM1
串口設備
IRQ5
LPT2
建議聲卡使用該IRQ
IRQ6
FDD
軟驅傳輸控制用
IRQ7
LPT1
打印機傳輸控制用
IRQ8
CMOS Alert
即時時鐘
IRQ9
Redirect IRQ2
與IRQ2相接;可設定給其它硬件使用
IRQ10
Reversed
建議保留給網卡使用該IRQ
IRQ11
Reversed
建議保留給AGP顯卡使用
IRQ12
PS/2Mouse
接PS/2鼠標,若無也可設定給其他硬件使用
IRQ13
FPU
協處理器用,例如FPU(浮點運算器)
IRQ14
Primary IDE
主硬盤傳輸控制用
IRQ15
Secondary Ide
從硬盤傳輸控制用
Windbg調試Release版exe .dll .ocx 等 (轉)
v0.1 2006-6-1(兒童節)
1.生成符號信息
更改Relase版的設置(2處):
一、Project Setting ->C/C++
Debug info:
選擇Program Database
二、Project Setting ->Link
選中Generate debug info
重新編譯
2.安裝Windbg
下載安裝最新的Windbg
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
3.設定環境變量
對于user32.dll等系統文件,Windbg可以自動從微軟網站下載所需的符號信息.我們只需設定_NT_SYMBOL_PATH
這個環境變量告訴Winddbg.方法如下:
我的電腦>右鍵菜單>屬性>高級選項卡>環境變量>系統變量>新建
變量名: _NT_SYMBOL_PATH
? ? 變量值:SRV*F:\websymbols*
http://msdl.microsoft.com/download/symbols
解釋一下: F:\websymbols用來存儲系統符號.你可以指定其他的路徑.Windbg會自動創建該文件夾
4.設定符號路徑
新建一個文件夾,譬如C:\MyAppSymbols
將第一步中生成的Release目錄下<youapp>.pdb文件拷貝到該文件夾,該pdb文件包含了調試所需的符號信息.
打開Windbg,選擇File>Symbol file path>將C:\MyAppSymbols路徑添加進去
5.調試程序
選擇 File > Open Executable 然后選擇你需要調試的Exe文件,就可以調試了,其他操作和VC6差不多.