Archive

Author Archive

Thrill F1

March 16th, 2008 2 comments

2008 赛季 F1的 揭幕战可以说是惊险频频,一片混乱。总的来说有看头。

比赛刚开始就有挂曾事故。22辆赛车参赛,到结束的时候只剩下7辆。跑完全程就有积分。Masa就跟开碰碰车似的。Raikkonen更是惊险频频中比赛,却在最后几圈的比赛中因赛车原因退赛。还有Glock惊险的事故,赛车整个飞了起来,两个前轮都出去了,车都碎了。Kovalainen最后终于超越Alonso,却在几秒钟后被反超。Bourdais在最后三圈冒烟。Barrichello不仅在维修区带着油管拽出去两个技师被判罚10秒,就在紧跟着,又闯维修区的红灯。全场比赛安全车出动了3次。

最大的变化是新的规则取消了车辆的牵引力控制系统,并使用统一的ECU。也似乎导致这场比赛事故不断的原因。Raikkonen几次冲出赛道。

Categories: driving Tags: ,

The Inner Life of the Cell

March 12th, 2008 3 comments

这是一段细胞内的活动的短片。

What happens inside your cells. A movie made by some geniuses at Harvard.

看完之后有什么问题吗?

我有,我的问题是:What is that walking thing?

Categories: Uncategorized Tags:

Vim Tips

March 11th, 2008 No comments

Vim是个很神奇的东西。从很早以前就开始使用它作为我的默认文本编辑器。

Vim是Bram Moolenaar的作品,同时也是几乎在所有Unix平台上都带有的VI的功能增强版本。Vim其实就是个文本编辑器,与常用的UltraEdit、EditPlus一样,都是程序员们常用的代码编辑工具。

Vim能做什么?目前流行的文本编辑器所有的功能,Vim几乎都能做到。不仅如此,Vim是个可扩展的编辑器,想实现什么功能,都可以通过script完成。

Vim对于新手而言,是个超级难用的编辑器。完全和以往人们的想法不同。(虽然现在Vim也提供Easy Vim,但那毕竟不是Vim的灵魂。用Easy Vim也没办法完全体会Vim的神奇。)

Vim可以从它的主页上下载,并且是完全免费的。同时,Vim支持常见的操作系统,这当然包括Windows、Mac、Linux/Unix。对于Windows用户来说,我推荐在安装过程中选择Full。这样会在%SYSTEMROOT%中创建几个BAT文件,能够方便快速的启动Vim。

Vim的配置依赖于.vimrc文件,该文件存在于$HOME目录中(Windows系统中为%USERPROFILE%)。很奇怪的是,Windows不允许将文件重命名为以“.”开头,却允许以“.”开头的文件存在。

要创建以“.”开头的文件,只要随便创建一个文件,然后进入命令提示符中,输入“ren 文件名 .vimrc”就可以了。或者更简单,在命令提示符中输入“echo a > .a”,就可以得到一个以“.”开头的文件。

看到这里,其实你不用创建.vimrc。Vim也支持在Windows环境下使用_vimrc作为配置文件。另外,配置文件并不是必须,没有这个文件,仍然可以运行Vim,只是默认设置而已。

这里我不打算讨论Easy Vim,因为和普通的编辑器没有什么区别,而且反而不如其他编辑器好用。如果你愿意以Easy Vim入手,okay,go ahead,但下面的内容貌似没有什么太大的用处了。

Normal Mode

Vim是模式(Model)的,默认的启动状态为Normal Mode,除此之外,还有Insert Mode、Command Mode和Vistual Mode。在Normal Mode中,键盘的输入都会被作为操作命令,而不是输入的内容。试试看,在一个刚刚启动的Vim中,按键是不会得到想要的输入的。

Normal Mode是最基础的模式。任何情况下,如果想进入Normal Mode,只要按ESC键就可以。同样,如果不确定当前在什么模式下,可以通过通过按ESC键的方式(或反复按ESC键),返回最基础的Normal Mode。如果此时已经处于Normal Mode,再按下ESC,Vim会给出声音警告。这也就是判断当前处于Normal Mode的一个方法。

Tip:如果你遗失在某个模式中,反复按ESC键盘,最终是会回到Normal Mode中的。嘀嘀的声音也会提示你已经进入Normal Mode。

模式之间的切换

模式之间的切换,是相对容易的。前面已经提到,要回到Normal Mode,只要按ESC键。

要想能够写文字,则首先应该切换到Insert Mode中。在Normal Mode中,按下i,就可以进入Insert Mode,此时会在窗口的最下方显示“– INSERT –”。

Tip:Vim中的各个命令都是区分大小写的。i和I将是两个不同的功能。

编辑文本

在初始的Normal Mode中,按下进入插入模式的命令即可。这些命令包括:
a在当前字符右侧插入
i在当前字符位置插入
A在当前行尾插入
O在当前行上方插入空行
o在当前行下方插入空行

同样,使用替换命令也可以对文本进行修改:
r替换当前位置字符
R进入替换状态

对于修改大小写这样的工作,则更是可以使用简单的命令完成:
guu本行小写
gUU本行大写

移动光标

在Vim的Normal Mode中移动光标,除了可以使用上、下、左、右的方向键外,更为正宗和传统的是使用hjkl,其中h表示左移,l表示右移,j表示向下,k表示向上。这种设计可以让使用者不移动手指的位置,就可以操作光标。

Tip:同样的光标移动快捷键,也出现在Google各产品(如:Gmail、Reader等)。

需要提醒的是,hjkl只能在Normal Mode中移动光标。而在Insert Mode中,则会作为文本插入到光标的位置。

Vim的命令

Vim的命令是区分大小的,而且是可以组合的。不仅如此,还可以通过数字,指定命令的执行次数。例如:d是删除的主命令,dd表示删除本行,dw删除当前词(w表示操作对象为词,其他命令中也可能用到),d^删除到行首(^表示行首),d$删除到行尾($表示行尾),d4d或者4dd表示执行4次dd命令,d3w表示删除3个词,等等……

打开和关闭文件

写好了文本,需要保存。只要输入:w即可;如果文件未命名,则可以使用:w 文件名。默认的当前路径是$HOME(Windows环境下为%USERPROFILE%)。

打开已经存在的文件,可以使用如下命令:

:e 文件名

打开和保存文件,都支持Tab补全功能。只要输入文件或路径的开头几个字母,然后按下Tab键,就可以自动补全以此开头的文件或路径名,反复按Tab键可以在多个以此开头的名称中切换。

编辑完后,要退出Vim,只要使用

:q

命令也是可以组合的,比如要保存当前文件,并退出,可以使用

:wq

该命令也可以简化为ZZ。

命令也是可以强制执行的,如果当前文件没有保存,而使用:q退出,Vim会提示当前文件未保存。这时可以在命令后面加上“!”表示强制执行该命令(比如:q!表示不保存文本,强制退出)。同样的,如果:w也可以强制执行,表示文件即使是只读的,也强制保存。

搜索与替换

Vim的搜索可以说是强大。不仅支持正则表达式(RegEx),操作还非常方便。

搜索是以在Normal Mode中“/”开头的命令/{pattern}<CR>,例如搜索RegEx,只要在Normal Mode中输入:

/RegEx

需要注意的是,Vim默认情况下,搜索、替换都是区分大小写的,但也可以修改这项设置(:set ignorecase)。

而smartcase功能,则聪明的实现了根据你的输入来确定是否匹配大小写。例如:输入全小写单词会忽略大小写匹配功能,而任意字母大写,则会区分大小写匹配。

但是,如果只打算在一个字符上忽略大小写怎么办呢?只要在需要忽略大小写的字符前面加上\C即可,例如“/\CReg\cEx”,就会匹配RegEx、regex、Regex和regEx,但不会匹配REGEX。该选项会忽略smartcase和ignorecase的设定。

搜索还可以偏移,b表示开头,e表示结尾,正数表示右移,负数表示左移。例如:“/test/e-1”就会搜索test并把光标置为s字母上;同理,“/test/b+2”会移动到同样的位置上。

如果打开incsearch功能(set incsearch),则在输入要搜索文字的同时,就可以同步显示出找到的内容。

搜索完成后,n可以搜索下一次出现的{pattern},p可以搜索上一个。重复上次搜索,还可以直接输入“/<CR>”。

替换操作同样是这样完成,输入:{range}s[ubstitute]/{exp1}/{exp2}/{flags}。{range}可以是行号(1,2,3或者1-10),也可以是%表示所有行,如果没有写,则表示只替换当前行。{flag}是可选的,g表示替换每一行中所有的匹配项,c表示每次替换都需要confirm。

代码折叠

代码折叠功能是我印象中Vim7中增加的。挺早以前,Visual Studio、UltraEdit、Source Insight等软件中的代码折叠功能,都是非常好用,直到Vim也增加同样的功能。

Vim的代码折叠,除了可以根据语法外,还可以根据自定义的正则表达式来完成。

对于一般的程序代码而言,最简单的创建折叠的方法,就是按照代码语法创建折叠(set fdm=syntax)。之后可以zc折叠代码,zo打开代码。

剪贴板和寄存器

Vim中的每个字母都是一个寄存器,相当于有26个寄存器。寄存器既可以作为存储文本使用,也可以作为记录一组命令(宏)使用。

要复制一段选中的文本到寄存器,只要按下”{reg}y即可,其中{reg}可以是a~z的任何一个字母。不仅如此,我们还可以添加文本到寄存器中,方法是”{REG}y,区别就是把寄存器的名字变为大写。

要把寄存器的内容插入到文本中,需要按下”{reg}p。

这里有个特别的寄存器,就是+,它可以实现Vim和其他应用程序(Windows剪贴板或X11的剪贴板)的连接。所以,如果在Vim外用C+Insert(或CTRL+C)复制了文本,要粘贴到Vim中,只要按下”+p即可;反之,要把Vim的文本复制到其他应用程序中,则可以使用”+y。

如果要将Vim中的全文都复制到别的程序中,可以使用ggVG “+y。

寄存器还可以用来存储一组命令(宏),方法是q{reg},之后操作的命令都会被记录到这个寄存器中,@{reg}可以回放这组命令。同样的q{REG}可以向寄存器中添加命令。

如果对于整行的操作,复制文本也可以使用yy和p。

编写代码

当你用编辑器编写OO语言的程序(其实在普通的C语言中也可能),经常遇到每行的部分内容都一样的情况。例如,我们经常碰到这种情况:

Obj.Instance[0].Data.Set.test1 = 1;
Obj.Instance[0].Data.Set.test2 = 2;
Obj.Instance[0].Data.Set.test3 = 3;
Obj.Instance[0].Data.Set.test5 = 4;

这种情况,Vim可以借助I命令很好的快速完成这些工作(UltraEdit也有类似的功能,叫做Column Mode)。

先写这样的代码,把每行不同的部分打出来就可以了:

1 = 1;
2 = 2;
3 = 3;
4 = 4;

然后把光标移动到左上角的1的位置,并在Normal Mode中按下CTRL+V进入VISUAL BLOCK Mode;按3次j移动到4上面,这是第一列的1~4都被选中了。接着按I,输入前面的那部分“Obj.Instance[0].Data.Set.test”,然后按下ESC键。是不是所有选中行都出现了呢?

当然,如果你只是重复上一行的输入的话,在Insert Mode下,直接按下CTRL+Y,就可以复制上一行上同位置的字符。

而代码中的缩进,可以使用下面的命令实现:
SHIFT+>>:缩进Tab
SHIFT+<<:左移一个Tab

生成目录

对于本文这样的文本,每个标题都是使用<H3>标记的,所以Vim同样支持针对这样的文本,生成目录。

:vimgrep/{pattern}/%:根据{pattern}取得目录,对于这个文档,可以是^<\Ch3>。
:cw:显示目录
:CTRL+W H:将目录显示在左侧

标签(Tags)

Tag需要另一个工具叫ctags,可以从SourceForge上下载(Unix下比较省心,不需要安装)。所谓Tag,实际上实现的功能就是代码跳转。

在实现代码跳转前,首先要调用ctags生成标签文件。命令很简单,下面的命令就是对当前目录下所有的C文件生成标签:

ctags *.c

具有标签文件后,只要在文件中按下CTRL+]就可以实现跳转。例如,代码中有个函数叫foo,如果看到别的地方调用这段代码,只要在调用的foo函数上按下ctrl+]就可以跳转到对应的定义位置。

.vimrc

.vimrc是Vim的配置文件,默认存放在$HOME中(Windows环境为%USERPROFILE%)。当然Vim并不一定要求配置文件一定存在上面的路径中,放在$VIMRUNTIME中也可以。

.vimrc可以提供对Vim的全部的配置,或者是对功能的扩充(可以写自己的script)。

这里提供一些配置:

对于GUI模式,自动展开语法菜单

" Make Syntax menu expended to show each language syntax in the menu
if has('gui_running')
let do_syntax_sel_menu=1
endif

设置UTF-8为默认编码方式

" Make UTF-8 as default encoding
if $LANG !~ '\.'
set encoding=utf-8
endif
set fileencodings=ucs-bom,utf-8,gbk

对于未指定宽度的UTF-8编码文字,指定为双字节宽
设置本项,即可解决在UTF-8编码下,某些符号只显示半个

" Set Unknown char as double byte
" Refer to http://www-128.ibm.com/developerworks/cn/linux/l-tip-vim1/
if has('multi_byte') &amp;&amp; v:version &gt; 601
set ambiwidth=double
endif

设置不兼容VI
Vim提供更多的功能,设置为不兼容模式后,则可以使用这些功能

set nocompatible

设置自动缩进

set autoindent

设置CTRL+S为保存的快捷键

noremap  :update
vnoremap  :update
inoremap  :update

打开当前文件目录中的文件

"   Edit another file in the same directory as the current file
"   uses expression to extract path from current file's path
if has("unix")
map ,e :e =expand("%:p:h") . "/"
else
map ,e :e =expand("%:p:h") . "\\"
endif

设置增量搜索,显示所有匹配项,并将F2作为取消高亮显示的快捷键

set incsearch
set showmatch
" Key mapping to stop the search highlight
nmap        :nohlsearch
imap   :nohlsearch

提供与其他应用程序复制粘贴的快捷键

" Key mapping to Cut/Copy/Paste from public register
vnoremap  "+y
vnoremap  "+x
map  "+p
cmap  "+p
imap  "+p
vmap  "+p

备份当前文件,并继续编辑

" backup current file with a new name then start edit
map  s   :up \| saveas! %:p:r-=strftime("%y%m%d")-bak \| 3sleep \| e #

重新对代码调整缩进

gg=G

我的.vimrc配置

" vim:shiftwidth=2:tabstop=8:expandtab
" Last Change: 2008-07-14 23:09:41

if v:version < 700
  echoerr 'The .vimrc requires Vim 7 or later.'
  quit
endif

if has('autocmd')
  " Remove ALL autocommands for the current group
  au!
endif

if has('gui_running')
  let do_syntax_sel_menu=1
endif

" Set colorscheme, download from http://www.vim.org/scripts/script.php?script_id=2175 then copy to $VIMRUNTIME
colorscheme darkslategray

if has('multi_byte')
  " Legacy encoding is the system default encoding
  let legacy_encoding=&encoding
endif

if has('gui_running') && has('multi_byte')
  " Set encoding (and possibly fileencodings)
  if $LANG !~ '\.' || $LANG =~? '\.UTF-8$'
    set encoding=utf-8
  else
    let &encoding=matchstr($LANG, '\.\zs.*')
    let &fileencodings='ucs-bom,utf-8,' . &encoding
    let legacy_encoding=&encoding
  endif
endif

set nocompatible
source $VIMRUNTIME/vimrc_example.vim

set autoindent
set nobackup
set showmatch
set incsearch
set formatoptions+=mM
set fileencodings=ucs-bom,utf-8,gbk,default,latin1
set ls=2 "Always show status line
set go-=T "Do not show Toolbar
set go+=c "Use console dialog instead of popup dialog
set go+=R "Right-hand scrollbar is present when there is a vertically split window
set fdc=2
set report=0 "show which lines are modified in :command
set statusline=%<%f\ %h%m%r%=%k[%{(&fenc==\"\")?&enc:&fenc}%{(&bomb?\",BOM\":\"\")}]\ %-14.(%l,%c%V%)\ %P
set backspace=indent,eol,start
if has('mouse')
  set mouse=a
endif
if has('multi_byte') && v:version > 601
"  if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
    set ambiwidth=double
"  endif
endif

" Key mappings to ease browsing long lines
noremap  <C-J>       gj
noremap  <C-K>       gk
noremap  <C-Down>    gj
noremap  <C-Up>      gk
inoremap <C-Down> <C-O>gj
inoremap <C-Up>   <C-O>gk
noremap  <M-Home> g0
noremap  <M-End>  g$
inoremap <M-Home> <C-O>g0
inoremap <M-End>  <C-O>g$

" Key mappings to use shortcut from Win
noremap <C-S> :update<CR>
vnoremap <C-S> <C-C>:update<CR>
inoremap <C-S> <C-O>:update<CR>

"   Edit another file in the same directory as the current file
"   uses expression to extract path from current file's path
"  (thanks Douglas Potts)
if has("unix")
    map ,e :e <C-R>=expand("%:p:h") . "/" <CR>
else
    map ,e :e <C-R>=expand("%:p:h") . "\\" <CR>
endif

" Tab support for Version 7 or above
if version > 700
"  map <C-t>        <C-O>:tabnew<CR>
"  map <C-w>        <C-O>:tabclose<CR>
"  map <C-S-tab>    <C-O>:tabp<CR>
"  map <M-Left>     <C-O>:tabp<CR>
"  map <C-tab>      <C-O>:tabn<CR>
"  map <M-Right>    <C-O>:tabn<CR>
endif

" Key mappings for quick arithmetic inside Vim
nnoremap <silent> <Leader>ma yypV:!calcu '<C-R>"'<CR>k$
vnoremap <silent> <Leader>ma yo<ESC>pV:!calcu '<C-R>"'<CR>k$
nnoremap <silent> <Leader>mr yyV:!calcu '<C-R>"'<CR>$
vnoremap <silent> <Leader>mr ygvmaomb:r !calcu '<C-R>"'<CR>"ay$dd`bv`a"ap

" Key mapping to stop the search highlight
nmap <silent> <F2>      :nohlsearch<CR>
imap <silent> <F2> <C-O>:nohlsearch<CR>

" Key mapping to Cut/Copy/Paste from public register
vnoremap <C-Insert> "+y
vnoremap <S-Delete> "+x
map <S-Insert> "+p
cmap <S-Insert> "+p
imap <S-Insert> <C-O>"+p
vmap <S-Insert> "+p

" Key mapping for Select All
vnoremap <C-A> ggVG
map <C-A> ggVG
cmap <C-A> ggVG
imap <C-A> <C-O>ggVG
vmap <C-A> ggVG

" Key mapping for switch windows
nnoremap <C-S-Tab> <C-W>W
inoremap <C-S-Tab> <C-O><C-W>W

" Key mapping to maxium the window
if has('gui_running')
  noremap <silent> <Leader>wx <C-O>:simalt ~x<CR>
  noremap <silent> <Leader>wr <C-O>:simalt ~r<CR>
endif

" Key mappings to fold line according to syntax
nmap <silent> <F3> :set fdl=1 fdm=syntax<bar>syn sync fromstart<CR>
nmap <C-F3>   zv
nmap <M-F3>   zc

" Key mappings for quickfix commands, tags, and buffers
nmap <F11>   :cn<CR>
nmap <F12>   :cp<CR>
nmap <M-F11> :copen<CR>
nmap <M-F12> :cclose<CR>
nmap <C-F11> :tn<CR>
nmap <C-F12> :tp<CR>
nmap <S-F11> :n<CR>
nmap <S-F12> :prev<CR>

" Key mapping for the taglist.vim plugin
" These code needs TagList script which can be downloaded from http://www.vim.org/scripts/script.php?script_id=273
nmap <F9>      :Tlist<CR>
imap <F9> <C-O>:Tlist<CR>

" Key mappings for the quickfix commands
nmap <F11> :cn<CR>
nmap <F12> :cp<CR>

" backup current file with a new name then start edit
map <silent> <Leader>s   :up \| saveas! %:p:r-<C-R>=strftime("%y%m%d")<CR>-bak \| 3sleep \| e #<CR>

" Non-GUI setting
if !has('gui_running')
  "English message only
  language messages en

  " Do not increase the windows width in the taglist.vim plugin
  if has('eval')
    let Tlist_Inc_Winwidth=0
  endif

  " Set text-mode menu
  if has('wildmenu')
    set wildmenu
    set cpoptions-=<
    set wildcharm=<C-Z>
    nmap <F10>      :emenu <C-Z>
    imap <F10> <C-O>:emenu <C-Z>
  endif
endif

if has('autocmd')
  function! SetFileEncodings(encodings)
    let b:my_fileencodings_bak=&fileencodings
    let &fileencodings=a:encodings
  endfunction

  function! RestoreFileEncodings()
    let &fileencodings=b:my_fileencodings_bak
    unlet b:my_fileencodings_bak
  endfunction

  function! CheckFileEncoding()
    if &modified && &fileencoding != ''
      exec 'e! ++enc=' . &fileencoding
    endif
  endfunction

  function! ConvertHtmlEncoding(encoding)
    if a:encoding ==? 'gb2312'
      return 'gbk'              " GB2312 imprecisely means GBK in HTML
    elseif a:encoding ==? 'iso-8859-1'
      return 'latin1'           " The canonical encoding name in Vim
    elseif a:encoding ==? 'utf8'
      return 'utf-8'            " Other encoding aliases should follow here
    else
      return a:encoding
    endif
  endfunction

  function! DetectHtmlEncoding()
    if &filetype != 'html'
      return
    endif
    normal m`
    normal gg
    if search('\c<meta http-equiv=\("\?\)Content-Type\1 content="text/html; charset=[-A-Za-z0-9_]\+">') != 0
      let reg_bak=@"
      normal y$
      let charset=matchstr(@", 'text/html; charset=\zs[-A-Za-z0-9_]\+')
      let charset=ConvertHtmlEncoding(charset)
      normal ``
      let @"=reg_bak
      if &fileencodings == ''
        let auto_encodings=',' . &encoding . ','
      else
        let auto_encodings=',' . &fileencodings . ','
      endif
      if charset !=? &fileencoding &&
            \(auto_encodings =~ ',' . &fileencoding . ',' || &fileencoding == '')
        silent! exec 'e ++enc=' . charset
      endif
    else
      normal ``
    endif
  endfunction

  function! GnuIndent()
    setlocal cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1
    setlocal shiftwidth=2
    setlocal tabstop=8
  endfunction

  function! RemoveTrailingSpace()
    if $VIM_HATE_SPACE_ERRORS != '0' &&
          \(&filetype == 'c' || &filetype == 'cpp' || &filetype == 'vim')
      normal m`
      silent! :%s/\s\+$//e
      normal ``
    endif
  endfunction

  function! UpdateLastChangeTime()
    let last_change_anchor='\(" Last Change:\s\+\)\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2}'
    let last_change_line=search('\%^\_.\{-}\(^\zs' . last_change_anchor . '\)', 'n')
    if last_change_line != 0
      let last_change_time=strftime('%Y-%m-%d %H:%M:%S', localtime())
      let last_change_text=substitute(getline(last_change_line), '^' . last_change_anchor, '\1', '') . last_change_time
      call setline(last_change_line, last_change_text)
    endif
  endfunction

  " Function to insert the current date
  function! InsertCurrentDate()
    let curr_date=strftime('%Y-%m-%d', localtime())
    silent! exec 'normal! gi' .  curr_date . "\<ESC>l"
  endfunction

  " Key mapping to insert the current date
  inoremap <silent> <C-\><C-D> <C-O>:call InsertCurrentDate()<CR>

  " Highlight space errors in C/C++ source files (Vim tip #935)
  if $VIM_HATE_SPACE_ERRORS != '0'
    let c_space_errors=1
  endif

  " Use Canadian spelling convention in engspchk (Vim script #195)
  let spchkdialect='can'

  " Show syntax highlighting attributes of character under cursor (Vim
  " script #383)
  map <Leader>a :call SyntaxAttr()<CR>

  " Automatically find scripts in the autoload directory
  au FuncUndefined * exec 'runtime autoload/' . expand('<afile>') . '.vim'

  " File type related autosetting
  au FileType c,cpp setlocal cinoptions=:0,g0,(0,w1 shiftwidth=4 tabstop=8
  au FileType diff  setlocal shiftwidth=4 tabstop=4
  au FileType html  setlocal autoindent indentexpr=
  au FileType changelog setlocal textwidth=76

  " Text file encoding autodetection
  au BufReadPre  *.gb               call SetFileEncodings('gbk')
  au BufReadPre  *.big5             call SetFileEncodings('big5')
  au BufReadPre  *.nfo              call SetFileEncodings('cp437')
  au BufReadPost *.gb,*.big5,*.nfo  call RestoreFileEncodings()
  au BufWinEnter *.txt              call CheckFileEncoding()

  " Detect charset encoding in an HTML file
  au BufReadPost *.htm* nested      call DetectHtmlEncoding()

  " Recognize standard C++ headers
  au BufEnter /usr/include/c++/*    setf cpp
  au BufEnter /usr/include/g++-3/*  setf cpp

  " Setting for files following the GNU coding standard
  au BufEnter /usr/*                call GnuIndent()

  " Remove trailing spaces for C/C++ and Vim files
  au BufWritePre *                  call RemoveTrailingSpace()

  " Automatically update change time
  "au BufWritePre *vimrc, *.vim      call UpdateLastChangeTime()

  " Mark .asm files MASM-type assembly
  au BufNewFile,BufReadPre *.asm let b:asmsyntax='masm'
endif
Categories: Computer Science Tags: ,

中国移动手机用户配置

March 9th, 2008 6 comments

在这里保留一下中国移动手机的一些配置信息。先说好是给我自己保留用的。因为如果你用行货手机,这些通常是不需要配置的。而水货的话……

WAP连接:

接入点:cmwap
代理服务器:010.000.000.172:80

WAP连接可用于彩信、一般网页浏览等。

GPRS连接:

接入点:cmnet
代理服务器:(无)

GPRS连接可用于大流量数据访问,包括电子邮件(在我的手机上,Push mail只能用GPRS连接)。

彩信设置:

彩信服务中心地址:http://mmsc.monternet.com/

Sony Ericsson P1配置支持IDLE的Push IMAP mail

January 19th, 2008 7 comments

新入手的Sony Ericsson P1远比我想象的完美。最近刚刚搞定了著名的Push mail,让昂贵的BlackBerry靠边吧(夸张的是,中国的移动的BlackBerry服务居然要收398元/月或598元/月的服务费)。

所谓PushMail指的是利用推送技术,将电子邮件直接传送到移动终端。简单的说,就是系统直接将电子邮箱中刚刚收到的邮件即时发送到用户手中,不像传统移动邮件系统那样必须依赖移动终端定期接收邮件或用户主动检查邮箱,所以客户终端上时刻都能够与所指定的信箱维持同步的资料。

Push mail的经典是BlackBerry。而中国移动也和BlackBerry合作,面向企业客户推出相应的Push mail服务。那价格……

事实上,很多IMAP服务,也是支持PUSH的,但要求IMAP服务器支持IDLE。我从很早以前就支持IMAP服务,不过当初原因是IMAP支持“按需下载”。前几天查看了我的服务商的帮助,发现它也是支持IDLE的,所以就打算在我的手机上试验一下Push mail。

要使你的手机支持Push mail,那么需要以下几个条件:

  • 邮箱要有IMAP服务
  • IMAP服务器支持IDLE
  • 有个支持Push的移动终端

恰恰Sony Ericsson的P1支持这些。配置更是简单:

  1. 首先要配置GPRS连接。我选择的是cmnet(因为北京没有cmwap包月,而且套餐价格中不区分cmwap和cmnet)
  2. 和普通手机一样,首先在手机上创建IMAP的邮件帐户。并且在邮箱配置中选中“推入电子邮件”;这时,即使不配置Push mail,也可以通过进入电子邮件帐户,然后选择“获取并发送”来接收和发送邮件。这样的方式并不是push,因为你不手工获取,就得不到邮件(可以理解为Pull)。
  3. 在“电子邮件帐户”配置中,选择“更多”,然后选择“始终打开推入电子邮件”
  4. 选中“始终打开”和“漫游时激活”。并且设置推入的开始和结束时间(推入邮件只在此时间范围内有效)。保存设置后,Push mail就配置完成了。

退出邮件帐户,状态栏上会增加一个联网图标(小地球),这就是用来提供给push mail的连接。当然,没有push是不产生流量的。经实践,Push IMAP需要每小时连接一次网络,所以还是有少许流量的。但基本上,每天20K左右。

接下来发个邮件看看。手机立刻提示有新邮件。有了push mail,就可以完全让那些邮件短信通知、短信邮件靠边站了。

这里有个问题,就是开通push的邮箱,一定要改打开mail rule,或者别那么多垃圾邮件,要不流量费可是受不了。

Update 1/23/2008:刚刚查了一下Gmail的help文档,Gmail的IMAP也是支持IDLE的。所以理论上(我没试,因为我Gmail邮件太多,心疼我的流量),Gmail也可以通过IMAP做Direct Push。有兴趣的同学可以在P1上试验一下,记得告诉我结果哦。

华普超市还真是站在风口浪尖啊

December 22nd, 2007 6 comments

今天早上起来,突然想起中午没什么东西吃了,就去华普超市朝阳门店买东西。在经过熟食柜台的时候,让我想起有次吃过的猪头肉卷饼,就拿了一盒价值9块钱的猪头肉熟食。

我其实想起过几年前报道的熟肉被重新包装的事情,不过我想,既然新闻都报道那么多次了,应该不会顶风作案吧?恰恰我错了。

等我买回来以后,刚把第一块塞到嘴里,没1秒钟就被我吐出来了。再闻闻盒子里面的,更是恶心的我差点吐了。本想9块钱没多少钱,后来想想,这也太气人了。就穿上衣服,跑回超市理论去了。超市里正好还有个顾客因为鸡蛋价格的问题和售后人员吵呢。等他们差不多了,我把熟肉扔在售后人员前面的柜台上,连包装都没打开。

我: 你自己闻闻……
华普:(小心的打开包装,闻了一下,给售后服务人员熏的够呛。)
我: 就这你们还敢打标签说今天生产今天包装?太过分了吧?都什么味了?
华普:…………
我: 电视都报道多少次了,你们还该这样?说你们这个上周生产的,都算便宜你们吧?
华普:…………那您看怎么办?给您退了吧?
我: (我心说,你不退还打算怎么办?双倍返还你们也肯定不干啊)

服务人员填了一张单子,让我签了个字。说是“有味”。然后一边跑去在收款机上操作,一边和我道歉,还说会和负责这个人说把这些商品下架。退给我钱以后,还和我道歉了半天。

Google是伟大的,在我回家以后,在网上搜索了一下“华普超市 过期熟肉”,结果还是惊人的。早在2005年的时候,华普超市就曾因为重新包装过期熟肉的事情被卫生监察部门查处。2年后的今天,同样的事情发生在华普超市。

这件事情教育我们:1、无商不奸,商家不可信;2、华普超市,至少是朝阳门店,完全不可信,至少是熟肉,绝对不能买;3、这监察部门,查归查,罚归罚,商户该违法还违法,这监察部门都干什么吃的?!

Categories: diary Tags: ,

残摩还真是嚣张啊

December 18th, 2007 3 comments

今儿走著名的8高,下午4点的进京方向清河收费站到4环路中间的位置。一辆残摩,逆行,行驶在最内侧车道,紧挨着防撞栏,超快速度的向出京方向。还一脸无辜的按着喇叭。

咋上去的呢?

Categories: diary Tags:

December 10th, 2007 No comments

今天下了2007年北京的第一场雪。早上特意晚出来了几分钟,目的是躲过早高峰(不过效果不太明显)。 早上看到我的车,俨然已经变成了白色。路上还比较顺利,虽然车多、堵车(时速不足30km/h),却还算走的轻松。偶尔有几个窜来窜去并线的(平常心,平常心),让他们窜去吧,何苦呢(那辆夏利2000,窜了一路,却还是在我前面1辆车的位置)。

路上基本上没什么雪了。可到了公司的园区里,却是另一番景象,地上雪白,完全没有过任何的清理。一个小的惊险恰恰出现在大厦的拐弯处,我要拐弯,却看到远处有辆直行的车,车速不快。我犹豫了一下,却错过了最佳的刹车时间。踩了刹车,ABS在瞬间就启动了,却仍然感到车在滑动,速度没有明显的下降。等停下的时候, 已经和直行的车很近了。司机透过窗户恶狠狠的看着我,从我的车前开过……

园区里我只看到了1辆车,和我一样将雨刷抬了起来。虽然白天问题不大吧,好歹抬起来没坏处。我可不想等到晚上拿车的时候,雨刷已经动不了了。

到了公司,和一个同事聊了两句,他明智的连车都没开。其实他也是对的。这个天气,地铁通常是最快的选择。明天我也不打算开车了,因为路上很可能有冰了。

Categories: diary Tags: ,

学习佛经,学会做人道理

December 8th, 2007 No comments
  1. 人之所以痛苦,在于追求错误的东西。
  2. 与其说是别人让你痛苦,不如说自己的修养不够。
  3. 如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。
  4. 好好的管教你自己,不要管别人。
  5. 不宽恕众生,不原谅众生,是苦了你自己。
  6. 别说别人可怜,自己更可怜,自己修行又如何?自己又懂得人生多少?
  7. 学佛是对自己的良心交待,不是做给别人看的。
  8. 福报不够的人,就会常常听到是非;福报够的人,从来就没听到过是非。
  9. 修行是点滴的工夫。
  10. 在顺境中修行,永远不能成佛。
  11. 你永远要感谢给你逆境的众生。
  12. 你随时要认命,因为你是人。
  13. 你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。
  14. 这个世界本来就是痛苦的,没有例外的。
  15. 当你快乐时,你要想,这快乐不是永恒的。当你痛苦时你要想这痛苦也不是永恒的。
  16. 认识自己,降伏自己,改变自己,才能改变别人。
  17. 今日的执著,会造成明日的后悔。
  18. 你可以拥有爱,但不要执著,因为分离是必然的。
  19. 不要浪费你的生命在你一定会后悔的地方上。
  20. 你什么时候放下,什么时候就没有烦恼。
  21. 内心没有分别心,就是真正的苦行。
  22. 学佛第一个观念,永远不去看众生的过错。你看众生的过错,你永远污染你自己,你根本不可能修行。
  23. 你每天若看见众生的过失和是非,你就要赶快去忏悔,这就是修行。
  24. 业障深重的人,一天到晚都在看别人的过失与缺点,真正修行的人,从不会去看别人的过失与缺点。
  25. 每一种创伤,都是一种成熟。
  26. 当你知道迷惑时,并不可怜,当你不知道迷惑时,才是最可怜的。
  27. 狂妄的人有救,自卑的人没有救。
  28. 你不要一直不满人家,你应该一直检讨自己才对。不满人家,是苦了你自己。
  29. 一切恶法,本是虚妄的,你不要太自卑你自己。一切善法,也是虚妄的,你也不要太狂妄你自己。
  30. 当你烦恼的时候,你就要告诉你自己,这一切都是假的,你烦恼什么?
  31. 当你未学佛的时候,你看什么都不顺。当你学佛以后,你要看什么都很顺。
  32. 你要包容那些意见跟你不同的人,这样子日子比较好过。你要是一直想改变他,那样子你会很痛苦。要学学怎样忍受他才是。你要学学怎样包容他才是。
  33. 承认自己的伟大,就是认同自己的愚疑。
  34. 修行就是修正自己错误的观念。
  35. 医生难医命终之人,佛陀难渡无缘的众生。
  36. 一个人如果不能从内心去原谅别人,那他就永远不会心安理得。
  37. 心中装满着自己的看法与想法的人,永远听不见别人的心声。
  38. 毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。
  39. 当你劝告别人时,若不顾及别人的自尊心,那么再好的言语都没有用的。
  40. 不要在你的智慧中夹杂着傲慢。不要使你的谦虚心缺乏智慧。
  41. 根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?
  42. 忌妒别人,不会给自己增加任何的好处。忌妒别人,也不可能减少别人的成就。
  43. 永远不要浪费你的一分一秒,去想任何你不喜欢的人。
  44. 多少人要离开这个世间时,都会说出同一句话,这世界真是无奈与凄凉啊!
  45. 恋爱不是慈善事业,不能随便施舍的。感情是没有公式,没有原则,没有道理可循的。可是人们至死都还在执著与追求。
  46. 请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。
  47. 创造机会的人是勇者。等待机会的人是愚者。
  48. 能说不能行,不是真智慧。
  49. 多用心去倾听别人怎么说,不要急着表达你自己的看法。
  50. 同样的瓶子,你为什么要装毒药呢?同样的心理,你为什么要充满着烦恼呢?
  51. 得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现原不是你想像中的那么美好。
  52. 这个世间只有圆滑,没有圆满的。
  53. 修行要有耐性,要能甘于淡泊,乐于寂寞。
  54. 活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。
  55. 多一分心力去注意别人,就少一分心力反省自己,你懂吗?
  56. 眼睛不要老是睁得那么大,我且问你,百年以后,那一样是你的。
  57. 欲知世上刀兵劫,但听屠门夜半声。不要光埋怨自己多病,灾祸横生,多看看横死在你刀下的众生又有多少?
  58. 憎恨别人对自己是一种很大的损失。
  59. 每一个人都拥有生命,但并非每个人都懂得生命,乃至于珍惜生命。不了解生命的人,生命对他来说,是一种惩罚。
  60. 自以为拥有财富的人,其实是被财富所拥有。
  61. 情执是苦恼的原因,放下情执,你才能得到自在。
  62. 随缘不是得过且过,因循苟且,而是尽人事听天命。
  63. 不要太肯定自己的看法,这样子比较少后悔。
  64. 当你对自己诚实的时候,世界上没有人能够欺骗得了你。
  65. 用伤害别人的手段来掩饰自己缺点的人,是可耻的。
  66. 世间的人要对法律负责任。修行的人要对因果负责任。
  67. 在你贫穷的时候,那你就用身体去布施,譬如说扫地、洒水、搬东西等,这也是一种布施。
  68. 内心充满忌妒,心中不坦白,言语不正的人,不能算是一位五官端正的人。
  69. 默默的关怀与祝福别人,那是一种无形的布施。
  70. 多讲点笑话,以幽默的态度处事,这样子日子会好过一点。
  71. 与人相处之道,在于无限的容忍。
  72. 不要刻意去猜测他人的想法,如果你没有智慧与经验的正确判断,通常都会有错误的。
  73. 要了解一个人,只需要看他的出发点与目的地是否相同,就可以知道他是否真心的。
  74. 人生的真理,只是藏在平淡无味之中。
  75. 不洗澡的人,硬擦香水是不会香的。名声与尊贵,是来自于真才实学的。有德自然香。
  76. 与其你去排斥它已成的事实,你不如去接受它,这个叫做认命。
  77. 佛菩萨只保佑那些肯帮助自己的人。
  78. 逆境是成长必经的过程,能勇于接受逆境的人,生命就会日渐的茁壮。
  79. 你要感谢告诉你缺点的人。
  80. 能为别人设想的人,永远不寂寞。
  81. 如果你能像看别人缺点一样,如此准确般的发现自己的缺点,那么你的生命将会不平凡。
  82. 原谅别人,就是给自己心中留下空间,以便回旋。
  83. 时间总会过去的,让时间流走你的烦恼吧!
  84. 你硬要把单纯的事情看得很严重,那样子你会很痛苦。
  85. 永远扭曲别人善意的人,无药可救。
  86. 人不是坏的,只是习气罢了,每个人都有习气,只是深浅不同罢了。只要他有向道的心,能原谅的就原谅他,不要把他看做是坏人。
  87. 说一句谎话,要编造十句谎话来弥补,何苦呢?
  88. 其实爱美的人,只是与自己谈恋爱罢了。
  89. 世界上没有一个永远不被毁谤的人,也没有一个永远被赞叹的人。当你话多的时候,别人要批评你,当你话少的时候,别人要批评你,当你沈默的时候,别人还是要批评你。在这个世界上,没有一个不被批评的。
  90. 夸奖我们,赞叹我们的,这都不是名师。会讲我们,指示我们的,这才是善知识,有了他们我们才会进步。
  91. 你目前所拥有的都将随着你的死亡而成为他人的,那为何不现在就布施给真正需要的人呢?
  92. 为了赞美而去修行,有如被践踏的香花美草。
  93. 白白的过一天,无所事事,就像犯了窃盗罪一样。
  94. 能够把自己压得低低的,那才是真正的尊贵。
  95. 广结众缘,就是不要去伤害任何一个人。
  96. 沈默是毁谤最好的答覆。
  97. 对人恭敬,就是在庄严你自己。
  98. 拥有一颗无私的爱心,便拥有了一切。
  99. 仇恨永远不能化解仇恨,只有慈悲才能化解仇恨,这是永恒的至理。
  100. 你认命比抱怨还要好,对于不可改变的事实,你除了认命以外,没有更好的办法了。
  101. 不要因为众生的愚疑,而带来了自己的烦恼。不要因为众生的无知,而痛苦了你自己。
  102. 别人讲我们不好,不用生气、难过。说我们好也不用高兴,这不好中有好,好中有坏,就看你会不会用?
  103. 如果你自己明明对,别人硬说你不对,你也要向人忏悔,修行就是修这些。你什么事都能忍下来,才会进步。就是明明是你对,你也要向他人求忏悔,那就是修行了。
  104. 当你的错误显露时,可不要发脾气,别以为任性或吵闹,可以隐藏或克服你的缺点。
  105. 不要常常觉得自己很不幸,世界上比我们痛苦的人还要多。
  106. 愚痴的人,一直想要别人了解他。有智慧的人,却努力的了解自己。
  107. 别人永远对,我永远错,这样子比较没烦恼。
  108. 来是偶然的,走是必然的。所以你必须,随缘不变,不变随缘。
Categories: diary Tags:

最近浮躁的要命

December 8th, 2007 1 comment

自打9月底从Redmond回来,自己就一直处于一种很不正常的状态:浮躁、火气大。Blog也一直没怎么更新(现在看,从10月底开始,不是没怎么更新,而是根本就没更新)。不是偷懒,是觉得实在没什么可写的。要不就是写了一半,然后觉得没有耐心写了。

开车也是,有时候仔细想想,让一辆车就让一辆车吧。那天有个小伙子并线的时候刮我的车。他的全责,我下车第一件事就是冲他嚷嚷怎么开的车。结果人家小伙子也不急不恼的。虽然不承认他全责,但也没说什么,就说了一句“何苦呢”。和我简单聊了两句,就这么没事儿了。我看我的镜子也没事儿,也就没说什么。不过看他的QQ,后镜下沿已经裂了。(可怜的QQ……)

有时候想想也是,何苦呢。说不定人家也有急事,说不定人家真的没看见,说不定人家也是迫不得己。而且,就算是人家全责,车还是自己的啊,修车也要费自己的时间。何苦呢……

世界如此美妙,我却如此暴躁。这样不好,不好,……

Categories: diary Tags: