再解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 



阅读全文 »

设计的选择:window.onload or other

在网页设计中,总要用到一些动态效果,而这些效果之中,有一些是需要页面加载完成时才可以做的,比如要给页面中的每一个链接加上hover时的特效,那么就需要在页面的所有代码已经下载完毕时再进行特效,这样才能保证页面里的每一个链接都不会遗漏。如果这步工作放在head中,那么,做与不做一个样。

再者,现在网页设计讲究行为、结构、表现分离,比如在最近的一次改版中,我把我的blog侧边栏的展开与折叠的功能放在了JS中添加,并不是在源代码里直接设置onclick事件添加好的。因为函数调用不是直接直接而是后来添加的,我就要考虑什么时候来用JS添加侧边栏的展开与折叠了。

功能的添加函数所在的脚本放在了head区引入,当然不能在脚本里直接调用这个函数来进行功能的添加,因为那个时候边栏还没有加载,用document.getElementById会出现找不到对象的错误,然后边栏的展开与折叠功能就没有。

那么,从这一点知道,功能的添加是需要在要处理的内容已经加载完成的情况下才能添加

那什么时候侧边栏已经加载完毕了呢,许多人自然而然地就想到了window.onload。是的,在window.onload被调用时,整个页面已经加载完成,那么边栏也一定加载完毕,这个时候做添加onclick响应函数是肯定不会出现找不到对象的错误的。

<html>
<head>
<meta name="author" content="www.xujiwei.cn" />
<meta name="description" content="ue test from xujiwei" />
<title>ue test1</title>
<style type="text/css">
#blockHead {
background: blue; color: white; width: 300px; padding: 1em; cursor: pointer; border: 1px solid blue;
}
#blockContent {
border: 1px solid blue; width:


阅读全文 »

VBScript中变量作用域

下午在写程序的时候,碰到个变量重定义的问题,具体是在一个函数中的两个地方定义了相同的变量,两个变量分别放在IF语句的两部分中,本来以为这两次定义在语句中不同的块,应该没有影响,然而在运行中IIS却提示变量重定义,把重复定义去掉即正确。

解决了问题之后突然想到在Fdream的blog看过一篇文章《JavaScript变量无块级作用域》,似乎这两个是差不多的,在VBScript中变量同样没有块级作用域

再次去看了那篇文章之后我也做了下试验,得到结果:在VBScript中,函数中定义的变量的作用域是整个函数,而不是块级,不管这个变量是在函数中哪个位置定义的。因此,函数中一个变量不管在函数的哪个位置定义,它在整个函数中都可以使用。

下面用一些例子来说明这个问题。

Option Explicit
Sub foo()
Dim var
var="hello,world!"
MsgBox var
End Sub
Call foo()

下面的代码跟上面的代码等效,但是var的定义放在了函数的最后:

Option Explicit
Sub foo()
var="hello,world!"
MsgBox var
Dim var
End Sub
Call foo()

下面的例子说明变量不管在哪定义,在整个函数中都是可以使用的,当然如果把定义的位置放的特殊一点有利于代码的清晰,阅读起来比较方便,修改时也比较方便。

Option Explicit
Sub foo()
Dim var1
var1="YES"
MsgBox "var1: "&var1&vbCrLf&"var2: "&var2
IF var1="YES"



阅读全文 »

[ASP] 用Server.Transfer实现博客日志的永久链接

在许多博客日志阅读页面里的尾部都能看到一个永久链接,这个链接一般是持久在在的,即使博客程序换了,也可以用这个链接来访问原来的日志,而不会出现找不到页面的情况,这对于一个博客的确是一个比较实用的功能。

在修改blog程序时,也考虑了这个问题,决定也给我的博客日志加上永久链接功能。

IIS6中如果请求一个目录后面跟上参数时,会把这个参数传给默认文档,即如果请求我的博客首页http://www.xujiwei.cn/blog/?id=500,那么id=500将会传递给默认文档default.asp。利用这点就可以实现博客日志的永久链接了。当然了,这个永久链接是建立在博客目录不改变的情况下,如果目录改了,就需要另外处理了。

在ASP中可以利用Response.Redirect,其原理是服务器向客户端发送一个302 Object Moved的响应,然后客户端根据响应进行转向,但这个会增加额外的带宽开销,并且不利用搜索引擎收录,所以推荐使用Server.Transfer来转向。Server.Transfer则是直接停止当前脚本的执行,转而执行指定的脚本,并且当前的一些变量如会话等均可在新脚本里直接使用,而毋须再重新进行参数传递了,而Response.Redirect则不可以。

两种方法的另外一个比较明显的区别就是使用Response.Redirect客户端显示的URL会改变,而Server.Transfer则不会,使用Server.Transfer时客户端不会感到当前URL其实已经改变。其实这个区别也可以通过两种方法的调用方法来看出来,一个是Response.Redirect由客户端做出改变,而Server.Transfer则是由服务端做出改变。

了解了这些就可以开始做了,打开博客的默认文档,一般就是博客程序的首页,如default.asp、index.asp等,然后在其有输出内容之前加上以下代码:

<%IF Request.QueryString("id") Then Server.Transfer("article.asp")%>

当然了,article.asp是要根据博客程序来做相应改变的,id即为要做为永久链接时的参数,需要注意这个参数必须为article.asp所能识别的,即article.asp可以根据这个参数来显示日志,如果不行的话就要做相应的改变,即把article.asp中的参数名称改为id,或者把id改成其他名称。

ok,完成!其实这个东西是很简单的,这么大篇幅大都是废话,真正有用的就那么一句代码^_^。

在VB中用PictureBox实现图片的缩略图浏览

要写一个程序,涉及到缩略图的问题,原先准备用StretchBlt来实现的,后来找了下发现PictureBox的PaintPicture方法 也可以把图像按规定大小进行缩放,试了一下感觉PaintPicture的速度比StretchBlt快一些。

PaintPicture的 函数定义为:

Sub PaintPicture(Picture As IPictureDisp, X1 As Single, Y1 As Single, [Width1], [Height1], [X2], [Y2], [Width2], [Height2], [Opcode])

X1 和Y1是目标位置,Width1和Height1是目标大小,默认是PictureBox的大小,X2和Y2是源位置,Width2和Height2是源 大小,Opcode是操作方式,默认应该是vbSrcCopy,如果Width1、Height1和Width2、Height2的大小不一样则进行缩 放。

新建一个工程,设置Form1的ScaleMode为“3 - Pixel”,往窗体上放1个FileListBox控件名称为 File1,1个ImageList控件名称为ImageList1,2个PictureBox控件,一个名称为Picture1,AutoResize 为True,Visible为False,另外一个名称为Picture2,AutoRedraw为True,Visible为False,Width和 Height为128,1个ListView控件名称为ListView1,将图像列表中普通设置为ImageList1。

在窗体里添加如 下代码:

' 窗体载入时载入图像列表
Private Sub Form_Load()
Dim i As Long
For i = 0 To File1.ListCount - 1


阅读全文 »

如何解决Windows Vista中无法通过锐捷认证上网的问题

许多学校在寝室里上网都需要一个认证软件,连上内网之后才能通过VPN上外网,而在Windows Vista下面这些个软件可能工作不正常,从而在Windows Vista里不能上网。很不幸,我们学校就是其中这一。

寝室上网需要先用锐捷连上内网,再通过VPN连接外网。刚开始的时候,弄了半天,锐捷客户端硬是不能获取网卡信息,然后在Windows Vista里右下角的网络图标提示信息显示为“未识别的网络”,然后VPN拨号不可用。

在网上翻了一大会,终于给找到了解决办法,下面是步骤:

1. 下载并安装WinPcap v4.0 beta 2

貌似要装上这个才能获取网卡信息,天空下载地址:http://www.skycn.com/soft/11534.html

2. 下载VC7运行库

后面要用的一个软件需要用到VC7运行库,不过Windows Vista目前默认并没有带,所有需要另外下载。下载压缩包后解压,把里面的文件放到X:\Windows\System32中,其中X是Windows Vista所在的盘符。

msvcr71.dll:http://www.dll-files.com/dllindex/pop.php?msvcr71

msvcp71.dll:http://www.dll-files.com/dllindex/pop.php?msvcp71

mfc71.dll:http://www.dll-files.com/dllindex/pop.php?mfc71

3. 安装锐捷客户端

这步是在Widnows XP里上网也要用的^_^。

4. 下载Mento Supplicant

因为锐捷没有出Windows Vista的版本,而Windows Vista下注册表结构变了,所以锐捷客户端读不到网卡信息,从而不能链接,而这个程序就是用来解决这个问题的。下载压缩包后把解压出来的文件放到锐捷客户端根目录。

Mento Supplicant Screenshot

5. 最后的步骤

准备工作完成了,按正常步骤修改IP、网关、子网掩网及DNS服务器。在添加路由时需要注意,要在批处理文件上右击,选择“以管理员运行”,否则会出来权限不够的提示。因为锐捷不能获取网卡信息,要用第4步中的软件来代替锐捷进行第一次拨号,在拨号之前需要把“智能”选项卡的“启用智能重连”给去掉。用Mento连接上之后,就可以用VPN连接到公网了。

在用连接内网之前,需要关闭以太网的802.1x认证,如果没有无线网卡,默认在网卡属性页中是没有“认证”选项卡的,所以不需要改这个东西,如果想确定802.1x认证是关闭的话,可以通过Win+R打开“运行”对话框,然后在里面输入services.msc打开服务管理器,再找到Wire Autoconfig这个服务,将它启动即可,这样就能在网卡属性页中看到“认证”选项卡了。

至此,已经完美解决Windows Vista下在寝室里上网的问题了,不过玩了一个小时之后发现,除了卡点,还不如用Windows XP来得爽……

AJAX应用之草稿自动保存

相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突发情况下就能快速地恢复工作,免得写了半天的邮件眨眼之间就没有了。在学了AJAX之后,我也给自己的blog加上了这个功能。当然,这个应用并不只限于blog上,应该说还是比较通用的。

PS.为了开发的方便,我用了一个自己写的AJAX类,具体内容和下载在这里

演示地址

仍旧以代码加注释的方式来说明怎么编写。

首先是表单填写页面,用一个ID为AutoSaveMsg的DIV来显示返回信息,并且用一个ID为Draft_AutoSave的CheckBox来确定是否进行自动保存,然后将Textarea的ID命名为message。同时为了应对多用户同时使用的需要,加上用户名,每个用户的草稿分开保存。为了说明方便,我把一些修饰性的东西去掉,这样看起来比较明了:

  • AJAX应用之草稿自动保存<br />
  • <!-- 用户名默认为NONAME -->
  • 用户名:<input type="text" name="memName" id="memName" size="20" value="NONAME" />&nbsp;&nbsp;&nbsp;&nbsp;
  • <!-- 在自动保存选项的onclick事件中调用自动保存状态设置函数 -->
  • <input onclick="SetAutoSave();" type="checkbox" id="Draft_AutoSave" value="1" checked="true"  />自动保存?<br />
  • 内容:
  • <textarea id="message"></textarea><br />
  • <!-- AutoSaveMsg显示返回信息 -->
  • <div id="AutoSaveMsg"></div>
  • <input type="submit" value="提交内容" />&nbsp;&nbsp;
  • <!-- 调用函数恢复最后保存的草稿 -->


阅读全文 »