2007年6月25日星期一

用模拟器玩游戏机游戏也不错

虽然游戏差不多都会玩,可对各类游戏机的区别、模拟器的使用还不是十分了解,只介绍一下个人的简单体验,供比我更没经验的菜鸟参考,达人就可以略过了。

测试环境:ubuntu 7.04, x86

Mame

好东西啊,直接安装xmame就可以了(我选的sdl),然后下载rom,一般是zip文件,放到指定目录中就可以玩了。rom存放路径可以修改,是/etc/xmame/xmamerc中的rompath那一行。

似乎mame支持的游戏,名称和文件名是相对固定的,shell中开启游戏只要xmame game_name就行了,不用指定调用哪个rom文件(好像也可以指定,但我不知道怎么用),如果不知道某个zip文件中装的是哪个文件,xmame -id file.zip可以帮你分辨出来。

mame的其他功能也十分丰富,包括控制键的调整,截图等等,使用zip格式存储rom,调用的时候自动解压,也节约了磁盘空间。

默认5是投币,1是开始P1,不过默认操作键不太适应,P1的方向键是以f为下的4个,按钮好像是以j为中心的4个,好在修改方便,我习惯用edsf作方向,jkl作按键。

Nds

使用的模拟器是ubuntu中自带的desmume,不过体验非常糟糕。我找的是一个"大战略DS汉化版"游戏,打开以后,不仅画面不知道怎么放大,游戏本身的操作也是云里雾里,鼓捣半天终于开始游戏了,又是不知道该如何操作了。。。

对nds游戏真是太不熟悉啦,不过试了好几款都这样,怀疑播放器有问题,查了一下网站上的兼容性列表,似乎确实有很多游戏没有完全兼容,好像这个网站也有日子没有更新了?

Gb/Gbc

安装了源中的gnuboy-sdl,楞是不知道该用什么命令启动。。。不过似乎gb游戏都比较古老和原始了,我感兴趣的没几个。

FC

安装fceu即可,rom扩展名为nes,打开倒是挺方便的,fceu file.nes就行了,声音也出来了。看了一下man中说Enter是开始,一按下去出个菜单,然后wzas是方向键,小键盘3是选择(和man中不太一样嘛),然后。。。日文的(我弄了个大战略),就不会玩了。

SFC

安装zsnes,rom扩展名为smc,可以压缩为zip直接使用,也是直接zsnes file.zip就能打开了,默认的按键也是一片迷糊,不过可以按esc呼叫出zsnes的菜单,对按键进行配置,总体感觉不错,挺流畅,挺好用的。

SAGA MD

安装dgen,rom扩展名smd,也可以压缩为zip直接使用,打开倒是挺顺畅,还可以指定窗口大小,图像效果看起来不错,仍然是不知道按哪个键起作用。。。

自己的电脑配置有限,带宽也有限,没有再去尝试高级的主机比如PS什么的模拟器,都是挑一些老掉牙的游戏来试的。不过,从某种意义来说,这些游戏还真是"跨平台"呢,至于模拟器软件,截至目前个人感觉还是mame和zsnes要高出一筹来,这样正好,估计大家玩的最多的也就是超级任天堂和街机了吧?

对了,那个什么NEOGEO(出彩京等游戏的那个)没见到呢,找到了再补充过来。

参考

Source: http://www.fwolf.com/blog/post/334

2007年6月18日星期一

虚拟主机合租事宜-初步方案

现在国外虚拟主机十分流行,用来架设个人blog再合适不过了,和国内的虚拟主机相比优势很多,所以也想来组织一批合租,在合理的负担下大家分担费用,共同受益。

现在先把初步计划列在这里,看看有多少人报名,再决定下一步方案。

主机供应商的选择

其实选择主机供应商是个非常难的事情,我最初知道的是DreamHost,不过google之后发现它更适合学习和把玩,而不是提供长期稳定的blog服务,只作为最后的备选方案;

然后看上了BlueHost,以稳定著称,不过合租用户只能有ftp权限;运气不好的话,还会碰上无法访问的主机;再说,它自己的主站现在都无法访问了。

具有独立ip的便宜主机,就是Site5了,虽然它自己网站上的报价方案有一点点乱,不过最便宜的$5/month方案听起来还是不错的;但是稳定性如何未知, 主机限制也比较严格。

最后就是王牌主机MediaTemple了,选择最便宜的gs方案,$20/month,对于架设blog来说足够了。

最终的优先顺序定为上面四个倒序排列,先从MediaTemple开始考虑。如果报名的人寥寥,就选择 Site5BlueHost,如果人比较多,而且能够承担的费用也高一些,甚至可以考虑 MediaTemple的dv方案,就像v2ex组织的那样

以上主机是我google了30多小时之后选择的,如果大家有更好的方案建议,欢迎提供。后续内容暂时按MediaTemple gs方案计算。

合租人选择条件

  • 拥有自己的独立域名,或者你委屈一下用我的二级域名也可以。
  • 只放置blog,允许附加一些不耗费资源的小程序或静态页面。
  • 网站的内容必须符合中国的法律规定,不欢迎政治等敏感内容,再说在blog里说也解决不了实际问题。
  • 网站中不得有明显违反版权的内容,比如电子书、mp3等等。
  • 不欢迎纯转贴网站,欢迎原创blogger。
  • 不欢迎只是短期实践、玩玩而已的网站,欢迎长期使用,作为"生活必需品"的网站。
  • 最好对远程主机使用和blog使用有些了解。

服务器环境及主机资源分配

Linux操作系统,PHP 5(不提供PHP 4),Perl 5.8.4,Python v2.3.5(这两个应该没多少人用吧),Apache 2.0.54,MySQL 4.1.11(注意字符集的问题)。

服务器资源(参见官网说明):
* 100 GBs of premium storage
* 1 TB of short-path bandwidth
* 100 unique sites / alternate domains
* 64MB Ruby/Mongrel container
* 1,000 GPUs
* 100 databases
* 1,000 email addresses

由于blog不怎么耗费资源,暂时按20个人共享计算,每人:

  • 5G磁盘空间。
  • 50G月流量。
  • 5个域名或子域名,但网站只能有一个。
  • 1个mysql数据库,空间限制200M,可参见官方mysql说明,反正每人只有一个网站,一个数据库足够用了。
  • Ruby GPU email什么的不再分了,估计大家用不到。
  • ftp人手一个,ssh shell如果gs方案能提供的话,也人手一个。

额外说明一下,gs方案只有一个数据库用户,所以我想在给大家创建数据库的时候,名称用随机字符,这样大家互相不知道数据库名称,共用一个数据库用户应该不会有什么安全性问题。

费用分摊及支付说明

按年付费,一年的费用为$200,合每人$10,人民币记为80元。只接受一次用一年的网站,因为我是打算长期用下去的,当然实在中途你要退出也可以:(,按实际使用时间退款。

支付方式待定,先定下方案再说。

如果你觉得自己的网站访问量会大一些,但仍然想参加的话,也可以报名占用2个人或更多人的名额,当然费用也随之增加。

报名须知

有意向的同学请给我发email,并至少注明以下几项内容:

  • 您的域名,我会造访看内容是否适合。
  • 您的用户名,用在各类用户分配上。
  • 您打算使用的时间,以年为单位。
  • 您所能承受的费用(按年计),如果承受能力都比较高的话,我可以考虑选择更高档次的主机方案,或者更改合租人数。

补充说明

  • 请记下本文的地址,我会不定期对方案进行完善。
  • 由于我也在20个合租者当中,并且我要占3个名额,所以实际可用的合租人数为17人。
  • 虽然我以前没有组织过合租,也没有使用过MediaTemple的空间,但我的水平,请大家放心;如果因我对情况或 MediaTemple的不了解导致在方案中有不实或无法实现的陈述,也请大家理解。
  • 费用没有按实际汇率计算,不过已经这么低了,差个几块应该没人会在意吧,况且我还要承担有人会中途退出的风险。
  • 拟接受直接支付给我美元,到paypal或者信用卡帐户。
  • 再次重申我本人是想长期使用的,即使以后由于某些不可抗力搬家,也一定考虑带着大家一起搬的。
  • 欢迎对此方案提出修改意见。

参考

另外附上一些我查到的资料,供大家参考:

Source: http://www.fwolf.com/blog/post/333

从万网转出域名成功

网上一直流传着"万网域名转出基本是无望地"的说法,恰好,我续费5年的域名今年就要到期了,恰好又是2000年在万网注册的,出于对这条传闻的浑身不舒服,一机godaddy合适的价格与服务,我决定要把域名转出来,不管有多难。下面是我的大体经历,不见得适合所有人,当然更不是哪方的枪文,只是希望有和我同样困惑的朋友能从中受益。

我的域名大概9月到期,由于域名到期前一个月不允许转移,所以很早就开始准备了,按照万网国际域名转出的要求,在4月底就把《万网国际域名转移注册机构申请表》和身份证复印件邮寄过去了,五一过后,收到了万网的拒绝email:

尊敬的客户您好:
已经收到您的域名fwolf.com转出材料,但是您的域名所有人是Personal,我们无法确
认,请您提供您的护照,如果护照中的英文与您的域名所有人英文名称一致我们可以确认
,传真号码:010-84134247,请您在传真中注明您的域名和转出字样,以上给您带来的不
便,请您谅解。

若还有其他问题请及时与我们联系,谢谢!

在这里我不得不介绍一下这个Personal是怎么来的,不知道2000年左右在万网注册过域名的人谁还记得,当时注册的时候,有选项问是个人注册还是公司注册,我选的是个人注册,这个Personal就冒出来了。

不管怎样,我对需要我出示护照的要求感到十分不合理,就回了封email,但此后再没收到过任何解释,不得不说不回复email是万网一个非常不好的习惯。

后来,我又想寻求一些非官方的渠道,从网上搜到了一个万网员工的邮箱,给他发邮件请求帮忙,他也答应了,大概一周多以后也果然收到了万网一位客户经理的邮件,询问我域名转出过程中的问题。我满怀希望的回信了,没有回音。。。10天后再回信咨询,依然没有回音,唉,哪怕是拒绝的回信,也能让我感觉舒服一点啊。

再后来坐不住了,开始尝试一些"非正常"的渠道,直接在godaddy进行域名转入操作,刚开始域名的联系人居然是万网的邮箱。。。天,原来当时注册万网时,除了域名所有人是我的资料之外,其他的管理联系人、技术联系人都是万网的联系方式。。。变更。。。居然无法提交,原因是,"公司"不能为空。不知道有没有其他人遇到过此类问题,这不是linux或者firefox的问题,我换过平台操作还是一样。我又不能通过过户来修改那个不能为空的"公司",不仅是费用的问题,还牵涉到域名可转移期限、过户手续繁琐的问题。不过幸好发现万网网站的一个小漏洞,轻松绕过此问题,修改了所有域名中的联系方式,统统改为我自己的。

再次在godaddy提交域名转入申请,成功收到了Transaction IDSecurity Code,继续操作,提示需要Authorization Code,天,我上哪儿去找这个Authorization Code,帮助上说是原注册商提供的,可我翻遍了万网控制面板也找不到。

一顿摸瞎中,我发现万网有一个域名DIY自助管理,是用域名和密码登录的,无独有偶,域名管理中有一项
"域名密码修改",会不会是这个密码呢?尝试设置了一个,域名DIY自助管理倒是能进去了,可作为Authorization Code用的时候,程序操作是通过了,但很快被万网枪毙了:

The transfer request for the following domain name(s) has been denied by the losing registrar:

看来行不通。无奈,眼看着域名到期日的临近,实在坐不住了,开始打电话向万网咨询。

刚开始还是老一套,Personal的问题,经过几次电话联系,反复的解释Personal的来历,这次万网不要护照了,但要求我提供户口所在地证明,证明我就是那个Personal,可笑,哪个派出所能开出这样的证明呢?除非万网给我一份要求提供如此证明的函。。。其实万网工作人员也并非不讲理,大概也是想为客户负责吧,不愿让域名被不知名的人给转走了。细心耐心的交涉终于有成果了,万网的工作人员被我说服,要求我用域名注册人的邮箱向某个万网官方邮件发封邮件,里面注明域名转出事宜,并附上身份证扫描件,就可以给我办理转出了。

接下来就顺利多了,邮件发出二十分钟后就收到了Authorization Code,让我大跌眼镜的是,居然和我设置的域名DIY自助管理密码相同!不同的是输入godaddy之后没有被枪毙,开始了长达6天的等待,然后,今天,收到了域名转移成功的邮件。

总结下来,除了电话里纠缠的那个Personal问题之外,只是邮寄一点资料,等待的时间稍微长一些,但是没有收取任何费用,虽然不像买冰棍儿那么简单,倒还说得过去,至少我的体验不像网上传言的那样"基本是无望地",或许是万网改进了客户服务质量吧,我希望是这样。不过话这么说,也得益于 网上看到的这篇文章,有话好好说,先礼再后兵,和平解决问题为最优。

再提醒一下各位观众,域名注册商选择一定要慎重,要看服务质量,而不是价格,至于到底是在国内注还是在国外注,视具体情况而定吧,万一碰到一个外国流氓可能更麻烦一些呢,一定要选择口碑最最最好的。

Source: http://www.fwolf.com/blog/post/332

2007年6月12日星期二

数据库使用优化的一点心得

在生产系统中,数据库经常会成为瓶颈,给管理员带来无穷麻烦,所以dba才那么值钱啊。但对一些中小型的应用来说,也许没有好的dba来从数据库本身机制管理上来进行优化,或者现有系统特性不允许太大的改动,加上数据库不像web服务器那样可以简单的通过集群来扩容,这样就需要从应用程序的角度来进行优化了,尤其是应用程序使用数据库的方式:
  • 减少复杂的sql,多用简单的sql。
  • 在sql中减少运算的使用,除了count(1)。
  • 索引和条件中,多用int类型,少用string类型。
  • 尽量不要用触发器,无必要不要用存储过程,慎用事务。
  • 注意where条件的顺序。

从系统设计思路上来说:

  • 将大型的操作拆分为小型的操作,用比sql更灵活的web语言来实现部分内容。
  • 程序对数据库连续取数据进行操作的时候,可以考虑对已经取过的数据适当的进行缓存,减少重复执行sql的过程。
  • 常用但不常更新的页面,可以考虑静态化,减轻数据库压力。
  • 控制图片的数量和体积,善用css,启动服务器端压缩以节约带宽。

从数据库自身设计来说:

  • 配合常用查询,对索引进行优化改进。
  • 在数据库设计中适当保留冗余,针对访问速度进行优化。

最后一点教训:最好在设计初期就开始考虑性能的问题,贯穿整个开发进程,否则投入使用以后再进行修改,就要花费数倍的精力了;而设计时最不易发现问题的原因就是数据量小、访问量小,数据可以进行造假,访问量可以用ab等压力测试工具 来模拟,但这些都和真实环境有相当大的偏差,不要太相信就是了。

以上只是一点拙见,抛砖引玉,欢迎拍砖。

Source: http://www.fwolf.com/blog/post/330

2007年6月11日星期一

查询并禁止apache中异常访问量的用户

Apache中的异常访问,通常指的是频繁、大量访问的用户,通过apache的log,结合linux下的几个命令,可以分析这些用户,并通过apache的配置文件来禁止他们访问。

首先,更改apache的log方式,不记录一些图像、css等文件,这样在log中每一行基本上都能对应一次访问,如果不去除图像等文件的记录,正常用户访问一个页面,同时也会下载页面上的图像、css等文件,会产生多条log记录,影响计数的结果。在apache的conf文件中增加如下配置:

SetEnvIfNoCase Request_URI .css$ useless-file
SetEnvIfNoCase Request_URI .gif$ useless-file
SetEnvIfNoCase Request_URI .ico$ useless-file
SetEnvIfNoCase Request_URI .jpg$ useless-file
SetEnvIfNoCase Request_URI .js$ useless-file
CustomLog logs/hebgc.com/access.log combined env=!useless-file

这样就可以了,关于SetEnvIf的其他用法,可以参见Apache文档中SetEnvIf Environment Variables in Apache部分。

接下来,经过一段时间的运行,我们就可以分析log文件中访问量最大的用户了,只需要一条命令:

cat access.log |awk '{print $1}'| sort | uniq -c |sort -n

一点点的来看:

  • cat就不用说了;
  • awk的作用,就是把第一列,也就是客户端ip地址分拣出来;
  • 第一个sort,是把分拣出来的ip地址排序,这样相同的ip地址会排在一起
  • uniq是一个去除重复值的工具,但是带上-c参数,就可以统计出每个值出现了多少次
  • 最后的sort,把uniq产生的结果进行排序,按照-n这个参数的默认设置,最大的排在最下面。

所以,我们得到的结果应该是这样的:

......
2040 219.148.106.198 2047 218.12.78.14 2149 218.12.26.233 2205 121.28.4.34

第一列就是访问次数,第二列是ip地址,再回去对照log文件中的详细内容,如果发现哪个访问量大户是某某机器人的话,就可以禁止掉了,还是修改apache的conf文件:

     Order Deny,Allow     Deny from 219.143.69.2     Deny from 218.12.26.233     Deny from 61.135.162.51     Allow from all  

如此反复监测、设置,直到没有人捣乱为止。

同理,如果想查看反复刷新查看某一页面的用户,可以用如下命令:

grep "GET /url/to/some/file" access.log |awk '{print $1}' |sort |uniq -c |sort -n

Source: http://www.fwolf.com/blog/post/331

2007年6月4日星期一

sshfs把远程主机的文件系统映射到本地的目录中

windows之外的世界比想像中要大得多呢,几乎天天都在用ssh,却到今天才知道有sshfs这个好东西,前几天还在为ZendStudio可以远程编辑文件欣喜,惭愧啊,终于有比vi scp://hostname//path/to/file更方便的方式了。

sshfs,就是可以把ssh连接到的主机资源,映射到本机的文件系统当中,然后用户可以像操作本地文件一样操作,而实际的文件改动将通过ssh传输到远程主机当中。类似于mount了一个windows共享目录,或者另外一台linux主机的samba共享,或者是nfs共享,只是"共享协议"变成了ssh通道罢了。

ubuntu源中已经包含了sshfs了,以及所需的fuse包,直接apt安装就可以了,一共是三个包:"fuse-utils libfuse2 sshfs",不大,加起来才179k。安装的时候会自动创建用户组fuse,要使用sshfs的用户需要先加到这个用户组里才行(记得完成后还要重新登录),不然会没有权限执行fusermount:

fuse: failed to exec fusermount: Permission denied

使用就简单的多了,一般来说,连接远程主机到本地用户:

sshfs user@hostname:path mount_point

需要输密码就输密码,当然配置成自动登录的ssh更方便了。用完之后要umount,可以:

fusemount -u mount_point

都是在普通用户非sudo的环境下使用,非常方便的。如果想每次开机都自动挂载,可以在/etc/fstab中加入:

sshfs#user@hostname:path mount_point fuse defaults,auto,allow_other 0 0

这就要求必须先把ssh自动登录配置好了,另外allow_other这个参数很重要,没有这个参数的话,挂载过来的目录只有root能够访问。

关于自动挂载,参考文章中andot用脚本实现的方式也不错,建议大家看看去。

参考:

Source: http://www.fwolf.com/blog/post/329

2007年6月2日星期六

Fwd: [Linux]如果管道被接受方关闭

linux shell中的管道|是非常方便的功能,可以将一个程序的输出作为另外一个程序的输入,这样我们可以将多个命令"拼"在一起,省去了临时文件的繁琐。windows中也有类似的用法,比如dir |more,学过dos命令的应该都知道吧。

既然是管道,那么就有一个入口和一个出口,各自对应一个应用程序,正常的情况下,入口应用程序的输出应当被出口应用程序全部接受,但在一些特殊情况,出口应用程序会提前关闭管道,比如在查询svn的更新日志,只取前己行的时候:

$ svn log |head
------------------------------------------------------------------------
r137 | Fwolf | 2007-05-28 13:38:47 +0800 (Mon, 28 May 2007) | 4 lines

更新记录。。。

svn: Write error: Broken pipe

由于head只需要用到输入的前10行(默认行数,也可由用户指定),再接收剩下的输出也是多余,便提前关闭了管道,管道入口的应用程序svn发现之后,便报错退出了。在这个例子中,错误信息非常清楚,但不是所有应用程序都这样的,比如下面这个:

$ find . -name "*rc" |xargs -i cat {}|head -1
[Desktop]
xargs: cat: terminated by signal 13

错误信息似乎并不太好理解,实际上它的意思是:xargs发现它的子进程cat由于信号13被中止了。由于xargs本身属于循环操作,发现错误之后就停止了循环,这是其一;信号13是在cat试图向一个已关闭的pipe管道中写数据的时候,系统产生的,cat收到之后就停止了。类似于在cat输出的过程中,用户按下ctrl+c的效果。

如何避免这种问题呢?很简单,管道后面使用不会提前关闭管道的程序即可,尤其是结合xargs使用的时候,它发现出错就不继续了。比如要用到head可以这样:

$ cat file |head -1

虽然cat仍然会被signal 13关闭,但bash是不会报错的,所以也只能针对一个文件进行操作,即使是使用了通配符也只能head到第一个文件。如果要加上对文件的遍历,可以用到for:

$for file in .*rc;do cat $file |head -1;done

cat依然会被关闭,但是for不会理会它,继续循环。head也可以直接指定文件名,这样我们就可以抛开cat了:

$find . -name "*rc" |xargs -i head -n1 {}

个人认为这是一种最完美的解决方式,即可以用到find强大的搜索指令,还不会涉及到管道的问题。不过如果文件名没有什么特殊要求,还有一种更简单的方式:

$head -n1 .*rc

在head的参数中直接用通配符指定文件,呵呵。

参考:

Source: http://www.fwolf.com/blog/post/328