2008年5月4日 星期日

[動畫] 涼宮春日的憂鬱

約莫一個禮拜時間,我看完了!最近恰好想要為生活添加些不同的元素,所以我開始看這動畫,大概也受同學的影響,常常看到別人提起這部動畫片名,但還是必須親自下海啦!

說說別的,我頗喜歡看這種高中生活的場景,喜歡一群人向同一個方向行進,儘管目標可能是多麼地枯燥乏味也罷。另外,我特別對”文化祭”感到熱血!回想一下,上一部類似的影集應該是電影版”水男孩”吧。其實像學生生活的我都還滿喜歡看的,如”心之谷”的故事,只要跟音樂和內心層面有關的,我都還滿願意多欣賞一下的。

回到主題,我覺得這部動畫算滿有料的,很多細節都規劃得不錯,雖然以片面的看待,可能就只有兩個字,「萌」&「色」,另外,我還請教過別人,對方說「那不是給宅男看的嗎」!當我真正看完時,除了有些場景對我而言比較無趣外,整體上我很喜歡有那麼一個強勢有活力的人,以行動化的方式來渲染生活,彷彿腳步還跟不上頻率時,心卻早已被填的滿滿滿,當然,這一切還必須建立在”我願意”才行。至於其他的感受嘛,裡頭內容隱性著不少人性的部分,跟憂鬱有著很大的關係,看著看著,一些倒像是自己的足跡,只是我沒有那般激進。整體上,我覺得故事算是為現實生活延生出多方的想像空間,加以完整化一切吧。

回想起過去,有那麼一個人說,在我的面前似乎顯得自己像幼稚園,我很慶幸,慶幸對方可以不用那繁雜的思路規劃,畢竟走過那一遭,才會發現,簡單,原來是最好的一條路。只是,當我經歷後,我拾不回當年的純真,我只能維持著「平靜」罷了。

我想,有空的話或許會去翻翻小說吧!更有閒的話,可以考慮用真正的順序再看一遍吧?

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 );