Jul 21, 2011

开始twitter

帝都就是不一样啊, 好多大仙儿们的真身都在这儿.

为了避免错失聚餐之类的活动, 我也开始twitter啦, @adam8157, 是该说我稳重还是落伍呢? :)


Jun 1, 2011

Red Hat第一天

2011-6-1, 今天顺利入职Red Hat, 大家都很nice, 环境也很好, 感觉很不错.

感谢Caspar的引荐, 感谢Sophie在入职问题上的帮助, 感谢Gery在入职后的各种帮助.

其实Red Hat没有想象中那么难进, 我也只是做了四份题(C, Shell, Linux基础, Kernel基础), 然后和Leader, HR分别谈了一次就差不多了. 待遇和环境什么的又很不错, 十五天带薪年假, 不定时上班, 不定时下班, 可以在家办公, 穿着随意, 休息室, 台球厅, 免费饮料和零食, 报销家里上网费… 我觉得各位只要技术不错, 对Linux有爱, 就相当值得一试.

还有, 我今天竟然遇到了我好多年没见的初中同学, 在休息室瞪着瞪着俩人就震惊了, 傻乎乎地喊着”啊…你…”, 乐哈哈地用方言叽里呱啦, 呵呵, 有意思.

PS, 我已经从Red Hat离职了.


Jun 1, 2011

Congratulations, FC Barcelona

这几天只是没上网, 直播都是看了的. 一样得激动, 一起得开心. 祝贺大家!


May 8, 2011

Dropbox太棒了

Dropbox实在是太棒了.

1, 跨平台, Linux/Mac/Windows/移动设备
2, 安全, 传输采用SSL, 存储采用AES-256
3, 速度快, 且使用差分传输技术, 快上加快
4, 自动同步, 让你多个设备上的文件保持同步
5, 操作方便, 文件拖进去或者建立软链接都可以
6, 可以共享文件夹, 实现多人共同协作编辑和分享
7, 有版本控制功能, 文件丢了, 修改错了都能找回来

我的推广链接注册, 初始容量会比默认的2G多250M.

PS: 默认的Linux客户端需要Nautilus, 没有的可以看看这篇Wiki.


May 6, 2011

让dd显示进度

最近在用dd处理一些东西, 大概执行一次两三个小时的样子, 但是dd默认没有进度输出, 很不方便.

好在, dd接收到SIGUSR1信号时会输出当前的读写进度, 可以利用这个特性和watch达到想要的效果, 例如这样:

dd if=/dev/zero of=/tmp/foo&

watch -n 10 pkill -USR1 ^dd$

ref:
1, http://www.commandlinefu.com/commands/view/4011/check-the-status-of-dd-in-progress
2, http://shellscripts.org/project/ddprogress

PS, dd现在支持直接显示进度了, 参数是status=progress


Apr 20, 2011

彩色Manpages

有句玩笑话: “RTFM(Read the F**ing Manual)”和”RTFSC(Read the F**ing Source Code)”是解决问题最有效的两种方法.

然而这么重要的man默认显示却只有一种颜色, 效果也只是简单的加粗, 下划线和闪烁, 实在是简陋, 效率也低. 所以我通过下面的配置给它加了几种颜色, 看起来舒服多了.

我加到.bashrc中的:

export LESS_TERMCAP_mb=$'\E[05;34m'       # begin blinking
export LESS_TERMCAP_md=$'\E[01;34m'       # begin bold
export LESS_TERMCAP_me=$'\E[0m'           # end mode
export LESS_TERMCAP_se=$'\E[0m'           # end standout-mode
export LESS_TERMCAP_so=$'\E[44;33m'       # begin standout-mode
export LESS_TERMCAP_ue=$'\E[0m'           # end underline
export LESS_TERMCAP_us=$'\E[04;33m'       # begin underline

效果大概是这样:

原理其实就是一些ANSI color escapes, 分别作用于原来的粗体, 下划线, 闪烁和提示消息, 格式如下:

{ESC}[{attr};{bg};{fg}m

attr:
Reset         00
Bold          01
Italic        03
Underline     04
Blink         05
Reverse       07
No Bold       22
No Italic     23
No Underline  24
No Blink      25
No Reverse    27

bg:
BLACK         40
RED           41
GREEN         42
YELLOW        43
BLUE          44
MAGENTA       45
CYAN          46
WHITE         47

fg:
BLACK         30
RED           31
GREEN         32
YELLOW        33
BLUE          34
MAGENTA       35
CYAN          36
WHITE         37

我用的是普通的8色, 感觉还好. 但如果你跟主席一样是个颜色控, 而且你用的终端也支持, 可以将bg和fg换成256色的. 格式相应的变为下面这样, fg和bg的取值范围为0-255:

{ESC}[{attr};48;05;{bg};38;05;{fg}m

========UPDATE========

刚Publish就发现了问题, Fedora 14中上面的设置不起作用!

查了下, 原来是因为某些发行版直接使用ANSI color escapes(也就是SGR escape sequence)去处理粗体, 斜体和下划线, 而我先前的做法只适用于老的控制序列. 废话不多说, 详细的解释去看grotty的手册, 解决方法如下:

export GROFF_NO_SGR=1

========UPDATE AGAIN========

写了个脚本(传送门), 可以打印出8色ANSI Color和256色XTERM Color, 方便颜色控们调试.


Apr 11, 2011

screen中动态设置标题

screen用起来很方便, 和xterm等虚拟终端配合起来更是花样多多. 例如, 我们可以根据screen的状态去动态地调整xterm的title. 这个功能我之前就实现过(传送门), 但是那些sequences很难懂, 我自己今天再看过都糊涂了, 所以赶紧记下.

hardstatus off
hardstatus string "screen(@%H): %t"
termcapinfo xterm* 'hs:ts=\E]0;:fs=\007:ds=\E]0;\007'

上面是我screen中这部分的配置, 第一句是禁止在hardstatus line中打印警告, 第二句是设置hardstatus line的内容(详见screen手册中的STRING ESCAPES), 第三句最难懂了, 它的意思是把xterm的titlebar当作screen的hardstatus line.

详细说第三句, hs表示终端有个hardstatus line, ts提供进入hardstatus line的 escape sequence, fs是离开时用的, ds是用于清除的. 它们各自的escape sequence是在xterm中定义的, 意义如下:

3.1 xterm escape sequences Window and icon titles may be changed in a running xterm by using XTerm escape sequences. The following sequences are useful in this respect:

ESC]0;stringBEL -- Set icon name and window title to string
ESC]1;stringBEL -- Set icon name to string
ESC]2;stringBEL -- Set window title to string

where ESC is the escape character (\033), and BEL is the bell character (\007).

PS: 发现自己真是挺能折腾的…


Mar 6, 2011

内核笔记-关于高端内存

内存寻址和管理一直都是理解kernel的重点和难点, 邮件列表中很多人(包括我)对于这部分的理解总是不那么透彻, 经常一个问题提出来, 几封邮件之后就乱了, 除非大牛过来救火, 一群人晕晕乎乎半天也搞不清楚.

几个月前列表里有人问过高端内存的问题, 当时借着那个问题我又好好把这块儿看了一遍, 还记了点笔记, 今天拿出来再复习总结一遍.

Linux把物理内存划分为了三个管理区, 分别为0-16MB的ZONE_DMA, 16-896MB的ZONE_NORMAL和高于896MB的ZONE_HIGHMEM也就是高端内存.

至于为什么这么划分, ZONE_DMA好理解, 因为ISA总线只能对前16MB进行DMA寻址, 这块要分出来不能乱用. 而ZONE_NORMAL和ZONE_HIGHMEM为什么从896MB区分呢? 这还得从物理地址和虚拟地址说起.

默认情况下, 内核空间是指3GB-4GB的虚拟地址, 用户空间则是0-3GB. 内核进程和用户进程分别活动在自己的空间内. 这里重点说内核空间, 3G-(3G+896MB)这块是直接映射, 减去PAGE_OFFSET(0xC000000)就是真实物理地址, 剩下那128MB(4G-3G-896MB)是用来做各种映射的, 包括整个高端内存的映射, 如果不留出这么一段做映射, 内核就只能管理1G的物理内存, 余下部分就只能浪费了.

这里有个小难点. 有人会问, “如果剩下那些映射给用户空间, 内核不就可以不管了么, 高端内存也就不需要了吧?” 此言差矣, 点出来也就是一句话的事儿: 用户空间的内存使用也是内核分配的, 内核当然要有能力控制所有硬件资源.

PS: 以上都是基于x86架构, x86_64没有高端内存, 有的MIPS32处理器的高端内存则默认从256MB开始.


Feb 17, 2011

Vim和BOM

最近发现个怪现象, 从Vim中复制的文本(xsel的方式)和实际文本有点点区别, 会在头部加几个不可见的字节(0xEF 0xBB 0xBF), 粘贴到别的程序里有时会引发错误.

查了下, 原来这几个字节是Unicode的BOM(Byte order mark), 用来标记UTF-16和UTF-32编码文件的字节序, UTF-8并不需要. 但因为这个文件我曾经用Windows的记事本保存过, 它自作聪明地加了个BOM, 而Vim识别到文件有BOM就会自动打开bomb这个选项(具体解释请看Vim中bomb和fileencodings的帮助), so…

于是, 这样, 然后保存就好了:

:set nobomb

小提示, 查看当前bomb是否打开可以这样:

:set bomb?

Jan 24, 2011

用vim处理svn的conflicts

半年之前就用vimdiff取代了svn的diff(传送门), 但是冲突处理没能用vim实现, 一直耿耿于怀, 这几天终于忍不住收拾了下.

svn处理merge是用的diff3, 顺利合并就返回0, 合并错误就给出选项询问如何解决. 传统的外部工具处理方式也是从这里hook, 比如kdiff3, 先合并, 顺利合并就往下走, 合并错误就出一个用于merging的界面给你编辑, 手动处理后返回0退出.

但是vim并没有实现diff3, 所以hook这里并不合适. 还好, 1.5版的svn引入了交互式的冲突解决方式, 其中有用外部工具处理冲突的”l”. 和你写diff3的wrapper脚本不同的是, 这个只有在diff3不能顺利处理合并的时候才会启动, 容易处理得多, 只需要写个很简单的脚本, 然后将svn配置里的merge-tool-cmd指向它就好.

#!/bin/sh

# Configure your favorite merge program here.
MERGE="vim -d"

if [ -z $2 ]
then
	echo ERROR: This script expects to be called by subversion
	exit 1
fi

# Subversion provides the paths we need as the first, second, third
# and fourth parameters.
BASE=${1}
THEIRS=${2}
MINE=${3}
MERGED=${4}

# Call the merge command (change the following line to make sense for
# your merge program).
$MERGE $MERGED -c ":diffsplit $MINE" -c ":vertical diffsplit $THEIRS" \
	-c ":vertical diffsplit $BASE"

# Return an errorcode of 0 on successful merge, 1 if unresolved conflicts
# remain in the result.  Any other errorcode will be treated as fatal.
exit 0

Enjoy it.