2009/10/31

人生第一次的員工旅遊~第一天~

這次的員工遊旅,本來是打著先報名,不行去就不去的心情報名的,畢竟專案離推出的時間已經很近了!

沒想到還是順利成行了,第一次的員工旅遊真的很開心,也讓我留下許多完美第一次的回憶!!

20091016(第一天):

早上七點就要到公司集合,七點半就要發車。所以我五點就起床了,洗個了澡,睡不太好,因為怕自已睡過頭遲到。

六點多到車站 ,買個了飲料,還買了買一送一泡菜口味的可樂果,意外的不錯吃,本來以為六點十五有車,結果車子的發車時間是六點十分,下個班次就六點半了(囧)。

本來以為六點半發車到公司會遲到,沒想到禮拜六的早上,車子意外的少,不到七點就到台北了,到公司大概七點十五分,時間蠻剛好的,吃過了總經理請吃的早餐,就逾快的發車了。

第一站是到紫南宮

紫南宮因為有親戚在那邊開店,所以每年大概都會過去一次買些東西。所以第一站真的引不起什麼興趣,讓當初在看行程表的時候,看到第一個是紫南宮,就沒心情往下看了(囧)。

image image

不過紫南宮的人潮還是不少的,這邊的發財金是蠻有名的,百峻、偉賓、老闆娘都借了發財金,希望他們來年能夠賺的飽飽的(因為同個案子,就等於大家發財 XD)。

另外金碧輝煌的廁所也是蠻有名的,裡面還做了噴泉~

image image

請大家吃了在竹山很名的竹筍包,我也是很愛吃的,每年回來都會吃,只是沒想到中午的餐廳又吃到了一次 XD

image

小小聲說:看圖片真的只有我一個拳頭大小沒錯吧…

接下來中午吃的是金竹味,有當地南投的名產,像是筊白筍、竹筍包,另外還有魚也是三天中最好吃的~

image image

接下來的第二個行程就往溪頭前進啦~

image image

這就是我們住的地方,很漂亮吧,呼吸著山上清新的空氣~接下來就往山上的神木區前進吧

image image image

(流浪腳~就是流籠囉~)

在高空走廊上,隨手可以碰觸的樹尖,穿梭在薄霧之間~留下了高空走廊大家腳的合影

imageimage

另外發現了人型無尾熊一隻 ^^

image

到達神木的時候,雖然霧已經變成了有點小雨,但是我們一群人,在那邊跳啊跳的自high著~

image image

下山的時候經過銀杏林

image image

不知道是不是最近太久沒運動了,腳有點酸痛的感覺..

image image

吃飯的餐廳,晚上看起來真的很漂亮,另外在吃飯的時候比賽快速喝啤酒的活動,拿到了第四名~

晚上的時候,還有生態解說員帶領我們去看螢火蟲、青蛙,在夜色漫步,跟在白天爬山,多了一種輕鬆的感覺~

回到了旅館,大家聚集在房間中,吃著白天買的零食,看著職棒兄弟象打到十七局,第一次看著這麼久的棒球,隨著比賽的進行,聽著大家愉快的討論,真著有種朋友一起度假溫馨的感覺~

隨著比賽的結束,大家也疲累的回到了各自的房間~享受山上的夜晚~

2009/10/17

四核心新電腦

不知道是不是最近基隆的連夜雨,讓我的電腦又把一台螢幕弄壞了,我家裡已經擺了兩台壞掉的CRT了!本來打算等到 Win7 推出之後,再打算換個電腦,但是這次有了這次的機會(?),就打算一次把螢幕跟主機換掉,以下是我的配備列表!!

CPU: AMD AM3 Phenomll X4-620/2.6G/95W/45nm/L2Cash 512KBx4

主機板:技嘉MA785GPMT-UD2H/RGB+DVI+HDMMI/雙通道DDR3 1800+/內建顯示卡 ATI Radeon HD 4200

記憶體:金士頓DDR3 2G 133 x 2

螢幕:BENQ G2220DHA 40000:1 22吋

Case 機殼:CoolerMaster RC334

電源供應器:Be Quite! E6-400W

價錢:16900

最近的電腦真是便宜多了,從原本的一核心就直接跳到四核心了。也代表現在的電腦設備貶值的速度加快了,所以沒有買顯卡的原因,因為最近也沒有特別想玩的遊戲,等之後需要再補顯卡的部份。

可惜是我沒有注意Benq這台是使用D-Sub接頭,但是這個價錢也是很低了,本來想買19吋的,想想也覺得夠用就好了。

我使用的主機板、機殼、電源供應器,都算是比較中上價錢,所以這個價錢還可以更低一些。再補一個便宜的顯示卡、光碟機、硬碟。差不多的價錢也可以組一台完整可以打打小遊戲的上網文書用電腦。

偷偷打一下最近的心得:

最近遊戲快要推出了,正在經歷需要修bug與行銷部門兩重的時間排程推擠,雖然工作這麼多年,但是第一次遇到真是讓人覺得新奇(?),希望接下來的工作順利!!更重要的是找漂亮的代言人啊~~

2009/06/20

[程式]目錄監控原始碼

最近更新了顯示程式方式,也好久沒有更新了。

這是我在KWallPaper 中使用的目錄監控Class。

由於在寫這程式時,曾參考上網路上的許多範例,因此在此分享與回饋~

在取得檔案變動時,我是將其變動放入一個queue中,如果直接寫入資料庫,延遲的時間,會造成後面的檔案沒有監控到。

此程式碼還有許多不足之處,歡迎批評指教,謝謝


#include "StdAfx.h"
#include ".\directorymonitor.h"
#include "ImgManager.h"

unsigned __stdcall DirectoryMonitorThreadCallback(LPVOID lpParm)
{
CDirectoryMonitor* pObj = (CDirectoryMonitor*) lpParm;

if( !pObj )
{
_endthreadex( 0 );
return 0;
}

pObj->RunThread();
_endthreadex( 0 );
return 0;
}

CDirectoryMonitor::CDirectoryMonitor( CImgManager* pOwnter ):
m_pOwner(pOwnter),
m_hCompletionPort(NULL),
m_ulCompletionKey(0),
m_hDir(NULL),
m_pBuffer(NULL),
m_nBufferSize(0)
{
memset( &m_Overlapped, 0, sizeof(m_Overlapped) );

}
CDirectoryMonitor::~CDirectoryMonitor(void)
{
if( m_hCompletionPort )
{
//The thread will catch this and exit the thread
PostQueuedCompletionStatus(m_hCompletionPort, 0, 0, NULL);
Sleep(1000);

for( unsigned int i = 0; i < m_nThreadCount; ++i )
{
HANDLE nThread = m_vecThread[i];

//wait for it to exit
WaitForSingleObject(nThread, INFINITE);
SAFE_CLOSEHANDLE(nThread);
}
m_hCompletionPort = NULL;
m_vecThread.clear();
}
SAFE_CLOSEHANDLE(m_hDir);

SAFE_DELETE_ARRAY(m_pBuffer);
m_nBufferSize = 0;
}

bool CDirectoryMonitor::Initialize( const TCHAR* szPath )
{
m_strMoniDir = szPath;

m_hDir = CreateFile( m_strMoniDir.c_str(), // pointer to the file name
FILE_LIST_DIRECTORY, // access (read/write) mode
FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE, // share mode
NULL, // security descriptor
OPEN_EXISTING, // how to create
FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, // file attributes
NULL // file with attributes to copy
);

if ( INVALID_HANDLE_VALUE == m_hDir )
return false;

SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);

m_nThreadCount = 1; //SystemInfo.dwNumberOfProcessors;

m_hCompletionPort = CreateIoCompletionPort(
m_hDir, // Handle to a file opened for overlapped I/O completion.
NULL, // existed Handle to the I/O completion port.
(ULONG_PTR)&m_ulCompletionKey, // CompletionKey
m_nThreadCount // NumberOfConcurrentThreads
);

if( NULL == m_hCompletionPort )
return false;

m_nBufferSize = 4096;//2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH);
m_pBuffer = new char[m_nBufferSize];

if( !_callReadDirectoryChanges() )
return false;

for( unsigned int i = 0; i < m_nThreadCount; ++i)
{
HANDLE nThread = (HANDLE)_beginthreadex( NULL, 0, &::DirectoryMonitorThreadCallback, (LPVOID)this, 0, NULL );

if( NULL != nThread )
{
m_vecThread.push_back( nThread );
}
}

KLOG( LOG_DEBUG, _T("DirectoryMonitor : %s"), m_strMoniDir.c_str() );

return true;
}

void CDirectoryMonitor::RunThread()
{
BOOL bSucceed = FALSE;
DWORD dwBytesReturned = 0;
TCHAR szFileName[MAX_PATH] = {0};
TCHAR szNotiryFileName[MAX_PATH] = {0};
DWORD dwAction = 0;

while(TRUE)
{
::Sleep(1);
LPOVERLAPPED lpOverlapped = &m_Overlapped;
bSucceed = GetQueuedCompletionStatus( m_hCompletionPort, // [in]Handle to the completion port of interest.
&dwBytesReturned, // lpNumberOfBytes
&m_ulCompletionKey, // lpCompletionKey
&lpOverlapped, // lpOverlapped
INFINITE // dwMilliseconds
);

if( NULL == lpOverlapped )
break;

if(!bSucceed || 0 == m_ulCompletionKey )
continue;

FILE_NOTIFY_INFORMATION * pNotify = (FILE_NOTIFY_INFORMATION*)m_pBuffer;
DWORD dwNextEntryOffset = 0;

do
{
pNotify = (FILE_NOTIFY_INFORMATION*)&m_pBuffer[dwNextEntryOffset];

dwNextEntryOffset += pNotify->NextEntryOffset;
dwAction = pNotify->Action;

memset( szNotiryFileName, 0, sizeof(szNotiryFileName));
_tcsncpy( szNotiryFileName, pNotify->FileName, pNotify->FileNameLength);
szNotiryFileName[pNotify->FileNameLength / sizeof(TCHAR) ] = '\0';
_stprintf( szFileName, _T("%s\\%s"), m_strMoniDir.c_str(), szNotiryFileName );

if( m_pOwner )
m_pOwner->NotifyFileChange( dwAction, szFileName );

}while ( 0 != pNotify->NextEntryOffset );

_callReadDirectoryChanges();
}
}

bool CDirectoryMonitor::Release()
{
return true;
}

bool CDirectoryMonitor::_callReadDirectoryChanges()
{
if( m_pBuffer )
{
memset( m_pBuffer, 0, m_nBufferSize );
}

BOOL BRet = ReadDirectoryChangesW( m_hDir, // hDirectory. Handle to the directory to be monitored
m_pBuffer, // [in, out] Pointer to the formatted buffer in which the read results are to be returned.
m_nBufferSize, // [in] Length of the buffer pointed to by the lpBuffer parameter, in bytes.
true, // bWatchSubtree
FILE_NOTIFY_CHANGE_FILE_NAME| // [in] Filter criteria the function checks to determine if the wait operation has completed.
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_CREATION,
NULL, // lpBytesReturned. For asynchronous calls, this parameter is undefined.
&m_Overlapped, // [in] Pointer to an OVERLAPPED structure that supplies data to be used during asynchronous operation.
NULL ); // lpCompletionRoutine

return BRet == TRUE ? true : false;
}


以上,歡迎參考~


2009/04/05

[更新]KWallPaper 版號 115

好久沒有更新文章了,這次的KWallPapery 增加了一些新功能,歡迎大家取用~

 

此次更新只需更新「KWallPaper.exe」與「Config.txt」,DB不需更新

下載:

 

更新項目如下..

  1. 監視目錄變動,當使用DB下的Load_Path,會同時監視目錄下的檔案變動,減少讀取硬碟的時間。
  2. 取消固定時間重新掃描硬碟,只有開始時讀取硬碟,理由如上。
  3. File選項增加
    • File Open 開啟目前圖片
    • File Delete 刪除圖片,丟入垃圾桶
    • Folder Open 開啟目前圖片目錄
  4. Config.txt 內容新增
    • BackGroundColor 設定背景顏色(數值 0 ~ 65535)
    • ImageTransMode 圖片品質轉換,0 速度快,品質最差; 5 速度最慢,但品質最好

2009/01/04

[作品]KWallPaper 自動換桌布軟體

一直以來用了很多款換桌布軟體,但是一直不是很滿意,就決定自已寫了一個。

特色

Unicode 支援

自定秒數更換

多種隨機模式

可經由軟體刪圖

評分系統

載入多種圖檔格式(BMP, JPG, PNG, GIF...........等)

更新

2009/04/05 版號115

Config.txt 設定檔案

DB: 使用資料庫名稱
CycleTime: 自動更換秒數
ShowStyle: 隨機方式
RankRate: 評分模式隨機比率
EnlargeMaxRate: 桌布自動放大, 圖檔比率

使用方式

不需安裝,執行之後,會自動縮到右下角工具列.

NextWallPaper: 更換桌布

File->Del : 刪除檔案(放到資源回收桶之內)

DB->Load_Path: 載入目錄圖檔
DB->Load_File: 載入檔案(可多選)
DB->Erase_File: 刪除db圖檔記錄

Rank->1~5 評分系統,5最高 1最低

Exit 離開程式

最後

資料庫是使用Sqlite3 ,如果需要更改資料庫內容,推薦使用tksqlite這套軟體。

軟體每10分鐘會重新掃描圖檔目錄。