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