Cross-posting to image services (made easy)

Every day, twice a day, I post one of my photographs to Instagram, Glass, Vero, Flickr, Facebook and Mastodon. The whole process takes about 10 minutes and involves no exporting. A friend asked how this was possible, and I thought it would make more sense to record the workflow as a video rather than trying to explain, so I’ve done that here. Hope someone finds it useful!

Hemispheric Views

Last week I was invited to be a guest on a “tech-adjacent” podcast called Hemispheric Views. We spent an hour in a rolicking conversation about my involvement with BeOS, early days at Ziff-Davis, my love of Flickr and Glass and adventure photography, and other topics. I was super nervous but it turned out to be a blast. The episode dropped today and turned out very well! The hosts are a great group guys – sharp, with a wonderful sense of humor.

Listen here, or subscribe.

Mastodon and the Fediverse

Whether we’re aware of it or not, we all benefit enormously from open source software. Most web servers and most browser engines are open source. The operating system that powers most internet servers is open source. Critical components of MacOS and Windows are open source. We the People are really good at making free software for each other.

But one thing open source hasn’t been able to do is to own and operate a platform like Twitter or Facebook or Reddit. It’s too expensive, and involves too many difficult challenges, like content moderation and resilience. The concept of federation addresses that gap in the open source world by saying “Rather than having one massive expensive server “instance” that runs everything, what if we could split a service up into thousands, or hundreds of thousands of small server instances that intercommunicate? This approach to service design is called “federation” and has a bunch of advantages:

  • Massive expense is not a problem – the burden is shared
  • No single server has to copy all of the content – just the content its own users want to see
  • Individual instances can have different philosophies, e.g. set their own content moderation policies
  • Individual instances can block other instances they deem problematic
  • Resilience – if an instance goes down, the rest of the network stays up
Continue reading “Mastodon and the Fediverse”

Auto-convert Instagram hashtags to Flickr tags

Discovered this pretty well-hidden Flickr feature by accident and it’s such a time-saver, thought I’d share.

This is for people who post to Flickr from iOS, using the Share Sheet (i.e. from Lightroom Mobile or Apple Photos, you click the Share icon and select Flickr).

  1. When the share sheet comes up, don’t click the Tags section to tag your photos. Instead, type them Instagram-style right into the Description field, i.e. “#landscapes #beautifulcalifornia #roadtrip” etc.
  2. Now delete the tags you just typed. That’s right – delete them (so that you’re not adding clutter).
  3. Post the image.
  4. When the image lands on Flickr, check its Tags section – all of the hashtags you entered and deleted have been auto-converted to real Flickr tags!

If you are in the habit of posting your images to both Instagram and Flickr, here’s where the time saver comes in: Make your Instagram post first, and copy the set of hashtags you created to the clipboard. Then, when you do your Flickr post, in step #1 above, just paste them from the clipboard (and delete). Voila! Now you don’t have to go through the process of adding tags on two different services.

Side tip: If you share from Lightroom Mobile via the Share Sheet, all of your Lightroom tags become Flickr tags automatically.

Saving Energy At Scale

A while back I promised to write a post describing what I do by day at Energy Solutions, so here goes (with a small twist at the end). But it requires a bit of setup.

State governments often make pledges like “We’re going to reduce our carbon footprint 15% by the year 2020.” To make that happen, they put up a big pile of money and entrust it to power companies, since they understand the energy world. The utilities come up with with incentive programs to do things like encourage hospitals and schools to replace old HVAC systems with newer, more energy efficient ones, or for building contractors to replace lighting systems with smart ones that know when no one is home (to give a couple of examples). They work with organizations like the California Public Utilities Commission to come up with “Measures” — ways to evaluate what kind of equipment saves how much energy in a given climate zone, etc.

It turns out that actually getting a program like that off the ground is hard. There are literally millions of pieces of equipment out there that use energy in some way, and a dizzying variety of ways to measure energy savings. There are millions of buildings in the United States, under the jurisdiction of dozens of utilities. How do you devise an incentive program that’s fair to all, and that actually works? How do you prove that a person claiming an incentive is actually entitled to it? How do you measure the efficiency of a given heat pump or ballast or EV charger relative to its usage in a school, or apartment complex, or whatever? How do you ensure the system isn’t abused, and that the equipment was actually installed? How do you compare the attributes of the relevant Measures against the properties of all that equipment (complex queries at scale)? How do you make sure the person is claiming for the best possible program? And so on.

So the utilities hire a consultancy to design and run the program, write all of the logic that makes the magic happen, and build a web interface and batch processing system to handle all of the data and logic? My company, Energy Solutions, employs experts in every tiny corner of the energy industry, and is one of only a few organizations in the country that knows how to do this sort of thing.

Historically, the company created custom code for each new program (madness!). Four years ago, I was hired to help design and build a meta-system, configurable in every dimension, to host many domains running many programs, on top of all that ever-expanding data. While my personal history is mostly in making content management systems for journalists and academia, this job is different – the website is just a very thin layer on top of the most complex software I’ve ever worked on.

My expertise is in Python, and my framework speciality is Django. Over time, we started adding developers, and I’m now the Codebase Lead for a team of developers who report to a very large (too large?) group of stakeholders. I’m responsible for the quality, security, and performance of the codebase and the system. I do all of the code review, work with the ops team, and spend a little too much time in meetings talking about how to implement the Next Big Idea. So I spend my days bouncing between code, github, Slack conversations, and meetings.

And it’s stressful. For the past few years, I’ve fooled myself that things would settle down and get easier in a few months. But as soon as we solve one hard problem, three more pop up to take its place. I finish my days aching to get away from the computer and hit the trail. In the evenings, I’m brain-drained for hours. Lately I’ve been feeling the need to juggle fewer balls, to do something more focused. I’m honored to function as Codebase Lead, but honestly in need of a break. Recently, another opportunity came up in the same company, and I’ve just made the decision to transition to a different-but-related project. Not fooling myself it’ll be easy, but it should definitely be more focused and have fewer moving parts.

I’m proud of what we do – Energy Solutions does a lot more than just run the project I described there – we’re just a little corner of the company. All-told, ES saves more energy in the U.S. than the state of Alaska consumes (that stat was from four years ago – I’m sure it’s much more now). And they have their sights set high. With the Biden administration’s climate goals shaping up, there’s going to be way more to do in coming years.

A little while ago, I was running a conversion process on some data, watching it all roll by as it ran, and it struck me (should be obvious, but we get sucked in by architecture challenges and lose sight of the bigger picture): This isn’t just a few seconds worth of data – this is energy that was NOT used because of what we do, what we’ve built together. The stress is worth it – we’re making a difference not by talking about the importance of carbon reduction, but by making it happen.

Uploads Are The New Downloads

Got a note from my boss yesterday, asking why my voice on a meeting was speeding up and slowing down and sounding squishy. That shouldn’t be – we pay for and receive gigabit bandwidth (which translates to 500mbps over wifi).

Since forever, ISPs have put all the emphasis on download speeds, and given the general public very slow upload speeds. That was fine, until Covid – most people just want to watch NetFlix and have no need for fast uploads. But now we all have multiple people at home on Zoom at the same time, and upload speeds have become the new bottleneck.

Kids playing near an old boat, China Camp. Photo copyright Scot Hacker, 2020.

When you’re sharing video of yourself, you’re uploading – each person using around 1.5mbps. Three people at once takes you to 4.5mbps. Speedtest said I was getting 3-6mpbs — right on the threshold with no breathing room. But wait – our gigabit service should be giving us 35mbps upload speed!

Contacted the provider and discovered that our cable modem was old enough to have fallen off the end of the “supported” list. So even though we pay for good speed, and we blanket coverage through the house and yard with a mesh network (eero), the bottleneck had become the modem itself. If I’d been leasing the modem from the ISP like most people do, it would have been upgraded by them. But years ago I chose to save on the monthly rental cost by owning my own modem.

So, takeaway is this: If you own your own modem and are having a crappy Zoom experience, check all of your bottlenecks, and re-check your ISP’s modem compatibility list. Also, if your partner shows full-length movies to their students while you’re trying to have critical meetings, consider joining via phone until you get a new modem :)

Django: Testing for Missing Migrations

When adding or altering model schemas in Django, developers typically generate and commit accompanying migration files. But, counterintuitively, Django wants to track all model changes in migration files, even if they don’t result in database schema changes. Those can be easy to miss.

Regardless the reason, you never want your repo to be in a state where migrations are detected as needed, but accompanying migration files aren’t committed.

Writing a pytest test that can be triggered on github, Circle, Travis, Jenkins, or whatever you use turns out to be trivial, but I couldn’t find documentation or examples on the interwebs, so am posting this here for posterity:

import pytest

from django.core.management import call_command

@pytest.mark.django_db
def test_for_missing_migrations():
    """ If no migrations are detected as needed, `result`
    will be `None`. In all other cases, the call will fail,
    alerting your team that someone is trying to make a
    change that requires a migration and that migration is
    absent.
    """

    result = call_command("makemigrations", check=True, dry_run=True)
    assert not result

It really is that simple! If no migrations are needed, result will be None. Any other return value means someone should run ./manage.py makemigrations to see what’s missing, and commit the results.

In Defense of Flickr

Update: This post has been substantially updated and re-posted as the Medium article “Flickr Is No Ghost Town” – please read that version instead of this one!


Original post:

People like to say flip things like “Flickr is dead” just like they’ve been saying “Apple is dead” for decades. It’s true that Flickr’s heyday has passed, but there are still hundreds of thousands (millions?) of photographers posting there daily. Interaction is lively, there’s an interest group for every photography niche you can think of, and users are really supportive with the compliments and CC. Flickr still has upwards of 75 million accounts, and can receive up to 25 million photo uploads on a good day (stats).

Sunset at Berkeley Marina

Flickr dominated the online photo sharing scene for around 15 years. But as Facebook’s popularity rose, FB became the world’s dominant photo sharing platform, eclipsing Flickr’s numbers (which were already astounding). After a recent brush with financial ruin, Flickr was purchased by SmugMug, and they’ve been great stewards of the platform so far, with improvements being released on the regular.

Sunset at Berkeley Marina

Somewhere in there, along came Instagram to soak up much of the remaining photographic juice in the room. Everyone is on it, so you’d be nuts not to use it, right? I use it too.

So why not just use Facebook and Instagram and call it a day? A bunch of reasons!:

  • Instagram images are tiny postage stamp versions of the images you’ve put so much work into. It’s almost an insult to your photos to display them so small with no full-size web option. But we all do it because we have to (and it’s fun).
  • Instagram has hashtags, but no real “groups” – no organized photo communities.
  • Facebook does full-screen, but they still compress and rewrite your images on upload, even if you enable the HD mobile setting.
  • Not everyone is on Facebook. Millions of people won’t use it for either personal or political reasons (I’m sure we’ve all seen numerous friends leave the platform in the past couple of years). People without FB accounts simply can’t see your work here. Out of bounds. Walled gardens have their place, but I don’t want my photos in one.
  • What if you decide to leave Facebook in a couple of years? What happens to all the work you posted here? Or will the fact that your photos are on FB prevent you from leaving the service even if you want to for other reasons? You’re “locked in.” Putting your images on Flickr instead means your images are decoupled from your social network, which gives you freedom.
  • Both Facebook and Instagram strip out all of your EXIF data, while Flickr does not. I really enjoy studying the EXIF data for other people’s images, or reminding myself of settings that were used on my own.
  • Only Flickr provides full and detailed statistics — not just of likes, but for all views, since the beginning of time (just realized my account is coming up on one million total views since I started there in 2005, wow!)

On Flickr, your images are available in super high resolution, with a wide variety of copyright options. There’s a huge number of interest groups, and detailed statistics. The challenge of getting an image into “Explore” (Flickr’s homepage featuring the best images on the service, changing constantly) is ongoing, and so rewarding when it happens. Discovering great new photographers daily is inspirational. Flickr is photo paradise to this day, IMHO.

Protester returning home, El Cerrito

All of which makes me wonder why so many photographers I meet aren’t using it. It seems like the best of all the options (yes there are other options, but they don’t compete with Flickr IMO, except maybe SmugMug (I’m curious about the features and community there too, honestly – promising).

Tower of Power

Are you on Flickr? And if not, why not?

FWIW #1: I usually post the same image to Instagram and Flickr at the same time, but only share the URL of the Flickr version, since it’s high-res. I only post images on Facebook occasionally, and just for the audience of my friends, rather than for the photo community.

FWIW #2: No I’m not a Flickr employee! Just a long-time user who never fell out of love.

FWIW #3: I’m shacker on Flickr and would love to follow you if you’re there too.

COVID-19 shopper at Trader Joe’s

Sync’ing Photos Between Computer and Phone (etc.)

Here are a few questions that come up over and over on photo forums. To me, these all amount to the same question. Or, at least they all have the same answer:

  • How can I post photos from my DSLR to Instagram (how to get DSLR images onto my phone?)
  • I have a computer, a phone, and a tablet. How can I transfer images between them?
  • If I delete or edit a photo on one device, how can I get those changes over to my other device?
  • “What do you all use for storage? An external hard drive?”

They’re good questions, and every new photographer has come up against them at some point. What surprises me is how many seasoned photographers still don’t have a good answer to them — surprising because I consider them a totally solved problem.

It’s 2020. All of your photos should live happily together in one library. That library should live in the cloud, so that when you add to or delete from or edit an image on one of your devices, that change is reflected on all of your devices. When you add an image from your DSLR to your photo collection, it should appear on your phone a few seconds later, ready to post to Instagram or whatever. You shouldn’t have to think about it – it should just work.

Equally important: No one should be having to keep photos in a bare folder somewhere, then drag them into Photoshop or Lightroom or whatever. All (pretty much all?) editing should happen directly in your Digital Asset Manager (DAM) – the tool you use to organize your photos into albums, and give them titles and descriptions and tags, to do all of your editing, organizing, sifting, sorting, importing and exporting to and from.

As far as I can tell, the best-integrated solution for this “one shared backing store” workflow is iCloud Photo Library from Apple. It works inside the Photos apps for MacOS and iOS, but changes the storage arrangement so that “master” copy of each image lives in the cloud, not on your hard drive (of course you must download the full-resolution master image to edit them, but that is a seamless process.

This makes some people feel nervous. We’re so used to controlling and backing up our own hard drives, it can be hard to hand over control. But think about it for a minute: How susceptible is your hard drive to fire, theft, or flood? How religious are you about backing it up? If you’re backing up off-site, what are you paying for that service? Do you really trust your little $100 hard drive and your own habits more than you trust a company holding the fate of hundreds of thousands of photographers’ work in their hands? If they made a mistake that bad, they’d be out of business. You can bet their backups are taken many times a day and distributed around the globe. And if you delete something by accident, you have a 30-day rolling Trash Can to fall back on. Seriously, I feel way safer with my photos in Apple’s hands than I did before.

At the risk of sounding like a fanboy, it’s hard to overstate just how liberating it is to have all of your synchronization issues just go away one day. The questions at the top of the page are just no longer questions. Use it for a few days and you’ll never want to go back.

$10/month, or $15/month for your whole family, is chicken scratch — you can hardly buy lunch for $10 these days. Great how-to guide here.

I jumped into iCloud Photo Library the day it was released and it solved all of the multi-camera / multi-computer problems I’d been banging my head against for years.

Other Options?

If you’re worried that the Photos app won’t be good enough to replace Lightroom, you might want to have another look at the the advanced editing tools in Photos — they’re extremely good! (I’d be curious to know whether there’s still anything you can do in Lightroom that you can’t do in the free Photos app?). Plus Photos supports plugins — I run Skylum Luminar not as a standalone app, but as a plugin for the Photos app. It’s mind-blowing what Luminar can do.

I believe that Windows users can also use iCloud Photo Library, but the integration workflow is a little less elegant. If you use Photo Library on Windows, please leave a comment and let us know what you think.

If you just feel super-married to Lightroom, the good news is that they now offer a cloud storage option as well, but I have no idea whether or how well it integrates with the Photos collection on your iOS or Android phone (if you know, let us know?)

Bottom line for me: Life is too short to be messing around with some of the convoluted workarounds people come up with to post their DSLR images on Instagram, or to deal with any of the other questions up top. You shouldn’t have to think about it – it should just work!

Oh my zsh

That version of bash we’ve been using on MacOS since forever hasn’t been updated since forever (for GPL licensing reasons). With Catalina, Apple finally got with the program and pushed bash into the background in favor of zsh. Nothing earth-shattering there – zsh has been available forever, but now it’s the default, and the Terminal will bug you on every launch if you don’t follow its instructions to migrate.

Once you do move over, run don’t walk to Oh My Zsh for a wonderful rabbit hole of themes, plugins, and configuration options to make zsh sing for you. By default, it knows how to detect whether the current directory contains a git checkout, and will show the active branch in the prompt, which is worth the price of admission alone.