Bill Katz

My Brain

An occasionally updated repository of thoughts, past work, and links.

Git: Commit, Push, Amend, Push Error

I'm a fan of the git version control system, but distributed revision control forces you to think a lot more.  Today, I ran into a gotcha that I'm documenting to help the next poor schlep.

I'm the only developer working on my web projects, so unless I'm merging changes across forked projects, merge conflicts don't rear their ugly head.  I like using dropbox ...

Upcoming App Engine Books

Google AppEngine is about eight months old and has already spawned at least four upcoming books:


Pretty impressive for a framework that's still in "preview."  Hopefully, these books will ...

Fault-tolerant counters for App Engine

The datastore in Google App Engine can occasionally throw an error.  It might be a timeout, quota violation, a result of maintenance (CapabilityDisabledError), or other exceptions thrown by the db and apiproxy_errors module.

So how do you gracefully handle datastore failures?  You could just inform the user to try again later.  Another approach is to use the memcache API and build a buffer for failed datastore puts.  That ...

Dropbox: Cross-platform file auto-syncing

Dropbox is coming out of beta and will allow paid 50GB plans within the next week or two.  I'm testing out the 50GB plan and am generally happy with the service.

Dropbox auto-syncs files in a specified local folder across Amazon S3 and your other designated computers.  The clients are good on both Mac and Windows platforms.  Versioning comes for free.  

For small program and configuration file ...

A SearchableModel for App Engine

SearchableModel, a nice little extension to db.Model, can be found in the App Engine SDK.  It's a lite full-text index that can provide some search capability to your app.  Using it is simple.  When declaring your model class replace db.Model with search.SearchableModel:

from google.appengine.ext import search
class Article(search.SearchableModel):
 some_searchable_prop = db.StringProperty()
 another_big_searchable = db.TextProperty()
 ...

Then in your handler, use the ...