in reply to

After a long time of using fish, and before that zsh I've returned to being a full time bash user. There was no particular rhyme nor reason to my using one shell over another, so in an effort to simplify my setup across my two computers and the heaps of servers I interact with on the daily I've gone all in on bash.

Jupiter@pizza:~$ 

wow, no particular reason? Not all the zsh features? I've been looking into new hipster shells (ion, xonsh, elvish…) but none of them can fully match the power of my zsh setup yet :D

hi! do you receive webmentions? :)

in reply to

CSS development isn’t programming in the traditional sense where you have loops, conditions and variables. CSS is going that direction to a degree and Sass paved the way. But the most needed skill in CSS is not syntax. It is to understand what interfaces you describe with it. And how to ensure that they are flexible enough that users can’t do things wrong and get locked out. You can avoid a lot of code when you understand HTML and use CSS to style it.

Continuing...

A lot of “CSS is not real programming” arguments are a basic misunderstanding what CSS is there to achieve. If you want full control over and interface and strive for pixel perfection – don’t use it. If you want to build an interface for an inclusive and diverse web, CSS is a great tool. Writing CSS is describing interfaces and needs empathy with the users. It is not about turning a Photoshop file into a web interface. It requires a different skillset and attitude of the maintainer and initial programmer than a backend language would.

So much 🙌 for this.

Yeah, talkind about "real" and "not real" programming is weird and kinda pointless. CSS is a domain-specific declarative programming language. You can't practically write general programs in CSS, but that doesn't make it "not real".

in reply to

Implementing Webmentions

In a world before social media, a lot of online communities existed around blog comments. The particular community I was part of – web standards – was all built up around the personal websites of those involved.

As social media sites gained traction, those communities moved away from blog commenting systems. Instead of reacting to a post underneath the post, most people will now react with a URL someplace else. That might be a tweet, a Reddit post, a Facebook emission, basically anywhere that combines an audience with the ability to comment on a URL.

Whether you think that’s a good thing or not isn’t really worth debating – it’s just the way it is now, things change, no big deal. However, something valuable that has been lost is the ability to see others’ reactions when viewing a post. Comments from others can add so much to a post, and that overview is lost when the comments exist elsewhere.

This is what webmentions do

Webmention is a W3C Recommendation that solves a big part of this. It describes a system for one site to notify another when it links to it. It’s similar in concept to Pingback for those who remember that, just with all the lessons learned from Pingback informing the design.

The flow goes something like this.

  1. Frankie posts a blog entry.
  2. Alex has thoughts in response, so also posts a blog entry linking to Frankie’s.
  3. Alex’s publishing software finds the link and fetches Frankie’s post, finding the URL of Frankie’s Webmention endpoint in the document.
  4. Alex’s software sends a notification to the endpoint.
  5. Frankie’s software then fetches Alex’s post to verify that it really does link back, and then chooses how to display the reaction alongside Frankie’s post.

The end result is that by being notified of the external reaction, the publisher is able to aggregate those reactions and collect them together with the original content.

The reactions can be comments, but also likes or reposts, which is quite a nice touch. For the nuts and bolts of how that works, Jeremy explains it better than I could.

Beyond blogs

Not two minutes ago was I talking about the reactions occurring in places other than blogs, so what about that, hotshot? It would be totally possible for services like Twitter and Facebook to implement Webmention themselves, in the meantime there are services like Bridgy that can act as a proxy for you. They’ll monitor your social feed and then send corresponding webmentions as required. Nice, right?

Challenges

I’ve been implementing Webmention for the Perch Blog add-on, which has by and large been straightforward. For sending webmentions, I was able to make use of Aaron Parecki’s PHP client, but the process for receiving mentions is very much implementation-specific so you’re on your own when it comes to how to actually deal with an incoming mention.

Keeping it asynchronous

In order for your mention endpoint not to be a vector for a DoS attack, the spec highly recommends that you make processing of incoming mentions asynchronous. I believe this was a lesson learned from Pingback.

In practise that means doing as little work as possible when receiving the mention, just minimally validating it and adding it to a job queue. Then you’d have another worker pick up and process those jobs at a rate you control.

In Perch we have a central task scheduler, so that’s fine for this purpose. My job queue is a basic MySQL database table, and I have a scheduled task to pick up the next job and process it once a minute.

I work in publishing, dhaaaling

Another issue that popped up for me in Perch was that we didn’t have any sort of post published event I could hook into for sending webmentions out to any URLs we link to. Blog posts have a publish status (usually draft or published in 99% of cases) but they also have a publish date which is dynamically filtered to make posts visible when the date is reached.

If we sent our outgoing webmentions as soon as a post was marked as published, it still might not be visible on the site due to the date filter, causing the process to fail.

The solution was to go back to the task scheduler and again run a task to find newly published posts and fire off a publish event. This is an API event that any other add-on can listen for, so opens up options for us to do this like auto-tweeting of blog posts in the future.

Updating reactions

A massive improvement of webmentions over most commenting systems is the affordance in the spec for updating a reaction. If you change a post, your software will re-notify the URLs you link to, sending out more webmention notifications.

A naive implementation would then pull in duplicate content, so it’s important to understand this process and know how to deal with updating (or removing) a reaction when a duplicate notification comes along. For us, that meant also thinking carefully about the moderation logic to try to do the right thing around deciding which content should be re-moderated when it changes.

Finding the target

One interesting problem I hit in my endpoint code was trying to figure out which blog post was being reacted to when a mention was received. The mention includes a source URL (the thing linking to you) and a target URL (the URL on your site they link to) which in many cases should be enough.

For Perch, we don’t actually know what content you’re displaying on any given URL. It’s a completely flexible system where the CMS doesn’t try to impose a structure on your site – you build the pages you want and pull out the content you want onto those pages. From the URL alone, we can’t tell what content is being displayed.

This required going back to the spec and confirming two things:

  1. The endpoint advertised with a post is scoped to that one URL. i.e. this is the endpoint that should be used for reacting to content on this page. If it’s another page, you should check that page for its endpoint.
  2. If an endpoint URL has query string parameters, those must be preserved.

The combination of those two factors means that I can provide an endpoint URL that has the ID of the post built into it. When a mention comes in, I don’t need to look at the target but instead the endpoint URL itself.

It’s possible that Bridgy might not be compliant with the spec on this point, so it’s something I’m actively testing on this blog first.

Comments disabled

With that, after about fifteen years of having them enabled, I’ve disabled comments on this blog. I’m still displaying all the old comments, of course, but for the moment at least I’m only accepting reactions via webmentions.

Welcome to the webmention world :D

in reply to

Okay - I’m pretty sure I now have a functioning #indieweb #micropub endpoint, with syndication and correctly returning a 201 header

It works! Webmention, that is. I didn't even notice that the post is about Micropub, not Webmention :D

(btw, your h-entry doesn't have u-url)

in reply to

Placeholder Images

The size of my images changes fluidly with my responsive layout. Since the browser does not know their heights a priori, the space collapses while the images are still loading. Once the images load the entire page reflows and the rest of the content jumps around to make space for them. It would be much better if the space for the images was reserved from the start and, as a bonus, if some lower resolution version of the images displayed, while the images load. Here is how I do it.

Nice. I do that as well, but with WebP only (WebP's header is smaller than JPEG, I remember that Facebook article about their app reconstructing the JPEG header…).

So WebP-supporting browsers get the tiny base64 preview and the full image loading over it, and JPEG-only browsers get a progressive JPEG (mozjpeg-optimized), with the image's dominant color as the background before the JPEG even starts loading.

in reply to

I listen to a lot of podcasts. Here is a list of the ones I try to keep up with, listening to new episodes within a week or so of their being released.

  • The Bugle, a political comedy podcast. Generally hilarious, especially if you enjoy puns and/or cricket. I know nothing about cricket, but still enjoy this podcast.
  • Core Intuition, a two dudes talking to each other style tech podcast.
  • The Allusionist, a podcast that explores language, how it works, where it comes from and sort of where it is going, too
  • Unorthodox, lets me feel like I’m participating in jewish life despite living in rural Maine (where there are no other jews)
  • Serious Issues: A Comic Book Podcast, a weekly comic book round-up podcast. I’ll admit that I don’t typically make it all the way through each episode 🇦🇺
  • The Weekly Planet, a two dudes talking to each other style pop culture podcast 🇦🇺
  • the memory palace, an absolutely gorgeous semi-narrative history podcast. This podcast brings the format closer to poetry than anything else 💯
  • Reply All, a more traditional radio-style podcast focused on the internet and internet culture. Lately they’ve been pretty focused on hacking and surveillance. I’m enjoying the weird narrative bits they’ve started to include at the end of each episode
  • Upgrade, a two dudes talking to each other style tech podcast on the relay.fm network. I think I’m a bit addicted to the cult of personality that orbits relay.fm because I listen to a heap of their shows. I often listen to relay shows whilst working, so the hosts of relay shows sort of feel like co-worker background noise at this point
  • The History of Rome, it is all in the title. Monologue style
  • Israel Story, like This American Life, but Israeli. The show pulls its punches sometimes. It’ll creep right up to a big, hairy issue, but then tends to back away. I appreciate that it tends to be individually-focused, though, so helps to humanize the macro-level issue of the region
  • Benjamen Walker’s Theory of Everything, weird but excellent. I like that some episodes are difficult to trust. The show toes the line between reportage and narrative…
  • Harry Potter and the Sacred Text, a podcast reading through each Harry Potter book, chapter by chapter, and using the mechanisms of a divinity school education to deconstruct the passage
  • Under the Radar, a two dudes talking to each other style tech podcast, focused on the specifics of indie app development. I like that they also address peripheral concerns, like accounting and booking and QA
  • Roboism, light on content but hands down has the best closing theme of any podcast I’ve found 🤷‍♂️
  • The Run Loop, a two dudes talking to each other style tech podcast. The host interviews a different indie app developer each episodes. Seems really dude heavy for an interview show, but the show does surface some great stories from the trenches of app development
  • Medieval History for Fun and Profit, a two ladies talking to each other style history podcast! Professorial hosts do their best to address any and all questions about life in medieval times
  • Song Exploder, a musician, composer or band breaks down one of their songs piece by piece in each episode
  • Accidental Tech Podcast, a three dudes talking to each other style tech podcast. The one and the only. I may be in love with John Siracusa
  • Analog(ue), a two dudes talking to each other style touchy-feely-techy life podcast
  • Connected, a three dudes talking to each other style tech podcast…writing this list I’m starting to realize that I listen to WAY to many shows like this
  • Invisibilia, an NPR powerhouse
  • Robot or Not?, a podcast that explores whether or not something is a robot or not…lately they’ve been branching out into other topics, but always couched in the format of this this an x, or not
  • Originality, an interestingly formatted interview podcast exploring creativity, creative work, and the creative folks fueling it all
  • 99% Invisible, Roman Mars. The man. The myth. The legend. I’ll admit, lately I’ve felt the show is a little off the rails. I’ve been enjoying their written content a lot more than the podcasts of late
  • Planet Money, I enjoy that this podcast is typically news adjacent. You are involved with learning about current events without necessarily having to face said events head-on
  • Reconcilable Differences, see my aforementioned love of J. Siracusa
  • Saga Thing, a two dudes talking to each other style podcast. Professorial hosts are working their way through all the sagas of the Icelanders, and judging them a la X-Factor. Inspired by the Rex Factor podcast (see below). This is one of my favorite podcasts 💯
  • Canvas, a two dudes talking to each other style iPad/iOS productivity podcast. The hosts really wade into the deep end of iOS. I find this podcast useful for my work, since the show does a great job of breaking down iOS power features
  • jesuitical, in all honesty, I don’t know why I listen to this show…I guess as a window into a slightly different, albeit still liberal, worldview
  • Slate Presents Lexicon Valley, a linguistics and language focused podcast, if I wasn’t compulsive I’d probably drop this show
  • Rex Factor, a two dudes talking to each other style podcast. Amateur historian and his funny-buddy are reviewing all the kings and queens of the UK. In the first (multi-year) season they made their way through all the monarchs of England, this season they are working through the monarch of Scotland 💯
  • Do Go On, this is my favorite podcast at the moment. It is hilarious. It is Australian. I cannot run and listen to this podcast at the same time, because I am typically doubled over in laughter. Each episode one of the three hosts presents on a topic, the other hosts intervene 🇦🇺 💯
  • Human/Ordinary, another amazing podcast, similar yet very different from the memory palace 🇦🇺
  • Pod Save America, because sometimes the choir needs to be preached to. Political
  • Download, a weekly roundtable tech news show
  • On the Media, because the medium is so often the message. This show takes a critical look at how the media is covering current events
  • Reasonably Sound, another one of my favorite. This show is, simply put, about sound. A nice introduction to contemporary critical theory
  • Imaginary Worlds, a podcast about stories, the worlds in them, and how they relate to and shape our world
  • The Adventure Zone, a DnD podcast. I started at episode one anticipating a ruckus, sort of vulgar romp, which the show certainly delivers, but this podcast is so much more. I honestly think they’re at the bleeding edge of a new type of narrative storytelling
  • Remaster, all about video games because I like listening to people talk about them more than I like playing them
  • Team Human, again, because sometimes the choir needs to be preached to. Political-ish, tech-ish, wields a bit of social theory from time to time, to

Bonus! Towards a Poetics of Audio: The Importance of Criticism

wow that's… a lot

in reply to

Rebuilding my site from Slack

I’m currently using Jekyll to run the front-end of my website. Jekyll is a static site generator which means anytime something needs to update on my website, I have to rebuild it. I currently trigger a site rebuild from the site’s backend which is running in node.js. I trigger these rebuilds at 2am every morning, anytime I receive a new post via micropub, and manully when I feel like I need to. So far, manually means logging into my server using the command line. I also attempted to create a public secret URL that I could trigger by hitting a url, but it just never seemed to work that great.

Today, after integrating my site with slack I realized rather than just sending webmentions to slack, I could also create a slash command from my slack to my site. Using all the same securities that I added to the webmention alerts, I was able to rebuild my site several times today at a whim using my Slack account.

Screenshot of site rebuild from slack example

I’m pretty excited about this development, but I hope it won’t be needed for much longer. I’m working on rebuilding the front-end of my site in Angular Universal so that my site no longer has to be built statically whenever there is new content. 🤞 Here’s to hoping I’m able to finish that transition soon, but until then this is a nice upgrade.

oh, so that's why my reply took a long time to appear, even though webmention.io processed it instantly :)