在Win2008上安装Live Mesh

Live Mesh蛮好用的,特别是不需要版本控制,只需要同步的时候。比如在家里写一份文档,没写完,想跑到公司继续写,又不高兴带U盘,这时候就可以用Live Mesh了-_-似乎Live Mesh就等于5GB的U盘……

今天尝试了一下在Windows 2008 Enterprise Server上装Live Mesh,一开始失败,说是"[80070659] This Installation is forbidden by system policy. Contact your system administrator (系统策略禁止此安装。 请与系统管理员联系)"。这个理由也太奇怪了。人家MSN好歹还明说,我们不支持Server版本,Mesh不给装,还赖System Policy-_-

后来搜了一下,发现解决方案是:

  • 打开Group Policy (gpedit.msc)
  • 进入Computer Configuration\ Administrative Templates\ Windows Components \ Windows Installer
  • 打开Disable Windows Installer
  • 选Enable,然后把下方的选项设置成Never

还真是Policy的问题。不过第一次碰到,其它的安装程序从来都没问题的,很诡异。

一道奥数题……

想起来前段时间某同学给我做的一道题目,很BT-_-

求(1 - 1/2 + 1/3 - 1/4 + ... - 1/48 + 1/49 - 1/50)/ (1/26 + 1/27 + 1/28 + ... + 1/49 + 1/50)的值。

用中文表述就是 1到50中所有的奇数的倒数和与所有的偶数的倒数和之差除以26到50的倒数和 -_-

一开始想通分,很快就放弃了;然后想到求和公式,google了一把,无解;再后来想到可以用微积分中的某种方法,可惜忘得差不多了-_-。

最后实在没办法,写了个程序求值,打算倒推。

求值的结果是1,很惊讶,然后就发现了其中的奥秘:

1 - 1/2 - 1/4 - 1/8 - 1/16 - 1/32 = 1/32
1/3 - 1/6 - 1/12 - 1/24 - 1/48 = 1/48
1/5 - 1/10 - 1/20 - 1/40 = 1/40
....

也就是把1到1/25里的所有带正号的项和它*(2^n)的项和并,得到一个正数,最终结果就是1/26 + ... + 1/50,很寒-_-

然后猜测这个公式( Sum(1/(a*2-1))(1<=a<=n) - Sum(1/(a*2))(1<=a<=n) ) / Sum(1/a) (n < a <=2*n) 对于所有的正整数a和n有效

后来某同学告诉我这是现在的小学奥数题……如果我有小孩,打死我都不让他学奥数-_-

C# 中重载相等运算符

运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过。在 C++ 里面,运算符重载可以写在类的外面,当 intellisense 不工作的时候,找到一个运算符的重载函数是一件相当头疼的事情。这个问题在 C# 中改善了不少,因为运算符重载一定要写在类内,而且 intellisense 很强大。不过另一个问题又产生了……

先来看 C++ 中的“==”重载:

上面这段代码中,由于声明的关系,a 和 b 永远不可能为 NULL,所以直接调用 a.x 和 b.x 是没有问题的。

而在 C# 中:

这段代码是没问题的,因为 A 是 struct,而 struct 不可能为 null。但换成 class 就有问题了,比如:

由于 reference type 可以为 null,所以要先检查 a 和 b 是不是 null,但是“a == null”这一句又会去调用“operator ==”,于是就无限递归下去了……想了很久都没想出来变通的方法,而且 System.String 的实现也很诡异:

看上去也会无限递归的(Reflector 出来的,不一定准),很神奇……

虽然对于 Referece type 不建议重载==,但是不建议并不代表不能用吧,这个设计太挫了……

XmlHttpRequest学习笔记 (2) 基本操作

XmlHttpRequest里面常用的函数和属性无非就这几个:

其中method的值多数为Get或者Post(不区分大小写)用于从服务器获取数据和向服务器发送数据,还有Head, Put, Delete之类的,基本不会用到;url是实际要访问的url地址,比如http://leonax.net;async的值为true或者false,表示是否要以异步模式(即非阻塞模式)进行通信;user和password为访问url所需的用户名和密码,一般都是省略掉的。

open函数只是初始化一下Xmlhttp对象,它并不会向url所对应的服务器发送数据。比较奇怪的是,W3C的规范中async的缺省值为true,也就是说,以下代码会以异步模式运行:

Msxml3和IE的XmlHttpRequest遵循了这一规范,而Msxml6中的缺省值为false。既然缺省值都为true,为什么不把参数名改成sync呢?在Javascript(以及各种脚本语言)中,缺省参数一般为null,而null和false等价,所以把缺省值定为true实在是太令人费解了。

真正把数据发出去的是这个函数。text可以是任何值,它会被当作数据包的正文发给服务器。

在open之前调用send会报错。

以异步模式open之后,send函数会立刻返回;相反,在同步模式的时候,它会等到接收完服务器所有的回应才返回。

responseText

这是一个属性,在收到服务器的回复之后,可以通过它来查看回复的正文部分。如:

将显示出一个很简易的Html :P。在未完全收到回复之前,responseText返回一个空字符串。

XmlHttpRequest学习笔记 (1) 创建

XmlHttpRequest是一个用于在网页中读取服务器数据的组件。最初是由微软开发用来访问Outlook Web Access 2000的。在目前流行的IE版本中都支持(从IE5到IE9),只不过问题是这个东东目前还没有成为标准(W3C正在讨论,只有一个draft可作参考),于是就有了万恶的浏览器兼容性的问题。常见的生成XmlHttpRequest对象的Javascript是这么写的:

在IE7之前,IE中的XmlHttpRequest组件都是由Msxml提供的。尽管Msxml目前有很多版本(从3.0到6.0都是被支持的),但只有3.0是从Win2000到Vista都带的,6.0只在XP SP3和Vista以之后的操作系统中有,而且3.0有个好处是创建的时候只要写"Msxml.Xmlhttp"即可,不用像6.0一样加上后缀的版本号。当然6.0在安全和性能方面都要比3.0好,大有取而代之的趋势。