BloggerAds

2011年5月26日 星期四

Subversion(SVN)與CVS的比較

最近在比較CVS與SVN的差異,下列表格是整理出來的重點,參考看看:

項目 CVS SVN 
資料夾的版本控制 NG OK 
檔案重新命名 NG OK 
檔案移動 NG OK 
檔案複製 NG OK 
資料夾的刪除 NGOK 
新舊資料夾的比較 NG OK 
中文檔名的支援 Big5UTF-8 UTF-8 
檔案儲存 以實體檔案儲存 以資料庫儲存 
耗費Server空間大小   
Commit時,上傳的內容 上傳整個檔案 只上傳差異部份 
檔案類型區分 文字、binaryunicode 全視為Binary 
Commit時的檔案類型 要自已指定檔案類型 不需指定 
Commit的一致性 Rollback功能 Rollback功能 
檔案差異比較 只有文字可比較 全部檔案都可比較 
衝突處理 僅告知衝突 必須解除衝突才可Commit 
BranchTag的管理 可用版本號碼控管 必須手動用目錄來控管 


參考:
SVN中文手冊
http://twpug.net/docs/Subversion/
SVN官方網站
http://subversion.tigris.org/
選擇SVN的理由
http://blog.xuite.net/jackytseng7028/WikiLife/26020467

2011年5月22日 星期日

XSL中轉換產出格式的方法

使用XSL來轉XML時,若要在XSL中轉換產出值的格式,有下列幾種方式:
一、可使用一些內建的函式來做轉換 (但內建的函式實在是很少...):
<x:value-of select="format-number([節點名稱], '###,###')"/>
則會將數字的資料轉為如 123,456 這種格式

二、自已寫XSL的function來做轉換

三、寫Script來做轉換,這個方式可以做到的功能就很多了,看是要用JavaScript、C#、VB...都可以,下列的例子是用來做日期轉換的函式:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl [前置詞]" extension-element-prefixes="msxsl" xmlns:[前置詞]="urn:[前置詞]">

若是用Visual Studio 2008產生的XSL檔案的話,要在上面這段加入下面兩段文字
1. xmlns:[前置詞]="urn:[前置詞]"
2. exclude-result-prefixes="msxsl [前置詞]"

[前置詞] 是由自已隨便輸入的,但在使用時要注意全部都要相同。接下來再加入下列程式碼(範例):
<msxsl:script implements-prefix="[前置詞 ]" language="C#">
    <![CDATA[
      public string FormatDateTime(string xsdDateTime, string format) {
          DateTime date = DateTime.Parse(xsdDateTime);
          return date.ToString(format);
      }
    ]]>
</msxsl:script>

最後在使用時,直接像下面程式般呼叫函式,即可做到相當多的功能。
<xsl:value-of select="[前置詞 ]:FormatDateTime([節點名稱], 'yyyy MM DD')"/>

參考:
http://stackoverflow.com/questions/500915/format-a-date-in-xml-via-xslt
http://stackoverflow.com/questions/669291/xslt-decimal-formatting-based-on-input-xml
http://www.w3schools.com/xsl/

2011年5月19日 星期四

規則運算式(正規表示式)語法整理

以下為參考 Wiki 後,修改成自已比較能了解的規則運算式符號整理:

以下資料仍有一些不太了解或不知道該如何解釋的地方,請見諒。
編號字元描述
1\特殊字元的前置符號,將下一個字元標記為一個特殊字元。例如,「\n」代表換行符號。「\\」代表「\」而「\(」則代表「(」。
2^表示字串必須以後面的字元開頭。ex. ^aa,表示必須以aa開頭。
3$表示字串必須以後面的字元結尾。ex. aa$,表示必須以aa結尾。
4*表示 * 前面的字元可出現或不出現。例如:Gooo*gle 能匹配 Google、Goooooogle。* 等於 {0,}。
5+表示 + 前面的字元至少要出現一次(可出現多次),ex.go+gle 表示這個字串可以為gogle、google、gooooogle...。+ 等於 {1,}
6?表示 ? 前面的字元最多只可以出現一次(可不出現)。ex.colou?r 表示這個字串可以為color或colour。? 等於 {0,1}
7{n}大括號「{}」中包起來的數字n是一個非負整數。代表前面的字元一定要出現n次。例如:o{3} 可以為 Gooogle 的 ooo,但不能匹配 Google。
8{n,}大括號「{}」中包起來的數字n是一個非負整數。代表前面的字元至少要出現n次。ex.go{2,}gle 可以為google、goooogle,但gogle就不合格。
9{n,m}大括號「{}」中包起來的數字n是一個非負整數。代表前面的字元至少要出現n次,最多不可超過m次。n要小於等於m。ex. go{2,4}gle可以為google、goooogle,但gogle、gooooogle就不合格。
10?當?字元放在次數限制符號(*,+,?,{n},{n,},{n,m})後時,表示要不貪心的尋找,可增加效能。不貪心表示只要找到一個就好,不再找別的。
參考:http://deer.nublog.cc/article.php?i=20080225
11.表示除「\n」之外的任何字元。要表示包括「\n」在內的任何字元,請使用「[.\n]」。
12(pattern)小括號代表中間的pattern為一群組。
13(?:pattern)匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用。例如:run(?:n|ning) 能匹配 running 整個字串,並且從此字串後繼續比對。
13(?=pattern)正向預查,在任何匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?=2003|2007|2010) 能匹配 Office2003 中的 Office,但不能匹配 Office2005 中的 Office,而從 Office 字串後繼續比對。
14(?!pattern)負向預查,在任何不匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?!2003|2007|2010) 能匹配 Office2005 中的 Office,但不能匹配 Office2010 中的 Office,而從 Office 字串後繼續比對。
15x|y代表OR,ex. (A|a)pple 表示 這個字串可以為Apple或apple
16[xyz]代表可為中括號[]內的任一字元。ex.[abc]表示可為a、b、c任一字元。
17[^xyz]代表不可為中括號[]內的任一字元。ex.[abc]表示不可為a、b、c任一字元。
18[a-z]代表可為中括號[]內的字元區間內的任一字元。ex.[a-z]表示可為a~z間的任一字元。
19[^a-z]代表不可為中括號[]內的字元區間內的任一字元。ex.[a-z]表示不可為a~z間的任一字元。
20\b表示字和空白之間的交會點。ex.於aa bb aabb時,可以用 aa\b 找出 aa,而不會找出aabb、也不會找出「aa (空格)」。
21\B表示非字和空白之間的交會點
22\cx表示一個控制字元。例如,\cM匹配一個Control-M或Enter符。x的值必須為A-Z或a-z之一。否則會將c視為一個單純的「c」字元。
23\d可為任何數字。\d 等於[0-9]。
24\D不可為數字。\D 等於[^0-9]。
25\f換頁符號。\f 等於\x0c和\cL。
26\n換行符號。\n 等於\x0a和\cJ。
27\rEnter符號。\r 等於\x0d和\cM。
28\s代表任何空白字元,包括空格、製表符、換頁符等等。\s 等於[\f\n\r\t\v]。
29\S代表任何非空白字元。\S 等於[^\f\n\r\t\v]。
30\t代表Tab字元。\t 等於\x09和\cI。
31\v代表垂直Tab字元(Vertical Tab)。\v 等於\x0b和\cK。
32\w可為包括底線「_」的任何文字、數字。\w 等於「[A-Za-z0-9_]」。
33\W不可為包括底線「_」的任何文字、數字。。\W 等於「[^A-Za-z0-9_]」。
34\xn表示為n所代表的ASCII字元,n為十六進位值。十六進位值僅可寫兩個字元。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。
35\numnum是一個正整數。對前方括號內的字元做重複的動作。例如,「(.)\1」代表兩個連續的相同字元。
36\n標識一個八進制轉義值或一個向後參照。如果\n之前至少n個獲取的子運算式,則n為向後參照。否則,如果n為八進制數位(0-7),則n為一個八進制轉義值。
37\nm標識一個八進制轉義值或一個向後參照。如果\nm之前至少有nm個獲得子運算式,則nm為向後參照。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後參照。如果前面的條件都不滿足,若n和m均為八進制數位(0-7),則\nm將匹配八進制轉義值nm。
38\nml如果n為八進位數字(0-3),且m和l均為八進位數字(0-7),則代表八進位數字所代表的值。
39\unn是一個用四個十六進位數字表示的Unicode字元。代表n所表達的字元。例如,\u00A9代表版權符號(©)。
40\onn是一個用二個八進位數字表示的Unicode字元。代表n所表達的字元。例如,\o47。
參考資料:
http://deer.nublog.cc/article.php?i=20080225
http://ericbbs.blogspot.com/2009/08/2.html

2011年5月14日 星期六

PHP fopen、file_get_contents使用注意事項

當使用PHP中的fopen、file_get_contents..等函數等,Server端一定要可以連到該URL的網頁,語法如下:
file_get_contents([URL])

若出現下列錯誤訊息:
Message: file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution

表示Server的IP變更過,而Apache沒有重新啟動過,這時只要將 Apache重新啟動即可解決這個錯誤。

CentOS 5.5中PHP升級至 5.3的方法

因為json_decode這個function 只在php 5.2以後支援,而CentOS 5.5 中的php卻只有5.1,官方的yum更新也還沒推出,所以在php升級這一塊,就得另外想辦法。

在參考google大神的意見之後,升級至5.3版最簡單的方法大概是這個吧:
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh epel-release-5*.rpm
rpm -Uvh remi-release-5*.rpm 
yum -y --enablerepo=remi update php-\*

若你的MySQL沒有升級,還是5.0版的話,上列命令執行後,會出現衝突的錯誤,錯誤訊息如下:
Transaction Check Error:
  file /etc/my.cnf from install of mysql-libs-5.5.12-1.el5.remi.i386 conflicts with file from package mysql-5.0.77-4.el5_5.4.i386
  file /usr/share/mysql/charsets/Index.xml from install of mysql-libs-5.5.12-1.el5.remi.i386 conflicts with file from package mysql-5.0.77-4.el5_5.4.i386
  file /usr/share/mysql/charsets/cp1250.xml from install of mysql-libs-5.5.12-1.el5.remi.i386 conflicts with file from package mysql-5.0.77-4.el5_5.4.i386

看到上面這個錯誤訊息,其實也不用將mysql移除再重裝,直接執行下面的命令去更新mysql到最新版本即可,而且會連php、php-mysql都更新成5.3.6。
yum -y --enablerepo=remi update mysql-\*

參考資料:
http://forum.icst.org.tw/phpbb/viewtopic.php?f=16&t=19416
http://blog.wu-boy.com/2009/09/rhelinstalling-php-52x-or-53x-on-redhat-es5-centos-5/

2011年5月13日 星期五

Google Map Javascript API 3的一些重點

以前在用Google Map JavaScript API v2時,在升級成v3後,有幾個比較不同的地方
要觀看教學的話,可參考 Google Map的tutorial

一、API Key
在v2時,要載入Google Map JavaScript API的函式庫前,必須先至 Google Map 開發人員網站 申請一個API Key,再用下列語法將函式庫載入:

<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&key=[API KEY]"></script>
在v3時,只要用下列語法即可:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=[true or false]" ></script>
要指定版本的話,加個 v 參數:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3&sensor=[true or false]" ></script>

省了申請API這個麻煩的事,而且v2還要再申請自已會用到的網址,每次要用新網址都要再申請,很麻煩,現在v3都省了。
後面那個sensor的參數,是在設定要不要使用定位裝置,這在寫Mobile網頁很好用,以前v2要使用的話,要加上下面這個語法:

google.load("maps", "2",{"other_params":"sensor=true"});

二、GUnload 
v2在使用時,若不想讓Client端的記憶體用一用就爆掉,就必須加上:

<body onunload="GUnload();">
讓網頁在unload時釋放資源,現在v3可省事多了,不用寫任何一段Code就會自動釋放資源,不會一直佔著你的記憶體。所以從v2改v3的朋友,可以把GUnload拿掉啦。

2011年5月9日 星期一

Web.Config中 * 與 ? 的差別及順序

在Web.Config 中
<location path="dir1">
   <system.web>
     <authorization>       
       <deny users="?"/>
       <allow users="*"/>
    
     </authorization>
   </system.web>
</location>

其中
? = guest
* = everyone


這個例子的目的是「只讓有登入的人員可以存取這個目錄,未登入人員不可存取」,所以設定成不讓guest存取後,再讓everyone存取。
若順序相反成:
 <allow users="*"/>
 <deny users="?"/>

則系統判斷時,會因為一開始就允許everyone,而guest也屬於everyone,所以guest可以存取此資料夾,再下面的deny就等於沒作用了,會讓未登入的使用者也可以存取此資料夾,這點要注意!