随笔 - 42  文章 - 3  trackbacks - 0
<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(2)

随笔档案

文章档案

网页收藏

搜索

  •  

最新评论

阅读排行榜

评论排行榜

系统会用到下面几种寄存器: 1.EIP 2.ESP 3.EBP。三者的作用。
1.EIP寄存器里存储的是CPU下次要执行的指令的地址。
2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,而这个地址是由ESP在函数调用前传递给EBP的。等到调用结束,EBP会把其地址再次传回给ESP。所以ESP又一次指向了函数调用结束后,栈顶的地址。
3.ESP寄存器里存储的是栈的栈顶。并且始终指向栈顶。


Eax
– arithmetic, default location where division occurs (accumulator)是很多加法乘法指令的缺省寄存器。

Ebx – base index for arrays

Ecxcouner (used with the loop instruction)重复(REP)前缀指令和LOOP指令的内定计数器。

Edx – data/general 总是被用来放整数除法产生的余数。

Edi, esi – used as indices in string operations

Ebp – positive offsets are the arguments, negative offsets are the local variables

 

posted @ 2011-11-27 23:15 鹰击长空 阅读(154) | 评论 (0)编辑 收藏

最近碰到一个特别奇怪的bug,程序不能正常退出,GDB追踪到最后发现是动态链接库卸载时不能正确调用detach函数,怀疑是引用计数的问题。弄了半天还是添加手工调用析构函数解决了问题。 这不由让我想起两年前一个同样的bug让我头疼了很长时间,也是程序退出时不能卸载动态链接库,看来这个问题真是个普遍的问题, 以后写代码要多注意,不要再依赖析构函数的实现了,要适时完成清理工作。

posted @ 2011-11-14 21:33 鹰击长空 阅读(364) | 评论 (0)编辑 收藏

问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。

问题实例:
1).海量日志数据,提取出某日访问百度次数最多的那个IP。

IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。

问题实例:

1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。

问题实例:
1)100w个数中找最大的前100个数。

用一个100个元素大小的最小堆即可。

问题实例:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2).5亿个int找它们的中位数。

这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。

问题实例:
1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。

问题实例:
1).有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 。

2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?

3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。

1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出:A,B文件共同的URL。 
解法一:Hash成内存大小的小块文件,然后分块内存内查交集。
解法二:Bloom Filter(广泛应用于URL过滤、查重。参考http://en.wikipedia.org/wiki/Bloom_filterhttp://blog.csdn.net/jiaomeng/archive/2007/01/28/1496329.aspx

2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。
解法一:根据数据稀疏程度算法会有不同,通用方法是用Hash把文件重排,让相同query一定会在同一个文件,同时进行计数,然后归并,用最小堆来统计频度最大的。
解法二:类似1,但是用的是与简单Bloom Filter稍有不同的CBF(Counting Bloom Filter)或者更进一步的SBF(Spectral Bloom Filter,参考http://blog.csdn.net/jiaomeng/archive/2007/03/19/1534238.aspx
解法三:MapReduce,几分钟可以在hadoop集群上搞定。参考http://en.wikipedia.org/wiki/MapReduce

3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。
解法一:跟2类似,只是不需要排序,各个文件分别统计前100,然后一起找前100。

posted @ 2011-03-14 14:25 鹰击长空 阅读(1229) | 评论 (0)编辑 收藏
     不知不觉,离我去年入职差五天就是一周年了,冥冥之中,注定如此吧!想当初,年轻气盛,桀骜不驯;叹如今,心灰意冷,锐气全无。话说回来,一年中,不论是技术还是心态都有所提升,技术上能做些小事,心态变得更加成熟了。
      暂时的离开是为了更好的未来,努力吧!与诸君共勉!
      感谢我的头,感谢我的同事,祝你们工作顺利!
posted @ 2010-04-15 11:18 鹰击长空 阅读(483) | 评论 (0)编辑 收藏

声明
#include <bitset>
using std::bitset;

bitset的定义和初始化
bitset<32> bitvec; //32位,全为0

给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。

这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从031。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)

3-6  初始化bitset对象的方法

bitset<n> b;

bn位,每位都为0

bitset<n> b(u);

bunsigned longu的一个副本

bitset<n> b(s);

bstring对象s中含有的位串的副本

bitset<n> b(s, pos, n);

bs中从位置pos开始的n个位的副本

1. unsigned值初始化bitset对象

当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大于unsigned long的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned long的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。

bitset<16> bitvec1(0xffff);          // bits 0 ... 15 are set to 1

// bitvec2 same size as initializer

bitset<32> bitvec2(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0

// on a 32-bit machine, bits 0 to 31 initialized from 0xffff

bitset<128> bitvec3(0xffff);         // bits 32 through 127 initialized to zero

上面的三个例子中,015位都置为1。由于bitvec1位数少于unsigned long的位数,因此bitvec1的初始值的高阶位被丢弃。bitvec2unsigned long长度相同,因此所有位正好放置了初始值。bitvec3长度大于3231位以上的高阶位就被置为0

2. string对象初始化bitset对象

当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左

string strval("1100");

bitset<32> bitvec4(strval);
bitvec4的位模式中23的位置为1,其余位置都为0。如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0string象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。

不一定要把整个string对象都作为bitset对象的初始值。相反,可以只用某个子串作为初始值:

string str("1111111000000011001101");

bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

bitset<32> bitvec6(str, str.size() - 4);     // use last 4 characters

这里用str中从str[5]开始包含四个字符的子串来初始化bitvec5。照常,初始化bitset对象时总是从子串最右边结尾字符开始的,bitvec5的从03的二进制位置为1100,其他二进制位都置为0。如果省略第三个参数则意味着取从开始位置一直到string末尾的所有字符。本例中,取出str末尾的四位来对bitvec6的低四位进行初始化。bitvec6其余的位初始化为0。这些初始化过程的图示如下:

3.5.2  bitset对象上的操作

多种bitset操作(表3-7)用来测试或设置bitset对象中的单个或多个二进制位:

3-7  bitset操作

b.any()

b中是否存在置为1的二进制位?

b.none()

b中不存在置为1的二进制位吗?

b.count()

b中置为1的二进制位的个数

b.size()

b中二进制位的个数

b[pos]

访问b中在pos处的二进制位

b.test(pos)

b中在pos处的二进制位是否为1

b.set()

b中所有二进制位都置为1

b.set(pos)

b中在pos处的二进制位置为1

b.reset()

b中所有二进制位都置为0

b.reset(pos)

b中在pos处的二进制位置为0

b.flip()

b中所有二进制位逐位取反

b.flip(pos)

b中在pos处的二进制位取反

b.to_ulong()

b中同样的二进制位返回一个unsigned long

os << b

b中的位集输出到os

1. 测试整个bitset对象

如果bitset对象中有一个或多个二进制位置为1any操作返回true,也就是说,其返回值等于1;相反,如果bitset对象中的二进制位全为0,none操作返回true

bitset<32> bitvec; // 32 bits, all zero

bool is_set = bitvec.any();            // false, all bits are zero

bool is_not_set = bitvec.none();      // true, all bits are zero

如果需要知道置为1的二进制位的个数,可以使用count操作,该操作返回置为1的二进制位的个数:

size_t bits_set = bitvec.count(); // returns number of bits that are on

count操作的返回类型是标准库中命名为size_t的类型。size_t类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.hC++版本。它是一个与机器相关的unsigned类型,大小可以保证存储内存中对象。

vectorstring中的size操作一样,bitsetsize操作返回bitset对象中二进制位的个数,返回值的类型是size_t:

size_t sz = bitvec.size(); // returns 32

2. 访问bitset对象中的位

可以用下标操作符来读或写某个索引位置的二进制位,同样地,也可以用下标操作符测试给定二进制位的值或设置某个二进制位的值:

// assign 1 to even numbered bits

for (int index = 0; index != 32; index += 2)

           bitvec[index] = 1;

上面的循环把bitvec中的偶数下标的位都置为1

除了用下标操作符,还可以用settestreset操作来测试或设置给定二进制位的值:

// equivalent loop using set operation

for (int index = 0; index != 32; index += 2)

           bitvec.set(index);

为了测试某个二进制位是否为1,可以用test操作或者测试下标操作符的返回值:

if (bitvec.test(i))

    // bitvec[i] is on

// equivalent test using subscript

if (bitvec[i])

    // bitvec[i] is on

如果下标操作符测试的二进制位为1,则返回的测试值的结果为true,否则返回false

3. 对整个bitset对象进行设置

setreset操作分别用来对整个bitset对象的所有二进制位全置1和全置0

bitvec.reset();    // set all the bits to 0.

bitvec.set();      // set all the bits to 1

flip操作可以对bitset对象的所有位或个别位按位取反:

bitvec.flip(0);   // reverses value of first bit

bitvec[0].flip(); // also reverses the first bit

bitvec.flip();    // reverses value of all bits

4. 获取bitset对象的值

to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作:

unsigned long ulong = bitvec3.to_ulong();

cout << "ulong = " << ulong << endl;

to_ulong操作主要用于把bitset对象转到C风格或标准C++之前风格的程序上。如果bitset对象包含的二进制位数超过unsigned long的长度,将会产生运行时异常。本书将在6.13节介绍异常(exception),并在17.1节中详细地讨论它。

5. 输出二进制位

可以用输出操作符输出bitset对象中的位模式:

bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0

cout << "bitvec2: " << bitvec2 << endl;

输出结果为:

bitvec2: 00000000000000001111111111111111

6. 使用位操作符

bitset类也支持内置的位操作符C++义的这些操作符都只适用于整型操作数,它们所提供的操作类似于本节所介绍的bitset作。5.3将介绍这些操作符。

posted @ 2010-03-26 16:40 鹰击长空 阅读(19730) | 评论 (0)编辑 收藏
最近 和另外两个同事A,B做一个项目,其实只是一件很简单的事情,但由于原来的软件架构设计的很复杂,我调用A的接口,A再调用B的接口。但由于A的原因,功能迟迟不能使用。我后来发现可以直接调用B的接口的,事情很快解决了。

从这件小事,我深刻明白了功能内聚的必要性,一个功能模块最好是一个人处理完,不要牵涉到多人,最多不要到两人以上。而且一个功能牵扯到多人以后,多半会彼此推卸责任,导致效率无比低下。
posted @ 2010-03-02 10:50 鹰击长空 阅读(625) | 评论 (0)编辑 收藏

今天遇到了一件让我难忘的事情:可能是升级程序的问题,导致升级不成功,结果实施人员找到我,说我程序有问题,我一查发现版本不对,就告诉了那个部门的负责人,结果那个工程人员被教训了一顿,我当时没觉得什么。事后, 那个实施人员向我诉苦,我才发现各人都有自己的苦衷。这也是一种管理之道吧!

深入下去,就是要在了解真相的前提下做判断,耐心分析问题,以理服人,也不要得理不饶人,人心都肉长的。
posted @ 2010-02-03 15:39 鹰击长空 阅读(504) | 评论 (0)编辑 收藏
为了下面一行SQL语句,我弄了整整一下午
select  *  into  dDB.dbo.wqq  from  openrowset('SQLOLEDB', '192.168.0.10'; 'sa'; 'pwd', sDB.dbo.er)

感慨下自己的SQL还有待加强,下面是一些资料的整理
1、openrawset
openrawset函数从任何支持注册OLE DB的远程或者本地数据源获取数据,比如从SQL Server或Access的远程实例中提取数据
--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表
select * intofrom openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) select *from 本地表

--远程表导入本地
select  *  into  本地表  from  openrowset('SQLOLEDB', 'sql服务器名'; 'sa'; 'pwd', 数据库名.dbo.表名)

--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

2、openquery
openquery在给定的链接服务器(一个 OLE DB 数据源)上执行指定的直接传递查询。可以在查询的 FROM 子句中像引用表名那样引用 OPENQUERY 函数。
用法需要创建一个连接


--首先创建一个连接创建链接服务器
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'user', 'pwd'

--查询
select * FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')

--把本地表导入远程表
insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')
select * from 本地表

--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as
inner join 本地表 b on a.列A=b.列A

posted @ 2010-02-01 23:07 鹰击长空 阅读(2013) | 评论 (0)编辑 收藏
      一份优美的代码,犹如一棵平衡二叉树,错落有致,不蔓不枝。而在现实工作中,常常由于为了赶时间,代码写得像懒婆娘的裹脚布-又臭又长,看起来特别不爽。那么这个代码就需要重构了。
     当清闲下来时,看到以前的代码如此凌乱,赶紧想着怎么重构下,该写成函数的就写成函数,该封装的就封装。
      清理完毕,看着重构后的代码,真是神清气爽啊!
posted @ 2009-12-11 14:49 鹰击长空 阅读(285) | 评论 (0)编辑 收藏
 这篇文章可能不太合适发在这里,它只是我对学习过程的一点感悟,并没有针对具体的某一方面,比如C++,而且整个思路也比较混乱,不怎么连贯。我想可能跟程序人生有点关系。

到了一定年纪,每个人不太一样,一般是1830岁以后,有很多人是不可改变的,他的本我已经太强,根本就不可能穿上对方的鞋子走路,站在对方的角度去思考,如果你觉得自己还能改变的话,请保持并继续往下看,否则就不用在这里浪费宝贵的享受生命的时间。在走进我们大陆这个光怪陆离的社会漩涡之后,如果还能有百分之一的人保持清醒,这也必然意味着痛苦,那他们就是未来的希望。做纯粹的《麦田的守望者》总是痛苦的,如果你也能适应并理解尘世的虚幻和不平,你就会活的轻松许多,毕竟我们的社会还是在进步的。

可能这里没有多少人有我的一些经历,我曾经做过半天的医生,更有幸目睹了一个新生命的诞生喜剧。伴随婴儿哭声的是母亲剖腹而来的满身鲜血,和她的微笑。看到那一笑的时候,当时我惊呆了,她肯定很痛很痛,但她的微笑是真正的幸福!

当幸福需要人付出痛的代价的时候,还有多少人愿意去完成?

尼采说:

谁终将声震人间,必长久深自缄默;

谁终将点燃闪电,必长久如云飘泊。

我把这句话送给继续往下看的朋友。

同时我也不幸看到了一个鲜活生命的悲剧。一个十四岁的女孩辍学做童工,由于那种私营企业主开的厂是没有什么安全保障的,她的右手被烧红的铁压住了,整个手被压的变形了,家里也比较困难,她的父亲也是一个很软弱的人,所以找老板也没有要到多少钱(这是主治医生跟我们讲的)。受伤的右手的治疗时间不及时,所以基本上整个右手都残废了,我去的那天整好是她第二次来,主要是为手臂植皮。我必须承认,她是一个很好看,很可爱的女孩,只可惜脸上不应该有她这个年纪所有的悲伤,她右手指上的白骨很清晰的可以看见,只有一层皮还挂在上面。当植皮的时候,首先从她大腿的内侧割下皮肤,然后在将其移植到手臂上去,尽管打了麻药,但我知道,仍然是非常非常疼的,但那个女孩自始至终没有说一句话,我一直托着她的手臂,可能是割皮的时候太疼了,她的呻吟声我们都听见了,我们问她疼不疼,她就不呻吟了,但还是不说话,但我分明看见她眼睛晶莹的泪水顺着脸淌下。十指连心,那种痛苦都经历过了,这点痛苦她已经可以用沉默来承受了!我不是一个会讲故事的人,原谅我仍然忘记了很多细节。

我不是一个容易难过的人,总试图从反面看到正面,但那一刻,我突然好难过,自己是不是对世界太苛责,其实上天真的给我很多,我的不快乐是不是没有多少理由,我有时候的沉沦是不是太不负责任。

前两天我在小百合的Reading版写了几百字的《浮萍的我》,表现了有时候我对世界的无奈,人在江湖,有时候身不由己的人生态度。我选择媚俗,获得关注。不过我还是愿意相信世界是美好的!上个星期周末晚上我们学校17个一起到北电去的硕士毕业生聚餐,大家聊的很开心,生活也还是快乐,并将继续快乐!

朽木不可雕,粪土之墙不可圬。我们都不会承认自己是朽木,粪土,至少在内心深处不愿意被打倒。其实每个人的潜力都是巨大的,一定要给自己信心,这是成功的第一步。为避免重蹈覆辙,我说一些自己的体验。

万事开头难,是的,开始总是不知道该学什么,该做什么,不过这个过程也不会太难,只要你不是完全一个人从头开始的,在群体的惯性下,很快你就会入门。

它山之石,可以为错。这个入门的过程在如今的互联网下面,可以极大的减少原本所需要的精力和时间,在网上,你可以知道你首先应该做什么,学什么,教材的选择都已经有前面的人为你铺好了路。你所要做的就是四个字:心如止水。但互联网也是一个花花世界,它是天使也是魔鬼,里面有太多让你流连忘返的地方,里面有漂亮的MM,里面有让人无力自拔的《传奇》……。但是随欲浮沉的人生开销是很高昂的。放纵欲望的代价会在以后的人生中成指数性的增长,你所预支的所有快乐,放高利贷的魔鬼会连本带息一分不剩的从你身上拿回来——那就是带给你的巨大痛苦。

我的建议是:都可以接触一下,但什么事都要有轻重的掂量,而且应该一直知道,世界是多姿多彩的,网络永远不是全部,它甚至只是生活的一个极少的部分。《七宗罪》最后的台词——Ernest Hemingway(海明威)说过:“The world is a fine place, I will fight for it!”(这世界是个好地方,值得我为它奋斗!)。前半部分有时候我不同意,但我会努力的实践后半部分。

每一样东西都需要耐性,都需要努力的汗水,才能领略它的别有洞天,它的引人如胜。对许多东西,关键不在于它很难,而在于对付它的方法和必要的耐性,准备工作最好做足,必要的基础要先了解掌握,碰到难题的时候,可以找个人,或者一个布娃娃倾诉,说不定你在诉说的时候,也许会有很多收获,也许你很快就可以获得灵感,明白问题的本质,进而将问题解决。

对初学计算机的读者,我觉得应该尽快的能够阅读英文原版教材。现在的条件真是太好了,计算机科学与技术的几乎所有好教材都有英文影印版,我很后悔在大学的时候浪费了太多的时间,应该在大三以前就能够流畅的阅读英文。有些事是知难行易,告诉你一个秘密,我是在研究生二年级开始买英文书看的,开始的确是苦如炼狱,心浮气燥,杂念如潮。但是不管学什么,都应该先坚持,然后才能考虑放弃。其实不需要太长的时间,大约一个月的时间就够了,我就发现技术书籍中的句子,语法,单词都差不多,读起来其实有时候比汉语还明白,从中我也学会了许多西方人的思维习惯,英文句子的逻辑性一般都很清晰。其实国内的计算机教材是相当差的,翻译的也是错误百出,而且一般是没有勘误表和索引的,对于我这种靠自学的学生来说,有时候碰到原书本身的错误这种问题,真是头痛至极。也许有人会觉得我的英语很好,再告诉你一个秘密,其实我是在2003.1月那次考试才过英语六级的,你真的可以做到!

在入门之后,就会有一个比较快速的发展期,会觉得什么都不是很难,都能够一步一步的来。但是过了这个阶段,又会发现何时是尽头,有那么多的东西等着去学,我真的能坚持吗?前面还要那么多的高峰,我能逾越它们吗?其实有时候平淡的心是很重要的,根据自己的情况选择一个方向,每天都有进步,过一段时间,信心就会回来,人生的路不在于开始跑的多快,而在于跑完。苏东坡说:“古之成大事者,不唯有超世之才,亦必有坚韧不拔之志。”其实小事情不一样也需要有耐心吗?

旦种暮成,朝花夕拾。事以密成,做什么事情有计划成功的机会会大一些。

首先需要用文火培元固本。一点一点的慢慢去理解。张无忌学九阳神功花了五年多,令狐冲没有内力的独孤九剑只能在成人的童话中出现,在现实的残酷面前好比风中之烛,转瞬就逝。基础的东西再怎么强调都不过分,比如操作系统,如果你愿意花半年的时间好好看看Andrew S. TanenbaumAlbert S. Woodhull的《Operating Systems:Design and Implementation》第二版。我相信你在大陆BBS上问的关于操作系统内核的问题基本上没有很多人能够回答你了。

文火过后,也必须要用武火密集锤炼,集中大量的精力和时间去看很多书,我就很喜欢许多书一起看,互相对比理解的很快,做比较多的题,编较多的程序,那样也会达到一个质的提高。如果你还有兴趣去读读西方经济学和近代西方政治学。我想你会发现很多东西殊途同归,学问上的境界有时候是和思想上的境界一起提高的。我们也许会发现,众里寻她千百度,蓦然回首,那人却在灯火阑珊处。《边荒传奇》中的燕飞武功上的每一次突破不都是因为精神境界的进步吗?

每一个领域都有泰山北斗,我很喜欢了解他们的历史,了解他们成长的路标,从中学会很多我所要的经验,对他们,我很尊重,但从来不会谦卑下跪。真正的美德如河流,愈深愈无声。他们是平静而平易的。

不欲速,不欲小利。欲速则不达,欲小利则大事不成。

做什么事情都应该考虑成本与回报,纯粹情感的东西除外:)。无所事事的时候会花费时间成本,可能也会得到偕意的心情。做一件事情的时候,就不能做别的事情,这就是机会成本。我想每个人都应该至少了解一下西方经济学,马克思经济学除外:)

一龙一蛇与时游。

《庄子山木篇》云:一龙一蛇,与时俱化,一上一下,以和为量。当得意顺心的时候,就如天上矫龙,当失意烦闷的时候,也要学会像蛇一样,隐匿潜藏。或龙或蛇,屈伸自如,顺着时势变化而行动,不偏滞专为。

当你寂寞烦躁,无聊郁闷的时候,这种心情本来就是上天给人特别的礼物。你该歇歇了,听听钢琴曲《致爱丽斯》,Saxophone《回家》、《茉莉花》。或者和好朋友去爬山、游泳。和女朋友去看一场浪漫的电影。早上起来晚一点,看看喜欢的胖胖的加菲猫又在说:“如果早上能来的更晚一些的话,我就会更喜欢它。”世界其实很可爱。你又会觉得人生也有别的更多的美好。还是应该拿出时间与女孩子约会的!:)不要让身在荆棘中跋涉的太久,不要让心在苦涩中浸没的太长,以至于失去了品味幸福的能力。

白云苍狗,人生如白驹过隙,《流金岁月》中有一句台词:“做男人也好,做女人也好,不男不女也好,关键是做人要开心。”我很喜欢这句话,但人生在世,不如意者十之八九,对让你不开心的东西,最好学会去面对,并解决它,不能面对的东西,我会选择逃避并忘记。至紧是不要让它影响你的心情太久。最好长夜漫漫,无心睡眠的日子越少越好。

日暮途穷,山穷水竭的时候,是危机也是生机。做一个有影响力的人,做一个负责任的人,做一个灵活的人,柳暗花明的日子并不会太遥远。

一门学问和艺术,想要达到纯青之境,需要的有时候不仅仅是努力和汗水,也需要机遇和天分。只要为此付出了努力,付出了汗水,那也就是你的快乐,难道快乐还不够吗?

侯捷在《但教心似金钿坚》中说:基础学问如万古长空,开发工具如一朝风月。不可万古长空不明一朝风月,不可一朝风月昧却万古长空。

我加两句注释:万古长空毕竟是万古的,它应该是学问中的主菜,学习的过程中每天都应该吃的;一朝风月毕竟是一朝,即使风月无边,它也还是学问中的点心,但是整日浸没在基础的长空之中,可能会丧失前进的动力和激情,偶尔吃一点点心也是很开心的。:)

我非常羡慕南大计算机系的学生,那里对我非常喜欢的数学有非常的重视,我曾经有好长时间迷恋小百合的数学精华区。数学是属于上帝的,高德纳(Donald Ervin Knuth)这样说。我曾经以为,现在仍然这样希望,如果我本科时候读数学专业就好了。因为我认为数学是最接近真理的!

Karl Popper 说过一句我一直非常喜欢的话:“You may be right ,I may be wrong ,but by a effort we are all get nearer to the truth!”(你也许对,我也许错,但是经过沟通努力我们都能更接近真理!)。每次与别人争执的时候,我都喜欢想起这句话,如果我们多一份宽容,我们真的会开心很多!

对他人的尊重,和自己责任的重视。其实在程序设计理念中有一个很有名的Design by Contract(按契约进行设计),其实这是一个很容易理解的概念,一点也不高深,特别是对拥有西方思想的民主国家的人民。可惜我们中国的东方文化缺少了这些,我们几千年的文明告诉我们:人一生下来就是有高低贵贱之分的。普天之下,莫非王臣,率土之滨,莫非王土。侠之大者,为国为民,国是在民之前的。可惜的是这些东西已经深深的扎根于我们的文化土壤并被用做统治国家的工具。

人人生而平等。享受权利的同时也要承担义务,承担义务的同时也应该享受权利。这就是契约(或者合同)的最基本概念。我来将其简单的映射于一个排序函数,这个排序函数必须对其要接受的参数进行检查,这就是它的权利,如果参数不合格,也即不能满足排序函数的要求,那这个排序函数也就不必要执行它的义务——为传进来的参数进行排序。Boost库中有个concept_check,就是为了保证契约(contract)的正确履行。当然,天下大事,必作于细。将其在程序语言中完整实现还是有许多工作要做,目前的各种语言中,Eiffel是做的最好的,Eiffel会强迫你考虑ContractPreconditionPostconditionInvariance。别的语言一般需要靠程序员的自觉。这里面就有民主宪政国家和独裁国家的影子,在民主国家,每个公民有与生俱来的社会契约约束,独裁国家则相反,有人不用承担任何义务,但却有绝对无上的权利。有时候我不得不感叹:“我们的国家进步得太慢!”

写到这里,我的耳边正好传来齐秦在《自己的心情我自己感受》的声音:

曾有太多不懂 袭击着我

总有些许冷漠 凝聚眼眸

曾有太多哀愁 不避开我

总有些许孤独 涌上心头

……

就这样结束吧!

posted @ 2009-11-08 22:39 鹰击长空 阅读(368) | 评论 (0)编辑 收藏
仅列出标题
共5页: 1 2 3 4 5