decltype是个好东东

c++0x有了这个之后,SNIFAE变得异常地好用,比如这样:

struct select_operator
{
    template<class T>
    static    std::true_type test(decltype(((T*) 0)->operator()()) (*param)){return std::true_type();}
    template<class T>
    static    std::false_type test(…){return std::false_type();}
};

template<typename any>
int use_operator() {return 1;}
template<>
int use_operator<std::false_type>() {return 0;}

 

测试某个函数对象是否能接受期望的参数。这样写的好处在于即使存在多个函数重载也照样work。

Advertisements

我居然把鹅鹅鹅给修好了

我那部鹅鹅鹅买回来后半年就出现了短暂黑屏的情况,一开始的时候极为罕见,而且只在用电池的时候才出现,后来越来越严重,一黑就是几分钟,然后狂闪,还出现噪点、偏色、花屏等各种诡异的情况(也亏得老婆能忍那么久)。今天终于到了极限了:屏幕完全偏色,输出模糊扭动。于是把它大卸八块,先顺手给CPU上了硅脂,接着准备看看是不是屏线的问题,结果开机……它居然好了!

于是得到教训如下:

1. 以卵击石连硅脂都给的最差的货,一年不到就干了。

2. Intel的U现在要是过热的话,首先出状况的很可能是内置的显卡。看了一下data sheet,貌似有了内置显卡以后,intel的U的安全温度降低了许多啊。

 

总之过热这种事情真是好久没碰到了,其实自己修电脑的技能点也是好久没用过了,泪流满面啊。

关于驱动的一些笔记以及它是如何被安装的

Windows DDK总是让人看得头大。所以趁还没忘记之前赶紧来点笔记。各种错漏,请勿当真。

1. WDM已死,新版本的DDK里连example都抛弃之了。取代WDM的被称为KMDF模型(一个基于KMDF的驱动会创建WDM的设备对象),另外还有用户态的UMDF,然后统一到所谓的WDF框架下。于是同样一个内核驱动被搞出了两种写法:用WDF的和用WDM的。M$你丫快去死吧。

2. 按照设备堆栈的概念,驱动对象有三类:PDO,FDO,FilterDO,后两者其实可以看成同一类,只是主打和辅助的区别。但如果从(WDM)驱动模型来说,则是BUS Driver、Function Driver和Filter Driver,所以这里造成了不小的混乱:一个Function Driver当然主要负责管理一个FDO,Filter Driver负责FilterDO,那PDO呢?实际上一般地FDO也可以创建PDO,然后将这个PDO丢给系统去构成一个新的设备堆栈(包含一个且仅一个FDO以及零到多个FilterDO)。当然,创建PDO最多的还是Bus Driver(本质上也是Function Driver)

     另外Function Driver通常也会使用主/从的合作方式,也就是miniport模型

3. 安装一个驱动到底发生了什么事?以DDK里的kbfilter为例,大概有这么几件:

a.驱动文件复制到system32\driver下

b.在HKLM\SYSTEM\CurrentControlSet\Services下建立相关的项

    实际上做了这两步,驱动就已经安装好了。如果使用服务启动类型为BOOT_START之类就已经能在OS启动时让驱动加载到系统内了。

4. 不过对于一个用于PnP设备的驱动来说,驱动是在需要的时候才被加载的。所以还要有一些地方让设备找到相应的驱动。如果这是一个Filter Driver,那么它总是在设备(HKLM\SYSTEM\CurrentControlSet\Enum)或者设备类型(HKLM\SYSTEM\CurrentControlSet\Control\Class)下某个键的”upperfilter”或者”lowerfilter”项中被提到,用驱动的服务名。如果是Function Driver,那么应该是在设备键的”Service“项中。换句话说,我们甚至可以不用inf,直接把相应的值写进注册表里也有一样的效果。

5. 其实我还是没太搞清楚所谓的Device Setup Class是个啥玩意。貌似是一个设备如果属于某个class,那么设备类型键下相应的参数(比如指定的filter)就会被应用?顺带说一句,鼠标和键盘的class driver比如kbdclass也是个Filter Driver。

6. 诡异:在HW安装项里的AddReg命令,就算用0x10008的FLAG也不能把值添加到原有的值后面,而是直接取代了。这导致我写的filter驱动没法和原有的共存,最后不得不在AddReg里将两个驱动服务名都写进去才了事。

7. 驱动堆栈的逻辑信号的处理顺序和信号在对应物理设备中的顺序正好是相反的。比如一个从设备传递到OS的信号。物理信号是从设备 –> 总线,逻辑信号则是总线驱动 –> 设备驱动 –> 用户态。在设备树模型中,总线接近于根结点,单个设备是叶节点,”upper”的意义是远离总线。

所谓的中西合璧……

就是这种四不象的东西:黑椒高汤芡烩米粉,炒青椒,再加一块牛排。

这都是啥玩意啊!(翻桌

DSC02274

泰式菠萝饭

挖了一个菠萝,拿虾仁和一半的果肉炒的。

在超市看了一下泰式甜辣酱的成分:菠萝汁,葱和辣椒之类,觉得实在对不住价钱,于是自制了山寨的甜辣酱:番茄酱+桂林辣酱,再浇点菠萝果汁。233

成品效果如下图。

Hello World

不知不觉有半年多没写blog了……

这半年发生了很多事情那是一定的。不过今天的主题还是收敛在做菜上吧。

这个冬瓜炖排骨照得很不错,嗯,我没写错字。

终于知道chrome老是不发起连接的原因了

最近发现chrome经常出现一种古怪的情况,就是打开一个URL的时候一直等待,但实际上连connect都没干。而且此时打开其它任何URL都是这样。而同时如果使用隐身模式打开URL就正常。今天终于(貌似)找到了答案:

http://code.google.com/p/chromium/issues/detail?id=12066

“Previously, we had a limit of 6 connections per proxy server, which was horrifically low.
Connections to all endpoint hosts remains at 6.
Basically, we have a map of socket pools, keyed by the proxy server.
Each of these proxy socket pools has a socket limit of 15 and a connection limit per host of 6.
The main TCP socket pool (non-proxied) has the standard 256 socket limit, and connection limit per host of 6.
There are two maps currently, one for HTTP proxies and one for SOCKS proxies.
Note that SSL tunnels over HTTP CONNECTs are still located within the standard http proxy socket pools.
We depend on the fact that our code never returns a non-SSL connected socket to the pool for a |connection_group|
that is to a HTTPS endpoint.  A newly connected socket from the pool will only have the TCP connection done.  An
idle socket will have both the TCP and the HTTP CONNECT and the SSL handshake done for it.”

也就是说,chrome最多同时只有256个socket连接(不是半开socket,是已经建立的socket),同时(一个tab中?)连接同一个主机的socket不能超过6个。但假如使用代理(http或者sock都一样)的话,同时存在的socket就只有15个——到了现在的15.0版是32个,看about:net-internals就知道了。

哦顺便隐身模式和正常模式是使用独立的网络层实例的相互不会影响。所以通常窗口SB了的时候还是可以用隐身模式的窗口发起连接……

能像FF那样调整吗?google又一次充分表现了老大哥作风:不能!爱用用不用滚!

所以我真的只能滚到FF那边了么!中国的网络……全部socket都跑代理也一点不奇怪啊!!(摔

于是从今天起当一个坚定的狗黑!(摔max

———————————-12.1追加————————————

其实自作孽又不好好做功课不能怪别人:privoxy一早就有报告这个问题,并且因此把本地的keep-alive时间设置成5秒,强调只有确认浏览器能支持多连接的时候才设置到较大的值。而我是自己手贱把它设置成了120的(死