Hack 和 / - 闪电演讲

作者:Kyle Rankin

任何会议中更有趣的部分之一是闪电演讲。如果您没有体验过,闪电演讲通常会邀请许多不同的演讲者,每人进行简短(5-20 分钟)的演讲。闪电演讲利用了这样一个事实:演讲者通常有一个有趣的主题要介绍,但该主题不足以填满一个小时的时间段。因此,闪电演讲将这些演讲者一个接一个地安排在同一时间段内。由于信息的多样性和闪电演讲的快节奏性质,它们可能非常informative,有趣且绝对有趣。

当我在考虑本月专栏要涵盖什么主题时,我意识到我有很多不同的 hacks 想要提及,但没有一个可以真正填满整个专栏。本着闪电演讲的精神,我决定将所有这些 hacks 以真正的快节奏方式放在一起。

将窗口移动到其默认位置

在 2008 年 3 月号的 Linux Journal 中,我介绍了 wmctrl 工具,并讨论了如何使用它从命令行移动、调整大小、着色和执行各种窗口管理任务。我还介绍了一些我编写并绑定到按键的脚本,用于调整大小和着色我桌面上的几个不同窗口。在那篇文章的结尾附近,我提到

我的下一个项目是创建一个“重置”脚本,将我所有桌面上的所有窗口移动到精确的位置和大小,以防它们都被移动和调整大小。当然,我可以手动完成所有这些操作,但那样我就会错过这个自动化的大好机会。

在我写完之后不久,我就完成了我的重置脚本。此脚本从一个桌面到另一个桌面(或者因为我使用 Compiz,从一个视口到另一个视口)并按照我的规范移动和调整窗口大小。我添加了注释来解释特定的部分

#!/bin/sh

# First save my current viewport so I can return 
# to it after I'm done
SAVED_VP=`wmctrl -d | perl -ne '/VP: (\d+,\d+)/; print $1;'`

# Then, move to the first viewport (at 0,0). Because it 
# can take a second or two for this to take effect, 
# I've opted to create a while loop that will
# continue to attempt to switch to that viewport 
# until it detects it is actually there.
VP=0,0
while [ `wmctrl -d | perl -ne '/VP: (\d+,\d+)/; 
 ↪print $1;'` != $VP ];
do
    wmctrl -o $VP
done

# Now resize, move, and change state of particular 
# windows (see the wmctrl man page, or my wmctrl 
# column for more information on the options).
wmctrl -r 'Eterm Main 1' -e '0,0,0,645,420'
wmctrl -r 'Irssi Term' -e '0,469,0,810,500'
wmctrl -r 'Irssi Term' -b add,shaded
wmctrl -r 'Irssi Term' -b add,below
wmctrl -r 'gkrellm' -b add,sticky
wmctrl -r "Irssi Notify Term" -e '0,1180,550,100,230'

# I now switch to the second viewport. As my screen 
# is 1280x768, the second viewport is at 1280,0. 
# If I wasn't sure, I could switch to that viewport
# and check the output of wmctrl -d for the proper coordinates.
VP=1280,0
while [ `wmctrl -d | perl -ne '/VP: (\d+,\d+)/; 
 ↪print $1;'` != $VP ];
do
    wmctrl -o $VP
done

wmctrl -r "Mozilla Firefox" -e '0,5,0,1040,708'

# Finally I switch back to my original viewport 
# so I'm back where I started.
wmctrl -o $SAVED_VP

虽然该脚本中肯定有很多命令,但实际上编写它并没有花费很长时间。脚本的大部分只是一个接一个的 wmctrl 命令,我大部分时间都花在了实际微调每个窗口的位置和弄清楚切换视口的最佳方法上。如果您的桌面环境使用多个桌面而不是一个具有多个视口的桌面,您将使用 -s 选项来更改桌面,而不是用于视口的 -o 选项。您还需要更改 while 循环中的逻辑,使其更像

DESKTOP=1
while [ `wmctrl -d | perl -ne '/^(\d+).*?\*/; 
 ↪print $1;'` != $DESKTOP ];
do
    wmctrl -s $DESKTOP
done
切换我的显示器以进行演示

虽然我通常使用带有内置屏幕的笔记本电脑,但我经常进行演示,因此我需要在 LCD 和外部 VGA 连接器上都显示。不幸的是,我的笔记本电脑上用于在这两种状态之间切换的功能键目前在 Linux 中不起作用,因此我不得不将其放入与按键绑定配对的脚本中。

xrandr 程序在我的笔记本电脑上可以很好地用于在显示器之间切换,因此我的脚本首先检查 xrandr 的输出,以查看 VGA 端口是否已连接,如果已连接,则将其添加为显示器。否则,它会禁用 VGA。我还添加了一行来回显一些文本到 osd_cat。我安装了这个程序,以便在屏幕上获得一些输出,让我知道我的脚本选择了哪种模式。当我准备输出到投影仪时,我只需将其连接到我的笔记本电脑并运行脚本。当我完成演示后,我断开连接并再次运行脚本

#!/bin/sh

if xrandr | grep -q 'VGA connected'; then
    echo "LVDS + VGA" | osd_cat --shadow=2 --align=center 
 ↪--pos=bottom --color=green --delay=2 
 ↪--font=lucidasanstypewriter-bold-24 --offset 40 &
# choose my laptop screen's resolution by default, 
# if that fails try the auto-detected mode
    xrandr --output VGA --mode 1280x768@60 || xrandr 
 ↪--output VGA --auto
else
    echo "LVDS only" | osd_cat --shadow=2 --align=center 
 ↪--pos=bottom --color=green --delay=2 
 ↪--font=lucidasanstypewriter-bold-24 --offset 40 &
    xrandr --output VGA --off &
fi

我还创建了脚本的单独版本,该版本跨越两个屏幕而不是镜像。我选择在当前屏幕下方跨越(使用 --below LVDS 选项),但大多数人可能更喜欢使用 --right-of 或 --left-of

#!/bin/sh

if xrandr | grep -q 'VGA connected'; then
    echo "LVDS + VGA span" | osd_cat --shadow=2 --align=center 
 ↪--pos=bottom --color=green --delay=2 
 ↪--font=lucidasanstypewriter-bold-24 --offset 40 &
    xrandr --output VGA --mode 1280x768@60 --below LVDS || xrandr 
 ↪--output
VGA --below LVDS --auto
else
    echo "LVDS only" | osd_cat --shadow=2 --align=center 
 ↪--pos=bottom --color=green --delay=2 
 ↪--font=lucidasanstypewriter-bold-24 --offset 40 &
    xrandr --output VGA --off &
fi
有什么区别?

最近,我正在处理重新制作的 Knoppix DVD,我已将其发送给了一些人。在我发送了完整的重新制作 DVD 后,我发现我需要更改 DVD 上的一些小文件。即使我的家庭 DSL 速度非常快,但上传速度仍然很慢,以至于花费了一夜的时间来传输 3GB+ 的 DVD 映像。我不想再次经历那一切,尤其是我只对 DVD 进行了微小的更改。

我知道存在二进制差异工具,但我发现并非所有工具都是平等的。一些二进制差异工具需要足够的 RAM 来存储文件的多个副本,这肯定不适用于 3GB 映像。幸运的是,我找到了 rdiff,这是一款适用于大型文件且不需要大量 RAM 的工具。更好的是,rdiff 适用于任何二进制文件——您可以将其用于从 DVD 映像到虚拟磁盘到多媒体文件的任何大型二进制文件。

rdiff 通过三个阶段的过程工作。在此示例中,我有两个文件,old.iso 和 new.iso,它们彼此之间只有细微的差异。对于第一阶段,您创建一个签名文件,rdiff 使用该文件来表示您的原始文件

$ rdiff signature old.iso old.signature

现在您有了签名文件,请将其与 rdiff 一起使用以创建增量文件,该文件表示旧文件和新文件之间的差异

$ rdiff delta old.signature new.iso new.delta

这个 new.delta 文件现在是任何人将 old.iso 转换为 new.iso 所需的全部文件。对我来说,这个文件最终大约为 150Kb,因为我只做了一些更改。增量文件比完整映像更容易发送。如果您想测试增量文件是否有效,请首先创建 new.iso 的 md5sum

$ md5sum new.iso

然后,使用 rdiff 使用增量修补旧文件以创建新文件。这是每个拥有原始文件的人都将使用的相同命令

$ rdiff patch odl.iso new.delta newtest.iso

现在您有了 newtest.iso,创建该文件的 md5sum 并将其与您为 new.iso 创建的文件进行比较

$ md5sum newtest.iso

正如我之前所说,这种方法不仅适用于 ISO,也适用于任何大小的二进制文件。值得注意的是,rdiff 使用与 rsync 使用的相同的二进制差异方法。 rdiff 只是让您可以在命令行上逐步使用该算法。

Kyle Rankin 是旧金山湾区的高级系统管理员,也是许多书籍的作者,包括 O'Reilly Media 出版的 Knoppix HacksUbuntu Hacks。他目前是 North Bay Linux Users' Group 的主席。

加载 Disqus 评论