I made some improvements to OnePo this week. Specifically:

  • I brought back the ability to insert more text, image and video blocks in between existing blocks in your post. Personally I found it too crazymaking to always add things at the bottom and then nudge them up.
  • However, there were user experience concerns expressed about that being too much before. This is why I took a stab at a better experience for it: the buttons to add new blocks are nestled in a single "+" toggle above each existing block, and you can toggle it closed again.
  • Speaking of nudging things up from the bottom, that was not a great experience either, particularly if you had to nudge something with the arrows ten times. So now we drag blocks around instead.

These changes work well on desktop, should also work well on tablets (let me know if you get the chance to try it), and work okay on mobile. I do find the new experience of dragging an image a little weird on the iPhone, but it works and hopefully I can continue to fine-tune it.

However... these changes are a bit selfish. There's nothing wrong, obviously, with putting my own uncompensated free time into features I like. Honestly! The nerve of this guy!

But, I've also promised alt text for images and that's a matter of accessibility. So I will get back to that next.

Alt text will be easiest to add for images in posts, because those are full-blown blocks in the editor. Adding one more editable field to them is no big deal.

But for images in comments, it's necessary to rethink the user experience. Right now it's a bit of a hack: "just pick an image and it'll upload and bam your comment is live!" That's cute, but it closes the door on adding alt text before your comment is live. And also there is currently no way to edit an existing image comment. So yeah, rethink.

I did carry out some interesting experiments in that area recently, which also included improvements to the image uploading experience. If I manage to carry that through, image uploads will be a lot faster because the browser will be doing the initial resizing work if necessary.

MORE
6/15 '23 39 Comments
It’s interesting how what makes you happy about OPW is and adding features is also things which are generally good. You’re not like other people who say, “IT WORKS it performs as advertised YAY now how do we use this for data mining and charge people $120 a month for it?”
This is why we love it here. Because we trust Tom to be the caretaker of our stories.
Tom has been a builder and a respectful steward of Community for as long as I've known him. Which... is a WHILE.
I met Tom in my freshman year of college. He was a junior. How did you two meet?
I’ve been wondering the same thing but didn’t know how to ask politely. I assumed it was talk.bizarre.
Annie and I met through talk.bizarre, so about the same time I met you IRL, and I once visited Casa Canetoad just after college. Also saw each other at an in person talk.bizarre BOB. I was gaffe central back then, but a few years on I set up Nerdsholm and did a respectable job of that whole stewarding thing for a number of years. Still remember Annie’s incarnation as Slim the Cowboy with fondness.
It's funny - I never experienced talk.bizarre, but I know enough folks that were part of it that it feels like it's a part of my own history. Kinda mind wobbly, that.
(For anyone who didn't experience Nerdsholm: it was basically an online chat server, although nominally a shared text adventure-y kind of space, as many were at the time. A large cohort of us were logged into it pretty much continuously and shared quite a bit of our lives. There was a wedding!)
That’s awesome.

My buddy Wes briefly set up an installation of his own custom MUD for some of us to use as a chat server. Not the same, but fun.
I have fond memories.
Annie is kind. I was quite a doofus when we met. But I grew into a respectfully stewarding doofus.
Tom is far more modest than I am kind.
Both can be true. In fact, I'll just say both are true - Tom is very modest, you are very kind.
I yield to your superior wisdom!
Tom is very modest, Anne is very kind, and Shell is very wise!
Yeah I’m way more modest than - damn.
That was much faster and easier than usual.
Actually it’s a mandevilla and some nasturtiums, but yes, the upload went more smoothly.
I didn’t do anything about the upload yet actually. That’s all in the experiment column right now.
Come in, I was giving you credit!
Sometimes I forget how big your brain is. Tis a thing of wonder.

I read your words about “user experience” and… it would never occur to me that these things needed “fixing.” Every day I’m merely grateful for this gift you provide and how it unfolds again and again, every day, in front of me.
She said it better than I did.
Yup. That exactly. Thank you!
I'm just happy he uses it for the Forces of Good. 😉
>Speaking of nudging things up from the bottom

How about a little French thing that hasn’t been fed in 9 or 12 weeks nudging things up from the bottom, Chris?
Hey, how do I turn the email reminder back on?
"Me" -> "Account" -> "Daily Email" checkbox
Thanks. As a low priority task, could you date stamp and separate the notifications? Maybe date stamp replies as well, although I enjoy the clean aesthetic.
and can you put a 3/4" layer of cream cheese frosting on top? Must be made with real Philadelphia cream cheese.
With a cherry too, please.
You won't get it if you've cleared your notifications by looking at them on the web.
Hmmm. I do both. I get the email, but I also do a 'detailed' look using the notifications on the web.

I mean, I _want_ both, but I'm wondering if there's a risk I will accidentally turn something off now.
You won’t turn anything off. It just won’t send what you have already read.
 

I fixed a bug. Turns out "delete comment" didn't work, for some unspecified amount of time, but probably since early this year. It failed in a very obvious way though, so I doubt anyone was misled into thinking they had removed a comment. All tidied up, sorry about that. Thanks to the person who reported it.

I also modernized a few boring technical details while I was in the neighborhood.

Every now and then I remember my new machine has a touchscreen. Then I try to forget. I'll never clean it.

MORE
5/6 '23 1 Comment
Memento mori.

Love, love, love.
 

Thanks to Matt Lichtenwalner for the idea.

I start the day by asking Siri to play the news, which for me means NPR News Now, the top-of-the-hour newscast. I use Siri a lot, but that's a subject for another post.

After that I usually dip into The Late Show Pod Show with Stephen Colbert, especially if there's a monologue or a Meanwhile segment. What can I say, I love me some Meanwhile.

Lately I've also started listening to Coder Radio. They talk about software and technology and politics surrounding that. I don't like everything they say, but that's good for me, as long as I'm disagreeing with other members of the reality-based community. And they had a strong recent episode on the Restrict Act, which is some bullshit. These guys also do a bunch of Linux podcasts.

Alternatively, if there's a new episode of Gadget Lab from the Wired crew I'm all over that. As with Wired in general these days, they spend at least as much time critiquing tech as they do nerding out over it.

That's about it on a typical weekday. But sometimes, just sometimes folks, I throw on yesterday's clothes, strap on my Bose headphones, saddle up my trusty Oreck, lean into the household chores and go full beast mode with  Planet Money, The Indicator, Linux Action News, Life in the Ted Lane, EV News Daily, and occasionally The Moth. I have a puzzling resistance to firing up The Moth, I think because it seems like a Bigger Deal, and then I'm reliably captivated.

Last year I also spent a lot of time listening to How We Survive, a podcast from NPR's marketplace about fighting and adapting to climate change — or, in many cases, putting our heads in the sand (*cough* Miami). But I'm all caught up for now.

Just recently I got into Serious Trouble, which covers the legal travails of people who are in serious trouble, most of whom should have known better. Quality schadenfreude, but they are currently annoying me by demanding payment for multiple consecutive stories and just airing teasers on their free feed.

I did decide to pay for Planet Money+, which mostly entitles me to behind-the-scenes and extra-details stories I mostly skip, but I don't mind because Planet Money has been in my life so long I felt like a heel not supporting them. What can I say, I'm addicted to the Beigie Awards.

I use Apple Podcasts for all of the above. It works with Siri and I never seem to have difficulty finding a show I've heard about. But I will hit play directly on a website if there's something in my way, of course.

And that's my 100% brutally honest podcast list. Apparently I'm an econ fiend. Who knew?


MORE
4/19 '23 1 Comment
That sir, is an excellent selection!

I was subscribed to NPR News Now for a while, but since I subscribe and download my episodes overnight on hotel wifi for use in the car during the day, I was getting 743850954 instances of the same story, so I bailed. If I was just getting one copy (the latest) that show would be wonderful.

_Make Me Smart_ from my list is a Planet Money show. I don't know why I haven't listened to Planet Money itself. May be time to change that.

And lastly, I would probably do the Late Show Pod Show, but I tend to see those same segments on YouTube while I'm getting ready in the morning.

Thanks for sharing your list!
 

No more goldang inexplicable sidey-scrolling on yer phonez goldangit!!

What was it, you ask?

Why, it was the fleuron, of course. The fleuron with the negative margins.

He wants a fleuron

With negative margins [doop dweet doooo]

Because he knows there's no such thing

MORE
2/10 '23
 

Fixed:

  • The "cancel" button for new, never-saved comments works reasonably now (broken for a long time).
  • Pasting a link to something well-annotated for social sharing, like a CNN article, now generates a nice "open graph" summary again. Also probably broken for some time super broken since ever in half a dozen ways, sorry. Debugged the daylights out of this.
  • Image comments (broken by the recent rewrite).
  • Layout issues on the iPhone, especially when open graph is in play.

Also, code quality things:

  • Removed yet more "dead code" (code no longer in use, exactly like junk DNA: if left in place too long there's a chance it'll be "in use" after all, in some sneaky and incomprehensible way).
  • Stopped using the obsolete "request" module to fetch stuff.

All in all, I'd say I got away with the rewrite pretty well. Nothing went hugely sideways. Twitching to do more with the site now, which is a nice feeling after slogging through / dreading the rewrite for so long.

Thanks to all who reported bugs.


Nice Open Graph example (CNN article).

Vastly more important Open Graph example (Mastodon #caturday post).

Looks like Mastodon's og:image tags have site-relative URLs. I noticed 'cuz I had a bug handling those. Amusingly, Facebook does not support relative URLs in open graph at all. This means I now have better support for Open Graph than Facebook. Phbbbbbt.

BTW Open Graph only "unfurls" if you paste a link straight into your text without clicking the link icon in the rich text editor. So if you don't want it, if you just want to type some text and then link it to something because this is the hyper-texter-webs goshdarnit, then type that text, select it and click the link button.

Open Graph still needs some styling love on mobile fixed that shizzle too.

MORE
2/5 '23 9 Comments
You're a wonder!
Maybe even a One Post Wonder.
Thank you, thank you, for making this community and keeping it good.
Came here to say this. :)
Seems I no longer get email notifications that my friends have been writing. Or I need to inspect my spam filters?
Those still go out. Check your spam?

They only go out if you haven’t been reading.
Didn’t they used to go out if people I follow post? I’m only getting them for replies to things _I_ post. Maybe I’m misremembering.
 

Hey, did you feel something? I hope not.

I've deployed a new version of the One Post Wonder source code. And it should be... exactly the same, for you. If not, please let me know.

For avoidance of confusion: if something seems busted, it's not you, it's me. Let me know. Thanks! I did lots of testing. But... software is hard.

Just in case, my email is tommybgoode@gmail.com. If stuff broke, tell me things ASAP. Thanks!

What Changed

"So... if everything is the same... what's different?"

I rewrote the code using a modern idiom that other programmers will be able to follow. Which makes it more practical for others to help me move OPW forward. It's a hell of a lot easier for me to maintain the code as well.

You see, back in the Bad Old Days, Node.js programming was like this:

"Hey Jane, fetch me some blog posts, then call me." [Hand-sign of phone]

"Hey Jack, when Jane calls me, fetch some comments, then call me." [Hand-sign of phone]

"Hey Joe, when Jack calls me after Jane calls me, fetch some images, then call me." [Hand-sign of phone]

Except dozens of requests are coming in at once so it's like a telethon in there with only one person manning the phones and everybody wants a fucking tote bag and theoretically that's OK because you don't actually speak continuously to one person right, so...

AAAAAAAA yeah complete madness.

In the New Idiom, Node.js JavaScript programming is like this:

MOTHER MAY I fetch some blog posts.

MOTHER MAY I fetch some comments.

MOTHER MAY I fetch some images.

Behind the scenes, it's the same telethon, but the management of all that parallel madness is encapsulated in the magic words "MOTHER MAY I," which allow us to express what we need to do as a simple series of steps and let JavaScript sort it out behind the scenes.

An astute observer will note that I still have to say "MOTHER MAY I" before each thing. I can't just do the fucking things. Which is still weird and unintuitive. However, in modern JavaScript "MOTHER MAY I" is expressed in the single word "await," which is at least convenient and readable. Crucially, it's at least readable by people who don't do this all day and who don't know this particular codebase by heart.

And the performance benefits are real enough that these days, Ruby, Python, PHP and even Rust optionally offer the same thing for those who need the speed.

So, we've got that going for us.

[Waves tattered flag]

Wait. Why do we do this?

A person might ask why programmers put up with any of this. Java and Python and Ruby and frickin' PHP all let you just write:

Do a thing

Do another thing

Do a third thing

THE END

So why would you put up with this "MOTHER MAY I" bullshit from JavaScript?

Well... because it's fast. Most languages for the web give you a separate thread, aka basically a completely separate telethon volunteer, to think about each request, aka person calling to get a tote bag. Which is enormously convenient. But, also slower because you're not maximizing the throughput of your telethon volunteers.

And... you have to write JavaScript for the browser anyway. To a first approximation, at least. So you may as well double down and use those skills on the server too, right? Less mental context switching. Which gives you plenty of energy for typing MOTHER MAY I! This is sane. [Nods firmly]

Um... great! What's next?

"So what's next?" New features? Probably new features. I promised alt attributes a LONG time ago.

Probably also breaking up that massive "routes.js" file into separate collections of API routes by topic, so I can find stuff.

Probably also TypeScript, just so I can put "8 billion years TypeScript experience" on my resume.

Thank you sir, may I please have another?

"What's TypeScript?" It's a new flavor of JavaScript that is "strongly typed." That means you have to say "MOTHER MAY I" even more often and in twisty new ways... but, if you fail to say it in exactly the same way when you try to call that same code later, it'll stop you and say "uh-uh, that's going to introduce a bug."

So it's a good thing.

One may well ask: does that mean TypeScript can check the original "MOTHER MAY I" incantations (aka "await" keywords) to make sure none are missing? That would be seriously useful.

Oh gosh no, it can't do THAT.  Who would want to catch by far the most common source of bugs in a Node.js program? No, it only stops you if you pass a string instead of a number (*), which I practically never do.

But I hear you can do it if you combine TypeScript and eslint and a roll of duct tape. So maybe I'll give that a try.

(*) Yes, yes, and a thousand more complicated but ultimately similar things.

MORE
2/2 '23 2 Comments
Test. Hi.
Looks like it works. Success!
 

I didn't think I'd see anything at all from a construction site on the edge of a major urban area, but everything lined up in Stellarium and that is very probably the comet. I guess. I have to say my phone saw it a little better than I did. It is a little green.

For those in darker places, now is certainly the time to go outside and have a look. Shortly after sunset in the northern sky. You still have a few days.

MORE
1/31 '23 7 Comments
I bet Annie will be able to see this really well in VT.
I'm waiting for that reply too.
I tried. It was very clear last night into early morning, but… I wasn’t awake early enough. The dog woke me at 6:00, and by that time it was too light already. Not sunrise, and I could see the Little Dipper well enough, but too light out all the same.

Last might was the only clear night we’ve had recently, too. Tonight it looks as though it will be partly cloudy around 5:00 am.

And anyway I didn’t sleep well last night and it’s the same tonight, so probably I won’t get up early to see if it’s visible.

There’s also a surprising amount of light pollution where we are. It can be pitch black on the ground around the house, but Burlington is just to the north of us, and the sky in that direction glows.
I will say, last night as the sun was setting, Mt. Mansfield in the *east* was jaw-dropping. The ridge line was draped in sparkling snow, and glowing pink against a fading blue sky. Rose snapped a photo through the window of the moving car. As you might expect, it didn’t begin to represent the experience.
Current status: trying not to spend $100 on a monocular telescope with a smartphone adapter so I can take zoomed-in crummy pictures.
 

To my astonishment, I've actually finished my first pass of converting the entire back end code base of one post wonder to modern async/await syntax. What does this mean for you? Absolutely nothing, except that it will be easier to maintain in the future, and I will hopefully be better able to get others to consider assisting in that task.

I'm making other changes as I go along that aim toward maintainability, and just making it hard to write bugs in the first place.

I reached a point where all I'm doing is testing and debugging, testing and debugging, until it actually works again, and I can think about pushing it as the new current release.

After that, it will be time to think about refactoring the front end code. Refactoring is a fancy word for rewriting, or at least restructuring. All I have to do is choose a front end framework so the code will be more maintainable for other contributors, easier for everyone to understand. All I have to do is choose a framework. Like, insert a list of at least 1000 possible choices. Of course, there are just a few well-known ones. If I go with React, people will know that word 10 years from now when they try to contribute to my code. This does not necessarily mean that what is called React in 10 years will look anything like it, but they'll know the word.

Seriously, I can see that I write software with very long release cycles. This makes me an excellent candidate to maintain the software stack for the interstellar multigenerational probe. Just slow me down and run me as a low priority process.

MORE
11/30 '22 4 Comments
Slow me down to Priority Bitty and I'll dream away just like Walter Mitty. Oh, won't you please make me code.
It’s sort of like cleaning the refrigerator, isn’t it? You do a ton of work in the name of household sanitation and sanity, then shut the door and walk away, and the house doesn’t look any cleaner. But…
The Martin Fowler and Kent Beck "Refactoring" text is one of the reference books I keep within arm's reach.
That's a job in technology - often the result of kicking ass is a smoothly-running site/app/system ... meaning that if you're really good, no one notices. If you're not really good, your site/app/system crashes and EVERYONE notices.
 

Taking an early upgrade slot rather than waiting for Linode to do scheduled maintenance at 5am.

MORE
11/17 '22 1 Comment
Aaaand we're back.

My experience is that everything is zoomier after you take a "free upgrade" (aka "please for the love of god let us put you on a non-ancient host server") from Linode, not that we were experiencing any real slowness before.

Linode's been a pretty great host all along. I moved my smaller projects at work to AWS Amazon Lightsail because of Linode's very occasional outages; Lightsail is Amazon's Linode / Digital Ocean clone, so moving to Lightsail allowed us to say to customers "you're hosted with AWS" while doing a more Linode-like amount of work. They also took care to set the pricing to be competitive. But I do like Linode and now that they are nestled within Akamai I see no reason not to expect them to continue to be a reliable choice for many years.