雪山隧道

今天看了一本去年的雜誌,才知道雪山隧道的故事…
這條隧道其實是蠻悲壯的被挖出來的.
挖了十三年,除了難挖,還是難挖,挖的久,還被監察院彈劾,有貪污之嫌…
這一段引用自土木水利半月刊-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 …

從拍戲看 XP

出自:藍藍的 movie blog – 拍戲沒劇本
轉貼一部分…

首先,他說:「我是編劇出身的,當然知道劇本的重要,但是我更清楚,真正的電影不是在紙上完成的,所有的劇本只是個藍圖,在拍攝的過程裡一定會有改動。」
其次,王家衛強調:「電影上有些東西是無法用文字說明白的,例如一種表情,怎麼用文字說它呢?有時候就是一個特寫,比千言萬語更重要,男女主角為什麼會相愛,只要鏡頭讓你感到他們會相愛,那就對了。電影就是要讓你看見,讓你相信。」
第三點呢,王家衛的說法是:「在拍攝《手》的過程裡,我先拿「薄暮的舞女」原著小說給鞏俐看,告訴她簡單的故事大概,告訴她我打算怎麼拍,然後我就儲一路寫劇本,開工前就交給演員,有時候會再改,會再修。對演員來說最困難的是她可能無法知道每一場戲之間的相互關係,她不能控制故事的流程,只能一場接一場地演。」

看完這篇文章,發現這些導演幹的就是 XP (Extreme Programming) 呀~~
先捉出一個大方向,每天早上決定接下來要作的東西,晚上驗收.
很像,不是嗎??

林志玲與大蕃薯

聽力嚴重退化中…
看林志玲的優格廣告很久了,一直搞不清楚她大叫的是什麼話.
我以為是”大蕃薯”,可是大蕃薯跟優格有什麼關係呢??
這個疑問一直存在我心中好久好久………好想問她本人,到底在講什麼喔…
直到前幾天,和太太看電視的時候,又再次看到這廣告,
我就問我太太說:”她大喊的是什麼啊??為什麼是大蕃薯啊??跟優格有什麼關係啊??”
太太說:”是打分數,不是大蕃薯…”
我(恍然大悟貌):”原來如此啊….我懂了…..”