2008/4

GCC GDB 作弊手册

If you want to pass, cheat. If you want to learn, research.
因哲思的需要,这两天内忙着赶制了GCC和GDB的手册,如下:

http://wangcong.org/articles/learning-gcc.cn.html
http://wangcong.org/articles/learning-gdb.cn.html

pdf 版本(直接用firefox转成的):
http://wangcong.org/down/gcc-cheat-sheet-cn.pdf
http://wangcong.org/down/gdb-cheat-sheet-cn.pdf

哲思叫它们“速查手册”,我更喜欢叫它们“作弊手册”(cheat sheet)。;-)

PS1:firefox生成的ps很不错了,以前记得很烂的,进步很大啊,呵呵~

PS2:劳动节快乐!

(Update:firefox生成的是ps,不过我又通过ps2pdf转换好了,所以上面的下载正确。感谢crquan指出。)

刘若英参加的节目

强烈推荐奶茶参加过的几个节目:

《艺术人生——刘若英》

上:http://www.tudou.com/programs/view/5hxHztQF0RQ/

下:http://www.tudou.com/programs/view/qGXBFqxemQo/

《桃色蛋白质——刘若英陈升》

上:http://www.tudou.com/programs/view/BxC-PsObylk/

中:http://www.tudou.com/programs/view/R45f3tJi-YI/

下:http://www.tudou.com/programs/view/UtyV21sehxA/

《大学生了没——单身也很好》

上:http://www.tudou.com/programs/view/iKv0h8UBJkA/

中:http://www.tudou.com/programs/view/zSeu-GzIfWs/

下:http://www.tudou.com/programs/view/CgZoA3yIFtM/

刘若英很有才,不光唱歌演电影,也出过好几本书了,很喜欢她写的一些文章。哎,只是据说刘若英迷恋陈升,他们的关系一直很扑朔迷离。。。陈升这人也真是的,感觉故意不给刘若英面子啊~~

BTW1: 因为CD中有刻录的《艺术人生》那个,所以看过4,5遍了都。。。额外强烈强烈推荐一下那个。

BTW2:因为刘若英的《似水年华》,特想去乌镇。“烟花三月是折不断的柳, 梦里江南是喝不完的酒”。不知何时我能在烟花三月下一次江南?或许,“路过江南小镇”时还能“惹”上江南美女。。。

体验Alpine

家里有两台电脑,这给使用POP收邮件带来一些麻烦,因为要在两台机器之间互相同步邮件存档。决定换IMAP试试,于是就找上alpine了。

alpine也是命令行下的邮件客户端,由华盛顿大学开发,据说Linus本人就是用的这个。

alpine的配置其实相当简单,相对于mutt来说,但对于习惯了POP的用户来说,alpine的“困难”在于IMAP而不在于alpine本身。所以在使用alpine之前熟悉一下IMAP是很有必要的。

这里就不赘述IMAP的概念了,只说一下我的配置。首先你先要把gmail的设置改成支持IMAP,然后要通过gmail自带的过滤器和标签来配合IMAP对邮件进行分类。然后在你的~/.pinerc里修改下面几项:

personal-name=Your Name

user-domain=gmail.com

smtp-server=smtp.gmail.com/submit/user=YOUR_NAME@gmail.com/novalidate-cert

inbox-path={imap.gmail.com/user=YOUR_NAME@gmail.com/ssl/novalidate-cert}Inbox

还有很多其它配置项,你根据自己的喜好进行选择。

alpine的优点很明显,直接在服务器上进行操作,无需下载到本地,方便在不同机器上使用同一个email帐号。缺点,我认为,就是保存到本地不方便,至少对于gmail来说,因为gmail并没有提供Linux/Unix上的命令行操作接口(或者是有而我不知道?)。还有,alpine并不像mew那样提供邮件编码转换,不是指定的编码一律都是乱码。

最后,如果gmail的过滤器再好一点儿就完美了。;-)

emacs技巧

收集的一些emacs tricks,和大家分享。;-)

http://www.emacswiki.org/cgi-bin/wiki/EmacsNiftyTricks
http://geosoft.no/development/emacs.html

http://infolab.stanford.edu/~manku/dotemacs.html

http://blog.carduner.net/my-emacs-tricks/

http://blog.outint.de/index.php/category/emacs/

http://verify.stanford.edu/satyaki/emacs/EmacsTricks.html

http://jfm3-repl.blogspot.com/2006/06/emacs-tricks-1-completion.html

注:gfw抽风了,blogspot时而能上,时而不能上,梯子请自备!!

又修了一次电脑

前几个星期电脑一直有个毛病:开机自检时BIOS死机,需重启若干次(随机)后方可进去,中间还会伴随着一重启就自动关机的情况。甚是奇怪。我一直以为是机箱电源或者BIOS出问题了,没怎么在意这个问题。

直到最近电脑突然出现一次花屏。

出现花屏第一反应是显示器出问题了,仔细检查没发现什么异常。显卡是集成的,有问题我也没办法,忽略。无意间摸了一下电源,巨热,怀疑是机箱内温度过高引起。等它温度降下来后,发现花屏已经消失(所以花屏应该是因为CPU或者显卡温度过高引起),但卡到自检那里动不了了,还有长响声伴随,重启还是一样!

根据以往的经验,这多是某个重要部件没插好的缘故。拆开电脑,把CPU,内存,硬盘一个个拆了重连,随便清理了一下CPU风扇,散热片,内存插槽,主板。结果一切问题消失!!开机启动正常了!

可见是主板上灰尘影响了电脑开机,大意了,以前都不怎么在意这种问题。还有,小机箱散热较弱,夏天最好拆开一个侧面的外壳来散热。有条件的可以考虑找个家用风扇对着敞开的机箱吹。^_^..

最后,说一下以前修电脑的一个严重教训:硬盘数据线中间的那个转接头忒不结实了!!千万别用!!拆不了几次就掉了!我都拆掉三个了!

可笑的IT史

因为准备讲座的原因,重新学习了一遍1969~2000年这段时间内的IT历史,我发现除了“可笑”实在是找不出更合适的词了。

1. 软件刚生出来的时候,根本就没有软件专利的概念,用软件的人皆认为“我从你那里拷个软件”“你把它的源代码给我”是再正常不过的事了,正常到就像今天“拷贝软件是违法的”一样。MIT那群hacker们就是多写几个软件也不会想到把这种事商业化。让此发生巨变的就是商人们灵敏地嗅到了软件暗含的“铜臭”!无疑,很多门先生是获利最多的一位杰出青年!他不是一个人在战斗!

2. BSD比较郁闷,错,那可是相当地郁闷!为啥呢?因为一开始BSD是相当领先的!因为它继承了Unix的光荣传统!BSD发展的时候Linux还没出生呢,Window$还在娘胎中,它不拽谁拽?可拽未必见得就是好事,它眼光比较高,就想着如何让自己变得更拽,优化来优化去,在大型机和象牙塔的气氛中happy地发展着。它忘了两件重要的事:一是,拽未必就能流行。这很容易解释,在整个80年代PC崛起的时候,BSD根本就没重视它!它本身很长一段时间内一直运行在我们今天很少听说过的机型上!二是,拽了容易遭人嫉妒,尤其是被人抓着小辫子的时候!那个小辫子就是它自己包含的AT&T的私有代码!AT&T看着它发展得那么好眼红了:NND,Unix是从我这里出来的倒让你拽了啊!于是一纸诉状将其告上衙门!这官司一打就是2,3年!

3. 就在这2,3年中,Linux出生了。Linus太幸运了,按照他当时的手气,今天买彩票或许能中头奖!先是当时还不太出名的Richard Stallman因为和BSD谈判破裂了,GNU正在酝酿自己的操作系统,关键是弄了好几年一直没鼓捣出来!然后是此时BSD正身缠官司,无暇顾及其它。最后是PC机在IBM,M$,Intel的炒作下很火了已经。Linus偏偏在这时候,写了个PC机上的Linux,而且还公开了它的源代码,正好解决了GNU的燃眉之急!和GNU一拍即合!加上宣传工作做得好,等到BSD打完官司,发现自己多两个竞争对手,已经晚了,人气不在了……

4. 商人就是厉害啊!看一下微软的发家史,你会发现,这个起初靠贩卖basic为生的公司的转机竟然是因为一个比较龌龊的举动:IBM和Digital Research的谈判破裂,用不成CP/M了,M$看准了时机,拿了那个公司CP/M,换了名字叫做DOS,讨好IBM,然后捆在PC机上贩卖!Intel也不弱,傍着IBM这个大款,让自己并不怎么样的片子卖得那么火!

5. 于是到了现在,BSD依旧郁闷着,没有Linux火啊!虽然自己的技术不弱于它。Linux算是发展得很好,很是顺利。微软有钱有势,不时地再用点下三滥的手段,虽然经历过被瓜分的危机,但是还是没把它咋的!IBM也郁闷了,霸主地位眼睁睁被微软抢走,只能打Linux的牌和微软对着干了。

一个很烂的操作系统,带着那颗不怎么样的“芯”,继续垄断着这个世界……

比较两个文件的相同

恐怕地球人都知道比较两个文件的不同得用diff(1),现在有个问题是:如何找出两个文件的相同之处?

经过简单查找,我发现可以用comm(1)。可是看了一下它的man我们就发现,不妥,它没diff(1)那么简单。首先它的选项有些特别;其次,很重要的是,它要求文件必须是排好序的!这时候恐怕我们就得想,哎,又得用bash脚本了。不行,那不符合hack精神,我就不信在一行里整不出它来!于是下面的一行就出来乐:

% comm -1 -2 <(cat 1.txt | sort) <(cat 2.txt |sort)

或者更干脆:

% comm -1 -2 <(sort 1.txt) <(sort 2.txt)

zsh和bash都可以用的。可见,shell语法是够博大精深的……

课后作业:不看源代码,猜猜上面的技巧大体上是怎么实现的?(想知道“答案”的拖住最后一行。;-)

提示:把comm换成diff看看,是不是用的/proc/self?

跨行搜索脚本:mgrep

写了做跨行搜索的脚本,用Perl。我知道也可以在bash里用sed,但我认为用那的话灵活性就不如用Perl了,因为我还要给它扩展各种我需要的功能。

闲话少说,上代码!

[perl]

!/usr/bin/perl -w

From: http://www.kclug.org/pipermail/kclug/2005-June/028106.html

Hacked by WANG Cong.

Copyright (C) 2008, WANG Cong

Usage

mgrep.pl -s -e [—nonum]

use strict;
use warnings;
use Getopt::Long;

my($start, $end, $file);
my $num = 1;

my $allow_nest = 0;

my $allow_recursion = 0;
my $allow_binary = 0;

GetOptions(
“start=s” => $start,
“end=s” => $end,
“nonum” => sub { $num = 0; },
“recursion” => sub { $allow_recursion = 1 },
“binary” => sub { $allow_binary = 1 }

“nest” => sub { $allow_nest = 1; }

);

$file = shift;

die “$start and $end options are both required. And so is the file name.”
unless ($start && $end && $file);

my $start_reg = eval {qr/$start/};
die “The start pattern is not correct!” if $@;
my $end_reg = eval {qr/$end/};
die “The end pattern is not correct!” if $@;

## sub

sub mgrep_file
{
my @matches;

#my @nest_stack;
my $matching; #boolean
my $added = 0; #boolean
my $linecount = 0;
my $file = shift;

open( IN, $file ) or return undef;

while( my $line = readline *IN)
{
$linecount++;
if( $line =~ /($start_reg.*)/ )
{
    $matching = 1;
    if(!$added){
    push @matches, "==", $file, "==n";
    $added = 1;
    }
    if ($num) {
    push( @matches, $linecount . ": " . $1 . "n" );
    }else{
    push( @matches, $1 . "n" );
    }

    if( $1 =~ /$end_reg/){ $matching = 0; }
    next;
}

if( $matching )
{
    if( $line =~ /(.*$end_reg)/ )
    {
    if ($num){
        push( @matches, $linecount . ": " . $1 . "n" );
    }else{
        push( @matches, $1 . "n" );
    }
    $matching = 0;
    }
    else
    {
    if ($num){
        push( @matches, $linecount . ": " . $line );
    }else{
        push( @matches, $line);
    }
    }
}
}
close IN;
return @matches;

}

sub mgrep_dir
{
my $dir = shift;
my @file_list;
my @match_list = ();
my $ret;
my @lret;

opendir(IN_DIR, $dir) || return undef;
@file_list = grep { $_ ne '.' and $_ ne '..' } readdir IN_DIR;

if (@file_list){
for my $one (@file_list) {
    my $fname = "$dir/$one";
    if (-f $fname){
    next if(!-T $fname &amp;&amp; !$allow_binary);
    $ret = mgrep_file($fname);
    next unless @$ret;
    push @match_list, @$ret;
    }
    if ($allow_recursion &amp;&amp; -d $fname){
    @lret = mgrep_dir($fname);
    next unless @lret;
    push @match_list, @lret;
    }
}
}

closedir IN_DIR;
return @match_list;

}

##### main

while ($file)
{
my $ret;
my @list;

if (-f $file){
next if(!-T $file &amp;&amp; !$allow_binary);
$ret = mgrep_file($file);
print @$ret;
}
elsif (-d $file){
@list = mgrep_dir($file);
print @list;
}else{
die "$file is not existed!";
}

$file = shift;

}

[/perl]

Python和Perl都没消除自指?

[perl]

!/usr/bin/perl

use strict;
use warnings;

my @foo = qw(foo1 foo2);
my @bar = qw(bar1 bar2);

push @foo, @bar;
push @bar, @foo;

print @{$foo[2][2][2][2][2][2][2][2][2][2]}, “n”

please add more if you want

[/perl]

[python]

!/usr/bin/env python

foo = [‘foo1’, ‘foo2’]
bar = [‘bar1’, ‘bar2’]

foo.append(bar)
bar.append(foo)

print foo[2][2][2][2][2][2][2]

please add more if you want

[/python]

C语言显然不会出现这种情况,因为要用指针的话这两种指针显然不是一个层次上的,必须通过强制转化。而Python和Perl之所以都会出现这种情况是因为他们的的list都太NB了,啥都能放,包括它本身!!

或者是我最近看《集异璧》看多了??

发布Qbak项目

Qbak 是 “Quick Backup” 的缩写。Qbak 是 Linux 上使用的备份工具,目前只有 命令行界面。但我会考虑以后为它加入图形界面。

Qbak 的使用和配置非常简单,它读取~/.qbakrc作为配置文件,并把里面指定的目录作为“输出目录”,即存放备份文件归档的目录。建议设置为”~/.qbak”。 关于配置项请看源代码中的示例配置文件。

Qbak 使用了一种半“堆栈式”的管理方式,即通过push和pull来加入和导出备份文件。Qbak 的接口有点像git,通过其子命令来完成各种功能。想了解更多请去项目主页

现在 Qbak 还不成熟,有一些小bug,还有许多待完善的地方。Qbak 是用bash脚本写成的,欢迎有兴趣的同学加入!!

下载地址:
http://wangcong.org/projects/qbak-0.1.tar.gz

Qbak 项目主页:
http://wangcong.org/projects/qbak.html