• 把自己份内的工作做好,做到足够好。可以让老大觉得你很菜,但不要让老大觉得你很不靠谱,不要让身边的伙计们觉得除了不着调还是不着调。总之,别让自己的’过失’引得别人的不舒适。
  • 学点设计模式,懂点架构。多学些抽象的东西,可以让你在更高的层次上不那么费力地思考,虽说’不那么费力地思考’本身需要花费相当大的力气。大卫·凯尔西同学的MBTI测试早就告诉你了,你他妈的以后就是’建造者’,目前你干的这行当,叫做架构师,你是个极品。
  • 并发。多美妙的世界啊,不是吗?semaphore多生动,mutex多性感啊,多进程/多线程多迷人哪,完全不同的设计模式不是吗?难道你不想看看OS是怎么搞定这个本会乱糟糟的世界的吗?
  • 存储。你不是喜欢字节吗,干嘛不把虚拟内存、内存、磁盘以及各种盘整的明白点呢?cache/buffer什么的,不是很好的佐料吗?
  • 网络。吼吼,很神奇的家伙不是吗,这个积木搭的实在很牛逼不是吗,一大堆的协议比那本劳动合同有趣多了不是吗,Socket读起来让人想起Penny让人想入非非不是吗?
  • 算法。在大学搞过算法的人,始终是我羡慕的对象。小神,庄神,各种大神。
  • 文件/系统。一个个硬邦邦的比特,怎么就变成毛片了?各种数据库引擎各种不懂,闹哪样啊?Windows开机哗啦哗啦的,自慰呐?
  • 分布式。租约啊,Paxos啊,ACID啊,一听就蒙。
  • 吉他。乐理好难啊,手僵到抽筋啊,渔夫说弹出泡弹出茧才算用功啊。还真是先技术,再艺术啊,一年之后要是能弹个加州旅馆弹个梁祝就好咯!
  • 绘画。那些能把自己看到的/想到的东西画出来的人,我羡慕嫉妒恨自己哪,黑客与画家,听起来很牛逼的样子啊。有朝一日,能把自己的妹子漂亮的脸蛋画出来该是多幸福啊,靠想象也成啊。
Tags: .

  我们还知道,类的静态成员函数是不需要绑定到特定对象上面的,所以我们就可以将worker声明为静态成员。

1
2
3
4
5
6
7
8
9
10
11
class Thread
{
public:
    static void* worker(void* args) {
        //~ thread execution.
    }
private:
    //~ here some data member.
};
pthread_t tid;
pthread_create(&tid, NULL, &Thread::worker, NULL);

  我们又知道,静态成岩函数是不能’直接’访问类的非静态成员(包括函数),因此,上面代码中worker即使属于class Thread的类域,但却无法访问这个类的成员,这让人十分不爽。哪位大牛说过来着?任何一个复杂的计算机问题,都可以通过中间层来解决。这里也可以建立一个中间层:使用静态成员函数创建线程,给该函数传递某个对象的地址作为参数,在该静态函数中就可以通过所传递对象的使用它的任何成员了。

Tags: ,.

一个致命字符串

  传说中,存在这么一串神秘的字符,你把它们放到终端,然后回车,不消太久,你的机器就变植物人只能低电平复位重启了。这串神秘的字符看起来是这样的,

1
dutor@home: ~$ :(){ :|:; };:&

  这是神马玩意儿呢?好的,现在听我的,把你的脑袋面对显示器逆时针旋转四分之一圆周,像不像一个张着血盆大口的长袍老怪?
  严肃点,你看懂它的真相了吗?换种等价的写法,

1
dutor@home: ~$ foo(){ foo|foo; };foo&

  其实就是“声明”了一个函数,然后在后台执行这个函数。在函数体内部,以管道的形式调用递归调用自身。第一种写法只是把函数名换成”:”产生的怪胎。

Tags: .

  之前用了两年的meyu虚拟主机快到期了,出于各种应有和本不应有的需求,决定买VPS。linode的VPS名声一直不错,于是就买了。
  简单介绍下过程,给希望购买VPS的朋友可以参考下。从决定购买到付款到开通到安装系统到部署各种环境,大约一个小时多一点。目前linode有多种不同规格的的VPS,采用Xen虚拟机,我选的是512M RAM/20G Storage的那款,价格是每月$19.95,可能稍贵,可性能和稳定性有保证。系统方面,linode支持各种主流Linux发行版,我暂时选了比较熟悉的Ubuntu Server 11.10,最新的30内核。Web服务器暂时选Apache2,考虑以后学习Nginx的时候换成Nginx。另外,linode在世界各地都有机房,当然要除了中国,我选了最近的东京,ping 70ms左右。
好吧,就这些。

Tags: .

  core dump, 通常译作内存转储,core之所以译作内存,而不是核心,纯属“著名”的历史原因,因为早期的内存有一个叫磁芯(magnectic core)的东西。内存转储会在磁盘中产生一个文件,是某个进程在转储时刻的内存映像及寄存器等信息。内存转储通常发生在进程执行了有致命错误的指令时,常见的就是著了名的Segmentation fault,即段错误,而导致段错误的就是C/C++编程中经常发生的内存非法访问。内存转储操作由操作系统内核进行。当然,内存转储还可以是用户主动发起请求,内核执行转储。
  内存转储对于程序调试是至关重要的。利用内存转储文件(core files)对程序进行调试是一种异步的静态调试,所谓异步是指异常发生与调试不是在同一时刻,所谓静态指的是core files保存的只是转储时刻进程的内存状态。比如,一个长期运行的服务程序,我们不知道哪里有bug,该bug何时被触发,这种情况下,利用异常发生时的转储文件就可以在一定程度上定位出异常发生的原因。另外,对于非致命性错误,比如死锁或者死循环,进程不会自动结束,通常内核也不会主动杀掉这种进程,这时用户就可以请求内核将该进程进行内存转储,以此来查看进程的运行状态(比如各进程的堆栈)。

Tags: .
  • G, gg: 光标移动至文件首/尾;
  • zz, zt, zb: 将光标所在行居中/置顶/置尾;
  • H, M, L: 定位光标到当前窗口的首/中/尾;
  • *, #, n, N: 向前/后定位当前光标所在word,n/N沿相应/相反方向重复定位;
  • ^a, ^x: 若当前光标所在word是数字,可递增/递减该数字,同时支持decimal和hexadecimal;
  • ^, g_: 即Shift+6,定位光标到当前行首/尾的第一个非空白字符;
  • ^d, ^t: insert模式下,缩进/反缩进当前行;
  • ^w: insert模式下,向后删除一个word;
  • ^y: insert模式下,复制上一行同列字符;
  • ^x^f: insert模式下,补全路径名;
  • ^x^n: insert模式下,补全tag(需要tags文件的支持);
  • ^x^l: insert模式下,补全行(根据已有行);
  • I, A: 定位光标至当前行首/尾,并进入insert模式,I会忽略行首空白;
  • D, C: 删除光标所在位置到行尾的字符,C会进入insert模式;
  • cib: 或者ci(或者ci),删除当前括号内的所有字符并进入insert模式。c还可以是d或者其他编辑字符,i还可以是a(此时会将括号一同删除),b还可以是B(大括号)、t(html标签)或者具体的配对符号,如(), [], {}, ”, “”, <>。
    参加:h text-objects;
  • %: normal模式下%会跳转至配对括号;
  • %: lastline模式下代表当前buffer的文件名,可以有许多修饰字符,例如:sp %:r.cpp会分割当前窗口,并打开当前文件对应的cpp文件,%:r代表文件名消除最后一个后缀之后的字符串。
    参见:h filename-modifiers;
  • :set op? : 显示选项op的当前值;
  • :set op! : 反转开关式选项op,比如:set nu!开关行号显示,:set paste!开关paste模式

注:
1. 非特别说明,命令均在normal模式;
2. 字符前的^指Ctrl;
3. 技巧来自于实践,技艺提升于运用。

Tags: .

使用变参

  C/C++提供了函数的可变参数(variadic)机制,大部分人写的第一个C程序恐怕就是Hello World吧,使用的应该也是printf(“Hello, World\n”)。printf就是一个使用可变参数的典型,它的原型声明为,

int printf(const char *fmt, ...);

  其中返回值为实际输出字符个数,fmt为格式控制字符串,而”…”便声明了一个可变参数,你可以根据传递0个或多个参数给printf。printf内部会根据格式控制串中的格式指定符号(d, f, p等等)来逐个解析通过可变参数传进的实参变量。
  为解析可变参数,C语言提供了一个va_list类型和四个宏,分别是va_start, va_arg, va_end, 和va_copy,这些宏声明在stdarg.h中。

Tags: ,,.

  首先是技术上。我想,来这里,或者订阅这个博客的人,百分百都是“搞电脑的”吧。说来惭愧,通过http://feeds.feedburner.com/dutor订阅的人一个多月前就达到三百了,但一直没能写出什么有价值的东西,但这也确实是我能力不足,水平有限。但我也确实是想好好地写点东西的,一方面是我有分享欲,因为分享给我带来满足感,更重要的是我文字能力太差,需要历练,还有就是我觉得能描述出来尤其是写出来的东西才是你“可能”真正弄懂的东西。看过之前部分文章的同学可以看出,那些文章都是非常琐碎的东西,有的连知识都算不上。我希望以后我能有能力写出些抽象层次更高的东西,当然前提是我的抽象思维能力能有所提高。
  希望能在工作中获得更多的代码经历。对C++的理解还一直停留在语法层面,虽然看过一些好书,有过一些体会,能说出一些道道来,但没有代码尤其是产品级代码的历练,这种理解和道道都是很肤浅的,只能蒙蒙别人做炫耀的谈资罢了,自己有多少东西自己更清楚,起码“应该”清楚。另外,在技术上,对于看书,我是这么理解的,在任何领域,你首先需要的是知识,如果你想有所建树,就需要更多的知识。对于一个新手来讲,书无疑是最初获得知识的绝佳途径,除此之外互联网也是书本之外获取知识很好的途径,尤其是在读书遇到困惑的时候。当有了一定的知识基础后,就需要将这些知识运用到实践中,从而对所学有一个更深更高层次的理解。有了一定的实践经验之后,你的眼界可能会大开,再看之前的知识或者大牛的经验之谈,就“应该”完全是另一种阅读体验了吧。

Tags: .

  闲着也是闲着啊,来公司学习啊,好久没写博客了呀,欲望很强烈啊,那就写吧!我用Vim写啊,我骄傲啊,我还自己写了脚本啊,能用wiki语法写博客啊,写完可以自动处理成HTML啊,HTML啊!

  好啊,写了一个多小时啦,加了不少代码了啊,得处理一下啊,啊,怎么不行啊,自定义的命令找不到啦,啊,文件扩展名写错了啊,那就改名啊!

  苦逼的时候到了啊,为什么不保存文件退出到shell改啊,为什么装逼要在Vim里面改啊,提示我说会删除当前buffer啊,我说删除就删除啊,总得提示我文件没保存啊,尼玛它居然没提示啊,啥都没有啦!

Tags: .

  重装了系统,Vim升级到了7.3。
  之前,对于特定的文件类型建立了一些模版,类型的文件时候自动加载相应的模版。模版保存在$HOME/.vim/templates/下,比如C文件的模版为tpl.c。在.vimrc中有下面的配置:

1
2
3
4
5
function! LoadTemplate(extension)
    silent! :execute '0r $HOME/.vim/templates/'. "tpl.".a:extension
endfunction
" Load templates only when the file is NEW
au BufNewFile * silent! call LoadTemplate('%:e')
Tags: .
Page 4 of 3312345678910...2030...Last »