在命令行中以管理员权限启用应用程序

自从Vista带来了UAC之后,应用程序就变成了两种,有管理员权限的,和没有管理员权限的。一些老的应用程序会莫名其妙地出错,这时候就要考虑右击应用程序,然后“以管理员身份运行”。这还不是什么大问题,exe文件的右键菜单里都会有这个,但是对于一些脚本文件(cmd, js一类)来说,就没那么方便了。通常需要重新开一个带管理员权限的命令行窗口,然后打很多cd回到刚的文件夹,然后再运行脚本,相当麻烦。

搜了一下,找到一个解决办法。把下面的代码保存为Elevate.js:

以后要以管理员身份运行程序的时候,只要输入“Elevate <exefile> <arguments>”就可以了,比如“Elevate cmd /k”。

当然,这个逃不过UAC的检查,还是会有一个对话框弹出来要点“确定”的。

强大的批处理 (2) Fibonacci函数

小无聊一下,不过真的很强大……

输出是“Fib(10)=89”

强大的批处理 (1) 字符串截取

获取当前的小时数:

打印Windows的版本号:

在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 不建议重载==,但是不建议并不代表不能用吧,这个设计太挫了……