Archive for the ‘Linux’ Category

Linux World 2007 @ ZJU

Sunday, December 9th, 2007

今天是 Linux World 2007 @ ZJU 系列活动的第二场,嗯,我也作为主讲人之一。今天的主题是 Emacs 和 Vim ,三个主讲人,step 和我讲 Emacs 、Rhythm 讲 Vim 。我本来是准备了两套资料,如果气氛还好就讲“Emacs 生存指南”;如果场面不够活跃的话我就退出精心准备的秘密武器了——各种各样关于 Emacs 的趣闻。

最后还是选择了后者,虽然还是有些紧张,不过我想这次讲座有进步,比上次好了。至少场下都笑了,我的目的就达到了,因为 Emacs 的基础知识的话,step 在前面都讲得差不多了。总之大概还是比较成功的一次讲座了:上次 MSTC 的 “Without IDE” 的讲座,回来以后大家都安慰我,叫我加油;但这次还是许多人赞的,而且很多人觉得很有趣。但是始终是不能完全成功吧,其实那根本是不可能达到的。讲座只有那么短的时间,不可能各个层次的人都照顾到,所以最多只能照顾到大多数人了。 ;)

我把我的资料附在这里,其中 Funny.Emacs.org 就是我今天用的内容了。如果你是比较新版的 Emacs ,应该内置了 org-mode 的支持(否则可能需要自己去下载这个插件),看起来会比较方便,特别是里面一些超链接是直接可以点击的。

org-mode 中打开链接

Thursday, November 29th, 2007

最近在准备在下次 Linux World 2007 @ ZJU 讲座的 Presentation ,其中有一个 video ,想在 org-mode 里面直接打开。org-mode 处理链接的能力还是比较强的,按 C-c C-o 打开链接

  • 如果是文件内部链接的话,它会直接跳到那里。
  • 如果是普通文本文件,会直接用 Emacs 新开一个 buffer 打开。
  • 其他各种类型的文件都会用合适的程序打开。例如我在 Debian 里装了 xloadimage ,它会用这个程序来打开图片。

不过当我打开 video 的时候它选择了 gmplayer ,而不是 mplayer 。我自己不太喜欢 gmplayer ,想换成 mplayer 。其实要定制也很方便,只要修改 org-file-apps 变量即可。可是我并没有在里面看到 gmplayer 的字样,所以对其处理办法有些好奇,决定一探。

Read the rest of this page »

解决 Putty 右边 Alt 不好使的问题

Wednesday, October 17th, 2007

这个问题也算是困扰了我很久的问题了。就是在 Putty 里面右边的 Alt 键似乎并不是起到 Alt 的作用。 Emacs 用户应该很快就能发觉这个问题,konsole.png如果你习惯用右边的 Alt 来按 M-x 的话,就会发现根本不起作用。

在 Shell 里面也是一样的,比如本来 Alt+f 可以把光标向前移动一个单词,可是右边的 Alt 无法使用,就没法按了 (当然对喜欢用单手来按两个键的朋友这不是问题了) 。我很久以前就曾经努力寻找过解决方案,不过似乎并没有可以解决问题的方法。我也不清楚 Putty 把右边的 Alt 键当作一个什么键发送过去了。

不过我最近突然发现这个问题可以从另外的途径来解决,就是对 Putty 进行欺骗,让它接收到的 Alt 键都是左边 Alt 。Windows 本身是支持键盘映射的,比如 CtrlCaps Lock 交换之类的,都可以通过编辑注册表来实现。当然注册表里面是二进制值,是完全不可读的。不过有一个叫做 Sharpkeys 的工具提供了一个方便的界面来帮助我们完成这个任务。你只要按下想要映射的键,它就能帮助你生成合适的二进制值写入到注册表里面去。

当然,如果你不想在全局范围内把右边的 Alt 映射到左边,也有解决办法:我在介绍 Jump or Exec 的那篇 Blog 中提到了一个叫做 AutoHotkey 的小软件。它能够实现键盘映射,并且可以只在某个特定的窗口上映射。

打开 AutoHotkey ,在通知区域的图标上右键单击会出来一个菜单,选择里面的 “Window Spy”,然后点击 Putty 的窗口,就可以看到用于标识 Putty 窗口的类为 “ahk_class PuTTY” 了。脚本里面便可以这样写:

#IfWinActive ahk_class PuTTY
RAlt::LAlt
#IfWinActive

然后重新加载一下脚本,是不是 OK 了?这个工具还有很多用处,比如,gVim 发烧友可能会希望在 gVim 的窗口里把 Caps Lock 映射为 ESC 键,因为在全局范围内映射的话,会经常不小心按到,把一些窗口给关掉了。

在 Windows 下搭建 GNU/Linux 环境

Tuesday, October 16th, 2007

虽然 Linux 与 Windows 之争几乎从来就没有停止过,不过无疑两者是各有千秋的。所以让两者共存一直是个比较诱人的想法。方法有许多种:debian.png

  • 双系统。这样没有哪个系统是跑在虚拟机里面的,所以都能发挥自己的全部性能,只是两个系统之间切换太麻烦,基本上没有什么交互。
  • Linux 下用 wine 来运行 Windows 程序。不少 windows 下的程序都能跑起来吧,但是目前并不是那么完美,而且 wine 的开发者并没有 Windows 的源代码,所以从理论上来说有些程序运行成功或者失败似乎主要是看运气了。
  • 在 Linux 下通过虚拟机模拟 Windows 。这个主要是一些 Linux geek 们使用的方法,装 Windows 几乎是处于无奈,要跑一些 Windows 程序,比如要用 QQ 或者是浏览学校老师的幻灯片之类的。用虚拟机比用 wine 跑成功率要高一些,因为对于程序来说,这下它们是在一个“真正的” Windows 里面运行了。当然对系统配置的要求就更高了。
  • 使用 coLinux 在 windows 下运行 Linux 。应当是一个相当不错的解决方案了,它与普通的虚拟机不同的是,它直接建立在硬件层次之上,而普通的虚拟机通常是建立在宿主操作系统的层面上,所以它的执行效率会更高一些。
  • 使用 Vmware 在 Windows 下虚拟 Linux 。这个在理论上来说也是相当合适的一种解决方案了,Windows 对原生硬件驱动支持好,图形性能高,适合做宿主系统,而虚拟机里的 Linux 也只需要安装一个文本界面便可以发挥出它的强大之处了。只是 Windows 系统容易中病毒啊、流氓软件之类的,也得小心使用才能做好宿主啊。
  • 使用 cygwin 在 windows 下模拟 Unix 环境。这个解决方案的优点是和原本的系统结合得很紧密,虽然不像 wine 那样直接可以执行原来的二进制程序,而是要重新编译过,但是同样是直接跑在本地系统里面的,所有的程序就和本地程序无异了。只是由于 Windows 和 Linux 本身的差异,并不是所有的方面都能模拟出来,所以并不是所有的程序都能很好地运行起来。

而如果专注于在 Windows 下能有一个顺手的 Linux 环境的话,便主要是后面三种选择了。不知道将来会不会出现像 wine 那样的在 Windows 下直接运行 Linux 程序的模拟器,不过 Linux 下的程序大多没有扩展名,如果每次都要输入 wine ls 的话,真的要疯掉了,哈哈!

回归正题,在剩下的三种选择中,coLinux 和 Vmware 是很类似的解决方案,而 cygwin 则是着眼于另外的应用。按理说 coLinux 应当比 Vmware 更高效一些,但是目前配置还是有些麻烦,如果机器配置稍微好一点,其实 Vmware 也是很高效的,所以我选择了后者。下面我就来详细介绍一下如何用 Vmware 和 cygwin 来搭建一个舒适的 GNU/Linux 环境。

Read the rest of this page »

My new screenrc

Sunday, October 14th, 2007

GNU Screen 是一款终端下的必备工具,我曾经在自己的 Wiki 页介绍过它。最近我又修改了一下配置文件,让底部的“标题”栏居中显示,并选了更漂亮的颜色,如下图所示:

screen.png

不过 Screen 很多默认配置就比较好用了,所以说整个配置文件还是很短的,这是我目前的配置文件:

startup_message off
vbell off
defscrollback 512
 
caption always "%{=u kC} %= %-w%L>%{=b G}[:%n %t:]%{-}%52<%+w %L="
escape ^L^L
 
deflogin off
# default shell is zsh
defshell /usr/bin/zsh
# default starting dir is ~
chdir

Cool Font for your Virtual Terminal

Thursday, September 27th, 2007

Terminus 是一种很不错的终端字体,如果要长时间在终端前工作的话,这是一个不错的选择。在 Debian 里面有 xfonts-terminusconsole-terminus 两个包,分别适用于 X 下的终端模拟器以及真实的 Virtual Terminal 。

我本来是很少适用 Virtual Terminal 的,不过 galilette 在我关于 Emacs Multi-tty 的那篇 Blog 中提到了 terminus 用于 VT 的事情,我也决定试一试。

其实对 VT 的东西非常不熟,因为我接触 Linux 的时候它的桌面应用已经做得非常不错了,除非系统崩溃或者紧急事态,基本上不用 VT :) 。不过没关系,Google 一下总能找到资料。

第一步当然是要安装字体包了:

sudo aptitude install console-terminus

然后 Ctrl+Alt+F1 切换到 VT 去试一试:

consolechars -f Uni3-Terminus16.psf

怎么样?是不是变得很漂亮呢?那要如何让它启动的时候就这么漂亮呢?参考一下自带的文档 /usr/share/doc/console-terminus/README.Debian.gz 的方法,可以在 /etc/console-tools/config 里面写上:

SCREEN_FONT=Uni3-Terminus16.psf

下次重新启动的时候就能看到默认字体变为 Terminus 了。

ImageMagick Tips: Shadow your picture

Tuesday, September 18th, 2007


ImageMagick 是一个非常强大的图像处理工具集合,并且有丰富的命令行借口,可以使用脚本让许多批量处理工作变得非常轻松。另外,许多编程语言都有 ImageMagick 的接口的库可以很方便地进行各种处理。

我在我的 Wiki 笔记上也记录了一些小 Tip 。正好我最近要给一个截图加上边框和阴影,我的Wiki 笔记中也有制作的方法,不过我想这样的功能其实很常用,干脆做一个脚本。其实 ImageMagick 本身虽然是非常强大灵活,但是每次实用都输入一长串命令确实是比较麻烦,把自己最常用的功能包装成脚本就很方便了。

添加阴影非常简单:

convert $1 \( +clone -background black -shadow 60x4+4+4 \) +swap \
    -background none -mosaic $1

如果要做成照片的那种效果,添加一个边框再加上阴影,也很方便:

convert $1 -bordercolor white -border 6 \
    -bordercolor grey60 -border 1 \
    \( +clone -background black -shadow 60x4+4+4 \) +swap \
    -background none -mosaic $1

或者再旋转个 30 度:

convert $1 -bordercolor white -border 6 \
    -bordercolor grey60 -border 1 \
    \( +clone -background black -shadow 60x4+4+4 \) +swap \
    -background none -mosaic -rotate 30 $1

三个脚本的效果分别如下所示:

Overflow in xl2tpd

Tuesday, September 11th, 2007

今天 VPN 突然连不上了,到终端启动 xl2tpd ,发现启动报错,说是无法读取配置文件:

$ sudo xl2tpd -D
xl2tpd[4344]: parse_config: line 13: data 'l parameters:' occurs with no context
xl2tpd[4344]: init: Unable to load config file

真是奇怪,我打开 /etc/xl2tpd/xl2tpd.conf 看了一下,十三行好好的嘛,只是注释而已。我甚至怀疑它打开的是什么文件,于是用 strace 跟踪了一下:

$ sudo strace xl2tpd -D
execve("/usr/sbin/xl2tpd", ["xl2tpd", "-D"], [/* 14 vars */]) = 0
brk(0)                                  = 0x8063000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fd9000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=76622, ...}) = 0
mmap2(NULL, 76622, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fc6000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\\177ELF\\1\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0\\3\\0\\1\\0\\0\\0\\260a\\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1336100, ...}) = 0
mmap2(NULL, 1340944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e7e000
mmap2(0xb7fc0000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x142) = 0xb7fc0000
mmap2(0xb7fc3000, 9744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fc3000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e7d000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e7d6b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fc0000, 4096, PROT_READ)   = 0
munmap(0xb7fc6000, 76622)               = 0
time(NULL)                              = 1189503420
brk(0)                                  = 0x8063000
brk(0x8084000)                          = 0x8084000
open("/etc/xl2tpd/xl2tpd.conf", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=5749, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fd8000
read(3, ";\n; Sample l2tpd configuration f"..., 1024) = 1024
getpid()                                = 4346
write(2, "xl2tpd[4346]: parse_config: line"..., 81xl2tpd[4346]: parse_config: line 13: data 'l parameters:' occurs with no context
) = 81
close(3)                                = 0
munmap(0xb7fd8000, 4096)                = 0
write(2, "xl2tpd[4346]: init: Unable to lo"..., 47xl2tpd[4346]: init: Unable to load config file
) = 47
exit_group(1)                           = ?
Process 4346 detached

可以看到它打开的确实是

/etc/xl2tpd/xl2tpd.conf

。半天都摸不着头脑,只好去 Google ,搜索出来唯一有点用的只有 l2tpd 的源码的 lxr 了。l2tpd 和 xl2tpd 应该大体上差不多吧。我找到那一行打印出错的地方,大致看了一下 parse_config 这个函数,发现它是自己手工在解析 ini 的配置文件格式,并且用 fgets 来读取一行的内容,而它的一行是多少呢?

992
char buf[STRLEN];

STRLEN 的定义是 80 。再看打印出错代码的那句代码:

1150
1151
1152
                log (LOG_WARN,
                      "parse_config: line %d: data '%s' occurs with no context\n",
                      linenum, s);

s 是读取的那一行去掉注释以后的内容。于是我再去搜索配置文件,发现确实有 “l parameters”,其实是一行注释(当然,并不是它说的那样在第 13 行):

11
; [global]                             ; Global parameters:

这下一切都明了了,它用 fgets 来读取一行,读到 “Global” 的 “l” 那里为止,下一次读的时候又读了一个尾巴,当然那不是什么有效的配置,所以就报错了,还因此把报错的行号都搞错了,因为它所谓的“一行”根本不是一行嘛。把那些超过 80 个字符的行编辑一下就可以了。

但是我比较奇怪的是这配置文件前面的一大段注释是它安装好就有的,而且我以前用都没有问题,怎么今天有好多行都就超过 80 个字符了。我今天只是用 Emacs 打开把一个 “a” 改成 “c” 了而已。要说也只有是 Emacs 自动把 tab 变成 8 个空格了,但是也没道理啊,我以前一直都是用 Emacs 改这个文件的,太奇怪了。

不过,l2tpd 那个代码也确实太不健壮了。。。 -.-bb

Feeling lucky with Firefox

Thursday, September 6th, 2007

最近越来越多地发现经常要去一些项目的主页,这么多的主页当然记不住,然而书签也是越来越多,定位也就麻烦了。多是直接 Ctrl+K 定位到搜索栏,然后用 Google 搜索,再点第一个链接。唉,其实要是用 I’m feeling lucky 就方便多了。

我知道 Firefox 的搜索引擎是可以自己定制的,于是边去网上搜索相关的资料,无意间发现了 Firefox 的 keyword 搜索功能:就是直接在地址栏输入关键字进行搜索。它的优势在哪里呢?请看下表:

keyword 搜索 搜索栏搜索
定制搜索引擎 简单,只需要添加书签即可 比较麻烦,虽然有专门的扩展来辅助
便利程度 Ctrl+L 然后输入 lk Firefox Ctrl+K 然后输入 Firefox 并使用 Ctrl+Arrow_down 来定位到 “I’m feeling lucky” 的那个搜索引擎。按 Ctrl+Arrow_down 来一个一个地找显然不如直接输入 lk 来得方便。

总的来说,我还是更喜欢 keyword search ,当然还有一个原因就是我以前在使用 Konqueror 的时候就很喜欢它的那个功能,只是一直不知道 Firefox 原来也可以这样用的。

添加 keyword 搜索的过程非常简单,任意到一个搜索引擎,输入一个方便辨认的关键字,比如 foobar ,然后点击搜索。在搜索结果页面按 Ctrl+D 存为书签,在弹出的对话框里的 “Location” 一栏里,把刚才输入的关键字 foobar 替换为 %s ,并在 “Keyword” 一栏输入想要的关键字,例如 s ,保存。然后就可以直接在地址栏输入 “s something” 来使用刚才的搜索引擎进行搜索了。下面是来自 Youtube 的一个视频教程:

这个链接保存为一个书签,并指定关键字为 lk 的书签,就可以直接在地址栏输入 “lk Firefox” 使用 Google 的 I’m feeling lucky 功能直接到达 Firefox 的主页了。

最后献上几个小 Tip :

  • 当你在各个搜索引擎的输入框里点击右键时,会看到 Firefox 的弹出菜单里有一项 “Add a keyword for this Search…” ,想知道这是干什么的吗?赶快自己去试一试吧! ;)
  • Ctrl+L 之后发现想保留当前页面,怎么办呢?有办法!使用 Alt+Enter 在新标签中打开。
  • 是不是很喜欢 Safari 那个简洁的风格?有了 keyword 搜索,还不赶紧把自带的搜索栏去掉?再装一个 Compact Menu 2 扩展,把菜单栏也隐藏起来。就可以以假乱真啦!

Spun down disk properly

Thursday, August 16th, 2007

更新内核到 2.6.22 除了前面提到的 vmnet 编译错误的问题,还在关机的时候多出来了一条警告:

DISK MIGHT NOT BE SPUN DOWN PROPERLY. UPDATE SHUTDOWN UTILITY
For more info, visit http://linux-ata.org/shutdown.html

这是关机的最后一条信息了,一直都没有特别注意,因为信息显示出来紧接着机器就关掉了,不太来得及看清楚。今天特地记下那个链接,去那里看了一下,好像是 SATA 硬盘在关机的时候没有按照“正常”的程序关闭的问题,文中说原因是老式的 shutdown 程序没有提供对新的机制的支持,因此需要升级 shutdown 来解决这个问题。可是网站上并没有提供补丁或者是新版本的 shutdown 下载。

再搜索了一下之后发现另外一个解决办法,就是将 /etc/init.d/halt 脚本里面的参数 "-h" 替换为 "" 。我试了一下,这样确实就不再有那样的警告信息了。