2008年12月28日 星期日

使用SVN進行版本控制 - (四) 如何使用SVN??

SVN應用實例
小張是位在軟體公司任職的專案經理,某天,察覺到當成員愈多時,在版本控制上,更形困難,每每版本混亂造成的影響,總要花上些許多時間。因此,小張決定試著採用Subversion來做版本管理。

首先,將原有的程式碼及相關文件,利用svn import匯入檔案庫(repository)。
svn import porject_directory file:///svn/proj

接著,將兩個模組分別交給小李及小陳兩位工程師進行開發,分別利用svn checkout下載最新的程式碼

svn checkout file:///svn/proj /local_project

小李的任務是撰寫一個math模組,於是新增一個math目錄,有著math.h及math.cpp兩個檔案,利用svn add將整個math目錄列入提交清單

svn add math

當math模組開發完成後,使利用svn commit提交math目錄

svn commit

而小陳必須引用math函式進行另項模組修改,所以必須利用svn update將更新至最新的程式碼

svn update file:///svn/proj

當程式碼修正完畢後,也利用svn commit進行提交

svn commit

這時,小李又針對math模組進行修改測試,卻發現無法正常編譯,但上一版是正常的,因此小李利用svn diff比對,找出程式錯誤的地方,再次修正即可正常編譯

svn diff -r01:02

終於要釋出完整版本,於是利用svn export輸出一份不含任何版本控制資訊的程式碼

svn export file:///svn/proj /projR1



2008年12月25日 星期四

使用SVN進行版本控制 - (三) 建立檔案庫及導入

Create Reposiroty (建立版本庫)
$>mkdir /svn
$>chwon -R nobody /svn
$>svnadmin create /svn/test
$>ls /svn/test
 #如果ls /repository/test/出現了下面的內容,就說明subversion安裝成功了
 conf dav db format hooks locks README.txt

Import Project (匯入專案)
$>svn import gt;svn import gt;svn import gt;svn import gt;svn import gt;svn import projectdir file:///svn/test/ -m "initial import"
 ##出現下列訊息, 即表示成功匯入專案
 Adding projectdir/foo.c
 Adding projectdir/bar.c
 Adding projectdir/subdir
 Adding projectdir/subdir/quux.h
 Committed revision 1.


於IE的網址列, 鍵入http://localhost/svn/test/, 如下圖結果

2008年12月24日 星期三

使用SVN進行版本控制 - (二) 設定配置

啟動Subversion服務提供下列三種方式:
  1. svnserver
  2. svnserver + ssh
  3. apache
 在此只針對上述 第1, 3點作細詳說明,第2點就有請大家自行google一下

1. svnserver, a custom server
svnserver是一種較為不耗費資源的service, 建立於TCP/IP的基礎通訊協定上,client side可透過svn://來進行溝通。

 常見的有兩種模式啟動svnserver:(1) as stand alone, (2) as daemon

  (1) as stand alone (/etc/init.d)

$> svnserver -d -r /svn
# -d : 以daemon方式執行
# -r : 虛擬根目錄, 限制只能在此目錄底下的瀏覽

$> lsof -i :3690
# 可以查看svnserver是否已正常啟動
  (2) as daemon (/etc/xinetd.d)
$> vi /etc/xinetd.d/svnserve
##新增以下文字內容
service svnserve
{
 disable = no
 socket_type = stream
 wait = no
 user = apache
 server = /usr/local/subversion/bin/svnserve
 server_args = -i
}

$> vi /etc/services
##確認有無以下文字內容, 若不存在, 請新增於檔案內容中
svnserve    3690/tcp    #Subversion svnserve
svnserve    3690/udp    #Subversion svnserve
1.1 svnserve.conf (配置設定)
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
# realm = My First Repository
1.2 passwd (使用者帳號)
[users]
##
username = password
admin = admin
yardmgr = yardmgr
1.3 authz (授權管理)
[groups]
administrators = admin
developer_team = mills

[/]
* =
@administrators = rw

[/svn/yard:/]
@developer_team = rw

[/svn/test:/]
@developer_team = rw

2. apache, a http server
apache是一種較為耗費資源的service, 建立於WebDav的基礎通訊協定上,client side可透過http://來進行溝通。
(1) Apache2 Config (I) -- Add SVN Modules
 $>vi /usr/local/apache2/conf/httpd.conf
 ##確認有無以下內容, 若不存在, 請新增貼上
 ##若沒有mod_dav_svn模組, SVN則無法以http方式運作
 LoadModule dav_svn_module modules/mod_dav_svn.so
 LoadModule authz_svn_module modles/mod_authz_svn.so

(2) Apache2 Config (I) -- Add SVN Path
 $>vi /usr/local/apache2/conf/httpd.conf
 ##確認有無以下內容, 若不存在, 請新增貼上
 <Location>
  DAV svn
  SVNPath /svn/test
  # our access control policy, below (4)
  AuthzSVNAccessFile /svn/svn-authz
  AuthType Basic
  AuthName "Version Control System"
  # how to authenticate a user, below (3)
  AuthUserFile /svn/svn-auth-file
  # only authenticated users may access the repository
  Require valid-user
 </Location>

(3) Setting up http authentication (建立認證帳號)
 $>htpasswd -c -m /svn/svn-auth-file admin
 # 輸入第1個使用者帳號, 第1次建立才加 -c
 # -c : 建立新檔
 # -m : 採以MD5編碼

 $>htpasswd -m /svn/svn-auth-file yardmgr
 # 輸入第2個使用者帳號

(4) Setting up svn authorization (建立授權管理)

 $> vi
/svn/svn-authz
 # 新增以下文字內容
 [groups]
 administrators = admin
 developer_team = yardmgr

 [/]
 * =
 @administrators = rw

 [/svn/test:/]
 @developer_team = rw

2008年12月20日 星期六

使用SVN 進行版本控制 - (一) 安裝

what is SVN??
(引述官方文件的簡介)
Subversion 是一個自由/開
放源碼的版本控制系統, 也就是說 Subversion 管理著隨時間改變的檔案. 這些檔案放置在一個中央 檔案庫 (repository) 中. 這個檔案庫 很像一個尋常的檔案伺服器, 不過它會記住每一次檔案的變動. 這樣你就可以把檔案回復到舊的版本, 或是瀏覽檔案的變動歷程. 許多人會把版本控制系統想像成某種 “時光機器”.

某些版本控制系統也是 software configuration management (SCM) 系統. 這些系統是特別設計來管理大量程式碼的, 而且具有許多功能, 專門用在軟體發展之用 — 像是可完全了解程式語言, 或是提供編譯軟體的工作. 不過 Subversion 並不是這樣的系統; 它是一個泛用系統, 可用來管理任何 類型的檔案, 其中包括了程式源碼.
功能列表
目錄版本控制
CVS 只能追蹤單獨檔案的歷史, 不過 Subversion 實作了一個 “虛擬” 的版本控管檔案系統, 能夠依時間追蹤整個目錄的更動. 目錄檔案都被納入版本控管. 最後, 用戶端有真正可用的 move (移動) 與 copy 指令.

不可分割的送交
一個送交動作, 不是導致所有更動都送入檔案庫, 就是完全不會送入. 這讓發展人員以邏輯區段建立更動, 並送交更動.

納入版本控管的描述資料 (Meta-data)
每一個檔案與目錄都附有一組隱形 “性質 (property)”. 你可以自己發明, 並儲存任何你想要的鍵值對. 性質是隨著時間來作版本控管的, 就像檔案內容一樣.

選擇不同的網路層
Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實作新的網路機制. Subversion “先進” 的網路伺服器, 是 Apache 網頁伺服器的一個模組, 它以稱為 WebDAV/DeltaV 的 HTTP 變體協定與外界溝通. 這對 Subversion 的穩定性與互通性有很大的幫助, 而且額外提供了許多重要功能: 舉例來說, 有身份認證, 授權, 線上壓縮, 以及檔案庫瀏覽. 另外也有小而獨立的 Subversion 伺服器程式, 使用的是自訂的通訊協定, 可以很容易地透過 ssh 以 tunnel 方式使用.

一致的資料處理方式
Subversion 使用二進制差異運算法, 來表示檔案的差異, 它對文字 (人類可理解的) 與二進制檔案 (人類無法理解) 兩類的檔案都一視同仁. 這兩類的檔案都同樣地以壓縮形態儲存在檔案庫中, 而且檔案差異是以兩個方向在網路上傳送的.

更有效率的分支 (branch) 與標記 (tag)
分支與標記的花費並不必一定要與計畫大小成正比. Subversion 建立分支與標記的方法, 就只是複製該計畫, 使用的方法就像 hard-link 一樣. 所以這些動作只會花費很小, 而且是固定的時間.

Hackability
Subversion 沒有任何的歷史包袱; 它主要是一群共用的 C 程式庫, 具有定義完善的 API. 這使得 Subversion 便於維護, 並且可被其它應用程式與程式語言使用.
伺服器配置
SVN提供了三種Server配置的方式,(1) svnserver (2) svnserver+ ssh (3) apache + mod_dav_svn
(1) svnserver : 一個更小,輕型的服務器程序,同客戶端使用自定義的協議。因為協議是為Subversion專門設計的,並且是有狀態的(不像HTTP),它提供了更快的 網絡操作—但也有一些代價。它只理解CRAM-MD5的認證,然而它非常易於配置,是開始使用Subversion的小團隊的最佳選擇。
(2) svnserver + ssh : 儘管依然使用svnserve,它與傳統的svnserve部署非常不同,SSH在多所有的通訊中使用加密方式,SSH也使用排他的認證,所以在服務器主機(svnserve與之不同,它包含了自己的私有用戶帳號)上必須要有真實的系統帳戶。最後,因為這些配置需要每個用戶發起一個私有的臨時svnserve進程,這與允許一組本地用戶通過file://協議訪問等同(從訪問許可的視點)。因此路徑為基礎的訪問控制變得沒有意義,因為每個用戶都可以直接訪問版本庫。

(3) apache : Apache是最流行的web服務器,通過使用mod_dav_svn模塊,Apache可以訪問版本庫,並且可以使客戶端使用HTTP的擴展協議WebDAV/DeltaV進行訪問,因為Apache是一個非常易於擴展的web服務器,它提供了許多「易於獲取的」特性,例如加密的SSL通訊,日誌和與第三方工具的集成,以及內置的版本庫web瀏覽功能


註: 參考官方說明文件第6章

Apache2 Installation
##請至官網下載必備套件
Apache官網:http://httpd.apache.org/
Apache 套件:http://ftp.tcc.edu.tw/pub/Apache/httpd/httpd-2.0.63.tar.gz

##解壓縮 httpd-2.x.x.xxtar.gz

$>mv httpd-2.x.x.xxtar.gz /usr/src/
$>tar -xvzf httd-2.x.xx.tar.gz
$>cd httpd-2.x.xx

##安裝apr (Apache Portable Runtime) & apr-util (APR Utility)

$>cd httpd-2.x.xx/srclib/apr
$>./buildconf
$>./configure --prefix=/usr/local/apr
$>make
$>make install
$>cd httpd-2.x.xx/srclib/apr-util
$>./buildconf
$>./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
$>make
$>make install

##安裝apache2
$>cd httpd-2.x.xx
$>./configure --enable-dav --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-cgi --enable-modules=so --enable-rewrite
$>make && make install
SVN Installation
##請至官網下載必備套件
SVN官網:http://subversion.tigris.org/
SVN套件:http://subversion.tigris.org/downloads/subversion-1.5.4.tar.gz

$>./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-apxs=/usr/local/apache2/bin/apxs --with-ssl
$>make
$>make install
Reference by follow website
Version Control with Subversion (繁體中文) -- http://twpug.net/docs/Subversion/
Install Subversion at RedHat Linux AS4 -- http://www.svn8.com/svnpz/20080316/339.html





2008年11月20日 星期四

System Log in Linux (openlog, syslog, closelog)

每當撰寫AP時, Log的工作是絕對馬虎不得, 但各個AP記錄著自己獨立的log file,
當發生問題時, AP彼此之間要對照時間及訊息時, 就是一件很麻煩的工程,
因為一個事件的引發, 其對應的作業流程卻是散佈於一連串的AP之中,
舉例來說:當客戶下訂單時, 訂單模組會建立訂單, 再通知倉儲模組,
若物料不足, 則須通知採購模組,
若物料充足, 則須通知生產製程模組, 以此類推...

有沒有什麼方法, 可以讓所有AP共同將log message記錄於同一個log file??
答案是: 有的!linux提供了syslog的 system call, 讓這類的工作變得非常簡單易用!



                    ( syslog protocol 運作圖)




#include

int main(int argc, char **argv)
{
openlog("ident", LOG_CONS | LOG_PID, LOG_USER);

syslog(LOG_INFO,
"This is a syslog test message generated by program '%s'\n",
argv[0]);

closelog();
return 0;
}

## 連接至system logger
void openlog(const char *ident, int option, int facility);

## 產生log message
void syslog(int priority, const char *format, ...);

## 關閉連接
void closelog(void);

ident : 出現於每個log message, 通常是設為程式名稱
option :
LOG_CONS : 如果送到system logger時發生問題,直接寫入系統console
LOG_NDELAY : 立即開啟連接(通常,連接是在第一次寫入訊息時才打開的)
LOG_PERROR : 將訊息也同時送到stderr
LOG_PID : 將PID含入所有訊息中

facility : (指定程式的類型, 藉由syslog.conf決定不同的作業方式)
LOG_AUTH : 安全/授權訊息(別用這個,請改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授權訊息
LOG_CRON : 時間守護神專用(cron及at)
LOG_DAEMON : 其它系統守護神
LOG_KERN : 核心訊息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系統
LOG_MAIL : mail次系統
LOG_NEWS : USENET news次系統
LOG_SYSLOG : syslogd內部所產生的訊息
LOG_USER(default) : 一般使用者等級訊息
LOG_UUCP : UUCP次系統

level : (決定訊息的重要性, 以下的等級重要性逐次遞減)
LOG_EMERG : 系統無法使用
LOG_ALERT : 必須要立即採取反應行動
LOG_CRIT : 重要狀況發生
LOG_ERR : 錯誤狀況發生
LOG_WARNING : 警告狀況發生
LOG_NOTICE : 一般狀況,但也是重要狀況
LOG_INFO : 資訊訊息
LOG_DEBUG : 除錯訊息

priority : (facility | level)

2008年10月4日 星期六

RHEL 5 Installation Number

在對岸找到Red Hat Enterprise 5的安裝序號,這是一定要記錄的!

RHEL 5 Install Number
Server:
Red Hat Enterprise Linux (Server including virtualization):
2515dd4e215225dd
Red Hat Enterprise Linux Virtualization Platform:
49af89414d147589
Client:
Red Hat Enterprise Linux Desktop:
660266e267419c67
Red Hat Enterprise Linux Desktop + Workstation Option:
da3122afdb7edd23
Red Hat Enterprise Linux Desktop + Workstation + DualOS Option
(Virtualization):
7fcc43557e9bbc42
Red Hat Enterprise Linux Desktop + DualOS Option (Virtualization):
fed67649ff918c77

Red Hat Enterprise 5 無法使用ftp登入??

剛安裝完Red Hat Enterprise 5,系統並不預設開啟ftp的服務。

##先查詢系統安裝了哪些ftp??
$> chkconfig --list | grep ftp
vsftp : 關閉
gssftp : 關閉
##開啟gssftp的服務
$> chkconfig gssftp on
##以windows登入ftp, 錯出現以下錯誤訊息
530 Must perform authentication before identifying USER.
Login failed.
##修改/etc/xinetd.d/gssftp
$> vi /etc/xinetd.d/gssftp
server_args = -l -a (將-a刪除, 取消認證機制)
即可正常登入ftp服務囉!!

Red Hat Enterprise 5 無法使用telnet登入??

發佈了Red Hat Enterprise 5,故極欲安裝來嚐鮮一下,安裝過程還極順利,沒想到麻煩是在安裝結束過後,自Red Hat 7.x後,都須使用者自行啟動telnet服務,為什麼呢?

因為telnet在登入時,帳號密碼都是以”明文”的方式傳送,如此一來,當被有心人士監聽封包時,資料隨即被竊取,非常不安全的資料傳輸方式,所以官方建議以ssh取代。

1. telnet未被xinetd啟動服務
##查詢telnet的服務啟動狀態
$> chkconfig --list | grep telnet
ekrb5-telnet:關閉
krb5-telnet:關閉
telnet:關閉

##開啟krb5-telnet服務
$> chkconfig krb5-telnet on

$> vi /etc/xinetd.d/krb5-telnet
disable = no (預設值為"yes")

##重新啟動xinetd
$> service xinetd restart
2. 若telnet無法登入,並出現下列錯誤訊息
getnameinfo: localhost: Success
Temporary failure in name resolution: Illegal seek
##允許遠端主機及Static IP Address進行連線
$> vi /etc/hosts
192.168.1.100 pcname
##允許遠端主機及dynamic IP Address進行連線
$> vi /etc/hosts.allow
ALL: Allow
參考資料:
鳥哥--以Openssh取代Telnet連線方式

2008年10月1日 星期三

轉載--跟我一起寫Makefile

半年多來,因為專案的需要,必須重拾用Linux & C++開發程控系統,由於必須傳授小弟們一些基礎概念,最讓我頭痛之一莫過於make(用於自動化編譯),幸好在內地有位大內高手把makefile的教學寫的超級平易近人,有時不得不佩服對岸的人才濟濟。

----------以下為轉貼部份內容----------

跟我一起寫 Makefile


陳皓

概述
——

什麼是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些 Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makefile還是要懂。這就好像現在有這麼多 的HTML的編輯器,但如果你想成為一個專業人士,你還是要瞭解HTML的標識的含義。特別在Unix下的軟件編譯,你就不能不自己寫makefile 了,會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力。

因為,makefile關係到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功 能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行 更複雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。

makefile帶來的好處就是——「自動化編譯」,一旦寫好,只需要一個make命令,整個 工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這 個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。

現在講述如何寫makefile的文章比較少,這是我想寫這篇文章的原因。當然,不同產商的 make各不相同,也有不同的語法,但其本質都是在「文件依賴性」上做文章,這裡,我僅對GNU的make進行講述,我的環境是RedHat Linux 8.0,make的版本是3.80。必竟,這個make是應用最為廣泛的,也是用得最多的。而且其還是最遵循於IEEE 1003.2-1992 標準的(POSIX.2)。

在這篇文檔中,將以C/C++的源碼作為我們基礎,所以必然涉及一些關於C/C++的編譯的知識,相關於這方面的內容,還請各位查看相關的編譯器的文檔。這裡所默認的編譯器是UNIX下的GCC和CC。

關於程序的編譯和鏈接
——————————

在此,我想多說關於程序編譯的一些規範和方法,一般來說,無論是C、C++、還是pas,首先 要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。

編譯時,編譯器需要的是語法的正確,函數與變量的聲明的正確。對於後者,通常是你需要告訴編譯 器頭文件的所在位置(頭文件中應該只是聲明,而定義應該放在C/C++文件中),只要所有的語法正確,編譯器就可以編譯出中間目標文件。一般來說,每個源 文件都應該對應於一個中間目標文件(O文件或是OBJ文件)。

鏈接時,主要是鏈接函數和全局變量,所以,我們可以使用這些中間目標文件(O文件或是OBJ文 件)來鏈接我們的應用程序。鏈接器並不管函數所在的源文件,只管函數的中間目標文件(Object File),在大多數時候,由於源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對於編譯很不方便,所以,我們要給 中間目標文件打個包,在Windows下這種包叫「庫文件」(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

總結一下,源文件首先會生成中間目標文件,再由中間目標文件生成執行文件。在編譯時,編譯器只 檢測程序語法,和函數、變量是否被聲明。如果函數未被聲明,編譯器會給出一個警告,但可以生成Object File。而在鏈接程序時,鏈接器會在所有的Object File中找尋函數的實現,如果找不到,那到就會報鏈接錯誤碼(Linker Error),在VC下,這種錯誤一般是:Link 2001錯誤,意思說是說,鏈接器未能找到函數的實現。你需要指定函數的Object File.

好,言歸正傳,GNU的make有許多的內容,閒言少敘,還是讓我們開始吧。

Makefile 介紹
———————

make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎麼樣的去編譯和鏈接程序。

首先,我們用一個示例來說明Makefile的書寫規則。以便給大家一個感興認識。這個示例來源於GNU的make使用手冊,在這個示例中,我們的工程有8個C文件,和3個頭文件,我們要寫一個Makefile來告訴make命令如何編譯和鏈接這幾個文件。我們的規則是:
1)如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。

只要我們的Makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

....

該教學文章共分為十四篇,最重要的是都有簡單的例子,讓你可以馬上實作,值得讚賞!
上列轉貼出部份內容,有興趣的同好們,請前往右列網址參拜:陳皓--跟我一起寫Makefile

2008年9月29日 星期一

PostgreSQL--(三)備份與回復

1. 備份
$> pg_dump --format=c --file=test1.out pyarddb
gt; pg_dump --format=c --file=test1.out pyarddb
--format:select format of output file(p:plain-text, t:tar-archive, c:custom-archive)
--file:specify output file
2. 回復
$> pg_restore --dbname=pyarddb pyard.backup
gt; pg_restore --dbname=pyarddb pyard.backup
--dbname: select the database and restore into the database

2008年9月26日 星期五

PostgreSQL--(二)Server配置&建立資料庫

1. 允許本機以外的遠端登入連線
$> vi postgresql.conf
listen_addresses = '*'
2. 遠端登入資料庫的權限控制
$> vi pg_hba.conf
host all all 192.168.x.0/24 trust

3. 建立使用者帳號
$> createuser -s -l -P -e yardmgr
-s:be superuser -l:be allowed to log in -P:specify password -e:echo message
4. 建立資料庫
$> createdb -O yardmgr -e pyarddb
gt; createdb -O yardmgr -e pyarddb
-O:specify user own the new database -e:echo message

2008年9月25日 星期四

PostgreSQL--(一)安裝與設定

1. 下載PostgreSQL, 並且解壓縮至/usr/目錄中
$> mkdir /usr/src/postgresql
$> cp postgresql-8.x.x.tar.gz /usr/src/postgresql
$> tar -zxvf postgresql-8.x.xx.tar.gz
2. 安裝PostgreSQL
$> su - root
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> ./configure
--prefix: specify installation directory, default is /usr/local/pgsql
--with-pgport: set the port number, default is 5432
--with-pam: build the pam support

$> gmake
$> gmake install
3. 建立postgres帳號, 並建立存放資料庫的目錄
$> adduser postgres
$> mkdir /usr/local/pgsql/data
$> chown postgres /usr/local/pgsql/data
4. 函式庫設定
$> vi /etc/profile
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH

$> /sbin/ldconfig /usr/local/pgsql/lib
5. 環境變數設定
$> su - postgres
$> vi .bash_profile
PATH=$PATH:/usr/local/pgsql/bin
export PATH
MANPATH=/usr/local/pgsql/man:$MANPATH
export MANPATH
PGDATA=/usr/local/pgsql/data
export PGDATA
6. 資料庫叢集(Database Cluster)初始化
##以postgres帳號登入執行..
$> initdb -D /usr/local/pgsql/data
7. 啟動伺服器
##啟動服務, 並且記錄其訊息輸出及錯誤訊息
$> postgres -D /usr/local/pgsql/data >logfile 2>&1 &

$> pg_ctl start -D /usr/local/pgsql/data -l logfile

##以root身份登入
$> /etc/init.d/postgresql start
8. 查看伺服器有無正常運作
##須設定環境變數PGDATA
$> pg_ctl status

##輸出訊息
pg_ctl: server is running (PID: 3974)
/usr/local/pgsql/bin/postgres "-D" "/usr/local/pgsql/data/"
9. 設定開機時, 自動啟動PostgreSQL服務
#以root權限登入
$> vi /etc/rc.d/rc.local
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then
su postgres -c '/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l /usr/local/pgsql/data/serverlog -s'
echo -n 'postgresql server is running...'
fi

cp /usr/src/postgresql/postgresql-8.x.xx/contrib/start-scripts/linux /etc/init.d/postgresql
chkconfig --add postgresql
8. Shared Memory配置
$> sysctl -w kernel.shmmax=134217728
$> sysctl -w kernel.shmall=2097152
9. 關閉伺服器
$> pg_ctl stop

$> kill -INT 'head -1 /usr/local/pgsql/data/postmaster.pid'

##以root身份登入
$> /etc/init.d/postgresql stop
10.解除安裝
##註:不會自動刪除已建立的目錄##
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> gmake uninstall

2008年9月23日 星期二

如何讓PostgreSQL擁有更好的效能??

下列三個主要方面可以提升 PostgreSQL 的效能::

1.查詢方式的變化
這主要涉及修改查詢方式以獲取更好的性能:
  • 創建索引,包括表達式和部分索引;
  • 使用 COPY 語句代替多個 Insert 語句;
  • 將多個SQL語句組成一個事務以減少提交事務的開銷;
  • 從一個索引中提取多條記錄時使用 CLUSTER;
  • 從一個查詢結果中取出部分記錄時使用 LIMIT;
  • 使用預編譯式查詢(Prepared Query);
  • 使用 ANALYZE 以保持精確的優化統計;
  • 定期使用 VACUUM 或 pg_autovacuum
  • 進行大量資料更改時先刪除索引(然後重建索引)

2.伺服器的配置
配置文件 postgres.conf 中的很多設置都會影響性能,所有參數的列表可見:

管理員指南/資料庫伺服器運行環境/資料庫伺服器運行配置, 有關參數的解釋可見:http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.htmlhttp://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html

3.硬體的選擇
電腦硬體對性能的影響可瀏覽 http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.htmlhttp://www.powerpostgresql.com/PerfList/

PostgreSQL為何一定要做Vacuum呢?

無庸置疑,PostgreSQL的更新性能是一大問題。

PostgreSQL更新處理的弱點
PostgreSQL採用追加型的架構,更新的時候,在數據庫內部刪除行之後再追加新行。刪除掉的行由VACUUM命令作為可以再利用區域回收,然後被再利用。如果頻繁進行更新處理也必須讓VACUUM頻繁運行,不然廢棄區域會不斷增加導致數據表肥大化而致使性能惡化。
VACUUM需要掃瞄數據表的全部數據,所以數據表越大處理時間越長。因此,如果數據表很大而且更新又很頻繁,那麼無論怎麼頻繁運行VACUUM也來不及回收更新處理產生的廢棄區域。
然而問題不僅如此,更新處理不僅僅是針對數據表本身,索引也必須同時更新。PostgreSQL的某個列被更新的話,關聯索引也需要全部更新。因此,擁有大量索引的數據表的更新處理量將會特別大,索引也會越來越肥大化。索引的廢棄區域也因此難於被VACUUM回收再利用,比數據表的問題更加嚴重。

假設有如下一個管理網頁訪問次數的簡單數據表,當某個URL被訪問時cnt增加計數,這是一個頻繁更新的典型案例。
CREATE TABLE t1(
url TEXT PRIMARY KEY,-- 主鍵,自動附加索引
cnt INTEGER
);
cnt更新時,url字段的關聯索引也會被更新。
考慮一下cnt發生變更而url沒有變化的情況,這時url的索引更新是沒有必要的。

使用VACUUM抑制數據表的廢棄領域
更新cnt時,這行 數據被刪除(正確地說是在這個時刻變得不可見),然後追加新的數據行。被刪除的行中放置一個被刪除標誌,以及一個指向新行的指針。再次更新這行數據時,從 舊行的指針很容易找到新行,然後用上邊提到的同樣方式在這裡放置指向新行的指針。這樣反覆更新的話就會形成一個指針鏈,叫做更新鏈(UPDATE chain)。
更新鏈越長檢索和更新花費的時間就越長,直到運行VACUUM才會消除這種影響,這是現在PostgreSQL的問題點。

原文出處:
The ‘MV’ in MVCC (Multiversion Concurrency Control) stands for Multi Version. This means that multiple versions of the same data will be kept any time that data changes. Oracle does this by rolling old data into an "undo log." PostgreSQL doesn't use an undo log; instead it keeps multiple versions of data in the base tables. This means that there is much less overhead when making updates, and you must occasionally remove the old versions. This is one of the things VACUUM does.

The way PostgreSQL manages these multiple versions is by storing some extra information with every row. This information is used to determine what transactions should be able to see the row. If the row is an old version, there is information that tells PostgreSQL where to find the new version of the row. This information is needed to be able to lock rows during an update.

Consider this scenario: a row is inserted into a table that has a couple indexes, and that transaction commits. Several updates happen on that row. Each update will create a new row in all indexes, even if the index key didn't change. And each update will also leave an old version of the row in the base table, one that has been updated to point to the location of the new version of the row that replaces it. All of the old data will stick around until the vacuum is run on that table. In a busy system, it doesn't take very long for all the old data to translate into a lot of wasted space. And it's very difficult to reclaim that space if it grows to an unacceptable level.

What this means to those who want to keep their PostgreSQL database performing well is that proper vacuuming is critical. This is especially true on any tables that see a heavy update (or insert/delete) load, such as a table used to implement some kind of a queue. Such tables should generally be vacuumed frequently if they are small--more frequently than autovacuum normally would provide. For more moderate loads, autovacuum will often do a good job of keeping dead space to a minimum.



2008年9月7日 星期日

快速設定WinForm上任何控制項TabIndex的順序

.,由於在設計 Form 上的控制項時,不一定會依照輸入的順序,在完成設計之後,我們通常會重設各控制項的 TabIndex 順序,當 Form 上的控制項比較多時,設定起來相當麻煩,常常還會設錯。

有一個很簡單又不容易出錯的方法,是從畫面上的右下角往左上角 (方向是先向左再往上),逐一的將控制項的 TabIndex 屬性設成 0。
1:右手用滑鼠點一下右下角的控制項,左手按 F4,將 TabIndex 設成 0。
2:右手往左用滑鼠點一下倒數第二個控制項,左手按 F4,左手按 0。
3:右手往左用滑鼠點一下倒數第三個控制項,左手按 F4,左手按 0。
4:重複以上動作直到左上角第一個控制項為止。

好了,您已設定好整個 Form 上任何控制項的 TabIndex 順序了!其原理就是當您設定一個控制項的 TabIndex 為 0 時,原來 TabIndex 為 0 的控制項,TabIndex 就變成了 1、而 1 的變成 2...依序 +1 改變。

.Net Framework的新元件 -- DataGridView

在偶然的情況下, 才突然發現VB.Net 2005/2008的視覺控制項, 竟找不到DataGird元件, 取而代之的是DataGridView, 頗令人好奇這個新控件, 到底提供了什麼樣的差異化功能??

1.Windows Form DataGridView 和 DataGrid 控制項之間的差異
2.DataGridView 控制項概觀 (Windows Form)
3.DataGridView 控制項 (Windows Form)


先備記上面來自於MSDN的技術文件供往後參考!!

2008年8月12日 星期二

WIN鍵+R有如神助, 快速開啟自訂的應用程式!!

WIN鍵+R是什麼呢?就是開始功能表中的"執行"

鍵入以下程式名稱, 可立即呼叫出該應用程式, 省去移動滑鼠的時間

.Windows下的附屬應用程式

小畫家 - mspaint = pbrush
記事本 - notepad
Wordpad - write
小算盤 - calc
命令提示字元 - cmd
字元對應表 - charmap
同步處理 - mobsync
通訊錄 - wab
通訊錄匯入工具 - wabmig
導覽 Windows XP - tourstart
剪貼本檢視器 - clipbrd

.Windows下的程式/服務

登錄編輯程式 - regedit = regedt32(XP) = regedit32(2000)
系統設定公用程式 - msconfig
Direct X 診斷工具 - dxdiag
Telnet Client - telnet
憑證 - certmgr.msc
DDE 共用 - ddeshare

Disk Partition Manager - diskpart

Dr. Watson 系統診斷工具 - drwtsn32
Driver Verifier Utility - verifier
檔案簽章驗證 - sigverif
Iexpress Wizard - iexpress
惡意軟體移除工具 - mrt
Microsoft Chat - winchat
Netmeeting - conf
物件封裝程式 - packager
電話撥號員 - dialer
系統組態編輯程式 - sysedit
SQL Client 用戶端網路公用程式 - cliconfg
Windows System Security Tool - syskey

群組原則 (for xp professional) - gpedit.msc
原則結果組 (for xp professional) - rsop.msc

磁碟管理 - diskmgmt.msc
共用資料夾 - fsmgmt.msc
索引服務 - ciadv.msc
本機使用者和群組 - lusrmgr.msc
卸除式存放管理 - ntmsmgr.msc
卸除式存放裝置作員要求 - ntmsoprq.msc
Windows Management Infrastructure - wmimgmt.msc

.控制台下的程式/服務

控制台 - control

地區及語言選項 - intl.cpl
日期和時間 - timedate.cpl
排定的工作 - control schedtasks

系統 - sysdm.cpl
裝置管理員 - devmgmt.msc
新增硬體精靈 - hdwwiz.cpl
電源選項 - powercfg.cpl
新增/移除程式 - appwiz.cpl

顯示 - control desktop = desk.cpl
資料夾選項 - control folders
字型 - control fonts = fonts

鍵盤 - control keyboard
滑鼠 - control mouse = main.cpl
聲音及音訊裝置 - mmsys.cpl
遊戲控制器 - joy.cpl

電話和數據機選項 - telephon.cpl
協助工具選項 - access.cpl
使用者帳戶 - nusrmgr.cpl

系統管理工具 - control admintools
電腦管理 - compmgmt.msc

元件服務 - dcomcnfg
事件檢視器 - eventvwr.msc
服務 - services.msc
資料來源 (ODBC) - odbccp32.cpl
效能 - perfmon = perfmon.msc

網路連線 - control netconnections
網路連線 - ncpa.cpl
網路安裝精靈 - netsetup.cpl
印表機和傳真 - control printers
Printers Folder - printers
掃描器與數位相機 - sticpl.cpl
藍芽檔案傳輸精靈 - fsquirt
網際網路連線精靈 - icwconn1
網際網路選項 - inetcpl.cpl
自動更新 - wuaucpl.cpl
資訊安全中心 - wscui.cpl
Windows 防火牆 - firewall.cpl

那接下來要問, 能不能直接執行自訂的應用程式呢??
答案是可以的!!

因為Windows設定了三個秘密路徑,
C:\WINDOWS\
C:\WINDOWS\system32\

想到沒料想到的:當前使用者目錄

讓我們來證明這項鐵證吧!!
請於"執行"中, 輸入"桌面", 結果出現了其資料夾, 夠神奇了吧!!

那接下來即是本篇的重點, 如何快速利用"執行"開啟自訂的應用程式呢??
答案是:將你想要使用的程式, 建立捷徑於"使用者目錄"下即可!!
舉例來說, 將MSN Messager建立捷徑於"使用者目錄", 重新命名為較短的名稱"msn",
再試著於"執行"輸入"msn", 這會兒MSN Messager不就在你眼前開啟了嗎?

至於遇到相同名稱的情況會怎麼樣呢?

假設有三個名為A資料夾和三個名為A程式捷徑分別位在三個目錄下,執行的優先權為:

使用者目錄下的A程式
優於
使用者目錄下的A資料夾
優於
system32\A程式
優於
system32\A資料夾
優於
WINDOWS\A程式
優於
WINDOWS\A資料夾

2008年8月10日 星期日

NoName XPE藏身於USB碟身碟的作業系統唷!!

多年前WinPE的出現,曾讓我眼睛為之一亮,沒想到竟可以在一張光碟上就可以運行完整的XP系統,只是經由CD-ROM存取的速度,實在令人無法苟同,這個名詞也就隨著光碟片被陳封於角落!

曾幾何時,在網路上漫無亂晃時,看到一個新名詞XPE,其中又以繁體中文NoName XPE最為眾多網友所推崇,著實令人驚豔的是,只要備有幾百元不到的2GB-USB隨身碟(當然存取速度愈快愈好,價格也隨之成正比),就可以將區區不到400MB容量的XP安裝於其中,創造出不用硬碟的也能使用XP的神話,速度更是令人讚賞,開機過程不用花費一分鐘,讓人不由得要說”傑克,真是太神奇了!”,無論是硬體或軟體支援度,讓您使用起來,毫不費吹灰之力!

更多No Name XPE的參考資料,請進入-->
簡簡單單製作XPE隨身碟版
Step 1.利用HPUSBFW製作可開機的USB隨身碟
 1.1下載HPUSBFW,並解壓縮至目錄.\HPUSBFW\
 1.2執行HPUSBFW
  1.2.1[Device]選擇欲格式化的隨身碟
  1.2.2[File system]務必選擇FAT
  1.2.3[Create a Dos startup disk]指向上述1.1的目錄路徑
 1.3按下[start],即讓隨身碟具備了開機功能


Step 2. GrubUtil (安裝GRUB到MBR的工具)
使用 grubutil 裡頭的 grubinst_gui.exe 程式, 把隨身碟的 MBR 修改成使用 grub 來開機


Step 3.下載Grub4Dos & NoName XPE的ISO檔
 3.1 複製XPE的SetupLDR.bin, RXPE.com, RXPE.sif, RXPE.im_, \OutTool至根目錄
 3.2 複製Grub4Dos的Grub.exe, Grldr至根目錄
 3.3 SetupLDR.bin更名為NTLDR



Step 4.編寫Config.sys(Dos開機選單)
[menu]
menuitem=DOS, DOS
menuitem=GRUB, Grub (XPE, ...)
menuitem=noemm, DOS without himem, emm386
menudefault=DOS,10
menucolor=15,1

[DOS]
DOS=high,umb
devicehigh=\dos\himem.sys
devicehigh=\dos\emm386.exe noems

[GRUB]
install=grub.exe

[noemm]

Step 5.編寫Menu.lst(Grub開機選單)

chainloader /NTLDR








2008年8月8日 星期五

好用的網管指令 netstat

某些情況下, 須查詢系統中, 已開啟的Port
這時 netstat 就派上用場了

列出Listen的TCP socket & UDP Socket
檢視 TCP 及 UDP 的 LISTEN 資訊
# netstat -l

檢視 TCP 的 LISTEN 資訊
# netstat -tl

檢視 UDP 的 LISTEN 資訊
# netstat -ul

檢視 TCP 的 LISTEN 資訊且不解析(IP及PORT)
# netstat -tln


列出正在使用某Port的Process PDI

列出指定socket的PID
# fuser 25/tcp 137/udp 138/udp 139/tcp

查詢PID資訊
檢視PID資訊(PID部份請填入上面查詢到的數字)

# ps -ef | grep PID
# ps aux | grep PID

列出PID開啟的檔
# lsof -p PID
列出哪些Processes正在使用這個檔案
# fuser -mv /path/filename
殺掉所有正在使用某個路徑或檔案的Processes
殺掉所有正在使用 /home 的Processes
# fuser -km /home


啟動PostgreSQL時, 無法Binding IP Address

當啟動PostgreSQL時, 發生無法binding to IP Address, 原始錯誤訊息如下::

$> ./postmaster

LOG: could not bind IPv4 socket: Can't assign requested address
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
WARNING: could not create listen socket for "myserver"
FATAL: could not create TCP/IP listen socket

解決方式::
用root的身份登入, 檢查/etc/hosts, 發現myserver's IP是192.168.1.100,
但目前myserver's IP是192.168.1.105, 因該Server是採Dynamic IPAddress,
故IP已變動, 只需將hosts的IP修正即可!!

當啟動PostgreSQL時, 發生IP Address已被使用, 原始錯誤訊息如下::

$> ./postmaster

LOG: could not bind IPv4 socket: Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL: could not create TCP/IP listen socket

解決方式::
一. 以root的身份登入, 執行 lsof -i | grep 5432, 查看是否有其它程式佔用此port,
若有, 請將該程式kill, 或是posgresql以另一個port啟動,

二. 亦或是執行 ps -aux | grep post, 查看是否另有postgres已啟動,
若有, 請將已執行的postgresql kill, 重新啟動postgres