Firehose

This is everything, all in one place, coming ’atcha!

This firehose contains a record of all my micro posts, articles, photography, and other web doings. If you’d like to subscribe to feeds to stay up-to-date with things, then you can do so via my syndication page.

Sometimes you just need Internet Explorer 11. I won’t question why you need it, but here is how you can open it natively in Windows 11. If you try to execute iexplore.exe from C:\Program Files\Internet Explorer or via Run, Windows will instead open Microsoft Edge. There used to be various links around Windows’ interface which hadn’t been updated to Edge, which could be used as a gateway, but they’re almost all removed now, so some slightly more complex methods are required.

The easiest method is to use this short PowerShell command: $ie = New-Object -ComObject InternetExplorer.Application; $ie.Visible = $true. Run it in PowerShell and Internet Explorer will open.

Another good approach is to create a Visual Basic Script (a file with the extension .vbs) with the below contents. When the script is run, Internet Explorer will open.

CreateObject("InternetExplorer.Application").Visible = True

In most cases you’re best to use Microsoft Edge’s ‘IE Mode’.

Accurate as of Windows 11 version 25H2.

My HTML Boilerplate

You don't need much going on in your head.

A document outlining and explaining my general structure for HTML pages to use. A slim general markup template that applies to almost all HTML documents on the web and forgoes anything unnecessary. It is a general framework to build upon for individual sites.

https://vale.rocks/posts/html-boilerplate

In regard to my assertion that initial-scale=1 is no longer a necessary default, some people complained that in its absence a page which would otherwise horizontally extend beyond the viewport will be scaled so that the document’s full width fits the width of the viewport.

If initial-scale=1 comes into play, then your site is already broken. With or without initial-scale=1, you’re failing multiple WCAG criterion. Most obviously, 1.4.10 Reflow. You need to fix this problem urgently. Regardless of how you feel about positive fallbacks in behaviour, content overextending horizontally requires fixing. It is also a major usability failing for all users either way. With that in mind, I additionally think that omitting initial-scale=1 is preferable in the case that an overflow does reach production (which, as we have established, it mustn’t) because:

  1. It makes horizontal overflows much more obvious and thus more likely to be noticed and fixed. Including initial-scale=1 to mask the issue disincentivises fixing the actual root cause. Beyond being more obvious to people, it is also more likely to be caught by visual regression testing.

  2. With initial-scale=1 you risk having content off-screen which cannot be focused by a keyboard, which fails under WCAG 2.1.1 Keyboard.

  3. It provides a better user experience. Horizontal scrolling in general (such as is required by initial-scale=1) is an uncommon interface pattern, and horizontal overflows are even more uncommon due to being unintended. A user is extremely unlikely to think to scroll horizontally to see the rest of a document.

    However, what is a common pattern is zooming in and panning. People will zoom in and pan around images, PDFs, and the likes. It is a familiar pattern, unlike scrolling horizontally on a page that otherwise seems scaled to the device. There is even great precedent for it with documents on the web, given that desktop-only sites are zoomed in upon and panned around in this way.

  4. Without it set, content isn’t arbitrarily hidden. When content on a page horizontally overflows, you cannot see what has overflown until you act to scroll over to it or zoom out to see the full picture. Without initial-scale=1 the user is shown the full content with the ability to zoom in on what they were actually trying to access.

  5. People often pair initial-scale=1 with overflow-x: hidden in their CSS, which makes any content overflowing completely unreachable. Not having it as a default avoids walking into this trap.

Regardless, initial-scale=1 doesn’t make sense to include as a default for a case that should never reach production and which is an obvious issue. Prior to the iPhone bug that popularised initial-scale=1 it wasn’t needed. Now it is fixed, it isn’t needed as a default. If one does decide they really want to include it, then they can, but that should be a conscious choice and not the result of tradition.

Antiquated HTML Snippets and Artefacts

We can mostly blame Internet Explorer, as always.

Overviews of the very many snippets of HTML that were once commonly included on websites to address specific cases with certain technologies, browsers, operating systems, or extensions. Fragments dating back to the days of Internet Explorer and Netscape, to more modern bits that are nonetheless obsolete.

https://vale.rocks/posts/html-relics

The year is 1996. You’re being inconvenienced by bespoke Internet Explorer behaviour.

The year is 2026. You’re somehow still being inconvenienced by bespoke Internet Explorer behaviour.

The year is 2032. This is the earliest year that Internet Explorer could possibly lose support entirely. In your gut you know it’ll probably live for longer somehow.

The year is 3794. You’re long dead, yet somehow Internet Explorer still torments you.

With increasing frequency and disruption, I’m seeing people hide sites behind bot protections or kill them altogether just to prevent the content on them from being used for AI training. I generally think this is bad.

I can understand such a decision from the perspective of scrapers running up financial costs. Sure, you shouldn’t have to pay so that some company that doesn’t care about you in the slightest can overwhelm your website. Depending on your hosting and structure, it could be a significant financial burden. However, when people put up aggressive blocks or take down their site because of ideological disagreements with scraping or AI in general, it feels misguided.

Piling up anti-bot protections does very little to stop determined bots. Even less determined bots are often able to bypass protections, as they rarely hold up for long. Aggressive scraping operations will spin up full versions of Chrome from residential IP addresses and will scrape your site, even if it takes a while. Most protections are security theatre. In many cases protection solutions are directly associated with AI companies – like a protection racket.

Most protections do harm actual people, though. Having their phone come to a halt while it heats up to solve the complex maths of Anubis, or having to perform some asinine CAPTCHA task that likely isn’t completable for many people with accessibility considerations, or getting held up by a few seconds of delay when loading up a page. At the scale of AI systems, they can automate bypasses for most of these protections. It is individual people that are being inconvenienced.

I’ve heard the argument, ‘But at least I’m inconveniencing the scrapers or making them do more work’. Think about the financial figures flung about the AI space. To scrape sites costs a pittance and doesn’t inconvenience AI companies at all. All that is necessary is for your content to be scraped once, and it is in the training data forever after. It was likely scraped before you even considered blocking them, and it only takes one slip-up of even a hypothetical perfect protection for a site to end up in a data set.

I get the anger and feelings of violation. I agree that it isn’t right for scrapers to act as they do and for companies to exploit the openness of the web. However, at the point where we inflict more damage to humans than we do to AI, what is the point? Is our primary goal to do good for ourselves and other people on this planet, or to make weak attempts at inconveniencing AI? Why are you blocking scrapers? Is it to protect human creativity or to protect humans from your creativity? To reduce human expression in the face of automation is to concede to the machine.

I’m sure this sounds, to an extent, like I’m trying to be an AI apologist or that I’m saying you should give in to AI. If this is what it sounds like, then you’re misinterpreting me. My view is just that we should, as people, prioritise expressing ourselves and doing good for other people rather than harming people to spite AI.

It makes me sad when people stop maintaining personal websites for the reason that AI will scrape it.

Bad people might visit your site but that has never been a reason to stop. Make great stuff and share it.

Killing your site hurts people much more that it hurts AI, and keeping it benefits people much more than it benefits AI.

When reading articles by accessibility professionals, you can identify how long they’ve been in the field by how jaded their writing is and how aggressively they’ve countered every single conceivable rebuttal.

Examining My Halo Service Record

"Data retrieval was not a command directive."

Statistics and data from my playing of the video games in the Halo series. My data extracted from Halo Waypoint combined with some light analysis. Covering the games in the Master Chief Collection and Halo Infinite. Kills, deaths, and how they all happened.

https://vale.rocks/posts/halo-stats

I loaded up a website and immediately found what I was looking for, but it was on a carousel and it slid away. The carousel had no buttons and the site markup was a mess so I just had to wait for the carousel to go through a full cycle and return to the start so I could click the link.

Torturous.

It shouldn’t need saying, but please don’t do this. Ideally just don’t do carousels at all.

For Interop 2027 I’d like to propose interoperability, where all the browsers reach greater feature parity and fix bugs while improving performance.

A line you will find in the head of almost every single HTML document: <meta name="viewport" content="width=device-width, initial-scale=1.0">

The line came into relevance after the first iPhone launched in 2007. As part of the same keynote at Macworld 2007 in which Steve Jobs unveiled the iPhone, he showed off the phone’s web browser loading the New York Times and Amazon. As he proclaimed on stage, the iPhone did not load mobile versions of the sites but instead the full desktop versions.

Mobile versions of websites at the time were usually on their own subdomain or path and were extremely simplified experiences. The iPhone ran the full versions. However, these sites weren’t designed for such small screens. Ethan Marcotte wouldn’t coin ‘Responsive Web Design’ until 2010. The intended interaction was for the user to zoom in and pan around sites designed for desktop.

To allow sites designed for small screens to scale nicely, Apple introduced the viewport meta tag as explained in the Safari Web Content Guide. The viewport meta tag was eventually picked up more universally across browsers such that it became the widely supported way to make a site responsive.

Though width=device-width handled things broadly, initial-scale=1.0 was important for many years to resolve undesired zooming behaviour in older versions of iOS and some other browsers. However, this isn’t the case any more. All the problems are no longer present and don’t need working around.

I can say with confidence that you do not need to declare initial-scale=1.0 if targeting modern browsers. All you need is <meta name="viewport" content="width=device-width">. That’s 19 bytes you can shave from your document head. Maybe not much in isolation, but when you consider the scale of the web, it adds up.

The Curiosity That Is Minecraft: Pi Edition

Left on the windowsill and forgotten about.

The history and details of an obscure Minecraft version that was exclusively available on the Raspberry Pi. Based on the mobile Pocket Edition for phones but with some unique functionality. Namely, a native API for interacting with the game. Primarily created to serve as an educational tool.

https://vale.rocks/posts/minecraft-pi-edition

They’ve aligned the divs, but not the way I like my divs aligned. Now I don’t just have to align the divs, but I also have to unalign the already aligned divs to align them as the divs should have been aligned in the first place. Aligning divs seems like such a simple affair, and then someone ali…

Be careful when adding IDs, classes, or attributes in HTML that could be interpreted as paid content placement. Even if not actually advertisements or sponsored content, there is a good chance they’ll be blocked by content blockers and filters. This is something I’ve experienced firsthand. Trying to troubleshoot elements consistently hidden for only some users across a range of devices and browsers is hell. Even having them test without extensions doesn’t always work due to operating system or network-level filtering.

You don’t know pain until you figure out that the reason that some people can’t see the addition button on your tool is because you gave it the class add-btn and that triggered a selector looking for a class starting with ad. The regex is often very sloppy and vague in content blockers, as being too specific makes the blockers ineffective. It isn’t just advertising-related terms that cause issues, however. Tracking related names can be an issue too, as can references to pop-ups or paywalls. Likewise, so can elements referring to social media or newsletters.

One should also be careful with terms like ‘banner’ and using image sizes commonly used for adverts. Some filters will trigger just because of image resolutions, like 970px by 250px, which is the size of a ‘billboard’ advert, or 160px by 600px, which is the size of a ‘skyscraper’ advert. Even having terms related to advertising, like ‘billboard’ or ‘skyscraper’ in filenames, can trip content blockers.

The obvious question is how to avoid false positives. The most effective method is to reference popular filter lists and blocking systems to see if they’ll trigger on your site. Like testing across browsers, operating systems, and accessibility technologies, there is no better way to test than to actually test. One way that some sites bypass the problem is by creating a ‘namespace’ that is applied as a preprocessor step. For example, prefix every class with the name of your site so that a class such as add-btn becomes valerocks-add-btn. This isn’t a perfect approach but can work.

Though this is good to keep in mind for avoiding false-positives, you shouldn’t try to circumvent these filters if they’re accurate. Your users have made a conscious choice, and to disregard it is to disrespect them.

Event

Meteorological Autumn/Spring

Meteorological beginning of Autumn in the Northern Hemisphere and Spring in the Southern Hemisphere.

A point of consideration when writing about accessibility is between person-first language and identity-first language. Person-first language would take the form of ‘person with disability’, while identity-first language takes the form of ‘disabled person’. There are reasonable arguments in each direction, and different people have different preferences.

If referring to a specific person and they have a preference, then that preference should be respected – much like one would respect a person’s preferred pronouns. Age, gender, culture, language, level of education, and type of condition have all been found to influence people’s preferences.

However, that leaves the question of what language should be used for general writing and discussion or when speaking about people whose preferences you don’t know. I personally choose to use person-first language in these cases, as I think it is the most appropriate default. It emphasises the person over their disability.

The Australian Government Style Manual advises person-first language. The study Person-first and identity-first disability language: Informing client centred care (Lisa B Grech, Donna Koller, Amanda Olley) indicates that ‘it appears there is greater acceptance for person-first language rather than identity-first language when referring to others’.

While there are solid arguments to be made either way, there is unfortunately no universal consensus. The main point is that people should be addressed respectfully as people, not reduced to their disabilities.

While Microsoft establishes more data centres, my Windows install and Xbox console are pestering me in an attempt to persuade me to configure them to use less power.

Thanks, Microsoft. Glad you care so much.

Peer-to-peer (P2P) is a networking model where, instead of using a centralised server which all clients connect to, clients all connect to each other in a distributed model. Peer-to-peer is great in that there isn’t anything to host on an instance level. The onus of distribution is handled by users themselves.

So, why doesn’t Stoat use a peer-to-peer approach for voice and video streaming? Peer-to-peer was briefly considered and experimented with but ultimately deemed unsuitable for a few reasons. They are:

  • Privacy and security. As clients are communicating directly, there is high chance of leaking sensitive data, such as IP addresses. It also limits Stoat’s ability to enforce privacy protections.
  • Latency and scale. Real-time peer-to-peer streaming works reasonably well with a handful of people of close geographical proximity, but as it scales the amount of data throughput becomes larger, which increases latency. Streaming to many people is also hard on device performance. Channels can have hundreds of users in them, and peer-to-peer breaks down at that scale. Implementing peer-to-peer for small-scale situations and client-server for large-scale situations is possible, but is a significant amount of work.
  • Usability. Peer-to-peer often works great, but sometimes it doesn’t. Occasionally there will be firewall issues or devices won’t have the performance required to stream smoothly. Features like scaling video for users on lower bandwidth connections, recording chats, transcribing speech, and smoothly handling moderation are all things that become much more difficult or demanding (and in some cases impossible) in a peer-to-peer architecture.
  • Complexity. While it is possible to engineer around some of these issues, doing so introduces a lot of complexity. Stoat has a small team with limited availability, so avoiding additional overhead is important to be able to actually get something out the door that can be maintained. A server-client model is also consistent with Stoat’s behaviour as a whole.

It is rather hard to describe or explain, but whenever anything lightly touches or brushes against the skin near where I have my magnet implanted, I interpret it as a magnetic field rather than touch.

It is such a weird sensation. It feels like there is a strong invisible magnet somewhere near me.

It is a bit like if you have your phone set to vibrate and you always put it in the same pocket. Whenever you feel anything in that area, such as material sliding against your skin, you automatically interpret it as your phone vibrating.

Imagine that, but you feel a different sense entirely.

A Complete History of Stoat

Sow discord to reap success.

An in-depth history of the Stoat chat platform. From its precursor Riot, through to all the additions and changes the platform has seen and received as it has grown. Details from when it was once Revolt to the change into Stoat and details of all the bumps and successes along the way.

https://vale.rocks/posts/stoat-history

Two places I studied at and got certifications from have shut their doors now. One of them has completely scrubbed itself from the web. I’d suggest this bodes rather poorly for my resumé.

Educational institutes watching in horror as I walk through the door and they realise they’ve got four years before they’re nuked from the face of this planet.

The AT Protocol Harkens An Old Web Ethos

Out with the new and in with the old.

Love for the beauty of the AT Protocol and the older web principles it revitalises with open, public data. The opportunity for integrations and automations as seen of the web from roughly the mid-2000s through to the mid-2010s.

https://vale.rocks/posts/atproto-ethos

Each time we see a major influx of users at Stoat, blocks come with it. An influx can see hundreds of thousands of users signing up on the platform over just a few days, so I can understand it looks suspicious. That’s a huge sudden increase in emails going out and a huge increase in traffic to the site. It probably trips some heuristics somewhere which generally do a good job to remove unscrupulous actors. However, sometimes, they get things wrong.

Ideally, if you get incorrectly blocked, you contact the blocker and they remove the block for you. If you’re lucky you get to go through several levels of support until you finally get to the people who can get you unblocked, then they give you a collection of forms and systems and processes to go through. If you’re unlucky, there are no means of escalation, and you’re simply out of luck – there are no means of appeal. If you do manage to get unblocked, then it’ll only be for a little while, because eventually they’ll do it again and you’ll have to do the process over. It is a futile effort.

The most common and aggressive blockers are internet service providers, email providers, email spam lists, and web filtering services provided by anti-malware companies. Companies that maintain filters for profit seem to keep their lists to themselves, so they’re not too much of an issue. ISPs and email providers and spam listers, however, do share their lists around. Once on one block list, you propagate to them all. Then you have to try to remove yourself from them all in quick succession, because the propagation only works one way. Blocks tend to propagate; unblocks do not. If there are blocks still remaining, then they’ll return, because getting a block removed does not add you to an allow list and merely removes you from the explicitly blocked list.

It is just a sad state of affairs. It really hurts little independent operations who can’t do anything about it. It especially hurts as it comes during periods of growth, where the team is preoccupied and users are forming first impressions. Established operations are obviously far less affected, and if anything does go awry, they have greater sway and lines of contact for resolution. The web is not as open as one would hope, especially when you can be arbitrarily blocked without recourse.

The way I see it, there were a few reasons one would opt to buy a game console:

  • Convenience. Computers take more effort to configure and aren’t optimised exclusively for gaming, so there is more to go awry.
  • Physical media. Owning games in a tangible format is pleasant, especially with included extras like posters and manuals. Discs can contain the game, removing the need for the internet for licence checks or lengthy download periods. A disc also cannot be entirely revoked in the same way a digital licence can. In 50 years, assuming I can find a working Xbox 360, a physical copy of Halo 3 will be playable without strife. Also allows games to be shared or sold, allowing for the existence of a second-hand market.
  • First-class controller support. Consoles are set up for use with controllers, and everything on them can be done via controllers. You never get into a state where you must reach for a mouse or keyboard during a console session.
  • Standardised hardware for optimisation. As the details of a console are known and fixed, developers can target this hardware in particular and achieve performance that isn’t possible when targeting a wider assortment of target platforms. Consider the quality of games on seventh-generation consoles despite their low specs.
  • Hacking and custom firmware. I’ve loved exploiting consoles and customising them or installing homebrew.
  • Console personality. Console interfaces used to have such character that made using them an event.
  • Social features. Consoles make coordinating gameplay easy. Being able to see friends online, create parties, easily voice chat, send messages, and invite people to games was a big deal. Almost every game with social features supports the console’s global social features, including things such as showing achievements.
  • Price. Due to being closed ecosystems with all games being produced via the console manufacturer, consoles can be sold at a loss.
  • Game exclusivity.

However, the ninth-generation of game consoles seem to have done away with most of these reasons, and the tenth-generation looks positioned to take it further. I’m struggling to see the benefit of consoles going forward. No physical media, no personality, very few exclusives (beyond Nintendo), lessened convenience (so many updates, system instability, advertisements and pop-ups everywhere), and increasing console prices.

I struggle to justify the price of a console when my computer will respect me more as a user, now has first-class controller support, allows me to play a wider variety of games (including emulating my existing collection), and the (very slightly) increased cost is offset by my computer being a general purpose machine. The only console I can see value in is a handheld console for the form factor, but even most of those are just general-purpose computers in a handheld form, rather than true console software experiences. Nintendo are perhaps the only member of the big three (Xbox, Sony, Nintendo) who have a device worth purchasing in the Switch. It isn’t perfect, but at least offers experiences that aren’t better done by a computer.

I hope you’re hungry, because we’re serving a greatly improved experience over on PersonalSit.es. We’ve got some cleaned up data and much improved tagging, so you can filter for and check out specific niches.

PersonalSit.es OG image

I delisted a few unfortunately dead sites and such while fetching a complete new set of images, which will be up soon. Also fixed a colour-contrast issue while adding dynamic light/dark switching.