2013年8月8日 星期四

C語言中,在呼叫函數前和呼叫函數後,執行某段程式碼

    gcc 有很多強大的選項,可以讓我們作到一些特別的事情。假設我們希望每次呼叫函數前,都先執行特定的動作。我們可以這樣寫。


在 C 語言中,發生錯誤時,顯示 backtrace

    在很多語言中, 如 python, java 等,當程式遇到錯誤時,他會顯示 backtrace( 就走到目前函數位置的呼叫流程)。在 C 語言中,預設只會出現錯誤訊息,就沒了。

    不過在 linux 下,你可以使用 catchsegv 來顯示程式錯誤時的 backtrace。用法大概向這樣
catchsegv ./a.out

2013年7月6日 星期六

python 的 gc ( garbage collection) 演算法介紹

    最近無聊看了一下 python 的 garbage collect 的實作。還蠻簡單易懂的。 python 回收沒用的物件,主要是靠參考計數 (reference count)。然而,他無法解決自己參考自己或是參考循環(a 參考 b, b 參考 a)的問題。這篇文章是講 python 如何解決這個問題。

2013年6月15日 星期六

在 python 中呼叫 java,JPype 簡介

    之前我以為如果要在 python 中呼叫 java lib ,只能用 jython。然而查了一些資料,發現有些神人已經幫我們做好在 CPython 中呼叫 java lib 的方法,JPype 可以幫我們完成這個神奇的需求。


2013年6月9日 星期日

以 html5 撰寫 單機(離線)程式,以 pyside 與 qwebkit 為例。

    現在 html5 蔚為潮流,而 html5 也將觸手伸向單機程式。新的 html5 技術可以使用 ApplicationCache 來達成。而 XULRunner 又是令一個技術,讓你可以用寫網頁的方式來寫單機程式。用 pyside 加上 qwebkit 也可以達到類似的應用。事實上,pyside 加上 qwebkit 的作法不過是作個客製化瀏覽器而已。

2013年6月2日 星期日

如何在 C 語言中模擬繼承與多型

    在 C 語言中,並沒有繼承與多形。然而,我們可以利用一些方法來模擬繼承與多型。在開始講之前,我們先來看看電腦如何取得變數的值。

2013年5月8日 星期三

python 中 is 和 ==(等於) 的差別

    在很多程式語言中,相等的意義有兩種意涵,一種是指那兩個變數實際上是指向同一個物件,另外一種意涵是雖然他們不是相同物件,但是他們的值一樣(什麼叫做值一樣,可以自己寫函數定義)。在 java 中,我們用 == 還比較這兩個變數是否指向相同物件,而使用 object.equal(other) 還比較兩個變數物件的值是否一樣。 在 python 中,則是使用 is 這個關鍵字來判斷這兩個變數是否指向相同物件,而使用 == 來判斷兩個變數物件的值是否一樣(值是否一樣由 __eq__ 這個函數定義)

2013年5月4日 星期六

pdb 的運作原理

    要了解 python debuger 的運作方式前,需要先了解 python 如何實作 function call。在 C語言中,每個被呼叫函數都有自己的 call stack拿來存放區域變數之類的東西。而在 python 中, call stack作用是由 frame object 物件完成。下面是官網對 frame object 的屬性介紹

generator 和 list 簡單比較

這篇文章我第一次發表在 ptt.cc。之後在把它複製過來。下次應該先寫在網誌,在貼 ptt.cc 的 XD

python 的 list comprehension 有分兩種,

一種是[i for i in xrange(5)],這種形式產生出來的是 list

另外一種形式是 (i for i in xrange(5)),這種形式產生出來的是 generator

python yield 語法與 generator 物件介紹

    這篇介紹 yield 語法以及用來維護 yield 行為的 generator 物件。
    事實上,yield 和 return 很像,只是當函數呼叫 return 時,該函數 call stack (python 中是 frame) 就會被清除,程式主導權回到呼叫該函數的手上。 而 yield 會把程式主導權交給呼叫該函數的手上,但是他不會把函數的 call stack 清除,因此下次呼叫時,可以從上次未執行的部分開始執行,而不是重新建立一個新 stack。