麦田守望者's profile异想空间PhotosBlogLists Tools Help

Blog


    8/29/2009

    听歌也很简单

    听MP3你用什么软件?我用VLC。不过,我还用更高效、易用的mpg321。mpg321是一个命令行程序,没有任何用户界面。这就使得mpg321非常的高效,占用非常之少的系统资源。安装mpg321同样很容易。如果使用Debian或者Ubuntu,那么sudo apt-get install mpg321;如果使用BSD Unix,那么可以使用他们各自的软件包管理系统安装;或者干脆从源代码编译。看你的喜好了。

    播放MP3:

    mpg321 file1.mp3

    播放多个MP3:

    mpg321 file1.mp3 file2.mp3 singer/famous-song.mp3

    打乱顺序播放:

    mpg321 -z file1.mp3 file2.mp3 singer/famous-song.mp3

    man mpg321会显示完整的使用参考。

    mpg321可以被用在shell脚本中。发挥一下想象力,是否能够把它用到什么特别有意思的地方呢。

    BTW:mpg321不是Windows环境中的产物。想在Windows下使用的话,你可以搜一搜试试看。

    8/27/2009

    IATTopic.queryCatalog

    IATTopic接口声明了queryCatalog方法:

    def queryCatalog(REQUEST=None, **kw):
    """Invoke the catalog using our criteria to augment any passed
    in query before calling the catalog.
    """

    利用这个方法,我们能够以编程的方式控制提供了IATTopic接口的对象的搜索行为。最典型的是Plone的标准内容类型Collection,在更早期的Plone版本中其称作Smart Folder。Collection这个名字可以看作是面向用户的名字,非常清晰直观的反映了它的功能。在Plone内部,Collection类型实际上是一个ATTopic类,其portal_type是Topic,archetype_name是Collection。言归正传,看一看能用这个接口方法做什么。

    在ATTopic类实现中,丰富了queryCatalog方法的参数:

    def queryCatalog(self, REQUEST=None, batch=False, b_size=None,
    full_objects=False, **kw):
    pass

    利用这些参数,能完成如下任务:

    1、在已经设置了搜索条件的基础上,附加其它额外的条件。将任何额外的搜索条件,按照ZCatalog的规范组合成一个字典对象,传递给kw参数。关于ZCatalog的参考,《The Zope2 Book》的Searching and Catagorizing Content章节有详细的介绍。

    2、按批次返回特定数量的对象集合,即分页。batch参数指明是否按批次返回搜索结果,b_size说明返回的结果集的大小。除了这两个参数,还需要在context.REQUEST对象中设定b_start。b_start指明,在完整的搜索结果结合中,从第几个对象开始返回b_size数量的对象集合。和数组的下标一样,b_start的值从0计起。

    在这种情况下,queryCatalog方法返回的是一个 ZTUtils.Batch.Batch对象。Batch对象实现了__getitem__和__len__方法。同时,还提供了previous和 next属性,用于前后双向跌代下一个Batch对象。如果到头了,则previous和next会相应的被置为None。

    3、返回的对象集合中,包含每一个完整的对象。full_objects参数指明,调用每一个Brain对象的getObject方法,从ZODB中获取完整的对象。此种做法可能会影响Plone的运行性能。

    举个例子:

    在当前上下文中存在一个Collection对象,其ID为search。想要搜索EffectiveDate在2009年1月1日以来的Page对象,并且按照EffectiveDate排序,显示头10个对象。

    from DateTime import DateTime
    qc = {}
    qc['portal_type'] = 'Document'
    qc['effective'] = { 'query': DateTime('2009/1/1'), 'range': 'min' }
    qc['sort_on'] = 'effective'
    qc['sort_limit'] = 10
    qc['sort_order'] = 'descending'
    context.search.queryCatalog(**qc)[0:10]

    如果想要分页显示所有Page对象,每一页显示20个,显示第2页:

    qc = {}
    qc['portal_type'] = 'Document'
    qc['sort_on'] = 'effective'
    qc['sort_order'] = 'descending'
    # 这一行很重要。如果缺少这一行,则会始终从搜索到的第一个对象开始返回结果
    context.REQUEST.set('b_start', (2 - 1) * 20)
    context.search.queryCatalog(batch=True, b_size=20, **qc)