gradient.horse

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

A collection of badly-drawn horses run across a gradient background.

Honestly I just wanted to play around with gradients. But gradients without anything on the horizon lack something, so I added horses. Since I can’t draw horses, now you can draw them. And watch them parade across the screen alongside horses drawn by people you probably wouldn’t like. Or maybe you would, how should I know?!

I love a good (by which I mean stupid) use of a .horse domain name. I’m not sure anything will ever beat endless.horse, but gradient.horse might be a close second.

Draw a horse. Watch it get animated and run wild and free with the horses that other people have drawn. That is all.

Keep the Internet fun and weird, people.

Gay sheep – what the FAQ?!

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Did you know that about 1 in 12 sheep is gay? And we are not just talking about rams. According to scientists, same-sex behaviour has been documented in over 1500 species. You see, queerness is quite prevalent on planet Earth. But sadly, there are still many people that have a problem with it. The shocking truth is: 62 countries still criminalize same-sex relationships – that’s right, it’s illegal to be gay in one third of the world! And even where it is not illegal, cases of queer hostility are increasing – including in Germany. This is why we are getting the help from a gay flock of rams in a small town in Germany: We are using their wool to create fashion products that support projects for the queer community.

A flock of sheep on a green meadow with a shepherd holding a rainbow flag.

Meet the world’s first gay flock of sheep

Sadly, gay rams are often sent to slaughter because they can’t fulfill a farm’s “breeding role.” We rescue them before that happens, giving them a safe home where they can live and love freely. Each year, their wool is crafted into fashion, with profits donated to the queer charity LSVD+. You can also adopt a gay ram – helping cover food and medicine to keep them happy and healthy for life. Every adoption comes with a digital certificate you can print at home.

Well this is just adorable.

About 1 in 12 rams (and a similar proportion of ewes) show a strong preference for other sheep of their same sex. Which is useless for breeders, who expect their rams to be able to impregnate 40 ewes per fortnight, so such rams tend to be destroyed.

But this farm in Germany has started rescuing them and allowing people to “adopt a gay sheep” to help sponsor their care and upkeep. They also collect a small amount of wool from their queer flock and make products (which almost-immediately sell out).

So yeah: there’s a flock of homosexual sheep living happily together on a farm in Germany, and that’s just awesome.

88×31 Button Creator

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Welcome to my 88×31 button creator, this is a pretty rough and ready implementation so it could be buggy, please let me know if you find any issues.

This supports gif despite the basic canvas tag limitation courtesy of gif.js – none of this would be possible without that project.

Dan (whose website is freakin’ awesome, by the way) has done an amazing job with this new 88×31 generator. Look at this (trashy, but I don’t care) button I threw together in literally seconds, with it:

88×31 animated button with text 'MAKE A BTN' over a glitchy holographic starfield.

Have a play, and remind yourself that the Web is brilliant.

A small collection of text-only websites

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

I’m not saying the plain-text is the best web experience. But it is an experience. Perfect if you like your browsing fast, simple, and readable. There are no cookie banners, pop-ups, permission prompts, autoplaying videos, or garish colour schemes.

I’m certainly not the first person to do this, so I thought it might be fun to gather a list of websites which you browse in text-only mode.

Terence Eden’s maintaining a list of websites that are presented as, or are wholly or partially available via, plain text. Obviously my own text/plain blog is among them, and is as far as I’m aware the only one to be entirely presented as text/plain.

Anyway, this inspired me to write a post of my own (on text/plain blog, of course!), in which I ask the question: what do we consider plain text? Based on the sites in the list, Markdown is permissible as plain text,  (for the purposes of Terence’s list), but this implies that “plain text” is a spectrum of human-readability.

If Markdown’s fine, then presumably Gemtext would be too? How about BBCode? HTML and RTF are explicitly excluded by Terence’s rules, but I’d argue that HTML 1.0 could be more human-readable than some of the more-sophisticated dialects of BBCode (or any Markdown that contains tables, unless those tables are laid-out in a way that specifically facilitates human-readability)?

As I say in my post:

  <--  More human-readable                                              Less human-readable  -->  
|-----------|-----------|-----------|------------|-----------|-----------|-----------|-----------|
Plain text       Gemtext       Markdown        BBCode         HTML 1.0         Modern HTML     RTF

This provocation is only intended to get you to think about “what does it mean for a markup language to be ‘human readable’?” Where do you draw the line?

D&D 5e is not for everyone

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

In summary, 5e is for you if you

  • already use the system & don’t like learning new things,
  • enjoy medieval fantasy settings, with a 60-70% combat tilt,
  • like vague, unopinionated systems,
  • don’t mind overly corporate media,
  • just kinda like it (which is totally fair)

And if you do fit the bill here, I truly do wish you all the best in your 5e adventures…

But just because one system is for you, doesn’t mean others aren’t! pulls away curtain, exaggerated

As a quick disclaimer, this hobby, like many others, is a matter of taste. I, like everyone else, am biased towards a certain kind of game. Specifically, I absolutely adore games that place roleplay at center stage. Games that deal with the complexities of identity. Games with innovative mechanics. Games that present deep ethical quandaries. Games that make everyone at the table ponder something meaningful. If you like similar games, you’ll probably love my recommendations. If you don’t, then don’t worry! There are so many more games out there that will be for you and not for me, (5e included!), and I absolutely love that about this hobby.

I listed a good few options above, but also, I’d encourage you to take a gander at a few of the following games, most if not all of which I will write full reviews for eventually:

  • Spire: Rise against the oppressive high elves in a revolution destined for ruin, in an attempt to make a difference. Check out the fallout system in this one, it’s genuinely a game changer.

  • Blades in the Dark: Gang warfare: the game. Run a gang in a dark, steampunk, ghost-ridden world, and execute sick heists. Prep is for losers when in-scene you can just flashback to that time you prepared for this exact eventuality.

  • Slugblaster: TEENS ON HOVERBOARDS! DOIN’ SICK TRICKS! GOIN’ THROUGH PORTALS! GETTIN’ THAT SWEET SWEET INTERNET CLOUT! RUNNIN’ FROM INTERDIMENSIONAL POLICE! YEAHHHHHHHHHHHHHHHHH!!!!!!!!

  • Lichcraft: You’re trans and the wait for gender affirming healthcare is 300 years. Welp time to turn to the dark arts and become a lich!

It saddens me a little that D&D (5e or whatever) is so-firmly entrenched as “the” default choice of TTRPG.

It’s fine, I guess (with the caveats above about what it’s best at and, by proxy, what it’s weaker at), and I’ve on many occasions enjoyed D&D both as a PC’s player and as a DM. But that it’s so much the de-facto standard that D&D is in many circles synonymous with roleplaying is… just a bit of a waste, really!

I love that Kai not only shares an explanation of these limitations but that they also go on to share a handful of recommendations of other games to consider, the next time the TTRPG itch gets you! I’d heard of Blades in the Dark (perhaps courtesy of the use of the Forged in the Dark engine in other games; I’m not certain), but the other three are completely alien to me… and they all sound great in different ways.

I wonder if I can persuade some Abnibbers to hook up for a mini-campaign/one-shot of Slugblaster or something at some point? Spire sounds great too, and I like the theme of Lichcraft: there’s some interesting ideas to explore in that universe!

Death to the shadow DOM!

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

A common rebuttal I get to this…

What about when you want to keep global styles out of your component, like with a third-party widget that gets loaded on lots of different pages?

I kind-of sort-of see the logic in that. But I also think wanting your component to not look like a cohesive part of the page its loaded into is weird and unexpected.

I so-rarely disagree with Chris on JavaScript issues, but I think I kinda do on this one. I fully agree that the Shadow DOM is usually a bad idea and its encapsulation concept encourages exactly the kind of over-narrow componentised design thinking that React also suffers from. But I think that the rebuttal Chris picks up on is valid… just sometimes.

When I created the Beige Buttons component earlier this year, I used the shadow DOM. It was the first time I’ve done so: I’ve always rejected it in my previous (HTML) Web Components for exactly the reasons Chris describes. But I maintain that it was, in this case, the right tool for the job. The Beige Buttons aren’t intended to integrate into the design of the site on which they’re placed, and allowing the site’s CSS to interact with some parts of it – such as the “reset” button – could fundamentally undermine the experience it intends to create!

I appreciate that this is an edge case, for sure, and most Web Component libraries almost certainly shouldn’t use the shadow DOM. But I don’t think it’s valid to declare it totally worthless.

That said, I’ve not yet had the opportunity to play with Cascade Layers, which – combined with directives like all: reset;, might provide a way to strongly override the style of components without making it impossibly hard for a site owner to provide their own customised experience. I’m still open to persuasion!

Woodcraft Folk statement on the exclusion of trans children from Girlguiding

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Woodcraft Folk stands in solidarity with every trans child, young person and volunteer who faces exclusion from Girlguiding UK following the announcement on Trans inclusion.

We recognise that Girlguiding UK have taken this decision in the context of intense political pressure and legal uncertainty. However, this does not make the outcome acceptable. Young people should never bear the consequences of political disputes. All children and young people deserve respect, safety and inclusion in their youth organisations.

Excellent statement from Woodcraft Folk.

I was saddened to hear the news that Girlguiding will no longer accept trans girls as members. It seems to me that it would have been perfectly reasonable for them to change their articles in response to the Supreme Court silliness: instead of declaring themselves as being for the benefit of “girls and women” they could have become for the benefit of “girls, women, trans girls, and trans women”.

Yes, obviously it’s horrible that the Supreme Court’s othering decision means that people have to spell out that “by women, we mean all women, including trans women”. But that’s a thing that a charity can do. It’s perfectly reasonable for a charity to be for the benefit of multiple groups.

But no, they took the easy option.

So it’s great to see youth-supporting organisations like Woodcraft Folk make a statement like this that trans kids continue to be welcome with them. Okay, this was easier for them than for Girlguiding because Woodcraft’s articles didn’t contain any gendered language in the first place. And it’s fine that Girlguiding’s does use gendered language – it’s okay for charities to be gender-specific! – but it’s a shame that they didn’t… pardon the pun… have the balls to stand up for what’s right for all women and girls, in spite of the UK’s growing transphobia. Ugh.

Anyway: nice work, Woodcraft Folk.

Dithering – Part 1

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Framegrab from an animation showing a grayscale image being 'pushed through' a threshold map to produce a dithered monochrome image.

I already understand how using a threshold map to perform dithering works and have even implemented dithering algorithms, and I still appreciated this amazing visual explainer which helped put it in a light I’d never considered before. A highly-recommended read, and I’ve subscribed to Damar’s RSS feed so I get to see Part 2 when it happens.

(I also enjoyed playing with the dithering experiment on his CodePen, because it turns out that the technology behind this interactive demo is as interesting as the topic being described!)

HTTP is not simple

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

HTTP/1 may appear simple because of several reasons: it is readable text, the most simple use case is not overly complicated and existing tools like curl and browsers help making HTTP easy to play with.

The HTTP idea and concept can perhaps still be considered simple and even somewhat ingenious, but the actual machinery is not.

[goes on to describe several specific characteristics of HTTP that make it un-simple, under the headings:

  • newlines
  • whitespace
  • end of body
  • parsing numbers
  • folding headers
  • never-implemented
  • so many headers
  • not all methods are alike
  • not all headers are alike
  • spineless browsers
  • size of the specs

]

I discovered this post late, while catching up on posts in the comp.infosystems.gemini newsgroup, but I’m glad I did because it’s excellent. Daniel Stenberg is, of course, the creator of cURL and so probably knows more about the intricacies of HTTP than virtually anybody (including, most-likely, some of the earliest contributors to its standards), and in this post he does a fantastic job of dissecting the oft-made argument that HTTP/1 is a “simple” protocol; based usually upon the argument that “if a human can speak it over telnet/netcat/etc., it’s simple”.

This argument, of course, glosses over the facts that (a) humans are not simple, and the things that we find “easy”… like reading a string of ASCII representations of digits and converting it into a representation of a number… are not necessarily easy for computers, and (b) the ways in which a human might use HTTP 0.9 through 1.1 are rarely representative of the complexities inherent in more-realistic “real world” use.

Obviously Daniel’s written about Gemini, too, and I agree with some of his points there (especially the fact that the specification intermingles the transfer protocol and the recommended markup language; ick!). There’s a reasonable rebuttal here (although it has its faults too, like how it conflates the volume of data involved in the encryption handshake with the processing overhead of repeated handshakes). But now we’re going way down the rabbithole and you didn’t come here to listen to me dissect arguments and counter-arguments about the complexities of Internet specifications that you might never use, right? (Although maybe you should: you could have been reading this blog post via Gemini, for instance…)

But if you’ve ever telnet’ted into a HTTP server and been surprised at how “simple” it was, or just have an interest in the HTTP specifications, Daniel’s post is worth a read.

How Online Privacy Has Been Championed by Dreamwidth

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

I’m writing up this information because Dreamwidth’s legal advocacy work has been largely underrecognized. I have not seen a scrap of mainstream news coverage out there that delves into the unique role that Dreamwidth has played in the NetChoice lawsuits, and in a tech news landscape that inspires so much resignation and despair, I think people deserve to know about how Dreamwidth is putting up a fight. Not only does Dreamwidth refuse to engage in intrusive tracking, it’s proactively participating in lawsuits against state governments that try to force its hand. For all that many lawmakers are trying to make the web worse, Dreamwidth is leveraging itself as proof that a better web is possible.

If your mental model of Dreamwidth is “it’s like LiveJournal, but…” then you owe it to yourself to read Coyote’s excellent explanation of how Dreamwidth is so much more: a beacon of privacy-centric and censorship-resistant blog hosting in a world that increasingly seems at-best uninterested and at-worst actively hosting to such things.

That it’s not for me personally (I’m more a selfhost type) doesn’t mean it’s not a great choice for you: it’s got solid free and reasonably-priced premium tiers and all the kinds of features you’d expect from a service live LiveJournal, or Tumblr, or Medium… but without all of the antifeatures that come with each of those.

And yeah, they’re on the side of the good guys:

Framegrab from Tron, overlaid with iconic line 'I fight for the users'.
I think there’s mileage in stealing repurposing this iconic line…

Coyote also wrote the excellent You Can Make A Website, if you’re looking for further reading from the same author.

The perils of doors in gamedev

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Recent discussion about the perils of doors in gamedev reminded me of a bug caused by a door in a game you may have heard of called “Half Life 2”. Are you sitting comfortably? Then I shall begin.

A Combine soldier threatening with a baton, in front of a door. Which one is a greater menace in gamedev?

What is meant to happen is a guard (spoiler alert – it’s actually Barney in disguise) bangs on a door, the door opens, he says “get in”, and then the game waits for you to enter the room before the script proceeds.

But in this case the door sort of rattled, but didn’t open, and then locked shut again. So you can’t get in the room, and the gate closed behind you, so you can’t go do anything else. The guard waits forever, pointing at the locked door, and you’re stuck.

If you watch the video, when the door unlocks and then opens, there’s a second guard standing inside the room to the left of the opening door. That guard is actually standing very slightly too close – the very corner of his bounding box intersects the door’s path as it opens. So what’s happening is the door starts to open, slightly nudges into the guard’s toe, bounces back, closes, and then automatically locks. And because there’s no script to deal with this and re-open the door, you’re stuck.

So this kicked off an even longer bug-hunt. The answer was (as with so many of my stories) good old floating point. Half Life 2 was originally shipped in 2004, and although the SSE instruction set existed, it wasn’t yet ubiquitous, so most of HL2 was compiled to use the older 8087 or x87 maths instruction set. That has a wacky grab-bag of precisions – some things are 32-bit, some are 64-bit, some are 80-bit, and exactly which precision you get in which bits of code is somewhat arcane.

Amazing thread from Tom Forsyth, reflecting on his time working at Valve. The tl;dr is that after their compiler was upgraded (to support the SSE instruction sets that had now become common in processors), subsequent builds of Half-Life 2 became unwinnable. The reason was knock-on effects from a series of precision roundings, which meant that a Combine security guard’s toe was in a slightly wrong place and the physics engine would bounce a door off him.

A proper 500-mile-email grade story, in terms of unusual bugs.

SVGs that feel like GIFs

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

The moving image below is only 49Kb and has an incredibly high resolution.

It’s similar to a GIF but instead of showing moving images, it shows moving SVGs! The best part: Github supports these in their README.md files!

Vincent D. Warmerdam, in SVGs that feel like GIFs

Got to admit, this is really cool and something I can see myself using a lot. So I installed the prerequisites:

brew install asciinema npm install -g svg-term-cli

Then I gave it a go. I needed to use asciinema rec -f asciicast-v2 myfile.cast to record my screen into Asciinema‘s version 2 format, because the new version 3 format isn’t yet supported by svg-term-cli (but there is at least an asciinema convert command if you record in the “wrong” one).

Then I ran cat myfile.cast | svg-term --out myfile.cast.svg to convert that terminal recording into an SVG: I happened to be in a directory containing the source code of FreeDeedPoll.org.uk, so recorded myself running an 11ty development server with npm serve:

Animation showing a user running npm start at a terminal and seeing an 11ty development server compile assets and run.

Amazing stuff.

×

AI and cigarettes

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

In the 1980s and 1990s, when I was a kid, smoking was everywhere. Restaurants, bars, and a little before my time, airplanes!

The idea that people would smoke was treated as inevitable, and the idea that you could get them to stop was viewed as wildly unrealistic.

Sound familiar? But in the early 2000’s, people did stop smoking!

But a few years ago, the trend started to reverse. You know why?

Vaping.

Vape pens were pushed as a “safer alternative to smoking,” just like Anil is suggesting with Firefox AI. And as a result, not only did people who would have smoked anyways start up again, but people who previously wouldn’t have started.

I know it’s been a controversial and not-for-everyone change, but I’ve personally loved that Chris Ferdinandi has branched out from simply giving weekday JavaScript tips to also providing thoughts and commentary on wider issues in tech, including political issues. I’m 100% behind it: Chris has a wealth of experience and an engaging writing style and even when I don’t 100% agree with his opinions, I appreciate that he shares them.

And he’s certainly got a point here. Pushing “less-harmful” options (like vaping… possibly…) can help wean people off something “more-harmful”… but it can also normalise a harmful behaviour that’s already on the way out by drawing newcomers to the “less-harmful” version.

My personal stance remains that GenAI may have value (though not for the vast majority of things that people market it as having value for, where – indeed – it’s possibly doing more harm than good!), but it’s possible that we’ll never know because the entire discussion space is poisoned now by the hype. That means it’ll be years before proper, unbiased conversations can take place, free of the hype, and it’s quite possible that the economy of AI will have collapsed by then. So maybe we’ll never know.

Anyway: good post by Chris; just wanted to share that, and also to add a voice of support for the direction he’s taken his blog these last few years.