2008年7月26日 星期六

2008年7月22日 星期二

[Apache]htpasswd 指令

Synopsis
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username

htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] passwdfile username password

htpasswd -n [ -m | -d | -s | -p ] username

htpasswd -nb [ -m | -d | -s | -p ] username password


Options
-b
Use batch mode; i.e., get the password from the command line rather than prompting for it. This option should be used with extreme care, since the password is clearly visible on the command line.
-c
Create the passwdfile. If passwdfile already exists, it is rewritten and truncated. This option cannot be combined with the -n option.
-n
Display the results on standard output rather than updating a file. This is useful for generating password records acceptable to Apache for inclusion in non-text data stores. This option changes the syntax of the command line, since the passwdfile argument (usually the first one) is omitted. It cannot be combined with the -c option.
-m
Use MD5 encryption for passwords. On Windows, Netware and TPF, this is the default.
-d
Use crypt() encryption for passwords. The default on all platforms but Windows, Netware and TPF. Though possibly supported by htpasswd on all platforms, it is not supported by the httpd server on Windows, Netware and TPF.
-s
Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif).
-p
Use plaintext passwords. Though htpasswd will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows, Netware and TPF.
-D
Delete user. If the username exists in the specified htpasswd file, it will be deleted.
passwdfile
Name of the file to contain the user name and password. If -c is given, this file is created if it does not already exist, or rewritten and truncated if it does exist.
username
The username to create or update in passwdfile. If username does not exist in this file, an entry is added. If it does exist, the password is changed.
password
The plaintext password to be encrypted and stored in the file. Only used with the -b flag.

Exit Status
htpasswd returns a zero status ("true") if the username and password have been successfully added or updated in the passwdfile. htpasswd returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with the command line, 3 if the password was entered interactively and the verification entry didn't match, 4 if its operation was interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if the username contains illegal characters (see the Restrictions section), and 7 if the file is not a valid password file.


Examples
htpasswd /usr/local/etc/apache/.htpasswd-users jsmith

Adds or modifies the password for user jsmith. The user is prompted for the password. If executed on a Windows system, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system's crypt() routine will be used. If the file does not exist, htpasswd will do nothing except return an error.

htpasswd -c /home/doe/public_html/.htpasswd jane

Creates a new file and stores a record in it for user jane. The user is prompted for the password. If the file exists and cannot be read, or cannot be written, it is not altered and htpasswd will display a message and return an error status.

htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve

Encrypts the password from the command line (Pwd4Steve) using the MD5 algorithm, and stores it in the specified file.


摘自:http://httpd.apache.org/docs/2.0/programs/htpasswd.html

2008年7月21日 星期一

千萬不要買-Hawk 雷之雕 OFFICE雷射滑鼠



小弟在2008/4/1買了這支滑鼠,
在2008/7/21宣告故障!!

讓我對 逸盛科技 的品管真的是大失所望,
我想各位看倌們應該不曾用過三個月就故障的滑鼠吧!

我只能說,我以後再也不會買Hawk的產品了,
Hawk == 爛!已深深的烙印在我的心中...

PS:我還得自費郵資將這不良品送修!打去問客服,還要被罵!真的是自討苦吃...

但從這一間公司的客服,就可以間接了解這公司的對於品質的要求有多高。

2008年7月19日 星期六

Everyday Best Practices of PHP Development

http://www.slideshare.net/weierophinney/everyday-best-practices-of-php-development

2008年7月16日 星期三

FTP傳輸模式

Ftp傳輸有兩種mode 一種是Active mode 二是Passive mode
要了解這兩個模式的不同﹐先得了解 FTP 的連線是怎樣建立的﹕

1)
在Active 模式下﹕
1﹐FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21
建立連線﹐這是命令通道的建立。
2﹐client 用一個 port 命令告訴 server 另一個高於 1024 的 port 做數據通道。
3﹐然後 server 用 port 20 和剛才 client 所告知的 port 建立數據連線。請注意﹐
這是從 server 到 client 的連線﹐TCP 封包會有一個 SYN 標籤。
4﹐client 會確認數據通道連接﹐這個封包會有一個 ACK 標籤。
5﹐開始數據傳送。

2)
在 passive 模式下﹕
1﹐FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21
建立連線﹐這是命令通道的建立。
2﹐client 送一個 PASV 命令給 server﹐要求建立 passive 模式。
3﹐server 然後像上面所述的正常模式第 2 步驟那樣﹐挑一個高於 1024 的 port 告
訴 client 做數據通道。
4﹐然後 client 用另一個高於 1024 的 port 呼叫剛才 server 告知的 port 來建立
數據通道。此時封包帶 SYN 標籤。
5﹐server 確認後回應一個 ACK 封包。
6﹐開始數據傳送。

通常從 FTP 下載檔案的時候,會使用兩個連接。一個是命令用,另一個是檔案,命令是由本地端設定,資料是由伺服器設定。在一些防火牆或代理伺服器會使兩個連接都在本地端設定。而當本地端送出 PASV command 時,伺服器便必須使用 passive mode 來接收。

如果您發現您的FTP程式可以連上FTP server,卻無法檢視server內的檔案與目錄,請您先確認一下您的FTP程式相關設定是否正確。特別提醒您,您必須勾選FTP程式的passive功能,這樣才可以正常連線。(如果您的FTP本身沒有支援此功能,建議您更新版本即可)。

2008年7月5日 星期六

PHP程式師都應該會用的五個工具

在參與了幾個大型PHP項目,寫了很多PHP代碼以後,我發現很多工具可以提高代碼品質,簡化發佈,使得做為PHP開發人員的生涯變得輕鬆許多。許多這樣的工具可能已經為大家所用。但是,由於一些人甚至沒有注意到這些工具的存在,我會從此開始,好了,不說廢話,下面是我認為所有PHP程式師應該知道的工具列表。

Phing - 一個專案構建系統
Phing 是一個基於Apache ANT 的專案構建系統。它的名字是一個拗口的語句首字母縮寫 - PHing Is Not GNU make 。Phing可以做傳統構建系統比如 GNU make 能做的任何事情,同時沒有陡峭的學習曲線。
在phing(以及其他的構建系統)背後的思想是評估一系列相關性,然後執行一系列PHP類去正確的安裝和配置一個應用系統。構建過程用一個簡單的XML設定檔控制。Out of the box, phing內置可以執行一系列替換(比如:在你的開發版本和產品版本間改變include路徑)、執行SQL語句、移動和複製檔、運行外部腳本等等。通過擴展包含在發行包中的“task”類,你也可以創造自己的定制任務。
對任何需要在超過一台伺服器上部署大型PHP應用的人來世,Phing是一個無價之寶。同時我發現它對簡單的PHP腳本也是很有用的。

Xdebug - 調試和分析工具
Xdebug 是幫助你調試和分析腳本的一個PHP擴展。Xdebug中最有用的特性是在啟動後顯示的新注意資訊、警告資訊和錯誤資訊。如果一個腳本不能正常運行,Xdebug將會輸出關於錯誤資訊的完整堆跟蹤 ,會附帶函數名稱、參數值、原始檔案和行號。這對於厭倦了PHP默認只帶的可憐的錯誤報告功能的程式師是一個值得歡迎的特性。

這個擴展有很多更先進的功能,允許開發人員進行代碼覆蓋率分析,收集分析資訊以及互動式地調試腳本。profiling functionality 功能尤其有用。分析器使用一個普通的輸出檔案格式,允許你使用象 KCacheGrind 這樣的工具快速發現你代碼中的瓶頸。對任何嚴肅的開發人員而言,一個好的分析器是基本工具,它使得你妥善優化你的代碼,同時避免過早優化帶來的危害。

PHPUnit - 單元測試框架
PHPUnit 是一個羽量級的PHP測試框架。它是在PHP5下面的 JUnit 3.8.1 完整移植,是xUnit 測試框架家族的一員(它們基於軟體模式 先鋒 Kent Beck 的設計)。
單元測試是幾個現代敏捷開發方法的基礎,使得PHPUnit成為許多大型PHP項目的關鍵工具。這個工具也可以被前面討論的Xdebug擴展用來生成代碼覆蓋率報告 ,並且可以與phing集成來自動測試。

Propel - ORM(物件關係映射)框架 網頁教學網
Propel是一個PHP5下面的物件關係映射(ORM)框架,它起源於Apache Torque項目。它提供了一個複雜但是易用的資料庫抽象層,使得你可以在PHP中象使用普通類和物件一樣得使用資料庫實體。Propel允許你使用一種簡單的XML格式定義你的資料庫,這個XML檔被用來映射資料庫,生成應用中使用的靜態類。 網頁教學網
Propel被內嵌於流行的Symfony PHP框架 (還有其他的),它使得代碼更靈活、模組化以及可移植。這個項目有The project has 出色的文檔,以及很棒的支持社區。

phpMyAdmin / phpPgAdmin - 基於web的資料庫管理系統
歷史有點長可是還是很有用,phpMyAdmin是對於任何資料庫(對應PostgreSQL和SQLite是phpPgAdmin 和 phpSQLiteAdmin)最有用的管理工具之一。它有助於做每一件事情 - 從為了調試應用去創建和刪除資料庫到做備份。安裝它通常是我在一個LAMP伺服器上面安裝完 Apache, PHP和MySQL後做的第一件事情。如果你使用MySQL,不知何故還沒聽說過它,那麼現在就安裝 。


其他工具
還有很多優秀的工具用以符合各種需要,説明PHP開發者創建一個豐富的開發環境 — 我希望我可以說到所有這些工具。我發現對自己有用的工具有PHP Beautifier, Spyc, Creole和Smarty。我確信還有很多我忘記或者沒聽說過的有用工具。因此,如果你知道某個我遺漏的PHP開發偉大工具,請留言讓我(以及所有人)知道!

摘自:http://www.webjx.com/php/php_2007_11_09_850.html

2008年7月4日 星期五

【轉貼】Subversion權限設定之詳細解說

1   背景假設

廈門央瞬公司是一家電子元器件設備供應商,其中有個ARM部門,專門負責ARM晶片的方案設計、銷售,並在北京、上海各設立了一個辦事處。對於工作日志,原先採用郵件方式發給經理,但是這種方式有個缺點,那就是不具備連續性,要看以前的日誌必須一封一封郵件去查看,很麻煩。於是就想到利用 Subversion, 讓員工在自己電腦上編輯日誌,然後利用svn傳送回來,既方便員工自己編寫日誌,又方便對日誌的歸檔處理,而且提交日誌的時候只需要執行一下 svn update 即可,比發送郵件還要簡單的多。


 



  • svn伺服器相關資訊


    • 伺服器地址: 192.168.0.1

    • 伺服器OS: MS Windows 2000 Server Edition 中文版

    • 代碼庫本地目錄: D:\svn\arm


  • arm部門文檔的目錄結構如下:

  • arm                 部門名稱

  • ├─diary           工作日志目錄

  • │  ├─headquarters    總部工作日志目錄

  • │  ├─beijing         北京辦日誌目錄

  • │  └─shanghai        上海辦日誌目錄

  • ├─ref             公司公共檔參考目錄

  • └─temp            暫存檔案目錄

  • 人員情況


    • morson,公司總經理,其實他不必親自看任何東西,就連部門經理們的每週總結都不一定看。但是為了表示對他的尊敬,以及滿足一下他的權力欲,還是給他開放了“閱讀所有文檔”的許可權





    • michael,arm事業部的部門經理,沒事的時候喜歡弄點兒新技術,用svn來管理日誌,就是他相處來的主意

    • scofield,北京辦人員,老員工,為人油滑難管

    • lincon,上海辦人員,老員工,大老實人一個

    • linda,總部協調員、秘書,文筆不錯,長得也不錯

    • rory,單片機技術員,技術支援


  • 存取權限需求分析


    • 允許總經理讀取所有檔

    • 除部門經理外,所有其他人員,均只能看到本辦事處人員工作日志

    • 不允許匿名訪問

    • ref目錄只允許經理和秘書寫,對其他人唯讀

    • temp目錄人人都可以寫



2   建立代碼庫

在伺服器 D:\svn 目錄下,建立 arm 代碼庫,命令如下:

D:\svn>svnadmin create arm

在客戶機 F:\temp 目錄下,建立好上述目錄結構

用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導入結構

【注意點:關於導入時候的細微差別】


 


3   編輯代碼庫基礎設定檔

編輯代碼庫 arm\conf\svnserve.conf 文件,如下:

[general]

password-db = passwd.conf

anon-access = none

auth-access = write

authz-db = authz.conf


 


4   管理用戶帳號

新建代碼庫 arm\conf\passwd.conf 文件,如下:

[users]

morson = ShowMeTheMoney

michael = mysecretpassword

scofield = hellolittilekiller

lincon = asyouknows111

rory = 8809117

linda = IlikeWorldCup2006


 


5   建立目錄存取權限控制檔

新建代碼庫 arm\conf\authz.conf 檔,內容如下:

[groups]

g_vip = morson

g_manager = michael

g_beijing = scofield

g_shanghai = lincon

g_headquarters = rory, linda

g_docs = linda

[arm:/]

@g_manager = rw

* = r

[arm:/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =

[arm:/diary/beijing]

@g_manager = rw

@g_beijing = rw

@g_vip = r

* =

[arm:/diary/shanghai]

@g_manager = rw

@g_shanghai = rw

@g_vip = r

* =

[arm:/ref]

@g_manager = rw

@g_docs = rw

* = r

[arm:/temp]

* = rw


 


6   測試

在伺服器上,打開一個 DOS Prompt 視窗,輸入如下指令:

svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117

我們應該得到如下目錄結構:

arm

├─diary

│  └─headquarters

├─ref

└─temp

然後修改ref目錄下任意檔並提交,伺服器將會報錯“Access deni”


 


深入

本章將詳細介紹前一章所涉及的兩個設定檔, svnserve.conf 和 authz.conf,通過對配置逐行的描述,來闡明其中的一些細節含義。

這裡首先要注意一點,任何設定檔的有效配置行,都不允許存在前置空格,否則程式會無法識別。也就是說,如果你直接從本文的純文字格式中拷貝了相關的配置行過去,需要手動將前置的4個空格全部刪除。當然了,如果你覺得一下子要刪除好多行的同樣數目的前置空格是一件苦差使,那麼也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助呢。


 


1   svnserve.conf

arm\conf\svnserve.conf 文件,是 svnserve.exe 這個伺服器進程的設定檔,我們逐行解釋如下。

首先,我們告訴 svnserve.exe,用戶名與密碼放在 passwd.conf 文件下。當然,你可以改成任意的有效檔案名,比如默認的就是 passwd:

password-db = passwd.conf

接下來這兩行的意思,是說只允許經過驗證的用戶,方可存取碼庫。 那麼哪些是“經過驗證的”用戶呢?噢,當然,就是前面說那些在 passwd.conf 檔裡面持有用戶名密碼的傢伙。這兩行的等號後面,目前只允許 read write none 三種值,你如果想實現一些特殊的值,比如說“read-once”之類的,建議你自己動手改原始程式碼,反正它也是自由軟體:

anon-access = none

auth-access = write

接下來就是最關鍵的一句呢,它告訴 svnserve.exe,專案目錄存取權限的相關配置是放在 authz.conf 文件裡:

authz-db = authz.conf

當然,svn 1.3.2 引入本功能的時候,系統預設使用 authz 而不是 authz.conf 作為設定檔。不過由於鄙人是處女座的,有著強烈的完美主義情結,看著 svnserve.conf 有尾碼而 passwd 和 authz 沒有就是不爽,硬是要改了。


 


2   authz.conf 之用戶分組

arm\conf\authz.conf 檔的配置段,可以分為兩類,``[group]`` 是一類,裡面放置著所有使用者分組資訊。其餘以 [arm:/] 開頭的是另外一類,每一段就是對應著專案的一個目錄,其目錄相關許可權,就在此段內設置。

首先,我們將人員分組管理,以便以後由於人員變動而需要重新設置許可權時候,儘量少改動東西。我們一共設置了5個用戶分組,分組名稱統一採用 g_ 首碼,以方便識別。當然了,分組成員之間採用逗號隔開:

[groups]

# 任何想要查看所有文檔的非本部門人士

g_vip = morson

# 經理

g_manager = michael

# 北京辦人員

g_beijing = scofield

# 上海辦人員

g_shanghai = lincon

# 總部一般員工

g_headquarters = rory, linda

# 小秘,撰寫文檔

g_docs = linda

注意到沒有, linda 這個帳號同時存在“總部”和“文檔員”兩個分組裡面,這可不是我老眼昏花寫錯了,是因為 svnserve.exe 允許我這樣設置。它意味著,這個傢伙所擁有的許可權,將會比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請往下看!


 


3   authz.conf 之專案根目錄

接著,我們對專案根目錄做了限制,該目錄只允許arm事業部的經理才能修改,其他人都只能眼巴巴的看著:

[arm:/]

@g_manager = rw

* = r


 



  • [arm:/] 表示這個目錄結構的相對根節點,或者說是 arm 專案的根目錄

  • 這裡的 @ 表示接下來的是一個組名,不是用戶名。你當然也可以將 @g_manager=rw 這一行替換成 michael=rw ,而表達的意義完全一樣。

  • * 表示“除了上面提到的那些人之外的其餘所有人”,也就是“除了部門經理外的其他所有人”,當然也包括總經理那個怪老頭

  • * = r 則表示“那些人只能讀,不能寫”


 


4   authz.conf 之項目子目錄

然後,我們要給總部人員開放日誌目錄的讀寫許可權:

[arm:/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =


 



  • 我敢打賭,設計svn的傢伙們,大部分都是在 unix/linux 平臺下工作,所以他們總喜歡使用 / 來標識子目錄,而完全忽視在 MS Windows 下是用 \ 來做同樣的事情。所以這兒,為了表示 arm\diary\headquarters 這個目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。

  • 這裡最後一行的 *= 表示,除了經理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?

  • 之所以這兒需要將 @g_vip=r 一句加上,就是因為存在上述這個解釋。如果說你沒有明確地給總經理授予讀的權力,則他會和其他人一樣,被 * 給排除在外。

  • 如果眾位看官中間,有誰玩過防火牆配置的話,可能會感覺上述的配置很熟悉。不過這裡有一點與防火牆配置不一樣,那就是各個配置行之間,沒有 先後順序 一說。也就是說,如果我將本段配置的 *= 這一行挪到最前面,完全不影響整個配置的最終效果。

  • 請注意這兒,我們並沒有給 arm\diary 目錄設置許可權,就直接跳到其子目錄下進行設置了。我當然是故意這樣的,因為我想在這兒引入“繼承”的概念。

  • 許可權具備繼承性 任何子目錄,均可繼承其父目錄的所有權限,除非它自己被明確設置了其他的許可權。也就是說,在 arm 目錄設置許可權後, arm\diary 目錄沒有進行設置,就意味著它的許可權與 arm 目錄一樣,都是只有經理才有權讀寫,其他人只能幹瞪眼。

  • 【 * = 是否可以省略】【用例子引入覆蓋】【單用戶許可權的繼承問題】【父目錄許可權集成與全面覆蓋問題】


 


現在來看看

好了,我們現在掌握了“繼承”的威力,它讓我們節省了不少敲鍵盤的時間。可是現在又有一個問題了,

屬性具備覆蓋性質子目錄若設置了屬性,則完全覆蓋父目錄。


 


5   authz.conf 的其他注意點



  1. 父目錄的 r 許可權,對子目錄 w 許可權的影響


把這個問題專門提出來,是因為在1.3.1及其以前的版本裡面,有個bug,即為了子目錄的寫許可權,專案首目錄必須具備讀許可權。因此現在使用了1.3.2版本,就方便了那些想在一個代碼庫存放多個相互獨立的專案的管理員,來分配許可權了。比如說央舜公司建立一個大的代碼庫用於存放所有員工日誌,叫做 diary,而arm事業部只是其中一個部門,則可以這樣做:

[diary:/]

@g_chief_manager = rw

[diary:/arm]

@g_arm_manager = rw

@g_arm = r

這樣,對於所有arm事業部的人員來說,就可以將 svn://192.168.0.1/diary/arm 這個URL當作根目錄來進行日常操作,而完全不管它其實只是一個子目錄,並且當有少數好奇心比較強的人想試著 checkout 一下 svn://192.168.0.1/diary 的時候,馬上就會得到一個警告“Access deni”,哇,太酷了。



  1. 默認許可權


如果說我對某個目錄不設置任何許可權,會怎樣?馬上動手做個試驗,將:

[diary:/]

@g_chief_manager = rw

改成:

[diary:/]

# @g_chief_manager = rw

這樣就相當於什麼都沒有設置。在我的 svn 1.3.2 版本上,此時是禁止任何訪問。也就是說,如果你想要讓某人訪問某目錄,你一定要顯式指明這一點。這個策略,看起來與防火牆的策略是一致的。



  1. 唯讀許可權帶來的一個小副作用


若設置了:

[arm:/diary]

* = r

則svnserve認為,任何人,都不允許改動diary目錄,包括刪除和改名,和新增。

也就是說,如果你在專案初期創建目錄時候,一不小心寫錯目錄名稱,比如因拼寫錯誤寫成 dairy,以後除非你改動 authz.conf 裡面的這行設置,否則無法利用 svn mv 命令將錯誤的目錄更正。


 


改進


1   對中文目錄的支援

上午上班的時候,Morson 來到 Michael 的桌子前面,說道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺得很難受?” Michael 心想,還好這兩天剛瞭解了一些與 unicode 編碼相關的知識,於是微笑地回答:“當然可以,你明天下午就可以看到中文目錄名稱了。”



  1. 使用 svn mv 指令,將原來的一些目錄改名並 commit 入代碼庫,改名後的目錄結構如下:

  2. arm

  3. ├─工作日志

  4. │  ├─總部人員

  5. │  ├─北京辦

  6. │  └─上海辦

  7. ├─公司公共檔參考目錄

  8. └─暫存檔案存放處

  9. 修改代碼庫的 authz.conf 檔,將相應目錄逐一改名

  10. 使用 UltraEdit 將 authz.conf 檔轉換成不帶 BOM 的 UTF-8 格式


將設定檔轉換成 UTF-8 格式之後,Subversion 就能夠正確識別中文字元了。但是這裡需要注意一點,即必須保證 UTF-8 檔不包含 BOM 。BOM 是 Byte Order Mark 的縮寫,指 UNICODE 檔頭部用於指明高低位元組排列順序的幾個字元,通常是 FFFE ,而將之用 UTF-8 編碼之後,就是 EFBBBF 。由於 UTF-8 檔本身不存在位元組序問題,所以對 UTF-16 等編碼方式有重大意義的 BOM,對於 UTF-8 來說,只有一個作用——表明這個檔是 UTF-8 格式。由於 BOM 會給文本處理帶來很多難題,所以現在很多軟體都要求使用不帶 BOM 的 UTF-8 檔,特別是一些處理文本的軟體,如 PHP、 UNIX 指令檔等,svn 也是如此。

目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”裡面,“另存為”菜單保存出來的 UTF-8 格式檔,會自動帶上 BOM 。新版本 UltraEdit 提供了選項,允許使用者選擇是否需要 BOM,而老版本的不會添加 BOM。請各位查看一下自己常用的編輯器的說明文件,看看它是否支持這個功能。

利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”功能表將檔轉換成本地編碼,通常是GB2312碼,然後再使用“ASCII TO UTF-8(UNICODE Editing)”來轉換到 UTF-8 即可。



摘自:http://www.blogjava.net/coldtear/archive/2006/09/05/67808.aspx

補充:

在上一篇帖子中介紹了Subversion版本控制軟體的安裝方法,另外還轉貼了一篇Subversion許可權控制的文章,出於工作的需要和學習態度的角度,還是希望自己到手來體驗Subversion許可權控制的魅力。

        如果對Subversion安裝有疑問的話,請看作者另一篇帖子:http://www.blogjava.net/coldtear/archive/2006/08/04/61668.aspx,在這篇帖子裡詳細介紹了Subversion的安裝步驟。

        在作者看了轉貼(《Subversion許可權詳解》)文章後,按照文章中的方法進行設置後,出現了一些問題,總是提示沒有許可權這樣的錯誤,錯誤提示為:“錯誤 Authorization failed”,對設定檔進行一些修改後,終於可以實現許可權控制了,這裡將作者碰到問題後的解決辦法寫出來,希望能給和我碰到同樣問題的朋友些幫助。

        如果您按照http://www.blogjava.net/coldtear/archive/2006/09/05/67808.aspx這篇文章設置後,也提示沒有許可權的錯誤,那麼請您按照下面的方法操作。

修改conf\authz檔如下,主要是路徑的修改:

[groups]

g_vip = morson

g_manager = michael

g_beijing = scofield

g_shanghai = lincon

g_headquarters = rory, linda

g_docs = linda

#這裡多加了一個根目錄的許可權控制描述

[/]

@g_manager = rw

* =



#以下部分對路徑做了一些修改

[/arm]

@g_manager = rw

* = r



[/arm/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =



[/arm/diary/beijing]

@g_manager = rw

@g_beijing = rw

@g_vip = r

* =



[/arm/diary/shanghai]

@g_manager = rw

@g_shanghai = rw

@g_vip = r

* =



[/arm/ref]

@g_manager = rw

@g_docs = rw

* = r



[arm:/temp]

* = rw

經過這樣的修改後,訪問時不會再報沒有許可權的錯誤,可以定制自己的許可權控制了。

Subversion對中文目錄的支援是非常好的,按照文章中的方法,可以很輕鬆的進行中文目錄的許可權控制,

當然,在保存authz檔時一定不要忘記選擇保存為“UTF-8 無BOM”。

Subversion 實務建議

Subversion 實務建議


蔡煥麟

huanlin.tsai at msa.hinet.net

Revision: 1.0  (Mar-18-2005)




實務 1. 備份檔案庫


一旦你使用了 Subversion 來管理版本,檔案庫就成為你開發時最重要的資產之一了,因此最好利用排程工具,定期將檔案庫備份,如果你的檔案庫都放在一個統一的目錄下,例如:d:/svn,就只要完整備份這個目錄就行了。




實務 2. 盡量熟悉命令列工具


儘管你大部分時候都是使用視覺化工具(例如:TortoiseSVN)來執行版本控制的日常工作,熟悉命令列工具仍然非常有用,特別是當你要執行一些批次作業時。




實務 3. 建立測試環境


有些團隊可能是用 nightly build 或 weekly build 的建置方式,然後對新建置的版本進行測試,這種方式可能是由專人負責建置,然後把新版的程式部署到測試機器上。


另一種可能的情況是,測試人員隨時都可以測試最新版的程式,也就是每當程式修改好,check in 到檔案庫之後,測試人員就要能測到最新版的程式。這種需求可以透過在測試機器上建立排程來達到,排程的工作是執行一個批次檔,而這個批次檔裡面就是些 Subversion 的 update 命令。例如:




REM 此批次檔用來更新測試機器的程式檔案

c:
cd\MyProject\BookWeb\BookWeb.war
svn update -N

cd Image
svn update
cd ..

cd Script
svn update
cd ..

cd Jsp
svn update
cd ..

cd WEB-INF\classes
svn update
cd ..\lib
svn update
cd ..




這種方式要注意一個問題,就是測試機器上的應用程式目錄裡面,每個目錄都會有一個隱藏的 .svn 目錄。如果要把測試機器上的檔案部署到用戶端,並且排除 .svn 目錄,就要使用 Subversion 的匯出(export)功能。





實務 4. 只 check in 完成的檔案


程式還有編譯錯誤及警告時,不要 check in 到檔案庫。一方面是基於測試的理由(程式當然是可以運作才放上去測試),另一方面,是因為這樣做可能會對別人造成困擾,因為別的開發人員可能有將整個專案 的程式碼取出,那麼每當他在本機上建置專案時,就會出現一堆編譯錯誤,包括他自己的程式和你的程式的錯誤。如果每個人都在程式還未能通過編譯時就 check in,那麼每次編譯專案產生的錯誤訊息將多到令人無法忍受。




實務 5. 每次 check in 時,輸入摘要事項


每當我們要 check in 檔案時,Subversion 會要求我們輸入一段文字,用來簡單說明這次 check in 做了哪些改變。你可以把重要的備註事項寫進去,以後如果要回頭比對版本,可以幫助你更找到需要的版本。




實務 6. 不要保留沒用的註解


以往沒有版本控制時,我們在修改程式時,常常會把一段程式碼註解掉,以便日後反悔時,可以恢復。但是這類註解掉的程式碼往往會一直留在那裡,直到程式改了好幾個版本,已經沒有利用價值以後,成為程式裡的一堆礙眼的垃圾。


有了版本控制以後,因為可以隨時回到任一個歷史版本,你可以放心的把不要的程式碼刪除,再配合實務 5,以後要恢復歷史版本就很容易了。




實務 7. 不要留下多餘的檔案


以往沒有使用版本控制系統時,我們有時候會自己做一點版本管理,例如修改 Foo.java 之前,先把它複製成一個新的檔案,並且加上序號,例如:Foo_1.java,然後再修改 Foo.java。現在有了版本控制系統,可以不用這樣了,免得多了一堆垃圾檔案。


我曾看過一種情況,就是有人還是習慣用附加編號的方式自己備份舊版的檔案,而且跟新版的檔案放在同一個目錄下,另一方面,他又習慣把程式的檔名用序號來命 名(懶得想個適切的檔名),結果備份的檔名和開發中的檔名都是用序號來命名,有一天某人要清理專案目錄中的垃圾時,就把所有帶序號的檔名都砍了,造成程式 無法編譯或執行。還好我們有時光機器可以回到過去,要不然就麻煩了。




實務 8. 檔名大小寫第一次就決定好


如果你的作業系統不區分檔名的大小寫,例如:Windows,你最好第一次就把檔案名稱的大小寫確定下來。否則如果日後要改檔名,而且新的檔名和舊的檔名只有大小寫的不同,例如:myprg.java 和 MyPrg.java,你在送交和更新時可能會碰到一些麻煩。




實務 9. 指定忽略的檔案


在一個專案裡面,可能有些目錄裡面的某些檔案是你不希望加入檔案庫的,因此你在第一次匯入檔案庫之前,最好先把這些檔案搬移到別處,等到匯入檔案庫之後,在把它們搬回來,並且將這些檔案加入忽略清單。 以 Web 應用程式為例,參考下列步驟:




  1. 先大致建構出網站的雛形,檔案目錄結構大致底定之後,才將檔案匯入檔案庫。




  2. 建立檔案庫,並且準備匯入檔案庫。有一些檔案可能是你不希望進行版本控管的,因為當其他小組成員更新這些檔案之後,可能會造成他的開發環境出問題,例如: 無法編譯或執行程式等。不管是什麼原因,只要你有不想要放入檔案庫的檔案,就在匯入檔案庫之前,先把整個專案的檔案複製一份到一個暫存目錄下(c:\ temp),然後把 c:/temp 中所有不想控管版本的檔案刪除掉,然後再匯入檔案庫。匯入完成後把 c:/temp 底下的檔案全部刪除。




  3. 取出專案。先把整個專案的檔案*搬移*到 c:/temp 底下,接著從檔案庫取出(check out)專案,假設取出至 d:/myprj 目錄下。




  4. 把 c:/temp 底下的所有檔案複製到 d:/myprj,注意所有已經存在的檔案都不要覆蓋掉,亦即只複製新的檔案過去。這些新的檔案並未加入版本控制,你可以把它們加入忽略清單(ignore list)裡面,以後這些檔案就不會被存入檔案庫了。





摘自:http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3200.aspx

wibiya widget