dbus-python, in case you don't know

上周用dbus-python写exaile插件,实现mpris2.0,非常痛苦,因为几乎没有完整的文档,只有一个tutorials帮助你入门。总结一下我这次quick and dirty的开发所掌握的资料,当然,因为没有太多时间,所以也没有对dbus做更深入的了解,仅仅是in case you don’t know。

DBus Interface Properties

对mpris 2.0中定义的properties用dbus-python应该如何实现呢,似乎没有@dbus.service.properties这种decorator啊。这里的文档对Properties进行了简单的说明,对于python程序,只能这样实现了:

    @dbus.service.method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v')
    def Get(self, interface, prop):
        ...
    @dbus.service.method(dbus.PROPERTIES_IFACE, in_signature='ssv')
    def Set(self, interface, prop, value):
        ...
    @dbus.service.method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}')
    def GetAll(self, interface):
        ...

程序里通过prop判断property名字,返回结果。没办法,就是这样。

指定返回数据的dbus类型

对于dbus接口返回的variant类型,dbus-python会guess_signature。可是这部分的功能有的时候并不如我们想象,比如返回一个dict类型,其中的value有字符串有list有int,而out_signature是v。这种情况在Property Get的时候非常常见,如果不能手动指定类型,guess_signature得到的结果,value是统一类型,即,int会报错,如果没有int类型,会将所有字符串转成list(dbus的array)

这种情况需要手动指定返回的类型,用dbus.types模块下的类型对python显示包装,对dict类型,需要用dbus.types.Dictionary()包装,并且在构造函数里传入signature=’sv‘及相应的variant_level即可显示告知类型。同样,对list对象,需要用dbus.types.Array()包装。

这样即可绕过guest_signature,如果用dbus-monitor查看,就可以看到类型为variant string了。

Exaile sound menu integration

Sound menu indicator was introduced in Ubuntu Maverick(10.10). User can control playback from this menu, and view current track information.

The control is based on mpris spec 2.0, which is a common specification of controlling media player with dbus. To enable sound menu support, media player should implement mpris 2.0, and register itself with libindicate.

So this week, I have been working on an exaile plugin to support sound menu and finally got a workable version.

Screenshot of exaile sound menu

The code repo can be found at github:
https://github.com/sunng87/Exaile-Soundmenu-Indicator

First Week

这周是加入新公司的第一周,一切从新开始。这已经是两年里的第三家公司了,这个嘛,哎,比较坎坷。

因为长得比较苍凉,工作的时间又不长,大家都问你是研究生毕业吧,心里估计还有几分揣摩:这位兄台肯定是越挫越勇,不弃不馁,复读多年的。否定答复后,大家还会觉得我可能比较坎坷,读书比较晚,最后还要追问一句是哪年的。得到答案心中一凉,87年的都长成这样了,岁月不饶人啊。其实我没那么显老吧。

公司的东西全部是封闭的,而且自成体系,所以基本上是从头开始了。封闭的副作用就是找人的成本比较高,反倒也促进了公司有完整的培训体系培训资料,新人入门也算是有章可循。周二的培训课程一下午三个小时,简直就是找回了大学上课的感觉。恰好会议室门口有个饮料机,一倒饮料就嗡嗡作响。这倒好,昏昏欲睡的时候,饮料机突然响了,有人说了打下课铃了,众人立刻精神百倍。原来上大学的时候下课就失眠的不只我一个。

如果说公司有什么的特点的话,就是杯具特别多。你不用带着杯子走来走去,每一层楼都有大量的马克杯,统一印公司logo,用完只要放到回收点就可以了。而且公司特别喜欢杯具,周五临下班,又收到一个发杯具的通知。。。

另外中午散步,发现很多人都走一条小道,我跟过去绕到几座楼后面,简直就是豁然开朗,仿佛看到桃花源一般。浦东软件园三期后面有一个规模很大的人工湖,还有小桥流水,中午散步还有波光粼粼,可以租脚踏船!这湖藏的很深,你不绕到湖边是根本看不见。想想中午吃完饭散步、去湖上划船,那是何等的惬意啊。而且盛大文学的办公楼窗户就正对着湖面,在这样的落地窗前面工作,那种感觉!想起以前,同样是一家集团,工作环境的差距怎么就这么大呢。

同事谈论公司的时候,总是会用经济危机前、经济危机后来区分。比如危机前,培训材料都是打印成书的,危机后,大家就都看看pdf得了。作为一个和经济危机一起走上社会的人,我是真的很无奈。

终于能用Unity和Gnome-shell了

自从升级到Maverick之后,有两个问题就一直如鲠在喉,GNOME3会话和Ubuntu Netbook(Unity)会话能不能用。前者启动之后出现Panel后全部僵死,鼠标可以移动但是任何操作都没有响应;后者桌面背景图片一闪就黑屏,没有任何响应。

查看unity的xsession-error日志,其中的报错比较含糊,搜索也没有找到相似的问题。查看GNOME-Shell的xsession-error之后发现很多JS报错,搜索了一下,终于找到了一个bug报告:
https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/618907

情况和我一样,都是之前曾经安装过PPA版本的GNOME-Shell尝鲜,升级之后出现了JS报错。按照说明打开synaptic,果然有两个包使用的是git版本,尽管PPA已经删除,但是已安装的软件包只会被标记为Local or Obsolete,恰好这个git版本是0.9.4比Maverick里的0.9.3还要高,这样更新的时候又不会提示。如果不细看还真的不容易发现。按下Ctrl+E, synaptic会提示Force Version对话框,选择仓库的旧版本,安装、重启。这下不仅GNOME-Shell正常工作了,同样依赖Mutter的Unity也正常了。

这次悲剧,说明使用PPA还是要慎重,尤其是跨版本升级之后,要小心PPA被禁用但软件包没有被升级的情况。