Archive for ‘ToolKits’ Category

December 11, 2011

  甚至可以可以使用nc建立文件的中转站。比如,从host1无法直连到host3,只能先连到host2再间接连到host3。如果想从host1向host3传输文件,可以在host2上面建立中转。每次直接传输是client/server还是server/client,都可以实现(当然,如果两台机器有防火墙相隔时,就另说了):

1
2
3
4
dutor@host2 $ nc -l 5198 | nc -l 5191
dutor@host2 $ # 使用 while true; do nc -l 5198 | nc -l 5191; done 可以建立持久的'中转站'
dutor@host1 $ nc host2 5198 < stuff.tgz
dutor@host3 $ nc host2 5191 | tar xzvf -

  nc是一个简单,强大,又可以信手拈来的工具,尽情发挥你的想象力吧。

Tags: ,. 101 views
October 16, 2011

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

Tags: . 192 views
September 17, 2011
  • 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: . 790 views
July 10, 2011

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

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

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

Tags: . 266 views
June 11, 2011

  重装了系统,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: . 177 views
May 5, 2011

  相信很多人经常遇到文件乱码,尤其是文本文件。如果你不是用编辑器打开一个二进制文件的话,这应该是一个编码问题,即文件的实际编码和编辑器查看该文件时所使用的编码不一致。这时候,咱们需要把文件的编码进行转化,或者修改使用该文件的程序采用的编码。后一种方法取决于咱们使用的具体的程序,无法一概而论。
  这里介绍一个工具,iconv,使用它可以将一个输入文件从一种编码转换到另一种编码,同时将转化结果输出。iconv的-f选项指定源编码,-t选项指定目标编码,-o指定输出文件:

$ iconv -f coding1 -t coding2 file1 -o file2

  若file1省略,则使用标准输入;若-o选项省略,则使用标准输出。
  例如,我想把所有GBK编码的.cue文件转化为utf8编码:

$ find . -name "*.cue" -exec iconv -f gbk -t utf8 {} -o {} \;
Tags: ,,. 127 views
April 23, 2011

基本使用:

  • \di 进入画图模式;
  • \ds 离开画图模式;
  • 上下左右方向键,移动并画图;
  • Shift+上下左右方向键,只移动光标;
  • 空格键,打开/关闭擦除模式,擦除模式下,移动光标时光标处字符被空格取代;
  • >, <, ^, v,画箭头;
  • \>, \<, \^, \v,画粗箭头;
  • 可视化模式,即Ctrl + v后加motion后选中的文本块,可以使用下面快捷键:
    • \a 画箭头,区块开始处,指向区块结束处;
    • \b 画矩形框;
    • \c 画幕布,会提示行数,列数使用&textwidth选项,默认78列;
    • \e 画椭圆;
    • \l 划线。
  • 其他参考:h DrawIt。

  建议:类似上面框图,先画好框架,然后利用Vim的替换模式(普通模式下按R)进行标识。

Tags: ,. 403 views
April 20, 2011

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

Tags: . 238 views
February 22, 2011

  多数情况下,咱们编辑文档是逐行进行的。偶尔我们可能还需要按列编辑,比如项目编号,比如只有若干列不同的多行文本等。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: . 353 views
February 14, 2011

  调试内存转储文件。内存转储文件(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: . 326 views
Page 1 of 3123