随着C++0x标准的确立,C++的标准库中也终于有了hash table这个东西。

很久以来,STL中都只提供<map>作为存放对应关系的容器,内部通常用红黑树实现,据说原因是二叉平衡树(如红黑树)的各种操作,插入、删除、查找等,都是稳定的时间复杂度,即O(log n);但是对于hash表来说,由于无法避免re-hash所带来的性能问题,即使大多数情况下hash表的性能非常好,但是re-hash所带来的不稳定性在当时是不能容忍的。

不过由于hash表的性能优势,它的使用面还是很广的,于是第三方的类库基本都提供了支持,比如MSVC中的<hash_map>和Boost中的<boost/unordered_map.hpp>。后来Boost的unordered_map被吸纳进了TR1 (C++ Technical Report 1),然后在C++0x中被最终定了标准。

于是我们现在就可以开心得写以下的代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <unordered_map>
 
int main()
{
    std::unordered_map<std::string, int> months;
    months["january"] = 31;
    months["february"] = 28;
    months["march"] = 31;
    months["april"] = 30;
    months["may"] = 31;
    months["june"] = 30;
    months["july"] = 31;
    months["august"] = 31;
    months["september"] = 30;
    months["october"] = 31;
    months["november"] = 30;
    months["december"] = 31;
    std::cout << "september -> " << months["september"] << std::endl;
    std::cout << "april     -> " << months["april"] << std::endl;
    std::cout << "december  -> " << months["december"] << std::endl;
    std::cout << "february  -> " << months["february"] << std::endl;
    return 0;
}
 

考试不会是一成不变的,为了所谓的公平和便捷,改革是经常发生的。以下是近一段时间已发生或将要发生的变化:

  1. 大路夜考。其实夜考已经存在了一段时间,只不过以前都是在白天,考试的时候开个大灯就算是夜考了。从7月中旬开始,真正的夜考开始了,时间是每天晚上6点开始,考试内容和白天的大路考一样。当然,由于夜间行驶的危险性,考官的指令可能会有所减少。
  2. 倒桩和小路结合。也就是两考并一考,一天内考完。及格线依然是80分,但是两考的分数是共享的,也就是两个项目总的扣分不能超过20分。由于倒桩的要领是慢,小路的部分项目要求一定的车速,改革后的考试对于教练和学员都是很大的挑战。
  3. 大路电子化。现在倒桩和小路的考试都是由电子设备来监控了,不久之后,大路也要引入电子设备。据说电子设备会自动给出指令,并监视学员的完成情况,在考官的辅助下完成打分。其中电子设备负责70%的分数,考官负责30%的分数。及格线还是80分不变,也就是说,考官想让你不及格很容易,但却没什么好办法把你拉上及格线……
祝大家好运……
 

在一个产品处于开发阶段的时候,工程人员通常使用一个开发代号来称呼它;而当这个产品即将发布时,销售人员会给它取一个容易接受的名字,即正式的产品名,以便把产品推销出去。有时候在产品发售之前,它的开发代号就泄露了出去,就会导致两个名字共存,给用户造成困惑。比如Windows Vista的开发代号是Longhorn(一种犄角很长的牛),如果你看到一种叫Windows Longhorn的产品,它实际上就是Windows Vista。

下面来看一下SQL Server各个版本的那些奇怪的开发代号:

SQL Server 6.5:Hydra,希腊神话中的九头蛇,被英雄赫拉克勒斯所杀。

SQL Server 7.0:Sphinx,斯芬克斯,希腊神话中狮身人面的怪物,就是那个问“是什么动物,早上四条腿走路,中午两条腿走路而晚上三条腿走路?”的家伙……

SQL Server 2000:Shiloh,希洛战役,又称匹兹堡登陆战,美国南北战争中的一场主要战役。(历史不好,没仔细研究)

SQL Server 2005:Yukon,育空河,位于加拿大的育空地区,在当地语言中有“大河”之意。

SQL Server 2008:Katmai,卡特迈火山,美国阿拉斯加南部的一座活火山,山顶海拔2047米。

SQL Server 2008 R2:Kilimanjaro,乞力马扎罗山,位于坦桑尼亚境内,非洲第一高山,海拔5895米。

SQL Server “Denali”(未正式发布):Denali,德纳利山,也在美国阿拉斯加境内,北美第一高山,海拔6194米。

从最近几个版本的命名来看,SQL Server有“越来越高”的趋势,不知道什么时候能到达喜马拉雅呀:P

 

之前提到过,Open()方法的第三个参数Async指定了XmlHttpRequest的通信模式是同步的,还是异步的。当使用异步模式通信的时候,Send()方法会立即返回,而不会等到加载完所有服务器发回的数据才返回。在异步模式下,我们可以通过注册XmlHttpRequest的OnReadyStateChange回调函数来获取它状态的变化,从而做出相应的操作。

来看下面的代码:

1
2
3
4
5
6
7
8
var xhr = NewXmlHttpRequest();
xhr.open("GET", "http://leonax.net", true);
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        alert("Status = " + xhr.status + ", ResponseText = " + xhr.responseText);
    }
}
xhr.send();

这段代码中,当xhr对象的readyState有变化时,xhr会自动调用它的onreadystatechange所对应的方法,也就是那个匿名方法。readyState的值从0到4,分别代表了XmlHttpRequest的5种状态:

  1. 未初始化(Open方法未被调用)
  2. 设置中(Open方法已调用,Send方法未调用)
  3. 设置完毕(Send方法已调用)
  4. 交互中(XmlHttpRequest正在和服务器通信)
  5. 完成(XmlHttpRequest已加载所有数据)

使用异步模式,我们就可以在加载服务器数据的同时,做一些其它的事情,比如显示一个进度条什么的,来提高用户体验。

 

现在的考试,倒桩和小路都是电子的,大路依然是人工的。看上去倒桩和小路的难度会小很多,至少对于我这个经常和计算机打交道的人来说。

倒桩的考试场是一个封闭的环境,每一时刻只会有一辆车在考试,关键的点和线上都会有红外线探测,一旦越界马上就不及格了。但其中也有例外,就是在移库的过程中,两个库当中那条线的探测仪会被关闭,车内会开启一个状态机,记录车子有两次前进和两次后退的过程,前进和后退是通过排档来判断的,据说换档过快会导致状态机失灵。在第二次后退完成之后,中线的探测仪会重新开启。熄火的检测据说是通过钥匙的转动来的,也就是钥匙转动一次,即使没有发动成功,也算是一次熄火。总体看来,倒桩的考试环境没有什么可以利用的地方。

小路的环境和倒桩不太一样,算是一个半开放的环境。当车子开到每个项目起始的地方时,车上的装置会和项目场地上的装置通讯,握手成功之后,才算开始考试。在单项考试过程的,这块场地应该是排外的,就是说如果有第二辆车靠近场地,那辆车应该接收不到开始考试的信号,所以考试的时候,要确保前车已经完成了这个项目,然后才能进入单项的场地。小路的项目多数很简单,用师傅传授的技巧,多数都可以顺利通过。当然,可利用的地方还是有的:

  • 直角弯和S弯的场地,越线是通过路边的“钉子”来判断的,钉子是一个个点,只要轮子不正面压在钉子上,比如从两个钉子之前穿过,是不会被扣分的;
  • 大饼和单边桥的场地,饼和桥下有传感器,不过由于经常被车压,应该不会很灵敏,稍微出点小问题不会被探测到,比如车轮碰到大饼但没有压上去,或者车轮在末端提前下桥等;
至于大路嘛,大家都懂的,现在市价是300元。我承认我挂了一次,但我不觉得没面子,因为同期的另一个学员,在有驾照(国外的)情况下,依然挂了。原因大家都懂的。在一个没有信仰的环境中,利益成了做事的唯一准则。
 

倒桩小路都是在练习,大路则是真刀真枪的实战了。

大路的考点有起步、直线行驶、转弯、调头和靠边停车。每一个步骤,师傅都会讲,只是动作比较多,有点麻烦。比如起步的时候,需要系安全带、调整座位和后视镜、打左转向灯、挂一档、松手刹,如果车在坡道上,还需要使用坡道起步的动作……考试的时候千万不能紧张……

和倒桩、小路不一样,大路考的环境和考点有关系,如果考点在市区,可能道路比较规整,但是红绿灯比较多;如果在郊区,道路比较奇怪,但红绿灯较少。各有利弊。反正考试之前,师傅肯定会带你在考点周围练上个几圈,一些难点会反复训练,考试基本没问题……

大路考的意义:

  • 起步、直线行驶、转弯、靠边停车:这些是上路之后必需的技巧,一定要掌握。
  • 调头:意义一般,在实际生活中,调头调不过去可以倒一下车,但是考试中不行……
在练车的时候,由于教练车只能开在低速道上,会需要经常地变道(因为低速道上经常有障碍物停着),会比较麻烦,拿到驾照之后,就没有这个烦恼了……
祝大家考试通过……
 

HTTP状态是HTTP/1.1标准的一部分,它用数字的形式表示了HTTP通信所碰到的问题,比如:

  • 200:成功,即没有碰到任何问题;
  • 301:目标永久转移,以后的HTTP请求可直接发往新的地址;
  • 307:目标暂时转移;
  • 401:未授权,可能需要提供帐号信息;
  • 403:禁止,服务器拒绝响应这个请求;
  • 404:目标未找到;
  • 500:服务器内部错误;
详细的HTTP状态可以参考Wikipedia
在使用XmlHttpRequest做HTTP通信的时候,可以通过下面的属性来获取HTTP状态:
Status
StatusText
Status表示了数字形式的HTTP状态,而StatusText则是字符串形式的。下面是一个例子:
1
2
3
4
5
6
7
var xhr = NewXmlHttpRequest();
xhr.open("GET", "http://leonax.net/", false);
xhr.send();
alert(xhr.status + " " + xhr.statusText);
xhr.open("GET", "http://leonax.net/PageNotFound/", false);
xhr.send();
alert(xhr.status + " " + xhr.statusText);

输出:

1
2
200 OK
404 Not Found

注意:在send()函数被调用之前,status和statusText是无法被访问的。

 

倒桩的难点在于后视,而小路的难点则是项目多。

小路一共有8个项目:侧方停车、坡道起步、单边桥、S弯、直角转弯、限速限宽门、连续通过障碍物、百米加减档。其中侧方停车和坡道起步是必考项目,剩下的项目里再随机抽一个,也就是一共考3个项目。

每个项目都有诀窍,这个师傅会讲,这里就不多说了。由于倒桩已经考过,侧方停车毫无压力。坡道起步略难,它需要熟练把握离合器和刹车之间的关系,刹车松得早了会溜车,晚了会熄火。剩下的项目中,个人觉得单边桥和连续通过障碍物(俗称“大饼”)最难,因为在车上看不到桥和饼,只能凭感觉。其它的项目,多开几圈熟了就没问题。

小路考的意义:

  • 侧方停车:和倒桩类似。
  • 坡道起步:在不平的路面上停车和起步。
  • 单边桥:个人觉得意义不大,现实生活中极少遇到这种情况,咱又不是住在山区……
  • S弯:莫非是方便在拥挤的道路上超车?
  • 直角转弯:没啥太大的意义
  • 限速限宽门:方便开进自动洗车装置?
  • 大饼:某同学说是,当大地震之后,方便绕开躺在地上的伤员-_-
  • 百米加减档:在路口快速起步,免得被后面的车辆“嘀”,不过它的技巧使得这个项目变得完全没有意义。
祝大家考试通过……
 

HTTP报头(HTTP Header)是HTTP通信时的一些元数据(Metadata),用来让服务器和客户端达成一些共识,比如客户端的版本、通信内容的格式等。

在使用XmlHttpRequest时,也可以设置或读取HTTP报头,这时可以使用

setRequestHeader方法 和 getResponseHeader方法

先来看setRequestHeader(header, value)方法,它可以用来设置所发出的数据包的报头,比如

1
setRequestHeader("Accept-Charset", "utf-8");

设置了Accept-Charset报头为UTF-8,也就是表明客户端支持UTF-8格式的内容,服务器为根据这个设置,来预处理响应的数据包。详细的HTTP报头的定义,可以参考RFC2616的第14节

和setRequestHeader相反,getResponseHeader(header)可用于查询服务器返回的数据包的报头:

1
var value = getResponsetHeader("Content-Encoding");

假设value的值是”gzip”,则说明服务器返回的内容,是使用gzip格式压缩的。

以下是一个样例:

1
2
3
4
5
6
7
8
9
10
var xhr = NewXmlHttpRequest();
xhr.open("GET", "http://leonax.net/", false);
//Pretend to be safari on iPhone
xhr.setRequestHeader("User-Agent", "Mozilla/5.0 (iPhone; U; us; CPU iPhone OS 4_2_1 like Mac OS X; us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5");
xhr.send();
alert("iPhone Content length = " + xhr.responseText.length);
xhr.open("GET", "http://leonax.net/", false);
//Pretend to be a normal browser on PC
xhr.send();
alert("IE Content length = " + xhr.responseText.length);

输出为:

1
2
iPhone Content length = 30317
IE Content length = 63729

这就说明http://leonax.net/在响应不用的客户端时,返回的数据不一样。

顺便提一下,还有一个方法是getAllResponseHeaders(),可用于获取服务器返回的数据包中所有的报头。

顺便再提一下,一些影响安全性的报头,如Referrer和Content-Length,是不能使用setRequestHeader来设置的。

 

这年头,什么都注重整合,整合有助于资源共享,减少不必要的损失。手机和笔记本也不例外。

以下是我想要的手机和笔记本套装,之所以称之为套装,是因为它们可以协同工作:

1. 两者可以通过某种方式连接

连接方式可以是无线(WIFI),也可以是有线;当然有线的更好,因为速度快。连接后,笔记本和手机之间可以共享数据。

2. 两者可以共享电力

主要是笔记本可以为手机充电,这样出门在外,带一个充电器就够了;在极端情况下,手机也可为笔记本充电。

3. 两者可以共享硬件资源

  • 笔记本可自动使用手机的无线通信功能,用户不需要主动设置无线AP,也可以防止无线路由被盗用。
  • 手机可置于笔记本的一侧,作为笔记本的小键盘、鼠标或者手写板;或者置于笔记本键盘和屏幕之间,作为笔记本的副屏幕(类似罗技的G19的设计);双屏幕的好处是,用户在进行全屏操作时(如玩游戏或看电影),不会被一些通知和提醒打断(如QQ消息)。
  • 笔记本中的应用程序可使用手机的部份硬件,如摄像头、GPS等,来增强笔记本的功能。

4. 两者可以共享软件数据

  • 手机可自动为笔记本作某些认证,如付款时的短信认证,或者以某个帐户登录,不需要用户额外的操作。
  • 手机和笔记本可以自动同步资料,如未看完的视频、文档等,方便用户随时切换所使用的设备。
希望不久的将来能有类似的产品出现……
© 2004 - 2011 Leona+Suffusion theme by Sayontan Sinha