Benjamin Esham

Interesting: in the U.S. during World War II, “gas rationing was primarily meant to save tires, not gas.” (From the Straight Dope, “Were WWII scrap drives just a ploy to boost morale?”)

#goldengatepark #latergram #darkroomapp

Fog city

#sanfrancisco #sf #skyline #darkroomapp

If you love something, set it free; if you love a blog, submit all of its pages to the Wayback Machine so that it’ll live forever. I wrote a Python script to take an XML sitemap file and do just that:

Chalk nook

Sidewalk succulents

#succulents #darkroomapp

Why did they call it Ingredients and not the Niacin Creed

On fire

#sf #sanfrancisco #photoforge2

Sometimes you feel like a nut

#urbandecay #darkroomapp

Mural by Zio Ziegler

#mural #millvalley #darkroomapp

East Coast La Croix

#wegmans #wegmanslove #summer #summercolors

After the rain

#latergram #roc #rochester

MJ sunset last night

#sunset #geneseo #sunygeneseo #roctopshots #thisisroc #upstateny #newyorkstatephotos

#mural #roc #rochester



Tub Life


In transit, somewhere near Chicago




Anybody want some stickers? 🏳️‍🌈

One last one (maybe) from my week of Carmel photos



Versioning and backward compatibility

Zhouwei Zhang wrote an article recently called “These 299 macOS apps are so buggy, Apple had to fix them in AppKit.” Ignore the clickbait title for now; the article shows that macOS’s AppKit framework reverts to older, sometimes buggier behaviors when it’s running certain high-profile applications. Microsoft has long had a reputation for bending over backwards in their OS to keep apps running well; Apple has not had such a reputation but it seems like they’ve still done plenty of that kind of work.

This reminds me of another article I read recently, “What’s better than semver?” by Graham Lee. In discussing the Semantic Versioning style of version numbering, where version numbers look like x.y.z and a change to z indicates “backwards compatible bug fixes,” he writes,

There is no such thing as an “internal change that fixes incorrect behavior” that is “backwards compatible”. If a library has a function f() in its public API, I could be relying on any observable behaviour of f() […] If they “fix” “incorrect” behaviour, the library maintainers may have broken the package for me.

As longtime Apple employee Chris Espinosa said on Twitter of the AppKit special-casing, “Often [third-party developers] were working around our bugs.” That’s why the “so buggy” part of Zhang’s headline is undeserved. It’s also why it’s usually silly for a library developer to claim that they’ve fixed a bug but remained backward compatible. Sure—if your library contains an algorithm that could be O(n) but is accidentally quadratic, fixing the performance while keeping the semantics the same is backward-compatible. Adding a new API is usually backward-compatible. But fixing a bug in your sorting algorithm—as Apple apparently did one time, breaking some Microsoft Office apps—is potentially a breaking change, and I think this is something that library authors (and versioning-scheme authors) need to consider.1

Contrary to Clojure’s Nihilistic Versioning philosophy (“version numbering is hard so let’s not even try”), I think that making breaking changes is okay. Bugs happen, but bugs should be fixed even if that breaks someone’s workflow. Rewriting a library to take advantage of the lessons you’ve learned makes things better for you and for your future consumers.

The most important thing for library authors is just to communicate what’s changing in each version. This should happen at two levels: the eye-catching but unspecific change in a version number and the more detailed and nuanced2 information in the project’s changelog (or GitHub releases page). It’s great if you follow a well-defined scheme for assigning version numbers but writing good documentation might be even more important.

  1. Haskell’s Package Versioning Policy uses numbers like a.b.c, where both a and b are part of the “major version number.” This lets you distinguish between smaller breaking changes, like fixing a sorting algorithm hopefully is, and larger changes like rethinking a library’s interface. ↩︎

  2. It’s possible for a library to have a “breaking change” that turns out not to actually affect any of its consumers—in fact, this is more and more likely the more pedantic you get about what constitutes a breaking change. Along the same lines, version numbers matter a lot less if you know every single one of your consumers and can discuss potentially-breaking changes with them beforehand. ↩︎

Pakal De Bonchamp, REST is the new SOAP:

HTTP existed long before “RESTful webservices,” and the web ecosystem is filled with assumptions about the meaning of its error codes. Using them to transport application errors is like using milk bottles to dispose of toxic waste: inevitably, one day, there will be trouble.

“All great LinkedIn posts are one story: I’m embarking on an exciting new opportunity.” — Leo Tolstoy

Abraham Riesman, “The Case for Midi-Chlorians”:

Perhaps the Jedi had thunk themselves into utter stupidity on an array of matters. Midi-chlorians were just one manifestation of their high-minded idiocy. From that point of view, the prequels are a tragedy about well-intentioned intellectuals whose myopic condescension led them onto a path of war and self-immolation.

“How did the Jedi get so much wrong?” is an underrated (and maybe underexamined) storyline in the prequels.

Pebble Beach pebbles

#rocks #17miledrive #pebblebeach

The Lone Cypress

The issue is not which Bible verses the Administration should be citing as justification for its behavior. It shouldn’t be citing any Bible verses.

People who are protesting by quoting the nice verses are only reinforcing the idea that religion has a place in our government.


The GGB yesterday

#goldengatebridge #fog #sanfrancisco #sf #🌁

I assume the people who came up with the idea to split California into “Northern California,” “California,” and “Southern California” are the same people who decided to call the three Apple Watch lines “Apple Watch Sport,” “Apple Watch,” and “Apple Watch Edition.”

#goldengatepark #sanfrancisco #sf #darkroomapp

Patches of green

#sanfrancisco #sf

Emacs de gallo

#photoforge2 is several times more usable now that you can hide the replies that are directed at people you don’t follow. I understand why Manton chose to show all replies by default but the signal-to-noise ratio of my timeline is so much higher this way!

Getting back into overfiltering my photos, it seems

#latergram #photoforge2

#goldengatepark #latergram

I just made Swiss Miss with coffee instead of water, so you may address me as Barista Esham.

Three sunset photos in the last week?! I’m sorry, folks. The sun just keeps setting



Sausalito sunset

#latergram #sausalito #sunset


#sanfrancisco #goldengatepark #darkroomapp

It seems kind of ridiculous at this point that a phone with a perfectly good Wi-Fi connection, but no cellular connection, can’t get calls or text messages. These are the simplest, dumbest features our phones have, but they’re also the most brittle.

Sunset on Haight

#sf #sanfrancisco #sunset #darkroomapp

On tap at Rorhbach – 5/31/17

Beach life

#🌴 #darkroomapp


A gentle plea from someone who occasionally does drive-by bugfixes of free-software projects

Please, Dockerize your application. Or give me some way of starting a full copy of your app with one command (and without touching the rest of my system).

I want to help, but if standing up your app means installing a new programming language and a new package manager and a bunch of dependencies and configuring your application and reconfiguring my web server—and then I have to figure out how to actually fix the bug—I’m going to be a lot less likely to contribute to your project.

I suppose some projects have convoluted setup processes to discourage just these kinds of drive-by PRs from people who don’t know the code that well. But I don’t think that’s the reason most projects take a while to get running.

Instagram’s algorithmic timeline reduces my “engagement”

It is a truth universally acknowledged, that a social media service in possession of a reverse-chronological timeline, must be in want of screwing it up with “algorithms.” We saw it with Facebook in 2009; Twitter and Instagram held out until early 2016 but then followed suit. Facebook has been a lost cause for me for a long time—its algorithms’ inability to pick out the few items that would interest me are just a fact of life at this point. Twitter is still usable through third-party clients (although the company is doing its passive-aggressive best to do away with those too).

Instagram’s algorithm is more troubling for me. I’m a completionist, which means that on Instagram (and on Twitter and in my feed reader) I like to see every single item. This is really easy in the kind of feed reader I use, where you have to click on each item to mark it as read, or in a third-party Twitter client, where you can launch the app and just continue scrolling up from where you left off.

On Instagram, though, there is only one full-featured client—the Instagram app—and it always sends you back to the top of your feed when you reopen the app. With posts now being rearranged from session to session, when you launch the app you have to continue looking through photos until you finally reach one you’ve seen before, at which point you can be pretty sure you’ve seen everything in your feed.

I’m sure this model works fine for some people, especially if they’re following a ton of accounts and just want to dip into the firehose occasionally. For a completionist, though, Instagram is a daily source of irritation. I’m sure the algorithmic timeline is supposed to “increase my engagement,” but in reality it’s caused me to stop following some people so that my feed has fewer things to get through. There are another couple of accounts that I only follow in my feed reader via Granary, but I can’t like or comment on photos that way and I don’t count toward those accounts’ follower numbers.

Is that really what Instagram wants? Given the chance, I would at least glance at every single photo or video in my feed. With the screwy timeline, I’m cutting back just to make Instagram feel manageable. The company is testing an “all caught up” feature which seems like it will make this a little easier, provided that you do get caught up every two days. I think the real solution here is obvious, though, and I don’t know why Instagram is resisting it so strongly: just add an option to turn off the algorithmic timeline. Even if the app retained the silly behavior of starting at the top of the feed each time it opened, this would make getting caught up less of a chore and more of a delight.


“Do not, my friends, become addicted to water. It will take hold of you, and you will resent its absence!”

— from Collected Sayings of Muad’Dib by the Princess Irulan


That day is a day of regulation, a day of deletion and expiration, a day of unsubscriptions and opt-outs, a day of policies and officers, a day of the trumpet and alarm against the data warehouses, and against the high bulwarks.

University Avenue, Rochester, 5/14/17

This video is super cool. Just a bunch of normal satellite images, put together in a fun and kind of trippy way.


#sanfrancisco #darkroomapp

Westworld is O(n²), in the sense that after you watch each episode you think, “Hmm. I need to rewatch the entire series now”


Solar panels

#whpgeometry #geometry #latergram

Walk up in the club, like Aiya Eärendil Elenion Ancalima!