Lucas Beeler

{code} + [ideas]

Credit Where It’s Due

I am Shotwell’s second author, not its first; that honor belongs to Jim Nelson. Even after I took over as tech lead in 2011, Jim remained a great friend and mentor and continued to give advice and direction to the project. Jim and I did a lot of project and product management for Shotwell, but ultimately both of these tasks were owned by Adam Dingle, Yorba’s founder, who encouragingly cajoled us into doing things we didn’t know we could do on time schedules that seemed impossible.

When I was tech lead, I was fortunate to lead two great engineers, Eric Gregory and Clinton Rogers and mentor our rock-star Google Summer of Code student, Valentín Barros, for two summers. Valentín worked heroically to add face recognition functionality to Shotwell, but ran into technical problems with the underlying OpenCV computer vision library that stymied his work through no fault of his own. Though it fails on some data sets, the Shotwell Faces Tool that Valentín developed is impressive and boasts an elegant user interface. It remains available in the “faces” branch of the Shotwell repository.

Stuff I Did

RESTful Publishing

Publishing photos to web services and social networking sites from Shotwell is a breeze. In fact, it’s so pleasant that I view it as one of the application’s differentiating features—even from it’s commercial competitors. With a lot of coaching and code reviews from Jim Nelson, I wrote the Shotwell publishing subsystem.

All three of the core publishing services—Facebook, Flickr, and Picasa Web Albums—nominally use OAuth for authentication and implement RESTful APIs at their service endpoints. But nominal truth and actual truth are different things. First, OAuth isn’t a standard so much as it is choreography for a stylized client-server dance; at the end of this dance you hopefully end up with a token you can use to sign API requests. Second, REST means different things to different people. To some REST is a disciplined design strategy for web services that uses the fundamental HTTP methods GET, POST, PUT, and DELETE to retrieve, create, update, and remove data elements that are identified solely by URIs. To others, however, REST is anything that’s not SOAP or XML-RPC.

Because OAuth and REST mean different things to different people and further because what they meant even to the same people changed over the four years from 2009–2013 that I owned the Shotwell publishing subsystem, the subsystem was built around a lot of hand-rolled code that was specific to each service. Opportunities to extract functionality into generic base and helper classes were few. Thankfully, this started to change around mid-2011 when Jim wrote a plugin system for Shotwell and I ported the Shotwell publishing subsystem to it. By this time, interpretations of web standards had crystallized enough that I could fix a permanent plugin API and introduce a useful set of helper classes.

Ultimately, community contributors would use the plugin API and support classes that I developed to write publishing plugins for Piwigo, Tumblr, and Yandex.Fotki. If you’re thinking of writing a publishing plugin for Shotwell, feel free to email me with questions or comments.

Color & Tone Controls

When I arrived at Yorba, I was the most junior (and most clueless) person working on Shotwell. My one asset was image processing experience, thanks to Studio580. Jim had done a great job setting up a display pipeline to rotate, crop, scale and display photos, but early versions of Shotwell didn’t manipulate individual pixel values, so users couldn’t remove red-eye effects from a photo, or adjust its color balance, tone, and exposure. Thanks to the imaging experience on my résumé, this is what I spent my first few months at Yorba doing.

In the end, I added tools for removing red-eye, for adjusting exposure, tint, color temperature and saturation, for bringing out latent detail in underexposed regions, and for stretching dynamic contrast. Of course, these features wouldn’t have worked half as well as they did without Jim’s careful code reviews and Adam’s insistent demands for more responsive performance. But among all the imaging features that I developed, the gem was one-click auto-enhance.

Shotwell’s auto-enhance feature uses a pattern-recognition algorithm to detect and correct two common defects in photos taken with digital point-and-shoot cameras:

I learned an interesting (and unexpected) fact while writing the pattern recognition code to detect the defects discussed above. In both cases, the defect is recognized by examining the probability distribution of color and tone over the surface of an image. Fascinatingly, for all of the 100 photos or so I examined, a ≈128×128 pixel thumbnail has a tone distribution indistinguishable (at the .01 confidence level) from the >10 megapixel image from which it was created, even though the thumbnail contains 1,000 times less information!

Resources

When Yorba defunded Shotwell development, control of the Shotwell codebase passed to the GNOME Foundation. Their Shotwell page is available here.

Jim Nelson has preserved the original Yorba foundation blog as part of his personal blog on GNOME.org.

A Flickr user group dedicated to Shotwell was formed in 2010 and remains active today.