Tuesday, November 24, 2009

Yet Another Gmail Row Highlight 0.0.1 Released! 键盘流的Gmail利器

昨天花了点时间写了一个Greasemonkey脚本, 功能和上一篇介绍的Gmail - Add Row Highlight (以下简称GARH) 很像, 只不过GARH是当鼠标滑过时高亮, 而我的这个脚本是在使用键盘浏览邮件时高亮小箭头指示的那行. 说得有点复杂, 上图:

Yet Another Gmail Row Highlight

脚本主页是: http://userscripts.org/scripts/show/62644, 不过目前Chrome/Chromium用户还无法使用.

大家多多提意见, 提交bug和建议请到: http://code.google.com/p/fancyweb/issues/list

推荐几个Chrome/Chromium使用的扩展和Greasemonkey脚本

介绍几个我正在使用的用于Chrome/Chromium的扩展和Greasemonkey脚本, 今天Google还公布了官方扩展网站, 相信不久之后Chrome/Chromium扩展将会迅速发展.

  1. Vimlike Smooziee

    Firefox下的Vimperator是我的大爱, 像Vim一样浏览网页, 这是一件既酷又便捷的事情. Vimlike Smooziee即是Chrome/Chromium下的Vimperator, 不过现在的功能还没有后者强大, 只支持基本的操作, 如j、k、H、L、d、u、f、F、gg、G、zi、zo、zz等. 让我们期待以后的发展吧.

  2. gPDF

    有时我们不想下载PDF文件, 而是直接在浏览器里打开看看, 以前的方法是安装Adobe Reader, 这样就会在点击PDF链接时自动使用Adobe Reader在浏览器中打开. 不过Adobe Reader实在是有点庞大, 每次打开都要花很长的时间. 现在使用gPDF扩展可以使用Google Docs来打开, 速度很快, gPDF还提供有Greasemonkey脚本Firefox扩展.

  3. Folders4Gmail

    Folder4Gmail

    这是一个Greasemonkey脚本, 和下一个将要介绍的一样, 属于Firefox扩展Better Gmail 2的其中一个组件. 最新版的Chrome/Chromium已经支持安装Greasemonkey脚本了, 不过还是会发生无法使用某些脚本的杯具. Folders4Gmail脚本的作用是利用Gmail的标签建立树形列表, 如图中所示, 将标签命名为"eBook/Biography", 这样"eBook"就是"Biography"的父目录. 这个脚本对于标签分类很有用处.

  4. Gmail - Add Row Highlight

    这个脚本可以让鼠标滑过的邮件高亮显示, 在邮件很多时可以不至于眼睛看花, XD

Saturday, November 21, 2009

让IPython支持清屏

IPython是一个增强型的Python Shell, 比Python自带的那个功能更强大. 在普通Python Shell里可以通过"Ctrl+l"来清屏, 可在IPython里这个快捷键就不起作用了. 为了达到这个目的, 我们需要对IPython进行一点设置.

这篇文章中我找到了方法, 需要修改"~/.ipython/ipythonrc"文件, 可现在IPython更推荐通过修改"~/.ipython/ipy_user_conf.py"文件来设置IPython. 打开"ipy_user_conf.py"应该可以看到一些示例, 我们需要做的是调用"parse_and_bind()"函数来增加新的键绑定. 在"main()"函数中添加以下语句, 注意你的配置文件中可能已经包含了部分语句, 只需要去掉注释符号就行了.
def main():   
    ...

    import readline
    readline.parse_and_bind('\C-l: clear-screen')
不过这样还不算完成, 需要检查一下"ipythonrc"文件中是否有相互冲突的配置, 比如在我的文件里包含下面一行:
readline_parse_and_bind "\C-l": possible-completions
注释掉即可, 现在进入IPython去试试吧.

Sunday, November 15, 2009

我的吉他手

IMG_9804

晚上7点, 省体门口沸沸扬扬, 有卖荧光棒的小贩, 有倒卖门票的黄牛, 还有手拿门票准备进场的歌迷. 即使提前一个小时还是排了很长的队伍, 原来有这么多喜欢老师的人.

黑色门帘的背后透着光, 似乎掀动它就会进入一个神奇的世界. 陆陆续续有人进场, 坐得有点稀疏, 一大块白布把舞台遮住, 大家都在等待幕布开启的那一刻.

晚上8点, 所有灯光熄灭, 随即就是一阵尖叫. 我拨通了珍妮的电话, 让他听听现场的声音, 问他待会儿想要听什么歌. 刚才的那块大白布现在充当着大荧幕的作用, 在舒缓音乐的伴奏下放映着优美的动画. 当幕布上出现倒计时时, 欢呼更加猛烈了, 在幕布落下的一瞬间, 我看到了老师.

那个穿着白色长裙, 抱着吉他的歌者就是陈绮贞, 原来长裙配吉他可以这样美丽. 低调的老师在唱了几首歌之后才和大家打了一个招呼, 小兰同学说老师说话的声音很甜美.

随后是一段王雁盟的手风琴独奏, 老师再次出现已经换上了英国风格的服饰, 不用说肯定是唱《下个星期去英国》了, 唱完后, 老师说这首歌是写给她曾经的朋友的.

在老师再次下场准备的间隙开始了小虎的吉他Solo, 弹得很是绚丽, 最后还来了一段《Godfather》的经典桥段.

这时灯光亮起, 老师出现在了舞台下方, 结果一群人都冲了上去. 竟然是《等待》, 以前在电脑上听超爱这首, 终于听到现场了, 不过现场的确不是很好唱. 在老师的鼓动下, 全场观众都站起来和老师一起又唱又跳. 在唱《1234567》时, 老师走下了台, 拿着相机给大家拍照.

当老师唱《灵感》, 说这是最后一首时, 全场都安静了, 我们静静地听完了这首歌. 在舞台灯光熄灭的一霎那, 所有人开始高喊老师的名字, 我们一起喊安可, 我觉得这场演唱会的真正高潮是从安可开始的.

终于等到《旅行的意义》了, 我拨通了珍妮的电话, 把手机向外举着. 每一次老师想要离开时我们都使劲地喊, 使劲地叫, 安可声响彻全场. 就这样, 我们换来了5个安可, 我们和老师一起唱, 一起跳.

最后一首, 《会不会》, 每当唱到"我想今夜就这样吧", 我们都会接上一句"不要", 真是默契. 但在老师挥手离开之后, 我们都知道这次是真的结束了, 每个人都选择了保留这份独特的意义.

晚上11点, 演唱会结束. 我几乎从头唱到尾, 再加上喊安可, 弄得嗓子最后疼得不行, 唯一的遗憾是在介绍奇哥时没有喊出"自然卷, 我爱你", :)

我用尽所有美好梦想, 只因你, 我的吉他手.

附上昨晚的演出者:
演唱者 & 吉他手: 陈绮贞
吉他手: 钟成虎、蔡坤奇 (奇哥)
贝司手: 林心怡
键盘: 陈建骐
鼓手: 陈柏州
手风琴: 王雁盟

Friday, November 13, 2009

Blogger解封!

上次是奥运会, 这次是Obama, 看来外国友人的面子就是大啊, 我们这些公民屁都算不上. 我已经很久没有这么畅快地不用代理进入自己的博客了, 嚯嚯~ 大家快来踊跃地评论吧, 哇哈哈~

昨晚看SHE同学女友拍的WCG开幕式以及现场的东东, 那叫一个热血沸腾, 真TM想马上冲到现场去. 世上最痛苦的事情莫过于明明就在我们学校附近, 可就是没机会去亲眼看一场. 算了, 明年去美国看算了, :)

明晚是Cheer的演唱会, 从上个月就期待着了, 看网上公布的曲目, 那叫一个豪华, 几乎所有好听的歌都在里面, 外加5个encore, 真是要爽到爆, 啧啧~ 珍妮这个B有钱买CD都不来一起看, 真是的.

昨天刚刚考完试, 所以最近又有大量时间给我挥霍了. 今天看到Jetpack的邮件列表里已经有官方人士表明态度说关于Jetpack的bug都正在修复, 因此Jetpack还是很值得期待的. 附上一张Jetpack的初步发展路线图 (点击欣赏大图), 可以看到, 他们是准备完全取代现有的Firefox扩展机制的.

Jetpack Roadmap Preliminary

在"美剧达人"君文同学的影响下, 我渐渐养成了每周等待剧集更新的习惯. Heroes也持续看着, 暂时还没有传说中神作的感觉, 不过也有了点兴趣了.

最后, 请各位随时做好Blogger再次被封的准备, Twitter上已经有人建议Obama作为常驻中国大使了.

Thursday, November 12, 2009

Jetpack 0.6: 爱与恨之歌

Jetpack 0.6在10月7日隆重发布, 这一版本带来了两个激动人心的新特性: 菜单和用户配置. 意味着现在可以很方便地添加菜单, 不管是系统菜单, 还是上下文菜单. 而"用户配置"的加入也使得Jetpack扩展对用户来说拥有了可定制性. 这两个功能刚好我都需要用在SNS All in One的下一个版本里, 于是从Jetpack 0.6一发布就开始折腾, 弄了这么几天, 结果是越弄越没有信心. 第一件让人烦心的事我在[解决Jetpack 0.5以上版本在Shiretoko中出错的问题]中已经提到了, 不过我换成Firefox 3.5也就把问题解决了. 接下来才是真正恼火的事情, Jetpack 0.6的jQuery很是抽筋, 导致我以前的代码都得修改, 而且错误也是莫名其妙, 什么"context.createElement is not a function"之类的. 这里有人也遇到了同样的错误, 并且指出了怎样解决, 我就照着别人代码的样子试着改了一下我的代码, 解决了一部分问题, 但还有一部分是整死也解决不了, 这不禁让我开始怀念美好的Jetpack 0.4, 现在的bug真是多.

鉴于Jetpack现在的不稳定表现, 暂时停止SNS All in One的开发, 专心弄我的另一个小玩具, 那些新特性也只有等以后再添加了.

P.S. 今天在Jetpack的邮件列表里发现居然有人看了我的那篇[解决Jetpack 0.5以上版本在Shiretoko中出错的问题], 估计是用Google翻译了再看的.

SNS All in One 0.0.3 Released, 支持Jetpack 0.6

这个版本针对刚刚发布的Jetpack 0.6做了一点修改, 主要是因为Jetpack 0.6的API有点抽筋, 这个我会在下一篇文章中讲到. 此外还修复了一个豆瓣的链接bug.

由于Mozilla已经推出了官方的Jetpack扩展网站: Jetpack Gallery, 以前那个在Userscripts.org上的页面也就停止更新了, 全面转向新的页面: http://jetpackgallery.mozillalabs.com/jetpacks/80, 请以前安装了SNS All in One的各位先把以前的卸载了, 再到新的页面上安装. 卸载方法为: 打开"about:jetpack"页面, 在"Installed Features"标签里找到"SNS All in One", 点击"uninstall"即可. 然后升级到Jetpack 0.6, 到新的页面安装.

如果你是第一次使用SNS All in One, 推荐在安装后阅读"SNS All in One 用户指南".

更多版本信息, 请参阅"SNS All in One Release Notes".

Monday, November 9, 2009

解决Jetpack 0.5以上版本在Shiretoko中出错的问题

2009.10.11, 22:56更新:
经过测试, 发现Shiretoko中Jetpack的某些错误也存在于Firefox 3.5中, 看来这回又是Jetpack的问题了.

2009.10.9, 22:00更新:
经过实际测试之后发现用下面的方法还是不能完全修正Jetpack的错误, 比如jQuery的部分API可能失效, 暂时不推荐在Shiretoko中使用Jetpack 0.5及以上版本.

恐怕很多人还没听过Shiretoko, 一般不用Linux的话是不会察觉到Firefox其实还有一个名字. Shiretoko是Firefox的开发代号, 除了logo少了那只趴在地球上的狐狸外, 其它和Firefox没有差别. 我第一次遇见是在使用Arch的时候, 当时使用源安装的Firefox, 结果打开却叫做Shiretoko, 还以为安错了. 然后我现在使用的Ubuntu 9.04源里的Firefox 3.5也是叫做Shiretoko, 这其实没什么, 只是名字不同而已, 本质都是一样的, 可没想到这会影响Jetpack的使用.

以前我写过一篇叫做[SNS All in One在Jetpack 0.5中失效]的文章, 原因是在Jetpack 0.5中侧边栏无缘无故地消失了, 并且"about:jetpack"页面也有显示错误和链接点击错误, 如下图:
Jetpack Error
开始还以为是Mozilla官方在更新的时候出错了, 因为Jetpack 0.4都是好的. 前天Jetpack 0.6出来了, 当我更新完毕后发现错误依旧, 就开始怀疑是否仅仅是我这里有问题. 打开"Error Console", 一一排查起来.

进入"about:jetpack"页面的第一个错误是"XULApp is not defined", 指向了"file:///home/xiaogaozi/.mozilla/firefox-3.5/cavgighj.dev/extensions/jetpack@labs.mozilla.com/modules/xulapp.js Line: 127", 打开"xulapp.js", 简单分析了下代码, 发现如下的条件语句:
if (Application.name == "Firefox")
{
    XULApp = { ... };
}
else if (Application.name == "Thunderbird")
{
    XULApp = { ... };
}
看来是先判断了程序的类型后再给"XULApp"赋的值, 怪不得在我这里会出错, 因为我的是Shiretoko, 囧. 模仿前面的代码, 再写一个"else"分支, 把在"Firefox"分支中的语句都放到里面:
if (Application.name == "Firefox")
{
    /*
     * Firefox分支
     */
    XULApp = { ... };
}
else if (Application.name == "Thunderbird")
{
    XULApp = { ... };
}
else
{
    /*
     * 这里的代码与'Firefox分支'相同.
     */
    XULApp = { ... };
}
重启浏览器就一切正常了, 也终于可以享受Jetpack 0.6带来的新功能了.

P.S. 前天在发布Jetpack 0.6的同时, Mozilla也正式公布了Jetpack扩展的官方网站: Jetpack Gallery, 终于有了归属地了, 过几天会发布新的SNS All in One, 到时候也会转过去.

Monday, November 2, 2009

在Linux下操纵ARP缓存

直接输入arp命令可以查看当前ARP缓存列表:
$ arp
使用'-d'参数加上IP地址可以删除某个特定的ARP记录, 必须具有root权限:
$ sudo arp -d address
下面是用于清空ARP缓存的组合命令, 来自CU:
$ arp -n | awk '/^[1-9]/ { print "sudo arp -d "$1 }' | bash

Sunday, November 1, 2009

有趣的数学: Collatz conjecture

今天在TL上看到的讨论, 知道了这么一个猜想, 小研究了一下.

Collatz conjecture (考拉兹猜想) 又叫Kakutani's Problem (角谷猜想), 3n + 1 conjecture (3n + 1猜想). 最早由Lothar Collatz在1937年提出, 因此而得名. Collatz conjecture的主要内容是给一个大于0的数n, 如果n是偶数, 则除以2, 否则乘上3再加1, 也就是3n + 1, 如此循环反复, 最终都能等于1. 用Python代码表示如下:
def CollatzConjecture(n):
    """Collatz Conjecture"""
    t = 0
    while n != 1:
        t += 1
        if n % 2 == 0:
            n /= 2
        else:
            n = n * 3 + 1
    return t

2006年, 这个猜想被证明为recursively undecidable (递归不可判定). 下面是将2~9999代入Collatz conjecture得到的最大步骤的图形:

Collatz conjecture

看着还是有那么点规律的, 不知道什么时候才能被证明出来.