[ASP] 《在JScript中使用缓存技术》补遗

《在JScript中使用缓存技术》一文中,在JScript中实现了基于Application.StaticObjects的缓存技术,并且实现一个类用于缓存的操作,但在实际使用过程中仍需要注意一些问题。

在JScript的函数中,如果参数类型是number或者string,那么是按值传递的,但如果是object,那么就是按引用传递了。另外,数组在JScript中也是作为一个特殊的对象对待,因此,数组的类型也是object,同样是按引用传递的。

使用xbsCache类进行保存和获取数据操作即put和get时,不管是按值还是按引用,都没有问题,但是在使用过程中,对数据操作的效果由数据类型不同而不同。

如果数据是number或string类型的,那么在get数据时,返回值是按值的,也就是说,我们得到的数据是缓存数据的一份copy,对变量的操作并不会影响到缓存中的数据,例:

  • // code by xujiwei
  • // from www.xujiwei.cn
  • var myname="my name is xujiwei";
  • xbsCache.put("name",myname);
  • // 从缓存中获取name,值为"my name is xujiwei"
  • var myname2=xbsCache.get("name");
  • // 给myname2赋值"xujiwei"
  • myname2="xujiwei";
  • // 从缓存中获取name,值仍为"my name is xujiwei"
  • var myname3=xbsCache.get("name");

但是在数据类型为object的情况下,我们就需要注意,在从缓存中获取数据之后,我们得到的只是一个指向缓存数据的引用而已,并不是缓存数据的copy,因此,对数据的修改是直接影响到缓存的,例:

  • // code by xujiwei
  • // 


阅读全文 »

[ASP] 在JScript中使用缓存技术

在编写ASP程序时,通常为了提高ASP程序的运行效率及减少对数据库的连接和查询,会使用缓存技术来缓存一些需要从数据库读取的数据。而在ASP中实现缓存的方法常用的就是使用Application对象。在编写ASP程序时,我们有两种语言可以选择,分别是VBScript和JScript。

在使用VBScript时,我们可以用Application缓存数组来实现缓存,例:

  • Dim rs,arr
  • rs.Open conn,sql,1,1
  • arr=rs.GetRows()
  • Application.Lock()
  • Application("cache")=arr
  • Applicatoin.UnLock()

在VBScript里,数组是可以存到Application对象里的,但是如果ASP的语言选择为JScript的话,那么就有些不妙了,我们在使用Application储存一个数组时,会出现以下错误:

Application object, ASP 0197 (0x80004005)

Disallowed object use

Cannot add object with apartment model behavior to the application intrinsic object.

在微软的知识库可以找到具体原因如下:

JScript arrays are considered to be "Apartment" COM components. Only Component Object Model (COM) 



阅读全文 »

Ubuntu中使用锐捷+L2TP协议VPN拨号上网全攻略

06.09 Update 把忘记的压缩包补上了,以及标明了一些不同网络环境下需要修改的地方

这段时间实在是事情一大堆,所以虽然19号就搞定了Ubuntu下面的VPN拨号上网,但是隔了这么久才写这篇文章。

在Ubuntu 6.10出来的时候,就装上了,但是在搞定了锐捷,能上内网之后,就搞不定用VPN拨号上外网了,所以就一直没怎么用Ubuntu。在160G的硬盘坏之后,就更没条件去尝试Ubuntu上网了。一个阳光灿烂的下午,去把硬盘换了个新的回来之后,过了一天Ubuntu 7.04的CD就到了,刚好,听说Ubuntu 7.04 Fesity在VPN支持方面做得比较好了,就把Ubuntu给装上了。但是学校的VPN拨号是用L2TP协议,而不是PPTP,因此找到许多文章都没有用,只能自己摸索,某天晚上,弄到3点钟,终于让我撞大运,给弄出来了。

好了,废话不多,开始正事。

1. 准备工作

首先要做的是把本机的IP给设定好,在“系统>系统管理>网络”里进行设置,选择“Wired conection”,然后属性,设置Configuration为静态IP方式,然后把IP、子网掩码和网关按网络中心给的设置设置好。

接着,切换到DNS选项卡,把网络中心给DNS服务器给添加进去。

2. Ubuntu中的锐捷认证

虽然锐捷官方也出了Linux下面的Linux认证工具,但是那个工具是会检测代理服务器,因此在Ubuntu认证完成之后,过一段时间会莫名奇妙的断掉,所以我们需要寻找能代替官方认证工具的认证工具(呃,有些拗口)。

万幸,已经有牛人也是用的锐捷认证,并且破解了官方的认证工具,使它不再检测代理服务器,这个认证名字叫做myxrgsu,我已经放在文章末尾的压缩包了。运行myxrgsu之后,输入用户名和密码,并选择自己的认证方式就可以认证成功了。注意,运行myxrgsu需要root权限。

XRGSupplicant 1.1.1
Ruijie Network CopyRight 2004-2005
Please input your user name:{用户名}
Please input your password:{密码}
Use DHCP,1-Use,0-UnUse(Default: 0):
Use default auth parameter,0-Use 1-UnUse(Default: 0):
Searching server...
Connecting server...
Authenticating...
{认证成功时的服务器消息}
Authenticate 



阅读全文 »

Firefox与IE兼容性:getAttribute的返回值类型

在改AJAXRequest的过程中,碰到了个问题,应该算是Firefox和IE之间的兼容性问题。

提交表单时,往往需要先对表单进行验证,而这个验证的过程一般是放在form标签的onsubmit属性中。

onsubmit一般是由浏览器在form的submit动作发生时自动触发,但是如果表单由我们自己来提交,比如在AJAX应用中,就是由我们自己写程序将表单转换成请求字符串,再通过XMLHttpRequest发送到服务器,那么如果在此同时不丢掉表单验证的话,就需要我们自己来获取onsubmit属性,并去处理它。

在获取属性时,为了保证兼容性,我用getAttribute来获取标签的属性值,但是发获取了onsubmit属性之后,发现在Firefox和IE中使用getAttribute("onsubmit")所返回的返回值类型是不同的。

测试代码如下:



阅读全文 »

使用VS2005调试ASP程序

很早之前就在PJ的blog上看到可以用VS2005调试ASP程序,但是没有写出具体的步骤,后来一次偶尔也让我找到了方法,但是一直没把它写出来,今天就把用VS2005调试ASP程序的方法写出来,希望对写ASP程序的朋友们有用。

首先需要说明的是,我所用的环境是Win2003+IIS6,PJ用的环境是Vista+IIS7+WPF,不过我想WPF应该是无关紧要的,主要是服务器支持服务端脚本调试。在此我以IIS6为例说明怎样开启服务端脚本调试。

先打开“Internet 信息服务(IIS)管理器”,找到要开启服务端脚本调试的网站,进入属性页,进入“主目录”选项卡,点击“应用程序设置”中的“配置”,进入应用程序配置,进入“调试”选项卡,选中“启用ASP服务端脚本调试(E)”,确定即可。

图片附件

配置完IIS之后,就需要用VS2005来调试程序了。当然安装VS2005是必须的步骤,这里就不多说了。

使用VS2005调试ASP程序可以在两种情况下使用,一是程序出错时调试,一是手工加载调试。

如果想在ASP程序出错时才用VS2005进行调试,那么可以在装完VS2005之后直接测试ASP程序,如果程序出现错误,会自动提示是否使用VS2005进行调试。

图片附件

一个测试ASP程序,a=1,b=0,因此会有除0的错误,提示是否使用VS2005调试,选择是,使用新实例,如果已经打开了VS2005,则也可以直接用已经存在的实例来调试

图片附件

错误信息,可以选择中断或者继续

图片附件

中断,光标停在出错行,下部用红框标出的是变量监视窗口,可以查看当前上下文中的变量

另一种情况是在还没出错的情况下进行调试,这时需要先在浏览器中访问过需要调试的文件,因为这样ASP代码才会载入内存,然后打开VS2005,选择菜单中“工具->附加到进程”,然后选择w3wp.exe,如果在进程列表中没有找到w3wp.exe,可能是因为你还没有运行过ASP程序。

图片附件

这时可以在左边看到内存中存在的脚本文件,可以选择要调试的文件打开,然后进行下断点之类的操作,从下图可以看出,我下了个断点在a=1,运行时程序停在了a=1这一行。

图片附件

如果没有看到脚本资源管理,可以用菜单“调试->窗口->脚本资源管理器”来打开,或者使用快捷键Ctrl+Alt+N。

至此,我们就可以使用VS2005来调试ASP程序了,相信这会在ASP程序开发过程中给大家带来很大的方便。

解决“iTunes不能浏览该电脑上的专辑封面”

重装完系统之后,再把iTunes装好,把原来的资料库恢复过来,打开iTunes,发现不能用iTunes7中的Cover Flow显示了,那么大一块黑乎乎的地方告诉我:iTunes不能浏览该电脑上的专辑封面。

在网上找了下,也没怎么找到答案,后来发现了一丝丝原因,有一个地方可能是加速没开,建议在显示属性里把硬件加速开到最高,立马想到很可能是这个原因,因为我装的是Windows Server 2003,默认显示加速都不是最高的。

马上把显示属性硬件加速开到最高,然后再运行DirectX诊断工具,将DirectDraw、Direct3D和AGP纹理加速启用。

终于,iTunes的Cover Flow又回来了!

再解Windows Vista上用锐捷上网的问题

我在如何解决Windows Vista中无法通过锐捷认证上网的问题一文中讲了如何在Windows Vista中如果用锐捷上网的问题,但在两个同学的电脑上还是有些问题,然后运气了一下,解决了。

在有些电脑上,在Vista里通过Mento Supplicant认证成功后,还是不能ping通DNS服务器和VPN服务器,从而不能连接二次拨号。

昨天帮一朋友弄Vista上网时,明明步骤都正确的,但是还是不能上网,郁闷得不行,然后跑到小道道的电脑,进了Vista,一步步照着教着做,还是不行,然后偶尔发现在Mento Supplicant的网卡列表里发现了两块一样的网卡,试着选择了另外一个,认证,竟然二次连接成功了……

总结一下,在Vista里,不知道什么原因,有些情况下Mento Supplicant会把一块网上侦测为两块网卡,用其中一块网卡的时候,虽然显示是认证成功了,但是这个时候还是不能拨VPN链接上网的,会出现找不到VPN服务器的错误,选择网卡为另外一块就可以解决这个问题了。

希望对要用Vista但是受锐捷折磨的朋友们有用^_^。

[ASP] 在JScript中使用RecordSet对象的GetRows方法

写ASP程序时,一般情况总是使用的VBScript,不过也不只是这一种选择,也可以用JScript。但在用JScript作为ASP的语言时,比用VBScript有一些小小的不方便,比如RecordSet的GetRows方法。

在ASP中操作数据库,一般都要用到RecordSet对象,如果注重程序效率的话,可能就会用到RecordSet对象的GetRows方法,把记录集对象转换成数组,而操作数组在速度上将比用RecordSet对象的MoveNext方法快很多,而且可以在取出数组后尽早释放RecordSet对象,从而减少资源的占用,这也是优化ASP性能的一个方法。

在VBScript里,用RecordSet.GetRows方法取到的是一个二维数组,里面的数据可以通过遍历数组的方式来取得。

假设现在有一个数据库,其中有一个表名为mytable,有3个字段,名称分别为id,first,second。

  • ' code by xujiwei
  • http://www.xujiwei.cn/
  • ' 定义变量
  • Dim conn,rs,data,recN,i
  • ' 连接数据库
  • Set conn=Server.CreateObject("ADODB.Connection")
  • conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
  • Server.MapPath("data.mdb")
  • ' 获取记录集
  • Set rs=conn.Execute("SELECT id,first,second FROM mytable")
  • ' 获取数据数组
  • data=rs.GetRows()
  • ' 关闭记录集,释放对象
  • rs.Close()
  • Set rs=Nothing
  • ' 获取记录数
  • recN=UBound(data,2)
  • ' 循环输出数据
  • For i=0 To 


阅读全文 »

用好HoeKey:用快捷键控制iTunes

用 Apple 的 iTunes 听歌很长时间了,特别喜欢它的保存音乐文件夹有序这个功能,这样我就不用愁添加mp3的时候再去管理文件夹了,以前用Winamp时就没有这个功能。

但是有一点,Winamp可以设置全局快捷键,可以让我在不打开播放器窗口的情况下控制mp3的播放,而iTunes就没有。于是用了这么长时间iTunes,一直是在托盘图标的菜单点控制mp3的播放。但是前些天在做东西的时候突然想到怎么去控制iTunes的播放,于是用Spy++截取了一下在iTunes窗口里用应用程序级快捷键控制播放时所用的消息,得到参数,然后又想到HoeKey可以自定义消息快捷键,于是就改了一下配置文件,使HoeKey能控制iTunes播放。

在iTunes窗口里,可以用Ctrl+→来播放下一首,Ctrl+←来播放上一首,使用空格键来暂停和开始播放,而使用的消息分别是WM_KEYDOWN和WM_CHAR。

于是,可以在HoeKey的配置文件中加入以下行:

~Z=Msg|iTunes|256|37|19202049    ; iTunes - Prev
~X=Msg|iTunes|256|39|19333121    ; iTunes - Next
~32=Msg|iTunes|258|32|18874369    ; iTunes - Pause

其中,~ 在HoeKey中对应的是 Win 键,Z 和 X 分别对应相应的字母键,而32对应的则是空格键,256和258分别是 WM_KEYDOWN 和 WM_CHAR 的值,后面跟的两个数字是参数,表示按下的键及控制键状态,这里不详细说,具体可以查阅MSDN。

那么,加了这些配置之后,就可以使用 Win+Z 让 iTunes 播放上一首歌,Win+X 播放下一首歌,以及使用 Win+空格 来控制暂停和播放了。

[JavaScript] setTimeout和setInterval的浏览器兼容性

无意中测试AJAXRequest浏览器兼容性的时候,发现AJAXRequest.update方法在某些情况下在IE里有问题,经过测试找到是setTimeout和setInterval的问题。

问题出现在当调用AJAXRequest.update方法时,如果带了更新间隔及更新次数,那么在IE下面就会出现问题,具体表现为带了更新间隔时是函数工作,带上更新次数时函数无法在更新指定次数后停止执行。

测试几个例子之后找到了问题所在,在IE里,setTimeout和setInterval是不支持参数传递的

演示地址:http://www.xujiwei.cn/demo/usetimer/

在Netscape的JavaScript参考中找到setTimeout的语法如下:

setTimeout

Evaluates an expression or calls a function once after a specified number of milliseconds elapses.

语法

setTimeout(expression, msec)

setTimeout(function, msec, arg1, ..., argN)

参数

expression  A string containing a JavaScript expression.

msec  A numeric value or numeric string, in 



阅读全文 »