TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2009年3月25日 星期三

Khopper 架構說明

有點久之前和 yen3 提到我想和人共同開發的東西,這裡寫出其中一個,說明架構,也算是留個紀錄吧。
本程式的架構如圖:

上層模組依賴下層模組,下層模組不會使用到上層模組。粗框代表有plugin介面可擴充。
以下就各模組做說明。
Graphic User Interface:
很明顯,就是使用者介面。除了使用Qt之外沒什麼好提的。
Album:
用來描述音軌資料的模組。
主要構成是 Track 和 Index 這兩個 struct。Index 用來表現時間資訊,因為它經常需要單位轉換,運算,故分離出來。Track 則用來裝載音軌的資訊。
CUESheet 則是使用 regex 來解析 cue 檔案的 struct 。
這個模組尷尬的地方在於字串的編碼,因為上層 GUI 的字串統一為 Unicode,但是下層解出來的資訊則是編碼過的字串;目前的重點就是讓它可以很順暢地和上下層溝通。
Panel:
控制輸出格式的使用者介面,為了擴充性而做成 plugin。
它提供輸出格式的選項,並根據選項生出合適的編碼器,轉交給上層進行轉檔。
目前內附有 mp3 的輸出控制。
Codec:
執行音訊解碼編碼的模組,也提供 plugin 擴充,但是較為複雜。
由於 Reader 和 Writer 基本上架構相同,在這裡只說明 Reader,Writer 就比照辦理。
Reader 提供了 AbstractReader 做為抽象介面,客戶若要擴充則必須繼承並實作它。
它要利用 ReaderFactory 這個物件工廠來生成具象物件,客戶必須註冊一個識別字給這個工廠,通常是格式的副檔名,上層模組就是依照這個識別字來產生物件。
若工廠找不到識別字所對應的產品,就會自動使用預設的編解碼器,其識別字為 "*"。
由於 Qt 的 plugin 只能夠產生一個實體,因此 plugin 的本體並不是 Reader 本身,而是一個索然無味的 class ReaderCreator,裡面只有一個成員方法,用來生成 Reader。
總結來說,若要擴展 Reader,增加新格式支援,你必須:
1.繼承 AbstractReader 並覆寫所有 pure virtual function
2.繼承 ReaderCreator 並覆寫 create() 讓它回傳修改過的 Reader:
MyReader * MyCreator::create() const { return new MyReader; }
3.註冊生成器給 ReaderFactory ,己有提供一些函式方便處理;在全域宣告:
const bool reg = registerReader( "mp3", "krp_mp3" );
其中 "mp3" 是程式中使用的識別字,"krp_mp3" 則是 Qt plugin 的名稱,如此一來只要使用:
Reader * r = createReader( "mp3" );
即可取得擴充的物件。使用者不需要了解你擴充的全貌。
以上的做法都是為了讓 Codec 和 Panel 對其他模組的耦合降到最低,事實上就算沒有 Codec 和 Panel 的 plugin,主程式也可以執行,只是不能編碼,也不能解碼。若要擴充也不需更動主程式的程式碼。
Common: 集中了各種雜項工具。
text.hpp 裡放置了各種字串處理函式。
tr1.hpp 是為了調整各編譯器對 TR1 和 C99 支援的不同。
os.hpp 裡放的是依各平台不同實作不同的函式,Linux 上就用 linux.cpp 實作,Windows 就用 windows.cpp 實作。
error.hpp 宣告了異常的基礎類別。
class ErrorBase : std::exception {};

template< typename ErrorType >
class Error : public ErrorBase, public ErrorType {};
ErrorBase 是為了避免 template 造成的隱式程式碼膨脹,ErrorType 則提供一個可訂製點和識別型態。你可以自定義一個型別 NewError,再使用 Error 即可獲得一個新異常類別。
Ablum、GUI 編成執行檔(static link),MP3Panel 和預設的編解碼器為 plugin(dynamic load),Common、Codec、Panel 都包在同一個 dll(dynamic link),因為這三個模組會同時被 plugins 和主程式使用。
大致上是這個樣子...以上有講到一些實作細節,但那是不可靠的,我有可能隨時更改;大致架構則很難再改變,從去年最初交上去的版本開始架構就是這樣,只是擴充方式從靜態編譯變為動態載入,但是程式碼本身卻幾乎全換。
目前比較不穩固的就是 Reader 和 Writer 的介面,兩個都是用 Template Pattern 的方式設計,但是我不確定是否夠通用。
另外 header 似乎也該整理一下...有點雜亂。

2009年3月12日 星期四

Watch out the destructors of super classes

在 C++ 中,如果設計者沒有發生失誤的話,通常可以由 destructor 的宣告來判斷該 class 對繼承的態度:

public and non-virtual

此類 class 不打算讓任何 class 繼承它,繼承可能會導致錯誤行為。

public and virtual

此類 class 提供了多型的特性,並且預期到會有 subclasses 的使用;使用指標刪除物件是安全的。

protected and non-virtual

較為少見,此類 class 提供了介面給 subclasses ,但是卻不希望客戶使用 super class 的指標進行刪除,也不希望客戶具現化出 super class 的實體。

private

這個 class 完全是為了戰術應用而生的,如 Singleton 等;它應該要自己解決生命週期的問題。
說是這麼說啦,不過現在我看過的 code 都是用 public ,只有 virtual or non-virtual 的差別而己。
像是 policy classes 的 destructor 就用途來說似乎都該是 protected and non-virtual ,因為沒人會用 pointer of super class 去刪除它們,也不太可能被實體化。
雖然說語法也只是買保險,真正想亂搞的話誰都擋不住。

2009年3月10日 星期二

エルフェンリート--劇場予告風

比之前我收過的一個偽預告做得還有FU,不過幾乎把重要場面都剪進去了。說起來也太多偽作,連主題曲的完整版都是自己湊出來的...

2009年3月8日 星期日

又要我裝防毒軟體

該怎麼說呢 ... 我一直都是相信「洞」都是使用者自己開的,所以再怎麼強的防毒軟體,只要使用者一根手指就廢了。因此我後來都沒在自己的電腦上裝過防毒軟體,一方面是以前裝的時候它沒幫我擋下多少病毒,反而一直阻撓我連線,另一方面是我使用 Linux 的時間比較長。
現在家裡又要我幫她們裝防毒 ... 實在是提不起勁,反正到時候回來又變得七七八八的。而且新手超幸福的,只要說「我不會」、「我不懂」就好了。以為只要有防毒就天下太平的心態才是一直中招的源頭 ...
我也不會啊 ... 都幾年沒裝過了,還要去找什麼註冊碼,煩死人了。

2009年3月5日 星期四

Brief of some KDE4 application

注意,以下文字包含本人大量的偏見、武斷及胡言亂語成分
KDE4差不多也快用一年了,以下列出我有用過一段時間的KDE4應用程式,並予以評分[?],順序無任何意義,且不包含未釋出正式版的程式:
AmaroK 2
評價:一
我沒給它零分是因為它還是會發出聲音,不過也僅止於此。沒有和iPod整合得很好,某些檔案無法播放,加上常常原因不明地停止播放,可以說是 KDE3 移植到 KDE4 的應用程式中最失敗的一個。
基本上我看不太出來從 alpha 到正式版有什麼差。
KTorrent 3.2
評價:四
雖然在 beta 時經常會 crash ,不過在正式版釋出之後就完全正常了;內附的 torrent search 也不錯用。
Plasma
評價:三
有點微妙。
由於某些 widgets 可能是地雷[!],因此也不能完全怪 plasma 本身,這個設計本質上是好的,只是要看各元件的品質以及個人習不習慣。
KRunner
評價:五
少數從 KDE3 到 KDE4 後評價上升的部分。利用 Alt+F2 就可以使用鍵盤捷徑,範圍包括:應用程式啟動、開啟特定路徑、Konqueror 書籤、計算機、單位換算 ... 等,還有更多!切到其他系統還會覺得怎麼找程式有點慢XD
Konqueror
評價:三
說實在地,它還是沒有很穩定。那麼它的優點是什麼呢?字型的渲染比較好看,且和KDE其他應用程式接得比較完整。
KGet
評價:四
沒什麼大問題的檔案下載器。
Dolphin
評價:四
絕對比 Konqueror 還優秀的檔案管理程式,重點是還有嵌入式終端機可使用。
Kate
評價:四
也是很平滑地移植過來的進階文字編譯器,並在 4.2 之後重新加入了一些有用的 plugins。
Kopete
評價:三
偶而會連不上 MSN ,傳送檔案常發生事故,不過這可算是非戰之罪吧。
Okular
評價:四
很完整的 pdf 和 chm viewer,缺點是需要字型外掛時會找不到字型。
KSnapshot
評價:五
非常好用的抓圖程式,還可以以視窗元件的方式抓圖。
大概就是這樣,沒列出來的不是我不常用就是太甘草,沒什麼變化的。