Groovy http-builder tips

最近用Groovy的HttpBuilder模块开发RESTful服务的客户端,遇到不少问题,浪费不少时间

网上的例子都是从Grape开始的,但是按照例子上运行,无论是通过grape install还是在代码里@Grab都没有办法把http builder加到classpath里,甚至依赖关系已经下载到~/.groovy/grapes里了,但是还是在import的时候报错。用Grails的时候也是一样,如果通过ivy定义依赖,通过ant下载到lib目录中,在grails shell里还是没有办法引用。不理解了,难道还需要手动再指定path吗。最后用grails的rest插件(grails install-plugin rest)总算是下载到了path中了。

第二是http builder的报错太智能了,它会把服务器端50x的报错输出在客户端。在查看错误的时候一定要分清楚。

第三是net.sf.json-lib这个库在转json的时候有一点问题,比如这样的js对象
{“result”:”success”}

会因为key上有引号而无法解析,必须是这样的格式:
{result: “success”}

至于那种是正确的json我也没有兴趣了解了,只是非常遗憾的是couchdb返回的都是前一种形式。

当然了,瑕不掩瑜,http builder还是提供了非常方便的封装,比直接用HttpURLConnection或是HttpClient更加Groovy

听豆瓣电台的最佳姿势

豆瓣电台,如果你是豆瓣用户我不多说了;如果不是豆瓣用户,嗯,算了,您换台吧。

总算找到Prism的用处了。如果你在用豆瓣电台,并且你使用Firefox,那么只要安装Prism,就可以把豆瓣电台变成一个任意大小的窗口,和你的多tab的浏览器分离。如果非常巧合你是一位少数派的Windows用户,嗯,Prism在Windows上还可以最小化到系统栏。

安装Prism扩展,嗯,最好确定你的Firefox是最新的(这个下雨的晚上最新的是3.5.5),当然也别新到3.6去。OK没有问题的话,就猛击下面这个链接:
https://addons.mozilla.org/en-US/firefox/addon/6665

注册都不需要了,直接点安装,然后等着重开Firefox就行了。安装完成,可以看到Tools菜单下面多了一个”Convert Website to application…” 这就是Prism,点开设置如下参数:

Windows用户的选项会多一些,记得勾上那个show in the notification area(如果是这个名字的话),确定即可。

Windows用户(注意升级到3.5.5的Firefox)这时直接点桌面上的图标就可以了。由于cookie不能共享,你需要重登录一下,有必要的话最好选上“记住我”。等豆瓣电台的flash播放器出现的时候,把窗口拖到合适的大小,Prism会记住每次正常关闭时的窗口大小,下次打开就那么大。然后你把它最小化,于是就在右下角了(不好意思,至今我都不知道那个区域到底中文名叫什么,直译是提示区,但是从来没听人用普通话这么说过)。

Linux的用户稍微麻烦一些,第一次执行桌面生成的文件时会需要confirm,mark as trusted即可。因为和你的Firefox不共享数据,所以首次执行Prism程序会创建一套新的Firefox profile,然后检查插件更新,显示欢迎等等。没关系,关掉它,重新再执行一次,就会看到正常的登录框了,其他和Windows差不多。

但是Linux上的Prism还没有提供最小化到右上角(GNOME)或者右下角(KDE)或者其他什么角里的功能,怎么办?咱们有Window Manager,我是菜鸟,我刚会用Compiz,开启Scale Window吧,然后可以把窗口按比例缩小,所到不影响桌面工作,设不设置Always on top就看自己的想法了。

好的,就罗嗦到这里。

Use pipe in subprocess

问题:

您要通过python的subprocess模块执行一些命令,要在程序中获得命令的标准输出,此外,命令中还有管道操作。

解决:

以这个命令为例:
cat /home/admin/deploy/log/2009-11-11.log |grep example.com |wc -l

import subprocess

cmd1 = 'cat /home/admin/deploy/log/2009-11-11.log'
cmd2 = 'grep example.com'
cmd3 = 'wc -l'

pipe1 = subprocess.Popen(cmd1.split(), stdout=subprocess.PIPE)
pipe2 = subprocess.Popen(cmd2.split(), stdin=pipe1, stdout=subprocess.PIPE)
pipe3 = subprocess.Popen(cmd3.split(), stdin=pipe2, stdout=subprocess.PIPE)

result = pipe3.communicate()[0]

DoubanCovers has been merged into Exaile-cn

既然是exaile-cn,就不扯蹩脚的英语了。

前天和Exaile-cn的作者进行了一些沟通,现在DoubanCovers插件已经合并到Exaile-CN项目里了。Exaile-CN为Exaile提供符合中文用户习惯的一系列插件,包括歌词插件、迷你模式等。

As exaile-cn has not been adapted to exaile 0.3, the plugin will not be packaged into public release at once. if you use svn, you can checkout the plugin from branch:
svn checkout http://exaile-cn.googlecode.com/svn/branches/0.3/

For a ready to use package, download from here as mentioned before:
http://bitbucket.org/sunng/exailedoubancovers/downloads/

Come back to see you

在彻查病毒之前这个网站的可访问性已经差到一定程度为此我甚至加了cron任务每天定时两次恢复文件但是怎奈病毒运行时间无常最后难免心力交瘁。

现在问题基本解决在可预见的将来网站的可访问性暂时不会再有问题了大家也不用担心打开本人网站的时候被执行广告代码或者重定向到什么世外桃源去了。

在清理病毒期间正好在linuxtoy上发了一篇文章可惜因为清理病毒没有赚到点击量和知名度了。