用Shell脚本实现划词翻译

Mac OS X 中有一项令人惊艳的特性—— "Services",通过它你可以对选中内容进行各种操作。比如,你可以选中一段文字,将其添加到 Evernote 中;选中一个URL,用 Safari 打开它;再比如选中一个邮件地址,将其添加到联系人中去。

Linux 中没有与之直接对应的特性。但通过编程还是可以部分模拟出 Mac OS X 中的效果。直观的思路是 : 运行一个后台进程,它在桌面环境中创建“Services" 菜单,当用户从文档中选中一段文字,并点击 "Services“菜单时,后台进程分析出可用于处理选中内容的程序,以子菜单的形式将其展示出来,用户进一步点击子菜单时,后台进程负责将剪切板中的内容传递给指定的应用程序进行进一步处理。

为了验证这个思路,我用 shell 在Gnome3桌面环境中做了一个原型。功能很简单,当用户选中文档中一个单词后,以系统通知的方式显示该单词的释义。

来张效果图,看起来蛮不错。

(..更多内容)

上帝用Lisp书写世界



I was taught assembler
in my second year of school.
It's kinda like construction work —
with a toothpick for a tool.
So when I made my senior year,
I threw my code away,
And learned the way to program
that I still prefer today.

Now, some folks on the Internet
put their faith in C++.
They swear that it's so powerful,
it's what God used for us.
And maybe it lets mortals dredge
their objects from the C.
But I think that explains
why only God can make a tree.

For God wrote in Lisp code
When he filled the leaves with green.
The fractal flowers and recursive roots:
The most lovely hack I've seen.
And when I ponder snowflakes,
never finding two the same,
I know God likes a language
with its own four-letter name.

Now, I've used a SUN under Unix,
so I've seen what C can hold.
I've surfed for Perls, found what Fortran's for,
Got that Java stuff down cold.
Though the chance that I'd write COBOL code
is a SNOBOL's chance in Hell.
And I basically hate hieroglyphs,
so I won't use APL.

Now, God must know all these languages,
and a few I haven't named.
But the Lord made sure, when each sparrow falls,
that its flesh will be reclaimed.
And the Lord could not count grains of sand
with a 32-bit word.
Who knows where we would go to
if Lisp weren't what he preferred?

And God wrote in Lisp code
Every creature great and small.
Don't search the disk drive for man.c,
When the listing's on the wall.
And when I watch the lightning burn
Unbelievers to a crisp,
I know God had six days to work,
So he wrote it all in Lisp.

Yes, God had a deadline.
So he wrote it all in Lisp.

ack:一个更好的 grep

grep 是个恪职尽守的好程序,只是有时它知道的太多了,它会报告 .svn 目录下发现1000+ 个匹配,100+ 个二进制文件内含有目标字符串,还有 ... 还有5个文件无法成功读取 ...

幸好世界上还有另外一个程序叫 ack。它可以解决程序员们的烦恼。在搜索字符串时它会跳过.svn目录,忽略二进制文件。按其作者的说法,99% 的情况下,你都不需要再碰 grep了。

事实上作者还给列出了使用 ack 的十个理由:
  1. 它快得不得了,因为它只搜索你想让它搜索的文件。
  2. 它用纯 Perl 打造,除 perl5 外再无依赖,即使在 Windows上也跑欢快。
  3. 它有个独立版本,不用非标准模块,你可以毫不畏惧的将它放到 ~/.bin 目录下。
  4. 默认就采用递归搜索
  5. 高亮搜索结果
  6. 使用真正的 Perl 正则表达式,牛X不打折。
  7. 可以使用 Perl 的特殊变量指定输出格式。比如要找出C语言程序中包含的所有头文件:
     ack --cc '#include\s+<(.*)>' --output '$1' -h
  8. 允许你指定搜索的文件类型,比如:--perl 或者 --nohtml
    你更意愿使用哪个命令?
    $ grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)
    $ ack --perl pattern
  9. 许多命令行开关与 grep 保持高度一致:
    -w 按词搜索
    -c 显示文件匹配的次数
    -l  显示文件名,而不是匹配的行
  10. 让你少键入25% 以上的字符,帮你节省大量时间。跟 grep -r 相比更能短上50%

这么好的东西,一定要和 vim 配合起来才好。记得在 .vimrc中加入这么一句:
set grepprg=ack
欲了解更多详情,可前往 ack 的官方网站 http://betterthangrep.com/

寻找延迟最小的IP地址

我们都知道使用用ping命令可以获取自己的机器与目的地址之间的延迟,但ping命令一次只能测试一个IP地址,如果手头有许多IP地址,想将它们按延迟大小进行排序,就得自己动手写脚本了。

下面是名为rankip.sh的bash脚本,实现了按延迟大小排序IP地址的功能。

#!/bin/bash

dir=/dev/shm/rank

if [ -e $dir ]; then
	rm -rf $dir
fi
mkdir $dir

while read ip
do
	if [ $ip ]; then
		ping -q -c 5 $ip > $dir/$ip &
	fi
	shift 
	# 防止同时启动过多进程
	sleep 0.1
done

wait

for ip in $(ls $dir)
do
	fullpath=$dir/$ip
	avg=$(tail -n1 $fullpath | sed 's#\(.*/\)\{4\}\(.*\)/.*/.*#\2#g')
	echo -e "${ip} \t ${avg}ms" >> $dir/result.txt
done

sort -k2n $dir/result.txt

使用方法超级很简单:

cat <file-contain-ips> | rankip.sh

PS:

对于完成如此简单的功能来说,上面的代码似乎太多了。于是我又试着将其改写了一下,这次只有一行代码。

#!/bin/bash
cat | xargs -n1 -P10 ping -q -c 5 | awk 'BEGIN{RS="PING"; FS="\n"} { print gensub(/^ (.*) \(.*$/, "\\1", 1, $1), "\t", gensub("^.*= .*/(.*)/.*/.*", "\\1", 1, $5), "ms"}' | sort -k2n

 

修复Mail Checker Plus扩展无法收取新邮件的Bug

刚发现Mail Checker Plus这个扩展时,真有那种天上星星都亮了的感觉,它极大的提高了一名Gfan的生产力。不过好景不长,突然间它就失灵了—— 邮箱收到新邮件,它装作不知道,仍显示上次收到的邮件;清空邮箱,它还是装作不知道,继续显示上次收到的邮件。

重新安装扩展,删除浏览器缓存,换用Mail Checker扩展,均不解决问题。我甚至开始怀疑Gmail 的API出问题了,而且只针对我一个人...假如唱红歌能解决问题的话,我想我一定会唱的。

经过N天等待,奇迹没有发生。我决定自己动手了。

(..更多内容)

为Micolog增加主题上传功能

Micolog俨然已成为App Engine平台上最受欢迎的博客程序了,除本身功能丰富以外,有众多的插件和主题可供选择也是吸引用户的重要方面。或许是作者较忙的的缘故,自从去年11月份发布了0.74版之后,一直没有大的更新。好在Micolog属于开源程序,每个人都可以自由地修改,重新发布。以不断完善它。

 

Google出于对性能和可伸缩性的考虑,禁止App Engine平台上的程序对所在的文件系统进行写入和修改操作。这意味着如果用户想为Micolog添加一个新的主题时不得不重新上传整个应用程序。显然这不能让人完全满意。虽然理论上还可以利用datastore来存储主题文件,但它又有容量不得超过1M的限制。图片稍微多一点的主题的就会超过这容量个限制。

(..更多内容)

巧将网页保存为PDF文件

好吧,我承认曾经一次又一次地将网页“另存为...”,以至于“文档”目录下横七竖八地躺着无数html文件和同名的文件夹,混乱不堪。自己琢磨着要是能把网页转成PDF文件,那么管理起来就方便多了。幸好在Ubuntu下是一件很容易的事,只是之前未曾留意罢了。

在遇到在想要保存的网页时,从浏览器的菜单中选择”打印“,或者直接按下”Ctrol + P",会弹出一个如下所示的打印设置对话框。

print to pdf

选择“打印到文件”这个虚拟打印机,输出格式默认为PDF,按下“打印”按钮后,系统就会把当前的网页保存为PDF文件。

(..更多内容)

数学趣题:史密斯的太太握了几次手?

史密斯先生和他太太邀请四对夫妻来参加晚会,每个人来的时候,房间里的一些人都要与别的人一些人握手。当然每个人都不会与自己的配偶握手,也不会同一个人所有两次。之后,史密斯问每个人和别人握 了几次手,他们的答案都不一样,那么史密斯的太太和别人握了几次手呢?
很多人看到这个题目的第一反应是“又是一道坑爹的题吧”。题干中都没出现与史密斯太太直接相关内容,最后却问她和人家握了几次手。似乎是条件不足,无法求解。如果你以前没有做过这个题目的话,不妨先试着做一下。
波利亚在《How to solve it》一书中指出:“解决问题的第一步是“你必须理解题目,确定未知量是什么,已知是什么,条件是什么”。也许我们不应该动快地下结论,而应再次分析一下题目,看能不能找到什么线索。

(..更多内容)

rm -rf / —— make computer faster

最近看到一张Linux常用命令简表,如下图表示,初看没啥特别的,不就是一些简单的命令么?

可是仔细看FILE COMMAND部分,居然有这么一句: rm -rf / - make  computer faster。饿的神,这个要害死新手的。不过我们倒真可以在虚拟机里试验一下,看看这个极度危险的命令有多么厉害。
(..更多内容)

一个艰难的决定:启用新域名www.igeeks.me

鉴于App Engine服务在中国被墙,本人不得不花重金(8.99美元),从万恶的资本主义国家的域名商——GoDaddy(又名狗他爹)那里,购买新域名 www.igeeks.me。在复杂的配置过程中,本人学会了很多平时没有掌握牢固的网络知识,而且磨砺了自己的意志,在此一并感谢党和国家。

尽管本人已经设置好了域名转发,不过直用 igeeks.me 访问还是会‘被’进入域名纠错系统,原因么,你懂的。如果有读者订阅了旧的RSS,请重新添加一下。偶尔有图片显示不出来,刷新一下即可。

本人深知启用新域名将给老读者带来不便,也给Google爬虫带来困惑,在此一并致歉。