2011年12月30日 星期五

[Thoughts] 一個廣告人的領悟 - Rory Sutherland


這部影片是一位從事藝術設計的好朋友推薦的,是廣告大師 Rory Sutherland 在 TED 的處女秀,

有趣的是 Rory Sutherland 說他之前都是去 TED Evil 的地盤發表演說,這次是第一次到 TED 的場子來,
(其實我覺得 TED Evil 這個 TED 的秘密姐妹組織根本是 Rory 捏造的,純粹是他的幽默喇賽 = =)

TED 是一個很有名的演講發佈網站,常常邀請各個領域的成功人士來發表演說,
(TED - Technology、Entertainment、Design)

影片的內容大綱主要著重於"如何對有形的商品賦與無形的價值"

Rory 為此理論提出了很多的例證,當然都是一些成功或是非常成功的例子(笑~),

例如他提到了德國人改以馬鈴薯為主食的經過,土耳其快速現代化的過程,

還有 Placebo (安慰劑) 的強大效果,大多數的人應該不太了解 Placebo 是啥,就台灣人的觀點來看,

Placebo 可以想成是小時候喝的符水、香灰那種東西,求個心安用的,實際上沒有任何效用XD

其中令我印象最深刻的是加拿大 Shreddies 麥片廣告的故事,不同於一般市售有著自然不規則形狀的麥片,

Shreddies 麥片有著獨特正方形的外觀,很巧妙的讓消費者認為方形的麥片就是 Shreddies,這是一種刻板印象技巧的運用,

但是這個故事的妙點不在於此,有一位負責廣告業務的菜鳥要為 Shreddies 麥片打造新廣告,

這位菜鳥的點子就是打破使用者認為"Shreddies 麥片就是正方形"的這種觀念,於是他將 Shreddies 麥片變為菱形的!

(如下圖,左邊是原造型,右邊是新造型)
(我還真的去Google了一下,媽呀~這廣告是千真萬確的!)

想到這點子的傢伙真得是天才到不行,連 Rory 都非常折服,看到這廣告連我都想試吃比較看看了,

Shreddies 廠商還特意邀請民眾來現場試吃,比較兩種不同形狀(?)麥片的口感味道,

還真的有試吃者老實的說出菱形的麥片比較好吃這種鬼話......  我只能說,這廣告真得成功了,

片尾 Rory 對自己的演說做了哲學般的重點整理:

要向前,就要創造更多的無形價值,需要花更多的時間欣賞既有存在的,減少時間在焦慮我們還能做什麼。

最後以兩句話做了一個總結與勉勵,
Poetry is when you make new things familiar and familiar things new.
美好來自知新如故
We are perishing for what  of wonder, not for what of wonders.
我們因缺乏好奇而毀滅,而非因缺乏奇蹟而毀滅
看完之後不禁大嘆:阿~原來這就是廣告的浪漫!

我想這就是廣告人獨特的思維,改變我們對事物的看法就和改變事物本身一樣帶來滿足,

就像小弟公司的有形產品"電子書",也被附加了"環保"這項無形價值(救救北極熊吧~),

而這個理論的實現也印證在今年發生的一個大事件上,

那就是蘋果執行長賈伯斯的過世,如果隨便問一個路人覺得今年最大的新聞是什麼?

我想應該不少人會回答賈伯斯過世(連樂高迷都出來參一腳了),


為何一年有那麼多的知名人物過往,卻只有賈伯斯得到眾人的注視,這當然與他的一手建立的蘋果王國有關,

拿出同樣等級的手機與 iPhone 相比較,iPhone 的硬體規格硬是輸了一截,但為啥蘋果產品總是讓世人趨之若鶩,

雖然賈伯斯的行事風格應該是叫人不敢領教,但蘋果的產品確實是走在時代的尖端,

當然這其中也融入產品之外的無形附加價值,也就是賈伯斯的堅持(這啥!能吃嗎?),

賈伯斯的回歸讓蘋果得以重返榮耀,他的堅持創造出了許多嶄新的產品,這才是設計研發的精神所在,

而非別人做什麼,我們跟著做什麼(平板電腦好像很賺,我們也一起來做吧~),

如果不能在既有戰局上,開拓新的戰場,運用新的戰術,那永遠只能當失敗的一方,

當一家公司的權力核心被業務部門所把持時,這家公司注定要開始走下坡,為了拼業績拼出貨量,

他們只會不斷催促其他部門做出一個功能正常的東西就好,而非真正想要做出一個好的產品,更遑論無形的附加價值。

人生也是如此,雖然人生無形的,但是我們同樣能對無形的事物賦與無形的價值,

重點就在於你怎麼想,如何改變你對人生的看法(人生觀),就如同 Rory 的總結一般,

若想要獲得這段人生賦與你的無形價值,你就必須把每一天都當成嶄新的一天,細細去玩味品嘗它(知新如故),

對每一件事情都保持樂觀積極的心,大膽勇敢挑戰新事物(好奇心),那也許你便會慢慢體會這段人生的價值所在。

P.S.很感謝好友讓我看到這段好影片,就算他不跟我要感想文,我一定也會有感而發的寫一篇。
(說好的心得報告!不可以拖過年阿~哈)

2011年12月26日 星期一

Merry Christmas 2011

今年的聖誕節過去了,時間雖然也只是一如往常的周休二日罷了,

但是似乎是過得有比較慢一些,也許這兩天的事情也多了那麼一些吧!

打從周五中午與同事的交換禮物派對開始,有歡樂的打嘴砲,也有溫馨的一年回顧與感言,

下午參加公司辦的耶誕同歡活動,大伙們一起舉起天羅地網搶著接天下掉下來的禮物,充滿歡笑~

接著周六參加了研究所好友的婚禮,感受著現場的氣氛,感覺棒極了,帥亮真有你的!

然後回到交大跟朋友們頂著寒風散步聊天,時間彷彿又回到研究所的時光了,哈~

經過活動滿滿的兩天,結果周日整個放空下來,當了一整天的阿宅,

好像有那麼一點虎頭蛇尾,也許我真得該衝回彰化去參加國中朋友的婚禮,見見久違的好友們,

可惜我還真得忘了這件事情,當我想起時,我已經在facebook上看到熱騰騰的照片出爐了,

人生何嘗不是這樣,機會總是不經意的出現在你的眼前,但自己卻忘了去正視它、把握它,接著留下的就是無限的惋惜,

如果想要為自己的人生多留下一些回憶,而不是更多的惋惜,就請好好把握當下,珍惜眼前的每個機會。

- 這個夜晚聽著玉置浩二溫柔而又滄桑的歌聲,莫名有種想把一切道盡的感覺,但愛睏了,就睡吧:)

2011年12月22日 星期四

耶誕交換禮物派對 感言 @2011

回顧過往的一年,也是我出社會工作後的第一年,

學習到了許多新技術,更認識到眾多的新朋友好夥伴,有你們真好~

但工作上難免遇到一些不順心、不如意,偶爾也會迷失了方向,

如果只想要感覺安全無虞,那就去做本來就會做的事,

但若想要真正成長,那就要挑戰能力的極限,也就是暫時地失去安全感…

所以,當你不能確定你自己在做什麼時,起碼要知道,你正在成長。

所以我送給大家一隻帥氣的囧熊撲滿(真的帥到發亮阿!),

每當你(妳)遭遇到難關,覺得有點囧、有點無力時,就往撲滿裡丟一個硬幣,

告訴自己:
這件麻煩事,就跟這枚硬幣一樣,解決掉它,就好比是把它存入自己人生的撲滿中,增長了自己的實力,也累積了自己的財富。
除此之外,還可以幫助你(妳)養成儲蓄的美德喔!

[ 活動後記 ]
這位是剛進公司的可愛正妹,抽到了我的囧熊撲滿~讚啦!

而我抽到了美麗大姐姐提供的旅行箱掛牌(暗示我該出國了嗎? XD)

2011年12月20日 星期二

突然好想妳

突然好想妳  五月天

詞、曲:阿信 (五月天)

最怕空氣突然安靜 最怕朋友突然的關心
最怕回憶 突然翻滾絞痛著 不平息
最怕突然 聽到你的消息
想念如果會有聲音 不願那是悲傷的哭泣
事到如今 終於讓自己屬於 我自己
只剩眼淚 還騙不過自己

突然好想妳 你會在哪裡 過得快樂或委屈
突然好想妳 突然鋒利的回憶 突然模糊的眼睛

我們像一首最美麗的歌曲 變成兩部悲傷的電影
為什麼妳 陪我走過最難忘的旅行
然後留下 最痛的紀念品

我們 那麼甜那麼美那麼相信 那麼瘋那麼熱烈的曾經
為何我們還是要奔向各自的幸福和遺憾中老去

突然好想妳 你會在哪裡 過得快樂或委屈
突然好想妳 突然鋒利的回憶 突然模糊的眼睛

最怕空氣突然安靜 最怕朋友突然的關心
最怕回憶 突然翻滾絞痛著 不平息
最怕突然 聽到你的消息
最怕此生 已經決心自己過 沒有妳 卻又突然 聽到妳的消息


2011年12月12日 星期一

那些年,我們一起追的女孩 (You are the apple of my eye)


這天晚上真是個讓我欲哭無淚的夜晚,一整個不順到了極點了阿~

回到新竹的周日夜晚,毛獸世界點數耗盡了,我便散步到宿舍附近的小七補充點數,

順便處理一下遲遲未繳的電費,再買杯拿鐵準備好好享受一下,

回到宿舍後,馬上打開電腦,直搗毛獸世界的儲值網站,就在按下一個接著一個腦殘般的"下一步"按鈕下,

天殺的!我居然發生了我一直以為不可能發生在我身上的悲劇 ─ 我把點數儲到錯誤的帳號去了,damn!!!

有道是前人種樹、後人乘涼,我馬上咕狗了一下,看看是否有前人留下的典範可以解決這他媽的問題,

就在鄉民的悲慘案例說明下,我回報了官方,獲得的回覆竟是需要三到七個工作天來進行資料移轉,

哇靠!這是哪國的好效率阿,唉~只能大嘆倒楣,但往好方面想,至少還有得救XD

熊熊然想到我還有一部賣座的好片子,剛好可以趁這個哀傷的夜晚好好欣賞一番,

乾!我知道你在想啥,這片子絕對不是你想像中的那種影片,好嗎!

這是一部相當正派的好影片,是由好同事所提供的"那些年,我們一起追的女孩"

(這次不是好室友提供了,科科,不過等等好室友當然會再登場-.-),

我知道這片主要描述高中時期那段純純的愛情,再加上之前新聞又炒很大,還入圍了金馬獎,

於是乎,我馬上找到了這傳說中的好片子,"喀! 喀!"兩下點開了它,但是我說過 ─ 今晚是個欲哭無淚的夜晚,

所以事情當然不會這麼順利,馬的,我播個3分鐘影片就自己一直跳一直跳,不知道是在跳轉個屁,

於是我只好向好室友求救,好室友閱片無數(啥片?不能說的秘密 呵~),我想他必定有解決之道,

果然,好室友輕輕鬆鬆就解決了這個問題,謎片看得多就是不一樣(阿!是涉獵甚廣才對XD),厲害厲害,

終於,我可以順利的觀看這部好片了 ─

電影的主要場景是在彰化(我的故鄉ㄟ,真巧),這部電影的導演九把刀跟我是同鄉,

而這部影片本身也就是九把刀個人的傳記式電影,描述高中年代時,發生的那一段青澀而又純真的愛戀,

片中男主角柯景騰(柯震東飾演),不愛唸書老是愛鬼混,腦子裡充滿幻想,

奉李小龍為師,為了正義的理想鍛鍊自己,像極了青春年少的男孩們,

片中女主角沈佳儀(陳妍希飾演),外表秀氣、笑容甜美,而且還有酒窩呢!

一路走來成績頂呱呱,尊敬師長,是長輩眼中標準的好學生、好孩子,

這樣的一個角色,很明顯的就是這些男孩們眼中的那顆蘋果,

我敢打包票,假如當年我班上要是有這麼一個女孩,我一定也跟這群男孩們一樣,被她深深的吸引住。

電影的內容想真實的呈現在七十年代出生的孩子們,在無憂無慮的求學過程中,

偷偷的喜歡自己班上的女同學,喜歡故意逗弄她、耍帥討她開心,

抑或者是在遠處偷偷的望著他,總因為他的一颦一笑,讓自己醉心不已,

又或者會因為自以為的不小心四目相對,而內心躍動不止、小鹿亂撞,真讓人不禁嘴角上揚,

我想這些畫面,讓出生於同一年代的我們,好似從中看到了自己的影子,

片中有幾段話讓我相當有感覺,例如,
成長,最殘酷的部份就是,女孩子永遠比同年齡的男孩子成熟。
女孩的成熟,沒有一個男孩招架得住。
這段話,就算已經到現在這把年紀了,我依然覺得沒錯,男人的內心永遠有塊地方是留給這位大男孩的。

還有一段話,
原來,當你真的非常非常喜歡一個女孩,當她有人疼有人愛,
你會真心真意祝福她,永遠幸福快樂。
天阿!這段話真得是讓我震撼了,久久不能自己,就像是從我內心呼喊出來的一樣,在心中產生的莫大的共鳴,Perfect !!!

回想起小時候,老爸、老媽,長輩們總是會說:讀書的時候是最快樂、最輕鬆的了,要好好珍惜把握。

那時我總是會暗自嘀咕:成天就是考試、念書,這樣的生活哪裡快樂輕鬆了。

殊不知老爸、老媽所說的其實是除了讀書、考試之外的其他事情,

現在回想起來,那樣的歲月著實令人回味無窮,過來人說的話總是有他的一番道理,

很感謝九把刀能夠將屬於我們的青春歲月,描述得這樣真實而又深刻(上課打手槍是有比較誇張一點),

而男主角柯震東的表現也是值得肯定,身為一個素人演員,光是在戲中一絲不掛趴趴造,

這就需要多大的勇氣阿,雖然滿多人說他不夠格拿金馬獎最佳新人,但是就我來看,

他所要詮釋的是屬於青春男孩的氣質,是年少輕狂的,是最貼近我們生活的,

不同於另外三位對手一致的剛猛、好勇善戰的原住民風格,光從這點來說,他在評審眼中,就已經是獨樹一格。

總結來說,這是一部很棒的電影,很值得生活在台灣的我們去欣賞去感受,

透過片中描繪的人物、事件、時代、場景,還有那些年少輕狂的歲月,

進而從中發現自己的身影,我想那一定可以讓你莞爾一笑。

所以,今晚也還算是一個愉快的夜晚啦!哈~

2011年12月7日 星期三

喜歡寂寞

喜歡寂寞  蘇打綠

詞、曲:吳青峰

揚起了灰塵  回憶裡一場夢
那照片裡的人  瞳孔曾住著我
闔上了過往  夢境活成河流
已滋潤了身旁  真實中的脈搏

生命來到窗前  不吭一聲  拎走了我們
誰為情所困  誰為愛犧牲  誰比誰深刻

當時奮不顧身伸出我的手
看見了輪廓就當作宇宙
甜美的習慣變成生活  才瞭解了什麼

如今故事發展成就一個我
學會了生活能享受寂寞
劇烈的語言變成溫柔  又帶來了什麼
若是不曾走過  怎麼懂

翻飛了往事  有時灼傷眼眸
那傷人的台詞  現在聽來輕鬆
平息了心思  有時一笑而過
我此刻的樣子  見風仍然是風

生命吹過面前  不吭一聲  劃成了掌紋
揮霍了緣分  看透了景色  我懂得深刻

走過了多少,就會換得多少,過去的種種痛苦或喜悅,都會變成養分。無論是一個人的時候更自由,或是孤單的時候更渴望,當某些情感放下的時候,就是一笑而過的怡然自得。(文­/青峰)


2011年12月3日 星期六

第十三屆總統電視辯論 有感

原以為這禮拜六又是個陰雨綿綿的壞天氣,沒想到一早就被刺眼的陽光曬醒了,

(其實也不早了,都十點多了-.-),上了一下毛獸世界,打了一下新推出的隨機團隊,

發現...這東西真得是沒時間玩家的福音阿!!! 玻璃渣為了迎合普羅大眾真得是無所不用其極,

基本上,玩家只要知道一兩項必須注意的事情,不若以往複雜的階段轉換跟打法,

在裝備等級限制的條件下,應該都可以過得了關,我想對大多數的玩家來說是好事。

(廢話少說,還是談談主題-.-)

打完之後,跟友人聊到公視有舉辦電視辯論會,朋友正要去看(上班還能看電視,真爽),

想一想明年一月的選舉好像是我第三次投票選總統了,今天適逢休閒的週六下午~

不如也去看看這三位總統候選人究竟對台灣的未來有何高見,

一打開就看到馬先生正在發表高見,原來正好是在第一階段的申論,

之後是五位媒體人對三位候選人的提問,接著是三位候選人的交互提問答辯,

最後就是三位候選人的結論啦,看得過程中,我還一起搭配了鄉民們的回應,

鄉民們的回應真得是非常有趣,鄉民文化真得是台灣特有的一種次文化,

就我個人觀點而言,

小馬哥充分利用阿扁時代的八年遺毒為主軸與相關時事(柿子、大組頭)猛打小英,

小英姐則主攻小馬施政的承諾跳票(六三三)與質疑兩岸的九二共識是否存在為主,

宋神掌反而跳脫於兩人互相攻守之外,訴說著自己的四年施政方針與作法,

三人相較之下,這次神掌的確是比較有總統候選人發言應有的氣度與態度,

相反的,小馬哥跟小英姐這次可真是打得火熱,你來我往誰也不相讓,

反倒讓人覺得有點淪為口水戰,這應該不是總統候選人應有的格局吧,

很多議題都是媒體炒作出來的,其實候選人們並不必與其起舞,

在辯論會中談論這些點,其實並不合適,而且並非人民所望,

小馬哥提出了一大堆的施政數據,但是民眾們真得聽得懂嗎?

小英不愧為空心菜,一直在談論台灣共識,但是台灣人民真的在乎嗎?

神掌的發言有條理且政策明確,但是他有可能跳脫兩黨政治的禁錮嗎?

在兩黨政治的大環境下,大多數的台灣選民們,選擇把自己的政治傾向做隱藏,

而且認定除了藍綠兩黨以外的其他候選人,都不可能會有當選機會,

越是高層級的選舉越是如此,再加上媒體的操弄,很多時候人民明明覺得誰才是心目中的最佳選擇,

卻因為認為最佳選擇並非最終結果,只好轉而選擇非藍即綠,這樣的民主似乎也顯得有些可憐,

台灣適不適合多黨政治?我不知道,我只覺得單就這次辯論而言,

神掌可以贏得市井小民的心,但贏得了台灣的民主嗎?

2011年11月30日 星期三

[VIM] encoding , fileencoding , and fileencodings


  • encoding
    • 為vim內部、緩衝區、選單等所使用的編碼,如果 enc 不另外設置(比方在 .vimrc )的話, 則與 locale (或者說是 $LANG ) 一致,又如果 $LANG 為空值,則預設值為 latin1 。
  • fileencoding
    • 文字檔的實際編碼方式,如果打開文字檔案時,比對 encoding 與 fencoding 的值 不一樣的話,則會呼叫 iconv() 將 fencoding 所指定的編碼轉換成 encoding 一樣的編碼。 如果儲存該文字檔案時,比對 encoding 與 fencoding 的值不一樣的話,則會呼叫 iconv() 將 encoding 所指定的編碼轉換成 fencoding 一樣的編碼,與上相反。要注意,如果你的 fencoding 是 utf8 而你的 encoding 是 big5 的話,你要打開檔案時 utf8 編碼要轉成 big5 的話,如果你的內容上面有中文、日文、法文等多國的語言,從 utf8 轉成 big5 ,根本是有問題的,所以資料會有遺失的問題。 還有一點就是, fencoding 有時候會有誤判的問題,該值不正確的話可以使用 :e ++enc=big5 這類方式傳入,讓vim 重讀該檔,讓 fenc 強制使用 big5 編碼。(註:e 是 edit 的意思, ++enc 不是 enc 而是 fenc )
  • fileencodings
    • 是編輯文字檔案時,依照先後順序猜測該檔案所使用的編碼列表,filecoding 會先使用 fileencodings 裡面所猜到的編碼當作該值,如果 fileencodings 裡面都猜不到,也就是 fileencoding 是空值,即是使用 encoding 的值當作該值。由上面可以知道,如果在 ~/.vimrc 設定 fileencoding 的值,但是 vim 不一定會取用該值,因為不管 fileencodings 或是 encoding 都會覆蓋 fileencoding 所定義的值。所以說在~/.vimrc 設定 fileencoding 是為了指定在vim下開啟一個新檔案時所決定的編碼。
以上參考自隨便忘記[ Vim 設定中的 encoding 和 fileencoding ]

2011年11月17日 星期四

GoAHead Web Server - introduction

  • GoAHead Web Server
    • ASP supported
    • embedded Javascript supported
    • extended API
    • standard CGI progress
    • form implementation (GoFrom) by CGI
    • few memory necessary: 60KB (no SSL), 500KB (with SSL)
    • multiple OS support: eCos, LINUX, LynxOS, QNX, VxWorks, WinCE, pSOS

  • 常用功能:
  • 以下檔案位置都於 goahead folder 之下展開
    • 自行建立並連結一個 CGI Form 的方法(以 OS-LINUX 為例)
    • find Definition @ form.c: websFormDefine(char_t *name, void (*fn)(webs_t wp, char_t *path, char_t *query))
      1. 於 LINUX/ 之下建立檔案 foo.c,實作 Form 處理函式:void fooForm(webs_t wp, chat_t *path, char_t *query)
      2. 於 LINUX/main.c 中建立程式連接,於 initWebs() 中加入:websFormDefine(T("form_name"), fooForm)
      3. fooForm 是定義的函式,form_name 是在使用 HTML Form 呼叫時使用的函式
        使用方式:

    • 自行建立並連結一個 CGI ASP API 的方法(以 OS-LINUX 為例)
    • find Definition @ asp.c: websAspDefine(char_t *name, int (*fn)(int ejid, webs_t wp, int argc, char_t **argv))
      1. 於 LINUX/ 之下建立檔案 foo.c,實作 ASP API 處理函式:int fooAspAPI(int eid, webs_t wp, int argc, char_t **argv)
      2. 於 LINUX/main.c 中建立程式連接,於 initWebs() 中加入:websAspDefine(T("api_name"), fooAspAPI)
      3. fooAspAPI 是定義的函式,api_name 是在使用 ASP 語法呼叫時使用的函式
        使用方式:

2011年11月15日 星期二

騎士出任務 ( Knight and Day )


結束了今天一日的辛勞(好像也還好 =.=),晚上只想找部好片子來欣賞欣賞,

因為個人既不愛恐怖也不喜歡驚悚片,自己一人的晚上只想找部輕鬆歡笑的喜劇片,

或是場景壯闊的神話史詩片,來當睡前的精神糧食,於是乎,又再度向好室友伸了手,

剛好發現室友的X槽中有這部一看就覺得是愛情喜劇的影片,

二話不說,抓抓之後馬上就上工囉 ~

該片中男女主角都是頂頂有名的咖,阿湯哥加上卡麥蓉狄亞的組合還滿妙的,

見識淺薄的小弟,的確是第一次看到這兩位的搭檔演出,

兩人的接觸從阿湯哥的慧眼識英雌展開,該片場景變幻之多令人印象深刻,

從在美國的飛機上墜機開始,轉眼間就來到熱帶的島嶼,

不一會又跑到了阿爾卑斯山跟奧地利,最後還參加了西班牙的奔牛節,

兩位主角真是有夠忙了,劇情中也有很有趣的對話:

(卡麥蓉在南方小島醒來,發現身上被換穿了比基尼,驚訝之餘質問阿湯哥原因!)
阿湯哥:我受過專業訓練,可以十秒內在黑暗中拆解一把搶並復原,所以閉上眼睛幫你換衣服也是很簡單的。

(阿湯哥在熱帶海灘邊醒來,發現下半身居然穿著短褲,便問卡麥蓉...)
卡麥蓉:我可以在黑暗中利用一隻板手加上一把螺絲起子,修復一台手動變速箱,所以閉上眼睛幫你換褲子根本不是問題。

(註:上面的對話,我只是憑印象打的,非常可能有錯誤或遺漏,不過大概就是這種意思啦)

這種類似的情節在劇中時常出現,總是讓我會心一笑,哈~

而我覺得最有趣的點就在於,整部電影就在男女主角前後接連不斷暈眩昏迷中開始並結束,

也相當符合作文中前後呼應的原則阿!

不免俗的這是部愛情喜劇阿!總該是要有個 Happy Ending ~

電影最後就在兩人一同的願望之旅中結束,不錯不錯,這的的確確是一部相當適合休閒欣賞的輕鬆小品。

2011年11月10日 星期四

玩具總動員 3 ( Toy Story 3 )


這天晚上,網路大斷線,只能大嘆無計可施,只好跟室友拿些影片來看,

之前就聽說過玩具總動員三很好看又賣座,於是乎,伸了容量高達8GB的影片後,

馬上到電腦前就位,準備仔細欣賞這箇中的奧妙,

由於我既沒看過第一部也沒看過第二部,

所以一開始其實有些擔心無法看懂劇情,沒想到這一切都是我多慮了,

打從一開場的劇情就相當有趣,讓我一度以為我看錯影片了,

但是片中角色又沒啥問題,我認識的少少幾個角色都有出現阿,

直到片頭結束,恍然大悟!原來那就是孩子想像力的部分!

我著實覺得這片的開場就相當棒,充分的說明了玩具的生命與其意義,

而我印象最深刻的是蛋頭先生變身玉米薄片先生那段,

我看到不禁狂笑,心理一直想著,老美也太好笑了吧!製作小組也太有想像力了吧,真得是讓我非常折服。

也沒想到玩具世界也是有壞人的,草莓味熊先生真得是有些糟糕阿,

但是他的遭遇卻也是絕大部分的玩具所會遇到的,說實在的,也不能都把錯推到他身上阿!

曾幾何時,我們自己的玩具也跟片中的玩具們一樣,靜靜的躺在牆角邊,

苦苦等不到自己主人出現,再回到那一起同樂的時光,說真的,有點淡淡的哀傷了。

這部片畢竟是給孩子們看的,當然還是得要有個 Happy Ending 才行,

玩具們最後雖然還是離開了主人,但是他們有了另一個新主人,並且一樣的愛護珍惜他們,不錯不錯~

這部片真得非常適合小孩子看,要告訴孩子們,我們身為玩具的主人,

應該要好好愛護珍惜自己所擁有的玩具,用完即丟,絕對不是一個良好的習慣!

玩具們伴隨著孩子成長,記憶中都有他們的影子,當你回頭去翻翻孩提時期的舊照片,

說不定這些玩具都陪著你一起入鏡了呢!

2011年10月16日 星期日

還是要幸福

還是要幸福 田馥甄

曲:張簡君偉
詞:徐世珍/司魚
編曲:盧家宏、JerryC

不確定就別親吻 感情很容易毀了一個人
一個人若不夠狠 愛淡了不離不棄多殘忍

妳留下來的味道 它一天一天總會消散掉
我甚至真心真意的祝福 永恆在妳的身上先發生

妳還是要幸福 妳千萬不要再因為別人哭
所有錯誤從我這裏落幕 別跟著我銘心刻骨

妳還是要幸福 我才能確定我想得很清楚
確定自己再也不會佔據 妳的篇幅
明天開始 這一切都結束

別了多年的依賴 我覺得放手可以很無礙
我甚至真心真意的祝福 永恆在妳的身上先發生

妳還是要幸福 妳千萬不要再因為別人哭
所有錯誤從我這裏落幕 別跟著我銘心刻骨

妳還是要幸福 我才能確定我想得很清楚
確定自己再也不會佔據 妳的篇幅
明天開始 這一切都結束

妳還是要幸福 妳千萬不要再因為別人哭
所有錯誤從我這裏落幕 別跟著我銘心刻骨

妳如果很幸福 臉龐的淚痕我就無需在乎
因為妳的悲喜已經有了容身之處 我也能有最純粹的孤獨

最孤獨的孤獨



曾經以為妳會是我今生的新娘,喜歡妳的笑容妳的甜,在枕上留下的香味伴我好眠,
那天 ─ 妳說,平淡如習慣一般,無法激起一絲漣漪,這不像妳想像中的愛情,
這天 ─ 我說,對不起,我沒辦法做得更好,決定放手讓妳追求嚮往的愛情,妳 ─ 還是要幸福。



2011年10月15日 星期六

為母則強 偉大的柯媽媽

這天下午本想好好為月底的多益考試好好準備一下,
急急忙忙買好午餐回到宿舍邊看電視邊吃飯,
一時間轉到東森新聞台,正好在播放台灣啟示錄,主題是:柯媽媽的故事。

這個名字不算陌生,我知道她是強制汽機車責任險推動的始祖,
但是我卻不知道這件事情的來由,透過這個節目的解說,
我才知道柯媽媽是那麼的偉大,她才是台灣社會需要的明燈,
本來一心只想復仇的她,透過跟孩子的夢中對話,她寫下了四十二本筆記,
轉變了她的心境,化小愛為大愛,喪子之痛更堅定了她立法的決心,
為了推動這個法案,他已經努力了二十二年,賣掉了三棟房子,
發起了多少次遊行抗議,直到現在還是這樣持續著,
她的努力讓我們台灣的用路人們,多了一層保障,
從1996年立法至今,保費調降了九次,但理賠金卻反而向上提升,
這一切都是柯媽媽的努力。

強制汽機車責任險是第一個由人民推動立法的法案,也是目前為止唯一一個,
其背後的血淚令人鼻酸,柯媽媽為了讓這法案順利推動,
經過了長達八年的抗戰,但在位者一聲令下,只要一個月就能讓議事槌順利敲下,
社會上有多少的不公不義,試問如果沒人像柯媽媽一樣堅持到底,
是不是就這樣不了了之了!

看著電視中的柯媽媽已年屆七十,但是她的氣色卻竟是那麼的好,
真令人驚嘆,為了自己的夢想而努力,竟讓她自己愈發健康,
這就是所謂的好人有好報吧!


東森新聞台 台灣啟示錄 - 柯媽媽 強制險立法的八年抗戰

柯媽媽 PART 1 肇事者怎敢如此大言不慚

柯媽媽 PART 2 母子夢中對話與東海師生支持

柯媽媽 PART 3 強制險立法的八年抗戰(上)

柯媽媽 PART 4 強制險立法的八年抗戰(下)

柯媽媽 PART 5 柯媽媽還在拚 媽媽為你活的22年

我只想說:柯媽媽,有您真好!

2011年10月7日 星期五

[Qt] How to load HTMLs to QWebView from resource

  • Example1:
    • In HTML file, some resource file is loaded from qt resource.

  • Example2:
    • Loading a HTML file from a resource file.

  • PS: It is not working by using - QWebView::setUrl(QUrl("qrc:/resource/path"))

2011年9月22日 星期四

Build qjson with Qt4 for ARM

Build qjson (JSON Library for Qt4) with Qt4 for ARM

1. download qjson source code from official website
    - http://gitorious.org/qjson

2. set cmake configure file to find a specific Qt4 source
    - extract file and enter the folder
    - edit CMakeList.txt and add the following sentence before FIND_PACKAGE( Qt4 REQUIRED )
set( DESIRED_QT_VERSION 4 )
set( QT_QMAKE_EXECUTABLE "/home/qt-everywhere-opensource-src-4.7.4-Embedded/bin/qmake" ) - set this by your environment
set( QT_QMAKE_LOCATION "/home/qt-everywhere-opensource-src-4.7.4-Embedded/bin" ) - set this by your environment
FIND_PACKAGE( Qt4 REQUIRED )
3. compile qjson source code
    - cmake -DCMAKE_INSTALL_PREFIX=path_to _install_qjson/
    - make
    - make install

2011年9月21日 星期三

Build SDK - qt-everywhere-opensource-src-4.7.4 for ARM


How to Build SDK - qt-everywhere-opensource-src-4.7.4 for ARM

Prepare working - Dependency Libraries

(download them from official website)
1. tslib - https://github.com/kergoth/tslib
2. openssl-1.0.0e - http://www.openssl.org/source/
3. libpng-1.2.46 - http://www.libpng.org/pub/png/libpng.html

compile them and put them to your cross compiler library directory.


Building Qt-4.7.4 SDK

1. download Qt libraries 4.7.4 for embedded Linux (202 MB) from http://qt.nokia.com/downloads
2. extract file and enter the folder
3. If you want to compile some plugin libraries together, please put them into qt library plugin folder.
    (Qt library plugin folder  "./qt-everywhere-opensource-src-4.7.4-Embedded/src/plugins")
4. setting configure - my setting parameters
./configure -prefix /usr -xplatform qws/linux-arm-g++ -embedded arm -developer-build -opensource -confirm-license -fast -qt-sql-sqlite -no-qt3support -no-phonon -no-phonon-backend -qt-freetype -system-libpng -no-libmng -qt-libjpeg -no-rpath -no-nis -no-cups -separate-debug-info -openssl -no-opengl -little-endian -nomake examples -nomake demos -accessibility -plugin-gfx-liunxfb -plugin-mouse-tslib -L/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/lib/ -I/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/include -L/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/usr/lib/ -I/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/usr/include -D QT_KEYPAD_NAVIGATION -verbose
5. make
6. make install ( Qt will be installed into prefix path that you set )

2011年9月6日 星期二

One Year Past ...

一年前,我從學校畢業了,結束了人生長達二十年的校園學習生涯,

身分由學生轉變為上班族,進入了新的環境,認識了新的人事物,開始了社會學習生涯,

一年後,我從社會大學學習到了什麼?獲取了一些新的知識技能,

但是自我的心境好似沒什麼改變,連自己的目標所在似乎還在摸索當中,

走一步算一步嗎?

來拚一場!值得嗎?

做自己想做的吧~如何?

2011年8月30日 星期二

The difference between char* and char[]

以下面的程式片段為例:
上面程式碼編譯執行結果會印出"string", 
但若把 method(2) 那行拿掉,只留 method(1) 那行,則編譯(g++)會有警告出現,
warning:address of local variable 'str' returned

揪竟~這兩種寫法差異為何?

在這個例子中:

[1]首先就宣告變數 str 來說,
method(1) 的變數 str 是配置在 local 區的記憶體中;
method(2) 的變數 str 也是配置在 local 區的記憶體中,但其指向的地方不是,而是在 constant pool (系統中放置常數資料的地方)。

[2]再者討論 return str; 的動作差異,
method(1) 會把陣列的記憶體位置回傳,回傳一個指向 local 區的記憶體位置,這是有風險的,因為當副程式 getStr() 完成後,其中所使用的變數 str 記憶體空間會被釋放,之後利用它的運算可能會出錯,所以編譯器會以警告告知你;
method(2) 則是回傳指標值,也就是 "string" 的所在記憶體位置,而這個值是指向非 local 區,所以是安全的動作。

說明
“xxxxxx” 常數 (literal constant string) 都是放在系統的 constant pool 中,而且通常 compiler 會將 constant pool 設為 read only。
char *ptr = “xxxxxx”; 是讓 ptr 指向 constant pool 裡第一個 ‘x’ 的位置。
char str[] = “xxxxxx”; 是在 stack 中開 7 個 bytes 的空間, 並將 ‘x’ ‘x’ ‘x’ ‘x’ ‘x’ ‘x’ + ‘\0’ 七個字元從 constant pool 中複製 (load) 過來。

2011年8月23日 星期二

好文轉錄 - C語言新手十誡

作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: C 語言新手十誡(增修一版)
時間: Sat Sep 3 01:07:31 2005

C 語言新手十誡(The Ten Commandments for Newbie C Programmers) by Khoguan Phuann

請注意:
(1) 本篇旨在提醒新手,避免初學常犯的錯誤(其實老手也常犯:-Q)。 但不能取代完整的學習,請自己好好研讀一兩本 C 語言的好書, 並多多實作練習。
(2) 強烈建議新手先看過此文再發問,你的問題極可能此文已經提出並解答了。
(3) 以下所舉的錯誤例子如果在你的電腦上印出和正確例子相同的結果, 那只是不足為恃的一時僥倖。
(4) 不守十誡者,輕則執行結果的輸出數據錯誤,或是程式當掉,重則引爆核彈、毀滅地球。
   (如果你的 C 程式是用來控制核彈發射器的話)

一、你不可以使用尚未給予適當初值的變數。

錯誤例子
正確例子
二、你不可以存取超過陣列既定範圍的空間。

錯誤例子
正確例子
說明:宣告陣列時,所給的陣列元素個數值如果是 N, 那麼我們在後面透過 [索引值] 存取其元素時,所能使用的索引值範圍是從 0 到 N-1, 也就是 C 和 C++ 的陣列元素是從第 0 個開始算起,最後一個元素的索引值是 N-1, 不是 N。 C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過陣列邊界, 我們要自己寫程式來確保不會越界。一旦越界,將導致無法預期的後果。

三、你不可以提取(dereference)不知指向何方的指標(包含 null 指標)。

錯誤例子
正確例子
說明:指標變數必需先指向某個明確的東西(object),才能進行操作。

四、你不可以將字串常數賦值(assign)給 char* 變數,然後透過該變數改寫字串的內容(只能讀不能寫)。

錯誤例子
正確例子
說明:字串常數的內容是唯讀的。上面的錯誤例子,是將其內容所在的位址賦 值給字元指標 pc, 我們透過指標只可以去讀該字串常數的內容,而不應該做 寫入的動作。而正確例子,則是另外宣告一個獨立的字元陣列,它的大小我們未明文指定([]),編譯器會自動將其設為剛好可以容納後面的字串常數起始值的大小,包括字串後面隱含的 '\0' 字元,並將字串常數的內容複製到字元陣列中,因此可以自由的對該字元陣列的內容進行讀和寫。

錯誤例子(2)
正確例子(2)
五、你不可以對尚未分配所指空間的 char* 變數,進行(字串)陣列的相關操作。其他型別的指標亦然。

錯誤例子
正確例子(1)
正確例子(2)
注意:上例用 gets() 或 scanf() 來讀入字串,是不安全的。 因為這些函式不會幫我們檢查使用者所輸入的字串長度是否超過我們所分配的 buffer 空間, 很可能會發生 buffer overflow。比較安全的做法是用 fgets() 來取代。如:
六、你不可以在函式中回傳一個指向區域性自動變數的指標。否則,會得到垃圾值。
[感謝 gocpp 網友提供程式例子]
錯誤例子
說明:區域性自動變數,將會在離開該區域時(本例中就是從getstr函式返回時) 被消滅,因此呼叫端得到的指標所指的字串內容就失效了。
【不過,倒是可以從函式中直接傳回字串常數,賦值給呼叫端的一個 const char * 變數,它既是唯讀的(參見第四誡),同時也具有恒常的儲存期(static storage duration),其內容將一直有效。】
正確例子 [針對字串操作,C++提供了更方便安全的 string class, 能用就盡量用]

七、你不可以只做 malloc(), 而不做相應的 free(),否則會造成記憶體漏失。
但若不是用 malloc() 所得到的記憶體,則不可以 free()。已經 free()了所指記憶體的指標,在它指向另一塊有效的動態分配得來的空間之前,不可以再被 free(),也不可以提取(dereference)這個指標。
[C++] 你不可以只做 new, 而不做相應的 delete.

八、你不可以在數值運算、賦值或比較中隨意混用不同型別的數值,而不謹慎考慮數值型別轉換可能帶來的「意外驚喜」(錯愕)。必須隨時注意數值運算的結果,其範圍是否會超出變數的型別。

錯誤例子(1)
正確例子(1)
說明:在目前最普遍的32位元PC作業平台上,整數常數2000000000的型別為 signed int(簡寫為 int),相加後,其結果仍為 int, 但是 signed int 放不下 4000000000, 造成算術溢位(arithmetic overflow),很可能無法將正確的值指派給 unsigned int sum,縱使 unsigned int 放得下4000000000 的數值。注意:寫成也是不對的。
例子(2):(感謝 sekya 網友提供)
說明:在將 char 型別定義為範圍從 -128 至 +127 的系統上,int 0x80 (其值等於 +128)要轉成 char 會放不下,會產生編譯器自行定義的值。 這樣的程式就不具可移植性了。

九、你不可以在一個運算式(expression)中,對一個基本型態的變數修改其值 超過一次以上。否則,將導致未定義的行為(undefined behavior)。

錯誤例子
正確例子 你也不可以在一個運算式(expression)中,對一個基本型態的變數修改其值, 而且還在同一個式子的其他地方為了其他目的而存取該變數的值。(其他目的, 是指不是為了計算這個變數的新值的目的)。否則,將導致未定義的行為。
錯誤例子
正確例子 [C++程式]
錯誤例子
正確例子

十、你不可以在macro的定義中,不為它的參數個別加上括號。

錯誤例子
正確例子
說明:如果是用 C++, 請多多利用 inline function 來取代上述的 macro, 以免除 macro 定義的種種危險性。如: macro 定義出的「偽函式」至少缺乏下列數項函式本有的能力: (1) 無法進行參數型別的檢查。 (2) 無法遞迴呼叫。 (3) 無法用 & 加在 macro name 之前,取得函式位址。 (4) 呼叫時往往不能使用具有 side effect 的引數。例如:
錯誤例子:(感謝 yaca 網友提供)
MACRO(++x) 展開來後變成 (((++x) * (++x)) - ((++x) * (++x))) 違反了第九誡。在 gcc 4.3.3 下的結果是 -24, 在 vc++ 下是 0.

後記:從「古時候」流傳下來一篇文章
"The Ten Commandments for C Programmers" (Annotated Edition) by Henry Spence
http://www.lysator.liu.se/c/ten-commandments.html
一方面它不是針對 C 的初學者,一方面它特意模仿中古英文聖經的用語,寫得文謅謅。所以我現在另外寫了這篇,希望能涵蓋最重要的觀念以及初學甚至老手最易犯的錯誤。

原作者:潘科元(Khoguan Phuann) (c)2005. 感謝 ptt.cc BBS 的 C_and_CPP 看板眾多網友提供寶貴意見及程式實例。

2011年8月16日 星期二

常用 C Library 列表

常用的 C Library functions


  • <iostream.h>
  • 標準輸入/輸出函數
    • cin  - console in  讀取鍵盤輸入資料
    • cout - console out 螢幕輸出
    • endl - 輸出時跳行

  • <string.h>
  • 字串函數
    • strlen - string lenght  字串長度
    • strcpy - string copy    複製字串
    • strcmp - string compare 比較字串
    • strcat - string catenation 串接字串
    • strstr - string search (string) 傳回次字串在主字串首次出現位置指標
    • strchr - string search (char)   傳回字元在主字串首次出現位置指標

  • <stdlib.h>
  • 轉換數值函數
    • atof - 轉換為浮點數值
    • atoi - 轉換為整數值
    • atol - 轉換為長整數值

  • <ctype.h>
  • 字元測試與轉換函數
    • isprint  - 是否為可列印字元(ASCII碼 32~126)
    • isgraph  - 是否為可顯示字元(ASCII碼 33~126)
    • isalnum  - 是否為英文字母或數字字元(A~Z, a~z, 0~9)
    • isalpha  - 是否為英文字母(A~Z, a~z)
    • isdigit  - 是否為數字字元(0~9)
    • isxdigit - 是否為16進位數字字元(0~9, A~F)
    • islower  - 是否為小寫英文字母(a~z)
    • isupper  - 是否為大寫英文字母(A~Z)
    • isspace  - 是否為空白字元(ASCII碼 32)
    • ispunct  - 是否為標點符號字元
    • iscntrl  - 是否為控制字元
    • tolower  - 轉成小寫英文字母
    • toupper  - 轉成大寫英文字母

  • <math.h>
  • 數學函數
    • rand  - 亂數函數(0 ~ RAND_MAX)
    • srand - 指定亂數函數種子數
    • time  - 自午夜算起的秒數
    • sin   - 正弦函數(徑度)
    • cos   - 餘弦函數(徑度)
    • tan   - 正切函數(徑度)
    • exp   - 指數函數
    • log   - 對數 loge函數
    • log10 - 對數 log10函數
    • pow   - 冪次方
    • sqrt  - 平方根
    • ceil  - 小數進位
    • floor - 切除小數
    • fabs  - 絕對值

2011年7月6日 星期三

Use fork() and exec() to make a process in Linux C

Use fork() and exec() to make a process in Linux C.

Example -
Result:
** Execuing program: ls -l /bin/gzip **
-rwxr-xr-x 1 root root 63080 2008-12-20 02:23 /bin/gzip
child return exit code: 0

2011年6月20日 星期一

"STATIC" - C/C++ Programming

"static" : a programming tag that confuses and troubles many people, and so am I of course.

The following content and information is referenced from others' blog:

  • Static Variable (靜態變數):
  • static 放在 variable 前時,代表這個 variable 的存活時間和整個程式一樣長。也就是 life time 跟整個 Process 一樣長,而 scope 則維持不變。
    Example:
    執行結果 x=5 y=1 TestFunction 會對 x , y 配置記憶體空間並進行 initial,當 TestFunction 結束的時候,會將 y 的記憶體歸還,下次呼叫時再重新配置一次;而x被宣告成static,所以x的記憶體不會歸還,延用著上次的值。
    碎碎念1:似乎可以看成被宣告成 static 的變數,其實就是 global 的了,只是因為 x 是宣告在 TestFunction 裡,所以只能在 TestFunction 裡用。
    碎碎念2:如果把 x 宣告在外面當成 global,那 int x; 和 static int x; 是一樣的。
    碎碎念3:在 TestFunction 裡,static int x=0; 的初始化只會做一次。如果寫成 static int x; x=0; 那結果就會跟 y 一樣。

  • Static Member Variable (靜態成員變數):
  • 在 class 裡把 member variable 宣告成 static,代表他是「與 class 相關連」,而不是「與物件相關連」。他獨立配置記憶體,獨立於 class 的任何物件而存在,這個 class 產生的所有物件共用使同一個 static member variable,甚至不需要有物件也能夠被使用。
    因為 static member variable 不屬於任何物件,所以必須定義在外面。與一般成員變數不同,static member variable 並不是經由 constructor 初始化,而是在定義時被初始化。
    碎碎念1:可以看做是一個存在於某個 class 的 global variable。

  • Static Member Function (靜態成員函式):
  • 如果static member variable是private的
    如果 static member variable 是 private 的,那就沒有辦法直接取了,那該怎麼辦呢?寫一個 Get 的 member function?
    這樣不是很奇怪嗎?因為 m_nNum 在不是 private 的時候,可以不用產生物件就可以存取,但是用 Get member function 卻要產生一個物件。所以這樣的方法並不好,因此,就要把 Get member function 也宣告成static的。
    static member function 也跟 static member variable 一樣,獨立於物件存在。可以在沒有物件產生的狀況下被使用,所以他不能使用 this,也不能存取 class 裡的一般成員變數,當然也不能使用一般成員函式了。
    也就是說,static member function 只能存取 static member variable。
    那如果真的想用呢?就要用以下的方法:
    執行結果:
    A::m_nNum=0
    建立物件a1
    A::m_nNum=0
    a1.m_nNum=0
    a1.GetNum2()=10
    a1.StaticGetNum3()=20

    建立物件a2
    A::m_nNum=0
    a2.m_nNum=0
    a2.GetNum2()=10
    a2.StaticGetNum3()=100  // 把a2的m_nNum3從20設成100
    a1.StaticGetNum3()=100  // Question!?
    a1.GetNum3()=20
    值得注意的是 a1.StaticGetNum3()=100,a1 的 m_nNum3 是 100 嗎?a1 的 m_nNum3 明明就是20,而 a2 的 m_nNum3 才是100,那為什麼這裡會錯了呢?
    主要的問題是來自於 m_pThis,我們為了讓 static member function 可以存取一般成員函式和成員變數,所以使用 m_pThis 指向自己來取得一般成員函式和成員變數,而且為了讓 static member function 可以使用 m_pThis 指標,還把 m_pThis 指標宣告成 static 的。
    宣告成 static 就表示他是所有物件共用的,所以當產生 a1 物件時,m_pThis 是指向 a1 物件的,而產生 a2 物件時 m_pThis 就改指向 a2 物件了,所以就算透過 a1 物件取得 m_pThis,也都會取得 a2 物件了。
    碎碎念1:要避免這問題,只能想辦法確保 A 類別只會產生1個物件? singleton ?沒有別的辦法嗎? 有的!就是把物件自己當成參數傳進 static member function 裡。
referenced from - C++的static @ 伊卡洛斯之翼

「百年千書 經典必讀」數位閱讀計畫內容

2011年6月17日 星期五

「極致」於我

       「極致」,一個極抽象的詞彙,在你的心目中,在每一個人的心中,會追求一個極致的目標,這是一個理想;抑或是個夢想,捫心自問 ─ 我所追求的極致是什麼?

        炎夏的夜晚,跟好友同事三五成群在頂樓的天台上討論心中的想法,喝著尚青的台啤,提到了「極致」這個詞,一時間我真得不知道該如何回應這個話題,就工作上來說,如何達到心中所謂的極致,我所認為的極致是什麼?作為一個軟體工程師,我所祈求能達到的極致是什麼:

  • 使用者介面的便利
  • 程式效率的優化
  • 應用軟體的實用與獨特
  • 善用各種輔助工具

        就目前來說,我有把握做到的有哪些?答案是「沒有」,我真的無法將這些事情每樣都做到極致,人的能力透過學習不斷在進步,難有稱為極致的一日,我能把握的是,我的確是不斷在進步中,從進步中一一修正自己過去錯誤的地方,一步步達到自己心中所謂的極致,「創新是建立在傳統的基石之上,成功是萌發於過去的失敗之中」,能看得又高又遠,是因為站在巨人的肩膀上,敢說得言之鑿鑿,是由於知道自己有幾斤幾兩重。

        最近面臨工作上的一些瓶頸,想跳出目前的窠臼,卻不知從何著手,主管離開了,缺乏有一個有想法的領導者,我真得必須知道自己現在做得是什麼,不然我該如何進步,與朋友們的小小喇賽是一個好的切入點,試圖想從中尋找自己的目標所在,很感謝能與這群好夥伴好朋友共事,雖然目前還無法找到突破點,但是我相信會慢慢的有路可循,找回自己對工作上的熱情與興趣。

P.S.我絕對不會說......其實我今晚最感興趣的是同事家中的那片藍光謎片 -.-"

2011年6月7日 星期二

porting tslib (abstraction layer for touchscreen) to ARM Platfrom

Step by Step:
my environment:
OS: Ubuntu 10.04
Cross-compiler:
  - CC   = linux-arm-gcc (4.1.2)
  - CXX = linux-arm-g++ (4.1.2)

  1. Download tslib source code
    • download tslib tar or zip file from http://tslib.berlios.de/
    • my download file version is named kergoth-tslib-1.0-94-gd4073fe.zip
  2. Install dependency libraries
    • sudo apt-get install m4 autoconf automake libtool
  3. set tslib install path
    • export PREFIX=/home/myname/tslib/BUILD 
      #set INSTALL PATH by your choice
  4. execute autogen.sh
    • ./autogen.sh
    • After this command finished, it generates configure file for tslib.
  5. configure tslib
    • ./configure --build=i386-linux --host=arm-linux --target=arm --prefix=$PREFIX ac_cv_func_malloc_0_nonnull=yes
  6. make; make install

2011年6月2日 星期四

[C++] The significance about - extern "C"

extern "C" 是C++特有的組合關鍵字,在C裡並沒有這個的組合,僅有extern這個關鍵字!

為什麼C++會需要這樣的關鍵字組呢? 原因是C++它有一個複載(overloading)的功能,也就是說同樣的函式名稱可以有多個定義只要參數簽名不同即可。
比如說C++裡可以有以下的二個宣告


bar(int i, int j);

bar(double i, double j);

這二個函式都是同樣的名字叫foo,僅參數型式不同。然而在C語言裡是不被允許的! C++是如何處理這同名的函式呢? 其實他在編譯時會偷偷的把這二個函式名變成不同的名字,舉例來說bar(int i, int j)可能會被改成_bar_int_int(每種compiler產生不太一樣),而另一個則被改成_bar_double_double。這技術稱 Mangling。

問題來了! 當我們希望C++不要偷換函式名時該怎麼辦? 於是就有了extern "C" 這個關鍵字組出現了。這個字組就是請C++不要自己又偷天換日,請它保留原名。所以當我們宣告一個函式如下時:

extern "C" bar(int i, int j);

編譯器就不會把bar變成_bar_double_double。

實際使用的注意事項:

1/ 當C++使用C的函式庫(library)時,C++不能直接套用C的header檔。因為他會把header裡的宣告給mangleing了。所以他必須使用如下:

extern "C"
{
#include "C_LIB.h" //C_LIB 是由C語言所寫的。
}

2/ 相反的,在C語言的編譯器裡若要使用由C++所寫出來的C函式庫,那麼也不能直接的使用C++的header檔。因為此header檔必然存在 extern "C" 這個關鍵字組,而這字組C語言是不認識的。所以必需要把C++的header檔裡的extern "C" { } 移除後才可以讓C編譯器使用。

  • 注意事項


  • 一組多載函數中, 只能有一個函數被指明為 "extern C", 因為符號修飾後的關係, ex:

    void abc(int);
    "extern C" void abc(char);
    "extern C" void abc(float);
    

    使用 C 方式的修飾符號是 _函數名,因此是 _abc, 所以當第2組指明 "extern C" 也是 _abc 那麼兩組 C 函數的符號就重複了,此檢查在函數的多載就可以,但是同一個 scope 中函數沒有多載化就無法檢查出,更確切的說,"extern "C" 不受 namespace or class 修飾的影響, 因此同一編譯單元中只能有一個同名函數為 "extern C", 否則會有錯誤 ,ex:

    namespace N
    {
    extern "C" void abc(){} // _abc
    
    }
    
    extern "C" void abc(){} // _abc
    


    編譯時產生相同符號 _abc 函數定義故錯誤,由於 extern "C" 不受限於 namespace 的修飾因此將產生一個有趣現象也就是宣告和定義可以在不同的 namespace 出現。語法層面上的檢查就如同一般,而當語法檢查通過後產生符號時,extern "C" 的定義其符號不帶有 namespace 的修飾;同樣的,呼叫者其符號也不帶有 namespace 的修飾,ex:


    namespace Foo
    {
    extern "C" void abc() {} //有定義, 生成符號時, 不受限於 namespace Foo 修飾故符號為 _abc
    }
    
    namespace Bar
    {
    extern "C" void abc(); //純宣告 
    }
    
    int main()
    {
    Bar::abc(); //函數呼叫, 生成符號時, 不受限於 namespace Bar 修飾故符號為 _abc, 事實上鏈結到 ::Foo::abc()
    }
    

    還有下面如此鏈結錯誤的狀況:
    由於extern "C" 沒有多載功能,不論是 void abc() 或是 void abc(int a) 都將被以 _abc 來做為函式名稱,這是極度危險的.


    1.c
    extern "C" void abc();
    int main()
    {
    abc();
    }
    

    2.c
    #include
    extern "C" void abc(int a)
    {
    printf("%d",a);
    }
    

    當 1.c 和 2.c link 時可以,因為 c 沒有將參數名稱當作函式修飾名稱的一部分,故也就沒有多載,將 "C" 拿掉 link 時就會錯誤,因為會以 c++ 的方式來編譯。

    資料來源:C++中關於extern "C"的意義

    2011年4月19日 星期二

    Call by value , Call by pointer , and Call by reference

    • Call by Value
      • 參數會在函式中建立一個獨立的物件
      • 不論在函式中如何改變這個參數的值,都不會影響呼叫端的物件
      • 在該函式結束之後,所有的臨時物件都會清除,包括 call by value 所產生的參數
      int main() { 
          int x = 5; 
          foo(x); 
      }
      
      void foo(int y) {    // 建立一個新的物件等同於傳入的物件
          y++;    //不會改變到原呼叫端的物件
      }
      
    • Call by Pointer
      • 參數不會建立物件的複本
      • 以物件的產生、呼叫的成本考慮,傳參考與傳指標是十分類似。但傳指標與傳參考最大的分別是,參考是常數,而指標是變數
      • 因此這個指標可以指向另一個位置,另一個更明顯的分別是所有的陣列傳遞都是以傳指標的方式達成
      int main() {
          int a = 5;
          int *x;
          x = &a;
          foo(x);
      }
      
      void foo(int *y) {   // 建立一個指標指向傳入物件的記憶體位置
          (*y)++;    // 修改此*y就是修改main的*x
          int b = 9;
          int *c;
          c = &b;
          y = c;    // Thinking:compare with " *y = *c " here, how about the variables in main()?
      }
      
    • Call by Reference
      • 參數不會建立物件的複本,它只會建立一個指向呼叫端物件的參考
      • 所以如果在函式中改變這個參數的內容(先決條件是這個參數未被宣告為 const),就會改變呼叫端參數的內容
      • 特別要注意的是,Call by reference的方式,一定要在初始化時就有指向的實體,而且不能改變
    int main() { 
        int x = 5; 
        foo(x);    // 不用加& 
    }
    
    void foo(int &y) {    // 建立一個參考指向傳入物件的記憶體位置
        y++;    // 修改此y就是修改main的x,無法改變y所指向的記憶體位置
    }