A log of interesting things made by Kunal Anand
06/04/2009
I spent 10 minutes with Python, Quartz2D, Illustrator, and Photoshop to create a background for my Twitter profile.
First, I started by visualizing a flock of Alfreds using Quartz2D. The Alfred doodle is an SVG file where individual paths are randomly mutated within bounds; the output is the maximum resolution of a 30 inch monitor.
Then, I brought the flock into Photoshop and blended several radial gradients:
Finally, I added typography:
You can check out the final product on my Twitter profile (jankybear).
06/03/2009
In between stress waves and crazy hours, I created another mixed media piece called "OK":
"OK" was created while listening to Radiohead's OK Computer and was more involved than the previous pieces.
I painted with sponges and plastic bags instead of brushes.
It was such a messy experiment - I'm still trying to scrape acrylic paint from my fingertips.
With five unique pieces, I feel that the "Things I See In You" series is complete.
06/01/2009
I took the plunge and moved all my domains to Google App Engine this weekend. Migrating whatspop.com, a remotely hosted Blogger blog with project pages, was an interesting challenge. What follows are the highlights of the process.
class GZeitgeistProjectHandler(webapp.RequestHandler):
def get(self):
self.redirect('http://www.kunalanand.com/gzeitgeist/')
class GZeitgeistFeedHandler(webapp.RequestHandler):
def get(self):
self.redirect('http://www.kunalanand.com/gzeitgeist/gzeitgeist.rdf')
class TechnoratiApiHandler(webapp.RequestHandler):
def get(self):
self.redirect('http://www.kunalanand.com/technoratiapi/')
def main():
application = webapp.WSGIApplication([
(r'/gzeitgeist/?', GZeitgeistProjectHandler),
(r'/gzeitgeist/gzeitgeist.rdf', GZeitgeistFeedHandler),
(r'/technoratiapi/?', TechnoratiApiHandler)])
wsgiref.handlers.CGIHandler().run(application)
entries = []
feed = self.service.GetFeed('/feeds/' + self.blog_id + '/posts/default?max-results=100')
for entry in feed.entry:
entries.append(Entry(entry.title.text, entry.published.text[0:10], entry.content.text))
python blogger_post_snagger.py > all_blogger_posts.html; open all_blogger_posts.html
class Entry(db.Model): title = db.StringProperty(required=True) body = db.TextProperty(required=True) blogger_slug = db.StringProperty(required=False) appengine_slug = db.StringProperty(required=True) published = db.DateTimeProperty(auto_now_add=True) updated = db.DateTimeProperty(auto_now=True)
def blog():
application = webapp.WSGIApplication([
(r'/', MainPageHandler),
(r'/blog(/?)', OldBlogRouter),
(r'/blog/[0-9]+/[0-9]+/([^/]+)', OldBlogPostRouter),
(r'/fortress', FortressHandler),
(r'/fortress/new', NewEntryHandler),
(r'/fortress/edit/([^/]+)', EditEntryHandler),
(r'/fortress/delete/([^/]+)', DeleteEntryHandler),
(r'/archive', ArchiveHandler),
(r'/feed', FeedHandler),
(r'/entry(/?)', ArchiveRouter),
(r'/entry/([^/]+)', EntryHandler)])
class OldBlogPostRouter(webapp.RequestHandler):
def get(self, slug):
entry = db.Query(Entry).filter('blogger_slug', slug).fetch(limit=1)
if len(entry):
self.redirect('/entry/%s' % (entry[0].appengine_slug))
else:
self.redirect('/archive')
05/27/2009
If you've been following this blog, you'll know that I've been actively doodling for the past few months. The above represents nine of my favorite characters - expect the next installment over the next few weeks.
05/03/2009
For some strange reason Mystery Science Theater 3000 has popped up in various conversations over the past two weeks. Thanks to a vector provided by a user on DeviantArt, I was able create a bookmarklet that adds Crow, Joel/Mike, and Servo in the silhouette form to the bottom of your browser window.
Here are some screenies in action:
Want the bookmarklet? Drag this link to your bookmarks menu/toolbar.
It's important to note that the silhouette might look borked on some sites. This is typically caused by margin/padding offsets created by a site specific stylesheet. If you figure out a way around this (nuking the styling of the page is not an option) then send me an email.