2010年3月25日 星期四

Check Endianness

bool isLittleEndian(){
const WORD endian = 0x1234;
return *((BYTE*)&endian) == 0x34;
}

2010年3月24日 星期三

GetParent in a dialog box

http://support.microsoft.com/?scid=kb%3Ben-us%3B118610

原來在丟 parent 給 top-level window 或 popup window 後,它們會再更進一步去取得 parent,直接取得 top-level window 為止
難怪我這樣的架構下,CDialog2 取得的 parent 不是 CWnd,而是 CDialog
CDialog
    -> CWnd
        -> CDialog2

2010年3月19日 星期五

列出「我最近的文件」清單

我最近的文件:雞肋又容易侵犯隱私的功能,不論開過什麼見不得人的東東,該檔案的捷徑都會被收錄在這個地方。去觀察男性使用者的這個目錄可以對他的性癖有初步認識。
預設路徑
C:\Documents and Settings\<User Name>\Recent


XP:「開始」功能表右鍵->[內容]->[「開始」功能表]->[自訂]->[進階]->[最近的文件]
列出最近開啟的文件:取消勾選後,「最近的文件」項目將不會出現在「開始」功能表內
清除清單:清掉「最近的文件」中的記錄

開啟 regeidt 至
[HKEY_CURRENT_USER]→[Software]→[Microsoft]→[Windows]→[CurrentVersion]→[Policies]→[Explorer]
新增名為 NoRecentDocsMenu 的 DWORD,值為 1:隱藏上述「最近的文件」的設定區塊
新增名為 NoRecentDocsHistory 的 DWORD,值為 1:開啟過的檔案捷徑將不再收錄至「最近的文件」內

印出「最近的文件」內容

#include <windows.h>
#include <shlobj.h>
#pragma comment ( lib, "shell32.lib" )

int _tmain( int argc, _TCHAR* argv[] ){
TCHAR path[MAX_PATH+1];
WIN32_FIND_DATA findData;
HANDLE hFind;

if( SHGetSpecialFolderPath( NULL, path, CSIDL_RECENT, FALSE ) ){
_tprintf_s( _T("%s\n"), path );

_tcscat_s( path, _T("\\*.*") );
hFind = FindFirstFile( path, &findData );
path[_tcslen( path )-3] = 0;

do{
_tprintf_s( _T("%s%s\n"), path, findData.cFileName );
} while ( FindNextFile( hFind, &findData ) );

if( hFind != INVALID_HANDLE_VALUE ){
FindClose( hFind );
}
}

system( "pause" );
return 0;
}


Output as text file in UTF-16LE: RecentList.txt
must define _UNICODE

#include <windows.h>
#include <shlobj.h>
#pragma comment ( lib, "shell32.lib" )

int _tmain( int argc, _TCHAR* argv[] ){
FILE* pFile = NULL;
_tfopen_s( &pFile, _T("RecentList.txt"), _T("wb") );
if( !pFile ){
_tprintf_s( _T("Cannot open file" ) );
system( "pause" );
return 0;
}

WORD BOM = 0xFEFF;
fwrite( &BOM, sizeof( WORD ), 1, pFile );

TCHAR path[MAX_PATH+1];
WIN32_FIND_DATA findData;
HANDLE hFind;
if( SHGetSpecialFolderPath( NULL, path, CSIDL_RECENT, FALSE ) ){
_ftprintf_s( pFile, _T("%s\n"), path );

_tcscat_s( path, _T("\\*.*") );
hFind = FindFirstFile( path, &findData );
path[_tcslen( path )-3] = 0;

do{
_ftprintf_s( pFile, _T("%s%s\n"), path, findData.cFileName );
} while ( FindNextFile( hFind, &findData ) );

if( hFind != INVALID_HANDLE_VALUE ){
FindClose( hFind );
}
}
fclose( pFile );

return 0;
}

2010年3月13日 星期六

陰險的家樂福……

家樂福老是出現結帳價與架上標示價不同的情況
今天買了 A 商品,架上標 69 元,回家看發票卻是 79 元
結帳的時候忙著裝商品入購物袋,沒空盯著收銀台一項一項監視商品價格
難道真得要求消費者一一背下各種商品的標示價,並在結帳完時立刻詳細比對才行嗎?
用這種手段來陰沒有比對價格的消費者的錢,有夠賤的!

今天俺是有比對價格沒錯,不過整個意識都被吸引到另一項錯誤上了
俺另外有買 X 商品,標示 95 元買一送一,俺買了兩組,也就是四個
結帳時,發票上對於該商品的價格顯示為
X 商品 95
X 商品 95
買一送一 -95
x 商品 69
X 商品 95
總價應該為 190 元的 X 商品,被算成了 259 元
去服務台詢問後,原因是那一個 x 商品在結帳時刷錯了條碼
x 是原本的條碼,因為特價活動所以另外準備了 X 碼條,貼在 x 上
不過那一個貼歪了,在刷時去刷到了下面的 x 條碼
所以買一送一的折價沒了,反而多了一個原價 x 上去
最後是取消了錯誤的部分,重新結帳,算解決了
沒想到回家後記帳才發現除了 X 商品之外,A 商品也標價不實!

話說 x 商品原價 69 元,在特價活動時反而漲了五成,變 99 元
單買或是刷錯價的反而買貴
真的處處是陷阱,有夠陰險的(=△=. )

以前還有踩到地雷的經驗:
家樂福的特價花車,標價牌上寫著 49 元,車上放了多個品牌的平口褲
理所當然會認為該車上所有平口褲都是 49 元,就隨便挑了四件結帳
回記帳時才發現竟然每件都是 79 元
兩天後又去買東西時,再仔細看一看該特價花車
標價牌上寫的是 XXX 牌平口褲 49 元,XXX 是沒見過的外國英文品牌,一般人根本不會去分辨,並且字體大小約只有價格的四分之一
然後俺拿的是別牌的,一樣是外國英文品牌,跟特價品的品牌不同
不同價格的同性質商品竟然放在同一個特價花車上,像俺這樣沒仔細確認的人就踩到地雷了

2010年3月3日 星期三

C2143 in yvals.h

剛剛製作 demo 時,出現
~yvals.h(513) : error C2143: syntax error : missing ';' before 'namespace'
這樣莫名其妙的錯誤訊息
其下也跟著一堆
error C2061: syntax error : identifier 'DWORD'
等不可能會出現的錯誤
詳細檢查結果,是定義某個結構時少了個分號……
特此記錄,以便日後再犯時參考~(= =)~

Auto-Activation for eclipse

[Window]->[Preferences]->[Java]->[Editor]->[Content Assist]->[Auto-Activation]

烤箱回來了

在領取時,看到單子上寫著「溫控 fuse」
看樣子又是溫保掛掉
上次掛掉的也是溫保,不過不知道是溫度保險絲還是溫控保險絲
這玩意兒究竟是幹啥用的,怎麼會這麼常掛掉(=△=. )

2010年3月2日 星期二

烤箱又送修了

一月底時發生過溫度保險絲?
沒想到才不到一個半月,又來了

剛剛在烤雞塊跟薯餅的時候,明明還沒聽到結束的「叮」聲,電源燈卻已熄滅了
再仔細一看,加熱管也已非燒紅狀態,可能已斷電數分鐘久
與上次一樣,變更多次加熱設定嘗試看能不能啟動,但連結果也跟上次一樣

這玩意兒該不會真的壽命只有一個月吧……
就算運氣好附近有維修據點也不能這樣玩吧~(= =)~

以前寫的找質數函數

以前寫的找質數函數
真懷念那為了這樣幾行小程式而絞盡腦汁的日子(遠目)

以 6n+1 6n-1 法檢驗 n 是否為質數
bool isPrime( const DWORD n ){
if( n < 2 )
return FALSE;
if( n == 2 || n == 3 )
return TRUE;
if( !(n%2) || !(n%3) )
return FALSE;
DWORD limit = (DWORD)sqrt( (double)n );
for( DWORD i=5, gap=2; i<=limit; i+=gap, gap=6-gap ){
if( !(n%i) ){
return FALSE;
}
}
return TRUE;
}

以 Eratosthenes 篩法找出 n 以下的質數
bool* eratosthenes( const DWORD n ){
bool* pPrime = new bool[n+1];
pPrime[0] = pPrime[1] = FALSE;
for( DWORD i=2; i<=n; ++i ){
pPrime[i] = TRUE;
}
DWORD limit = (DWORD)sqrt( (double)n );
for( DWORD i=2; i<limit; ++i ){
if( pPrime[i] ){
for( DWORD j=i*i; j<=n; j+=i ){
pPrime[j] = FALSE;
}
}
}
return pPrime;
}

2010年3月1日 星期一

DWDMAP

省空間做法
拿 DWORD 陣列當 BOOLEAN 陣列用,只需秏原 1/32 空間
#define DWDMAP( dwd, n ) ((dwd[n>>5]>>(n&0x1F))&0x1)

此 MACRO 簡單說就是在做 ( dwd[n/32] >> n%32 ) & 0x1