星期二, 十二月 29

试用zsh

zsh是一个非常不错的shell,但之前再次尝试把默认的bash换成zsh,但后来都因为一些问题又换回来了。今天晚上又试了回,发现问题基本解决了。
zsh默认的配置比较糟糕,可能还没有bash好用,需要比较复杂的配置文件,那种文件看着就头疼,当然不会自己写了,上网找一个就行,但出了问题不会改就麻烦了。
之前遇到的几个主要问题是:
1.输入未知命令时不检测是否属于未安装的包
2.apt-get有的选项补不全
3.分目录记录历史,用起来麻烦
4.有时补的东西太多,用起来不习惯
5.没看到让我很期待的功能
解决第一个问题费了不少劲,查了不少网站,都没有完美的答复,别人提供的配置也有问题,后来总算试出来了,原来非常简单。
bash 支持这个功能主要是有一个 command-not-found 起的作用,当一个命令找不到时自动调用 command_not_found_hander 这个函数,这个函数以该命令调用 /usr/lib/command-not-found ,产生提示信息,过程应该是这样,但bash的各种配置我都没找到 command_not_found_hander 这个函数,可能在什么地方内定的了。
在 zsh 也一样,但这个函数要自己写:
function command_not_found_handler() {
    python /usr/lib/command-not-found $1
    return 0
}

加在 .zshrc 里,就可以了。
第二个问题新版本的zsh已经没解决了,包括一些其他命令
第三个实质是我从网上下的配置的问题,他有一断代码是专门实现这个功能的,去掉就行
第四个,仔细看下配置,发现都可以改,另外比较一下zsh的补全要比bash好用得多
最重要的是第五个,我发现一系列非常好用的特性:
第一个就是加强的 alias,好久之前我就期待这个功能。
在bash里如果你用 alias,新名不用有补全功能了,所以alias功能有限,几次想用它简化软件包管理都放弃了。
而zsh里的alias生成的新名同样支持选项补全,就样就可以很放心地 alias ai="sudo apt-get install" 等了,再也不用频繁输入长命令了。
zsh可以方便里使用快捷键,例如可以实现按两下[esc],在命令之前加加sudo,按[esc][h],显示man,等等。
zsh可以对单个命令的补全进行设置,使常用命令高效。例如 kill [tab] 就可以选择所有进程。
zsh的命令提示符设置更灵活。
zsh对目录的操作特别灵活。
zsh对重定向,管道等提供更多功能。
……
刚 才犯了一个相当低级的错误,想把 .bashrc 和 .zshrc 备份到当前目录,没想就用 cp ~/.bashrc ~/.zshrc .,提示错误,当时还没反应过来,又分别拷了过来,但突然发现两个文件一样,才反应过来 .zshrc 被覆盖了!我改了半天的东西全没了!
根据记忆一点点再改,还好时间短,还基本都记得……
把.zshrc放这一份吧,免得又弄没了:



#color{{{
autoload colors zsh/terminfo
if [[ "$terminfo[colors]" -ge 8 ]]; then
colors
fi
for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
eval _$color='%{$terminfo[bold]$fg[${(L)color}]%}'
eval $color='%{$fg[${(L)color}]%}'
(( count = $count + 1 ))
done
FINISH="%{$terminfo[sgr0]%}"
#}}}

#命令提示符 {{{
precmd () {
local count_db_wth_char=${#${${(%):-%/}//[[:ascii:]]/}}
local leftsize=${#${(%):-%M%/}}+$count_db_wth_char
local rightsize=${#${(%):-%D %T }}
HBAR=" -"

FILLBAR="\${(l.(($COLUMNS - ($leftsize + $rightsize +2)))..${HBAR}.)}"

RPROMPT=$(echo "%(?..$RED%?$FINISH)")
PROMPT=$(echo "$BLUE%M$GREEN%/ $WHITE${(e)FILLBAR} $MAGENTA%D %T$FINISH
$CYAN%n $_YELLOW>>>$FINISH ")

#在 Emacs终端 中使用 Zsh 的一些设置
if [[ "$TERM" == "dumb" ]]; then
setopt No_zle
PROMPT='%n@%M %/
>>'
alias ls='ls -F'
fi   
}
#}}}

#标题栏、任务栏样式{{{
case $TERM in (*xterm*|*rxvt*|(dt|k|E)term)
   preexec () { print -Pn "\e]0;%n@%M//%/\ $1\a" }
   ;;
esac
#}}}

#关于历史纪录的配置 {{{
#历史纪录条目数量
export HISTSIZE=1000
#注销后保存的历史纪录条目数量
export SAVEHIST=1000
#历史纪录文件
export HISTFILE=~/.zhistory
#以附加的方式写入历史纪录
setopt INC_APPEND_HISTORY
#如果连续输入的命令相同,历史纪录中只保留一个
setopt HIST_IGNORE_DUPS    
#为历史纪录中的命令添加时间戳    
setopt EXTENDED_HISTORY    

#启用 cd 命令的历史纪录,cd -[TAB]进入历史路径
setopt AUTO_PUSHD
#相同的历史路径只保留一个
setopt PUSHD_IGNORE_DUPS

#在命令前添加空格,不将此命令添加到纪录文件中
#setopt HIST_IGNORE_SPACE    
#}}}


#杂项 {{{
#允许在交互模式中使用注释  例如:
#cmd #这是注释
setopt INTERACTIVE_COMMENTS    

#启用自动 cd,输入目录名回车进入目录
#稍微有点混乱,不如 cd 补全实用
#setopt AUTO_CD
    
#扩展路径
#/v/c/p/p => /var/cache/pacman/pkg
setopt complete_in_word

#禁用 core dumps
limit coredumpsize 0

#Emacs风格 键绑定
bindkey -e
#设置 [DEL]键 为向后删除
bindkey "\e[3~" delete-char

#以下字符视为单词的一部分
WORDCHARS='*?_-[]~=&;!#$%^(){}<>'
#}}}

#自动补全功能 {{{
setopt AUTO_LIST
setopt AUTO_MENU
#开启此选项,补全时会直接选中菜单项
#setopt MENU_COMPLETE

autoload -U compinit
compinit

#自动补全缓存
#zstyle ':completion::complete:*' use-cache on
#zstyle ':completion::complete:*' cache-path .zcache
#zstyle ':completion:*:cd:*' ignore-parents parent pwd

#自动补全选项
zstyle ':completion:*' verbose yes
zstyle ':completion:*' menu select
zstyle ':completion:*:*:default' force-list always
zstyle ':completion:*' select-prompt '%SSelect:  lines: %L  matches: %M  [%p]'

zstyle ':completion:*:match:*' original only
zstyle ':completion::prefix-1:*' completer _complete
zstyle ':completion:predict:*' completer _complete
zstyle ':completion:incremental:*' completer _complete _correct
zstyle ':completion:*' completer _complete _prefix _correct _prefix _match _approximate

#路径补全
zstyle ':completion:*' expand 'yes'
zstyle ':completion:*' squeeze-slashes 'yes'
zstyle ':completion::complete:*' '\\'

#彩色补全菜单
eval $(dircolors -b)
export ZLSCOLORS="${LS_COLORS}"
zmodload zsh/complist
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

#修正大小写
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
#错误校正    
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric

#kill 命令补全    
compdef pkill=killall
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:*:*:*:processes' force-list always
zstyle ':completion:*:processes' command 'ps -au$USER'

#补全类型提示分组
zstyle ':completion:*:matches' group 'yes'
zstyle ':completion:*' group-name ''
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:options' auto-description '%d'
zstyle ':completion:*:descriptions' format $'\e[01;33m -- %d --\e[0m'
zstyle ':completion:*:messages' format $'\e[01;35m -- %d --\e[0m'
zstyle ':completion:*:warnings' format $'\e[01;31m -- No Matches Found --\e[0m'
zstyle ':completion:*:corrections' format $'\e[01;32m -- %d (errors: %e) --\e[0m'

# cd ~ 补全顺序
zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand'
#}}}

##行编辑高亮模式 {{{
# Ctrl+@ 设置标记,标记和光标点之间为 region
zle_highlight=(region:bg=magenta #选中区域
               special:bold      #特殊字符
               isearch:underline)#搜索时使用的关键字
#}}}

##空行(光标在行首)补全 "cd " {{{
user-complete(){
    case $BUFFER in
        "" )                       # 空行填入 "cd "
            BUFFER="cd "
            zle end-of-line
            zle expand-or-complete
            ;;
        "cd  " )                   # TAB + 空格 替换为 "cd ~"
            BUFFER="cd ~"
            zle end-of-line
            zle expand-or-complete
            ;;
        " " )
            BUFFER="!?"
            zle end-of-line
            ;;
        "cd --" )                  # "cd --" 替换为 "cd +"
            BUFFER="cd +"
            zle end-of-line
            zle expand-or-complete
            ;;
        "cd +-" )                  # "cd +-" 替换为 "cd -"
            BUFFER="cd -"
            zle end-of-line
            zle expand-or-complete
            ;;
        * )
            zle expand-or-complete
            ;;
    esac
}
zle -N user-complete
bindkey "\t" user-complete

#显示 path-directories ,避免候选项唯一时直接选中
cdpath="/home"
#}}}

##在命令前插入 sudo {{{
#定义功能
sudo-command-line() {
    [[ -z $BUFFER ]] && zle up-history
    [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
    zle end-of-line                 #光标移动到行末
}
zle -N sudo-command-line
#定义快捷键为: [Esc] [Esc]
bindkey "\e\e" sudo-command-line
#}}}

#命令别名 {{{

alias -g ls='ls -F --color=auto'
alias -g ll='ls -l'
alias -g la='ls -a'
alias -g l='ls'
alias -g grep='grep --color=auto'
#alias -g history='history -fi'
alias -g ai='sudo apt-get install'
alias -g aar='sudo apt-get autoremove'
alias -g ap='sudo apt-get purge'
alias -g aud='sudo apt-get update'
alias -g aug='sudo apt-get upgrade'
alias -g adu='sudo apt-get dist-upgrade'

#[Esc][h] man 当前命令时,显示简短说明
alias run-help >&/dev/null && unalias run-help
autoload run-help

#历史命令 top10
#alias top10='print -l  ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
#}}}

#路径别名 {{{
#进入相应的路径时只要 cd ~xxx
hash -d HIST="$HISTDIR"
#}}}
  
#{{{自定义补全
#补全 ping
zstyle ':completion:*:ping:*' hosts g.cn facebook.com
#补全 ssh scp sftp 等
my_accounts=(
{ly50247,osily,lg50247,root}@{192.168.1.1,192.168.0.1}
osily@localhost
)
zstyle ':completion:*:my-accounts' users-hosts $my_accounts

#def pacman-color completion as pacman
#compdef pacman-color=pacman
#}}}

#{{{ F1 计算器
arith-eval-echo() {
  LBUFFER="${LBUFFER}echo \$(( "
  RBUFFER=" ))$RBUFFER"
}
zle -N arith-eval-echo
bindkey "^[[11~" arith-eval-echo
#}}}

####{{{
#function timeconv { date -d @$1 +"%Y-%m-%d %T" }

# }}}

####{{{
function command_not_found_handler() {
    python /usr/lib/command-not-found $1
    return 0
}
# }}}

## END OF FILE #################################################################
# vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4


export http_proxy=http://211.138.124.196:80
#export JAVA_HOME="/usr/lib/jvm/java-6-sun"
#export JRE_HOME="/usr/lib/jvm/java-6-sun/jre"
export PATH="$PATH:/home/osily/program/bin"
#export CLASSPATH="$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:/home/osily/program/tomcat620/lib:/home/osily/program/tomcat620/lib/servlet-api.jar"
alias upg="sudo apt-get update && sudo apt-get upgrade"
alias qq="nohup google-chrome --no-proxy-server --app=http://web.qq.com >/dev/null 2>/dev/null &"
#alias tomstart="sudo ~/program/tomcat620/bin/startup.sh"
#alias tomshut="sudo ~/program/tomcat620/bin/shutdown.sh"
#alias js2="rhino"
alias gmusic="google-chrome --no-proxy-server --app=http://g.top100.cn/12174704/html/player.html#loaded"
alias apa="dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P"

试用git、git-svn

以前没用过版本控制系统,感觉写小东西没太大必要,又很麻烦。前几天参与了网友的一个小项目,托管在googlecode上,用的svn。开始有点 头痛,上网查了查也不是很麻烦。感觉还是比较好用的。但有些地方感觉不太好。对服务器依赖太大了,基本所有操作都要联机,要不是要架本地服务器,想想也不 是很方便。
找东西时又发现git,这个以前也接触过,有一次一个同学让我下一个程序的源码,就是git管理的,当时为了下源码还费了点劲,下完后相关软件也卸载了。
看了下,git果然不错,最吸引我的就是可以完全脱离服务器,在版本回溯、分支等方面也强大,更重要的是,git-svn可以很好地整合svn和git,毕竟googlecode还不支持git。
用了一晚上才基本清晰了。用git-svn果然比svn方便,虽然操作细节上更复杂。
概括一下,就是用 git-svn 先把全部内容下载到本地,然后用git命令进行处理,想commit 时再用 git-svn。也就是 git-svn 只负责和服务器交互,而本地用的就是git。但是有些地方还会有问题,例如分支,不过问题也不应该太大,至少现在。
拿 http://code.google.com/p/ly50247 举个例子
svn checkout https://ly50247.googlecode.com/svn/trunk/ ly50247 --username ly50247 --password ***
换成 git-svn 就是:
git svn clone https://ly50247.googlecode.com/svn/trunk/ ly50247 --username ly50247
但是没有 --password 选项,口令只能在提示下输入。
这会在建立ly50247目录,里边有一个.git目录,其余的就是源码了。
几个简单的命令:
git add #添加文件
git commit -m "提交注释" #提交
git commit -a -m "注释" #相当于 git add . && git commit -m "注释"
git svn dcommit #提交到svn
……
记不住现查也没问题……
还有一个比较重要的是在本地直接创建,更简单了:
git init
现在就可以管理代码了。
网上查时如果有命令直接写 git-svn,那应该是旧版本的,应该把git svn用空格分开,有的命令还有变动。
http://www.robinlu.com/blog/archives/194
http://dev.lemote.com/drupal/book/export/html/21
http://www.uml.org.cn/pzgl/200912118.asp
http://www.bitsun.com/documents/gittutorcn.htm

vim自动进入打开文件所在目录

经常需要在vim里对打开文件所在目录进行操作,这个功能是必要的。
以前在网上费了不少劲找到这么一条命令:
execute "cd" expand("%:h")
一般情况还可以,但如果路径有空格就麻烦了,不仅不能正常工作,还要弹出个报错的窗口。再上网找就什么也找不到了,唉,以前感觉自己想找什么就能找到,现在感觉想找什么没有什么。
用bash命令方式处理数次,看到各种错误,这毕竟不是bash,试不出来了。
想到.vimrc就是一个vim脚本,看看vim脚本有没有可用的函数吧。
突然发现这是一个十分简单的问题,并两分钟解决之:
execute "cd" substitute(expand("%:h"),' ','\\ ','g')
没想到困扰我半年多的问题就这么简单……可怜那无数次关掉错误提示框的瞬间……

vim插件

下午整理了一下vim插件,感觉有点乱。以前下载后就直接往.vim里一扔就不管了,但如果想不用了,删就不知道怎么删了,有几个tex相关的插件体积不小到处都是……决定全部重下载一回,有的插件可能还有更新。
这回独立备份一下方便多了,.vim里的配置不用改,只改.vimrc里的就可以,这样就不会乱了,想删哪个一找就行了。
插件列表:
vimExplorer
vim-autocomplpop
taglist
supertab
python_fn
python_check_syntax
python
pydiction
omnicppcomplete
libList
cvim
CD_Plus
bash-support
有几个是新放进去的,配完后进一步感受到了vim的强大。
-----------------------------------------------------------
vimExplorer:
一 个文件管理器,和某些文本界面的独立文件管理器相似,感觉直接用没有太大优势,但如果正在用vim时突然想查看某文件,还是很方便的,借助vim强大的查 找功能,找到一个文件很容易。选中文件会用系统默认的关联程序来打开,而不是用vim打开。但似乎不能直接执行可执行文件。


CD_Plus:
在vim里的super cd,想切换目录,非常方便,可以将备选目录在上面显示出来,对按键进行优化,但感觉也是一个比较边缘的功能:



python相关:
python_fn
python_check_syntax
python
pydiction
忘了哪个功能属于哪个插件了,但有了这四个插件,vim就不亚于一个专业的python开发环境(当然还要配合一下那几个通用插件)
自动补全功能非常大,基本上只要不是你原创的东西都可以补全,另外保存时会显示警告和错误,这样不用运行就可以发现问题,可以对函数,类,块进行各种操作,在相关的代码到处跳转,等等。



c/c++ 相关:
omnicppcomplete
cvim
taglist
这 个应该是比较重量级的。提供好用的各种补全,模板,跳转,错误定位等功能。菜单上有许多功能。有一点要注意,omnicppcomplete需要tags 文件,要先把相关的include目录生成tags,然后路径加在 tags 变量里,就可以用各种库函数的补全,声明跳转等功能,这个tags可能有点大,有的单个的库就有几十M,但用时反应很快,基本感觉不出延时。另外帮助文档 里还有许多其他功能。



bash-support:
这当然就是对shell脚本的支持了,具体功能可见菜单,文档里还有更多,刚才偶然发现的,看了下,功能挺多。
还有一引动功能忘了是哪个插件提供了的。
例如有一个特别的补全功能,就是在当前文档找出所有符合你已输入内容的字符序列,这对写配置文件非常有用,在编程中也不错,至少能让你少按几个键。还有一个,如果你输入的看上去是一个路径的话,它会列出来你想输入的可能的路径,让你一级级选择。
这 些插件直接从官方网站下载就行,有目录结构的直接解压到 .vim 里,单个文件的看帮助,但一般都可以放在 .vim/plugin里,有的放在.vim/ftplugin或.vim/syntax里,不会改里边的任何文件(当然改也没问题),然后.vimrc 要写明白。
我承认我写的就不怎么明白,有的完全是从网上copy的,也不知道什么意义就放进去了。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"file: .vimrc
set nocompatible
set ch=2        " Make command line two lines high

" 设置多编码文本
set fileencodings=utf-8,gbk,cp936,gb18030,big5,euc-jp,euc-kr,latin1,ucs-bom,ucs
set fencs=utf-8,gbk,cp936,gb18030,gb2312,ucs-bom
set enc=utf-8
"当设置下面一行时无论所打开文件是否为utf-8编码,保存时都会强制保存为utf-8格式
"set fenc=utf-8
set mousehide      
set nu
set cindent
set backspace=indent,eol,start
set smartindent
syntax on
map "+gp
map "+x
map "+y
nnoremap :!gvim %:t:r.txt
nnoremap :!./%:t:r<%:t:r.txt
nnoremap :!./%:t:r
nnoremap :!./%
"nnoremap :!nasm -g -f elf %; gcc -o %:t:r nasmx/inc/asm_io.o %:t:r.o

" I like highlighting strings inside C comments
let c_comment_strings=1
set hlsearch
set mouse=a
filetype plugin on
syntax enable
colorscheme torte
filetype plugin indent on
set nocp
filetype indent on
execute "cd" expand("%:h")
let g:pydiction_location = '~/.vim/after/ftplugin/pydiction/complete-dict'
set grepprg=grep\ -nH\ $*
set nobackup

" TagList
let Tlist_Auto_Open = 1
let Tlist_Show_One = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Ctags_Cmd="ctags"
map :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
set tags+=~/.vim/tags/c++.tags
set tags+=~/.vim/tags/qt.tags

" OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_MayCompleteDot = 1
let OmniCpp_MayCompleteArrow = 1
let OmniCpp_MayCompleteScope = 1
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
set completeopt=menu

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'
里边的有些路径要根据实际情况写,其他的基本都是通用的。

把文件路径转成wine可用的路径

也许这能稍微提高一下wine程序的可用性,例如可以直接打开文件。
很简单,但遇到一个不小的问题:
形如 a=`echo /usr/bin|sed 's/\//\\/g'` 的语句会出错;
sed:-e 表达式 #1,字符 8:未终止的“s”命令
而直接 echo /usr/bin|sed 's/\//\\/g' 是没问题的。
不知道哪里出的问题,可能是'\'太多?上网找了半天没结果。
后来想到zsh可以用 $()代替``,于是:
a=$(echo /usr/bin|sed 's/\//\\/g'),这回可以了。
先这么用吧。
如果要wine a.exe,让a.exe可以直接关联文件,可以这样写脚本
#!/bin/zsh
cd a.exe所在目录
if [ "$1" != "" ]; then
echo $1
a=$(echo -n $1|sed 's/\//\\/g')
a=Z:\\$a
wine a.exe "$a"
else
wine a.exe
fi


但这样只能打开一个文件,打开多个文件也同理,依次处理就行

该连接已被重置


……
      由于是内容过滤,故简单地采用代理IP的方法是不能突破国家防火墙的,不过国家防火墙还是可以绕过地,剑桥大学的研究小组发出包含敏感词汇的数据包来测试 这个防火墙。研究人员发现,通过忽略中国的路由器发出的虚假的传输控制协议重置信号可以绕过中国的入侵检测系统。如果你向连接的两端同时发出所有的这些重 置数据包,网页的传输就非常好。而这样做是非常容易的。另外国家防火墙对于加密了的通信暂时没有办法,可采取例如划出单独的加密通信信道的措施,一般加密 通信允许接入的通信双方都须注册登记,商用加密仍交由第三方经营管理。再有,不怀好意者可以利用国家防火墙,通过发送伪造的内容包括非法信息但IP指向某 正常网站的数据包,导致该网站被屏蔽,以达到攻击该网站的目的。
-------------------------------------
http://icoko.spaces.live.com/blog/cns!77386A0B0078258F!1254.entry

6月30日

G.F.W在做什么(“连接被重置”背后的GFW)


    许多因奥运到中国来的外国人将会使用互联网与家里联系,告诉家人自己的所见所闻,或者了解世界上在发生什么事。
    他们首先就会注意到中国的网速感觉较慢。一部分原因是中国的互联网拥挤,导致国内国际通讯受到同样的影响。另一部分原因是信号需要花费可观的时间穿越太平 洋光缆,来回于中美之间的服务器;到欧洲的时间会更长,因为也要经过美国。而剩下的一部分原因是中国的互联网审查,特别是当你浏览海外网站时。这就是外国 人们所知道的。
    他们极有可能很惊讶,然后注意到中国的互联网似乎令人惊讶的自由和不受控制。他们能寻找关于Tibet Independence或者8×8或者其他一些禁忌条目的信息吗?很有可能----而且他们能够进入一些有争议的网站。就算他们键入中文关键词“德先生 在中国” ,也能得到结果。而维基百科呢,最有名的在中国受到限制的网站??他们也能够访问。这些观光客自然会怀疑:我听说的“Great Firewall”跟中国对于互联网的限制究竟是怎么一回事呢?
    事实上,奥运观光客的发现并非是中国互联网审查的缺失,而是互联网审查制度的小花招----一种仅仅为他们准备的波将金式(注:俄国女皇叶卡捷琳娜二世的 情夫波将金,官至陆军元帅、俄军总指挥。波将金为了使女皇对他领地的富足有个良好印象,不惜工本,在“今上”必经的路旁建起一批豪华的假村庄。于是,波将 金村成了一个世界闻名的、做表面文章和弄虚作假的代号。常用来嘲弄那些看上去崇高堂皇实际上却空洞无物的东西。)的自由,而且仅仅是在他们待的那段时间。 根据我在中国的两个科技组织与那里的工程师们的对话显示,管理互联网审查的政府部门已经告诉他们要准备好为一些特定的IP地址解禁————一些网吧,饭店 房间以及会议中心等奥运期间外国人有可能在此工作或停留的地方。(我不会透露任何与我讨论过这个话题的中国公民的任何信息,,因为他们承担着因为批评这套 系统或者透露它的工作原理所带来的经济或法律风险。而且,我并没有向中国政府的相关机构寻求他们的说法,因为互联网审查制度的存在几乎在除了一些关于保障 在线信息“纯净”的模糊声明以外,就几乎没有被公开讨论过。)
    不管你怎么看,中国政府控制互联网的企图从来都是粗略、草率或者别有用心的。当美国的技术工作者写到这个控制体制时,总是倾向于强调它的种种限制。当中国 公民谈论时——至少是跟我——他们倾向于强调它的强大。两种观点都是对的,这使得政府控制互联网的行为成为更大的控制人民日常生活的的企图的一部分。
    令人失望的是,用“防火长城”来描述中国政府的整个控制策略并不准确。中国事实上已经建立了一个防火墙——一个阻碍中国的互联网用户与外界轻松联系的障碍 物——但那只是一个更大、更复杂的监视和审查系统的一部分。官方为这整个计划所起的名字是“金盾工程”,名义上是用来阻挡损害中国网民的黑客和其他不安全 因素的。由于重复这个名词让我感到不适,我将使用“控制系统”来代表包括GFW在内的整个战略。
    在美国,互联网本来是设计来避免信息瓶颈的,这样任何信息都能够绕过任何临时的阻碍呈现在人们面前。在中国,互联网天生就内嵌信息瓶颈。即使是现在,中国 与世界上其他任何地方的网络联系都是通过为数不多的3个光纤出口完成的:北部的环渤海地区,接通往日本的光缆;中部的上海,同样是接通往日本的光缆;南部 的广州,接通往香港的光缆。(中国有一小部分地方通过又贵又慢的卫星方式连接网络。还有一些穿越中亚通往俄罗斯的光缆,但流量不大)在2006年末,由于 地震损坏了台湾附近的主要海底光缆,中国的互联网用户才意识到这些瓶颈有多重要。几个月之后,中国大部分地区的国际通讯才恢复到地震前的速度。
    当局能够很容易就做到发达国家很难做到的事:从底层监视所有进出中国的网络流量。他们通过在国际出口局安装名为“嗅探器”的装置监视进出中国的数据包。 这个行为在表面上使用镜像来掩饰。“镜像”是用来描述正常的备份操作的,在这种情况下也是真实的,但是与此同时,小型镜像也被利用起来。信息通过光缆以脉 冲的形式传播,由于需要经过出口网关,为数众多的小镜像将数据传送给一套独立的隶属于金盾工程的电脑集群。这就显现出这个词条(金盾工程)的可怕之处了。 在其他组成互联网的路由器和服务器(指大规模电脑集群必需的文件服务器)都在尽全力使信息封包到达它应该到的地方时,中国自己用于互联网审查的电脑却在检 查同样的信息,已确认这些信息是否违禁。
    这些镜像路由器最初由美国科技公司——思科为中国当局设计并制造的,这也正是思科遭受人权组织如此非议的原因。思科总是对因当局的监管需求定制相关设备的 事实抵赖,声称他仅仅是把卖给其他任何人的设备卖给了中国当局。这个议题现在已经没什么意义了,因为全世界的公司都能生产同样功能的路由器,这其中包括中 国自己的网络设备巨头——华为公司。接下来的功能细化主要在由中国自行研制的监视软件方面。许多这方面的专家都被认为来自军队的科技机构。对防火长城做相 反研究,以期绕过GFW的中国及外国工程师告诉我官方的工作进行的越来越好。
    Andrew Lih曾经是一名新闻业专家,现在是一个定居在北京的软件工程师(同时撰写了即将出版的The Wikipedia Story),向我透露了GFW是怎样阻止中国互联网用户从国外网站查找特定内容的。当用户从浏览器发出请求之后的几秒钟内,抢在特定的信息出现在屏幕上 之前,至少有四件事可能出错——或者说被用来使你出错。
    第一,也是最直接的方法就是“DNS劫持”。DNS或者说域名系统,可以看做登载网站的电话簿。每当你键入一个网址时——比如www.yahoo.com—— 域名系统就会去检查与这个网站对应的IP地址。IP地址是用小点分隔的一系列数字——例如,TheAtlantic.com的IP地址就是 38.118.42.200。如果DNS被控制,返回一个空地址或者错误的地址,用户当然就不能到达正确的网站——就像打电话却被告知一个错误的号码,当 然就找不到正确的人。键入BBC新闻频道的网址时,常常就会遇到这种情况:如果你尝试“news.bbc.co.uk”,你多半会遇到“找不到服务器”的 提示。2002年有两个月,Google的中文网站就遭遇另一种形式的DNS劫持,访问Google的用户被转到其主要的国内竞争对手百度。中国的学术界 抱怨这阻碍了他们的工作。不用面临选举压力的当局仍然不希望与这些重要的团体为敌,Google又回来了。在像17 da 之类的政治敏感时期,许多外国网站都会通过这种方式被暂时禁止访问。
    其次,就是“危机四伏”的连接时期。如果DNS成功返回了正确的结果,你的电脑就会向远程计算机发送请求连接的信号。当你的信号一发出,在另一个系统发出 回复的同时,中国内部用于审查的的电脑就会检查你的请求的镜像,以确认你的请求是否应该被阻止。他们很快地检查一系列被阻止的IP地址。如果你正尝试访问 黑名单上的某一个网站,中国的国际网关就会通过向你的计算机和你要访问的站点发送“重置”命令,达到中断数据传输的目的。重置是一个用来修复未同步连接的 常用网络功能。然而在这种情况下,它却成为强制通话的双方挂断电话的工具。这时,你在屏幕上通常会看到“连接被重置”,或者有时是“找不到服务器”,而不 是你要访问的网站。烦人的是,由Blogspot托管的blog在这个黑名单上。在典型的Google风格的搜索结果中,许多链接都来自维基百科或者其他 流行的BSP。当你在中国搜索时,你能看到这些链接,却无法访问这些网站以获得你想要的内容。
    第三个障碍就是“关键词过滤”。你试图用数字访问的互联网地址也许不在黑名单上。但是如果URL(Uniform Resource Locator, 是一个普通的用英文表示的网站地址——比如www.microsoft.com—— 而不是全是数字的IP地址)中含有被禁止的词汇,连接同样会被重置。比如轮子功的全拼.com这个网站并没有任何实质内容,但中国的互联网用户也不能访 问。关键词过滤列表包括英文词汇、中文词汇以及其他语言的词汇,而且被经常修订——“比如,会加上最近发生矿难的城市名字”——Lih举例说。在这 里,GFW不通过重置而是通过“黑洞循环”来实现目的。黑洞循环中页面请求会陷入到陷入到一系列的延迟命令中。这儿有一个类似的例子——怎样使一个白痴忙 碌起来——你拿一张纸,两面都写上“请翻面”。当Firefox检测到出于这种循环中时,它会给出错误信息:“Firefox 检测到该服务器正在将此地址的请求循环重定向。”
    最后一步,也是整个GFW最新、最复杂的部分:实时检查每张页面的内容——纽约时报的特别报道,或是跟中国有关的blog的最近更新——以判断每一页的可 接收性。这又是通过镜像实现的。当你访问一个喜欢的blog或者新闻站点,请求浏览一些特定的条目时,被请求的页面同时发送给你和互联网审查系统。GFW 的扫描器会检查页面上是否含有违禁词汇。如果找到了,他就会中断连接,不让你继续从那个站点上获得信息。GFW会暂时强制阻止“IP1到IP2”的通讯 ——你的电脑到不受欢迎的网站。通常第一次阻断通讯时长为两分钟。如果在这期间,用户再次发起同样的通讯,通讯阻断将延长到五分钟。如果你还要试第三次, 阻断时间会变为半小时乃至一小时——如此下去,惩罚力度递加。
    多次重试或者经常访问“错误”的网站的用户可能会引起当局的注意。至少在规定上,中国的互联网用户被要求无论是在网吧或是在其他地方,无论何时,都应该以真实名字上网。当审查系统标记出经常发出越界请求的IP地址时,当局极有可能知道是谁坐在那台电脑前上网。
    所有的这类措施都为从海外获取资讯的努力增加了不可预测性。有一天你能够毫无阻碍地访问NPR(National Public Radio)。下一次,因为NPR做了一个关于Tibet的特别报道,便被GFW“石化”了。即使你刷新页面或是点击新闻的链接,都看不到任何东西,而这 时阻断通讯开始了。
    这种方法被认为是审查制度一种更为精确与微妙的形式,因为大型的国外网站再也不用被整个“石化”了。规定上来讲,这些站点只会在做出“错误”报道时陷入麻 烦。Xiao Qiang是加州大学伯克利分校新闻学院专职研究中国媒体的专家,他告诉我当局最近开始反向应用这类过滤技术。当海外的中国人,也许是学者,也许是流亡的 异议人士,在中文网站上查找资讯时——比如,公共健康数据,或者某地非正常活动的新闻——GFW同样会监事及审查他们获得的信息。
    在综合使用之下,审查系统有一些共有的主要特征。当新的监控技术出现,或者敏感词汇表变化时,他们会持续不断地改进审查的着眼点。这样就使广大的网民对 “线”划在哪儿并不清楚。Andrew Lih指出像新加坡或者是阿联酋这样的国家也会进行互联网审查,但他们这样做时会给出解释。当位于阿联酋的访问者点击色情或者是反伊斯兰的网站时,会看到 以阿拉伯文和英文形式同时出现的信息:“很抱歉,你试图访问的网站由于与阿拉伯联合酋长国在宗教、文化、政治或是道德方面的价值观不一致而被屏蔽。”在中 国,连接超时就搞定了。这是你电脑的问题?还是审查系统?或者是你的ISP,谁自行确定了过滤规则?你不知道。“审查系统的不确定性事实上使它变得更有 效,”另一位中国的软件工程师告诉我。“你不知道审查系统要审查什么,所以要时刻谨慎。”
    审查系统的组件还有一个共同点:很容易被绕过。
    事实上,在中国任何人想要绕过审查系统都有两种有名的、可信赖的方法:代理服务器和VPN(虚拟专用网)。代理服务器是通过将你的电脑与海外的一台或一系 列电脑连接,如此传送的信息,其真实来路就会被隐藏。你首先发出一个请求,接着代理服务器接受,再转发到美国、芬兰或是巴西的另一台电脑。最后找到你想要 的,再传回到你的电脑。这种方法主要的缺点是速度慢到难以忍受。但是由于大多数代理服务器是免费的,所以这种方法成为中国学生及骇客的最爱。
    VPN,又叫虚拟专用网,是一种更快、更受青睐、更正式的方法。本质上,VPN是沿正常的信道建立一条专属的加密信道。VPN将你从中国国内连上海外的某 个服务器。你的下载及浏览请求就会传送到美国、芬兰或是日本的服务器,然后这个服务器去发现并将你找的东西传输回来。审查系统无法阻止你因为他没法读懂你 发送的加密信息。在中国的每个外国公司都在使用这样的网络。VPN在中国可以自由宣传,因而个人也能使用。我使用的VPN一年40美元。(一个在中国流亡 的人说:不过是一天一毛多一点儿。一个工人说:不过是一周的家用。甚至对于年轻学者来讲也只是几天的收入。)
    在技术上讲,当局只要愿意就可以随时切断所有代理服务器和VPN连接。现时的政策是:如果通过审查系统的信息由于加密而不能识别,就挥手放行。很明显审查 系统的政策可以随时扭转。但是和我交流的每个人都说中国当局担当不起这样做的后果。“每家银行、每一个外国制造商、每家零售商、每一个软件厂商都需要 VPN才能存在,”一个中国教授告诉我。“如果商业信息通过公众互联网和审查系统传送,他们第二天就会关门。”关闭免费、容易操作的代理服务器同样会遇到 这样的问题,只不过是结果更温和。加密的邮件也能不通过审查进入中国。Web界面邮件系统的用户能够通过将通常使用的“http”前缀更改为 “https”来建立加密通道——例如,https://mail.yahoo.com, https://mail.google.com, https://mail.live.com/。为了保证中国正常,当局必须在采取的措施中允许例外——即使知道许多中国公民会借机“透气”。
    因为政府不可能堵住GFW的每一个口,许多美国观察人士由此看出政府控制网上言论的巨大付出,以及德先生倾向和草根阶层的诉求,都是必然的趋势。最近在一 个有影响的美国科技网站发布了这样的头条“ GFW并不是那么有效”。十月,连线在总标题“ The Great Firewall: China’s Misguided—and Futile—Attempt to Control What Happens Online”下组织了一系列报道。
    我们需要探索这么多的美国人对通过交流技术传播的德先生愿景如此信服的原因(Samizdat, fax machines, and the Voice of America eventually helped bring down the Soviet system. Therefore proxy servers and online chat rooms must erode the power of the Chinese state. Right?(自己看,就不翻了)) 接着,我要强调这个愿景对于大多数受到即便是不完美的审查制度影响的公众是如何不令人信服。
    再思考一下互联网审查制度的真实价值。你以为中国政府真的会关心一个公民是否在维基百科查询8*8的条目吗?当然不是。任何人想要知道都能得到——通过代理服务器、VPN,用电子邮件拜托海外的朋友,甚至是阅读公共图书馆里为数众多的未受审查的外国杂志。
    政府关心的是要对信息控制得恰到好处,使民众不至于反感。大多数中国人,同大多数美国人一样,主要是对自己的祖国感兴趣。他们周围充斥的是关于中国和中国 人的信息,远远多过能吸收的范围。报摊上满是数不清的印刷精美的杂志。为数不少的大型书店里,书码得整整齐齐,到处是各类广告,公共图书馆里也是一样。音 像店里有各种东西的盗版。数不清的电视频道。当然还有互联网,在那里中文网站和关于中国的网站迅速增殖。当长城背后的东西已足够丰富,干嘛还要花费时间和 精力,并担当不必要的风险,仅仅是为了看看外面?
    所有金盾工程使用的技术,所有帮助建立GFW的神奇镜像——这些和其他现实的成就都是为了一个早已存在的目的。他们通过使探寻外部讯息成为讨厌的事,把中国人都赶回到惯常社会控制手段产生作用的环境。
    中文bloggers已经知道要想在中国被访问,他们的网站必须建在中国,同他们的主要潜在受众一起待在长城的一侧。当然,他们也能在海外传播同样的信 息。但是正如前任CNN驻北京通讯员、现在香港大学新闻与传媒研究中心的Rebecca MacKinnon所说,他们的读者不会做翻墙的努力去找他们。“如果你想要在中国有影响,你就必须要在中国,”她告诉我说。当然,在中国就意味着遵守政 府针对所有媒体的一系列管制措施:经济威胁、法律风险;不可避免的自我审查。
    中国的大多数blog由大型互联网公司提供服务。这些公司知道政府要让他们对blogger的不合适言论负责。因而这些公司为了生存,也被迫进行额外的审查。
    相当数量的受薪政府审查员负责删除不合适的评论和警告越界的blogger。(没有官方的数据,但是据估计有数万人之多)公民举报颠覆材料的行为是被鼓励 的。宣传部门经常发出指示说明哪些能、哪些不能被报道。在十月,位于巴黎的(*****)组织公布了一份令人震惊的报告(***省略一部分,烦请参照原 文,望谅解***)。
    “国内的审查制度是真实的,而且有关(***省略一部分,烦请参照原文,望谅解***),”伯克利的Xiao Qiang说。去年秋天,一队来自加州大学戴维斯分校和新墨西哥大学的计算机科学家发布了一份关于GFW原理和如何如何扰乱它的详尽报告。但是他们着重强 调了一个非技术因素,“审查导致的自我审查。”
    把中国描述为受意识形态禁锢的国家并不正确。它在许多方面难以置信的开放。“大多数中国人比从前生活在这片土地上的人感觉自由得多,”一个在美国获得博士 学位的中国软件工程师告诉我。“从前没有任何言论的一点空间,政府很聪明地选择再不威胁其生存的方面持续扩大空间。”但是忽视人民禁止讨论话题带来的累积 效应同样是错误的。“不管美国人是否支持布什,它们都不可避免的注意到 Abu Ghraib,”Rebecca MacKinnon说。在中国,“这样的控制意味着整个被认为对社会稳定有害的言论都不能存在于公众讨论中。”大多数中国人对国际热议的话题完全没有概 念,比如三个峡谷的水坝的争议。
    关于今日中国的无数问题都归结为:这样的情况能够持续多久?在自然环境崩溃之前工业还能持续增长多久?在穷人抓狂之前,贫富分化的情况还能继续恶化多久? 这些构成一张类似问题的清单。而GFW将这些问题置于另一个形式:政府控制民众知情权的情况还能持续多久?目前看来,很长。

ubuntu 9.10 开启tty中文支持及分辨率修改

http://www.digestweb.cn/index.php/blog-view-38636

Ubuntu9.10出来了,于是乎赶紧试用,直接把以前的版本格了,重新安装了下。为了让tty支持中文,我首先 安装了 zhcon
安装之后 ,ctrl+alt+f1切换到tty,运行zhcon --utf8,结果花屏,并且键盘错乱,没办法,重启下。
重启后 ,运行zhcon --utf8 --drv=vga 不再出现键盘错乱问题,但是分辨率却不尽人意。
于是,改下分辨率 ,本来分辨率可以在/boot/grub/menu.lst中修改,但是Ubuntu9.10才用的是grub2 ,配置有所不同,并没有menu.lst这个文件
经过一番google,终于知到,配置文件换为/boot/grub/grub.cfg 而这个文 件是不建议修改的,这个文件是脚本根据模板自动生成的,而这个模板文件为:/etc/default/grub ,修改/etc/default/grub GRUB_CMDLINE_LINUX='vga=791' vga=791表示分辨率为1024*768。运行 update-grub2,重新生成配置文件,重启,成功。
现在再来运行zhcon --utf8 --drv=vga ,分辨率却有重新回到640*480,郁闷,记得以前不是这样阿.
运行 zhcon --utf8 正常,完全OK,看来是不能用 --drv这个参数 。
最后总结一下
1。 修改tty分辨率。修改 /etc/default/grub GRUB_CMDLINE_LINUX='' 为GRUB_CMDLINE_LINUX='vga=791',其中vga=791可根据自己的显示器设置,具体参数可以google得到,运行 update-grub2,重新生成grub配置文件。重启后,分辨率就修改了。
2。设置中文支持。apt-get install zhcon 安装zhcon,切换到tty,运行zhcon --utf8 (不能在图形界面下的终端中运行zhcon),问题解决!

//vga=791 这对应的是1024*768,没查到1280*800对应多少,不过用这个看上去也挺正常。