2010年6月20日 星期日

[DesignPattern] 觀察者模式 (Observer Pattern)

觀察者模式 (Observer Pattern) 定義了物件之間的一對多的關係,當一個物件 (subject/observable) 改變狀態,其他相依物件都會收到通知並做更新。

原則:
  • 設計時盡量讓需要互動的物間之間關係鬆綁(loose-coupling)。讓兩物件可以不知道彼此的實作細節,但透過已知的共通介面互動。

  • 例子:氣象觀測站
  • WeatherData 實作 Subject 介面(或者 java.util.* 中的 observable 介面)讓觀察者(Observer)可以隨時向他註冊(訂閱)新的消息通知,或者取消訂閱。一旦他的狀態改變時,會呼叫 Observer 的 update() 來通知他們有更新發生。
  • 消息的通知又可分為 push 與 pull 兩種,前者由 Subject 把所有資料廣播給所有 Observers,後者只是通知更新,Observers 自己用 Subject 提供的 getter 取得所需的資料。

  • 關係圖:
    (... 閱讀「[DesignPattern] 觀察者模式 (Observer Pattern)」全文)

    [DesignPattern] 策略模式 (Strategy Pattern)

    Strategy Pattern (策略模式) 定義了演算法家族,個別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變動獨立於使用操作的物件之外。

    原則:
  • 把應用中可能變化之處獨立出來,不要和那些不會變化的程式放在一起。
  • 針對介面寫程式,而非針對實踐編程:把實現的部分獨立出來,利用介面做連結,方便以後抽換。(而非透過繼承完成抽象類別的實作)
  • 多用合成(composition),少用繼承:合成是 has-a 的關係,某個物件中有另一個物件作為他的行為。

  • 例子:鴨子
  • Duck 是抽象類別,有各種鴨子繼承它,而在 Duck 之中有兩個行為物件(Quack, Fly),以及 setQuackObj(qObj), setFlyObj(fObj) 的介面可以動態抽換這些行為(演算法)的實作方式。
  • 這些行為(演算法)都是實作 QuackBehavior、 FlyBehavior 介面 (interface) 的類別。

  • 關係圖:
    (... 閱讀「[DesignPattern] 策略模式 (Strategy Pattern)」全文)

    2010年4月27日 星期二

    Solving TPB Package Problem on Ubuntu 9.10

    Here is a solution for ThinkPad button display on ubuntu 9.10.
    I try on my x60 and it works.

    The first thing is installing tpb package on ubuntu, type command:
    sudo apt-get install tpb
    After installing this package, you can press volume up/down buttons, and you would see a bar displayed on your screen. However, if you reboot ubuntu, tpb doesn't work anymore!

    The reason is tpb uses /dev/nvram device which is root privilege only.
    You should change its mode for tpb's access. Don't use chmod command, it will be recovered after rebooting. (I can't figure out the reason)

    Let's add one rule in /etc/udev/rules.d/ folder.
    In this folder, you can check if any rule file (*.rules) describes about nvram, and try to modify it.
    If not exist such file, you can copy a rule file from /lib/udev/rules.d/.
    I copy 50-udev-default.rules file:
    sudo cp /lib/udev/rules.d/50-udev-default.rules /etc/udev/rules.d/
    In this file, append a line in #mem part:
    KERNEL=="nvram", GROUP="nvram", MODE="0660"
    Let nvram in a group named nvram, and use 660 (group read/write) mode.

    Next, we should add the user in this group.
    sudo adduser <your user> nvram
    Restart your ubuntu, your Thinkpad button would work well!

    If you want to modify any settings of Thinkpad buttons, try editing this file: /etc/tpbrc

    Here are some references:
    1. [Linux] ThinkPad 的音量鈕圖示
    2. Ubuntu-Linux on IBM Thinkpad X31
    3. HOWTO: Ubuntu on IBM Thinkpad T42
    (... 閱讀「Solving TPB Package Problem on Ubuntu 9.10」全文)

    2010年1月11日 星期一

    TopCoder Algorithm Tutorials - 基本幾何學(2)

    摘錄自:Geometry Concepts: Line Intersection and its Applications

    給兩點求直線式
    給線上的兩點座標(x1, y1)、(x2, y2),求它們的直線時,把直線表示成 Ax + By = C 的形式。則:
    A = y2 - y1
    B = x1 - x2
    C = A * x1 + B * y1 (或者 A * x2 + B * y2,帶入兩點都會讓原式成立,就可以求 C)
    而 -A/B 是直線的斜率。
    (... 閱讀「TopCoder Algorithm Tutorials - 基本幾何學(2)」全文)

    2010年1月8日 星期五

    [Linux] Commands

    摘錄自: 例行性命令的建立 - 鳥哥的 Linux 私房菜

    at - 執行一次性的工作
    下面這個例子表示五分鐘後顯示 Hello 訊息,但要注意的是:
    1. 有 standard I/O 執行時不會在終端機顯示,而是用 email 的方式告訴執行者。(應該是避免未來執行時終端機有其他工作在顯示訊息,會互相干擾吧?)
    2. 指令中如果有檔案或資料夾相關的操作,最好使用絕對路徑,因為指令的下達與 PATH 變數有關, 同時與當時的工作目錄也有關連。
    at now + 5 minutes
    at> echo "Hello"
    at> <EOT> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!
    這個工作會被存在 /var/spool/at/ 中,等待適當的時間點執行。可用 atq 查詢目前已存在的工作,用 atrm 刪除某個工作。
    /etc/at.allow/etc/at.deny 可以設定能執行 at 指令的使用找白名單與黑名單。
    註:batch 指令讓 CPU 工作負載小於 0.8 時才執行背景任務,需要時再研究。
    (... 閱讀「[Linux] Commands」全文)