Fork me on GitHub

4/26/2011

[DP] Facade 外觀模式



外觀模式 (Facade): 為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一個子系統更加容易使用。

開發過程三階段的外觀模式考量:

1. 設計初期,在三層架構 (MVC) 中,在 資料存去層和業務邏輯層 以及 業務邏輯層和表示層 之間建立外觀模式,為複雜的子系統提供一個簡單的介面。

2. 開發過程中,子系統會變得越來越複雜,產生越來越多的類別,這些類別彼此互相依賴,外部調用十月來越加困難,這時可以加入 Facade 提供一個簡單介面。

3. 維護一個遺留的大型系統,但其已經非常難以維護和擴展。但是開發又必須要依賴於它。可以為新系統開發一個 Facade 類別,把高度複雜的遺留程式包裝成較清晰簡單的介面,讓新系統和 Facade 物件互動,Facade 則與所有遺留程式互動。

參考資料:大話設計模式

... ...

[DP] Proxy 代理模式



代理模式(Proxy): 為其他物件提供一種代理以控制對這個物件的存取。在存取物件時引入一定程度的間接性,因為這種間接性,可以附加多種用途

應用場合:

1. 遠端代理:為一個物件在不同的位址空間提供局部代表。這樣可以隱藏一個物件存在於不同位址空間的事實。

2. 虛擬代理:根據需要建立消耗很大的物件。透過他來存放實體化需要很長時間的真實物件。

3. 安全代理:用來控制真實物件存取時的許可權。

4. 智慧參考:調用真實的物件時,代理處理另外一些事。


參考資料:大話設計模式

... ...

4/18/2011

[iOS] 在 UITabBarController 中放置 UINavigationController

1. 建立一個 Window-based application
2. 在 AppDelegate .h 檔中宣告一個 UITabBarController property
3. 在 AppDelegate .m 當中 [self.window addSubview: [tabBarController view],記得 synthesize 和 release properties
4. 打開 MainWindow.xib 從 Library 拉一個 TabbarController 進來
5. 選取 MainWindow.xib 當中的 AppDelegate 將 UITabBarController property 和 剛剛拉進去的 TabbarController 連結起來
6. 點選 MainWindow.xib 當中的 TabbarController,打開 inspector 將其中一個 tab 的 view controller class 設定成 Navigation Controller
7. 加入新的 ViewController files (不含 xib) 並將繼承改為 UINavigationController
8. 在 AppDelegate .h 檔中宣告一個 第7步 ViewController 的 property,並在 .m 檔中 synthesize 和 release
9. 加入新的 ViewController files (含 xib) 作為 NavigationController 的 rootViewController
10. 將 MainWindow.xib 當中 TabbarController 裡頭的 Navigation Controller 的 class 設成 第7步 加進來的 View Controller
11. 將 MainWindow.xib 當中 TabbarController 裡頭的 Navigation Controller 裡頭的 View Controller 設成 第8步 加進來的 View Controller

參考資料:iPhone 軟體開發筆記: 產生含有 Navigation controller 的 Tab bar controller

... ...

[DP] Bridge 橋接模式



橋接模式(Bridge):將 抽象部分它的實現部分 分離,使他們都可以獨立的變化。

實現系統可能有多角度的分類 (如果用繼承來思考,可能拿哪一種角度當做父類別都不恰當),而每一種分類都有可能發生變化,那麼就把這種多角度分離開來,讓它們獨自變化,減少它們之間的耦合。

當我們發現需要多角度去分類實現物件時,只用繼承會造成大量的類別增加,不能滿足開放-封閉原則時,就應該要考慮使用橋接模式。

選擇一個角度當做抽象部分,另外一個角度則以 抽象實現 聚合進 你選定的主抽象部分,兩者都可以隨變化應變

物件的繼承關係是在編譯時就已經定義好了,所以無法在執行時改變父類別繼承的實現。子類別的實現與其父類別有非常緊密的依賴關係,以至於父類別實現中的任何變化必然會導致子類別發生變化。當需要複用子類別時,如果繼承下來的實現不適合解決新的問題,則父類別必須重寫或被其他更適合的類別替換。這種依賴關係限制了靈活性,也限制了複用性。

合成/聚合 複用原則:儘量使用 合成/聚合,儘量不要使用類別繼承。使用繼承時,一定要在是 is-a 的關係之下才用,而不是任何時候都用。

參考:
1. 大話設計模式
2. http://www.jdon.com/designpatterns/bridge.htm

... ...

[DP] Singleton 獨體模式



獨體模式(Singleton):保證一個類別僅有一個實體,並提供一個存取它的全域訪問點。

「可以使用一個總體變數使得一個物件被存取 (1),但它不能防止你實體化多個物件。一個最好的辦法就是,讓類別自身負責保存它的唯一實體。這個類別可以保證沒有其他的實體被建立,並提供一個存取該實體的方法 (2)」

(1) 在用戶端,事先宣告一個變數,檢查其是否為 null,如果為 null 才 create,非 null 則不動作。
缺點:此時考慮該物件實體化的問題落在用戶端身上

(2) 宣告一個 static 的自身(Singleton) 變數,並且將建構式私有化 (private constructor),然後一個 static 的方法 GetInstance() 存取唯一的自身變數。GetInstance() 當中的實現會去檢查自身變數是否已經被建立,「否」則建立返回,「是」則單純返回。

優點:用戶端不再考慮使否需要去實體化的問題,而把責任都給了應該負責的類別去處理

注意事項:多執行緒同時存取 Singleton 類別,調用 GetInstance() 方法,會有可能造成建立多個實體。這時必須給行程 lock 來處理。lock 是確保一個執行緒位於程式碼臨界區時,另一個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的程式碼,則它將一直等待 (即被阻止),直到該物件被釋放。

參考:大話設計模式。

... ...

[DP] Adapter 轉接器模式



轉接器模式(Adapter):將一個類別的介面轉換成客戶希望的另一個介面。Adapter 模式使得原本由於介面不相容而不能一起工作的類別可以一起工作

轉接器模式主要應用於希望複用一些既有的類別,但是介面又與複用環境要求不一致的情況。

Adapter 繼承 Target 於是繼承了客戶需求的介面 (Request 方法),然後在 Adapter 當中包含一個 Adaptee 物件,把 Adapter 的 Request 方法實現為去呼叫 Adaptee 當中的 SpecificRequest 方法,達成轉接之目的。

是軟體就有維護的一天,維護就有可能因不同的開發人員、不同的產品、不同的廠商而造成功能類似而介面不同的情況,此時便是使用轉接器模式的時候。

類別汗方法的命名應該有規範,最好是前期就設計好,介面不相同時,首先不應該考慮使用轉接器,而是應該考慮透過重構統一介面

參考資料:大話設計模式。

... ...

4/15/2011

[RD] 如何使用 libSVM

以下紀錄使用 libsvm 的簡易方法:

注意:假設有 N 類要作 trainning,train_data 的 feature 排列的前 N 個需要由 0 ~ (N-1) 順序排列

  1. 針對訓鍊資料作 scaling, 並且產生 scale 檔案 scale_para

     svm-scale -s scale_para train_data > train_data.scale
    
  2. 利用 scale_para 針對測試資料作 scaling

     svm-scale -r scale_para test_data > test_data.scale
    
  3. 找出較佳的 -c 和 -g 參數給 svm-train

     grid.py train_data.scale
    
  4. 產生一個 model 檔案

     svm-train -c 2.0 -g 0.03125 -t 2 -b 1 train_data.scale (train_data.scale.model will be generated)
    
  5. 運用該 model 檔案針對測試資料作預測

     svm-predict -b 1 test_data.scale train_data.model train_data.scale.out
    

svm.h 和 svm.cpp 可以在 libSVM 包當中找到!程式碼當中用這兩個檔案把 training 好的 model load 進來,並且做分類!

參考資料:

  1. LIBSVM – A Library for Support Vector Machines
  2. piaip’s Using (lib)SVM Tutorial

4/05/2011

Ubuntu10.10 sound problem

1. 移除 pulseaudio 套件
2. 改裝 gnome-alsamixer
3. 重新啟動

...

4/02/2011

在 Ubuntu 下手動安裝 Nvidia driver

1. 到 Nvidia 下載對應的 linux 顯卡 driver, 會是個 .run 結尾的檔案

2. sudo gedit /etc/modprobe.d/blacklist.conf
 
加上下面幾行:

blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

3. sudo apt-get --purge remove nvidia-* (移除已經安裝的 nvidia driver)

4. 重新啟動電腦,當系統問你要用低解析度瀏覽嗎,選擇不要,進入指令模式

5. sudo sh NVIDIA-Linux-x86_64-195.36.24-pkg2.run (安裝下載的 driver)

6. sudo /etc/init.d/gdm restart (重新啟動 X server)


參考資料:
1. http://blog.itman.cc/archives/ubuntu-install-nvidia-drivers-manually-on-lynx/
2. http://wiki.ubuntu-tw.org/index.php?title=HowtoInstallGraphicsDriver

...