Add current posts

This commit is contained in:
John Colagioia 2019-12-29 07:46:20 -05:00
commit 26a8126cc3
10 changed files with 1171 additions and 0 deletions

95
2019-12-08-greetings.md Normal file
View File

@ -0,0 +1,95 @@
---
layout: post
title: Greetings 🎉
date: 2019-12-08 11:01:12-0500
categories: blog
tags: [intro, blog, meta]
summary: An introductory post establishing boundaries
thumbnail: /blog/assets/word-cafe-warm-advertising-france-sign-706601-pxhere.com.jpg
---
![Howdy](/blog/assets/word-cafe-warm-advertising-france-sign-706601-pxhere.com.jpg "Bonjour!")
In case a blog needs any sort of introduction, this blog is going to be a variety of things. Depending on who you are, some might interest you and some might send you away. But they're all going to be here, because it's *all* going to be what I'm thinking about.
Fair warning. Feel free not to read. None of this material will be on the midterm. Future installments will be **far** less navel-gazy and could very well have pictures and stuff.
## Why Are We Here?
> Everything must justify its existence before the judgment seat of Reason, or give up existence.
###### Part I/Chapter, *Anti-Dühring*, Friedrich Engels
Off on my own, in quiet corners, I write a *lot*. I have notes on a lot of what I read, scribble out thoughts about possible projects I might want to work on when I have the time, have old projects lying around, a few projects that are always partly ready to release, and a bunch of [answers on Quora](https://www.quora.com/John-Colagioia). That's not to mention the lecture notes for classes I used to teach, the assorted things I'm trying to learn, and special non-technical projects that I sort of think are necessary.
In a lot of ways, this is to make it easier to point people to longer ideas when desirable and also to help solidify my thoughts.
This is also, in a sense, a tool to keep myself honest. I look back on things I wrote ten and twenty years ago and cringe at the horrible person it must have taken to believe those things. One hopes that the accountability of purposely publishing will impose some responsibility of not completely mortifying *John of the Future*™.
In other words, this is probably going to be a meandering mess, just the way I like it. Hang out at your own peril, you might be eaten by a grue. Ignore what doesn't interest you.
## Who Am I?
> Who are we ourselves? Who am I who now address you? Who are you who are listening to me?
###### — Book Seventh, Chapter I, *Les Misérables*, Victor Hugo
I don't generally describe myself. Do *you* care? I don't really care, since I'm just me. But, in the interest of best possible disclosure, here are parts of my background that *might* make me recognizable to visitors and/or will probably make it into the blog in some form:
* I've been programming recreationally since the early '80s and professionally since the mid-'90s.
* I taught graduate-level computer science classes for about fifteen years and various adult education classes for about five years.
* I've released a handful of free software projects that have gained some minor measure of traction (as in, people have asked me about them), like...
* [Slack Backup](https://github.com/jcolag/SlackBackup), a tool to archive and search Slack teams.
* The [AutoStory](https://github.com/jcolag/AutoStory) plot generator,
* The [uManage](https://github.com/jcolag/uManage) time tracker, and
* The [Thue](https://github.com/jcolag/Thue) experimental programming language.
* Regarding Thue, I was involved with in the [esoteric programming language](https://en.wikipedia.org/wiki/Esoteric_programming_language) community a *very* long time ago. Ditto the [interactive fiction](https://en.wikipedia.org/wiki/Interactive_fiction) community. Remember me having said things I'd cringe at today? A lot of it probably happened in one of those two places.
* As mentioned, I've written a few thousand(!) answers on [Quora](https://www.quora.com/John-Colagioia) in a variety of areas, from programming to job searches to social justice. I'm still not entirely sure what a Top Writer is or whether I should care (especially since there are some terrible people in that set), but I seem to be one, there, more often than not, even though I visit there less and less as I see more evidence of the outrage feedback loop that so often drives ad revenue.
* I volunteer with the [Digital Comic Museum](http://digitalcomicmuseum.com/forum/index.php?action=profile;u=16), though these days, a lot of the copyright and moderation issues have been hammered out other than cleaning up occasional bursts of spam, so I'm pretty quiet.
* Rarely, I'm inspired to spend a few minutes/hours editing [Wikipedia](https://en.wikipedia.org/wiki/User:Jcolag). At some point, I somehow had my own Wikipedia page, too, but the editors there *finally* realized I wasn't notable after my bringing it to their attention a few times.
* I've spent a lot of time messing around with role-playing games, particularly superhero games, though haven't been anywhere near the community (or games) recently, after some convoluted business failures.
Basically, if you come to the conclusion of "professional dilettante," I can assure you that I've been called worse.
## Why *Aren't* We Here?
> Oh, bird of my soul, fly away now, For I possess a hundred fortified towers.
###### Rumi
Here's an assortment of typical blogging material that I won't likely indulge in. If that's why you're reading, rest assured that you will be disappointed.
* Day to day life, which should largely be irrelevant to anybody who isn't me.
* Comments about places I work or have worked, which would be unprofessional and a fairly significant breach of trust. Exceptions *might* be made for illustrative points in broader thoughts with the identifying features filed off.
* My "deep thoughts on the nature of things," or whatever's making me unhappy, because...just no.
* Apologies or excuses for not having posted in a while.
* Sponsored content; I don't care about your product, so don't even ask.
In short, this isn't therapy and it isn't about me.
## What Will End up Here?
Here's a vague list of what you might be in for on the blog:
* Updates on my (free/libre) projects;
* Technical notes, when I learn something handy;
* Consolidated versions of my Quora answers on common topics, since some of these questions are repeated frequently and I refuse to copy-and-paste an old answer...nor do I have the patience to merge duplicate questions, honestly;
* Narrative versions of some of my lecture notes, when the topic isn't typically covered in the way I prefer;
* Broad thoughts on the direction of the software industry and maybe free culture;
* How things go when I attempt to learn something new;
* From time to time, I may point to and discuss a free/libre project that I happen to actually use and like;
* The occasional recipe, since I cook a lot;
* Notes on things I don't think I've seen other people talk about in any detail; and
* Very rarely, I might discuss a conventional product or media franchise that is worth highlighting in some way.
This will almost certainly be on an irregular schedule. I *like* the idea of a consistent publishing schedule, but there's basically no chance of that actually happening.
Note that, by "free," I mean something like *available under a public license that allows users/customers to use and replicate the work (in whole or in part) for any purpose*. Conditions requiring reciprocation (maintaining the same license) are still free, whereas conditions that restrict usage (disallowing commercial or military uses) are not.
This blog, with content licensed (with some *eventual* exceptions, I'm sure) under the Share-Alike license noted below, fits that interest. For those who have further interest in why it's a good choice, I strongly recommend the [Proposing CC-Pro](https://questioncopyright.org/cc-pro) article on the *Question Copyright* blog, which briefly outlines why non-commercial licenses are ultimately pointless. With any luck, I'll convince some readers to be interested, as well.
Fair? OK, then, let's get started...
* * *
**Credits**: Untitled header photograph [from PxHere](https://pxhere.com/en/photo/706601), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).

View File

@ -0,0 +1,95 @@
---
layout: post
title: Seeking Refuge
date: 2019-12-14 11:01:12-0500
categories: fiction
tags: [novel, silver bat, superhero, scarletpimpernel, announcement, creativecommons]
summary: I semi-accidentally wrote a novel and failed to convince myself that it's horrible
thumbnail: /blog/assets/Refuge-Cover.png
offset: -32%
---
So...I kind of accidentally wrote a novel.
![The cover](/blog/assets/Refuge-Cover.png "Seeking Refuge's Cover")
Get it [here](https://archive.org/details/seekingrefuge) in a variety of standard formats, if it looks like it might be your thing. Please don't judge the book by its cover, because I'm not *quite* pleased with the cover...
> Soon, though, I see some of us tensing up. A couple stiffen at first and I briefly wonder if all the water was drugged, but they're still moving, just...worried, and that worry ripples through the group. I look over my shoulder to see why: Another tractor trailer is driving down the highway, coming to a stop alongside Cole's truck. I tense up, too, knowing that this could easily be some bystander who's about to ask far too many questions or one of Cole's confederates.
>
> A figure walks around the truck to our side and looks out. "The bat has mended its wing," a voice calls out in a thick enough British accent that it must be Hliang improvising a pass phrase. I wave her over, she and the man she introduces as Rajesh Kadam, the driver we should have waited for instead of getting on the Starcross truck. They carry a crate down to us, containing food, water, and more comfortable clothing.
>
> "I'm sorry it took us so long to get out here," Hliang admits, "but I was suspicious when Raj showed up right after you had left and, once we figured out what had happened, it took a bit to piece together the reasons. Regardless, Raj's truck is finally ready to go when you are." She points at me. "Your mother personally vouched for him, told me how he saved her bacon in Krông Kmar, back in the day, unlike the woman you lashed to a seat with jackets, who has such charming things to say about your and my presumed parentage."
I've been taking notes on possible stories for a few years, now, with some including more background than others. Then, at the end of October, one of those possible stories wormed their way to the surface and I knew how certain key scenes needed to play out. At that point, I realized that November is [National Novel Writing Month](https://nanowrimo.org/) (which I did *not* participate in) and I had around a thousand words, so I convinced myself to hack out another seventeen hundred words every day, to get the rest of the book.
The result---**The League of the Silver Bat: Seeking Refuge**---is almost certainly not good. I don't generally write fiction, after all, and this is meant to introduce an entire world, so it is definitely heavy on the exposition, among other likely problems. But on re-reading it, even thinking that the story is heavy-handed and knowing where the prose changes direction because I ran out of ideas for the current narrative conflict, despite all that, I think the result is readable and I don't dislike the result. At least to me, the prose has a lot of the feeling of being overwhelmed that I wanted and the two bigger plots seem mostly satisfying.
So, while I would never call this *good*, I also managed to not write something I find terrible.
## The Silver Bat
As I outline in the book's introduction, I have long wanted an increase in Free Culture properties that feel like they could have been cult classics. There is a large amount of material licensed under Creative Commons licenses, but once you pare down the works under non-free licenses ([Pioneer One](http://www.pioneerone.tv/), works by [Cory Doctorow](https://craphound.com/), etc.) and what borders on parody ([Homem-Grilo](https://homemgrilo.com/)), you're mostly left with [Pepper & Carrot](https://www.peppercarrot.com/), [Where Are the Joneses?](https://www.youtube.com/user/wherearethejoneses/videos), the [Morevna Project](https://morevnaproject.org/), and a lot of one-off material like [Blender's Open Projects](https://www.blender.org/about/projects/) and novels about mostly-normal people.
That's *nice*, and the world is a better place for them in it, but it could be nicer.
So, since I had this concept for the heir to a wealthy family using bat-themed symbolism to fight for justice *and* 2019 happens to be the eightieth anniversary of Batman (who bears some admitted similarity), it seemed like a good time to try to expand Free Culture.
Are there people who will dismiss this as a knockoff of a very popular character? Of course there will be, but there are also significant enough differences that I don't think there are many Silver Bat stories that can be rewritten as Batman stories and vice versa. The model, here, is much more **The Scarlet Pimpernel**, a connection that is made explicit in the story.
## Meanwhile...
One use of this story is that it allows me to hint at other franchises I believe to be part of the same universe. One important part of the universe is *the Luminary*, a character that adapts appearances of Superman that have fallen into the public domain, such as the Fleischer animated serial.
With any luck, I'll be able to show off the Luminary at some point.
Similarly, the *Underworld War* is an attempt to provide a space for the many fictional secret societies that are needed for many stories, but can't have a significant effect on the outside world. But it also serves as a potential way to decouple characters from war-time origins. For example, a character like Nedor's [Grim Reaper](https://en.wikipedia.org/wiki/Grim_Reaper_(Nedor_Comics)) can be removed from World War II, if desired, instead setting his origins against a turf war between a Nazi-like secret society such as [GORGON](https://ogc.rpglibrary.org/index.php?title=Bulletproof_Blues_3e_EN:Setting#GORGON) and [Les Amis de l'ABC](https://en.wikipedia.org/wiki/Friends_of_the_ABC). In the case of **Seeking Refuge**, I use this idea to have a character deal with something very similar to the [Rwandan genocide](https://en.wikipedia.org/wiki/Rwandan_genocide) without altering the all-too-real history of that atrocity or fixing the fictional events to 1994.
## Formats
I wrote the entire book in [Markdown](https://www.markdownguide.org/), then used [Pandoc](https://pandoc.org/) to create other formats. A big one is [LibreOffice Writer](https://www.libreoffice.org/discover/writer/), which allowed me to handle some style-based formatting and export to PDF and ePub files.
One potential problem with reading these final results, other than the apparent lack of interest ePub has in formatting, is that the few emoji I use don't seem to appear in the PDF and ePub exports. They're definitely there, because I can copy them and paste them into another document, so it *may* just be the viewer on Ubuntu.
## Lessons Learned
In no particular order, I discovered a few things in this process that might be of interest to someone else, someday.
The biggest take-away, of course, is that it's possible to write a novel in one month without completely disrupting life. The overwhelming majority of writing was done either early in the morning or late in the evening, and I almost always produced more seventeen hundred words, even finishing the first draft a few days before the end of the month.
If you do the math and assume that you'll work all day, every day, you get numbers like needing to produce two words per minute. On one hand, that sounds trivial, but on the other, seems daunting if the words need to all make sense in context. But the reality is that, at least in my case, if I went in knowing what the next section needed to look like, a thousand or two words was just a matter of telling that next part of the story. That's *not* a plodding word every few seconds.
And that ties into the other big discovery, which is that I should have put an outline together, beforehand, so that I would know where I was in the story at all times. For a long time, I envisioned this story as only being the arc where Bertie frees the exploited refugees after the setup, but that story only lasted a bit more than halfway into the book before reaching its natural conclusion. A huge flaw of the section where it hits that ending is the result of my scramble to, first, prolong the story, and second, redefine it so that the original plan is just an adventure that's meaningful to Bertie while he grows to understand who he needs to be.
Similarly, it would have been smart to understand my set pieces better. The exerpt I posted above comes at the end of an attack on the protagonists that, until I edited my draft, was somehow both deliberate *and* accidental/opportunistic, with different paragraphs suggesting each, because I didn't think the situation through beyond my desire to stretch out the story.
In terms of technology, I'm fairly certain that tools don't really speed up the process (for the most part), but do make it easier to understand what's going on. At all times, I kept a count of how many days ahead or behind I was writing, for example, giving me some context about the day's work. I also kept a list of stages of a [Hero's journey](https://en.wikipedia.org/wiki/Hero%27s_journey) open, not to build the story to an outline (because I definitely didn't do that and should have), but to have someplace to take the structure if the narrative seemed to be wandering. In the spirit of a more inclusive world, though, it *was* extremely convenient to have the tool I have been working on [here](https://github.com/jcolag/ProceduralStories/blob/master/people/generate.js) that gives an approximate idea of what the next character might look like, with output that looks something like the following.
|Data|Description|
|--|--|
|24N 113E 🌏 : China 🇨🇳 (156)|The point of origin|
| Tuen Mun, NTM, HK (22.39175, 113.97157) 160.232km|Hometown candidates|
| Baisha, 11, CN (26.52222, 110.93111) 221.254km| |
| Huayang, 04, CN (31.95165, 119.16284) 805.866km| |
| Jinding, 29, CN (26.43903, 99.44061) 1479.318km| |
| Shimen, 29, CN (25.89479, 99.42936) 1480.01km| |
| > Zhonghua Renmin Gongheguo|Native country name|
| > Female ♀ (bisexual 🏳️‍🌈), age 25 to 54, Buddhist 🕉️ (18.2%), Han Chinese (91.6%)|Demographics|
| > Possible name: "漪 顾" (Yi Gu)|Randomly-chosen name|
| > Average regional skin tone: #FFFBE8 👋🏻| |
| > Coping with: 🧠 Panic Disorder (2.7%)|Physical and psychiatric impairments|
| > Literate 📚 (94.5%)|Language and literacy|
The program still needs work, of course, and will probably never have the intelligence to drill down to census data. But for the purpose of giving me a way to visualize who the next character might be and encourage representation, it's helpful in avoiding stereotypes by disconnecting the character's role from their ethnicity and gender, with emoji drawing quick attention to features that might drive the story. For example, if the next character I needed was a getaway car driver, I might not think of a bisexual Chinese woman with a panic disorder, but that's now an idea with potential beyond just having a non-descript driver.
I regularly dismiss the ages when they're on the extreme ends, though. There's avoiding stereotypes and there's suggesting that the team's master of disguise or a music teacher would be pre-teen boys.
Anyway, lastly, I learned that I need a bit more practice on graphic design work. I think the cover is *passable*, but the blues and purples might be a bit much. It looks like it wants to be some sort of grim fantasy world instead of what could be something like a superhero story.
## Hot off the Presses
If you're interested in how this came out, [download a copy](https://archive.org/details/seekingrefuge)! I'd say "you'll be glad you did," but it's entirely possible it'll make you miserable, so I'll say "*I*'ll be glad you did," instead. If your book-reading regimen requires a specific kind of file, tell me and I'll see what I can do.
<iframe src="https://archive.org/embed/seekingrefuge" width="740" height="507" frameborder="0" webkitallowfullscreen="true" mozallowfullscreen="true" allowfullscreen></iframe>
And if you'd like to contribute to the story, I'm in the process of posting the original Markdown files to [a repository](https://github.com/jcolag/silver-bat-01-seeking-refuge) of their own.

118
2019-12-15-blogging.md Normal file
View File

@ -0,0 +1,118 @@
---
layout: post
title: Choosing Blogging Software
date: 2019-12-15 08:13:12-0500
categories: blog
tags: [intro, blog, meta, technology]
summary: It took an unfortunately long time to produce a simple blog.
thumbnail: /blog/assets/writing-wood-newspaper-europe-money-church-822714-pxhere.com.jpg
---
![Clippings](/blog/assets/writing-wood-newspaper-europe-money-church-822714-pxhere.com.jpg)
Last July, I started thinking seriously about publishing a blog and quickly put together around a dozen posts, with another few dozen fleshed-out ideas. Now, a year and a half later, I have *finally* flipped the switch. So...what the heck took so long!?
## The Goals
I started out with a basic idea of what I wanted I wanted the blog to be able to do beyond just showing the pages.
* Ingest [Markdown](https://www.markdownguide.org/) files so that I can store the original text under version control, separate from everything else. Even if the blog itself crashes and burns, the content should always be easy to move or archive.
* Allow easy changes to the styling to match [my personal website](https://john.colagioia.net). Consistency is important.
* Not require any additional software running *just* to serve up the blog. Previously, I worked with [WordPress](https://wordpress.org/) and [Blosxom](http://blosxom.sourceforge.net/), and briefly checked out [Ghost](https://ghost.org/), but none of them *quite* seemed worth the trouble of maintaining and patching, here.
* Ideally, but not necessarily, allow for the occasional chunk of code to run live.
* Act like a blog, for the most part.
* Allow for multiple blogs on the same server, potentially, as I spin up new projects.
Because I didn't really want to run additional software and because running multiple instances would be trivial, most of the requirements led me to the world of Static Site Generators, frameworks that take source content and transform the input into webpages that look like an application. That sounds like it might help make the decision, but there are [*hundreds*](https://www.staticgen.com/) of these things, so I needed to pare down the list in some way. While I'd like to say that I came up with a set of critical rules, the reality is that I picked systems that were getting some buzz and tried them out.
## Hugo
My first test was with [Hugo](https://gohugo.io/) and...I probably didn't give it enough of a chance. The showcase blogs all look very similar, though, and I often have trouble running Go code for some reason, so while I managed to create and build a simple blog, I ended up deleting the project and moving on.
## Gatsby
The next system---the system that took up most of my time on this experiment---was [Gatsby](https://www.gatsbyjs.org/). There is a *lot* to like about Gatsby. It uses [React](https://reactjs.org/) in its templates, which I like and helps with modularity. It has a lot of "starter packs" that lay out the site in a reasonable way from the start. The build process optimizes the pages pretty well. And there's even a layer that allows a page to pull in external data to process it.
By all accounts, Gatsby *should* have been the winner, but somehow wasn't.
My [first attempt](https://github.com/jcolag/gatsby-theme-jc) worked surprisingly well up until I added a plugin (a JavaScript package) for some simple feature. That plugin was incompatible with some part of the starter kit, and Gatsby turns out to be fragile in some cases, no longer able to build the site. Worse, upgrading the existing patches and/or removing the plugin failed to fix things. I quickly became frustrated with this and, because I still wasn't sure I needed the blog, ultimately put everything aside.
## Gatsby, Round 2
Fast forward about a year, and I decided that a blog would still be useful and Gatsby deserved a second chance with a more blog-focused starter.
I had to rewrite the "frontmatter" for each post, but I was able to more quickly create the styling I needed, this time, *but* started running into trouble again, when I wanted to add some metadata to posts. I wasn't able to get that to work, probably because I'm insufficiently conversant with GraphQL.
On top of that, I also had problems deploying the generated code to my existing website. The links didn't work in a subdirectory, and there's no explicit way to set this up that I could quickly find.
But then, Gatsby just...stopped working. Again. I'm still not sure what I did to trigger a change, but I tried a few things to fix the problem that only made things worse.
Could I have taken this problem to Stack Overflow for advice? Probably, and I probably would have tried if this was for an employer, but using Gatsby wasn't an important part of the blogging. So, I dropped Gatsby and moved on.
## Jekyll
Unlike the other systems, [Jekyll](https://jekyllrb.com/) is more than ten years old and, thanks to its adoption by GitHub as a supported approach to blogging, is widely used and very stable. And unlike Hugo and Gatsby, Jekyll is designed primarily for blogging, rather than intended for any site with blogging being just one option.
Again, I needed to update the post frontmatter to fit Jekyll's scheme. However, styling the Jekyll blog was surprisingly easy. Adding metadata to posts, like a thumbnail image and a summary, also turns out to be relatively easy.
Even better, Jekyll's configuration has a `baseurl` option that sets the blog to operate out of a sub-folder.
So, after all that farting around with sophisticated systems that I thought might be fun, the winning system is one of the first. I probably should've just started there. Oh, well...
### Modifying Jekyll
Being part of the [Ruby](https://www.ruby-lang.org/en/) ecosystem, the Jekyll themes are stored as global gems (packages). This means that all of the files are held in common. Overriding the common files is handled by making a local copy of the important files and making whatever changes are neeeded.
To do this, we need to first find the theme's package. The default theme (found in the `_config.yml` file) is named **minima**, so we call...
```sh
bundle info minima
```
...and we get output that looks like...
```
* minima (2.5.1)
Summary: A beautiful, minimal theme for Jekyll.
Homepage: https://github.com/jekyll/minima
Path: /var/lib/gems/2.5.0/gems/minima-2.5.1
```
At the listed path, there are folders named (in my case) `assets`, `_includes`, `_layouts`, and `_sass`. Creating the relevant folder inside the Jekyll project and copying the relevant file (for example, `_layouts/post.html`) provides a local file that can be modified with Shopify's [Liquid](https://shopify.github.io/liquid/) templating system, making it extremely easy to make significant changes.
## Adding Comments
Of course, it's not a blog unless people can leave comments, ideally comments that can be moderated, since certain people can be...less than thoroughly useful, let's say.
I initially tried working with [Isso](https://posativ.org/isso/), but while it was easy enough to install and passed some basic tests, apparently needs more infrastructure set up than I was willing to investigate, so I set that aside.
[Coral](https://coralproject.net/) was also worth a quick experiment, but takes a lot of administrative work to get it running, unfortunately.
The other major alternative that fits my minor requirements is [Hashover](https://www.barkdull.org/software/hashover), despite the fact that it runs in the filesystem, making it slightly less portable than would be ideal. However, it (or rather, its successor project) worked right out of the box and was trivial to change the styling to match the surrounding blog.
Hashover has a nice administration system. It would be *slightly* nicer if it used [Libravatar](https://www.libravatar.org/) instead of [Gravatar](https://en.gravatar.com/) for user images, but I'm willing to let that pass for now and investigate possibly adding the feature in the future.
## The Winners
It's entirely possible that I didn't give the other systems a fair enough shake and/or my problems could have been easily fixed with obvious advice and/or the other projects weren't meant to be run on a VPS with a lot of other projects running. It's also very likely that I overlooked systems that would have been perfect for my needs and didn't bother to investigate them. But for my use case and the time I was willing to put into the search, the combination that works for me is:
* [Jekyll](https://jekyllrb.com/)
* [Hashover](https://www.barkdull.org/software/hashover)
And that's what you're looking at here.
It's missing some features, of course.
* I would like to figure out what to do with the post tags, for one. They currently just sit in unused metadata.
* The blog will eventually probably need a search feature as it grows.
* I haven't tested whether Jekyll will automatically paginate, once the number of posts becomes large, so that may become important.
* As mentioned, I'd like Hashover to use Libravatar instead of Gravatar.
* I may also want to disable anonymous comments.
I'll post an update and link to it from here, if I decide on a reasonable way to make any of those work.
Regardless, the good news is that, if something better comes along, the source files for both the blog posts and the comments are stored separately, making it easy to transfer to them to another system.
* * *
**Credits**: Untitled header photograph [from PxHere](https://pxhere.com/en/photo/822714), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).

114
2019-12-17-metal-umlauts.md Normal file
View File

@ -0,0 +1,114 @@
---
layout: post
title: Metal Umlauts, Searching, and Other Unicode Fun
date: 2019-12-17 17:01:12-0500
categories: programming
tags: [javascript, unicode, programming, technology]
summary: Re-normalizing strings for improved user experience and entertainment
thumbnail: /blog/assets/writing-book-vintage-antique-texture-old-629962-pxhere.com.jpg
---
![Header Image](/blog/assets/writing-book-vintage-antique-texture-old-629962-pxhere.com.jpg "Writing with diacritical marks")
[Unicode](https://en.wikipedia.org/wiki/Unicode)---the computer "alphabet" that includes all the characters you see on this page, plus most modern writing systems in common use (∂), plus punctuation and currency (௹), plus arrows and mathematical notation (↛), plus drawing symbols (✵), plus emoji (🐣), and more---has a lot going on in it beyond the obvious complexity of multiple formats (UTF-8, UTF-16, GB18030, UTF-32, BOCU, SCSU, UTF-7, and probably others) and [byte orderings](https://simple.wikipedia.org/wiki/Endianness). The part that has grabbed my interest, recently, is the idea of [Normal Forms](https://en.wikipedia.org/wiki/Unicode_equivalence#Normalization), of which we have four.
* **NFD**: Canonical Decomposition
* **NFC**: Canonical Composition
* **NFKD**: Compatibility Decomposition
* **NFKC**: Compatibility Composition
Specifically, Normalization Form Canonical Decomposition interests me, because it represents each accented letter in a string as the base letter followed by any accents.
Better yet, in JavaScript, it's easy to change normalization forms. Specifically, for these purposes, we want:
```JavaScript
str.normalize('NFD');
```
The decomposed letters have some nice uses.
## Sorting
At least in English, diacritical marks are usually a marker for either history (fiancée, über, soupçon, Māori, piñata) or pronunciation (naïve, coöperate), rather than as an element of spelling. This is especially true of names, where we generally want a person's name to be represented properly (Karel Čapek, Charlotte Brontë, Beyoncé Knowles), and that name can come from anywhere in the world, but English treats it more as an affectation than a critical element of the name.
Of particular importance, here, is that we generally wish to sort a name with accented letters as if the accents don't exist. So, we want piñata to sort identical to "pinata" and Čapek to sort like "Capek."
The decomposed form allows us to do this by stripping the diacritical marks out of the string when we sort it.
```JavaScript
const sortedStrings = strings.sort((a,b) => {
const aNorm = a
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
const bNorm = b
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
return aNorm < bNorm ? -1 : 1;
});
```
That admittedly looks a bit complicated, given the regular expression, but the entire process boils down to decomposing the strings, stripping off the diacritical marks (Unicode codepoints 0x0300 to 0x036f), and comparing the results.
In other words, by normalizing the name, the computer represents "Čapek" something like
```
[C] [caron] [a] [p] [e] [k]
```
Then, we remove any diacritical marks (the [caron](https://en.wikipedia.org/wiki/Caron) or **ˇ** &nbsp;&nbsp;in this case) by replacing them with nothing, leaving us with only the Latin letters.
## Searching
Moreso than with sorting, it's a better experience to search without regard for diacritical marks. For example, an increasing number of laws intended to suppress minority votes are posed as "exact match" measures, which require that handwritten voter registration documents be identical to personal identification documents, meaning that the *exactness* of accents and diacritical marks relies primarily on the comprehension and interest of an underpaid data entry clerk.
By the same token, even something with much lower stakes like searching an employee directory shouldn't rely on the person searching for Beyoncé realizing that she has an acute accent in her name *or* that Human Resources input her name properly.
And neither of those even touches on the problem that a standard keyboard for English doesn't have an easy way to type accented characters. So, even if a user has cleared the above hurdles, it's still a waste of the user's time to make them hunt down the exact spelling with diacritical marks.
We can solve this problem in a way similar to the sorting, normalizing and stripping both the target string and the corpus being searched.
## Metal Umlauts (or M͇ͭeţal Um͆l̼a͍u̓t̨s)
It's a bit before my time, but one of my favorite television shows growing up (via re-runs and now streaming) is **Mission: Impossible**, in no small part because of the signage in their fictional foreign countries. Especially in earlier episodes, to make foreign countries seem both exotic and approachable to American audiences, show creator Bruce Geller had the idea of creating signs written mostly in English, but a version of English with clever misspellings representative of stereotypes of certain parts of the world, often including bogus diacritical marks.
For example, if you pay careful attention, you'll spot both *Zöna Restrik* (for Restricted Area) or *Prıziion Mılıtık* (for Military Prison).
And, of course, if you're a heavy metal music fan, you're undoubtedly familiar with the similar but distinct [Metal Umlaut](https://en.wikipedia.org/wiki/Metal_umlaut), though its use seems surprisingly limited to the diaeresis (**¨**) mark.
If we wanted to do something like transforming English text to Gellerese, you're on your own figuring out how to change the base spelling in a reasonable way. But adding bogus diacritical marks? That, we can definitely do.
```JavaScript
let output = '';
str = str.normalize('NFD');
for (let i = 0; i < str.length; i++) {
const c = str[i];
output += c;
if (c.match(/[a-z]/i)) {
const rLen = Math.floor(Math.log2(Math.random() * 3));
for (j = 0; j < rLen; j++) {
const rCh = 0x0300 + Math.floor(Math.random() * 0x006f);
output += String.fromCharCode(rCh);
}
}
}
```
Again, we normalize the input string. But instead of removing diacritical marks as we've been doing, here we visit each character and, if it's a letter, we pick a random-but-small number of diacritical marks to add (using `log2()` pushes the numbers lower and biases the distribution towards the lower end), and then selects the necessary diacritical marks from that same 0x0300 to 0x036f range we previously needed to remove.
If desired, this can easily be made more "intelligent" with lists of diacritical marks that are more appropriate to that letter, so that you don't end up with implausible combinations like what you see in the above section heading.
In either case, it might be a good idea to call `output.normalize('NFC')` at the end to set the characters back to their "composed" forms.
## Exception
One place where normalization has no effect is the Polish *L-with-stroke* (Ł or ł). It turns out that, as far as Unicode is concerned, those are letters unto themselves rather than modified letters. So, if you're planning on using any of these techniques, you will want to take that into account.
## Other (Programming) Languages
The above sample code snippets are all in JavaScript, but the Windows API supports [`NormalizeString()`](https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-normalizestring) and .NET has supported [`String.Normalize()`](https://docs.microsoft.com/en-us/dotnet/api/system.string.normalize?view=netframework-4.8) for quite some time. Ruby supports [`string.unicode_normalize()`](https://apidock.com/ruby/v2_5_5/String/unicode_normalize). It shouldn't be hard to find the equivalent for other languages, now that we know the key words to search for are "unicode normalize," maybe throwing in "nfd" or "decomposed" to make the context clearer.
Happy umlauting!
* * *
**Credits**: Untitled header photograph [from PxHere](https://pxhere.com/en/photo/629962), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).

151
2019-12-20-social-media.md Normal file
View File

@ -0,0 +1,151 @@
---
layout: post
title: Social and Anti-Social Media
date: 2019-12-20 17:01:12-0500
categories: media
tags: [socialmedia, facebook, twitter, scuttlebutt, television, advertising]
summary: "The inevitability of for-profit social media making you angry and why alternatives fail"
thumbnail: /blog/assets/Radio_News_Sep_1928_Cover.png
offset: -18%
---
![Radio News](/blog/assets/Radio_News_Sep_1928_Cover.png "Radio News September 1928")
Last August, news broke that Twitter's CEO [may have personally kept Alex Jones on the network](https://www.wsj.com/articles/inside-twitters-long-slow-struggle-to-police-bad-actors-1535972402?mod=e2tw), overruling the company's own moderation rules. The most surprising thing about the story is that...people were surprised. It _should_ have been more surprising that any of the so-called social media sites (Facebook, YouTube, Twitter, et al) banned him, because, well, hate speech is good for their bottom lines.
More recently, all of the major social media companies have scrambled to craft rules for political advertising while not actually doing anything useful. Twitter is unilaterally banning political ads while [not actually defining them](https://qz.com/1740533/three-ways-twitters-political-ad-ban-could-help-bad-actors/) and [include biased exceptions](https://www.cnet.com/news/twitters-political-ads-ban-has-exceptions/). Facebook [is A-OK with lying](https://www.theverge.com/interface/2019/10/15/20913906/facebook-political-ads-lies-zuckerberg-warren-profits) while [Zuckerberg admitted wanting specific election outcomes](https://www.theguardian.com/technology/2019/oct/01/mark-zuckerberg-facebook-elizabeth-warren-big-tech). Google [claims some limitations](https://blog.google/technology/ads/update-our-political-ads-policy/), but is still setting themselves as arbiters of what constitutes a *political* position. The other networks all [have their own rules](https://www.reuters.com/article/us-usa-election-advertising-factbox-idUSKBN1XV071), with all of them relying on some level of honesty from advertisers and carving out arbitrary exceptions.
**Please note**: I have no objection to any of those companies choosing who or what to allow or disallow. The infrastructure, names, and reach are theirs to do with as they please (even though I *definitely* think there are monopoly problems to be solved), and removing their editorial control would be a dangerous attack on freedom of expression. This is about how their choices effect users and what to do about it.
To unpack the profitability of hate speech, let's back up a few decades.
## Background
The late [Rod Serling](https://en.wikipedia.org/wiki/Rod_Serling) once quipped that:
> It is difficult to produce a television documentary that is both incisive and probing when every twelve minutes one is interrupted by twelve dancing rabbits singing about toilet paper.
Yet, considering that advertising accounts for the majority of non-subscription [television network revenue](http://www.journalism.org/fact-sheet/local-tv-news/), it would also have been extraordinarily difficult for Serling to produce his incisive and probing documentary _without_ the dozen discoing Deilenaar footing the bills. And when you understand the reliance on advertisements, a lot of things become clearer.
![Screenshot from an Open Cola commercial mock-up](/blog/assets/opencola.png)
> > ...content is only important to the extent that it keeps you sufficiently emotionally engaged that you'll pay attention to the commercials.
Critically for this discussion, when you understand that commercials pay the bills, you understand that the primary goal of a _lot_ of television is to keep an audience engaged long enough to watch those commercials. That is, as far as the broadcaster is concerned, content is only important to the extent that it keeps you sufficiently emotionally engaged that you'll pay attention to the commercials. After all, if you tune out, the network loses money and would rather broadcast something cheaper to produce, more popular, or more compelling to a niche audience in the slot on the schedule. This, for example, is why channels founded to privatize educational, intellectual, and cultural programming (the Discovery Channel, the Arts & Entertainment Network, the Learning Channel, Bravo, the History Channel, and others, in just the United States) invariably replace their intended programming with reality shows and documentaries that are less incisive and programming so much as dubiously sourced and sensationalized. An opera and a documentary about spontaneous human combustion probably have roughly the same size audience on the small screen, for example, but the opera is expensive to produce and a viewers who accept assertions that spontaneous human combustion is real are _also_ likely to believe that the mail order herbal supplements being sold during the commercials will make them strong and virile.
This explains the structure of most shows, too. While separating a theatrical work into multiple acts has been standard procedure for thousands of years, a play doesn't generally need to worry about you coming back after or sitting through a commercial, nor is the time generally segmented into three or five acts. This results in a structure that doesn't quite conform to traditional theatrical act structure on one hand, but more importantly works to increase the viewer's emotional engagement up to a twist at every act break. TV Tropes has an excellent set of examples of what they call the [Commercial Break Cliffhanger](https://tvtropes.org/pmwiki/pmwiki.php/Main/CommercialBreakCliffhanger).
> > ...we all have that same "lizard brain" making us respond to a jump scare...
In the previous paragraph, "_emotional_ engagement" is the key phrase. And, when you're dealing with an audience you don't know, it's generally easier to provoke emotional engagement through stress (anger, fear, grief, and maybe jealousy) than other kinds of highs. A joke can fall flat and a character being rewarded might not be well-liked, but we all have that same ["lizard brain"](https://en.wikipedia.org/wiki/Amygdala) making us respond to a jump scare, and you can amplify those feelings easily with a change in lighting or the soundtrack.
Public television (such as PBS, in the United States) is, of course, a prime example of what television can look like without (direct) advertising. Even after nearly fifty years, they're still able to regularly bring fine arts ([Great Performances](https://en.wikipedia.org/wiki/Great_Performances)), science ([Nova](https://en.wikipedia.org/wiki/Nova_(TV_series))), investigative journalism ([Frontline](https://en.wikipedia.org/wiki/Frontline_(U.S._TV_series))), and just about everything else the private industry tried and failed to outdo in the '80s and '90s and more. The shows also don't give you any of those clumsy emotional shoves, either.
## B-but...Internet!
> It is the advertiser who provides the paper for the subscriber. It is not to be disputed, that the publisher of a newspaper in this country, without a very exhaustive advertising support, would receive less reward for his labor than the humblest mechanic.
###### attributed to Alexander Hamilton, 1775
Right.
!['I have never had any dealings with Messrs. Gabriel, and beg to ask by what right do they disturb me by a telegram which is evidently simply the medium of advertisement ?'](/blog/assets/Times-1864-06-01.jpg)
> > ...self-selection criteria in the form of poor grammar and shoddy stories that the less-gullible will just ignore.
It turns out that the medium doesn't really make a difference. The same process at work here can be seen to greater or lesser degrees in print print media, where a sentence might be cut to be continued on some deep interior page (with a lot of advertisements), only to find out that you were near the end of the article, anyway. You can see this at work with spam, where the low cost of sending e-mail only requires a handful of respondents to be profitable, leading to [self-selection criteria](https://www.microsoft.com/en-us/research/publication/why-do-nigerian-scammers-say-they-are-from-nigeria/) in the form of poor grammar and shoddy stories that the less-gullible will just ignore.
And, of course, you can see this in social media. Specifically, we know that:
* Corporate-run social media is funded by advertising to the extent that validating who purchases the ads wasn't even a _consideration_ until [it became necessary for public relations](https://usaherald.com/facebook-verify-political-advertisers-prevent-interference/).
* The companies were more than happy to allow [overtly racist ad targeting](https://www.nytimes.com/2017/09/15/business/facebook-advertising-anti-semitism.html) until they were caught. And even then, [they still do it](https://www.usatoday.com/story/tech/news/2018/09/18/facebook-men-only-ads-discriminate-against-women-other-genders-eeoc-complaint/1341473002/) for gender.
* Facebook, at least, has [experimented with manipulating user emotion](https://www.forbes.com/sites/gregorymcneal/2014/06/30/controversy-over-facebook-emotional-manipulation-study-grows-as-timeline-becomes-more-clear/#6c10af0e9caa) in violation of [ethical standards](https://en.wikipedia.org/wiki/Institutional_review_board).
* When Eli Pariser famously spoke about [filter bubbles](https://www.ted.com/talks/eli_pariser_beware_online_filter_bubbles), Mark Zuckerberg (among others) wanted to make sure social media [had a commitment to "diversity of viewpoints"](https://marketingland.com/zuckerbergs-manifesto-well-connect-world-beat-fake-news-pop-filter-bubble-207126) and Jack Dorsey [was right behind him](https://www.nytimes.com/2018/09/08/opinion/sunday/twitter-political-polarization.html), even though [ideological diversity](https://theintercept.com/2018/04/10/kevin-williamson-atlantic-ideological-diversity/) is a sham, we know [it just makes things worse](https://www.nytimes.com/2018/09/08/opinion/sunday/twitter-political-polarization.html), and **not** what we really mean when we worry about bubbles: Trying to not "...only see posts from folks who are like you" doesn't mean worrying about whether you've seen enough unsourced conspiracy theories or Social Darwinist propaganda. Of course, what Facebook claims to want and what it works for [might be very different](https://www.fastcompany.com/3046111/why-scientists-are-upset-over-the-facebook-filter-bubble-study).
Of course, there are two possible reasons of significance that these companies have such consistently weak vetting of advertisers, obsessions with "ideological diversity" over _actual_ diversity (which [is beneficial](https://qz.com/570732/diversity-actually-makes-us-smarter/), and ensure that your racist uncle's posts (or posts from professional hate-spewing trolls) are in your face all the time. The first possibility is that these companies are part of a right-wing movement. But thanks to the incompetent conservatives whining about not being sufficiently well-liked once they admit to being sexist and racist (to wit, James Damore and Brian Amerige), we know that's not the case. That leaves us the second option, that this is manipulation to work you up enough to pay attention to the ads.
By the way, the right-wing's obsession with being _respected and liked_ after denigrating huge swaths of the population and consistently supporting policies everybody can see are failures is, itself, almost certainly another discussion for another time...
> > ...the founders of those companies limit screen time for their _own_ kids...
Oh, and, if anybody wanted to assume "Option Three," that this is all coincidental/accidental and the social media companies _really_ have our best interests at heart, let's not forget that they're all too happy to [optimize their products for addiction](https://www.vice.com/en_us/article/vv5jkb/the-secret-ways-social-media-is-built-for-addiction), the founders of those companies [limit screen time for their _own_ kids](https://www.nytimes.com/2014/09/11/fashion/steve-jobs-apple-was-a-low-tech-parent.html), and former employees [consistently warn us](https://www.nytimes.com/2018/02/04/technology/early-facebook-google-employees-fight-tech.html) about the potential downsides of the products, including [depression](https://en.wikipedia.org/wiki/Major_depressive_disorder).
In other words, hate speech is profitable for them, because it makes you angry. If they can sustain that anger by subtly encouraging aggressive and offensive behavior and pitting their serfs against each other, so much the better. Errr..._users_. I totally meant to type "users," there, not "serfs." Weird autocorrect, though.
![Generic social media](/blog/assets/wall.png)
> > ...corporations are still uniquely and almost entirely fascist and feudal institutions...
Or, rather, maybe _serf_ is accurate. After all, despite all the amazing social and technical progress we've made in the outside world in a couple of centuries, with all society (plus or minus an occasional well-funded speed bump) trending towards democracy, corporations are still uniquely and almost entirely fascist and feudal institutions, with a "strong-man" leader whose whim is absolute law and "residents" (whether employees or customers) have as few rights as the management can manage, whether through [violence, as in the past](https://en.wikipedia.org/wiki/Anti-union_violence), or combinations of [non-compete](https://www.forbes.com/sites/omribenshahar/2016/10/27/california-got-it-right-ban-the-non-compete-agreements/#4af25e893538), [nondisparagement](https://www.nytimes.com/2017/07/21/technology/silicon-valley-sexual-harassment-non-disparagement-agreements.html), [forced arbitration](https://gizmodo.com/silicon-valley-needs-to-ban-forced-arbitration-agreemen-1822313732), [lack of privacy](https://thetechpanda.com/2013/06/25/how-silicon-valley-makes-money-by-snooping-on-your-information/), and other contractual clauses with few alternatives to agreeing to the contracts.
But, as they say...I digress.
Back to the topic, yes, you're being manipulated no matter what the end results. The pathologically-skeptical (if they've read this far) might also want to review [how the tobacco industry operated for decades](http://www.who.int/tobacco/media/en/TobaccoExplained.pdf) to see if any parallels jump out, since we already know how that story ends.
Another situation that's analogous in a different way: [Technocracy Inc.](https://www.washingtonpost.com/outlook/silicon-valleys-attempts-to-self-police-are-anti-democratic-theyre-also-not-new/2018/08/17/cd44fb22-9b1d-11e8-843b-36e177f3081c_story.html) in the wake of World War II, where industrialist experts insisted that ceding authority to unaccountable rich people would produce a utopia. It's the aforementioned corporate fascism/feudalism weirdly fused with the socialist implications of Edward Bellamy's [**Looking Backward From 2000 to 1887**](https://en.wikisource.org/wiki/Looking_Backward_From_2000_to_1887). Technocracy Inc. also, inexplicably, still exists, with an ["elevator pitch"](http://www.technocracyinc.org/technocracy-in-a-nutshell/) literally dismissing the will of the people in allocating resources. Yes, there's also a _claim_ of ignoring profit as well, but the track record of the private sector in solving public sector problems altruistically isn't exactly great.
> > Advertising is obsolete
Oh, and the kicker? [Advertising is obsolete](https://theconversation.com/advertising-is-obsolete-heres-why-its-time-to-end-it-101639) (I'd recommend reading the Yale Law Journal article, if you have the time for seventy footnoted pages) and/or, in the United States, may run afoul of the [Sherman Antitrust Act](https://en.wikipedia.org/wiki/Sherman_Antitrust_Act_of_1890). And that would mean that all of this systemic emotional abuse to get us to click serves at best no purpose and at worst an _illegal_ purpose.
## What about Those Other Sites?
Yes, there are _many_ social networking sites that aren't the big names. [Wikipedia's list](https://en.wikipedia.org/wiki/List_of_social_networking_websites) has somewhere in the neighborhood of 250 sites that are currently running. But, you might notice that, if you ignore the sites that are gone and forgotten, the juggernauts, the niche sites, and the open source distributed systems I'll talk about later, the remainder of the list is...pretty much irrelevant.
> > ...asking people to pay for a walled garden that simulates the e-mail and browsing experience we already all have...
In cases like Ello or Gab or whatever, the funding is intended to come from subscription fees. And asking people to pay for a walled garden that simulates the e-mail and browsing experience we already all have is _probably_ doomed to failure. After all, how many people do you know who pay for LinkedIn, and _they_ provide services that are reasonably exclusive and useful for that money.
There's also the problem, of course, that more than a few of them (like Gab) are designed (via their lack of moderation in pursuit of hypocritical "free speech") as homes to fascist and bigoted communities. And laws against hate speech and incitement to violence makes that something of a problem to host and fund, even if people are willing to pay a subscription fee.
## OK, So What?
> A weed is but an unloved flower.
###### _The Weed_, Ella Wheeler Wilcox, 1911
Now that we have all this information, what can we do about it?
![C'mon, better than _that_...](/blog/assets/Smartphone_Zombies.png)
Well, unfortunately, advice is a tricky thing. What I _really_ know is what appears to work well for me in my particular context, whereas you, the reader, are likely neither me nor in my context.
That said, here's how I look at the landscape. Take it with a grain of salt and, ideally, contribute back, so that it's more likely that the advice will work for more people in more contexts.
**First**, and probably the most straightforward, _turn off push notifications_ if you have any. You don't need to know every single time somebody thought to interact with you and the information will still be there in a few hours. The Internet works on your schedule, not the other way around.
> > ..._be aware_ of the of the business models in effect...
**Second**, _be aware_ of the of the business models in effect on corporate-run social media. If you ignore the motivations behind a system, you can't reasonably deal with the system on your own terms. Especially keep this in mind when you're about to react to what someone has posted. Are you...
* Participating in a real relationship with the person you're talking to?
* Making a clarifying statement for the bystanders who might not have formed an opinion?
* Stoking the community drama?
Those may benefit you as a user to different degrees and they rev the site's engines in different ways by prodding more people and giving a wider platform to the problematic statements and propagating the reactions. But you can't make an informed decision unless you're actually informed.
**Third**, always go in with a goal and then get out. Treat social media as a chore to get specific things done and to groom specific relationships, rather than a space to passively consume. This hopefully reinforces your awareness of the structure and limits the time spent feeding the machines. The infinite-scrolling page is compelling you for a reason, and you're allowed to ignore it.
Most of my Twitter posts are set up over the weekend to post during the week, for example. And then I check networks for activity daily (Twitter), weekly (LinkedIn), or every few weeks (Facebook), based on how often real people try to connect with me directly and how stressful the experience is.
> > ...see how social media _could_ look...
**Fourth**, investigate the alternatives to see how social media _could_ look without the profit motive. None of them is perfect, by any means, but I would recommend trying out at least the major Free Software players:
* [Diaspora](https://diasporafoundation.org/), which was broadly created as a reaction to some of Facebook's specific excesses, such as infamously claiming a license on all of your content and abruptly changing privacy settings.
* [Mastodon](https://joinmastodon.org/) (and [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub)-based systems, more generally), which is mostly presented as a Twitter clone without the trademarks, but has a much broader utility.
* [Scuttlebutt](https://www.scuttlebutt.nz/), which stores your information on your network on your computer for access offline.
Granted, your friends probably aren't there, yet, and each setup has its own quirks and communities (I may post about those soon, as I continue to explore), but just seeing how this can work without being driven by advertising can change your outlook on the systems you do use. Specifically, you can see how much more relaxed the conversation feels, even when a large number of people posting on some of the networks are _exactly_ the sorts of people getting banned for being too abusive on the mainstream sites.
**Fifth** and finally, don't forget about the _original_ online social network, the web and e-mail, or phones and visits, if you prefer. Don't be afraid to just reach out to your friends and family directly to share with them. Or, if you want to share with the world, run your own website to do that. You can do all of this on _your_ terms, without many obstructions or parasites involving themselves.
Which is all to say: Recognize that there's a problem and find your way to either live with it or eliminate it. And don't fall for fake solutions created by precisely the same people who created and profit from the problem.
This rant was brought to you by...
* * *
**Credits**: The header image is from the cover of Hugo Gernsback's **Radio News**, September 1928. The complaint about unsolicited commercial telegraph advertisements comes from **The Times**, 01 June 1864. The picture of the _Smartphone Zombies_ is licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0) by Ccmsharma2. The Open Cola screenshot comes from [a mock-up advertisement](https://www.youtube.com/watch?v=dMD2SF_E0gg) for the original [open source soft drink](https://en.wikipedia.org/wiki/OpenCola_(drink)), created and licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0) by [springload1](https://www.youtube.com/user/springload1).
The fake social media site is built on the code from [Nicky Case](https://ncase.me/)'s [Nothing to Hide](http://www.nothingtohide.cc/) (licensed [CC0](https://creativecommons.org/choose/zero/)), with avatar images from various [Unsplash](https://unsplash.com/) (images also licensed CC0, found via [UI Faces](https://uifaces.co/) as convenient curation), names from the first few random creations of [UI Names](https://uinames.com/) (available under the [MIT License](https://opensource.org/licenses/MIT)), and post contents adapted from [There Is an Orange Here](https://github.com/flexo/nanogenmo2015) (also under the MIT License).

View File

@ -0,0 +1,41 @@
---
layout: post
title: SlackBackup
date: 2019-12-22 7:01:12-0500
categories: project
tags: [slack, electron, javascript, programming, technology, project, announcement]
summary: "I announce an older project of mine that some people use"
thumbnail: /blog/assets/slackbackup1.png
---
![Sentiment Analysis](/blog/assets/slackbackup1.png "Sentiment Analysis")
A job and a couple of social groups have more or less standardized on Slack for internal communications. One of the biggest problems with using Slack, for those who haven't had the experience, is the pricing scheme, which effectively holds your team's conversations for ransom by hiding older content and displaying banners announcing that the conversation is behind a paywall. If a "team" is actually multiple Slack teams with different legal requirements, the cost can be extraordinarily high.
That's Slack's prerogative, of course. But, since they also offer an API with (currently) no usage restrictions except for rate limits, it's _my_ prerogative to download my history, and I'm not fond of business models that are closely related to extortion, obtaining something of value from someone through threat of (in this case) a lack of access to your own conversations.
_SlackBackup_ is an example of a project spiraling out of control in a satisfying way. It started life as a short script to just pull specific information. Then it became a script with a configuration file. Then the script added the ability to delete older files. That became an Electron app to easily modify the configuration file. And then *that* became a program that will also search the archive and show visualizations of my conversations. Most of that happened over a weekend...
![Main Page](/blog/assets/slackbackup2.png "Configuration")
It's not perfect, but it appears to work reliably (at least, until Slack inevitably kills its token-based API) and it's easy enough to provide new builds.
## Get It
Should you need something like this, you can download the latest build (v1.2) [from GitHub](https://github.com/jcolag/SlackBackup/releases), though it may be a *bit* behind code changes.
If you're more technical (you can download a repository and use the command line), [the repository](https://github.com/jcolag/SlackBackup) has straightforward instructions for you, which will keep you at the latest and greatest.
## The Technology
I won't bother going into too much detail as to how it all works (because interested people can dig through the repository and ask questions), but I'd like to give a quick overview of the major technologies involved.
The core of the user interface is the [Electron/React Boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate), which combines [Electron](https://electronjs.org/), [React.js](https://reactjs.org/), [Redux](https://redux.js.org/), [React Router](https://reacttraining.com/react-router/), [Webpack](https://webpack.js.org/), and the [React Hot-Loader](https://gaearon.github.io/react-hot-loader/) in a single package. Redux struck me as too top-heavy for the minimal dataflow needs of the application, so I chose to work with [Reflux](https://github.com/reflux/refluxjs), instead, so you'll see some remnants of the original boilerplate Redux code that I still haven't completely extracted.
The core of what the program does leverages Slack's deprecated-but-still-usable [token-based API](https://api.slack.com/web) with a simple HTTP library making the requests.
The interface styling is handled via [Bootswatch](https://bootswatch.com/), providing more than twenty decent styles I can easily swap out. Some [Font Awesome](https://fontawesome.com/) symbols are also used and the [Moment](https://momentjs.com/) library is used for formatting times. [D3](https://d3js.org/) is used for all the data visualizations.
Those visualizations rely in an implementation of the [Flesch index](https://github.com/words/flesch), [sentiment analysis](https://github.com/thisandagain/sentiment), and a [Porter stemmer](https://github.com/words/stemmer). Note that all analysis and visualization is focused on your user in each Slack team, to avoid any privacy concerns.
I also started integrating [Project Fluent](https://projectfluent.org/) for localization purposes, but haven't gotten far enough for that to make a difference.

59
2019-12-24-christmas.md Normal file
View File

@ -0,0 +1,59 @@
---
layout: post
title: 🎄 Unraveling Christmas 🎄
date: 2019-12-23 07:03:12-0500
categories: holiday
tags: [holiday, christmas, history, celebration, solstice]
summary: "Musings on the holiday season"
thumbnail: /blog/assets/christmas-lights-free-pictures-1-2515-3.jpg
---
![Christmas lights tied on a rope](/blog/assets/christmas-lights-free-pictures-1-2515-3.jpg "Christmas lights")
I realize I'm presenting this like it's an unpopular opinion and it very much is not, but I like Christmas. As a kid, I saw it as posing as a religious celebration, while actually being a much broader and more inclusive excuse to spend time with the people we care about.
> > ...most cultures have and have had celebrations around the winter solstice that makes some reference to a kind of rebirth of the world.
As you look into it, you start to realize that most cultures have and have had celebrations around the winter solstice that makes some reference to a kind of rebirth of the world. We have something like thirty holidays starting in early December (Chalica, Kolaida, and Bodhi Day) and ending in mid-January (Lohri and Old New Year), with Christmas itself wrapping around another dozen different celebrations and festivals from Los Posadas to Orthodox Christmas.
And it's no accident that Christmas is part of this. On one hand, to Christians, the birth of Jesus represents the birth of a new world, and conflating the Sun with the Son is natural at a time of year when (in the northern hemisphere) the Sun has its smallest apparent diameter. But on the other hand, as Christianity expanded and (sometimes forcibly) converted new groups of people, it would only make sense to adapt and integrate their traditions, especially when they already overlap.
However, Christmas was never meant to be an important holiday in Christianity, Easter being the holiday with more metaphysical significance to Church leaders. But the crowning of [Charlemagne](https://en.wikipedia.org/wiki/Charlemagne) as the Holy Roman Emperor on Christmas Day in the year 800 increased the holiday's profile, further increased by the crownings of East Anglian King Edmund the Martyr (855) and William the Conqueror (1066).
> > ...centered on drunkenness, promiscuity, and gambling, with early carols condemned as lewd...
However, this wasn't the Christmas we know today, but rather centered on drunkenness, promiscuity, and gambling, with early carols condemned as lewd and many British and French areas appointing a "Lord of Misrule" to preside over festivities. This is the holiday that the Puritans banned for many years and, among the wealthy, became a concern as society urbanized and poor people were more visible, fearing (as often comes up) that the poor would use the chaos as an excuse to rise up and commit violence, with some violence (in the form of wassailing, visiting houses and demanding to be fed) already traditional; the ban resulted in protests and, ironically, rioting. Echoes of this chaos and of the fears can be seen in the darker Christmas characters, such as Krampus, Pere Fouettard, Zwarte Piet, Frau Perchta, Kallikantzaros, the Yule Lads, and so forth.
In this environment, the Anglican Church's nineteenth century Oxford Movement took steps to change the situation by reinventing the holiday as something family-friendly and we start to see the Christmas we know today start to form:
* Washington Irving published his parodic [**A History of New York**](https://www.gutenberg.org/files/13042/13042-h/13042-h.htm) (1809), reshaping Christmas [in many ways](https://www.neh.gov/humanities/2016/fall/feature/how-washington-irving-shaped-christmas-in-america).
* Tha anonymous *Old Santeclaus with Much Delight* (1821) establishes early versions of a lot of Santa Claus-based lore.
* Clement Clarke Moore anonymously publishes *A Visit from SSt. Nicholas* (1823), popularizing gift exchanges.
* Charles Dickens publishes **A Christmas Carol** (1843), continuing the new shape of Christmas as a time for family gatherings, polite entertainment, and reconciliation.
* Thomas Nast mostly reinvented Santa Claus (1863) as the one we know today.
![Nast's Original Santa Claus](/blog/assets/8261713052_f93056fab0_o.jpg)
> At this early period was instituted that pious ceremony, still religiously observed in all our ancient families of the right breed, of hanging up a stocking in the chimney on St. Nicholas Eve; which stocking is always found in the morning miraculously filled; for the good St. Nicholas has ever been a great giver of gifts, particularly to children.
###### Washington Irving, **A History of New York**, 1809, Chapter IX
Which is to say that, while there would be some adjustments (like Nast), the bulk of the holiday was revised over only around thirty years, is only around two hundred years old, and no more religious than the public orgies of the Middle Ages.
> > the New Year Spruce
There's the Christmas tree itself, which as you can see in [the Wikipedia article](https://en.wikipedia.org/wiki/Christmas_tree), is remarkably weird, including ancient traditions and a pyramid-like decoration, plus its restoration without Christmas by the Soviets as the New Year Spruce. Christmas trees were also [adopted as a secular symbol by Jewish people](https://www.futurity.org/christmas-tress-in-jewish-homes-history2234982-2/) until concerns about erasure of Judaism became a possible issue, though it's not uncommon today to find a Jewish family today with a [Hanukkah bush](https://en.wikipedia.org/wiki/Hanukkah_bush), a tongue-in-cheek tradition dating back at least as far as 1879.
And then, sometimes, Santa protects us from extremely stupid aliens.
<iframe src="https://archive.org/embed/SantaClausConquersTheMartians1964_201705" width="640" height="480" frameborder="0" webkitallowfullscreen="true" mozallowfullscreen="true" allowfullscreen></iframe>
> > ...highly secular and inclusive, as a great holiday should be.
Which is all to say that, at its heart, Christmas is one of a continuum of extremely natural holidays built around the winter solstice and, as such, has always been highly secular and inclusive, as a great holiday should be. Obviously, if you or your family goes to mass on Christmas, the holiday is *slightly* more religious and exclusive to you, but that's highly optional, even among the devout.
And *that*, my friends, is why I like Christmas and somehow make it sound like an unpopular opinion. Merries and happies, everyone!
* * *
**Credits**: [Christmas lights tied on a rope](https://www.1millionfreepictures.com/2013/12/2-christmas-lights-free-pictures-2515.html) by [an Unknown former Google+ user](https://plus.google.com/116074968591568480442), dedicated to the public domain on [1 Million Free Pictures](https://www.1millionfreepictures.com/). The early image of Santa Claus is *A Christmas Furlough*, by Thomas Nast, from an 1863 issue of **Harper's Weekly**. [**Santa Claus Conquers the Martians**](https://en.wikipedia.org/wiki/Santa_Claus_Conquers_the_Martians), which has fallen into the public domain, is available from [the Internet Archive](https://archive.org/details/SantaClausConquersTheMartians1964_201705).

147
2019-12-25-upgrades.md Normal file
View File

@ -0,0 +1,147 @@
---
layout: post
title: Upgrading the Blog
date: 2019-12-25 07:53:12-0500
categories: blog
tags: [blog, meta, technology]
summary: Filling in some missing features
thumbnail: /blog/assets/writing-pencil-pen-red-paper-lip-1363790-pxhere.com.jpg
offset: -17%
---
![Editing](/blog/assets/writing-pencil-pen-red-paper-lip-1363790-pxhere.com.jpg "Editing")
As mentioned in [my post]({% post_url 2019-12-15-blogging %}) about how I set up this blog, there still seemed like there might be some necessary features to be added. And as I experiment and write up some posts in advance, I can see that at least a couple of those features need to be there before the new year hits. So, this is that story.
## Pagination
> > ...pagination isn't a default...
As I add pages for future release, it became obvious that pagination isn't a default part of Jekyll and, if I imagine two posts per week (I'll post details on my plans next week), the blog is likely to become unusable after a few months.
A quick web search turned up [Jekyll's own page](https://jekyllrb.com/docs/pagination/) on the subject. I followed the instructions, though hit a couple of small snags:
* The documentation isn't quite clear that the blog's existing `index.markdown` needs to be removed and replaced with an `index.html` file in Jekyll's root folder. From there, the sample page makes a good start that I was able to adapt with the changes I had already made for my `_layouts/home.html`. Except...
* Unlike `layouts/home.html` and `index.markdown`, the `index.html` frontmatter requires a `title`. Without it, Jekyll picks another page in the root, specifically my [code of conduct](/blog/coc/), for some reason. It took a surprisingly long time to figure what was going on, there.
* It looks like the pagination gem doesn't understand how to combine the `baseurl` and `paginate_path` options. The link second page link pointed to `/blog/page2`, but the page was generated at `/blog/blog/page2`.
* Because the post pages are pre-generated, they showed up in my header. I needed to add `and my_page.title != 'Posts'` to the `_includes/header.html` line that decides whether to render a link to the page.
Obviously, most of these can be worked around, but that third item was a huge problem that didn't appear to have any resolution. So, I started to investigate [the successor project](https://github.com/sverrirs/jekyll-paginate-v2).
> > ...requires a completely different configuration.
I updated the gem and then stumbled around, trying to find the configuration documentation. It claims that it's compatible with the original version, but actually requires a completely different configuration. Eventually, I found [the directions](https://github.com/sverrirs/jekyll-paginate-v2/blob/master/README-GENERATOR.md#site-configuration) and was able to quickly remove the old configuration and replace it with...
```YAML
pagination:
enabled: true
per_page: 8
permalink: 'page/:num/'
sort_reverse: true;
```
It seems silly to require enabling it as part of the configuration, and sillier still to make reverse-chronological sorting an option when it's obviously how every blog works, but sure. Oh, also silly (keep scrolling down the documentation page), the index file needs...
```YAML
pagination:
enabled: true
```
...added to the `index.html` frontmatter, because we haven't turned this feature on *nearly* enough times, I guess.
> > ...backward-compatibility was dropped in January 2018...
If you scroll even further down the page, you can see the warning stating that backward-compatibility was dropped in January 2018, explaining that mystery.
Just one problem, this time, despite the goofy configuration. Once again, the `permalink` setting doesn't play well with `baseurl`. In this case, though, I just added `/blog` to the start of the paging URLs in the index. There's probably a better way of handling this, but it does the job.
## Tagging
Jekyll has some gems to handle tags, but on the chance that I might eventually want to use [GitHub Pages](https://pages.github.com/) to host the blog, it looks like the state of the art is [Long Qian's approach](http://longqian.me/2017/02/09/github-jekyll-tag/).
It took about five minutes to churn through the entire thing, though there are a few minor glitches.
First, the instructions aren't using `siteurl`, which means tweaking some of the tag-page URLs to make this work.
> > ...keep the tag pages up to date...
Second, someone needs to keep the tag pages up to date as posts are added and modified. Fortunately, I already have a script I use to rebuild and deploy the blog to my server, so it's easy enough to add something like...
```sh
rm tag/*.md
for tag in $(grep '^tags:' _posts/* | cut -f2- -d'[' | cut -f1 -d']' | tr -d ' ' | tr ',' '\n' | sort -u)
do
cat > "tag/${tag}.md" <<EOF
---
layout: tagpage
title: "Tag: ${tag}"
tag: ${tag}
---
EOF
done
```
> > ...tags will also get rebuilt.
Now, every time I rebuild the blog, the tags will also get rebuilt. If you're curious and aren't familiar enough with the Linux command line to work it out on sight, the above code removes the existing tag files and (a) checks all posts for tags, (b--e) sets them up one per line, and then (f) makes sure that each only appears once. Then, for each unique tag, I create a tag file named after the tag with a layout, title, and tag name.
Third is another mild frustration: Since the tag files are not posts, Jekyll's default wants to include them in the blog header's links. I filter them out the same way I filter the pagination files, above.
Because tags are represented in Jekyll by non-post pages, it's also easy to iterate through the pages and link to each tag page in hopes of helping readers find posts of interest. That code...it turns out that Liquid templates are processed *before* converting from Markdown, so I can't show it in full. So, the following replaces the open braces (`{`) with open parentheses (`(`) to not just dump the tags into this page.
```Liquid
(%- assign default_paths = site.pages | map: "path" -%}
(%- assign page_paths = site.header_pages | default: default_paths -%}
(%- for path in page_paths -%}
(%- assign my_page = site.pages | where: "path", path | first -%}
(%- if my_page.title -%}
(%- if my_page.title -%}
(%- assign title = my_page.title | split: " " -%}
(%- endif -%}
(%- if title[0] == 'Tag:' -%}
<div>
<a href="/blog/tag/(( title[1] }}">
<i class="fa fa-tag"></i>
(( title[1] }}
</a>
</div>
(%- endif -%}
(%- endif -%}
(%- endfor -%}
```
And that's tagging taken care of.
## Search
The tags will probably go a long way towards making posts discoverable, but as the number of pages increases, I'm going to want the ability to search for a page. I mean, *I* don't need a search box, because I can just search the source files to find what I want. But someone might need to search it who doesn't want to go to that kind of trouble.
> > ...prevent tab characters from fouling up the JSON...
Fortunately, Sharath at Webjeda found [a reasonable solution](https://blog.webjeda.com/instant-jekyll-search/). I needed to play with URL paths again and tweak the Liquid template to prevent tab characters from fouling up the JSON, for some reason, but I now have a working [search page](/blog/search/) that works as advertised!
Putting the search bar on the header might make more sense, at some point, but loading up all the text of the blog onto every page honestly seems like a performance nightmare, so I probably won't bother until I see complaints about the separate search page.
In the future, I may want to update the search code to [strip out diacritical marks]({% post_url 2019-12-17-metal-umlauts %}), so readers don't need to worry about it. But for now, there are few enough non-Latin characters for me to worry about it just yet. Unfortunately, it doesn't look like it's possible to do that using [Liquid's templates](https://shopify.github.io/liquid/) that generate the JSON, so it'll need to happen in the JavaScript code.
## The Winners, Take Two
I still have a couple of tasks ahead of me for this to seem to be at one-hundred percent:
* Update search to ignore diacritical marks.
* I would like Hashover to use Libravatar instead of Gravatar; while I trust [Automattic](https://automattic.com/) more than I trust Disqus, it's still relying on a company that might start selling data.
* The jury is still out on anonymous comments.
However, for now, the tools that work, in addition to [Jekyll](https://jekyllrb.com/) and [Hashover](https://github.com/jacobwb/hashover-next), are:
* Paging with [Jekyll-Paginate-v2](https://github.com/sverrirs/jekyll-paginate-v2)
* Long Qian's [custom tag pages](http://longqian.me/2017/02/09/github-jekyll-tag/), with a script to generate them
* Christian Fei's [Simple Jekyll Search](https://github.com/christian-fei/Simple-Jekyll-Search) on Sharath's advice.
And I've taken a quick look at [Libravatar's API](https://wiki.libravatar.org/api/) and it seems entirely plausible if Hashover's architecture will allow another service.
So, with that, I think the blog is pretty much ready for the new year. What a nice Christmas present for myself! 🎁
* * *
**Credits**: Untitled header photograph [from PxHere](https://pxhere.com/en/photo/1363790), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).

130
2019-12-28-licenses.md Normal file
View File

@ -0,0 +1,130 @@
---
layout: post
title: Licenses and Copyleft
date: 2019-12-28 07:10:26-0500
categories: license
tags: [license, meta, opensource, freesoftware, gpl, creativecommons]
summary: "How I have come to look at licenses"
thumbnail: /blog/assets/hand-black-and-white-game-photo-love-heart-617724-pxhere.com.jpg
---
![Hands-in](/blog/assets/hand-black-and-white-game-photo-love-heart-617724-pxhere.com.jpg "Hands in")
Something I mentioned in my [introductory post]({% post_url 2019-12-08-greetings %}) was that I look back on a lot of my ideas ten and twenty years ago and cringe. A *lesser* example of that is a complete turnaround in how I think about software (and other content) licensing. Out of college, my thinking was something like the following, which I probably said far more often than anybody cared to hear:
> Software should be proprietary if you plan to make money off of it and donated to the public domain if you don't.
That was...well, **wrong**.
> > ...I probably didn't value my time...
I completely bought into the nonsense of the GPL (and other [copyleft](https://en.wikipedia.org/wiki/Copyleft) licenses) being "viruses" that "infect" software. I also bought into nonsense that the only reasons to publish software were either to make money or to allow someone else make money. And I probably didn't value my time, thinking of it as free; either that, or I didn't put value on the time of people who created software I used.
And honestly? I was probably stupid enough to think that including a copy of the GPL with my program was some huge burden...
> > ...vague jabs at the alleged dangers of the GPL...
Times have changed. For me, at least. I still hear certain pundits (one of whom runs a popular weekly podcast) make vague jabs at the alleged "dangers" of the GPL, despite the simple fact that the Linux kernel (under the GPL) is in far wider use than the BSD kernel (under the non-copyleft BSD license), *even* if you include the versions of the kernel that have become proprietary, such as Apple's macOS.
Today, I fall far more strongly on the copyleft side of the fence, where most of the [code I release](https://github.com/jcolag) is available under so-called *strong* copyleft licenses, often the [Affero GPL](https://www.gnu.org/licenses/agpl-3.0.en.html), which has clauses that require releasing the source code even if it's being used as part of an online service. I'm also more likely to *use* applications that have stronger licenses. The contents of this blog, even, are published under a copyleft license and you can get and modify the source files, plus see the history of any changes, from [its repository](https://github.com/jcolag/entropy-arbitrage).
What changed? Probably a few things.
## Licensing in a Nutshell
Copyright law revolves around the idea of a "fixed work," which is pretty much just a bit of art or science you make that you can then give to someone else. You can give a book to someone. You can give a story to someone. You can't give yourself giving a speech to anybody...but you *can* give them a recording of that event.
In modern copyright law, when you create a fixed work, you are automatically granted (by your government) the exclusive right over who is allowed to copy that work, hence "copyright." This lasts for some (more or less) finite amount of time, at which point copyright protection expires and the work becomes part of the public domain, as in common ownership by the public. Without getting too far in the weeds, the idea is that the duration of copyright protection on a work should be the size that encourages the creation of the most art.
> > ...contract between a copyright holder and another party that *allows* that party to use that work...
A *license* is an agreement or contract between a copyright holder and another party that *allows* ("gives license to") that party to use that work, beyond the pure consumption that copyright law naturally already allows. A *public license* is a license granted to anybody who wants permission without needing to negotiate a contract.
So, right here, we have a problem with anti-copyleft terms: The idea of a "permissive license" is nonsense, because all licenses are formal permission. The phrase exposes a kind of self-entitlement to exploit someone else's work without needing to contribute back.
Another problem is that, traditionally, contracts require [consideration](https://en.wikipedia.org/wiki/Consideration) to be valid. The "permissive" licenses don't have *any* consideration, only offering the software. You might argue that something like the BSD license is a [deed](https://en.wikipedia.org/wiki/Deed) rather than a contract, but it doesn't say so and isn't witnessed, so it would also be a poor deed. So, whereas the GPL has [been upheld in court](https://www.techdirt.com/articles/20170515/06040337368/us-court-upholds-enforceability-gnu-gpl-as-both-license-contract.shtml) in several countries, I'm not convinced that BSD, MIT, and Apache have the same strength, meaning that the developers and the users may not be protected.
> > ...you can weigh that "cost" against the value of the software to make your decision.
This is all beside the point, though, because we might argue that these public licenses don't need to be either thing, because they could be gifts or anything else. And that's fine, but if someone distributes software they wrote, they should have the right to decide how you pay them. If their idea of payment is using the same license and publishing your changes, you can weigh that "cost" against the value of the software to make your decision. You're always allowed to write your own, after all.
And that brings me to my next point.
## I Don't Work for You
A key reason that many developers release their code under non-copyleft licenses is a hope for widespread adoption by large companies. I support those people and will congratulate them if and when a Google or Apple [forks](https://en.wikipedia.org/wiki/Fork_(software_development)) their code and builds a proprietary product on top of that. But it isn't something I want for my projects.
> > ...interaction is going to be on my terms, not theirs.
If I ever was before, I'm no longer interested in working for a large company without compensation...and probably not *with* compensation, truth be told. In some cases, I will gladly *do work* without being paid (this blog comes to mind), but especially when the beneficiary could be a company [I don't really respect]({% post_url 2019-12-20-social-media%}), that hypothetical interaction is going to be on my terms, not theirs.
With strong copyleft licenses, I am compensated both by the beneficiaries publishing their code and by excluding companies that see free software developers as just a resource to exploit. I am also compensated by the understanding that, if I produce something useful enough for other people to maintain it, it will always be available in its latest state to whoever needs it.
This is, of course, very similar to the different [incidents](https://www.free-soft.org/gpl_history/) leading Richard Stallman to create what's now the GPL.
## Tragedy of the Commons
When [Garrett Hardin](https://en.wikipedia.org/wiki/Garrett_Hardin) wanted to talk about the potential problems of overpopulation in 1968, coining the phrase *Tragedy of the Commons*, he made two points relatively clear.
* Environmentalism, despite its merits, often revolves around [racist, colonialist, and white supremacist ideas](https://www.newyorker.com/news/news-desk/environmentalisms-racist-history?verso=true) and policies, and it's always *other* groups whose populations need to be limited. That's unrelated, here, but important to consider.
* Unbounded freedom for anybody is unsustainable.
Or, as philosopher [Georg Wilhelm Friedrich Hegel](https://en.wikipedia.org/wiki/Georg_Wilhelm_Friedrich_Hegel) and **Communist Manifesto** co-author [Frederick Engels](https://en.wikipedia.org/wiki/Friedrich_Engels) put it,
> Hegel was the first to state correctly the relation between freedom and necessity. To him, **freedom is the appreciation of necessity**. "Necessity is blind only in so far as it is not understood." Freedom does not consist in the dream of independence from natural laws, but in the knowledge of these laws, and in the possibility this gives of systematically making them work towards definite ends.
###### Anti-Dühring, Frederick Engels (emphasis mine)
And this idea that irresponsible stewards are not free is the crux of a lot of political arguments. Taxation, democracy, environmentalism, making art, producing investigative journalism, having a bank of software that anybody can use or modify, and the mere existence of billionaires all have the same common question of whether the freedom to exploit some resource carries an obligation to do so in a way that is equitable and sustainable.
To put this in a slightly different context, I like to flip questions about the morality of taxation on their heads and compare them to online shops and payment processors taking a cut of all revenue or paying a cover charge to get into an event. If taxes are bad, then surely there is no reason to accept money via credit cards (or Patreon, for that matter) and no reason to sell goods in a formal marketplace, and everybody should just hawk their wares in person, accepting only cash.
> > ...those charges maintain access to a stable marketplace or a safe venue.
But nobody in their right mind would accept that and everybody realizes that those charges maintain access to a stable marketplace or a safe venue. If you don't pay up, credit cards stop working as the processors go out of business and marketplaces become havens for scammers when there is no enforcement of policy. Similarly, if you're a billionaire and don't pay "fair" taxes, don't come crying when you lose everything in an economic collapse. And bringing the discussion back to how I license what I produce, if you don't support the maintenance of the commons---putting in some work, in this case, instead of money---then expect to live in a world where there is nobody to help you with problems unless you hire them.
And returning to the idea of consideration in contract law, if you don't work to maintain the commons, is there a possible future where [FreeBSD](https://en.wikipedia.org/wiki/FreeBSD) developers decide that the [BSD License](https://en.wikipedia.org/wiki/BSD_licenses#2-clause) does not represent a permanent grant of any rights, since it doesn't refer to any such thing, and sue Apple for copyright infringement? I don't think it would happen, but it seems possible, especially in a world where Apple ceases all support because they got what they wanted.
By contrast, the GPL requires that maintenance work (though there's room to do it better) and has been proven out by lawsuits, making it a safer bet overall.
To put it another way, a way that's often misused to excuse abuses and invasions of privacy, *freedom isn't free*.
## (Almost) Everything Is Compatible
The last big reason that has convinced me to change my mind is that, at least in the software world, almost all open source code can be used in a project licensed under the AGPL. There are exceptions, of course, especially among the competing copyleft licenses such as the [EPL](https://en.wikipedia.org/wiki/Eclipse_Public_License). But for the most part, if software has an [OSI-approved license](https://opensource.org/licenses), the AGPL's terms are a superset of its requirements.
> > ...the flip-side of the "viral" claims...
This is the flip-side of the "viral" claims: In a situation where you have to bother with copyleft and non-copyleft licenses, the copyleft licenses "win." In the same way Apple can pull a version of FreeBSD behind closed doors, the Linux community can use anything from FreeBSD, but not the other way around.
Unfortunately, the same can't be said of the non-software public licenses. While I appreciate the work that Creative Commons does, insisting on continuing their non-commercial licenses means that there is a huge split even among people who support the license framework. Because you can't "share-alike" both commercial and non-commercial terms, you can't combine even very similar works.
And that's very strange, because the share-alike clause *already* has the effect of eliminating most of the abusive kinds of commercial exploitation. Karl Fogel [made the point](https://questioncopyright.org/cc-pro) well in jokingly proposing a license that does what the non-commercial advocates seem to look for.
Oh, well.
Likewise, the commercial-friendly Creative Commons licenses permit use of the work within GPL-licensed works, but this is not reciprocal. The intent is for games to be able to use art, but the idea of showing code inside a book doesn't seem unreasonable.
### The Flipside of Virality
One legitimate problem with copyleft licenses, possibly all public licenses, is that the creator still owns the underlying copyright and so is not bound by the terms of the public license. That means that, for example, I can stop providing updates to [SlackBackup]({% post_url 2019-12-22-slack-backup %}) and start releasing proprietary versions.
However, I *can't* put the genie back in the bottle. That is, unlike my hypothesis about non-copyleft licenses being revokable, there is no way to retract the copyleft licensing of code already released, because those licenses state that clearly.
> All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met.
###### GNU General Public License, version 3
Additionally, the problem is largely resolvable by dispersing the underlying copyright. That is, I can stop extending the licensing terms of *SlackBackup* only because I am currently the only contributor. If people contributed changes back to it, I would need to remove those changes or get their permission to alter the license arrangements for future releases, and each additional contributor makes that change more difficult.
This is why I would encourage everybody to avoid involvement in projects with [Contributor License Agreements](https://en.wikipedia.org/wiki/Contributor_License_Agreement), since the agreements exist partly to eliminate the need for permission in relicensing.
## The Upshot
> > ...I apologize...
I suppose my point is that I apologize broadly for my tiny, tiny part in propagating hatred of the GPL, and (if they read this and remember) apologize specifically to the various people I argued with on which licenses are better. And in an environment when companies encourage sharing that doesn't require any responsibility from them, it only seems right for me to stick with copyleft licensing.
* * *
**Credits**: Header image is [Hands](https://pxhere.com/en/photo/617724) by an unknown photographer from [PxHere](https://pxhere.com), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).

221
2019-12-29-review-2019.md Normal file
View File

@ -0,0 +1,221 @@
---
layout: post
title: Looking Back on 2019
date: 2019-12-29 08:21:09-0500
categories:
tags: [retrospective, newyear]
summary: Interesting discoveries from 2019
thumbnail: /blog/assets/nature-wildlife-zoo-fur-biology-mammal-171768-pxhere.com.jpg
---
![Kekeno looking back](/blog/assets/nature-wildlife-zoo-fur-biology-mammal-171768-pxhere.com.jpg "Kekeno looking back")
Let's be honest, 2019 feels like it has taken *forever* to wrap up, so looking back seems like a futile effort. And yet, since one main purpose of *Entropy Arbitrage* is to [hold myself accountable]({% post_url 2019-12-08-greetings %}), it seems worthwhile digging through some of the things I've learned in the last 363 days.
## Culture
This year, I noticed a few interesting things about how people consume and process popular culture.
### Nobody Gets Mister Rogers
A whole bunch of people grew up watching [**Mister Rogers' Neighborhood**](https://en.wikipedia.org/wiki/Mister_Rogers'_Neighborhood) but apparently learned nothing from the man. Obviously, I'm referring to the "civility discourse" floated (mostly) by right-wing pundits that boils down to their wanting to be treated like fragile little children while attempting to demean and harm segments of the population.
> > ...stepping up border patrols to prevent anybody from getting in who might want to change something.
We have articles suggesting that [we can't guess what Rogers would think of today's political climate](https://www.theatlantic.com/magazine/archive/2019/12/what-would-mister-rogers-do/600772/), even though his show's very first week on national airwaves (February 19, 1968) included *Neighborhood of Make-Believe* stories wherein the egocentric, tempermental, and very paranoid King Friday XIII terrifies the other neighbors by stepping up border patrols to prevent anybody from getting in who might want to change something. If you've never seen it in re-runs, it's the first five episodes available on Amazon Prime. Joanne Rogers [has also said](https://abcnews.go.com/Entertainment/mister-rogers-wife-husband-speak-political-leadership-today/story?id=55730892) that her late husband would probably speak out against Trump, though weirdly suggests that a man preaching inclusion and curiosity every day for decades tried not to be political. But apparently, there's *just no knowing* what Rogers might have thought of Trump, despite the evidence.
Also, if one wanted to learn how the Rogers brand of civility worked, it would be worth spending one's time starting with [the rules](https://www.theatlantic.com/family/archive/2018/06/mr-rogers-neighborhood-talking-to-kids/562352/) the show created to get points across. First of all, note that they had *nine* steps. Second, notice that there are steps to avoid absolute judgments and to make sure one is being inclusive. When people who lie, pass absolute judgments, and exclude anybody who's different are demanding that they be treated with care, tolerance, and inclusion, there is no reason to give it to them, and I think Rogers would have understood that, despite his soft voice.
### Disney Isn't on Your Side
Disney is very close to being a monopoly and is *very* comfortable in that role. With its [purchase of Fox](https://www.vox.com/culture/2019/3/20/18273477/disney-fox-merger-deal-details-marvel-x-men), Disney now has more than twice the marketshare of its nearest competitor (NBCUniversal/Comcast) and at the same time has been building its entertainment supply chain, owning popular intellectual property (Marvel, Star Wars, the Muppets, etc.), scripts, production, distribution, and now the "last mile" into homes (ABC, Disney+, and Hulu). That's what's called "horizontal integration" and "vertical integration."
How is that shaping up for consumers? Many of them feel compelled to watch all the content in the franchises they enjoy, even when they don't particularly care for what they're watching. They don't feel like they have a part in their favorite franchises, whether it's in terms of [race](https://www.mic.com/articles/142655/disney-movies-have-a-huge-diversity-problem-and-they-don-t-seem-to-want-to-fix-it), [gender](https://goodmenproject.com/featured-content/masculinity-and-disneys-gender-problem-jvinc/), [culture](https://dbknews.com/2019/04/05/disney-aladdin-princess-south-asian-representation-culture-racism-orientalism-people-of-color/), or [sexuality](https://oakparktalon.org/7094/opinion/disneys-lack-of-lgbtq-representation/). Fans feel like the movies are [repetitive](https://www.buzzfeed.com/hunterschwarz/proof-disney-makes-the-same-movie-over-and-over).
> > ...they'll rake in the same money from people who feel excluded...
Note that, in the links, *none* of these criticisms is at all new. What's new is that Disney knows that doing better on these issues might lead to bad press in conservative-leaning media and lower stock prices on one hand, while they'll rake in the same money from people who feel excluded, because the movies are still adequate and marketed well on the other hand. In other words, their comfortable quasi-monopoly position means less innovation in the industry, so don't expect them to suddenly create movies that reflect the world out your window.
People like to blame the Chinese market for this, but the reality is that China is only an excuse to keep doing business as usual, not the cause. The cause is that they don't care.
The only way to change this is if people stop spending money on them. Speaking of which...
### Ethical Consumption Comes to Media
For years, I've heard people talk about and act on desires to shop for food, goods, and services with an eye on the ethical ramifications of purchases. That is, people will try to be careful about buying meat from farms that treat the animals well or limit purchases of devices made with [conflict minerals](https://en.wikipedia.org/wiki/Conflict_resource). People have often chosen software based on the business practices of the companies behind them. I try to do that, myself, where I can see a choice.
> > ...cutting out streaming services...because of how their parent companies do business.
That's old news. However, in 2019, I have started to see this impulse start to form around media consumption, too. I know people cutting out (or not getting onboard with) streaming services like Disney+, Hulu, Amazon Prime, and Netflix, because of how their parent companies do business.
* Disney, as discussed above, verges on a monopoly and owns most of Hulu on top of Disney+.
* Amazon is [bad for Main Street](https://www.wsj.com/articles/the-bad-news-and-the-really-bad-news-for-retailers-fighting-amazon-com-1488738047), [undercutting its own sellers](https://www.forbes.com/sites/retailwire/2014/10/30/is-amazon-undercutting-third-party-sellers-using-their-own-data/#7af0631853d8), [aping sustainable brands](https://www.businessinsider.com/allbirds-slams-amazon-knockoff-shoes-sustainability-approach-2019-11?op=1) without the sustainable practices, [powering the crackdown on immigrants](https://www.technologyreview.com/s/612335/amazon-is-the-invisible-backbone-behind-ices-immigration-crackdown/), and may be [skewing search results](https://tamebay.com/2019/09/amazon-fire-allegedly-tweaking-search-gain-visibility.html) to keep more money for itself.
* Netflix, which made its modern brand on niche content free of interference for better ratings, now clinically [cancels shows that don't immediately change subscription numbers](https://screenrant.com/netflix-cancels-shows-three-seasons-why/), while [churning out](https://bgr.com/2017/04/18/netflix-movies-adam-sandler-sandy-wexler/) [uninspiring content](https://www.wired.com/2015/04/netflix-scrotal-recall/) and [underpaying talent](https://www.latimes.com/world-nation/story/2019-11-14/monique-sues-netflix-for-discrimination-in-show-offer).
That's in *addition* to the various initiatives to take K.T. Bradford up on [her challenge](https://web.archive.org/web/20180920123205/https://www.xojane.com/entertainment/reading-challenge-stop-reading-white-straight-cis-male-authors-for-one-year) to try to temporarily read books by authors who aren't straight, white men, since other authors are so often overlooked by both publishers and reviewers.
We're not near anything like a tipping point, of course, but this seems to be a new force in culture worth taking seriously. Because, as mentioned, Disney isn't on our side in any fight, it's worth sometimes giving Disney and its ilk a break and seeking out stories from creators that *are* on the right side of history.
## Technology
These are mostly handy things I've learned to do or learned about in the past year.
### Unicode Can Be Fun
I have already given a pretty thorough rundown of [Unicode's decomposed normal form]({% post_url 2019-12-17-metal-umlauts %}), so I won't get into it, here. But the idea that someone made it easy to strip out and add diacritical marks to text amazes me.
### Jekyll Is Solid
As [discussed previously]({% post_url 2019-12-15-blogging %}), I spent well over a year messing with potential blogging platforms, only to discover that [one of the oldest static site generators](https://jekyllrb.com/) was almost *exactly* what I wanted, even to the point that [adding features]({% post_url 2019-12-25-upgrades %}) only took a few hours of research and work.
I can easily see using Jekyll in the long term and probably using it with other projects. But like I said a few weeks ago, if something turns up that's better, all the posts are maintained in Markdown, and so are extremely easy to move to a new system.
### Federated Services Are Interesting
I have been eyeing [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub) for most of this year, trying to get a handle on its features. I don't quite know what I want to *do* with it, yet, but the protocol and broad approach seem widely applicable.
More on this as I find a project that could benefit from server federation.
### Libravatar Looks Like a Winner
I mentioned that I want the commenting system to eventually work with [Libravatar](https://www.libravatar.org/) in order to have a wholly Free Software stack. I took a very quick look at their API and, excluding the parts related to federation, it took maybe ten minutes to create a webpage that could request avatars based on an e-mail address. That's not bad at all.
### Profile Generation Is Tedious, but Useful
Technically, I started work on this *just* before 2019 started, but I have spent a lot of this year building [a script](https://github.com/jcolag/ProceduralStories/tree/master/people) to generate a reasonable-looking profile for a randomly-chosen, fictional person.
The process has become surprisingly detailed:
* Count the total population listed on Columbia University's [SEDAC](http://sedac.ciesin.columbia.edu/data/set/gpw-v4-population-density-rev10/data-download) maps.
* Pick a random number less than the total population.
* For each degree of longitude by degree of latitude, subtract its population from the random number until it's less than zero.
* Use the coordinates the random number pointed to as the person's home.
* Find the nearest country to the coordinates.
* Use [Von Luschan's chromatic scale](https://en.wikipedia.org/wiki/Von_Luschan's_chromatic_scale) to get a sense of the person's complexion.
* Look up the five [nearest cities](https://github.com/steffenmllr/find-nearest-cities) to our person's location as their likeliest homes.
* Look up the country in the [CIA World Factbook](https://www.cia.gov/library/publications/the-world-factbook/) to find demographic breakdowns, using them to guess the character's demographic attributes such as gender, age, ethnicity, religion, literacy, and so forth.
* Use the nationality and gender to get a possible name from [UI Names](https://uinames.com/) and, if necessary, [transliterate](https://github.com/kshetline/unidecode-plus) the name for my mostly-monolingual eyes to process.
* Use global reported percentages (probably wrong) to estimate other demographic features, such as gender/sexual minority representation, physical impairments, and psychological impairments.
> > ...personality beyond their function in a scene.
This tool became extremely handy when I [wrote my book]({% post_url 2019-12-14-seeking-refuge %}), because (as I discuss in the post) it gave the characters more life than me just picking the first name to come to mind (probably "Bob") and not giving any consideration to who the character might be and what they might look like. I only rarely state that information explicitly in the story, but it was nice to be able to "see" my characters and use that to give them some personality beyond their function in a scene.
### Ruby on Rails Is Still Fun
For about three years, I worked exclusively in [Ruby on Rails](https://rubyonrails.org/) to launch a few web applications and loved it. Then I went back to office jobs and mostly walked away from the Ruby ecosystem, because my area is very big on Microsoft technologies.
But at my last job, we had several conversations about the limitations of [ASP.NET](https://dotnet.microsoft.com/apps/aspnet). Always recognizing that a lot of features and thinking of ASP.NET's MVC system come from Rails, I've wanted to get back there to see how the state of the art has advanced since I last looked in, since everybody else seems to have been following it for the last fifteen years.
So, now that I'm no longer at that job, I have been tinkering with Rails again using [React](https://reactjs.org/) for the interface and *really* like what I see. Hopefully, I'll have new services to announce in the near future. Maybe one will even be Federated.
### CEFSharp Is Fussy, but Worthwhile
One of my bigger work projects, this year, involved a problem with .NET's `WebView` control. We started seeing [DCOM](https://en.wikipedia.org/wiki/Distributed_Component_Object_Model) errors when our desktop application ran overnight on some end user computers. Nobody seems to know what this is, but we knew that `WebView` is based on Internet Explorer's Trident HTML rendering engine. While Internet Explorer is still technically maintained, it's unclear how seriously Microsoft takes it how that interacts with any updates that .NET might get.
> > ...documentation isn't always 100% clear...
So, we looked into alternatives, finally landing on [CEFSharp](https://cefsharp.github.io/). It took some work and the documentation isn't always 100% clear, but I eventually figured out how to make JavaScript-to-C# calls, make C#-to-JavaScript calls, and (with a lot of help in a GitHub issue) even stop the strange crashes that resulted from all the tweaking I needed to make the other two things work.
I can't provide any of that code, because it was for my job on a contract for a client, unfortunately, and no longer have access to it, but I can tell you that CEFSharp worked *far* better than the default .NET control.
### Linux Still Has Its Problems
I've been using Linux at home for about ten years. I have been very happy with it, with only a couple of small glitches along the way, nothing destructive.
Unfortunately, this year, I've been unable to play DVDs no matter how many times I re-install the (completely legal) codecs and have been having all sorts of strange problems (slow downs, failure to recognize, etc.) with a new external hard drive I've been trying to move data to. My desktop session also sometimes glitches.
Granted, I've had problems like this with Windows, too, but it's still a nuisance when there's no indication as to where the problem might be. Without any real information to provide, it seems like a waste of time to file bugs.
### Technology...Isn't Technical
Those of us working in engineering and engineering-adjacent fields are immersed in a culture of "hard skills" (tools and techniques you work with to ship a product) and "soft skills" (dealing with people). But that's not really true.
> > ...software development especially...closely resembles anthropology...
Yes, the job does require being able to work with specific tools and understand their trade-offs. But as I look at things more, software development especially, and possibly all engineering, more closely resembles [anthropology](https://en.wikipedia.org/wiki/Anthropology) than other fields.
I'll probably dig back into this in the future as I study up, but consider how closely the five sub-fields of anthropology map to shipping an application:
* **Cultural Anthropology** studies how people make sense of the world, which is a *huge* part of any engineering effort, albeit often limited to the problem domain.
* **Social Anthropology** studies relationships, which can apply to product architecture, how the engineers interact, and how users will interact with the product and each other.
* **Biological Anthropology** examines factors that affected human evolution and lead to variation in the population, which sounds like an unlikely connection, except that it's a big part of [ergonomics](https://en.wikipedia.org/wiki/Human_factors_and_ergonomics) and [user experience](https://en.wikipedia.org/wiki/User_experience).
* **Archaeology** studies history through what people left behind, which is comparable to dealing with legacy code and exploring systems that need to be automated.
* **Linguistic Anthropology** tries to understand the processes of communication, which is central to any development work, if the product is to be at all usable.
Still hung up on the technology? Keep in mind that the idea of [design patterns](https://en.wikipedia.org/wiki/Software_design_pattern) comes from Christopher Alexander's [**A Pattern Language**](https://en.wikipedia.org/wiki/A_Pattern_Language), a book about designing spaces to be more useful and better able to handle traffic.
So, if our "hard skills" look this much like traditional "soft skills"---you can take almost any of these descriptions and add "but with code" to turn it into programming---are they *really* so hard?
## Personal
And I've learned a thing or two about myself, I think.
### Writing a Novel Is Possible
While I've worked on a lot of things and sipped some projects on a tight schedule, up until I finished [**Seeking Refuge**]({% post_url 2019-12-14-seeking-refuge %}), I never would have imagined that I could put together a mostly-complete novel---or, really, any creative writing that isn't purely mechanical and descriptive---let alone finish the draft in a month.
### Don't Get Attached to Technology
After decades of advising people to let technologies come and go and only use what actually works, I somehow cornered myself into trying to produce this blog with [Gatsby](https://www.gatsbyjs.org/), even when I kept running down blind alleys and needed to start over.
Had I been more skeptical of Gatsby in spite of the good (and, I *think*, well-deserved) press and looked for a simpler alternative sooner, this blog could have been up and running in Summer 2018!
### Job-Hunting Is Annoying
I already knew this, of course, but looking for a job is an exercise in frustration. Among other problems I'm probably forgetting:
* Companies seem to expect to have the only job candidates are interested in, while wanting to treat candidates interchangeably. One person asked me what it was about the job posting (which I applied to *weeks* prior) that drew me to apply, but was clearly only looking at my work history for the first time.
* Speaking of which, keeping track of these jobs takes a lot of effort. I'm pretty sure I've applied to some jobs at least twice and I don't even think they were that good. Add in scheduling the tests and phone screens as well as staying on top of the latest postings and it's more than a full-time job, itself.
* Similarly, job postings have always been unclear, with the list of "requirements" that may or may not be things I need to know well to be considered. Since we all know that this style is often a problem for candidates from non-traditional backgrounds, it's a drag to see that nobody is fixing the problem by talking about "skills you'll learn" and "skills we hope to need in five years."
* So many companies that clearly have money want to cry poverty. I spent the last four years at a small consulting company that needs to keep its rates low to prevent clients from defecting, so I took an artificially lower salary for the potential learning opportunities and because I liked the team. In this job search, several companies pitched me salary ranges that were less than that, without any opportunity or team.
* Getting sick derails *everything*. I got hit by the flu in the middle of this, derailing me for a few days from being able to talk on the phone or focus on code to handle screening tests. A lot of opportunities that seemed to be going well needed to abandon me, which is understandable, but a lot of wasted work all around.
* Too many companies are planning for an exit rather than sustainability. Of the companies that seemed to treat me like a person and didn't try to offer me a salary from a decade ago, when I asked questions about the business model, about half of them told me that their expectation was to bleed money for a few years and get acquired by a much larger supplier who could absorb the cost.
Which is all to say that I need to hold my nose and dive back into it, so that I don't miss the one job that's being offered by people who are worth working with.
### Just Get the Flu Shot
> > ...unacceptable...preventable...
As mentioned, I got slammed by the flu for a few days. I rarely get sick and I don't generally interact with many people, so I don't usually bother to get the vaccine. But I was out of action for close to a week and could *easily* have spread it wherever I went the day I caught it, and that's unacceptable. It's also mostly *preventable*, so I'll need to start doing that preventative work.
### I Don't Actually Like Quora
I was someone who thought Quora was one of the few companies getting things right and so spent a lot of time on the site interacting with people, writing over six thousand answers and an untold number of comments. This year has been big in that context, as I watched myself go from visiting daily to twice a week to weekly maybe every couple of weeks to just not bothering to go back.
> > ...yet another advertising-funded social media site with all that implies.
It used to be a site that cultivated a good community and treated people well. However, in the quest to earn money, it's become yet another advertising-funded social media site with [all that implies]({% post_url 2019-12-20-social-media %}). So, I'll probably still check in from time to time, on the chance that anybody has sent me messages that I'd like to respond to---there are obviously still nice people there---but I'm much happier without the rest of it.
I may dig deeper into these changes, someday soon.
And, since [Free Your Stuff](https://freeyourstuff.cc/) still worked (Quora keeps changing its site to stymie these efforts) when I was still writing there, you can bet that edited versions of a lot of that content will end up here, eventually.
### My Standards for People I Like Are Too Low
In the past year, I heard myself claim that a specific company was doing a lot of work to improve its approach diversity and inclusion, because an executive told me they were, despite all the evidence to the contrary, like using the same hiring techniques to hire the same kinds of people from the same place. I should have spotted that.
I also had a failure of judgment, I think, when a community I was a part of (which I won't bother to name) was taken aback by accusations of abuse against the community's central members. I spent a couple of weeks ignoring the claims outright, because they seemed intrusive and the base assertion sounded like clickbait. When I finally realized I should know what was going on, I excused my continued association with the community as "but this was a long time ago, and they seem like they've done a lot of work to improve."
> > everything here is true, except the parts that make me look bad
Then the responses came. First, almost everybody involved chimed in to say some version of "everything here is true, except the parts that make me look bad," which wasn't great, but I convinced myself that I wasn't there and didn't know any of the story. Then, the claim was that everybody involved needed to "work from the outside-in," ignoring the worries in the community because they thought it was more important to talk to their friends about it, first. The claims that they didn't understand what abuse looked like came after that, along with evidence that they weren't bothering to read the actual accusations because it made them too uncomfortable.
(Hint: Facing the bad things you're responsible for *should* be uncomfortable. That's called learning.)
As the misogynist defenders started spouting off the "maybe the accusations are all lies," "at least it wasn't as bad as what this other person did," and "why isn't everyone already satisfied?" rhetoric, the central person gave an interview where the prior admissions and public apologies (never a private apology to the wronged person, which seems like a no-brainer) were replaced by flat rejections and public relations-friendly claims that memories differ, alongside a marketing stunt that "profits" from an upcoming product would be donated to [RAINN](https://rainn.org/).
> > ...dishonest and completely opaque.
Now, I donate to RAINN, myself, so I don't fault the choice of charity. But I *do* fault the weasel-word "profit" on a digital product (is it revenue minus cost? minus expenses? minus the amount they want to save for a rainy day?), putting the onus of the donation on customers instead of taking it out of pocket, and making that decision on the heels of the sudden denials. It's dishonest and completely opaque.
I should have realized *much* sooner that I was excusing a lack of growth and willing perpetuation of issues, just because I liked their personalities and work. It's only the difference of a few weeks, but I gained nothing from those weeks but grief.
## Conclusions
Like any year, there were some losses and some wins. But there's one important thread through a lot of these bits, I think: Growth takes affirmative effort and isn't something that just happens, whereas it's very easy to neglect yourself into bad habits. That's a good lesson for all of us, I think.
* * *
**Credits**: The header image is [Kekeno](https://pxhere.com/en/photo/171768) by an unknown photographer from [PxHere](https://pxhere.com), made available under the [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/).