conky是Linux/Unix环境下面的一个用于可视化地显示系统信息的小程序,它可以嵌入到桌面,实时地显示CPU、内存、磁盘、文件系统、网络、电源等的状况,还可以显示一些特定程序的状态,比如moc, audacious, mpd&mpc等音乐播放器,甚至可以调用外部命令并将命令的输出显示出来。下面是我的conky截图,
conky

Tags: .

  关于C++ STL容器的默认内存管理,需参考allocator。
  关于deque的内存模型及其clear操作,我不甚了了,请参考您使用的标准库的代码。
  若想深入了解STL的实现,侯捷大叔的《STL源码剖析》是不错的入门资料,希望能够拜读。
  C++标准中并未对STL的实现细节做过多规定,因此不同实现的细节和表现可能不同。

  C++很复杂,但也并非无底黑洞。学好C++很难,但这种学习过程也会使你收获颇丰。
  学习任何一种技术,都需要热情、激情和足够的耐心。
  做好一件事,需要激情,同时激情常常来源于做好一件事情的满足感。
  满足感会增强人分享的欲望,分享的欲望也常常会使人具有亲和力和感染力,使人觉得你有激情,反过来更有利于人做好一件事。
  blabla, over~

Tags: ,.

  头文件中通常包含有:函数原型(声明)、宏定义、内联函数定义。
  头文件使用#include宏命令引入。有两种形式:#inlcude <header.h>和#include “header.h”. 两种形式的区别在于预处理器(preprocessor)查找头文件的方式的不同:对于前者,预处理器仅在系统预定义的标准路径中查找(标准查找路径由环境变量指明),比如/usr/include, /usr/local/include;对于后者,预处理器首先查找(源文件所在的)当前目录,若未找到,则到标准路径查找。另外,查找路径还可以通过编译器选项(-I for gcc)指定。通常,对于C/C++标准库和其他系统范围的程序库,使用<>形式,对于程序本身定义的头文件,采用””形式。

Tags: ,.

  看书时使用思维导图做笔记真是很方便。

Tags: ,.

  alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
  alias命令的基本格式为alias [word[=’command’]], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。
  如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:

1
shopt -s expand_aliases

设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。

Tags: .

  然后,这里推荐一本书,Ask the Right Questions: A Guide to Critical Thinking《学会提问:批判性思维指南》
  关于逻辑,关于批判性思维,我有太多的话要说,但我怕说的太多,就不多说了。《学会提问》这本书会告诉你“是什么、为什么、怎么做”。对于这代人,这本书试图教给你一些我们的教育本该教给你却没有教给你的东西。

Tags: .

  什么是shell自己版本的echo呢?原来,shell中可以使用的命令有“内建命令”(built-in)和外部命令之分。内建命令有shell本身实现,即和shell进程同属于一个地址空间执行,比如echo可能是shell中的一个函数实现的。内置命令通常是无法或者不适以外部命令的形式实现的命令,比如cd, source, alias, bind, history, set等等。外部命令是一些独立的可执行文件,由shell以fork/exec的形式执行。
  使用type命令可以获取命令的类型。由type type可以知道type命令本身也是内建命令。

  知道这些,通过–help选项输出echo的帮助信息就不是什么难事了,

1
2
3
4
~$ which echo
/bin/echo
~$ /bin/echo --help
......
Tags: .

  多数情况下,咱们编辑文档是逐行进行的。偶尔我们可能还需要按列编辑,比如项目编号,比如只有若干列不同的多行文本等。Vim为列模式编辑提供了比较“简洁”的支持,即可视化文本块(Visual Block)模式,它是三种可视化模式的一种(一种使用命令v按字符选取区域,一种使用命令V按行选取区域,另外一种就是这里的按矩形块选取区域,使用命令Ctrl-v)。例如,现在想要把一段C++代码中连续几行(比如3行)代码的某一列后面的部分注释掉,我们要做的就是把光标定位到该列,按下Ctrl-v,按两下j使该列3行高亮显示,再按下I,输入C++注释符//,然后按退出键,搞定,Vim会为你完成剩下的工作。关于Visual Block模式下可以进行的其它简单操作,可以使用:h visual-operators查看。
  但,简单的Vim命令的功能也仅限于此。若想完成更复杂的功能,就不得不动用高级一点的技巧了。比如为文档的每一行加上行号可以使用命令

:g/^/s//\=line(".")/    " 等价于:g/^/s/^/\=line(".")/

  解释一下:

  • :g/pat/,命令g查找模式pat(此处为^,行首,即每一行都会匹配),为每一个匹配行执行接下来的命令;
  • s/pat/str/,命令s在当前行查找模式pat,并使用str替代之;
  • \=,指示此处的字符串将由接下来的表达式的产生;
  • line(expr),函数line返回由字符串expr指示的行号,”.”代表当前行。
Tags: .

  调试内存转储文件。内存转储文件(core dump)是程序发生严重错误时操作系统产生的文件,它包含了程序崩溃时占用的内存页面的拷贝,因此使用core文件在一定程度上可以再现崩溃前夕程序的状态。
  多种原因下程序会崩溃,从而被系统终止,生成core文件,经常见到的是访存错误(段错误,Segment fault)。另外,系统是否生成core文件以及core文件的最大尺寸还受系统参数的控制。例如ubuntu下面普通用户程序是不允许生成core文件的,这可以使用ulimit命令来修改。不带参数的ulimit -c输出当前core文件的最大允许值,为了能够生成core文件,使用ulimit -c size设置大小,简单地,ulimit -c unlimited将其设为没有限制。

1
2
3
4
5
6
7
8
9
10
void foo(const char* s)
{
    char c = *s;
}
int
main()
{
    foo(0);
    return 0;
}
Tags: .

  列位安好。简单总结下GDB调试器的使用。

准备

  默认情况下,gcc/g++编译的可执行文件是不包含调试信息的,GDB是一个源代码级的调试器,使用GDB调试程序需要程序的源代码、符号及其对应的行号等,其中符号和行号可以是单独的文件,亦可以在编译时嵌入到可执行文件中。使用gcc/g++时使用-g选项即可将必要的调试信息包含到可执行文件中,使用-g3选项还可以将源代码中的宏信息也包含进去。
另外,调试过程中需要随时查看源代码,但源代码并没有包含到可执行文件中。通常GDB在当前目录查找源文件,但某些情况下(比如调试系统命令)需要手动指明源代码的查找目录,directory ~向GDB指明到$HOME下查找源文件。

启动

  GDB的启动很灵活,它的各种特性,你可以在Shell下通过选项和参数指定,也可以在GDB启动之后在GDB自己的命令行下使用GDB内置的命令来指定。最常用的是直接使用命令gdb PROGRAM启动,这样gdb自动加载符号表等调试信息。若要向被调试程序传递参数,可以采用gdb –args program ARG1 ARG2的形式,其中–args(或者-args)是必须的,它告诉GDB该选项之后已经没有GDB需要的选项了。另外,还可以直接使用gdb启动,然后使用file program加载调试信息。此时若要设置被调试程序的参数,可以使用set命令的args子命令,如set args ARG1 ARG2. 还有一种传递参数的方法,在下面介绍。

Tags: .