Archive for the ‘技术’ Category
When the DPC uses too much CPU
现在用联想的一个X200,最近发现CPU总是不闲着,用电池消耗的也特别快,用Process Explorer看了一下,报告说DPC占很多的CPU时间:
这个很不懂,要是一般的进程,杀掉就可以了,比如传说中的firefox就喜欢吃内存和CPU(其实很多时候是flash闹的),DPC叫 Deferred Procedure Call, 是Windows用来处理中断的玩意,这个东西咋办呢?
研究了一下发现 Windows DDK 的 tracelog 不错。 Windows DDK是驱动开发的工具包,其实我只要里面的一个tracelog.exe,和tracerpt.exe,网上找不到,害得我去当了最新的Windows DDK 7.0。参见这里:How much time is your driver spending in its DPCs and ISRs?
运行:
tracelog -start -f test01.etl -dpcisr -UsePerfCounter tracelog -stop tracerpt test01.etl -report d.txt -df
结果如下(节选):
DPC processor utilization for the whole trace +--------------------------------------------------------+ | Processor Utilization Module Address | +--------------------------------------------------------+ | 0 18.34% ntkrnlpa.exe 8050327A | | 1 0.00% ntkrnlpa.exe 8050327A | | 0 16.92% chdau32.sys A5CC2DC6 | | 1 0.00% chdau32.sys A5CC2DC6 |
ntkrnlpa.exe没啥好看的,windows kernel,看看chdau32.sys吧,在同一个文件中:
+--------------------------------------------------------------------------------+ | Distribution of chdau32.sys (A5CC2DC6) DPC execution times for the whole trace | +--------------------------------------------------------------------------------+ | Lower Bound Upper Bound Count Percent | +--------------------------------------------------------------------------------+ | 0 1 0 0.00% | ....... | 50 100 0 0.00% | | 100 250 0 0.00% | | 250 500 0 0.00% | | 500 1000 636 13.94% | | 1000 2500 3927 86.06% | +--------------------------------------------------------------------------------+ | 4563 100.00% | +--------------------------------------------------------------------------------+
这个肯定是有问题的,因为windows建议DPC的处理不能超过100ms,这个显然超过了很多,所以这就是罪魁祸首了。这个驱动属于Conexant 20561 SmartAudio HD, Disable掉这个驱动,果然CPU就没有人占用了!DPC也基本就是0了。
这个驱动别的地方没有,只有联想的网站上有,更新到最新的,还是不能解决这个问题,只好Disable他了。不过有趣的是,当我播放一点音乐或者弄点什么声音的时候,它的DPC处理就很好!真有意思……
另外还有两个工具,一个是DPC Latency Check的工具,这个工具显示目前系统的Latency,Latency高的系统播放电影、声音的时候就会产生不连贯的现象。我的系统默认就是黄色的!但是如果disable了Conexant 20561的该死的声卡,或者播放点音乐,它就变成绿色的了。
另外一个是微软的RATTv3,这个提供跟tracelog很类似的功能,不过结果不是很准确,也能弄出点结果来。而且,它还有GUI呢——一个Tray Icon.
世界上最流行的IMEI
IMEI是International Mobile Equipment Identity的意思。顾名思义,就是每个手机所拥有的一个识别号,中文大概叫串号。如网卡地址一样,IMEI号理论上应该是全球唯一的,我们挑手机的时候也会输入*#06#什么的去验证是不是三码合一。如果这样来说,怎么会有最流行的IMEI之说呢?很有趣的是,最近在一个运营商那里就见到了,这个IMEI号就是:135790246811220。为什么?这个号是著名的MTK芯片里面的Sample Code里写的一个IMEI号码,中国很多的山寨厂商都不遵守IMEI分配的规定,他们根本就不管这个是干什么的,就直接使用这个IMEI号,然后很多这样的手机就卖到了某个发展中国家,于是就给我们的软件带来了很多问题——我们一直默认IMEI是唯一的。
叫我怎么说山寨好呢?
推荐一下Balsamiq,很赞的UI草图设计软件
最近要开发一个J2EE的程序,做几个小页面,需要画几个原型。老板推荐了一个叫做Balsamiq的软件,不过是收费的,79$一个。好在”邪恶”的作者提供了一种免费获得注册码的办法,就是写一篇blog来介绍这个软件。
当然,我并不是想通过这种方式来获得注册码,因为我搞了一个反编译软件,偷偷的看了注册码是如何生成的。嗯,作者也很乖,连class的名字都叫KeyGenerator。于是我就给自己注册了一下,还真成功了。不过,这个软件真的很好用,画一个web页面的草图很容易,所以还是要推荐一下,就算是给自己补过吧。
这个软件是用Adobe AIR写的,跨平台性很好。这点Java真是没法比啊。
下面我画的两个草图,要是用word或者visio,也可以画,只是时间就海了去了。
当然,画Windows的界面也是没有问题。甚至,它还内置了IPhone的框架:
如何删除Add Remove Programs删不掉的程序
讨厌windows在c:\windows下放好多没用的东西,一个原因是总是ghost C盘,这样哪天洁癖发作或者被病毒搞了,直接ghost回来。于是就删删删,把C弄的比较小。经常删的或者挪地方的有:
- \pagefile.sys
- \hibernate.sys
- \MSOCache*
- \Windows目录下:
- $hg_mig$
- $NtUninstallKb*$
- Intaller
- ie7
- Driver Cache
- ServicePackFiles
- SoftwareDistribution\Download
- system32\dllcache
这样大概能删掉至少1G的东西。有的东西不能删的,就在d盘建一个目录,用junction.exe(大约等于unix下的ln,sysinternals suite里面有)把它link过来。比如据说$hg_mig$就不能随便删。否则,windows update据说会有问题。
Installer目录也不能随便搞——我就总是因为搞它出问题。一次是安装新版的live messenger,旧版的因为我把Installer目录下的msp文件删了,无法卸载,新的也就没法装。重新安装一会也不行。很抓狂。不过这不算什么,我们总是可以蛮力删文件,并且改注册表——反正messenger的注册表项不是很多。但是今天遇到了一个麻烦的事情,装了office 2k3的sp3,然后删掉了msocache,并且不小心把installer目录弄没了——我junction到D盘了,但是不知怎么的内容没有了。于是每次启动outlook,MSI installer都跳出来,然后说某个安装盘找不到blah blah,很是piss off。卸载,没戏。直接安装覆盖?还是没戏。蛮力卸载?MS Knowledge base里也有,只是太麻烦了。不过还好,有万能的google。微软提供了一个windows installer cleanup tool,这个可以在installer数据库里删除某个程序的安装信息,就当这个程序没装过一样,然后就可以重新安装这个程序了。如果想卸载,那也没有任何问题。很好,很强大。
Windows installer cleanup tool: http://support.microsoft.com/kb/290301
DKIM技术
前段时间看gmail的时候,发现邮件头上都有一个mailed by的字段,比如mailed by: yahoo.com,不知道这个东西是怎么来的,于是查看了一下整个header,发现有一个DKIM-Signature的字段,于是又去google了一下,了解到这个原来是一个新的标准,叫DKIM,定义在RFC4871里。它的功能是:让企业可通过密码对进出站的电子邮件进行签名,证实所发送邮件的真实性。
DKIM的全称是Domain Key Identified Mail(域名密钥识别邮件)。简单的说,就是发送邮件的服务器对邮件做签名,表示这个邮件的确是该服务器发送出去的。如果一个接收端能够验证这个签名,一定程度上表明这个邮件可能不是垃圾或者钓鱼邮件——原因是现在大多数的垃圾和钓鱼邮件都使用伪造的email地址。当然,这个技术不能单独解决问题,因为一个垃圾邮件发送者也可以自己做一个服务器来对发出的所有垃圾邮件签名。但是,由于邮件是签名的,我们就可以通过黑名单和白名单来进一步了解某个域名发出的邮件是否为垃圾邮件,甚至可以在网上维护一个域名的积分系统。
签名另外一个好处就是,DKIM提供一定的完整性(integrity)的保护,保证这个邮件在发送过程中没有收到篡改。
那么这个签名是怎么做的呢?基于公私钥的签名系统。发送者在服务器上生成一对RSA的key,私钥自己保存好,公钥放在DNS的TXT记录中,比如一个站点叫example.org,那么其DKIM的公钥通过_domainkey.example.org的TXT记录就可以查询到,这样接收方就很容易知道发送方的公钥了,也就可以验证这个签名。这个方案好的一点是,不需要一个第三方认证的CA——毕竟,每年通过CA签名一个证书也要好多钱。这也是DKIM跟以前的签名技术如S/MIME, PGP等不同的一个地方。当然,通过DNS的TXT记录也有其安全性问题,完全有人可以hack掉DNS,或者通过类似GFW的方法改变DNS查询的结果,但是DKIM只是一个辅助技术,是用来防范垃圾邮件的,并不是一个strong authentication system,如果真的对安全性要求那么高,就应该使用PGP之类的其他安全系统。
接下来的问题是,签名是如何加入邮件的呢?通过DKIM-Signature邮件头。这是符合邮件协议(RFC2822)规定的。这是跟其他签名方法又一个大不同之处,避免了任何不理解S/MIME的客户端把签名当成一个附件(比如gmail),或者把签名显示为一段跟内容没有关系的base64编码。接收方则根据DKIM-Signature头的内容来验证该签名。
一些签名的具体细节:
- 算法,必须支持rsa-sha256,可选支持rsa-sha1。key size建议1024。王小云老师在这里贡献不小。
- 标准化(Canonicalization). 有的邮件服务器可能会少量修改文件内容,比如换行或者移除一些空格等等。因此DKIM定义了两种标准化方法,simple和relaxed。simple最简单,就是一个字节也不能改,改了就错。relaxed就是可以少量的修改一些空格等等。邮件头和内容这两部分的标准化可以选择不同的方法,表示起来用/隔开,比如simple/relaxed表示头部用simple方式,内容用relaxed方式来标准化。
- 过程。签名是先对内容(body)部分hash,然后把这个body hash放在header里面,再对头部做签名。头部也不是所有字段都签名的,只有一些常用的字段,或者比较有意义的,会被签名。像Received和Return-Path这样的字段一般不被签名。而From则必须被签名。
差不多啦,来看个真实的DKIM头吧:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=gamma;
h=message-id:date:from:to:subject:mime-version:content-type;
bh=LKY45ARqaaOMfM6XOs6BBkYA44a4+H26qQdm9oC55X0=;
b=QhTXCrvIhk......XQbXhFl4Xk575ACw=
可以看到一个DKIM-Signature由一系列name=value的tag组成。其中:
- v=1表示版本1,将来要有新的版本,就扩展之。
- a=rsa-sha256,表示算法(algorithm)。这里用了rsa-sha256的算法。
- c=relaxed/relaxed,表示标准化方法(Canonicalization),头部和内容都用的relaxed方法。
- d=gmail.com,发送者的域名。
- s=gamma,表示域名的selector,通过这个selector,可以允许一个域名有多个public key,这样不同的server可以有不同的key。
- h=…,表示后面这些header是签名的一部分。
- bh=…,是body hash。也就是内容的hash。
- b=…,是header的签名。也就是把h=那个里面所有的字段及其值都取出来,外加DKIM-signature这个头(除了b=这个值,因为还不存在),一起hash一下,然后用rsa加密。
最后看一下如何获得上面这个例子的public key。对于s=gamma, 这个gmail服务器的public key存在gamma._domainkey.gmail.com的TXT字段里。在Linux上dig一下:
$ dig gamma._domainkey.gmail.com TXT ;; QUESTION SECTION: ;gamma._domainkey.gmail.com. IN TXT ;; ANSWER SECTION: gamma._domainkey.gmail.com. 300 IN TXT "k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3...DAQAB"
nslookup也是一样的:
C:\>nslookup > set q=txt > gamma._domainkey.gmail.com Non-authoritative answer: gamma._domainkey.gmail.com text = "k=rsa; t=y; p=MIGfMA0GCSqGSIb3.....AB"
其中的p=那一段就是public key了。
DKIM不能直接的解决垃圾邮件问题,但是随着使用DKIM技术的公司和软件越来越多,通过其他一些手段的辅助,迟早对我们解决问题会有很大的帮助的。
你部署了DKIM了没有?
加速windows xp的软件: eboostr
知道这个软件很久了,今天在CNBETA上看到,又搞了一个来玩玩,加速程序启动的效果还是不错的。
Vista的两个功能让我很感兴趣,一个是super prefetch,一个是ready boost。基本原理就是,1,把常用的文件缓存在内存里。2,使用U盘这种读取速度比硬盘快的设备来缓存常用文件。这样,启动一个程序的时候,如果能够从内存中或者速度比硬盘快的闪存中读取到需要的DLL,那么程序启动会快很多。
对于XP,有个公司做了一个程序eboostr,做类似的事情。他也可以把缓存放在内存,或者U盘(SD,MMC或者一切读速度比较快的设备)。搞了一个绿色版本,在这里。安装的要两步:第一,选择里面的inf文件,右键,选安装。第二,运行installservice.bat。然后重启就好了。运行eboostrCP.exe开始配置吧!不过这个软件正版只有39美元,条件合适的情况下还是应该买一下的。
我看,随着内存价格越来越大白菜化,将来我们应该可以直接把操作系统安装到内存,这样这些什么fetch都不需要了,再将来,我们要把OS装到CPU的L2 cache里面去……yeah…
Linux似乎不需要这样的东西,因为linux内核会把不用的内存用来做文件的缓存,这样,当第二次启动某个程序的时候,速度也是很快的。
Scrum project management tool: Mingle
最近打算练习一下scrum,就在网上找一些scrum的管理工具。找了很多免费的工具,比如xplanner, agile42什么的,都不是很好用。xplanner看起来就令人生厌。有一个Project Dune的,利用Google GWT做的一个应用,看起来还不错,但是安装了之后有好多问题,比如什么deadlock的问题,mysql无法访问的问题,而且我看他们对scrum的支持的screenshot也很简单,就放弃了。
收费的软件貌似很多,很容易搜索到,有versionone,mingle等等。mingle好像网上用的比较多,有一些中文网站推荐,去看了一下,5个人一下可以Evaluate一年,而且支持unix/linux,就试用了一把,感觉的确很不错。
Mingle的核心是卡片,所有的东西都是卡片,比如feature, story, task等等。卡片可以通过树状结构组织起来,就形成了需求分析阶段的features树,也可以是计划阶段的planning树。最后,树上的节点,对于mingle来说主要是story,会被投入到sprint当中去。team member可以自主的选择一个个的story去实现。我们用的时候觉得story有点大,把story又分了很多的task,这样一个人可以负责一个task。
它的强大在于,卡片是可以扩展的。它使用了一些类似BPM的概念。一个卡片本身不代表任何意思。然后我们通过给他添加property来指定他的属性。比如类型,开始日期,结束日期,工作量预计等等——可以理解为面向对象里面的属性。接下来还可以给卡片增加Transition,可以理解为方法。比如一个task在new状态的时候,加一个Take Task的transition,那么就可以把这个task的owner设为当前用户,把task的start date设为今天,把状态改为In Progress。
接下来mingle可以用不同的view来显示这些卡片,并且可以加上一些filter。只有满足某些条件的卡片才被显示。对于Product Backlog,其实就是一个针对Featurs树做的filter。Sprint Backlog则是针对planning树。
最后,他还支持一种MQL语言,一个简单的统计报表语言,用这个可以画出各种各样的breakdown图。另外,还内置了wiki的功能,每个卡片的描述都可以是一个wiki,可以详细的描述一个需求和实现细节等等。
总得来说,这是一个很不错的软件。当然,估计用ALBPM也可以实现,只是有点杀鸡用牛刀的感觉。我倒是觉得要是用GWT做这么一个东西,应该挺有意思的。
有一个简单的突破5个用户的方法,设定卡片的owner属性不是member list,而是指定的另外一个list,就可以了。这样所有人用一个用户登录,但是通过手动改动owner属性来做task的分配。
Java De-Obfuscation
public class koreanRedFox
{
public koreanRedFox(blueGrayGnatcatcher bluegraygnatcatcher)
{
bison = new HashMap();
deinonychus = “”;
purpleCappedLory = new HashMap();
misknow(bluegraygnatcatcher);
}
我也来说说Android
最近Android很火,也就是传说中的Google Phone (GPhone)了。它其实是一个手机平台,Google的雄心大概是要跟Symbian和Windows Mobile争夺手机,或者说是未来的个人通讯平台的市场。其实Symbian基本上不算是竞争对手,因为这个技术实在有些落后,过几年应该就要淘汰了,所以NOKIA也说,他们也考虑加入Android的联盟。据说微软很愤怒……
一个朋友要去Startup公司开发这个平台上的定制系统,以前在MOTO的Lead也去了;另外一个朋友在琢磨怎么利用Google的新API开发应用来赚钱;大家还都一起感叹,当年要是JUIX做好了,就是这个样子了,可惜moto执行力太差,太小气了,结果P都没搞出来。寂寞秋水也不甘寂寞,写了一片关于Android的blog。诧异的是,xfocus的tombkeeper,也写了一篇文章,从内核的角度探讨了Android的问题……
我也不能免俗,下了一个Android的SDK,启动了模拟器,并大概看了一些例子。模拟器看起来很不错的,看起来做到iPhone的效果一点也不难。他的Theme和Skin,大概还实现我们在moto做的功能——伤心啊。应用的UI主要是靠XML来写,有点类似Mozilla/Firefox的XUL,或者微软的XAML。国际化和动画也是用XML来写的,程序本身之用写event处理,就基本上差不多了,用Android的说法,叫Activity. 浏览器看起来也很不错,不知道嵌入的是个什么浏览器,访问html肯定没问题,不知道能不能支持web 2.0
不知道这种手机啥时候能上市。应该是挺好玩的,虽然,我也没觉得他比blackberry强太多,很多功能,可能我不会用的着吧……
Compiz and Beryl
这两个东西大概就是Linux的窗口管理器的扩展——我是这么理解的。装上之后,的确很炫,切换窗口之类的有Mac的感觉,窗口边缘也是那种半透明的,完全可以匹敌vista的效果。不过使用起来还是一样的麻烦,可能需要手动的改xorg.conf,而且配置所在的地方也比较混乱,后来在system/appearance里面有两个可以配置的地方。唉,被windows惯坏了啊。
点这里看compiz的screenshot。




