Vim字符编码及中文菜单乱码

vim经常遇到文件乱码的情况,很多的文章都只是解决了作者遇到的乱码问题,不同的使用者由于环境不一样,参考之后,反而更加混淆和复杂。

其实vim乱码是与系统环境非常相关的,一味执着于修改vim的配置而不知道分析系统的实际环境,往往导致混淆,本文从原理分析vim编码的设计和乱码原因,帮助所有的用户解决vim的乱码。

vim为何会出现乱码:

  1. 首先是输入,vim 以错误的格式解析文件,比如原本是utf-8,但以ansi解析,那必然是乱码了。
  2. 然后是处理,vim 以错误的格式处理文件,比如原本是utf-8,但内部以 ansi 保存处理,导致乱码。
  3. 然后是输出,vim 输出显示的编码与系统不一致,也会乱码。
  4. 最后是写入,vim 回写文件与打开的不一致,造成编辑后文件乱码。

在 Linux 下需要考虑:

  1. Linux 默认支持的语系,/etc/sysconfig/i18n
  2. 终端 bash 的语系,与 $LANG 变量有关
  3. 再就是上面提到的文件编码有关

VIM编码相关选项

Vim 有四个跟字符编码方式有关的选项,encodingfileencodingfileencodingstermencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:

encoding

encoding(enc) : Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、寄存器中字符串、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义。Vim 读取文件之后,但并不以读取文件的编码来处理,而是会转换成内部编码的格式。这个编码默认是系统 locale 决定,一般与操作系统相关,linux下utf-8居多,中文windows下则是gbk。可以使用 :set enc 来查看当前 enc 设置

fileencoding

fileencoding(fenc) : 用于配置打开文件和保存文件的编码,fenc 是当前缓冲区文件自身的编码。从磁盘读取文件, Vim 会对文件编码检查,如果文件的编码与 Vim 内部编码(enc) 不同, Vim 会对文本做转码。当 Vim 向磁盘写文件时, enc 与 fenc 不一样, Vim 会转码成 fenc 编码保存文件。

该设置只能有一个值,只适合少数文件都是同种编码的环境

fileencodings

fileencodings(fencs): 这是一个字符编码的列表,Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。从名字上看就知道是fileencoding的增强版,可以配置多种不同的编码,常见的配置为,配置好之后,列表中的文本编码只要合法,都能被 Vim 正确的读取。

termencoding

termencoding(tenc): Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式,或者说是 Vim 用于屏幕显示时的编码。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。Vim 输出的编码,输出指输出到操作系统或命令终端等,默认与操作系统的语言编码一致,如果使用linux命令终端,建议终端和linux系统配置相同的编码,然后配置相同的termencoding,否则顾全了vim就顾不上shell,不过如果shell不存在中文名文件,则配置终端和termencoding一致即可,对于windows,能自动的识别gbk和utf-8,不用特殊配置。

fileformats

fileformats,用于区分操作系统,主要是回车\r\n的区别,fileformats选项,用于处理文件格式问题。以下命令,告诉 Vim 将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:(换行方式 在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符来移到第一列,另一个字符来新增一行。计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。UNIX人认为在到达一行的结尾时新增一行 (LF),而Mac人则认同 (CR)的解决办法,MS则坚持古老的 (CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而 Vim 编辑器则会自动的认出这种文件格式方面的区别,并做出相应处理。)

set fileformats=unix,dos

VIM 多字符编码方式工作流程

再记录一下,Vim 的多字符编码方式支持是如何工作的:

  1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
  2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到看起来是正确的字符编码方式,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。
  3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。
  4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。

由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;) 。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示 cp936,也就是 GBK 的代码页)。

vimrc中设置

在分析了乱码原因,了解了vim编码的参数之后,就可以根据实际情况来配置了

  1. 分析文件编码,配置 Vim 文件文件解析编码fileencodings,让 Vim 能解析出来
  2. 分析系统编码,配置 Vim 内码encoding,如果linux系统语言为ansi,则必须配置内码,否则 Vim 无法处理中文,中文windows下 Vim 内码为gbk,但还是建议统一配置为utf-8
  3. 根据输出配置显示编码,linux系统如果使用了putty或者SecureCRT,需要注意配置termencoding和终端软件一致,windows系统比较少有终端软件,系统能自动解析gdb和utf-8,建议统一配置为utf-8

参考的 Vim 编码配置如下,linux 和 windows 配置相同,linux系统语言编码和ssh终端编码配置为utf-8,windows则不需要配置,即可正常的打开utf-8,gdk等编码的文件

" Vim 内部编码
set encoding=utf-8
"按照utf-8 without bom,utf-8,顺序识别打开文件
set fileencodings=ucs-bom,utf-8,gbk,gb2312,cp936,big5,gb18030,shift-jis,euc-jp,euc-kr,latin1

set fileencoding=utf-8

"防止菜单乱码
if(has("win32") || has("win64") || has("win95") || has("win16"))
	source $VIMRUNTIME/delmenu.vim
	source $VIMRUNTIME/menu.vim
	language messages zh_CN.utf-8
endif
"默认以双字节处理那些特殊字符
if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
	set ambiwidth=double
endif

set nobomb "不自动设置字节序标记

参考:


2015-05-01 vim , linux , encode , fileencoding

开始使用Vim

这是不是一篇 Vim 的教程,只是一个入门 Vim 的流程,如果你从未听说过 Vim,但是希望学习 Vim,那么可以继续往下看,如果想要了解 Vim 更多的功能可以参考博客中其他关于 Vim 的文章。

Brief Introduction

vim作为一款linux下必备的编辑器,如果学会了使用,非常强大,但是不得不说vim的入门实在是太困难了。当然如果只是简单的使用插入功能,i,进入插入模式,直接敲,敲完esc退出,再:wq保存退出,也就是最基本的入门了。当时如果想要尝试其他的功能,就不得不看文档,装插件,装配色方案,写vimrc配置等等了。

其实很多vimer都会对新手说一句看帮助文档,这句话对新手真的毫无用处,或许真的只有对vim有了一定了解才能在文档的帮助下学到vim更多的东西。文档一般都是大而全,有很多部分其实完全没有必要再新手阶段的时候就全部读完,而甚至有些命令,设置用了多年的vimer都不会去接触一下。所以如何入门?首先要了解作为一个编辑器最基本的功能,写入,删除,修改,保存,编码,而对于vim,还有几大模式,移动光标,替换操作等等。

vimtutor

在最短的时间内了解这个编辑器的基本功能,至少把他能够当成一个编辑器使,再不济能够直接使用键盘来浏览文件内容,对文件内容进行修改,删除,保存。当然在几十分钟内你可能要记住几十个命令,以及每个命令对应的操作。可能这对于很多新手来说需要锻炼一段时间才能记住,所以不要怕,用记事本,或者VIM记下来每个命令和对应的功能,之后不断的练习,很短的时间就能习惯这种操作。在习惯了之后就会发现再移动鼠标是多么的慢。当然你可能在VIM默认配置中有很多不太习惯的地方,把你那些不习惯记住,把那些你想要的功能一个一个记下来,在以后的学习中,我们来一一解决。

比如我在最初的时候觉得j/k在行之间移动,有些时候中文一行比较长,显示的时候跳跃了很多行,而是用j/k移动光标的时候在几行之间跳跃,让我很不习惯,当然这个在之后的学习中偶然看到了原来只要在VIMRC中配置<map> j gj就能够用j来直接到下一行,即使这一行事实上是VIM中的一行。还有很多很多的问题,都在短短几天的时间内一一得到了解决。所以开始的时候用极短的时间略读一遍vimtutor先熟悉。哦,对了,vimtutor在哪里,Windows下是在VIM安装目录下vimtutor.bat这个文件,双击运行,而Linux下直接终端运行vimtutor即可。当然这一切都在VIM的帮助文档中写着了,你可以尝试在VIM普通模式下运行:help vimtutorVIM会把文档全部显示出来。

vimrc

在熟悉了最基本的命令之后,你可以开始看文档,尝试修改vimrc配置,当然如果你不想看英文文档,VIM还是有中文文档的。不想覆盖:help 的文档,直接下一个PDF的随时查看也挺好,在熟悉了一下命令之后,直接看英文的也就很快了。我的方法就是直接看别人的配置,去Github上面一搜,很多人把自己的配置都公开了,就去一条条试试那些命令,有什么作用,我自己能怎么修改,然后查文档,很快你自己熟悉的配置就有了。

Plugin

当然在熟悉VIMRC配置之后,在随便哪个文件中只要运行:edit $MYVIMRC就能够直接编辑vimrc文件,我在网上看别人的博客,于是我也就用了很多人推荐的Vundle来管理我的插件,从此之后再不用下载,解压,复制,只需要修改vimrc配置就能够安装插件,同样也只要保存一份配置文件就能够同步我的插件,这件事简直太棒了。当然最初安装Vundle这件事情是要你自己来的。直接去Vundle主页看吧。

colorscheme

或许在练习了VIM不久就会觉得VIM的颜色太单调,但是没关系,VIM有很多很多的配色方案,只要你能找到总能找到自己喜欢的,我直接用了别人推荐的molokai,你也可以试试,下载molokai.vim文件到colors目录下之后,在vimrc中写入colorscheme molokai,就能使用这款配色了。当然你也能自己定义字体和字号,还有很多你能自己定义的东西等待发掘的。

附送两张图

vi tutorial

vi key command


2015-05-01 vim , tutorial , linux , editor

cloudup尝鲜

应该是很久以前在听到一个韩国FM节目的时候遇到得这个网盘Cloudup,当时直接能在网页上播放音频视频,所以觉得还不错,可是当我想去注册时才发现这个网站需要邀请才能注册,没办法只能申请邀请,于是等了很久很久之后,今天早上打开邮箱,官方终于邀请我去注册了。

官方的邮件也极其简单:

Thanks a million for joining the Cloudup wait list. You and your pals can now signup without waiting a minute longer!

Create your account now to start sharing files, links, pictures, gifs, videos, and documents instantly and beautifully with anyone. Just drag, drop, & stream.

Let me know if you have any questions, and have a wonderful week!

虽然简单但也把问题说的清清楚楚,这个社会已经没人不知道网盘服务了,所以也就么有必要解释,简单的说“能够分享文件,链接,图片,gifs,视频和文档”这也就够了。再把上传过程“drag,drop&stream”,分享界面beautiful说明白,真的足够了。其实我最关心的stream,很少网盘能够支持音视频直接串流的。

注册了账号体验了一把,界面清爽,操作简单,分享的链接漂亮,预览快速,支持直链,给我用也足够了。哦对了,这个网盘用item的数量来表示空间,至多能上传1000份文件,每个文件至多200M。我想也足够了呢。

你可以尝试我分享的Music:https://cloudup.com/cuP0Yl1BeGj

还有文档:https://cloudup.com/cSvQXovNXBx

最后你如果也想试试,我的邀请:https://cloudup.com/s/einverne-865

161011 更新

今天心血来潮,用 Cloudup 做个 Podcast 倒是很好的选择,查了这么久的 Podcast Hosting,各种收费,VPS,可是这个现成的 Cloudup 不是刚刚好么,1000个文件,想想都无法做到那么多,然后稳定性,经过这么多时间的观察,似乎这个已经是可以认可的了,并且这个云盘服务没有大规模扩张,一直保持着清爽的界面,真不知道后面是如何赚钱的,希望不会倒闭吧。


2015-04-30 products , cloudup , 网盘

魅蓝Note折腾记

##魅蓝Note的一些设置和想法

  1. 账户–点击账户名–系统权限可以开启ROOT,默认是关闭的,开启后不再享受三包!
  2. 安全–权限与凭证–允许安装位置来源~-开启这个,否则一些软件将无法正常安装。默认是关闭的。
  3. 辅助功能–有很多实用功能
    • 手势唤醒里常用设置可以参考:双击=点亮屏幕,上滑=解锁,下滑=打开通知面板,V=手电
    • 长按主键可以设置关闭屏幕或语音助手
    • 实时网速,依个人需求开启
    • 智能隐藏Smartbar 推荐开启
  4. 关于手机–存储–清除手机数据=恢复出厂设置。建议:恢复出厂之前记得备份!手机账户-云存储-可以备份联系人及桌面布局
  5. 一些补充:
    • 如果手机出现黑屏,无法点亮的问题不要着急。长按电源键7S可重启。然后官网下载最新版固件升级即可。
    • 对于App的缺点,则不在我的考虑范围,不喜欢拨号盘,那我可以更换其他App,不喜欢短信app,我也可以换,这就是Android的优势。所以我替换了桌面TSF Launcher,浏览器Chrome,短信Messenger,地图Google Map,音乐Play Music & NetEase Music,记事本Keep,日历Google Calendar,搜索Google Search······我是不是有点强迫症了。
    • 看到貌似是和LBE合作了,有一个简单的安全中心,将就用吧,反正之前也是用LBE
    • 没有纯正Android的返回,HOME,最近应用的三个虚拟键,很不喜欢,略奇怪的操作

##魅蓝Note如何安装GApps

  1. Root 账户–点击账户名–系统权限可以开启ROOT,默认是关闭的,开启后不再享受三包!
  2. 两个地址下载FQ工具
  3. Google安装器
  4. 登录FQ,输入SS帐号,登录Google Play Store,更新各项服务

参考:


2015-03-13 Android , Root , Meizu

返乡

南都讯 春节期间,一个上海大学博士生的返乡笔记《一位博士生的返乡笔记:近年情更怯,春节回家看什么》在微信朋友圈及微博等社交媒体疯传,截至昨晚9点,该文在微信公众号“市政厅”上阅读量已超过4.6万多次。近似“疯狂”的转发量让作者王磊光感到不安和不理解,在他看来这只是一个媒体事件,自己不过是“不小心卷入了其中”。

王磊光

##作者否认美化绿皮火车

这篇文章的作者是80后博士生王磊光,如今在上海大学文化研究系上学。他平时喜好文学,对乡土问题比较关心,本科毕业后曾在某中学担任语文老师,随后继续考研深造。在这篇笔记中,他描述了自己返乡的见闻:交通没有以前那么拥挤,但家乡人与人之间联系渐渐疏远,而农村里年轻人的婚姻受到了物质的压迫,知识的无力感也十分强烈。

没想到,就是这些在他眼里看似普通的乡村生活见闻,却触动了一大批读者,在春节返乡之际引发了人们对乡土的思考。许多网友都用“感同身受”四字评价,但也人指出返乡笔记有“美化”嫌疑,网友“Walter”评论道:“什么素质,绿皮火车脏乱差,打牌外放音乐严重影响他人,居然还好意思美化……”

对此,王磊光感到很奇怪:“为什么有人读出了美化,我身边的朋友都为我担心,觉得我将家乡不光彩的一面说出来了。至于我提到慢车及其生活状况,从来都没有赞美—我讲述记忆中的交通时,已经说到了慢车上的那种糟糕的情况。我这里提到慢车,目的在于说明它在当下存在的必要性;同时,指出慢车上的那种人与人的联系,是人间应该有的自然联系。”

##“知识的无力感”观点引发论争

此文也让中国农村的现状,在春节期间成为社交媒体上的热门话题,并收获诸多回应,有肯定的声音,也有争议之声。前日,一篇署名为“古鱼”的《又一篇博士生返乡笔记:从一而终的稳定生活更可怕》在澎湃新闻发布,以另一位来自乡村的文科博士生视角看乡村。古鱼对农村大学生“近年情更怯”的现象表示不认同,在他看来读大学的观念应该改一改:“无论乡村还是城市,读书不会无用,因为知识是有用的,读过大学的人相对而言会有更高的成长空间,以后贡献越大,拿钱也就越多,而不是一毕业就能兑现很多钱或一毕业就加入体制内获得某种‘人上人’的身份优越感。”

对于返乡笔记引发的争议,王磊光回应道,自己从未说过读书无用,只是强调知识的无力感。“本来读书出来是应该有所为的,但是回到家乡却不能做什么。”

##这篇笔记其实是应邀写的演讲稿

除夕之际,王磊光不断接到朋友、以前学生的电话,他才知道自己的返乡笔记在这个春节火了。这是他没有预料到的,他感到不安,也不能理解:“我很少去看别人的评论,因为在我看来,这只是一个媒体事件。”

事实上,这是王磊光应邀为2014年2月举办的“我们的城市论坛”所写的一篇演讲稿。他反问南都记者:“你有没有发现这篇文章就像一个提纲?很多内容和细节没有展开。”春节前,上大现代文学研究所副研究员罗小茗告诉他,媒体有意发表其返乡手记,王磊光答应发表。当时的题目仅是《近年情更怯》,最终见报标题为《一位博士生的返乡笔记:近年情更怯,春节回家看什么》。因此,他把返乡手记爆红的原因归于媒体的传播。

王磊光这篇笔记也获得了自己的导师—上海大学文化研究系教授、主任王晓明的称赞:“分析很真切,文化研究的视野开始有点形成了,好!”博导王晓明表示,读了返乡手记最后一部分“知识的无力感”,也同样感到心情沉重:“从现代早期到上世纪90年代,从农村出来到城市求学的人,总体上是能够以自身的生活和精神状态让其他没有这个机会的人信任‘求学是人生正道’的,有这个信任在,城市里的进步力量反哺乡村的可能就存在。但现在的情况,似乎越来越像80年代晚期90年代初的上海:出租车司机每月赚1400元,当得知我一个大学副教授每月才600元的时候,很同情地看着我:‘算了,下海吧!

##“突然出名”让他感觉很不真实

王磊光觉得,自己这篇文章没什么了不起,也不是他理想之作,这种“突然的出名”让他感觉很不真实。网友们不断在网上评论博士生返乡手记,王磊光在手记发布的第一天看了看评论之后,便很少关注。他知道,不管自己说什么,都会有各种评论出现。

更何况,真正生活在文中所述乡村的人们并不知晓博士生返乡手记的走红,王磊光也从来没有向生活其中的长辈们提及文章的事情。“他们都是很本分的人,如果看到我将身边的事情写了出来,一定会为我担心。

对于自己的文章引发的有关农村大学生出路问题的讨论,王磊光则表示,“我所说的,是80后大学生出路难的问题,这里有一个背景,即与上世纪八九十年代大学毕业生相比,当时他们大学毕业之后是能够改变自己甚至家庭的命运,而如今的80后大学生承载着家庭的希望,但绝大部分人的出路是艰难的。”如今,媒体陆续找到他,但王磊光希望人们不要关注他本人,而去关注现实的中国。

##附全文

###博士春节返乡手记:越看越对乡村的未来越迷茫

“有故乡的人回到故乡,没有故乡的人走向远方。”我很庆幸我有故乡,可以随时回去,尤其可以回家乡过年。因为我的根在那里,我的亲人在那里,我的生活经验和记忆在那里。

我的家乡在湖北的大别山区,L县。我导师王晓明教授在2004年写过一篇著名的文章《L县见闻》,写的就是这个地方。王老师以我家乡为对象,揭示了当时农村的破产状况,人的精神的颓败,以及乡村文明的没落。我家所在的那个村子,是一个东西两座大山夹住的狭长谷地。一个村子由十来个“塆子”组成,一个塆子有几十户人家,我家那里叫王家塆。

直到现在,我每到一个地方,凡是碰见两山相夹或两排高大的建筑物相夹,我的第一意识就是,这两座山或两排建筑物,一个在东,一个在西,所以我在外面经常迷路,尤其在城市里。上海7号线有两个靠得比较近的站:“长寿路”和“常熟路”。我好几次下错站,以致现在每到这两个站就紧张,怕弄错了。为什么呢?因为在我家乡的方言里,“长寿”和“常熟”是完全一样的读法。人要靠语言来思维,这个事情让我意识到:对有家乡的人来说,是用方言来思维的。

我有一个初中同学群,群里90%的同学只读到初中就出去打工。经过十七八年的积累,很多同学在城市里有房有车,有的还有了自己的事业。平时在群里,他们交流的最多的是工作问题,车子问题等,言谈中总少不了炫耀。

但有一次,有个同学忽然在群里说,他已经三年没回家过年了,另一个同学紧跟着说,他五年没回家了,接着很多人说起回家的情况。有一个说:不管怎么样,今年过年一定要回一次家!另一个说:如果能在家乡找一个两千块钱的工作,就回去算了。还有一个说:能找个一千块的工作,我这边什么都不要,也愿意回家。

我有一个从小学到初中的同学,已经十年没有回家。有一天他在qq里突然对我说,我的父母是很好的人,因为小学四年级的时候他去我家玩,我爸妈用腊肉下面给他吃。这都是陈芝麻烂谷子的小事,他还记得,其实我知道,这是因为他太想家了。

上海大学文化研究系有位老师主持来沪青年工人的社会调查,最近在访谈工人。有一个打工者说:我真希望邓小平没有搞改革开放,我也愿意日子苦些,因为这样我就可以每天跟父母和孩子在一起。

回家过年,其实是没有道理可讲的一件事。套用贾平凹的话来说:家乡对我们的影响,就像乌鸡的乌,那是乌到了骨头里面。

###回家的交通

十多年前我上本科的时候,从大西北到武汉,坐的是那种编码没有字母只有四个数字的绿皮火车,22小时,通常要晚点两三个小时。西北往武汉的路线,不是人流最多的,但春运那个挤啊,大大超出了今天90后的想象。好在那个时候,学生一般都可以提前集体订票,买得到座位。而站着回家的,几乎全都是农民工。每次上车的时候,无论有票的还是没票的,都一窝蜂往车上挤。

我对过年回家的第一印象就是:我背着一个包,提着一个包,与同学一起,从第一节车厢狂奔到第十几节车厢,然后被后面的人推着挤上了车。上车后一分钟,车就开动了。我记得火车广播里号召大家发扬风格,让站着的乘客挤一挤。大家真的很友好,四个人的坐位,挤了五六个。火车过道里人贴着人,想蹲下来都没有办法,连厕所里也挤着好几个人。

男乘客还可以想办法,可苦了女乘客。记得有一次我身边坐着一个在西安读书的大学生,他要小便,就脱下外套让我给他挡住身体,想把尿撒在矿泉瓶里,但他很紧张,用了十几分钟才勉强撒出来。我还记得有一次身旁坐着一个从西北打工回家的河南妇女,尽管有位子,但她实在太困,太想睡觉了,就把位子让给别人坐,自己钻到座位底下睡觉去了。

应该要肯定,我们国家这十年间的铁路建设取得了巨大成就,铁路线路的增加,尤其是动车和高铁的开通,极大缓解了交通压力。火车站、火车上,起码不会像过去那么拥挤了。

过年回家那种路途的遥远、时间的漫长、竞争的激烈、拥塞以及不安全感,让我对“男儿有志在四方”的观念产生了极大厌倦。所以,本科毕业时,我找工作坚决要回到湖北。后来我就在家乡隔壁的县城一中当老师。自2004年到2011年来上海读研之前,我再也没有遭受春节回家难的痛苦。尽管从隔壁县回家的汽车在过年时依然被塞得满满的,但毕竟只有两个多小时,实在挤不下,还可以花两百多块钱请出租。我在上海读研的这几年,其实也没有遭受回家难的痛苦,因为上海到武汉的高铁和动车很多,普通车也有几趟,买票很方便。

今天各位出行,如果坐火车,不是高铁就是动车吧?但是,不知道大家有没有想过:那种速度慢、见站停的普通列车是否还有存在的必要?

大家有没有想过:到底是谁在乘坐普通列车?

我想大家肯定一下子就能给出答案:除非没有其他更好的交通工具,学生不会坐,城市人不会坐,主要是那些底层的老百姓,比如农民、农民工在坐。

去年暑假和寒假回家,我特意选择坐慢车,16个多小时的硬座。就是要看看是哪些人在坐慢车,看看慢车上还是不是过去那个样子。的确,主要是农民、农民工在坐慢车。对农民工来说,选择坐慢车,比动车起码节约一半的钱,比高铁节约三分之二以上的钱。从深圳到武汉,高铁一等座要八百多,二等座五百多,但慢车硬座不到两百。尤其对于全家在外打工的人,从深圳到武汉,可能要节约一千多元,这对农民家庭来说不是小数目。

不过,慢车也没有过去那么挤了,因为农民工虽多,但很多都被动车和高铁分流了——既有主动的分流,也有被动的分流,因为价格便宜的慢车越来越少了。

大家可以注意到,今年12306网站通告的春运期间的加班车,三分之二以上的是非动车高铁。这个安排还是挺人性的,因为说到底,加班车就是为了农民工而加,低价位的车符合他们的需求。

而且,你会发现,普通火车与动车的氛围完全不同。

在动车上,相对比较安静,大家不是玩电子产品就是睡觉,相互间很少交流。但是,在普通火车上,熟悉的、不熟悉的,都在热烈地交流,还有打牌、吃东西的,做什么的都有,也有用劣质手机放歌曲的,大家都不担心打扰到别人,也没有人认为别人的做法对自己是一种干扰。慢车上的风格是粗犷的,是人间生活的那种氛围。

对比动车高铁与普通火车,很容易就能发现这里的阶层差别、生活方式的差别。而且你还能感觉到,底层人的心理,比我们想象的要乐观得多,健康得多。底层的状况虽然普遍很糟糕,但大家还是很听话地活着,这里面的一个重要原因,就是他们如果在外面活不下去,还有家园可以退守。

开私家车回家过年,在青年打工者中越来越普遍。我待会进一步讲这个事情,因为它的意义大大超出了交通工具本身。

骑摩托车回家的情况,大家可能在新闻里看到了。每年春节,总有摩托大军回家过年。我的一个表哥,每到过年时就让他的儿子坐汽车回家,而自己骑摩托车带老婆回家,路上要两天一夜。另一个表哥也是骑摩托带老婆回家,有一年在途中撞了人,不知是真撞还是被讹诈了,反正被人家扣了一天多,赔了一万多块才放人,半年的收入就这样没有了。

###人与人之间联系的失落

我觉得,当前农村的亲情关系,很大程度上是靠老一辈建立的关系维系着。在老一辈那里,这种关系处在一种相对稳定的时空里,但对年轻一代来说,大家的关系早已被现实割裂了。比如,我和我的众多表哥,小时候一起上山捉鸟,下河摸鱼,关系好得不得了,但这一二十年来,他们一直在外打工,我一直在外读书和工作,一年最多在过年时见一次,平均下来每年还没有一次,因为他们不是年年都回家。拜年的时候,大家也不再像过去那样,在亲戚家吃饭喝酒聊天,甚至留宿一晚,现在大家都骑着摩托车拜年,去亲戚家匆匆走一遭,放下东西,客套几句,就要离开了。平时的生活啊情感啊什么的,都没有来得及交流。大家拜年,不再是为了亲戚间互相走动,馈赠礼物,交流感情,而只是为了完成传统和长辈交代的一项任务

悲哀的是:如果老一辈都不在世了,新一辈的联系也就慢慢断了。

更让人悲哀的是:农村的日常生活充满着深刻的悲剧。自打工潮于九十年代兴起以来,很多农村人一直在外打工,二十多年来与父母团聚的时间,平均到每一年可能就十来天。很多农村老人倒毙在田间地头,病死在床上,儿女都不在身边。没有来得及为父母养老送终,成为许多人终身的悔恨。

每次回家,看到我身边的老人摇摇欲坠的样子,我就觉得心里难受得很。

如果一个人为了生存,连爱父母爱子女的机会都被剥夺了,你怎么可能指望他去爱别人,爱社会,爱自然?你怎么可能指望他能用超出金钱的标准来衡量别人的价值?所以我想说:现代生活是一种让人心肠变硬的生活。

###在农村,还有什么可以将农民动员起来?

自从2006年免收农业税之后,中国农村的基层组织主要起着上传下达的作用,不再与农民的根本利益发生关系,也不再能将农民组织起来,农民处于“个人自治”的状态。

(1)春节的力量。亲人团聚,过年拜年。过年的力量,亲情的力量,是当下动员中国人最有效的力量。这也是过年最让人感觉温暖的东西。当然,以前过年时的各种集体活动,都已消失殆尽了。

(2)祭祀。中国农村还是保持着过年、过十五给祖宗上坟“送亮”的习俗——家家户户都要去祖宗的墓地给祖先点蜡烛,烧纸钱,放鞭炮,与祖先交流。很多已经在城市安家的人,也会赶在大家三十这一天开车回老家给祖宗上坟。许多曾被废弃的祠堂,这些年也逐渐恢复起来了。

(3)葬礼。很多老人没有挨过冬天。过年前后,是老人逝世的高峰时段。丧葬在中国文化和中国人的生活中有着非常重要的地位,尤其对今天的社会来说,有着特别重要的意义。媒体上动不动就喜欢报道某某地方为举办葬礼大肆挥霍,让大家误以为这是普遍现象。其实恰恰相反。相比古代,今天的丧葬已是在最大程度上简化了。“贵生重死”的观念早已失衡了——大家越来越贵生,对于死,不再有敬重,不再让死者享受哀荣;对于天地,不再有敬畏。

但丧礼,在现实中依然起着不可替代的作用。去年快过年的时候,本家一个叔叔亡故——本家人和四面八方的亲戚来给他守丧,守丧的时候大家聚在一起交流,像过节一般,交流一年的生活情况、见闻和感想,称赞中央的政策,谴责干部的腐败……深夜里交谈的声音传得很远很远。守丧完毕,大家集体出力,将他抬到山上,让他入土为安。

社会学者经常用“原子化”来形容今天农村的现状,说白了就是,农村原有的那种共同体已经消失了,人与人之间不再像原来那样有着密切的关系和交往,不再像过去那样每到过年时相互串门,集体上街玩等等。为死者守丧和送葬,在农村反而成了村里人团聚和交流的一个契机。这也是我在家乡看到的唯一能够让大家团聚的方式。

###妻子?房子?车子

(1)妻子。这一点主要是针对农村的男青年来说的。在今天的社会,农村男青年在本地找媳妇越来越难。一来,这是由中国男多女少的现状决定的。而且,农村稍微长得好看点的女孩子,基本都嫁到城里去了,愿意嫁在农村的女孩子越来越少。二来,农村青年讨媳妇,要具备的物质条件很高,现在普遍的一个情况是:彩礼六到八万,房子两套:在老家一栋楼,在县城一套房。这个压力,并不比城市青年讨老婆的压力小。

过年的时候,打工的青年男女都回来了。只要哪一家有适龄女孩子,去她家的媒人可谓络绎不绝。这在乡村已成了一门生意,农村说亲,几乎到了“抢”的地步。如果初步说定一个,男方至少要给媒人五百块,最终结婚时,还要给上千的报酬,有的甚至要给到两三千。

传统的农村婚姻,从相亲到定亲到结婚,要三四年时间,男女双方有一个了解和熟悉的过程。现在却不同,年里看对的,过了年,马上定亲,然后女青年跟着男青年出去打工,等到半年过去,女方怀孕了,立刻奉子成婚。

曾听过一个搞量化统计的学者对农民工的调查报告,得出的结论之一是:农村孩子结婚越来越迟。但我看到的情况恰恰相反:因为女孩子难找,男孩子一到二十岁,父母就张罗着给儿子物色对象,物色好对象之后,既怕女孩子变心,又考虑要到城市讨生活的现实情况,就催着孩子赶快结婚。可以想象:在现代社会这种动荡不安的生活中,这样的婚姻会出现多少问题!事实上,农村离婚的情况,也是与日俱增的。

(2)房子。刚才已经说了,现在农村人娶老婆要房子两套:一套在家里,一套在县城。其实县城的那套房,平时都空着,只是过年时回来住,但对年轻人来说,那就是城市生活的一种代表。过年时,有的也会把父母接到县城过年,但父母住不惯,在县城过了大年,初一就赶回来了。在老家的生活是“老米酒,蔸子火,除了神仙就是我”,而在县城除了那套房,什么都没有。

但是,为了添置这两套房,将来给儿子娶媳妇,很多家庭是举全家之力在外打工。

下面给大家看我在去年过年的时候写的一则笔记,涉及到房子和婚姻的问题,但还有其他的含义在其中。

2013年冬天的一则笔记

跟大哥、细哥到二郎庙水库捕鱼。(细哥承包的这座小水库只有三十亩的水面,在海拔八九百米的山上,水很纯净,可直接饮用,鱼放在里面长得非常慢,一年下来甚至还要瘦。每年腊月底或者年初,细哥就要从外面进鱼秧,虽说是鱼秧,其实有三斤多一条——这种鱼是在平原地带的池塘里用饲料喂养的,进价是两块多,但是鱼在纯净水里清洗了一年之后,肉味大大改善,可以卖到五块多一斤。)

一个拉砖的师傅把车停在坝上。我们问他,从山下往山上拉一趟要多少钱。他骂了一句话粗话,然后说:“两百块,划不来!”又说,就是这样的生意,也越来越少了。山里的楼房基本都做完了,没有做的也都在县城里买了房。大哥说:“在县城买房又么样,到时住在那里做什么呢?”司机说:“只要是人,总有个生存的法子。”又来了一个人,是细哥的同学,他的摩托车上带着老婆和还在读初中的儿子。得知他在这山里做了楼房,还在县城买了一套房。细哥问:“你要买那么多房做么事!”他叹了一口气:“我们这时代不叫人过的时代!没办法!”“做了一栋楼,买了一套房,还叫没办法!明年还去打工吗?”“不去打工,在家里做么事?”而这座水库上头的两个塆子的人家,基本上都在这里做了一栋楼,在县城买了一套房。

其间来了一人,开小车,戴墨镜,手腕上戴着很粗的黄金链子。老远就用粗嗓子喊正在水上下网的细哥,问有鱼没有。细哥正划着独木船,一只手划,一只手下网,笑着答:“你又不买,问着做么事!”同我们说话时,他的墨镜始终没有摘下来,神气得不得了。墨镜又对细哥喊:“别扑了麻雀(翻船)哈,我是秤砣,到水里就沉了,帮不了你。”说完就独自哈哈地笑。他同我们说起晚上要陪开挖机的斗地主。说是挖山种天麻,规模很大,已经买了十五万斤树。从言谈中得知,他平时在县城住。细哥的同学也说,他准备将家里几面山的树都卖了——分田到户后交了几十年的税,没有沾过任何光。后来听细哥讲,墨镜小学没读完,就在外面混,替人讨债,拿斧头砍人,就这样起家的。

一会儿又来了母女三人,带着一个三岁的小孩。她们是来买鱼的。跟墨镜是亲戚。墨镜却不认识那个年纪最小的女孩。“跟以前长得不一样了呀!”墨镜说,“在哪里打工?”她说在温州。“属什么?”“属鸡。(刚满20)”

墨镜说:“还没有说人家吧?我帮你介绍个。”女孩的母亲说:“她回来这几天,已经有好几个人来介绍。”“某某某正为儿子找媳妇急得哼,我把你说到他家。”(说,替人说亲的意思)女孩母亲连忙说:“那怕是不行,她想嫁到县城里。”墨镜说:“他家在县城有套房子。那男孩的娘脾气不好,但你们又不跟她过,你们到县里住,做点小生意。他家也有钱,你叫他们现在拿个四五十万,轻而易举就拿出来了。”墨镜走的时候,表示过两天,要带那男孩上门相亲。

(3)车子。近些年来,对在外打工五年以上的农村青年来说,对一种东西的渴求,可能比对房子和妻子更为强烈,那就是车子。车子不一定要多么好,五万,八万,二十万,各种档次的都有。老百姓不认识车子的牌子,不知道车子的价位,只知道这些车叫“小车”。不管什么小车,关键是要有!

在农村,房子是一个媒介,车子更是一个媒介——是你在外面混得好,有身份的代表,房子不能移动,车子却可以四处招摇,表示衣锦还乡。很多二代、三代农民工,当下最大的期待就是买一个车子。尤其对那些好些年没回家的人来说,他再次回家,必须要有辆车,否则他怎么证明自己?

春节的县城,到了水泄不通的地步,这些车子绝大部分都是从外面回来的,与此同步的情况是:物价飞涨。

###知识的无力感

这十多年来,外界对于农村的关注主要集中于农民工身上。众所周知,他们在城市打工的日子很苦,而家里的老人和孩子往往无人照料。其中酸甜苦辣自不待言。但从另一个角度来看,现在农村日子过得较为殷实的,也恰恰是这些有几个成员在外务工的家庭。(仅仅只有一个成员务工,通常不足以改变家庭的经济状况。)应该说,他们的辛劳和泪水还是得到了适当的回报。

倒是有两类家庭,他们处于最困难的境地,却往往被忽视。一类是孤寡老人。一类是举全家之力,把子女培养成大学生的家庭。

在第一类家庭中,这些老人的年纪一天比一天大,身体一天比一天衰败,没有任何经济来源,日子过得异常艰难。有人会问:国家不是有低保吗?是的,他们中的确有部分人吃上了低保。在我的家乡,低保的额度是每年八百。但是,绝大部分这样的老人,仍在低保的福利之外。因为他们处在农村的最底层,没有人替他们说话。低保名额通常被身强体壮者拿走。甚至,有些村干部为了堵住所谓“刁民”的嘴,不让他们到镇上或县里反映村里的问题,就把这些人变成低保户,有的甚至全家吃上低保。“有钱人吃低保”,早已成为农村公认的一桩怪事。过年的时候,大家也不再像传统社会那样,家家户户给这些孤寡老人送点东西。

这里所谓第二类家庭,主要是指有孩子在1980年代出生的家庭。这些孩子,从小学读到大学,一直都在经受教育收费的最高峰,没有哪一坎能够躲过。并且,二十多年来,农村税费多如牛毛,家里一年的收入,不够交税。大人内外应付,心力交瘁。最要命的是,作为满载家庭希望的大学生,毕业之后勉强找到一份饿不死的工作时,又面临结婚、买房等种种压力。可以说,几乎每一个农村的80后大学生,都是以牺牲整个家庭的幸福为代价来读大学的。但他们中的绝大部分,毕业后没有希望收回成本,倒是让年迈的父母继续陷入困顿。

最近一个博士师兄请吃饭,他说他现在最害怕的就是回家,感觉很难融入到村子的生活,所以他每年过年他都回去得很迟,来学校很早。为什么呢?因为当你一出现在村子里,村里人其他的不问,就问一个问题:“你现在能拿多高的工资?”所以,他过年回家,基本不出门。这个体验跟我是一样的。你要问我过年在家乡看什么,其实我没看什么,因为一大半时间是呆在家里看书,看电视,写东西。

作为农村大学生,当你回到家乡的时候,你童年那些伙伴都衣锦还乡了,而你连自己的问题都不能解决,你还能做什么呢?没有人信任你的知识!

说了上面这些,相信大家能够理解,对于我这样漂在外的农村大学生,回家过年既是一件非常急迫的事情,也是一件情怯的事情。

回家究竟看什么?其实真的没有刻意去观察,但是很多事情却不停地往你心里撞,也就有了很多感受。越看,对乡村的未来越迷茫。

转载自:chinadigitaltimes


2015-03-01 思考 , 感悟 , 转载

继续折腾WNDR3800之shadowsocks

之前也说过在Openwrt下使用迅雷远程下载,现在因为不想在PC端总是开着一个shadowsocks的程序,所以将shadowsocks安装到路由器端。然后还顺带解决一下DNS污染,和流量智能转发。

Shadowsocks

下载编译好的ipk

opkg update
opkg install libpolarssl
opkg install shadowsocks-libev_1.5.1_ar71xx.ipk

shadowsocks安装后有三个命令,ss-local启动sock5代理,ss-redir启动透明代理,ss-tunnel启动隧道。我使用了ss-local和ss-redir

# 编辑 /etc/shadowsocks.json
{
    "server":"[服务器ipv4/ipv6地址]", 
    "server_port":8388, #服务器端口 
    "local_port":1081, #本地sock5代理端口
    "password":"[密码]",
    "timeout":300,
    "method":"[加密方式]"
}

修改配置文件/etc/init.d/shadowsocks

START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
CONFIG=/etc/shadowsocks.json
start() {
    service_start /usr/bin/ss-local -c $CONFIG
	service_start /usr/bin/ss-redir -c $CONFIG
}
stop() {
    service_stop /usr/bin/ss-local
	service_stop /usr/bin/ss-redir
}

添加执行权限,设置开机启动

chmod +x /etc/init.d/shadowsocks
/etc/init.d/shadowsocks enable

pdnsd

opkg update
opkg install pdnsd

配置/etc/init.d/pdnsd.conf

global {
    #debug = on;
    perm_cache=1024;
    cache_dir="/var/pdnsd";
    run_as="nobody";
    server_port = 1053;   #使用1053作为DNS端口, 默认是53,一定要修改否则会跟默认dnsmasq冲突
    server_ip = 127.0.0.1; 
    status_ctl = on;
    query_method=tcp_only;#最重要的配置, 只使用tcp查询上级DNS
    min_ttl=15m;
    max_ttl=1w;
    timeout=10;
}
server {
    label= "googledns"; #这个label随便写
    ip = 8.8.8.8;    #这里为上级 dns 的 ip 地址,要求必须支持TCP查询,相关说明见后文注解
    root_server = on;
    uptest = none;   #不去检测 dns 是否无效.
}

启用pdnsd,并设置为开机启动:

/etc/init.d/pdnsd enable
/etc/init.d/pdnsd restart

完成!

dnsmasq和ipset

openwrt默认安装的dnsmasq不支持ipset,需要先卸载,换成dnsmasq-full,输入一下命令查看dnsmasq版本,写着no ipset的就需要安装完整版。

dnsmasq -v

运行以下命令:

opkg update
opkg install kmod-ipt-ipset ipset ipset-dns
opkg remove dnsmasq
opkg install dnsmasq-full

dnsmasq-full从这里下载,设置dnsmasq对特定域名使用本地的pdnsd进行解析: 为了保持配置文件整洁,建议在 /etc/dnsmasq.conf 最后加入:

conf-dir=/etc/dnsmasq.d

然后新建mkdir目录 /etc/dnsmasq.d ,在里面加入一个conf,名字任选。譬如 /etc/dnsmasq.d/fuckgfw.conf ,下面是我的文件内容,你可以按自己需要整理自己的:

#Google and Youtube
server=/.google.com/127.0.0.1#1053
server=/.google.com.hk/127.0.0.1#1053
server=/.gstatic.com/127.0.0.1#1053
server=/.ggpht.com/127.0.0.1#1053
server=/.googleusercontent.com/127.0.0.1#1053
server=/.appspot.com/127.0.0.1#1053
server=/.googlecode.com/127.0.0.1#1053
server=/.googleapis.com/127.0.0.1#1053
server=/.gmail.com/127.0.0.1#1053
server=/.google-analytics.com/127.0.0.1#1053
server=/.youtube.com/127.0.0.1#1053
server=/.googlevideo.com/127.0.0.1#1053
server=/.youtube-nocookie.com/127.0.0.1#1053
server=/.ytimg.com/127.0.0.1#1053
server=/.blogspot.com/127.0.0.1#1053
server=/.blogger.com/127.0.0.1#1053

#FaceBook
server=/.facebook.com/127.0.0.1#1053
server=/.thefacebook.com/127.0.0.1#1053
server=/.facebook.net/127.0.0.1#1053
server=/.fbcdn.net/127.0.0.1#1053
server=/.akamaihd.net/127.0.0.1#1053

#Twitter
server=/.twitter.com/127.0.0.1#1053
server=/.t.co/127.0.0.1#1053
server=/.bitly.com/127.0.0.1#1053
server=/.twimg.com/127.0.0.1#1053
server=/.tinypic.com/127.0.0.1#1053
server=/.yfrog.com/127.0.0.1#1053

#Google and Youtube
ipset=/.google.com/setmefree
ipset=/.google.com.hk/setmefree
ipset=/.gstatic.com/setmefree
ipset=/.ggpht.com/setmefree
ipset=/.googleusercontent.com/setmefree
ipset=/.appspot.com/setmefree
ipset=/.googlecode.com/setmefree
ipset=/.googleapis.com/setmefree
ipset=/.gmail.com/setmefree
ipset=/.google-analytics.com/setmefree
ipset=/.youtube.com/setmefree
ipset=/.googlevideo.com/setmefree
ipset=/.youtube-nocookie.com/setmefree
ipset=/.ytimg.com/setmefree
ipset=/.blogspot.com/setmefree
ipset=/.blogger.com/setmefree

#FaceBook
ipset=/.facebook.com/setmefree
ipset=/.thefacebook.com/setmefree
ipset=/.facebook.net/setmefree
ipset=/.fbcdn.net/setmefree
ipset=/.akamaihd.net/setmefree

#Twitter
ipset=/.twitter.com/setmefree
ipset=/.t.co/setmefree
ipset=/.bitly.com/setmefree
ipset=/.twimg.com/setmefree
ipset=/.tinypic.com/setmefree
ipset=/.yfrog.com/setmefree

#Dropbox
ipset=/.dropbox.com/setmefree

#1024
ipset=/.t66y.com/setmefree

#shadowsocks.org
ipset=/.shadowsocks.org/setmefree

#btdigg
ipset=/.btdigg.org/setmefree

#sf.net
ipset=/.sourceforge.net/setmefree

#feedly
ipset=/.feedly.com/setmefree

按照这种格式指定特定的域名走代理。 server=/google.com/127.0.0.1#1053的含义是google.com通过本地1053端口解析地址 ipset=/google.com/setmefree 的含义给google.com的数据包打上标记,一会配置iptables时会用到 接下来配置iptables,在/etc/firewall.user里加上两行

ipset -N setmefree iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set setmefree dst -j REDIRECT --to-port 1081

每条记录都需要跟一条ipset设置,不要忘了。作用是把打上了标记的数据包重定向到ss-redir的透明代理端口

root@OpenWrt:~# cd /usr/bin
touch shadowsocks-firewall
vi shadowsocks-firewall

修改文件内容

#!/bin/sh

#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS

# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d YOUR-SERVERS-IP-ADDRESS -j RETURN

# Ignore LANs IP address
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

# Ignore Asia IP address
iptables -t nat -A SHADOWSOCKS -d 1.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 14.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 27.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 36.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 39.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 42.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 49.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 58.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 59.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 60.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 61.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 101.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 103.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 106.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 110.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 111.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 112.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 113.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 114.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 115.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 116.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 117.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 118.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 119.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 120.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 121.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 122.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 123.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 124.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 125.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 126.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 175.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 180.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 182.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 183.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 202.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 203.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 210.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 211.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 218.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 219.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 220.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 221.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 222.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 223.0.0.0/8 -j RETURN

# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1081

# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
  • 你必须把上面的107.89.0.12换成你服务器真实的IP地址(即自己前面在shadowsocks.json配置的服务器 IP。)
  • iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 8024 这里的8024必须和OpenWrt路由器 /etc/shadowsocks.json里的 local_port一样,也就是说,如果 /etc/shadowsocks.json"local_port":1081, 那这里的8024也要改成1081(如果照着我上面的本地端口填了8080,这里就改成8080)

配置成功后,chmod +x shadowsocks-firewall给其运行权限。

运行

 /usr/bin/shadowsocks-firewall

重启dnsmasq和firewall就可以实现流量自动分流了

/etc/init.d/dnsmasq restart
/etc/init.d/firewall restart

以后只要修改dnsmasq的配置文件就可以指定更多的地址走代理

可选方案 解决 dns 污染

这里比较方便的是,通过 ChinaDNS 就可以了。

和安装 ShadowSocks 一样,可以先通过 WinSCP上传到路由器。

opkg install ChinaDNS-C_1.0.0_ar71xx.ipk  # 安装
/etc/init.d/chinadns start                # 运行
/etc/init.d/chinadns enable               # 开机启动

reference

  1. http://hong.im/2014/07/08/use-ipset-with-shadowsocks-on-openwrt/
  2. http://www.jianshu.com/p/4800eec60516
  3. http://blog.berry10086.com/Tech/Openwrt/openwrt-shadowsocks-ipset/
  4. http://www.shuyz.com/install-shadowsocks-on-hg255d-openwrt-and-config-nat.html
  5. http://hong.im/2014/03/16/configure-an-openwrt-based-router-to-use-shadowsocks-and-redirect-foreign-traffic/

2014-11-24 Shadowsocks , openwrt , Knowledge

Play Clash of Clans

玩部落冲突(Clash of Clans)也已经四个多月了,这是我第一个花钱在上面的游戏,不过最近因为给别人看COC乱点花了我1200左右的钻石,顿时玩下去的信心都没有了,既然没有动力了,就来总结一下吧,就当是个结束。

很早知道这个游戏,看到很多人玩,包括很多身边的同学。但是机缘巧合有一好友也开始玩,就带着我一起开始玩了,于是从暑假开始,到今天11/5,差不多正好4个月时间,除了魔兽争霸这个游戏,还真没有一个游戏能让我坚持玩这么长时间的。什么吸引我呢?这个游戏依靠策略,攻打的策略,守家的策略,让人欲罢不能。另外就是好友及部落机制。再次就是不想偷菜种菜那么没有头脑,收集金币及圣水都是需要一定的技巧。虽然被人乱点坑了很多金币,并且不得不赞扬游戏公司对游戏参数的设置,让人无比的想花钱,并且会让人觉得花的很值得。

Clash of Clans 8本阵型

Clash of Clans

Clash of Clans 双菱形

##一些网站 YouTube Channal https://www.youtube.com/channel/UCxNMYToYIBPYV829BJcmUQg 这个频道从低等级开始,一步一步升级,单人模式,攻击策略,防御策略很全面,可以关注。

之前几个布阵的网站都是直接从Google点进去的,根本记不住网址,所以用Google喽搜喽。

##关于钻石 关于钻石,网上很多说免费的钻石的,千万别信,基本都是假的,稍微真的就是去赚礼品卡的钱,然后用礼品卡买钻石。游戏中成就和清理地面的灌木石块等等都能获取一定的钻石,所以省着点用很快能够买到第三个农民500钻,等第四个农民1000钻其实也应该很快,如果不出意外2000钻的第五个农民我马上也能有了,只是。。。。

最后有一点,我在升级过程中吃了很多苦头,就是千万不要着急升级大本营,COC匹配对手有一定的算法,当时也Google了,会根据一定的算法,等级越高越不好打,所以最好在每一个大本营造完全不建筑并且升级到最高等级不能升级再升大本营。

##一些技巧

  • 搜寻对手时可以多搜寻一些,直到找到一个资源丰富的
  • 搜寻对手时注意观察阵型及金矿圣水收集器的位置,如果在外围可以轻松拿下。
  • 单人模式一定要留到升级完气球之后,一个气球搞定

参考:


2014-11-23 游戏 , Game , ClashOfClans

推荐网站之求字体:通过图片找字体

推荐网站之求字体:通过图片找到对应字体。

求字体 http://www.qiuziti.com/

最早遇到这个问题是我当时看陈墨评金庸系列书籍的时候封面上很漂亮的字体,下图中很大篇幅的小字。

赏析金庸

当时我还没遇见这个求字体网站,我是直接在百度知道问的别人,正好还有人知道,当时就记住了这个字体—-超世纪粗行书。 今天看到别人在摄影上加上了很好看的Logo,不禁想知道中文的字体,于是找到了这个网站。使用体验都很好,因而推荐出来。

找字体


2014-11-22 fonts , website , 推荐网站

Rime输入法

Rimeime是中州韻輸入法引擎 | Rime Input Method Engine,项目网址如下

按照官网给出的定义:Rime不是一种输入法。是从各种常见键盘输入法中提炼出来的抽象的输入算法框架。英文Rime涵盖了大多数输入法的共性,所以在不同设定下,Rime可化身为不同的输入法用来打字。Rime是跨平台的输入法软件,Rime输入方案可通用于以下发行版:

  • 【中州韻】 ibus-rime → Linux
  • 【小狼毫】 Weasel → Windows
  • 【鼠鬚管】 Squirrel → Mac OS X

很多东西看官方的wiki就能看明白,今天折腾Rime输入法主要是在Windows下,解决了几个问题。

##词库 之前一直使用Google拼音输入法,Google拼音输入法能够导出一套用户长期积累的词库。我利用“深蓝词库转换“工具将Google拼音输入法导出的词库,大概7万多条转成Rime词库格式。然后开始菜单调出,小狼毫用户词典管理,选中luna_pinying,点击“导入文本码表”导入词库。瞬间就可以从Google拼音输入法转移到Rime输入法。导入文本码表只是针对Google拼音输入法中由用户积累的词汇。一般只建议将最为关键,带有词频信息的词库使用“导入文本码表”的方法导入到Rime输入法。 关于词库,Rime输入法的词库有两部分组成。以下摘自贴吧:

  • 一部分是由系统文本词库(一般以xxx.dict.yaml结尾)通过「重新部署/deploy」生成的固态词典(一般以xxx.table.bin结尾),这部份词库因为在输入过程是固定不変的,所以存在用大量的词彚,也不允许用戸来直接删除。

  • 另一部分就是记录我们用戸输入习惯的用戸词典(一般以xxx.userdb.kct)结尾。这部份词库的词彚,正常情况下是由用戸输入的时候随时生成的;其词彚可以动态调整,数量理论上来说不会特别多,也允许用戸自行删除(shift+delete)。

佛振同学在设计用户词典时,没有考虑到有导入大词库的需求,就按照估计用戸可能积累起来的词彚量,把容量设置为「十万」规模以提升存储效率,超过这个量性能则会下降。

佛振同学设计「【小狼毫】用戸词典管理」的初衷和真正目的,在於譲大家将自己従其他输入法中积累出来的用戸词彚,可以顺利地迁移到rime中。而不是譲你把其他输入法整个系统词库都搬进来。如今,「【小狼毫】用戸词典管理」这个功能和界面,已经被众多的小白同学稀里糊涂地滥用了。

如何正确的导入词库?答:新增固态词典引用多份码表文件

批量添加词汇,过去一直没有简易的做法。现在可以这样做: 以【朙月拼音】为例,在输入方案裏指定一个新的词典名为

luna_pinyin.extended
#luna_pinyin.custom.yaml
patch:
translator/dictionary: luna_pinyin.extended

然后在用户目录创建一个词典文件luna_pinyin.extended.dict.yaml

#Rime dictionary
---
name: luna_pinyin.extended
version: "2013.04.22"
sort: by_weight
use_preset_vocabulary: true
import_tables:
  - luna_pinyin
...
# table begins
鸹鸹! gua gua 100

这样一来,部署【朙月拼音】这个输入方案时,将编译 luna_pinyin.extended 这部词典,而这部词典除了导入【八股文】词汇表之外,还导入了名为 luna_pinyin 的词典文件,即 luna_pinyin.dict.yaml 。被导入的词典文件只取其码表,忽略 YAML 段。 被导入的码表与本词典自带的码表共同决定了编码集合。 当然也可以:本文件的码表完全为空,只用来按需合并多个外部码表文件。

luna_pinyin.extended 这个词典的神奇之处是:虽然luna_pinyin.schema.yaml 已设置为加载名为 luna_pinyin.extended 的词典,但配套的用户词典名却是「luna_pinyin」,即 Rime 自动取句点之前的部分为用户词典名,以保证按以上方法增补了词汇之后,不至於因为改变词典名而抛弃原有的用户词典。

请注意,此法的设计用途是合并编码方案相同的多份词典文件,而不是用来将不同的编码混在一起。

具体的示例代码可参考 https://gist.github.com/lotem/5443073

其実佛振同学已经说得足够好了。 其中心思想提炼出来就是

  1. 先譲输入方案引用一个新的系统词库码表(佛振同学在gist.github.com上的示例中是luna_pinyin.kunki.dict.yaml),即给输入方案luna_pinyin(明月拼音)打一个补靪,将调用的词库重置为luna_pinyin.kunki.dict.yaml
  2. 创建一个luna_pinyin.kunki.dict.yaml的文件,加入好你需要导入的词彚(如「瑾昀」等等)。竝导入内置的系统词库(import_tables: luna_pinyin)。

其実佛振同学import_tables的这个做法,頪似於C语言编程中的#include头文件。 其目的和工作机制都是一様的。目的是引用头文件(或是系统预设词库)竝添加上自己的内容;工作机制是在编译(或是重新部署的时候),将链接到的不同的文本文件合并成一个文件,竝処理成二进制文件。

我另外要在佛振同学的基础上补充几点

  1. luna_pinyin.custom.yamlluna_pinyin.extended.dict.yaml都要放入用戸文件夹中
  2. 通过import_tables的方法,不仅仅可以导入预设的词典,甚至可以导入其他的自定义词典 以笔者为例子,我在朙月拼音输入方案中设定的词库名叫luna_pinyin.extended.dict.yaml。 而我luna_pinyin.extended.dict.yaml在文件头部分,除了系统预设词库之外,还导入了其他的细胞词库

  3. 码表中的词彚格式

    3.1 码表文件必须是utf-8无bom的编码。不能用ansi,否则出来的词彚会乱码 3.2 Rime对词彚的格式有着厳格的限定,其标凖形式是「词彚<tab>ci hui<tab>100」(方引号内部的部分,<tab>表示制表符(顕示为空白字符,不是空格))。

拼音码表的词彚格式是一个词彚占一行,不同的属性之间以制表符为间隔,编码之间以半角空格为间隔。従左往右依次是词彚、编码、词频。 其中编码和词频是可省略的。 也就是说 「词彚<tab>ci hui」、「词彚<tab><tab>100」、「词彚」 都是合法词库文件格式。

如果词频省略,那麼输入法会优先调用「八股文」(一个预设的中文语言模型,包含词彚和词频两穜属性)的词频,如果八股文找不到该词彚的词频,那麼这个词彚的词频就当成0来処理。

如果编码省略,那麼输入法在重新部署,将文本码表生成固态词典的时候,会根拠词库中的单字来给词彚自动编码(如果是拼音的话,叫「给词彚注音」更妥帖) 比如词库中有

我<tab>wo
和<tab>he
你<tab>ni
我和你

四个item,那麼「我和你」这个省略了编码的词彚在生成固态词典的时候会自动被注音上「wo he ni」。 其中有一个特别需要注意的地方,那就是処理多音字。 对於含多音字的词彚,我们要侭量避免譲输入法给他自动注音,因为会帯来错误的读音(比如「重庆」读成「zhong qing」) 所以一般含多音字的词彚都要最好标注上读音。 如果実在没辧法弄到读音也没関系。因为Rime已经给多音字的罕见音做了降频処理。従而使得多音字的罕见音不会参与词彚的自动注音。

関於自动注音的具躰的细节可以看rime的wiki,这裏我就不多说了。総而言之,我廃话那麼多,是为了譲大家了解rime词库的工作机制,其実就为了告诉大家两句话:「在导入词彚的时候,一般来说只要加纯汉字就够了。含多音字的词,系统词库一般都有,如果没有才要考虑给这个词注上音。」

另外,系统词库中,已经包含了完整的单字注音和罕用读音降频処理,大家可以放心地导入纯汉字词彚,不用太过担心。(所以一定给要记得import_tables: luna_pinyin,来使自定义码表获得系统词库中的单字注音、含多音字词彚注音以及系统词彚词频)

再来一个另外。。。 关於楼主配置的多个词库挂接的方法实例,可参考由rime-aca友情提供的「朙月拼音·扩充词库」 下载地址:https://bintray.com/rime-aca/dictionaries/luna_pinyin.dict

参考:

其他词库下载 搜狗词库 来源

##修改配置文件定製指南

###更改候选词数 修改文件 default.custom.yaml

patch:
  "menu/page_size": 10

候选词最多支持10个。

###模糊音 将 https://gist.github.com/2320943 作为模板保存到luna_pinyin_simp.custom.yamlluna_pinyin_tw.custom.yamlluna_pinyin_fluency.custom.yaml即可。

参考链接

###小狼毫外观设定

参考链接

# weasel.custom.yaml
patch:
  "style/font_face": "华文行楷"  # 字體名稱,從記事本等處的系統字體對話框裏能看到
  "style/font_point": 16     # 字號,只認數字的,不認「五號」、「小五」這樣的

  style/horizontal: true      # 候選橫排
  style/inline_preedit: true  # 內嵌編碼(僅支持TSF)
  style/display_tray_icon: true  # 顯示托盤圖標

###一些快捷键

ctrl+` (grave) tab键上面,1左边的那个键 切换Rime输入方案 shift+delete 删除选中候选词 ctrl+ np 上下选词

参考链接


2014-11-21 输入法 , Rime

Nexus 5 不同版本

要给哥弄个Nexus 5,网上一查有美版的D820,还有国际版的D821。顺手做个笔记LG D820 VS LG D821。两个版本的LG Nexus 5在几乎所有的配置和外观上都没有任何的区别,主要区别在通讯模块上,一个支持GSM/CDMA/WCDMA/LTE,而另外一个不支持CDMA,具体的支持情况外媒梳理如下:

##北美Nexus 5版本 (LG D820):

  • GSM: 850/900/1800/1900 MHz
  • CDMA: Band Class: 0/1/10(这个频段是中国电信也支持的,其实大多数有CDMA的国家都在这个频段范围内,所以是支持所有CDMA频段的)
  • WCDMA: Bands: 1/2/4/5/6/8/19
  • LTE: Bands: 1/2/4/5/17/19/25/26/41

##Nexus 5国际版本,没有CDMA (LG D821):

  • GSM: 850/900/1800/1900 MHz
  • WCDMA: Bands: 1/2/4/5/6/8
  • LTE: Bands: 1/3/5/7/8/20

D820能够兼容AT&T、T-Mobile和Sprint的2G、3G和LTE网络;而D821则可兼容欧洲、亚洲等其余地区的网络频段。

D820美版需要破解才能电信4G,D821支持联通4G,中国移动所使用的是特有的频段,不支持

##D820(H)、D820(E)、D820(S)区别

D820(H)、D820(E)、D820(S)三者其实硬件都是一样的,就是RAM颗粒使用得不一样而已。 D820(H)是Skhynix(海力士)的RAM颗粒,D820(E)是Elpida(尔必达)的RAM颗粒,D820(S)是Samsung(三星)的RAM颗粒。查了下LG的内部资料,貌似D820(S)故障率最高,无故黑砖的同学警惕是否买到D820(S)的机器~

查看D820(H)、D820(E)、D820(S)方法~关机后,按音量“-”以及开机键同时开机,然后进bootloader查看~

参考:


2014-11-12 Android , Nexus , Google , LG

Google+

最近文章

  • 又一款抓包分析软件 wireshark Wireshark 是一款网络分析工具,也是学习网络协议的工具,原先介绍过的 Charles ,mitmproxy 等HTTP抓包工具,都局限于 HTTP/HTTPS 请求,对于更底层的 TCP/IP,UDP 等协议就无能为力了。Wireshark 可以抓取网卡上的网络包,并实时展示,Wireshark 包括了过滤器,协议显示等等工具。
  • 关于游戏的一些想法 最近国内又火了一个答题游戏,回答正确12题平分多少多少万奖金。先不说他们都抄袭 HQ Trivia 这款App,但我这两天一直在想一个问题,为什么这一类的应用能火起来,难道就是因为最后平分100万,200万,现金带来的刺激吗?我想答案一定不是的,除了最开始的玩家或许还能分到几十块钱,在入场玩家越来越多的情况下,每个人瓜分到的奖励一定是越来越少的。那到底是什么能让一个应用一夜之间火到大江南北?
  • Android 电视盒子可用的应用备份 用盒子也已经很多年了,几年来家里,自己用,也积累了一些常用的应用。这两天又拿到了 T1 盒子,又才想起来整理这样一份单子,这样不用每一次都一遍一遍的尝试了。记得以前 VST ,泰捷视频都还很不错的时候,再后来广电发了禁令,再后来这片市场混乱发展,各家大型网站优酷,爱奇艺又不敢公开大搞,却又在背后偷偷摸摸。再到现在几乎被什么芒果,CIBN垄断,内容没什么可看,却什么都要收费。我始终抱有一个观点,如果电视盒子这一块开放发展,国内的厂家完全能够占领全世界的盒子市场,好几年前用的 Android 盒子就已经能够满足我的大部分需求,并且应用设计也早 Google 自己推出 Android TV 盒子以及规范 Android TV 应用好多年。可惜这一块市场被一道禁令打到了地下。
  • okhttp 使用 OkHttp是一个非常高效的HTTP客户端,默认情况下:
  • 斐讯 T1 盒子去除广告 斐讯投资送硬件这路子是着魔了,所以在斐讯 K2P 之后又入手了这个 T1 的盒子,配置2G RAM,16G Sdcard,配置还不错。接口有 USB,网口,HDMI 口,还有 一个 AV 输出口,日常使用是没有任何问题的,初尝试一下非常流畅,不过让我不爽的是,第一次进入竟然需要验证手机,说是 CIBN 盒子的验证,如果不注册还不让进入。