Tuesday, August 29, 2006

建築-設計-程式

最近在家當無業遊民的時候
看了不少設計與視覺研究的書
心中倒是真的有點感觸
計算機的發明是為了讓人們的生活更加方便更加舒適的這句話
我想應該很多人並不會贊同吧
自從資訊化了之後
人們的生活更加緊湊
加班趕工反而變成了一種資訊化社會的常態
(我好像又開始離題.....老人症後群又犯了)

自己很喜歡去研究design pattern的程式
因為覺得可以動動腦很好(工作中太多的"大家都是這樣做")
我想自從Christopher Alexander提出design pattern這個名詞後
建築學與現代程式語言的設計開始有了關聯
總覺得一個學問應該是多方面的思索涉獵
往往idea會從你想也沒想到的領域出現
因此我也喜歡看建築設計的書

前陣子看著兩本視覺研究的原文書(還沒看完....我相信烏龜會到終點的)
也覺得介面設計其實涉獵的領域很廣
但是也很籠統,因此往往變成抄襲是最常見的設計
Mac又紅了...多少設計越來越像Mac style
卻很少有人真的去思考設計的真正意函
進而產生自己的設計

在不以engineer為工作的這段時間
確讓我感受到一個software engineer的快樂
我喜歡研究程式
我喜歡看各種的書籍
我喜歡胡思亂想
但請不要問我對那一個產業有興趣
因為我不知道.....或許....我真的不適合當個engineer

Monday, August 28, 2006

GNU的VoIP架構慢慢成型

如果你是Stallman的信徒的話
你一定會常常使用GNU的軟體
雖然大多數的營利單位(好啦...企業...公司...隨便你要如何稱呼)都不喜歡stallman的主張
但是....管他的....反正營利單位賺錢獲利的也不會是小小的工程師
因此我還是很愛GNU的軟體

近幾年來VoIP似乎慢慢從最初的神話變成可能是生活中的科技
因此各大廠商都想要吃這塊肥肉
我想GNU當然不會讓專有軟體橫行霸道
因此GNU Telephony就出現啦

事實上GNU Telephony並不是一個單獨的project
而是將一個VoIP需要的軟體library建構起來
而且更令人激賞的是
他都是用C++的架構來完成所有的library
他可以細分為

GNU Common C++
這個project用來處理一些C++中沒有去定義的行為,譬如說thread的行為、socket、
XML parsing...等等,雖然說有一些其他的project可能以後會變成標準(譬如boost裏面
的thread類別就可能會變成C++ thraed的標準....個人猜測),但是GNU還是把很多C++的
缺憾都給補齊,也是個很棒的project

GNU ccRTP
看名稱也知道他是一個RTP的實現,雖然目前也有不少rtp library(JRTPLIB與oRTP),
但是都有點年紀了,不過我沒試過ccRTP,等試過後在跟大家報告

GNU ccAudio2
我想VoIP有一個很重要的便是audio codec的部份,這個project當然用來處理這個領域
他是一個很棒的project,他建構了一個抽象的基本類別庫,不但可以將codec給分離開
讓你可以自己新增codec進去,他還是一個跨平台的架構(win32用LoadLibrary的機制,
而linux用dlopen...mac也有...不過...ㄏㄏ...看無),在linux上面目前的缺點是他的audio device
現在還是OSS device(不是我看不起OSS...不習慣用啦),不過你當然可以繼承AudioDivice來
作自己的環境....

GNU oSIP與libeXosip
SIP的library,一個是C,一個是他的C++ wrapper,這個project應該已經被大量使用了吧

當然,GNU也有開始VoIP server的project,不過那就是屬於利用這些基本架構實現的部份
如果你對VoIP很有興趣,如果你信奉GNU的信念(ㄏㄏ,營利單位最討厭這些信念),你可以
找個時間好好看看這些project,或許你會從中找到不少樂趣歐。

STL Ring

Ring是一種環狀的資料結構,基本上他是一個頭尾相連的link list,相信在學資料結構的時候都有遇過,在C語言中Ring並不難實作,但是在現在C++的程式架構重視reuse與泛型化的要求下,卻不是一個很好 的做法。其實利用STL的既有template可以讓這個工作更容易做到。

首先因為我們不想重新發明輪胎,因此可以利用STL既有的container: list來實現.....繼續閱讀

Sunday, August 27, 2006

Ring GUI

前幾天試著玩的環狀GUI系統
放了一段video在google video作個紀念
video link here

要完成一個完整GUI還有許多東西要弄
Event傳遞、callback或是signal-slot機制.....等等
等有空再來慢慢玩吧

Friday, August 25, 2006

linux工程師悲哀

最近接連的幾個面試
讓我有非常的感觸
其實台灣大多數的軟體工作都是windows為主
linux的工作並不是那麼多
裏面又許多是linux device driver
因此本來linux的軟體工程師在台灣的生存就不容易

最近的面試中
很多面試主管都有一個相同的論調
雖然他們要找會linux的engineer
但是如果不能全面都可以的話
工程師的value就不高
這裡所謂的value又是指"除了linux外, 你還要作windows programming"
這往往讓我十分挫敗

但是我常常想到
往往一整間的windows engineer都不會linux
那個不算value不高....但是linux engineer不熟windows programming就是value不高
這種的評量標準我常常不能接受
或許windows是市佔率最高的OS
但是若你要找的是linux engineer, 為何要為難他不熟windows呢

今天還聽到一個有趣的說法
因為linux是open source的一個產物
任何人都可以拿到source code去看
因此他是很簡單的
但是windows因為不知道內部如何運作
所以windows的engineer比較厲害
linux的engineer只是去看code而已, windows的engineer卻都是厲害的hacker
我不知道這樣的說法對不對
不過讓我深深的想到
或許我真的不適合當個software engineer吧

認真思考自己的未來.....

Thursday, August 24, 2006

GUI的學問

前陣子看到車用電子展的許多產品
UI設計上大多偏向固定式的UI
也就是以PC software的Button為基本概念做成的設計
因此大家都看起來差不多

想到今天看到PS3的介面畫面
其實在IA的領域裏面的UI應該要更豐富的UI interface
更要脫離PC的操作思維

前天聽到過原本朋友要設計的介面原本是立體環狀
但是似乎是太麻煩了而做罷
想想自己也閒閒
來試試一個簡單的實做

其實比較麻煩的是Ring這類的資料結構
搞了一天....用STL的tempelate解決了這個問題
(改天再說明這個做法吧...晚了....ㄏㄏ)

其實也不會太麻煩啦
只是要看你要不要把engineer resource放在UI設計的工作上
還是讓他"跟別人一樣"就好
我想這是Mac的堅持吧
不過世上有多少Steve Jobs呢
engineer們.....自求多福吧....ㄏㄏ

Thursday, August 17, 2006

C++的Auto Buffer

最近寫了一個小小的錄音程式
因為不想每次只是想錄點小聲音片斷就要執行Rezound這類大程式
加上我的sound daemon是用jack sound server
一堆舊的audio程式根本沒有支援
幹脆自己寫的簡單的小程式

在處理大量資料的時候常常要宣告buffer來儲存
在C語言中動態大量的buffer你用malloc來便可以達成
但是在C++中往往強調程式的靈活與彈性.....繼續閱讀

Tuesday, August 08, 2006

用Scilab代替Matlab來玩Hidden Markov Models

最近一個唸博士班的朋友跟我聊天
他的工作上需要用到matlab來作Hidden Markov Models
但是說實話matlab這套軟體的價格實在不是我們這種小老百姓可以負擔
因此我跟他推荐了scilab這套軟體
我個人覺得scilab替代matlab是沒有問題的
而且他在linux, Mac與windows上都可以跑

很多toolbox也可以找到一些free的code
以HMM為例, 在scilab的官網就可以找到.....Here
不過這個版本已經很久了
有些小地方你可以自己改改
裏面的macro都有sci與bin檔(source與binary)
我試過裏面的bin檔是windows的版本
因此linux的朋友要重新建立bin檔

他裏面有一個build的script可以讓你重新建立
不過這裡有點小問題
這個toolbox是在scilab-2.5的時候寫的
現在的版本為4.0
大體上都不需要改變
但是4.0的function宣告必須以endfunction作結尾
因此你必須在每一個sci檔案尾端加上一行"endfunction"

另外, 他的demo檔案有一個地方判別式寫錯
a==1寫成a=1
這裡你在build的時候就會有錯誤訊息出來
你根據行號去改改便可

如果你跟我一樣要把HMM放進你的系統中
(不用每次要用都要執行loader.sce)
你可以把loader.sce放進你個人scilab的啟動程序
或是如果你有root的權限
你可以在(scilab安裝目錄)/macros下面建立一個新目錄
把所有sci檔案複製到此
作一次genlib('你剛剛建立的目錄')
然後記得把這個目錄的lib加入scilab.star這個檔案
加上這行..........load('SCI/macros/hmm/lib')............假設你建立的目錄為hmm
這樣每個啟動scilab的人都有HMM toolbox可以用啦
(不過啟動會慢一點)
你就可以開始研究HMM的奧秘啦