橙色关怀

2008年01月31日 11:08

我自己活动的范围很小,几乎没有深切的感受过春节回家的艰难。但我完全能理解一个返乡人的迫切心情。

今年的春节与往年有些不同。对于很多春节回家的人而言,是一场灾难。虽然这场灾难一如既往的被导演成了政治秀,但需要关心的人们,他们始终在那里,他们需要被关心。

深深的祝福那些准备回家以及在回家路上的人们。

强类型 弱类型 显式类型 隐式类型

2008年01月29日 20:40

原本以为这个问题不算十分复杂。不过似乎群里还有人对此有所混淆。所以写一点东西说明一下。

所谓的显式类型和隐式类型,区别在于对于变量,是否需要显式说明它的类型。对于显式类型语言来说,一个变量的类型,是在变量声明之初就决定了的,声明之后不能更改。

//C++
int x;  //这里x被声明为一个整型。
x = 10; //OK,类型匹配。
x = "abc"; //Error! 类型不匹配
x = 10.24; //虽然在语法上OK,但是这种写法会引发隐式类型转换,x中实际存储的值是10,而不是10.24。

当然,即使在显式类型的语言中,也有所谓的“隐式类型转换”机制让用户在书写语法上自由一些。比如上面的例子中,将浮点数10.24赋值给一个整型量并不会导致语法错误,而是会引发隐式类型转换。但即使是隐式类型转换,也是将“不符合类型的值”向变量所具有的类型靠拢,而不会改变变量的类型。

而隐式类型语言就不同了。隐式类型语言对变量没有显式的声明。一个变量没有固定的类型,它的类型是随着当前存储的内容而变化的。

#Python
x = 10   #这时x是一个int类型
x = "This is a string"  #x同样可以接受一个字符串,这时,x的类型由int转变为了string
x = 10.24 #x又由string变成了float类型,注意这里并没有什么隐式类型转换,
                #x里的值就是确切的float类型数值10.24,改变的是x的类型,而不是存储其中的数值。

但是我们要意识到一件事:我在上面举的例子,显式类型也好,隐式类型也好,它们都是有类型这个概念的!

C++自不必说了,对变量声明时指定的类型就说明了它是有类型区分的。那么像Python这样的隐式类型语言,我们看不到变量的类型,如何证明它是有类型的呢?首先,python有type函数,可以看到变量当前的类型。

>>> x=10
>>> type(x)
<type 'int'>
>>> x="This is a string"
>>> type(x)
<type 'str'>
>>> x=10.24
>>> type(x)
<type 'float'>

这里我们可以清楚的看到当赋予x不同值的时候,x的类型是会变化的。

另外,在Python中,不同类型的对象不能相互替代和操作。

>>> 10 + '20'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这一切都充分的证明,在Python里,是有明确的类型的概念。

而某一些语言,它们是没有很明确的“类型”的概念的,这些语言就被成为弱类型语言。强类型和弱类型的主要区别是,在语言中是否存在明确的类型概念

Perl和PHP就是很著名的弱类型语言。

#Perl
$x = 10+'20';    #这里的10是整型而'20'是字符串?不,Perl不关心这个。
#只要它们“看起来像”数字,就可以放到一起运算,不是么?
print $x;           #输出了30

在弱类型的世界中,所有的东西都是一样的,你不用区分它们到底是什么类型。事实上,也许在内部实现中,所有的东西最终都被存储为同一种类型。

显式类型一定是强类型的,而弱类型一定是隐式类型的。但隐式类型也有可能是强类型的,比如Python。

怎样区分强类型还是弱类型?很简单,让它们做一做 10 + ‘20’ 吧 :)

下雪了

2008年01月28日 22:49

下雪了。

很多年没有看到过这样的雪了。虽然年纪大了,仍然不免有些激动。只可惜现实是残酷的──我早晨刚刚出门,就险些滑上一跤。

号称自己是个摄影爱好者,碰到这种多年不见的情形如果居然没有留下一张照片,自己都会觉得遗憾。正好今天因为公司晚上活动有机会带着相机,在公司活动结束之后,我还是决定出去转上一圈。

晚上雪已经停了,还在下雨。很多地方雪已经化了,更多的地方,积雪被清扫到路边──毕竟生活并不如艺术家和诗人们的意,在上班、出门、回家的人们眼中,大雪意味着不便,意味着危险,而不是浪漫。

找了几个角落按了几张,时间已晚,只好就这样回去了。

昏暗,下雨,天冷,手持拍摄,很久没有拍照,身体不适,种种因素加在一起,让我今晚的收获近乎于零。

近乎绝望的时候我发现了这张照片。虽然仍有瑕疵,我还是觉得它很好的代表了一种感觉。

这就是上海的雪吧。

没有创意的创意大赛

2008年01月25日 14:37

谷歌(非Google)办了一个“你有锦囊妙G吗”的活动,向大众征集各种创意视频,以宣传其简短的g.cn的新域名。

虽然这个活动本身的创意不如Google的Gmail视频接力,但也算是一个不错的平台,按理来说应该可以出现很多有趣的创意。

然而,看到最终的结果,大失所望。

基本上前三名的作品,可以用简单的一句话来概况:“制作精美,毫无创意”。似乎他们花了很多时间在“制作”这件事上,但是却忘记了自己需要制作的“是什么”。可惜华丽的画面并不能掩饰内容的空洞,g.cn的优势,谷歌公司的精神,一点都没能得到体现。

想到这里的时候,突然又想起了自己曾经拍过的,以及看到别人拍过的很多照片来了。

最后给大家看一个很有创意的东东:用照片组合而成的短片。

python for A1200 编译成功!

2008年01月21日 18:51

上回书说到我们构建了for A1200的cross compile toolchain,并且用它成功的编译了bash 3.2(注解一下,用源代码编译出来的bash虽然能用,但运行时会有一个错误,需要在源代码上打一个补丁,链接里的补丁有点过时了,直接patch会失败,但是可以手工找到对应的地方,手工修改)。但我已经说过了,python才是我最想要的。于是趁着周末,在家好好折腾了一番,还好功夫不负有心人,终于编译成功了。

这篇ARM cross-compiling howto是个相当不错的开始,我找到的很多资料都是把它作为起点的。为什么Python这么难编译成功呢?这个文章讲得很清楚:因为python需要用python本身去执行一些内容,所以为了编译一份crosscompile的python,我们必须先编译一份本地的python。但是这个文章里用到的python2.2.1实在是有点太老了,我们要玩就玩最新的——Python2.5.1!

首先当然是去python.org下载Python2.5的源代码。但源代码不做改动是完全不可能交叉编译成功的,所以我们必须去找一份补丁。上面那篇文章倒是有2.2.1的补丁,但显然已经不能用了。好在有Google,我找到了一个不错的网站,它提供了最新版本python的arm-linux补丁,感谢作者!

下载python-2.5.1目录下的所有补丁,逐个的打到源代码上。然后,我们先编译出一份本地的python来:
./configure
make python Parser/pgen

编译成功之后,将这两个程序改名:
mv python hostpython
mv Parser/pgen Parser/hostpgen

然后清空Makefile,准备编译crosscompile版的python:
make distclean
CC=arm-linux-gcc \
CXX=arm-linux-g++ \
AR=arm-linux-ar \
RANLIB=arm-linux-ranlib \
./configure --host=arm-linux

准备OK之后,
make HOSTPYTHON=./hostpython \
HOSTPGEN=./Parser/hostpgen \
BLDSHARED="arm-linux-gcc -shared"

但是这样编译会出错。仔细一研究,原来是有些库无法正确编译到arm平台,那也不要紧,大不了我们不用就是了。于是开始疯狂注释setup.py,错一个注释一个,注释到不错为止。
一阵磕磕绊绊之后,手机版的python就编译出来了。
接下来是安装,说是安装,其实就是把需要的文件整理到一个目录中,而并不是将程序装到手机上:
make install prefix=~/mkezx/build/python \
HOSTPYTHON=./hostpython \
BLDSHARED="arm-linux-gcc -shared" \
CROSS_COMPILE=yes

安装完成,我们进入到~/mkezx/build/python/bin目录,执行一下arm-linux-strip python2.5,减小一下python的尺寸,然后将python目录下的bin和lib两个目录拷贝到手机上,最后把可执行程序python2.5改名成python,就OK了。
执行一下瞧瞧:
# python
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]

Python 2.5.1 (r251:54863, Jan 19 2008, 12:08:57)
[GCC 3.3.6] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.platform
linux2
>>> quit()
# _

看起来还不错。
然后是为了手机上方便,写了一个init.sh,放在ekonsole目录下:
#!/bin/sh
export HOME=/mmc/mmca1/linux/home/linghu #改变主目录
export PATH=$PATH:/mmc/mmca1/linux/bin #添加程序搜索路径
cd #切换到新设置主目录
/mmc/mmca1/linux/bin/bash --norc #启动我们编译的pash


这样每次打开ekonsole之后输入
. ./init.sh     #注意前面的点和空格

就可以切换到我们的“主目录”,并启动bash,然后直接输入python就可以启动python环境了。

这是手机上运行的界面截图(截图工具):



已知的问题:
* python启动时会出现上面所示的警告信息,不知道怎么去掉
* python中无法使用unicode编码组件,如:unicode(str, "gbk") 会报 LookupError: unknown encoding: gbk 错误,但我看过,lib/encoding目录下是存在gbk.py文件的。
* bash不能加载.bashrc,会报file too large错

另外一个问题就是:我现在特别希望A1200是一只全键盘手机——用触摸笔在屏幕上一个字母一个字母的戳,实在太伤神了……

编译 A1200 Linux 软件初体验

2008年01月18日 22:47

貌似每次聚会之后都会有些新鲜的想法。上次聚会之后就诞生了这台服务器,虽然比我当时的设想简陋了好多,好歹也变成了现实。这次聚会之后,我就抑制不住想充分利用A1200这个手机Linux平台的冲动。

刚拿到A1200的时候其实也玩过一阵子。但那时候一是没什么经验,对Linux、智能手机都还一知半解;二是当时使用的是没有刷机的原始版本,权限控制得跟鬼一样,实在是干不了什么事。自从聚会归来之后,不知道为什么脑袋突然开了窍:我需要的并不是开发手机应用软件,而是把手机当成一个简易Linux平台

方向正确了,事情就好办了。A1200是一个2.4内核的arm体系的Linux。我需要做两件事:第一是可以全方位的操作这个Linux,而不仅仅只能运行这些手机软件,所以我需要一个Shell。还好,A1200正好有一个这样的程序:eKonsole,它是一个pkg程序,可以打开一个shell界面,在这个界面里我们可以输入shell命令。稍微试了一下,A1200上一些基本的命令,ls、cd、mkdir这些自不必说,awk、sed、grep、ifconfig也都有,还有tar、unzip、vi等一些工具,总体而言,编写一些shell脚本应该是没什么问题了。但是我们当然不能满足于它自带的这些东西。我们需要把一些自己需要的东西迁移过来。暂时来说,我当然不指望能在这个小小的平台上完成什么重要工作,所以我的目标目前来说仅限于一些命令行的工具。其实,我最想要的是Python……

无论想要什么,总得有个第一步。A1200上并没有gcc编译器,当然也不可能有make,我们想把软件搬到这个平台上直接编译,恐怕是很有难度的。所以,我们需要在PC上做一个交叉编译的toolchain。上网找了一些资料,的确有人整理了一些这样的toolchain,我最后选择了ezx-crosstool-0.5,因为这个比较简单容易理解。(BTW:现在这个工具所在的网站似乎访问不了了,如果有需要的同学就给我写信吧。)解压之后运行build.sh,它会去下载所需的组件并自动编译。不过wget的下载速度实在不敢恭维,所以还是自己去网站上事先下载好吧,一共有如下几个(注意都不是最新版的,但请老老实实的下载所指定的版本,因为它们还需要打一些patch):

from ftp://ftp.gnu.org/pub/gnu
binutils-2.15.tar.bz2
gcc-3.3.6.tar.bz2
glibc-2.3.2.tar.bz2
glibc-linuxthreads-2.3.2.tar.bz2

from http://www.kernel.org/pub/linux/kernel/v2.4/
linux-2.4.26.tar.bz2

下载完毕后放在ezx-crosstool-0.5的downloads目录下,然后再运行build.sh即可。

等阿等阿等阿等,终于……给了我一个错误信息。原来是lex没装。这个倒简单,在Ubuntu下
sudo apt-get install flex

就可以了。装完之后编译仍然出错,这次是glibc-2.3.2的一个头文件居然有语法错误。你需要解开glibc-2.3.2.tar.bz2,做如下更改:

echo "\"Compiled on a $$os $$version system" \
"on `date +%Y-%m-%d`.\\n\"" ;; \
更改为:
echo "\"Compiled on a $$os $$version system" \
"on `date +%Y-%m-%d`.\\\\n\"" ;; \
将:
echo "\"Available extensions:\\n\""; \
更改为:
echo "\"Available extensions:\\\\n\""; \

修改完毕后再打包成原来的名字,重新build.sh。等阿等阿等阿等,终于……又给我一个错误。这次仔细一瞧,原来是编译之后的测试程序出错。俺们相信你,测试错就错了吧,不管它了。
这时,你应该得到了一份可以用于交叉编译的编译环境。如果你没有修改过build.sh里的RESULT_TOP变量的话,它应该在ezx-crosstool-0.5/gcc-arm-iwmmxt目录下。当然你可以修改这个变量让它生成在任何你想生成的地方。比如我就把它生成在了~/mkezx/arm/gcc目录下。

有了这一份交叉编译环境,理论上来说我们就可以来编译手机上的程序了。先做个测试吧。
写一个经典程序:
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
}

然后编译:

首先设置路径:
PATH=$PATH:~/mkezx/arm/gcc/gcc-3.3.6-glibc-2.3.2/arm-linux/bin
然后执行编译命令:
arm-linux-gcc -o test test.c

然后将生成的test复制到手机上,用eKonsole执行一下./test,果然输出了Hello,world!

这个小程序没有什么用,我们整点有用的。来编译个Python吧。
结果……折腾了两天,一直编译出错。万分沮丧的我不得不退而求其次,暂时放下Python,先试试编译个bash。反正默认的shell确实不好用,用telnet连上去之后连Backspace键都不能用,会被解释成^H,而且也没有命令历史的功能,弄个全功能的bash也不错。
去ftp://ftp.gnu.org/pub/gnu下载一份bash的最新版本,解压,然后编译:
#设置路径不能忘记,以后就省略了,大家记得就是
PATH=$PATH:~/mkezx/arm/gcc/gcc-3.3.6-glibc-2.3.2/arm-linux/bin
./configure --host=arm-linux
make
make install --prefix=~/mkezx/build/bash

这次倒很顺利,一切正常的编译完成了。这样我们就有了一份可以用于A1200的bash了。不过这份bash有3M多,我们可以用strip减少一下它的size:
cd ~/mkezx/build/bash/bin
arm-linux-strip bash

缩减之后的bash只有600多k了。然后复制这份bash到手机上,打开eKonsole,执行./bash,再试试上下键,是不是有历史命令记录了?嗯,这样就爽多了。

不过折腾了两天,只成功的编译了bash一个工具。目前我希望得到的工具还有gcc、python和vim,不过知道原理,相信编译成功也是迟早的事情。
继续努力了。

BT群08疯会纪实

2008年01月14日 17:35

一切的一切,由一张火车票开始。—— 令狐语

2008年疯会经过2个多月的构思、调整、酝酿和发酵,终于揭开了它神秘的面纱。
注:以下时间为火星时间,如果发现跟地球时间有所误差,请勿激动。

1月12日 9:45AM
BT群上海分舵报名的BT们齐聚地铁上海站6号口,令狐分发了车票。众人发现,猛禽和研研的回程车票上,赫然印着“和谐号”三个大字,而去苏州的票上却空空如也。“我们果然不和谐”,大家想。

1月12日 10:10AM
准备上车了,令狐对着车头上标着“和谐号”三个大字的列车大喝一声:“不是这辆!我们是‘不和谐号’!”众人放眼望去,没有“不和谐”号——原来动车组早已全部和谐了。走下台阶的时候,看到最近的车厢是05号。令狐指着手里的04号车厢,自信满满的说:“我们往前走一节车厢就到啦。”于是一行人兴冲冲的赶到了06号车厢门口——然后再集体向后转。突然发现研研同学不在其中。上车之后,发现研研MM早就坐定在位子上了。于是令狐说,“这车怎么是反着编号的呀,居然编号的方向是跟开车的方向相反的。”话音刚落,列车徐徐的开动了——正是向着令狐所指的反方向。
令狐同学彻底崩溃了。

1月12日 10:42AM
苏州到了。跟杭州分舵帮主及人夫以及QQ三人会合后,商议买回程车票事宜。走到售票处一看,排着长龙,大家觉得还是不凑这个热闹了吧,先去TR家再说。于是又往回走,去坐出租车。快走到上客点的时候,小超帮主突然说:“坐个出租车怎么要走这么远啊?”众人晕倒——出租车上客点就在出站口的正对面,如果不是去买车票的话,只要几步路就到了……

1月12日 11:30AM
一路无话,来到湖左岸,在晕头的猛禽和令狐及清醒的QQ的一路带领下,顺利的来到了TR家。除了已经来过的猛禽、令狐及QQ三人之外,其他人均被TR的“豪华住房魔法”攻击,口水+100,自卑+20,其中小超帮主更是进入狂化状态,扬言要将家里的所有墙壁打通,包括楼上……还有楼下 -_-||

1月12日 12:00AM
在等待午饭的过程中,发生了如下几件事。
1. Mike将TR家的加菲猫玩具加菲猫的尾巴(不是Mike的)放到了加菲猫的两腿(不是Mike的)中间,并引发了猎手丰富的联想。(很黄!)
2. 穷极无聊的Mike对TR的BH的老猫产生了兴趣(没有写错字,请勿联想),开始抓猫为乐。可怜的原本BH无比的老猫被逼疯了,对着Mike发出了一声声的哀嚎。(很暴力!)
3. TR说Joomla的Comments插件没搞定,很可能未来会换成WordPress。(很好!)
4. 小超帮主携人夫一边听着TR为他们介绍自己的藏书,一边兴奋的点着说“要这个要这个要这个”,不一会儿手里就抱了一大堆的书,小超帮主一脸幸福的说要把这些带回去。(很强大!)

1月12日 1:00PM
TR照例演示了经典的可伸缩的120寸超大屏幕。在大家吃午饭Papa John‘s的时候,Mike追着TR问这个屏幕多少钱。TR说买投影机送的。Mike说他的哥哥问了一个屏要8000块(对,正好是两个4000块)。后来不知是谁说了一句:那投影在墙上可不可以啊?TR说,当然可以啊。这时猛禽突然说,屏幕不用可以收起来,那墙壁怎么收起来呢?众人orz。
QQ将加菲猫两腿打结,整个造型之猥琐程度远超Mike的猫尾巴。真是更黄更暴力(可怜滴加菲猫)

1月12日 1:30PM
Mike的RPWT开始发作。既喉咙不舒服之后,肚子也开始不舒服。于是顺走小超、太子、TR的各种知名不知名药若干。

1月12日 2:00PM
车到,众人出门。进电梯之时,小超帮主问了一句:“我们这么多人不会超重吧?”TR答道:“不会,就算要超也是小超。” 来到后门,门锁着,于是开始按开门钮。门不开。拧锁上的锁头,门还是不开,推,还不开,撞,还是不开……。正在这时,门卫爷爷出来了,拔下了下面的一个小门栓——门开了。原来这是一个坏掉的门锁。

1月12日 2:30PM
在车上,在Mike及众BT的合力引导下,老彼得同志彻底RP爆发了,为我们贡献了一路的笑料。鉴于和谐的未成年人保护法,我们对记录中的某些儿童不宜内容做了消音处理。以下是Mike和老彼得的对话:
“哔……”(消音)
“哔……”(消音)
“哔……”(消音)
“哔……”(消音)
“哔……”(消音)
……

1月12日 3:30PM
到达木渎古镇。在车上TR暂时充当导游向我们介绍了当地以及周边的地理和历史知识,无奈由于MK和太子的场面火爆,没有听得太清楚,只知道历史相当~~~悠久。下车后Mike提议TR充当导游进店骗吃骗喝骗财骗色,被我们一致BS一番。
风大天冷,在匆匆逛了一条街之后,决定上车。临走之前合影一张,以作留念。(照片略)

1月12日 4:00PM
上车后MK和太子被强行分开,车上顿时安静了许多。到达太湖公园,大家顶着寒风走在荒凉的湖上走廊,期间QQ的高跟鞋嵌入木板缝中N次,没有人发挥了雷锋精神,将其背离现场。(表问“没有人”是谁)
在某木柱上发现“想找人哔(消音)”签名一则,并附电话号码。叹为观止。

1月12日 4:30PM
仍然因为风大天冷,大家上车。离开水上长廊时经过摇晃的吊桥两则,令狐前方正行,忽闻背后女声惊呼“啊~~~”,忙回头,只见大男人若干。正疑惑谁有习葵花宝典潜质之时,小超从人堆里冒出头来。遂恍然。
上车后不久开始下雨。众人纷纷庆幸自己有自知之明。

1月12日 5:00PM
在某岛逛了一圈(仍然没有记住地名),车向回开,准备去最终目的地──藏书镇。猎手忽然叫起来:“咦,这个地方刚刚好像来过~~” 废话,本来就是往回开好不好。于是再次被习惯性BS。

1月12日 5:30PM
终于来到东方羊肉店。吃到了传说中的全羊宴。MK在不知情或假装不知情的情况下吃掉“羊尾巴”若干片。用餐过程很好很河蟹,传说中的全羊宴很好很强大。对这只12条腿的“全羊”致意崇高的敬意。

1月12日 7:30PM
BT用餐结束,回圣上住址。原定的“不离题”讨论依然没有进行。大家充分BT之后,很紧的猛禽携病体沉重的Mike和一切正常的妍妍MM先行回沪。小超帮主及人夫出外逍遥。TR携夫人与民同乐,陪猎手和QQ打牌。不会打牌的令狐一个人玩游戏,一直玩到手抽筋。

1月13日 1:00AM
牌局以猎手TR组合惨败告终。TR兴致很高,坚持要打完NFS 10的Boss关。2个小时磨练之后,终于到达Boss关卡。几经尝试失败后,终于决定睡觉。

1月13日 3:00AM
简单洗漱后上床,跟猎手聊了会天,从游戏聊到正经话题。跟猎手简单介绍了单元测试以及其它一些技术话题。2个半小时后,终于因为抵不住困意睡着了。

1月13日 9:30AM
起床,洗漱,等QQMM起床后很不客气的吃完了TR家的面包。以至于太子殿下发现自己的早饭不见了。

1月13日 10:30AM
起身告辞,赶和谐火车去也。

1月13日 ??:??PM
回到家。挡不住困意,倒头便睡,一直到晚饭时起床,整理照片。因为服务器速度太慢被BS。

1月13日 8:00PM
修改群签名为“BT帮聚会圆满成功”。

链接:
圣上钦定记录
猛禽记录
帮主人夫记录
MK记录

从实例学习设计模式

2008年01月09日 14:35

这么一篇小文章居然也写了好多天,惭愧惭愧。
这次的版本经过了整理,使用TXT2Tags生成,那是一个静态页面,无法评论。如果对文章有任何意见建议和批评,请在这里回复吧。

设计模式一度被捧为程序员的圣经。但有不少人对设计模式只知其形不知其实,认为设计模式是一种很神秘很强大的咒语,似乎只要对着一堆乱糟糟的代码说一声“设计模式,急急如律令!”那代码就会突然变得很好很强大,一切毛病都消失无踪。

其实设计模式并不是这样的。设计模式是一些编程惯用法的总结和提炼,这些惯用法在各种优秀代码中被普遍的使用,无论你学过还是没学过设计模式,很多思想和做法你都在有意无意的被使用着。

学习设计模式,并不是背熟那23个名字,学会那几段范例代码。学习设计模式的关键,是学会如何在实际工作中使用那些良好的做法去解决实际的问题。知不知道每个模式的名字并不是最关键的,关键的是适当的使用这些做法可以对解决问题带来帮助。

下面我就用我一个在实际工作中开发并使用的日志框架作为一个例子,给大家展示一下如何适当的使用设计模式去解决实际问题。

这个框架的实现并称不上优秀,也没有用到所有的模式。只是希望能用这样的一个实际例子给大家一些启示。


点这里阅读:从实例学习设计模式

vim的编码自动识别

2008年01月08日 13:56

现在在Windows下,VIM已经成了我主要使用的编辑器了。最近因为写文章,大量使用中文,而且在Linux和Windows下同时工作,问题就来了。
我在Linux保存的文本都是UTF-8格式,在Windows下用VIM打开乱码。强制设置encoding=utf-8倒是可以转码,但不知道为什么转过之后再退出,swap文件就不能自动删除了。再次打开就会有一个提示。
后来有一段时间写文章我就改用PSPad。但是想想自己号称vim用得很熟练,结果连个小小的编码问题都搞不定,岂不很没面子?今天上网找了找资料,再看看vim的help(BTW:VIM的help真是很好很强大,又简单又有效),终于把问题给搞定了,原来比想象得简单的多。所以说,凡事要勇于尝试啊。

关键在于,vim关于编码有几个相互区别又容易混淆的选项,如果没有理清其中的关系,的确有点晕晕乎乎,理清了也就不过如此了。

encoding:这个选项用于设置VIM内部的编码形式。设置完毕之后,各种文本都会被尝试转换成这个编码格式来显示。
fileencodings:这个选项可以设置一系列的编码,当使用VIM打开文件时,会从前往后尝试将文本用某格式,如果转换失败就换下一种。都失败就用latin-1(ASCII)编码打开。
fileencoding(注意比上面那个少一个s):这个选项决定新建文本的默认编码。
termencoding:这个选项决定在命令行模式使用时,可以让vim使用与命令行不同的编码模式。在GUI版本中,这个选项决定了键盘输入的编码,不过在Windows下似乎又有点不太一样,具体我还得再研究研究。

知道上面几个选项的含义,做vim自动编码识别就比较简单了。
首先,我们将encoding设置成utf-8。因为utf-8的范围比较广,基本上本地编码都可以转换为utf-8,但如果设置成本地编码,就有可能转换失败。
其次,我们要尝试用正确的模式打开文件,因此我们要设置fileencodings,从utf-8开始尝试,如果不对,尝试chinese。这个chinese是一个别名,在UNIX平台上等价于euc-cn,在Windows平台上等价于cp936。如果还可能接触到big5码的话,还可以再尝试taiwan,这也是一个别名,在UNIX平台上等价于euc-tw,在Windows平台上等价于cp950。如果再不对,就认为是latin-1编码,这个是默认的,不用设置。
然后再设置新建文件的编码。一般windows上我们还是老实点用本地编码cp936比较好,因为Windows很多程序(尤其是中文程序)都是不能处理utf-8的。而Linux现在大部分发行版都是用utf-8作为标准编码的,所以我们就可以设置成utf-8。
termencoding的设置说实话我不是特别理解。照猫画虎的照着网上的资料抄了一句设置。
综合起来,.vimrc/_vimrc的设置如下:

set encoding=utf-8
set fileencodings=utf-8,chinese
" 这个判断是为了做一个普适版本,可以同时适用Windows和Linux。
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
" 这句就是抄的,表问我具体含义
let &termencoding=&encoding

这样一来,utf8和ANSI cp936的文本都可以自动被正确打开并显示了。

如果要转码怎么办呢?看完上面的介绍相信大家都已经很清楚了,在vim里使用:命令:
:set fileencoding=utf-8 " 转换当前文本为utf-8格式
:set fileencoding=cp936 " 转换当前文本为cp936格式

注意一点就是,必须所有的字符都是可以正确转换的,比如将简体字转成big5就不行,因为简体字在big5里没有对应的编码。

08年1月7日 无题

2008年01月07日 23:13

早上半天开会,争论,将已经做好的部分代码作废。
下午无事可叙。
晚上回家弹了1小时琴,感觉收效甚微,还是打算找个老师学一下基础。
上网,更新12日的行程。参与部分RP话题。
Mike推荐gstreamer,尝试,报错,找不出原因。仍然坚持使用mplayer,实践是唯一的真理。
帮LP写的分析脚本有问题,查原因,发现是文件名不标准,很郁闷。
写blog,睡觉。

闲谈偶得

2008年01月03日 14:57

昨天参加朋友婚宴,碰到了Javaeye的主要开发者之一Quake Wang,跟他闲聊了几句。收获还是不少的。

首先是关于Ruby On Rails 的效率问题。他告诉我RoR的效率不高,javaeye也用了很多技巧去提高网站的并发数。以往我对Web开发并不十分了解,但他提到的一些东西还是给我很多的启示。特别重要的是,Ruby On Rails这种很流行的东西,有它的好处,但也有很多缺点。用它做实际系统,还是要考虑很多细节的问题。(其实哪个系统不是这样呢?只是可能考虑的重点不同而已)认为RoR或者别的什么东西是拯救苍生的银弹的人,应该及时恢复清醒的头脑。

后来又聊到了Google Android,他跟我说他用这个SDK写了一些小程序,发现开发还是挺方便的。而且,因为这是一个开放的系统,所以,以后那些山寨机再也不用抬不起头了,只要加装Android运行期模块,(最多花钱升级一下触摸屏),就可以运行Android程序。这就是开放系统的好处——将开发运行的门槛都降到很低。想当初blog这个“简单”的玩意也就是因为降低了内容创作的门槛,使得互联网迎来了令某些相关部门惊恐的“You”时代。那么一个开放的手机系统会给我们带来怎样的变化呢?拭目以待吧。

后来发现我们俩居然用同一型号的手机——MOTO A1200,于是又交流了一些手机经验,并且Quake还利用蓝牙传了两个游戏给我,让我这个老人家也终于体会了一把蓝牙这种“高科技”。
Design downloaded from free website templates.