全部文章 | 论坛文集

2007-07-21 18:51



下周一晚上的火车,去梦兰集团龙芯产业化基地参观3天,兴奋啊。

或许是离计算所近的缘故吧,胡老师关于龙芯的讲座我可是都没落下。真不知道自己为啥这么关注国产CPU,难道跟华镭也有些关系?或许我的一片“诚心”感动了上苍吧,竟然给了我一个机会去龙芯产业化基地参观,和其他9名来自中科院不同院所的同学一起,这该是怎样的一段旅程啊。

只可惜从来没用过龙芯电脑,更没用过龙芯版的华镭系统。但是不管怎么说,这次可以里里外外看个够了,呵呵。



2007-05-09 11:15


原文在这里:

6 biggest wins for Linux in Q1 2007

http://www.seopher.com/articles/6_biggest_wins_for_linux_in_q1_2007

仅仅翻译了一下梗概:

1,Dell采纳消费者的意见并同意推出预装Ubuntu的电脑。

2,Dell确认预装Ubuntu的电脑会更便宜。

3,俄亥俄高中使用Linux节省了41万美元。

4,Mark Shuttleworth宣布全球共有800万Ubuntu使用者。

5,新的Ubuntu带有稳定的图形化界面的NTFS读写支持。

6,法国议会转向使用Kubuntu。

俺只能说一句话:Ubuntu...火死了...



2007-04-26 18:52


Bash默认是Emacs模式,可以通过set -o来查看。

Emacs中,使用Esc-b和Esc-f来后退或前进一个单词,但Esc,f,b这三个按钮都是左手按钮,连续按起来十分不方便。

今天,刚刚发现,原来可以通过Ctrl-←和Ctrl-→来按单词移动。虽然右手还是需要离开键盘区,但已经比单纯用左手省力不少了。

经我试验,实际上,不同的情况,按词移动需要用不同的按钮。

一般,单纯的命令行模式下,可以用Alt-f,Alt-b或Alt-←,Alt-→在单词间来回移动。但是,如果在gnome-terminal下,Alt键会激活菜单栏,此时,就必须使用Ctrl-←和Ctrl-→了。

附:
Bash快捷键

Navigation
Left/right cursor key Move left/right in text
Ctrl+A           Move to beginning of line
Ctrl+E           Move to end of line
Ctrl+right arrow     Move forward one word
Ctrl+left arrow     Move left one word

Editing
Ctrl+U     Delete everything behind cursor to start of line
Ctrl+K     Delete from cursor to end of line
Ctrl+W     Delete from cursor to beginning of word
Alt+D       Delete from cursor to end of word
Ctrl+T     Transpose characters on left and right of cursor
Alt+T       Transpose words on left and right of cursor

Miscellaneous
Ctrl+L   Clear screen (everything above current line)  
Ctrl+U   Undo everything since last command1  
Alt+R     Undo changes made to the line2  
Ctrl+Y   Undo deletion of word or line caused by using Ctrl+K, Ctrl+W, and so on3
Alt+L     Lowercase current word (from the cursor to end of word)



2007-04-26 17:38


给定gcc优化选项时经常要指定march和mtune。我以前都将它们赋为一样的值,例如pentium4.

今天仔细研究了一下它们的区别,原来还是有一些道道的。

首先是man gcc:

-mtune=name
      This option is very similar to the -mcpu= option, except that
      instead of specifying the actual target processor type, and hence
      restricting which instructions can be used, it specifies that GCC
      should tune the performance of the code as if the target were of
      the type specified in this option, but still choosing the instruc-
      tions that it will generate based on the cpu specified by a -mcpu=
      option.

上面是gcc3.2的manpage,现在mcpu已经不用了,一般都用march。望文生义,march指定的是当前cpu的架构,而mtune是真正作用于某一型号cpu的选项。

根据链接:
http://gentoo-wiki.com/Safe_Cflags
的解释,march是“紧约束”,mtune是“松约束”。mtune可以提供后向兼容性,也就是mtune=pentium-mmx编译出来的程序,在pentium4处理器上也是可以运行的。

因此,像-march=i686 -mtune=pentium4这样的优化选项编译出来的程序,是为奔腾4处理器优化过的,但是在任何i686上都可以运行。

我猜,如果指定了-march=pentium3,那么在奔腾4处理器上程序是不能运行的。

上面是自己根据别人的文档整理出来的一些说法,具体是不是这么回事没有试验过。若有错误的地方,还请大虾指正:-)



2007-04-26 17:16


比较老的机器了,使用的是Xeon 2.4GHz。

$cat /proc/cpuinfo
processor     : 0
vendor_id     : GenuineIntel
cpu family     : 15
model       : 2
model name     : Intel(R) Xeon(TM) CPU 2.40GHz
stepping     : 9
cpu MHz       : 2399.435
cache size     : 512 KB
Physical processor ID   : -376576152
Number of siblings     : 2
fdiv_bug     : no
hlt_bug       : no
f00f_bug     : no
coma_bug     : no
fpu         : yes
fpu_exception   : yes
cpuid level   : 2
wp         : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips     : 4750.85

processor     : 1
vendor_id     : GenuineIntel
cpu family     : 15
model       : 2
model name     : Intel(R) Xeon(TM) CPU 2.40GHz
stepping     : 9
cpu MHz       : 2399.435
cache size     : 512 KB
Physical processor ID   : -1064018112
Number of siblings     : 2
fdiv_bug     : no
hlt_bug       : no
f00f_bug     : no
coma_bug     : no
fpu         : yes
fpu_exception   : yes
cpuid level   : 2
wp         : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips     : 4784.26

processor     : 2
vendor_id     : GenuineIntel
cpu family     : 15
model       : 2
model name     : Intel(R) Xeon(TM) CPU 2.40GHz
stepping     : 9
cpu MHz       : 2399.435
cache size     : 512 KB
Physical processor ID   : -1069960952
Number of siblings     : 2
fdiv_bug     : no
hlt_bug       : no
f00f_bug     : no
coma_bug     : no
fpu         : yes
fpu_exception   : yes
cpuid level   : 2
wp         : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips     : 4784.26

processor     : 3
vendor_id     : GenuineIntel
cpu family     : 15
model       : 2
model name     : Intel(R) Xeon(TM) CPU 2.40GHz
stepping     : 9
cpu MHz       : 2399.435
cache size     : 512 KB
Physical processor ID   : -1069960952
Number of siblings     : 2
fdiv_bug     : no
hlt_bug       : no
f00f_bug     : no
coma_bug     : no
fpu         : yes
fpu_exception   : yes
cpuid level   : 2
wp         : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips     : 4784.26

由于使用了SMP内核,因此显示了4个核心不足为奇。可flags里面偏偏又有ht(HyperThreading)一项,让我不得不怀疑这个至强CPU是不是支持超线程。

网上搜索了一把,发现了一个解释:

http://bbs.linuxmine.com/archiver/tid-7215.html

  the "ht" flag there ONLY means "we support reporting the number of
  threads/cores/etc via the MSRs". It does not mean that you actually have
  hyperthreading, only that your cpu knows how to report what it
  supports...

在编译程序时,应该使用什么样的优化选项呢?在这里:

http://wiki.equn.com/index.php?title=M4

gcc -Wall -W -O3 -march=pentium4 -msse2




2007-04-24 15:36


一,

讲编程的书里经常看到加了行号的源码。我时常在想这行号难道是作者手动加上去的?直到今天在IBM DeveloperWorks乱转,才发现了如下用法:

cat -nb 1.c > 2.c

-n表示进行编号,-b表示不对输出行编号。

产生的文件中行号前面有5个空格,可以使用sed删除:

sed 's/   //' 2.c > 3.c

或:

sed 's/^ *//' 2.c > 3.c

行号与正文是用tab分开的,仍旧可以使用sed将tab转换为空格:

sed 's/\t/ /' 3.c > 4.c

或者使用如下命令合并上面两个命令:

sed -e 's/   //' -e 's/\t/ /' 1.c > 5.c

二,

原以为cat只是显示文本文件的,查看一下cat的手册页,才发现cat的全称是concatenate,也就是连接的意思。显然,对于二进制文件,cat也是适用的。

例如,将4G的Solaris源码分为4块下载后,合成一个大的.iso文件:

cat file1 file2 file3 file4 > filename.iso

连接之后不禁要问:原先的4个filename.iso是怎么分开的呢?

我猜是split




2007-04-12 08:08


今天一早看到的消息:



SUN杯中科院第二届开源软件大赛由中国科学院团委、中国科学院研究生院团委、中国科学院研究生院学生会主办,由研究生院开源软件协会承办,面向中科院系统内各院所及全国高校。2006年,中国科学院首届开源软件大赛取得了圆满成功,大赛收到了来自中科院各院所和全国高校的大量优秀参赛作品。正如倪光南院士在这届大赛中所说: “开源软件促进了软件业的创新。这次大赛为广泛传播开源的精神,顺应时代潮流,推动开源运动在中国的发展书写了光辉的一页。”

兹定于2007年4月15日(周日)晚19:30开始在中科院研究生院中关村园区教学楼S101教室举行本届大赛的开幕式

本次开幕式拟出席嘉宾:
宫敏(中国软件行业协会共创软件分会副理事长)
佟佳珏(sun中国交流与对外合作部门经理)
郭朝峰(sun中国高校合作项目经理)
苏哲(Google工程师,scim输入法作者)
陈勇(Huihoo.org开源软件社区共同创始人)
胡长城(J2EE项目构架师)
孙鑫

欢迎大家前来参加开幕式!

大赛开幕后,将开始接受参赛报名及作品征集,并将举行一系列技术讲座,敬请关注。更多信息请登陆大赛网站:http://oss.gucas.ac.cn



如果周日晚北京的镭友有空的话,可以在站内发信件给我,留下你的手机号和ID,大家一起去参加这个开幕式,顺便看看牛人^_^。中科院在中关村这边,离清华很近。



2007-04-11 17:04




随着菜鸟变成了老鸟,随着经常有人自称老鸟出来普及怎样做汉化,Linux系统中文化已经没有问题了。在这之后,一个日益严峻的问题会显现出来,那就是中文输入法的效率。

举例来说,下面是我的打字速度统计:

搜狗拼音输入法输入统计数据:2007.02.25 - 2007.04.11(共45天)

输入总字数       53744 汉字
最近3分钟打字速度   30 字/分钟
历史最快打字速度   65 字/分钟

按照平均打字速度30字/分钟来计算,在过去45天中,我每天有53744/30/45=40分钟花在了打字上。

如果是汉统输入法的话,我相信历史最快打字速度肯定不会达到65字/分钟,自己的平均速度也不会达到30字/分钟。如果每天使用汉统作为输入,那么我想,每天至少要花1小时来打字。也就是多花了50%的时间。这样的效率,谁能忍受?

所以我日常应用使用Windows,在Linux下只用英文...

我不是文字工作者,我不聊QQ,我只拿汉字写写博客和邮件,对于大部分其他人,特别是那些经常需要输入汉字的人来说,一款得心应手的输入法是提高Linux说服力的关键!

搜狗和谷歌输入法的发布,应该是中文输入法的一个巨大的进步。但在Linux平台,我们一直止步不前。

期待汉统有更大的改进!



2007-04-11 16:16


经常使用cd -在两个目录中切换,但三个怎么办呢?虽然有n种方法可以做到,但我觉得用pushd是最简单的。

pushd使用目录堆栈的方法管理目录,对应的弹出命令是popd。

举例来说,我们想在a,b,c三个目录中切换。假设现在a中,如果想进入b,不要用cd b,而是pushd b,则同样会进入b,而b已经在目录的堆栈中了。此时,再次pushd c,则进入c目录,同时把c压入堆栈。请看代码:



Code:

[Ctrl+A Select All]



上面的代码同时显示出了如何在三个目录中依次切换,上面的pushd命令等同于pushd +1。

pushd +N这条命令的意思是,将目录堆栈中第N个(从0开始数,栈顶在最左边,也就是第0个)目录通过循环堆栈的方式提到栈顶,并进入这个目录。



Code:

[Ctrl+A Select All]



RAYS中没有pushd的man page,从网上搜了一些,贴在这里:

pushd

Save and then change the current directory. With no arguments, pushd exchanges the top two directories.

SYNTAX
    pushd [dir | +N | -N] [-n]
KEY
  +N   Brings the Nth directory (counting from the left of the list
    printed by dirs, starting with zero) to the top of the list by
    rotating the stack.

  -N   Brings the Nth directory (counting from the right of the list
    printed by dirs, starting with zero) to the top of the list by
    rotating the stack.

  -n   Suppresses the normal change of directory when adding directories to the
    stack, so that only the stack is manipulated.

  dir Makes the current working directory be the top of the stack, and then executes
    the equivalent of `cd dir'. cds to dir.


有趣的是,Windows也有这条命令:


Pushd

在将当前目录更改为指定目录之前,存储 popd 命令使用的当前目录的名称。
语法

pushd [Path]
参数

Path

指定当前目录更改后的目录。该命令支持相对路径。

/?

在命令提示符下显示帮助。
注释


每次使用 pushd 命令时,都存储一个目录供用户使用。但是,可以通过多次使用 pushd 命令存储多个目录。

目录按顺序储存到一个虚拟堆栈中。如果第一次使用 pushd 命令,该命令所在的目录就会被置于栈底。如果您再次使用该命令,则第二个目录就会被置于第一个目录之上。每次使用 pushd 命令时都将重复该过程。

可以用 popd 命令将当前目录更改为由 pushd 命令最新存储的目录。如果使用 popd 命令,位于堆栈顶端的目录将从堆栈中删除,当前目录转变为栈顶目录。如果再次使用 popd 命令,则删除堆栈中的下一个目录。
•    

如果启用了命令扩展,pushd 命令将接收网络路径或本地驱动器盘符和路径。
•    

如果指定网络路径,pushd 命令临时将第一个未使用的驱动器盘符(从 Z 开始)分配到指定的网络资源。然后命令将当前驱动器和目录更改为新分配驱动器上的指定目录。如果与已启用的命令扩展一起使用 popd 命令,popd 命令将删除由 pushd 创建的驱动器盘符分配。
示例

可以在批处理程序中使用 pushd 和 popd 命令将批处理程序运行的目录更改为当前目录,然后再将其改回来。下面的批处理程序实例将说明如何做到这一点:

@echo off rem This batch file deletes all .txt files in a specified directory pushd %1 del *.txt popd cls echo All text files deleted in the %1 directory


可以看出,windows的pushd功能相对弱一些,或许可以弥补一下没有cd -命令的不足吧。



2007-04-06 21:48


最近编译一套Linux程序,需要一个静态库。而这个静态库的源码环境竟然是Solaris,搞得我着实有些郁闷。

刚好晚上有这个讲座,便去听了听。从中科院的各种活动来看,Sun公司是最重视校园活动的,经常有Sun的大学日。各种活动也非常精彩。感受有几点:

1,Sun公司的确是世界上最大的开源组织。
2,DTrace是一个突破。
3,SunStudio和NetBeans对程序的编写调试提供了极大的方便。
4,Sparc和UltraSparc引领多CPU多线程运算和开发。

问了几个弱弱的问题,拿到了一个Duke玩偶,一套Opensolaris DVD宝典,最后还意外地抽奖得到了一套《Solaris 10红宝书》及配套光盘。Solaris已经支持x86架构的硬件,看样子有机会得体验一把了。

顺便说两句:
1,Unix体验中心www.unix-center.net提供Solaris环境试用。
2,注册opentech.org.cn,有机会赢取iPod Nano!

公司校园行就应该这样,准备众多的礼品,调动现场气氛,双赢啊^_^。



2007-04-04 16:18



长期潜水Ubuntu论坛,今天看到了一篇帖子,让我不得不回了!

http://forum.ubuntu.org.cn/viewtopic.php?p=247866#247866

家乡啊!那叫一个想...



2007-04-04 15:57


http://tools.google.com/pinyin/index.html


以前曾说苏哲去了Google,当然,还有传说中的Google输入法:

http://forum.openrays.org/read-htm-tid-4107-keyword-.html

现在Google果然出了谷歌输入法。立马适用一下,相比搜狗,有几点最大的特色:

1,加入自动纠错功能,例如,我常常将jiang打成jiagn。非常舒心。
2,整句功能有所加强。
3,可以结合Google账户,同步用户词库。
4,结合Google搜索功能,输入的时候按Ctrl-g就可以搜索当前词了。

相比功能日趋完善的搜狗输入法,Google的输入法在界面,用户使用感受等方面还是不行的。但根据其10余M的安装文件及Google的实力判断,其在用户词库和输入法引擎方面肯定不会逊于搜狗。相信以Google的更新速度,不久的将来肯定会与搜狗不相上下。

引出以下猜想,预测,和期待:

1,输入法从此进入三足鼎立时代:微软拼音输入法2003/2007,搜狗输入法,谷歌输入法。
2,媒体马上会热炒谷歌输入法。毕竟Google在中国的低迷,本地化的缓慢让众多人失望,怀疑或是猜测。
3,有苏哲在Google,相信Linux下的输入法也快出来了!



2007-03-23 17:44




最近接连看到三条相关的新闻:

  1. Linuxsir近三个月来一直受到严重DDOS攻击,导致大批用户无法正常登录。链接
  2. LinuxSir.Org 对中国国产龙芯电脑进行测试,对公众开放了telent,欢迎大家体验龙芯电脑。随后就有人删掉了整个系统。链接
  3. Unix体验中心提供各种类Unix系统供用户使用,开放SSH登录,并有C/C++, Fortran,Java等环境。看看他们的系统日志吧:开放后第三个小时就受到DDOS攻击,第二天有个来自上海的小子便运行了一个while (1) fork()程序导致系统资源耗尽。链接

中国的开源环境本来就非常脆弱,可总有那么一些人爱耍一些雕虫小技,以一些卑劣的技术到处搞破坏为乐。带着唯恐天下不乱的心态满足自己自封的所谓“Hacker”的称号,其实只是一个人人唾弃的没有任何技术能力的“Cracker”而已。

对中国的开源环境下毒手的人,就像一个无耻又无赖的人试图将婴儿扼杀在襁褓中,怒!

特发此文,以表心志。



2007-03-23 17:27


前天晚上去听了宫敏老师的讲座:《安全操作系统》。宫敏何许人也?当年背着几十卷磁带把芬兰自由软件库全部拷贝回中国的人,被《程序员》杂志评为影响中国软件开发的二十人之一的自由软件界元老。
[attachment=72]
宫敏现在凝思科技的董事长,公司的产品主要是磐石安全服务器。由于安全服务器这种东西国际上对中国要么禁运,要么限制出口,所以国内只能自产自销。在中国,有资格讲“安全操作系统”这个题目的,恐怕非宫敏莫属(就像龙芯总设计 师胡伟武在研究生院开课“高性能处理器”一样)。

今年51岁的宫老师可以用“可爱”来形容,一个非常平易近人的“大虾”。讲座结束后竟然还去要听讲座的同学的名片,并说:“你们有空就来找我玩!”

在讲座中了解了一些安全操作系统的知识。一般将操作系统的安全等级分为4档7级,从高到低分别为:A,B2,B1,C3,C2,C1,D。Windows XP和Linux都处于C2级。有SELinux的Linux安全等级上升为B1级。

我问了几个自己比较关心的问题。第一个是有关麒麟操作系统的,想听听专家怎么解释这个曾经吵得沸沸扬扬的事情。巧合的是,宫敏就是麒麟操作系统验收专家组的技术组长,主管源代码方面。所以,据他讲,“这个问题是问对人了”。

麒麟安全操作系统主要分为三层:最底层是自己加的“既不像内核,也不像虚拟机”的东西,上面是BSD的内核,最上面是Linux兼容库。开放给公众使用的系统不包括最底层的东西。整个系统“技术上还是做了很多活的。”

有意思的是,宫敏在检查麒麟源代码的时候,突然看到一些代码很面熟:“咦,这些代码不是我们磐石系统的吗?”,麒麟的开发者连忙承认,并解释其来源和途径。当然,由于麒麟和磐石都是基于*nux的,源协议分别是BSD和GPL,二者共享代码并无法律和伦理上的不妥。

第二个问题是到底为什么说Linux比Windows更安全?毕竟两个系统都是C2级的。我的观点是,因为Linux没有大众化,所以不像Windows那样成为众矢之的。

宫敏的解释分为两点:第一,有太多人关心Linux了。他举了一个例子,teardrop攻击出现时所有系统无一幸免,Linux的补丁发布之用了两小时,而windows用了两周。我的理解是:从某种意义上说,一种系统比另一种系统更安全,要看它应对病毒攻击的反应速度和有效程度。没有系统能做得天衣无缝滴水不漏,当受到攻击时,补丁推出越早,系统便越安全。

第二,Linux的TCB小很多。TCB是Trusted Computing Base。系统的TCB越小越安全。而Windows的整个系统架构不太好,"It's nothing else of a bunch of DLLs."

讲座上宫敏还讲了一些当年从芬兰背着Linux回中国的趣闻。最后我们在电梯里,还聊到了一些写代码的问题。每出一个GCC版本,宫敏便写一段小程序,输出汇编代码.S文件,然后阅读一下,以此了解GCC特性(是不是有点恐怖?)。虽然50多岁了,但他还在写代码,他说主要是C和...我问是不是机器码啊...他笑了笑说是Verilog。



2007-03-17 19:16


1,2.0什么时候出来?
2,汉统崩溃。
3,xchat和firefox不兼容。
4,怎么改变显示器分辨率和刷新率。

欢迎跟帖#-)



2007-03-14 15:58


信不信由你,gcc支持这样的语句:

case 'a' ... 'z':

来表示这样的意思:

case 'a':
case 'b':
...
case 'z':
  /* operation */
  break;

不过要注意,三个点...之前之后都有空格。

可到了VC6.0里面,就没这么好运了,死活编译不过去。于是只好见招拆招:



Code:

[Ctrl+A Select All]




2007-03-10 22:53


编译程序时经常需要首先运行configure脚本,然后make。今天花了些时间看了看autotool的tutorial,大体搞明白了是怎么回事。

以前老的办法,需要以下步骤:

1,编辑源文件,一般都放在src文件夹下。
2,运行autoscan产生configure.scan
3,编辑configure.scan,并重命名为configure.ac
4,编辑Makefile.am和src/Makefile.am
5,手动添加 NEWS README AUTHORS ChangeLog文件


6,运行autoheader产生config.h.in
7,修改config.h.in确保程序可移植性良好。
8,运行automake -ac
9,运行aclocal
10,运行autoconf
11,configure
12,make
13,make dist得到发行包。

在 autotools 的命名习惯中,后缀 ac 的文件是 autoconf 的输入文件,后缀 am 的文件是 automake 的输入文件,后缀 in 的文件是 configure 的输入文件。

使用autoreconf工具可以得到一个比较简化的过程,也就是现在常用的bootstrap。上面的命令从第6步开始就可以使用autoreconf了:

6,autoreconf -i
7,configure
8,make
9,make dist得到发行包。

在大的软件工程中,需要用到各种宏变量和开发库,因此需要好好设计configure.ac的内容。具体请参看autoconf的manual。




2007-03-10 16:26


经常在/usr/include目录下看到这种字句:



Code:

[Ctrl+A Select All]



不太明白是怎么用的。今天阅读autobook,在第53页看到了作者的解释:C/C++编译器对函数和变量名的命名方法不一样(例如C++中重载的函数有多个名字,而C的函数只有一个名字),这样当C编译器去引用C++编译器编译出来的符号时,会找不到链接。因此,当一个头文件可能既被C程序引用,又被C++程序引用时,需要使用如上代码进行区分。

上面的写法太复杂了,况且两个大括号{和}分离,会造成有些编辑器的缩进错误。更好的手法是将如下代码定义在一个公共头文件中,然后所有其它头文件去引用它:



Code:

[Ctrl+A Select All]



有关__cplusplus和extern "C"的更多用法,可以参考下文:

《C++中extern “C”含义深层探索》
http://hi.baidu.com/17cpp/blog/item/a46bfd13a4816e025aaf53f6.html



2007-03-03 16:14


Linux-关于locale的设定(转载)
关于locale的设定

http://blog.csdn.net/goooooooooo/archive/2006/09/22/1265771.aspx

locale 是国际化与本土化过程中的一个非常重要的概念,个人认为,对于中文用户来说,通常会涉及到的国际化或者本土化,大致包含三个方面:看中文,写中文,与 window中文系统的兼容和通信。从实际经验上看来,locale的设定与看中文关系不大,但是与写中文,及window分区的挂载方式有很密切的关系。本人认为就像一个纯英文的Windows能够浏览中文,日文或者意大利文网页一样,你不需要设定locale就可以看中文。那么,为什么要设定 locale呢?什么时候会用到locale呢?


一、为什么要设定locale
正如前面我所讲的,设定locale与你能否浏览中文的网页没有直接的关系,即便你把locale设置成 en_US.ISO-8859-1这样一个标准的英文locale你照样可以浏览中文的网页,只要你的系统里面有相应的字符集(这个都不一定需要)和合适的字体(如simsun),浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后,浏览器会判断相应的编码的字符集,根据网页采用的字符集,去字体库里面找合适的字体,然后由文字渲染工具把相应的文字在屏幕上显示出来。

在下文本人会偶尔把字符集比喻成密码本,个人觉得对于一些东西比较容易理解,假如你不习惯的话,把全文copy到任何文本编辑器,用字符集替换密码本即可。

那有时候网页显示乱码或者都是方框是怎么回事呢?个人认为,显示乱码是因为设定的字符集不对(或者没有相应的字符集),例如网页是用UTF-8 编码的,你非要用GB2312去看,而系统根据GB2312去找字体,然后在屏幕上显示,当然是一堆的乱码,也就是说你用一个错误的密码本去翻译发给你的电报,当然内容那叫一个乱;至于有些时候浏览的网页能显示一部分汉字,但有很多的地方是方框,能够显示汉字说明浏览器已经正确的判断出了网页的编码,并在字体库里面找到了相应的文字,但是并不是每个字体库都包含某个字符集全部的字体的缘故,有些时候会显示不完全,找一个比较全的支持较多字符集的字体就可以了。


既然我能够浏览中文网页,那为什么我还要设定locale呢?

其实你有没有想过这么一个问题,为什么gentoo官方论坛上中文论坛的网页是用UTF-8编码的(虽然大家一直强烈建议用GB2312编码),但是新浪网就是用GB2312编码的呢?而Xorg的官方网页竟然是ISO-8859-15编码的,我没有设定这个locale怎么一样的能浏览呢?这个问题就像是你有所有的密码本,不论某个网站是用什么字符集编码的,你都可以用你手里的密码本把他们翻译过来,但问题是虽然你能浏览中文网页,但是在整个操作系统里面流动的还是英文字符。所以,就像你能听懂英语,也能听懂中文。
最根本的问题是:你不可以写中文。

当你决定要写什么东西的时候,首先要决定的一件事情是用那种语言,对于计算机来说就是你要是用哪一种字符集,你就必须告诉你的linux系统,你想用那一本密码本去写你想要写的东西。知道为什么需要用GB2312字符集去浏览新浪了吧,因为新浪的网页是用GB2312写的。

为了让你的Linux能够输入中文,就需要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE ),例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是locale的表达方式就可以了。

二、到底什么是locale?
locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类,通常包括用户所使用的语言符号及其分类(LC_CTYPE),数字 (LC_NUMERIC),比较和排序习惯(LC_COLLATE),时间显示格式(LC_TIME),货币单位(LC_MONETARY),信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES),姓名书写方式(LC_NAME),地址书写方式(LC_ADDRESS),电话号码书写方式 (LC_TELEPHONE),度量衡表达方式(LC_MEASUREMENT),默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。

所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的,这些locale定义文件放在/usr/share/i18n/locales目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。

对于de_DE@euro的一点说明,@后边是修正项,也就是说你可以看到两个德国的locale:
/usr/share/i18n/locales/de_DE@euro
/usr/share/i18n/locales/de_DE
打开这两个locale定义,你就会知道它们的差别在于de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯。

上面我们说到了zh_CN.GB18030的前半部分,后半部分是什么呢?大部分Linux用户都知道是系统采用的字符集。

三、什么是字符集?
字符集就是字符,尤其是非英语字符在系统内的编码方式,也就是通常所说的内码,所有的字符集都放在 /usr/share/i18n/charmaps,所有的字符集也都是用Unicode编号索引的。Unicode用统一的编号来索引目前已知的全部的符号。而字符集则是这些符号的编码方式,或者说是在网络传输,计算机内部通信的时候,对于不同字符的表达方式,Unicode是一个静态的概念,字符集是一个动态的概念,是每一个字符传递或传输的具体形式。就像Unicode编号U59D0是代表姐姐的“姐”字,但是具体的这个字是用两个字节表示,三个字节,还是四个字节表示,是字符集的问题。例如:UTF-8字符集就是目前流行的对字符的编码方式,UTF-8用一个字节表示常用的拉丁字母,用两个字节表示常用的符号,包括常用的中文字符,用三个表示不常用的字符,用四个字节表示其他的古灵精怪的字符。而GB2312字符集就是用两个字节表示所有的字符。需要提到一点的是Unicode除了用编号索引全部字符以外,本身是用四个字节存储全部字符,这一点在谈到挂载windows分区的时候是非常重要的一个概念。所以说你也可以把Unicode看作是一种字符集(我不知道它和UTF-32的关系,反正UTF-32就是用四个字节表示所有的字符的),但是这样表述符号是非常浪费资源的,因为在计算机世界绝大部分时候用到的是一个字节就可以搞定的26个字母而已。所以才会有UTF-8,UTF-16等等,要不然大同世界多好,省了这许多麻烦。


四、zh_CN.GB2312到底是在说什么?
Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 所以说呢,locale总是和一定的字符集相联系的。下面举几个例子:

1、我说中文,身处中华人民共和国,使用国标2312字符集来表达字符。
zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。

2、我说中文,身处中华人民共和国,使用国标18030字符集来表达字符。
zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。

3、我说中文,身处中华人民共和国台湾省,使用国标Big5字符集来表达字符。
zh_TW.BIG5=中文_台湾.大五码字符集

4、我说英文,身处大不列颠,使用ISO-8859-1字符集来表达字符。
en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集

5、我说德语,身处德国,使用UTF-8字符集,习惯了欧洲风格。
de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正

注意不是de_DE@euro.UTF-8,所以完全的locale表达方式是
[语言[_地域][.字符集] [@修正值]

生成的locale放在/usr/lib/locale/目录中,并且每个locale都对应一个文件夹,也就是说创建了de_DE@euro.UTF-8 locale之后,就生成/usr/lib/locale/de_DE@euro.UTF-8/目录,里面是具体的每个locale的内容。

五、怎样去自定义locale
在gentoo生成locale还是很容易的,首先要在USE里面加入userlocales支持,然后编辑locales.build文件,这个文件用来指示glibc生成locale文件。
很多人不明白每一个条目是什么意思。 其实根据上面的说明现在应该很明确了。

File: /etc/locales.build
en_US/ISO-8859-1
en_US.UTF-8/UTF-8

zh_CN/GB18030
zh_CN.GBK/GBK
zh_CN.GB2312/GB2312
zh_CN.UTF-8/UTF-8

上面是我的locales.build文件,依次的说明是这样的:

en_US/ISO-8859-1:生成名为en_US的locale,采用ISO-8859-1字符集,并且把这个locale作为英文_美国locale类的默认值,其实它和en_US.ISO-8859-1/ISO-8859-1没有任何区别。

en_US.UTF-8/UTF-8:生成名为en_US.UTF-8的locale,采用UTF-8字符集。

zh_CN/GB18030:生成名为zh_CN的locale,采用GB18030字符集,并且把这个locale作为中文_中国locale类的默认值,其实它和zh_CN.GB18030/GB18030没有任何区别。

zh_CN.GBK/GBK:生成名为zh_CN.GBK的locale,采用GBK字符集。
zh_CN.GB2312/GB2312:生成名为zh_CN.GB2312的locale,采用GB2312字符集。
zh_CN.UTF-8/UTF-8:生成名为zh_CN.UTF-8的locale,采用UTF-8字符集。

关于默认locale,默认locale可以简写成en_US或者zh_CN的形式,只是为了表达简单而已没有特别的意义。

Gentoo在locale定义的时候掩盖了一些东西,也就是locale的生成工具:localedef。
在编译完glibc之后你可以用这个localedef 再补充一些locale,就会更加理解locale了。具体的可以看 localedef 的manpage。

$localedef -f 字符集 -i locale定义文件 生成的locale的名称
例如
$localedef -f UTF-8 -i zh_CN zh_CN.UTF-8

上面的定义方法和在locales.build中设定zh_CN.UTF-8/UTF-8的结果是一样一样的。


六、locale的五脏六腑

刚刚生成了几个locale,但是为了让它们生效,必须告诉Linux系统使用那(几)个locale。这就需要对locale的内部机制有一点点的了解。在前面我已经提到过,locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式(LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

其中,与中文输入关系最密切的就是 LC_CTYPE, LC_CTYPE 规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。而locale定义zh_CN中最最重要的一项就是定义了汉字(Class “hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统中成为合法的有效字符,而且不论它们是用什么字符集编码的。

LC_CTYPE
% This is a copy of the "i18n" LC_CTYPE with the following modifications: - Additional classes: hanzi

copy "i18n"

class "hanzi"; /
% <U3400>..<U4DBF>;/
<U4E00>..<U9FA5>;/
<UF92C>;<UF979>;<UF995>;<UF9E7>;<UF9F1>;<UFA0C>;<UFA0D>;<UFA0E>;/
<UFA0F>;<UFA11>;<UFA13>;<UFA14>;<UFA18>;<UFA1F>;<UFA20>;<UFA21>;/
<UFA23>;<UFA24>;<UFA27>;<UFA28>;<UFA29>
END LC_CTYPE

在en_US的locale定义中,并没有定义汉字,所以汉字不是有效字符。所以如果要输入中文必须使用支持中文的locale,也就是zh_XX,如zh_CN,zh_TW,zh_HK等等。

另外非常重要的一点就是这些分类是彼此独立的,也就是说LC_CTYPE,LC_COLLATE和 LC_MESSAGES等等分类彼此之间是独立的,可以根据用户的需要设定成不同的值。这一点对很多用户是有利的,甚至是必须的。例如,我就需要一个能够输入中文的英文环境,所以我可以把LC_CTYPE设定成zh_CN.GB18030,而其他所有的项都是en_US.UTF-8。


七、怎样设定locale呢?

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:
LC_ALL>LC_*>LANG
可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。
2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。
3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值 zh_CN.UTF-8 。
4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的:
1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。
2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LC_CTYPE=zh_CN.XXXX,LANG= en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。
3、假如你高兴的话,可以把12个LC_*一一设定成你需要的值,打造一个古灵精怪的系统:
LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集);
LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统)
LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集)
罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。
4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。



2007-03-03 10:57



我的工作环境是这样的:服务器端使用Rays1.5r2,开了vncserver,桌面端使用WinXP,通过vncviewer访问服务器。

vncviewer支持server和viewer之间的剪贴板传输。但现在这项在我的环境下不管用。我猜是gnome的剪贴板管理机制的问题,如果单纯使用X环境,应该没问题。

以前使用vncviewer时有vncconfig这个命令,打开这个命令就可以激活剪贴板传输了。现在不知怎么搞的找不到这个命令了。经过查询RealVNC的maillist,找到了如下方法支持clipboard传输:

在xstartup的最后一行加入命令:

xcutsel &

这样在gnome桌面环境启动后会出现一个小小的程序,里面有3项:
1,quit
2,copy primary to 0
3,copy 0 to primary

在WinXP中复制ASCII内容后,点击3:copy 0 to primary,然后在gnome环境中点击鼠标中键,即可实现clipboard transfer。

同理,在gnome环境中复制ASCII内容后,点击2:copy primary to 0,然后就可以复制到WinXP中了。




<<   1   2  >>  Pages: ( 1/2 total )



Aprilgogo 的BLOG 

2008 11.21 Fri
      1
2345678
9101112131415
16171819202122
23242526272829
30      
«» 2008 - 11 «»


博客基本信息
用户名:Aprilgogo
等级:一星会员
威望:64
金钱:160
在线时间:1102 分钟
日志总数:33
评论数量:44
访问次数:35058
建立时间:2007-01-06

搜索BLOG文章




友情链接


 XML   RSS 2.0   WAP