信件
信件
禁止虚拟平移!
最近阅读了 2007 年 12 月刊 LJ 上的笔记本电脑购买指南后,我想告诉您文章中未提及的一些内容。任何喜欢使用虚拟屏幕分辨率的人都应该避开任何基于 Intel Graphics Media Accelerator X3100 的笔记本电脑(在笔记本电脑购买指南中提到的 Dell Inspiron 1420N 中可以找到)。不幸的是,这款芯片组非常常见,并用于许多“低端”现代笔记本电脑中。
我刚买了一台联想 Y410 来替代我用了六年多的 HP N5450,我把它当作家里的台式电脑使用。从 PIII-850 配 384MB 内存、S3 Savage 显卡和 60GB 硬盘(已升级——原装 20GB 硬盘在一年前左右坏了)升级上来,您可能会认为我会对酷睿 2 双核 1.5GHz、2GB 内存、160GB SATA 硬盘、内置双层 DVD 刻录机、802.11g 等等感到兴奋,而且只需 650 美元(扣除返利后)——如果我能拿到返利的话!但事实是,在买了联想一个半月后,我仍然在使用那台旧 HP。
这台联想电脑预装了 Vista,但当然我到家后做的第一件事就是启动 Ubuntu 7.10 CD。从 CD 启动 Live 系统后,我惊讶地发现 1280x800 的原生屏幕分辨率可以自动工作,而且我无需任何破解就能让 Intel Pro/Wireless 3945ABG 在家庭无线网络上工作。要让内置的 130 万像素摄像头工作,确实需要下载和编译 linux-uvc,但这相对来说是无痛的。声音支持有点不稳定。在 Ubuntu 7.10 下,它不能自动工作。您必须编辑 /etc/modprobe.d/alsa-base,并将 snd-hda-intel 型号设置为 fujitsu。这可以让内置扬声器工作,但耳机插孔完全不起作用(没有声音输出,并且插入耳机也不会使内置扬声器静音)。对于我预期的用途(家里的台式电脑),这没什么大不了的。
但正如我所提到的,我对这款笔记本电脑最大的问题是 X3100 和 Intel GM965 图形芯片组,或者更确切地说,是为其编写的 X.org X 服务器。我从 1994 年左右开始使用 Linux(顺便说一句,我从大约第 2 期开始订阅 LJ),这是我记得遇到的第一个不支持在大于实际屏幕分辨率的虚拟屏幕分辨率中平移的 X 服务器。通过与其他 Linux 用户交谈,我了解到这是 emacs/vi 问题之一。有些人讨厌并且从不使用虚拟屏幕。另一些人总是在有足够的显存支持时使用它。在我的旧 HP 上,我使用虚拟 1600x1200。在我的家庭和工作台式机上,我使用虚拟 2500x2048。这些虚拟分辨率允许我拥有多个终端窗口、浏览器、IM 客户端、MP3 播放器等等,所有这些都“可见”在一个屏幕上,几乎没有窗口重叠。我只需用轨迹球/触摸板平移到我想要看到的虚拟屏幕部分。
当谈论当前的笔记本电脑时,似乎没有人提到此功能的消失。经过大量的 Google 搜索后,我才找到这个帖子,其中一位 Intel X 服务器的作者明确声明,“禁止虚拟平移!” (lists.freedesktop.org/archives/xorg/2007-April/023841.html)。
对我来说,这是一个足够大的问题,以至于一旦 Xi Graphics 支持 i965GM,我将很乐意支付他们 129 美元购买功能齐全的 X 服务器。
与此同时,我将不得不使用多个工作区,并安装了 brightside,以便我可以通过将指针移出现有工作区的边缘来“平移”到相邻的工作区。这不一样,但这显然是我目前能做的最好的。
—
Jon Lewis
我们不需要臭名昭著的 Perl(在我们的 Shell 脚本中)!
好吧,Dave (Taylor) 在他 2008 年 1 月的专栏中提出了一个不可抗拒的挑战,当时他表示他无法想象仅使用 shell 的方法来计算字母的序数值,“除非付出非凡的努力”。
实际上,我找到了三种不同的方法来做到这一点,虽然 确实 花费了一定的精力来回忆起一些细节,但我认为结果方法都相当简单。我在下面介绍了它们;以下示例旨在直接替换 2008 年 1 月刊第 31 页上的这一行
ordvalue="$(echo $letter | \ perl -e '$a=getc(); print ord($a)-96' )"
解决方案 1
# Do this array initialization prior # to using "LETTERS". LETTERS=(0 {a..z}) ordvalue=1 while [ ${LETTERS[$ordvalue]} != $letter ]; do ordvalue=$(( ordvalue + 1 )) done
LETTERS 数组使用字母表中的字母进行初始化,每个字母都位于其序数位置——也就是说,a 位于 [1] 位置。while 循环只是使用 ordvalue 作为数组的索引,递增它直到它指向与所需字母匹配的数组元素。注意:使用 0 作为第一个数组元素的值是相当随意的;任何值都可以。
解决方案 2
# Do this string initialization prior # to using "LETTERS". LETTERS=0abcdefghijklmnopqrstuvwxyz FOO=${LETTERS%${letter}*} ordvalue=${#FOO}
FOO= 行匹配 LETTERS 字符串中的模式;模式是指定的字母,然后是其他任何内容。此模式从 LETTERS 字符串的末尾删除,并确定结果字符串的长度。由于此长度只是字母表中指定字母之前的字符数,因此它给出了字母的序数值。请注意,与第一个解决方案一样,LETTERS 开头的 0 是一个任意字符。只需要在字符串的开头有一个额外的字符,以便在模式匹配/字符串截断的工作方式下获得正确的字符串长度。
解决方案 3
FOO=$(eval echo {a..$letter}) ordvalue=$(( (${#FOO} + 1) / 2 ))
这个有点更神秘;FOO= 行将“a b c d e f”形式的字符串放入 FOO 中(假设在这种情况下字母是 f),下一行找到该字符串的长度,将其加 1,然后将结果除以 2。这有效地给出了字符串 abcdef 的长度,即 f 的序数值。
现在,我对 Dave 的问题是:是否有一些嵌套操作的方法,使得可以从解决方案 2 和/或 3 中消除临时变量 FOO?我似乎弄不清楚是什么方法,如果存在这样的方法!
—
Mike Henders
更正:2008 年 2 月 LJ 索引
关于 2008 年 2 月 LJ 索引上的第 12 项——我认为这是一个错别字或其他什么:9000 亿部诺基亚手机在使用中?地球上每个人 150 部?这似乎有点不对劲。
—
Keith Blackwell
Doc Searls 回复: 我的错误,Keith。是 9 亿。感谢您指出。