2015年2月26日 星期四

[c/c++ 技巧] Forward Declaration

Forward Declaration

今天要介紹的是可以在重新編譯整個專案 source code 時,避免不必要的重新編譯。

先想像一個情境,假設一個專案有兩個檔案,分別為:

classA.h
main.cpp

在 classA.h 檔中,定義了class A,而在main.cpp中,定義了另一個class B,class B 的member 包含了A,這時候我們直覺就是在 main.cpp 的裡面加一行
#include "classA.h"
這樣也是正確的寫法,不過當我們更改 classA.h 檔後,所有 include 到 classA.h 的檔案,都必須重新編譯,main.cpp 也不例外,這個缺點在當專案擴增到一定程度後,就會嚴重拖慢編譯的速度,而 forward declaration 就是解決這個問題的好方法。

那該如何使用 forward declaration 呢?


就是將原本 include classA.h 的地方,改成:
class A;

這樣一來,就可以避免掉不必要的重新編譯,讓專案編譯的速度提升了。

是所有的情況都可以使用 forward declaration 的技巧嗎?


當然不是,以下舉出幾個可以適用 forward declaration 的原則:

1. 當 class A 是以 pointer 或 reference 的形式出現:
class B{
   A* aVar;
   A& aVar2;
}
2. 當在宣告函式時, class A 是以參數的形式傳入或回傳:
void func1(A);
A    func2();

另外,因為 forward declaration 並無法讓編譯器知道 class A 的大小、成員、以及方法,所以在必須讓用到以上資訊的情況下,我們就切記不能使用 forward declaration ,只能乖乖的用 include 的方式。

詳細的說明,Luc Touraille 大大有在 stackoverflow 回答過了,請參考 : When can I use a forward declaration?

以上就是這次的 c/c++ 技巧。

2014年6月20日 星期五

致我們終將逝去的大二

致我們終將逝去的大二

這一年是最充實的一年,也是最空虛的一年
這一年我體驗到何謂大二地獄,也讓我體驗到忙到深處亦是忙,忙到沒時間靜下來閱讀一本自己喜愛的書、忙到沒時間思考自己當下在做的事、忙到失去自己,回想起來,真的是非常可嘆事情。

大二地獄

上大二前就有學長提醒,大二真的會很苦、很累、很忙,沒想到真的上了大二才發現,

這是真的!!!!
從大二上的電子一、電路、微方、交電,還有資結,到大二下的電子二、電磁、信號、機率、離散、跟CCSP,每一門課都不輕,這學期常常在熬夜寫作業、念書的時候,思考:這種生活真的是我想要的嗎? 

然而每次都想不到答案,最後就又埋沒在忙碌的生活中,繼續忙碌下去、繼續盲路下去
漸漸的逐漸在必修中失去熱情,真的好可惜!!



電機系的必修

我真的覺得對於大二來說,電機系的課真的有點重,他讓我們只能限於課內的內容(因為光是課內就讀不完啦!!!),真的要去專研其中一門課,就必須要放掉另一門,所以往往只能學到課內的知識,少了自己的延伸。

--------------------------------------------------------------------------------------------

不過除了崩潰的大二課業,我這學期也接觸了不少新的東西,對我的想法產生了極大的影響,像是創業的想法、社會公益的想法、獨立價值判斷的能力......等等,真的是收穫不少喔!!

關於創業

這學期接觸到了許多創業的人,看到他們那專注、熱情、執著的眼神,真的很令我震撼與感動,曾經聽一場演講,演講者說:
創業是為了滿足社會上尚未被滿足的需求
 真的很有道理,因為有尚未被滿足的需求,所以就需要創業者的投入,讓這個社會變得更好,說不定之後也會踏上創業的旅程,誰知道呢?

獨立價值觀判斷

由於這學期中,發生了相當重大的學運,非常非常的貼近我的生活,我身邊的同學、朋友、教授,都投入其中、或到場聲援,我也因此接觸到了相當多的文章、討論,從中漸漸的明白,獨立思考的意義於價值,真的受益良多,也真心希望台灣能有真真位台灣著想的領導人,讓台灣變得更美好、讓大家的生活變得更舒適,希望。

最後也感謝所有在這學期幫助過我的人,謝謝你們,讓我的這一年變得這麼充實。
也期待將來能找到屬於自己的那片天空,盡情揮灑熱情!!!!!!

致我們終將逝去的大二


2014年6月2日 星期一

關於服務~

何謂服務?

今天在改大家的服務學習心得的過程中,真的有好多深刻的體悟,每個人對於服務學習所抱持的想法都不同,有些人以一行文解決心得作業,有的人將他這學期參與社團的感受都記錄下來,也有一些人分享他自己對於服務學習的想法,其中有許多值得我記錄下來的觀點。

「服務,是讓被服務的人更不需要你」

這是由一個第二期的團員所分享的,她是從她的老師那邊所得到的啟發。我看到的當下,真的有被震撼到的感覺,這具話真的很耐人尋味,洗鍊的句子中,卻包含了服務最深層的本質,在做服務的同時,真的很需要將這句話隨時放在心上,我們在做服務時,是為了要讓別人能過得更好,而不是讓別人變得過度依賴,最後離不開自己,自己也放不下心,這樣真的很可惜。

真心的對待小朋友,小朋友會以他們自己的方式回應我們

這是我在看到一位團員的心得時,所產生的想法與體悟,很多小朋友在一開始接觸陌生的哥姐時,會以爆走、不聽話、或死不理你的方式表達自己,所以這讓很多第一次帶小朋友的新團員都在心得中,提到這是他們最覺得沮喪的事情,不過其實這是很正常的一件事,小朋友因為還不知道或還沒感受到我們真心想為他們好的心,所以不知道該以怎樣的方式回應我們,只好以最保險的方式,但是,一但小朋友們真的感受到哥哥姐姐們的用心後,他們就會以他們自己的方式來回應哥姐們,最常見的是黏TT~ 有的小朋友會變得超黏其中一位哥姐,這就是小朋友感受到那位哥姐的用心,還有的會送小卡片(我也有收到YA~)表達,


但以上都是比較容易察覺到的,有些小朋友的回應方式是需要細心觀察,才能發現的,像是一但小朋友覺得某位哥姐對他很好,他便會在行為上模仿那位哥姐,因為他認同那位哥姐,所以才願意模仿;還有一個方式是小朋友會願意幫哥姐管不聽話的小朋友,不要小看這個舉動,這真的需要相當程度的認同,小朋友才會願意做。

小朋友真的是很不會為他人找想ㄝ!!!

這是一位新團員提出的感想,我要說:「對!! 沒錯~~」,小朋友其實對於己所不欲勿施於人是沒什麼概念的,所以他們會以自己的想法來看待世界,在這個年紀,他們對於「要從他人的觀點來看世界」的概念,才正在慢慢的萌芽,所以需要我們慢慢得引導他們去思考,像:「今天如果是別人亂碰你的東西,你會覺得如何呢?」之類的問句,讓他們自己去思考,而不是一位的灌輸他們觀念,從這些思考中,他們會漸漸的體悟到替他人想是什麼概念,這樣比較有效,也對他們比較好。

小朋友爆走真的好崩潰>_<

  能看到小朋友認真專注的樣子,真的是我們哥哥姐姐們最幸福的事,但是很多時候小朋友是爆走不受控的,然而小朋友爆走不聽話的時候,才是真正需要我們去用心力去處理的,或許可以試著跟小朋友談談他們為什麼不參與活動而是到處亂跑,有時候我們會得到相當驚訝的答案,有些小朋友其實是很想參與活動的,只是因為自己理解力較慢,無法跟上其他人的進行速度而感到沮喪,這時候如果哥姐夠多,就可以分一位去陪伴他(或是可以請團本),帶他一步一步的去體驗活動的內容,這樣他也會很開心,我們也會很有成就感;其他爆走原因像是:想要得到哥姐的多一點關注、心情不好、身體不舒服......等等,唯有了解背後的原因,才能真正的解決小朋友爆走的原因。

我好不會帶隊喔~ 怎麼辦??

其實大多數的新團員都有提出這樣的問題,他們很多都是第一次接觸這麼一大群小朋友,所以感到相當不安,不知道該如何相處,其實每個人第一次帶隊都是會緊張不安的,這是非常正常的,畢竟我們也脫離小朋友時代這麼久了,無法想像他們在想什麼。不過,可以去觀察舊團員是如何跟小朋友相處的,因為社團中有超多帶隊超猛的團員,值得大家觀察學習,見見的大家就會上手了。

以上就是在看大家心得的過程中,所體悟到的東西,真的很有收穫,好多人都好認真的寫心得,真的令人開心。 :)

第一次不是因為課業、coding、耍廢(XDDD)而熬夜的,感覺還蠻好的,有好多新的體悟。

2014年5月30日 星期五

臺大創新競賽

臺大創新競賽

今天的活動真的是太精彩了!!!!
每一隊的參賽者從理念、實做、到商業模式,都好完整~
領域也是各方面都有
從物治、學習、健康控管、節能、到社會服務都有
有好多未來感覺都會一爆而紅的新創團隊
從他們每個人的眼神中
我好像漸漸知道自己未來真正想做的事
我之後也一定要站上這夢想的舞台!!!

「創新是什麼?」

是滿足社會上尚未被滿足的需求
是做跟別人不一樣的事
是超越使用者,想到他們未來的需要
是一股想要完成自己理想的能量!!!

WeCare微善









我覺得wecare好可惜沒有得到獎項
我超欣賞他們的理念
他們的創新能讓社會上的弱勢公益團體
不用操心架網站的金費與能力
可以無後顧之憂的付出
讓想要為社會盡一分力的人
不用再辛苦的尋尋覓覓
可以更方便的達成
I believe WeCare will succeed, because WeCare care what we care.

明年或後年我一定也要參加!!!


Crawler 初探


最近因為課程的關係,所以開始學如何爬網頁資料,由於是這方面的新手,所以碰到了不少問題,記錄一下,之後也可以參考。


使用的工具:



 Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE 問題

由於使用的是nodejs平台,他所使用的SSL是openssl,所以可能跟目標網站的不太一樣

解決方式:

在程式碼中加入
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
就可以了 :)

原理:

//Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs



非同步&&同步問題

同步是JS的特性,然而對於之前都習慣撰寫C++的我來說,一開始真的很不習慣
(現在也還在習慣中...),但是如果真的有非同步的需求,可以使用Async.js詳細的使用方法可以參考作者的README.md,他寫得蠻清楚的。
也可以參考我寫的:
async.series([
  function(callback){
    setTimeout(function(){
      
      //do something

      callback();
    },3000);
  },
  function(callback){
    setTimeout(function(){

      //do something

      callback();
    },0);
  }
],function(err,re){
  if(err){console.log("Error: " + err);}
});
form my github