Restoring Functionality

Another evening, another update to 10C. This most recent one was well overdue, though. One of the features that was part of v2 and v4 for years that never quite made the jump to v5 was podcasting. After almost a full year of v5 being live, the feature has finally made a comeback … to a certain extent. There are still a couple of things that need to be built into various themes to support podcasts, but the core elements are all there to publish audio files to the web in a manner that is completely compatible with iTunes, Google Play, and standalone podcast clients.

In the two previous versions of 10Centuries, podcasts generally consisted of multiple distinct elements that were loosely coupled. There would be a record for the podcast itself, one for the accompanying blog post, and a social post as well. If you were to edit one of these afterwards, the other two items would not be updated. As one can imagine, this was suboptimal. With 10Cv5, there's no reason for any of this. A podcast is a complete entity in and of itself, the same as with quotations, bookmarks, notes, and locations. This is because a podcast is just an article with an audio file attached. Even the post type remains the same. Sometimes the simple solutions are better than the over-engineered ones that sought out edge cases.

For the moment, podcasts are only publishable through the Anri theme or a dedicated client1. In the next little bit, I'd like to ensure that everywhere a person can publish a post, podcasts are an option.

Publishing on Anri

Like with 10Cv2 and v4, when "Podcast Episode" is chosen, some additional fields will become visible on the screen under the image upload section. Unlike the previous versions of 10C, you do not need to add an audio file to the uploads box to make these elements visible. This was one thing that a lot of people did not like about the previous UI and I did not want to make the same mistake again. As a result, audio uploads have their own distinct button.

Only the post text, summary, and audio file need to exist in order to publish a podcast, though more information will generally make for a better-formatted syndication feed.

Speaking of syndication, there's a new settings page where people can better control their RSS feed.

Syndication

With this page people are able to have a specific author name, or a list of authors, for the RSS feed as well as a detailed summary, a Creative Commons license, the number of items to show in the RSS feed, a cover image which is the same as your avatar by default, and content categories2.

As with so many of the things I make, the UI could certainly use a little bit of love. That said, I'm hoping that with the core functionality in place, people can make use of it.


  1. If you're familiar with the 10C API and have a RESTful API client, then you could even use that to publish podcasts. That said, only a geek would enjoy the task. Everything can be done with two API calls, but it's not at all glamorous.

  2. These are only useful for podcasting when publishing to iTunes or the Google Play Store. Not sure about other distributors like Spotify.

Tracking

The subject of tracking seems to be in the news a great deal lately as people are understandably nervous about applications that send data back to organisations such as Facebook, Google, Apple, Amazon, and the myriad of advertising networks that clamour to know more about us through apps, web sites, and an ever-growing number of connected appliances. Given that a lot of the online publications that are currently shouting the loudest also have an unruly number of tracking mechanisms on their website, and given that 10C seems to operate in complete isolation from external services, I figured it would be a good idea to outline just how much data my platform is collecting on each and every person who visits this website, subscribes to an RSS feed, or downloads a podcast.

File Downloads

I don't track this in any appreciable way. The server knows how many bytes of data has been sent, but not the name of the file nor who it sent the data to, because I don't care.

RSS Subscriptions

I don't track this in any direct way. When an RSS service or an RSS reader comes by to grab the most recent XML or JSON file, the User Agent1 and the IP address of the system that initiated the request is recorded in the UsageStats table along with details such as which website was accessed, which RSS feed (because there are many ways to request one), the type of HTTP request, the response code, and how long the whole process took.

Web Visits

Just as with RSS subscriptions, the User Agent and IP address of the system that inited the request is recorded in the UsageStats table along with details such as which website was accessed, which URL, the type of HTTP request, the response code, and how long the whole process took. If a person is signed into the service at this time, then the authentication token ID is also recorded.

Why Do It?

This data is collected to answer a couple of fundamental questions:

  • how long are people waiting for data?
  • is the current hardware sufficient to meet demand?
  • where are the bottlenecks2?

It's with this data that I can tell you the average response time for a request is 0.3 seconds start to finish, and that 87 of the sites hosted on 10C represent 99% of the traffic. Is the current hardware sufficient? Yep. Not bad for a five year old laptop-turned-server.

UsageStats

And Then …?

Because the statistics table generally grows by about 350MB a day, it's not something that I want to keep around in a request-by-request format. Aside from mild curiosity to compare performance metrics from the past to the present, there is very little value gained from the numbers. For this reason, statistics are summarised by site on a daily basis and deleted from the system after 30 days. Backups of the database are also kept for 60 days before being discarded as a waste of space. This means that at no point will I have request-by-request statistics older than 91 days3.

What about the "Popular Post" feature? Where does that data come from?

Yep, this come from the UsageStats table as well, but to say that this summarised data is equivalent to tracking a group of people would be a stretch.

How can I verify this?

The code that powers 10C is open source. The function that records the data into the UsageStats table can be found in /lib/functions.php on (or around) line 1918 as recordUsageStat(). The SQL query can be found in /sql/system/setUsageStat.sql. Want to get a copy of your data from UsageStats or any other place in the database? Just get in touch and we can make it happen.

As someone who has taken a number of steps to reduce the number of sites and services that can follow me around the web, I understand the importance of collecting just the information that is needed to answer basic system questions and offer general functionality. None of the systems I create will go beyond the amount of statistics collection that is outlined above because, to be completely clear, tracking what people do just isn't that interesting. I'm much more interested in what the system does than the visitors.


  1. User Agents are not to be trusted 100%. They can be anything, and it's incredibly easy to claim to be a valid browser when the connection is in fact an automated process.

  2. Long-running API requests, etc.

  3. 30 days of recent data, plus 60 days is 90, plus today means "Generally nothing older than 90 days, 23 hours, 59 minutes, and 59 seconds.

Listening to Old Podcasts

Earlier today I listened to the most recent episode of Micro Monday1 as it featured one of my favourite podcasters, Jeremy Cherfas. In it he talked a great deal about what makes a good podcast, the importance of audio quality, and the difficulty in discovering new shows that aren't part of the big networks. What's funny is that I was looking forward to listening to this particular episode because Jeremy had lamented that his sound quality was not up to snuff and I wanted to see just how "bad" it was. Afterwards I wondered whether the audio quality from some of my old shows have stood the test of time and went back to hear a few episodes of Discover ADN, a podcast that launched my podcasting efforts in 2014 … almost six years ago exactly.

For my ears, the podcasts I recorded in my bedroom closet during 2015 and 2016 were some of the best I've ever made. Shows like DiscoverADN and Changing Platforms were fun, short-lived titles to record and produce. The 400+ Doubtfully Daily Matigo episodes recorded up until 2018 were alright, but most of them were done with a cell phone microphone while walking in the park. These were not the sorts of shows that would warrant a second listen, and usually not a first. There were a bunch of Japanese shows that I worked on, but rarely did I speak on the shows. I was there more as a coordinator and producer until the hosts either became bored and quit or — as fate would have it — were picked up by a local radio station.

After the boy was born, there was rarely a time in the house quiet or calm enough to record any shows, so the microphone and headphones were put into their padded boxes and have patiently waited for the chance to come out and shine once again. Now that he's three, perhaps there's time again. The question I have is whether there's anything interesting I could talk about every so often that might warrant a subscriber or two to the show.


  1. Micro Monday is an interview podcast for people using Micro.blog, a social network that aims to be as open and non-corporate as possible.

Being Mr. Grumpy

A couple of months ago, when the boy was feeling particularly bored during a rainstorm, I discovered much to my delight that a Mr. Men cartoon had been created back in 2008. The characters had been updated a little bit for the times, but many of the fun Mr. Men and Little Miss personalities were present and interacting with each other as one would expect from a tight-knit community. In no time at all we had both enjoyed all four episode compilations on YouTube plus some loose shows that hadn't been grouped just yet. As someone who grew up reading the books, seeing them animated and silly was more than a treat. For the longest time, I had guessed that if I were to be one of the characters, I'd likely be Mr. Silly, Mr. Busy, or perhaps Mr. Quiet. However, after seeing them interact, there's no doubt in my mind that the one that closest resembles my personality is Mr. Grumpy.

Mr Grumpy

As his name suggests, Mr. Grumpy is generally grumpy, ill tempered, irritable, grouchy, cranky, and often complaining. Looking at many of the posts I've written on this site over the years — not to mention the "Sent" folder in my email client — it's not that hard to see the similarities.

This isn't cool. I like watching Mr. Grumpy as a cartoon character because his incredibly direct language and predictable reactions are quite comical. However, I don't want to be a caricature of an angry blue rectangle, nor do I want that rectangle to be a caricature of me.

I really must do better to calm down and speak a little more thoughtfully.

Watching a Blind Dog Walk

This afternoon while stretching my legs with a short jaunt around the neighbourhood I saw a woman walking her dog. Given the number of canines that live in the area, this is not an uncommon sight, but something was different about this particular animal. It was a bull terrier that looked to be around the same age as Nozomi1 that seemed to be navigating solely by its nose. The animal was going left and right in an erratic fashion and the person holding the leash seemed to be used to this behaviour and gave it space. As I got closer, I noticed that the dog's eyes were crossed and generally unmoving. It didn't even seem to notice me approach from the front.

One of the things I try to do when out and about is to meet the dogs in the neighbourhood. This is generally the easiest way for me to meet the people who are out with them, which is generally the only human interaction I get with people outside my home on a regular basis. As I approached the cross-eyed dog and the woman walking him, I held out my hand to be sniffed and asked if I could say hello. それをお勧めしません。 この犬は盲目です2, came the reply. This dog is blind.

Until today I'd never heard the term mōmoku — blind — used in conversation. I had to confirm my understanding, apologise for intruding, then carry on without petting the dog. However, as I watched the pair continue towards the direction I came, I couldn't help but watch as the animal tried its best to navigate the world without the use of its eyes. Every couple of meters it would walk into a bush, or trip over a curb, or come to a complete stop with its nose in the air. Despite the challenges and obstacles it faced while embarking on a walk around the neighbourhood, it didn't seem particularly frustrated. Instead it appeared to be intently focused on tracing a scent to its source.

It is absolutely fascinating how adaptable life can be, especially when it doesn't have any say in the matter.


  1. Nozomi will be ten years old this May. Ten! Where does the time go?

  2. Sore o osusume shimasen. Kono inu wa mōmoku desu. ⇢ I wouldn't recommend it. This dog is blind.

A Possible Future for Distance Education

Chris Lee over at Are Technica recently wrote an article outlining a number of the issues that are facing both teachers and students when it comes to remote learning. Every point that he makes is spot on and, what's worse, is that a lot of the comments that people have left in the few hours since the article went live are also spot on. Educational institutions and teachers of all stripes have made some admirable efforts to make systems like Zoom, Teams, Slack, and a host of others work to replicate some aspects of in-person learning, but these tools are designed for business use and, damningly, they're not even very good tools for business. Suffice it to say, the current crop of digital tools that people are expected to use to conduct person-to-person lessons are a poor substitute for being in a classroom, regardless of how many people might be occupying that space. As Chris says, teaching is an intimate activity.

What's the solution, though?

This is a question that I've been thinking about for quite some time and not only because I work for an education-providing organisation. Chris Lee and the commentators are all correct that the tools we have need to be better in order to resolve some of the fundamental problems faced when trying to replicate a traditional environment — whether it's a classroom or a meeting room — on a laptop, tablet, or phone. First, let's list out some of the most common problems that create the friction we all despise:

  1. Camera angles are unflattering
  2. People don't mute their microphones
  3. People don't attend while in an appropriate environment
  4. The sound quality is generally awful
  5. Eye contact is literally impossible
  6. Visual cues and subtle body language is much harder to pick up on
  7. Note-taking (and sharing) is a pain when it's not 100% text presented in a list format
  8. The tools have complex, convoluted, or otherwise confusing sets of menus to perform typically common activities for online meetings
  9. We have no idea who is paying attention or currently present

We can even reduce these nine items down further to:

  1. What we see is suboptimal
  2. What we hear is suboptimal
  3. What we use is suboptimal

Mind you, there are some groups of people who have had so much experience with online meetings and seminars that many of the items listed above are non-issues. Unfortunately, this is the exception rather than the rule. How would one go about resolving some of these issues, though?

What We See

A year or so back I started toying with the idea of an application that would first map our face to build a 3-dimensional understanding of what we look like, then present that to people. Our current facial expressions and mouth movements would be tracked and sync up with whatever it is that we're doing and, because it's essentially a living avatar that's being presented to the other people on the call, a person's angle and eyes could be better lined up for the viewer. The participants would all have their cameras on, after all, so it wouldn't be impossible to have an on-screen avatar's head and eyes "follow" the current location of the participants. This would be rendered locally, too, making it relatively smooth and natural in appearance. This would have the added bonus of giving people the option to "tweak" their appearance for the day. Didn't shave? No problem! Still in your pyjamas? Don't worry about it. The avatar will look just like you on your best day.

This would solve items 1 and 5 in the first list above, but probably contribute to number six.

What We Hear

One of the most frustrating elements of every meeting that I attend online is the sound quality. A lot of people do not use a headset with a microphone for some reason and a lot of people do not seem to realise that typing on a laptop that has its microphone built into the base of the unit results in a painfully distracting series of taps that can bring any productive conversation to a halt. I've had meetings with people who were obviously sitting at a Starbucks. I've had meetings with people who were driving down a highway with their windows open. I've even had meetings with people who might have been at an outdoor rock concert. There really is no limit to the number of inopportune environments a participant might find themselves in when attending an online class, seminar, or meeting.

With this in mind, the solution I have been toying with builds on the visual idea of using a rendered avatar. A person would "train" the avatar to speak in their voice. There would be a multitude of sentences that a person would have to say when first setting up the application so that the general tone and pitch of the voice is captured. By doing this it becomes possible to send none of the audio from a person to the participants in the class, seminar, or meeting. Instead, the words that are spoken would be transcribed and transmitted as text along with a musical representation of what they said. This would then be reconstructed on each of the participant's devices. This would mean that people in very noisy environments would sound incredibly flat to the listeners, but it would be superior to the cacophony that so many of us are subjected to with today's solutions.

This would not be a great solution for people who need to convey sound that is not spoken words, but there is no reason why people couldn't choose to listen to the raw audio if they so chose.

What We Use

This is the hardest of the three fundamental problems because different groups need different solutions. What works for a class consisting of 30 teenagers learning geography may not necessarily work for 15 young adults practicing the violin or 10 middle-aged managers discussing next month's production quotas. However, if we take the first two technical solutions and carry it forward, what we could have is something very compelling: Virtual Reality.

When it comes to VR — and its related technology, Augmented Reality — I have been a bit of a cynic. The hardware requirements were always too great for the average person and the use cases all seemed to consist of graphically violent games or vivid sexual fantasies. However, if the goal is to simulate a traditional environment as much as possible to enable or encourage an intimate setting where people come together to solve a problem, be it learning the quadratic equation or discussing corporate strategy, and many of the problems that people have involve poor visuals, poor audio, and poor tools, then perhaps an immersive setting would resolve some of the issues. People would have the ability to write on virtual whiteboards, present virtual models of possible products for participants to examine, and more. The cost for VR equipment has come down quite a bit since 2010 with some headsets being available for around $300 USD. This cost would certainly be a barrier to entry for some, but this could solve some of the problems that people face when working with colleagues a continent away or with classmates who are quarantined.

But then we have many of these technologies already, don't we? Second Life is an online world with almost a million people. The platform would not be a panacea, but it is one place to start. Issues involving system resources, frame rates, and congestion would need to be resolved before groups of more than a dozen could get together in any meaningful manner, but technical issues are rarely insurmountable. Something like this might be the stepping stone to a better virtual learning environment. Some schools have a presence on the platform already, too.

Further research will be necessary.

Wet

An odd confluence of TV weather forecasts this week warned that eight days of rain was due to begin on Friday and, right on schedule, an appreciable amount of precipitation started falling from the sky just past midnight with only occasional breaks throughout the day. The announcement of precipitation was not at all unexpected given the time of year. What I found peculiar was the number of evening news meteorologists who were in complete agreement with each other for the first time in months regarding longer-than-average rainfalls.

Looking Through an Umbrella

Springtime rains in this part of the country tend to operate in a 2-1-2-1-2 fashion. That is we'll have rain for two days, followed by a day of sun, then two more days of rain, then sun, and finally another two days of rain before a week of reasonably mild weather. This pattern is so consistent in the spring that locals tend to look at the sky and say ”おかしいなあ〜”1 when the weather does anything else. So for multiple stations to agree that we'll have 8 solid days of rain without a typhoon anywhere in the Pacific is noticeably uncommon.

Perhaps this is nature's way of encouraging people to stay home.

This past month has been quite a trial for a large percentage of the human race as people contend with virus concerns, food shortages, work stoppages, price gouging, and generally stress-inducing restrictions on the freedoms that many of us take for granted. As someone who has worked from home for the better part of two years, I've not been seriously impacted by the measures instituted by the federal and local governments regarding COVID-19. Sure, there are inconveniences and nuisances to deal with, but nothing that can't be overcome with a little patience or a phone call. From what the TV and print news has to say, there are likely a billion people who would gladly switch places with me2. That said, if we're able to ride this out with a little isolation and stricter hygiene practices, there are worse places to be stuck than at home.

Questions do abound, though. Not a day goes by where there isn't an article in the paper or a segment on the 7 o'clock news talking about a specific business shutting down for the last time. These are usually smaller companies that employ fewer than 20 people; the businesses that quietly add value to a community. With revenues wiped out and bills that demand to be paid, there are very few options when an organisation does not have six months or more of operational cash in the bank at all times. Companies started to feel the pinch at the end of January. Here we are two months later, and half the restaurants in the area have decided to shut down until the end of the pandemic. Two have closed forever. Manufacturing businesses have also been hit pretty hard with some slashing output by as much as 80% due to a lack of orders. People are being sent home. How will they pay their bills?

A lot of my immediate neighbours have long since retired and have the benefit of decades of savings plus a mostly-functional federal pension system that will continue to provide the financial resources required to weather this invisible storm. Reiko and I have also been setting aside money every month for our retirement, the boy's education, future trips, and general savings. Even if I were to be let go from the day job, the family will be good for quite some time so long as we're careful. The neighbourhood seems to be an anomaly, though. Not everyone has the same good fortune.

This, of course, leads to the ultimate question: what can I do to help?

Donating to food banks can help. Donating to the local community centre's recently started relief fund to assist people with covering important expenses such as rent will help. Is this enough, though? There's a very persistent "No" echoing around inside my head but I've yet to work out a better way to help people get through this difficult time.

When Nozomi and I are out for our walks and we see other people with their pets in the park, I will sometimes strike up a conversation and ask how they're doing. This little bit of community building can be quite helpful for people who live alone and are unable to congregate like before. A number of the neighbours, because they're well into retirement age, have been widowed for quite some time and have seen their regular club activities or get-togethers with friends get cancelled. The single most serious problem that people talk about is the isolation. More than one senior has said to me "You're the first person I've had a conversation with all week", which is terrible given just how often I've actively avoided social interactions throughout my entire adult life.

But now we have eight days of rain forecasted for the region and we're not yet done the first. If people were feeling cut-off before, this damp weather is going to exacerbate the problem. This issue cannot be realistically solved by volunteer or non-profit groups. It's going to take a community. But how can we do this if we are not supposed to be in the same room as others? How can we do this if we are not given the opportunity to get outside and maintain some semblance of normalcy?

After this week of rain there are going to be a lot of very lonely people desperate for some kind of interaction, and I can't shake the feeling that I'm not doing something worthwhile that might help reduce the feeling of intense isolation.


  1. Okashī nā ⇢ This would be translated as "It's strange" or, depending on nuance, "Isn't it strange?"

  2. My wife would not be happy with this. She's very paranoid about germs, so this Coronavirus scare has her on edge. She's implemented a strict "No Non-family members in the house" rule.

Creative License

An odd thought crossed my mind earlier today while testing some new functionality on the 10C platform involving content licensing. When I write code that is not being paid for by an employer, everything I create is under an MIT license. This means that people can take that code and do anything they'd like with it. Use it. Abuse it. Mock it. Knock it. Anything is permissible. Want to sell the code for your own gain? Technically that's acceptable, too. Just don't expect a warranty or the ability to pass any liability onto me, because that's outside the scope of the license. Other forms of creativity, however, are under a strict CC BY-NC-SA 4.0 license. In plain English, this means that you can copy, distribute, and adapt the things I share so long as there is appropriate credit given, the license of any adaptation is the same, and there is no commercial element involved1. This means that I am more controlling of my blog posts, podcasts2, photos, and social posts than of the only thing of value that I've been able to sell to the world.

The realisation struck me as peculiar given how freely I am willing to share things that actually have value. Why don't I write blog posts under a CC0 license, which is like the MIT license in that it means anything created is immediately in the public domain, owned by nobody, for anyone to do anything with. Heck, when it comes to control of the content I publish on here, I went so far as to build tools to actively watch out for and block content scrapers.

Putting a bit of thought into the conundrum, I came to the conclusion that I'm willing to share code for the following reasons:

  • there is nothing so special about what I code that others couldn't figure it out on their own
  • I learned a lot by reading other people's code, so this is akin to returning the favour for the next generation of developers

The reason I'm not willing to share my other forms of creation is as follows:

  • many of the things I write or share reveal elements of who I am

So coding is perceived as being generic enough to share. Writing, podcasting, photographing, and baking is specific enough to tie it to me as an individual.

But is this right? Something seems to be missing from the equation. There's a great deal of character to be gleaned from reading the source code for any project I've ever worked on just as there can be a lack of personality from a blog or social post that states a generally accepted fact without context or obvious purpose.

This is an idea that I'll need to invest a bit more time thinking through. In the meantime, feel free to peek through the source code for 10Centuries.


  1. There is also the stipulation that there be no legal terms or technological measures that legally restrict others from doing anything with my content that the BY-NC-SA 4.0 license permits. So wrapping up all of my blog posts into a digital book for sale on Amazon with DRM is a no-no.

  2. There haven't been any of these in quite a while. I should really dust off the mic and put something out.

Better Results

Over the last couple of weeks a good deal of work has been put into the 10C platform to do something about the excessive number of requests coming from bots and, for the most part, the measures are working like a charm. Known content scrapers are given a 403 "Forbidden" error. Bots looking for WordPress, PHPMyAdmin, or other exploits are given a 422 "Unprocessable Entity" with this happy response page. Contact form spam is way down, too. This results in not having to process about 60,000 SQL queries per day1 and, more importantly, having more accurate statistical data available for everyone. The "Popular Posts" segment on people's blogs is a prime example of this.

Popular Posts

Before making the necessary changes to better handle bots, every page load from a machine was treated the same way as a page load from a person. This resulted in some horribly skewed numbers when it came to "popularity" as some posts from over a decade ago consistently remained near the top of the list. Because the posts were so old, just about every content scraper knew the URL was valid and would come back to it quite regularly. However, if a real set of eyes is not looking at a post, can it be considered "popular"?

Nope.

So, with the filters and content loading processes better equipped to determine whether someone is actually looking at an article on a website, we get better results that are both more accurate and more relevant. Looking at the 9 most-read items on my site, it's good to see that 8 of them were written this year2. Naturally, the items listed on other 10C-powered sites will see a similar improvement in the reliability of the categorisation.

Hopefully the next round of updates to the platform are just as productive as the most recent dozen have been.


  1. 60,000 SQL queries is not very many, but it does work out to about 30-seconds of CPU time per day. Less processing power means having slightly "greener" operations.

  2. The post from 2012 is an odd aberration, but it seems to be legit.

Stuck in the Past

A large percentage of the posts published on this site over the last six months have involved sharing memories of things that happened in my life many years or decades ago. My parents have often said that as we age we look back at the past with increasing frequency simply because there's more of it to revisit. This theory certainly seems to hold water, but I wonder if there's something more to it. Is the mind comparing the past with the present? Do the memories have a common thread that should be explored? Am I just imagining correlations where none exist?

That last one sounds to be the most probable.

At some point in the future I do wonder if it would make sense to try and sort the memory posts chronologically and try to put some sort of temporal marker in the timeline of this site so that someone scrolling through a visual representation of the archives page would see a reference to this post at some point around 2003 despite being written in 2011 and this other post around 19891. One of the long-term goals I have for the 10C blogs is to present some alternative ways of viewing a lifetime. People who write prolifically will document so much of their lives, intentionally or otherwise, and giving people the ability to navigate the long progression of then to now is an excellent way to provide context to other articles on the same site. It would be more interesting if multiple posts over a span of years was found to discuss the same memory or time period as it would allow for a more complete understanding of how the author has perceived that moment in history.

This sort of visual representation is quite far off, though. Past attempts to design this view have failed spectacularly, which means I'm not thinking about the problem correctly. The articles that people write are not simply data points, after all. They're fragments of memory and personality. Any solution that is going to represent a person's lifespan will need to do so from a humanistic approach rather than a mathematical one.

One thing is for certain, though: the best solution will not involve an infinite-scrolling page consisting of only letters and numbers. This simply will not work.


  1. I wrote "Paper Boats" in June of 2019? It doesn't seem like almost a year has gone by. I still remember typing that post.