2008年10月27日 星期一

雜七雜八的名詞解釋

HTPC(Home Theater Personal Computer)
應該考慮的部分是硬體
主要就是解壓縮、介面跟容量
解壓縮最好能夠硬體解壓縮支援,ATI在低階的卡就有些支援,相對的N家的集中在DirectX支援,比較偏向遊戲
介面的話,就是挑有支援一堆啥Full-HD之類的接頭,方便接各種裝置
最後容量的話就沒啥好說的,影片檔案都不小,容量儘量大

PAM

fabless
wiki:無廠半導體公司是專注於設計與銷售應用半導體晶片的硬體裝置並透過將半導體的生產製造外包予專業晶圓代工半導體製造廠商來取得優勢的公司。智霖公司 (Xilinx)的Bernie Vonderschmitt與Chips and Technologies公司的Gordon A. Campbell是無廠概念的先驅者。

無廠半導體公司可將其資源集中在最終市場研發而不需投放資源於保有當前的半導體技術。由於他們的主要產品由專利許可、商業秘密、光罩著作及其他形式的知識產權構成而被稱為知識產權公司(IP firms)。

launchpad
Launchpad 是一個提供維護、支援或聯絡 Ubuntu 開發者的網站平台,由 Ubuntu 的母公司 Canonical 有限公司所架設。
issue:http://wiki.ubuntu-tw.org/index.php?title=Launchpad

mingw, cygwin, xmingw
MinGW 可以唸做 Min-G-W「明~碁~大不了~」或是MinG-W「名~大不了~」,也有人唸做 ming-wee「名貴(台語發音)」 或是 min gnu 「明~格奴」。可參考 http://en.wikipedia.org/wiki/MinGW

MinGW 原來是 Cygwin (念做「賽葛-wing」)裡 GNU 開發工具的一個分支,沒 Cygwin 複雜,而且目的也與 Cygwin 不同,Cygwin 的目的是希望透過一個 dll (就是 Cygwin1.dll 通常被安裝在 C:\Windows\system32底下) 建立一個系統呼叫轉換層,將原先 unix 世界裡的 system call 呼叫,經由這個 DLL 把它們映對到微軟視窗作業系統的系統呼叫,如此一來就可以很方便在 Windows 底下模擬出一個 unix 平台來,這樣你不需要一個 unix 機器照樣也可以開發 unix 程式。開發好的程式只要拿到 UNIX 平台上就可以使用。同理原來UNIX上諸多 Open source 程式也可以粉方便拿到 Windows 世界來享用,當然啦!UNIX system calls 與 Windows APIs 不盡然可以一對一對應,Cygwin 的目標在於儘可能 Compatible,執行績效倒不是重點考量。

「名~大不了~」可就不同啦!他的目的反而是將 gnu 這個 open source, free 的開發工具移植到微軟視窗平台,他直接產生出來的PC視窗平台機器碼,可以說與微軟 Visual Studio 做出來的一摸一樣,可以彼此互相通用。執行效率反而是重點。MinGW 常與 MSYS(Minimal SYStem)搭配使用,後者是跑在Windows視窗上的一個瘦身型羽量級 UNIX shell 功能,MinGW與他搭檔還可以進一步做一些更彈性的 Config。(按: UNIX 世界Open source 的玩法,大約都是用 cvs 或是 Sub version 去取得 Source code,然後 configure --> build --> install 三部曲, configure 會先蒐集你平台上各個工具元件實際安裝路徑,根據它們來調整軟體 Project檔(通常它是一個Makefile),之後才執行 make 去 Build 出軟體,透過 Install 腳本,最後再把作好的軟體 install (安裝)到適當的資料夾來使用。這 MSYS 就可以讓 MinGW 這編譯工具也具備第一步的 configure 功能。

xminGW 則是有人突發奇想,再進一步把 minGW 移植回去 UNIX平台,在 UNIX/Linux平台上有個 xminGW的好處是,在 UNIX 機器上可以有一個跨平台編譯器(Cross-compiler),在 UNIX平台上直接編譯產生 Windows 平台上可以執行的機器碼。Cross-compiler 在內嵌式系統開發上常用到,要內嵌的那個平台通常稱作 Target platform(標的平台),一般而言檔次較低功能上也比較陽春,並不適合在上面開發系統,大多數都是假手另一個開發程式的Source platform(可以是 Windows 或是 UNIX/Linux),透過上面的 Development toolchain 裡的 Cross-compiler 去產生出標的平台上的程式碼(通常是另一個OS平台),下載到標的平台來執行。

你的 PDA 可能上面是 Samsung 的 ARM7 或是 ARM9 處理器,他上面的應用程式其實是透過在 Linux 的 ARM Toolchain 跨平台開發出來的啦!
Likewise 你手機也是個內嵌式系統,它上面的應用程式都是透過類似的 Cross-compiler 編譯出來的啦!
http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?t=1895

DVR
Digital Video Recorder數位監控

TCC
Tiny C Compiler
http://bellard.org/tcc/

DOCBOOK
http://www.docbook.org/ 適合用來撰寫一些科學文件,但是對於數學算式的處理比tex薄弱
但是使用上比tex簡單

HIPS
主機入侵防禦系統
http://www.gsg9.tw/showthread.php?p=1350

AGPS
AGPS (Assisted GPS)可以除了用衛星定位外, 還可以其他網路設備來定位, 例如用通訊基地台
http://www.nokia.com.tw/A4805286


G-sensor
http://tw.myblog.yahoo.com/jjyeh-1976/article?mid=433&prev=434&next=417

2008年10月23日 星期四

最近在思考C/C++ & Java

無疑的C/C++是一個成功的語言,符合當時的程式設計需要,但是"最近"(約十年吧)竄起的java卻是非常的快速,我覺得C/C++在lib上的發展也不比他快
為何會這樣?有些人歸功於java的memory management的成功,其實我頗不以為然,尤其最近,記憶體對於一般應用程式來說根本不成問題;再加上OS的進步,一個不回收記憶體的程式,只要很快的結束的話,OS也可以把大部分的記憶體回收回來
後起的Ruby、Python、PHP也也感覺不大會威脅到Java,畢竟他們都還不如Java全方位,可是不能否認的,他們在web application上打下了一片天地

Java成功的法則是?我認為歸功於良好的設計跟隨著時代演化的架構。

良好的設計使得程式設計師不用在面對多種的平台,如果移植過C++到不同的平台上,你就會發現你要花上很長的時間除錯跟維護相容性,更可能只要換個compiler,你就得應付到手忙腳亂,反觀java,幾乎只要拿個jar檔,就可以正確無誤的運作(web上一些設定檔還挺麻煩的,這倒是不得不唸一下)。在意外處理上面也是相當的良好,你很容易可以找到你的錯誤,至於C++,如果不一賴debugger,你就得依賴log跟printf,真的要抓出錯誤要額外花上很多時間。當然還有相當多的地方java設計的比C++好,這就不多說了

一個良好的設計,總有一天會"腐敗",因為人們不斷的進步,java另外成功的一點就是不斷使用一些新發明的觀念、架構,不斷的改進他本身的設計,例如java2引進了swing(重要的是他背後一堆的pattern,老實說有些pattern還真不好用XD),在java 5之後,真的是大幅度的改善,java 6更是有大進步;java 2雖然用了一堆pattern,可是在做國際化(i18n),真的是"吐血身亡",swing的些GUI跟事件也是相當難處理,可是可以看到在JSR-296引進之後,開始解決這個問題,一個全新的framwork可以做更好的開發跟國際化,程式設計師不用為了國際化花費太多的心力。以這些觀念看來,java不斷的在成長,可惜C++就成長的比較緩慢

當然在效能上面C/C++真的還是遠遠把java拋在後頭(不要跟我說啥文字處理多快又多快,沒啥意義),看看那繪圖軟體、科學計算軟體、商用資料庫,哪些骨子是用java寫的,因為他們對於資源的苛求、效能的要求,這些都是讓他們把維護性擺在比較後面的理由;再者C/C++才能接觸到比較硬體方面的開發,比方驅動程式等等,畢竟這是一種極度硬體平台相關的東西。

C/C++並不會完全被java取代,但是java將是可能被推上主流開發程式的語言之一;不過還有M$挾持著OS平台優勢的C#在一旁虎視眈眈,看來java還是要努力不懈才可以

2008年10月16日 星期四

我看STL跟BOOST

這兩者無疑都是非常有力的工具,使得C++的programmer好像短時間內瞬間增加了一甲子的功力,老實說剛剛看到的時候是驚豔,後來小心對待,下一步希望可以擴充這個Lib(雖然說感覺離這目標還很遠)

驚豔:你可以想像的到,以前資料結構寫的要死要活,還得東修補西修補,才能完成你合用的東西,短時間內就可用STL完成,還可以套用多種演算法,愛用哪一種型態就是用哪一種型態,不必開發多個版本,全部人家都幫你用好了;BOOST看似一個補完計畫,以前啥atoi、printf之類的東西,好像一下子都解決的,程式的可讀性大幅提昇,以前一些平台相依性的東西,也都被加入了,好像一下子對齊了不少窗口,程式設計師不用再面對一堆不一樣的狀況

小心使用:STL跟BOOST在不瞭解他的原理的狀況下,可能會讓程式當的莫名其妙,再得到好處的時候,也犧牲了一些東西。如果你不知道在刪除了某些container裡面的內容之後,你的iterator會不能用,你大概也很難trace你的程式是如何運作,如果你不知道map其實是一個tree,你會期待他有O(1)的表現,有太多要注意的,天下沒有白吃的午餐;再者以STL來說,因為有些人很懶惰,直接引用,使得程式可讀性下降,明明就是簡單define可以解決的事情,就會看到程式裡充滿map< int,int>::iterator,這是啥鬼東西阿?是一個怎樣的map?

擴充: 人心不足蛇吞象,大家會有一些特殊的應用,在STL跟BOOST有所跟不上的地方,這時候就需要擴充他,可是說來簡單,在沒有通盤考量過STL的結構下,我們可以確定可以完全套入STL的架構中而不出錯嗎?我想很少人有這個自信,可以在STL裡面添加一個hash而套用所有的演算法跟運算子吧!?開發一個面面俱到的hash可能難度遠超乎專案的範圍

啥是BOOST?

正確的說法應該是~BOOST能做什麼?BOOST有哪些東西?
boost是一個准標準庫,相當於STL的延續和擴充,它的設計理念和STL比較接近,都是利用泛型讓復用達到最大化。不過對比STL,boost更加實用。STL集中在算法部分,而boost包含了不少工具類,可以完成比較具體的工作。

boost主要包含一下幾個大類:字符串及文本處理、容器、迭代子(Iterator)、算法、函數對象和高階編程、泛型編程、模板元編程、預處 理元編程、並發編程、數學相關、糾錯和測試、數據結構、輸入/輸出、跨語言支持、內存相關、語法分析、雜項。 有一些庫是跨類別包含的,就是既屬於這個類別又屬於那個類別。

在文本處理部分,conversion/lexcial_cast類用於「用C++」的方法實現數字類型和字符串之間的轉換。 主要是替代C標準庫中的 atoi、 itoa之類的函數。當然其中一個最大的好處就是支持泛型了。

format庫提供了對流的「printf-like」功能。printf裡使用%d、%s等等的參數做替換的方法在很多情況下還是非常方便 的,STL的iostream則缺乏這樣的功能。format為stream增加了這個功能,並且功能比原始的printf更強。

regex,這個不多說了,正則表達式庫。如果需要做字符串分析的人就會理解正則表達式有多麼有用了。

spirit,這個是做LL分析的框架,可以根據EBNF規則對文件進行分析。(不要告訴我不知道什麼是EBNF)。做編譯器的可能會用到。一般人不太用的到。

tokenizer庫。我以前經常在CSDN上看到有人問怎麼把一個字符串按逗號分割成字符串數組。也許有些人很羨慕VB的 split函數。現在,boost的tokenizer也有相同的功能了,如果我沒記錯的話,這個tokenizer還支持正則表達式,是不是很爽?

array: 提供了常量大小的數組的一個包裝,喜歡用數組但是苦惱數組定位、確定數組大小等功能的人這下開心了。

dynamic_bitset,動態分配大小的bitset,我們知道STL裡有個bitset,為位運算提供了不少方便。可惜它的大小需要在編譯期指定。現在好了,運行期動態分配大小的bitset來了。

graph。提供了圖的容器和相關算法。我還沒有在程序中用到過圖,需要用的人可以看看。

multi_array提供了對多維數組的封裝,應該還是比較有用的。

並發編程裡只有一個庫,thread,提供了一個可移植的線程庫,不過在Windows平台上我感覺用處不大。因為它是基於Posix線程的,在Windows裡對Posix的支持不是很好。

接下來的 數學和數值 類裡,包含了很多數值處理方面的類庫,數學類我也不太熟,不過這裡有幾個類還是很有用的,比如rational分數類,random隨機數類,等等。

static_assert,提供了編譯器的assert功能。

test庫,一個單元測試框架,非常不錯。

concept_check提供了泛型編程時,對泛型量的一點檢查,不是很完善,不過比沒有好。

數據類型類any,一個安全的可以包含不同對象的類。把它作為容器的元素類型,那麼這個容器就可以包含不同類型的元素。比用void *要安全。

compressed_pair,跟STL裡的pair差不多。不過對空元素做了優化。

tuple,呵呵,也許是某些人夢寐以求的東西。可以讓函數返回多個值。

跨語言支持:python,呵呵,好東東啊,可以將C++的類和函數映射給python使用。以下為幾個CSDN上的關於 boost.python的中文資料:http://dev.csdn.net/article/19/19828.shtm,http: //dev.csdn.net/article/19/19829.shtm,http://dev.csdn.net/article/19 /19830.shtm,http://dev.csdn.net/article/19/19831.shtm

pool:內存池,呵呵,不用害怕頻繁分配釋放內存導致內存碎片,也不用自己辛辛苦苦自己實現了。

smart_ptr:智能指針,這下不用擔心內存洩漏的問題了吧。不過,C++裡的智能指針都還不是十全十美的,用的時候小心點了,不要做太技巧性的操作了。

date_time,這個是平台、類庫無關的實現,如果程序需要跨平台,可以考慮用這個。

timer,提供了一個計時器,雖然不是Windows裡那種基於消息的計時器,不過據說可以用來測量語句執行時間。

uitlity裡提供了一個noncopyable類,可以實現「無法複製」的類。很多情況下,我們需要避免一個類被覆制,比如代表文件句柄的類,文件句 柄如果被兩個實例共享,操作上會有很多問題,而且語義上也說不過去。一般的避免實例複製的方法是把拷貝構造和operator=私有化,現在只要繼承一下 這個類就可以了,清晰了很多。

value_initialized:數值初始化,可以保證聲明的對象都被明確的初始化,不過這個真的實用嗎?似乎寫這個比直接寫初始化還累。呵呵,仁者見仁了。

這裡面除了regex、python和test需要編譯出庫才能用,其他的大部分都可以直接源代碼應用,比較方便。其實這些庫使用都不難。最主要的原因是有些庫的使用需要有相關的背景知識,比如元編程、STL、泛型編程等等。

來自這裡

練習boost--tuple

主要是參考IBM的網站上的一篇文章

#include <tuple.hpp>
#include <iostream>
#include <tuple_io.hpp>

using namespace std;
using namespace boost;

int main(void){
tuple<int,char,float> t(2,'a',0.9);
cout << t << endl;
return 0;
}

編譯的指令
g++ tuple_b.C -o tuple_b -I /usr/include/boost/tuple/

網頁提醒要注意兩件事情
  1. tuple裡面的元素不可超過10個
  2. tuple裡面的元素要有公開的copy constructor

對於第一點為何不可以超過10個我不大了然,不過第二個大概是當tuple再回傳或者當作參數的時候,預設大概都是bitwise的拷貝,所以在使用上就要考慮到copy constructor,我個人建議是tuple只用來存取一些value only的元素,不要用到pointer或者reference之類的,雖然威力上會打折扣,可是維護上相對應該輕鬆不少

在STL裡面使用make_pair,在boost裡面使用make_tuple,用法上是差不多了
至於取得裡面的元素,則是t.get<0>()或者boost::get<1>(t),紅色的部分表示tuple變數,藍色是第幾個參數

我個人認為,如果把pair跟tuple當作工具來使用,其實不大合乎概念,以STL來說,pair的出現是為了map之類的container存在的,為了對於container跟iterator所做出的抽象對應,而犧牲了可讀性的產品,如果把pair當作回傳一對數值的工具還不如把他變成struct;至於tuple存在的理由我現在還不大明瞭,有機會在慢慢研究

2008年10月11日 星期六

在Ubuntu 8.04上面安裝SVN Server

先說一下廢話,我腦袋還真是愈來愈棒,很快的就會忘記,所以要熬夜把這東西寫下來,不然過個兩天就忘記光光了Orz
安裝的套件有subversion、apache2、libapache2-svn這三個,後面兩個是為了讓使用者可以從網路checkout檔案才需要的,如果你只要主機使用,那麼就只要前面那個就可以了
首先使用apt安裝那三個套件,這就不用多說了,麻煩一點的是安裝apache2的ssh套件,讓我們可以使用https,避免資料被竊取的危險,如果不需要就跳過底下的步驟(底下的步驟建議使用root來執行會比較方便一點)
安裝openssl套件
mkdir /etc/apache2/ssl
產生金鑰openssl req -new -x509 -nodes -out /etc/apache2/ssl/apache.crt -keyout /etc/apache2/ssl/apache.key
載入模組a2enmod ssl
修改/etc/apache2/ports.conf加上Listen 443
修改/etc/apache2/sites-available/default
加上
NameVirtualHost *:443
<>
DocumentRoot /var/www/https/
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<>
DAV svn
SVNPath /svn_reposirty
< /location>
< /virtualhost>
重新啟動apache2


如果你覺得SVN server不是對一般人開放,必須要管理機制的話,就是PAM囉,如果不需要認證管理,底下步驟也可以跳過
groupadd dev
adduser www-data dev
adduser [your account] dev
chown -R root:dev myproject
chmod -R g+rws myproject
a2enmod dav_svn
a2enmod auth_pam
a2enmod auth_sys_group
在剛剛location tag內
AuthType Basic
AuthName "Subversion myproject Realm"
require group dev

我注重於一般command line下如何運作,如果說是gui的client就留給網友自行實驗囉,所以底下都是command line在svn server下執行的動作
接著請挑選一個目錄才建立你的svn repository(假如我是放到/root/projects目錄底下)
svnadmin create /root/projects
如果手邊已經有要放到svn server上的目錄就用import會比較方便,我是在主機上操作
svn import doc_dir file:////roots/projects
然後可以選擇任一個使用者,試著把這個目錄checkout出來看看
svn checkout file:////roots/projects/doc_dir

最後要說一句,在ubuntu上面的apache還真有許多小陷阱,蠻討厭的

2008年10月10日 星期五

Code::Blocks IDE

話說KDevelop幾乎可以說為了寫QT程式打造,我希望可以有個light-weight的IDE,當然找上了Code::Blocks
可是安裝完畢之後遇到一個小麻煩,就是如何加入lib呢,結論是,在你所建立的project
選擇Build options,然後就可以看到相關變數的設定,把所要用的library加入

改天再來研究如何加入已經預設好的library

P.S.我很想知道code::blocks如何下編譯指令的

2008年10月7日 星期二

KDevelop土法大煉鋼

用的平台是Ubuntu 8.04,KDE 4.1.2
安裝build-essential、kdevelop、xorg-dev、libqt4-dev、libavahi-qt4-dev、kdelibs4-dev
這樣才可以編譯一個kde的xwindow

2008年10月3日 星期五

QT的中文化

要加上
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
上面的方式只強迫使用了目前系統的locale,對於國際化沒有幫助

其實我還沒弄得很清楚,以後有空再來仔細研究

2008年10月2日 星期四

第一個QT程式

在編譯完畢之後,我開始要寫我第一個QT程式來試驗一下,我發現不是我想像中得那樣簡單,我直接引用別人論壇上的回覆,如果有心的話,你很容易可以google到這段話本來的出處
Hi, There

Following is the method what I successfully did it and for your reference:

1. download "VC++ 2008 Exp" and "qt-win-opensource-src-4.4.0" from officical websites
2. install VC++ 2008 Exp first
3. unzip "qt-win-opensource-src-4.4.0", i.e. "C:\Qt\4.4.0"
4. add "c:\Qt\4.4.0";"c:\Qt\4.4.0\Bin" to your Env Path, and QMAKESPEC=win32-msvc2008
5. open VC++ 2008 Command Prompt/Console from it's Tool Option.
6. go to Qt Directory: "cd c:\Qt\4.4.0"
7. run "configure.exe", then select "y" for yes. (maybe wait for 30~60mins)
8. run "nmake" (maybe wait for 1~4hrs)
9. open VC++ 2008 IDE, select [Tool]->[Option]->[Projects]->[VC++path]
and add following settings:
--> [Execute]: add "c:\Qt\4.4.0" and "c:\Qt\4.4.0\Bin"
--> [Include]: add "c:\Qt\4.4.0" and "c:\Qt\4.4.0\Include"
--> [Lib]: add "c:\Qt\4.4.0" and "c:\Qt\4.4.0\Lib"
10. now, using an editor to create a code, i.e.
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}
11. then need to create a project for VC++, in the Command Prompt run:
(A) qmake -project
(B) qmake -t vcapp
now, supposed you should get a *.vcproj
12. using VC++2008 IDE to open the *.vcproj
13. build the project..
14. Run it.. then you will see a window with "Hello Qt!" mesg..

:-)


另外我發現,本來很可愛的1xxMB在經過解壓縮跟編譯之後,變成了3~4G的怪物目錄,其實你可以加上nmake clean刪除不必要的object檔案等等,就可以還原到莫約600MB左右的可接受範圍了

Visual C++ 2008 Express + QT4.33

在M$底下免費的C++ IDE,學個跨平台的GUI Framework應該好過MFC跟.NET(雖然.NET也是跨平台),不過還是比較偏向QT
如何整合這兩個東西ㄋㄟ,其實VC++ 2008 express只要去M$那邊抓下來然後安裝就可以了,QT4.33就比較麻煩一點,我這邊用的是open source的版本(不想付錢,我只是要開發一些實驗性的東西)
抓下來解開之後,找到"開始/start"=>"VC++ studio tool"=>"命令提示字元"(一定要用這個command model,他應該含有一些環境變數)
接著切換到解開QT4.33的目錄下,執行configure.exe,選擇同意(你別無選擇,除非你不想裝),接著他會產生一堆檔案跟編譯一些東西
跟著執行nmake,接下來就是二到四個小時的漫長等待,真的非常久(看你電腦等級啦,我的T2450差不多三個多小時)
結束之後會在QT4.33的bin下面產生一個qtdemo的程式(其實nmake的過程產生了很多的demo程式qtdemo只是個引導),你就可以拿來玩玩看
以上執行完畢只是產生了一些相對應的檔案,要開發的話還是要做一些設定,設定環境變數跟打開visual c++ express加入一些設定
  • 新增環境變數QTDIR=C:\QtSource(你QT4.33的目錄)
  • 增加PATH,要加入%QTDIR%\bin
在VC++內(Tool -> Options , in VC++ Directories)加上include file跟lib file
  • $(QTDIR)\include
  • $(QTDIR)\lib
完成後可以開始實驗的去寫程式囉!!