最近有机会使用和学习DotNet, 感觉很振奋, 以前对DotNet的抗拒现在变成了惊喜, 感觉每天都在欣喜中不断看书和学习.
(1) DotNet 3.5的新特性很让我舒服, var关键字, 自动属性, 匿名类, lamba, LinQ, 这点Java目前是没有得比了, 越来越多动态语言的特性被编译器支持,同时又兼顾了强类型,编译语言的高效率.
(2) DotNet的开源社区越来越成熟了, 很多Java社区的技术移植到了.NET, 比如Spring.NET, NHibernate, NUnit, Log4Net, 另外一些ViewEngine, Ioc技术项目也成熟了.所以可以选择的东西也多了.
(3) Visual Studio 2008的Express版本功能也不错了, 对我来说,我觉得足够了
(4) ASP.NET MVC有点意思, 仔细看了之后,觉得很喜欢, 相对于WebForm开发方式来讲,我习惯多了,对于Ajax开发, 我习惯它的这个MVC模式,实在是太方便了, 控件拖来拖去的开发方法,对我来说不习惯.
不过,个人感觉在DotNet中使用第三方开源技术也不是特别方便, 首先很多框架和技术缺乏IDE的支持, 这相对于微软的技术来讲是天生的缺陷, 比如NUnit就没有VS自带的单元测试方便, NHibernate没有Linq方便, MonoRails没有ASP.NET MVC方便, Spark作为模版引擎比ASPX好,但是如果使用VS进行开发, IDE提供的自动补全功能, 使用aspx, htmlhelper开发也很方便, 在ASP.NET MVC中IDE还能自动生成view模版, 实在是比较爽.
说到SP1中的Entity Framework技术, 中文版本可能又一个Bug, 在代码中什么什么"Set"被翻译成了"集", 虽然编码支持UTF8,不引起使用,但是代码属性中出现中文是感觉很便扭的事情.
2009年2月25日星期三
2009年2月19日星期四
ArchLinux, hal-0.5.11-7造成gnome不能正常挂载NTF分区和USB
系统升级之后,发现在“位置”中可以显示各个分区,但是不能使用gnome挂载NTFS分区,U盘也不能自动挂载了,看了一下升级日志
,发现hal从0.5.11-4升级到0.5.11-7了,因为之前遇到过类似的问题,猜想是hal的问题,于是编译安装了老版的hal问题解决。另外新的networkmanager依赖于hal-0.5.11-7,所以networkmanager也不能用了,不过感觉也没有啥,只是少了个桌面Applet而已。。
顺便看了一下hal改变, 由于两个hal只是小版本号的问题,也就是说上游源码是没有变化的,问题应该出在Arch Linux的打包者的patch上,看了一下PKGBUILD,发现多了几个补丁,也许是它们造成的问题吧,涉及到源代码的改变,所以暂时算了,用老版本好了。
补充: 貌似是PolicyKit的问题,授权了就是挂不了。。
,发现hal从0.5.11-4升级到0.5.11-7了,因为之前遇到过类似的问题,猜想是hal的问题,于是编译安装了老版的hal问题解决。另外新的networkmanager依赖于hal-0.5.11-7,所以networkmanager也不能用了,不过感觉也没有啥,只是少了个桌面Applet而已。。
顺便看了一下hal改变, 由于两个hal只是小版本号的问题,也就是说上游源码是没有变化的,问题应该出在Arch Linux的打包者的patch上,看了一下PKGBUILD,发现多了几个补丁,也许是它们造成的问题吧,涉及到源代码的改变,所以暂时算了,用老版本好了。
补充: 貌似是PolicyKit的问题,授权了就是挂不了。。
2009年1月18日星期日
再说ATI显卡
前面两天发了一下牢骚。。。因为用过三台电脑了,一直用Nidia的显卡,所以用Nidia的卡在Linux下用了7年了,用Nidia的卡也没有出过什么问题,所以对于ATI的卡评价可能不公平。
好好查了一下资料,其实还是觉得ATI卡不错的,至少势头是好的,AMD/ATI公布了技术参数,所以开源的xf86-video-radeonhd的开发进度很快,这是X.org上wiki的介绍,另外对ATI显卡的一个分类学习了一下,开始了解自己的显卡,这里是一份资料。
我的ASUS EAH 3650是使用了ATI HD3650的芯片,从上面的资料看,它实际上是RV635这个类的:
* RV635: Radeon HD 3650, HD 3670
从X.org wiki上看到的内容,xf86-video-radeonhd从1.2.0的时候开始支持RV635的显卡,但是目前的2D加速还是仅仅限于R5xx (including RS6xx),也就是Radeon X1800; FireGL V5300, V7200, V7300, V7350,Xpress 1200, Xpress 1250系列芯片的显卡,所以目前2D加速在我的显卡上还是不支持的,需要继续等待了。3D支持在各个系列上都还是空,除非是另外的那个ati开源驱动,在老的芯片上实现了3D加速。如果我用开源的radeonhd驱动,那么就不能玩3D游戏了,比如nexuiz,不过我也不经常玩,所以无所谓;还有就是compiz白屏,我基本上用fvwm用得比较多,所以也无所谓了。但是如果用官方闭源驱动,如果开了透明效果,比如compiz或者xcompmgr(在fvwm中我使用使窗口透明,更加漂亮)就使用不了了,窗口反应特别迟钝,所以不能用。
目前有两个选择了,要么不玩nexuiz,要么不用xcompmgr。这样,我用Linux工作其实还是不影响的。但是上一篇说的使用windows xp来做开发工作,我确实想尝试一下,不知道在windows上用虚拟桌面软件的效果如何,得适用一下,习惯多屏工作了,也要学习一下windows是否有窗口控制的快捷键,我用fvwm快捷键控制窗口,移动,居中,最大最小化可以极大提高我的工作效率,但是不知道windows xp上能不能这么做,要研究一下。
好好查了一下资料,其实还是觉得ATI卡不错的,至少势头是好的,AMD/ATI公布了技术参数,所以开源的xf86-video-radeonhd的开发进度很快,这是X.org上wiki的介绍,另外对ATI显卡的一个分类学习了一下,开始了解自己的显卡,这里是一份资料。
我的ASUS EAH 3650是使用了ATI HD3650的芯片,从上面的资料看,它实际上是RV635这个类的:
* RV635: Radeon HD 3650, HD 3670
从X.org wiki上看到的内容,xf86-video-radeonhd从1.2.0的时候开始支持RV635的显卡,但是目前的2D加速还是仅仅限于R5xx (including RS6xx),也就是Radeon X1800; FireGL V5300, V7200, V7300, V7350,Xpress 1200, Xpress 1250系列芯片的显卡,所以目前2D加速在我的显卡上还是不支持的,需要继续等待了。3D支持在各个系列上都还是空,除非是另外的那个ati开源驱动,在老的芯片上实现了3D加速。如果我用开源的radeonhd驱动,那么就不能玩3D游戏了,比如nexuiz,不过我也不经常玩,所以无所谓;还有就是compiz白屏,我基本上用fvwm用得比较多,所以也无所谓了。但是如果用官方闭源驱动,如果开了透明效果,比如compiz或者xcompmgr(在fvwm中我使用使窗口透明,更加漂亮)就使用不了了,窗口反应特别迟钝,所以不能用。
目前有两个选择了,要么不玩nexuiz,要么不用xcompmgr。这样,我用Linux工作其实还是不影响的。但是上一篇说的使用windows xp来做开发工作,我确实想尝试一下,不知道在windows上用虚拟桌面软件的效果如何,得适用一下,习惯多屏工作了,也要学习一下windows是否有窗口控制的快捷键,我用fvwm快捷键控制窗口,移动,居中,最大最小化可以极大提高我的工作效率,但是不知道windows xp上能不能这么做,要研究一下。
2009年1月17日星期六
叛逃 - 为五斗米折腰
用过快的机器之后,再用回老机器,心里总感觉有点慢,也许是心里作用吧。
我突然有一个这样的想法:是否我一直以来太执着?喜欢成为异类,还是我真的不用Linux会死?
是个人人都知道,目前桌面市场,windows仍然是老大,而且windows xp目前我觉得非常好用,要比性能,同样的电脑,如果Linux要跟windows比,那么注定它只能装fvwm之类的窗口管理器而已,我想,如果我在windows上花相同的时间,那么我对于它的使用肯定也得心应手,用了这么多年的Linux,做了那么多年的系统管理员,我现在闭着眼睛都可以装出和根据要求配置好一个服务器来,我觉得我自己已经过了学习Linux阶段,而对于它下面的开发,特别是xWindows方面的开发,我觉得目前还差得很远,正因为Linux对于桌面应用来讲,有着这样那样的不成熟,这当然不是Linux社区自身的问题,而是各个硬件厂商的原因,最新的驱动肯定是先保证windows用户的,所以才造成我的最新的显卡不能正常工作,我觉得我要现实一点,别成为愤青了,我自己也承认,在用Linux作为桌面的过程中,我花了不少时间去配置,去使用,并且也确实学到了不少东西,而这些对于我来讲,没有现实的意义了,我已经不是那么只能安心用Free软件的学生了,现在情况变了
(1)我有正版的windows用了,我丝毫不会感觉因为盗版而良心不安了
(2)公司机房有多台Linux服务器了,我完全可以用个putty远程上去编程,而不要自己桌面上用Linux,反正我也基本不需要图形界面
(3)对于服务器来讲,我维护着那么多台Linux,我肯定不会有任何的生疏
(4)我习惯使用的开源软件,都有windows的port了,比如gvim,gnucash
(5) 其实我还是离不开windows了,OA要用windows,迅雷要用windows
(6) 说到安全性,中病毒,其实是一个相对的概念,自己小心,没有那么容易中病毒
(7)使用Eclipse,其实用windows版本的更加的好用
(8) 做WEB开发,免不了还是用IE测试,Linux wine出来的IE还是有些问题,比如字体什么的
所以我决定停用Linux半年甚至更长,至少等待我的显卡驱动成熟起来。
我突然有一个这样的想法:是否我一直以来太执着?喜欢成为异类,还是我真的不用Linux会死?
是个人人都知道,目前桌面市场,windows仍然是老大,而且windows xp目前我觉得非常好用,要比性能,同样的电脑,如果Linux要跟windows比,那么注定它只能装fvwm之类的窗口管理器而已,我想,如果我在windows上花相同的时间,那么我对于它的使用肯定也得心应手,用了这么多年的Linux,做了那么多年的系统管理员,我现在闭着眼睛都可以装出和根据要求配置好一个服务器来,我觉得我自己已经过了学习Linux阶段,而对于它下面的开发,特别是xWindows方面的开发,我觉得目前还差得很远,正因为Linux对于桌面应用来讲,有着这样那样的不成熟,这当然不是Linux社区自身的问题,而是各个硬件厂商的原因,最新的驱动肯定是先保证windows用户的,所以才造成我的最新的显卡不能正常工作,我觉得我要现实一点,别成为愤青了,我自己也承认,在用Linux作为桌面的过程中,我花了不少时间去配置,去使用,并且也确实学到了不少东西,而这些对于我来讲,没有现实的意义了,我已经不是那么只能安心用Free软件的学生了,现在情况变了
(1)我有正版的windows用了,我丝毫不会感觉因为盗版而良心不安了
(2)公司机房有多台Linux服务器了,我完全可以用个putty远程上去编程,而不要自己桌面上用Linux,反正我也基本不需要图形界面
(3)对于服务器来讲,我维护着那么多台Linux,我肯定不会有任何的生疏
(4)我习惯使用的开源软件,都有windows的port了,比如gvim,gnucash
(5) 其实我还是离不开windows了,OA要用windows,迅雷要用windows
(6) 说到安全性,中病毒,其实是一个相对的概念,自己小心,没有那么容易中病毒
(7)使用Eclipse,其实用windows版本的更加的好用
(8) 做WEB开发,免不了还是用IE测试,Linux wine出来的IE还是有些问题,比如字体什么的
所以我决定停用Linux半年甚至更长,至少等待我的显卡驱动成熟起来。
消受不了
单位给换台新设备,其实我的电脑是2007年的,也不差,PD925, DDR 2G, 160G,nVidia7300LE, 不过呢,虽然在当时感觉如此高的配置,但是在X-Plane下不能开全屏。不过是看上了新设备上的双头显卡,ATI HD 3650啊, 可以说是比较高端的显卡了,准备弄个双显示器用,提高编码工作效率,虽然也习惯用虚拟桌面,但是总是调试编码的切,如果有双显示器那就爽了,用双显示器也是《productive Programer》中的一个建议.新电脑处理显卡比较新之外,还有Core 2 Duo CPU,250G硬盘,这些都是让人流口水的配置,于是就花了一天多的时间来转资料,并且把老机器上的Arch拷了过来,改了设置之后,启动,发现显示特别不对,觉得颜色乖乖的,用fvwm居然窗体动画状态的窗口最大最小化都要1秒时间,把我难受得不行,猛查资料什么的,改来改去还是改变不了这个状况,只要fvwm里面用透明或者在gnome里面开compiz,窗口反应都特别迟缓;闭源驱动有问题,开源驱动不支持,我着实郁闷。后来想想还是算了,不换了,Core 2 Duo E8200比PD925的性能,确实快了,不过那是在windows下面感觉,在设备更新和Linux之间我还是选择使用Linux,所以用老机器吧。其实老设备完全可以满足我的需要,特别是Linux更是不成问题,在家里2003的老电脑,1Gcpu我照样用得挺好,看来这个新设备我是消受不了了。
2009年1月14日星期三
centos-java6-tomcat5配置
在上个月的一篇博客里面提到要更新服务器,最后定到两个候选对象,debian和Centos.
后来装了一下CentOs之后觉得它作为服务器来说,确实不错,它的安装是最快的。其实作为一个服务器来说,很多东西是必须而且不要自己再去定义的,比如SSHD,iptables等等,如果用debian,那么这些东西还要自己安装,在源慢的情况之下,那么装debian就比较费时间了。虽然它有DVD下载,但是它包含的软件包实在太多,有三张DVD,也不知道自己在服务器中用到那张的;而Centos专注于服务器应用,它那一张DVD,基本就能应付了。所以从安装方面来讲,Centos还是比较好的。
另外,Centos的图形配置工具也很值得推荐,比如system-config-securitylevel等等.
对于centos5,有一点不爽就是Java,它自带的Java是GCJ1.4.2,这个肯定是要换的。很多年没有用redhat的东西,当时用redhat的时候都还没有YUM呢,所以也都忘了有jpackage这个东西,对于在redhat之类的Linux上用Java,jpackage这个东西还是不能少的,关于Java的设定,在CentOS的wiki上有一个howto,google到了,自己找到并且编译了sun-jdk-1.6.0,才满足了我的需要,当然,如果愿意直接用sun提供的self-extrac安装包也可以,我原来是以为用jpackage源rpm包自己重新编译的能够解决一些依赖问题,但是不知道为什么,tomcat5还是依赖java-gcj-1.4.2,这让我非常不爽,不知道我用CentOs的经验太少还是怎么的。所以干脆也就不用它的tomcat5的包了,改用直接下载的tomcat5的tar包。其实对于用做服务器,我尽量用服务器自己带的软件包,而不想自己加的软件包更不用提自己手工编译了,因为这样涉及到很多配置的问题。而对于tomcat的这个也是如此,自己下载tomcat包的一个优点是系统会很干净,就加一个第三方包就可以了,也没有依赖的问题,唯一不爽的就是它的自自动。关于它的自启动,有这样几种方法:
(1) 直接把start.sh放到rc.local里面,这样是最省事的方法,但是带来的问题就是是用root启动的,并且不能用启动脚本灵活的控制其起停。
(2) 自己编写脚本,在start,stop函数中调用start.sh,stop.sh来控制tomcat起停,这样也很简单,但是也存在(1)中的问题,并且没有pid创建等等,故不能实现status的功能,可以做到灵活控制启动停止了,但是还是没有做到用non-root启动的目的。在网上找的脚本编写得并不好,由于启动tomcat需要比较多的延时,所以如果不注意控制,很可能发现自动不了,或者不能重启,停止了java还是不退出等等问题。
(3) 可以把catalina.sh放到init.d里面,因为catalina.sh本身就有start,stop之类的调用方法了,当然,为了适应chconfig的要求,这个脚本要做相应的修改,添加用数字表示的启动停止顺序等,缺点同(2)
(4) 使用tomcat带的jsvc,这样可以做到non-root用户,启动到特权端口上,这个是很多人的选择,并且jsvc里面带了启动脚本实例。
(5) 使用su - user -c script方法以其他用户运行tomcat的catalina.sh,这样可以以non-root用户运行tomcat,但是不能使用特权端口。这个也需要自己编写脚本来实现自启动,为这个我专门花了两个小时把CentOS自带的tomcat5的脚本改到合适单独安装tomcat的情况,经过测试不会遇到2的问题,CentOS这个启动脚本考虑问题很周全,建议自己安装tomcat的用户根据需要自己改改。可惜blogger不能贴附件,否则我就传上来。我的需要是使用nginx做前端的反向代理,所以方案5适合我的需要。
另外,经过一天的学习和配置,对CentOS理解越多,还是觉得它在服务器环境来讲确实很不错的,完全没有我担心额外软件包的问题。关于源:mirror.be10.com这个源比较快,在cn99源down掉了之后,比我遇到的任何debian,ubuntu源都快。源也是我挑选发行版的一个重要原因。还有就是epel这个comunity的rpm库也很重要,我原来以为用nginx之类的不包含在centOS发行中的软件包需要自己编译的,google了一下之后,发现还有epel这样一个软件库,由于centos和rhel二进制兼容,因此就不用担心软件包的问题了,基本上需要的软件包在epel里面都有。安装和使用也特别简单。
tomcat5启动脚本:
#!/bin/bash
#
# tomcat5 This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat5
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.4 and JSP 2.0
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#
# commented out until the RHEL and FC daemon functions converge
# Source the function library
#if [ -r "/etc/rc.d/init.d/functions" ]; then
#. /etc/rc.d/init.d/functions
#fi
NAME="$(basename $0)"
unset ISBOOT
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
NAME="${NAME:3}"
ISBOOT="1"
fi
# For SELinux we need to use 'runuser' not 'su'
if [ -x "/sbin/runuser" ]; then
SU="/sbin/runuser"
else
SU="su"
fi
#tomcat setting
TOMCAT_CFG="/etc/tomcat/tomcat5.conf"
if [ -r "$TOMCAT_CFG" ]; then
. ${TOMCAT_CFG}
fi
SHUTDOWN_WAIT=30
# Define which connector port to use
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"
# Path to the tomcat launch script
TOMCAT_SCRIPT="${CATALINA_HOME}/bin/catalina.sh"
# Tomcat program name
TOMCAT_PROG="$NAME"
# Define the tomcat username
TOMCAT_USER="${TOMCAT_USER:-tomcat}"
# Define the tomcat log file
TOMCAT_LOG="${TOMCAT_LOG:-/var/log/tomcat/catalina.out}"
RETVAL="0"
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function checkpid() {
local i
for i in $* ; do
if [ -d "/proc/${i}" ]; then
return 0
fi
done
return 1
}
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_failure() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"FAILED"
echo -n " ]"
echo -ne "\r"
return 1
}
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_success() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"OK"
echo -n " ]"
echo -ne "\r"
return 0
}
function parseOptions() {
options=""
#if GLOBAL VARIABLE is set, TOMCAT_CFG is optional
if [ -r "${TOMCAT_CFG}" ]; then
options="$options $(
awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
$TOMCAT_CFG
)"
fi
TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT"
}
# See how we were called.
function start() {
echo -n "Starting ${TOMCAT_PROG}: "
if [ -f "/var/lock/subsys/${NAME}" ] ; then
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$NAME process already running"
return -1
else
echo "lock file found but no process running for"
echo "pid $kpid, continuing"
fi
fi
fi
export CATALINA_PID="/var/run/${NAME}.pid"
touch $CATALINA_PID
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >> $TOMCAT_LOG 2>&1
#$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT run" #for testing
RETVAL="$?"
if [ "$RETVAL" -eq 0 ]; then
echo_success
touch /var/lock/subsys/${NAME}
else
echo_failure
fi
echo
return $RETVAL
}
function status() {
RETVAL="1"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$0 is already running (${kpid})"
RETVAL="0"
else
echo "lock file found but no process running for pid $kpid"
fi
else
pid="$(pgrep -u tomcat java)"
if [ -n "$pid" ]; then
echo "$0 running (${pid}) but no PID file exists"
RETVAL="0"
else
echo "$0 is stopped"
fi
fi
return $RETVAL
}
function stop() {
local STOP_VERBOSE="false"
echo -n "Stopping $TOMCAT_PROG: "
if [ -f "/var/lock/subsys/${NAME}" ]; then
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop" >> $TOMCAT_LOG 2>&1
RETVAL="$?"
if [ "$RETVAL" -eq "0" ]; then
count="0"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nwaiting for processes $kpid to exit"
fi
sleep 1
let count="${count}+1"
done
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nkilling processes which didn't stop"
echo -n -e "after "
echo -n "$SHUTDOWN_WAIT seconds"
fi
kill -9 $kpid
fi
echo_success
if [ "$count" -gt "0" ]; then
echo -n -e "\n"
fi
fi
rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid
else
echo_failure
fi
fi
}
# See how we were called.
case "$1" in
start)
parseOptions
start
;;
stop)
parseOptions
stop
;;
restart)
parseOptions
stop
sleep 2
start
;;
condrestart)
if [ -f "/var/run/${NAME}.pid" ]; then
parseOptions
stop
start
fi
;;
status)
status
;;
version)
parseOptions
"${JAVA_HOME}/bin/java" \
-classpath "${CATALINA_HOME}/server/lib/catalina.jar" \
org.apache.catalina.util.ServerInfo
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart|status|version}"
exit 1
esac
exit $RETVAL
后来装了一下CentOs之后觉得它作为服务器来说,确实不错,它的安装是最快的。其实作为一个服务器来说,很多东西是必须而且不要自己再去定义的,比如SSHD,iptables等等,如果用debian,那么这些东西还要自己安装,在源慢的情况之下,那么装debian就比较费时间了。虽然它有DVD下载,但是它包含的软件包实在太多,有三张DVD,也不知道自己在服务器中用到那张的;而Centos专注于服务器应用,它那一张DVD,基本就能应付了。所以从安装方面来讲,Centos还是比较好的。
另外,Centos的图形配置工具也很值得推荐,比如system-config-securitylevel等等.
对于centos5,有一点不爽就是Java,它自带的Java是GCJ1.4.2,这个肯定是要换的。很多年没有用redhat的东西,当时用redhat的时候都还没有YUM呢,所以也都忘了有jpackage这个东西,对于在redhat之类的Linux上用Java,jpackage这个东西还是不能少的,关于Java的设定,在CentOS的wiki上有一个howto,google到了,自己找到并且编译了sun-jdk-1.6.0,才满足了我的需要,当然,如果愿意直接用sun提供的self-extrac安装包也可以,我原来是以为用jpackage源rpm包自己重新编译的能够解决一些依赖问题,但是不知道为什么,tomcat5还是依赖java-gcj-1.4.2,这让我非常不爽,不知道我用CentOs的经验太少还是怎么的。所以干脆也就不用它的tomcat5的包了,改用直接下载的tomcat5的tar包。其实对于用做服务器,我尽量用服务器自己带的软件包,而不想自己加的软件包更不用提自己手工编译了,因为这样涉及到很多配置的问题。而对于tomcat的这个也是如此,自己下载tomcat包的一个优点是系统会很干净,就加一个第三方包就可以了,也没有依赖的问题,唯一不爽的就是它的自自动。关于它的自启动,有这样几种方法:
(1) 直接把start.sh放到rc.local里面,这样是最省事的方法,但是带来的问题就是是用root启动的,并且不能用启动脚本灵活的控制其起停。
(2) 自己编写脚本,在start,stop函数中调用start.sh,stop.sh来控制tomcat起停,这样也很简单,但是也存在(1)中的问题,并且没有pid创建等等,故不能实现status的功能,可以做到灵活控制启动停止了,但是还是没有做到用non-root启动的目的。在网上找的脚本编写得并不好,由于启动tomcat需要比较多的延时,所以如果不注意控制,很可能发现自动不了,或者不能重启,停止了java还是不退出等等问题。
(3) 可以把catalina.sh放到init.d里面,因为catalina.sh本身就有start,stop之类的调用方法了,当然,为了适应chconfig的要求,这个脚本要做相应的修改,添加用数字表示的启动停止顺序等,缺点同(2)
(4) 使用tomcat带的jsvc,这样可以做到non-root用户,启动到特权端口上,这个是很多人的选择,并且jsvc里面带了启动脚本实例。
(5) 使用su - user -c script方法以其他用户运行tomcat的catalina.sh,这样可以以non-root用户运行tomcat,但是不能使用特权端口。这个也需要自己编写脚本来实现自启动,为这个我专门花了两个小时把CentOS自带的tomcat5的脚本改到合适单独安装tomcat的情况,经过测试不会遇到2的问题,CentOS这个启动脚本考虑问题很周全,建议自己安装tomcat的用户根据需要自己改改。可惜blogger不能贴附件,否则我就传上来。我的需要是使用nginx做前端的反向代理,所以方案5适合我的需要。
另外,经过一天的学习和配置,对CentOS理解越多,还是觉得它在服务器环境来讲确实很不错的,完全没有我担心额外软件包的问题。关于源:mirror.be10.com这个源比较快,在cn99源down掉了之后,比我遇到的任何debian,ubuntu源都快。源也是我挑选发行版的一个重要原因。还有就是epel这个comunity的rpm库也很重要,我原来以为用nginx之类的不包含在centOS发行中的软件包需要自己编译的,google了一下之后,发现还有epel这样一个软件库,由于centos和rhel二进制兼容,因此就不用担心软件包的问题了,基本上需要的软件包在epel里面都有。安装和使用也特别简单。
tomcat5启动脚本:
#!/bin/bash
#
# tomcat5 This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat5
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.4 and JSP 2.0
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#
# commented out until the RHEL and FC daemon functions converge
# Source the function library
#if [ -r "/etc/rc.d/init.d/functions" ]; then
#. /etc/rc.d/init.d/functions
#fi
NAME="$(basename $0)"
unset ISBOOT
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
NAME="${NAME:3}"
ISBOOT="1"
fi
# For SELinux we need to use 'runuser' not 'su'
if [ -x "/sbin/runuser" ]; then
SU="/sbin/runuser"
else
SU="su"
fi
#tomcat setting
TOMCAT_CFG="/etc/tomcat/tomcat5.conf"
if [ -r "$TOMCAT_CFG" ]; then
. ${TOMCAT_CFG}
fi
SHUTDOWN_WAIT=30
# Define which connector port to use
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"
# Path to the tomcat launch script
TOMCAT_SCRIPT="${CATALINA_HOME}/bin/catalina.sh"
# Tomcat program name
TOMCAT_PROG="$NAME"
# Define the tomcat username
TOMCAT_USER="${TOMCAT_USER:-tomcat}"
# Define the tomcat log file
TOMCAT_LOG="${TOMCAT_LOG:-/var/log/tomcat/catalina.out}"
RETVAL="0"
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function checkpid() {
local i
for i in $* ; do
if [ -d "/proc/${i}" ]; then
return 0
fi
done
return 1
}
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_failure() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"FAILED"
echo -n " ]"
echo -ne "\r"
return 1
}
# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_success() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"OK"
echo -n " ]"
echo -ne "\r"
return 0
}
function parseOptions() {
options=""
#if GLOBAL VARIABLE is set, TOMCAT_CFG is optional
if [ -r "${TOMCAT_CFG}" ]; then
options="$options $(
awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
$TOMCAT_CFG
)"
fi
TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT"
}
# See how we were called.
function start() {
echo -n "Starting ${TOMCAT_PROG}: "
if [ -f "/var/lock/subsys/${NAME}" ] ; then
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$NAME process already running"
return -1
else
echo "lock file found but no process running for"
echo "pid $kpid, continuing"
fi
fi
fi
export CATALINA_PID="/var/run/${NAME}.pid"
touch $CATALINA_PID
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >> $TOMCAT_LOG 2>&1
#$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT run" #for testing
RETVAL="$?"
if [ "$RETVAL" -eq 0 ]; then
echo_success
touch /var/lock/subsys/${NAME}
else
echo_failure
fi
echo
return $RETVAL
}
function status() {
RETVAL="1"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$0 is already running (${kpid})"
RETVAL="0"
else
echo "lock file found but no process running for pid $kpid"
fi
else
pid="$(pgrep -u tomcat java)"
if [ -n "$pid" ]; then
echo "$0 running (${pid}) but no PID file exists"
RETVAL="0"
else
echo "$0 is stopped"
fi
fi
return $RETVAL
}
function stop() {
local STOP_VERBOSE="false"
echo -n "Stopping $TOMCAT_PROG: "
if [ -f "/var/lock/subsys/${NAME}" ]; then
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop" >> $TOMCAT_LOG 2>&1
RETVAL="$?"
if [ "$RETVAL" -eq "0" ]; then
count="0"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nwaiting for processes $kpid to exit"
fi
sleep 1
let count="${count}+1"
done
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nkilling processes which didn't stop"
echo -n -e "after "
echo -n "$SHUTDOWN_WAIT seconds"
fi
kill -9 $kpid
fi
echo_success
if [ "$count" -gt "0" ]; then
echo -n -e "\n"
fi
fi
rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid
else
echo_failure
fi
fi
}
# See how we were called.
case "$1" in
start)
parseOptions
start
;;
stop)
parseOptions
stop
;;
restart)
parseOptions
stop
sleep 2
start
;;
condrestart)
if [ -f "/var/run/${NAME}.pid" ]; then
parseOptions
stop
start
fi
;;
status)
status
;;
version)
parseOptions
"${JAVA_HOME}/bin/java" \
-classpath "${CATALINA_HOME}/server/lib/catalina.jar" \
org.apache.catalina.util.ServerInfo
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart|status|version}"
exit 1
esac
exit $RETVAL
2009年1月11日星期日
说说windows7
今天看Google资讯,无意中看到了windows 7 Beta提供BT下载的消息,顺着链接看了一些windows7的新特性,可能是写文章的人不明白真正吸引人的地方吧,举例说了什么任务栏预览窗口内容什么的。对于这些用于体验上的特性,windows真的不能和Mac OSX比,甚至都不能和装了compize的Linux比。说实话,说运行效率,windows xp确实不错,如果用Linux要达到windows xp的运行流畅程度,那么Gnome,KDE肯定是不能用的,不过windows xp的读写文件我倒是觉得没有Linux好,要我选择,我只可能用Mac OSX,Linux,然后才是windows xp,那么Vista,windows 7完全没有兴趣。不知道微软操作系统定位是什么了,提高易用性,也不是牺牲运行性能为前提吧,那些特效动画效果,我个人觉得windows xp那样就已经足够了。
订阅:
博文 (Atom)
