博文

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

学车总结

今天拿到了驾照(C1),很Happy。我在dfss学的,总结一下:优点:1、收费很透明。一次交清。没有教练对我吃拿卡要。并且补考不交钱。2、学校环境不错。今天我休息的时候我在那里看了好一阵黑天鹅,还有好多鸽子,还有孔雀。3、约车的时候服务态度很好。教练的态度也很好,不打不辱骂。4、考完当天拿本。5、学车的时候都是单人单车。所以开的时间长,车感好。6、不想去就可以不去。考试记得去就行了。缺点:1、约车太难。我有天早上,拨了1000多次电话都没约上车。当时十分火大。足足1000多次啊!2、教练会想方设法克扣训练时间。比如约6个小时,实际最多在路上跑5个小时。吃饭、加油、洗车、修车,这些都是我的训练时间。3、科目训练的时候,只讲考试,不讲实际。只会在教练场作弊对点,出来就啥都不会。当拿到驾照后没几个敢真的上路开,没关系,学校早就准备好了让你加钱继续学的陪练课程。4、普通班比别的驾校贵15%左右。贵宾班之类的更是贵的离谱。5、据说得罪人了,现在通过率只有60%。比如今天教练给我说,他每天带6个学员,早上3,下午3,每天大约过3个,挂3个。6、车太多,场地不够大。训练场里天天堵车,尤其是收车的时候,以及在实际考试场地训练的时候。比如我学压井盖的时候,一小时压一次。为啥呢?因为其它时间都在排队。不过这个也算优点,因为我真的不怕堵车了。外路考试的时候我还盼望堵车呢,不堵车的话,100米内从5档减速到1档,我真不会!堵车就好办了,直接停车,再换档。

2011-03-28

本周三要考驾照,听教练说现在刚改了,通过率从90%降为60%。路考,听天由命吧。周日去怀柔,爬箭扣野长城。偏偏是我组织,偏偏我没有任何户外经验,唯一去过的就是箭扣。我现在越想越后怕。而且我犯了一大忌,同去的人员混杂,1/3都是我不认识没见过的。我再一次发挥了我的专业特长,从搜索引擎搜集资料,然后写规划写方案,就差做个PPT了。我这周的主要工作是调整2个接入层交换机的vlan及IP设置。我感觉就跟去工地拉两车砖没啥区别的活,但是依然也是要先写PPT。我现在都恨不得写个程序让它搜集网络拓扑信息自动生成PPT。

非易失性内存资料笔记

最近查了一下关于非易失性内存的资料,做了点笔记在此:NVM: non-volatile memory,非易失性内存。
PCM(PRAM): Phase-change Random Access memory,相变存储器。非易失性内存的一种,利用存储单元的可逆的相变来存储信息。可擦写的CD/DVD一直在用这种技术。目前主流技术是采用氧族元素(元素周期表上“氧”那一列)做的合金,一般采用的是锗、锑、碲合金(简称GST)。这种合金在常温下有两种状态,一种是不规则、无序的,具有较高的电阻(非晶态);另一种是高度有序的,具有较低的电阻(晶态)。通过电脉冲局部集中加热的方式在这两种之间切换。和RAM一样,相变存储器是按位读写的。相比于Flash技术,相变存储器不需要单独的擦除步骤。读取延迟大约在50-100纳秒左右,写入延迟大约是几毫秒。PCM对运行环境的温度要求很敏感,一般工作在0-70摄氏度之间。MRAM:magnetic random access memory,磁阻随机存取内存
STT-MRAM: spin-transfer-torque magnetic RAM。实验室阶段,尚无产品。
ReRAM(RRAM): Resistive random-access memory 可变电阻式存储器ECC(error correcting circuits):对于BCH编码,从k位的数据中纠正t个错误,至少需要t * ceil (log2k) + 1个校验位。ECC采用标准的Hamming码再多加一位parity bit,于是可以检测一位及两位错误,并纠正一位错误。现在主要是采用64+8,即72位一组,其中64位是数据,8位是校验。ECC是为DRAM设计的,对于Flash、NVM等,应考虑其它的方案。至少在有一点上有根本的不同,DRAM的错误一般都是临时性的,而FLASH、PCM等都是永久的。fusionIO octal:MLC Nand,如果是纯512B的单位,IOPS 大约1百万左右。以64 kB的单元读写,读的带宽是6GB/s,写入带宽4.4GB/s。访问延迟30微秒。容量5.12T。PCM需要程序做一些改进:
1、写之前先读,只写被修改的位
2、每行前面加一个标志位。称为颠倒位。假如为1,代表其它的位是0-1颠倒的。

HMAC及基于密码的身份认证协议的一些杂谈

昨天有个朋友给我打电话,询问网络协议设计中的安全性问题。他在做一套C/S结构的应用软件,有以下需求
1、Client在与Server建立连接后,首先需要进行身份认证,只有身份认证通过后,才允许发送其它数据。
2、身份认证过程应当尽可能高效、安全。这里的安全不仅指防窃听防重放等,还包括防止服务器被DDos。
3、身份认证过程之后,所有的消息交互必须加密,并且传输中要防止被篡改。反正我要发给他的东西也没什么私密的,就干脆写这里了。
在信息安全领域,数据的保密性和完整性是两个不同的目标。
要达到保密性,选择合适的加密算法对数据加密即可。总的来说,加密算法分为对称加密和不对称加密。对称加密就是加密和解密采用同样的密钥同样的算法,不是对称加密算法的就是不对称加密算法。典型的对称加密算法有:DES\2DES\3DES、IDEA、AES、RC4\RC5\RC6、BLOWFISH、TWOFISH。不对称加密算法有:RSA、DSA。由于不对称加密解密要比对称的复杂且慢,所以一般来说密钥交换阶段可能会采用不对称加密,而通信数据加密主要还是用对称加密。加密算法未必能同时保证数据完整。
下面举个例子说明这个问题:假如设计一种简单的查表加密算法,将0-255重新排列得到数组unsigned char seckey[255]。将原文的每个字节作为下标去seckey里查得到密文。这是一种有效的加密算法,但是不能保证数据完整性。例如将密文截去几个字节,接收方是不知道有人动了手脚的。出于程序员的思维,为了保证数据完整性,最简单的方法就是加个checksum呗。例如CRC32或者奇偶校验位这样的技术。但是从安全需求来说这样做也不行,因为奇偶校验位也可能被篡改啊。所以需要专业点的东西,Message Authentication Codes(MAC)就是为了完整性而设计的。MAC由两个算法组成,签名和校验。假设为Sign(k,x)和Ver(k,x),其中k是共享密钥,x是待签名的数据。传输数据时将原始数据(x)和签名(Sign(k,x)的结果)一起发送,接收方用Ver(k,x)函数验证完整性。所以这两个函数应满足Ver(k,Sign(k,x))=true。假设用E(k,x)表示加密函数,Sign(k',x)表示签名函数,保密性和完整性我都想要,那么就存在一个问题,先签名还是先加密?
1、先加密后签名:令y=…

2011-03-25

我只能说我最近被比较深的震惊了。前几天回了一趟W公司,我说我前几天去听百度的讲座,讲他们在mysql server和client之间架了一个proxy做水平切分,以处理那些单表几十亿条的大表。没想到被嗤之以鼻,几十亿条算多吗,分什么分?然后了解了一下那边的情况,我发现我实在是太out了。有一个项目已经做了差不多有3年,可是当它刚开始做的时候,和现在相比,公司所采购的那些服务器,硬件处理能力已经提升了至少8倍以上。这还不是最可怕的,我觉得最可怕的是硬件技术对软件行业所带来的一些革命性的更新。网游行业有个陋习,一帮水平奇菜无比的人特别喜欢用C/C++并且喜欢自己写内存池,自己搞一套malloc/free替代原来的。我记得在W公司的论坛上有人还拿他写的malloc/free出来show过,我没回复。我只想说,你从一开始,方向就是错的。如果你打算自己搞一套高效的malloc/free方案,至少得先明白什么是NUMA,否则一切都是扯淡。而现在存储技术已经有极大的提升。在Flash尚未普及的时候,下一代存储已经准备商用了。总之我们需要的是更低的访问延迟、更高的带宽。而现在的情况是,我们惊讶的发现,哇撒,数据库的瓶颈居然不是在硬件上,居然大部分时间都是花在了CPU计算和等待上? kernel的IO scheduler必须被重写,bdb的mpool和logs都可以砍掉了?可惜我现在所处的公司,硬件非常匮乏,我只能看看paper发发牢骚。处于目前这样的情况,我觉得我还是不要去研究数据库。就像中医一样,没前途的。倒是FAST-11的有几篇paper我觉得我该转给攀攀看看,如果他有兴趣做dbv2.h的话。

还是内存的问题,我不知道怎么限制内存使用量

最近几天一直在看如何限制mysql最多使用多少内存。首先是Linux的setrlimit函数,可以限制的有:RLIMIT_AS:地址空间的大小。RLIMIT_DATA:数据段的大小(已初始化数据,未初始化数据和堆)RLIMIT_MEMLOCK:被mlock/mlockall/map的MAP_LOCKED锁住的内存的总计大小RLIMIT_RSS :废弃。RLIMIT_STACK:栈的最大大小。我拿RLIMIT_STACK测试了一下,代码如下:#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/resource.h>intmain(){ pthread_attr_t attr; size_t stacksize; struct rlimit rlim; pthread_attr_init(&attr); if(pthread_attr_getstacksize(&attr, &stacksize)!=0){ printf("get stacksize fail\n"); } getrlimit(RLIMIT_STACK, &rlim); printf("%zd\n", (size_t) rlim.rlim_cur); printf("%zd\n", stacksize); pthread_attr_destroy(&attr); sleep(1000000); return0; } Linux下,如果rlimit设置成unlimited,那么该线程的栈大小是2M(这个在pthread_create(3)中有说明)。否则,栈的初始大小由rlimit决定。opensolaris下,rlimit的值和初始栈大小之间我没看出来明显的联系。在solaris下,没有用于增长栈的函数。每个进程初始的栈大小是一个page,系统给栈预留大概20M的地址空间。当栈增长超过1个page的时候,OS捕获这个page error,然后给它分配新的物…

网游开发中的持续部署问题

图片
在做《梦幻诛仙》的时候,曾有那么一段时间我虽名为主程序但实际不过是一个发版本的。互联网公司的人可能难以想象,一个项目,就为了发版本,完完全全占去了3-4个全职员工。我若不是自己写了大量自动化脚本,我的境地会更凄惨。09年和上海的同事一起吃饭的时候,说起svn merge的事情,得知他们的主程序也是在全职干这个,为这个占去了绝大多数时间。就我观察而言,程序员大多数都是自我中心的,除非他是架构师他是主程序,否则他根本不会考虑他的行为会对项目发布进度造成什么影响。策划完全不懂软件工程,虽然他们指挥着一个高达4000多人月的大项目。而我的软件工程理论是在高中时自学的,泪奔……那时候的教科书是90s年写的,哪有什么敏捷开发、持续集成啊。我们来看网游的开发模式是怎样?三四个人凑一起,拿着一个想法,迅速做出一个能演示的demo给领导看,然后立项,拉更多的人进来一起干。在后续的开发过程中,程序的整体框架不会做改动,只是策划不停的提新需求,然后不停的往里添新模块。然后编译,发给策划测试。然后策划给反馈BUG以及新的功能需求。《梦幻诛仙》在上线之后依然很长的一段时间内保持着一周4次的发布频率,发布周期之短令人乍舌。每次发版本都拖到下班以后加班才能完成,每天早上上班第一件事"SVN UP"然后立马有人吼:"TMD,谁提的代码,编不过"。你想,一大早起来,兴致勃勃的想干活但是发现代码编不过于是只能嘬着咖啡等着别人改代码再提交多沮丧啊!遇上脾气不好的,就开始吵了。这矛盾的核心是,Trunk到底是什么,它有多稳定?最初,他们完全不懂SVN的分支怎么用。一年后,形成两派观点。一派是希望每人一个分支,每次有新功能就新开分支,稳定后合并到trunk上,每次发布都是从trunk上发代码(先提交到分支上后merge到trunk上)。我是另一个观点,所有人都在Trunk上工作,我根据项目发布需求新开分支并把bug fix合并过去(先提交到trunk后merge到其它分支)。无论是哪种方案,最终的目标是要能随时发布,所以用于发布的分支的代码一定要是稳定的,随时可以编译的,随时可以跑完所有自动化测试的。我经常会遇见这样的情况,谁谁新写的代码因为缺这个缺那个导致服务器起不来(很可能代码是没问题的,但是策划数据还没到位)。所以新加的功能最好是能做成开关项,这就要求模块化要…

如何在Linux下做好资源限制?

假设我现在想开个公司对外提供网站托管服务,比如万网、hostmonster这样的,如何做好资源限制以免一个用户把整个机器的资源全占了?我需要统计每个用户用了多少硬盘(这个容易)、多少内存、多少CPU、多少网络带宽,并加以限制。这里说的用户就是OS中的一个user。我只知道一些很老的工具,比如chroot、setrlimit、fs quota,他们只能部分的解决我的问题。就拿CPU来说,setrlimit是限制了这个进程最多只能用多少秒,对于MySQL/apache这样的daemon进程,你说我填多少合适呢?我希望它一直跑下去,但是又不想由一个进程把所有CPU一直全占满。比如对于MySQL我想限制一个查询的最长执行时间为多少毫秒。我在想,假如MySQL只有MyISAM表的话,Filesystem snapshot和flush tables with readlock配合起来做备份,非常棒啊。对服务的影响降低到了最低(否则就得单开一个slave专门做备份)。可为啥没怎么听说谁在这么用呢?我最近正在搜集关于如何提高MySQL安全性的资料,整理好了之后发上来。

从Linux被翻译成“你牛叉”说起

在上个月,Debian中文社区还在激烈的争论到底该给debian取个什么样的中文名字。这个月,突然跳出来一个叫沈卓斌(jobinson99@gmail.com )的人把debian wiki的中文首页给改了(http://wiki.debian.org/zh_CN/FrontPage),他于3月4日把该页面上的debian单词换成了“蝶变”,之后又给配了一张很古典的梁祝化蝶图。10多天之后这件事情才被debian社区广泛关注。3月5日凌晨,沈卓斌大幅汉化了维基百科上的Debian页面(http://zh.wikipedia.org/wiki/Debian)。主要就是把Debian翻译成“蝶变”以及Linux翻译成“你牛叉”。过了一天,被人回滚了。同时,在archLinux等开放性wiki上发生了类似的事情。这件事情引起我关注,是在Freebsdchina.org。3月10日,沈卓斌在freebsdchina.org的wiki上把很多英文单词翻译成了中文。某些是恰当的,大家可以接受的,例如FAQ –> 常见问题指南,China Community –> 中国社区。某些是翻译不充分的,例如在http://wiki.freebsdchina.org/howto/i/installbsd页面中,“ACPI”被翻译成“电源管理”,但ACPI其实是高级配置和电源管理接口,直接翻译成电源管理可能被误认为是FreeBSD的APM。CPU被翻译成了芯片,但是CPU的中文名称是中央处理器,只能算芯片的一种吧? ssh被翻译成“远程安全连接”和“安全远程连接”。Ports这个多年来在FreeBSD官方中文文档中一直未被翻译的词被简单的翻译成了“软件”。某些是引起了极大争议的,例如committer->委员、Linux->你牛叉、jails->囧境。摘一段他所做的让人哭笑不得的翻译:“Q:FreeBSD 是你牛叉的一种吧?A:不是。尽管很多你牛叉和开源系统的站点(尤其是咱们中国的站点)将FreeBSD放在你牛叉分类当中,但是从各方面来说,FreeBSD与你牛叉差异显著。最明显的区别就是授权许可不同,你牛叉发行版通常使用GPL,FreeBSD使用的是BSD授权协议。 ”此外他还略微补充了“FreeBSD系统桌面环境配置指南”页面中关于中文字体的描述。他修订了…

MySQL的密码hash算法

MySQL的身份认证协议是一种CHAP协议,即,挑战应答。S->C : public_seedC->S: username, replyS->C: Ok or error对于4.1及以后版本,public_seed是随机生的20个可打印的ASCII字符然后客户端这么计算reply:
passphrase=sha1("password")
storedhash=sha1(passphrase)
reply=xor(passphrase, sha1(public_seed,storedhash)其中storedhash即是服务器存在数据库中的hash过的密码。然后服务器在收到reply后这么对比:先从数据库中根据username查到storedhash。然后计算passphrase。原理是xor是可逆的。
passphrase=xor(reply, sha1(public_seed,storedhash))然后对passphrase做sha1,和storedhash做二进制比较
sha1(passphrase)==storedhash求懂安全协议的童鞋评价下上述协议。

mysql_install_db这个脚本在windows下是有问题的!

Linux下,装完之后在script目录下有一个mysql_install_db.sh,windows下,如果从源代码安装,装完之后在script目录下有一个mysql_install_db.pl。首先我不明白为什么非要用bash和perl两种语言各写一遍,是为了防止某些Linux下没有装perl解释器吗?最大的问题是mysql_install_db.pl是个半成品,bugs.mysql.com上面有很多关于它的BUG。在Linux下,mysql_install_db.sh会执行3个脚本,fill_help_tables.sql,mysql_system_tables.sql和mysql_system_tables_data.sql。而在Windows下,十分可笑的事情是,它在perl里面定义了这三个变量,但是fill_system_tables这个变量后面没有被引用:my $fill_help_tables = "$pkgdatadir/fill_help_tables.sql";my $create_system_tables = "$pkgdatadir/mysql_system_tables.sql";my $fill_system_tables = "$pkgdatadir/mysql_system_tables_data.sql";它在执行完mysql_system_tables.sql就告诉我说能用了,然后我就去登录,死活进不去。我开debug,查日志,在sql/sql_acl.cc的acl_load函数中发现这些表都是空的。然后去查mysql_install_db.pl的代码,发现这个问题。我的mysql的版本号是5.5.9。我特意从网上重新下了一遍代码,发现还是如此。然后google之,发现别人也遇到这个问题了。然后我去bugs.mysql.com上提交了一个BUG,http://bugs.mysql.com/bug.php?id=60384 你说这算bug还算是feature request呢? 如果这玩意儿不能用,那你在手册里清楚的注出来啊,我去手工执行那些sql语句就行了啊,我就不至于费这么大周折才找到原因。

qt真悲剧

刚看到消息,nokia将qt的商业授权与服务业务出售给了Digia,从此,qt部门不再是nokia的盈利部门。尤其是从事qt技术支持服务的员工,要么转给digia,要么会被裁掉。我只是觉得 nokia 这么做完全是情理之中,因为qt对它来说已经没有什么意义。wp7不可能支持qt,而symbian已经是明日黄花,在meego项目上,nokia与intel几乎已经决裂。上周的消息,Valtteri Halla已经离开nokia而加入intel。meego的官网上是这么介绍他的:"MeeGo project will be led Imad Sousou (imad.sousou@intel.com) and Valtteri Halla (valtteri.halla@nokia.com).”眼看着iOS和Android的如火如荼,QT开发者完全插不进脚去。唉,所以说QT很悲剧。我觉得nokia真是乱搞。maemo上的hildon搞了那么多年,最后因为是基于GTK而不是QT的,就这么白搞了。这么才一年的功夫,qt也不要了。干脆微软把nokia收了算了。

windows live messenger 2011 代理设置的BUG

我发现我在公司无法上msn,因为我们公司上网需要设置代理,但是根据我抓包看,windows live messenger没识别我的代理设置。后来在网上找到了答案, "set your proxy configuration manually but check ‘Automatically detect settings’ too.” 不仅要手动设置代理,还要把上面那个“自动配置”里面的“自动监测设置”也勾上。

2011-03-06

今天去软件所参加了豆瓣上组织的一个《web安全沙龙》,主讲人是是完美时空就职的安全专家cnbird,信息部的杨宁。主办方(不是cnbird)在会议结束时再三强调说虽然这个会议不收钱但也不是完全免费的,要求每人回去写一篇blog。那么我就按照我的经历从头说起。豆瓣上说的活动开始时间是下午一点,我和我两个大学舍友约了一同前往,他们都准时到了,而我很可耻的又迟到了。等我到的时候已经1点47,但是会议还没开始。大家都在阳台上聊天,像是在等某人。然后我就端着水杯,和同学叙旧。期间听见杨宁说他在完美时空干的很爽,令我很是羡慕。据我所知,完美时空信息部的待遇还是相当给力的,请参见水木上去年完美时空招聘php程序员的帖子。等到快2点的时候,我说,要么我们先进去吧,占个位子,省得一会儿站着。结果被旁边的人听见了,他们先进去了。orz……我成了最后进去的。四处找凳子,隔壁的阿姨一个劲的埋怨,你们到底多少人啊!坐下之后,先是所里领导讲话。给我们介绍什么什么,反正我走神了。在玩sina微博,发现我关注的人中有一个人也在场,然后就问他在哪。然后过了一阵子,我发现我左手的人一直在拿着ipad上sina微博,并且我仿佛看见了我的id。并且他拿着iphone4。联想到前一段时间联通刚向该公司“赠送”过iphone4,我就问他是不是cy。一问,果然是。我认识他,可他不认识我。因为他04年就去公司了,一直从事安全方面的工作。每个新员工进去之后都要找他开权限,我为了RSA的动态口令卡的问题麻烦过他好多次。但是该公司人来人往,流动性太大,他早就不记得我了。cnbird大约从2点半左右开始讲他的PPT。此次PPT的内容还是很有原创性的,讲了3个他自己如何入侵其他网站的实例,其中某个现在尚未修补的。不过这些东西我并不怎么感兴趣。你告诉我那有个smaba服务器没设置密码,对公网放开访问。那又如何?是教育我不要犯同类的错误吗?我希望你能介绍一些批量扫描工具啊,让我把我们内部的服务器统统检查一遍看看有没有这个问题?再比如XSS这件事情,cy用两句话就简明扼要的给我了答案:“1、不要让cookie被xss偷走。2、检查referer页”。这就是我关心。对于安全漏洞,我不是很关心如何利用,而是想去分析它的代码,指出为什么会有这样的漏洞。比如我之前在我的blog中分析过mysql 4.0的password bypass…

用LDAP查找mysql ?

用mysql replication做HA的时候都会遇到一个问题,就是迁移怎么办?比如Master挂了,一个slave被提成Master,那么client怎么知道新Master的IP、端口呢?我一个很自然的想法就是LDAP,或者搞个比它更简单的能完成名字-〉IP的映射即可。假如协议只选用TCP,连接MySQL需要提供这么4个基本参数:IP、端口号、用户名、密码。因为mysql认证协议很不安全,所以基本上都部署在内网,而内网IP是很富裕的,所以完全可以让每个MySQL分一个IP,都监听在3306。那么只需要完成name –> IP 的映射就足够了。这么一说,所有人自然想到的就是DNS,并且mysql reference manual中推荐的也是DNS,童剑最初用的也是DNS。但我觉得DNS的cache是很一个难控制的东西。我的想法是用LDAP,或者自己做一个更简单的。完成两个功能:1、注册IP到名字2、根据IP查名字而且这玩意儿效率不必很高。客户端应该做个缓存,缓存中没有的时候才去查。如果是从缓存中读的信息,并且连接失败,那么清掉缓存中这条记录。然后重查重连。那么这其中就有2个问题:1、连错了怎么办?因为缓存是旧的,所以虽然连上了,但实际是连上了另一台MySQL。 我觉得这个问题很简单,在部署的时候保证所有的mysql server的server-id都是不重复的。尤其是对于网游这样的应用,这一点很容易做到。迁移的时候连配置文件一起迁移,于是保证server-id不变。如果自己有能力改mysql client库,那么就改一下,在连接之前必须设置server-id参数,在接收到服务器发来的第一个包(hello packet)的时候,检查server-id,不正确则断掉。如果自己没能力改mysql的代码,那么把自己的应用层代码包装下,在连接建立后,手动调用mysql api检查下server id。如果有5个slave,坏了一个,变成四个?木关系,就按前面说的这套逻辑走。client不是拿着server –id去找ldap要ip、端口号。而是拿着serverid + server group id去查信息。如果这个server-id对应的有机器,那么就告诉它。如果没有,就根据server groupid 查这个server group有哪些IP,server-id…