Published

Maintenance is everything

I don’t expect most of the opinions that I hold now to have the same shape in 10, 20. years. I don’t think any of us is the same person every day, identity shifts with every tiny experience, so it’d be a silly thing to suggest or expect.

But one that I think might stick, the thing that might last if I ever wrote a manifesto: Maintenance is everything.

Bikes, physical health, mental health, roads, relationships, furniture, websites, clothing, parks, plants, sewers.

If it’s worth creating/buying/doing in the first place, it’s usually worth maintaining. And I love maintenance, fixing things, so that’s lucky! (Don’t like cleaning so much, which is another major part of physical maintenance, but I’m working on that.)

The problem is that new/shiny is a lot more lucrative than old/broken (more on this). How do we shift that mindset?

Published

Dev environment issue related to MySQL and missing OpenSSL v1.0.0 symlink

I woke up early this morning to get some work done before a call and suddenly my local dev environment stopped working without warning and with seemingly no reason. The root issue was that MySQL wouldn’t work, /usr/local/opt/openssl/lib/libssl.1.0.0.dylib was not loading.

TL;DR: This may have been related to some automatic cleanup on Homebrew’s part. But regardless, a simple restart sorted it. If this happens again and restarting doesn’t sort it, try uninstalling and reinstalling MySQL.

The rest of the detail is below for posterity if I run in to this in the future.

Read more

Published

Questions and questionable answers on the blockchain and cryptocurrencies

Quick note: This post is way too long… but it felt weird to split it up considering it all came from the same burst of research, and I didn’t want to cut some of the finer details because I’m using this for reference. So apologies! ¯\_(ツ)_/¯

Illustration of blocks in yellow, pink, and blue

Illustration of blocks in blue, orange, and yellow

I’ve been aware of cryptocurrencies and the blockchain for a long time but have never taken a moment to dig in. Recently there’s been a lot of buzz around the blockchain amongst people I know and like. Some of these people have historically been pretty skeptical about it, as have I, so this has made me curious about what might have changed.

This is an attempt to get to the bottom of a few concepts and questions that have been lingering in my mind. It starts with a very basic attempt to describe the blockchain and crypto and then moves on to topics I’m particularly concerned about, especially energy usage, risk / legality, and the impact on the digital divide. I’m calling these answers “questionable” because I’m definitely still learning, but I’ve done enough research and thinking around it all that I’m comfortable with what I’ve written here. If you read any of this and think I’ve gotten something wrong, let me know.

I’m most interested in why non-fungible tokens (NFTs) are getting so much hype right this moment but decided to focus on the blockchain and crypto first since it forms the foundation of NFTs. A dive in to NFTs is to come separately.

Illustration of blocks in blue, yellow, and pink

What is the blockchain?

The blockchain is a way of storing data cryptographically. You can think of the term quite literally: blocks of data are chained together to form an ever-growing and nearly immutable ledger. The blockchain as we know it was invented in 2008 and was implemented for the first time with the Bitcoin protocol in 2009, creating the cryptocurrency bitcoin.

The blockchain is decentralized, meaning it isn’t stored in any one place. It is instead distributed across every different computer, or node, that has interacted with it on a particular network. The blockchain is one of many decentralized technologies, but it is more of a concept than a unique protocol such as Dat or the InterPlanetary File System (IPFS) (neither use the blockchain, to be clear). There are many different blockchain protocols with different advantages.

On the blockchain, each block of data and the way it is connected to the previous block is permanent and verifiable without the need for any third-party involvement or intervention. Because of this, one of the most common applications for the blockchain that we’ve seen so far is cryptocurrency transactions and investment.

But it’s worth noting that the blockchain can be useful for much more than cryptocurrencies and decentralized finance (DeFi). I’m particularly interested in the Handshake Network, a decentralized domain name system (DNS) alternative. And the blockchain could also be used to track the supply chain to prove with 99.9% certainty that a particular product’s manufacturing didn’t involve things like child labor.

Read more

Published

Fix for overflow at top / bottom of screen when using CSS Scroll Snap

I’m currently working on a site that uses CSS Scroll Snap to frame some of the content nicely as you scroll through. In Chrome though, I was getting weird overflow issues at the top and bottom of the screen. If I scrolled to the bottom and then kept attempting to scroll down, it would gradually add more and more length to the page. Same with scrolling back up.

Adding overscroll-behavior-y: none; to the body element sorted it out. Read more about overscroll-behavior on MDN.

I originally tried to add this property to the html element since that’s the element with scroll-snap-type: y mandatory;. This didn’t work though, it seems that overscroll-behavior has to be on body.

Published

How to embed an Are.na channel using an `iframe` in HTML

A friend got in touch recently about using this WordPress theme, asking if it would be possible to integrate support for Are.na channels in the theme. I suggested that it’s probably out of scope for the theme but could be great as a plugin that integrates the Are.na API, definitely something I’d be interested in making. Started thinking about how it might work best, wanted to keep it relatively simple and such since ideally I’d want it to work with classic WP and Gutenberg.

Turns out, I was way overcomplicating it. I mentioned the plugin idea to Sam and he suggested just doing an iframe embed like they do on the lovely Are.na blog. Of course! 🤦🏻‍♀️

I’d still like to explore the plugin idea at some point since it would offer a few more opportunities (see things to consider about embeds below, particularly the fact that Are.na embed support is undocumented), but this seems like a nice way of doing it in the meantime.

Example below of Gemma’s Internet Explorers channel as an embed:

How it works

This is the embed code for that particular iframe:

<iframe style="border:none;" width="100%" height="590" src="https://www.are.na/gemma-copeland/internet-explorers/embed" title="Gemma Copeland’s Are.na channel “Internet Explorers”"></iframe>

If you’re less familiar with HTML, here’s what’s going on.

The opening and closing HTML tags <iframe></iframe> stand for an Inline Frame element. This type of element nests a separate resource like a webpage on to the page you’re currently looking at. It contains the attributes style, width, height, src, and title to modify the way it behaves.

Since many browsers render an iframe with a border by default, we’re using the style attribute to get rid of the border on this iframe. You can also style HTML elements with classes and CSS, but we’re using this technique, known as inline styles, for simplicity’s sake.

The width and height attributes specify—you guessed it—the width and height of the iframe. If you were missing either of these attributes, the iframe would collapse. According to the standards, these values should both be set as integers which the browser interprets as pixels. That said, browsers seem to be able to interpret a 100% width correctly, meaning that it fills 100% of the width of its container. If you want to stick to standards, you could add a high width value and then add max-width:100%; to your inline styles.

The src or “source” attribute tells the browser what content you want to embed. Without it, you’d just have an empty iframe. The URL we’re using here is exactly the same as the URL for Gemma’s actual Internet Explorers channel (https://www.are.na/gemma-copeland/internet-explorers), with the addition of /embed on the end. If you try visiting this URL, https://www.are.na/gemma-copeland/internet-explorers/embed, you’ll see that it is essentially a stripped-down version of the original Channel page that is more suitable for embedding.

The title attribute indicates the contents of the iframe. It can be important for accessibility since some screen readers will use it.

Things to consider before embedding content on your site

There are a few things worth keeping in mind if you decide to try this. These notes apply to any embedded content, regardless of where it’s coming from.

1. An iframe embeds the tracking and cookie behavior of its source, not just its contents

When you embed another webpage on your site with an iframe, it will behave the exact same way as if you had visited the source website. In other words, that website may collect data about your visitors, use cookies, embed additional third-party tracking, or monitor your visitors’ interaction with the embedded content.

You should be sure that you’re ok with this before including an embed on your site. Personally, this is one reason why I don’t use embeds very often.

I feel comfortable embedding an Are.na channel in this case because it’s for demonstration purposes, they adhere to the GDPR, and I’m satisfied by the way they handle data according to their privacy policy.

2. The accessibility of an iframe embed depends mostly on the source page

It’s recommended to add a title attribute to your embeds for better accessibility, but that’s pretty much where your accessibility control stops. If the source page hasn’t been built with accessibility in mind, it may be difficult to browse for people that use alternative ways to navigate the web.

Unfortunately, Are.na channel embed pages are missing accessibility features such as unique title elements, descriptive alt texts for the block images, and semantic elements such as <figure> or <figcaption>. This is kind of understandable though since these embed pages are an undocumented feature, something that they probably made more for their own use, and they’re no doubt focusing their main efforts on the public-facing product. Would love to see it tweaked though, particularly since they use these embeds on their own blog.

3. It’s nearly impossible to change the way an embed looks

There’s very little you can do to change the look of an embed. You can change the way the frame itself appears, like removing the default border as we’ve done in the example above, but you usually can’t change the contents of the embed.

Sometimes a platform will accept additional attributes or URL parameters that change an embed’s functionality. YouTube is an example, see their Player Parameters documentation. But this just changes the general functionality, it doesn’t allow you to actually change the placement of the play button or change the controls from red to blue. You can use some fiddly JavaScript to get things looking like you want, but it’s pretty hacky.

Instead, if you want to heavily customize the way that the embed contents look, you should probably integrate the content using the platform’s API if they offer it. This is what we did on Gemma’s site, using the Are.na API and Eleventy to add channels directly to her homepage. This content inherits her site’s styles, so it’s more in keeping with the look and feel of her site.

4. Embeds can break

Broken links are an ever-present problem on the web, people are always changing URLs and taking down content. A broken link is only noticeable if you click it, whereas a broken iframe can look pretty crap. If this would bother you, then you might want to be careful about how much embedded content you include on your site.

Besides this, the source website can restrict which domains are allowed to embed their content at any time. This is unlikely to happen with a platform like Vimeo or YouTube which offer embeds as a part of their advertised functionality. But with this Are.na channel embed for example, Are.na might decide that they only want to allow their embed pages to be embedded on their own site and change their Content-Security-Policy or X-Frame-Options HTTP response headers accordingly. And it’s their right to do so if they wish!

If you want to increase the likelihood that third-party content will be available on your site in the future, it’s best to use documented methods, ideally an API. If you integrate content via an API, you can craft a graceful error message in the event that the content doesn’t load. This can look a lot more forgiving than a broken embed.

5. Embeds probably won’t be crawled by search engine bots

This is… not a huge concern IMO. But I mention it since it may be a concern for others. Search engine bots don’t tend to crawl iframe contents, meaning that they won’t take that content in to account when determining what your page is all about. If this is super important to you, then use the platform’s API (if available) to integrate third-party content directly in to your site.

Edit at 2pm: Changed width description since 100% isn’t technically in line with standards, though it works.

Published

Disabling “save to Pinterest”

Just had a collaborator ask if we could disable the “save to Pinterest” button even if a visitor has a Pinterest addon / extension in their browser. My immediate reaction was “Maybe? I’d think not but will see!”

Turns out something like this should be possible. Pinterest supports disabling saves from a site, see their documentation. You can either enable it site-wide or per image.

I’m surprised but really happy to see that they offer this, hope that they continue to do so.

Published

Single `mv` command to change all filenames in directory to lower case and replace spaces

This is the mv command I use to change all of the filenames in my current directory from mixed case to lowercase and replace spaces with underscores.

for file in *; do mv "$file" `echo $file | tr ' ' '_' | tr '[:upper:]' '[:lower:]'`  ; done

The ; semicolons indicate the end of each line of this command. To break it down:

  1. for file in * loops over all the files in the directory. You could change the * wildcard to something like *.jpg if you wanted to only target JPG files.
  2. do mv "$file" instructs the system to move each file in the loop to the location that immediately follows.
  3. `echo $file | tr ' ' '_' | tr '[:upper:]' '[:lower:]'` is the location we’re moving the file to. We use the tr “translate” command to replace spaces with underscores, and then again (separated by the | pipe character) to replace uppercase letters with lowercase letters. Then we echo that translated filename.
  4. done lets the system know that the loop is done.

I use this occasionally to prep files for use on the web when working on a static site, one that isn’t hooked it up to a CMS.

Published

Thoughts on LAMP vs JAMstack content management systems

Chris Coyier recently published a CSS-Tricks post titled “WordPress and Jamstack”. It’s a great rundown of the pros and cons, and I’m in agreement on the whole.

The most important point for my own use cases is from the section titled “CMS and End User UX”.

Sometimes, we developers are building sites just for us (I do more than my fair share of that), but I’d say developers are mostly building sites for other people. So the most important question is: am I building something that is empowering for the people I’m building it for?

I really enjoy working on JAMstack (JavaScript, APIs, Markup) sites, the dev environment can be spectacular. It’s wonderful to not worry about deployment, HTTPS, caching. BUT. I haven’t yet found a JAMstack content management system (CMS) that I love, so it’s not something I feel super comfortable reaching for in the majority of my client work.

Read more

Published

Now online: Open-weather

Screenshot of the Open-weather website showing a storm over Japan

open-weather.community

The Open-weather website is online. A bit about Open-weather:

Open-weather is a project by Sophie Dyer and Sasha Engelmann probing the noisy relationships between bodies, atmospheres and weather systems through experiments in amateur radio, open data and feminist tactics of sensing and séance.

The site is pretty straightforward, a static hub for a bunch of resources hosted in various places including their PublicLab wiki and archive of amateur radio-generated weather data. The homepage is currently a large scrollable nowcast produced in collaboration by people across the globe. We decided to embed the Google Sheet archive directly in the site for now, though that may change in the future. We may do the same for pages such as methodology, to come later on. We’ll see!

The site is hosted on Netlify and the code is in a GitLab repo. Pls excuse sub-par commit messages and the very minimal README.

Sasha and Sophie are giving a talk at 14:30 UTC-4 Toronto as part of Our Networks distributed festival. Definitely worth grabbing a ticket, it’s super well priced considering how much Our Networks is putting on and absolutely worth supporting that org.

Published

Removing whitespace from around an SVG in Inkscape

For future reference, this is how to remove whitespace from around an SVG in Inkscape according to the version I’m running right now (1.0beta2):

Open up the SVG in Inkscape, then select all elements in the SVG (cmd+A). Click File in the top toolbar menu, then Document Properties. The dialogue box should open to the Page settings. Under “Orientation”, click the drop-down arrow “Resize page to content”, then click the button “Resize page to drawing or selection”.


I used to use Adobe Creative Cloud for loads of stuff but got rid of it a few months ago. It’s just so crazy expensive, and I never need it for client work anymore. Almost all of the designers I work with hand over Figma, Sketch, or Adobe XD prototypes nowadays, and I’m happy using Affinity for personal stuff (Photo for image editing, Publisher for a never-ending cookbook project, etc.).

BUT. I do sometimes have to manipulate SVG icon exports that have excess white space. Previously I used Adobe Illustrator to sort that out, now I use Inkscape. I use it so rarely though that I have no muscle memory, I always forget how to crop to the edges of an SVG to get rid of that whitespace. Now I won’t forget, fingers crossed.