“程序设计”目录存档

PHP没有ASP流行?

2010年11月18日,星期四

今天看到有人说PHP没有ASP流行,真是搞笑,自己去看看TIOBE的2010年11月编程语言排行榜吧,PHP排第四,ASP排第几?当然了,ASP不是一门语言,那么假设所有的JavaScript都拿去写ASP了罢,JavaScript的排名是第十一位,仍然在PHP之后,更何况至少有90%的JavaScript都是拿来写客户端脚本的。至于VBScript?排行榜上好像找不到VBScript的影子。

其实所谓流行什么的都是浮云,学得好用什么都一样。都说ASP效率比不上PHP,虽然这的确是事实,但是效率的高低和代码的好坏有直接的关系。一个ASP高手和一个PHP菜鸟(比如我)写出来的网站对比,你说哪个的性能好?正如D大(一个PHP高手)所说,JSP、PHP、ASP.NET没有优劣之分,关键看是谁在用。

曾经在一个群里,有一个人出了一个编程练习,大概的意思就是要写一个进程守护程序,当指定的进程意外结束的时候重启该进程。我说:“这用VBS脚本可以实现。”还没来得及写代码,就有人说:“就算要用脚本实现,也要用JS,VBS那么垃圾。”我问:“作为Windows下的脚本,JS和VBS有什么区别么?”他说:“JS是C语法,VBS是VB语法,所以JS比VBS好。”我说:“哦,那你就用不垃圾的JS写个程序实现这个进程守护程序给我看看吧。”他说:“我不会写,但是我知道JS比VBS强大。”

然后我就没有再说话,我还有什么话可说呢?

将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程序员了。

(更多…)