最近,几件事情,需要记录一下:
1. C++0x标准终于通过了,这对于所有的C++ programmer来说,是一件大事。不过要等正式的标准发布,以及主流的编译器都支持C++0x的特性,还需要一些时间,大家一起来期待一下吧。接下来,有空的时候,好好先把新标准中新增的部分学习一下,尝尝鲜先~~
2. 下周末要开始北欧四国之旅了,上半年辛苦了大半年换来的,虽说来得有点迟,但还是蛮期待的。旅游之前,手头的工作还有不少,这周要好好加把劲了,把事情都尽量往前赶赶,这样回来之后就不致于太紧了。
3. 分享一个算法,用于设计分布式cache系统时比较实用的一致性hash算法,可以在尽量保证系统灵活性的前提下,降低系统的复杂性,感兴趣的朋友可以看这里:一致性hash算法
4. 一年一度的校招又要开始了,好多同学都要开始找工作了,祝大家都能找到自己满意的工作,想来深圳的同学们,提前联系我~~

分享几条这段时间的心得体会,与朋友们共勉:
1. 做事做到极致,首先要让自己满意,如果自己都不满意,别人肯定也会不满意
2. 优秀是一种习惯,培养这种习惯很重要,一当养成了很受用
3. 做任何事情,不论大小,做最充分的准备,结果会比预期好很多
4. 正直是做人的基本原则,正确的价值观、是非观很重要
5. 读万卷书,行万里路,怀淡定心,多读些书,会让周围躁动的世界安静下来
在C中,类型转换相对比较简单,直接加括号强制转即可,不过这样做的后果,就是很难保证类型安全,所以,在C++中,虽然还允许C方式的类型转换,但是已经成为deprecated的方式了,良好的C++编程习惯都不推荐使用C方式的类型转换了。C++提供了类型相对安全的转换方式,本文的主要内容,就是介绍C++中的各种类型转换方式,以及各自用在什么样的场合下,有什么需要注意的地方,帮助大家更好的掌握类型转换,更好的驾驭自己的程序。
dynamic_cast,static_cast, const_cast和reinterpret_cast在C++中被统称为显式类型转换,在介绍它们之前,有必要介绍一下C++的隐式类型转换。隐式转换,就是不需要什么特殊运算符的转换,它是在变量赋值过程中自动发生的。在C++中,允许的隐式转换,主要包括以下两种方式:
1. 基本类型之间的隐式转换
阅读全文…
光阴如棱,写程序也有好几个年头了。几年来,写过不少程序,也读过不少别人写的代码,各种各样、形形色色的都有。刚开始写程序的人,大都是以完成任务为主,以结果为导向的,很少会注重程序,或者说代码本身。随着写过、读过的程序越来越多,对写程序的人来说,完成任务、实现当前功能不是唯一的目标了,如何能在完成当前任务的同时,考虑一下,如果后面还会有其它的需求的话,我们现在的程序能不能在尽量不修改现有代码的前提下,通过增加一些新的代码,来实现需求、完成任务。这就是所谓程序的“可扩展性”。
为了帮助大家更好的理解,下面看一个例子,来实实在在的体会一下程序的可扩展性。这里首先给出需求:实现一个HtmlParser, 提供解析出页面里所有img链接的功能。
1. 先来看看大家最容易想到的一种实现:
阅读全文…
相信很多人跟我遇到过一样的情况,宽带只支持通过modem拨号上网,不支持通过路由器上网,这时候,如果有两台以上的设备要上网的话,就会比较麻烦了。这里介绍一种通过分享笔记本无线网卡来上网的方法,下面是具体的步骤,希望到遇到同样问题的朋友有所帮助:
1. 保证笔记本可以通过有线正常上网,保证笔记本无线已打开且可以正常使用。
2. 分享笔记本的能够连接因特网的适配器, 具体如下图:
阅读全文…
本文要介绍的sar,是linux下用来分析系统本身运行情况的非常有用的工具。我们知道,程序在操作系统上要运行,要关注的点不外乎内存,CPU和IO(包括磁盘IO和网络IO)。我们的应用程序在操作系统中运行前,我们需要了解系统当前的内存,cpu和IO的使用状况,还需要明白我们的应用程序运行时自身所需要的内存,cpu和IO资源的情况。只有操作系统剩余的内存,cpu和IO资源能够满足应用程序所需要的,才能保证应用程序在操作系统中正常的运行。sar就是用来帮助我们了解操作系统当前内存,cpu和IO等资源的使用情况的一个非常方便的工具,下面通过具体的例子来介绍sar的使用。
在介绍例子之前,首先需要说一下sar命令的基本用法:sar [option] [interval] [count]
1. 通过sar获取系统内存使用相关信息
(1)内存使用情况统计:-r,通过这个选项,我们可以了解当前系统中内存的使用情况 阅读全文…
2009年7月5日,从杭州到深圳,结束了青涩的校园时光,正式步入自己的职业生涯。时光荏苒,两年时间,一晃而过。回想过去的两年,感慨满满。要为这过去的两年写点什么,算是为过去的两年向自己做一个交待,也算是为了让自己更加清楚地过好今后的若干个两年。
曾几何时,听前辈们说过,刚走出校园的前五年,是对一个人至关重要的五年。五年间的所作所为,决定一个人的一辈子。细细想来,也是有一定的道理的,很大一部分人的区别,就是这五年中慢慢产生的,有的结婚、生子了,有的在为自己的理想孜孜不倦的追求着… 五年,已经过去了两年,过去的两年,更多的是专注于对技术的热情与追逐,在钻研的过程中,的确也使自己在技术方面有了一定的造诣,可能用‘造诣’这个词有点不太恰当,但是目前还想不到其它合适的,就暂且用它吧。但是,我一直很清醒,说实话,我不是个技术狂人,我只个想做清楚自己做的事、做好自己想做的事的人。因此,追逐技术的天花板,不是我所要的。曾几何时,一直很担心,在职场摸爬滚打几年,就会被磨得没有棱角,就会忘记了自己曾经年少时的梦想,所以一路走来,一直提醒自己,或许,现在的我,的确有了一些改变。与两年前的书生意气相比,虽说多了一份成熟,多了一份对人性的思考,但是,一直没有忘记曾经年少时的梦想,信念依旧那么坚定,坚守理想的约定一直铭记于心。 阅读全文…
学习过程序设计语言的朋友,应该不会对Hello world感到陌生,相信大部分朋友跟我一样,刚开始接触某种语言,写的第一个程序就是Hello world。学习C、C++、Java这些高级语言如此,学习Bash、Php、Python这些script语言亦是如此。本篇是8086汇编系列的第四篇,通过前面三篇的介绍,我们已经具备了写Hello world的基本知识,本篇就让我们来看看用8086的汇编,如何实现Hello world。在开始之前,需要说明一下,因为我个人的开发环境是在Linux下,所以本文采用了AT&T的汇编语法。关于AT&T与Intel语法的差异,我在第三篇中已经有所介绍,不了解的朋友可以先看第三篇的内容。在今后本系列的文章中,如果没有特别的说明,我所采用的环境都是Ubuntu 11.04 i386, 内核版本2.6.38-8-generic, GCC版本4.5.2, GDB版本7.2。
下面我提供两个版本的Hello world的实现,通过这两个例子,来说明一些在Linux下用8086汇编进行程序设计的基本过程与一些注意事项:
1. 通过系统调用write实现
阅读全文…
本文是继之前写过的两篇8086系列文章的第三篇,主要内容是对8086汇编的基本语法做一个总结与介绍。当前,在Windows平台上,用的大都是Intel的语法,而在Linux平台上,由于早期的GCC中用的是AT&T的语法,所以现在在Linux平台上,用的比较多的是AT&T的语法,Intel的语法在Linux平台上也有用,但是不常见。但是,总的来说,Intel和AT&T的汇编语法,都是目前比较常见的汇编语法,我们都有必要都进行了解一下,下面分别从几个方面通过对比,来介绍两种语法。
1. 寄存器的命名
1
2
| AT&T: %eax, %ebx, %ecx, %edx
Intel: eax, ebx, ecx, edx |
AT&T: %eax, %ebx, %ecx, %edx
Intel: eax, ebx, ecx, edx
如上所示,AT&T的语法中,寄存器前面要加%号,而Intel的不用。 阅读全文…
随着Quora类的问答社区的风生水起,各种各样的问答社区像雨后春笋一样,慢慢地露出了新芽。今天要介绍的也是一个问答类社区,一个与Quora类问答社区相比,完全不同的问答社区——StackOverflow(www.stackoverflow.com)。Quora类问答社区是面向大众的问答社区,用户在里面可以提各种各样的问题,等专业的人士来回答,得到满意的答案。而StackOverflow是一个面向细分市场的问答社区,它主要面向程序设计领域,StackOverflow自己的介绍是“Stack Overflow is a programming Q & A site that’s free. ”,很简洁,但定位很明确。StackOverflow是从2011发布的,目前alexa全球排名150名左右(Quora的alexa全球排名只有1000左右),每天的PV 1亿左右,算是做得很不错的了。最近抽时间体验了一个StackOverflow,这里做个简单的小结,把StackOverflow介绍给感兴趣的朋友。 阅读全文…
窗外的夜,静悄悄的,douban.fm中正播着奶茶的《明年此时》,发现越来越喜欢豆瓣电台,也越来越享受一个人的日子。过去的半年,一直都忙忙碌碌,每天朝九晚九的日子,猛然地发现,渐渐地有点迷失了自己,或许到了该找回自己的时候了。心之所向,梦之所往,曾经的年轻的心,曾经年少的梦,是否依旧还是那样,还是那么坚定?Same time next year, everything is still the same as today?

前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开的)的问题。我们知道,正常情况下,如果程序因为某种异常条件退出的话,应该会产生core dump,而如果程序正常退出的话,应该是直接或者间接的调用了exit()相关的函数。基于这个事实,我想到了这样一个办法,在程序开始时,通过系统提供的atexit(),向系统注册一个回调函数,在程序调用exit()退出的时候,这个回调函数就会被调用,然后我们在回调函数中打印出当前的函数调用栈,由此便可以知道exit()是在哪里调用,从而上述问题便迎刃而解了。上述方法用来解决类似问题是非常行之有效的。在上面,我提到了在“回调函数中打印出当前的函数调用栈”,相信细心的朋友应该注意到这个了,本文的主要内容就是详细介绍,如何在程序中打印中当前的函数调用栈。
我之前写过一篇题目为《介绍几个关于C/C++程序调试的函数》的文章,看到这里,请读者朋友先看一下前面这篇,因为本文是以前面这篇文章为基础的。我正是用了backtrace()和backtrace_symbols()这两个函数实现的,下面是一个简单的例子,通过这个例子我们来介绍具体的方法: 阅读全文…
最近,抽时间学习了一下python, 越来越发现自己并没有像以前想得那样排斥python, 而是慢慢的喜欢上了python。以前,一直对python通过缩进来区分代码块这个觉得很不爽,我想,这个也许是每个C/C++程序员刚开始接触python都会puzzle的地方,尤其在不同的编辑器中,配置的缩进不一样的时候,这个很让人头疼。
很多时候,事情也许并不像我们刚开始想的那样,通过深入的去了解事情本身,我们可能会发现事情积极的另一面,学习python的过程让我深深的体会到了这一点。随着在工作中,python的身影越来越常见,静下心来深入学习一下python的欲望越来越强烈,最近终于可以抽出空来了。随着对python的不断深入,发现python是一种会让人觉得amazing的语言,下面我列举一些我所认为python做得比较好的地方,分享给正在犹豫要不要学习python的朋友:
1. python鼓励大家写模块(module),写库(library)。然而python的每个库本身也是可以单独执行的。这个神奇的特性是python的__name__来支持的,我们在别人的python代码中经常会看到这样的一段代码: 阅读全文…
1. 什么是JSON?
JSON的全称是JavaScript Object Notation, 是一种轻量级的数据交换格式。就像XML一样,JSON也是一种比较常见的数据交换的语言,或者称之为数据交换格式更为贴切。
2. JSON中的数据结构有下面两种:
(1)对象(Object): 一系列name/value对的集合
(2)数组(Array): 一系列有序的values的列表
3. JSON中基数的数据类型有下面几种:
(1)对象(Object): 对象是一系列无序的“name/value”集合,如下图所示,对象以'{‘开始,以’}’结束,name和value之间由’:’分隔,多个name/value对之间由’,’分隔。
阅读全文…
近期评论