Archive for the ‘News’ Category

Blog moved to webfaction

Friday, February 27th, 2009

I just moved this blog to webfaction.

A Python Twitter bot

Tuesday, February 24th, 2009

This is a Python script to check a mailbox for Twitter emails. New followers are followed. Direct messages from administrators (defined in a list) are twittered by the bot.

import twitter

import logging

from imaplib import *
from email.Parser import Parser
import datetime, time, email, email.Utils
import re

import settings

# logging
logging.basicConfig(filename=settings.LOG_FILENAME,level=logging.DEBUG,)
logger = logging.getLogger('artandcode_twitter')

logger.debug('starting')
try:
    # Connect to email server
    server = IMAP4(settings.MAIL_SERVER)
    server.login(settings.EMAIL_USERNAME, settings.EMAIL_PASSWORD)
    r = server.select("INBOX")

    # Find all mail
    r, data = server.search(None, "(ALL)")

    # If there are messages in inbox
    if len(data[0]) > 0:

        api = twitter.Api(username=settings.TWITTER_USERNAME, password=settings.TWITTER_PASSWORD)

        p = Parser()

        # Loop through emails in inbox
        for num in data[0].split():

            r, fetch_data = server.fetch(num,
            '(BODY[HEADER.FIELDS (DATE SUBJECT FROM X-TwitterEmailType X-TwitterSenderScreenName X-TwitterCreatedAt X-TwitterRecipientScreenName)])')
            msg = p.parsestr(fetch_data[0][1])
            who = msg.__getitem__('From')
            matchemail = re.compile(r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}')
            email_addy = matchemail.findall(who)[0]

            twitter_sender_screen_name = msg.__getitem__('X-TwitterSenderScreenName')

            if msg.__getitem__('X-TwitterRecipientScreenName') == settings.TWITTER_USERNAME:
                # if the message is a following message
                if msg.__getitem__('X-TwitterEmailType') == 'is_following':

                    # follow the user
                    api.CreateFriendship(twitter_sender_screen_name)

                # If the email is a direct message sent from Twitter
                if msg.__getitem__('X-TwitterEmailType') == 'direct_message':
                    # if the sender is an administrator
                    if [twitter_sender_screen_name in settings.ADMINISTRATORS]:
        	               # When direct message sent, convert to epoch seconds
                        twitter_time = msg.__getitem__('X-TwitterCreatedAt').strip()
                        time_tuple = email.Utils.parsedate(twitter_time)
                        epoch_seconds = time.mktime(time_tuple)

                        # Get body of email sent by Twitter
                        r, body_data = server.fetch(num, '(RFC822.TEXT)')
                        body = body_data[0][1]
                        twitter_direct_message = body.split("\r\n\r\n")[0].strip()

                        api.PostUpdate(twitter_direct_message[:140-1])

        # copy the messages out of the INBOX
        server.copy(','.join(data[0].split(' ')), 'PROCESSED')

        # mark the messages as deleted
        # Loop through emails in inbox
        for num in data[0].split():
            server.store(num, '+FLAGS', '\\Deleted')

        # expunge the messages. Not sure if this is needed
        server.expunge()

    # delete the messages on close
    server.close()

    # Logout of email server
    server.logout()
except Exception, error:
    logger.exception(str(error))

logger.debug('finished')

Installing PIL on Mac OS X 10.5

Thursday, February 19th, 2009

These instructions will install PIL properly on Mac OS X 10.5. The instructions are adapted from here.

Go to here and download PIL.

Now we set up the environment so that you can install it.

In Terminal, create a symbolic link for the system’s Python.framework
in the location expected by the pythonmac.org tools, like so:

cd /Library/Frameworks
sudo ln -s /System/Library/Frameworks/Python.framework/ Python.framework

Now run the installer. It should not complain and it should install successfully.

The final step installs PIL in your Python site packages.

cd /Library/Python/2.5/site-packages/
echo "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages
" > PIL.pth

Test your new PIL install with:

python -c "from PIL import Image"

if you do not get an error, then you have a correct PIL install!

A little update on Picasa Tab for Facebook

Tuesday, February 10th, 2009

Looking back at my infrequent micro-blogging on this here site, I see a message about Picasa Tab for Facebook having 500 users. Well, now it has 23,000. w00t!

And one of these weekends, the new state of the art Google App Engine / pyFacebook / Django version will be switched on (replacing the crufty but reliable PHP version).

Mod_python is dead, long live mod_wsgi

Tuesday, February 10th, 2009

I recently deployed a Django 1.0.2 site using mod_python. Turns out this was a mistake. I should have used mod_wsgi. Mod_python is no longer under development. See Django ticket about recommending mod_wsgi.

[Corrected: wrong link]

Mod Python Mailing List Archives

Saturday, February 7th, 2009

The link on the website is broken, the correct link is: mod python mailing list archives

Unique molecules

Tuesday, January 27th, 2009



Unique molecules

Originally uploaded by chazmatazz

A teaser for my ‘corporate rebranding’

Picasa Tab for Facebook reaches 500 users

Monday, October 20th, 2008

Just wanted to say that I passed the 500 user mark this morning. Not bad for two weeks. You too can install Picasa Tab for Facebook here.

Google Top Draw: a Processing killer?

Saturday, October 4th, 2008

Another algorithmic drawing program hit the scene this week in Top Draw, a Mac-only program from Google. Much like Processing or OpenFrameworks, it provides a language to write code that produces images.

Top Draw was developed by one Dan Waylonis. You write object-oriented JavaScript code that is translated into images. The object-orientation differs from Processing and OpenFrameworks (and OpenGL and JOGL), where you write using the methods of one big class. And the methods are different. So for someone used to Processing-style methods (which are shared with OpenFrameworks), it’s a bit of a learning curve.

The big thing that Top Draw brings to the table is access to Apple’s CoreImage filters. Among other things, they allow you to transform 2D space with bumps and holes. Processing does not have this stuff built in, and I don’t think anyone has created a library to either use CoreImage on the Mac, or implemented the filters in Java. It would be cool stuff. ActionScript also has filters.

There’s some confusing extra functionality that lets you make a drawing your desktop image, or rotate through drawings. Neat, but really almost a separate program.

Top Draw is written in C and is licensed under the apache 2.0 license. The source code and the download is available on Google code.

So is it a Processing killer? I don’t think so. On the plus side has the CoreImage filters going for it. On the other hand, the language is awkward. The biggest issue is that it’s not a web application; even though you write in JavaScript, the library itself is in C. Processing sketches can be shown on the web using the moribund Java applet technology, and ActionScript can create Flash applications. It seems to me that almost everything must run on the web these days. Processing even has a JavaScript implementation (processing.js) that lets you run sketches using JavaScript in the browser. In this way it’s more like OpenFrameworks or OpenGL, which can’t run in a browser. And of course Top Draw only runs on Mac.

All in all, a good way to play with CoreImage filters.

Review of ‘Here Comes Everybody’ by Clay Shirky

Saturday, October 4th, 2008

Imagine that you could get people to do valuable things for you for free, like writing and distributing book reviews. That’s exactly what’s happening on the web today. Clay Shirky, in his book ‘Here Comes Everybody’, looks at the effects of the internet on producing economic value without the effort and expense of establishing an organization. He argues that the cost of organizing certain activities, such as publishing book reviews, has fallen to almost zero. Web services, such as Flickr, blogger.com, Amazon reviews, and Wikipedia are successful because they allow people to voluntarily contribute to a goal with minimal organizational effort.

Many of the examples in the book are well known (though some, like the use of blogs to organize protests in Belarus, are less known and wonderful). What makes Shirky’s book useful is the analysis that he does of the examples. Various models are proposed; a particularly useful model is promise, tool, bargain. He argues that a new group makes a promise (’lets put together photos of mermaid parades’), then provides tools to achieve that promise (Flickr), then makes bargains to achieve the goal (the agreement not to post off-topic images).

A quick read for a pretty good payoff.

Here Comes Everybody: The Power of Organizing Without Organizations