論文結束,該開始好好建造自己的房子

木匠的房子

今天是我論文的口試,上場之前,其實心情有萬分的緊張,因為我的指導教授平時要求嚴謹,一個標點符號、一個錯字,整篇論文都會被他丟了出來,所以今天在口試之前,很擔心自己論文的品質會不夠。

還好一上場之後,平時嚴肅的老師變成相當的和藹,整個論文口試的過程變成相當的順利,於是我不到一個小時,就通過了論文口試。或許許多人會想,太好啦~ 論文口試通過就如同畢業一樣,隨便改改就可以把論文繳交出去,但是當口試一結束之後,老師之前寄給我的這篇文章忽然出現在我腦海中,於是乎我又起身到電腦前,將論文整體上做了一些修改,並且把口試委員所提的問題作了一個整理。

也跟大家分享這個小故事~~也希望各位在做任何事情,都應該像對待自己的房子一樣,不要草草了事,畢竟一個人的作品,代表了一個人的程度與能力。

> > **木匠的房子** > > > > 有一個從事蓋房子工作的木匠,有一天忽然間跟他的老闆說,抱歉,我要辭職不幹了,因為我需要時間和我的家人相處,唯一最難過的是捨不得當初一起打拼的日子。 老闆的唯一要求,是希望木匠蓋最後一棟房子,木匠心想這是最後一次工作,於是就蓋的馬馬虎虎,蓋好了就跟老闆講,我現在可以走了嗎? 木匠走的時候,老闆就對他說,這就是我最後送給你的禮物,禮物就是這棟屋子。木匠如果知道這是要送給自己的屋子,一定不會這樣蓋的馬馬虎虎。 我們的一生有多少自己蓋的房子,我們應該把自己想成這個木匠,試想究竟有多少人會好好的經營自己的親子關係?普遍的人都想著能混的過去就混過去,有多少人會好好經營自己的專業能力?最後我們都跟那個木匠一樣了。我也都沒有對於自己的工作發展好好的經營,我五年之後的生活就是那些粗製的木頭所蓋出來的房子,所以我們真的要破局而出了。 > >

論文口試..祈禱~

把好運慢慢變大吧?

明天早上,就要論文口試了,剩下的幾個小時,既是緊張、也是興奮。

對於論文的檢查總覺得有不周密的地方,很害怕被老師責罵~~是緊張

對於學生生涯即將面臨到短暫的結束(短時間也沒有進修的打算)~~是興奮

不論未來是如何,閉上眼睛,好好的享受最後的學生生涯~~最後的考驗吧

 

P.S. 看到本篇~若在5/27中午之前,請向天空為我祈禱

更好用書籤管理系統『美味書籤(del.icio.us)』

美味書籤

當我之前介紹Blogrolling時,一邊抱怨著他無法方便的使用中文輸入的時候,好心的卡西蒂小姐跟我介紹到MARKROYBOY在他的BLOG曾經有提過的del.icio.us(美味書籤),跟之前介紹Blogrolling一樣,del.icio.us(美味書籤)不僅可以管理好你所記錄的BOOKMARK,更可以讓你的BLOG去讀取你所存取BOOKMARK來變成像我首頁一樣的東西。

至於要怎麼申請與使用在你自己的BLOG之上的方式,MARKROYBOY在他的BLOG有講解得相當詳細,建議大家可以去上面看看,在此我主要介紹到一個功能,就是美味書籤提供的相當多功能中right click context-menu(也就是利用右鍵來增加你的網址),所有步驟如下:

  1. 首先建議各位先連接到right click context-menu

  2. 下載REG檔post-to-del-icio-us.reg(也就是系統登錄檔)

  3. 利用另存新檔下載後,連按兩下滑鼠,將他加入到你的登錄之中

  4. 然後關閉所有的瀏覽器,重新打開之後,當你看到喜歡的網頁,就按下右鍵,就會出現以下的東西

按下右鍵後的新增加的『一步登錄』

P.S. 第一次使用的時候,可能會請你輸入你所註冊的位置,請千萬記住要輸入『http://del.icio.us/你註冊的名字』(記住要打入全部,不然以後會全部錯誤,直到你將利用這個鍊結,將COOKIE刪除,之後解除掉該REG,重新安裝之後才會成功唷!!

 

利用C語言寫CGI的一些心得整理

關於利用C語言撰寫CGI程式的部分,這也是之前人家面試的時候,所詢問我的另外一個問題,經過這幾天上網找資料,並且撰寫之後,將一些心得整理出來,希望能幫助到有一些疑問的人。其實利用關鍵字『C語言、CGI、GET、POST』還是可以找到蠻多相關的網頁,大部分的資料都嫌老舊,並且都是由同一個作者撰寫而出(不過倒是有蠻多人複製在自己的網站上面–_____–”“),所以在此為各位整理一些概念,而繁瑣的程式碼(關於將STRING去spilit並且找出變數對應值)就不再詳述,可參考以下這個網址,在這裡只專注於觀念上的敘述,希望帶給大家一些基本的概念。

 

利用C語言撰寫CGI程式

CGI( Common Gateway Interface)

**1.放在可以執行的地方

**不論哪種網頁伺服器的主機(IISApache),對於檔案可否執行(execute)的權限管理相當嚴格,尤其是Apache,要由網路上執行某些檔案(通常是CGI),都必須透過,httpd.conf 這個檔案裡面的設定才行(通常預設是 cgi-bin/ ) 。另一方面,對於IIS的設定就方便多了,只要啟動IIS Service將該目錄可執行的權限打開,就可以執行CGI程式。

P.S. 算是FAQ的問題,請注意即便可以執行 C語言的請編譯好用修改權限為可以執行的檔案。

 

**2.C語言中CGI裡面的Hello World!!

**在這裡要跟大家講解對於網頁而言,其實與一般的C語言程式沒有兩樣,重點在於輸出與輸入的介面(UI)。相較於一般的C語言程式,利用C來撰寫的CGI其輸入與輸出都不一樣,首先在輸出方面,最不一樣的就是CGI有以下的輸出

printf (“Content-type: text/htmlnn”);

這個就是代表這是一個網頁的程式,記住”Content-type: text/htmlnn”這段文字儘量不要修改,並且連空白都要注意好(沒有注意好,網頁伺服器會誤認為其他可執行檔案而變成可以下載,而非當成CGI程式),所以根據這個,以下為一個基本的CGI程式

// // File Name test1.cpp // #include #include int main(int argc, char* argv[],char *envp[] ) { printf("Content-type: text/htmlnn"); printf("Hello___World"); } </td> </tr> </table> 各位可將此程式編譯(gcc -o test1.cgi test1.cpp)之後,放在可以執行的目錄下。   **3.CGI中參數的傳入** 如同之前所敘述,CGI程式與一般的程式最大的差別在於資料擷取的不同,網頁資料的擷取上主要有兩種,分別是透過GET與POST。這兩種可以透過表單函數
下去設定,在此引用[Form與CGI的綜合運用](http://www.cc.nctu.edu.tw/~claven/course/www/html_tutorial/formcgi.htm)中作者所畫的一張圖,可以清楚的瞭解變數在此轉換的差別。 [ ![使用C語言寫CGI變數輸入圖](http://www.evanlin.com/blog/archives/0520/img00003.gif) ](http://www.evanlin.com/blog/archives/0520/img00003.gif) 根據以上的圖,有兩一個系統參數可以辨別參數傳過來的方式,就是(REQUEST_METHOD),裡面會儲存傳入變的的方式,利用以下一個簡單的程式可以抓取所有的環境變數:
#include int main(int argc, char* argv[],char *envp[] ) { printf("Content-type: text/htmlnn"); for(int i = 0; envp[i] != NULL; ++i ){ printf(envp[i]); printf("
"); } } </td> </tr> </table> **傳值為GET的取值法:**大家亦可透過[範例程式](http://www.evanlin.com/cgi-bin/g1.cgi)去看,若是在網址列後面輸入變數(?aa=1&bb=2)即可觀察到變數QUERY_STRING裡面百的就是我們所輸入的變數值,在根據裡面的資料去PARSE即可瞭解。若要[使用表單的範例](http://www.evanlin.com/get.html)請看這裡,[若要看詳細CGI程式碼,請看這裡](http://www.evanlin.com/get.txt) **傳值為POST的取值法:**若是透過的方式所傳遞過來的參數,在CGI程式之中,會被當做是Standard_input也就是當成外在輸入(可用getch, gets來抓取),然後在一個個去變數去作PARSE的動作。以下會[有一個範例](http://www.evanlin.com/post.html)的表單傳遞到變數去。[若要看詳細CGI程式碼,請看這裡](http://www.evanlin.com/post.txt) 其實對於字串的PARSE部分,應該有許多寫好的函示可以應用,不過重點還是在於兩種輸入方式對於程式處理上的不同。(切記:GET=>Query_String; POST=>Std_Input)     **參考資料:** 1. [Form與CGI的綜合運用](http://www.cc.nctu.edu.tw/~claven/course/www/html_tutorial/formcgi.htm) 2. [用C語言進行CGI程序程式](http://moon-soft.com/e_commerce/soft/book/ccgi.htm) 3. **[Win32下apache,perl环境建立](http://www.csdn.net/develop/Read_Article.asp?Id=6568)**[ BigApple(原作)](http://www.csdn.net/develop/Read_Article.asp?Id=6568) 4. [CGI範例與寫作](http://www.cs.ntust.edu.tw/~huang/CGI/CGIbyC.htm)

研討會完畢,準備口試,工作確定

今天去真理大學參加研討會,算是第二次參加研討會吧,所以整個流程上算是有一定的瞭解.整個研討會下來,一個感受是,透過學術的交流,其實對於自己的論文品質信心度會增加,也可以間接瞭解到每間資管所在研究領域上有極大的差異與不同.

而在週五的下午也將論文的完搞寄送給每一位評審委員,等待著下週四的口試.而工作也算是確定好了.

不過隨著學生最後一段生涯的尾聲,慢慢的有一些小小的感嘆吧.

C語言相關探討,細究指標(pointer)與參照(reference)

感謝網友『阿仁』對於我BLOG裡面程式碼的訂正,在參考過『More Effective C++』中,對於指標使用上的補充順便加入Reference的一些資料。所以一併將這些資料整理在這裡,順便提一下今天侯捷老師講解一些關於Reference Counting 的概念。只能說很多東西要不斷的複習,不然真的都會遺忘,這幾次的面試有很多間公司都搞砸了也就是因為這個原因,原本五專時代都記得的東西,因為許久沒有使用,真的都忘的乾乾淨淨。

  1. **指標(Pointer)與參照(Reference)
**在C語言中,雖然指標與參照在使用上極為類似,但是實際上有許多地方式都是不同的。我將這些不同做成以下列表出來:  




  
  <table cellspacing="1" border="1" width="62%" >
    <tr >
  指標(Pointer) (type *p) 參照(Reference) (type &p)
    </tr>
    <tr >
記憶體配置 配置指標記憶體(4Byte) 不配置記憶體,本身為別名(Alias)
    </tr>
    <tr >
初始值給定 可以後來指定(不建議,但是允許這樣給值) 必須在變數成立的時候,直接給定初始值
    </tr>
    <tr >
內容值(p) 代表一個記憶體位置,指向給定的目標值 直接代表目標值
    </tr>
    <tr >
設定位置 (目標值Q) p=&Q p=Q (在此為將Q另外設定一個名字p)
    </tr>
    <tr >
給值 (目標值Q) *p=Q (將Q的值給*p) p=Q (在此為將Q另外設定一個名字p)
    </tr>
  </table>
  





  

根據以上的表格,順道提到一般課本常提到的Call by address與
Call by reference的參照方式,撰寫如下:





  
  <table cellspacing="1" border="1" width="57%" >
    <tr >
Call by Address (use Pointer) Call by Reference (use Reference)
    </tr>
  
  <tr >
#include void fun1(int * p, int * q) { *p=*p+*q; } void main() { int i=3,j=4,k; fun1(&i,&j); cout <<i; } </td> #include void fun1(int & p, int & q) { p=p+q; } void main() { int i=3,j=4,k; fun1(i,j); cout <<i; } </td> </tr> </table> 透過這個列表,可以清楚的兩者的差異,所以在之前文章所提到的錯誤為:
int x=10; int *v; *v=x;;
在此錯誤為,由於我的指標 *v 並沒有初始化指標,所以v的值是一個系統給的亂數(或是之前變數留下來的資料),其實這樣去指定是相當危險的一件事情。所以要設定v去指定x的時候,應該使用 v=&x 去設定一個位置在v之中。之前會這樣想也因為我對於字串指標的設定有一點混淆 char *s="test ~~~ string~~~"; 像這樣的句子,雖然也是起使一個指標,但是由於電腦會先根據字串"test ~~~ string~~~"去分配一個位置給他,然後再把位置指定給s ,所以不需要再配置一次位置(記得這個問題在趨勢與友立似乎也一直被問到~~) 但是這裡順道一提 char *s="test ~~~ string~~~"; 與 char s[]="test ~~~ string~~~"; 若要顯示整段文字,勢必得使用後者,因為cout <<*s; 只會顯示出第一個字元,而 cout <<sp[]; cout<<sp; 則會顯示整個字串,這也是字串與指標的一種混和運用。太久沒寫的人(像我),這邊也會有種混淆的感覺@﹍﹍﹍@ 2. **有效的參照與節省記憶體 (Reference Counting )** 同樣在『[More Effective C++](http://www.jjhou.com/jjtbooks-more-effective-cpp.htm)』的第30條之中,裡面有提到一個概念(Reference Counting ),主要是利用運算子多載(Operator Overloading)的概念,將 = (Assign給值)這個運算子,更改其用途,來節省記憶體的使用。一般而言,若是
String a,b,c,d,e; a=b=c=d=e="Hello";
在以上的程式之中,記憶體是會分配『五塊記憶體(大小為STRING)』,因為原來在String中的運算子『=』的定義是Assign by Copy的方式,也就是會同樣的分配一塊記憶體,然後複製其內容值到每一塊記憶體之中。所以若是針對 『=』加以更改其作用值,若是在參考的時候(也就是單純的String 互傳值)的話,應該是將記憶體節省下來,直接讓LHS(左手邊的變數)直接指向RHS(右手邊)的變數才對。並且還要可以計數所有有參照到該記憶體的變數個數(所以才叫Reference Counting),詳細說明,請看『[More Effective C++](http://www.jjhou.com/jjtbooks-more-effective-cpp.htm)』的P.183