blogspot.com-GA4

星期四, 6月 18, 2009

IIS+Tomcat 整合環境測試

目前還有問題仍在尋找關鍵點中,老實說可能還是卡在了 isapi吧!!
看了很多文章還是沒有用 開了.jsp 頁面,
還是變成直接開啟文字檔把程式碼給全都抓出來了,
卡在哪一點真的不曉得,
請客戶從防火牆下手看看吧!!
這樣子效能也比較好摟


一、安裝環境

測試環境
IIS 5.1
tomcat 6.0.20

1. 先安裝設定好 IIS Tomcat
※安裝Tomcat時把Tomcat旁邊的+號點開勾選Service和Native。

2. 安裝Tomcat Connector mod_jk

1.2

用預設安裝 C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector
※到tomcat.apache.org下載新版的isapi_redirect.dll,覆蓋掉上個步驟產生的檔案
isapi_redirect.dll
※這一步需要測試

3.新增一個環境變數,變數名稱輸入CATALINA_HOME,變數值輸入Tomcat的安裝路徑,例如我的內容是:C:\Program Files\Apache Software Foundation\Tomcat

6.0.20

二、開始設定 IIS、Tomcat

**1. 在點選你的WEB站台中新增一個虛擬目錄名叫 jakarta ,目錄請指到 isapi_redirect.dll,權限請選擇「讀取」、「執行指令檔」、「執行」三項

2. 啟動IIS點選你的WEB站台按右鍵,選「內容」進入「ISAPI篩選器」→新增,篩選器名稱輸入「Jakarta Redirector」,執行檔輸入「C:\Tomcat 4.1

\bin\iis\isapi_redirect.dll」(視你實際的位置而定)

3. 打開一個記事本輸入以下內容
[code]
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0]
"extension_uri"="/jakarta/isapi_redirect.dll"
"log_file"="C:\\Program Files\\Apache Software Foundation\\Jakarta Isapi Redirector\\log\\iis_redirect.log"
"log_level"="emerg"
"worker_file"="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0.20\\conf\\worker.properties"
"worker_mount_file"="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0.20\\conf\\uriworkermap.properties"
[/code]

※ 再看文章時 看到註冊檔如果為 "extension_uri"="/tomcat/isapi_redirect.dll" 此時他的 "虛擬目錄" 設定也是叫 tomcat 名稱相同
其中這兩項
"worker_file"="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0.20\\conf\\worker.properties"
"worker_mount_file"="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0.20\\conf\\uriworkermap.properties"
為關鍵,其中的檔更為關鍵,內容和格式都很重要,用exe安裝這部份就可省略。


將該內容另存成iis_redirect.reg在任意位置,
檔案建好之後即可執行該檔案,按下確定後會將檔案內容註冊進windows裡頭
※記得在這個檔案中的 jakarta 要與 虛擬目錄 名稱相同

4. 到tomcat\conf下打開一個記事本輸入以下內容並將檔名存成worker.properties

# ************ Begin worker.properties **************
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp13
worker.tomcat_home=C:\Program Files\Apache Software Foundation\Tomcat 6.0.20
#上面這一行指到你的tomcat目錄
worker.java_home=C:\Program Files\Java\jdk1.6.0_10
#上面這一行指到你的java的目錄
ps=\
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
# 這裡有說要改成主機功能變數名稱位址
# ************ End worker.properties **************


5. 到tomcat\conf下打開一個記事本輸入以下內容並將檔名存成uriworkermap.properties

# ************ Begin uriworkermap.properties **************
default.worker=ajp13
/=$(default.worker)
/*=$(default.worker)
/ROOT/=$(default.worker)
/ROOT/*=$(default.worker)
/manager=$(default.worker)
/manager/*=$(default.worker)
/examples=$(default.worker)
/examples/*=$(default.worker)
/tomcat-docs=$(default.worker)
/tomcat-docs/*=$(default.worker)
/webdav=$(default.worker)
/webdav/*=$(default.worker)
#以上的目錄結構,視您webapps下的目錄結構自行增減,

#例如webapps目錄底下如果建立了一個ePOS的資料夾,
#那麼上面就得再加上
/ePOS=$(default.worker)
/ePOS/*=$(default.worker)
# ************ End uriworkermap.properties **************


三、模擬環境(視實際情況而定)
1. C:\WINDOWS\system32\drivers\etc\hosts

#127.0.0.1 localhost
127.0.0.1 www.frt.com
127.0.0.1 www.a.com

2. 打開IIS管理器,在左側網站一欄新建網站:www.frt.com,其目錄指向空目錄C:\Inetpub\frt\,讓網站有執行(如ISAPI應用程式或CGI)的許可權。
同時,在tomcat中也要建立相同的站點,修改conf/server.xml,添加:
unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
prefix="ovtch_vm_log." suffix=".txt" pattern="common" resolveHosts="false"/>

注意站點目錄與IIS中是不同的,這個會默認在ROOT中。


3. 在ROOT目錄底下建立了一個ePOS的資料夾,則在該資料夾中建立一個名為WEB-INF的資料夾,並在WEB-INF資料夾中建立兩個名為classes和lib的資料夾

4. 先將TOMCAT關閉,再將IIS重新啟動,再開啟TOMCAT

5. 將電腦關機幾秒鐘之後再開機

6. 開機後在IE裡輸入http://localhost/examples/jsp/dates/date.jsp,重新整理幾次確定JSP程式能正常執行

7. 將自己寫的*.jsp網頁放進ROOT以及ROOT中的目錄裡,假如目錄名稱為ePOS,檔案名稱為test.jsp

8. 在IE裡輸入http://localhost/test.jsp以及http://localhost/ePOS/test.jsp,若有正常執行程式的話就表示您已經成功了

9. 若是失敗的話請先檢查第10步及以後的步驟,再不成功的話就請將以上全部檢查一遍吧

10. 當其它目錄中的網頁要連結進您的JSP網頁時可用絕對路徑法或是URL




但或許此時還不行,這時你該確認以下幾點:
1.你的「Internet信息服務管理器」->「網站」->「默認網站」->「屬性」->「ISAPI篩選器」中的jakarta是否是向上的綠色箭頭?如果是紅色的,檢查一下你之前做

的配置有沒有少了或是寫錯了點什麼,再重新配置一遍
2.確認你的Tomcat安裝目錄下的common\lib目錄中是否有tools.jar文件(Tomcat5好像是有的,但Tomcat4中是沒有的,網上的文檔很少提到這件事,致使我多次配置

失敗),沒有的話從JDK的lib下拷一個過去。
3.IIS指向的目錄最好和Tomcat指向的目錄一致,不然會發生找不到圖像和其他資源文件的問題。(這點不影響執行,呵呵!)
4.英文文檔中還提到應該把IIS6設置為IIS5隔離模式,「Internet信息服務管理器」->「網站」->「屬性」->「服務」,把「以IIS5.0隔離模式運行WWW服務」打上勾

。不過我不打勾也能正常使用,如果你配置不成功也可以試試這個。



注意的問題:
1,注意你的兩個配置檔workers.properties和uriworkermap.properties和註冊表的新添加的內容,如用exe安裝版jk,則不用擔心這個了。
2,要注意IIS要對這個jakarta目錄有足夠的許可權.如果你的篩選器添加失敗很有可能是許可權的原因.
3,這裏有可能出現ISAPI篩選器不能載入的問題,狀態一欄是紅色箭頭,許可權問題。
4,添加新的Web 服務擴展jakarta之外還要使它允許。另外同樣要注意許可權的問題,因為涉及到Internet訪問,還有就是注意拼寫不要寫錯,比如把jakarta寫

成了jarkata。
5,如果你前面都對,只是你輸入http://www.test.cn/hello.jsp,沒有出現你要的頁面.那麼還請查看還有你有沒有開啟 Tomcat,並在Tomcat引擎中是否載入了和

IIS相對應的WEB應用?加上8080埠是否能訪問,如果能,那估計就是jk的連接出了問題。
 其實正常的話,整個過程是不需要重啟iis的。

補充:
上面的完成後,其實還有一個問題,就是index.jsp並不能當做默認頁面來處理,即訪問www.test.com是看不到效果的,必須加上index.jsp這樣的具體檔案名才行,怎

麼解決呢?
方法一:使用index.html來跳轉,方便,實用,但會影響一定速度,也不是本問題的根本解決辦法,因為,不可能每個有index.jsp的目錄,每個站點,都添加個

index.html吧?
。
方法二:首先在iis里加應用程式擴展.jsp找相應dll來處理,然後配置默認文檔為index.jsp,重啟服務後查看,結果是不可以的!!事實證明,這種常規的想法是不正

確的。
方法三:正是本文採取的方法,也是比較好的解決方法,其實就是弄明白一個問題,這所以能讓它行,是為什麼行呢?原因在於iis轉來的請求類型,即在檔

uriworkermap.properties這個中,打開後可以看到,
/admin/*=wlb
/manager/*=wlb
/jsp-examples/*=wlb
/servlets-examples/*=wlb
//以下兩行是經過處理後加的
/*.jsp=wlb
/*.do=wlb
//意為所有.jsp,.do的檔都交由tomcat來處理,還在上面的那些目錄,明確指出了尾碼名,所以要做修改:
/*.jsp=wlb
//即所有的請求都由tomcat來處理,這就出現了問題,那所有的asp,jpg等等所有檔都轉來處理,就失去了整合的意義,所以要做如下添加:
//意為如下格式的不用wlb處理,還是由iis來處理,就減少了tomcat處理的能效,並且 iis處理這些檔能效更高一些
!/*.jpg=wlb
!/*.asp=wlb
!/*.gif=wlb
!/*.js=wlb
!/*.swf=wlb
!/*.png=wlb
!/*.htm=wlb
!/*.html=wlb
!/*.rar=wlb
!/*.zip=wlb
!/*.avi=wlb
!/*.rmvb=wlb
//修改完畢
# Optionally filter out all .jpeg files inside that context
# For no mapping the url has to start with exclamation (!)
!/servlets-examples/*.jpeg=wlb
#
# Mount jkstatus to /jkmanager
# For production servers you will need to
# secure the access to the /jkmanager url
#
/jkmanager=jkstatus
這樣解決了JSP站點的問題,但如果所有的其他請求都轉過來了,肯定也不行了,因為,ASP,PHP的站點同時也需要在tomcat中設置相應站點 了,太麻煩,也不是整合

的目的,所以,把ISAPI篩選器 配置到每一個需要支援jsp的站點,而不是配置到IIS的全局設置中,這樣實現了,IIS中的沒有配置為支援JSP的站點,就會與ISAPI與

TOMCAT都沒有任何關係,這樣就很好的解決了此問題,要注意,做方法三時,方法二中所說的並不用做,也就是不用在IIS中所為實現index.jsp 為目的的任何設置。
總結:
說到底,這就是兩種服務的一種集成,使之外部看起來像一種服務,可以這麼理解:
外部訪問功能變數名稱-->解析後到IP-->IIS查找相應站點-->發現jsp文件-->轉至jk連接處理-->將相應檔解釋轉給Tomcat-->將頁面返回給IIS-

->展現給用戶端。
那麼哪出了問題,就查哪,一步一步來,一定能成功的,希望對大家有所幫助,另外多看官方手冊,多想其中的原理,網上流傳的各種文檔不一定就是正確的,包括本

文,只是儘量詳盡的給一種引導。




參考來源:
http://www.javaworld.com.tw/jute/post/view?bid=9&id=99459&sty=1&tpg=1&age=-1

http://www.atcns.com/blog/?p=179

http://www.diybl.com/course/4_webprogram/jsp/jsp_js/200889/135268.html

http://melinhunter.blogspot.com/2006/12/iis-tomcat-6.html

星期日, 6月 07, 2009

R-Proxy - 使用Apache架設(轉)

R-Proxy - 使用Apache架設

來源:http://www.study-area.org/tips/r-proxy.txt

作者: Duncan Lo < duncan@twn.wox.org >

更新日期: 2002.07.08
適用對象: 防火牆或系統管理員.
適用條件: 對 Linux 環境有基礎的管理及操作能力.
文章附註: 本篇文章為自由文件,歡迎非商業性質轉載,並請註明出處!
商業性質轉載請來信告知!
特別注意: 1.本篇文章提供之程式及設定*不一定*符合您的環境,
請依您的系統環境適當地修改程式及設定.
2.在執行任何具破壞性的動作及行為前,
請確認您已作好完整可用的資料備份工作.


-

本文共分兩個單元,第一單元是簡介 R-Proxy 基本觀念,及使用 Apache 架設 R-Proxy 的方法基本設定,第二單元是利用 Apache Rewrite 模組,使用 R-Proxy 設定Web 主機的分散負載及主機容錯的功能.


-

第一單元: 架設 R-Proxy


一般的 Proxy 主機,是服務內部的 Client 上網用的,通常都是用 Squid 架設,同時為了存取效率及節省頻寬, Squid 本身也提供 Cache 的功能,所以一般 Proxy主機也稱為 Proxy Cache Server 代理快取伺服器.


R-Proxy 本身也是一種代理伺服器,那個 R 代表的是 Reverse 反向的意思,最主要的用途是反過來代理,替 Internet 的使用者代理存取內部受限制的網站,假如有開啟 Cache 功能,它同樣可以提供 File Cache 的功能,簡單來說 R-Proxy就像是把 Proxy 的架構及需求,反向過來,使用者角色對調的意思.詳細的介紹可以參考最後面的 Netscape Proxy Server - Reverse Proxy 圖文.


R-Proxy 實際應用上多與防火牆整合在一起,代理存取內部的網站,不讓外部使用者直接存取內部受限制及保護之網站,或是將 Web 依目錄結構由數台主機來分散服務,實測上,只要路徑及設定正確,該 R-Proxy 可以支援如html,php,asp,java及cgi程式的Web 環境.而內部的 Web 主機可以設限只有 R-Proxy 的 IP 位置才可來存取,而一般的Internet 使用者不行直接存取,相當於把 R-Proxy 當成一台虛的 Web 主機,相對的,網站的安全性也提高了.


在使用上, Proxy Cache 需要 Clien t在 IE, Netscape 內設定,或是在 Firewall上設成通透式的Cache方式,才可以使用 Proxy Cache 的功能,但用 R-Proxy, 使用者是完全不用作任何設定,只要 Firewall 或 Web 管理員把 R-Proxy 設好就行了.


R-Proxy 的作法有很多種,使用 Apache 架設是目前最容易的方法,請特別注意,以下的教學是以 TurboLinux 7 Server 及 Apache 1.3.20 作示範,你實際的環境可能會需要作一些修改.還有以下的所說的 Proxy 是指一種功能,請不要跟 Squid 這個作快取代理的軟體弄混了...


首先,你要先確認你的 Apache 有 proxy 這個 modules, 通常在httpd.conf內會有像下面兩行的 modules 設定:

LoadModule proxy_module /usr/libexec/apache/libproxy.so
AddModule mod_proxy.c


確定 Apache 有 Proxy 這 modules 後,就可以開始來設定,找到下面這一段:





在裡面加上或把某幾行的#拿掉,內容大概會像這樣:

ProxyRequests On

Order deny,allow
Deny from all
Allow from .your_domain.com



把 Allow from 修改成你予許的來源位置.接下要設定你要代理的Web主機位置,把設定加入:

ProxyPass / http://192.168.1.7/


上面那個 / 是指 Web 根目錄,後面的網址是內部的 Web 主機位置.


Ok!完成,可以用 Browser 連到你架的 R-Proxy 主機試試,若是 R-Proxy 架在 Firewall 上,可能要把 httpd port 作適度的開放,但不再需要作轉 port 的動作,你會發現,你連到 R-Proxy 主機的網頁內容就是你指定的那台 Web 主機.


你也可以把網頁分散在不同的主機上,因為只有一個 Web 主目錄,所以可以依Web 目錄來分,設定的方法像:

ProxyPass / http://192.168.1.3/
ProxyPass /webmail http://192.168.1.2/webmail/
ProxyPass /sales http://192.168.1.7/
ProxyPass /bbs http://192.168.1.10:8888/


這邊有個重點,就是各主機網頁的目錄結構位置最好也是依循Web主目錄的結構,像上面第 1 跟第 2 行執行應該不會有問題,不過第 3, 4 行,就不一定可行,因為 Web 路徑可能會不對,特別是該目錄有又有次目錄時,因為這 R-Proxy 是作代理存取的動作,而不是作轉址的動作,所以可能需要另外搭配 ProxyPassReverse 的指令.就像這樣:

ProxyPass / http://192.168.1.3/
ProxyPass /webmail http://192.168.1.2/webmail/
ProxyPassReverse /webmail http://192.168.1.2/webmail/
ProxyPass /sales http://192.168.1.7/
ProxyPassReverse /sales http://192.168.1.7/
ProxyPass /bbs http://192.168.1.10:8888/


這樣像 http://192.168.1.2/webmail/images 就會轉到 /webmail/images 去,而不是 /images 這個錯誤路徑,不過還需注意的,就是次目錄的指定在網頁程式內的寫法,還是必須以"相對位置"的方式撰寫,使用"絕對位置"的方式還是有出錯的可能.

我測試的 Apache proxy module 是不提供輪詢的功能,所以假如你的設定是下:

ProxyPass / http://192.168.1.3/
ProxyPass / http://192.168.1.2/


基本上,還是只有第 1 條設定生效,而且也不提供容錯的功能,所以上面設定指的第 1 台主機掛了,網頁還是連不到的,因為它不會自動啟用第 2 條設定,這部份就必須要搭配 Apache的 rewrite 模組或其他具有錯誤偵測的 r-rproxy 模組了.


假如你想啟動 Cache 功能,可以參考 Apache 設定手冊,增加幾個有關 Cache 的設定,實際使用上因為 R-Proxy 也許只代理存取內部的 Web 主機, File Cache 的異動及數量不大,在一些較複雜及中大型的 Web 網站比較適合,你可以自己斟酌要不要使用 Cache 的功能.相關的設定參數如下:

CacheRoot "/var/proxy"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
NoCache a_domain.com another_domain.edu joes.garage_sale.com


使用了 R-Proxy 之後,還有一點不同的地方,就是 httpd log 的內容,原本讓任何使用者直接存取 Web 主機時, httpd log 內紀錄的是連線 Client 的 IP 位置,但使用了 R-Proxy 後,log 內紀錄的都將會是 R-Proxy 的 IP 位置,而 Client 的真實存取紀錄則會紀錄在 R-Proxy 內的httpd log 內,所以要追查連線問題,則需要多檢查 R-Proxy 的 httpd log 內容.


目前 R-Proxy 主機只有少數中大型網站有架設,但實際應用上, R-Proxy 是可以改善 Web 存取效能,增加實體 Web 主機的安全性,我手上的有關 R-Proxy 資料還不完整,商業產品有很多已利用 R-Proxy 的觀念作到多線,異地的負載平衡及容錯存取,而且可以支援非 httpd 服務.而在要作到像那些產品的功能可能就要考慮以 Squid 來實作 R-Proxy 功能了...


參考資料:

1.Apache - module mod_proxy
http://httpd.apache.org/docs/mod/mod_proxy.html

2.Netscape Proxy Server - Reverse Proxy
http://developer.netscape.com/docs/manuals/proxy/adminux/revpxy.htm

3.IBM HTTP Server
http://tst.sinica.edu.tw/manual/ibm/index.html


-

第二單元: R-Proxy 的分散負載及主機容錯


在上一個單元內,可以發現基本的 R-Proxy 只能單純的依網頁目錄分散在不同的主機,而且一個網頁目錄只能連結一台主機,當某台主機當機,該連結的網頁目錄便失效了,這種單一靜態的分散服務及缺乏容錯機制的功能,並不是較好的 R-Proxy 功能.


在 http://pihl.kumpu.org/mod_curltunnel.html 有提供一個 CrulTunnel 模組,它提供類似於 ProxyPass 及 ProxyPassReverse 的指令 CrulTunnelPass 及 CrulTunnelPassReverse,安裝 CurlTunnel 模組系統必需要有 http://curl.haxx.se/ 的 libcurl 函數,但實測後發現, CurlTunnel 模組只是使錯誤連結的 404 錯誤訊息不再出現,還是不提供容錯的功能,所以這也不是我們想要的.


想要解決網頁連結錯誤的問題,必須在 URL 路徑發生問題時, Apache 就要自動辨識錯誤,並導向正確或是錯誤訊息回應的網址,在 Apache 中就有一個提供這樣可以依條件及規則轉換URL 路徑的模組 - Rewrite, Apache Rewrite 模組是一個功能強大的 URL 路徑維護模組,它可以依條件,規則或外部程式,資料來轉換網頁的 URL 路徑.


以下的測試環境,同樣是將 R-Proxy 架設在防火牆上,而防火牆內有數台 Web 主機.


首先,你要先確認在你主機上有 Rewrite 模組,而且在 httpd.conf 內有類似下面的設定:

LoadModule rewrite_module /usr/libexec/apache/mod_rewrite.so
AddModule mod_rewrite.c


首先,啟用 Apache Server Status 功能,找到下面這一段,把前的 # 號拿掉,並適當的修改Allow from 的位置:


SetHandler server-status
Order deny,allow
Deny from all
Allow from .yourdomain.com



再來,在 httpd.conf 內加入 Rewrite 模組的設定,像下面:

# Rewrite

RewriteEngine on
RewriteLogLevel 0

RewriteMap server rnd:/etc/httpd/conf/rproxy-server

RewriteRule ^/rproxy-status.* - [L]
RewriteRule ^(http|ftp)://.* - [F]

RewriteRule ^/(.*\.(cgi|shtml))$ to://${server:dynamic}/$1 [S=1]
RewriteRule ^/(.*)$ to://${server:static}/$1

RewriteRule ^to://([^/]+)/(.*) http://$1/$2 [E=SERVER:$1,P,L]

RewriteRule .* - [F]



上面的 RewriteMap 後面是指定一個設定檔,設定檔內是所有要當作分散負載的主機群成員位置,主機的性質有兩種,一種是只有存有靜態資料的 Static 主機,另一種是存有 cgi 及 shtml(Server Side Include )的動態處理,假如有數台 Web 主機,就可以將它們的位置設定在上
所指定的 rproxy-server 內,內容像下面:

static w1.test.com|w2.test.com|w3.test.com|w4.test.com
dynamic w5.test.com|w6.test.com


然後在 httpd.conf 內把 proxy 模組的設定加入,像下面:


ProxyRequests On
NoCache *
ProxyPassReverse / http://w1.test.com/
ProxyPassReverse / http://w2.test.com/
ProxyPassReverse / http://w3.test.com/
ProxyPassReverse / http://w4.test.com/
ProxyPassReverse / http://w5.test.com/
ProxyPassReverse / http://w6.test.com/



再來只要重新啟動 httpd 就可以了,你可以先在這 6 台 Web 主機存放不同的網頁內容,再使用
Browser 連線測試,你可以發現網頁的內容,會在一直不斷的輪詢,若是將其中一台主機離線,再測試,你可以發現並不會發生連線錯誤,也就是說 proxy + rewrite 的 R-Proxy 功能,除了會分散負載,還有主機容錯的功能.


等要正試上線時,只要定時同步這 6 台網頁主機的內容,而 cgi 動態處理部份是由於上面範例中的w5,w6 兩台主機來處理. httpd log 部份如同第一單位所說, Client 的真實 IP 只會存在於 R-Proxy那台的 httpd log 內,而其他所有的 Web 主機,只會記錄 R-Proxy 主機 IP 來存取.


目前上面這些設定的環境,都是以主機同時存在同一個地方為主,要作到異地的 Web 網站平衡負載,就要搭配 DNS Round-Robin 的方式來達成.


利用 R-Proxy 的作法是比 Linux LVS 的作法單純而且簡單多,假如在 Rewrite 內多加一些權重的計算及分配, R-Proxy 所以提供的功能並不會輸給 Linux LVS, 功能上主要的差別應該是 Linux LVS可以提供多台 Cluster 的 Controler, 而且可以自動備援切換.


參考資料:

1.Apache module mod_rewrite
http://httpd.apache.org/docs/mod/mod_rewrite.html

2.Apache URL Rewriting Guide
http://www.engelschall.com/pw/apache/rewriteguide/

星期一, 5月 25, 2009

(轉)為何叫桃花運不叫其他花呢?桃花運的由來如下

為何叫桃花運不叫其他花呢?桃花運的由來如下:

出自:

去年今日此門中,

人面桃花相映紅;

人面不知何處去?

桃花依舊笑春風。


這首崔護寫的“題都城南莊”詩流傳甚廣,至今仍有不少人能朗朗吟誦。然而知詩者並非盡知這首詩中還隱藏著一個動人的愛情故事。故事中飽含著才子佳人的純真之情,情節曲折神奇,人們稱之為“桃花緣”,也稱桃花運。

崔護是唐德宗貞年間博陵縣的一位書生,出身于書香世家,天資純良,才情俊逸,性情清高孤傲,平日埋頭寒窗,極少與人交往,既使偶而偷閒出遊,也喜歡獨來獨往。這一年的清明時節,正逢一個難得的晴朗天氣,屋外桃紅柳綠、蝶舞蜂飛、清風微拂、春意襲人。午後春日暖照,苦讀了一上午的崔護深為春的氣息所感染,決心去郊外好好體味一下春的盛情。於是放下書本,興致勃勃地獨自步行出城。一路上楊柳花飛、鶯燕啁鳴、暖陽和風、瑞氣宜人。苦讀不知春已濃的他頓覺心身清爽。一路漫行,看不盡的紅花綠草,春山春水,他恣意享受著大自然賜予人類的禮物,渾然不知道路的遠近。不知不覺離城已遠,他忽然覺得有些腿酸口渴,尋思著找一處鄉野農家歇歇腳、討些水喝,以便日落之前趕回城去。這裏已是僻野,農家住得極為零落,他舉目四眺,望見不遠山坳處,一片桃花掩映中露出一角茅屋,於是加快腳步朝山坳走去。臨近山腳,在遠處能望見的茅屋這時反而全部被桃樹遮住,眼前只有一片蔚然的桃林:桃花灼灼,綴滿枝椏,微風吹來,清香繞人,讓人疑是誤入了桃花源中。沿著桃林間的曲徑往裏走,在一小片空隙中有一竹籬圍成的小院,院落簡樸雅潔。院中住著茅屋三楹,全用竹板茅草搭成,簡陋卻整齊異常。崔護心想:“何方高人,隱居在如此別致的地方。”

走近柴門,他叩門高呼道:“小生踏春路過,想求些水喝!”一邊叫門,他一邊猜想,出來開門的必然是一位白髮美髯、竹杖芒鞋、相貌清奇、談吐風雅的老翁。吱呀一聲,房門敞開,不料走出的卻是一位妙齡少女。少女布衣淡汝,眉目中卻透出一股清雅脫俗的氣韻,使崔護甚感驚訝。他再次說明來意,少女明眸凝視,覺得來者並無惡意,就殷勤地將他引入草堂落坐,自往廚下張羅茶水。崔護打量著四周,只見室內窗明几淨,一塵不染,靠牆放著一排書架,架上置滿詩書,桌上筆硯羅列,牆壁正中懸掛著一副對聯,聯文是:“幾多柳絮風翻雪,無數桃花水浸霞。”語句雅致,情趣不俗,絕不同於一般鄉野農家的風格。臨窗的書桌上正擱著一幀墨漬未幹的詩箋,上面寫著一首“詠梅”五言絕句:



素豔明寒雪,清香任曉風;可憐渾似我,零落此山中。



詩句一定是這裏的主人所書,似乎是在借梅花來感歎自己的坎坷身世,竟是這樣充滿著蕭索與無奈。到底是何等人物隱居在這裏?又是何等心情與遭際而衍出如此無奈的文字呢?一連串的問號浮起在崔護腦際,使得他對這桃花環繞的茅舍以及茅舍的主人大感興趣,一心想要探個究竟。

這時,少女托著茶盤從廚房中出來,她落落大方地走向崔護,見對方正凝視著牆上的對聯似乎在品味,她會心地嫣然一笑,輕輕地喚一聲:“相公,請用茶。”崔護從思索中轉過神來,見少女正向自己走來,粉白透紅的臉上秋波盈盈,不施脂粉的打扮,素淨的布衣,更加襯托出少女的純真和靈秀,宛如一朵春風中的桃花,向人們展示著生命的風采。一時間,崔護竟然有些看得發怔,少女似乎察覺了他的心意,迅即垂下眼簾,一份嬌羞把她點綴得更加動人,崔護不由得心旌搖曳,險些兒難以自恃。

但畢竟是飽讀詩書,通情識禮的書生,崔護努力穩住自己的情緒,不致于在少女面前失態。他禮貌地接過茶杯,輕輕呷了一口茶水,故作鎮定地表明自己的姓氏和鄉里,接著又十分客氣地叩問少女的姓氏及家人。少女似乎不願多提這些,只是淡淡地說:“小字絳娘,隨父親蟄居在此。”並不提及姓氏和家世,似乎有什麼難言之隱,崔護自然也就不便多問了。

然而牆上的聯句、桌上的詩句、以及眼前的人物,這一切所透露出來的,都強烈地暗示著這茅舍的主人,必有一番不凡的來歷。崔護的心目中形成了一團迷霧,但既然人家不願多談,他也就只好擱在一邊了。兩人在屋中靜默了一會兒,崔護將話題轉到景物上.他大贊此地景色宜人,猶同仙境,是遊春不可多得的好地方。少女只是聽他高談闊論,含笑頷首似是贊同,卻並不說話。說到春天,崔護詩情大發,又對古今著名的遊春詩詞品評了一番,最後說道:“花開堪摘直須摘,莫待無花空折枝”。

說完,他意味深長地望著絳娘,等著她的反應。靈慧的絳娘當然明白他的意思,在春意盎然的季節,面對著這樣一位風華正茂、氣宇軒昂、又才情逼人的少年郎,又怎不叫她情竇初開的心中春意蕩漾呢?但知書識禮的少女怎敢在一個陌生男子面前敞開自己的心扉,她坐在那裏含羞不語,兩片紅霞染上了面頰,偶爾用含情脈脈的目光向崔護一瞥,一碰到崔護的目光就迅速地收回。更加羞怯地望定自己的腳尖,益顯出一副楚楚動人的模樣來。面對少女的無措,崔護也不知如何是好,飽讀聖賢書的他不可能做出更熱烈、更輕浮的舉動來。




2009-03-03 20:58:40 補充

說完,他意味深長地望著絳娘,等著她的反應。靈慧的絳娘當然明白他的意思,在春意盎然的季節,面對著這樣一位風華正茂、氣宇軒昂、又才情逼人的少年郎,又怎不叫她情竇初開的心中春意蕩漾呢?但知書識禮的少女怎敢在一個陌生男子面前敞開自己的心扉,她坐在那裏含羞不語,兩片紅霞染上了面頰,偶爾用含情脈脈的目光向崔護一瞥,一碰到崔護的目光就迅速地收回。更加羞怯地望定自己的腳尖,益顯出一副楚楚動人的模樣來。面對少女的無措,崔護也不知如何是好,飽讀聖賢書的他不可能做出更熱烈、更輕浮的舉動來。

2009-03-03 20:58:58 補充

在鄉村僻野尚且說得過去,若在城裏則是大逆不道的了。兩顆年輕而摯熱的心,在春日午後的暖陽中激蕩著,彼此都被對方深深吸引著,然而“發乎情,止乎禮”,兩個飽受禮節教育的年輕人並沒有再進一步的越軌行為。眼看著太陽已經偏入西邊的山坳,崔護只好起身,懇切地道謝後,戀戀不捨地向少女辭別。少女把他送出院門,倚在柴扉,上默默地目送著崔護漸漸走遠。崔護也不時地回過頭來張望,只見桃花一般的少女,映著門前豔麗的桃花,一同在春風中搖盪,心中暗歎:真是一副絕妙的春景圖啊!但少女眼中無限的眷戀他卻已看不清楚了。

2009-03-03 20:59:13 補充

春日裏一次偶然的相遇,在崔護和絳娘心中都激起了圈圈愛的漣漪。然而,男女之情,對男性來說是生活中的一些點綴,在女性卻是生命的全部。自從崔護離開以後,絳娘對他一直念念不忘,翩翩少年郎的影子日日夜夜盤桓在她腦海中,讓她朝思暮想、魂牽夢縈,但這一切她又不能對任何人提起。而崔護回到家中,隨即就埋頭於繁重的功課中,日夜苦讀,心思不復他顧;尋春巧遇絳娘一事只能暫擱腦後不敢再去撩起,以免心猿意馬而荒廢了學業。

2009-03-03 20:59:35 補充

時光如流,轉眼到了第二年春天,又是一個春暖花開的晴日,崔護望著城中綻開的桃花不由地觸景生情,回憶起去年春天的城南舊事,感情的烈焰在他心中升騰,在無法壓抑的衝動中,崔護抱著興奮急切的心情,一路快行來到城外尋找往日的舊夢。一路上花開如舊,瑞氣依然宜人,但這一些景物都已喚不起崔護的興致,他心中只有那片燦燦的桃花中的伊人。尋尋覓覓,終於讓他找到了去年那幢茅舍,但見一切如故,好象那一次春日豔遇就是發生在昨天。

2009-03-03 20:59:40 補充

走近院落,裏面寂靜無聲。他隔著竹籬高呼道:“小生踏春路過,想求些水喝!”他重複著去年的語言,期盼著去年的那幕再次上演。許久都不見少女出來開門,他喚了幾聲:“絳娘!絳娘!”除了些許微弱的回音外,並無應答之聲。

2009-03-03 20:59:57 補充

再定睛一看,茅舍門上靜靜地掛著一把銅鎖,宣告著主人已不在此。頓時,崔護覺得如一瓢冷水澆頭,火熱的心涼了大半。推開柴門,枯坐在院中桃花樹下.繽紛的花瓣落了他一衣襟,仍不見少女歸來。又是夕陽西斜的時候了,他訕訕地從窗櫺中取出筆墨,悵然地在房門上寫下七絕一首,這就是開頭提到的那首“題都城南莊”。題罷,他仍覺意猶未盡,沉吟兩遍,想改第三句為“人面只今何處去?”轉念又想,一首七言絕句中用兩個“今”字,不甚妥當,於是仍依原句。再看詩中兩次提到“桃花”一詞,卻並不嫌重複,反而更突出了主題,渲染了氣氛。

2009-03-03 21:00:12 補充

崔護城南訪舊,沒能見到絳娘,回家後心裏一直放不下來,腦子裏不斷地問:伊人究竟到哪里去了呢?——掃墓?探親?郊遊?甚至是出嫁了?他想來想去,絳娘的倩影時常縈繞在心頭。這樣一來,他根本無法用心讀書,甚至連茶飯也難以下嚥。於是,數日之後,他再度往城南尋訪。

2009-03-03 21:00:31 補充

這次,他熟練地找到了茅舍,尚未走近,遠遠地就聽到茅舍中傳出了陣陣蒼老的哭聲,崔護心中一緊,連忙加快腳步趕到茅舍前高聲詢問究竟。片刻之後,一位白髮蒼蒼的老漢,顫顫巍巍地走了出來,淚眼模糊中,上下打量著崔護問道:“你是崔護吧?”

對老漢知道自己的名姓,崔護有些訝異,他點頭稱:“晚生是崔護。”老漢一聽,悲從中來,哭著說:“你殺了我的女兒啊!”崔護驚詫莫名,急忙詢問:“敢請老丈說 明原委!”

2009-03-03 21:00:48 補充

老漢涕淚橫流,硬咽地述說道:“愛女絳娘,年方十八,知書達禮,待字閨中,自從去年清明見了你,日夜牽腸掛肚,只說你若有情,必定再度來訪。她等過了一天又一天,春去秋來,總不見你的蹤影,她朝思暮想,恍然若失。時過一年,本已將絕望,前幾天到親戚家小住,歸來見到門上你所題的詩,痛恨自己錯失良機,以為今生不能再見到你,因此不食不語,愁腸百結,這然一病不起。我已老了,只有這個女兒相依為命,之所以遲遲不嫁,是想找一佳婿,好讓我們父女有所依靠。現在絳娘卻先我而去了,難道不是你殺了她嗎?”

2009-03-03 21:00:59 補充

聽了這番哭訴,崔護仿佛橫遭雷擊,一時被震得不知所以。萍水相逢,癡心女子竟用情如此之深,怎不讓崔護心痛欲碎呢!他嗚咽道:“去年路經貴宅,口渴求飲,承蒙小姐賜茶,日前再來尋訪不遇,悵然題詩而返,不料竟意出這樣的變故,絳娘若死,晚生也不願偷生了!”他邊說邊奔入內室,抱住斷氣不久的絳娘聲嘶力竭地呼喊:“絳娘慢走一步,崔護隨你而來呀!”

2009-03-03 21:01:09 補充

崔護一邊搖晃著絳娘,一邊大聲哭喊,淚水流滿了絳娘的面龐。也許是他的精誠感動了蒼天,也許是他的真情喚醒了絳娘的心,總之,這時絳娘竟然悠悠地蘇醒過來。一開始是呼出一絲綿綿的鼻息,接著雙目微啟,然後唇角微動,似乎認出了崔護,自己把臉深深埋進崔護的懷裏。老漢見了驚喜萬分,急忙備好姜湯米漿,慢慢給絳娘灌下。就這樣,多情的絳娘居然從黃泉路上又走了回來。

2009-03-03 21:01:23 補充

隨後,崔護回家把情況稟明父母,父母十分體諒他們的一片真情,於是依禮行聘,擇一吉日將絳娘娶進門來。絳娘的父親也經崔家予以妥善的安置,得以頤養天年。但這父女始終不願表明自己的姓氏和身世,留下一個難解之謎。也許老漢曾經在朝中為官,因故獲罪,於是隱姓埋名,蟄居博陵城南,既然他有所顧忌,崔護一家也就知趣地不去探究。

2009-03-03 21:01:40 補充

崔護娶了絳娘這麼一位情深意厚、賢淑美慧的嬌妻,心中自是美不勝收。絳娘殷勤執家、孝順公婆、和睦親鄰,夜來紅袖添香,為夫伴讀,使得崔護心無旁思,專意于功課,學業日益精進。唐德宗貞元十二年,崔護趕會士,獲進士及第,外放為官,仕途一帆風順,官到嶺南節度使。在絳娘的佐助下,他為官清正,政績卓著,深受百姓愛戴。

後來人們遂將男女情事謂之走桃花運或交桃花運。

星期五, 4月 17, 2009

Apach + PHP + MYSQL

參考來源: http://wuyy.idv.tw/servercr/apache22.htm

版本
Apach: apache_2.2.11-win32-x86-no_ssl.msi
PHP: php-5.2.9-2-Win32.zip (解壓縮版)
MYSQL: mysql-5.1.33-win32.msi

第一步驟:安裝Apach 完成以後請開啟 httpd.conf 進行設定

1. 先看一下80 port是否有被佔用,如果有被佔用看一下改成其它port,修改以下參數
Listen 80 > Listen 99
ServerName localhost:80 > ServerName localhost:99

2. 將 index.php加入預設首頁檔名,設定啟始頁面,尋找 DirectoryIndex 加入 index.php

DirectoryIndex index.html index.php


3. 設定虛擬目錄,放在 ... 之後

Alias /FRT "D:/PHP/FRT"

AllowOverride None
Options Indexes None
Order allow,deny
Allow from all


Alias /PMA5 "D:/PHP/PMA5"

AllowOverride None
Options None
Order allow,deny
Allow from all



第二步驟:安裝 PHP

1. Windows 環境下安裝 php,官方網站提供 installer 及 zip 二種方式,建議以 zip 方式解壓縮安裝,日後升級較方便
解壓縮下載的 zip 檔案,將之放置於 c:\php5 或其他路徑
在 \php5 目錄中尋找 php.ini-recomanded ( or php.ini-dist ),將之複製到 Apache Server 安裝目錄下,並將其更名為 php.ini(此處以 Apache + PHP 為例)
搬移 php5ts.dll 到 Apache Server 安裝目錄下的 bin 子目錄

2. 開啟 php.ini,進行如下修改
A. 指定 PHP 尋找擴充功能的位置,例如:extension_dir = "C:\PHP5\ext"
B. 設定時區:date.timezone="Asia/Taipei"
C. 設定是否支援 PHP 簡短語法 short_open_tag = On,開啟簡短語法的支援,撰寫 PHP 程式開頭 D. max_execution_time: 單一 script 最高執行時間,建議設定成 300 秒,超過此時間會顯示錯誤

3. php.ini 的 display_errors = On 這個設定為 On 才可以看到語法的錯誤


第三步驟:開啟 apache 設定檔 httpd.conf,進行如下修改

1. Load PHP 模組,加入下列敘述(此方式係以模組方式呼叫 php)
LoadModule php5_module "c:/php5/php5apache2.dll" (Apache 2.0.x 版本)
LoadModule php5_module "c:/php5/php5apache2_2.dll" (Apache 2.2.x 版本)

2. 增加 php 檔案型態的支援,加入此設定才可以讀取php檔案
AddType application/x-httpd-php .php

3. 修改網站根目錄
DocumentRoot "D:/PHP"

4. 儲存 httpd.conf,重新啟動 Apache Server



第四步驟:安裝 MySQL

1. 在 php.ini 中啟用 MySQL 擴充功能,才能在 php 中使用 mysql
尋找 extension=php_mysql.dll,移除行首的分號 (;),或自行新增

2. 將 php 目錄下的 libmysql.dll 複製到 Apache Server 安裝目錄下的 bin 子目錄

3. 可於 php.ini 中的 extension 設定要使用的擴充函式庫,欲使用函式庫只需將前面的『;』移除即可
使用 MySql 資料庫:extension=php_mysql.dll
處理多位元語系:extension=php_mbstring.dll
繪圖處理:extension=php_gd2.dll

4. 資料庫在建立時請選擇 utf8_general_ci 目前此語系較沒有問題

星期五, 4月 10, 2009

(轉)數位之牆 - 學校沒教的理債觀念‏

http://www.digitalwall.com

2002年,一個年輕人剛滿30歲。 9月份,他簽下人生中的第一筆貸款: 240萬台幣,分別給當時的女友和家人使用。10月份旋即從台灣某知名上市電信公司離職,投入另一家初創電信公司,開始了他之後五年內月領10萬台幣薪水但是窮苦與酸楚異常的生活。

本系列文章,是要講述一個理財智商為零的年輕人,如何為他懵懂無知的財務決定付出重大代價。雖然,這些經歷比不上那些負債上億最後神奇翻身的名人,但是相信這些經歷更加貼近市井小民的生活。也因為這 240萬的負債,他終於弄明白,人生的路應該怎麼走。


學校沒教的理債觀念(一)關注在現金流 - 不要讓自己陷入現金流吃緊的窘境,永遠不要。
http://www.digitalwall.com/scripts/display.asp?UID=447

學校沒教的理債觀念(二)不要借錢還債 - 不要借錢還債;不要借錢投資;有債要先還。
http://www.digitalwall.com/scripts/display.asp?UID=448

學校沒教的理債觀念(三)別使用信用卡 - 銀行喜歡借錢給有錢人,越缺錢的越借不到。
http://www.digitalwall.com/scripts/display.asp?UID=449

學校沒教的理債觀念(四)停損也要停利 - 暴利是怎麼來的,就是怎麼去的。
http://www.digitalwall.com/scripts/display.asp?UID=450

星期四, 4月 09, 2009

(轉)遞迴之美:數學,電腦科學與分形

來源:http://www.infinity-game.com/bbs/viewthread.php?tid=491
來源:http://mmdays.wordpress.com/2007/05/24/recursive/


“Blog 的新位置在 http://mmdays.com,本Blog將在 12/22 號之後,不同步更新。還請網友轉往新站留言:)”

Posted By Mr. Thursday & Mr. Saturday
(註:本篇文章有一點長,請耐心服用 XD)

monalisa-recursion想像一下,我剛才說了一句話,那句話是:「想像一下,我剛才說了一句話,那句話是:「想像一下,我剛才說了一句話,那句話是:……….」」,如此下去,就好像站在兩面平行擺設的鏡子中間,鏡子中的影像不斷的重複。再舉個例子,寫完一封信想要匿名保密,就署名「知名不具」。回信的人寫:「知 知名不具具」。之後再回信的時候就變成:知知知名不具具具,加上括號可能比較清楚:(知(知(知名不具)具)具)。

遞迴就是類似這樣子,不斷的重複同樣的東西,只不過每次重複的是比較小的東西了。大家應該對數學歸納法不陌生,在使用數學歸納法時,我們首先確定 n=1 的時候某件事情是成立,然後在證明 n 到 n+1 的過程是正確的,就可以從 n=1 的例子,一路推論出第 n 項是甚麼東西。就像是推骨牌一樣,把第一張牌推倒了之後,剩下的骨牌自然就被前面的骨牌給推倒。

遞迴的概念則是相反的方向:我們想要解決一個大小為 n 的問題,我首先做的事情是把問題化簡成大小為 n-1 的問題,但是解決的方法還是一樣,只不過大小是 n-1。如此繼續化簡,最後變成大小為 n=1 的基本問題,接著只要n=1的基本問題解決了,原來大小為n的問題也跟著解決了。

這又好像層層分工。假設每個人都會加法,然後今天我想求出 1+2+…+n 等於多少?其中一個辦法就是遞迴,我先假設 1+2+…+(n-1) 已經有人算好,那麼我只要再加上 n,就可以得到答案了。然而 1+2+…+(n-1) 要怎麼得到呢?我就請另外一位朋友幫我算。另外一位朋友接到這個問題以後,也用同樣的方法,他把 1+2+…+(n-2) 的結果交給另外一位朋友算,然後把這個結果加上 (n-1),就變成我想要的 1+2+…+(n-1) 了。朋友的朋友也繼續用類似的方法,直到最後一位朋友只需要回答1,接著倒數第二位朋友就把1加上2,傳給倒數第三位朋友,倒數第三位朋友加上3,一直到我收到 1+2+…+(n-1) 的結果,再加上 n,就大功告成了。

recursion

不過可能會覺得,如此簡單的問題,為何還需要遞迴呢?其實遞迴也是比較適合一些問題來解,也就是那些「解決方式一樣,但是可以化成大小比較小」的問題,除此之外還可以輕鬆解決基本問題(n=1的時候)。舉例來說,有個古老的問題叫做河內塔 (Hanoi Tower),問題的定義引述如下 (引述網站)

haoi-tower1883 年,一位法國的數學家 Edouard Lucas 教授在歐洲的一份雜誌上介紹了一個相當吸引人的難題──迷人的智力遊戲。這個遊戲名為河內塔 (Tower of Hanoi),它源自古印度神廟中的一段故事 (也有一說是 Lucas 教授為增加此遊戲之神秘色彩而捏造的)。傳說在古老的印度,有一座神廟,據說它是宇宙的中心。在廟宇中放置了一塊上面插有三根長木釘的木板,在其中的一根木釘上,從上至下被放置了64片直徑由小至大的圓環形金屬片。古印度教的天神指示祂的僧侶們將64片的金屬片移至三根木釘中的其中一根上。規定在每次的移動中,只能搬移一片金屬片,並且在過程中必須保持金屬片由上至下是直徑由小至大的次序,也就是說不論在那一根木釘上,圓環形的金屬片都是直徑較小的被放在上層。直到有一天,僧侶們能將64片的金屬片依規則從指定的木釘上全部移動至另一根木釘上,那麼,世界末日即隨之來到,世間的一切終將被毀滅,萬物都將至極樂世界。

倘若這個故事的敘述為真,那麼,我們只需加速移動金屬片,是不是就能愈早到達極樂世界呢?果真要移動這64片金屬片,那麼,至少要花幾次的搬動才能完成呢?有沒有規律可循呢?

這個問題,就很符合剛才的特性:我們可以把大問題化成小問題,而且解決的方法相同,只不過問題的大小變小了。另外基本問題(n=1),就是移動一根金屬片所需要的次數,這個我們也可以輕易解決,所以這個問題就可以用遞迴來解。

首先,我們假設有A、B、C三根柱子,這64片金屬片一開始在柱子A上面,我們想要搬到柱子C。因為問題中規定某個金屬片上面是空的時候才能移動,我們就假設有個人可以幫我們把63片比較小的金屬片先從柱子A搬到柱子B上面,然後我們把最大的那一片從柱子A搬到柱子C,再請那位朋友把剛才的63片從柱子B搬到柱子C,整個問題就解決了。然後我們只要知道剛才那位朋友搬了幾次,然後加上我們自己般動的1次,就是整個問題要求的搬動次數了。

遞迴不僅僅在數學上有其重要性,在電腦科學之中扮演的角色更是至關重要。程式設計者對於遞迴絕對不會陌生,上面所舉的河內塔問題,實際上也是電腦科學的經典例子之一,是初學程式設計的人一定會學到的東西。遞迴的思維,常常可以讓程式設計者打造出簡潔的程式,讓繁冗的問題透過簡單的程式碼來解決 (例如 parser 的設計)。演算法上所講的 dynamic programming,就是遞迴思維在演算法的具體呈現。

fractal-broccoli遞迴同時也是碎形 (fractal) 這門大學問的基石,碎形是一種相當美妙的幾何圖案,就如同上面那一張蒙娜麗莎的圖一樣,圖中有圖,形中有形,且小的部分都是大的部分的縮影,我們就稱之為碎形。碎形本身的數學定義,實際上就包含了遞迴定義在裡面,我們甚至於可以說,碎形是遞迴在幾何學的一種具體呈現。但是碎形不僅僅是一種數學概念而已,在自然界中,有許許多多的地方都出現自然的碎形,讓人讚嘆遞迴原來就出現在我們的生活周圍。圖中的這棵花椰菜,就蘊含了遞迴的碎形圖案與於其中。碎形同時也在各個研究領域有著廣泛的應用,光是在電腦科學領域,就有人把碎形應用在影像和影片壓縮之上 (這不難想像,由於碎形這種以小見大的特性,我們可以用小的來表現大的,因此可以有壓縮的概念出現),在電腦圖學上 (computer graphics),也有人把碎形應用在設計電腦遊戲之中的一些景物,打造出有效率和簡潔的系統。現在電腦遊戲之中的景物,很多都是玩家邊玩、遊戲系統邊產生出即時的景物,這叫做 procedural generation,這種即時產生景物的技術,可以避免遊戲軟體預先儲存一堆要展現的景物,幫整個軟體瘦身。procedural generation 就使用了大量的碎形產生與合成技術於其中,而這些都根植於遞迴這一個深刻卻簡單的思維。

至於把碎形應用在遊戲之中,現在已經做到有多可怕的地步了呢?請大家看看以下的三張圖片,不妨猜猜擁有這種精緻畫面的遊戲軟體,其整個遊戲的size大小是多少呢?

kkrieger-screenshot2 kkrieger-screenshot3 kkrieger-screenshot1

正確答案是97KB!沒錯,我沒有打錯字,你的眼睛也沒有看錯,這款遊戲的大小只有 97KB!傳統的一片 3.5 吋磁片可以裝下十幾個這款遊戲!這一款第一人稱的射擊遊戲叫做 .kkrieger,是由德國的 demogroup .theprodukkt 所開發,截至目前為止還在beta測試版的階段,這款遊戲之所以可以壓縮到這麼小的境界,就是因為遊戲之中的場景和音樂幾乎全部都是由動態產生,遊戲之中預先存放的資料只有一些簡單的幾何形狀和 MIDI 音樂檔,所以自然檔案大小非常小。如果這款遊戲沒有用 procedural generation 的技巧進來的話,估計檔案大小會爆增成 200~300MB,這樣的技術,真是令人嘆為觀止。而背後最大的功臣,就是這篇文章談到的遞迴和碎形。各位也不妨下載來玩玩看吧 (下載點)。不過需要注意到一件事情,這款遊戲的載入時間非常長,因為他要靠著一點點的程式碼即時來運算製造出場景,所以要耗去很多計算時間,這可說是一種 time 和 space 的 tradeoff。

看完這篇文章,各位有沒有對看似枯燥的數學有了一點點不同的看法呢?沒想到遞迴可以這樣應用在遊戲開發之中吧。下次學習數學感覺到枯燥時,不妨從應用的角度切入試試看吧!

星期三, 4月 08, 2009

Sybase 配置cis

http://www.itpub.net/thread-758431-1-1.html
如何配置cis

http://www.lslnet.com/linux/f/docs1/i61/big5401295.htm
請教Sybase的CIS性能

http://tech.it168.com/db/sy/2006-10-20/200610201953038.shtml
Sybase数据库互联技术初探

http://forum.hibernate.org/viewtopic.php?p=2376613&sid=7f2823ed7c4327a96d804f3ba7652f51
Hibernate-Join tables from 2 different databases