2010年11月 存档

将WMI中的DateTime类型转换成VBS时间

2010年11月17日,星期三

WMI中的DateTime数据类型保存的时间格式是UTC,与VBS中的时间类型不同。

有两种方法可以转换,一种是自己写个函数解析:

Function WMIDateStringToDate(DateTime)
    WMIDateStringToDate = _
    CDate(Mid(DateTime, 5, 2) &_
    "/" &_
    Mid(DateTime, 7, 2) &_
    "/" &_
    Left(DateTime, 4) &_
    " " &_
    Mid (DateTime, 9, 2) &_
    ":" &_
    Mid(DateTime, 11, 2) &_
    ":" &_
    Mid(DateTime, 13, 2))
End Function

另一种是使用SWbemDateTime对象

Function WMIDateStringToDate(DateTime)
   Set WbemDateTime = _
   CreateObject("WbemScripting.SWbemDateTime")
   WbemDateTime.Value = DateTime
   WMIDateStringToDate = WbemDateTime.GetVarDate()
End Function

参考链接:It’s About Time (Oh, and About Dates, Too)

VBS实现GB2312转Unicode

2010年11月9日,星期二

今天写了一个类似于下面的程序:

Dim http
Set http = CreateObject("msxml2.xmlhttp")
http.open "GET","http://www.sina.com.cn/",False
http.send
WScript.Echo http.responseText

但是却发现返回的中文都是乱码,看了一下发现新浪的编码竟然是gb2312的,汗,现在都是utf-8编码的时代了。responseText对utf-8编码支持得很好,但是如果是gb2312编码就会返回乱码,有时甚至会报错。无奈,只好用responseBody然后自己转码。

Dim http
Set http = CreateObject("msxml2.xmlhttp")
http.open "GET","http://www.sina.com.cn/",False
http.send
WScript.Echo GB2312ToUnicode(http.responseBody)

(更多…)

爱因斯坦带来的悖论

2010年11月7日,星期日

今天文科物理课上的一个问题:

一列静止长度为10米的火车,A站在车的后部,B站在车的前部。当列车以0.6C(C为光速)的速度通过一个站台的时候,站台上的人看到A先向B开枪,过了12.5纳秒,B也向A开枪。问在火车上的乘客看到谁先开枪。

物理问题就不在这里讨论了,写个程序算一下:

var t = (function() {
    var c = 3e8;      //光速
    var v = 0.6 * c;  //火车速度
    var l = 10;       //火车长度
    var t = 12.5e-9;  //地面坐标系上的时间间隔
    var y = Math.sqrt(1 - Math.pow(v/c,2)); //伽马因子的倒数
    //洛伦兹变换,返回火车坐标系中的时间间隔
    return (y * t - (v / Math.pow(c,2) * l)) * 1e9;
})();
WScript.Echo(t);

得到的结果是-10纳秒,也就是说,在火车上的乘客看来,是B先向A开枪。

爱因斯坦告诉我们,一切都是相对的,同一个事件,在不同的人看来可能是不一样的。你觉得我是错的,我觉得你是错的,其实我们都没有错,只是我们的标准不一样。

编程语言又何尝不是如此,我觉得C好,你觉得C++好,他觉得Java好,只不过是我们的标准不同,又何必去争论到底哪个最好?

引用《Perl高级编程》中的一句话结尾:

早在COBOL流行的时候,人类就已经登上了月球,可见如果不是把精力花在争论语言的孰优孰劣的话,就可以做很多事情。

JavaScript中的闭包(closures)

2010年11月6日,星期六

今天有个不明真相的同学跟我说JavaScript很简单,我顿时感到压力很大。曾经我也是这么认为的,直到有一天无意中看了一下JQuery的源码,才发现我根本不懂JavaScript。正如《说说掌握JavaScript语言的思想前提》里所说:

大部分人对JavaScript的高级应用不甚了解,已有的知识架构里会认为JavaScript仅仅是一门脚本语言,其作用是给页面做一些锦上添花的效果,比如表单验证等等。潜意识里也就不会用面向对象的思想去编写JavaScript代码,也很少会去深入了解prototype, context, scope chains, closures等概念。

任何一门语言,无论它多么简单,都不是一天两天就能掌握的,无论是VBScript,还是JavaScript,抑或是其他。才学了几天就说JavaScript很简单,这只能显得你很肤浅。懂得基本的语法,并不等于懂得这门语言。

《JavaScript The Definitive Guide, 5th Edition》里有段话:

Closures are an interesting and powerful technique. Although they are not commonly used in day-to-day JavaScript programming, it is still worth working to understand them. If you understand closures, you understand the scope chain and function call objects, and can truly call yourself an advanced JavaScript programmer.

闭包是一种有趣而强大的技术。虽然它们在日常的JavaScript编程中不经常使用,但是依然值得你去了解它们。如果你理解了闭包、作用域链和函数的call对象,那么你就可以真正自称为高级JavaScript程序员了。

(更多…)

VBS里的变量名和标识符(Identifiers)

2010年11月5日,星期五

标识符可以简单的认为就是类名、变量名和过程名。

VBS其实存在两种标识符:

  1. 普通标识符(NORMALIDENTIFIER)
  2. 中括号标识符(BRACKETIDENTIFIER)

但是我看过的VBS书籍上都只讲了普通标识符,没有讲中括号标识符。

普通标识符的规则我们已经很熟悉了:

  • 第一个字符必须是字母。
  • 后面的字符可以是字母、数字和下划线(_)
  • 长度不能超过 255 个字符
  • 不能是VBS保留的关键字

中括号标识符的规则更简单:

  • 中括号括起来的任意Unicode字符(换行、回车和NULL除外)
  • 长度不能超过 255 个字符(可以是0个,不包括中括号)

有了中括号标识符,就可以用任意字符来做变量名了,包括VBS保留字

Dim [if],[昵称]
[if] = "Hello world"
[昵称] = "Demon"
WScript.Echo [if]
WScript.Echo [昵称]

这样给变量或者函数命名的时候就可以使用中文了,看起来比较牛逼。

参考链接:VBScript Trivia: Bracket Identifiers and Reserved Word Incompatibilities