服务器XMLHTTP(Server XMLHTTP in ASP)基础

服务器XMLHTTP(Server XMLHTTP in ASP)基础

近几年很流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 Ajax,服务端 XMLHTTP 就是在服务端使用 XMLHttpRequest 对象了。虽然说,在服务端使用异步请求是比较不方便的,但是做为可以服务端发送 HTTP 请求的组件,学习一下也是没有坏处的。

这里,我讲的是在 ASP 环境中使用服务端 XMLHttpRequest,并以 JScript 做为演示代码的语言,因此,你需要了解 ASP 以及 JScript。

服务端 XMLHTTP,通常会用在获取远程主机的网页或者其他内容,新闻聚合系统一般就是使用服务端 XMLHTTP 对象来获取要聚合的 Feed 的内容,然后使用 XMLDOM 对象来分析 Feed 的内容,取出新闻的标题、作者、内容等信息,再存在数据库中,然后将若干个数据源的新闻一起显示在一起。抓虾就是这样一个新闻聚合器,但是它不是用 ASP 写的就是了 :)

在 ASP 中,我们可以用以下代码来创建一个 ServerXMLHTTP 对象,而这个对象,就是我们在服务端进行一切操作的基础。

  • // 


阅读全文 »

解决Windows Vista中截图工具运行速度慢的问题

Vista自带的截图工具还是比较好用的,但是一直以来运行总是很慢,从按下快捷键到出来截图界面需要很长时间,通常需要几秒到十几秒不等,这让人很奇怪,按说,截图工具算是个小工具软件,运行速度不至于这么慢的。但是,它就是这么慢……

今天又想到这个问题了,就去网上找了找,找到了篇帖子说是TablePC的服务器造成的,于是打开服务管理器,启动 Tablet PC Input Service 服务,再运行截图工具,果然,速度快了很多。

这个服务是之前优化服务时关闭的,觉得台式机用不着那东西。看来服务优化还是需要谨慎的。

在JScript中使用ADODB.Stream判断文件编码

在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,因此需要通过一个特别的方法来获取文件开关的编码标识。

一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是不行的。

继续寻找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面刚好有我需要的内容。

其实说来也简单,就是把编码换一下,使用437,这个是IBM扩展过的ASCII编码,把ASCII编码的最高位也利用起来,将字符集中的字符从128个扩展到256个,而使用这个字符集读取的字符数据就相当于原始二进制数据了。

解决了障碍后,就要开始识别文件的编码了,通过使用ADODB.Stream对象来读取文件的开始两个字节,然后根据这两个字节就可以判断文件编码是什么了。

UTF-8文件如果带BOM的话,那么头两个字节就是0xEF、0xBB,再例如Unicode文件的开始两个字节是0xFF、0xFE,这些就是判断文件编码的依据。

需要注意的是,在ADODB.Stream读取字符时,并不是一一对应的,也就是说,如果二进制数据是0xEF,读取出来的字符经过charCodeAt之后,并不是0xFE,而是另外的值,这个对应表可以在上面提到的文章里查到。

  • function CheckEncoding(filename) {
  • var stream = new ActiveXObject("ADODB.Stream");
  • stream.Mode = 3;
  • stream.Type = 2;
  • stream.Open();
  • stream.Charset = "437";
  • stream.LoadFromFile(filename);
  • var bom = escape(stream.ReadText(2));
  • switch(bom) {
  • // 0xEF,0xBB => UTF-8


阅读全文 »

ASP中使用FileSystemObject时提高性能的一个小技巧

在封装自己的FileSystemObject库的时候,测试的时候发现在文件夹或文件很多的时候,效率很低,显示一个文件夹需要2秒甚至更多,这让我很是奇怪,因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性,这应该不会引起性能上的问题,但是事实却说明我的想法过于简单了。

按个测试了一下可能会是哪些属性引起的性能问题,在去掉Type也就是类型属性显示的时候,性能有了很大提高,之后的测试也证明了是Type属性的使用导致了性能问题。

仔细想了一下,Type引起性能低的原因应该是,引用Type属性所得到的是文件的具体类型信息,也就是我们在资源浏览器里看到的那样,比如TXT文件的类型就是显示为“文本文档”,但是这个类型信息却是存储在系统中,通过文件扩展名进行关联的。在FSO中使用Type属性的时候,对于每个File对象,FSO都需要根据扩展名去系统中检索这个扩展名对应的类型名称,这样,就极大的降低了性能。

因此,在使用FileSystemObject时,如果可以不使用File或者Folder对象的Type属性,就尽量不使用。

希望此文对你有所帮助。

by Xu Jiwei

Subversion 配置笔记

在决定转向SVN之后,就去下了个Subversion 1.4.6装上,但是默认的情况下,SVN并不像CVSNT那样提供一下基于网络的访问接口,因此在一开始,我只能用TortoiseSVN使用file:///协议来访问版本库。

这样终究不是个办法,因此去网上找了找,发现SVN本身也提供将SVN安装成服务的方法,只要自己添加一下就行了。使用以下命令:

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service
--root c:\repos" displayname= "Subversion" depend= tcpip start= auto

注意,如果你是在Vista下面的话,需要使用管理员权限来添加服务。还有一点就是,在输入命令的时候,属性名称后面跟着=,不能有空格,但是=与后面的值之间必须有一个空格。

配置之后就可以用svn://协议来访问版本库了。

配置网络访问之后,还需要设置一下访问权限,这个在版本库conf目录里的svnserve.conf里配置。

找到 [general] 段,可以从注释里看到配置匿名访问、密码数据库等等选项。其中 anon-access 是用来设定版本库的匿名访问权限,auth-access 是用来设定登录用户的访问权限,password-db 是用来设定用户密码数据库,一般取默认 passwd 就行了,realm 是用来设定版本库的域,如果两个版本库的的域一样,那么它们就会使用同一个用户密码数据库。

用户权限有 none、read、write 三种,我的配置如下:

[general]
anon-access = none
auth-access = write
password-db = passwd
realm = my subversion



阅读全文 »

提高Vista开始菜单文件夹展开速度的小技巧

用了Vista一段时间,总是觉得Vista的开始菜单里的文件夹展开速度很慢,以前配置不是很好,可以理解为配置的原因,但是现在配置应该也不差了吧,怎么会还是这样呢。

某天玩电脑的时候突然想到,会不会是那个“高亮显示新安装的程序”的原因,试了一下,开始菜单里的文件夹展开速度果然快了很多。

如果你的Vista在进入开始菜单,展开文件夹的时候速度也是很慢的话,不妨试试禁止“高亮显示新安装的程序”,步骤是:在开始的微软徽标上右击,选择属性,然后进入“开始”菜单选项卡,点击“自定义”,打开“自定义'开始'菜单”对话框,在列表中找到“突出显示新安装的程序”,取消选中这个项目,然后确定两遍即可。

跟VMware有得比的虚拟机,VirtualBox

新硬盘到手,装好vista,又准备装个Ubuntu 8.04,但是只有镜像没有光盘,又没有空的CD刻录盘,于是就先在虚拟机去体验一把了。

虚拟机到现在我也用过不少了,Virtual PC、VMware、Bochs、QEMU这几个常见的虚拟机都用过,但是就速度和功能上来说,还是首选的VMware。自从Virtual PC被微软收购之后,貌似就没怎么用过了,一方面微软把Guest OSes限制在了Windows系列,虽然安装其他系统也是行,但是总是感觉不太舒服的,另一方面就是Virtual PC的速度有待提高了。

VMware安装Ubuntu非常方便,直接镜像放进去,按正常步骤安装。

在虚拟机里安装好Ubuntu之后,想用用VMware for Linux版的Unity功能,于是就去下了个VMware for Linux 6.5 Beta,弄到虚拟机里。

但是,安装完VMware,在Ubuntu里安装系统的时候才发现,VMware不支持在虚拟机里的虚拟机安装系统……

好吧,既然VMware检测了Host OS是否运行在虚拟机环境里,那么我换个虚拟机总行了吧。

Linux里的虚拟机,以前也玩过,还是知道有个VirtualBox的,然后又想到之前有看到新闻说VirtualBox也支持类似VMware Fusion那样的无缝运行了。赶紧去VirtualBox官方网站下了个v1.5.6的。

安装完VirtualBox启动它,界面很是简洁,左边是虚拟机列表,右边是选中的虚拟机的配置信息,这个布局很像Virtual PC,只不过VPC只有虚拟机列表而已。

图片附件

先装个TinyXP试试。TinyXP安装很快,10分钟左右就搞定了。然后安装附加软件包,重启客户机之后,无缝模式已经可以用了,感觉比较好,效率比VMware高,停顿的感觉没有VMware那么明显。

昨天在VirtualBox官方看到了v1.6.0的changelog,但是却没有找到v1.6.0的下载,还很奇怪,今天能下载了才想起来VirtualBox被Sun收购了,v1.6.0是被Sun收购之后推出的第一个版本,看changelog里改变蛮大的,我比较关注其中有一个就是支持Linux客户机的无缝运行。

下了v1.6.0,重新安装后,把安装好的Ubuntu附加软件升级了一下,无缝模式也可以运行了。

没有运行在无缝模式下的Ubuntu,桌面分辨率可以随窗口大小而改变。

图片附件

运行在无缝模式下的Ubuntu,下面这张图里是Ubuntu的终端和Windows的cmd一起运行的情况。

图片附件

感觉VirtualBox在Linux下的无缝模式还不是很稳定,不过也有可能是因为没有安装好的关系,不过不管怎么说,VirtualBox的速度和功能还是让人比较满意的,等有Ubuntu 8.04的CD之后,也去装一个。

BOM引起的网页布局混乱

页面的上部比正常状态下多出一块空白,而且整个页面的布局完全是混乱的。

一开始以为是服务器上文件版比本地的文件版本旧的原因,比对了一番没找到不同的,然后想到会不会是文件编码的问题。

切换到Zend Studio,找到首页的模板文件,属性里一看,编码UTF-8,对的,但是下面一行字引起了我的注意,“Byte Order Mark is UTF-8 (BOM)”,于是就想是不是这个玩意引起的布局混乱。

打开EditPlus,设置文件保存选项为一直删除BOM,打开首页模板,保存,上传,测试,没有问题!

看来果然是BOM的问题了,接下来的事就比较机械了,在模板文件里看哪些是带了BOM的,直接到EditPlus里走一遭就行了。

解决了这个问题才想起来,有些模板为了转换成UTF-8编码的,就用记事本打开文件,然后另存为UTF-8编码了,但是记事本是会给UTF-8编码的文件加上BOM的,因此就引起了首页布局的混乱。

嗯,问题解决,就这样。

ASP 中实现 MVC 架构

这些天在看《Ruby for Rails》,对RoR起了点兴趣,在想着能不能在ASP里也整个MVC出来,恰好前天在经典看到了一篇帖子《分享一个好东东,动态Include文件 (Dynamic File Includes)》,虽然之前也在BlueIdea看到过动态include,但是那个函数不是很完善,所以也就没怎么注意。

但是这个动态include比较符合需要,常规应用都能应付,刚好看了RoR有点想法,于是就有了ASP MVC的尝试,写了一点简单的东西,为了共享,就放到Google Code上去了~

主页地址:http://code.google.com/p/asp-mvc/

要check out源代码的话,可以使用这个地址:http://asp-mvc.googlecode.com/svn/trunk/

具体怎么使用SVN就请大家自行google了 :)

JavaScript 中为 Date 类实现 DateAdd 方法

JavaScript 中的并没有提供像 VBScript 里的 DateAdd 方法用于日期的操作,像加一年,减一个月什么的,这在服务端经常用到,比如设置 Cookie 的到期时间为现在时间的后一年,那么就需要使用这个方法了。

虽然 JavaScript 中没有 DateAdd 方法,但是 Date 类却有设置年月日时分秒的方法,比如 setFullYear、setMonth 之类的,而且,这些个方法的参数是可以为负的,在设置之后, Date 类会自行进行调整,每个月是30天还是31天,年份是不是闰年都不用我们来管了,只管设置值就是。

有了这个特性之后,我们就可以很方便的来为 Date 类添加 add 方法了。之所以不添加一个 DateAdd 方法而是给 Date 类添加一个 add 方法是因为我觉得那样更加方便,当然你也可以将 Date 类的 add 方法转换成为一个全局函数 DateAdd。

为了对每一个 Date 类的实例都有效,这里用到了 prototype 对象。

在 VBScript 里的 DateAdd 方法是用一个字符串来控制所加的量是年还是月还是其他的,所以在这里我也模仿 VBScript 里的 DateAdd 方法,使用一个字符串来控制所加量对应的部分,比如 y …

阅读全文 »