OCP(Open-Closed Principle)

敏捷軟體開發:開放封閉守則

要對擴充保持開放,對修改保持封閉。

要假設你所設計出來的系統,是可以額外增加程式碼來擴充系統時常變更的功能。而且假設你的程式不能被更改。

就像設計一個函式庫,不能假設使用者要來修改妳的函式庫的原始碼,這樣會造成程式來源不一,版本變更後不相容的情況。

但要對某項時常變更的部份保持開放,例如 排序 的函式庫,通常都會開放「比較的實作」,因為他時常會變更,你可以自己寫一個比較的函式然後當成參數傳進去排序演算法,來讓排序演算法的核心行為改變。

為什麼要當參數傳呢?因為:

  1. 讓此函式有擴充的彈性。
  2. 不可以修改排序演算法已經寫好的結構與原始碼。

Web

在設計 Web 的系統時,通常要先瞭解這個系統需要變更的地方在哪裡,然後替這些地方寫成可以擴充,例如一個內容管理系統,以 drupal 為例,他的核心就是頁面,每一個頁面可以視為一個 node ,而他需要擴充的地方在 node 的形式,node 最基本可能是一個文章,也可以被擴充成相簿、相片、投票、留言版,這就是內容管理系統需要被擴充的地方。

所以要把他寫成,基於 node 以後,我可以自己寫一些程式來改變 node 的管理介面,顯示介面。來讓整個 node 被擴充成完全不一樣的形式,又或許可以在現有的所有 node 的生命週期上設計一個 hook 來改變 node 的行為。

例如可以掛 php 或 js ,掛 js 是很 powerful 的,你只要隨便在一個頁面上掛載你的 js 你幾乎可以做任何的事,但…能力越大責任越大,這個彈性會讓你因此而需要確保每個頁面的行為不會因此被你影響到,需要做很多的檢查來確保你在每頁所做的事都不會影響到其他程式。因此最好要有一個類似沙盒的環境來跑這隻 js 限制他所能做的事,來確保不會被某隻兔崽子把牆壁弄破…,整個房子都進水。阿 颱風要來了………

 

驅動程式免硬體開發實踐

最近在補充驅動程式相關的知識,實際上的練習其實是有點麻煩的,因為你真的要有實際的硬體比較方便你練習實作,而我又是用手驅動腦學習的實踐者…,所以就思考到要怎麼作這件事。

現在其實 CPU 與硬體週邊都有 qemu + kvm 這套很不錯的模擬器可以用來練習安裝與開發核心了,但是裡面都是一堆已經改好的驅動,還是不知道該怎麼下手。

以我目前的理解裡面最簡單又實際的驅動應該是 GPIO 的開發~,所以想到如果可以有一個工具可以在 qemu 裡面模擬 GPIO 裝置,然後可以用一個 app 來觸發這個裝置的中斷或值的改變,這樣應該不失為一個很完整的練習環境吧…!

而且如果能自己設計調整外部裝置的一些訊號狀態,應該更能增進開發者軟硬整合之間的知識~

 

 

fedora 15 播放器與解碼器 h264, mkv , sub

fedora 內建都沒有影音解碼器,要自己裝~

播放器內建的也有點遭~主要裝完下面兩個 repos 就能 yum 裝一些非官方的解碼器了。


$ rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
$ rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

播放器部份則是 smplayer 的字幕支援最好,其他的 mplayer kmplayer 在字幕的編碼跟選擇上都有一些問題,只有 smplayer 都 ok,這個可以用 yum install smplayer 就能裝了


$ yum install smplayer

然後缺什麼解碼器應該在播的時候瀏覽器就會提示你要裝了,但是前提是裝了上面兩個 repos 才有辦法找到~

http://linuxpoison.blogspot.com/2009/06/multimedia-support-in-fedora-11.html

fedora vnc

內建有簡易的 gui 管理介面的遠端桌面伺服器是 vino-server port 是 5900,qemu-vnc 的 port 也是從 5900 開始,不知道去哪改。

fedora 內建的 xrdp 沒有像 ubuntu 在 /etc/xrdp/xrdp.ini 裡面有一堆設定,只有預設的 session man ,他會一直開 session 。。而且不能指定你要登入哪個 session,所以我灌了一個 x11vnc 來跑本地畫面的 vnc ,藉由 libvnc.so 來轉介 vnc 服務,猜是安裝 vnc4server 以後才有的。

然後透過 xinetd 來自動啟動 x11vnc。

service x11vnc
{
flags = REUSE NAMEINARGS
port = 5950
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/tcpd
server_args = /usr/local/bin/start_x11vnc
disable = no
}
#!/bin/sh

authfile=<code>ps wwaux | grep '/X.*-auth' | grep -v grep | sed -e 's/^.*-auth *//' -e 's/ .*$//' | head -n 1</code>

if [ -r &quot;$authfile&quot; ]; then
exec /usr/bin/x11vnc -inetd -o /var/log/x11vnc.log -display :0 -auth &quot;$authfile&quot; -many -bg -xkb -ultrafilexfer -users mlwmlw -rfbauth /home/mlwmlw/.vnc/passwd -noxrecord

fi
exit 1

幫 xrdp 加入一個新的項目,這樣就可以用 window reomote client 連哩

[screen]
name=console
lib=libvnc.so
username=n/a
password=ask
ip=127.0.0.1
port=5950

參考資料: