1. multiprocessing with map

    參考

    一般來說,會利用 Producer/Consumer 來處理 Multithread。

    '''
    Standard Producer/Consumer Threading Pattern
    '''
    
    import time 
    import threading 
    import Queue
    
    class Consumer(threading.Thread): 
        def __init__(self, queue): 
            threading.Thread.__init__(self)
            self._queue = queue
    
        def run(self):
            while True: 
                # queue.get() blocks the current thread until 
                # an item is retrieved. 
                msg ...

    Read more...


  2. Observer Pattern

    用的時間點

    observer是觀察的人,也就是觀察者的意思。 當被Observer Pattern列入觀察名單的狀態發生變化,就會通知觀察者。在寫一些跟狀態變化有關的處理時,Observer Pattern是很好用的工具。

    如何設計

    重點在於設計Observer Interface以及有具體實作的Observer類別。另外,也需要設計被觀察者。

    程式範例

    觀察者觀察產生多個數值的物件,然後輸出該值,輸出方式因觀察者而異。在這個範例中,有用數字來輸出的觀察者以及用長條圖來輸出的觀察者。

    在 Observer Interface 中,呼叫 update 方法的是產生數值的 NumberGenerator ( generator 是 "產生器" "產生設備" 的意思)。update 方法是 NumberGenerator 用來告訴 Observer 說 "我的內容已經更新過了,請你也更新你的輸出內容" 的方法。

    Subject (被觀察者) 參與者

    表示被觀察的一方。Subject 參與者具有登錄或刪除 Observer 參與者的方法 ...

    Read more...


  3. Prototype Pattern -- 複製建立物件個體

    用的時間點

    如果利用 new 建立物件個體時,都必須指定類別名稱。但有時候會需要不靠指定類別名稱的方式就能產生物件個體,此時不是利用類別建立物件個體,而是複製物件個體另建一個新物件個體,通常發生在以下的情況:

    1. 種類過多無法整成類別時: 若需處理的物件種類太多,如果要一個個設定成不同的類別,需要產生大量的原始檔。

    2. 不容易利用類別產生物件個體時: 該物件個體的產生過程太複雜,很難利用類別來建立。假設現在有一個物件個體是使用者在圖形編輯軟體下利用滑鼠操作而產生。要想以程式來產生這樣一個原本是使用者操作所建立的物件個體,其實不容易。如果是在已經有一個以使用者操作的方式產生的物件個體,還想再建立一個相同物件個體的情形時,應該先把已產生的物件個體暫時儲存起來,等到需要產生時再複製即可。

    3.希望把框架和所產生的物件個體分開時: 希望讓產生物件個體時的框架不會只存在在某些特殊類別時。遇到這種情形時,就不能沿用指定類別名稱產生物件個體的作法,應該預先把用來當作雛型的物件個體登錄進去,再以複製已登錄物件個體的方式來產生物件個體。

    從一個現有的物件個體建立另外一個新物件個體有點像是到麵包店指著玻璃櫃的某種甜點,跟老闆說我要這個的感覺。雖然不知道甜點叫什麼名字,也不知道這種甜點的作法,但只要一指眼前的甜點,還是可以買到跟這個相同的東西。

    如何設計

    不是利用類別產生物件個體,而是從一個物件個體產生出另外一個新物件個體。

    程式範例

    為字串設計外框。

    Prototype 參與者

    Prototype ...

    Read more...


  4. Proxy Pattern

    用的時間點

    proxy就是代理人的意思,不需要本人親自去做的事情,就交給代理人去做。代理人是代替忙到無法自己動手的本人去處理工作。

    如何設計

    代理人以及本人都是物件。

    程式範例

    這次的範例是一個把字串輸出到畫面上的列表機。由 Main 類別產生 PrinterProxy 類別的物件個體。 該物件命名為 Alice,並將此名稱輸出到畫面上。 然後改名為Bob, 且輸出該新名稱。 在命名和取得名稱的階段都還沒有產生真正的 Printer 類別(就是本人個體),命名和取得名稱的部份由 PrinterProxy 代理執行,最後呼叫 print 方法進入真正執行列印的階段,才由 PrinterProxy 類別產生 Printer 類別的物件個體

    PrinterProxy 以及 Printer 類別要一視同仁,故須定義 Printable Interface。

    這個程式範例的前提要件是產生 Printer 類別的物件個體會花很多時間。 為了表現出費時的感覺,所以從建構子故意呼叫 heavyJob 方法。

    Subject 參與者 ...

    Read more...


  5. Singleton Pattern -- 唯一的物件個體

    用的時間點

    通常我們在啟動程式時,就會產生許多物件個體。拿代表字串的 java.lang.String 類別物件個體來說,每個字串都會相對產生一個,所以如果某個程式內含 1000 個字串,就會產生 1000 個物件個體。

    不過,有時候難免會有 讓這個類別的物件個體只產生一個 的需要,像是用程式來表現在程式中絕對是獨一無二的某個部份。好比說,表現電腦的類別或是表現視窗系統的類別等等就是最經典的例子。

    如何設計

    Singleton 是指只有一個元素的集合,就是因為它只會有一個物件個體。

    程式範例

    設計一個只有一個物件個體的類別。

    Singleton 參與者

    Singleton Pattern 只出現一個 Singleton 參與者。 Singleton 的參與者具有 static 方法可取得唯一的物件個體。這個方法永遠都會傳回同一個物件個體。

    優點

    在很多情況下,如果有一個以上的物件個體時,由於物件個體彼此之間的影響,可能會發展成出乎意料的 bug。Singleton Pattern 確保程式設計師不會不小心多產生物件。

    問題 ...

    Read more...


  6. 解決ubuntu上面麥克風沒聲音的問題

    在ubuntu上面使用skype的話,有時候會發生麥克風沒有聲音的問題。 這時候可以使用

    alsamixer
    

    或者是

    gnome-alsamixer
    

    來調整麥克風的聲音。 如果再不行的話,就使用

    gstreamer-properties
    

    調整input或者是output。

    Read more...


  7. 利用 squid 及 pam module 建立 proxy server

    以下是 squid3 的設定方式

    • 首先修改 /etc/squid3/squid.conf,找到下面這幾行,把註解取消掉,有些則是要自行加入。

      在 auth_param section 中:

      auth_param basic program /usr/lib/squid/pam_auth
      auth_param basic children 5
      auth_param basic realm Squid proxy-caching web server
      auth_param basic credentialsttl 2 hours
      

      在 acl section 中:

      acl pam proxy_auth REQUIRED
      acl password proxy_auth REQUIRED ...

    Read more...


  8. State Pattern

    用的時間點

    用類別來表示 "狀態" 。

    如何設計

    以類別來表示狀態之後,只要切換類別就能表現 "狀態變化",而且在必須新增其它狀態時,也很清楚該編寫哪個部份。

    程式範例

    假設現在有一個會隨著時間改變警備狀態的金庫保全系統:

    • 有一個金庫
    • 金庫有跟保全中心連線
    • 金庫有警鈴和一般通話用的電話
    • 金庫有時鐘,監視目前的時間
    • 白天是9:00-16:59,晚間為17:00-23:59以及0:00-8:59
    • 只有白天才能使用金庫
    • 在白天使用金庫時,保全中心會保留使用紀錄
    • 若晚間使用金庫時,保全中心會接到發生異常現象的通知
    • 警鈴是24小時都可以使用
    • 一旦使用警鈴,保全中心會接收到警鈴通知
    • 一般通話用的電話是24小時都可以使用(但晚間只有答錄機服務)
    • 在白天使用電話時,就會呼叫保全中心
    • 若晚間使用電話時,則會呼叫保全中心的答錄機

    State 參與者

    State 表示狀態。規定不同狀態下做不同處理的介面。這個介面等於是一個不同狀態所做處理的所有方法的集合。例如 State 介面。

    ConcreteState 參與者

    ConcreteState ...

    Read more...


« Page 4 / 13 »