May 10, 2010

清理Debian内核和头文件的脚本

改自bones7456清理ubuntu内核的脚本, 原文地址在此: http://li2z.cn/2010/02/28/clean_ubuntu_kernel/.

Debian和Ubuntu的包命名方式稍有不同, 不能直接用, 改了下, 再就是避免删除元包, 增加了响应输入的功能.

#!/bin/sh

CURRENT="`uname -r | awk -F"-" '{print $1"-"$2}'`"
HEADERS=""
IMAGES=""
ARCH="amd64"

for HEADER in `dpkg --get-selections | grep ^linux-headers | grep -v "${ARCH}" | awk -F"-" '{print $3"-"$4}'`
do
	if [[ "$CURRENT" < "$HEADER" ]]
	then
		echo "The running kernel is not the newest. $CURRENT < $HEADER"
		exit 1
	else
		[[ "$CURRENT" != "$HEADER" ]] && {
			HEADERS="${HEADERS} linux-headers-${HEADER}-${ARCH} linux-headers-${HEADER}-${ARCH}-common"
			IMAGE="`dpkg --get-selections | grep ^linux-image | grep "${HEADER}" | awk '{print $1}'`"
			IMAGES="${IMAGES} $IMAGE"
		}
	fi
done

if [[ -z "$HEADERS" ]]
then
	echo "There is no old kernel or headers need to be cleaned."
	exit 0
fi

echo
echo ------------------------------------
echo "$IMAGES $HEADERS"
echo ------------------------------------
echo

read -p "Really wanna remove these packages? [y/N] " REPLY

case $REPLY in
	y | Y )
		sh -c "sudo apt-get purge $IMAGES $HEADERS" ;;
	* )
		echo "The operation is cancelled." ;;
esac

May 9, 2010

给优盘添加FreeDOS启动项

虽然我不用Win, 但是给优盘添加个FreeDOS启动项还是会方便很多的, 帮别人重装Win, 自己刷BIOS什么的都得用到.

之前优盘上就装的Grub2, 有Puppy和Debian的启动项, 所以仍然选这个方案.

需要用到的东西: balder10.img(就是freedos的镜像, 官方有下载地址), syslinux(只用到里面的memdisk).

我这优盘已经装上Grub2了, 没装的同学按自己的路径执行:

# grub-install --root-directory=/media/sdb1 /dev/sdb

然后就只剩下写grub.cfg了, 注意你的路径:

set root=(hd0,1)
menuentry "FreeDOS" {
	linux16  /boot/freedos/memdisk
	initrd16 /boot/freedos/balder10.img
}

FAQ:

1, 为什么不选freedos的livecd而选了非官方的镜像? 因为livecd是用来安装的, 直接能用的命令很少.
2, memdisk是用来干什么的? 用来装载镜像模拟软盘, 磁盘, CD.
3, 为什么不用WinPE, 一没那么大空间用来浪费, 二goto Warning

Warning:

有的同学一看到memdisk的功能又要开始激动了, 这不就能启动所有的ISO了么? 在下不才, 研究过. 答案是, 不能, 目前的硬件体系永远也不能启动所有的ISO镜像!
实模式的系统和用INT 13中断启动的可以, 因为内存映射没变. 而其它的大多都不可以, 可以的要么是引导起来的内核自己可以用ISO(很多linux发行版都支持), 要么是用INT 13启动某种镜像(如WIM).
当然有很多解决方案, WinVBlock什么的, 说到底都是又生成了一种RAM disk.
总而言之, 想要让启动后进入保护模式的系统ISO直接被引导起来, 目前的硬件体系不允许.


May 9, 2010

倒数第二轮

昨晚的比赛看得我很紧张.

虽然占着榜首并领先一分, 但是总感觉最后几轮有点被动. 还好, 虽然被追了俩, 但还是守住了三分.

关于瓜迪奥拉, 虽然是少帅, 但是实力远比年龄成熟, 丢第一个球的时候只有他意识到了危险.

关于博杨和佩德罗, 表现越来越好, 而且风格很适合巴萨.

关于阿尔维斯, 之前一直不太喜欢, 但是我, 错了.

关于梅西, 希望世界杯时状态依然完美.

关于伊布, 人很好, 只是不太适合巴萨.

关于拉波尔塔, 别听那俩主持人的, 什么成熟不成熟的, 你也是球迷, 你不只是在管理一个俱乐部, 想激动就激动.

关于巴塞罗那, 不着急高兴, 下一场依旧漂亮得拿下再说.

关于赛维利亚, 果然是个很神经质的球队, 不过我喜欢, 因为我也神经质.

关于我, 起早了, 觉没补够.


May 7, 2010

彻底废掉Dell笔记本的MediaDirect

话说, 我现在用的笔记本是Dell Vostro 1400, 虽然预装了Vista, 却是一次也没启动, 当时直接进LiveCD清掉了硬盘. 众Linuxer也可以这么干, 只不过要注意一个问题, 今天一个朋友问到我, 顺便在这儿记录一下.

Dell的本子只要不是很低端的都带一个MediaDirect, 基于Win, 可以用它看个图片电影什么的, 可能对某些人来说比较方便, 但在我看来就是废品, 更不必说它的启动过程会进行很危险的操作了, 所以, 杀无赦…

要知道怎么废掉它, 首先得明白它的原理, 它是基于Win的, 而Win的启动必须是可引导的主分区, 那么你又装了一个Win怎么办? Win的引导程序只能启动第一个可引导的主分区, 更别说Dell希望这个MediaDirect的分区平日是隐藏的了. 所以, Dell想到了一个很危险的解决方案—一个如果你操作不当,  会清掉你的分区表, 不修复就会丢掉所有硬盘数据的方案. 简单说, Dell用MediaDirect键, 也就是那个房子键启动MediaDirect的时候, 会改硬盘的分区表, 调整MediaDirect分区从隐藏变成主分区, 并设置为可引导, 关掉MediaDirect的时候再改回去, 很危险吧, 尤其是当你删除了MediaDirect分区的时候.

当然, 长按MediaDirect键可以恢复, 但是这换来换去的, 又是很重要并且很脆弱的数据, 我放心不过. 而且我希望免掉这个麻烦, 万一我不小心碰到房子键呢? 能不能废掉这个按键, 让它也变成正常的开机按钮呢?

当然可以, 说了这么多废话, 来看操作. 注意这个操作会废掉你的分区表, 事先备份!

1, 短按电源键开机进入Live系统

2, #dd if=/dev/zero of=/dev/sda count=1

3, 短按MediaDirect键开机进入Live系统

4, #dd if=/dev/zero of=/dev/sda count=1

5, 长按MediaDirect键开机

现在好了, 不管你按哪个键都能正常开机而且不会搞乱你的分区表.

这中间还涉及到一些MediaDirect键的技术细节, 有校验, 存储的也不是普通的MBR, 而且Dell的工程师工具可以改. 但是过了很长时间了, 已经记不大清了, 不敢胡说, 有兴趣的朋友可以给我发邮件.

好了, 该睡了. 晚安.


May 5, 2010

利用mutt的filter实现新邮件提醒

“All mail clients suck. This one just sucks less.”

mutt实在是强大, 千奇百怪的功能, 只有你想不到的, 没有不能实现的.

mutt擅长和其它软件配合, 比如抓取邮件部分有人用fetchmail, 有人用getmail, 有人用内置pop3, 也有人像我一样用内置imap. 但都会遇到一个问题, 新邮件提醒, 这个问题上更是各显神通, inotify监视本地mailbox的, 安装各种notify软件的, 嵌在conky里的, 脚本抓取atom订阅配合cron的.

第一种也可以, 就是有点麻烦, 有点小题大做. 而后面的几种解决方法我觉得都不太好, 因为如果是gmail, 就隔几分钟就登录gmail; 如果不是gmail, 基本上都不太容易实现. 我理想的新邮件通知是这样的: 只依靠mutt来检测, 能够改掉screen里mutt的title, 能跳出notify提示你有新邮件, 能配合声音, 能…

解决问题的过程无非就是RTFM, 很好, mutt提供了一个filter的功能, http://www.mutt.org/doc/devel/manual.html#formatstrings-filters, 简单说就是将status通过管道pipe到一个脚本, 这下好了, 你的status里设置上新邮件相关字符串, 脚本里一检测, 其它的问题就全都解决了.

下面是我mutt中status_format的设置, manual中说了, 最后加上(“|”), 就将status字符串传递给第一个词, 也就是我指定的mutt-filter脚本. 顺便说一句, mutt没那么蠢, 当然是只有这个字符串变化了才会触发pipe的动作.

set status_format="mutt-filter '-%r-Mutt: %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]----%>-(%P)---'|"

下面是我的mutt-filter脚本, 我只改了screen的window title, 发了个notify, 想要声音的自己加上就是. 最后那行的echo “$1”是将字符串还给status, 要不只是pipe到脚本, status空了的.

#!/bin/sh

if [[ "$1" =~ "All Mail" && "$1" =~ "New:" ]];then
	notify-send "Get new mails"
	printf "\ekmutt: new\e\\" > /dev/tty
else
	printf "\ekmutt\e\\" > /dev/tty
fi

echo "$1"

May 3, 2010

关于SVN的外部diff工具

公司的项目用的SVN, 也还好, 虽然慢点. 但是它的diff和merge实在是human-unreadable.

还好, SVN可以使用外部的diff工具, 例如vimdiff, 只要写个下面那样的脚本, 然后将svn的config中diff-cmd指向它就好.

另外关于diff3, 我的理解刚开始和svn的merge不同, svn实际上是将两个版本的差异变化实施到当前版本. 我想用vimdiff来实现, 最后cat合并后的本地版本以满足svn的要求, 但是一直有问题, 还差点在生产中出状况, 而且这个用的也不多, 所以暂时放下. 有那位大侠实现了vimdiff作为svn的diff3-cmd, 请一定告诉我, 联系方式见About.

#!/bin/sh

# Configure your favorite diff program here.
DIFF="vimdiff"

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 sixth and seventh
# parameters.
LEFT=${6}
RIGHT=${7}

# Call the diff command (change the following line to make sense for
# your merge program).
#$DIFF --left $LEFT --right $RIGHT
$DIFF $LEFT $RIGHT

# Return an errorcode of 0 if no differences were detected, 1 if some were.
# Any other errorcode will be treated as fatal.
exit 0

May 3, 2010

我的配置文件和脚本

放在了Github上. 真的是超喜欢Git, 又快又方便, 和Vim整合的又好.

最近有时间会详细解释下各个配置文件, 例如bash, screen, vim, mutt等, 敬请期待.

网页浏览:

http://github.com/adam8157/

Git clone:

git clone git://github.com/adam8157/dotfiles.git
git clone git://github.com/adam8157/scripts.git

May 2, 2010

Vim配合xsel访问剪贴板

话说我一直在虚拟终端下用vim的, 但是有个问题, 普通版本的vim无法访问中键和系统剪贴板, 这也不是大问题, 鼠标选就是了, 但是有时候需要和虚拟机交互, 要知道我这连leafpad都没装, 所有的编辑工作全是vim, 为了这么点事把vim的图形库装上实在是让我不爽.

好在, 有xsel, 用它配合vim就能访问中键和系统剪贴板, 洁癖狂和折腾狂再一次胜利了.

代码放在后面, 可以看到, 我把它们伪装成了*和+寄存器, 但是功能和原版的有差别, 只能先yank在再复制到剪贴板, paste没问题. 至于为什么不用xclip, xclip会因为detach在关闭vim后失效, xsel却能避免, 虽然会产生一个错误log, 但是把这个log指向/dev/null就好.

PS: 哪位大仙如果知道如何简单将区块传给命令而不是叹号filter这种形式, 一定告诉我.

" Use xsel to access the x clipboard
if $DISPLAY != '' && executable('xsel')
	nnoremap <silent> "*y :'[,']!xsel -i -p -l /dev/null<CR>u
	nnoremap <silent> "*p :r!xsel -p<CR>
	nnoremap <silent> "+y :'[,']!xsel -i -b -l /dev/null<CR>u
	nnoremap <silent> "+p :r!xsel -b<CR>
endif

——–Better Way——–

" Use xsel to access the X clipboard
if $DISPLAY != '' && executable('xsel')
	nnoremap <silent> "*y :'[,']w !xsel -i -p -l /dev/null<CR>
	nnoremap <silent> "*p :r!xsel -p<CR>
	nnoremap <silent> "+y :'[,']w !xsel -i -b -l /dev/null<CR>
	nnoremap <silent> "+p :r!xsel -b<CR>
endif

May 2, 2010

Genesis - Let there be a blog

开博的想法由来已久.

为什么开? 这是个好问题.

1, 大家都有, 作为一个不甘人后的无畏青年, 我, 必须有一个.

2, 自己需要一个记录计算机学习, 工作琐事, 感情生活的自留地.

Adam Lee said, Let there be a blog: and there was a blog.