2013年9月27日 星期五

千等萬等,終於要國軍online了

今年政府特別讓申請替代役的都人人有獎,當初我聽到消息滿開心的,因為聽說能當替代役就是爽? 一切我也是聽來的,所以我也傻傻的跟著高興 :) 但是一切從畢業後開始就不一樣了,起初我以為憑我的簽號,最晚應該也是九月就會進去,誰知道我一直等,不知不覺,九月過去了,我才開始擔心,打電話去公所問,現在籤號到哪了? 一問之下,整個人都傻了,怎麼速度如此之慢啊!! 每梯消化的人數也太少了吧,公所也無奈的口氣回應我,沒辦法,就是等吧~~~~我也很無奈 :(


結果就在最近,我終於收到徵集令了,心裡鬆了一口氣,發現上面籤號,怎麼跟我當初看到的籤號,足足多了20幾,我又傻了一次,我以為我身處夢中,一切都是虛幻的,但是螞蟻咬我的手把我痛醒了,我才知道我在現實中,於是我輕輕吹走那隻螞蟻,然後我在心中開始想,甚至是幹譙! 該不會有人偷偷用權勢讓自己籤號往前移吧....,憑什麼我要乖乖得讓你們籤號後面的先進去,浪費我的時間? 我認為我脾氣算好的,但是這是我頭一次這麼氣的,經過網路上搜尋後,我想真的是有這樣的事。

第一個我想每個公所分配的名額都不一樣,光這點就他X的不公平,很明顯北部的名額分配的比較多,消化的比較快,我想這是政府做事,小老百姓也只能無奈接受,再來就是可以用權勢、用鬧的,來讓自己早點入伍....,於是在我心中,浮現這樣的想法,這樣籤號有何意義,一切如同虛設??

在這現實的社會,權力才是一切,懂得鬧的人才有糖吃,這樣像我傻傻的人,怎麼辦? 以為政府做事公正,所以就安心等待,現在,我才在這邊抱不平,事情也都過了,能怎樣嗎? 只能說整件事下來,讓我失望透頂,眼前所見的都只能參考參考而已,就像在台灣過馬路,看紅綠燈,看到綠燈也不要傻傻的就過去,因為交通號誌在台灣什麼也不是,有權有勢的人,可以無視這一切....新聞報導已經證實了許多次,現在想想我也太天真,我應該從這種事情就該聯想到會有人耍奧步。

現在說什麼也沒用了,總之拿到徵集令了,終於可以進去,出來後就可以找工作了,同時也希望那些還沒進去的,能夠盡早進去:) 以後在社會上我也要多小心了,因為在航行在海上,何處有暗礁,你是不知道的.....,尤其是那些不是"天然"的暗礁,sigh。

打完這篇心裡也稍微舒坦了一些,不過由於要國軍online了,這blog會荒廢一年吧,目前正在碰的common lisp,也只能暫緩了,希望到時候我的程式沒忘太多,甚至是沒忘 :)

2013年9月25日 星期三

C++ regex

之前看到C++ 11發表那些新特色,就滿懷心喜的想要來嘗試一下,第一個我就嘗試了一下regular expression,因為在python中用的十分爽,簡單易用,結果呢?  讓我又喜又氣! 沒錯你沒看錯,為何我會有這種奇異的感受呢?
這就要請先看看下圖 :)


在visual studio裡面一切事都表現正常的,讓我十分開心,但是悲劇的是,當我開始用code blocks的時候,發現竟然得到的答案是不一樣的!! 竟然是沒有任何match,這讓我非常shock阿,起初我還以為是我regular expression寫錯了,畢竟又不是很常用,搞不好我忘了什麼重要的東西,心裡先這樣安慰自己一下:),但是經過多次嘗試後,仍然一樣,最後我用了python來測試一下,發現,很好,是我要的結果阿! 那到底是錯在哪?


經過我的多次搜尋,我發現因為C++ 11還太過新,目前沒有compiler是能夠完全支援的,但我在網路上看到評分,VS的compiler支援度竟然是最差?,G++反而是最多的,誰知道今天VS反而能夠滿足我= =,而且G++竟然是沒支援,讓我原本滿懷期待的心情都落空了 :( 我真心懷疑那個評分是正確的嗎? 目前,我看大概要用一些新特色的話,就是用boost這個library吧,畢竟有許多C11的特色都是借鏡這個library的,另外,也免的到時候又哪個compiler沒支援你要的特色,都不知道錯在哪了。


最後抱怨一下 :) 要是沒支援好歹也給的錯誤訊息,說你沒支援阿!! 讓我都不知道錯在哪...

2013年9月20日 星期五

lisp note 2

 最近讀lisp的心得,感覺的確是一個滿有趣的語言,要說讓我不怎麼喜歡的地方,大概就是那一堆(())這些符號,真的讓我剛開始,看到眼花,語言的可讀性跟python比起來真的差很多 :( 但是我也在想就是因為他的這種語言特性,才會讓lisp這麼多彩多姿 :),也讓lisp有個說法是lisp就像是DNA一樣。


lisp全名是(list processor),從這名字就可以略知一二了,在這程式語言裡,你會看到一堆list,事實也是如此,大致上可以這樣看,lisp裡面的元素,可以分為兩種非cons,是cons,是什麼意思呢?

cons掌控著兩個指標,第一個指標指的元素(car),第二個是(cdr),所以你會看到有語法是這樣的, (car '(1 2)), 這將會得到1,想當然爾(cdr '(1 2)),就是得到2,看到我看到這樣的語法時,心中就開始想了一件事.....
那就是,既然這語法是成功執行的,那是不是代表後面那東西就是一種cons所組成的物件?
後來,經過網路上的搜尋後,事實果然就是如此!!

其實 (1 2),它相當於(cons 1 (cons 2 nil))這樣,當然你會想,要是你想建一個很長的list,那豈不是要打一長串這樣的東西,很麻煩 :( ,lisp是有提供一個syntax sugar的,那就是list,(list 1 2),這樣的效果是一樣的。因此這也給我了一個想法,用cons是可以做出額外許多東西的,或許可以建造新型態? 只是目前我也沒試過,所以說lisp裡面的元素非cons即cons,似乎也無可厚非呢 :)

lisp這語言實在有好多東西要挖喔 :) 目前我沒辦法闡述太多心得,因為還有太多東西沒讀到,也還有太多東西沒釐清,所以沒辦法寫太多心得出來,但是,有一點是lisp有一些語法是有歷史淵源的,我覺得看那些歷史淵源,讓我了解更多的東西,千萬不要遇到語法就硬記,當你知道他的淵源,使用它就跟喝水一樣自然:)

我是這麼認為的,有太多人只把語言當作工具而利用,而沒有去深層了解他背後的語意和哲學,我覺得這是很可惜的,就像是為了考試而讀書一樣,沒有去了解書中給你的意境,想當然爾,會覺得讀書無趣,食之無味。 或許這就是現實面吧,我想lisp有效率上的問題,所以在以前才沒有熱門起來,但是不管如何,我還是覺得lisp值得一學,至少它目前讓我開了許多眼界 :)


在此提供一個可以當做文件查詢的網站 reference
另外lisp的表示法是用前序表達,這或許也是讓許多人第一次看不習慣的原因吧,這邊有個wiki 可以看

2013年9月18日 星期三

first time to play lisp

最近不知道怎麼搞的,突然想要來碰一下這十分古老的語言 :) lisp是一個充滿分支的語言,我覺得他沒有像python那樣有一個強力標準在,意思是python有一個官方版本,雖然python也有眾多分支就是了,像是Jpython, Ironpython....有的沒的。

其實在後來有一個算的上稱為標準的lisp,那就是common lisp,以後在網路上搜索的結果,發現比較多人在用的是clisp(common lisp)和SBCL,但是common lisp也是有眾多實做版本,,我是下載 gnu common lisp ,如果想要玩SBCL請自行去找載點囉 :)

lisp的在網路上的資源,說多也不多,說少也不少,但是我覺得似乎沒那麼熱門,畢竟這語言,曾經被冷落一段時間,但是經過我稍微一探lisp的世界,我發現這語言雖然古老,但是它卻有著許多現代語言的特性,甚至該說更好嗎? 垃圾回收機制他也擁有。但是令我比較驚訝的是它的例外處理,他不像目前的語言,一遇到錯誤就只是丟個訊息,然後程式結束,lisp它似乎會讓你進入debug模式的樣子,然後列出一些你可以執行的動作,目前我也才剛碰一兩天而已,所以還無法完整了解,lisp的哲學,必須過一段時間才能領域精髓。




上面是我的開發環境,因為網路上,我看到推薦的幾乎一致是 emacs + slime + your clisp,所以我就用囉,其實最近也在學vim,但是我看到的插件,竟然跟gnu screen配合,這實在是...很悲劇的他沒提供windows版的:( ,當然其實也有不是用gnu screen,純粹用vim buffer的,插件名字是slimv,但是目前還找不到無法使用的原因,目前猜想是我vim支持的python版本的不合的關係,但是我可不想為了這個,而重新去compile一個vim來用...,或許也是其他原因也說不定,只是想要無痛設定開發環境,就用emacs吧 :) 畢竟slime本來就是emacs的插件。


其實如果你不想要為了學lisp而在去安裝emacs、學emacs的話,我有找到一個IDE,方便好用,以供參考allegro common lisp ,但是介面實在是...,如果你不介意介面的話,又不想碰emacs,那就用這個吧 :)


另外這邊記錄一下目前找到的資源,滿意外的lisp,有不少免費電子書而且品質還算不錯!!
我想看完這些就差不多了吧 :)

2013年9月13日 星期五

初嘗vim

其實很久以前就常聽人說,高手都用vim,但是我一直以來就不怎麼信這套 :) 但是最近常看一些論壇,偶然看到一些愛用編輯器或IDE排名,vim遙遙領先....emacs雖然是第二名,但是票數卻落後滿多的,sublime text則是第三名,票數跟emacs滿接近的,sublime會有這樣的票數,其實我不意外拉 :) 因為自己就很愛用sublime text理由大概有這些
  • 界面十分簡潔和漂亮
  • plugin很多很強大
  • script language是用python
  • 開起速度很快,體積輕巧
還有很多,有興趣的就看看吧 sublime text

哈有點離題 :) 我會突然想用用看vim的原因是就我看看emacs和vim的差別,其實我覺得emacs遠遠強於vim,它可以做的事太多了,我只能說emacs已經不能算是editor了,而且他的腳本語言是用lisp的方言,一個很有趣的語言,只是目前我也沒涉略太深就是了,但是vim有其吸引人的地方,我覺得他強調的特色是快速編輯,他的快捷鍵設定方式比較方便,相較之下emacs則是用到大量的ctrl、alt來結合,老實說這樣對於打字速度的確會慢下來,我想或許是這樣差異讓比較多人選擇vim吧,當然還有一些決定性的原因,但是就不一一列出來了,我就是因為快捷鍵和體積輕巧而從兩者間選擇vim來玩玩,來看看他到底有什麼魅力?

首先就到這邊下載vim,這邊有事情要注意的是,我平台是windows,要是你直接用網站上提供的windows installer,那到是一切順遂,不用擔心其他問題,但是如果你像我一樣選擇官方事先幫你built好的檔案(因為我想要portable版),會有個問題那就是,這個vim並沒有python surpport,意思是你沒辦法用python來custom vim,只能乖乖用vimscript來寫,這也代表你用的plugin也不能是用python寫的,因為沒support,要是你覺得沒差那就用吧 :)

所謂的支不支持,輸入:version就可以看出來了如下圖

有+表示支持。

下載下來後,當然就要去安裝一些好用的plugin,我想第一個要安裝的應該是 pathogen
這個東西的作用就跟sublime text的package control一樣,管理你的插件,如果你不安裝這個也行,那就是你得手動慢慢安裝插件,把什麼檔放到什麼資料夾中....,到時候想要刪除該plugin嘿嘿也頗麻煩 :)

再來我安裝的是 nerdtree ,就是一個file browser,不解釋 :)

這是我目前vim的樣子


另外我還安裝一個東西,叫做 conque ,這個讓你vim buffer來做為一個terminal emulator,滿方便的東西,這功能emacs本身就有,若是你沒在在意,快捷鍵設定的方式,那就用emacs或sublime看看吧,而且兩者都有提供"一定程度"的vim快捷鍵。

目前用起來,就是還有好多快捷鍵要去記... 而且就算是我努力調整vim介面後,我還是感覺sublime text介面完勝阿,讓我動不動就關掉vim換sublime text:)  可能是我一直以來用sublime text,一個短暫時間沒用他,就開始想念它了吧。

往後發現有什麼需要記錄的東西,在來PO

2013年9月10日 星期二

vector of pointer to datatype

最近開始回去用C++,乎~真的是久沒用,除了打code時忘了用 ; 來結尾,還有忘了打 { }(因為太習慣python了...),另外對於一些C++ compiler背後運作的方式都有點生疏了,像是一些關於繼承方面會用到的語法xxx: public virtual xxx,虛擬繼承的東西,為啥會有這種東西的存在我不用多說吧? 有興趣就google: c++ diamod problem。


今天是想要記錄一些比較瑣碎的東西,以前我在用std::vector的時候,從來都沒有用資料型態是指標的,所以就沒有注意到一個問題,那就是如下code所示

class animal
{
public:
    animal()
    {
        cout<<"create default"<<endl;
    }

    virtual ~animal()
    {
        cout<<"delete default"<<endl;
    }

};

class dog: public animal
{
public:
    dog()
    {
        cout<<"create dog"<<endl;
    }

    virtual ~dog()
    {
        cout<<"delete dog"<<endl;
    }
};


class cat:public animal
{
public:
    cat()
    {
        cout<<"create cat"<<endl;
    }

    virtual ~cat()
    {
        cout<<"delete cat"<<endl;
    }
};



int main()
{
    vector<animal*> obj;
    obj.push_back(new cat());
    obj.push_back(new dog());


    //vector<animal*>::iterator
    //sintax sugar auto
    for(auto it=obj.begin(); it!=obj.end(); ++it)
    {
        delete *it;
    }
    cout<<"..."<<endl;
    return 0;
}

今天我宣告一個baseclass名為animal,然後有兩個class去繼承他分別為cat和dog,用這樣是為了來做一個upcasting的例子而已,其實這樣的做法是有其方便的地方,假如你今天在做一個遊戲,想當然爾需要常常用到Draw(...)來render物件吧,那麼這時候upcasting這種方式就可以出來耀武揚威了:) 你可以宣告一個interface裡面有draw(),然後繼承該class的class也必須分別implement它們各自的Draw的內容,那麼接下來你就可以用
vector<xxx*> obj
for(.......)
{
    obj->draw();
}

其實今天想要說的東西是,當你用vector<xxx>,xxx這是指標型態的時候,千萬要記得事後自己要delete掉,像我上面code那樣,vector只是幫你handle那些指標占掉的空間,而不會幫你清掉你new的東西,不信你就把我用來delete的那行去掉,看看程式執行會不會有跑出delete的訊息。

第二件想要記錄的是,C++11有個關鍵字叫auto,感覺真棒,一個很棒的sintax sugar,雖然沒有這東西,你也可以用typedef來達到類似功能,只是直接用auto是更爽的一件事 :)