23rd October 2008, 11:41 am
在某些系统下,scim-python 输入法会出现无法使用 shift 键切换中英文的情况。这种问题一般是由于 scim-bridge 引起的,一个简单的解决办法就是不是用 scim-bridge。输入命令:
sudo im-switch -c
出现以下信息:
[patrick@ubuntu:~]$ sudo im-switch -c
System wide default for zh_CN locale is marked with [+].
There are 5 alternatives which provide `xinput-zh_CN'.
Selection Alternative
-----------------------------------------------
1 /etc/X11/xinit/xinput.d/scim-pinyin
2 /etc/X11/xinit/xinput.d/ibus
* 3 /etc/X11/xinit/xinput.d/scim
4 /etc/X11/xinit/xinput.d/scim-immodule
+ 5 /etc/X11/xinit/xinput.d/scim-bridge
Press enter to keep the default[*], or type selection number: 3
选择 scim 而不是 scim-bridge,回车保存,再重新登录系统即可。
8th October 2008, 12:09 am
今天将系统从 Ubuntu 8.04 升级到 8.10 beta,基本上一切正常。只是本来在公司用得好好的网络链接,回到宿舍后却突然无法使用了。
使用 ifconfig 发现 eth0 没有从路由器上获得 IP 地址。在 /var/log/syslog 中看到系统不断地重复输出(3秒一次)
Oct 7 22:34:54 ubuntu NetworkManager: <info> disconnected by the system bus.
Oct 7 22:34:57 ubuntu NetworkManager: <WARN> nm_dbus_manager_start_service(): Could not acquire the NetworkManager service as it is already taken.
通过浏览日志发现,系统在启动的时候其实已经通过 DHCP 获得了 IP 地址,而且 Activation (eth0) Stage 的五个步骤也全部成功完成。但是随后输出一下日志
Oct 7 22:20:22 ubuntu NetworkManager: <info> (eth0): carrier now OFF (device state 8 )
Oct 7 22:20:22 ubuntu NetworkManager: <info> (eth0): device state change: 8 -> 2
Oct 7 22:20:22 ubuntu NetworkManager: <info> (eth0): deactivating device.
Oct 7 22:20:22 ubuntu NetworkManager: <info> eth0: canceled DHCP transaction, dhcp client pid 6853
不知道为什么会突然 carrier OFF。考虑到网上很多用户反映 Ubuntu 8.10 的 NetworkManager 不好用,不能排除新版本的 NetworkManager 依旧存在某些 bug。
如果需要快速恢复系统的网络链接,一个快捷的方法是编辑 /etc/network/interfaces 文件。我打开文件后发现其中内容只有 lo 的配置:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
于是为 eth0(有线链接)和 eth1(无线链接)加上配置,如下:
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
保存之后执行
sudo /etc/init.d/networking restart
即可恢复。但是这时 NetworkManager 不再管理网络链接,点击其图标会提示 device is unmanaged。
如果希望保留 NetworkManager 的特性,还可以编辑 /etc/NetworkManager/nm-system-settings.conf,将其中的
[ifupdown]
managed=false
修改成为
[ifupdown]
managed=true
即可。
29th September 2008, 11:07 pm
Mozilla 出品的软件,最大的特点就是通过 add-on 可以不断地扩展软件的功能和特性。一般来说,能够提供额外有用信息和能够使的操作更方便的 add-on 是最值得使用的。
Attachment Reminder - 用户在发送邮件的时候偶尔会忘记添加附件,却又在 email 中说到“请看附件”之类的话,如果是发生在比较正式的场合,往往难免会比较尴尬。这个 add-on 的通过扫描邮件中的关键字,在发现有可能表示有附件的文字,发送时又没有添加附件的时候,给用户提醒一下。
Country Lookup - 显示邮件发送地的地理信息。
Display Mail User Agent - 显示用户客户端的信息。
Display mailing list header - 显示在 RFC 2369 文档中定义的 header 信息。
Enigmail - 使用 OpenPGP 加密邮件或者添加数字签名。
GmailUI - 添加一些 Gmail 中的特性,比如说 j/k 键用来上下翻阅邮件。
ImportExportTools - 增强的邮件导入导出功能。
Menehy - Country Lookup 和 Display mailing list header 依赖的扩展……
Nostalgy - 为切换邮件目录、拷贝移动邮件增加快捷键,同时提供目录路径自动完成的功能。
pasteCode - 连带语法高亮信息地将代码拷贝到邮件中。
Quote Colors - 使用不同的颜色区分邮件中嵌套的引用(quote)。
Remove Duplicate Message (Alternate) - 删除重复的邮件。
Signature Switch - 可以根据收件人、新闻组、邮件列表的不同自动使用不同的签名档,支持 HTML 签名。
Stationery - 提供编辑 HTML 邮件源代码的功能。
Zindus - 自动同步本地通讯录与 Gmail 或者 Zimbra 通讯录。
最后来一张截图:
(点击查看原尺寸图片)
9th September 2008, 03:24 pm
在处理某些大文件(例如数以 G 计的文件)时,可以事先知道需要读取的数据即在文件的末尾部分(例如只需要知道文件最后大约5%的数据)。如果按照普通方法,从文件起始部分开始读取,将会花费大量时间在 IO 操作上。如果能像 *nix 的命令 tail 那样直接读取文件末尾的数据,将会大大提高处理程序的性能。在 Ruby 中,IO 类有如下三个常量用于指示从何处开始在 IO 流中搜寻数据:
SEEK_CUR:从当前位置开始
SEEK_END:从 IO 流末尾位置开始
SEEK_SET:从 IO 流起始位置开始(亦即”绝对位置“)
示例代码:
fileSize = File.size(fileName)
seeklen = ((0.05 * fileSize) * -1).to_i
file = File.open(ARGV[0)
file.seek(seeklen, IO::SEEK_END)
puts file.readlines
11th July 2008, 01:32 pm
Eclipse 社区最近发布了今年的 Eclipse 版本,代号 Ganymede。在古希腊神话中,Ganymede 本是一位特洛伊王子,一日宙斯见着 Ganymede,即因他的英俊美貌而倾心,于是将 Ganymede 诱拐到奥林匹斯山上为众神司酒。木星(英文名为 Jupiter,古罗马神话中的主神,亦即古希腊神话中的 Zeus)的一颗卫星被命名为 Ganymede,它也是目前太阳系中已知的最大的卫星。
Eclipse Ganymede 包含的项目见下图:

更多信息在这里。
29th June 2008, 12:26 am
在 Linux 服务器上,有众多命令行小工具可以用于监控服务器性能和状态。这些工具对于快速判断服务器运行情况,非常有帮助。
27th June 2008, 01:33 pm
今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法。大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的。
首先我们明确一下“继承”一词的概念,在 Java 中,继承一词的意义是有限制的。一个子类只能继承其父类的可访问的成员,并且该子类没有覆盖或者说隐藏父类中的那些可访问成员。所以,一个类的成员就是指在这个类中所声明的属性和方法,再加上从其父类继承而来的属性和方法。也就是说,子类是不能继承父类的私有成员的。
虽然子类不继承父类中的私有成员,但是在父类中生命的这些私有成员仍然是子类类型对象的一部分。因为在实例化对象的时候,只初始化在当前类中所声明的属性明显是不足够的,还需要初始化其父类中所有声明的属性。在实例化的过程中,JVM 需要为对象的类及其父类中所有定义的属性分配空间,包括父类中声明的私有成员。
所以,我们可以说:子类不能从父类继承私有成员,但是子类的对象是包括子类所不能从父类中继承的私有成员的。
27th June 2008, 01:32 pm
一般来说,通过终端连接到 Unix/Linux/BSD 服务器上运行服务器的程序,如果终端和服务器之间的连接断开的话,通过该终端启动的服务器程序也会相应的终止运行。如果想要程序在用户从服务器注销之后继续运行,我们可以使用 nohup 命令来做到这一点。通过 nohup 启动的程序,将会忽略系统的挂起(hangup)信号,也就能够使得程序会在用户注销之后依然在后台运行下去。
26th June 2008, 11:12 pm
朋友李卫公在他的 blog 中讨论了一个有关函数返回值的问题。其在文章中的初始问题,大致可以描述为:
需要编写一个函数,从 HTML 源代码中提取某个节点的文本,在提取失败的情况下,应当返回一个空字符串还是 null 值。
李卫公在文中说明了,如果在失败的情况下返回一个空字符串的话,对于该函数的调用者而言,是无法区分出该函数是从目标节点中提取到一个空字符串,还是实际上什么也没有提取到。
通常来说,一个函数所要返回的值,要么是一个数据(例如一个员工),要么是一组数据(例如所有女性员工)。 Continue reading ‘如何编写函数的返回值’ »
26th June 2008, 10:36 pm
最近有朋友问如何在文件中选择不包含诸如1900、1901、……1999字符串的行,目标文件中所有数据都是由数字字符组成。
如果使用 grep 这样的工具,只用写很一个非常简单的正则表达式就能解决问题:
grep -v '19\d\d' target_file
grep 的 -v 选项表示选择 target_file 中不匹配目标正则表达式的行。
对于诸如 Java 或者 Ruby 这样的程序设计语言,则没有提供类似的参数。我们需要直接使用正则表达式来匹配不包含以上字符串的行。解决这个问题的正则表达式如下:
^((?!19\d\d)\d)+$
其中 (?!19\d\d) 的作用是,一旦正则表达式引擎发现行内包含有符合 19\d\d 模式的数据,即判断该行不匹配此模式;如果一直没有发现符合 19\d\d 模式的数据,而且所有数据都是数字字符,则该行数据匹配此模式。这样就能选取到目标文件中所有不包含以上字符串的行。通常情况下,我们并不需要使用捕获型括号,以上表达式可以进一步修改成为:
^(?:(?!19\d\d)\d)+$
修改后的正则表达式的效率更高。
正则表达式是处理文本时的一个强有力的工具。最初的正则表达式出现于理论计算机科学的自动控制理论和形式语言理论中。如果需要学习正则表达式,倘若只是从网络上摘抄一星半点的实例或者读一些30分钟速成教程,是难以真正掌握这个强大工具的。有关正则表达式方面的最好的书籍之一应该是 Jeffery Friedl 的 Master Regular Expressions,国内既有第二版的影印版,也有余晟翻译的第三版译本。