博文

目前显示的是 三月, 2010的博文

2010-03-31

长智齿,想去北大口腔医院拔牙. 惊喜的发现可以网上预约挂号.哗啦哗啦注册,然后找医生.发现,只有颌面外科专业(仅限拔牙)的那个科室下周二还有4个普通号。去其它各个科室转悠了一圈,早就什么都不剩了。 难道要我再忍一周? 得,不管3721,后天早上直接奔急诊去吧 但愿医保能报,据说这个医院拔个牙至少得5-6百。

对西厢的分析

对于这个项目的简介可见这里:http://code.google.com/p/scholarzhang/wiki
我的测试环境是基于ubuntu 9.10。kernel是2.6.31-20-generic。很失望的是,我并没成功。最终仅仅是偶尔能成功打开我要打开的网页。然后就开始抓包,看代码。
在没有西厢的情况下,正常流程如下:1 0.000000 192.168.0.101 74.86.123.131 TCP 36271 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=383657 TSER=0 WS=7
2 0.254851 74.86.123.131 192.168.0.101 TCP http > 36271 [SYN, ACK] Seq=0 Ack=1 Win=64672 Len=0 MSS=1460 TSV=1543589264 TSER=383657 WS=11
3 0.254936 192.168.0.101 74.86.123.131 TCP 36271 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=383682 TSER=1543589264
4 0.255126 192.168.0.101 74.86.123.131 HTTP GET / HTTP/1.0因为GET /开始就是http的协议里,里面包含Host和URL,根据这两个,就可以把IP斩断.此时防火墙向tcp连接的两端发RST协议。
从http server那边会看到这样的包
5 0.267683 74.86.123.131 192.168.0.101 TCP http > 36271 [RST, ACK] Seq=1 Ack=2261781716 Win=405504 Len=0
6 0.267745 74.86.123.131 192.168.0.101 TCP http > 36271 [RST, ACK] Seq=1461 Ack=2261781716 Win=405504 Len=0
7 0.…

终于把t-检验的事情搞明白了

也不是大学没学过,概率论与数理统计下册的假设检验那一章的一开始,最最基本的问题,参数假设检验中的数学期望检验问题,讲的就是这个。但是我当时看书的时候不仔细,只知道有这么一个方法,没看见末尾写了一句“这是t检验法”。昨天的计算结果没错。用Maple算t检验的时候,默认是不假设2个总体的方差一致,加上一个选项后,结果就和我算出来的一样了> data := [50, 200, 150, 400, 750, 400, 150];
> data2 := [150, 400, 720, 500, 930];> TwoSampleTTest(data, data2, 0, confidence = .95, equalvariances = true);
Standard T-Test on Two Samples (Equal Variances)
Null Hypothesis:
Sample drawn from populations with difference of means equal to 0
Alt. Hypothesis:
Sample drawn from population with difference of means not equal to 0Sample sizes: 7, 5
Sample means: 300, 540
Sample standard devs.: 238.048, 299.082
Difference in means: -240
Distribution: StudentT(10)
Computed statistic: -1.55163
Computed pvalue: 0.151797
Confidence interval: -584.6388844 .. 104.6388844
(difference of population means)看起来很复杂的东西,我们课本,就用了2页半的32K的纸,就把方差一致的t检验、不假设方差一致的t检验、配对t检验全讲完了。真是言简意赅啊

ministat && Student's t-test

一个基础问题: 假设两段代码实现了同一个功能,如何从实验的角度,证明其中一个比另一个效率高最简单的办法,把第一段代码运行m次,然后对运行时间求均值得到t1。然后把第一段代码运行n次,然后对运行时间求均值得到t2。比较t1和t2,如果有显著差别,那么小的获胜。这里存在一个问题,实验本身是有误差的,这个误差相比于|t1-t2|而言,可能使得我们的试验结果完全是无意义的。FreeBSD从8.0开始把一个叫做ministat的工具作为base system的一部分发布。这个工具从5.2开始就有了,但是未得到足够的重视。从man手册引一段话过来:“The ministat command was written by Poul-Henning Kamp out of frustration over all the bogus benchmark claims made by people with no understanding of the importance of uncertainty and statistics.”我也属于“with no understanding of the importance of uncertainty and statistics”的人之一。大学里学过4章数学统计,但老师基本一带而过,而我主要靠考试前一天晚上的3小时读完2本书,so…T分布我学过:假设ζ、z是相互独立的随机变量,其中ζ服从N(0,1)的正态分布,z服从自由度为n的χ2分布,则t=ζ/\sqrt(z/n)称为自由度为n的T分布。ministat用的是two sample T-test。但是我没弄明白T分布和T-test之间的关系。我手头没有书讲的有T-test。我用ministat给的样本数据按照http://www.chem.uoa.gr/applets/AppletTtest/Appl_Ttest2.html这个网页上所说的公式算出了experimental t value=1.551633540,它的自由度是5+7-2=10,按表格来看,95%的置信度下10个自由度的t的理论值是1.812,实验值大于理论值,所以假设成立,即均值不存在显著差异。用maple的计算结果如下:> TwoSampleTTest(data, data2, 0, confiden…

2010-3-16

突然想找一些小的,比较有趣的kernel来学习,兴趣是被HelenOS引起的。可惜用户文档和学术paper都很缺,大大挡住了我的热情。delphij的一封邮件让我陷入一番深思:假设两段代码实现了同一个功能,如何从实验的角度,证明其中一个比另一个效率高?

又发现一个好东西:graphviz

以前在doxygen里面看见它用dot,还不知道它到底是什么东西。因为最近在学习图算法,在写测试用例,一直想,如果运算的结果能以图形的方式显示出来就好了,很便于人工检查。本来发现自己写一个,翻了些文档才发现,这里面的算法还是蛮高深的,要考虑很多因素。然后就找到了graphviz,是AT&T的人做的。把graphviz的渲染引擎换成cairo之后,输出的png图片显示效果非常清晰。更为有趣的是canviz,它是由html5/javascript实现的一个类似于graphviz的东西,趁此机会让我这个土鳖见识到<canvas>标签的强大。回归本行。你说,html5、<canvas>大面积用到web game上,还需要多久?我觉得就ie6的市场占有率来看,就算ie9比较完美的支持html5,而这种支持不能以Service Pack的方式出现在ie6/7/8上的话,主流网站是不敢用html5的。所以新项目暂时还是不会考虑它吧。

要在kernel中实现c++ exception真不容易

最近想在kernel mode增加exception的支持,发现真不容易。网上所说的链接-lsupc++的方法貌似已经不行了。这个库依赖的外部符号特别多。我只知道与异常有关的主要的实现都在libgcc_eh.a里面。但是又不清楚它具体提供了什么,还差什么。
用c++写kernel/driver,唯一吸引人的就是template/destructor了。不能用异常,不能用rtti,使用全局变量的时候还要倍加小心它有没有非平凡的默认构造函数。new/delete也得自己去实现,没有一个stl的实现能够很容易的被移植进来。真晕~~
今天先去睡了,下一步准备自己改改libstdc++的编译脚本,看能不能去除一些依赖

placement new 真危险

#include <iostream>#include <string>#include <stdlib.h>usingstd::string; intmain(int argc,char* argv[]){ setlocale(LC_ALL,""); char* buf=(char*)malloc(sizeof(std::string)*2); std::string* s=new (buf) std::string(); s->append("hello"); s->~string(); //delete s;free(buf); return0; } 如果去掉using std::string,上面的代码该怎么写?

qemu的gdb stub很不好用

今天我把apt源中的qemu 0.11删了,换成自己编译的qemu 0.12.3
上次想直接用qemu启动kernel(不带任何virtual disk),结果总是报找不到multiboot.bin。今天自己编译的没有这个问题。但是它的gdb stub很不好用。我下了断点,总是断不下来。堆栈信息一团糟,找不到函数边界,连disassemble都不行。
(gdb) disassemble $rip
No function contains specified address.
无奈

你的手机充一次电能放多久?

我的那个用了很多年的650,充满放那,已经一个多月了。现在还有电我们小组有2个treo 650。上个月初我换了n900,他换了G2。相比而下,策划的同事中,任何一个女的,都比程序有钱。今天我看到了G5。我羡慕左手一个n97mini右手一个nds,还顺手又买一个psp go的人。oh 不,我最羡慕的是那个自己买车的。