该是更新一下数码装备的时候了……

很早就许诺了要换手机了,但是由于工作到现在都比较挥霍,一直买不起=.=发现身边很多人都换手机了,心也有点痒,也想把手机换掉,然后再买个DC。

手机方面,我一向是Nokia的fan,其它品牌从来不看的。其实说白了手机最主要的用途是打电话和发短信,顶多再加个拍照,其它功能都是浮云,这样的话S40平台足够了,不过用了N年S40,总有点想换S60的冲动,但是S60的直板机大多键盘都很小,看不去不太好用,于是倾向于翻盖机,目前看好N76。高端机就算了,心有余而力不足=.=

DC方面,由于我那个不可思议、经常被BS的消费理念,DC可选的牌子只剩下为数不多的诸如Samsung和Kodak之流,虽然Kodak曾经是照相产业的龙头老大,不过它在DC方面的表现实在不怎么样,于是选了Samsung。由于我非常缺乏DC的知识,所以只比较了数字大小,选了Nv20,暂时就先这样吧……

这两个东东的价格都是2500+,接近3000的样子,目前的现金流刚刚好有点吃紧,唉,我忍,不就还有三周么,很快的=.=

没有最安全,只有更安全

目前木马和盗号在中国已经成为一种产业,据说世界上80%的木马出自中国。各种需要安全的网站纷纷采取了一些很恶心、BT的方法来防范木马。ActiveX插件就不说了,这个BT的东西造成了中国的网银无法用firefox访问。其它的最先看到的是工商银行的矩阵卡,它的实质是把密码的个数由一个变成了N个,从而造成盗号者收集数据的困难,但是这种方法并没有从本质上增加安全系数,WoW的密保卡很快被攻破,并产生了更牛的木马。而且矩阵卡大大降低了用户体验,与轻微的安全提升相比是得不偿失的。然后各大银行开始使用U盘,使得安全性上了一个台阶,但是用户成本也稍微提高了一些,而且如果有多个银行的账户的话,经常换U盘也不是一件方便的事。而且,U盘就真得安全么?

从网站的角度来说,目前能做到的最安全的手段也只有类似U盘一样外接硬件的技术了,估计很多公司都恨不得自己开发一个终端,然后扔给用户使用,保证没有病毒……

从用户的角度来说,其实防病毒的方法很多:

1、[简易]:装杀毒软件,定期升级、打补丁,不上乱七八糟的网站,不接收外来的可执行文件。

2、[中等]:在Administrator用户下把系统环境装好,然后切换到User账号下使用,可以确保系统目录的安全。

3、[困难]:有了病毒不要怕,手工删就是了。首先把可疑进程都关闭,然后把注册表启动项里的可疑项都删了,有一些可能无法关闭和删除,则重启然后重复上述操作,直到全删完为止。然后进Windows目录,把Windows目录和WindowsSystem32下的所有隐藏的和修改目期接近当前目期的exe和dll文件全删除。注:Windows下不会无缘无故附带隐藏文件,exe和dll也不会无缘无故修改自己。这样可以清除大多数病毒。

4、[终极]:格式化硬盘,重装系统,然后立即重复上述3条。

域名设置真麻烦

本来想把原来的bibtx.org的DNS直接设置到GoDaddy的server上,设置完之后,等了20几个小时,发现域名指向的IP一直在变,一会指向GoDaddy,一会指向原服务器,很郁闷,而且百思不得其解。后来偶然用whois查了一下bibtx.org,发现DNS列表里有4个服务器,前2个是原服务器的,后4个是GoDaddy的,于是明白了,由于代理商的缘故,前2个DNS应该是不能改的,太挫了。

后来想到域名转移到GoDaddy这里,GoDaddy要我提供一个Authorization Code的东西,查了一下中文叫“域名转移密码”,然后顺便发现网上有人说新网不提供域名转出服务,=.=,不就是个域名么,干啥这么想不开……

然后就重新注册了一个域名bibtx.com,然后在原来的空间做了重定向,暂时解决了这个问题。 大不了等bibtx.org到期了再在GoDaddy注册下,新网有必要做得这么挫么……

Javascript 学习心得

这几天做 Ajax,顺便研究了一下 Javascript,发现以前对 Javascript 是完全不了解=.=

总结如下(以下简称 Js):

1、Js 中没有 Class,只有 Function,一个 Function 可以看成一个类的构造函数,new Function 即 new Class。每个 Function 有一个对象prototype,new Function 的时候,自动把这个 Function 的 prototype 复制到新的对象中。

2、Function 中可以使用 this 关键字,指代的是包含这个 Function 的类,不过 this 是动态绑定的,比如

运行结果是 y。这种模式在 Lua 中见过,如果要让运行结果是 x,要对 x.a 做一个 Binder,显示指定 this 为 x,并调用 a.x.apply(obj, ...)。

3、Js 中没有继承,要实现继承的功能,有 N 种比较猥琐的方法。一种是在新的对象中放一个 base 指针,指向它的父类。还有一种是复制 prototype。不过看上去都很恶心。以前看过 Lua 中有一种继承的方法是做一个索引表,调用函数的时候查找它父类的函数,不过 Js 不支持运算符重载=.=

4、Js 中唯一的网络组件是 XMLHttpRequest,在 IE 7 和 Firefox 中可用,IE 6 要用 new ActiveXObject("Msxml2.XMLHTTP")。XMLHttpRequest 可以产生一个异步通讯的线程,是 Ajax 的主要工具之一。线程的管理依赖于浏览器,具体的说明可以看 Ray 的一篇文章

5、Js 中数值 0 等价于 false,也就是 if (0) {} 等价于 if (false) {},在写 Array.Contains 的时候总算明白了为什么 Lua 中 0 不等价于 false,因为 Array.Contains 可以返回 null 表示没有找到,而调用的时候可以写 If (obj.Contains(val)) {},而不用写 if (obj.Contains(val) != null){},但是 Js 中就只有写后一种了 =.=

6、Js 中有 delete 关键字,但不是用来进行垃圾回收的,只能用来在类中删除一个元素。垃圾回收是自动的。

7、Js 中有很多保留字(因为 ECMA 规范的缘故),比如 class,IE 7 会认为 var class = 0 是错误而停止执行。

8、Firefox 中的 String 重载了 [] 运算符,等价于 charAt,但这不是标准。

9、Js 和 Java 同宗,N 多相似的地方,比如 Date 中月份从 0 开始,0 表示一月;String 是不可变类;函数的命名和 Java 几乎完全相同。

10、Firefox 下不允许修改 Object.prototype,而 IE 下可以。

先写到这,以后再补……

WoW登录过程简介

登录过程采用SRP协议,具体版本细节不清楚,反正不是最新版。

相关记号:
    H ---- 单向Hash函数,WoW中用的是Sha1,Sha1生成的结果定长20字节
    N ---- 大素数,32字节
    g ---- N%(一个N的质因子),1字节
    C ---- 明文用户名
    P ---- 明文密码
    CP ---- C + ":" + P,+表示字符串连接
    s ---- 随机数
    x ---- 临时变量,x = H(s, H(CP))
    v ---- v = g ^ x
    a ---- 随机数,保存在客户端,不公开
    b ---- 随机数,保存在服务器,不公开
    A ---- A = g ^ a
    B ---- B = 3 * v + g ^ b
    u ---- u = H(A, B)
    S ---- 客户端:S = (B - 3 * g ^ x) ^ (a + u * x),服务器:S = (A * v ^ u) ^ b,都为32字节
    Key ---- 40字节,偶数字节为H(S的偶数字节),奇数字节为H(S的奇数字节),Key将用于以后的通讯加密
    M1 ---- M1 = H( H(N) xor H(g), H(C), s, A, B, Key )
    M2 ---- M2 = H( A, M1, Key)
    ^ ---- 幂运算
    xor ---- 异或运算
    % ---- 模运算
    所有运算结果都%N
   

登录过程(只包含正常的流程,错误检测忽略):
    0、服务器预先保存着N和g。
    1、客户端向服务器发送C。
    2、服务器根据C查找P。生成s、v、b、B,将B、g、N、s发送给客户端。
    3、客户端生成a、x、v、A、u、S、M1、M2,将A、M1发送给服务器。
    4、服务器生成S、Key、M1、M2,将M2发送给客户端。
    5、如果两边的M1和M2都一致,则登录成功。

Pick's Theorem

今天做到某题(POJ 2954),题意是求一个顶点坐标均为整数的三角型内整数点的个数,不含三角型边上的整数点。

Pick's Theorem,大意是:任何平面上顶点坐标均为整数的简单多边形,满足以下公式:

A = I + B / 2 - 1

A是多边形的面积,I是多边形内的整数点的个数,B是多边形边上整数点的个数。

Pick's Theorem可以推广到多维的情况,见:Ehrhart polynomials

理论和题目配合得相当完美……汗啊……