- Go ahead and pull the trigger on adding oAuth tokens to a config file.
- Make an images Atom feed.
- Make a UI to select target albums for upload. Right now the album is hard-coded.
- You make a private (but not secret) album.
- You upload images to it.
- During the upload process you can set the
captiongoes on to be the alt-text.
- Once uploaded, you get a page back with text areas that have basic Markdown and HTML for copying/pasting, like this:
- Make an Atom feed to automate dropping pictures into my socials.
- Make a “Recent Uploads” page that provides pre-made Markdown snippets.
post thisbuttons for micro.blog, Mastodon, etc.
- Get rid of the manual step of editing a
.envfile to save tokens. I could just dump that into a file, look for it, and spare the manual uncommenting of code.
- Pick an image
- It uploads to Cloudflare’s image service
- When it comes back, you get two textareas with Markdown & plain HTML markup.
- The Pro Neg Standard film simulation
- Dynamic Range set to “200.”
- Highlight tone bumped up a little
- Shadow tone bumped down a little
- Color bumped up a notch
- A stripped down, 8-slot Q menu that covers operational details
Drive Down the Gorge, 2023-01-26
Columbia River Gorge
One of several tk. Took a drive down the gorge on the Washington side with my friend Luke. The sun and clouds were pretty disruptive and fickle. Still had fun.
Last night I finished up the
/recent page for imgup’s SmugMug version.
It provides the last 20 uploaded images along with their
caption metadata wrapped up in a Markdown image link. The caption is pulling duty as my alt text.
Having this in place gives me a way to process and upload images to SmugMug from Lightroom in bulk, then visit imgup to get the markup for sharing. Work put into adding metadata, titles, etc. can happen in one place, and I can easily amend it in the SmugMug organizer if needed. It saves me a little clicking around and manual editing.
Probably seems small, but I hated all the file shuffling I was doing and realized that some images I posted on my microblog over the past few years weren’t compressed/scaled very well. This gives me a tool for quickly rehabbing blog post images by finding them again in Lightroom, re-uploading them, and grabbing them out of imgup to update blog posts over time.
I finished up the initial SmugMug version of imgup today.
There are some things I’d like to add, but it’s good enough to stick in Docker and run locally as a drop-in replacement for the Cloudflare edition I’ve been using.
The basic workflow of the tool is:
Why? Because I get better control of the quality of images I share (SmugMug wants them to look nice at a variety of sizes and compresses/resizes accordingly), I’d like to move to having permanent URLs for images in posts (and I think I’m a SmugMug lifer now), and I’d eventually like to save the messy scattering of copies of images made just for sharing then discarded.
Because SmugMug has a pretty nice ecosystem of plugins, uploaders, and apps, there’s more I mean to do. For instance, it’s possible to just shoot an image straight from Lightroom CC on an iPad to SmugMug. There’s also a good desktop Mac uploader that can snarf up things saved to a specific folder. So if I just pick up the habit of adding title and caption metadata in Lightroom, it’ll show up in anything else I do with
imgup. Uploading, ultimately, will not be something I do a lot with this tool as I build the parts where I can get back recent uploads and get easy sharing snippets.
Still on the list of things to do with this:
In the process of debugging oAuth, I ended up building a manual solution to the problem of keeping an oAuth session alive after restarting the app: Once you do a SmugMug auth with the app, there’s a
/tokens page that tells you enough to stick your oAuth access token and secret in an environment variable. In the development environment it pulls this stuff from a
.env file. You can use the app without doing this at all, at the cost of having to re-auth the app with SmugMug each time you restart it.
oAuth is sort of a pain. Now that I sort of know how to plumb it in – enough that I’m going to make myself a little repo with a reference application – it has opened up a lot of interesting possibilities.
The whole experience reminded me of when I was doing Drupal development for a job I took to get into tech and out of pure editorial. We needed to do some work migrating a bunch of content between sites. My predecessor, who’d established the site on a previous version of Drupal, had done a similar task with a certain plugin, so working from his notes I installed and learned – that it wasn’t a clickable GUI thing with a wizard anymore – it was now a content migration “framework,” which meant I was going to spend some time learning its API and writing my own PHP plugin to support our particular needs, or … nothing. Ask for money for the outside guys, I guess, because I’d been hired to get better at PHP, not know it. I ended up hobbling through, and I still remember hopping around my office when the damn migration just ran on our 800,000+ user database.
So this weekend I was shopping around for a library to help me get oAuth plumbed in. OmniAuth presented itself right away, and seemed to have a SmugMug “strategy” – their word for “module” or “plugin” – so my eyes lit up. Then reality set in: The strategy was for an older version, and it targeted the old SmugMug API. Okay, fine, I was feeling industrious so what even was a strategy? I looked at a few and my eyes glazed because I had a nodding understanding of how all this worked, but not enough to sit down and implement a plugin for my specific problem.
I think that’s probably okay. I set OmniAuth aside and went with the vanilla Ruby oAuth gem and a reference Sinatra app someone wrote that did a really nice job of creating routes that recreated the oAuth dance. I had found a few other examples, but they were less systematic and harder to peel apart. By the time I was done fiddling with it to get it to work with SmugMug’s particular oAuth endpoints, I felt a lot more confident on how the protocol actually works.
So, do I “know oAuth?” No, I do not. Asked to implement an oAuth signin process from scratch, I could not just implement it. But I do know, more or less, the vocabulary, the steps in the process, and what it’s doing behind the scenes. Using standard libraries is a repeatable task. Good enough.
I was a little more forward-thinking this time around and picked up dotenv to manage API tokens. I might even be over-using it a little, because it can use the variables you store in it to make other variables. It just makes the core app a little less busy at the expense of having a
.env file to consult if something seems to come from nowhere.
I have never been a big linter person, so I decided to give rubocop a shot. I appreciate it as an education tool. There are a lot of things about good Ruby style I never learned, so it was a little alarming at first. Sort of like I’d been made to code in a small room with a large speaker on the wall that was fed by a room full of the most earnest Ruby style pedants monitoring me from a hidden camera.
I ended up turning off a few things it wanted to complain about for … reasons … (like shebangs) but did learn a few things and did find that by paying attention and accepting the corrections I no longer guiltily run a beautifier before every commit because things are at least consistent and tidy. Plus it complains about a few things that are at least potentially problematic.
Not much. I think I’m feeling voluble because juggling oAuth’s needs with what I wanted to accomplish was a pain in the neck, and SmugMug maintains a separate API for uploading that is harder to interact with than the one I will need to use for the rest of the project. I don’t even really need the uploading API because their own uploaders and tools are great. Cloudflare was simple to figure out, hence alluring, but using my normal stuff (e.g. Lightroom) I can also get titles, keywords, exif data, etc. and do more interesting things without having to build out a database of some kind, or building special UIs to get that stuff. But anyhow, adding then managing the complexity of oAuth feels like an accomplishment. I don’t know how many little ideas I’ve bounced off of because the API I would have needed to touch had moved on from simpler approaches.
And I am feeling good because I realized at some point over the past couple of weeks that I am doing all this because it is playing. I used to do a lot of little utility scripts and silly gadgets because it was fun and absorbing, not because it was hugely practical or efficient. It was just playing. I stopped playing for a long while. It feels good to play again.
It just squirts an image up to the Cloudflare Images API, gets back a URL, and copies some pre-made Markdown to your clipboard suitable for pasting somewhere. Pretty simple to add a step to send it to a Drafts draft, etc.
Cloudflare doesn’t do ProRaw, and I’ve got my phone set to default to that, so the shortcut converts image input into 90% JPEGs (both to make them acceptable as a filetype and to compress them down under the Cloudflare file size limit. Generally I share from Lightroom anyhow, and that shares out however you choose and at whatever quality level.
I like sticking stuff up in Cloudflare Images because I get some dynamic options for presentation, quality, etc. that I don’t get when I’m sending things to micro.blog. Any automation I build against that API can eventually enjoy some reuse for the ideas I have around an image feed. If I need to abandon ship, it’s a simple API I can use to retrieve things.
I’m still plugging away at Smugmug automation, though. Cloudflare is fun to play with, doesn’t cost a ton, and is giving me some practice/learning opportunities. Ideally, though, I’ve had some kind of relationship with Smugmug for a very long time, I trust them, and would prefer to use them as the resting place for “seemed worth sharing” content.
I’m also curious about Adobe’s API.
What I’m ultimately interested in is whichever of these will let me layer in some basic metadata in the form of descriptions, etc. then retrieve it programatically for different re-presentation.
Today I put the last things into imgup I need to just run it and use it. I cleaned up the result page, added a chance to enter alt text at the beginning, and made it clean up its
tmp after it succeeds at uploading, which now has a cleaner error page for the most error-prone part of the app. I also have it using dotenv for configuration because that felt cleaner and more forward-looking than the YAML config thing.
There’s still a whole thing to do on the Smugmug side.
I added an image uploader to omgloldev today.
It reads exif at upload, so the image file gets the camera & lens model tacked on to the name.
Saturday Coffee Walk (House with an Interesting Fence Edition), 2023-01-14
“You Took Your Time,” Mt. Kimbie
Saturday Woodstock Coffee Walk, 2023-01-14
Lents, Woodstock, Mt. Scott-Arleta
Portland, OR “Rained the Whole Time,” Shlohmo
Coffee Walk, 2023-01-11
Springwater Trail, Foster Floodplain
Lents, Portland, OR
“Tear Stained Eye,” Son Volt: songwhip.com/son-volt/…
Coffee Walk, 2023-01-10 (Regular Edition)
A meter reader appeared this morning!
Coffee Walk, 2023-01-10 (“House with the Good Fence” Edition)
Al wanted to take “the alley” today so we walked by The House with All the Stuff on the Fence. There’s always a cat on the porch but it has never tried to be friends.
Coffee Walk Relocated, 2023-01-09
Biscuits Cafe Happy Valley, OR
Didn’t feel like getting speared by a falling branch in the gusts, so we opted for a trip to Biscuits.
This weekend I saw a few culture-clashes go by around the topic of photography that helped my thoughts gel. One involved a small dog-pile over charges of elitism, and one involved a putative professional talking down to someone who was just happy about their new camera. You could characterize those clashes as people talking down or talking up, but also just talking past each other.
Sometimes I want to write a screed about photography culture and inclusiveness because I’m an outsider in parts of that culture and find parts of it as frustrating and tedious as any other human endeavor that can be gate-kept. Other times I remember, as a younger person who reported to me once said, that I’ve had eight lives, including one as a writer, where I was an insider:
I was (well, am) a published author. For 15 years I successfully provided for myself & family. I was a managing editor, had credits in the industry outside authoring, I’d won awards, and I had success and leadership in multiple formats. I got very good at the parts of the trade that the web added to our job descriptions. I’m not saying that to brag, it’s just true and I’m noting it to get through this thought.
At the peak of my career in that field we were coming off the initial shock of blogging (amazingly disruptive to tech publishers) and were beginning to see the self-publishing wave roll in. A lot of my colleagues felt threatened, and that was a fair feeling to have because the people we thought of as “our readers” were experiencing the benefits of disintermediation. Also it just sucks to wake up to Dave Winer and Doc Searls reading a malediction over your still-living body.
We did reader interviews for one of my tech sites, talking to a kind of influencer down below the level of purchasing authority, but positioned to say “this is what I want” and have a credible chance of getting a purchase order approved.
Their universal responses to what we could be doing better:
“Be more like Stack Overflow,” and “you need more bloggers who just do this stuff and don’t care about all the nice formatting and filler.”
Suddenly our field was awash in amateurs. Bad ones, gifted ones, talented ones, terrible ones. And we were dealing with the disorientation of all our tools for determining “usefulness” or “quality” going out the window: Suddenly a terrible amateur could make up for 100-500 words of disjointed prose with five lines of useful configuration code slapped in a
As a reader, I was dealing with my own feelings about the self-publishing tide rolling in. As I’d scroll the store with my Kindle I’d see tons of $0.99 books. I was less threatened by that than annoyed: Fiction wasn’t something I was interested in doing professionally, but I had a definite hierarchy of quality in my head, and you had to have some sort of professional editing to get into the higher tiers. I know I said and wrote some uncharitable things about it all.
Then someone flipped the framing around for me, asking why amateur self-publishers are so averse to just paying for a goddamn editor, even just a copy editor.
The question engaged another part of my brain that had been dealing with writers for a while at that point, and still vaguely remembered when I was first starting out, badly damaged by public education and standardized testing, carrying around a deeply held belief I couldn’t write that no amount of positive feedback from my professors was helping:
“I can’t speak for other would-be writers, but as a past would-be writer who spent a lot of time hearing he could write well from assorted authorities, I’d say it’s some degree of ego. Not the nasty, snarly ‘grar, I’m better than you!’ ego, necessarily, but sometimes a more fragile manifestation that editors are in a position to harm without a lot of thought.
Having been put back in touch with my younger self, I remembered that I knew a lot about amateur creators and had a whole set of behaviors and strategies for helping them gain confidence:
“As an editor for online tech sites, I tend to recruit writers on the basis of what they know first, how well they can write next. If I can look at their sample and imagine merely editing it—not engaging it with lash and fire—I’m happy to work with them. I’ve had a few come through who are better than mediocre: They’re adept writers, but they happened to pick another career. Some are recently out of some IT program where they had a good experience with a supportive professor who suggested that they were better at writing than they suspected.
“I’ve learned to treat them the way I wish someone had treated me when I was first being told I was a good writer and had no way of knowing for myself: I understand that their poorly understood talent might seem like some sort of magical manifestation to them. Because they have no way of understanding why they’re good writers for themselves (they didn’t spend school reading good writers or learning about what makes writing good), they depend on outside authority. At the same time, they’re afraid that as easily as one random outside authority conferred the mantle of “good writer,” another could take it away.”
Reminded of empathy I’d stopped experiencing as something other than a management strategy, I came back around to the topic, which was how to deal with this influx of self-publishers of varying degrees of professional conscientiousness and talent:
“I’ve seen a lot of $1.99 and $2.99 genre books come through the Kindle store, and the one thing they remind me of above all other things is that the barrier to saying ‘fuck it … might as well go for it’ is lower than ever. Hopefully it’ll be a remedy for a lot of people who are completely paralyzed by the presence of the Web in their lives, because it’s a non-stop reminder that someone, somewhere is being so fantastically awesome that even trying to be heard or hoping to be appreciated is pointless. A lot of people will still fail, I doubt many of them will ever make a living at it, but a number have a better chance than they ever had before to make a living doing something they love.”
… and that, eleven years later, is where I try to be today.
Unlike my time as a writer and editor, my professional and personal interests have diverged. I like “ops stuff” and “chief of staff” stuff for work, and I am passionate about taking pictures for just walking around being me. I’ve done a couple of commissions and I’ve donated some prints to help out a struggling website, but mostly I just like to make sure there’s a camera with me, I like to share the pictures I take, and I like to revisit them later to see what I can see that’s new.
I share the internet with kinds of photographers who are different from me. They’re trying to make a living, they’re in an active state of honing their craft in a way that is different from how I try to improve.
There are pockets of that culture that both annoy me and remind me of when I was making a living with my writing, because there are similar technology-driven dynamics afoot. I’ve known a few photographers who have lost niche but sustaining businesses, first to prosumer digital cameras, and then to smartphones.
I get annoyed sometimes, because people under pressure or in fear for their livelihoods, while sympathetic characters, sometimes express their angst in really poor ways, either by denigrating hobbyist amateurs and their work, tossing around sexist slurs about the social aspects of popular photography, or simply insisting on speaking to amateurs and hobbyists in professional terms, as if to say there is a single way to talk about photography that must conform to their formalist or commercial concerns.
I also get annoyed because I see myself in them, from when I felt under threat and before someone asked a question that unlocked an answer in me that I’d forgotten I had.
And I feel a dull unease because they (often unintentionally) poke at the part of me who hears things like “you’ve got a good eye,” or “you should try to sell some of this” or “your pictures are just, like, photographic” and feels that jolt of vulnerability, that sense that “as easily as one random outside authority conferred the mantle of ‘good writer,’ another could take it away.”
The annoyance and unease dissipate a little, because I found my way to kindness and can only trust other people will, too. We need more art in the world. We need more people striving to make beautiful things, silly things, pretty things, ugly things, whatever. We need more people striving to create. So we need to be kind.
Coffee Walk, 2023-01-06 (Regular Edition) Lents, Foster Road Portland, OR
Coffee Walk, 2023-01-06 (Traffic Crash Edition) Foster Road, Portland, OR
Not sure what happened but it involved a crashed car on the sidewalk, a sheared off tree, and an investigation team.
Coffee Walk, 2023-01-04
Lents, Mt. Scott
“Tear Stained Eye,” Son Volt
The Portland Outdoor Store (2016-2022)
Downtown Portland, OR
Fujifilm X100F, X-T2/5, X-Pro3; Leica Q2, iPhone 11
Another one of my favorite go-back places. I’ve always loved the sign & the faded remnants of past signage you can pull out in the picture with a little care.
Coffee Walk, 2023-01-03
Lents, Mt. Scott, Foster Road
Short, pretty walk at Portland Audobon, 2023-01-02
I’d like a way to lock images in Lightroom or otherwise add a tiny bit of friction to just editing something without considering a few implications.
In Lightroom Classic you have the option to make a published collection with virtual copies. That’s handy, because if you’ve taken a bunch of time to get a collection into a consistent state, the virtual copies help ensure that you can keep it that way.
In Neue LR, the few publishing connections available just use the original unless you manually make a copy. Each collection you make using those connections is another collection whose members you need to be thinking about if you come across an image months or years later and think “didn’t work as a monochrome after all” or “I really like how this looks with the native film simulation,” or even just “wow, I overseasoned that thing.”
Alternately, they could leverage the new versioning system to create and publish a point-in-time version named for and linked to the collection. That sounds more complicated to implement, but it leverages a thing that’s already in the stack.
Locking seems less complicated and could offer a way to get a “hey – edit or copy?” dialog. I don’t think it needs, like, a two-key hardware dongle and a second person to confirm editing. Just a bit of friction.
I recently bought SmugMug’s raw upload feature, so using the SmugMug connector in LrC or LR makes a lot of sense: Every time I make a gallery out of the original raws, I get a passive raw backup of images that are implicitly the ones I care most about.
For now, the real answer for me is to not use Neue Lightroom’s limited connectors. I could figure out some metadata scheme or something to keep from shooting myself in the foot, but it’s easier to just use Lightroom Classic, make virtual copies for each collection, and be at peace.
That’s in keeping with something I want to work on more this year, which is just slowing down a little.
I made a lot of progress last year being more deliberate about a lot of things. I also gave myself a huge gift by spending days of work straightening out my archives and cleaning up some messes I made for myself. I need to take advantage of that gift and double down on that commitment to think through my workflows and behaviors a little more.
After two weeks of my previously described low-frills camera setup I think I am ready to stop thinking about it at all.
To recap, it’s:
For walking around it gives me a fairly neutral view: Colors are “real” but vibrant, shadows are easier to see into. It seems likely I am reacting less to the mood that film simulations and extreme tone settings would introduce. It also keeps me out of the settings and in the viewfinder. Looking back, it makes the X-Pro3’s “distraction-free” conceit a little funny: Don’t give people a 16-option menu to fiddle with and they won’t get distracted, but can still enjoy the quick feedback of a rear LCD and fast access to things they might want to change but don’t have buttons for.
For post, it gives me a mostly neutral image that doesn’t have anything weird going on with the colors. That makes the impact of each Lightroom choice – especially profiles – a little more clear. Shooting at DR200 instead of 100 gives me some leeway with shadow and highlight recovery. It’s possible to stumble into that sort of flat HDR look, but it’s also completely in my hands.
It’s also completely amenable to my very generic “punch this up a little” import preset, which sets a few things to about 75% of where I usually end up. That makes it a little easier to triage and saves me a little twiddling once I’ve got a set to work with.
As someone who can complicate things quite a bit, I’m happy having a setup that is less complicated and less fiddly. There’s no “how’re my settings?” when I grab the camera and go out the door. I just grab it, go shoot, and then enjoy the interprative or reconceptual work in a comfortable chair at home.
Foster Floodplain at Dusk, 2023-01-01
Foster Floodplain Natural Area
Lents, Portland, Oregon
Walk to the Checkers Mart, 2023-01-01
Lents, Portland, Oregon
Ben celebrated a little hard, so we took it upon ourselves to fetch him saltines and 7-Up.