my new blog is live

Since wordpress.com cannot be accessed from mainland China. I setup my independent blog at http://blog.binchen.org. This blog won’t be updated in the future.

Advertisements

My Emacs configuration

Features

  • support c++/python/perl/ruby-on-rails/javascript
  • eim (Chinese Pinying IME for emacs)
  • org2blog (post wordpress blog by org-mode)

Install

git clone git@github.com:redguardtoo/emacs.d.git ~/.emacs.d;

Some plugins need be compiled for better performance (OPTIONAL)

  • cedet,ecb,emacs-w3m,org-mode,nxml-mode,mmm-mode,auto-complete
cd ~/.emacs.d/site-lisp;make -C cedet;make -C ecb;make -C org-mode;make -C nxml-mode;make -C auto-complete
cd ~/.emacs.d/site-lisp/emacs-w3m;autoconf;./configure;make;sudo make install-info-en;
cd ~/.emacs.d/site-lisp/mmm-mode;./autogen.sh;./configure;make;sudo make install-info;

sh

  • rinari (install info only)
cd ~/.emacs.d/site-lisp/rinari;rake doc:make_info;sudo cp doc/rinari.info /usr/share/info;sudo install-info /usr/share/info/rinari.info /usr/share/info/dir
  • eim
cd ~/.emacs.d/site-lisp/eim;emacs -batch -f batch-byte-compile *.el;

有用的emacs快捷键

  • 列编辑C-x r t yourstring RET (参见How to do select column then do editing in GNU Emacs ?)
  • 记录当前位置到register中 C-r SPC (需安装better-registers.el,且要注释掉其中对快捷键’C-x r’的占用)
  • 跳转至某register, C-j (需better-registers.el)
  • Save frame configuration to register, C-r f (要求同上)
  • Comment current line, M-; (需qiang-comment-dwim-line)
  • Vist the next/previous error message, M-g M-n/M-p
  • find-tag/pop-tag-mark, M-./M-*

Perforce Tip: how to apply my default change to the release branch

Create the patch,

p4 diff -du -db main-branch/... > ~/mywork.patch

Go to the work directory of release branch.

cd dir-release-branch/

`p4 edit’ the files I want to patch under release branch. Please note,

  • `lsdiff’ is from the package `patchutils’.
  • `nosl’ will strip the slashes. It’s written by me.
cat ~/mywork.patch|lsdiff|nosl 5|p4 -x - edit

Patch the files and DONE!

patch -p5 < ~/mywork.patch

Here is the source code of nosl. I put it in my .bashrc

function nosl(){
  if [ -z "$1" ]; then
    echo "Usage: echo /hello/world|nosl num"
    echo "strip num leading slashes"
  else
    perl -pe "$n=$1;while($n>0){ $_=~ s/[^/]*/+//;$n--; }"
  fi
}

BTW, you could save all the trouble of Perforce by switching to Git.

Linux桌面使用之道

我在个人电脑使用Linux桌面已4年(工作中使用Linux的时间要长的多),深深体会到了Linux桌面的好处.

从某种角度来看,Linux桌面要比Windows桌面好用得多.前提条件是,

  1. 使用者有一定的理性思维
  2. 坚持适合自己的原则
  3. 方法和工具

我使用的Linux发行版是Arch Linux,其特点(缺点?)是软件更新快,最新的软件包未必经过长时间的严谨测试.所以Arch Linux绝不是发行版中最不折腾人的,我能和它和谐,和其他发行版就不用说了.

第一原则,不折腾

对我而言,使用软件的目的是工作和娱乐.软件只是帮助我实现目的的手段而已,和实现目的无关的资源消耗越少越好.

坚持该第一原则,日常操作就可以很有效率.

选择软件的标准

选软件就是投资

我的标准是选软件要成本小收益大.收益如前所述,就是工作和娱乐.所以只需考虑削减成本了.

具体措施,就是只用少量软件做尽可能多的事.

Arch Linux的流行作风是一日一更新.我使用的软件数量少,要更新的也少.

那么我是否需要一日一更新呢? Arch Linux有这个选项并不等于我必须这么干.今天我刚升级完1.3版本,明天1.4又出来了,为什么我不多等一天,直接升级到1.4呢?

我的作法就是大多数软件我短期内不升级.最常用的软件我会根据需要理性升级.例如,firefox的安全升级我总是及时跟进,Linux的kernel我一年才升级一次.

依据投资收益的原则,我偏爱命令行软件,因为它们不依赖于图形界面库,升级的压力小很多.同类的命令行软件,我会优先考虑依赖的第三方库比较小的.例如用C写的软件优于用python写的软件.

我有个根据编写软件的语言来判定软件是否轻小的主观标准,c < perl < python, ruby, ….. < c++, java.

以下是我用的主力软件,其中的编辑器,浏览器,Shell,桌面,都是功能强大,定制度高,可编程.

编辑器

我用Emacs,考虑到它可以做任何事,可以认为它是轻量级的.

Vim也用,万不得已用nano,结束了.

浏览器

没多少选择,firefox,如上所述,firefox是我更新频繁的软件.

Shell

我用bash,在我的.bashrc中有如下一行,

export HISTSIZE=200000

确保我输入的所有命令都不会丢失,因为我说过,我偏爱命令行软件,但是要记住常用命令行会消耗我很多脑细胞,这是不符合投资收益原则的.所以我让shell替我记住.我只要记住按Ctrl+R可搜索历史就好了.

桌面

Gnome,KDE是绝对不会考虑的.我安装了Xfce4以给我太太用.我使用更轻量级的musca,安装包大小才100K.

其他

网络管理我用Netcfg(命令行)而不是wicd,因为wicd的依赖多而且曾经折腾过我,播放视频我之用mplayer(命令行),等等.

软件的使用也需维护

安装软件在包管理系统的帮助下很简单.麻烦的是最新软件有时候不稳定,这通常是因为软件的配置文件更新引起的.

将/etc目录下的默认配置文件备份

Linux的软件默认配置文件在/etc/目录下. 我使用分布式版本控制软件git管理/etc目录,分布式版本控制系统好处很多,最大好处就是数据到处有完整备份,非常安全.具体细节请参考wikipedia.

同类软件mercurial,bzr也可,要考虑的因素是第三方服务器是否支持(对分布式版本控制软件来说,第三方服务器不是必需的).

在Arch Linux上每次更新完系统或者安装最新软件包后,可以考虑手动将/etc目录下的文件用git备份(Debian可自动备份).

sudo git add /etc/
sudo git commit -am "backup"

一旦某个软件工作不正常了,可以检查其/etc下默认配置文件的修改纪录,将配置文件恢复到上一个正常工作的版本.

sudo git log /etc/mysql/my.cnf #check history
sudo git checkout commit_ref(version) /etc/mysql/my.cnf #restoren file

/etc/目录下的临时文件不需要备份,以下是我的.gitignore

*~
*.pacnew
*.pacsave
*.swp
*.pacorig
*.swp
mtab

将用户目录下的用户定制配置文件备份

我也是用git,配置文件备份到github的服务器上.这里必须用第三方服务器同步配置,因为我使用多台电脑.

具体操作可写成长篇大论,这里不展开了.

将软件版本降级

最新版本的软件可能不稳定,这时降级是必要的.

请参考Archwiki,实际上很简单,安装名为downgrade的软件,然后让它干所有的体力活就行了.

yaourt downgrade

云备份

电子图书,多媒体文件用专业的云备份服务更好,我推荐Dropbox.

顺便说一下,国内的服务不要用,安全原因,不言自明.

备份操作系统

不用经常作,又有云备份,又有分布式版本控制系统,怕什么.

备份整个硬盘是用Clonezilla,只是备份操作系统的话用以下命令,

tar zcvpf mylinux.tgz --exclude=/proc/* --exclude=/lost+found --exclude='mylinux.tgz' --exclude=/mnt/* --exclude=/home/username/* --exclude=/sys/* /

我建议用前者,因为省事.

阅读官方文档

照着ArchWiki安装软件,一般不会有问题.

加入社区

紧急客户支持还是用IRC比较好,没用过IRC的可以装firefox插件Chatzilla体验一下.

虚拟机的用处

我虚拟机软件使用VirtualBox,虚拟机为Windows XP,该操作系统我会定期更新安全补丁.软件只安装了IE和firefox.该操作系统我只用来操作网络银行.每次操作完毕,我会重置虚拟机状态到操作前的snapshot.

救急工具箱

即使采用了上述做法,一年中也会有一次倒霉.就是我要用的某个版本的某个软件出问题了.没人能帮忙,不能降级,改软件配置也没用,也没有可用的错误信息.

问题看起来很难,事实上5分钟就能搞定.这往往是因为某软件需要的第三方库的版本出问题了.

比如说firefox不能启动,运行如下命令调试,

strace -o err.txt firefox

读一下err.txt就可以知道是哪个库出问题了.相信我,这是不需要任何编程知识的,猜加google就可以了.

你知道哪个库文件出问题了(保险起见,ldd firefox确认一下).比如/usr/lib/libpng.so.14找不到,简单的解决办法是用另一个版本的库文件代替.

如果/usr/lib/libpng.so.15是存在的,我们可以用该库顶替libpng.so.14,

sudo ln -s /usr/lib/libpng.so.15 /usr/lib/libpng.so.14

通常这样就行了.

万一冒名顶替不行,我们就必须根据丢失的库文件查找需要安装的软件包(pacman没用的),

pkgfile libpng

pkgfile属于软件包pkgtools,所以你必须安装pkgtools,

yaourt -S pkgtools-git

用mintty作为cygwin的console

cygwin1.7在我的电脑上不能显示中文,已困扰我很久了.

今天才找到解决办法,只要安装mintty即可.

安装后在宽屏显示器上字可能比较小, 参考其手册缩放字体.

以下是我的cygwin.bat,

@echo off
chdir C:\cygwin\bin
set EDITOR=vi
set VISUAL=vi
REM shamelessly copied from git://github.com/justsoso8/dotfile.git
REM mintty installed which supports chinese
REM =======================================
@echo off
rem find cygwin roo directory one by one
rem disk c -> disk d -> disk e

:CYGWIN_C
if not exist c:\cygwin goto CYGWIN_D
set _cygwinroot=c:\cygwin
goto HAVECYGWIN

:CYGWIN_D
if not exist d:\cygwin goto CYGWIN_E
set _cygwinroot=d:\cygwin
goto HAVECYGWIN

:CYGWIN_E
if not exist e:\cygwin goto NOCYGWIN
set _cygwinroot=e:\cygwin
goto HAVECYGWIN

:NOCYGWIN
echo no cygwin installation found on disk C/D/E
pause
goto EOF

:HAVECYGWIN

set LANG=zh_CN.utf8
rem CONSOLE is sure to know this setting
rem and can display chinese very well
rem but look & feel & funcationality are not as good as mintty

REM select terminal one by one
REM mintty -> rxvt -> console

:MINTTY
set _termapp=%_cygwinroot%\bin\mintty.exe
if not exist %_termapp% goto RXVT
start %_termapp% /bin/bash --login -i
rem mintty has it's option to set as zh_CN.utf8
rem ignore the ${LANG} setting
rem and it appends @cjknarrow automatically
rem current solution is to "LANG=zh_CN.utf8 gvim ..."
goto EOF

:RXVT
set _termapp=%_cygwinroot%\bin\rxvt.exe
if not exist %_termapp% goto CONSOLE
set BGCOLOR=Black
set FGCOLOR=White

start %_termapp% -sl 2500 -fg %FGCOLOR% -bg %BGCOLOR% -sr -fn Courier-20 -geometry 80x25 -e /bin/bash --login -i
goto EOF

:CONSOLE
set _termapp=%_cygwinroot%\bin\bash.exe
start %_termapp% --login -i
goto EOF

:EOF
exit

坚持使用gnu screen

虽然tmux很优秀,但是目前很难支持cygwin(Nicholas Marriott在2010年12月说的),而我的工作需要使用windows.

最新版的screen的一个重要特性就是已支持垂直分屏,其快捷键为”C-a |”.

要安装最新版的screen,在我的Arch Linux下很简单,

yaourt -S screen-git

在windows的cygwin下安装要多几步.

首先安装软件包libncurse-devel,然后去官方网站下载最新源代码包(目前版本为4.0.3),解压缩,

tar zxf screen-4.0.3.tar.gz

编译安装,

cd screen-4.0.3;configure;make;make install;

如用urxvt作为Terminal Simulator(比如我),直接启动screen会报错,

$ screen
$TERM too long - sorry.

原因为screen的开发者对于环境变量$TERM的最大长度做了不合理的假定.这里是具体讨论,解决办法很简单. 在.Xdefaults中添加一行,

urxvt*termName: rxvt-256color

在.screenrc中添加一行,

term rxvt-256color

使用screen前我将screen的Ctrl-a改为Ctrl-t

因为Ctrl-a在bash和emacs中都是常用快捷键,在.screenrc中添加一行,

escape"^Tt"  #the default of A interferes with emacs keybindings for terminal, and I never use the emacs transpose command

这个修改我是从Balaji S. Srinivasan.screenrc抄来的. 可以参考emacs wiki获得更多兼容emacs的设置.