Monthly Archives: February 2010

学生时代最后一个假期的来与回

2010年2月的寒假是我学生时代的最后一个假期。就是这样一个假期,从北京到沈阳,从沈阳到北京都非常的不顺利。

1月26号那天凌晨开始肚子疼,然后开始发烧,早上非常口渴但是宿舍里一点水都没有了。六点起来勉强坚持着找了一会儿水,没有找到,由于头晕浑身无力,又继续上床睡觉。八点多的时候实在坚持不住了,挣扎趴起来去超市买水。就这一趟,回来就已经气喘吁吁,在凳子上休息了半个多小时。然后开始断断续续的收拾东西,一直到十一点多打车出发。在车上也是一直睡觉。

虽然从北京到沈阳身体很虚弱,但是路上还算顺利。比起从沈阳到北京那是顺利多了。车是2月24号晚上5:42的D8。2月24号晚上4:50,由于沈阳在下大雨,坐五姑的车到北站。路上堵车,到北站勉强赶上车。在跑向进站口的途中还一脚踏进水坑而且差点摔倒,还把脚崴了,虽然不是很严重。好不容易上车了,没想到车开了一个半小时就停下了,在距离锦州南7公里的地方停下了,这一停就是三个小时。这个时候还算好,大家都还以为怎么12点以前也能到北京了。9:40的时候车开了。过了锦州南没多远,车又停了。列车长也完全不公布消息,我们也不知道到底是因为什么停下来,和列车员们都在做什么,广播只是一句道歉,然后什么都没有了。到晚上1点多的时候,车厢没电了,车厢内一篇黑暗,而且相应的空调也没了,厕所也由于没电,失去了冲水功能,已经不能再使用了。乘客们在车上只能饥寒交迫的等待,而且车厢还是倾斜的停在路上了。乘客们还是有吃的不敢吃有水不敢喝,因为没地方上厕所。车厢周围都是荒山野岭,地基很高,而且在下雨,很滑,不可能下车。这时乘客们都怒了,把列车长大骂一顿,列车长也承认是车出现故障了,在修,在调别的车头过来。

好像是三点多的时候吧,来车头了,但是没走多远有停下来了,因为车头马力不足,拉不动16节动车,遇到一个缓坡还需要先后退,然后冲刺上去。好不容易蹭到了葫芦岛,送上来了很多水和饼干香肠,又过了一个多小时,大马力的车头也挂上了。到早上9点的时候终于到了秦皇岛。这时候车厢里的人都很虚弱了,基本都在睡觉。之后还算顺利,车头一直一普快的速度拉着动车向北京行驶。期间一个女的发飙了,大骂列车长,骂了个狗血喷头。想想列车长也挺不容易的,三十多岁的女的,忙活了一个通宵,还得挨骂,还不能还嘴,虽然她有责任,没有及时向大家通报车的情况,但是这么骂确实有点过了,都挺不容易的。

25号中午12点,本应该4小时的车程的动车经过18小时,晚点14小时终于停在北京站了。乘客们都不下车了,要求有所赔偿。列车长又是被攻击的对象。后来听说列车长大哭一通,然后晕倒了,真是挺可怜的,bless吧。下午1:30,听说给每个乘客返还差价20元,乘客肯定是不同意的。但是我也没看到谈判成功的希望,就先走了,后边就不知道怎么解决了。

回到宿舍头晕,睡眠不足,腰疼,可能是在车上坐的也可能是在家成天在电脑前坐的,反正很不舒服。今晚早点睡,好好睡一觉吧。

以后可不要再遇到这种情况了。

计算机体系结构量化研究方法学习笔记 #1

第1章 计算机设计基础

1.1 介绍

  1. 计算机的快速发展主要得益于两方面:计算机制造技术的发展和计算机设计的革新。
  2. RISC计算机的设计者主要关注两个影响性能的关键技术:对指令级并行的利用(instruction-level parallelism)和对缓存的利用。
  3. 从2002年开始,处理器每年性能增幅降到了20%左右,主要有三个原因:气冷散热的局限,指令级并行处理利用空间的减小和基本不变的内存延迟(memory latency)
  4. 指令级并行并不需要程序员的参与,编译器和硬件会隐式的处理;但是线程级并行和数据级并行需要程序员显式的编写并行代码。

1.2 计算机的分类

  1. 桌面计算。市场最大,看中性价比。
  2. 服务器。看中可靠性、scalability和吞吐量。
  3. 嵌入式计算机。增长最快的市场,关注实时性和低内存、能源消耗。

1.3 计算机体系结构的定义

指令集结构(Instruction Set Architecture, ISA)

  1. Class of ISA(ISA的种类)——几乎当今的ISA都是通用寄存器结构(general-purpose register architecture),操作数即可以是一个寄存器也可以是一个内存地址。这个结构分为两个版本,一种是像80×86那样的寄存器-内存版本(register-memory),访问内存可以当作是指令的一个部分;另外一种是像MIPS那样的读取-存储版本(load-store),只能使用load/store指令来访问内存。最近的ISA都是load-store的。
  2. Memory addressing(内存寻址)——80×86和MIPS都使用字节地址来访问操作数。
  3. Addressing modes(寻址方式)——MIPS的寻址方式有寄存器寻址,立即寻址和位移寻址(常量偏移加寄存器中的基址形成地址)
  4. Types and size of operands(操作数的类型和大小)——MIPS和80×86支持8bit(ASCII character), 16bit(Unicode character of half word), 32bit(integer or word), 64bit(double word or long integer), 32bit floating point(single precision and 64bit floating point(double precision).
  5. Operations(操作)——一般的操作种类包括数据传输、数学逻辑、控制和浮点数。
  6. Control flow instructions(控制流指令)——几乎所有的ISA,包括MIPS和80×86都支持条件分支、无条件跳转、过程调用和返回。都使用PC-relative addressing,即分支地址由在PC上加一个地址域来形成。MIPS的条件分支测试寄存器的内容,而80×86条件寄存器的对应的比特位,这个比特位作为逻辑/算数操作的副作用被设置。MIPS的过程调用把返回地址放在寄存器中,而80×86把返回地址放在内存栈中。
  7. Encoding an ISA(ISA编码)——有两种基本的编码方式:定长和变长。所有的MIPS指令都是32bit长,这样简化了译码过程。80×86使用的是变长编码,指令长度在1到18bit之间。

The Rest of Computer Architecture: Designing the Organization and Hardware to Meet Goals and Functional Requirements

  • 计算机的实现包含两个方面:组织和硬件。
  • 术语组织(Organization)包含计算机设计的高层面,比如存储系统,内存内部交互和CPU设计。比如AMD Opteron 64和Intel Pentium 4都实现了x86指令集,但是它们拥有非常不同的组织,流水线设计和缓存设计等。
  • 硬件(Hardware) refers to the specifics of a computer, including the detailed logic design and the packaging technology of the computer.比如Pentium 4 和Mobile Pentium 4几乎一样,但是拥有不同的时钟频率和不同的内存系统。
  • 在本书中,词组“体系结构”(architecture)包含计算机设计的所有三个方面:指令集结构,组织和硬件
  • 计算机设计要满足功能需求,同时要考虑价格,功率,性能和可用性等目标。

1.4 技术趋势

四个实现方面的技术的快速发展,对现代的实现是至关重要的:

  1. 集成电路逻辑技术(Integrated circuit logic technology)。芯片上晶体管数量每年增长40% – 55%。
  2. 半导体DRAM(Semiconductor DRAM)的容量每年大概增加40%,每两年翻一番。
  3. 磁盘技术(Magnetic disk technology)。
  4. 网络技术(Network technology)。网络性能依赖于交换机的性能和交换系统的性能(transmission system)。

虽然技术的变化是连续的,但是它们的影响却是离散的。

性能趋势:Bandwidth over Latency

带宽或者吞吐量是在给定时间内完成的工作总量;延时或者反应时间是从事件开始到完成的间隔。Bandwidth的发展比Latency快很多。(Latency improved about 10X while bandwidth improve about 100X to 1000X.)一个简单的法则是,bandwidth的增长速度至少是latency增长的平方。

Scaling of Transistor Performance and Wires

  • Integrated circuit processes are characterized by the feature size, which is the minimum size of a transistor or a wire in either the x or y dimension.
  • The density of transistor increases quadraticallly with a linear decrease in feature size.
  • To a first approximation, transistor performance impreoves linearly with decreasing feature size.(性能的增长和feature size的减少大致是线性关系)
  • Wire delay scales poorly compared to transistor performance.

1.5 集成电路的功耗趋势

  • The power required per transistor is propotional to the product of the load capacitance of the transistor, the square of the voltage, and the frequency of switching, with watts being the unit:
Power(dynamic) = 1 / 2 X Capacitive load X Voltage^2 X Frequency switched
Energy(dynamic) = Capacitive load X Voltage^2
  • Dynamic power and energy are greatly reduced by lowering the voltage. For a fixed task, slowing clock rate reduces power, but not energy.
  • The limit os air cooling have led to exploration of multiple processors on a chip running at lower voltages and clock rates.

1.6 成本趋势

时间,产量和商品化竞争都会让成本降低。

芯片面积减小,芯片的成本降低。面积减小n,成本减小n的平方(大概)

nctwit开发笔记

经过近20天折腾(2010.01.30 – 2010.02.16),之前一篇文章中的构想,一个基于ncurses的twitter客户端终于完成了,达到了基本可用的程度,代码不到4k行,虽然还很混乱和不完善,不过也算是一个阶段性成果。功能和使用说明如下:

  1. nctwit是一个基于ncurses的终端下的twitter客户端。支持自定义API,支持SOCKS5代理(暂不支持HTTP代理,主要因为本人没有这个需求)。需要libncursesw,libxml2,libcurl支持和相应的开发包。
  2. 支持基本的twitter功能,如更新时间线,发表、回复、回推(旧时retweet,暂不支持官方retweet功能),设置/取消收藏,发direct消息,查看follower和firend,删除消息和direct消息,用颜色区分已读(绿色)消息和未读消息(红色),显示消息时间和来源,显示in reply to信息。不支持多用户,不自动更新时间线。
  3. 具有类似vi和KBS的按键绑定:q退出,j/k(或上下剪头)上下移动查看消息,h/l(或左右剪头)左右移动查看不同时间线,u更新,r回复,t回推,d发direct消息,D删除消息,m设置/取消设置收藏,R更新时间线,f全部已读,0回到开头,$到末尾,N下一页,P上一页,ctrl+l重绘屏幕。
  4. 调用$EDITOR环境变量来编辑消息,如果$EDITOR是空默认使用/usr/bin/vi。(自己用c写ncurses的text field太折磨了……)
  5. 单独的一个主体程序nctwit,使用配置文件$HOME/.nctwit.conf,数据文件夹$HOME/.nctwit/。数据包括home, mention, direct message, favorite, public的timeline的xml文件,和时间戳文件,还有follower, friends的xml文件和时间戳文件。
  6. 配置文件参数:USER=username,PASSWD=passwd,这两个参数是必须的,API=http://your.own.api,SOCKS5_PROXY=your.socks5_proxy.hostname:port,GREETING=greeting message。其中API默认https://twitter.com/,GREETING默认是What are you doing?

写这篇文章主要是为了记录一下开发过程中遇到的困难和问题以及部分解决方案,不能白折腾啊。

首先看一下twitter api的消息,大概了解一下啥是twitter api,它们能干啥,怎么用。具体api说明可以看这里,可以在右侧搜索框搜索特定的API。还参考了dabr的代码

学习如何用libcurl的时候,参考了dabr的代码,这里这里还有这里。从这两篇文章可以学习到如何让libcurl使用socks5代理,12

另外涉及到时间戳问题的时候,需要从xml文件中的时间字符串,比如“Wed Feb 03 05:17:36 +0000 2010″转换成time_t类型的时间戳。可以用strptime解析时间字符串,转换成struct tm结构,然后再用mktime把struct tm转换成time_t,出来的是UTC时间。如果需要utf_offset修正,可以用date +%z在shell下获得,或者使用ftime函数,参考这个

学习使用libxml2解析xml文件的时候可有点费劲了,因为libxml2没有详细的man page,主页上的文档和实例也不是很详细,格式看起来也挺费劲的。最后发现xpath是个好东西,关于xpath可以看这个网址,讲解很简单清楚。用这篇文章中提到的函数xmlNodeGetContent从解析过的xml node数据结构中提取内容。这两篇文章介绍了libxml和xpath的简单使用,比官方文档清楚很多,12

在处理utf8整字处理的时候,这篇文章帮了大忙。主要是说明了utf8编码的规律。


具体来说,UTF-8编码有以下几种格式:

U-00000000 – U-0000007F:  0xxxxxxx
U-00000080 – U-000007FF:  110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

第 一个字节要么最高位是0(ASCII字节),要么最高两位都是1,最高位之后1的个数决定后面有多少个字节也属于当前字符编码,例如111110xx,最 高位之后还有四个1,表示后面有四个字节也属于当前字符的编码。后面每个字节的最高两位都是10,可以和第一个字节区分开。

另外,这篇文章对字符、编码什么的讲的挺清晰易懂的。还参考了这篇文章

先记这些吧,要出去玩了:)

时间浪费在了过载的信息上

自从用上了greader和twitter之后,明显感觉到每天接收的信息比之前多了很多。greader上和twitter上都会不时的出现各种信息,尤其当订阅了或者follow了不少信息源之后,上百的未读消息让我感觉到疲于“阅读”这些消息。不少情况下,上班之后第一件事是打开greader开始看,虽说不是全都看一遍,但是也很耗费时间。读完了greader再看看twitter,这样一上午的时间很可能就过去了(上班时间也晚,到办公室可能就快10点了),收拾一下就该吃午饭了。

另外一个问题就是这两种获取信息的工具和途径基本都会每过5分10分钟的就收到一条新的消息,如果不去看总觉得很难受(可能不少人都会有这种心理,保持消息都是已读状态),但是如果去看了就会大大影响工作效率,设想一下每10分钟去分神看一下greader和twitter,工作肯定做不好了。

邮件也是一个类似的问题,所以有人提出坚持每天查收邮件两次,这样就不会被每一封未读邮件所打扰而浪费时间。这么看来,每天阅读greader两次,每天看twitter两次也是非常有必要的了(twitter可以放松些,等车或者空闲的小段时间,在手机上看twitter还是很惬意的)。

所以,给自己定下如下规矩吧,不要把大好时光浪费在这种低效率的阅读上:

  • 每天看greader两次,中午休息时和晚饭后
  • 每天查看twitter时间同greader,另外在一些小段空闲时间可以用手机查看,比如等车,上厕所
  • 每天查看邮件两次,时间同greader
  • 保证大段时间用于学习和工作