2010年3月25日 星期四

Check Endianness

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

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:開啟過的檔案捷徑將不再收錄至「最近的文件」內

印出「最近的文件」內容
01#include <windows.h>
02#include <shlobj.h>
03#pragma comment ( lib, "shell32.lib" )
04 
05int _tmain( int argc, _TCHAR* argv[] ){
06    TCHAR path[MAX_PATH+1];
07    WIN32_FIND_DATA findData;
08    HANDLE hFind;
09 
10    if( SHGetSpecialFolderPath( NULL, path, CSIDL_RECENT, FALSE ) ){
11        _tprintf_s( _T("%s\n"), path );
12 
13        _tcscat_s( path, _T("\\*.*") );
14        hFind = FindFirstFile( path, &findData );
15        path[_tcslen( path )-3] = 0;
16 
17        do{
18            _tprintf_s( _T("%s%s\n"), path, findData.cFileName );
19        } while ( FindNextFile( hFind, &findData ) );
20 
21        if( hFind != INVALID_HANDLE_VALUE ){
22            FindClose( hFind );
23        }
24    }
25 
26    system( "pause" );
27    return 0;
28}


Output as text file in UTF-16LE: RecentList.txt
must define _UNICODE
01#include <windows.h>
02#include <shlobj.h>
03#pragma comment ( lib, "shell32.lib" )
04 
05int _tmain( int argc, _TCHAR* argv[] ){
06    FILE* pFile = NULL;
07    _tfopen_s( &pFile, _T("RecentList.txt"), _T("wb") );
08    if( !pFile ){
09        _tprintf_s( _T("Cannot open file" ) );
10        system( "pause" );
11        return 0;
12    }
13 
14    WORD BOM = 0xFEFF;
15    fwrite( &BOM, sizeof( WORD ), 1, pFile );
16 
17    TCHAR path[MAX_PATH+1];
18    WIN32_FIND_DATA findData;
19    HANDLE hFind;
20    if( SHGetSpecialFolderPath( NULL, path, CSIDL_RECENT, FALSE ) ){
21        _ftprintf_s( pFile, _T("%s\n"), path );
22 
23        _tcscat_s( path, _T("\\*.*") );
24        hFind = FindFirstFile( path, &findData );
25        path[_tcslen( path )-3] = 0;
26 
27        do{
28            _ftprintf_s( pFile, _T("%s%s\n"), path, findData.cFileName );
29        } while ( FindNextFile( hFind, &findData ) );
30 
31        if( hFind != INVALID_HANDLE_VALUE ){
32            FindClose( hFind );
33        }
34    }
35    fclose( pFile );
36 
37    return 0;
38}

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 時,出現
1~yvals.h(513) : error C2143: syntax error : missing ';' before 'namespace'
這樣莫名其妙的錯誤訊息
其下也跟著一堆
1error 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 是否為質數
01bool isPrime( const DWORD n ){
02    if( n < 2 )
03        return FALSE;
04    if( n == 2 || n == 3 )
05        return TRUE;
06    if( !(n%2) || !(n%3) )
07        return FALSE;
08    DWORD limit = (DWORD)sqrt( (double)n );
09    for( DWORD i=5, gap=2; i<=limit; i+=gap, gap=6-gap ){
10        if( !(n%i) ){
11            return FALSE;
12        }
13    }
14    return TRUE;
15}

以 Eratosthenes 篩法找出 n 以下的質數
01bool* eratosthenes( const DWORD n ){
02    bool* pPrime = new bool[n+1];
03    pPrime[0] = pPrime[1] = FALSE;
04    for( DWORD i=2; i<=n; ++i ){
05        pPrime[i] = TRUE;
06    }
07    DWORD limit = (DWORD)sqrt( (double)n );
08    for( DWORD i=2; i<limit; ++i ){
09        if( pPrime[i] ){
10            for( DWORD j=i*i; j<=n; j+=i ){
11                pPrime[j] = FALSE;
12            }
13        }
14    }
15    return pPrime;
16}

2010年3月1日 星期一

DWDMAP

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

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