[Logo]
文章發表人是: andowson
討論區首頁 » 個人資料 andowson » 文章發表人是 andowson
內容
Trac有提供一個透過Web介面修改svnaccess檔案的Plugin,可以參考下面的網址:
http://trac-hacks.org/wiki/SvnAuthzAdminPlugin
下載後,將其解壓縮,再執行下面的指令安裝
python setup.py install

然後再修改trac.ini,將svnauthz.* = enabled加到[components]區塊下:如
[components]
svnauthz.* = enabled

經過一連串的測試後發現,如果我們要用同一個svnaccess來完成這個需求:
user1只能看到project1的source code而user2只能看到project2的source code
是不可能的,因為:
1.如果我們將svnaccess最上面的[/]區塊刪除時,變成如下:
[project1:/]
admin = rw
user1 = rw
user2 =rw

[project2:/]
admin = rw
user2 =rw
配合修改/etc/httpd/conf.d/subversion.conf中的設定,此時我們可以控管由網頁去存取http://localhost/svn/project1時,需要輸入帳號密碼,此時用user1可以登入。接著將網址改成http://localhost/svn/project2,此時會再要求輸入帳號及密碼,但是不論嘗試多少次,用user1都不會成功。

2.此時再用user1登入Trac的project1然後去Browse Source時就會遇到Insufficient permissions to access /的錯誤。於是我們又將[/]區塊加回去svnaccess:
[/]
admin = rw
user1 = rw

[project1:/]
admin = rw
user1 = rw
user2 =rw

[project2:/]
admin = rw
user2 =rw
此時,可以正常瀏覽source code了,但是副作用就是此時用user1將可以登入http://localhost/svn/project2(可能user2還無法登入project2)
因此,可以推論,當有設定[/]時,Apache會採用[/]區塊的設定。
此外,此時用user1登入Trac project2也可以Browse Source,所以Trac也是用[/]這邊的設定。

所以這個問題在一個svnaccess的狀況下是無解的。

那要怎麼做到原來的需求呢?
答案應該很明顯了,就是每個Trac project使用一個svnaccess檔案,我們可以在trac.ini裡面去設定這個檔案的路徑,例如:
[trac]
authz_file = /var/trac/projects/svnaccess_project1

然後將原來的svnaccess的[/]區塊刪除,編輯svnaccess_project1如下:
admin = rw
user1 = rw
user2 =rw

最後是將Trac裡面BROWSER_VIEW從anonymous和authenticated刪除,用admin帳號登入Web介面去Admin->Permissions下執行即可,文字指令參考如下:
trac-admin /var/trac/projects/project1 permission remove anonymous BROWSER_VIEW
trac-admin /var/trac/projects/project1 permission remove authenticated BROWSER_VIEW


然後我們可以在右邊的Grant Permission:新增Subject:developer,Action: BROWSER_VIEW
然後再利用Add Subject to Group:將Subject: user1及user2陸續加到Group: developer

如此一來,我們可以確保只有加到每個Project的developer群組才能看到原始碼。

依此類推,完成project2的相關設定(trac.ini、svnaccess_project2及Permissions設定)

日後維護時,每個專案如有成員異動時,便得注意要同時修改svnaccess和svnaccess_projectX兩個檔案。
為了測試方便,我將Tomcat 6.0.18和SQL Server 2005 Express安裝在同一部主機,按照習慣下載了Microsoft SQL Server 2005 JDBC Driver 1.2,解壓縮後將jar檔放在Tomcat 6的lib目錄下,設定相關的JDBC設定後,卻出現TCP/IP 連線被拒的錯誤訊息:
com.microsoft.sqlserver.jdbc.SQLServerException: 連接到主機 的 TCP/IP 連接已經失敗。 java.net.ConnectException: Connection


經由同事分享經驗告知解法如下:
將SQLEXPRESS的通訊協定之TCP/IP設定調整一下,應該要啟用,如果有顯示啟用,再點右鍵進入內容
image
在最底下的IPALL的TCP通訊埠輸入port值為1433
image
重新啟動SQL Server Express即可
image

最近幫一個客戶移植網站,順便測試資料庫是否能從SQL Server 2000升級至SQL Server 2005,過程大致如下:
1.下載並安裝Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2,安裝過程還滿順利的。
2.接著建立一個新的資料庫,這邊需要決定資料檔Data和交易日誌檔Log的目錄,通常我都會選擇將他們分開與系統磁碟機在不同的磁碟分割,例如D:或E:。
3.然後選擇這個新建的資料庫,進行還原工作。這邊需要修改一下還原後的Data和Log檔位置為剛才第二步的目錄和檔名,最好也勾選一下強制對原來資料庫還原。
4.問題來了,接下來就是要建立原有的使用者帳號,但是當要指定這個新建的帳號去使用還原後的資料庫時卻會出現這個帳號已存在的錯誤。

怎麼辦?很多人第一時間想到的就是把還原後資料庫中的那個舊使用者刪掉,但是選到了之後,按下刪除卻收到一個錯誤訊息
資料庫主體在資料庫中擁有結構描述且無法卸除。(Microsoft SQL Server, Error: 15138)


用Google找了一下,發現有兩種解法:
1. 將這個新建的帳號跟舊的帳號對應起來,其實我們本來的目的就是要建立一個帳號來對應到舊有SQL Server 2000資料庫中的使用者帳號,如果可以這麼做,那麼就可以不用刪除帳號了
USE 資料庫名稱
EXEC sp_change_users_login 'Update_One', '使用者帳號', '使用者帳號'

例如:
USE mydb;
EXEC sp_change_users_login 'Update_One', 'andowson', 'andowson';


2.仔細看一下錯誤訊息中的提示,原來SQL Server 2005強化了Schema的概念,在Restore SQL Server 2000 Backup檔的同時,自動為User建了同名Schema。如果我們確定原來所有的物件都是以dbo為Owner,則先將舊帳號的結構描述刪除,然後就可以刪除該帳號了。

歸納流程如下:
1) 展開資料庫名稱->安全性->結構描述
2) 刪除不要的使用者名稱結構描述
3) 然後回到使用者,將舊的帳號刪除即可。

參考資料:
http://blog.cs.nhcue.edu.tw/~mingzhe/?p=399
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=107720&SiteID=1
http://blog.darkthread.net/blogs/darkthreadtw/archive/2006/08/07/kb-restore-sql-2000-backup-on-sql-2005.aspx
今天找到了ClamWin Free Antivirus這個免費的防毒軟體,依據網站的介紹:
ClamWin is a Free Antivirus program for Microsoft Windows 98/Me/2000/XP/2003 and Vista.

這套軟體幾乎可以執行在微軟所有版本上的作業系統上。

經實際安裝發現確實可以執行在Windows 2000 Advanced Server上,其他版本看日後有機會安裝的話再回報吧。
準備工作:
1.先安裝好CentOS 5.2 Linux作業系統,建議的硬碟分割配置如下:
SWAP 2.0G(RAM小於2G時可以設為RAM的兩倍)
/boot 100M
/ 2.0G
/usr 3.0G
/tmp 2.0G
/var 8.0G
/home 剩下來的部分

2.安裝完成後更新系統套件至最新版
yum -y update

3.安裝wget以便於後續的自動安裝動作
yum -y install wget

安裝Apache
1.安裝Apache套件
yum -y install httpd

2.取消SELinux,可以參考這篇http://www.crypt.gen.nz/selinux/disable_selinux.html
echo 0 >/selinux/enforce
sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/sysconfig/selinux

3.利用先前的設定檔產生設定修改部分(先將設定檔上傳再改名字為/tmp/httpd.conf.old)
diff /etc/httpd/conf/httpd.conf /tmp/httpd.conf.old > diff.txt
如果是第一次安裝,可以下載本站的diff.txt
44c44
< ServerTokens OS
---
> ServerTokens ProductOnly
74c74
< KeepAlive Off
---
> KeepAlive On
81c81
< MaxKeepAliveRequests 100
---
> MaxKeepAliveRequests 500
232c232
< Group apache
---
> Group tomcat
251c251
< ServerAdmin root@localhost
---
> ServerAdmin webmaster@your-domain.com
265a266
> ServerName 127.0.0.1:80
282c283
< 
---
> VirtualDocumentRoot /var/webapps/%0
391c392
< DirectoryIndex index.html index.html.var
---
> DirectoryIndex sorry.html index.html index.htm default.html default.htm index.html.var index.jsp
488a490,491
> LogFormat "%V %h %l %u %t \"%r\" %>s %b" vcommon
> LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
492c495
< #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
---
> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
514c517,518
< CustomLog logs/access_log combined
---
> CustomLog logs/access_log combinedio
> CustomLog logs/vhost.log vcombined
524c528
< ServerSignature On
---
> ServerSignature Off
747c751,752
< AddDefaultCharset UTF-8
---
> #AddDefaultCharset UTF-8
> AddDefaultCharset Big5
954a960,988
> <Location />
>     # Insert filter
>     SetOutputFilter DEFLATE
>

記得修改一下ServerAdmin的your-domain.com為真正的網域名稱

4.備份原始的httpd.conf設定檔
cp -rf /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig

5.套用設定檔的差異部分
yum install -y patch
patch -p2 /etc/httpd/conf/httpd.conf diff.txt

6.設定開機時自動啟動Apache
chkconfig --add httpd
chkconfig --level 35 httpd on

7.啟動Apache
service httpd start

安裝JDK
1.利用瀏覽器,至http://java.sun.com點選Popular Downloads:區塊中的Java SE,
2.然後點選JDK 6 Update 7旁的Download按鈕,
3.接下來在Platform:選擇Linux,然後勾選I agree to the Java SE Development Kit 6 License Agreement,按下Continue按鈕
4.在Java SE Development Kit 6u7下面的dk-6u7-linux-i586-rpm.bin連結上面按滑鼠右鍵,複製鏈結網址
5.然後切回到Linux的console畫面(假設是用PuTTY或PieTTY連上主機的),先輸入wget空一格然後打上一個雙引號",接著貼上剛剛複製的鏈結網址,然後再打上另一個雙引號",空一格後再打上-O jdk-6u7-linux-i586-rpm.bin,類似如下:
cd /root/setup/web
wget "http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u7-linux-i586-rpm.bin?BundledLineItemUUID=LaNIBe.n_FQAAAEcAC0b.noe&OrderID=5IFIBe.nqZUAAAEc8iwb.noe&ProductID=XzBIBe.oxM4AAAEaVJcGcbZW&FileName=/jdk-6u7-linux-i586-rpm.bin" -O jdk-6u7-linux-i586-rpm.bin
6.按下Enter後,便開始下載
7.然後用sh jdk-6u7-linux-i586-rpm.bin安裝它,可以利用echo 'yes'自動輸入畫面詢問的問題答案
echo 'yes'|sh jdk-6u7-linux-i586-rpm.bin

安裝Tomcat
1.下載本站的tomcat-setup.sh後,利用chmod 755 tomcat-setup.sh更改為可執行,如日後有軟體版本更新,請自行修正一些路徑或相關版本數字
#!/bin/bash
# Name: Tomcat 6.0.x auto installer
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 3.7
# Last Modified: 2008-09-19
# Reference: http://www.meritonlinesystems.com/docs/apache_tomcat_redhat.html
# Assumption: JDK must be installed on /usr/java
# This program will
# 1.check for the lastest stable version of Tomcat 6.0
# 2.download apache-tomcat-6.0.x.tar.gz
# 3.unpack it into /var/apache-tomcat-6.0.x
# 4.make a symbolic link /var/tomcat6 to the above directory for easy upgrade
#   to a later version
# 5.check for the latest stable verion of Tomcat Connector 1.2
# 6.download tomcat-connectors-1.2.x-src.tar.gz
# 7.unpack it
# 8.configure, make and make install
# 9.create user tomcat with home directory /var/robust
# 10.make two instances of tomcat for load balancing, here I put them under 
#    /var/robust/worker[1,2] for easy to backup all of them.
# 11.generate cleanup.sh for easy to uninstall everything

#
# intranet workaround
# If your server don't have Internet access, ie. in the intranet behind 
# a firewall, you have to download all the file manually first. Copy them 
# into ${SETUP_FILE_PATH}. And then change the following default version 
# number to the correct number you downloaded.
#
SETUP_FILE_PATH=/root/setup/web
TOMCAT_VERSION=6.0.18
TOMCAT_CONNECTOR_VERSION=1.2.26
LOG4J_VERSION=1.2.15
LOGGING_VERSION=1.1.1

hostname=`/bin/hostname`
mkdir -p ${SETUP_FILE_PATH}
cd ${SETUP_FILE_PATH}

#
# check the latest stable version of Tomcat 6.0
#
wget http://tomcat.apache.org/ -q -t 1 -T 5 -O /tmp/tomcat.html
if [ -s /tmp/tomcat.html ]; then
   TOMCAT_VERSION=`grep "6\.0\." /tmp/tomcat.html|grep -v "6\.0\.x"|cut -d">" -f2|cut -d"<" -f1`
fi
rm -rf /tmp/tomcat.html

echo "Install Tomcat ${TOMCAT_VERSION}"
if [ ! -r apache-tomcat-${TOMCAT_VERSION}.tar.gz ]; then
   wget http://apache.ntu.edu.tw/tomcat/tomcat-6/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz
fi
tar zxvf apache-tomcat-${TOMCAT_VERSION}.tar.gz -C /var
ln -s /var/apache-tomcat-${TOMCAT_VERSION} /var/tomcat6

echo 'rm -rf /var/apache-tomcat-'${TOMCAT_VERSION} > ${SETUP_FILE_PATH}/cleanup.sh
echo 'rm -rf /var/tomcat6' >> ${SETUP_FILE_PATH}/cleanup.sh

JDK_VERSION=`ls /usr/java | grep jdk`
echo "Use $JDK_VERSION"
echo 'JAVA_HOME="/usr/java/'${JDK_VERSION}'"
JAVA_OPTS="-server -XX:NewSize=64m -XX:MaxNewSize=64m -XX:MaxPermSize=128m -Xms1024m -Xmx1024m -Djava.awt.headless=true"' > /var/tomcat6/bin/setenv.sh
chmod 755 /var/tomcat6/bin/setenv.sh

#
# check the latest stable version of Tomcat Connector 1.2
#
# pre-requirment
yum -y install httpd-devel libtool automake make

wget http://tomcat.apache.org/download-connectors.cgi -q -t 1 -T 5 -O /tmp/connector.html
if [ -s /tmp/connector.html ]; then
   TOMCAT_CONNECTOR_VERSION=`grep "1\.2\." /tmp/connector.html|cut -d">" -f2|cut -d"<" -f1 |awk '{print $2}'|grep "1.2"|uniq`
fi
rm -rf /tmp/connector.html
echo "Install Tomcat Connector JK ${TOMCAT_CONNECTOR_VERSION}"
if [ ! -r tomcat-connectors-${TOMCAT_CONNECTOR_VERSION}-src.tar.gz ]; then
   wget http://apache.ntu.edu.tw/tomcat/tomcat-connectors/jk/source/jk-${TOMCAT_CONNECTOR_VERSION}/tomcat-connectors-${TOMCAT_CONNECTOR_VERSION}-src.tar.gz
fi
tar zxvf tomcat-connectors-${TOMCAT_CONNECTOR_VERSION}-src.tar.gz
cd tomcat-connectors-${TOMCAT_CONNECTOR_VERSION}-src/native
./buildconf.sh
./configure --with-apxs=/usr/sbin/apxs
make
make install
cd ${SETUP_FILE_PATH}
echo 'rm -rf /etc/httpd/modules/mod_jk.so' >> ${SETUP_FILE_PATH}/cleanup.sh

#
# check the latest stable version of Log4J
#
wget http://logging.apache.org/log4j/1.2/download.html -q -t 1 -T 5 -O /tmp/log4j.html
if [ -s /tmp/log4j.html ]; then
   LOG4J_VERSION=`grep "1\.2\." /tmp/log4j.html|cut -d"<" -f3|cut -d">" -f2|awk '{print $4}'`
fi
rm -rf /tmp/log4j.html
echo "Install Log4J ${LOG4J_VERSION}"
if [ ! -r logging-log4j-${LOG4J_VERSION}.tar.gz ]; then
   wget http://apache.ntu.edu.tw/logging/log4j/${LOG4J_VERSION}/apache-log4j-${LOG4J_VERSION}.tar.gz
fi
tar zxvf apache-log4j-${LOG4J_VERSION}.tar.gz
cp -rf ${SETUP_FILE_PATH}/apache-log4j-${LOG4J_VERSION}/log4j-${LOG4J_VERSION}.jar /var/tomcat6/lib

#
# check the latest stable version of Commons - Logging
#
wget http://commons.apache.org/logging/ -q -t 1 -T 5 -O /tmp/logging.html
if [ -s /tmp/logging.html ]; then
   LOGGING_VERSION=`grep "Release" /tmp/logging.html | grep -v "2006"|cut -d ">" -f5|cut -d"<" -f1|awk '{print $1}'|grep "1.1"`
fi
rm -rf /tmp/logging.html
echo "Install Commons - Logging ${LOGGING_VERSION}"
if [ ! -r commons-logging-${LOGGING_VERSION}-bin.tar.gz ]; then
   wget http://apache.ntu.edu.tw/commons/logging/binaries/commons-logging-${LOGGING_VERSION}-bin.tar.gz
fi
tar zxvf commons-logging-${LOGGING_VERSION}-bin.tar.gz
cp -rf ${SETUP_FILE_PATH}/commons-logging-${LOGGING_VERSION}/commons-logging-${LOGGING_VERSION}.jar /var/tomcat6/lib

#
# generate log4j.properties
#
echo 'log4j.rootLogger=WARN, R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/var/robust/tomcat.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{DATE} - %p %c - %m%n
log4j.logger.org.apache.catalina=WARN, R' > /var/tomcat6/lib/log4j.properties

#
# add user tomcat
#
useradd tomcat -d /var/robust
echo 'userdel -r tomcat' >> ${SETUP_FILE_PATH}/cleanup.sh

#
# setup workers' directory
#
mkdir -p /var/robust/worker1/logs
mkdir -p /var/robust/worker1/temp
mkdir -p /var/robust/worker1/work
cp -rf /var/tomcat6/conf /var/robust/worker1/conf
mkdir -p /var/webapps
ln -s /var/webapps /var/robust/worker1/webapps
cp -rf /var/robust/worker1 /var/robust/worker2

#
# setup default host directory
#
mkdir -p /var/webapps/${hostname}
cp -rf /var/tomcat6/webapps/ROOT/* /var/webapps/${hostname}/.
mkdir -p /var/robust/worker1/conf/Catalina/${hostname}
mkdir -p /var/robust/worker2/conf/Catalina/${hostname}
cp -rf /var/tomcat6/webapps/host-manager/manager.xml /var/robust/worker1/conf/Catalina/${hostname}
cp -rf /var/tomcat6/webapps/host-manager/manager.xml /var/robust/worker2/conf/Catalina/${hostname}

#
# generate server.xml
#
echo '<Server port="workerPort" shutdown="shutdownCode">

  <GlobalNamingResources>
    <!-- Used by Manager webapp -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <!-- Define an AJP 1.3 Connector on port ajpPort -->
    <Connector port="ajpPort" address="127.0.0.1"
               enableLookups="false" maxThreads="1000"
               protocol="AJP/1.3" />

    <Engine jvmRoute="workerNo" name="Catalina"
            defaultHost="mydomain">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase" />' > /tmp/server.header.template

sed -e "s/workerPort/8105/g" -e "s/shutdownCode/`head -1024c /dev/urandom | md5sum | cut -d " " -f1`/g" -e "s/ajpPort/8109/g" -e "s/workerNo/worker1/g" -e "s/mydomain/${hostname}/g" /tmp/server.header.template > /var/robust/worker1/conf/server.header
sed -e "s/workerPort/8205/g" -e "s/shutdownCode/`head -1024c /dev/urandom | md5sum | cut -d " " -f1`/g" -e "s/ajpPort/8209/g" -e "s/workerNo/worker2/g" -e "s/mydomain/${hostname}/g" /tmp/server.header.template > /var/robust/worker2/conf/server.header
rm -rf /tmp/server.header.template

echo '      <Host name="'${hostname}'"
            appBase="webapps/'${hostname}'"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.FastCommonAccessLogValve"
               directory="logs"  prefix="'${hostname}'_access_log."
               suffix=".txt" pattern="combined" resolveHosts="false"/>
        <Context path="" docBase="" reloadable="false" />
      </Host>' > /var/robust/worker1/conf/server.host

cp -rf /var/robust/worker1/conf/server.host /var/robust/worker2/conf/server.host

echo '    </Engine>

  </Service>

</Server>' > /var/robust/worker1/conf/server.footer

cp -rf /var/robust/worker1/conf/server.footer /var/robust/worker2/conf/server.footer



cd /var/robust/worker1/conf
cat server.header server.host server.footer > server.xml
cd /var/robust/worker2/conf
cat server.header server.host server.footer > server.xml

#
# generate tomcat-users.xml
#
MANAGER_PASSWORD=`head -1024c /dev/urandom | md5sum | cut -d " " -f1 | awk '{print substr($1,1,8)}'`
echo '<tomcat-users>
  <user username="manager" password="'${MANAGER_PASSWORD}'" roles="manager"/>
</tomcat-users>' > /var/robust/worker1/conf/tomcat-users.xml
echo
echo "Your Tomcat Manager's login is 'manager', password is '${MANAGER_PASSWORD}'"
echo
cp -rf /var/robust/worker1/conf/tomcat-users.xml /var/robust/worker2/conf/tomcat-users.xml

chmod 600 /var/robust/worker*/conf/server.*
chmod 600 /var/robust/worker*/conf/tomcat-users.xml
chown -R tomcat:tomcat /var/apache-tomcat-*
chown -R tomcat:tomcat /var/robust

#
# generate mod_jk.conf
#
echo 'LoadModule jk_module modules/mod_jk.so

JkWorkersFile "/etc/httpd/conf/workers.properties"
JkLogFile     "|/usr/sbin/rotatelogs /var/log/httpd/mod_jk.log 86400"
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat     "%w %V %T"
LogFormat     "%h %l %u %t \"%r\" %>s %b %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n %{JK_LB_FIRST_BUSY}n %{JK_LB_LAST_NAME}n %{JK_LB_LAST_BUSY}n" mod_jk_log
CustomLog     logs/worker_access_log     mod_jk_log

JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
JkMount /*.page loadbalancer
JkMount /dwr/* loadbalancer
JkMount /servlet/* loadbalancer
JkMount /manager/* loadbalancer

# Deny direct access to WEB-INF
<LocationMatch ".*WEB-INF.*">
    deny from all
</LocationMatch>' > /etc/httpd/conf.d/mod_jk.conf
echo 'rm -rf /etc/httpd/conf.d/mod_jk.conf' >> ${SETUP_FILE_PATH}/cleanup.sh

#
# generate workers.properties
#
echo '# workers.properties - ajp13
#
# List workers
worker.list=worker1, worker2, loadbalancer, jkstatus

#
# Define worker1
#
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8109
worker.worker1.socket_timeout=1200
worker.worker1.connection_pool_size=1
worker.worker1.connection_pool_timeout=1300
worker.worker1.lbfactor=1
# Define prefered failover node for worker1
worker.worker1.redirect=worker2

#
# Define worker2
#
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8209
worker.worker2.socket_timeout=1200
worker.worker2.connection_pool_size=1
worker.worker2.connection_pool_timeout=1300
worker.worker2.lbfactor=1
# Disable worker2 for all requests except failover
worker.worker2.activation=false

#
# Defining a load balancer
#
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1, worker2

#
# Define status worker
#
worker.jkstatus.type=status' > /etc/httpd/conf/workers.properties
echo 'rm -rf /etc/httpd/conf/workers.properties' >> ${SETUP_FILE_PATH}/cleanup.sh

#
# generate tomcat startup script
#
echo '#!/bin/sh
#
# Startup script for Tomcat, the Apache Servlet Engine
#
# chkconfig: 345 86 14
# description: Tomcat Servlet Engine
# processname: tomcat
# pidfile: /var/run/worker1.pid /var/run/worker2.pid

# Source function library.
. /etc/rc.d/init.d/functions

# User under which tomcat will run
TOMCAT_USER=tomcat

RETVAL=0

CATALINA_HOME=/var/tomcat6
WORKER_ROOT="/var/robust"
WORKER_LIST=( worker1 worker2 )
WORKER_PORT=( 8105 8205 )

# start, debug, stop, and status functions
start() {
  # Start Tomcat in normal mode
  for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
  do
    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
    if [ $SHUTDOWN_PORT -ne 0 ]; then
        echo "Tomcat ${WORKER_LIST[i]} already started"
    else
        echo "Starting tomcat ${WORKER_LIST[i]}..."

        CATALINA_BASE="$WORKER_ROOT/${WORKER_LIST[i]}"
        rm -rf $CATALINA_BASE/work/*

        chown -R $TOMCAT_USER:$TOMCAT_USER $CATALINA_HOME
        chown -R $TOMCAT_USER:$TOMCAT_USER $WORKER_ROOT
        su -l $TOMCAT_USER -c "export CATALINA_BASE=$CATALINA_BASE; $CATALINA_HOME/bin/startup.sh"
        SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        while [ $SHUTDOWN_PORT -eq 0 ]; do
            sleep 1
            SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        done
        echo "Tomcat ${WORKER_LIST[i]} started in normal mode"
        RETVAL=$?
        [ $RETVAL = 0 ] && touch /var/lock/subsys/${WORKER_LIST[i]} /var/run/${WORKER_LIST[i]}.pid
    fi
  done
}

debug() {
  # Start Tomcat in debug mode
  for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
  do
    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
    if [ $SHUTDOWN_PORT -ne 0 ]; then
        echo "Tomcat ${WORKER_LIST[i]} already started"
    else
        echo "Starting tomcat ${WORKER_LIST[i]} in debug mode..."

        CATALINA_BASE="$WORKER_ROOT/${WORKER_LIST[i]}"
        rm -rf $CATALINA_BASE/work/*

        chown -R $TOMCAT_USER:$TOMCAT_USER $CATALINA_HOME
        chown -R $TOMCAT_USER:$TOMCAT_USER $WORKER_ROOT
        su -l $TOMCAT_USER -c "export CATALINA_BASE=$CATALINA_BASE; $CATALINA_HOME/bin/catalina.sh jpda start"
        SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        while [ $SHUTDOWN_PORT -eq 0 ]; do
            sleep 1
            SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        done
        echo "Tomcat ${WORKER_LIST[i]} started in debug mode"
        RETVAL=$?
        [ $RETVAL = 0 ] && touch /var/lock/subsys/${WORKER_LIST[i]} /var/run/${WORKER_LIST[i]}.pid
    fi
  done
}

stop() {
  for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
  do
    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
    if [ $SHUTDOWN_PORT -eq 0 ]; then
        echo "Tomcat ${WORKER_LIST[i]} already stopped"
    else
        echo "Stopping tomcat ${WORKER_LIST[i]} ..."
        CATALINA_BASE="$WORKER_ROOT/${WORKER_LIST[i]}"
        su -l $TOMCAT_USER -c "export CATALINA_BASE=$CATALINA_BASE; $CATALINA_HOME/bin/shutdown.sh"
	      SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        while [ $SHUTDOWN_PORT -ne 0 ]; do
            sleep 1
            SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
        done
	      RETVAL=$?
        echo "Tomcat ${WORKER_LIST[i]} stopped"
        [ $RETVAL=0 ] && rm -f /var/lock/subsys/${WORKER_LIST[i]} /var/run/${WORKER_LIST[i]}.pid
    fi
  done
}

status() {
  for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
  do
    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep ${WORKER_PORT[i]}|wc -l`
    if [ $SHUTDOWN_PORT -eq 0 ]; then
        echo "Tomcat ${WORKER_LIST[i]} stopped"
    else
        MODE="normal"
        JPDA_PORT=`netstat -vatn|grep LISTEN|grep 8000|wc -l`
        if [ $JPDA_PORT -ne 0 ]; then
            MODE="debug"
        fi
	      echo "Tomcat ${WORKER_LIST[i]} running in $MODE mode"
    fi
  done
}

case "$1" in
  start)
        start
        ;;
  debug)
        debug
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  redebug)
        stop
        debug
        ;;
  status)
  	status
	;;
  *)
	echo "Usage: $0 {start|debug|stop|restart|redebug|status}"
	exit 1
esac

exit $RETVAL' > /etc/rc.d/init.d/tomcat

chmod 755 /etc/rc.d/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on

echo 'chkconfig tomcat off' >> ${SETUP_FILE_PATH}/cleanup.sh
echo 'chkconfig --del tomcat' >> ${SETUP_FILE_PATH}/cleanup.sh
echo 'rm -rf /etc/init.d/tomcat' >> ${SETUP_FILE_PATH}/cleanup.sh

chmod 755 ${SETUP_FILE_PATH}/cleanup.sh

echo 'Tomcat installation is completed!'
echo
echo 'You can type "service tomcat start" to start using tomcat now.'
echo 'Open a browser, and go to http://'${hostname}' to see it.'


2.啟動Tomcat
service tomcat start

3.重新啟動Apache
service httpd restart

參考資料:
Apache Virtual Host 最簡單的做法 (含 DNS,讓你建目錄等於建虛擬主機 )
How to Disable SELinux
Integrating Tomcat and Apache on Red Hat Linux
jforumnewer其實說明得不錯,只要使用Ajax的技術,就可以達到這個需求,也就是當訪客點下超連結時,先用JavaScript執行一支記錄次數的程式,然後再導引至原本要去的超連結即可。

今天晚上稍微看了一下jQuery,發現如果您會用jQuery的話,這個問題就變得很簡單了,底下是範例程式碼:
index.html:
<html>
<head>
<title>AD Click Counter</title>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
<script type="text/javascript">
$(document).ready(function(){
         $("a").click(function(event){
                 var ad = $(this).attr("name");
                 var target = $(this).text();
                 $.get('counter.jsp?ad='+ad);
                 alert("Thanks for visiting "+ target +" !");
         });
});
</script>
</head>
<body>
<a href="http://jquery.com/" name="ad1">jQuery</a>
<a href="http://andowson.com/" name="ad2">Andowson</a>
<a href="http://google.com/" name="ad3">Google</a>
<a href="http://yahoo.com/" name="ad4">Yahoo!</a>
<a href="http://microsoft.com/" name="ad5">Microsoft</a>
</body>
</html>

counter.jsp:
<%@page import="java.util.*" %>
<%!
   // we use a Map(key, value) to store each ad's count
   static Map counters = new HashMap();
%>
<%
    // get the ad's name
    String name = request.getParameter("ad");
    int count = 0;
    // get back the previous count if this ad has been clicked
    if (counters.containsKey(name)) {
        count = (Integer)counters.get(name);
    }
    // add this ad's counter into map
    if (name != null) {
        synchronized (counters) {
            counters.put(name, ++count);
            counters.notify();
        }
    }
    // print all of the counters' names and values
    Iterator iterator = counters.keySet().iterator();
    while (iterator.hasNext()) {
        String key = (String)iterator.next();
        int value = (Integer)counters.get(key);
        System.out.println(key+"="+value);
        out.println(key+"="+value+"<br>");
    }
%>


簡單說明一下:
這個範例是由jQuery上面的How jQuery Works範例直接改寫過來的,也就是我們先下載jQuery這個JavaScript的函式庫,然後註冊我們要處理超連結a這個標籤,當按下超連結時即會呼叫$("a").click(...),然後我們利用attr("name")取得超連結的name屬性,用text()取得超連結顯示的文字,將超連結的名稱傳給counter.jsp的ad參數作為記錄的依據。

而counter.jsp這支程式,我先以HashMap代替資料庫,如果有抓到傳入的ad參數時就先檢查是否存在,如果存在,將舊的值取出加一再存回,如果不存在,則新增一筆進去。如果沒有傳入參數時將不會更新任何次數,最後將全部的值印出來觀察。
本站的設定是一般使用者公告區不能發表新文章,只能回覆,只有系統管理員(站長)才能發表。

其他版面流程為=>會員註冊=>收到認證信後啟用認證=>登入=>修改個人資料(上傳頭像、編輯個人簽名、填寫MSN等)=>討論區首頁=>點選版面名稱,如新生訓練營Test=>發表主題=>勾選文章控制選項(關閉HTML、BBCode、表情符號、回覆通知...及上傳附加檔案)=>預覽=>輸入驗證碼=>送出。

關於圖形驗證碼機制目前先改為不分大小寫,長度修改為4~5位。
您問的內容比較屬於跟PostgreSQL有關的問題,請參考這篇http://www.andowson.com/posts/list/140.page
升級Roller 3.0到Roller 4.0

簡單的步驟如下:
1.下載檔案及解壓縮
cd ~/download
wget http://apache.ntu.edu.tw/roller/roller-4/v4.0.0/bin/apache-roller-4.0.zip
unzip apache-roller-4.0.zip

2.修改升級用的dbscripts
cd ~/download/apache-roller-4.0/webapp/roller/WEB-INF/classes/dbscripts/postgresql
vi 300-to-310-migration.sql
將底下這一行加在檔尾
update roller_properties set value='310' where name='roller.database.version';


vi 310-to-400-migration.sql
將第159行的
drop table if exists rollerconfig;

修改為
drop table rollerconfig;

然後一樣將底下這一行加在檔尾
update roller_properties set value='400' where name='roller.database.version';


3.關閉Application Server例如Tomcat
sudo /etc/init.d/tomcat stop

4.將現有的roller搬移(備份)到/tmp下
mv ~/www/roller /tmp/roller-3.0

5.複製新的程式到網站目錄下:
cp -rf ~/download/apache-roller-4.0/webapp/roller ~/www/roller

6.備份資料庫:
sudo pg_dump -U scott roller > /tmp/roller_300-2008-09-06.bak

7.手動升級資料庫到3.1
sudo psql -U scott roller -f /home/andowson/www/roller/WEB-INF/classes/dbscripts/postgresql/300-to-310-migration.sql

8.編輯設定檔roller-custom.properties
vi ~/www/roller/WEB-INF/classes/roller-custom.properties
installation.type=auto
database.configurationType=jdbc
database.jdbc.driverClass=org.postgresql.Driver
database.jdbc.connectionURL=jdbc:postgresql://localhost:5432/roller
database.jdbc.username=scott
database.jdbc.password=tiger
mail.configurationType=properties
mail.hostname=smtp.andowson.com
uploads.dir=/home/andowson/www/data/roller_data/uploads
search.index.dir=/home/andowson/www/data/roller_data/search-index
passwds.encryption.enabled=false

smilie 注意到Roller 4.0起使用者密碼預設為使用SHA加密,如果是升級上來的要將這個功能取消,否則將無法登入

9.變更檔案及目錄權限:
chown -R andowson:tomcat ~/www/roller
chmod g+w ~/www/roller

10.刪除暫存檔案
rm -rf /var/robust/worker1/work/Catalina/www.andowson.com/roller

11.啟動Application Server
sudo /etc/init.d/tomcat start

12.開啟網頁到http://www.andowson.com/roller,會自動詢問是否要升級資料庫,選擇是

13.升級完成後,將設定檔roller-custom.properties裡面的installation.type改為manual
vi ~/www/roller/WEB-INF/classes/roller-custom.properties
installation.type=manual
經過測試之後發現,svnaccess中的[/]是給Trac看的,其他部分[repos-name:/]才是給Apache看的,如果您將[/]底下的 * = r刪除,則您需要將其他可以讀取或寫入的使用者明確地加到這個section來,例如:
[/]
admin = rw
user1 = rw
user2 = rw
否則在Trac登入後按下Browse Source時會出現Insufficient permissions to access /的錯誤。

如果要管控http://localhost/svn/project1時需要輸入帳號密碼,則可以修改/etc/httpd/conf.d/subversion.conf中的設定
<Location /svn>
    DAV svn
    SVNParentPath /home/andowson/repos
    #<LimitExcept GET PROPFIND OPTIONS REPORT>
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /home/andowson/projects/.htpasswd
        AuthzSVNAccessFile /home/andowson/projects/svnaccess
        Require valid-user
    #</LimitExcept>
</Location>

將原來的<LimitExcept>註解掉或刪除掉,再重新啟動Apache即可
wu_net2008您好,老實說,沒看到原始碼實在不知道怎麼判定是不是您的程式的問題。不過簡單來看,如果您將User物件存到HttpSession物件的attribute去,則這個HttpSession中的User物件應該就會在web.xml對Session所定義的timeout時間消失,在您的狀況就是20分鐘。User物件消失後就變成未登入狀態,所以這樣算正常現象。
這個很簡單啊,用FTPClient類別的listFiles()來取得現行工作目錄的檔案清單(FTPFile[]),然後跑一個for迴圈,將每個元素拿出來判斷是否是一個目錄(isDirectory())且名稱(getName())等於目錄A,如果存在就終止迴圈,並將變數dirExist設定為true。
if (ftp.login(username, password)) {
	boolean dirExist = false;
	String dirA = "upload";
	FTPFile[] files = ftp.listFiles();
	for (int i = 0; i < files.length; i++) {
	         if (files[i].isDirectory() && files[i].getName().equals(dirA)) {
	            dirExist = true;
	            break;
	        }
	}
	out.println("directory " + dirA + " exists? " + dirExist);
	if (!dirExist) {
	       ftp.makeDirectory(dirA);
	}
}
目前得到的結論是:
SCJP 1.4版時,選中文是可以切換回英文的。
SCJP 5.0版起,選中文是無法切換回英文的。
所以要考SCJP 6的人報名時就要選好英文版,再搭配猛虎出閘的180題英文試題準備,過關的機率就很大囉!
另外我發現考試當時有些中文題目和猛虎的英文題目稍微有點小變化(算類似題),由於考試前一天把題目都做過一遍,所以印象很深刻,看了幾行答案就直接寫下去了,後來再檢查時有發現差異,考英文版的話應該就可以更容易區分出來吧!
至於要不要補習,應該是因人而異吧,對於像我這種已經用Java開發程式多年或資訊本科系的人,複習式的補習就還OK,可能就是一些常考觀念的釐清,大概三~四天這種,包含提供練習題及練習題講解等。不過,自己認真K書應該是不二法門。
至於非資訊本科系的人,如果沒有寫程式的基礎,補習應該是條捷徑,可以上各大教育訓練中心的SCJP認證輔導課程,相信效果應該也是不錯。不過,多寫些程式是一定要的。
viva wrote:
在請教一下...(我好像問題好多,不知道會不會造成你困擾)
我已經寫好我自己要使用的FTP程式...
但....如果在FTP設定伺服器種類設為FTPES-透過外顯式TLS/SSL的FTP
那我的FTP程式還連的上嗎?


有問題互相討論是OK的,不過希望能提供較多的資訊,例如完整或部分的程式碼,這樣子別人對於您的問題的內容會比較清楚。
目前支援FTPS的Java FTP Library大多是commercial component,如edtFTPj/Pro。所以您的程式需要換掉Library及修改部分程式碼才能連上。
我找到了一個FTPES的範例程式,網址如下:
http://www.example-code.com/java/ftp_AuthSSL.asp
您可以參考,用到的元件下載網址如下:
http://www.chilkatsoft.com/download/ChilkatJava.zip
 
討論區首頁 » 個人資料 andowson » 文章發表人是 andowson
前往:   

交換連結乌托邦博客 
在本站刊登廣告
練功房推薦書單
這一生,至少當一次傻瓜─木村阿公的奇蹟蘋果 Learning jQuery中文版 SCJP Java 6專業認證手冊 Java認證SCJP 6.0/5.0--猛虎出閘 人月神話:軟體專案管理之道(20週年紀念版) SCWCD專業認證手冊 Head First Servlets and JSP
[版權說明] 歡迎部分引用本站文章但不歡迎全文轉載,請遵守本站授權方式:創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款。換句話說,您可以轉載、轉寄、引用本站文章,但請附上作者、出處與原文的超連結。除個人收藏外,請勿全文轉載,感謝大家!
Creative Commons License
Powered by JForum 2.1.9 © JForum Team