2010年12月31日星期五

折腾VPS

1)VPN
在RapidXen买的VPS,PPTP和OpenVPN的转发都有问题。就是在这个诊断方法中的第6步挂了。从客户机ping某个因特网主机,然后一切都正常,但是从该主机应答的包回不来。具体就是开VPN的情况下,ping g.cn,在VPN服务器端抓包是如下结果:
# tcpdump -n -i tun0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 96 bytes
19:56:47.576331 IP 10.8.0.10 > 203.208.39.99: ICMP echo request, id 5592, seq 18, length 64
19:56:48.576924 IP 10.8.0.10 > 203.208.39.99: ICMP echo request, id 5592, seq 19, length 64
19:56:49.576452 IP 10.8.0.10 > 203.208.39.99: ICMP echo request, id 5592, seq 20, length 64
19:56:50.575835 IP 10.8.0.10 > 203.208.39.99: ICMP echo request, id 5592, seq 21, length 64
可以看到,只有echo request却没有从g.cn的echo reply。
所有的数据包都回不来,导致VPN没法用来翻墙了。

2)VPS
在VPS的客服里面提问,他们说可能是内核有问题,让我用PV-GRUB后使用发行版的内核。用PV-GRUB可以在Xen虚拟机中使用发行版的内核,而不是Xen提供的内核。

话说RapidXen的支持实在是太烂了,管理界面改成PV-GRUB,从操作界面里面的Send shutdown signal再Start the VPS不行,要用Immediately stop VPS才能在提供的内核和PV-GRUB之间成功切换。整个Web管理应用功能非常之简陋,而对VPS的配置也没有任何文档积累,到服务商的支持IRC里面问,也半天没人说话。

最后是根据Linode的文档,用上了Ubuntu 10.04 LTS(Lucid Lynx)自带的内核。但VPN的问题仍然没有消失。没办法啊,只好用SSH了,反正SSH也比较方便。

更新:2011年1月2日。客服回复说在library里面有PV-GRUB的设置文档,让我才知道他们也有知识库,不过里面只有3篇文章。

中文输入法

为了进入GNOME自动启动中文输入法,我都是在~/.gnomerc里面添加类似如下的内容:
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
export QT4_IM_MODULE=ibus
ibus-daemon &
如果是fcitx或者SCIM,就相应做修改。
今天发现去掉这些内容,ibus也是能启动的,只要在主菜单的System->Administration->Language Support里面把Keyboard input method system设置为ibus即可。

2010年12月30日星期四

Bash的输出重定向

直接在Bash中执行
ssh -v -N -f -D 7070 user@1.2.3.4 &>out.ssh
那么stdout和stderr都被定向到了out.ssh文件中。
但是如果分像下面这样分两步(在脚本中会这么用):
SSH_COMMAND="ssh -v -N -f -D 7070 user@1.2.3.4 &>out.ssh"
$SSH_COMMAND
那么就看不到out.ssh,似乎&>out.ssh被理解为在1.2.3.4的主机上重定向。
必须这么改:

SSH_COMMAND="ssh -v -N -f -D 7070 user@1.2.3.4"
$SSH_COMMAND &>out.ssh
才能得到和交互执行一样的结果,即定向到本地文件。是什么原理呢?

Update:2/28/2011 用eval "$SSH_COMMAND"是可以的。或者放到一个函数里面再执行。

2010年12月26日星期日

GNOME没有窗口边框的问题

这个Bug有好多年了吧。就是用了Compiz,还用Emerald窗口边框的话,有时候进到GNOME里面没有窗口边框。要停用、再启用桌面特效才会出来。网上搜索了下,有的方法是把Emerald删除掉。我现在的最简单的解决方法(有点dirty),就是在GNOME的启动程序里面,加上一行命令:

emerald --replace &
这样在进入GNOME时,再强制执行一次Emerald。这么做后,目前还没有出现过窗口边框消失的问题。

SSH Tunnel不能自动启动,2

上次研究了SSH Tunnel不能自动启动的问题,没想到用了autossh后还是有问题,进入桌面后没有建立起来。于是用

ssh -v -N -D 7070 user@1.2.3.4 &>out.ssh
的命令来观察。ssh的-v参数打开详细输出,&>out.ssh把stdout和stderr都重定向到out.ssh文件。

观察发现out.ssh的如下内容:
debug1: Connecting to 1.2.3.4 [1.2.3.4] port 22.
debug1: connect to address 1.2.3.4 port 22: Network is unreachable
ssh: connect to host 1.2.3.4 port 22: Network is unreachable

如果在启动ssh命令前,加上sleep 5再试验,就发现网络可以正常连接。本文通过观察ssh的输出,再次验证了原文中的假设是正确的。

2010年12月22日星期三

同步Chromium和Firefox的书签

一般情况我是用一个浏览器的,只有出了问题才换成另一个。今年下半年,从用了多年的Firefox转到了Chromium, 为的就是Chromium快。但是最近Chromium很不靠谱,用久了会很慢,把电脑也拖很慢。而且Proxy Switchy!插件很不靠谱,明明不用翻墙的网站比如豆瓣电台,也要用代理,导致听歌都不爽。就这样换回Firefox,书签的同步是要考虑的问题。

我在Chromium里面设置了和Google同步,在Firefox里面和Chromium里面都装了Xmarks来同步书签。这样子Chromium里面有两种同步机制,如果两种同步之间本身不能同步,就会搞乱书签。在Firefox里面又会出问题。

目前总结出的如下方法,可以正确地同步。

Chromium仍然和Google同步,但是两个浏览器的Xmarks都禁用。需要从Chromium换回Firefox的时候,把Chromium里面的Xmarks启用,Xmarks同步好后再禁用,然后关闭Chromium。打开Firefox,启用Xmarks,再同步,就可以把Chromium里面的书签完美同步到Firefox了。如果再要从Firefox换回去,可类似的过程进行。

2010年12月11日星期六

GNOME小技巧——文件命名

刚发现的。按一下F2给文件命名,只选中后缀前的部分;如果再按一次F2,则选中整个文件名。很贴心啊。

2010年12月7日星期二

Vim中的^M

今天在Ubuntu下编译安装Xen,中途下载了一个给git设置代理的脚本,执行时出现下面的错误:
tux@Neverland:~/bin$ ./gitproxy
bash: ./gitproxy: /bin/sh^M: bad interpreter: No such file or directory
看起来是行末有^M,是DOS格式的文件。但是Vim不显示行末的^M,让我没注意到是DOS格式的。如果用vim -u NONE来打开文件(不读取任何vimrc文件),就会显示^M。我想一定是我vimrc里面的某行设置,导致vim不显示^M的。我到Freenode的#vim频道咨询,得到了答案:
<Fossilet> I want to find which init line causes ffs to be set.
<mgedmin> -u NONE tells vim not to look for vimrc files
<mgedmin> which line? no line
<mgedmin> I repeat myself: the mere presence of a vimrc turns off 'compatible' which in turn sets 'fileformats' to "unix,dos"
就是说只要有vimrc存在,就会把兼容模式关闭。这种情况下,在Linux平台fileformats是unix和dos,vim会自动检测unix和dos格式的文件。

我是希望Vim能够在文件中显示^M的,这样就很明显,不用运行了脚本才知道了。可以用set fileformats="unix"来关闭对DOS格式文件的自动检测,这样^M就原样显示了。不过没有必要的,如果打开的是DOS格式文件,Vim窗口最下面的状态栏会显示[DOS]的 。

2010年11月26日星期五

VirtualBox的NAT,2

实现了VirtualBox虚拟机通过宿主机的NAT。具体方法见这里。文章中的方法已经自动设置了SNAT,这样在虚拟机里面就可以连接互联网了。

如果要让互联网的主机连接到虚拟机的服务,还需要配置DNAT。比如要让互联网访问虚拟机上的HTTP服务,那么只需在宿主机添加如下iptables规则(前提是在宿主机和虚拟机上都没有别的规则阻碍这一条的生效):
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.2 --sport 1024:65535 --dport 80 -j DNAT --to 172.16.0.209
192.168.1.2是宿主机的IP地址(这个地址通过家用路由器连接互联网),172.16.0.209是虚拟机的IP地址。

实际演示案例中,宿主机是Ubuntu 10.10,开了Apache。虚拟机是Fedora 11,开了nginx。注意Fedora默认的iptables规则拒绝了大部分连接,需要清除掉。在配置上述DNAT规则前,我们在浏览器里面连接到的是宿主机Ubuntu下的Apache。

在配置了上述DNAT规则之后,我们连接上的是虚拟机Fedora下的nginx。

上面的IP地址125.33.200.186是我们宿主机的因特网IP地址,当然也可以用192.168.1.2测试,这样做是为了演示从外面的机器上用因特网地址访问也是可以看到DNAT后的效果的。

2010年11月24日星期三

VirtualBox的NAT,1

VirtualBox (3.2.8)的NAT网络模式在手册里面是这么描述的:
A virtual machine with NAT enabled acts much like a real computer that connects to the Internet through a router. The "router", in this case, is the VirtualBox networking engine, which maps traffic from and to the virtual machine transparently.
这个神秘的NAT engine,是在宿主系统看不到的。而我更希望虚拟机是通过宿主系统的网卡来实现NAT的,这样可以用来模拟测试真实的NAT环境。

SSH Tunnel不能自动启动

我在GNOME的Startup Application里面添加了一个启动SSH隧道的脚本,内容只有一行建立隧道的SSH命令。以前都可以自动启动,最近两台电脑上都不能自动启动了,进去桌面后没有隧道,要手动执行一遍才可以。

我在启动脚本里面添加了一行zenity --calendar,这样可以弹出一个日历对话框。注销后再进入桌面,日历能出来,说明脚本被执行了,但是隧道没有建立。试了试在SSH命令前面加一行sleep 5,让等5秒再执行脚本。注销再进入,脚本就可以自动启动了。

猜测原因是这样的。脚本立刻启动的话,NetworkMananger还没有把网络设置好,导致隧道无法成功建立。而等上几秒再建立隧道,此时网络已经连好(由路由器分配静态IP地址),隧道也可以建立了。NetworkManager确实是GNOME的启动脚本,也在Startup Application里面。如果注销了桌面,网络也就断了。

rsync同步

用rsync从笔记本往台式机同步,发现原来从台式机同步到笔记本的某些文件竟然和台式机的源文件不同,大小小于源文件。难道是之前同步过程中被人为中断导致的吗?有这么简单吗?

2010年11月13日星期六

内存大小

VPS上查看内存大小:
$ free -b
total used free shared buffers cached
Mem: 110288896 105762816 4526080 0 4096 63508480
-/+ buffers/cache: 42250240 68038656
Swap: 268427264 1064960 267362304
我一算内存大小没有他们宣称的128MB啊,128MB应该是134217728字节。

然后客服回答说:
Some memory is reserved for the kernel. In previous kernel versions, reserved memory was counted as part of the kernel free -m output, now it is not. You can verify that you have the full 128MB by reading dmesg.
后来在IRC问了问,对比了一下他们贴的结果,发现dmesg里面的这行:

[    0.000000] Memory: 107040k/131072k available (5434k kernel code, 384k absent, 23488k reserved, 5022k data, 448k init)
里面的131072k就是所有的物理内存大小,正好是128MB,因为131072/1024=128。看来客服没撒谎。

这次也发现我台式机所谓的2G内存实际是有水分的:

[    0.000000] Memory: 1781996k/1833856k available (5708k kernel code, 452k absent, 51408k reserved, 5382k data, 908k init)
1833856/1024=1790.875。只有1790MB,这和BIOS中看到的数字是一样的。这个数字其实是扣除了用于显存的内存大小256MB。

dmidecode

dmidecode这个命令可以显示硬件的一些信息,这个命令就在dmidecode这个包里面。DMI是Desktop Management Interface的缩写。

2010年11月7日星期日

APT

在服务器上安装update-notifier-common,可以在console下登录后显示可用更新,因为该包安装了/etc/update-motd.d/90-updates-available,可以动态更新MOTD(Message
Of The Day)。但是后台的更新并不是由该包实现,而是由apt包实现,该包安装了/etc/cron.daily/apt,用于检查更新。此外,unattended-upgrades是为了实现自动、无人干预下的安全更新安装。

貌似现在apt相关的软件挺多,关联也比较复杂,但是只要软件提供了清晰的文档,耐心阅读文档,就可以搞清楚都是干什么的。

2010年11月5日星期五

显卡驱动的问题

笔记本的桌面特效都可以,但是glchess、chromium-bsu、supertux2和stellerium都启动不起来。这台电脑是内置的Intel的显示芯片,但是装系统的时候,是从台式机上的dpkg
--get-selections输出中装的软件,把ATI的显卡驱动fglrx也给装上了。把这个驱动卸载掉就好了。

file:///

用URL表示本地文件的时候,我们用file协议,例如file:///usr/share/doc/。中午躺着的时候,我想到这个表示中用了3个斜杠,其实第3个斜杠不属于URL格式要求中的斜杠,而属于资源路径的一部分,即文件系统的根目录。

刚看到/etc/init.d/README里面,用了file://localhost/usr/share/doc/debian-policy/这样的URL来指向本地文件。试了一下可以,而且把localhost替换成主机名、127.0.0.1也可以。我觉得这样的表述和我们平常用的URL在格式上更统一了,应该提倡。

当我再试,把localhost替换成内网IP、IPv6地址的时候,Firefox都像前面一样,跳转到了对应的file:///地址。最后发现,不管你用什么字符串替换localhost,Firefox都跳转。这表明Firefox忽略了第2个斜杠和第3个斜杠之间的东西。Chromium也是一样,只是第2个斜杠和第3个斜杠之间的字符串不消失。w3m就不行了,貌似只有file://localhost/好使。

关于URL的用法,应该有RFC规定标准的,可是现在手头没有RFC可看。

PS:最近看了看RFC 2616,是介绍HTTP协议的。尽管只看了一部分,但也算是我真正看过的第一个RFC。发现RFC并没有我想象得那么晦涩,作为最权威的文本,应该多看看好。

2010年11月4日星期四

Nautilus预览图片的BUG

以前就出现过。在一个放图片的目录下,有的图片没有预览出来,Nautilus一直试图预览不停,导致系统资源被耗光。用top查看,发现CPU主要使用在wa(I/O waiting),Nautilus占用了很多内存。

为了搞清是哪个图片的问题,我把没有预览出来的图片,用别的程序挪出目录,直到排查出问题图片,原来是一张6M大的GIF图片,是显示全球夜晚灯光对比的一张著名的图片。这张图片预览不出来,就一直卡在这里,导致其它的图片也预览不出来。最后把这张图片删除,再把挪出去的图片挪回来就好了。

虽然是一个简单的、时有发生的问题,但有时候就直接强行关闭完事,而没有寻找线索去解决。当试着去解决的时候,总是可以学到一些东西的。

NTP服务自动启动的问题

NTP服务在桌面Linux上是不用去操心的。但是我用手机网络的时候,不想用NTP。可是在停止了NTP服务后,只要一联网就发现NTP又启动了。结果在/usr/share/doc/ntp/README.Debian.gz里面找到了答案:

If DHCP is used to configure the host, and the DHCP server sends
information about NTP servers, then this information will be used
automatically. This is done by making a copy of /etc/ntp.conf at
/var/lib/ntp/ntp.conf.dhcp, replacing the server entries with the
information provided by the DHCP server, and restarting the NTP
server.

In order for this to work, the "ntp-servers" option must be mentioned
in the "request" statement in /etc/dhcp3/dhclient.conf. This is not
the case in a default installation. A complete configuration might
look like this, for example:

request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
ntp-servers;

If you don't like using the NTP servers sent by the DHCP server, this
is also the right place to turn off this behavior.

这就是说DHCP联网的话,可能会让NTP服务器重启。不需要的话,在/etc/dhcp3/dhclient.conf里面关掉即可。

PS:最近发现软件包在/usr/share/doc下对应目录里面的README.Debian.gz文件挺有用的。因为Debian经常会对原版的软件进行修改,特别是配置方式的改动。如果养成查看这个文件的习惯,可以帮助尽快地排除问题。

2010年11月3日星期三

grep -E

grep查找bin下面的文件怎么没有呢?
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep 'bin/.+'
需要用扩展的模式(Extended Regular Expression)才行:
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep -E 'bin/.+'
/usr/bin/select-editor
/usr/bin/sensible-browser
/usr/bin/sensible-editor
/usr/bin/sensible-pager
因为在基本模式下,需要\+代替+才行:
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep 'bin/.\+'
/usr/bin/select-editor
/usr/bin/sensible-browser
/usr/bin/sensible-editor
/usr/bin/sensible-pager
grep的手册里面说了:
Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).
grep默认不是Extended模式,需要加参数-E。可是扩展模式才是习惯的模式,用的时候还得记着,或者用egrep

2010年11月2日星期二

Cron和Anacron

今天查看Ubuntu下系统的cron任务是如何执行的,发现了很纠结的事情。
系统的cron文件/etc/crontab的相关内容是这样的:

17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

第一行确保了/etc/cron.hourly中的任务可以运行,但是这个目录是空的,没任务。下面三行是说,如果/usr/sbin/anacron不能执行,才执行/ect/cron.daily、/etc/cron.weekly和/etc/cron.monthly里面的任务。但是anancron是装上的,所以后面三行中的任务是没法执行的。
然后摸索了下,看看anacron是个什么东东。它的系统任务是/etc/anacrontab,这个文件的内容如下:

1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly

看到这里才明白了,原来是通过anacron来运行cron的任务。就是说实际的任务脚本在cron的相关目录里面,而调用是要通过anacron的。难怪我要说纠结呢。
anacron的手册里面也指出了anacron的这种用法:

Anacron can be used to execute commands periodically, with a
frequency specified in days. Unlike cron(8), it does not assume that
the machine is running continuously. Hence, <b>it can be used on
machines that aren't running 24 hours a day, to control daily, weekly,
and monthly jobs that are usually controlled by cron.</b>

可以看出anacron是辅助cron任务更好地得以执行的。把anacron删除了这些任务还是可以运行,但是必须在指定的时间开机才行,而不是anacron那样能够"补上"漏掉的任务。

2010年11月1日星期一

GNOME使用技巧之一——隐藏家目录下的文件


在家目录创建.hidden文件,然后把要隐藏的目录或文件名写到.hidden文件里面,那么这些文件就在Nautilus里面隐藏了。如果该文件内容为:
bin
Templates
那么bin和Templates在Nautilus里面就看不到了,需要在View菜单里面勾上Show Hidden Files才能看到。该方法只能隐藏位于家目录下的文件。其实在Nautilus里面:'.'开头的文件是标准的隐藏文件,~结束的文件是备份文件,默认也是隐藏的。

PS:linux相关的tip,一直纠结是发在这里好还是贴在twitter上好。在twitter发过几条,但是总觉得那里信息太杂,也不好找,所以又返回这里了。

关闭笔记本电脑的触控板

笔记本的触控板移动效率低,用的时候手完全脱离键盘,很不方便,而且打字的时候碰到更烦人。我想把我的Dell Inspiron 14v笔记本电脑的触控板关掉。在Ubuntu下触控板可以用,但是在鼠标设置里面看不到。用xinput查看,原来是把触控板认成一个普通鼠标了。 用xinput工具即可关掉。

xinput原初的输出:
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                          id=14    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
把触控板暂停掉:
tux@dell:~$ xinput float 14
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
∼ PS/2 Generic Mouse                          id=14    [floating slave]
如果需要,再恢复:
tux@dell:~$ xinput reattach 14 2
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                          id=14    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
把xinput float 14放到~/.gnomerc里面就可以了。放到~/.xinitrc里面竟然不行,原因懒得找。

2010年10月5日星期二

VPN的流量转发

开的PPTP一直能连上,但是连上后一个包也收不到。知道是防火墙的路由设置有问题。这几天终于搞定了,其实和OpenVPN的文档里面介绍的方法一样,就是加上类似下面的防火墙规则:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-s后面的是VPN内网地址。还是以前任晓磊说的对,就一个MASQUERADE设置对就可以转发了。

2010年10月3日星期日

从未完成的翻译

给爸爸的电脑装了Ubuntu 10.10 beta,除gnome-games外,还安装了kdegames。kdegames默认是英文界面的,需要汉化。为此安装了KDE的systemsettings以及language-selector-qt来把kdegames的界面改为中文。为了能够看帮助,又安装了khelpcenter4,但是kdegames的帮助仍然是英文的,并没有翻译过来。

kbounce为例,帮助文件位于/usr/share/doc/kde/HTML/en/kbounce/index.docbook。在Launchpad上kbounce的翻译页面,显示的翻译进度是100%。在上面列出的翻译项中,只有软件界面的文字,并不包括帮助文件的内容。

再以GNOME下的俄罗斯方块游戏quadrapassel为例,帮助文件的中文翻译位于/usr/share/gnome/help/quadrapassel/zh_CN/quadrapassel.xml。这样游戏的界面是中文,帮助文件也进行了翻译,但只是部分的。这好歹要比kbounce要强,至少还翻译过。在Launchpad上gnome-games的翻译页面,显示的翻译进度也是100%。这仍然也只算界面,不算帮助文件。在里面搜索quadrapassel,只有4条结果,更可证明帮助文件是不算在翻译任务里面的。

看来Launchpad上面的翻译进度都是虚高,看起来是100%,其实远远没有达到完整的本地化。这也难怪你装了中文的Ubuntu,安装和使用中还要面对很多的英文。对于不懂英文的人,可以说就是半成品。

并不是说半成品不可以。维基百科的每一个语言项目可以说都是半成品,因为从来不会所有的条目都处于“完成”的状态。这就是集市模式的特色。但是Launchpad上面虚高的统计数据让人把半成品误解为成品,这样的结果是有害自由软件的发展的。

2010年10月1日星期五

显示器刷新率

我的旧电脑给了我爸爸,这几天装上了Ubuntu 10.10 beta。用惯了没有注意,一次重启到原来的Windows XP下,再回到Ubuntu,才发现Ubuntu下屏幕闪得厉害,一看刷新率是60Hz。这是Ubuntu自动启用的设置。我知道这台飞利浦17寸的显示器在1024x768下是可以上到85Hz的。可是现在的Xorg,xorg.conf已经不是必须的了。需要关闭X后,用
$ sudo Xorg -configure
来生成一个配置文件。把这个文件拷贝到/etc/X11/xorg.conf,不需要做任何改动。再进到GNOME,显示器设置里多了不少分辨率的模式,把刷新率设置成85就可以了。

2010年9月30日星期四

Google Earth问题

在Ubuntu 10.04或者10.10 beta下面安装Google Earth 5.2,界面的中文字符都是方块。按这个帖子的方法,把Earth自带的Qt的库删除掉,然后安装系统发行的对应Qt库包。

再次启动Earth中文显示好了,但是一会儿就崩溃了。结合崩溃后的stacktrace:
  1. Stacktrace from glibc:
  2. /usr/lib/googleearth/libgoogleearth_free.so(+0xd090b)[0xae590b]
  3. [0x34a400]
  4. /usr/lib/googleearth/libIGGfx.so(+0x1296c9)[0x54556c9]
  5. /usr/lib/googleearth/libIGGfx.so(FreeImage_LoadFromHandle+0xb1)[0x54432c1]
  6. /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage21platformLoadFreeImageEPNS_4Core6igFileEbPNS0_19igImageMetaDataListE+0xa1)[0x542d4b1]
  7. /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx10igOglImage12platformLoadEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x112)[0x542dbb2]
  8. /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage8loadFileEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x12d)[0x541e1ad]

这个帖子的方法,安装系统发行的libfreeimage3,然后用
env LD_PRELOAD=/usr/lib/libfreeimage3 googleearth
启动Earth就可以正常启动了。中文显示和输入也没有问题。

2010年9月10日星期五

free, top, vmstat输出结果对应关系

top和free的对应(相同颜色标记的输出是一样的):
vmstat和free的对应(相同颜色标记的输出是一样的)

2010年7月14日星期三

Xen的时间问题

发现VPS的时间很诡异,ntp同步没用,人间跑2秒,VPS里面跑3秒。这是一个Ubuntu的VPS,内核是2.6.32-5-xen-amd64,是把VPS的时区从UTC调成北京时区后出现了这样的问题。后来知道原来Xen虚拟机的时间从domU得到,反正和正常系统时间的机制不同。我发现VirtualBox里面的Plan 9和NetBSD的时间都没有和宿主系统同步,只有Fedora和Windows XP的同步了。虚拟机时间是种新情况。

找到了解决办法:echo HWCLOCKACCESS=no >>/etc/default/rcS。然后重启了。

几条经验

Network Mananger里面,有线连接的DNS要手工指定才能连接出去。

在网页,如Wikipedia,正在加载的过程中,如果在Chrome里面用Proxy Switchy从无代理切换到SSH代理,就连接不上去了,必须重新启动mysshtunnel.sh才行。经验就是停止页面刷新后再切换代理状态。

发现Blogspot不重新定向我新设置的个人域名了,纠结几天,还去Google的论坛发贴了。刚刚发现是因为Chrome的Proxy Switchy插件是自动切换模式,所以就不用代理要打开,而自然是打不开的。最近发现解决问题需要有一套正规的方法,不然就是瞎碰。

2010年7月12日星期一

运行级的问题

Virtualbox和dictd开机不能启动。查看/etc/rc?.d下面的脚本链接没有问题,但是runlevel输出的是unknown。我以为是Ubuntu里面的upstart已经没有runlevel的概念了,但是查看/usr/share/doc/upstart/README.Debian.gz,里面说了runlevel的概念没有变,不过是在/etc/init/rc-sysinit.conf里面定义的。我看这个文件里面又说,runlevel可以被/etc/inittab里面的设置覆盖,而我的inittab里面只有一行了,是IBM DB2的。我想应该是这个文件造成了runlevel无法正确设置。

以前装了个IBM DB2 Express-C 9.7,想学学,但是装好后从来没有碰过,这次顺便就删除算了。没想到这个软件安装容易卸载难,安装的时候有详细的文档,卸载却制造各种障碍还没有文档。按照一个DB2 Express-C的卸载步骤,才卸载掉。重启后运行级还是unknown。干脆把inittab文件删除掉,问题还是照旧。

在launchpad上Ubuntu的Bug 543506里面,看到可以查看/var/log/boot.log(由bootlogd记录)。我发现我的里面有这样的记录:

init: network-interface (lo) pre-start process (748) terminated with status 1
init: network-interface (lo) post-stop process (752) terminated with status 1
init: network-interface (eth0) pre-start process (757) terminated with status 1
init: network-interface (eth0) post-stop process (766) terminated with status 1
…………
init: networking main process (948) terminated with status 1

这表明network-interfaces脚本启动出错,进而导致iinit没没有进入到运行级2,也就没有启动/etc/rc2.d里面的启动脚本。
我想起最近用了Network Manager上上网,为了不让interfaces文件起作用,我把/etc/network/interfaces文件改名了。这正是导致networking启动不起来的原因。我把interfaces文件改回去后重启,系统的运行级成了2,/etc/init.d下下面的vboxdrv和dictd都都启动了。

在上面说的bug记录中,有人指出了问题所在,就是upstart需要lo网络接口启用才能运行成功,而Network Manager启用lo后不会通知upstart。如果确实如他所说,在我的情况里,lo在interfaces文件里面,我把这个文件改名后,lo自然不是由networking启动的,而是由network-manager启动,没有通知upstart,所以就造成了init不能启动的问题。

OpenVPN

今晚,阅读了OpenVPN主页上对开源版本的介绍性文档。在VPS上下载并安装了OpenVPN Access Server。这是一个闭源的OpenVPN软件,提供Web管理界面。在Access Server上配置了服务,从Windows、Ubuntu和Fedora下面都可以连接到VPN服务器,但是如果在服务端选择替换客户端的默认路由,那么三个系统下的客户端都收不到包,ping不通除VPN的因特网地址和私有网地址外的任何IP。需要下次再研究这个问题。

PS: 上面说的Fedora是在Ubuntu下用VirtualBox虚拟的。为了用它读取宿主系统上的OpenVPN客户端配置文件,需要挂载宿主硬盘;为了挂载硬盘,需要虚拟机系统支持vboxsf文件系统;为了支持vboxsf,需要在虚拟机安装VirtualBox Guest Additions;为了安装Guest Additions,需要虚拟机挂载安装ISO文件。下面用图来表示吧,还包括安装Guest Additions需要的依赖条件。

2010年6月30日星期三

网络启动脚本

在前一篇日记中,我写到“目前我发现禁用interfaces里面设置的方法只有把这个文件改名或者挪走”。我想找一个更干净的方法。我以为/etc/init.d/networking是启用网络接口的脚本,就用update-rc.d把这个脚本在/etc/rc?.d/里面的链接删掉,这样networking脚本就不会启动了。谁知下次开机后,网卡依然是按照interfaces里面的设置启用的。

我读了一下这个脚本(Ubuntu 10.04)。首先它默认是在0、6和S的运行级启动的,分别对应关机、重启和单用户模式。其次,脚本的start参数对应的命令只有如下一段:
case "$1" in
start)
/lib/init/upstart-job networking start
;;
看了一下upstart-job这个脚本,由于对Bash脚本不熟,没有仔细研读,待日后再研究。难道networking这个脚本只是用来停止网络接口的?这是瞎猜,不是结论。

2010年6月29日星期二

Network Manager

Network Manager是Ubuntu的网络连接工具,可以让桌面用户方便地管理网络连接。但是Debian系的网络连接在/etc/network/interfaces里面。Network Manager不接管interfaces文件中配置的网络接口。

2010年6月25日星期五

PPTP

在Ubuntu下用ppp连接pptpd服务器,可以连接上。但是通过修改默认路由的网关为pptp服务器端的VPN地址,大多数网站都上不去,只能打开个别网站,比如mitbbs.com,但是在Windows下连接后就可以用VPN上网了,没有问题。这个Windows是在Ubuntu下虚拟机里面的。就是说虚拟机能用VPN翻墙,但是宿主机不能。

后来用Network Manager来连接VPN,那么可以正常上网。试着仿照Network Manager连接VPN后的路由,手动修改路由,可是这样仍然有问题。就是说NM修改了路由,还修改了别的东西。不折腾了,用NM能上就行了。

2010年6月14日星期一

URL重写:从IP到主机名

Apache里面把IP从主机名重写,我是想用mod_rewrite的。搜索到国外的论坛,上面的方法不对,竟然有误导作用。在Freenode的#httpd里面一问就明白了,只用Redirect指令就可以了:

<VirtualHost *:80>
ServerName 1.2.3.4
Redirect / http://example.org/
</VirtualHost>

重点的是ServerName要写成你想重写的IP地址。

2010年6月10日星期四

URI vs URL

URI (Uniform Resource Identifier) 是标识符,URL (Uniform Resource Locator) 是定位符。URL是URI的子集,如图。没想到和这两个概念相关的RFC就有好几个。参考维基百科上URIURL的定义。

2010年6月3日星期四

Pidgin里面Gtalk的证书问题

在Pidgin里面,每次登录Gtalk都有这样的提示:

The certificate for talk.google.com could not be validated. The certificate claims to be from "gmail.com" instead. This could mean that you are not connecting to the service you believe you are.

因为证书的CN是gmail.com,但是服务器的域名却是talk.google.com,所以会有前述安全警告。在Gtalk账户的高级选项里面,勾上Force old (port 5223) SSL,然后把Connect port改成5223就不会有此警告了。因为这个端口的证书的CN和服务器域名一样,都是talk.google.com。可以在Pidgin的主菜单Tools -> Certificates里面查看证书。

升级频繁了也麻烦

Ubuntu里面每次更新了内核就很麻烦,VirtualBox和ATI的显卡驱动保证失效,这样3D程序也都不能用了。原因是它们都是依赖确定版本的内核编译内核模块的,必须再重新安装一遍才行。为了避免这样的麻烦,我已经只启用lucid和lucid-security的源,把lucid-updates也删除了,而且在Aptitude里面把linux这个包hold了,确保以后不更新内核。

Nautilus中打开终端

Nautilus有个插件叫nautilus-open-terminal,可以在右键菜单中增加打开终端的快捷方式。这个功能一度失效了。我路径中的gnome-terminal命令是在$HOME/bin下的自定义脚本,加了--geometry选项来改变默认的窗口大小。我想和这个有关系。

在GNOME的"Preferred Applications"设置里面,把终端设置为Custom,然后用'/usr/bin/gnome-terminal --geometry 80x38+0+0'这样的绝对路径,就搞定了。这样的话这里的设置就不依赖于我的脚本了。

Pidgin不能上线

Pidgin(2.6.6)的什么账号都上不去,man pidgin发现一个选项:

-f, --force-online
Try to be online even if the network is reported (by Windows, or
NetworkManager on Linux) to be unavailable.

加上-f选项后就可以上去了。或者直接把NetworkManager删除掉就好了。

2010年5月15日星期六

Flash插件的问题

Firefox里面放Flash视频没有声音,发现Flash插件还是9.0的,进入~/.mozilla/plugins/一看,libflashplayer.so竟然还是2008年的。原来以前手动安装了Flash插件,虽然Ubuntu源里面的adobe-flashplugin是最新的,但是Firefox还是优先使用家目录下的。

以后更加坚定地尽量通过APT来安装软件,即使是一些第三方的、不自由的软件,这样可以利用APT对软件进行版本跟踪和升级。

Firefox总是在离线模式下

打开Firefox(3.6.3)总是在离线模式下。因为Firefox 3里面增加了一个功能(其实是个严重的bug),如果发现没有网络就自动进入Offline mode,如果是PPP连接或者DSL连接就会出现这样的问题。增加一个设置项:network.manage-offline-status,设置为false即可。 来源:https://addons.mozilla.org/en-US/firefox/addon/13152/

改变Thunderbird的字体大小

Thunderbird里面的字体大小,从我N年前开始用到现在的3.0版,一直就很纠结。

现在的问题是,撰写邮件(我都是用纯文本的格式)时的字体太小,看起来很不舒服。其实信箱里的纯文本邮件也是一样的小字体。几经周折发现了解决办法。到菜单的Edit->Preferences->Display->Formating->Fonts->Advanced,选择Fonts for Western,Minimum font size没有设置,改一个合适的字体,如图。之后,撰写邮件时的字体就受到了最小字体限制,不会太小了。

为什么中文邮件的字体大小,不是由中文字体控制,而是Western里面的呢?搜索了Thunderbird的帮助,在这里:http://kb.mozillazine.org/Font_settings_in_Thunderbird#Settings_via_the_Options.2FPreferences_dialog,发现:

Thunderbird treats Unicode messages (for example, UTF-8) as being in the same language group as your system.

就是说,凡是Unicode(例如UTF-8)的邮件,字体设置都在系统的语言组中。我的系统的locale是en_US.utf8,所以Unicode字体的大小就都在Western里面设置了。下面的的内容属于推测了,也许有概念错误,但目前没有精力去验证。

撰写纯文本邮件时,编码自动采用locale的设置,所以是UTF-8的字体。而信箱里面的纯文本邮件呢,也是取决于系统的locale,这并不取决于邮件本身的编码(我指的是邮件的Content-Type: text/plain; charset=UTF-8这一行)。因为收件箱里面有GB2312编码的邮件,必须用GB2312的编码才能正常显示,但是如果指定了Western语言的最小字体,也是可以应用在这些邮件上的。就是说不管邮件本身的编码如何,我现在的系统下,Thunderbird显示邮件的字体都取决于Western。

2010年5月10日星期一

五一一周的成果

五一放假开始的一周内,做了如下的事情。

1. 建立了fatduck.org自签名证书,启用了Apache的安全连接。
2. 让mail.fatduck.org的网址,如果是HTTP协议的,自动跳转到HTTPS协议,确保了始终使用安全连接。而让fatduck.org的网址,如果是HTTPS协议的,则自动跳转到HTTP协议,因为并不需要安全连接。
3. 建立自签名证书,启用了Dovecot的安全连接,IMAP收信用TLS加密。既然使用了TLS加密,所以用户认证就不需要加密,用的是plain机制。
4. 启用了Postfix的SASL身份验证功能,可以用SMTP发信了。

下步需要做的事情:
1. 搞清楚一个IP可不可以设置两个HTTPS的虚拟主机。
2. 启用SMTP的加密连接。
3. 阅读《Postfix权威指南》,学习相关原理,把电邮相关的软件原理尽可能搞清楚。

2010年5月1日星期六

Bus error

升级到Ubuntu 10.04后,aMule启动不起来了,在命令行下启动看,显示:
tux@Neverland:~$ amule
Bus error
Google搜索得知是某些文件坏了,把aMule删除干净,重装一下就好了。

2010年4月29日星期四

用Python写二进制文件

参考了http://linux.byexamples.com/archives/478/python-writing-binary-file/。
binaascii可以在二进制数据和ASCII表达之间互相转换。Python程序如下:

#! /usr/bin/env python
import binascii
f = open('m', 'w')
hs='2dd31d1c'
hb=binascii.a2b_hex(hs)
f.write(hb)
f.close()

之后可以用bvi来验证写入结果。

Debian如何保证安装包的安全

Debian如何确保用户从镜像下载的文件不是被人篡改的呢?简单地说,就是Debian对Release文件(包含各个包的MD5指纹)进行签名,用户通过Debian提供的公钥来验证签名文件(Release.gpg),以确保各个包的MD5指纹和Debian提供的一致(表明其未被篡改)。详细的介绍见Debian的文档:

2010年4月23日星期五

同步时间

今天打开我个人的FreeBSD服务器,发现系统时间和标准时间差了15分钟。这个电脑很老了,而NTP我又没有弄好,所以会差这么多。其实NTP很好配置,照着FreeBSD手册里的文档,就可以配置好简易的NTP了。Linux下的NTP配置应该也差不多,查看发行版的相关文档即可。

2010年4月15日星期四

Linux下的TTS程序

我觉得TTS (Text to Speech) 可以这么用:比如你一直在电脑前看文档,需要离开一下椅子,但是还希望接着"看",可以让TTS程序来帮你把文字读出来。这样不耽误事情,还可以继续学东西。

Linux试用了两个TTS程序:espeak和festival。
Espeak:
Package: espeak
Version: 1.41.01-0ubuntu1
Description: A multi-lingual software speech synthesizer
 eSpeak is a software speech synthesizer for English, and some other
 languages.
 .
 eSpeak produces good quality English speech. It uses a different synthesis
 method from other open source text to speech (TTS) engines, and sounds quite
 different. It's perhaps not as natural or "smooth", but some find the
 articulation clearer and easier to listen to for long periods.
 .
 It can run as a command line program to speak text from a file or from stdin.
 .
 It works well as a "Talker" with the KDE text to speech system (KTTS), as an
 alternative to Festival for example. As such, it can speak text which has been
 selected into the clipboard, or directly from the Konqueror browser or the Kate
 editor.
 .
   * Includes different Voices, whose characteristics can be altered.
   * Can produce speech output as a WAV file.
   * Can translate text to phoneme codes, so it could be adapted as a front end
     for another speech synthesis engine.
   * Potential for other languages. Rudimentary (and probably humourous)
     attempts at German and Esperanto are included.
   * Compact size. The program and its data total about 350 kbytes.
   * Written in C++.
Homepage: http://espeak.sourceforge.net/
Festival:
Package: festival
Version: 1.96~beta-9ubuntu1
Description: General multi-lingual speech synthesis system
 Festival offers a full text to speech system with various APIs, as well an
 environment for development and research of speech synthesis techniques. It
 includes a Scheme-based command interpreter.
 .
 Besides research into speech synthesis, festival is useful as a stand-alone
 speech synthesis program. It is capable of producing clearly understandable
 speech from text.
Homepage: http://www.cstr.ed.ac.uk/projects/festival/

Espeak默认从stdin读入文字,然后用英语读出。Espeak支持55种语言,试了试英语、法语,还有普通话,挺好玩的,停顿很自然。
Festival貌似用到了Lisp语言,默认进入交互模式,用
festival> (SayText "linux is great")
或者
festival> (tts "/home/tux/ss" nil)
用文本文件作为参数读出来。
Festival要安装festvox开头的包,才能有语音出来。

用Python计算日期

经常会碰到这样的问题:比如我的一个水木社区的账号生命力还有281天,由于生命力是一天减一,所以281天后我不上线这个账号生命力就会变成零,账号会死掉。那么今天后的281天后是哪天呢?用Python可以非常方便地计算出来:

In [1]: import datetime
In [2]: datetime.date.today() + datetime.timedelta(281)
Out[2]: datetime.date(2011, 1, 21)

就是说281天后是2011年1月21日。

(2011年9月20日更新)如果要计算两个日期之间的天数,可以:
>>> datetime.date.today()-datetime.date(2010,12,19)
datetime.timedelta(275)
就是说从2010年12月19日到“今天”过了275天。

2010年4月12日星期一

垃圾箱中的wave

打开Google Wave的垃圾箱,发现里面一个已经被我删除的wave,十几天前被对方回复了,显示未读,但是一直还是在垃圾箱里面。我觉得这个算是一个严重的Bug了,对方都回复了,即使原本在垃圾箱里面,也应该放到收件箱里面。我又用Gmail试验了一下,一个会话如果被删除,又得到回复,那么回复会进入收件箱,而不是垃圾箱。

因为电邮是一封一封的,虽然有线索,但是每封邮件都可以单独处理。但是wave的回复和原文都始终是一个wave,目前的状态下不是分开的。所以如果有了新的回复,在不拆开这个wave的前提下,要么把垃圾箱里面的wave再挪回收件箱,要么就在垃圾箱里面接收对该wave的更新了。

对这个问题,Google还需要提供一个完善的解决办法。

虚拟机崩溃

我以前总是对VirtualBox的虚拟机不放心。因为每个虚拟的系统,在主系统上就对应一个巨大的映像文件VDI文件。如果这一个文件出点问题,整个系统就完蛋了。相比每个文件也都是单独的话,可靠性就不高了。这只是我的一个假想,但是昨晚的事情证明了这样的文件确实不可靠。

软件提供的功能,我总是喜欢去折腾。我的VB里面装了个Windows XP。我在Linux下没法和我爸爸视频聊天,因为他没有Skype,而Gtalk在Linux下又不支持视频聊天。为了支持USB,我已经把开源版的VB换成了不开源的版本。我在XP的Chrome里面,登录Gmail,打开视频聊天,能看到自己和对方的视频,也能听到声音。嗯,还不错。可是突然一下整个虚拟XP的窗口就关了,这应该不能算是Windows崩溃,而是VirtualBox崩溃了(但主窗口还在)。又试一次,结果整个Ubuntu桌面死机了。这样玩,破坏力太大了。只能强行重启电脑了。但是杯具还在后面。

重启再打开VB,XP虚拟机就进不去了。启动条滚动几下后,就蓝屏自动重启。这样多次都没法进去,只好在虚拟机里面挂载XP的安装盘,想修复一下。进入XP安装盘的修复模式,要求输入管理员密码。这个我都不知道,连密码都没有,哪里来管理员密码。还打算去找个找回密码的软件呢,再重启从硬盘启动,发现系统竟然可以进去了。登录前自动运行了磁盘检查,看起来磁盘错误很多,修复了很多问题。终于可以进去了,不用再为一个虚拟机去折腾了。

虚拟机崩溃的原因已经很清楚了,就是Ubuntu死机的时候,我强行重启,XP的VDI文件没有Sync到硬盘上,导致组成整个系统的单一文件不完整,后果自然很严重了。其实,当时很可能Linux内核本身并没有死掉,我应该按下ALT+SysRq+S键,Sync所有的文件,然后再重启,这样就可以比较安全地重启系统,不至于让虚拟系统崩溃了。

现在VPS很流行,这样如果发生类似上面的意外,后果岂不是会比较严重呢?VMWARE的虚拟机也是一个映像文件。需要赶紧研究一下Xen,看看Xen里面是怎么弄的。

2010年3月25日星期四

ls高亮颜色

发现有个目录的文件,用ls来显示的时候,背景色是高亮的,但这些文件权限也是正常的,怎么会突出显示呢。经过研究发现,这些文件的硬链接数目都是2。
用下面的Bash命令,显示出的就是硬链接数为2的文件,正好是显示高亮的文件。
tux@Neverland:/usr/share/zoneinfo/Asia$ for file in $(ls -1); do if test $(stat --printf %h $file) -eq 2 ; then echo $file; fi; done
Ashgabat
Ashkhabad
Calcutta
Chongqing
Chungking
Dacca
Dhaka
Ho_Chi_Minh
Jerusalem
Kathmandu
Katmandu
Kolkata
Macao
Macau
Makassar
Saigon
Tel_Aviv
Thimbu
Thimphu
Ujung_Pandang
Ulaanbaatar
Ulan_Bator
初告诉某人时,他说ls没这么聪明吧。看来ls其实还挺聪明的。

2010年3月24日星期三

升级的问题

Ubuntu几乎一升级就出问题。我这里面只有karmic-security和karmic-updates,今天升级了一下,再次开机ATI的显卡驱动就失效了,屏幕分辨率不对。只好重装了一下驱动,注销一遍好了。希望Ubuntu能够弄稳定点,别老升级就出问题。要是版本的升级,那基本不要指望不出问题。

2010年3月23日星期二

画个圈就这么难吗?

想在图上画个红圈。GIMP没有这种工具,记得有个叫Gpaint的,装了后发现这个东东连撤销功能都没有。于是再安装Inkscape(还好Linux下装软件很方便),可这个画出来的圈不透明。研究半天终于搞清楚怎么改变填充颜色了,就是要选中圆圈后,在菜单Objects -> Fill and Stroke里面。真难用啊。