2008年4月29日 星期二
傀儡
因此,我也開始嘗試不一樣的生活,首先呢,就是學學別人看看漫畫!我挑了「海賊王」。接著,看看同學個人板上常出現的動畫,我隨意看了一集的「涼宮春日的憂鬱」,說真的還有點兒不懂,哈。不過生活倒真的有輕鬆許多啦!然後,我也玩玩超任遊戲「快打炫風2加強版」,發現以前在玩的時候,特別喜歡不斷地攻擊,一定要耍個昇龍拳或是個什麼勁的才過癮,但這次我反而趨向防守型的玩法,才懂招術不一定要酷炫,簡單的強拳強腳才是最殺的殺傷力!
最後,拉回主題,其實會那樣思考,主要還是在規劃未來,總覺得目前的自己,只要一碰到工作或什麼的,一不小心就會瘋狂地投入,假使運氣好一兩週搞定,那沒什麼,倘若是動輒數把月時,生活作息可真的會大大影響。至於傀儡的感觸呢?實在是跟在天才型的領導者身後,有時會擔憂自己,自己像是個傀儡般,別人說一就是一,久了連自己的思考都消聲匿跡,那這樣又怎能超越進步呢~大概是心情悶的時容易悲觀吧!
2008年4月28日 星期一
[C] 檔案處理 - 讀取出的檔案大小錯誤?
開檔讀資料 請務必指定 mode
FILE *fp ,*fp2;
char buf;
fp = (FILE*)fopen( argv[1] , "r" );
fp2 = (FILE*)fopen( argv[2] , "w" );
while( !feof( fp ) ){
fread( &buf , 1, 1 , fp );
fwrite( &buf , 1, 1 ,fp2 );
}
fclose( fp );
fclose( fp2);
以上程式 若是讀圖檔(binary) 在 unix 下可以正常地複製一張圖出來
但在 Windows XP with SP2 上 無論是 Dev-C++ 還是 VC 6 都會出錯
修正的方式:
FILE *fp ,*fp2;
char buf;
fp = (FILE*)fopen( argv[1] , "rb" );
fp2 = (FILE*)fopen( argv[2] , "wb" );
while( !feof( fp ) ){
fread( &buf , 1, 1 , fp );
fwrite( &buf , 1, 1 ,fp2 );
}
fclose( fp );
fclose( fp2);
結論:
不要偷懶 :p
2008年4月23日 星期三
走路渡假
昨天考完期中考後,心血來潮翻了翻海賊王的動漫,前陣子看動畫看到骷髏先生很酷地解決了蜘蛛猴!那時心中又燃起了對海賊王的莫名興奮,就這樣又追啊追地,後來又找了漫畫看到最新的進度,實在是太想知道動畫目前的打動結果了。簡單地渡過期中考完的一夜。
除此之外,我也寫了”興趣”。為什麼說用”寫”,因為我還是在寫程式。有點枯燥乏味,但我只想用寫程式來解悶,彷彿世界上只要專注著手上的程式流程,其他的煩惱通通可拋於腦後,但這次,是興趣而非工作,就像看漫畫時,已不會覺得是種”浪費時間”,因為,我在渡假。
希望能趕快找到興趣!
2008年4月20日 星期日
[C] File Locking @ Windows & FreeBSD
使用上儘管對第三者進行 locking ,或是避免使用 BufferI /O,不然容易出現資料不同步的現象,且跟 OS 的相依性會提高,對於要移值的程式就容易頭大啦!
開發與環境
Windows XP with SP3 + Dev-C++ v4.9.9.2 (gcc 3.4.2 )
FreeBSD 6.2-RELEASE-p1 (gcc 3.4.6)
程式碼:
#ifdef _WORK_FOR_WIN32_
#include <windows.h>
#include <io.h>
#endif
void File_LockByPtr( FILE * fd )
{
#ifndef _WORK_FOR_WIN32_
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();
if( fcntl( fileno( fd ) , F_SETLKW , &fl ) < 0 )
{
perror("Lock File Pointer Error @ LockFilePtr");
exit(1);
}
#else
HANDLE hFile = (HANDLE)_get_osfhandle(_fileno( fd ));
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
if( LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &ovl) == 0 )
{
perror("Lock File Pointer Error @ LockFilePtr");
exit(1);
}
#endif
}
void File_UnlockByPtr( FILE * fd )
{
#ifndef _WORK_FOR_WIN32_
struct flock fl;
#ifndef SYS_OPT_LOCKING_FILE_PONITER_WITHOUT_FFLUSH
fflush(fd);
#endif
fl.l_type = F_UNLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();
if( fcntl( fileno( fd ) , F_SETLK , &fl ) < 0 )
{
perror("Unlock File Pointer Error @ UnlockFilePtr");
exit(1);
}
#else
HANDLE hFile = (HANDLE)_get_osfhandle(_fileno( fd ));
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
#ifndef SYS_OPT_LOCKING_FILE_PONITER_WITHOUT_FFLUSH
fflush( fd );
#endif
if( UnlockFileEx(hFile, 0, 1, 0, &ovl) == 0 )
{
perror("Unlock File Pointer Error @ UnlockFileByPtr");
exit(1);
}
#endif
}
void File_LockByFD( int fd )
{
#ifndef WIN32
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();
if( fcntl( fd , F_SETLKW , &fl ) < 0 )
{
fprintf( stderr , "Lock File Pointer Error @ LockFilePtr\n");
exit(1);
}
#else
HANDLE hFile = (HANDLE)_get_osfhandle( fd );
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
if( ( lock_status = LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &ovl) ) == 0 )
{
fprintf( stderr , "Lock File Pointer Error @ LockFileFD\n");
exit(1);
}
#endif
}
void File_UnlockByFD( int fd )
{
#ifndef WIN32
struct flock fl;
fl.l_type = F_UNLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();
if( fcntl( fd , F_SETLK , &fl ) < 0 )
{
fprintf( stderr , "Unlock File Pointer Error @ UnlockFilePtr\n");
exit(1);
}
#else
HANDLE hFile = (HANDLE)_get_osfhandle( fd );
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
if( UnlockFileEx(hFile, 0, 1, 0, &ovl) == 0 )
{
fprintf( stderr , "Unlock File Pointer Error @ UnlockFileByFD\n");
exit(1);
}
#endif
}
用法:
if( ( opt->dblock = fopen( lock_file , "w" ) ) == NULL )
{
fprintf( stderr , "Cannot Open Lock File @ DB_Lock\n" );
exit(1);
}
File_LockByPtr( opt->dblock );
...
File_UnlockByPtr( opt->dblock );
fclose(opt->dblock);
或
#ifndef WIN32
struct flock fl;
if( ( db_lock_fd = open( db_lock_file , O_RDWR | O_CREAT ) ) == -1 )
#else
HANDLE hFile;
OVERLAPPED ovl;
if( ( db_lock_fd = _open( db_lock_file , _O_RDWR | _O_CREAT , _S_IREAD| _S_IWRITE ) ) == -1 )
#endif
{
switch( errno )
{
case EACCES:
printf("Tried to open read-only file for writing, file's sharing mode does not allow specified operations, or given path is directory.\n");
break;
case EEXIST:
printf("_O_CREAT and _O_EXCL flags specified, but filename already exists.\n");
break;
case EINVAL:
printf("Invalid oflag or pmode argument.\n");
break;
case EMFILE:
printf("No more file descriptors available (too many open files).\n");
break;
case ENOENT:
printf("File or path not found.\n");
break;
}
fprintf( stderr , "Cannot Open Lock File @ db_lock ,%d, %s\n" , errno , db_lock_file );
exit(1);
}
File_LockByFD( db_lock_fd );
...
File_UnlockByFD( db_lock_fd );
2008年4月19日 星期六
工作與興趣的分隔線
這樣的分界,是因為些前都是用興趣的方式來面對工作,所以很容易因為工作上的興趣缺缺,導致事情進行起來,苦悶許多!但這樣的分界不是對兩邊的負責態度不一,而是處理上時,心態需要微調。
昨天,原本想改寫學長寫的程式架構,覺得彈性不夠大,但說穿了只是想要用自己的方式去詮釋!今早花了點時間將其架構走了一遍,工作還是要用工作的態度面對,儘管整體架構不是自己熟悉的 framework ,就把它當做訓練跟別人合作吧!學會欣賞別人的架構,也是一門重要的學問!人,總要站在巨人的肩膀上!
至於興趣?最近花了很多時間在工作上,我想,我該為我的興趣負點責任,該花點時間想點好玩的事來碰碰。