Serving Images with MongoDB, GridFS and Flask

Recently, I’ve had the pleasure of accumulating over 1 million thumbnail and preview images on my drive. I like having as many files on my disk as the next guy, but I thought since I’m using MongoDB anyway, why not use GridFS to store the images!

The trick was to fetch an image at a URL, save it into GridFS, then be able to serve it back out – all without temp files or creating individual files for every image. Here’s a recipe that does it all!

Continue reading

Decorators, Scrapers and Generators

Whoever said scraping web pages can’t be fun never tried it using Python decorators and generators! We’ll use this mini-framework to fetch all the upcoming comic book releases from one of my favorite online comic book stores.

A couple of interesting things going on here programmatically: 1) using decorators that are static methods of a class that maintains some state for the decorated operations and 2) decorating class methods that are generators – the typical decorator can’t handle a yielded result…

Continue reading

Image Search Considered Hard

These were my results searching for a default avatar for a Tumblr blog. Clearly ‘metadata’ isn’t being used here, just low-level image features… Vermont, OK. But, Minnesota? Come on! :D

Selection_026

It’s even more apparent that NO ‘metadata’ is being used when Google Maps map tiles make it in the results…

Selection_027

It’s REALLY hard to deliver relevant images similarity results without any context…

Routed Commands for Backbone.js

Here’s a quick fiddle that shows how to route a command between sub-views no matter how they’re nested in the DOM. Basically, when a sub-view is rendered it triggers a subscribe event that’s captured by the application view which then sets a delegate on another sub-view. This other sub-view is the source of the events, e.g. a menu bar.

When the event source sub-view triggers events (e.g. clicking a link), it does so on the delegate. Event names are specified in the HTML using a data-event attribute on the link. Enjoy!

Continue reading