Blog-o! Notes from latte.ca

Thu, 04 Dec 2008

Yesterday I went to see a presentation by Kosta Zabashta about the work he did on Basie. The presentation went fairly well, but while listening to it, I had a few ideas that I thought I should write down.

First, since the configurations for Exim and Postfix are so complicated and so different, it would be nice if we had a program that could figure out which one you’re running, and generate the lines to add to your config files to get it all set up.

Second, I think we probably don’t need to add that many boolean or set operators to the search functionality. I seem to remember reading a paper a while ago where Google said that people only used 2 of the advanced search features, "s to make a phrase, and OR to choose between two different things. Sure, some people used all the wacky operators, but it was a vanishingly small percentage.

Third, do we update the search index when items change, or are we constantly rebuilding it? I would have thought that doing the dynamic updates would have run into many of the same issues as the Events app, but maybe there was a smarter way to do it that I’m overlooking.

Fourth, and finally, I wonder if there’s a way to use metadata about the objects we’re searching to influence rankings. To take the Google approach, add the number of mail messages/commit logs/wiki pages/tickets that refer to an item as a factor in determining the ranking. Or, push more recent things higher in the search results, since we know when things were added. Do we actually want to do either of those? Maybe, maybe not, but we’ve got a lot of data about each item, and it seems like using it might be, well, maybe more interesting than useful. :)

So, there are my thoughts on stuff we might want to do for the next version of Basie. I suppose the next step will be to get Greg to link to this, and get other people commenting. (And now that I’ve written it all out, I suppose it might have been cleverer to post this to the Basie blog. Ah well. Live and learn.)

[Posted at 14:35 by Blake Winton] link
Wed, 27 Aug 2008

So, first off, I think Python developers these days need to use stuff like virtualenv and zc.buildout in order to develop in a sane manner. Yeah, this is the first project I’m using them on, but do what I say, not what I do.

Anyways, on to the instructions.

sudo easy_install virtualenv
virtualenv --no-site-packages basie
cd basie/
. bin/activate

Then, you’re gonna need a buildout.cfg. Mine looks like this:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[buildout]
parts = django
eggs = ipython

[django]
recipe = djangorecipe
version = trunk
settings = development
eggs = ${buildout:eggs}
project = basie
wsgi = true

You’ll also need a bootstrap.py, which will look a little something like this:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
##############################################################################
#
# Copyright (c) 2006 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Bootstrap a buildout-based project

Simply run this script in a directory containing a buildout.cfg.
The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.

$Id$
"""

import os, shutil, sys, tempfile, urllib2

tmpeggs = tempfile.mkdtemp()

try:
    import pkg_resources
except ImportError:
    ez = {}
    exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
                         ).read() in ez
    ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)

    import pkg_resources

if sys.platform == 'win32':
    def quote(c):
        if ' ' in c:
            return '"%s"' % c # work around spawn lamosity on windows
        else:
            return c
else:
    def quote (c):
        return c

cmd = 'from setuptools.command.easy_install import main; main()'
ws  = pkg_resources.working_set
assert os.spawnle(
    os.P_WAIT, sys.executable, quote (sys.executable),
    '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout',
    dict(os.environ,
         PYTHONPATH=
         ws.find(pkg_resources.Requirement.parse('setuptools')).location
         ),
    ) == 0

ws.add_entry(tmpeggs)
ws.require('zc.buildout')
import zc.buildout.buildout
zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
shutil.rmtree(tmpeggs)

After you’ve got those, it’s basically:

python bootstrap.py
buildout -v
django help
django runserver

And when you’re done, deactivate

Any comments on things that don’t work would be highly appreciated.

[Posted at 17:03 by Blake Winton] link