今天收到burstnet的邮件,有个好消息,说是支持ipv6了

BURSTNET®: IPv6 IP Addressing Now Available!

SCRANTON, PA - July 27, 2010 - BurstNET Technologies, Inc.™ (http://www.burst.net), a leading provider of budget hosting services, today announced IPv6 addressing service available end-to-end on its entire product line: including Dedicated Servers, Virtual Private Servers (VPS), & Co-Location.

原生支持ipv6真是个相当好的消息,于是赶紧发了个Ticket进行申请. 有消息再update. Ticket发送的当地时间为07-29-2010 - 01:34AM,应该睡得正香的时候,或者还没开始睡.....

update: 07-29-2010 - 02:04AM收到回复,已经给我添加了二个ipv6的地址,回应速度很快啊,足以说明晚上有人值班,而且没有睡着...

接下来看能用v6的地址做点什么.

常用的bash PS1值

PS1="\[\033[35m\]\t\[\033[m\] \[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\] ->"

效果如下

or

PS1="\[\033[37m\]\t\[\033[m\] \[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]>"

记得最早用的Linux发行版本就是Redhat,6,7,8,9的样子.记得8,9的时候,桌面就已经能用了.当然还不算好用.那时候其实也只会看看桌面是个啥样子,而且终究没有win好用,特别是中文支持方面,问题太多,基本每次都是安装几天后,就又删除了.中间还试用过国内出的redflag,bulepoint,magic之类的,虽然时间过去了很久,还是记得bulepoint似乎用起来不错,因为中文方面很多问题都被修正了,可惜后来就不见踪影了.

刚开始工作的时候,主要还是应用MS在产品,几年后才转移到Unix/Linux类.生产平台用的是Sun的硬件,相应系统也是用的SunOS,也叫Solaris,可怜见的,现在应该叫Oracle的硬件了.说到Oracle,第一次用的似乎是7i,安装在win2000上的.第二次用的是8了,安装在Solaris上.那时候x86的版本用得还不多,所以内部测试,还是安装Linux类,而能一下想起的linux,还是当然的redhat.这时候用redhat,也就没怎么在乎桌面好不好了,大部分情况下,桌面根本就没有安装.

差不多04,05年左右,因为工作环境变得复杂,才觉得win用起来不太方便,而且太过脆弱,才正式把linux做为主系统.这时候能想起的,还是redhat,不过开源桌面版本名字已经换成Fedora core,从fc2到fc3,感觉相当好用.在工作上,用fc3上gnome,已经能更好的完成在win桌面下能完成的工作了.fc3是用得比较久的发行版,之后有很长时间没换过,甚至也没升级.现在版本号破10了,3之后的都基本没用过,只是从用老版本的感受推测,这个系列应该是都还很不错的.

在自己家的电脑上用Linux做桌面时,发现要求高得多.除了能用,还要好用,除了好用,还要好看.而印象中Ubuntu也是那几年里横空出世.等我试用的时候,好象是6.04还是6.10的版本来着,然后7,8,9,10都有安装.对于Ubuntu的感觉,就是桌面应用方面.已经基本完美到安装好就能满足大部分的需求,除了某个银行的专业版没法运行外.这个严格说来,还不算是系统的问题,而是某行的刻意而为.所以除了这家,大部分别的银行都还是有解决办法.

Ubuntu 8用了近二年时间,等我升级9的时候,10也快出来了.这时候才发现Ubuntu很是热情的一年二个版本,也是一种相当大的困扰,于是转而去寻找稳定期长点的版本.测试用了debian,LFS,gentoo,Arch linux等发行版,其中LFS一直没有全部完工过,要手工做的事太多,实在不是我等懒人坚持得下来,最主要还是担心后期的维护.而Arch linux的无缝升级,安装过程简单,包维护简便,理论上i686的编译方式也速度快等,正好符合要求.只是要把桌面配置成Ubuntu一样,还是得做不少手工工作.

Centos则是很早前试用过一次外,在VPS可选系统不多的情况下,才采用的.我比较中意的VPS系统,还是Arch适合,可惜所有的vps都有提供centos,极少有能提供Arch.不过做为redhat as开源系列,也算是很熟悉的一个版本,以及那著名的rpm包.当然yum用起来方便得多.

于是我个人主要还是用Archlinux做主系统,特别是虚拟机安装测试系统,Arch又小又方便.有朋友抱怨win xx老中病毒木马时,我则会推荐他们安装Ubuntu,基本上安装好就能用,我也能省不少事.而VPS上,就Centos到底了,这样换VPS时,有些东西还能直接使用.

有可能的问题: 无论Ubuntu还是Arch,刚安装调试好后,都是很正常很好用的.不平常不好用,往往发生在系统更新之后.Ubuntu的小更新还好,出的问题不多,但版本升级出的问题就不少了.Arch因为是无缝升级,导致几乎每天都有不少包要更新,特别在安装很多桌面软件后,常一更新就得100M+,而且每过一段时间,更新后都会出点小问题.在几个朋友都抱怨更新后啥啥啥不正常了,我都建议他们不再做更新.而我自己用的系统,也会在配置好后很长一段时间不做更新.如果只是用做桌面,这样可以免掉些麻烦,也不用太担心安全问题.

小时候长话费尤其是国际长话费贵得惊人,几分钟就得10多块几十块上百块的.由此也出现了不少守个公用电话做为小营生的小商人,倒是制造了或多或少的就业机会,当然那高额的利润究竟最后到了谁手上,就不知道了.

现在费用倒是明里暗里下降了不少,不过你要是有个必须每天打N通电话的重要人物在外地甚至在外国,话费的N倍还是吃不太消.就算不存乎,能省点也是几千年来的光荣传统不是?自己架个SIP Server,再用个phone 2 network类的设备,你想打N通就打N通,每通想打N久就打N久,如果你有那么多话说,不必再担心话费问题了.取而代之的,你可能要担心网费和电费的问题.

现在有不少几合一的家用路由交换一体的设备,都带有电话接口,设置好SIP帐号,接部普通电话就能用了.而最新的智能手机,带wifi功能的,也都基本支持SIP类软件,设置好帐号,直接用wifi通话,也要比走GSM,3G类的网络节省很多.

首先,官网下载源代码.BTW,只能在Linux下安装.Window下也有类似的程序,国产的就有不少,不过我没用过,不做评论.我个人仍然喜欢用开源的东西自己来编译.

下载 ser-0.9.6_src.tar.gz

tar vzxf ser-0.9.6_src.tar.gz
cd ser-0.9.6

修改Makefile,加入mysql支持

# if not set on the cmd. line or the env, exclude this modules:
	exclude_modules?=cpl ext extcmd \
	            postgres snmp \
	            im \
	            jabber mysql \
	            cpl-c \
	            auth_radius group_radius uri_radius avp_radius \
	            pa

删除其中的mysql字样.

make all
make install

修改/usr/local/sbin/ser_mysql.sh,防止默认utf编码时.建立库失败. 查找

echo "creating database $1 ..."

sql_query <<EOF
create database $1;
use $1;

create database $1;行后加入

alter database ser character set latin1;

建立初始数据库,没有出错提示,会自动建立24个表,而且其中大部分没用到.

make dbinstall or run /usr/local/sbin/ser_mysql.sh create

建立新用户

serctl add username@domin password email

安装语音代理rtpproxy,一样从http://www.iptel.org/ser/下载,make,make install就好

配置文件/usr/local/etc/ser/ser.cfg,配置mysql认证,以及NAT修正. 其他类型可在这查看

ftp://siprouter.teigre.com/pub/gettingstarted/configs/

# $Id: nat-rtpproxy.cfg 51 2006-01-31 13:28:04Z /CN=Paul Hazlett/emailAddress=paul@onsip.org $
debug=3
fork=yes
log_stderror=no

listen=192.0.2.13           # INSERT YOUR IP ADDRESS HERE
port=5060
children=4

dns=no
rev_dns=no
fifo="/tmp/ser_fifo"
fifo_db_url="mysql://ser:heslo@localhost/ser"

loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/uri.so"
loadmodule "/usr/local/lib/ser/modules/uri_db.so"
loadmodule "/usr/local/lib/ser/modules/nathelper.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"

modparam("auth_db|uri_db|usrloc", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")

modparam("nathelper", "natping_interval", 30) 
modparam("nathelper", "ping_nated_only", 1)   
modparam("nathelper", "rtpproxy_sock", "unix:/var/run/rtpproxy.sock")

modparam("usrloc", "db_mode", 2)

modparam("registrar", "nat_flag", 6)

modparam("rr", "enable_full_lr", 1)

route {

	# -----------------------------------------------------------------
	# Sanity Check Section
	# -----------------------------------------------------------------
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483", "Too Many Hops");
		break;
	};

	if (msg:len > max_len) {
		sl_send_reply("513", "Message Overflow");
		break;
	};

	# -----------------------------------------------------------------
	# Record Route Section
	# -----------------------------------------------------------------
	if (method!="REGISTER") {
		record_route();
	};

	if (method=="BYE" || method=="CANCEL") {
		unforce_rtp_proxy();
	} 

	# -----------------------------------------------------------------
	# Loose Route Section
	# -----------------------------------------------------------------
	if (loose_route()) {

		if ((method=="INVITE" || method=="REFER") && !has_totag()) {
			sl_send_reply("403", "Forbidden");
			break;
		};

		if (method=="INVITE") {

			if (!proxy_authorize("","subscriber")) {
				proxy_challenge("","0");
				break;
			} else if (!check_from()) {
				sl_send_reply("403", "Use From=ID");
				break;
			};
			consume_credentials();

			if (nat_uac_test("19")) {
				setflag(6);
				force_rport();
				fix_nated_contact();
			};
			force_rtp_proxy("l");
		};
		route(1);
		break;
	};

	# -----------------------------------------------------------------
	# Call Type Processing Section
	# -----------------------------------------------------------------
	if (uri!=myself) {
		route(4);
		route(1);
		break;
	};

	if (method=="ACK") {
		route(1);
		break;
	} else if (method=="CANCEL") {
		route(1);
		break;
	} else if (method=="INVITE") {
		route(3);
		break;
	} else  if (method=="REGISTER") {
		route(2);
		break;
	};

	lookup("aliases");
	if (uri!=myself) {
		route(4);
		route(1);
		break;
	};

	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		break;
	};

	route(1);
}

route[1] {

	# -----------------------------------------------------------------
	# Default Message Handler
	# -----------------------------------------------------------------

	t_on_reply("1");

	if (!t_relay()) {
		if (method=="INVITE" && isflagset(6)) {
			unforce_rtp_proxy();
		};
		sl_reply_error();
	};
}

route[2] {

	# -----------------------------------------------------------------
	# REGISTER Message Handler
	# ----------------------------------------------------------------

	if (!search("^Contact:[ ]*\*") && nat_uac_test("19")) {
		setflag(6);
		fix_nated_register();
		force_rport();
	};

	sl_send_reply("100", "Trying");

	if (!www_authorize("","subscriber")) {
		www_challenge("","0");
		break;
	};

	if (!check_to()) {
		sl_send_reply("401", "Unauthorized");
		break;
	};

	consume_credentials();

	if (!save("location")) {
		sl_reply_error();
	};
}

route[3] {

	# -----------------------------------------------------------------
	# INVITE Message Handler
	# -----------------------------------------------------------------

	if (!proxy_authorize("","subscriber")) {
		proxy_challenge("","0");
		break;
	} else if (!check_from()) {
		sl_send_reply("403", "Use From=ID");
		break;
	};

	consume_credentials();

	if (nat_uac_test("19")) {
		setflag(6);
	}

	lookup("aliases");
	if (uri!=myself) {
		route(4);
		route(1);
		break;
	};

	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		break;
	};

	route(4);
	route(1);
}

route[4] {

	# -----------------------------------------------------------------
	# NAT Traversal Section
	# -----------------------------------------------------------------

	if (isflagset(6)) {
		force_rport();
		fix_nated_contact();
		force_rtp_proxy();
	}
}

onreply_route[1] {

	if (isflagset(6) && status=~"(180)|(183)|2[0-9][0-9]") {
		if (!search("^Content-Length:[ ]*0")) {
			force_rtp_proxy();
		};
	};

	if (nat_uac_test("1")) {
		fix_nated_contact();
	};
}

先启动rtpproxy,用ftp的用户权限

/usr/local/bin/rtpproxy -u ftp

启动ser

serctl start

停止ser

serctl start

查看注册用户

serctl ul show

我大多数时候使用的是北京网通现联通的adsl,2M带宽.价格就不提了.

还记得二年前去台服玩魔兽世界的时候,还没有什么代理的概念,都是直连过去,延迟大体上在300~500站变动,300+比较常见.练个级,下个本,感觉上很流畅,这个曾让我迷惑了很久.那个时候国服还在9c手上,二区直连,延迟大体上在60~100间变动,但常出现lag现象,表现为拾取物品要几秒的时候,或者战场pk总提示目标不在眼前:虽然我眼前看到的的确就是目标.以前直以为是网络不太好.现在想想,网通是有点冤,要怪得怪那传说中的小霸王啊~

WLK之后,很明显直连台服已经不行了,于是N多专业或不专业,收费或不免费的WOW台服代理一下冒了出来.其中有比较长一段时间,小众大众的代理用起来效果都相当好.直到今天初,大部分代理都挂掉,无论用哪种代理,至少我的感觉是连接速度还是很糟糕.

在我手上有了一个香港VPS后,做了个简单测试,想了解下网络连接到底慢在哪里.

先从北京直接tracert台服的官网.已知台服的官网和wow服务器,都是放在hinet机房的,IP段是203.66.1xx.xxx的样子.

tracert www.wowtaiwan.com.tw
通过最多 30 个跃点跟踪
到 wowtaiwan.com.tw [203.66.142.57] 的路由:
~
  4    16 ms    24 ms    16 ms  bt-230-113.bta.net.cn [202.106.230.113]
  5    17 ms    15 ms    16 ms  61.148.152.117
  6    16 ms    16 ms    16 ms  202.96.12.9
  7    38 ms    38 ms    37 ms  219.158.4.62
  8    37 ms    37 ms    37 ms  219.158.4.238
  9   101 ms   100 ms   101 ms  r4036-s2.tp.hinet.net [211.72.233.190]
 10    80 ms    82 ms    81 ms  r4142-s2.tp.hinet.net [210.65.255.12]
 11   231 ms   232 ms   232 ms  TPDT-3012.hinet.net [220.128.4.66]
 12   229 ms   229 ms   229 ms  TYFO-3012.hinet.net [220.128.4.105]
 13   230 ms   230 ms   231 ms  TYFO-3402.hinet.net [220.128.9.141]
 14   232 ms   233 ms   234 ms  211-22-39-225.HINET-IP.hinet.net [211.22.39.225]
 15   231 ms   231 ms   231 ms  203.66.220.137
 16   296 ms   242 ms   333 ms  203.66.142.57
 17   242 ms   249 ms   241 ms  203.66.142.57
 18   314 ms   241 ms   242 ms  203.66.142.57

从这上面看.网通的adsl路由走向还算是比较简洁的,第8跳应该是网通的出口路由(备注:也许应该说是国际出口路由,不过在什么什么一家的情况下,省这二字免得麻烦),第9跳就已经到了hinet的接入路由上,延迟也不过区区100ms左右.第8跳到第9跳从30+的延迟,上升到100左右,显然是一个比较长的网络连接,猜测应该是连到TW的海底光缆.那么9跳后,就进入了hinet,又得知wow的服务器就存放在hinet机房,理论上不会再有太大的延迟波动,但第10跳还蛮正常,第11跳延迟马上彪升一倍多,达到了230+.之后一直到wow所在服务器,延迟都是高高的230+到300+波动,严重的时候会到600+.

由这个数据,猜测第11跳路由存在以下几个问题: 1.如果11没有问题,应该是10的路由指向错误,本应该指向一个更优化的下级路由去,结果被错误指定了一个比较远的路由,结果就是延迟直线上升. 2.11是正确的10的下级路由,但由于hinet的成本规划或者采购回扣什么什么的原因,用的是一个性能比较差的硬件,从而严重影响到响应时间以及处理速度. 3.表瞎说了,11是个高性能路由,且工作状况相当正常,而正因为工作正常,才发现来源IP是属于中国网通现联通的IP,优先级别是可以最后处理从那边来的数据包...这个工作也许是10跳在做,但不管10还是11,都是在hinet里面做的.

然后从香港做同样的功能的tracepath

-bash-3.2# tracepath www.wowtaiwan.com.tw
~
 4:  061238230106.static.ctinets.com (61.238.230.106)     asymm  5   1.377ms
 5:  061238225133.static.ctinets.com (61.238.225.133)     asymm  6   5.998ms
 6:  061238225137.static.ctinets.com (61.238.225.137)     asymm  7   1.526ms
 7:  061244232217.static.ctinets.com (61.244.232.217)       1.641ms
 8:  061244232106.static.ctinets.com (61.244.232.106)     asymm  9   2.158ms
 9:  211-22-33-150.HINET-IP.hinet.net (211.22.33.150)     asymm 11   3.435ms
10:  r01-mgi-hk.hinet.net (220.128.3.217)                 asymm  9   3.987ms
11:  TPDT-3011.hinet.net (220.128.1.181)                    asymm 10  87.844ms
12:  TYFO-3011.hinet.net (220.128.1.57)                     asymm 14  59.563ms
13:  TYFO-3012.hinet.net (220.128.2.57)                     asymm 14  59.511ms
14:  TYFO-3402.hinet.net (220.128.9.141)                    asymm 12  59.480ms
15:  211-22-39-225.HINET-IP.hinet.net (211.22.39.225)     asymm 13  59.759ms
16:  203.66.220.137 (203.66.220.137)                      asymm 14  59.619ms
17:  no reply

哎,看这了网速,真的觉得香港很好.很好,虽然那的楼高了些,人口密度大了些...

这里也是第9跳接入了hinet,然后不争气的hinet也是在第11条延迟突然上升了20倍之多.文字游戏玩不得的,这20倍之后的效果,明显没有上面一倍的效果给力啊,20倍后才80+,这之后到达官网主机,延迟还降到50+.

由此也可以猜测: 1.hinet的路由性能的确是有点点问题,不然不会由80多降到后面几跳的50多,应该是处理不过来. 2.二条线路共同点都是到达hinet接入点的时候,速度还挺理想,进入hinet之后,会增加很高的延迟 3.增加的延迟,猜想是和来源IP有关系.想来不会故意设置性能低下的路由给谁谁谁用,那最可能的原因就是不同的接入商对应了不同的带宽.比如说北京联通接入hinet是10M,香港某机房接入是1000M,但联通得有多少人挤这10M的小路啊,于是对应的那个路由设备就忙得抽筋了,于是我们过去的连接也跟着抽筋了,于是我们副本战场累得手也抽筋了...

另外,从北京联通访问香港大部分机房的速度都是相当理想的,40~80ms的延迟居多.所以一个理想的代理,应该是从香港中转,然后走香港到TW的出口,这样连接TWOW的网络速度会理想很多.

大多数代理的延迟其实都算还好,不过用户一多,流量一上来,效果就和北京联通直连一样的现象了,大家都挤代理的那条私有小路,不抽筋才怪.所以更理想的代理,是自己在香港买个VPS,单独512K或1M带宽,自己一个人...自私了点...加上好友...这还行...三五人用完全没问题.

可能的问题: 为了验证,购买过几家香港的VPS,每月价格200左右,都是号称1M的独立带宽.白天用效果都相当好,但晚上效果只有一家还勉强过得去.这其中有二个可能,一是我买的vps都是从一些小商家手中拿的,不是从机房直接拿到,那1M的独立带宽,应该有很大的水分,导致晚上用的人一多,同样形成挤小路的情况,延迟马上高升.而从机房直接拿VPS,价格要高很多,可选的种类也少,还不如直接搬台机器跑香港机房去做主机托管.直接在机房托管一台主机,再租个2M,10M的带宽,这应该是最高级别的代理方式了,质量也有保障.二是台服虽然号称服务器升级过几次,不过现在移民过去的人口,应该远远超出了硬件的负载,这样晚上在线人口一多,除去挤带宽不说,只怕台服的服务器也会变成小霸王,处理不了那么多人口的吃喝拉撒.而对于是否升级硬件直接解决这个问题,智凡迪只怕纠结了不止一年二年了吧.

兄弟们,AFK先吧,拉几个酒肉朋友,一起来学三国杀...

以前曾偶然听到李家怡的原创歌曲:365,觉得很普通的同时又很动听.在网上查了下,youtube上保存的版本不错,有繁体中文字幕,包括歌词,特地记录在这里.

如果你也来到里,看到的却是一个大白框的话,那也是很正常的现象,因为youtube有时候是个不存在的网站,或者说是个看不见的网站.如果你有兴趣听这歌,或者是有兴趣围观下传说中的网站,那么,滚动鼠标到白框后面,做点技术层面上的事后,再刷新本页面吧.

歌词如下:

李家怡 - "365"  
词/曲/演唱 李家怡

闷热的夏天 平淡的秋天
突然间在我的眼里都变特别
烦躁的春天 懒惰的冬天
都没关系 只要有你在我的身边
我开始发现 所谓的永远
原来远在天近在眼前

No matter day or night
You are still my light
You make me feel that all the things will be alright
No matter how time flies
You are still by my side
I'll see the peace
You know I need you be my guy

难过的阴天 无聊的雨天
幸福的感觉满溢心里 没改变
失去的昨天 未知的明天
都没关系 因为我们有的是今天
你终於出现 我的生命线
从此甜蜜的继续蔓延

No matter day or night
You are still my light
You make me feel that all the things will be alright
No matter how time find
You are still by my side
I'll see the peace
You know I need you be my guy

Oh~
Da da, da da, da da, da da
Oh da da da da da

不管白天黑夜 离不开的视线
答应我一直到白头都不改变

仍然强烈建议你用firefox访问本站,一是因为本站访问效果没有在IE下进行调整测试,二是有些活在firefox下方便得多.当然还有更多的理由,就不多说了. 首先你可以在这里获取一个免费的国外ssh帐号:

美国免费SSH账户|美国免费SSH账号

或者你在twitter follow@freesshus也许能要到一个, BTW,那个twitter也是个看不到的网站,如果你能正常访问,下面的内容就可以跳过了.

然后从这里下载个小工具(windows类操作系统,如果你用linux,直接使用ssh命令,打开监听并指定端口即可)

plink.exe

放桌面上,做一个快捷方式,将属性中的目标改为

~\plink.exe -pw 密码 用户名@主机名 -N -C -D 127.0.0.1:7070

其中~为plink.exe所在目录,保持原样,假如从freessh.us取得的密码为 JuR3K2,主机为一号主机,那么plink.exe的参数如下面的样子

~\plink.exe -pw JuR3K2 freessh@a.freessh.us-N -C -D 127.0.0.1:7070

第一次运行会提示保存证书,确认就行.连接成功会显示形如

Using username "freessh".

这样就ok了.

Firefox推荐安装AotoProxy插件,代理服务器选择默认的SSH -D就行,然后刷新本页. IE要在Internet选项里,把套接字代理服务器设置为127.0.0.1,端口7070,然后刷新本页.

可能有的问题: 最近freessh相当火爆,如果服务器状态显示繁忙,密码就拿不到了.如果你有耐心,评论里留下email,我会发送一个最长一个月有效的香港ssh帐号给你试用,限额前五名. 现在还能用的ssh国外帐号申请网站 http://www.cjb.net/ add一个新的free ssh提供网站 http://ssh.daili.vc/

很闲的时候,找东西找发时间,无聊就玩了会verycd上的魔塔世界.有时候杀10来只怪更无聊,何况更要爬100多层的塔,全是重复劳动.不由想起很久以前用过的按键精灵,做这事最合适了.于是顺手写了个简单的前台脚本,放虚拟机里用蛮方便.后台那块还没看,以后看看会不会加进去.

记得最早用按键精灵好象还是2.x还是3.x来着,现在已经到了8.0,用起来是更方便了,广告也更多了......

脚本不长,100多行,就直接贴在下面,懒人也可以下载能直接运行的小精灵版本.下载压缩文件,全部放在c:\mt下就好.放别的目录则在代码或小精灵里修改下picPath参数.

小精灵版本下载 只下载脚本用到的图片

脚本:

//todo
//1.加入修理
//2.加入统计显示
//3.智能判断所处场景

Dim findFlag 	//是否找到的标志
Dim stepX		//X偏移量
Dim stepY		//Y偏移量
Dim picPath 	//图片所在目录
Dim varGWWZ		//怪物位置
Dim varScreen   //场景,取值为 副本,冲塔,野外杀怪
Dim varLoopNum  //脚本运行次数
Dim varPicsim   //图片相似度
Dim adjX		//x adjust
Dim adjY		//y adjust

//初始设置
UserVar varPicsim=0.8 "图片相似度,0,5~1"
UserVar stepX=20 "查找图片时的偏移量x"
UserVar stepY=20 "查找图片时的偏移量y"
UserVar picPath="c:\mt\" "图片所在目录,以结束" 
UserVar varGWWZ=1 "设置怪物位置,取值为1,2,3"
UserVar varLoopNum=100 "脚本运行次数"
UserVar varScreen=DropList{"副本":"副本"|"冲塔":"冲塔"|"野外杀怪":"野外杀怪"}=2 "场景,取值为 副本,冲塔,野外杀怪"
UserVar adjX=208 "x adjust"
UserVar adjY=84 "Y adjust"

varGWWZ=varGWWZ*60-60

findFlag=false

Delay 500

For varLoopNum
    if varScreen="野外杀怪" then
        Call 野外杀怪
    ElseIf varScreen="冲塔" then
        Call 冲塔
    ElseIf varScreen="副本" then
        Call 副本
    End If
Next

//冲塔主程序
Sub 冲塔
    Call 继续探险()
    Delay 1000
    Call 确定打怪()
    Delay 500
    Call 关闭战斗()
    Delay 1000	
End Sub
//野外杀怪主程序 
Sub 野外杀怪
    Call 找到怪物()
    Delay 1000
    Call 确定打怪()
    Delay 500
    Call 关闭战斗()
    Delay 1000
End Sub

//副本主程序
Sub 副本
    Call 副本攻击()
    Delay 1000
    Call 确定打怪()
    Delay 500
    Call 关闭战斗()
    Delay 1000
End Sub

Sub 副本攻击
    If 试图查找点击图片(801,407,870,432,"攻击.bmp",35,14)=false then
        //没有找到则退出
        MessageBox "没有找到<攻击>哦,我先休息会儿~~"
        EndScript
    End If
End Sub

Sub 继续探险
    If 试图查找点击图片(566,484,643,513,"继续探险.bmp",40,15)=false then
        //没有找到则退出
        MessageBox "没有找到<继续探险>哦,我先休息会儿~~"
        EndScript
    End If
End Sub

Sub 找到怪物
    //光标移动到第一个怪位置
    If 试图查找点击图片(1106,365+varGWWZ,1136,383+varGWWZ,"怪物.bmp",15,9)=false then
        //没有找到则退出
        MessageBox "没有找到怪物哦,我先休息会儿~~"
        EndScript
    End If
End Sub

//查找指定的图片并点击,返回true
//如果没查找,返回false
//参数分别为
//左上x,左上y,右下x,右下y,图片名,点击时偏移x,偏移y
//偏移用于尽量将鼠标移动到图片中间
//查找图片的范围偏移由全局变量决定
Function 试图查找点击图片(sX,sY,eX,eY,picName,mX,mY)
    FindPic sX-stepX-adjX,sY-stepY-adjY,eX+stepX-adjX,eY+stepY-adjY,picPath+picName,varPicsim,intX,intY
    If intX>0 and intY>0 then
        MoveTo intX+mX,intY+mY        
        LeftClick 1
        Delay 500
        //确认点击成功,检查三次
        FindPic sX-stepX-adjX,sY-stepY-adjY,eX+stepX-adjX,eY+stepY-adjY,picPath+picName,varPicsim,intX,intY
        For 3
            if intX>0 and intY>0 then
                //MoveTo intX+mX,intY+mY
                LeftClick 1
                Delay 500
            Else
                Exit For
            End If
        Next
        试图查找点击图片=true
    Else
        试图查找点击图片=false    
    End If
End Function

//查找指定的图片并点击
//如果没查找,延迟一秒后继续查找,找到为止
//参数分别为
//左上x,左上y,右下x,右下y,图片名,点击时偏移x,偏移y
//偏移用于尽量将鼠标移动到图片中间
//查找图片的范围偏移由全局变量决定
Sub 查找点击图片(sX,sY,eX,eY,picName,mX,mY)
    findFlag=false
    While findFlag=false
        FindPic sX-stepX-adjX,sY-stepY-adjY,eX+stepX-adjX,eY+stepY-adjY,picPath+picName,varPicsim,intX,intY
        If intX>0 and intY>0 then
            MoveTo intX+mX,intY+mY
            LeftClick 1
            Delay 500
            //确认点击成功,检查三次
            FindPic sX-stepX-adjX,sY-stepY-adjY,eX+stepX-adjX,eY+stepY-adjY,picPath+picName,varPicsim,intX,intY
            For 3
                if intX>0 and intY>0 then
                    //MoveTo intX+mX,intY+mY
                    LeftClick 1
                    Delay 500
                Else
                    Exit For
                End If
            Next
            findFlag=true
        End If
    Wend
End Sub

Sub 确定打怪
    Call 查找点击图片(626,558,713,596,"确定.bmp",41,17)
End Sub
Sub 关闭战斗
    Call 查找点击图片(712,604,794,636,"关闭.bmp",41,15)
End Sub
Sub 关闭战场
    Call 查找点击图片(720,560,804,593,"关闭战场.bmp",42,16)
End Sub

备注一:不做任何改动,能在1024x768下运行,ie or ff最大化,只显示一行地址栏及一行标签栏.

备注二:UserVar adjX=208 "x adjust"及UserVar adjY=84 "Y adjust"设置为0.能在1440x900的本本上运行.其他则要修改下这二个的值.原始图是在1440x900下取的,以攻击第一个野外怪位置为例,"攻击"二个字的图片位置是1104,363.其他分辨率下取这处图边左上角坐标与原始坐标的差值.1024x768下,这二字的左上角坐标为896,279,差值就是现在在用的208,84.以后有空再改为简单点的标识.

可能存在的问题:

我在按键精灵8时进行调试,发现有时候Uservar定义的变量取值会不正常,后来发现是保存代码后,脚本里所有定义的Uservar值都会被保存下来,放在按键精灵8的安装目录根下,名为uservar.txt文件中.这时候如果只改动脚本里的值,调试运行里仍会读取这个文件里保存的值.理论上按键精灵8在调试里,应该先读取脚本里的值,并更新到uservar.txt中,或者调试里不使用这个文件. 临里办法是每次调试都删除这个文件,或者直接先在编辑器里的GUI中选择确定新值,并先保存,再调试.

Syntax Highlighter ComPress语法加亮插件在我用的模板中不能自动换行.改了下CSS先用着.可惜这个插件在IE下有小部分不能正常显示,FF下大部分正常.

查找syntax-highlighter-compress/styles/shCoreEclipse.css中的

.syntaxhighlighter .line {
  white-space: pre !important;
}

改为

.syntaxhighlighter .line {
 white-space: pre-wrap;       
 white-space: -moz-pre-wrap; 
 white-space: -pre-wrap;    
 white-space: -o-pre-wrap; 
 word-wrap: break-word;
}

保存就ok了.