Vodka Watermelon

我真是想不到可以這樣吃西瓜…
下次也來試試看.
從以前同事那兒看來的:伏特加西瓜
節錄方法如下:
1. 準備西瓜及伏特加
2. 在西瓜上面開個洞,洞的大小自己衡量,大一點,滲透的比較快.
3. 灌入Vodka, 等候24~48小時後即可.

雪山隧道

今天看了一本去年的雜誌,才知道雪山隧道的故事…
這條隧道其實是蠻悲壯的被挖出來的.
挖了十三年,除了難挖,還是難挖,挖的久,還被監察院彈劾,有貪污之嫌…
這一段引用自土木水利半月刊-66集:雪山隧道導坑西段開挖貫通 ─ 鄭文隆的堅持‧證明正確

工程師的可悲處
北宜高速路的工程,讓國工局20餘人被告,鄭局長指出有承商告國工局「刁難」,但檢調單位起訴書是「圖利」承商,可謂「莫名其妙」;又有承商指控國工局使用不合法棄土場,其實只因國工局堅持環保,棄土不是選擇外包給廠商就了事,當工程施工高峰期時,在北縣完全沒有合法棄土場,國工局監督選擇已經政府認可正在完成申請手續的棄土場,這樣因而被告「不合法」。調查站認為沒有合法棄土場,可以停工,不要繼續施工;所以國工局當初大可選擇停工,等有合法棄土場時再施工,或外包由廠商去處理,國工局可以不聞不問不管棄土是否倒入合法棄土場,「工程做不完不是國工局的事」,官場準則應該是多做多錯、不做不錯吧?
鄭局長指出檢調單位清查承認國工局幾位北宜施工處前、後任處長存款帳戶清白,但仍在查他們「圖利廠商」,鄭局長以肯定的態度支持這幾位處長,結果連他也一併遭調查。鄭局長心痛的說這幾位處長,李宏徹是日本東京大學博士、陳純敬是美國北卡羅來納博士、曾大仁是美國柏克萊博士,都是國工局極優秀的人才,因這個工程,卻得面對官司纏身。
「這個案子讓工程人員覺得悲壯!」鄭局長表示施工人員在前面往前衝,兢兢業業面對大自然挑戰的艱困環境,而背後卻是受到社會不明事理的挑戰,有一大堆人扯後腿、落井下石,像有兩把刀插在他們身上。
工程人員真的是痛苦點滴在心頭,國工局處長、主任、副主任、二十多人都被告,想不到認真用心的做工程,卻落到要上法院辯明沒貪污、沒有圖利包商,法院的傳訊,讓這些人以及他們的家屬情緒也瀕臨崩潰。
鄭局長指出北宜高速路的工程,經歷過許多風風雨雨,現在已是克服了地質的困難,逐步要驗收成果,但再回頭看問題,工程人員為了成就大工程,卻接收了很大噓聲,實在是可悲。

看了真是蠻憤慨的呢~~
畢竟我也是工程師,雖然是軟體的…
其他參考資料:
*土木水利半月刊66集雪山隧道開挖工程之隧道湧水現象對水資源利用之啟示
*環境資訊中心小雪的心聲-雪山隧道導坑貫通事件悲思
*國改評論雪山隧道趕進度,不可能任務
*雪山隧道

寓廣告於氣象

今早看到 CCTV 的氣象預報,才真正了解到什麼叫做寓廣告於氣象…
很可惜當時沒能帶相機,把畫面拍攝下來.
一邊在畫面右邊約 1/4 的區塊播放各地天氣(氣溫,天氣概況…等),一邊則在畫面的左邊 3/4 播放當地著名的風景區/遊樂區照片…
所以想要在這畫面出現的廠商,就得花錢買版面,這樣才能播出.這實在是令我覺得她們真的很有商業頭腦,這樣又多收了一筆廣告收入….

如何判別是否為 DRM 的 ASF 檔案?

如何判別一個 ASF 檔案是否為 DRM 的 ASF 檔案?
詳情資料可以參考微軟提供的 Specification: Advanced Systems Format (ASF) Specification
大致上很簡單,一個 ASF 檔案主要有三個部分: Header Object, Data Object, Index Object.
而每個部分又各由不同的 Object 所組成.
要分辨是否為 DRM,主要是在 Header Object 裡面找尋是否有 Content Encryption Object.
那麼要怎麼找尋呢?? OK, 每個 Object 的最前面有唯一的 GUID,你可以依據 GUID 來找到.
而這些,你都可以在 Specification 的後面幾張找到 ( 或者你可以搜尋 ASF GUIDs ).
至此,寫起來並不太困難.程式碼如下:

typedef unsigned long UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef int BOOL;
enum BOOLEAN
{
FALSE = 0,
TRUE
};
typedef struct GUID_s
{
UINT32 id1;
UINT16 id2;
UINT16 id3;
UINT16 id4;
UINT8 id5[6];
}GUID;
//Content Encryption Object
GUID ASF_Content_Encryption_Object_guid =
{
0x2211b3fb,
0xbd23,
0x11d2,
0xb7b4,
{
0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e
}
};
/*
typedef struct ContentEncryptionObject_s
{
GUID objectID;
UINT32 objectSize; // objectSize should be QWORD, 8 bytes, but CCS has not this type.
UINT32 objectSize1;
UINT32 secretDataLength;
BYTE* secretData; // according secretDataLength
UINT32 protectionTypeLength;
char* protectionType;
UINT32 keyIDLength;
char* keyID;
UINT32 licenseURLLength;
char* licenseURL;
}ContentEncryptionObject_t;
*/
//extern CF_FILE* filePtrR;
typedef FILE CF_FILE;
CF_FILE* filePtrR;
long
FILEr_ftell()
{
return ftell( filePtrR );
}
int
FILEr_fseek( long filepos, int whence)
{
return fseek( filePtrR, filepos, whence );
}
long
FILEr_fread( UINT8* ptr, long length )
{
return fread( ptr, 1, length, filePtrR );
}
char* SDRAM_HOLE = NULL;
BOOL
isASFDRM( )
{
long filePos;
char* spaceForParsing = (char*)( SDRAM_HOLE + 0x800000 ); // use the space after 8 MB, prevent conflict
int GUIDLen = sizeof( GUID );
int iter, len = 0;
BOOL bFound = FALSE, bResult = FALSE;
UINT32 headerObjectSize = 0;
UINT32 secretDataLength=0;
UINT32 protectionTypeLength=0;
char* protectionType=NULL;
long readLen=0;
char* encryptionPos = NULL;
// save file position
filePos = FILEr_ftell();
// seek to the start position
FILEr_fseek( 16, 0); //SEEK_SET
FILEr_fread( (UINT8*)&headerObjectSize, 4 ); // we should read 8 here, but ….
// read all header object
// then search the specified GUID, use pattern compare
FILEr_fseek( 0, 0 ); // SEEK_SET
readLen = FILEr_fread( spaceForParsing, headerObjectSize );
len = headerObjectSize – GUIDLen;
// searching.
for( iter = 0; iter objectID
encryptionPos = spaceForParsing + iter;
// ( encryptionPos + GUIDLen ) ==> objectSize
// ( encryptionPos + GUIDLen + 8 ) ==> secretDataLength
secretDataLength = (UINT32) *( encryptionPos + GUIDLen + 8 );
// ( spaceForParsing + iter + GUIDLen + 8 + 4 ) ==> secretData
// ( spaceForParsing + iter + GUIDLen + 12 + secretDataLength ) ==> protectionTypeLength;
protectionTypeLength = (UINT32) *(encryptionPos + GUIDLen + 12 + secretDataLength );
protectionType = (char*) (encryptionPos + GUIDLen + 12 + secretDataLength + 4 );
if( strncmp( protectionType, “DRM”, 3 ) == 0 )
bResult = TRUE;
OnFinally:
// restore file position
FILEr_fseek( filePos, 0); //SEEK_SET
// return result.
return bResult;
}
int main(int argc, char* argv[])
{
SDRAM_HOLE = (char*) malloc( 0x800000 * 2 );
filePtrR = fopen( “00 Cannot Play.wma”, “rb” );
if( isASFDRM() )
printf(“is a drm file.\n”);
else
printf(“not a drm file.\n”);
fclose( filePtrR );
return 0;
}

ok, 程式裡面你會發現一些奇怪的地方,是的,因為我需要在 embedded 環境下運作,所以為了符合環境,所以做了一些調整,不過你還是可以在 Visual C++ 上來運行這段代碼.
看不順眼的,就自己調整吧…
這份 specification 其實斷斷續續看一陣子了,都沒怎麼專心看,不過昨天看的時候,突然開竅了,於是就把這麼一段代碼搞定了.
真神奇啊….

來到崑山

昨天晚上來到公司在崑山的廠區,即將在這裡呆三個星期….(希望是只有三個星期…)
剛來的第一個印象,就是…..我又收假了嗎??
感覺上跟以前在鳳山步校當兵的時候一樣,廠區大大的,也是切割成一塊一塊的~~
真的是太像了.
大致上該帶的東西都帶了,唯一的誤算是天氣,有些涼,沒想像中那麼的熱.
看來得每天洗冷水澡,增強抵抗力了.

不知所云

數週前….
小E:”啊~~整個改成這樣子以後,這邊可能會有問題….”
小E:”嗯…..怎麼辦…先記起來好了….到時候再說…”
今天…
H哥:”喔~~這邊沒辦法試播放影片!!小E,該怎麼辦??”
小E:”我知道這邊,我想一下…”
H哥:”這邊當初沒想到,這不能怪你…”
小E:”我想可以這樣子作…”
H哥:”我想也是這樣子…”
不知道為什麼….
小E:”我早就知道了…”
H哥:(驚愕貌…)”你早就知道了?!”
小E:”我的意思是…”
(一陣混亂….)
事後…
小E, 你在講什麼啊?!
就裝傻說不知道就好啦…

跳槽到 CentOS 3.4

昨天把家裡的 server 從原來的WBEL 改為 CentOS 了.
跳槽的原因….嗯….沒什麼特別的,只因為 CentOS 的 mailing list 比較活躍,更新速度感覺上也比較快.
步驟也是簡單到不行….CentOS 官方網站上有提供FAQ.
照步驟作,網路夠快,裝的套件也不多的話,很快就裝完了…
下次的目標是從 3.4 升級到 4, 不過看起來有蠻多困難的. 畢竟 kernel 換到 2.6 ,處理 hardware 的方式也變了挺多的, 找了一下,大部分都建議燒成光碟片,以光碟開機來作昇級.
再找時間試試看吧.

Upgrade to MediaWiki 1.4.4

鬼混了很久,終於把家裡的 wiki 升級到 1.4.4 了.
升級方法還挺簡單的.
1. 備份你的 LocalSettings.php / AdminSettings.php
2. 把下載來的 MediaWiki 1.4.4 tarball 解壓以後整個蓋過去.
3. 切到 maintenance 目錄下, 執行 php update.php
4. 收工.
真的很簡單吧….
下個目標是把 VFP Wiki 升級到 1.4.4 …