<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://chrisfinazzo.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://chrisfinazzo.com/" rel="alternate" type="text/html" /><updated>2026-04-08T15:10:38+00:00</updated><id>https://chrisfinazzo.com/feed.xml</id><title type="html">Chris Finazzo</title><subtitle>Writer &amp; Technologist</subtitle><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><entry><title type="html">App Defaults</title><link href="https://chrisfinazzo.com/2023/12/31/app-defaults.html" rel="alternate" type="text/html" title="App Defaults" /><published>2023-12-31T00:00:00+00:00</published><updated>2023-12-31T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2023/12/31/app-defaults</id><content type="html" xml:base="https://chrisfinazzo.com/2023/12/31/app-defaults.html"><![CDATA[<p>As the idea has been <a href="https://defaults.rknight.me">making</a> <a href="https://mattcool.tech/posts/default-apps-2023">its</a> <a href="https://listen.hemisphericviews.com/097">way</a> around the Internet for a couple weeks, it’s time for me to add my own set of apps to the blogroll<sup><a href="#33be:fn:1" class="footnote" id="33be:fn-back:1">1</a></sup>. There are many lists like it, but this one is mine.</p>

<p>📨 Mail Client: Mail</p>

<p>📮 Mail Server: Fastmail &amp; Google</p>

<p>📝 Notes: Notes</p>

<p>✅ To-Do: Reminders</p>

<p>📷 Photo Shooting: iPhone 14 Pro</p>

<p>🎨 Photo Editing: Rarely: Preview or Photos.</p>

<p>📆 Calendar: iCal</p>

<p>📁 Cloud File Storage: iCloud Drive</p>

<p>📖 RSS: NetNewsWire</p>

<p>🙍🏻‍♂️ Contacts: Contacts</p>

<p>🌐 Browser: Desktop: Safari, Chrome, and Firefox iOS: Safari (obviously).</p>

<p>💬 Chat: Messages (and occasionally IRC)</p>

<p>🔖 Bookmarks: iCloud</p>

<p>📑 Read It Later: Reading List</p>

<p>📜 Word Processing: Rarely: Pages</p>

<p>📈 Spreadsheets: Numbers, and Google Sheets</p>

<p>📊 Presentations: Powerpoint, Keynote (and if I <em>really</em> need to, RevealJS)</p>

<p>🛒 Shopping Lists: Reminders</p>

<p>🍴 Meal Planning: N/A (😬)</p>

<p>💰 Budgeting and Personal Finance: Spreadsheets</p>

<p>📰 News: Apple News, RSS</p>

<p>🎵 Music: Music.app</p>

<p>🎤 Podcasts: Overcast</p>

<p>🔐 Password Management: iCloud Keychain</p>

<p>🧑‍💻 Code Editor: BBEdit Rarely: Xcode</p>

<p>✈️ VPN: In a past life, I used - and later worked as a contractor to suport - RSA tokens.
Currently playing with: Tailscale</p>

<hr />

<ol class="footnotelist">
<li id="33be:fn:1" class="footnotebody" value="1">
      <p>Yes, I said blogroll, kids. After all, 37 is close to ancient in Internet Time.</p>
   <a href="#33be:fn-back:1" class="backlink">⏎</a></li>
<li id="33be:fn:2" class="footnotebody" value="2">
      <p>I'm in the process of ridding my life of word processing apps. With a bit of HTML &amp; CSS, almost any document is within reach.</p>
   <a href="#33be:fn-back:2" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[As the idea has been making its way around the Internet for a couple weeks, it’s time for me to add my own set of apps to the blogroll1. There are many lists like it, but this one is mine.]]></summary></entry><entry><title type="html">Social Distancing Part 8 - Reading List</title><link href="https://chrisfinazzo.com/2020/06/03/social-distancing-pt8-reading-list.html" rel="alternate" type="text/html" title="Social Distancing Part 8 - Reading List" /><published>2020-06-03T00:00:00+00:00</published><updated>2020-06-03T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/06/03/social-distancing-pt8-reading-list</id><content type="html" xml:base="https://chrisfinazzo.com/2020/06/03/social-distancing-pt8-reading-list.html"><![CDATA[<p>At the end of 2018, I wrote what I hoped would be the first in a series of once-a-year posts under the title “Books I Read in 2018.” At first, continuing the trend in 2019 didn’t seem like a Herculean effort, so I kept adding to my Goodreads list that which I’d already read and those I had yet to read.</p>

<p>It’s now June 2020…I think you know where this is going.</p>

<p>For a bunch of reasons, I drafted the 2019 post, but work, COVID-19, and a bunch of other things conspired to get in the way. Bottom line: I needed a better mechanism that didn’t rely on an annual summary. Never mind the fact that manual upkeep is tedious, which gets lost in the shuffle of doing other things, even in normal times. The pandemic has also significantly slowed down my reading pace, owing to the lack of walking back and forth to work. It’s since been replaced by walks along a trail to and from a park near our house, but during this time my listening habits have also shifted from mostly audiobooks back to my own music library.</p>

<p>Although I don’t remember, exactly how<sup><a href="#1cc1:fn:1" class="footnote" id="1cc1:fn-back:1">1</a></sup>, I eventually found my way to Chuck Grimmett’s site, where he <a href="http://www.cagrimmett.com/development/2019/09/07/reading-list.html">wrote</a> about moving his existing book notes to a list format - based on ideas cribbed from Frank Chimero and <a href="http://jsomers.net/#books">James Somers</a>. With this in mind, I took these concepts and built my own, based on the same structure as my linkblog, using key/value pairs in a data file.</p>

<p>It’s much less effort to maintain, and the count increments automatically. My implementation doesn’t have ratings or notes like Chuck does on his site, but I might think about adding quotes for select books later on. As with the 2018 post that got me started down this path, it’s pulled from my Audible &amp; Goodreads lists, although I don’t have anything to indicate what book I’m currently reading or what’s next in the queue.</p>

<p>If you’re interested, the updated list can be found <a href="/reading/">here</a> and the <a href="https://github.com/chrisfinazzo/blog/blob/master/_data/reading.yml">code</a> is on GitHub.</p>

<hr />

<ol class="footnotelist">
<li id="1cc1:fn:1" class="footnotebody" value="1">
      <p>Most likely via Twitter and RSS. Have you heard about RSS? Turns out&trade;, it&#8217;s not dead.</p>
   <a href="#1cc1:fn-back:1" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[At the end of 2018, I wrote what I hoped would be the first in a series of once-a-year posts under the title “Books I Read in 2018.” At first, continuing the trend in 2019 didn’t seem like a Herculean effort, so I kept adding to my Goodreads list that which I’d already read and those I had yet to read.]]></summary></entry><entry><title type="html">Social Distancing Part 7 - Escape Hatch</title><link href="https://chrisfinazzo.com/2020/05/18/social-distancing-pt7-escape-hatch.html" rel="alternate" type="text/html" title="Social Distancing Part 7 - Escape Hatch" /><published>2020-05-18T00:00:00+00:00</published><updated>2020-05-18T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/05/18/social-distancing-pt7-escape-hatch</id><content type="html" xml:base="https://chrisfinazzo.com/2020/05/18/social-distancing-pt7-escape-hatch.html"><![CDATA[<p>It all started because of a failed Python <a href="https://github.com/Homebrew/homebrew-core/issues/38213">upgrade</a>. I began to wonder if I would be forced into an OS upgrade just to get Homebrew to behave - on a six year old machine - that isn’t anyone’s idea of a good time.<sup><a href="#5f30:fn:1" class="footnote" id="5f30:fn-back:1">1</a></sup></p>

<p>Now, I’ll admit, I have an slightly irrational dislike for all things Python, even as it has grown in popularity thorough being the tool of choice in fields like <a href="https://en.wikipedia.org/wiki/Data_science">Data science</a>. The primary reason for it has almost everything to do with the environment. Compared with the Ruby equivalent - rbenv - the Python equivalents are still too fiddly for my taste. Although progress has been made over several years by Ken Reitz and others working on the language proper, in my experience it still<sup><a href="#5f30:fn:2" class="footnote" id="5f30:fn-back:2">2</a></sup> requires some manual setup to get working right.</p>

<p>As the best way to figure all of this out is to try it, I took another look at making a <a href="https://dotfiles.github.io">dotfiles</a> repo to contain some of this chaos. Like many people in a similar situation, I started on Bash and <a href="https://chrisfinazzo.com/2020/04/07/social-distancing-pt1-hello-zsh/">moved</a> to Zsh right before getting Mojave up and running, which will make the transition to Catalina - and whatever comes after it - easier. It’s made from scratch without the need for frameworks like <a href="https://ohmyz.sh">ohmyzsh</a> or <a href="https://github.com/sorin-ionescu/prezto">prezto</a> and fairly straightforward.<sup><a href="#5f30:fn:3" class="footnote" id="5f30:fn-back:3">3</a></sup></p>

<p>To my surprise, I found by <a href="https://twitter.com/chrisfinazzo/status/1100065027887951873">testing</a> it, the dependencies in my Brewfile were upgraded to the point that the then-current Python was installed as well.</p>

<div style="width:100%;height:0;padding-bottom:75%;position:relative;"><iframe src="https://giphy.com/embed/y6Lgj4yTpMmZO" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>
<p><a href="https://giphy.com/gifs/tiger-woods-y6Lgj4yTpMmZO"></a></p>

<p>It should come in handy when I get my next <a href="https://www.apple.com/macbook-pro-13/">machine</a>. I originally planned on doing this as soon as the new 13” MacBook Pro was released, but COVID-19 scuttled those plans, so I’m waiting until the shipping times are back to something approaching normal - whenever that is - before making a purchase.</p>

<hr />

<ol class="footnotelist">
<li id="5f30:fn:1" class="footnotebody" value="1">
      <p>I did eventually upgrade to Mojave, but when the time came to do so, it was motivated by larger concerns - e.g, the potential loss of security updates if I stayed on High Sierra.</p>
   <a href="#5f30:fn-back:1" class="backlink">⏎</a></li>
<li id="5f30:fn:2" class="footnotebody" value="2">
      <p>The appearance of pipenv in official documentation is a really good sign&#8230;until you scroll down and see that virtualenv is still hanging on, a vestige of a different age.</p>
   <a href="#5f30:fn-back:2" class="backlink">⏎</a></li>
<li id="5f30:fn:3" class="footnotebody" value="3">
      <p>A Brewfile, global `.gitconfig`/`.gitignore` files, a `.hushlogin`, and - last but not least - my `.zshrc`, which contains aliases and a couple of functions alongside my configuration.</p>
   <a href="#5f30:fn-back:3" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[It all started because of a failed Python upgrade. I began to wonder if I would be forced into an OS upgrade just to get Homebrew to behave - on a six year old machine - that isn’t anyone’s idea of a good time.1]]></summary></entry><entry><title type="html">Social Distancing Part 6 - (Not Quite) Language-Agnostic Interfaces for Words and Code</title><link href="https://chrisfinazzo.com/2020/05/14/social-distancing-pt6-not-quite-language-agnostic.html" rel="alternate" type="text/html" title="Social Distancing Part 6 - (Not Quite) Language-Agnostic Interfaces for Words and Code" /><published>2020-05-14T00:00:00+00:00</published><updated>2020-05-14T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/05/14/social-distancing-pt6-not-quite-language-agnostic</id><content type="html" xml:base="https://chrisfinazzo.com/2020/05/14/social-distancing-pt6-not-quite-language-agnostic.html"><![CDATA[<p>Inspired by Parker’s <a href="https://byparker.com/blog/2015/language-agnostic-interfaces-for-software-development/">post</a> on the same subject, I decided to write my own now that it’s been up and running for a few days. I say ‘not quite’ in the title because - as will become apparent - I only use a few languges to do most of the work.<sup><a href="#4cd3:fn:1" class="footnote" id="4cd3:fn-back:1">1</a></sup> At the end of the process, I had entirely reorganized my Jekyll Scripts repository - now called <a href="https://github.com/chrisfinazzo/rake-jekyll">Rake Jekyll</a> - from a series of shell scripts into a single Rakefile. I also migrated my Reverse Job Posting to use Rake. As I worked, it got me thinking about how I approached the same task in other projects.<sup><a href="#4cd3:fn:2" class="footnote" id="4cd3:fn-back:2">2</a></sup></p>

<h2 id="make-for-the-printed-word">Make for the printed word</h2>

<p>Makefiles are used to generate output from a number of TeX sources (Redirection FTW). These are simpler and only run the input through a converter - usually <a href="https://en.wikipedia.org/wiki/PdfTeX">pdfTeX</a> or <a href="https://en.wikipedia.org/wiki/XeTeX">XeTeX</a> - which creates the final PDF. I occasionally run the source text through an app like Pages, which has real grammar and spellcheck functions, just in case <a href="https://en.wikipedia.org/wiki/GNU_Aspell">aspell</a>, Gabe’s language <a href="http://www.macdrifter.com/2012/01/custom-grammar-checker-in-bbedit.html">module</a> or Matt Might’s <a href="http://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/">scripts</a> miss something.</p>

<p>My personal dictionary is pretty well customized and its mode support for TeX is smart enough to figure out what to match on, a handy <a href="https://dbader.org/blog/spell-checking-latex-documents-with-aspell">feature</a> I learned about from Dan Bader. I know there are nearly <a href="https://tex.stackexchange.com/questions/42843/is-there-a-spell-check-package-for-latex?noredirect=1&amp;lq=1">endless</a> other ways of accomplishing this task, but it’s the approach I’ve found that works the best for me.</p>

<h2 id="rake-on-the-web">Rake on the web</h2>

<p>Rakefiles are just containers for shell sequences - usually with a few modifications and are easy to stick together. For the blog, I can now run <code class="language-plaintext highlighter-rouge">rake draft</code> to create a draft post on the fly.<sup><a href="#4cd3:fn:3" class="footnote" id="4cd3:fn-back:3">3</a></sup></p>

<p>In RJP, the default task starts a web server so I can view the output. I tried to do the same thing for the blog, but invoking <code class="language-plaintext highlighter-rouge">bundle exec</code> in this way returned an error. So, for now this task triggers an incremental build which lands in the <code class="language-plaintext highlighter-rouge">_site</code> directory.</p>

<h2 id="reductio-ad-xkcdum">Reductio ad Xkcdum</h2>

<p>As with any kind of automation, the inevitable question is - usually - ‘Did it save time?’</p>

<p>Well…maybe. After all, I wrote this post about it while using the tools to get it done. In the end, that’s what the site is for.</p>

<p><img src="https://imgs.xkcd.com/comics/automation.png" alt="automation" /></p>

<hr />

<ol class="footnotelist">
<li id="4cd3:fn:1" class="footnotebody" value="1">
      <p>For a while, the working title for this post was &#8216;Glue Code&#8217;, a not-so-subtle reference to the small pieces that do most of the heavy lifting for me.</p>
   <a href="#4cd3:fn-back:1" class="backlink">⏎</a></li>
<li id="4cd3:fn:2" class="footnotebody" value="2">
      <p>Based on the idea of &#8216;Make, now with less typing&#8217; in other projects.</p>
   <a href="#4cd3:fn-back:2" class="backlink">⏎</a></li>
<li id="4cd3:fn:3" class="footnotebody" value="3">
      <p>If I was more versed in Regular Expression syntax, I could try to pass the title argument into the filename, but I havn&#8217;t gotten that far yet.</p>
   <a href="#4cd3:fn-back:3" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[Inspired by Parker’s post on the same subject, I decided to write my own now that it’s been up and running for a few days. I say ‘not quite’ in the title because - as will become apparent - I only use a few languges to do most of the work.1 At the end of the process, I had entirely reorganized my Jekyll Scripts repository - now called Rake Jekyll - from a series of shell scripts into a single Rakefile. I also migrated my Reverse Job Posting to use Rake. As I worked, it got me thinking about how I approached the same task in other projects.2]]></summary></entry><entry><title type="html">Social Distancing Part 5 - IndieWeb, Inside Out</title><link href="https://chrisfinazzo.com/2020/05/06/social-distancing-pt5-indieweb-inside-out.html" rel="alternate" type="text/html" title="Social Distancing Part 5 - IndieWeb, Inside Out" /><published>2020-05-06T00:00:00+00:00</published><updated>2020-05-06T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/05/06/social-distancing-pt5-indieweb-inside-out</id><content type="html" xml:base="https://chrisfinazzo.com/2020/05/06/social-distancing-pt5-indieweb-inside-out.html"><![CDATA[<p>So, while writing a function to send a tweet when a new item gets added to feed isn’t <em>hard</em>, it does typically involve a bunch of Javascript. Far more than I’m comfortable dealing with at this point.</p>

<p>In the past, I might have used something like Erik Berlin’s <a href="https://github.com/sferik/twitter">twitter</a> gem and built a tiny client to do this myself. I’m more comfortable with Ruby - at least to the point I can read the code and figure out how a project is put together - something I really can’t say about Node or Javascript. Still, that’s probably more of distraction compared to what I really want to do which is write.</p>

<p>Kind of stuck at this point, I started thinking, ‘there’s got to be an easier way’. It turns out<sup><a href="#72f5:fn:1" class="footnote" id="72f5:fn-back:1">1</a></sup> I already knew what needed to be done. However, as Jekyll is kind of the <a href="https://www.urbandictionary.com/define.php?term=OG">OG</a> of static site generators, getting this kind of IndieWeb functionally (specifically, <a href="https://indieweb.org/POSSE">POSSE</a>) into the site required a bit of additional finesse.</p>

<h2 id="why-dont-we-do-it-on-the-server"><a href="https://en.wikipedia.org/wiki/Why_Don%27t_We_Do_It_in_the_Road%3F">Why Don’t We Do It (on the Server)?</a></h2>

<p>At first, I tried IFTTT. This was by far the easiest to set up. Just provide the URL of a feed to an applet and it will tweet new items on your behalf as they get added to the site. It does the job, and the results are nicely formatted, but it’s the equivalent of a black box. If IFTTT changes how applets talk to services or the developer who made it loses interest, there’s no guarantee it will continue working.<sup><a href="#72f5:fn:2" class="footnote" id="72f5:fn-back:2">2</a></sup></p>

<p>Enter <a href="https://brid.gy">Bridgy</a>, a service I remember reading about a while back but hadn’t looked at in a serious way for some time. From the site’s FAQ:</p>

<blockquote>
  <p><em>Bridgy periodically checks social networks for responses to your posts and links to your web site and sends them back to your site as webmentions. Bridgy also translates the responses to microformats so that your web site can fetch and parse them. Bridgy can also publish posts, comments, likes, and retweets from your web site to social networks. When you ask Bridgy to publish a post, it analyzes its microformats data and publishes it using the social network APIs.</em></p>
</blockquote>

<p>This means I can add a <a href="https://indieweb.org/Webmention">webmention</a><sup><a href="#72f5:fn:3" class="footnote" id="72f5:fn-back:3">3</a></sup> endpoint to my post template and when it is published, Bridgy will hit the Twitter API and send a tweet for me. I had previously set up - but never actually used - a separate Twitter account for this purpose - an idea I got from Casey Liss’ engine, <a href="https://github.com/cliss/camel">Camel</a>. However, I’ve found that implementing <a href="https://indieweb.org/Micropub">micropub</a> style posting (think Twitter, or for the more technically inclined, Mastodon or Micro.blog) is easier if it all uses the same account.</p>

<h2 id="unfinished">Unfinished</h2>

<p>While this is a good start, it’s not finished yet. The web interface to Bridgy gives you a POST request that will actually send the webmention, but for some reason, although I included the Twitter URL - from Bridgy - in my template, a tweet containing a link back to my post wasn’t showing up when I first tried to use this setup. As a result, there’s a tiny script - called <code class="language-plaintext highlighter-rouge">webmention.sh</code> - which uses curl to talk to Bridgy, which goes and pings Twitter.</p>

<p>Ideally, I would like to automate this step, which would allow me to re-enable autopublishing in Netlify. At that point, all that would be required to tweet new items from the feed would be a <code class="language-plaintext highlighter-rouge">git push</code>. <a href="https://webmention.app">Webmention.app</a> seems like the best option for my purposes and I’ve done some testing with it for a few days. It integrates with Netlify’s webhooks feature so I can send a webmention automatically when each deploy succeeds.<sup><a href="#72f5:fn:4" class="footnote" id="72f5:fn-back:4">4</a></sup></p>

<p>It would also mean I don’t need to hand-edit my script to add the URL of each new post. I just need to figure out how the POST request should be formatted and it should be ready to go.</p>

<hr />

<ol class="footnotelist">
<li id="72f5:fn:1" class="footnotebody" value="1">
    <p>Merlin.</p>
   <a href="#72f5:fn-back:1" class="backlink">⏎</a></li>
<li id="72f5:fn:2" class="footnotebody" value="2">
    <p>Another argument in favor of, &#8216;If you want something done, do it yourself.&#8217;</p>
   <a href="#72f5:fn-back:2" class="backlink">⏎</a></li>
<li id="72f5:fn:3" class="footnotebody" value="3">
    <p>Aaron Parecki&#8217;s session from IndieWebCamp last year is a great place to start if you want to get an overview of what webmentions are and how to use them.</p>
   <a href="#72f5:fn-back:3" class="backlink">⏎</a></li>
<li id="72f5:fn:4" class="footnotebody" value="4">
  <p>Remy Sharp, who runs the service, along with users in the Netlify Community forum have been remarkably patient to answer silly questions from me as they come up, which has been helpful as I try to get this working right.
</p>
   <a href="#72f5:fn-back:4" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[So, while writing a function to send a tweet when a new item gets added to feed isn’t hard, it does typically involve a bunch of Javascript. Far more than I’m comfortable dealing with at this point.]]></summary></entry><entry><title type="html">Social Distancing Part 4 - When Government (Almost) Gets It Right</title><link href="https://chrisfinazzo.com/2020/04/26/social-distancing-pt4-when-government-almost-gets-it-right.html" rel="alternate" type="text/html" title="Social Distancing Part 4 - When Government (Almost) Gets It Right" /><published>2020-04-26T00:00:00+00:00</published><updated>2020-04-26T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/04/26/social-distancing-pt4-when-government-almost-gets-it-right</id><content type="html" xml:base="https://chrisfinazzo.com/2020/04/26/social-distancing-pt4-when-government-almost-gets-it-right.html"><![CDATA[<p>So it has come down to this. A topic I thought I would <em>never, ever</em> write about here. But, through a series of mostly COVID-19 related events, here we are.</p>

<p>Politics. Specifically, the United States Census.</p>

<p>It happens every 10 years, but honestly I’ve never given it much thought. As with voting, time has a way of grabbing your attention at moments that used to just pass by.<sup><a href="#4564:fn:1" class="footnote" id="4564:fn-back:1">1</a></sup> Because I had some extra time on my hands, I even applied to work at a local office in my district. For whatever reason, this exercise didn’t pan out. Also, this was before coronavirus, when you could do amazing things like actually <em>work with other people in the same place without social distancing</em>.</p>

<p>It started on YouTube. I don’t know if they’ve done it in the past, but the people at Sesame Workshop put together a short video<sup><a href="#4564:fn:2" class="footnote" id="4564:fn-back:2">2</a></sup> to encourage everyone to respond to the Census. Popular culture tends to depict the process as kind of a drag and an artifact of a bygone era, so getting everyone on board requires getting a little creative.</p>

<p>The result is <a href="https://www.youtube.com/watch?v=KZmLI7eYjmw">brilliant</a>. Short, to the point, free of political bias, and presented in a way that makes even little kids feel like they’re part of the process.<sup><a href="#4564:fn:3" class="footnote" id="4564:fn-back:3">3</a></sup></p>

<p>With “stay-at-home” orders in place the past few weeks, it became clear that people wouldn’t be canvassing the neighborhood anytime soon. That raises the question, ‘could the government actually pull this off online?’</p>

<p>Surprisingly, the answer seems to be yes - with the exception of one quirk I’ll get to in a moment. Just go to the <a href="https://my2020census.gov">website</a> and click “Start Questionnaire”. Like they say, the process literally takes 10 minutes and anyone should be able to get through it.</p>

<p>Looking at the site’s design, it seems to be the work of the <a href="https://www.usds.gov">USDS</a>, who, along with <a href="https://18f.gsa.gov">18F</a> are trying to keep the Federal government’s technology infrastructure in running order. In some ways, I’m reminded of the UK’s equivalent, <a href="https://www.gov.uk">GOV.UK</a>, although the US hasn’t yet put all of its sites under one roof. When so much of government feels like it’s in disarray, it’s good to know there are at least a few experts left, even if their work goes unnoticed most of the time.</p>

<p>That is, until I clicked submit — whereupon the site deleted my responses and made me start <em>all over again</em>.</p>

<div style="width:100%;height:0;padding-bottom:56%;position:relative;"><iframe src="https://giphy.com/embed/xTiN0DvoDyWQey2B8I" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>
<p><a href="https://giphy.com/gifs/nbc-nbc-90-90th-special-xTiN0DvoDyWQey2B8I"></a></p>

<hr />

<ol class="footnotelist">
<li id="4564:fn:1" class="footnotebody" value="1">
      <p>A Twitter thread explains some of my own voting history and the shift in mindset that occurred.</p>
   <a href="#4564:fn-back:1" class="backlink">⏎</a></li>
<li id="4564:fn:2" class="footnotebody" value="2">
      <p>They also have a microsite up with a bunch of resources on COVID-19.</p>
   <a href="#4564:fn-back:2" class="backlink">⏎</a></li>
<li id="4564:fn:3" class="footnotebody" value="3">
      <p>Although YouTube was around in 2010, I suspect it - and social media as a whole - hadn&#8217;t yet become an integral part of how brands reach their target market.</p>
   <a href="#4564:fn-back:3" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[So it has come down to this. A topic I thought I would never, ever write about here. But, through a series of mostly COVID-19 related events, here we are.]]></summary></entry><entry><title type="html">Social Distancing Part 3 - A Better Linkblog</title><link href="https://chrisfinazzo.com/2020/04/20/social-distancing-pt3-a-better-linkblog.html" rel="alternate" type="text/html" title="Social Distancing Part 3 - A Better Linkblog" /><published>2020-04-20T00:00:00+00:00</published><updated>2020-04-20T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/04/20/social-distancing-pt3-a-better-linkblog</id><content type="html" xml:base="https://chrisfinazzo.com/2020/04/20/social-distancing-pt3-a-better-linkblog.html"><![CDATA[<p>For as long as I’ve had a blog of any kind, the idea of quick, short-form writing - sometimes called <a href="https://www.manton.org/2016/03/03/the-evolution-of.html">linkblogging</a> - has been an area of interest. I first remember seeing this concept sometime back in 2006, when I found my way to John Gruber’s long running site, Daring Fireball. His being the gold standard for this kind of thing, I found myself wanting to do likewise. For interesting articles that I find through RSS or just browsing around the web, it’s convenient to have an outlet for the stray thought that passes through my mind as I’m reading.</p>

<p>My first attempt at this idea involved using a link from within the text of a post to the article I was commenting on. Easy enough, but that was different than most other blogs of this style that I read, who used the title to fill that role. Furthermore, Jekyll doesn’t easily lend itself to that use case without a number of - what I consider to be ugly - modifications to your templates.</p>

<p>Later on, I had a layout where the anchor containing the <code>page.title</code> variable pointed to the link destination, but this was not how the people I was reading built their sites, and more importantly, it was error prone. For a little while, I tried using Jekyll’s support for <a href="https://jekyllrb.com/docs/collections/">collections</a> to get the job done, but this turned out to be no better than juggling destination links and permalinks. Collections are really meant for similar, related items, but other than the fact that these were all links, that didn’t fit the bill.</p>

<p>This brief trip through history brings me to today and what I hope is a better long term solution. Jekyll supports the <a href="https://jekyllrb.com/docs/datafiles/">concept</a> of a <code class="language-plaintext highlighter-rouge">_data</code> directory where you can define custom variables and data that can be accessed through Liquid templates. Now, I have a YAML<sup><a href="#9a0f:fn:1" class="footnote" id="9a0f:fn-back:1">1</a></sup> file - naturally, it’s called links - that can simply be added to as I come across interesting things that I want to write about, but don’t merit a full post. Each time the site is updated, Jekyll reads the contents of this file and populates the Links page with its contents.</p>

<hr />

<ol class="footnotelist">
<li id="9a0f:fn:1" class="footnotebody" value="1">
      <p>Other formats include JSON, CSV, and TSV.</p>
   <a href="#9a0f:fn-back:1" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[For as long as I’ve had a blog of any kind, the idea of quick, short-form writing - sometimes called linkblogging - has been an area of interest. I first remember seeing this concept sometime back in 2006, when I found my way to John Gruber’s long running site, Daring Fireball. His being the gold standard for this kind of thing, I found myself wanting to do likewise. For interesting articles that I find through RSS or just browsing around the web, it’s convenient to have an outlet for the stray thought that passes through my mind as I’m reading.]]></summary></entry><entry><title type="html">Social Distancing Part 2 - Adventures in Continuous Integration</title><link href="https://chrisfinazzo.com/2020/04/08/social-distancing-pt2-adventures-in-continuous-integration.html" rel="alternate" type="text/html" title="Social Distancing Part 2 - Adventures in Continuous Integration" /><published>2020-04-08T00:00:00+00:00</published><updated>2020-04-08T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/04/08/social-distancing-pt2-adventures-in-continuous-integration</id><content type="html" xml:base="https://chrisfinazzo.com/2020/04/08/social-distancing-pt2-adventures-in-continuous-integration.html"><![CDATA[<p>It all sounded so simple.<sup><a href="#c5c4:fn:1" class="footnote" id="c5c4:fn-back:1">1</a></sup> At least this is what I told myself when I decided to move off of my previous host and on to <a href="https://www.netlify.com">Netlify</a>. It was going to be <em>great</em> - almost all of the capabilities of a VPS <em>for free</em>, but I didn’t have to manage it.</p>

<p>This kind of setup is more common these days and works well if you want to get a site up and running quickly without having to fiddle with configuring a server.<sup><a href="#c5c4:fn:2" class="footnote" id="c5c4:fn-back:2">2</a></sup> In my case, I had this blog on DreamHost and an existing microsite (my Reverse Job Posting) over on GitHub Pages but wanted more control over things like HTTP headers and redirects.</p>

<p>Around that time, I watched John Wilander’s presentation from WWDC 18 and Scott Helme’s from dotSecurity 2016 and thought, ‘I can do this!’</p>

<div style="width:100%;height:0;padding-bottom:56%;position:relative;"><iframe src="https://giphy.com/embed/8y8NVqFqhTQVa" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>
<p><a href="https://giphy.com/gifs/ratatouille-admin-billy-boyd-8y8NVqFqhTQVa"></a></p>

<p>Netlify even has a sandbox environment, called the “Playground” where you can test out rules to make sure they work. Take those rules, export them in a <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file - Netlify’s format of choice for configuration data - upload it to a domain, and that <em>should</em> be it…</p>

<p>Not quite. Enter <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP">Content Security Policy</a>.</p>

<p><em>In theory</em>, the pitch for CSP is awesome. Security configuration changes that are really only a few key-value pairs. You could argue that this is overkill, that for a single page application (no, not <a href="https://en.wikipedia.org/wiki/Single-page_application">that kind</a> - although I do have a <a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API">Service Worker</a>) it’s needlessly complicated, but I was too far into “learning mode” to think about that, so I pressed on. Problem is, if you don’t do it correctly, parts of your site will <em>disappear</em><sup><a href="#c5c4:fn:3" class="footnote" id="c5c4:fn-back:3">3</a></sup> and you might not know until it’s live on the Internet.</p>

<p>In the past, this wasn’t an issue for me. I ran <code class="language-plaintext highlighter-rouge">make</code> or <code class="language-plaintext highlighter-rouge">rake</code> locally, then uploaded the files and that was it. Well, in a CI scenario, that’s a problem. If, for example, I forgot to run the build task or didn’t set CSP to <code class="language-plaintext highlighter-rouge">report-only</code>, raw Markdown might get displayed, things wouldn’t show up, or the site would refuse to accept changes in a stylesheet.</p>

<p>It was infuriating.</p>

<div style="width:100%;height:0;padding-bottom:64%;position:relative;"><iframe src="https://giphy.com/embed/H4qKN0dHfkZAA" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>
<p><a href="https://giphy.com/gifs/technology-dazed-dazedvrt1-H4qKN0dHfkZAA"></a></p>

<p>After many false starts (my repo’s history for this time period is a mess), and sleeping on the problem for a few days, I <em>finally</em> got this working. Long term, this will allow me to investigate how I can use Netlify’s AWS Lambda <a href="https://docs.netlify.com/functions/overview/">integration</a> to send off a tweet whenever a new post is published.<sup><a href="#c5c4:fn:4" class="footnote" id="c5c4:fn-back:4">4</a></sup></p>

<p>Ambitious to be sure, especially given how much fumbling about I did at the beginning - but now I’m halfway there. That’s a win.</p>

<div style="width:100%;height:0;padding-bottom:81%;position:relative;"><iframe src="https://giphy.com/embed/zaqclXyLz3Uoo" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>
<p><a href="https://giphy.com/gifs/zaqclXyLz3Uoo"></a></p>

<hr />

<ol class="footnotelist">
<li id="c5c4:fn:1" class="footnotebody" value="1">
      <p>Famous last words.</p>
   <a href="#c5c4:fn-back:1" class="backlink">⏎</a></li>
<li id="c5c4:fn:2" class="footnotebody" value="2">
      <p>See also - GitHub Pages, Heroku, and Statically</p>
   <a href="#c5c4:fn-back:2" class="backlink">⏎</a></li>
<li id="c5c4:fn:3" class="footnotebody" value="3">
      <p>If you have external scripts from somewhere else, but specify just the default source e.g, &#8216;self&#8217; - only load scripts from my domain - _no matter what you do_, those other resources will refuse to load. It is possible to list a resource as &#8216;none&#8217;, but not loading any URLs of a given type isn&#8217;t all that common.</p>
   <a href="#c5c4:fn-back:3" class="backlink">⏎</a></li>
<li id="c5c4:fn:4" class="footnotebody" value="4">
      <p>From what I can tell, deploying via the CI method is a requirement if you want to use functions.</p>
   <a href="#c5c4:fn-back:4" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[It all sounded so simple.1 At least this is what I told myself when I decided to move off of my previous host and on to Netlify. It was going to be great - almost all of the capabilities of a VPS for free, but I didn’t have to manage it.]]></summary></entry><entry><title type="html">Social Distancing Part 1 - Hello, Zsh!</title><link href="https://chrisfinazzo.com/2020/04/07/social-distancing-pt1-hello-zsh.html" rel="alternate" type="text/html" title="Social Distancing Part 1 - Hello, Zsh!" /><published>2020-04-07T00:00:00+00:00</published><updated>2020-04-07T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/04/07/social-distancing-pt1-hello-zsh</id><content type="html" xml:base="https://chrisfinazzo.com/2020/04/07/social-distancing-pt1-hello-zsh.html"><![CDATA[<p><strong><em>This is what (I hope) will be a series of posts about what I’m doing to keep my mind occupied while practicing COVID-19 induced <a href="https://www.hopkinsmedicine.org/health/conditions-and-diseases/coronavirus/coronavirus-social-distancing-and-self-quarantine">social distancing</a>. When you work for a public library (but are closed to the public), just about everything slows to a crawl.</em></strong></p>

<p>The writing is on the wall for Bash in macOS. It’s really old, and probably won’t be updated because of terms set forth in the GPL Version 3.<sup><a href="#8102:fn:1" class="footnote" id="8102:fn-back:1">1</a></sup></p>

<p>(Read: Lawyers)</p>

<p>If you are sufficiently determined, you <em>can</em> upgrade to Bash 5 - but you’re on your own should you decide to go that route. The default shell in Catalina is now Zsh, and if you launch Bash on a Mac running 10.15, you’ll get this friendly message:<sup><a href="#8102:fn:2" class="footnote" id="8102:fn-back:2">2</a></sup></p>

<blockquote>
  <p><code>The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.</code></p>
</blockquote>

<p>In my case, a combination of Apple’s <a href="https://support.apple.com/en-us/HT208050">instructions</a>, Armin’s <a href="https://scriptingosx.com/2019/11/new-book-release-day-moving-to-zsh/">book</a> and a handful of Twitter conversations was enough to make it through this transition. My setup isn’t that complicated and making the move now means some of the privacy related changes in macOS will be easier to digest before I even encounter Catalina.<sup><a href="#8102:fn:3" class="footnote" id="8102:fn-back:3">3</a></sup></p>

<p>Having my <a href="https://github.com/chrisfinazzo/dotfiles">configuration</a> backed up doesn’t hurt either.</p>

<hr />

<ol class="footnotelist">
<li id="8102:fn:1" class="footnotebody" value="1">
      <p>It&#8217;s licensed under the GPL Version 2, but the program itself is now at version 3.2. That&#8217;s not confusing at all.</p>
   <a href="#8102:fn-back:1" class="backlink">⏎</a></li>
<li id="8102:fn:2" class="footnotebody" value="2">
       <p>You may choose to suppress this warning using the command <code>export BASH_SILENCE_DEPRECATION_WARNING=1</code> but honestly, doing that feels like fighting the old war.</p>
   <a href="#8102:fn-back:2" class="backlink">⏎</a></li>
<li id="8102:fn:3" class="footnotebody" value="3">
       <p>Backblaze, BBEdit, Terminal, and Transmit get Full Disk Access to preempt an avalanche of security dialogs.</p>
   <a href="#8102:fn-back:3" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[This is what (I hope) will be a series of posts about what I’m doing to keep my mind occupied while practicing COVID-19 induced social distancing. When you work for a public library (but are closed to the public), just about everything slows to a crawl.]]></summary></entry><entry><title type="html">Drafts in Six Lines of Code</title><link href="https://chrisfinazzo.com/2020/02/20/drafts-in-six-lines-of-code.html" rel="alternate" type="text/html" title="Drafts in Six Lines of Code" /><published>2020-02-20T00:00:00+00:00</published><updated>2020-02-20T00:00:00+00:00</updated><id>https://chrisfinazzo.com/2020/02/20/drafts-in-six-lines-of-code</id><content type="html" xml:base="https://chrisfinazzo.com/2020/02/20/drafts-in-six-lines-of-code.html"><![CDATA[<p>A few years ago, I came across a <a href="https://www.youtube.com/watch?v=8SUkrR7ZfTA">presentation</a><sup><a href="#fbb6:fn:1" class="footnote" id="fbb6:fn-back:1">1</a></sup> that Brian Kernighan gave back in 2009 called <em>The Elements of Programming Style</em>, a title borrowed from his book of the same name. In it, he made one point which I think applies equally well whether you are writing words or code.</p>

<blockquote>
  <p><em>So, there’s a balance that you have to find between too clever and - not clever enough - being kind of dim about what you’re doing</em></p>
</blockquote>

<p>With this in mind, I took another look at the “drafts” script I mentioned in my last post. Thinking about the problem a bit more, I’ve found that Kernighan’s observation was precisely the problem I was having all along. Although I could read the script, and understand <em>what</em> it was doing, I didn’t really grasp <em>why</em>.</p>

<p>My knowledge of Make is not very deep and AWK even less so. As I hadn’t thought about this for some time and it’s usually easier to deal with the devil you know than the one you don’t, I ultimately decided to rewrite it in Ruby.</p>

<p>5 minutes of work, 6 lines of code, and (hopefullly) the incentive to write more often.</p>

<hr />

<ol class="footnotelist">
<li id="fbb6:fn:1" class="footnotebody" value="1">
      <p>I am always impressed by how &#8220;down to Earth&#8221; Kernighan is every time I hear him speak.</p>
   <a href="#fbb6:fn-back:1" class="backlink">⏎</a></li>
</ol>]]></content><author><name>Chris Finazzo</name><email>chris@chrisfinazzo.com</email></author><summary type="html"><![CDATA[A few years ago, I came across a presentation1 that Brian Kernighan gave back in 2009 called The Elements of Programming Style, a title borrowed from his book of the same name. In it, he made one point which I think applies equally well whether you are writing words or code.]]></summary></entry></feed>