Archive

Archive for August, 2007

游戏里没有什么?

August 26th, 2007 Fwolf 3 comments

现在的游戏作的真好,几乎什么样的都有,几乎适合任何年纪的都有,但是,游戏和现实还是有不少的差距,那么,有哪些东西是在游戏中没有的呢?

生老病死,酸甜苦辣

没错,游戏中的生,就是你注册了个新账号,一贫如洗,赤手空拳;随着游戏时间的增加,年龄也会增长,甚至会变老、老死;也会中毒或生病,不过有药水或者疗伤大夫、术士;死亡,在游戏中可以是永久的,也可能只是损失一些 金钱或者经验。但是,在游戏中你能体会到自己在父母怀中咿哑学语的滋味么?能体验到老得只能喝粥的滋味了?能体会到糖尿病脑血栓的病痛么?死亡了,就无法开始新游戏或者注册新人物,有这样的游戏么?在游戏中你可以一天之内经历人一生之中会遇到的事情,但却无法感受需要你一生来经历的真实。

发明创造的乐趣

以前的游戏如轩辕剑可以炼妖,现在的游戏很多也可以合成装备,但这些不叫发明创造,充其量只是“发现”了游戏中的某个功能而已,所以不用沾沾自喜,当你成为全世界第一个合成某套装备的人的时候,殊不知这些功能早就是程序员测试过千百遍的了,都是在游戏策划方案中讨论过N次的。真正的发明创造是从无到有的,而不是一直藏在什么地方等着你挖出来而已。现在的科技,恐怕还无法在游戏中模拟真正的发明创造,否则大家不用建研究院了,都去打游戏得了。

人生的无奈,无法回头的选择,错误的代价

英文的game翻译成中文叫游戏,没有用读音直译,而是直接选用了中文中含义最接近的词语,真的是太合适了。小孩子也作“游戏”过家家,大人们也会玩“杀人游戏”,游戏的本质就是虚拟,虚拟就是虚假,既然是虚假就可以从头来过,所以在游戏中你可以载入,也可以复活再去杀那把你干掉的怪物,但在人生中,有太多无奈的事情了,比如近视眼在无法手术治疗之前只能一辈子戴眼镜(已经比眼镜出现之前年代的人好多了),你也无法选择你的父母,在你作错任何事的一刹那,时间已经流逝,错误已成历史,你想重新注册一个不近视的“用户”,想重新投胎到另外一片大陆,想载入进度回到错误之前,都是不可能的。

法律的制裁

说游戏中没有法律也许并不完全,游戏中不仅有规则、gm,也有会执法的npc,甚至会有玩家公会的公约,但是,我所知道的游戏中的最重的处罚恐怕就是杀档了,但恐怕没有任何一家公司会规定,因某某某玩家违反规则,终生禁止玩我的游戏吧?游戏中也有关禁闭,但同样那时间对于人生来说简直太小菜了,在现实的监狱中让青春失去简直是莫大的痛苦,而游戏中的监牢不仅时间短很多,而且玩家还可以聊天喝茶,甚至开着电脑上街买菜去。法律制裁的苍白化直接导致了“犯罪”的滋生,所以也不怪打斗类的游戏仍然占大多数,但如果养成习惯,分不清现实与虚拟,将会是灾难性的后果。

无法简化的细节

很早以前我就想过,自己玩过那么多的游戏,怎么就没有一款游戏中的主人公会去上厕所呢?游戏中虽然也有白天黑夜,但不用睡觉的人比比皆是,饿了也就是用鼠标抓起事物往嘴里一放了事。也难怪,如果游戏中还要洗衣服做饭,和现实一样了,谁还会去玩啊,可在生活中,你能避开这些琐事么?在游戏中你可以干掉敌人一艘飞船,得到NNNN金,在现实中你要捡半天垃圾,运到垃圾场,再写个报告,让上级确认你的功绩,太麻烦了,要真是有那么个“系统”来自动计算,好像也蛮好的啊,可这就属于异想天开了。。。对了,老掉牙的毁灭公爵duke3d里能上厕所小便,还加10点血呢:)。

如果在游戏中,你身处撒哈拉大沙漠中央,没有任何补给和援助,没招了吧,可这是你仍然能够关掉电脑,泡杯茶休息一会儿。而如果在现实中你出在这样的环境里,给你两个选择:1、游戏中,一桌大餐等着你;2、现实中,一壶清水。你会选择哪个呢?

游戏虽好,可真的不要贪玩哦~~

Related posts

Categories: Game Tags:

旋转屏幕方向(失败)

August 15th, 2007 Fwolf 8 comments

我也想把显示器旋转成竖着的,也就是把分辨率1280×1024变成了1024×1280,Dell 1907FP转动屏幕很方便,但是ubuntu的显示却转不过来,我总不能歪着脑袋看吧。记得用windows xp tablepc版的时候,有内置的屏幕旋转功能,nvidia显卡设置工具也能实现,但在linux下我用的fglrx驱动,如何实现?

google一下,发现无外乎两种解决方式,一种是固定的,要修改xorg.conf,在Device段增加一句Option "Rotate" "CW",其中CW是顺时针90度,也可以是UD顺时针180度或CCW顺时针270度,还有一说是增加一句Option "RandRRotation" "true";另外一种是用xrandr命令来转,比如xrandr -o left

不过,很沮丧的结果,上述方法我试验都不成功,显卡为ATI Radeon X600。一下是搜到的一些结果:

Related posts

Categories: Linux Tags:

mod_fcgid出现500错误的解决

August 10th, 2007 Fwolf No comments

MT上的php5是用mod_fcgid方式运行的,但运行一段时间之后,有时候会莫名其妙的出现500错误,也看不出是哪个php程序错误,不过html文件倒能正常解析,查看用户的$HOME/statistics/logs/error_log文件,会发现大量这样的内容:

[Fri Aug 10 01:00:43 2007] [error] [client 202.108.23.76] Premature end of scrip
t headers: index.php
[Fri Aug 10 01:01:20 2007] [error] [client 60.191.82.228] Premature end of scrip
t headers: index.php

而在系统的log文件/var/log/apache/error_log中,是这样的错误:

[Fri Aug 10 01:03:05 2007] [notice] mod_fcgid: process /var/www/vhosts/fwolf.com
/httpdocs/blog/index.php(21666) exit(communication error), terminated by calling
 exit(), return code: 120

G到一些资料,第一类错误是脚本执行被中断,没有返回完整的http header;第二类错误是cgi程序的执行被强行中止。根本原因是fastcgi会自动kill掉一些发呆的、长时间没有响应的进程(要不它比较快,比较省内存啊),但是fastcgi的默认idle时间设置过于苛刻(官方文档中每个选项都有默认的时间值),所以有些处理比较慢、需要调用外部资源的程序就有可能被误杀,所以先略微调整一下,继续观察:

<IfModule mod_fcgid.c>
    IdleTimeout 600
    ProcessLifeTime 3600
    MaxProcessCount 8
    DefaultMinClassProcessCount 3
    DefaultMaxClassProcessCount 3
    IPCConnectTimeout 30
    IPCCommTimeout 600
    #MaxRequestsPerProcess 500
</IfModule>
  • IdleTimeout 发呆时限
  • ProcessLifeTime 一个进程的最长生命周期,过期之后无条件kill
  • MaxProcessCount 最大进程个数
  • DefaultMinClassProcessCount 每个程序启动的最小进程个数
  • DefaultMaxClassProcessCount 每个程序启动的最大进程个数
  • IPCConnectTimeout 程序响应超时时间
  • IPCCommTimeout 与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
  • MaxRequestsPerProcess 每个进程最多完成处理个数,达成后自杀,因为PHP最多只处理500次请求。不过这个是mod_fcgid 1.11版本添加的,我们主机上暂时不支持。

上述选项的确切作用我也不是十分清楚,先用着这个设置,再根据情况调整。

参考:

Related posts

Categories: Apache, Hosted, PHP Tags:

[MT]主机上安装svn客户端

August 10th, 2007 Fwolf No comments

有了svn,就可以方便的获取一些程序的源码了,所以我要在MT主机上安装,注意只是客户端,并非架设svn服务器。

svn目前的最新版是1.4.4,我参考shunz的Apache+Subversion安装笔记,从http://www.axint.net/apache/apr/binaries/rpm/i386/下载了apr-1.2.8-1.i386.rpmapr-util-1.2.8-1.i386.rpm(新版svn需要apr版本0.9.7以上,而且是必需),可是rpm -U apr*.rpm的时候系统却提示依赖性错误:

warning: apr-1.2.8-1.i386.rpm: V3 DSA signature: NOKEY, key ID 751d7f27
error: Failed dependencies:
        libpq.so.3 is needed by apr-util-1.2.8-1.i386
        libapr-0.so.0 is needed by (installed) httpd-2.0.52-32.3.ent.centos4.i386
        libapr-0.so.0 is needed by (installed) mod_perl-1.99_16-4.5.i386
        libapr-0.so.0 is needed by (installed) subversion-1.1.4-2.ent.i386
        libapr-0.so.0 is needed by (installed) subversion-perl-1.1.4-2.ent.i386
        apr = 0.9.4-24.5.c4.2 is needed by (installed) apr-devel-0.9.4-24.5.c4.2.i386
        libaprutil-0.so.0 is needed by (installed) httpd-2.0.52-32.3.ent.centos4.i386
        libaprutil-0.so.0 is needed by (installed) mod_perl-1.99_16-4.5.i386
        libaprutil-0.so.0 is needed by (installed) subversion-1.1.4-2.ent.i386
        libaprutil-0.so.0 is needed by (installed) subversion-perl-1.1.4-2.ent.i386
        apr-util = 0.9.4-21 is needed by (installed) apr-util-devel-0.9.4-21.i386

(rpm和redhat系列不熟悉)看了半天才搞懂,rpm -U是升级,而系统中的现有apr 0.9.4版本被其他软件比如apache、mod_perl等依赖,升级过去可能就破坏依赖性关系了。如果rpm -i的话应该是安装新版本,不知道centos上不同的软件版本能否共存,考虑到合租服务器的稳定性,还是决定按照MT客服的建议,安装svn的旧版本1.3.2:

wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz
gunzip subversion-1.3.2.tar.gz
tar -xvf subversion-1.3.2.tar
cd subversion-1.3.2
./configure && make && make install

顺利完成,也可以下载其他形式的源码包,然后再配置svn到用户的chroot环境当中,大家就都能用了。

配置svn到chroot环境的时候需要的包很多,ldd就行,另外如果想checkout https形式的仓库,还要配置/dev下的随机数生成器:

# mknod /var/www/vhosts/chroot/dev/urandom c 1 9

不然会出错:

SSL negotiation failed: SSL disabled due to lack of entropy

基本可用了,不过checkout含有中文名称文件的仓库时,又会遇到如下错误:

svn: Can't recode string

基本可以确定是svn无法转换字符集的原因(参考),再进一步查找原因,发现竟然是centos的系统默认字符集不是utf8的,于是更改/etc/sysconfig/i18n,设定为如下内容:

LANG="en_US.UTF-8"
SUPPORTED="en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
#LANG="C"

重启服务器,root用户可以使用中文了,普通用户还不行,需要把/usr/lib/locale/en_US.utf8/配置到chroot环境中去,然后在普通用户的$HOME目录下的.bashrc或者.bash_profile文件中加入一句export LANG=en_US.UTF-8,重新登录后就可以啦,UTF8万岁!

仍然剩余一个诡异的问题,root用户无法使用https形式的仓库:

svn: SSL is not supported

注意普通用户是可以使用的,怎么回事?用whereis发现服务器上有两个svn文件:

# whereis svn
svn: /usr/bin/svn /usr/local/bin/svn /usr/share/man/man1/svn.1.gz

分别查看其版本:

# /usr/bin/svn --version
svn, version 1.1.4 (r13838)
   compiled Aug 21 2005, 20:56:55
...
* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
  - handles 'http' schema
  - handles 'https' schema

# /usr/local/bin/svn --version
svn, version 1.3.2 (r19776)
   compiled Aug  9 2007, 16:51:43
...
* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
  - handles 'http' scheme

合着我编译了半天都是徒劳啊,服务器上早就有了svn了,我明明记得是没有啊,难道是客服在装编译套件developer’s tools package时给装上了?可看了那个包列表里也没有啊?依然诡异,忙活半天还少编译了个SSL选项进来。

也许是MT客服给装编译套件的时候,为了自己用着方便,顺手放过来一个svn?谁还有新租的DV 3.0主机麻烦确认一下好了。

参考(部分是安装svn服务器的):

关于svn字符集错误以及centos字符集问题的参考:

带SSL编译svn的一些资料:

Related posts

Categories: Hosted, Svn/Git Tags:

升级MT dv 3.0主机到php5

August 9th, 2007 Fwolf 9 comments

MT主机dv 3.0上的php默认是4,现在已经是php5时代了,不知道MT什么时候默认给配php5,现阶段官方的方式仍然是由用户自行升级,详细步骤见kb中的Upgrade to PHP5 on (dv) 3.0 Dedicated Virtual Servers

推荐使用suexec方式,这样每个用户执行cgi使用的都是自己的身份,即安全也便于管理。suexec要求的前提条件有三个,就是用户的主机设置开启如下三个选项:

  • PHP支持打开,安全模式safe_mode关闭。
  • CGI支持打开。
  • FastCGI支持打开。

具体步骤说起来也是很简单的,首先把/opt/php51下的php5执行文件拷贝到用户目录下,并设置相应权限:

cp /opt/php51/cgi-bin/php5 /var/www/vhosts/<domain>/bin/
cd /var/www/vhosts/<domain>/
chown -R <domain-user>:psacln bin/

其中<domain>是用户的域名,<domain-user>是用户的ssh/ftp用户名,然后编辑/var/www/vhosts/<domain>/conf/vhost.conf文件,添加如下内容:

AddHandler fcgid-script .php .php5
SuexecUserGroup <domain-user> psacln
<Directory /var/www/vhosts/<domain>/httpdocs>
     FCGIWrapper /var/www/vhosts/<domain>/bin/php5 .php
     FCGIWrapper /var/www/vhosts/<domain>/bin/php5 .php5
     Options ExecCGI
     allow from all
</Directory>

如果是https站点,除了httpdocs换成httpsdocs之外,配置文件名称为vhost_ssl.conf。最后启用设置:

/usr/local/psa/admin/sbin/websrvmng -a -v

就可以了,我们主机上现在的php5版本是5.1.4,还是不够新:)。

为了方便操作,自己写了个小脚本:

#! /bin/bash
# Automatic enable php5 support for mediatemple user(via suexec).

# Pre-prepare in plesk:
#   php support is checked, safe_mod 'on' is UNCHECKED
#   cgi support is checked.
#   fastcgi support is checked.

# Check username, must run with root
WHOAMI=`whoami`
if [ ! $WHOAMI == 'root' ]; then
    echo "This script must run with root."
    exit 1
fi

# Check parameters
if [ $# -lt 2 ];then
    echo "Usage: `basename $0` ssh_user domain"
    exit 1
fi
USER=$1
DOMAIN=$2

# If given a wrong domain, exit
if [ ! -d /var/www/vhosts/$DOMAIN ]; then
    echo "Domain doesn't exists."
    exit 1
fi

# Copy php5 files
cp /opt/php51/cgi-bin/php5 /var/www/vhosts/$DOMAIN/bin/
cd /var/www/vhosts/$DOMAIN/
chown -R $USER:psacln bin/
cd conf

BEGIN="###_87b4e7fc -- Add by enable_php script, DON'T modify this section --"
END="# -- Enable_php modify section end -- 87b4e7fc_###"

# If vhost.conf doesn't exists, create it with default content
if [ -z vhost.conf ]; then
    echo "\\
$BEGIN\\
$END\\
" >> vhost.conf
else
    MARK=`grep "###_87b4e7fc" vhost.conf|wc -l`
    if [ $MARK -eq 0 ]; then
        # If vhost.conf exists & not mark, add replace mark
        echo "\\
$BEGIN\\
$END\\
" >> vhost.conf
    fi
fi
# Vhost_ssl.conf
if [ -z vhost_ssl.conf ]; then
    echo "\\
$BEGIN\\
$END\\
" >> vhost_ssl.conf
else
    MARK=`grep "###_87b4e7fc" vhost_ssl.conf|wc -l`
    if [ $MARK -eq 0 ]; then
        # If vhost.conf exists & not mark, add replace mark
        echo "\\
$BEGIN\\
$END\\
" >> vhost_ssl.conf
    fi
fi


STR="$BEGIN\\n\\
AddHandler fcgid-script .php .php5\\n\\
SuexecUserGroup $USER psacln\\n\\
<Directory \\/var\\/www\\/vhosts\\/$DOMAIN\\/httpdocs>\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php5\\n\\
    Options \\+ExecCGI\\n\\
    allow from all\\n\\
<\\/Directory>\\n\\
<Directory \\/var\\/www\\/vhosts\\/$DOMAIN\\/httpsdocs>\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php5\\n\\
    Options \\+ExecCGI\\n\\
    allow from all\\n\\
<\\/Directory>\\n\\
$END"

# Backup original configure
cp vhost.conf vhost.conf.`date +"%Y%m%d-%H%M%S"`
cp vhost_ssl.conf vhost_ssl.conf.`date +"%Y%m%d-%H%M%S"`

# Write configure information
sed -i -e ":begin; /###_87b4e7fc/,/87b4e7fc_###/ { /87b4e7fc_###/! { $! { N; b begin }; }; s/###_87b4e7fc.*87b4e7fc_###/$STR/g };" vhost.conf
sed -i -e ":begin; /###_87b4e7fc/,/87b4e7fc_###/ { /87b4e7fc_###/! { $! { N; b begin }; }; s/###_87b4e7fc.*87b4e7fc_###/$STR/g };" vhost_ssl.conf

# Active new configure
/usr/local/psa/admin/sbin/websrvmng -a -v

使用方法,用root用户执行:

enable_php5 <domain-user> <domain>

不支持subdomain的设置,其中sed替换多行内容的用法,可以参考我写的另外一篇文章用sed替换跨行内容

conf/vhost.conf这个文件存在之后,并不会自动被apache调用,执行/usr/local/psa/admin/sbin/websrvmng -a -v可以自动在conf/httpd.include文件中include vhost.conf了。而conf/httpd.include这个文件是由plesk维护的,用户不要直接修改它,会被plesk覆盖掉。

另外由于使用的是suexec方式执行,所以上传目录、cache等以前需要设置apache用户有可写权限的文件,现在要把owner设置为<domain-user>:psacln才行,和用户的其他文件权限一样就可以了,是不是管理起来更方便一些?

看了一下phpinfo,自动加载了位于/opt/php51/lib/php5/extensions/下的如下模块:

curl.so  gd.so        mysql.so    pdo.so        sockets.so  zlib.so
dom.so   iconv.so     mysqli.so   pdo_mysql.so  sqlite.so
ftp.so   mbstring.so  openssl.so  posix.so      xsl.so

基本上常用的都有了,但不知道/opt/php51这个目录下的内容MT什么时候给更新,还是说需要用户自己更新?

参考

Related posts