Friday, November 21, 2008

晨光•法拉利


拉起窗簾
迅速傾灌的晨光
讓整個房間纖毫畢現

EOS 5D + EF 50mm f/1.4

Tuesday, November 11, 2008

Ubuntu 裝好後要先安裝的 packages

sudo apt-get install build-essential manpages-dev gawk bison flex texinfo automake libtool curl cvs

build-essential 是開發程式要用的工具
manpages-dev 是標準 C 函式庫的 man pages
 

Monday, November 10, 2008

自己跑 rsync daemon 並用來做不同機器的同步


rsyncd.conf 的內容

port = 12345
[home]
path = /home/tim
comment = My Home Area
list = yes
read only = no
use chroot = false

跑 rsync daemon
./myrsync --no-detach --daemon --config=rsyncd.conf

執行根目錄的同步
./myrsync -avz rsync://tim@ha1:12345/home .

只針對 C1 這個目錄同步
./myrsync -avz rsync://tim@ha1:12345/home/C1/ C1

名字叫 myrsync 是因為這是自己 build 出來的版本,原本系統安裝的版本太舊了!

Saturday, November 08, 2008

Made in China 的 IKEA

今天晚上到桃園 IKEA 買椅子給二樓和三樓的新空間使用,在組裝時,發現真的是便宜沒好貨,還是 IKEA 在中國的工廠品管變差了?雖然只是一把 749 元的椅子,可是也不能這樣搞呀?難道都沒有品管在看的嗎?














Thursday, November 06, 2008

Ubuntu 就甘心ㄟ∼∼∼


個人覺得 Ubuntu 最貼心的一點:


你沒灌的軟體會教你如何安裝,只要你有網路,就可以搞定∼∼∼

Tuesday, November 04, 2008

Droid Sans Mono Dotted Zero

我自己修改的 TTF 字型。

原來的 0 跟大寫 O 不好分辨,把 0 的中間加一點,這樣在 jEdit 中比較好看出區別。


下載連結 http://rapidshare.com/files/161825962/DroidSansMonoDotZero.ttf.html

Fw: 請拒絕搭乘新竹火車站前計程車!!


---------- Forwarded message ----------

真的是昨天才發生的耶 , 昨天PTT也有路人爆料

Dear all:

這是我同事昨天上午在新竹火車站遭遇的事件,一個女孩子眼看著計程車司機群毆男朋友,她在現場呼救也沒人回應,周圍那麼多人居然都冷眼旁觀,警察還打算息事寧人,這算哪門子幸福生活城市? 真是可笑至極!

請協助轉寄給你的朋友們,請大家有所警覺:務必要避免搭乘火車站旁計程車招呼站的計程車,因為那邊不但亂喊價而且品質極差,早有惡評許多年了。多走幾步到SOGO百貨前面、或者屈臣氏前面,都有跳表計程車。畢竟自身安全比甚麼都重要。

冬菱 敬上

---------- Forwarded message ----------
From: seven
這是個真實事件,一位手無寸鐵的交大研究生在光天化日之下在新竹火車站前計程車司機圍毆,由於新竹火車站前的排班計程車司機多為白牌司機,不僅素質低落、漫天喊價,還常滋眾鬧事,且部分司機還前科在案,聚集在火車站一側儼如幫派份子。為了您的自身安全,並發揚公理正義,請將此信件轉寄給親友,最大目的是防止再有受害人,並希望藉由輿論壓力,促進新竹市建立起優良計程車司機篩選系統,淘汰劣質計程車司機,還給大家安全的大眾交通環境。

<事件真實經過>
2008年11月2日上午11點10分,一名交大研究生(受害人)騎乘機車搭載其女友至新竹火車站搭車北上,在火車站站前左側近殘障坡道的機車暫停處停車時,遭到計程車司機莊敏泰(車號3R-113)開車攬阻,莊敏泰口出惡言稱因要倒車,要原停在機車暫停處的受害人離開(見附件圖1)。受害人於是將機車移開,莊敏泰下車斥責,受害人於是與莊敏泰發生口角衝突,現場還有一名路人出面勸阻莊敏泰,同樣遭他恐嚇並作勢要打人,一旁其他計程車司機仗著人多於是集結起鬨。


受害人見情勢居於弱勢,於是趕緊連忙道歉,並將機車再移至火車站門口前。,進火車站送其女友搭火車,此時莊敏泰心有不甘,將其計程車開至火車站前堵住受害人出路,並在車內拿球棒作勢要打受害人(見附件圖2)。受害人於是趕緊逃離火車站騎上摩托車要離開,不料莊敏泰將計程車移至火車站汽機車出口擋住被害人(見附件圖 3)。,被害人連忙轉向向火車站汽機車入口加速逃開。

此時卻有四個彪形大漢從計程車休息站衝出,將受還人自機車拖下四人圍住群毆,莊敏泰此時也自計程車下車跑來加入圍毆的行列,形成五個大男人圍毆一名手無寸鐵的學生(見附件圖4)。,且地點為新竹火車站前,現場圍觀群眾超過四十名。


其女友目睹整場經過,自火車站剪票口跑去攔護受害人。在其女友報警的同時,有一名熱心的民眾稱已經找鐵道警察維護,但自始至終鐵道警察都未出現。參與圍毆的計程車司機五人還不斷嗆聲的說叫警察來沒關係啊。然而卻在警察來的一刻參與圍毆的計程車司機一哄而散,莊敏泰留在現場繼續嗆聲。


東門派出所的警察來後受害人與莊敏泰一併前往警察局,負責此案員警不斷勸說受害人和解,受害人提出以五萬元賠償醫藥費、眼鏡損壞、機車損傷與精神賠償。莊敏泰只回覆願意包個紅包三千元意思意思。經警察調閱記錄後發現,莊敏泰已有多項肇事前科,數量高達十幾件。此人態度傲慢且滋眾造事,若繼續擔任計程車司機恐怕有損市民安危。然偵辦警員卻企圖息事寧人,偵辦此案從頭便多次勸說和解,甚至當受害人至南門醫院就診時,還前往勸說,以「此案上法院也沒用,不如就當場和解,否則有可能會拿不到賠償」為由,一再要受害人盡快結案,並表示當天下午一點市區將舉辦遊行,他的時間很趕。受害人後請交大教官前來協助處理此事,目前已提出傷害告訴,要求上法院偵辦此案。

莊敏泰等人行徑囂張、目無王法,不但在新竹火車站佔地為王,當天化日之下還於新竹火車站糾眾圍毆,偵辦警察還企圖息事寧人,簡直罔顧小市民人權。

<公理何在?>
此信件在訴求的公理為下列三項,請大眾評斷是非。
1. 莊敏泰已有多項前科,為何得以擔任屬於服務業的計程車司機?大眾安全何在?主管機關是否篩選過於草率?


2. 在新竹火車站發生計程車司機群起滋事已非單一事件,偵辦警員也口口聲聲向被害人說:「這種事已經不是第一次了,我們也沒辦法,你就自認倒楣吧!」。既然事情已經不是第一次,為何治安單位還任其囂張?治安單位是否管理草率?難道有人被害時只能自認倒楣?還有鐵道警察到底在做什麼?

3. 警員偵辦態度明知誰對誰錯,卻意圖草率了事,被害人被警員告知:「這種事屬於個人糾紛,並不是治安敗壞的問題,你不能都把這件事怪在警察辦事不力啊!」。一個學生在公共場合被計程車司機圍毆竟不是治安的問題?身為人民褓姆的警察公信力何在?這是警察應有的辦案態度嗎?

<自身安全>
新竹市獲「全國最幸福城市」,小市民卻受委屈無處申冤,只好自助救濟,請大家呼籲親友們來新竹火車站時不要搭乘站前的計程車,受騙事小、危急身家安全事大。希望藉由大眾不要搭乘的具體行動來癱瘓新竹火車站前的惡劣計程車,並促使新竹市建立起優良計程車司機篩選系統。

新竹火車站前的計程車惡名昭彰絕非偶然,網路上有參考資料:
http://www.imayday.com/board/see.php?oneid=-1523192
http://tw.knowledge.yahoo.com/question/question?qid=1105061409009

如果您來新竹火車站欲搭乘計程車怎麼辦?
選擇合法車行叫車,行車有紀錄有保障,受委屈時有紀錄可循。僅供參考的新竹市政府網站上的參考資料
http://dep-traffic.hccg.gov.tw/ch/1684/SG/21324/T1684.html
再次呼籲,希望藉由大眾不要搭乘的具體行動來癱瘓新竹火車站前的惡劣計程車,唯有直接斷絕生意源頭才能斷絕不法!!

Friday, October 24, 2008

C語言測試:想成為嵌入式程序員應知道的 0×10 個基本問題


C語言測試:想成為嵌入式程序員應知道的 0×10 個基本問題

1# 用預處理指令 #define 聲明一個常數,用以表明 1 年中有多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL /* gcc 中會語法錯? (60 * 60 * 24 * 365UL)?! */

我在這想看到幾件事情:
*#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
*懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
*意識到這個表達式將使一個 16 位機的整型數溢出,因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
*如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要。

2# 寫一個「標準」宏 MIN ,這個宏輸入兩個參數並返回較小的一個

#define MIN(A, B) ((A) <= (B) ? (A) : (B))

這個測試是為下面的目的而設的:
*標識 #define 在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準 C 的一部分,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。
*三重條件操作符的知識。這個操作符存在 C 語言中的原因是它使得編譯器能產生比 if-then-else 更優化的代碼,瞭解這個用法是很重要的。
*懂得在宏中小心地把參數用括號括起來
*我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什麼事?

least = MIN(*p++, b);

3# 預處理器標識 #error 的目的是什麼?

如果你不知道答案,請看參考文獻1。這問題對區分一個正常的夥計和一個書獃子是很有用的。只有書獃子才會讀 C 語言課本的附錄去找出像這種問題的答案。當然如果你不是在找一個書獃子,那麼應試者最好希望自己不要知道答案。

4# 嵌入式系統中經常要用到無限循環,你怎麼樣用 C 編寫死循環呢?

這個問題用幾個解決方案。我首選的方案是:

while(1)
{
}

一些程序員更喜歡如下方案:

for(;;)
{
}

這個實現方式讓我為難,因為這個語法沒有確切表達到底怎麼回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:「我被教著這樣做,但從沒有想到過為什麼。」這會給我留下一個壞印象。
第三個方案是用 goto

Loop:

goto Loop;

應試者如給出上面的方案,這說明或者他是一個彙編語言程序員(這也許是好事)或者他是一個想進入新領域的 BASIC/FORTRAN 程序員。

5# 用變量 a 給出下面的定義

a)一個整型數(An integer)
b)一個指向整型數的指針(A pointer to an integer)
c)一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer to an integer)
d)一個有10個整型數的數組(An array of 10 integers)
e)一個有10個指針的數組,該指針是指向一個整型數的(An array of 10 pointers to integers)
f)一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)
g)一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)
h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數(An array of ten pointers to functions that take an integer argument and return an integer)

答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

人們經常聲稱這裡有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間裡,我確定我知道這個問題的答案。應試者如果不知道所有的答案(或至少大部分答案),那麼也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那麼他又能為什麼出準備呢?

6# 關鍵字 static 的作用是什麼?

這個簡單的問題很少有人能回答完全。在 C 語言中,關鍵字 static 有三個明顯的作用:
在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼範圍的好處和重要性。

7# 關鍵字 const 有什麼含意?

我只要一聽到被面試者說:「const意味著常數」,我就知道我正在和一個業餘者打交道。去年 Dan Saks 已經在他的文章裡完全概括了 const 的所有用法,因此 ESP (譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉 const 能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出 const 意味著「只讀」就可以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)
如果應試者能正確回答這個問題,我將問他一個附加的問題:
下面的聲明都是什麼意思?

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前兩個的作用是一樣,a 是一個常整型數。第三個意味著 a 是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思 a 是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味著 a 是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那麼我為什麼還要如此看重關鍵字 const 呢?我也如下的幾下理由:
*關鍵字 const 的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(當然,懂得用 const 的程序員很少會留下的垃圾讓別人來清理的。)
*通過給優化器一些附加的信息,使用關鍵字 const 也許能產生更緊湊的代碼。
*合理地使用關鍵字 const 可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少 bug 的出現。

8# 關鍵字 volatile 有什麼含意?並給出三個不同的例子。

一個定義為 volatile 的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裡的備份。下面是 volatile 變量的幾個例子:
*並行設備的硬件寄存器(如:狀態寄存器)
*一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
*多線程應用中被幾個任務共享的變量

回答不出這個問題的人是不會被僱傭的。我認為這是區分 C 程序員和嵌入式系統程序員的最基本的問題。搞嵌入式的傢伙們經常同硬件、中斷、RTOS 等等打交道,所有這些都要求用到 volatile 變量。不懂得 volatile 的內容將會帶來災難。
假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得 volatile 完全的重要性。
*一個參數既可以是 const 還可以是 volatile 嗎?解釋為什麼。
*一個指針可以是 volatile 嗎?解釋為什麼。
*下面的函數有什麼錯誤:

int square(volatile int *ptr)
{
    return *ptr * *ptr;
}

下面是答案:
*是的。一個例子是只讀的狀態寄存器。它是 volatile 因為它可能被意想不到地改變。它是 const 因為程序不應該試圖去修改它。
*是的。儘管這並不很常見。一個例子是當一個中服務子程序修改一個指向一個 buffer 的指針時。
*這段代碼有點變態。這段代碼的目的是用來返指針 *ptr 指向值的平方,但是,由於 *ptr 指向一個 volatile 型參數,編譯器將產生類似下面的代碼:

int square(volatile int *ptr)
{
    int a, b;
    a = *ptr;
    b = *ptr;
    return a * b;
}

由於 *ptr 的值可能被意想不到地該變,因此 a 和 b 可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

long square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}

9# 嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量 a,寫兩段代碼,第一個設置 a 的 bit 3,第二個清除 a 的 bit 3。在以上兩個操作中,要保持其它位不變。

對這個問題有三種基本的反應
*不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。
*用 bit fields。Bit fields 是被扔到 C 語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon 為其較複雜的通信芯片寫的驅動程序,它用到了 bit fields 因此完全對我無用,因為我的編譯器用其它的方式來實現 bit fields 的。從道德講:永遠不要讓一個非嵌入式的傢伙粘實際硬件的邊。
*用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:

#define BIT3 (0×1 << 3)
static int a;

void set_bit3(void) {
    a |= BIT3;
}

void clear_bit3(void) {
    a &= ~BIT3;
}

一些人喜歡為設置和清除值而定義一個掩碼同時定義一些說明常數,這也是可以接受的。我希望看到幾個要點:說明常數、|= 和 &=~ 操作。

10# 嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址為 0×67a9 的整型變量的值為 0xaa66。編譯器是一個純粹的 ANSI 編譯器。寫代碼去完成這一任務。

這一問題測試你是否知道為了訪問一絕對地址把一個整型數強制轉換(typecast)為一指針是合法的。這一問題的實現方式隨著個人風格不同而不同。典型的類似代碼如下:

int *ptr;
ptr = (int *)0×67a9;
*ptr = 0xaa55;

A more obscure approach is:
一個較晦澀的方法是:

*(int * const)(0×67a9) = 0xaa55;

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。

11# 中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展 — 讓標準 C 支持中斷。具代表事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了 __interrupt 關鍵字去定義了一個中斷服務子程序(ISR),請評論一下這段代碼的。

__interrupt double compute_area (double radius)
{
    double area = PI * radius * radius;
    printf("\nArea = %f", area);
    return area;
}

這個函數有太多的錯誤了,以至讓人不知從何說起了:
*ISR 不能返回一個值。如果你不懂這個,那麼你不會被僱用的。
*ISR 不能傳遞參數。如果你沒有看到這一點,你被僱用的機會等同第一項。
*在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額外的寄存器入棧,有些處理器/編譯器就是不允許在 ISR 中做浮點運算。此外,ISR 應該是短而有效率的,在 ISR 中做浮點運算是不明智的。
*與第三點一脈相承,printf()經常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到後兩點,那麼你的被僱用前景越來越光明了。

12# 下面的代碼輸出是什麼,為什麼?

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a + b > 6) ? puts("> 6") : puts("<= 6");
}

這個問題測試你是否懂得C語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 ">6"。原因是當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。因此 -20 變成了一個非常大的正整數,所以該表達式計算出的結果大於 6。這一點對於應當頻繁用到無符號數據類型的嵌入式系統來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。

13# 評價下面的代碼片斷:

unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/* 1's complement of zero */

對於一個 int 型不是 16 位的處理器為說,上面的代碼是不正確的。應編寫如下:

unsigned int compzero = ~0;

這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗裡,好的嵌入式程序員非常準確地明白硬件的細節和它的局限,然而 PC 機程序往往把硬件作為一個無法避免的煩惱。
到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應試者不是很好,那麼這個測試就在這裡結束了。但如果顯然應試者做得不錯,那麼我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希望更多看到應試者應付問題的方法,而不是答案。不管如何,你就當是這個娛樂吧…

14# 儘管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆(heap)中動態分配內存的過程的。那麼嵌入式系統中,動態分配內存可能發生的問題是什麼?

這裡,我期望應試者能提到內存碎片,碎片收集的問題,變量的持行時間等等。這個主題已經在 ESP 雜誌中被廣泛地討論過了(主要是 P.J. Plauger, 他的解釋遠遠超過我這裡能提到的任何解釋),所有回過頭看一下這些雜誌吧!讓應試者進入一種虛假的安全感覺後,我拿出這麼一個小節目:
下面的代碼片段的輸出是什麼,為什麼?

char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
    puts("Got a null pointer");
else
    puts("Got a valid pointer");

這是一個有趣的問題。最近在我的一個同事不經意把 0 值傳給了函數 malloc,得到了一個合法的指針之後,我才想到這個問題。這就是上面的代碼,該代碼的輸出是 "Got a valid pointer"。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。

15# Typedef 在 C 語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:

#define dPS struct s *
typedef struct s * tPS;

以上兩種情況的意圖都是要定義 dPS 和 tPS 作為一個指向結構 s 指針。哪種方法更好呢?(如果有的話)為什麼?

這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef 更好。思考下面的例子:

dPS p1, p2;
tPS p3, p4;

第一個擴展為

struct s * p1, p2;

上面的代碼定義 p1 為一個指向結構的指,p2 為一個實際的結構,這也許不是你想要的。第二個例子正確地定義了 p3 和 p4 兩個指針。

16# C 語言同意一些令人震驚的結構,下面的結構是合法的嗎?如果是它做些什麼?

int a = 5, b = 7, c;
c = a+++b;

這個問題將做為這個測驗的一個愉快的結尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的代碼被處理成:

c = a++ + b;

因此,這段代碼持行後 a = 6, b = 7, c = 12。
如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當作問題。我發現這個問題的最大好處是這是一個關於代碼編寫風格,代碼的可讀性,代碼的可修改性的好的話題。
好了,夥計們,你現在已經做完所有的測試了。這就是我出的C語言測試題,我懷著愉快的心情寫完它,希望你以同樣的心情讀完它。如果是認為這是一個好的測試,那麼盡量都用到你的找工作的過程中去吧。天知道也許過個一兩年,我就不做現在的工作,也需要找一個。

Tuesday, June 24, 2008

識貨的法拉利


上次去花蓮三天兩夜遊,第一天晚上住的是花蓮馥麗生活旅店 http://www.quality-inn.com.tw/,第二天晚上是某民宿;法拉利一進民宿的房間當場就說,我要昨天的。

上次去賞車,銷售專員很客氣的讓我們上車試乘,於是兩個小朋友就在後座這裡看看,那裡摸摸;回家坐回我的 Mazda Isamu,法拉利又說剛才的車子比較好。

客廳的除濕機連續工作了幾年之後,在運轉時會發出噪音,應該是快不行了,上週去大潤發,順便看看除濕機,法拉利馬上就指著一台除濕機說:這台比較好。看看價錢,果然是最貴的。

真是識貨的法拉利!

Monday, June 23, 2008

蜂窩組織炎


今天早上去 新竹馬偕看同事介紹的外科名醫張健仁醫師,果然是和藹可親呀,我訴說前幾年蜂窩組織炎的地方一直覺得裡面還有異物,他就幫我照超音波看看到底病灶在哪裡,好決定要如何根治它,可惜超音波照了好久都找不到。
最後他有說,以前有發炎過的組織,好了以後一定感覺會有些不一樣,如果真的要看的話,只能等真的發炎了才能定位解決,所以我暫時可以放心啦!

Wednesday, May 07, 2008

撿葉子


香奈兒對於葉子很執著,喜歡撿葉子

科技 = Technolog?


這是今年一月 25 日上班等紅燈時拍的。
有趣的是,在新竹科學園區內,路標的英文還會拼錯!

Thursday, April 24, 2008

愛哭包


俗話說:三歲狗都嫌。指的是三歲的小孩已經有點懂事了,聽的懂人話,可是卻又沒辦法守規矩。
記得以前香奈兒三歲的時候,那真的是深深地體會了這句話;她可以跟你玩的很開心,可是要照著她認定的規矩玩才行。
可是現在法拉利三歲了,卻只有感受到:他真愛哭!
今天早上 6:30,他睡到一半,突然醒過來,就哭著要找媽媽,找不到就站在樓梯哭;把他抱回床上繼續陪我瞇到七點多,換衣服,準備要把他送到婆婆家,我在廚房洗奶瓶、裝水壺時,他就在玩廚房找到的球,只見他雙手持著往上一拋,球碰到天花板掉下來,我怕他不小心砸到蘭花,跟他說:
「利利,你這樣會砸到蘭花喔!那蘭花他就會很痛∼∼∼」
這時,只見他嘴巴一扁,又要開始哭了!我不管他,繼續忙我自己的事,他就一直哭到要出門………
這個愛哭的毛病,不知道什麼時候才會變好?

Wednesday, April 23, 2008

對妳的關愛特別多


想到香奈兒長大後,就不能像現在這樣與她那麼親暱
就忍不住 關愛特別多

Friday, March 21, 2008

酷音輸入法

酷音輸入法是 Windows 底下一個好用而且免費的輸入法,我已經用了好幾個月了。

不過有一件事情一直困擾著我的使用,那就是在選字時總是會出現莫名其妙的方框框。

這次花時間把酷音輸入法的 source code 全抓下來後才發現,原來輸入法的 source code 並不包含詞庫,詞庫是單獨放在 libchewingdata 這個開源計畫中。於是又把 libchewingdata 的 SVN 全抓下來,發現有分 Big5 及 UTF-8 兩個目錄,而 UTF-8 目錄中的字與音的對應,有許多是有音但是字看不到,起初懷疑是 UltraEdit 的問題,後來用 Windows 中的 Notepad 來開啟,也是看不到,推測這就是選字時跑出一堆方框框的原因。

於是把 Big5 目錄下的資料轉成 Unicode 放到 UTF-8 下,再用程式轉換一遍,得到這五個 .dat 檔︰

下載這五個檔案,覆蓋原來放在 C:\Windows\system32\IME\Chewing 底下的那五個,再用工作管理員把 ChewingServer.exe 砍掉,再執行同一目錄下的 ChewingServer.exe

Boom~~那些方框框不會再出現了