2008/2

还可以这样利用x86的堆栈

原来还能这样“践踏”x86的堆栈,利用push后直接ret,很简单很直接!以前都是利用缓冲区溢出去覆盖~

我写的用户空间的一段示例代码(注:执行时的段错误是意料之中的):

include

void hello(void)
{
printf(“hello world!n”);
}

void pushcall(void *call)
{
asm _volatile
(“pushl %%eaxnt”
“ret”
::”a” (call)
);
}

int main(void)
{
push_call(&hello);
return 0;
}

git使用小结

1. git-config

配置git,一般需要配置的是user.name,user.email,有时sendemail.smtpserver也要配置,比如,我使用msmtp:

git-config —global sendemail.smtpserver /usr/local/bin/msmtp

如果你仅仅是想给这一个项目配置,把—global选项去掉。查看配置的选项是—list。

  1. git-pull

git-pull没必要带后面那长长的url(-_-b 我那么用了好多次,不过我用的是!git-pull)。如果你在给Linux内核这样的项目工作,记得git-pull之前检查是不是在master分支。

3. git-format-patch

如果发送多于一个补丁,最好用[PATCH n/m]的形式,加上-n。加signed-off-by那行是-s。指定为几次commit生成补丁,直接加数字,比如,

$ git-format-patch -3

检查补丁是—check,最好加上这个。

4. git-send-email

如果一次提交补丁比较多,最好用—no-chain-reply-to,因为如果不用的话,在thread嵌套会太深,不利于别人阅读。这个也可以通过选项sendemail.chainreplyto来控制。—signed-off-by-cc,要加上,可以省去手工处理的麻烦。—compose用来编辑[PATCH 0/m],这个一般是对整个patchset的描述。—smtp-server,如果你不想用git-config指定的话,用它也行。—cc和—to就不用说了。

5. git-commit

在git-commit之前最好git-add。git-commit几个常用的选项有:-s 会增加Signed-off-by行,-e编辑commit message,-a表示all,-m是指定commit信息。同样,删除文件是先git-rm。查看commit列表用git-rev-list,查看某个commit用git-show,查看commit的日志用git-log,-p是以补丁的形式查看。

6. 其它

git-diff也可以比较不同版本之间的差异,某个版本的某个文件的差异,如:

$ git-diff v2.6.22
$ git diff v2.6.20 init/main.c
$ git-diff v2.6.23 v2.6.24-rc1 init/main.c

git-whatchanged也差不多:

$ git-whatchanged -p init/main.c

7.错误提交了commit怎么办?

a) git-revert

这个本身就会产生一个commit,如果用得多了会让你的log看起来不那么干净。;-)

b) git-reset

用这个要当心,它会把那个commit之后的commit全部删除。一个好的办法是:先建立一个临时的分支,然后再git-reset,再git-rebase,最后再删除临时的分支。 详细可以看这里

Programming Competitions are Considered Harmful

今天在reddit上看到关于编程竞赛的讨论,有个人的观点很有意思,他(她)认为:

Programming is like music, as soon as you compete with others, you lose everything.
仔细想想这句话其实很对。我心目中供奉的那些大牛们,像Linus TorvaldsRichard StallmanBill JoyDonald KnuthDennis RitchieKen ThompsonRob Pike等等,没一个是因为什么编程比赛而出名,甚至都没听说过有一个曾参加过什么国际编程竞赛。Knuth参加过一个编程比赛,我承认,但那是人家CalTech自家的比赛。

不像我们天朝,为了参加某编程比赛争得头破血流,每年都乐不疲此。一年又一年,天朝拿到的金银铜铁牌已经无数了,可是怏怏大国到现在还没有一个图灵奖得主!噢,别提这个,有人会不满意,比如公子同学。反正我们近几十年内是没希望拿上,提也没用。

那天朝为什么至今仍没有自己的CPU和操作系统呢?喔,我说错了,我们有龙芯!不过这正好印证了我的观点。想一想,我们至今没有自己的操作系统,却有了自己的CPU,这又是为什么呢?那是因为ASIC领域没有类似ACM,*OI这样的比赛!

我不否认参加编程比赛的也有高手,但是如果为了比赛而去编程,那还有什么意思呢?现实中有很多很多问题需要解决,何必放此不管而解决那些人为制造的玩具问题呢?

给emacs安装color-theme

决定给emacs换个主题,因为默认的这个主题比较丑。

简单搜索了一下,需要安装color-theme这个package。从这里下载:

http://download.gna.org/color-theme/

下载解压缩后,需要

1) 把color-theme.el拷贝到某个load-path中,比如我的是~/.emacs.d

2) 把themes目录也要拷贝到上面的路径中

3) 在~/.emacs里添加下面几行:

(require ‘color-theme)
(color-theme-initialize)
(color-theme-oswald)

注意:网上的很多教程并没提到第2行,但是它必须有,否则会出错。
最起码在我这里如此。

第3行是我自己选择的一个主题,你可以换成你自己喜欢的,浏览里面
的主题可以用M-x color-theme-select,然后一个个地试,觉得哪个好
就把第三行替换成那个。

最后,如果你有其它主题,把它下载到themes目录里,然后再修改
~/.emacs:

(load-file “~/.emacs.d/themes/your-own-theme.el”)
(color-theme-your-own)

这样emacs看起来就很漂亮。

BTW,这里有一款为mm准备的粉红主题,很炫。不知道有没有mm使用emacs?

在emacs里写blog

搜了好大一会儿才找到emacs的这个写博客的插件——weblogger,配置很简单。
不过下载要直接从CVS上取,用如下命令:

cd ~/.emacs.d/
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/emacsweblogs
co -d weblogger weblogger/lisp

然后编辑~/.emacs:

(add-to-list ‘load-path “~/.emacs.d/weblogger”)
(require ‘weblogger)

配置博客:

M-x weblogger-setup-weblog

写博客:

M-x weblogger-start-entry

发表博客:

M-x weblogger-save-entry

保存博客:

M-x weblogger-send-entry
更多的其它命令可以查看weblogger的帮助。

这是第一篇在emacs里写的文章,作个实验。;-)

Update:这里有一个更新版本,用wordpress的同学最好使用这个。

我们喜欢用倒装都

一位伟人曾经说过:“生活不是缺少美,而是缺少发现。”这话忒对了!

最近我就发现,我们平时说话的时候也喜欢时不时地用一下传说中的倒装!下面这些例子就是:

“干嘛呢你?”

“能干什么都?”

“去过了已经。”

“快要下雨了好像。”

“我就要走了马上。”

再来几句常用的陕西话,也是倒装。

“额的神呀!这女娃美滴很!”

“今儿天热太太。”

可惜现在的倒装句是越来越少了。相比之下,古文中的倒装就比较多,比如,

“何陋之有?”

“吾谁与归?”

“而今安在哉?”

“古之人不余欺也!”

英文就更不用说了,倒装更多,尤其是书面语中,而且还有全倒装。

莫非中文真的落后了?

Because I wanted to live deliberately

仅从名字来看,很难想到《死亡诗社》是怎样一部电影。看到它,我们首先想到的可能是和死亡有关,但事实相反,这是一部相当优秀的青春励志片。

它讲述的是一个“浪漫诗人”老师Keating如何教会年轻的学生找到生活的激情,和属于自己的人生道路。“死亡诗社”正是他自己年轻时组织的一个社团,带领同伴,去山洞里一起朗诵诗歌。学生们像老师那样,成立了自己的死亡诗社。受到了老师上课的感染,学生们学会了寻找自己的“激情”。无奈现实是残酷的,保守的父亲把自己的儿子逼得自杀,死板的校长开除了Keating老师……在影片最后,当Keating离开学生们时,学生们不顾校长的威胁,一个个相继站到了课桌上,对他说“Oh, captain, my captain!”感动……

里面提到了梭罗的《瓦尔登湖》中的一首诗:

我步入丛林,
因为我希望活得从容,
我希望活得深刻,
吸取生命中所有的精华,
把非生命的一切都击溃。

以免当我生命终结时,
我发现自己从没有活过。

I went to the woods
because I wanted to live deliberately.
I wanted to live deep,
and suck out all the marrow of life.
To put to rout all that was not life
and not, when I had come to die,
discover that I had not lived.

非常唯美,恐怕作任何评论都是多余的。看完之后二话没说,赶紧从当当网上把《瓦尔登湖》给收了。

I think Yanping was right, life is important. ;-)

不知道的几个技巧

以前俺好傻好天真。。。

俺以前总以为,一个文档内容要是不停地变化,查看其最新的内容就得先less foo然后不停地按End键。现在,俺终于知道了,tail这东西,它有个选项叫-f,就是干这事儿的!这就省去俺多按N次End键的工夫!

俺以前总以为,要打印某个文件第m行到第n行之间的内容必须用awk,或者head与tail的管道组合。现在,俺总算是明白了,做个事的其实是sed,它短短一句就可以完成!比如,打印第3行到第10行之间的内容就用:

sed -n ‘3,10p’ warnings.txt

俺以前总以为,查找某个进程就得ps aux | grep xxx,现在,俺知道了,其实还有个东西,它叫pgrep,所以可以这样用:

pgrep -l xxx

类似,也有个东西叫pkill。

俺以前居然不知道还有个叫disown的东西,现在,俺终于知道了,挺有用。

俺以前不知道rm还可以这样删除名字以-开头的文件:rm — -xxxx。

在emacs下使用mew

作者: 西邮 王聪

Mew是emacs里面一款很好很强大的邮件客户端插件,最近因迷恋emacs所以决定要把邮件客户端也换成emacs里面的。

在这里,我以Fedora和Gmail为例简单说一下配置过程。

首先需要安装mew,Fedora用户直接

yum install mew

就可以了。安装好之后就开始配置,不用担心,其实很简单。需要修改的配置文件就两个,一个是~/.emacs,另一个是Mew专用的~/.mew.el。虽然说这些配置项放哪个文件里都成,但是最好还是人为区分一下,免得弄得~/.emacs里一团糟。;-)

我在~/.emacs里为Mew添加了下面这些东西:

(autoload ‘mew “mew” nil t)
(autoload ‘mew-send “mew” nil t)
(if (boundp ‘read-mail-command)
(setq read-mail-command ‘mew))
(autoload ‘mew-user-agent-compose “mew” nil t)
(if (boundp ‘mail-user-agent)
(setq mail-user-agent ‘mew-user-agent))
(if (fboundp ‘define-mail-user-agent)
(define-mail-user-agent
‘mew-user-agent
‘mew-user-agent-compose
‘mew-draft-send-message
‘mew-draft-kill
‘mew-send-hook))

(set-default ‘mew-decode-quoted ‘t)
(when (boundp ‘utf-translate-cjk)
(setq utf-translate-cjk t)
(custom-set-variables
‘(utf-translate-cjk t)))
(if (fboundp ‘utf-translate-cjk-mode)
(utf-translate-cjk-mode 1))
(require ‘flyspell)

然后在编辑~/.mew.el(没有就先创建)。我用的可以在这里下载,我这个是综合了网上各路神仙的配置之后的结果。;-) 然后你根据自己需要把它修改成你自己的就行了。

配置完成后我们进入mew模式就可以收发邮件了。我再总结一下它的基本使用方法:

w 写信
M-TAB 补齐收信人信息
Q 退出mew
i 收信
g 跳转邮箱
o 对邮件进行分类
d 把邮件标记为删除

  • 作星号标记
    u 清除标记
    x 对所有标记进行处理
    a 不带引用的回复,不建议使用
    A 带引用的回复,推荐
    f 转发邮件
    y 保存邮件,会提示是保存整个邮件和是仅保存正文
    SPACE 阅读邮件
    ENTER 让阅读的邮件向上滚动一行
  • 向下滚动一行
    n 下一封邮件
    p 前一封邮件
    j 跳到某一封邮件
    N 下一封带星号的邮件
    P 上一封带星号的邮件
    S 按某个指定项目对邮件排序
    / 按指定条件搜索邮件,并进入虚拟模式
    tt 进入虚拟模式,根据线索查看,普通模式下是不可以的
    C 如果设置了多个邮箱,用此切换
    C-cC-m 编辑新邮件,放入草稿中
    C-cC-c 发送邮件
    C-cC-q 取消草稿
    C-cC-a 插入附件
    C-cTAB 插入签名
    C-cC-l 转换当前邮件的编码格式
    C-cC-y 复制部分邮件,带引用前缀
    C-cC-t 复制部分邮件,不带引用前缀
    C-cC-a 把当前的发信人加入地址薄
    C-uC-cC-a 比C-cC-a多加入昵称和名字,推荐

恩,我就知道这些,但这些也已经足够对付日常使用了。如果需要更多,可查看mew官方网站上的手册

参考资料:

1. Mew官方手册:http://www.mew.org/release/info/index.html.en

2. http://www.zhangw.com/emacs/dotmewel.html

3. http://learn.tsinghua.edu.cn:8080/2004211031/publish/GNU/mew.html

昨天比较倒霉

事实证明昨天确实很倒霉。

先是在配置mew时把辛辛苦苦积攒了N个月的邮件存档给弄没了,因为mew默认使用的收件箱是~/Mail/inbox,这个目录它要自动创建,而我的mutt偏偏用的是一个名为~/Mail/inbox的mbox文件!结果就是被直接覆盖。。。妈呀,眼睁睁地看着它就没了!悲伤啊~!

然后是,晚上睡觉时一不小心把热水袋给踢坏了!结果水都漏了,被子也湿了,实在没法睡了,然后又把老妈叫醒换的新被子。折腾了半天才睡成。