2011年11月28日星期一

怒斥Ubuntu

先讲个故事。你闻到家里很臭,但是不知道臭味从哪里来的。最后发现是家里的保姆偷偷在墙角拉屎了。原来这位保姆有随地大小便的习惯。甚至在小区里面也喜欢随地大小便,不过小区被物业和所有业主盯着,所以保姆很少在小区干,而且拉完后自己会立刻清理掉。恶心吧?

其实这个保姆就是Ubuntu。

今天想在软件中心找个软件,考虑到英文界面下看到的评分和评论会比较多,就想把语言从中文切换回英文。可是在设置的语言支持里面改了之后,部分locale是en了,但有几个还是zh,设置语言的图标名称还是“语言支持”中文的,而不是Language Support。

试着修改/etc/default/locale,把~/.config移除,用了locale-gen --purge把其它locale都删除,还有localepurge软件,都无效。只好又在/etc下用grep -R zh_CN *来搜索了,发现/etc/environment文件里面赫然写着中文locale的环境变量:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANGUAGE="zh_CN:en"
LANG="en_US.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
我把里面几个locale的环境变量都删除,还重启了电脑,仍然无效,上面几个locale设置还是有效。真是气愤这破玩意!

我又在家目录下用grep -R zh_CN `ls -A | grep '^\.'`搜索,愤然发现.profile的最后几行:
export LANG="en_US.UTF-8"
export LANGUAGE="zh_CN:en"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
这几行删除掉后终于干净了。你妈的,都污染到.profile文件了。好吧,拉就拉吧,谁让你住我家呢,可是你他妈的能不能拉完了清理一下啊,害老子浪费一上午时间!我已经默念无数遍Fuck Ubuntu了。

/etc下面的配置文件,系统在软件安装、删除、升级的时候一般都会考虑到配置。而家目录下的设置,软件往往只管写,软件删除了这些配置也保留,当然这是对的,这是用户数据要一直留着;软件升级了也不会对应升级,如果配置文件不兼容了那就会出问题。

Ubuntu把设置直接写到.profile这么关键的文件中,而且又是locale这种重要的系统变量,如果只管写而不考虑后面的清理工作,那就太不负责了。不知道这是哪个白痴开发者干的。甚至/etc/environment都有疑问,我把中文的各种locale都删除了,这个文件里面却还留着中文的locale,需要自己去修改。

2011-11-29更新:发现~/.dmrc也被污染了,还保留着中文语言的信息。删掉还不行,要把中文的改成英文的才可以保留下来。

2011年11月27日星期日

Supertux崩溃

在CRT显示器上开Supertux直接崩溃。看到屏幕记录里面有一条警告信息说1440x900的分辨率有问题,崩溃前的最后一条是个C++头文件的错误。想到之间在液晶显示器上还是好好的呢,可能是画面分辨率导致的问题。把~/.supertux2移走后就可以进去了。但是这样我的进度就都没有了。找到~/.supertux2/config文件,里面有fullscreen_widthfullscreen_heightwindow_widthwindow_height等配置参数,把它们改成800x600的(显示器是17寸,可以支持1024x768以下的几个分辨率)后游戏就能进去了。

有不少问题,原因可能都是配置文件过老、不兼容等问题造成的。遇到问题试试移除配置文件常常还是挺管用的。

又是显示器刷新率

之前就折腾过刷新率。17寸CRT显示器的分辨率是对的:1024x768,可是刷新率是60不是85,GNOME 3的设置里面都不能直接刷新率呢,只能改分辨率。刚用Linux的时候,也有这样的问题,那时候用Modeline来指定刷新率,现在都懒得研究Modeline了,不想花时间在这个上面。

开了Supertux后崩溃退出,显示器变成800x600@85的了。我想会不会好了呢。在GNOME 3里面把分辨率改成1024x768,刷新率竟然没有变!嗯,就这样用Supertux把显示器的刷新率设置好了。

2011年11月24日星期四

Thunderbird自动归档Gmail邮件?

通过Gmail的标签看邮件,发现只有最近一两个月的邮件在Inbox里面,别的都没有这个标签,等于是被归档了:


好几个标签都有这样的问题。根据Google的帮助,检查了一下几个filter都没有设置自动归档。后来怀疑是不是Thunderbird干的,因为我同时也在Thunderbird里面用IMAP查收邮件。搜到一个碰到同样问题的哥们,但是Mozilla的人澄清了Thunderbird是不会自动归档的,帮助里面特意强调:Messages can only be archived manually, not automatically。

不管怎么说,我把Thunderbird的归档功能禁用掉(方法在此),再观察几个月看看。用的软件越多,出问题的机会就越多,付出的维护时间就会越多。还是越简单越好!

2011年11月19日星期六

坑爹的Ubuntu

最近被Ubuntu的几个地方坑了,上来抱怨一下。

用interfaces文件配置网络接口的话,开机启动要等2分钟才能进去,显示"Waiting for network configuration...",过1分钟再显示"Waiting up to 60 more seconds for network configuration..."。这是一个影响很多人的bug,而开发者竟然说这是他们设计的特性。最后我只能是用NetworkManager来启用我的无线和有线网卡。

然后帮一个朋友恢复重装Windows之后损坏的GRUB。我很久不干这个了,因为早就不这样双系统安装了。要制作一个USB启动盘。可是dd if=file.iso of=/dev/sdX做出的启动优盘不能启动,而usb-creator-gtk选了ISO文件和优盘后,创建的按钮还是灰色的。后来从官方文档了解到,制作这个优盘启动盘需要:
  • 优盘要分区
  • 第一个分区(启动分区)要格式化成FAT16或者FAT32文件系统
  • 这个分区要加载上
真是坑爹啊,学到的标准的方法在Ubuntu这里是不适用的。

做好优盘系统进去后,按照官方文档修复GRUB。推荐的Boot-Repair根本找不到GRUB的安装。又用命令行修复,可是重启后只能进入GRUB的rescue模式,而且不能加载normal模块,说文件找不到。

后来找到原因了。正常的Linux,root文件系统进去就是标准的目录,bin、usr什么的。这个朋友用了btrfs文件系统,root文件系统进去有个@目录,@目录下才是bin、usr什么的。GRUB在(hdX,Y)找不到root,在(hdX,Y)/@才能找到root,所以Boot-Repair找不到GRUB,rescue模式下也找不到模块文件。另外,官方文档说的是(hdX,Y),而我在GRUB的rescue模式下,用ls分区发现根分区是(hdX,msdosY)这样的,所以要(hdX,msdosY)/@这样指定根分区才能找到root。

修复了GRUB后搜索,发现这是11.04及其后对btrfs文件系统特有的设计。又是Ubuntu一大奇葩的特色,打破常规,让你学到的东西在Ubuntu里面再次失效。

2011年11月14日星期一

换行符引起的麻烦

用sed处理一个hosts文件,内容都是类似下面的行:
203.208.46.180 www.google.com
203.208.46.180 music.google.com
203.208.46.180 music.googleusercontent.com
203.208.46.180 music-streaming.l.google.com
203.208.46.180 large-uploads.l.google.com
IP地址和域名之间是用Tab分割的。想用sed把这个文件处理成dnsmasq的DNS记录配置内容,用如下的命令:
sed -e 's|^\(.*\)    \(.*\)$|address=/\2/\1|g'
两个引用的中间是一个TAB。期望的结果如下:
address=/www.google.com/203.208.46.180
address=/music.google.com/203.208.46.180
address=/music.googleusercontent.com/203.208.46.180
address=/music-streaming.l.google.com/203.208.46.180
address=/large-uploads.l.google.com/203.208.46.180
但实际结果出乎意料:
/203.208.46.180ogle.com
/203.208.46.180google.com
/203.208.46.180googleusercontent.com
/203.208.46.180streaming.l.google.com
/203.208.46.180uploads.l.google.com
不但IP和域名的顺序没有调换,域名前面的几个字符还被覆盖了。后来想是不是因为文件换行符的问题。用Vim打开发现果然是DOS格式的换行符。把脚本改一下就可以得到正确结果了:
sed -e 's/^M$//g' -e 's|^\(.*\) \(.*\)$|address=/\2/\1|g'
错误结果也比较好解释了。Windows下的换行符是Carriage Return + Line Feed(\r\n),Linux下的换行符是Line Feed(\n)。Carriage Return就是打字机的打印头回到行首,Line Feed是指纸出来一行,这样打印头就处在下一行的同一个位置了。sed命令中的第二组引用不但包括了域名,还包括了紧随其后、位于 \n前的\r,这样本来应该位于\2后面的/\1,现在要从\2的开头开始打印了,于是就覆盖了域名的前面几个字符。例如对第一行:
address=/www.google.com/
/203.208.46.180
把开头的address=/www.go都覆盖了,所以结果就是:
/203.208.46.180ogle.com
后面的也都要覆盖掉IP长度+1(/)的字符。