f5556130bda1 lisp

Add Lisp skeleton, port blog
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sat, 04 Jan 2020 23:36:37 -0500
parents f9c2bf2fa2c9
children 9698d436ae22
branches/tags lisp
files build.sh content/blog/2008/02/microsoft-entourage-applescript-frustration.markdown content/blog/2008/04/shooting-girl-jam.markdown content/blog/2008/08/beauty-in-computer-science-recursion.markdown content/blog/2008/08/negative-space-dancing.markdown content/blog/2008/08/on-leading.markdown content/blog/2009/01/deploying-site-fabric-and-mercurial.markdown content/blog/2009/01/going-open-source.markdown content/blog/2009/01/site-redesign.markdown content/blog/2009/02/how-and-why-i-dj.markdown content/blog/2009/02/how-i-shoot-dances.markdown content/blog/2009/03/candy-colored-terminal.markdown content/blog/2009/03/mercurial-bash-prompts.markdown content/blog/2009/04/why-people-dont-like-metal.markdown content/blog/2009/05/what-i-hate-about-mercurial.markdown content/blog/2009/06/how-to-contribute-to-mercurial.markdown content/blog/2009/08/a-guide-to-branching-in-mercurial.markdown content/blog/2009/11/my-sitesprint-project-lindyhub.markdown content/blog/2010/01/moving-from-django-to-hyde.markdown content/blog/2010/01/the-real-difference-between-mercurial-and-git.markdown content/blog/2010/02/mercurial-workflows-branch-as-needed.markdown content/blog/2010/02/my-extravagant-zsh-prompt.markdown content/blog/2010/04/a-faster-feed-apart.markdown content/blog/2010/05/mercurial-workflows-stable-default.markdown content/blog/2010/06/mercurial-workflows-translation-branches.markdown content/blog/2010/08/a-git-users-guide-to-mercurial-queues.markdown content/blog/2010/09/coming-home-to-vim.markdown content/blog/2010/09/making-my-site-sing.markdown content/blog/2010/11/keep-calm-and-carry-on.markdown content/blog/2011/05/on-learning-and-teaching.markdown content/blog/2011/05/paper-free.markdown content/blog/2011/06/django-advice.markdown content/blog/2011/09/writing-vim-plugins.markdown content/blog/2012/04/volatile-software.markdown content/blog/2012/07/caves-of-clojure-01.markdown content/blog/2012/07/caves-of-clojure-02.markdown content/blog/2012/07/caves-of-clojure-03-1.markdown content/blog/2012/07/caves-of-clojure-03-2.markdown content/blog/2012/07/caves-of-clojure-03-3.markdown content/blog/2012/07/caves-of-clojure-03-4.markdown content/blog/2012/07/caves-of-clojure-04.markdown content/blog/2012/07/caves-of-clojure-05.markdown content/blog/2012/07/caves-of-clojure-06.markdown content/blog/2012/07/caves-of-clojure-interlude-1.markdown content/blog/2012/10/a-modern-space-cadet.markdown content/blog/2012/10/caves-of-clojure-07-1.markdown content/blog/2012/10/the-homely-mutt.markdown content/blog/2012/10/why-i-two-space.markdown content/blog/2013/03/list-out-of-lambda.markdown content/blog/2013/04/git-koans.markdown content/blog/2013/09/teach-dont-tell.markdown content/blog/2015/07/nat-geo-a2540.markdown content/blog/2015/07/nat-geo-mc5350.markdown content/blog/2015/11/beat-the-data.markdown content/blog/2015/11/happy-little-words.markdown content/blog/2015/12/ludum-dare-34.markdown content/blog/2015/12/permutation-patterns.markdown content/blog/2016/02/midpoint-displacement.markdown content/blog/2016/03/recursive-midpoint-displacement.markdown content/blog/2016/06/diamond-square.markdown content/blog/2016/06/symbolic-computation.markdown content/blog/2016/08/lisp-jam-postmortem.markdown content/blog/2016/08/playing-with-syntax.markdown content/blog/2016/09/iterate-averaging.markdown content/blog/2016/10/iterate-timing.markdown content/blog/2016/12/chip8-cpu.markdown content/blog/2016/12/chip8-graphics.markdown content/blog/2016/12/chip8-input.markdown content/blog/2016/12/chip8-sound.markdown content/blog/2017/01/chip8-debugging-infrastructure.markdown content/blog/2017/01/chip8-disassembly.markdown content/blog/2017/01/chip8-menus.markdown content/blog/2018/05/fun-with-macros-gathering.markdown content/blog/2018/07/fun-with-macros-if-let.markdown content/blog/2018/08/a-road-to-common-lisp.markdown content/photography.markdown generate.lisp

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build.sh	Sat Jan 04 23:36:37 2020 -0500
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+mkdir -p build
+sbcl --non-interactive --load generate.lisp --eval '(stevelosh.com:toplevel)'
+rsync -avd static/ build/static
+heading smslant 'done'
--- a/content/blog/2008/02/microsoft-entourage-applescript-frustration.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2008/02/microsoft-entourage-applescript-frustration.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Entourage + Applescript = Frustration"
-snip = "This is ridiculous."
-date = 2008-02-21T15:25:45Z
-draft = false
+(
+:title "Entourage + Applescript = Frustration"
+:snip "This is ridiculous."
+:date "2008-02-21T15:25:45Z"
+:draft nil
 
-+++
+)
 
 I've been working on a project lately to automate the setup of some rules and
 schedules in Microsoft Entourage. This isn't the easiest thing in the world
--- a/content/blog/2008/04/shooting-girl-jam.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2008/04/shooting-girl-jam.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Shooting Girl Jam"
-snip = "I'm finally getting the kind of dancing photos I want."
-date = 2008-04-29T18:31:16Z
-draft = false
+(
+:title "Shooting Girl Jam"
+:snip "I'm finally getting the kind of dancing photos I want."
+:date "2008-04-29T18:31:16Z"
+:draft nil
 
-+++
+)
 
 <a href="http://www.flickr.com/photos/sjl7678/2450406138/"
    title="GirlJamSaturday-5383 by Steve Losh, on Flickr">
--- a/content/blog/2008/08/beauty-in-computer-science-recursion.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2008/08/beauty-in-computer-science-recursion.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Beauty in Computer Science"
-snip = "Why I love what I do."
-date = 2008-08-29T15:30:38Z
-draft = false
+(
+:title "Beauty in Computer Science"
+:snip "Why I love what I do."
+:date "2008-08-29T15:30:38Z"
+:draft nil
 
-+++
+)
 
 When I went to college, I majored in Computer Science. I haven't really
 written anything about this part of my life yet, so I figured this might be a
--- a/content/blog/2008/08/negative-space-dancing.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2008/08/negative-space-dancing.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Negative Space in Dancing"
-snip = "It’s not just for artsy kids."
-date = 2008-08-31T15:33:57Z
-draft = false
+(
+:title "Negative Space in Dancing"
+:snip "It’s not just for artsy kids."
+:date "2008-08-31T15:33:57Z"
+:draft nil
 
-+++
+)
 
 Last night a few of us from Rochester drove to Buffalo for a swing event.
 There were three classes during the afternoon that were pretty fun. There was
--- a/content/blog/2008/08/on-leading.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2008/08/on-leading.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "On Leading"
-snip = "Some of my thoughts on leading after five years of doing it."
-date = 2008-08-01T15:28:33Z
-draft = false
+(
+:title "On Leading"
+:snip "Some of my thoughts on leading after five years of doing it."
+:date "2008-08-01T15:28:33Z"
+:draft nil
 
-+++
+)
 
 For those of you that don't know, one of the things I do with my free time is
 dancing. I've been swing dancing (Lindy Hop) for about five years, blues
--- a/content/blog/2009/01/deploying-site-fabric-and-mercurial.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/01/deploying-site-fabric-and-mercurial.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Deploying with Fabric & Mercurial"
-snip = "Trimming typing."
-date = 2009-01-15T20:51:09Z
-draft = false
+(
+:title "Deploying with Fabric & Mercurial"
+:snip "Trimming typing."
+:date "2009-01-15T20:51:09Z"
+:draft nil
 
-+++
+)
 
 Earlier tonight I added support for the [Mint][] [Bird Feeder][] plugin to my
 site's [RSS feeds][]. Bird Feeder isn't designed to work with [Django][] so I
--- a/content/blog/2009/01/going-open-source.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/01/going-open-source.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Going Open Source"
-snip = "Why I’m making the code to this website public."
-date = 2009-01-13T20:08:56Z
-draft = false
+(
+:title "Going Open Source"
+:snip "Why I’m making the code to this website public."
+:date "2009-01-13T20:08:56Z"
+:draft nil
 
-+++
+)
 
 Well, I've finally taken the plunge and made this site open source. It's held
 in a [Mercurial][] repository, but you can view or download the source code
--- a/content/blog/2009/01/site-redesign.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/01/site-redesign.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Site Redesign"
-snip = "Yeah, I know.  Again."
-date = 2009-01-11T17:58:23Z
-draft = false
+(
+:title "Site Redesign"
+:snip "Yeah, I know.  Again."
+:date "2009-01-11T17:58:23Z"
+:draft nil
 
-+++
+)
 
 Well, I've redesigned the site again. This time it's all me. I built the site
 from the ground up with [Django][] and [Python][]. Why? Several reasons:
--- a/content/blog/2009/02/how-and-why-i-dj.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/02/how-and-why-i-dj.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "How & Why I DJ"
-snip = "I like playing music for dancers."
-date = 2009-02-06T17:53:44Z
-draft = false
+(
+:title "How & Why I DJ"
+:snip "I like playing music for dancers."
+:date "2009-02-06T17:53:44Z"
+:draft nil
 
-+++
+)
 
 I've been DJ'ing at swing and blues dances for a while now. It's extremely fun
 and rewarding. I've got a system that I use to keep myself sane while doing it
@@ -122,7 +122,7 @@
 Smart Playlists. I can create a smart playlist that only shows me songs that
 are in my "Lindy & Blues" playlist but aren't yet rated.
 
-![Unrated Smart Playlist Screenshot](/media/images/blog/2009/02/dj-playlist-unrated.png "Unrated Smart Playlist")
+![Unrated Smart Playlist Screenshot](/static/images/blog/2009/02/dj-playlist-unrated.png "Unrated Smart Playlist")
 
 I have an iPod as well, so when I'm out and listening to my music I can set
 the rating right on the iPod. When I get back to my computer I plug in the
@@ -175,7 +175,7 @@
 iTunes window will usually look like this (except for being slightly bigger
 and having the sidebar showing):
 
-![Sorted Danceable Playlist Screenshot](/media/images/blog/2009/02/dj-playlist-sorting.png "Sorted Danceable Playlist")
+![Sorted Danceable Playlist Screenshot](/static/images/blog/2009/02/dj-playlist-sorting.png "Sorted Danceable Playlist")
 
 I can use the search bar in the upper right if I'm looking for something
 specific. I can sort by BPM if I know I want a song at a rough tempo. The
--- a/content/blog/2009/02/how-i-shoot-dances.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/02/how-i-shoot-dances.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "How I Shoot Dances"
-snip = "Slow shutter and flash."
-date = 2009-02-09T18:04:36Z
-draft = false
+(
+:title "How I Shoot Dances"
+:snip "Slow shutter and flash."
+:date "2009-02-09T18:04:36Z"
+:draft nil
 
-+++
+)
 
 Last weekend [Gordon Webster][] came to Rochester, NY to play a dance at The
 Keg. It was awesome (of course) and everyone had a great time.
--- a/content/blog/2009/03/candy-colored-terminal.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/03/candy-colored-terminal.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Candy Colored Terminal"
-snip = "Better colors for the OS X Terminal."
-date = 2009-03-18T18:26:28Z
-draft = false
+(
+:title "Candy Colored Terminal"
+:snip "Better colors for the OS X Terminal."
+:date "2009-03-18T18:26:28Z"
+:draft nil
 
-+++
+)
 
 Yesterday I wrote a blog post about [adding Mercurial information to your bash
 prompt](/blog/entry/2009/3/17/mercurial-bash-prompts/). Almost all of the
@@ -41,7 +41,7 @@
 pretty colors. I love the [Monokai][] color scheme for [TextMate][] and so I
 based my choices on that. Here's what it looks like:
 
-![Screenshot of my Terminal, with colors.](/media/images/blog/2009/03/terminal-colors.png "My Terminal colors.")
+![Screenshot of my Terminal, with colors.](/static/images/blog/2009/03/terminal-colors.png "My Terminal colors.")
 
 [Monokai]: http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/
 [TextMate]: http://macromates.com/
--- a/content/blog/2009/03/mercurial-bash-prompts.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/03/mercurial-bash-prompts.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Mercurial Bash Prompts"
-snip = "Always know where you are."
-date = 2009-03-17T21:34:55Z
-draft = false
+(
+:title "Mercurial Bash Prompts"
+:snip "Always know where you are."
+:date "2009-03-17T21:34:55Z"
+:draft nil
 
-+++
+)
 
 I've been spending a lot of time in the Terminal lately. I use bash, and it
 lets you configure the prompt pretty much however you want. I won't go into
@@ -32,7 +32,7 @@
 
 Here's what my prompt looked like a couple of days ago:
 
-![My bash prompt without the branch displayed](/media/images/blog/2009/03/prompt-without-branch.png "My bash prompt without the branch displayed.")
+![My bash prompt without the branch displayed](/static/images/blog/2009/03/prompt-without-branch.png "My bash prompt without the branch displayed.")
 
 Here's the code in my `.bashrc` file to create it. I've stripped out the color
 information to save space.
@@ -62,7 +62,7 @@
 my prompt whenever I'm in a directory that's part of a repository. Here's what
 my prompt looks like now:
 
-![My bash prompt with the branch displayed](/media/images/blog/2009/03/prompt-with-branch.png "My bash prompt with the branch displayed.")
+![My bash prompt with the branch displayed](/static/images/blog/2009/03/prompt-with-branch.png "My bash prompt with the branch displayed.")
 
 And here's the code in my `.bashrc` that does it:
 
@@ -96,7 +96,7 @@
 not the repository you're in is dirty. I ported it to Mercurial and here's the
 result:
 
-![My bash prompt with the branch and dirty indicator displayed](/media/images/blog/2009/03/prompt-with-dirty.png "My bash prompt with the branch and dirty indicator displayed.")
+![My bash prompt with the branch and dirty indicator displayed](/static/images/blog/2009/03/prompt-with-dirty.png "My bash prompt with the branch and dirty indicator displayed.")
 
 And the code in `.bashrc`:
 
--- a/content/blog/2009/04/why-people-dont-like-metal.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/04/why-people-dont-like-metal.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Why People Don’t Like Metal"
-snip = "It’s probably not what you think."
-date = 2009-04-02T22:32:27Z
-draft = false
+(
+:title "Why People Don’t Like Metal"
+:snip "It’s probably not what you think."
+:date "2009-04-02T22:32:27Z"
+:draft nil
 
-+++
+)
 
 I don't think I've ever written a blog entry strictly about music. Usually
 I'll reference it when I write about dancing, but today I just want to talk
--- a/content/blog/2009/05/what-i-hate-about-mercurial.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/05/what-i-hate-about-mercurial.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "What I Hate About Mercurial"
-snip = "Hg, I love you, but sometimes you bring me down."
-date = 2009-05-29T19:51:05Z
-draft = false
+(
+:title "What I Hate About Mercurial"
+:snip "Hg, I love you, but sometimes you bring me down."
+:date "2009-05-29T19:51:05Z"
+:draft nil
 
-+++
+)
 
 This entry was inspired by [Jacob Kaplan-Moss][JKM], who was inspired by
 [Titus][], who was inspired by [brian d foy][BDF]. The premise is that you
--- a/content/blog/2009/06/how-to-contribute-to-mercurial.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/06/how-to-contribute-to-mercurial.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "How to Contribute to Mercurial"
-snip = "Ten minutes of setup will make it easier."
-date = 2009-06-01T20:09:44Z
-draft = false
+(
+:title "How to Contribute to Mercurial"
+:snip "Ten minutes of setup will make it easier."
+:date "2009-06-01T20:09:44Z"
+:draft nil
 
-+++
+)
 
 After my last post on [What I Hate About Mercurial][hate], seydar commented
 that I should contribute a patch to add untrack/forget functionality. I
--- a/content/blog/2009/08/a-guide-to-branching-in-mercurial.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/08/a-guide-to-branching-in-mercurial.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "A Guide to Branching in Mercurial"
-snip = "With illustrations and comparisons to git."
-date = 2009-08-30T20:27:12Z
-draft = false
+(
+:title "A Guide to Branching in Mercurial"
+:snip "With illustrations and comparisons to git."
+:date "2009-08-30T20:27:12Z"
+:draft nil
 
-+++
+)
 
 I've been hanging out in the [#mercurial][hg-irc] and [#bitbucket][bb-irc]
 channels on freenode a lot lately, and I've noticed a topic that comes up a
@@ -43,7 +43,7 @@
 Before I start explaining the different branching models, here's a simple
 repository I'll use as an example:
 
-<img class="diagram" src="/media/images/blog/2009/08/branch-base.png" alt="Basic Repository"/>
+<img class="diagram" src="/static/images/blog/2009/08/branch-base.png" alt="Basic Repository"/>
 
 The repository is in the `~/src/test-project` folder. It has three changesets
 in it: numbers 0, 1 and 2.
@@ -82,7 +82,7 @@
 one and push/pull changesets between them as often as you like. Once you've
 made some changes in each one, the result might look like this:
 
-<img class="diagram" src="/media/images/blog/2009/08/branch-clone.png" alt="Branching with Clones"/>
+<img class="diagram" src="/static/images/blog/2009/08/branch-clone.png" alt="Branching with Clones"/>
 
 We've got two copies of the repository. Both contain the changesets that
 existed at the time we branched/cloned. If we push from `test-project` into
@@ -203,7 +203,7 @@
 
 Here's what the repository would look like with this method:
 
-<img class="diagram" src="/media/images/blog/2009/08/branch-bookmark.png" alt="Branching with Bookmarks"/>
+<img class="diagram" src="/static/images/blog/2009/08/branch-bookmark.png" alt="Branching with Bookmarks"/>
 
 The diagram of the changesets is pretty simple: the branch point was at
 changeset 2 and each branch has one new changeset on it.
@@ -272,7 +272,7 @@
 
 Here's what a repository using named branches might look like:
 
-<img class="diagram" src="/media/images/blog/2009/08/branch-named.png" alt="Branching with Named Branches"/>
+<img class="diagram" src="/static/images/blog/2009/08/branch-named.png" alt="Branching with Named Branches"/>
 
 An important difference with this method is that the branch name is
 permanently recorded as part of the changeset's metadata (as you can see in
@@ -331,7 +331,7 @@
 
 The result of updating and committing without doing anything else would be:
 
-<img class="diagram" src="/media/images/blog/2009/08/branch-anon.png" alt="Branching Anonymously"/>
+<img class="diagram" src="/static/images/blog/2009/08/branch-anon.png" alt="Branching Anonymously"/>
 
 How do you switch back and forth between branches once you do this? Just use
 `hg update --check REV` with the revision number (or hash) (you can shorten
--- a/content/blog/2009/11/my-sitesprint-project-lindyhub.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2009/11/my-sitesprint-project-lindyhub.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "My SiteSprint Project: LindyHub"
-snip = "I want to make something awesome for dancers."
-date = 2009-11-16T19:15:07Z
-draft = false
+(
+:title "My SiteSprint Project: LindyHub"
+:snip "I want to make something awesome for dancers."
+:date "2009-11-16T19:15:07Z"
+:draft nil
 
-+++
+)
 
 If you're a web designer and/or developer, you might have heard of
 [SiteSprint][]. From the SiteSprint page:
--- a/content/blog/2010/01/moving-from-django-to-hyde.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/01/moving-from-django-to-hyde.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Moving from Django to Hyde"
-snip = "Another year, another rewrite."
-date = 2010-01-15T20:14:00Z
-draft = false
+(
+:title "Moving from Django to Hyde"
+:snip "Another year, another rewrite."
+:date "2010-01-15T20:14:00Z"
+:draft nil
 
-+++
+)
 
 Almost exactly one year ago I posted a blog entry about how I [rewrote this
 site][rewrite] using [Django][]. It's a new year, and once again I've
--- a/content/blog/2010/01/the-real-difference-between-mercurial-and-git.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/01/the-real-difference-between-mercurial-and-git.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Real Difference Between Mercurial and Git"
-snip = "It’s not their features."
-date = 2010-01-20T21:56:00Z
-draft = false
+(
+:title "The Real Difference Between Mercurial and Git"
+:snip "It’s not their features."
+:date "2010-01-20T21:56:00Z"
+:draft nil
 
-+++
+)
 
 There are a
 [lot](http://nubyonrails.com/articles/five-features-from-mercurial-that-would-make-git-suck-less)
@@ -49,7 +49,7 @@
 trying to explain something. Here's how I visualize the difference between
 Mercurial and git:
 
-![Swiss Army Knife and Kitchen Utensils](/media/images/blog/2010/01/mercurial-vs-git.jpg "Mercurial vs. Git")
+![Swiss Army Knife and Kitchen Utensils](/static/images/blog/2010/01/mercurial-vs-git.jpg "Mercurial vs. Git")
 
 Each git command is like a Swiss Army knife. For example, `git checkout` can
 switch the working directory to a new branch, update file contents to that of
--- a/content/blog/2010/02/mercurial-workflows-branch-as-needed.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/02/mercurial-workflows-branch-as-needed.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Mercurial Workflows: Branch As Needed"
-snip = "Part 1 of several."
-date = 2010-02-28T14:00:00Z
-draft = false
+(
+:title "Mercurial Workflows: Branch As Needed"
+:snip "Part 1 of several."
+:date "2010-02-28T14:00:00Z"
+:draft nil
 
-+++
+)
 
 A while ago [Vincent Driessen][] posted an example of [a successful git
 branching model][gitbranch]. A lot of git users found that article very
@@ -53,7 +53,7 @@
 This workflow is most suited to small projects. Here's a sample repository
 with only a single, linear series of changes:
 
-<img class="diagram" src="/media/images/blog/2010/02/hg-branching-1-start.png" alt="Sample Repository"/>
+<img class="diagram" src="/static/images/blog/2010/02/hg-branching-1-start.png" alt="Sample Repository"/>
 
 In this example there's mostly just a single developer (you) working on the
 project to add features, fix bugs, etc.
@@ -85,7 +85,7 @@
 could then push their copy of the repository to somewhere public (like their
 own BitBucket account) and it would look something like this:
 
-<img class="diagram" src="/media/images/blog/2010/02/hg-branching-1-other.png" alt="Contributor Repository"/>
+<img class="diagram" src="/static/images/blog/2010/02/hg-branching-1-other.png" alt="Contributor Repository"/>
 
 Once their changes are somewhere public they can email you and say:
 
@@ -109,7 +109,7 @@
 repository and the time you read the email & pulled their changes? In that
 case your repository will look like this after you pull from them:
 
-<img class="diagram" src="/media/images/blog/2010/02/hg-branching-1-needs-merge.png" alt="Sample Repository Before Merging"/>
+<img class="diagram" src="/static/images/blog/2010/02/hg-branching-1-needs-merge.png" alt="Sample Repository Before Merging"/>
 
 Because John's bugfix changeset and your refactoring changeset both have the
 same parent there are now two "anonymous branches" in your repository. This
@@ -120,7 +120,7 @@
 a2125cb20c54` (if you weren't already there) and then `hg merge be3063198fea`
 to merge John's bugfix with your new changes. The result would look like this:
 
-<img class="diagram" src="/media/images/blog/2010/02/hg-branching-1-after-merge.png" alt="Sample Repository After Merging"/>
+<img class="diagram" src="/static/images/blog/2010/02/hg-branching-1-after-merge.png" alt="Sample Repository After Merging"/>
 
 Now you're back to having just one head and you can continue working as usual,
 with John's changes and your changes all merged together.
--- a/content/blog/2010/02/my-extravagant-zsh-prompt.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/02/my-extravagant-zsh-prompt.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "My Extravagant Zsh Prompt"
-snip = "It’s big, but my monitor isn’t running out of ink."
-date = 2010-02-01T01:05:00Z
-draft = false
+(
+:title "My Extravagant Zsh Prompt"
+:snip "It’s big, but my monitor isn’t running out of ink."
+:date "2010-02-01T01:05:00Z"
+:draft nil
 
-+++
+)
 
 I spend a lot of time in a Terminal window at a command line. Up until about a
 month ago I was using [bash][] for my shell. I decided to try switching to
@@ -67,12 +67,12 @@
 
 Here's a sample of my current Zsh prompt:
 
-![My Zsh Prompt](/media/images/blog/2010/02/zsh-prompt.png)
+![My Zsh Prompt](/static/images/blog/2010/02/zsh-prompt.png)
 
 And here's a version of that screenshot with some comments added to explain
 things:
 
-![My Zsh Prompt with Comments](/media/images/blog/2010/02/zsh-prompt-comments.png)
+![My Zsh Prompt with Comments](/static/images/blog/2010/02/zsh-prompt-comments.png)
 
 If you want to know *how* I created that prompt, read on!
 
--- a/content/blog/2010/04/a-faster-feed-apart.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/04/a-faster-feed-apart.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "A Faster Feed Apart"
-snip = "Rethinking A Feed Apart’s backend."
-date = 2010-04-30T22:55:00Z
-draft = false
+(
+:title "A Faster Feed Apart"
+:snip "Rethinking A Feed Apart’s backend."
+:date "2010-04-30T22:55:00Z"
+:draft nil
 
-+++
+)
 
 [An Event Apart][aea] is a conference for web developers and designers that
 happens a few times a year in various cities.  [A Feed Apart][afa] is a site
--- a/content/blog/2010/05/mercurial-workflows-stable-default.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/05/mercurial-workflows-stable-default.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Mercurial Workflows: Stable & Default"
-snip = "Part 2 of several."
-date = 2010-05-17T18:27:00Z
-draft = false
+(
+:title "Mercurial Workflows: Stable & Default"
+:snip "Part 2 of several."
+:date "2010-05-17T18:27:00Z"
+:draft nil
 
-+++
+)
 
 This entry is the second in my series describing various Mercurial workflows.
 The [first][branch-as-needed] describes the simplest one: branching only
@@ -80,7 +80,7 @@
 
 Here's an example of how your repository's graph will end up looking:
 
-![Sample Default and Stable Graph](/media/images/blog/2010/05/default-stable-example.png "Sample Default and Stable Graph")
+![Sample Default and Stable Graph](/static/images/blog/2010/05/default-stable-example.png "Sample Default and Stable Graph")
 
 Notice how each time some changes are made on `stable` they're merged to
 `default`.
--- a/content/blog/2010/06/mercurial-workflows-translation-branches.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/06/mercurial-workflows-translation-branches.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Mercurial Workflows: Translation Branches"
-snip = "Uncommon but useful."
-date = 2010-06-11T08:15:00Z
-draft = false
+(
+:title "Mercurial Workflows: Translation Branches"
+:snip "Uncommon but useful."
+:date "2010-06-11T08:15:00Z"
+:draft nil
 
-+++
+)
 
 This entry is the third in my series describing various [Mercurial][] workflows.
 The [first][branch-as-needed] describes the simplest one: branching only when
@@ -79,7 +79,7 @@
 get merged into the translation branches. When a translator has time to
 translate a tip, they commit to their branch.
 
-<img src="/media/images/blog/2010/06/translation-branches.png"
+<img src="/static/images/blog/2010/06/translation-branches.png"
      class="diagram"
      alt="Translation Branching Diagram"/>
 
--- a/content/blog/2010/08/a-git-users-guide-to-mercurial-queues.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/08/a-git-users-guide-to-mercurial-queues.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "A Git User's Guide to Mercurial Queues"
-snip = "MQ is git's index on steroids."
-date = 2010-08-10T21:00:00Z
-draft = false
+(
+:title "A Git User's Guide to Mercurial Queues"
+:snip "MQ is git's index on steroids."
+:date "2010-08-10T21:00:00Z"
+:draft nil
 
-+++
+)
 
 I've been using [Mercurial Queues][MQ] more and more lately. At the last
 Mercurial sprint [Brendan Cully][brendan] said something that made me realize
@@ -42,7 +42,7 @@
 You use `git add` to shove changes from the working directory into the index
 and `git commit` to shove changes from the index into the repository:
 
-<img class="diagram" src="/media/images/blog/2010/08/git-basics.png" alt="Git Basics"/>
+<img class="diagram" src="/static/images/blog/2010/08/git-basics.png" alt="Git Basics"/>
 
 This is a very powerful model because it lets you build your changesets
 piece-by-piece and commit them permanently only when you're ready.
@@ -58,7 +58,7 @@
 You use `hg commit` to shove changes from the working directory into the
 repository:
 
-<img class="diagram" src="/media/images/blog/2010/08/mercurial-basics.png" alt="Mercurial Basics"/>
+<img class="diagram" src="/static/images/blog/2010/08/mercurial-basics.png" alt="Mercurial Basics"/>
 
 This model doesn't give you as much flexibility in creating changesets as
 git's does. You can use the [record extension][record] to get closer, but it's still
@@ -77,7 +77,7 @@
 qrecord`) to put them into the patch. Once you're done with your patch and
 ready for it to become a commit you can run `hg qfinish`:
 
-<img class="diagram" src="/media/images/blog/2010/08/mq-one.png" alt="MQ with One Patch"/>
+<img class="diagram" src="/static/images/blog/2010/08/mq-one.png" alt="MQ with One Patch"/>
 
 This looks a lot like the diagram of how git works, doesn't it?  MQ gives you an
 "intermediate" area to put changes, similar to how git's index works.
@@ -97,7 +97,7 @@
 changes to the interface in another changeset.  You can do this by creating two
 patches with `hg qnew api-changes; hg qnew interface-changes`:
 
-<img class="diagram" src="/media/images/blog/2010/08/mq-two.png" alt="MQ with Two Patches"/>
+<img class="diagram" src="/static/images/blog/2010/08/mq-two.png" alt="MQ with Two Patches"/>
 
 You can move back and forth between these patches with `hg qpop` and `hg
 qpush`. If you're working on the interface and realize you forgot to make
@@ -123,7 +123,7 @@
 can create a separate queue (with its own set of patches) with `hg qqueue -c
 NAME` for each feature:
 
-<img class="diagram" src="/media/images/blog/2010/08/mq-multiple.png" alt="MQ with Multiple Queues"/>
+<img class="diagram" src="/static/images/blog/2010/08/mq-multiple.png" alt="MQ with Multiple Queues"/>
 
 You can switch patch queues with `hg qqueue NAME`.  This gives you multiple
 sets of "intermediate" areas like git's index to work with.  This is probably
@@ -211,7 +211,7 @@
 Versioning patch queues means you can end up with a (hard to read) diagram like
 this:
 
-<img class="diagram" src="/media/images/blog/2010/08/mq-versioned.png" alt="Versioned Queues"/>
+<img class="diagram" src="/static/images/blog/2010/08/mq-versioned.png" alt="Versioned Queues"/>
 
 To facilitate working with versioned patch queues all Mercurial commands come
 with a `--mq` option to apply the command to the queue repository instead of
--- a/content/blog/2010/09/coming-home-to-vim.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/09/coming-home-to-vim.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Coming Home to Vim"
-snip = "I'm sorry I ever left, baby."
-date = 2010-09-20T18:15:00Z
-draft = false
+(
+:title "Coming Home to Vim"
+:snip "I'm sorry I ever left, baby."
+:date "2010-09-20T18:15:00Z"
+:draft nil
 
-+++
+)
 
 I'm a programmer. I work with text files for 6-12 hours every weekday so I care
 about the text editor I use. If switching to a different editor can increase my
@@ -634,7 +634,7 @@
 
 Here's what my current setup looks like:
 
-![Current Vim Setup Screenshot](/media/images/blog/2010/09/vim.png "My Current Vim Setup")
+![Current Vim Setup Screenshot](/static/images/blog/2010/09/vim.png "My Current Vim Setup")
 
 [Menlo]: http://arstechnica.com/apple/news/2009/06/font-changes-coming-to-mac-os-x-snow-leopard.ars
 [myMolokai]: http://bitbucket.org/sjl/dotfiles/src/tip/vim/colors/molokai.vim
@@ -841,7 +841,7 @@
 
 It's easiest to describe what this looks like with a screenshot:
 
-![Rainbow Parentheses Screenshot](/media/images/blog/2010/09/rainbow.png "Rainbow Parentheses")
+![Rainbow Parentheses Screenshot](/static/images/blog/2010/09/rainbow.png "Rainbow Parentheses")
 
 I use [a slightly modified version][myRainbow]. I have it mapped to `<leader>R`
 and off by default.  When I'm dealing with a particularly hairy piece of code
--- a/content/blog/2010/09/making-my-site-sing.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/09/making-my-site-sing.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Making My Site Sing"
-snip = "Designing with music."
-date = 2010-09-08T20:10:00Z
-draft = false
+(
+:title "Making My Site Sing"
+:snip "Designing with music."
+:date "2010-09-08T20:10:00Z"
+:draft nil
 
-+++
+)
 
 Every year or so I get the urge to redesign my site. It's only been seven
 months since the last time, so I guess working with [Nick Sergeant][] and
--- a/content/blog/2010/11/keep-calm-and-carry-on.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2010/11/keep-calm-and-carry-on.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Keep Calm and Carry On"
-snip = "You don't always need to be sexy."
-date = 2010-11-05T16:30:00Z
-draft = false
+(
+:title "Keep Calm and Carry On"
+:snip "You don't always need to be sexy."
+:date "2010-11-05T16:30:00Z"
+:draft nil
 
-+++
+)
 
 I've been dancing quite a bit lately, both going to exchanges and teaching
 blues dancing with [Lady Luck Blues][llb]. I haven't written anything about
--- a/content/blog/2011/05/on-learning-and-teaching.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2011/05/on-learning-and-teaching.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "On Learning and Teaching"
-snip = "Learning one thing isn't enough."
-date = 2011-05-22T17:00:00Z
-draft = false
+(
+:title "On Learning and Teaching"
+:snip "Learning one thing isn't enough."
+:date "2011-05-22T17:00:00Z"
+:draft nil
 
-+++
+)
 
 I recently read a blog entry by [Zack Kurmas][] called "[The deep end of the
 pool][]".  In it he talks about why he thinks some students succeed in introductory
--- a/content/blog/2011/05/paper-free.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2011/05/paper-free.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Going Paper-Free for $220"
-snip = "It feels like the future!"
-date = 2011-05-26T13:44:00Z
-draft = false
+(
+:title "Going Paper-Free for $220"
+:snip "It feels like the future!"
+:date "2011-05-26T13:44:00Z"
+:draft nil
 
-+++
+)
 
 It's 2011. Personal computers have been around and popular for well over a decade
 now, and yet we still have to deal with a huge amount of physical paper.
@@ -138,7 +138,7 @@
 Desktop whose name starts with "Doxie Doc" will be renamed to include the current
 date and time, and then moved to the "Pending OCR" folder.
 
-![Rule 1 Screenshot](/media/images/blog/2011/05/rules-1-doxie.png "Rule 1")
+![Rule 1 Screenshot](/static/images/blog/2011/05/rules-1-doxie.png "Rule 1")
 
 **Note:**: you'll need to click the `date created` bubble and then "Edit Date" to get
 the time as well as the date into the filename.
@@ -149,7 +149,7 @@
 because JotNot already includes the date and time of scans in the filenames by
 default.
 
-![Rule 2 Screenshot](/media/images/blog/2011/05/rules-2-jotnot.png "Rule 2")
+![Rule 2 Screenshot](/static/images/blog/2011/05/rules-2-jotnot.png "Rule 2")
 
 Now that we've got all of our scans going into the same folder (with unique names) we
 can set up a rule to OCR them.  The third rule watches the "Pending OCR" folder for
@@ -158,14 +158,14 @@
 OCR X in non-interactive mode the files will automatically be OCR'ed without any
 intervention from me.
 
-![Rule 3 Screenshot](/media/images/blog/2011/05/rules-3-ocr.png "Rule 3")
+![Rule 3 Screenshot](/static/images/blog/2011/05/rules-3-ocr.png "Rule 3")
 
 The fourth and final rule watches for the OCR'ed copies of our scans and runs
 a script to move the originals to the trash once the searchable versions are ready.
 It doesn't delete the files completely because I want a safety net in case something
 goes wrong.
 
-![Rule 4 Screenshot](/media/images/blog/2011/05/rules-4-clean.png "Rule 4")
+![Rule 4 Screenshot](/static/images/blog/2011/05/rules-4-clean.png "Rule 4")
 
 **Note:** make sure you change the Shell to `/usr/bin/python`.  Here's the text of
 the script so you can copy and paste it:
--- a/content/blog/2011/06/django-advice.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2011/06/django-advice.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Django Advice"
-snip = "Some useful things I've learned."
-date = 2011-06-30T08:30:00Z
-draft = false
+(
+:title "Django Advice"
+:snip "Some useful things I've learned."
+:date "2011-06-30T08:30:00Z"
+:draft nil
 
-+++
+)
 
 For the past year and a half or so I've been working full-time at [Dumbwaiter
 Design][] doing [Django][] development. I've picked up a bunch of useful tricks along
--- a/content/blog/2011/09/writing-vim-plugins.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2011/09/writing-vim-plugins.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Writing Vim Plugins"
-snip = "It's pretty much black magic."
-date = 2011-09-06T09:13:00Z
-draft = false
+(
+:title "Writing Vim Plugins"
+:snip "It's pretty much black magic."
+:date "2011-09-06T09:13:00Z"
+:draft nil
 
-+++
+)
 
 
 A while ago I wrote a [post][vimpost] about switching back to [Vim][].  Since then
--- a/content/blog/2012/04/volatile-software.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/04/volatile-software.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Volatile Software"
-snip = "Our culture is one of pain and suffering."
-date = 2012-04-23T14:00:00Z
-draft = false
+(
+:title "Volatile Software"
+:snip "Our culture is one of pain and suffering."
+:date "2012-04-23T14:00:00Z"
+:draft nil
 
-+++
+)
 
 The following is the text of an email I sent to [The Listserve][], which was
 sent to that list on April 22, 2012.
--- a/content/blog/2012/07/caves-of-clojure-01.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-01.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 1"
-snip = "Getting a Roguelike up and running."
-date = 2012-07-07T17:00:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 1"
+:snip "Getting a Roguelike up and running."
+:date "2012-07-07T17:00:00Z"
+:draft nil
 
-+++
+)
 
 Lately I've had an urge to start playing a few games again, namely [Nethack][]
 and [Dwarf Fortress][] (the latter being triggered by [this book][df-book]).
@@ -152,7 +152,7 @@
 
 Either way, once you run it you get something like this:
 
-![Screenshot](/media/images/blog/2012/07/caves-01-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-01-01.png)
 
 This is the Swing terminal which I happened to start from swank.  Press a key
 and it will go away.
--- a/content/blog/2012/07/caves-of-clojure-02.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-02.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 2"
-snip = "Dealing with state."
-date = 2012-07-08T09:26:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 2"
+:snip "Dealing with state."
+:date "2012-07-08T09:26:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -542,11 +542,11 @@
 
 And here are some screenshots:
 
-![Screenshot](/media/images/blog/2012/07/caves-02-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-02-01.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-02-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-02-02.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-02-03.png)
+![Screenshot](/static/images/blog/2012/07/caves-02-03.png)
 
 It's not a very exciting game yet, but it all works, and I've managed to use an
 immutable data structure of basic maps and records to represent everything
--- a/content/blog/2012/07/caves-of-clojure-03-1.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-03-1.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 3.1"
-snip = "World generation."
-date = 2012-07-09T09:37:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 3.1"
+:snip "World generation."
+:date "2012-07-09T09:37:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -362,11 +362,11 @@
 Now that the `:play` UI knows how to draw itself and process its input, and is
 properly hooked up by the `:start` UI, it's time to give it a shot!
 
-![Screenshot](/media/images/blog/2012/07/caves-03-1-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-1-01.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-03-1-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-1-02.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-03-1-03.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-1-03.png)
 
 Each time we start we get a different random world.  Great!
 
--- a/content/blog/2012/07/caves-of-clojure-03-2.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-03-2.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 3.2"
-snip = "World smoothing."
-date = 2012-07-10T10:04:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 3.2"
+:snip "World smoothing."
+:date "2012-07-10T10:04:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -262,15 +262,15 @@
 Once you fire up the game and press a key to begin, you're presented with the
 white-noise map from the last entry:
 
-![Screenshot](/media/images/blog/2012/07/caves-03-2-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-2-01.png)
 
 But now you can press `s` and the caves will smooth out a bit:
 
-![Screenshot](/media/images/blog/2012/07/caves-03-2-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-2-02.png)
 
 Another press of `s` smooths them further:
 
-![Screenshot](/media/images/blog/2012/07/caves-03-2-03.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-2-03.png)
 
 You can use enter or backspace to win or lose, then any key to go back to the
 start screen and get a new world to play with.
--- a/content/blog/2012/07/caves-of-clojure-03-3.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-03-3.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 3.3"
-snip = "Scrolling."
-date = 2012-07-11T09:25:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 3.3"
+:snip "Scrolling."
+:date "2012-07-11T09:25:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -391,9 +391,9 @@
 That's it!  Running the game, I can now scroll around the map and/or smooth it
 whenever I like:
 
-![Screenshot](/media/images/blog/2012/07/caves-03-3-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-3-01.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-03-3-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-03-3-02.png)
 
 This doesn't look much different in pictures, but I can scroll through the world
 with `hjkl`.  Here's a screencast showing what that looks like:
--- a/content/blog/2012/07/caves-of-clojure-03-4.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-03-4.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 3.4"
-snip = "Refactoring."
-date = 2012-07-11T12:02:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 3.4"
+:snip "Refactoring."
+:date "2012-07-11T12:02:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
--- a/content/blog/2012/07/caves-of-clojure-04.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-04.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 4"
-snip = "A player!"
-date = 2012-07-12T09:42:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 4"
+:snip "A player!"
+:date "2012-07-12T09:42:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -628,11 +628,11 @@
 
 And the obligatory screenshots of our intrepid hero:
 
-![Screenshot](/media/images/blog/2012/07/caves-04-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-04-01.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-04-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-04-02.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-04-03.png)
+![Screenshot](/static/images/blog/2012/07/caves-04-03.png)
 
 Next time I'll be adding some monsters for the hero to slay.
 
--- a/content/blog/2012/07/caves-of-clojure-05.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-05.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 5"
-snip = "Fungus and more."
-date = 2012-07-13T10:55:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 5"
+:snip "Fungus and more."
+:date "2012-07-13T10:55:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -223,7 +223,7 @@
 
 Now the lichens appear on the screen!
 
-![Screenshot](/media/images/blog/2012/07/caves-05-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-05-01.png)
 
 Movement
 --------
@@ -486,9 +486,9 @@
 
 And now some screenshots of our hero cutting a swath through some fungus!
 
-![Screenshot](/media/images/blog/2012/07/caves-05-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-05-02.png)
 
-![Screenshot](/media/images/blog/2012/07/caves-05-03.png)
+![Screenshot](/static/images/blog/2012/07/caves-05-03.png)
 
 I'll be moving on to Trystan's sixth post soon, but before that I'm going to
 have another interlude where I explain some quick refactoring and then work
--- a/content/blog/2012/07/caves-of-clojure-06.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-06.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 6"
-snip = "Real combat and messages."
-date = 2012-07-30T09:50:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 6"
+:snip "Real combat and messages."
+:date "2012-07-30T09:50:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -388,7 +388,7 @@
 I've now got a working combat system, and a messaging system so I can tell
 what's going on:
 
-![Screenshot](/media/images/blog/2012/07/caves-06-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-06-01.png)
 
 It's actually starting to feel like a real game now, instead of just a sandbox
 where you can break things.
--- a/content/blog/2012/07/caves-of-clojure-interlude-1.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/07/caves-of-clojure-interlude-1.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Interlude 1"
-snip = "Black magic."
-date = 2012-07-14T17:06:00Z
-draft = false
+(
+:title "The Caves of Clojure: Interlude 1"
+:snip "Black magic."
+:date "2012-07-14T17:06:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -482,7 +482,7 @@
 
 Finally, let's run the game!
 
-![Screenshot](/media/images/blog/2012/07/caves-interlude-1-01.png)
+![Screenshot](/static/images/blog/2012/07/caves-interlude-1-01.png)
 
 Bunnies!  They're populated into the world and the player can kill them because
 they're `Destructible`.
@@ -547,7 +547,7 @@
 After adding them to the world population, we can see a few wriggling their way
 though the walls in the northeast corner:
 
-![Screenshot](/media/images/blog/2012/07/caves-interlude-1-02.png)
+![Screenshot](/static/images/blog/2012/07/caves-interlude-1-02.png)
 
 Results
 -------
--- a/content/blog/2012/10/a-modern-space-cadet.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/10/a-modern-space-cadet.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "A Modern Space Cadet"
-snip = "Emulating a legendary keyboard."
-date = 2012-10-03T09:55:00Z
-draft = false
+(
+:title "A Modern Space Cadet"
+:snip "Emulating a legendary keyboard."
+:date "2012-10-03T09:55:00Z"
+:draft nil
 
-+++
+)
 
 I spend a lot of my time (easily over 8 hours a day) at a keyboard.  As you
 might have guessed from my previous entries about [Vim][] and [Mutt][] I'm not
@@ -69,7 +69,7 @@
 
 For a long time I used [Apple wireless keyboards][apple-wireless].
 
-![Apple Wireless Keyboard](/media/images/blog/2012/10/kb-apple.jpg)
+![Apple Wireless Keyboard](/static/images/blog/2012/10/kb-apple.jpg)
 
 They're light and compact, but still feel extremely solid thanks to their metal
 construction.
@@ -93,7 +93,7 @@
 
 The first mechanical keyboard I got was the [Das Silent Ultimate][das-silent].
 
-![Das Silent Keyboard](/media/images/blog/2012/10/kb-das.jpg)
+![Das Silent Keyboard](/static/images/blog/2012/10/kb-das.jpg)
 
 (This photo is actually my Das Clicky since I don't have the Silent any more,
 but they're exactly the same externally.)
@@ -119,7 +119,7 @@
 
 The next keyboard I tried was the [Das Clicky Ultimate][das-clicky].
 
-![Das Clicky Keyboard](/media/images/blog/2012/10/kb-das.jpg)
+![Das Clicky Keyboard](/static/images/blog/2012/10/kb-das.jpg)
 
 This is exactly the same as the Das Silent except for the switches, which are
 the "clicky" Cherry Blues.  These feel *way* better to me than the browns.  The
@@ -141,7 +141,7 @@
 The [Happy Hacking Keyboard][hhkb] was my next keyboard.  It's much more
 expensive than the Dases were, so it was a tough call, but I'm glad I got it.
 
-![Happy Hacking Keyboard](/media/images/blog/2012/10/kb-hhkb.jpg)
+![Happy Hacking Keyboard](/static/images/blog/2012/10/kb-hhkb.jpg)
 
 The HHKB uses Topre key switches, which to me feel like Cherry Browns done
 right.  There's no "click" like the Blues, but instead of the mush of the
@@ -181,7 +181,7 @@
 The Topre Realforce 103UB was my next keyboard, and is the one I'm
 still using to this day.
 
-![Topre Realforce Keyboard](/media/images/blog/2012/10/kb-realforce.jpg)
+![Topre Realforce Keyboard](/static/images/blog/2012/10/kb-realforce.jpg)
 
 I believe the model I bought is now discontinued, but it's been replaced by the
 [104UB][topre] which is exactly the same except for an extra key on the right
@@ -234,7 +234,7 @@
 Here's a photo of all the keyboards (along with a 13" Macbook Air) so you can
 see the differences in size.
 
-![Keyboard Size Comparison](/media/images/blog/2012/10/kb-size.jpg)
+![Keyboard Size Comparison](/static/images/blog/2012/10/kb-size.jpg)
 
 Modern Software
 ---------------
@@ -327,7 +327,7 @@
 button in the lower right, selecting the keyboard in the dropdown list (this is
 surprisingly easy to miss), and changing the Capslock setting:
 
-![Changing Capslock to Control in OS X](/media/images/blog/2012/10/kb-caps.png)
+![Changing Capslock to Control in OS X](/static/images/blog/2012/10/kb-caps.png)
 
 Then I've selected the following premade option in KeyRemap4MacBook:
 
@@ -349,7 +349,7 @@
 improvements below) you'll probably want to change the "\[Key Overlaid
 Modifier\] Timeout" setting in the KR4MB preferences:
 
-![Key Overlaid Timeout](/media/images/blog/2012/10/kb-key-overlaid.png)
+![Key Overlaid Timeout](/static/images/blog/2012/10/kb-key-overlaid.png)
 
 This setting controls the maximum length of a keypress that will register as
 "single press".  It's easier to understand with an example.  The default is
@@ -388,7 +388,7 @@
 changed in the previous section).  PCKeyboardHack, however, *can*, so I remapped
 left Control to keycode `80`:
 
-![Remapping Left Control in PCKeyboardHack](/media/images/blog/2012/10/kb-pck.png)
+![Remapping Left Control in PCKeyboardHack](/static/images/blog/2012/10/kb-pck.png)
 
 Keycode `80` is the `F19` key.  My keyboard doesn't have an `F19` key so it
 doesn't conflict with anything.  Now I can simply remap `F19` in KR4MB just like
@@ -467,7 +467,7 @@
 My tmux prefix is `Control-f`, so now pressing `Control-f 1` will go to pane 1,
 and so on.  Then I configured Keyboard Maestro like so:
 
-![Keyboard Maestro IRC Config](/media/images/blog/2012/10/kb-irc.png)
+![Keyboard Maestro IRC Config](/static/images/blog/2012/10/kb-irc.png)
 
 This binds `Control-Shift-Option-Command-i` (which is just `Hyper-i`) to do the
 following:
@@ -688,7 +688,7 @@
 keyboard layout in OS X to the "Unicode Hex Input" layout under System
 Preferences → Language and Text → Input Sources:
 
-![Switching to Unicode Hex Input](/media/images/blog/2012/10/kb-hex.png)
+![Switching to Unicode Hex Input](/static/images/blog/2012/10/kb-hex.png)
 
 As far as I can tell this is exactly like QWERTY except that it also allows you
 to type in Unicode characters directly by holding `Option` and typing in their
--- a/content/blog/2012/10/caves-of-clojure-07-1.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/10/caves-of-clojure-07-1.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Caves of Clojure: Part 7.1"
-snip = "Region mapping."
-date = 2012-10-15T09:50:00Z
-draft = false
+(
+:title "The Caves of Clojure: Part 7.1"
+:snip "Region mapping."
+:date "2012-10-15T09:50:00Z"
+:draft nil
 
-+++
+)
 
 This post is part of an ongoing series.  If you haven't already done so, you
 should probably start at [the beginning][].
@@ -322,9 +322,9 @@
 whether they're getting set correctly.  Here's an example of what it looks like
 when you toggle `:show-regions` with `R`:
 
-![Screenshot without Regions](/media/images/blog/2012/10/caves-07-1-1.png)
+![Screenshot without Regions](/static/images/blog/2012/10/caves-07-1-1.png)
 
-![Screenshot with Regions](/media/images/blog/2012/10/caves-07-1-2.png)
+![Screenshot with Regions](/static/images/blog/2012/10/caves-07-1-2.png)
 
 As you can see, the small, closed off areas have their own numbers, while the
 larger regions sprawl across the map.
--- a/content/blog/2012/10/the-homely-mutt.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/10/the-homely-mutt.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "The Homely Mutt"
-snip = "Sparrow's dead?  Why not try Mutt?"
-date = 2012-10-01T10:30:00Z
-draft = false
+(
+:title "The Homely Mutt"
+:snip "Sparrow's dead?  Why not try Mutt?"
+:date "2012-10-01T10:30:00Z"
+:draft nil
 
-+++
+)
 
 Now that [Sparrow][] is [effectively dead][sparrow-dead] many of its users will
 be looking for a new email client.  If you're not afraid of the terminal you may
@@ -81,7 +81,7 @@
 other things to get the job done.  Here's a bird's eye view of what it'll look
 like when we're done:
 
-![Diagram](/media/images/blog/2012/10/what-the-mutt.png)
+![Diagram](/static/images/blog/2012/10/what-the-mutt.png)
 
 If this diagram doesn't make you run screaming you might just be masochistic
 enough to make it through the initial setup of Mutt.  If you do, you'll be
@@ -379,19 +379,19 @@
 First, you need to add your Gmail password into your OS X keychain.  Open the
 Keychain Access app and press the `+` button:
 
-![Keychain 1](/media/images/blog/2012/10/keychain-1.png)
+![Keychain 1](/static/images/blog/2012/10/keychain-1.png)
 
 Then fill out the form.  The "Keychain Item Name" should be
 `http://imap.gmail.com`.  The "Account Name" should be your email address.  The
 password should be your password:
 
-![Keychain 2](/media/images/blog/2012/10/keychain-2.png)
+![Keychain 2](/static/images/blog/2012/10/keychain-2.png)
 
 Press "Add".  Now repeat the process for the SMTP server.  The "Keychain Item
 Name" should be `smtp://smtp.gmail.com`.  The "Account Name" should be your
 email address.  The password should be your password:
 
-![Keychain 3](/media/images/blog/2012/10/keychain-3.png)
+![Keychain 3](/static/images/blog/2012/10/keychain-3.png)
 
 Now we need to create the `offlineimap.py` file we pointed offlineimap to
 earlier.  It needs to contain the `get_keychain_pass` function, which takes an
@@ -634,7 +634,7 @@
 When viewing a folder, Mutt presents you with a list of your email.  This view
 is called the "index":
 
-![Mutt's Index](/media/images/blog/2012/10/mutt-index.png)
+![Mutt's Index](/static/images/blog/2012/10/mutt-index.png)
 
 This entry isn't meant be a guide to setting up Mutt on OS X.  For a full guide
 on how to *use* Mutt, you can Google around for some tutorials, or just learn as
@@ -738,7 +738,7 @@
 Press `return` in the index to open the selected email.  This view is called the
 pager:
 
-![Mutt's Pager](/media/images/blog/2012/10/mutt-pager.png)
+![Mutt's Pager](/static/images/blog/2012/10/mutt-pager.png)
 
 Like before, let's add a few settings:
 
@@ -788,7 +788,7 @@
 When you're in the pager view reading an email with attachments, you can press
 `v` to view a list of them:
 
-![Attachment List](/media/images/blog/2012/10/mutt-attachments.png)
+![Attachment List](/static/images/blog/2012/10/mutt-attachments.png)
 
 Scroll through the list with `j` and `k` and press `return` to view one.  But
 first we need to tell Mutt how to view things that aren't text!
@@ -855,7 +855,7 @@
 Now when you're reading an email with links in it you can press `Ctrl-u` to open
 urlview.  You'll see a screen like this:
 
-![urlview screen](/media/images/blog/2012/10/mutt-urls.png)
+![urlview screen](/static/images/blog/2012/10/mutt-urls.png)
 
 Navigate with `j`, `k`, `gg`, `G`, or `/` and press `return` when the desired
 link is selected.  That link will be filled in at the bottom of the screen in
@@ -912,7 +912,7 @@
 Once you save the email in your editor and close it, Mutt will present you with
 a menu that looks like this:
 
-![Sending Screen](/media/images/blog/2012/10/mutt-send-1.png)
+![Sending Screen](/static/images/blog/2012/10/mutt-send-1.png)
 
 You can press `e` to go back and edit the mail, `a` to add attachments, and so
 on (the options are listed at the top of the screen).
@@ -1013,7 +1013,7 @@
 Once you've composed a test email and saved it you'll be presented with a screen
 like this (which we saw in the previous section):
 
-![Sending Screen](/media/images/blog/2012/10/mutt-send-1.png)
+![Sending Screen](/static/images/blog/2012/10/mutt-send-1.png)
 
 The keys you need are listed along the top.  Pressing `y` now will invoke msmtp
 and send your email!
@@ -1103,7 +1103,7 @@
 Now when you're filling out an email address field you can type a few characters
 and hit Tab to get a screen like this:
 
-![Contacts](/media/images/blog/2012/10/mutt-contacts-1.png)
+![Contacts](/static/images/blog/2012/10/mutt-contacts-1.png)
 
 You can use `j` and `k` to select an item, press return to complete it.  Press
 `q` if you've changed your mind and want to cancel the completion.  Look at the
--- a/content/blog/2012/10/why-i-two-space.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2012/10/why-i-two-space.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Why I Two-Space"
-snip = "You can pry my extra spaces from my cold, dead hands."
-date = 2012-10-12T10:10:00Z
-draft = false
+(
+:title "Why I Two-Space"
+:snip "You can pry my extra spaces from my cold, dead hands."
+:date "2012-10-12T10:10:00Z"
+:draft nil
 
-+++
+)
 
 If you look at [the source code][source] for this blog, you might notice that
 all my blog posts (written in [Markdown][]) have two spaces after every period.
--- a/content/blog/2013/03/list-out-of-lambda.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2013/03/list-out-of-lambda.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "List Out of Lambda"
-snip = "Down the rabbit hole we go!"
-date = 2013-03-30T14:00:00Z
-draft = false
+(
+:title "List Out of Lambda"
+:snip "Down the rabbit hole we go!"
+:date "2013-03-30T14:00:00Z"
+:draft nil
 
-+++
+)
 
 If you ignore the practical issues of computers like size, weight, cost, heat,
 and so on, what do you *really* need in a programming language?  Let's play
--- a/content/blog/2013/04/git-koans.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2013/04/git-koans.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Git Koans"
-snip = "The path to enlightenment is long and arduous."
-date = 2013-04-08T10:16:00Z
-draft = false
+(
+:title "Git Koans"
+:snip "The path to enlightenment is long and arduous."
+:date "2013-04-08T10:16:00Z"
+:draft nil
 
-+++
+)
 
 Inspired by [Vim Koans][].
 
--- a/content/blog/2013/09/teach-dont-tell.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2013/09/teach-dont-tell.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Teach, Don't Tell"
-snip = "Documentation Matters"
-date = 2013-09-03T10:55:00Z
-draft = false
+(
+:title "Teach, Don't Tell"
+:snip "Documentation Matters"
+:date "2013-09-03T10:55:00Z"
+:draft nil
 
-+++
+)
 
 This post is about writing technical documentation.  More specifically: it's
 about writing documentation for programming languages and libraries.
--- a/content/blog/2015/07/nat-geo-a2540.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/07/nat-geo-a2540.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,15 +1,15 @@
-+++
-title = "Bag Review: National Geographic A2540"
-snip = "A great little shoulder bag for holding a DSLR kit."
-date = 2015-07-24T18:42:00Z
-draft = false
+(
+:title "Bag Review: National Geographic A2540"
+:snip "A great little shoulder bag for holding a DSLR kit."
+:date "2015-07-24T18:42:00Z"
+:draft nil
 
-+++
+)
 
 I posted this review on Imgur and Reddit a few days ago, but figured I would
 blow the dust off my blog and post it here too.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-01.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-01.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-01.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-01.jpg)
 
 I got this bag a few months ago.  I've used it to shoot around town and
 flown/traveled with it a couple times.  At first I wasn't thrilled with it, but
@@ -25,20 +25,20 @@
 [natgeo]: http://www.geographicbags.us/midi-satchel-for-personal-gear
 [amazon]: http://www.amazon.com/dp/B003WE9MGO/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-02.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-02.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-02.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-02.jpg)
 
 I like the branding/styling a lot.  I'm pretty sure Nat Geo licenses the
 branding to Manfrotto to actually make the bags, because when mine came the
 return address on the shipping label was a Manfrotto warehouse.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-03.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-03.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-03.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-03.jpg)
 
 The construction is really nice.  The stitching seems pretty solid, if a bit
 uneven in places, but this is meant to be a working bag, not a piece of art.
 The leather bits seem hearty.  The buckles are okay (not amazing, but good
 enough for the price).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-04.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-04.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-04.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-04.jpg)
 
 Attachment points for the strap are solid.  The strap is not removable,
 unfortunately, but at the price I'd rather have a solid, permanent strap than
@@ -48,22 +48,22 @@
 soon.  It's a little bit thin, so if you load the bag down a lot it can start to
 dig into your shoulder a bit.  Luckily...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-05.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-05.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-05.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-05.jpg)
 
 There's an optional shoulder pad you can buy for the strap.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-06.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-06.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-06.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-06.jpg)
 
 It's got nice thick padding, and velcros around the strap.
 
 (Please excuse the cat hair in all the photos).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-07.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-07.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-07.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-07.jpg)
 
 I use it when I've got more than a couple of pounds in the bag to save my
 shoulders.  When I'm using it as a day pack I take it off.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-08.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-08.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-08.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-08.jpg)
 
 The back handle is great for carrying it if you're wearing a backpack, yanking
 it out of places, etc.
@@ -73,7 +73,7 @@
 stitching on the velcro bit on it is fraying a bit for me.  I don't really care
 because I never use it anyway.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-09.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-09.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-09.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-09.jpg)
 
 There are two small, sleek pockets on the front.  They're not huge, but they'll
 hold something wallet or small notebook-sized.
@@ -86,66 +86,66 @@
 density filters (77mm filters, in their plastic cases, will fit nicely (not
 pictured, sorry, I forgot)).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-10.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-10.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-10.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-10.jpg)
 
 Once you unbuckle the top flap there's still a zipper protecting the contents.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-11.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-11.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-11.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-11.jpg)
 
 The flap has some nicely patterned fabric to break up the brown.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-12.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-12.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-12.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-12.jpg)
 
 The front pouch is good for holding some small stuff.  It's got dividers for
 holding really thin things like pens and notebooks.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-13.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-13.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-13.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-13.jpg)
 
 The inside lining is nice and bright so it's easy to find small things.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-14.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-14.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-14.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-14.jpg)
 
 The bag itself has one big main compartment.  There's one small padded divider
 flap with a velcro bit to hold it down.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-15.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-15.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-15.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-15.jpg)
 
 It doesn't hold very much, but it's enough for a Kindle or small book.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-16.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-16.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-16.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-16.jpg)
 
 The bag also comes with a padded insert included.  It's got the same pattern as
 the other bits of the bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-17.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-17.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-17.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-17.jpg)
 
 There's a thin handle for yanking it out of the bag if you need to.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-18.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-18.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-18.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-18.jpg)
 
 Same golden lining.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-19.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-19.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-19.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-19.jpg)
 
 There's a padded divider inside that divides the insert into roughly 1/3 and 2/3
 sections.  It's got a fold sewn in so you can fold it over a lens to protect the
 top if necessary.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-20.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-20.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-20.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-20.jpg)
 
 That divider can be removed if you want to just use the whole space of the
 insert.  I never do.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-21.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-21.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-21.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-21.jpg)
 
 Nestled inside the main bag.  It looks pretty snug...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-22.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-22.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-22.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-22.jpg)
 
 But it doesn't take up quite all of the bag — there's still room next to it for
 something.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-23.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-23.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-23.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-23.jpg)
 
 That's it for the bag itself.  Let's pack it!
 
@@ -153,7 +153,7 @@
 fit under the seat, and if I put all my camera gear in it I save a ton of
 weight/space in my carry on (I never check bags).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-24.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-24.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-24.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-24.jpg)
 
 I shoot with a Pentax K5 II with a battery grip and L plate.  Unfortunately this
 bag isn't large enough to hold a gripped, L-plated DSLR with a lens attached
@@ -171,7 +171,7 @@
 bag, the Think Tank Retro 10 is a beefy bag that will work.  It's a lot bulkier
 though, so it's best suited for non-flying.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-25.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-25.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-25.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-25.jpg)
 
 Three lenses that cover everything I need right now.  16-50mm, 50-135mm, and
 200mm, all constant f/2.8 and weather sealed like the body.
@@ -183,25 +183,25 @@
 I'll probably ditch the 50-135 and 200 once the 70-200mm comes out for more
 savings.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-26.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-26.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-26.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-26.jpg)
 
 The two big lenses go in the insert, the smaller one goes outside.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-27.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-27.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-27.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-27.jpg)
 
 Close the insert lid.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-28.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-28.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-28.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-28.jpg)
 
 I like to have just a bit of extra padding, so I grab an extra divider from
 another bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-29.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-29.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-29.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-29.jpg)
 
 It lays on top of the end cap of the small zoom, just for some extra cushioning.
 I'm probably just paranoid.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-30.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-30.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-30.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-30.jpg)
 
 I can't fly without headphones or I go insane.  I like keeping them in my
 personal item because it's easier to get them out once you're on the flight
@@ -212,37 +212,37 @@
 a couple of other features that are really nice, so for me they're worth the
 space.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-31.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-31.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-31.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-31.jpg)
 
 I nestle them on top of the small zoom.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-32.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-32.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-32.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-32.jpg)
 
 The body goes on top of the camera insert and big lenses.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-33.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-33.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-33.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-33.jpg)
 
 I tuck the strap (Black Rapid Metro) between the body and headphones.  I could
 store it separately, but I have the carabiner loc-tited shut so it'll never,
 ever come off.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-34.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-34.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-34.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-34.jpg)
 
 Next necessity for flying: Kindle!
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-35.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-35.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-35.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-35.jpg)
 
 I could save a bit of space by ditching the case, but I like it...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-36.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-36.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-36.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-36.jpg)
 
 It fits well behind the divider in the main section.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-37.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-37.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-37.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-37.jpg)
 
 Main section packed!
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-38.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-38.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-38.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-38.jpg)
 
 A few other miscellaneous things.
 
@@ -253,38 +253,38 @@
 mask.  Not quite a good as a dedicated one, but since I'm bringing them
 anyway...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-39.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-39.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-39.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-39.jpg)
 
 This is a pretty tight fit, but it does fit.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-40.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-40.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-40.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-40.jpg)
 
 Front packed!
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-41.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-41.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-41.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-41.jpg)
 
 The straps buckle (barely).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-42.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-42.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-42.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-42.jpg)
 
 The main fabric of the bag seems like it wouldn't be too bad in the rain, but
 I bought a rain cover for a National Geographic backpack, so I figured I'd try
 it on this bag too.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-43.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-43.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-43.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-43.jpg)
 
 It fits.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-44.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-44.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-44.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-44.jpg)
 
 It's a bit loose because it's designed for a backpack, but you can cinch it up
 with the elastic cord and it does the job.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-45.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-45.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-45.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-45.jpg)
 
 It'll fit in the front pocket too.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-46.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-46.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-46.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-46.jpg)
 
 Time for the final verdict.  United's site says a personal item should fit
 within 9" x 10" x 17".
@@ -293,17 +293,17 @@
 
 (Cardboard boxes to prove I'm not cheating.)
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-47.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-47.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-47.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-47.jpg)
 
 About half an inch past 10".  I doubt I'll ever get called out on that
 (especially since we have room to spare in the other dimensions), but it'll
 squish a bit if absolutely necessary.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-48.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-48.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-48.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-48.jpg)
 
 Plenty of room to spare on the wide dimension.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-a2540-49.jpg)](/media/images/blog/2015/07/full/nat-geo-a2540-49.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-a2540-49.jpg)](/static/images/blog/2015/07/full/nat-geo-a2540-49.jpg)
 
 That's it!  Obviously you can mix and match stuff as needed (swap a lens for
 a flash or water bottle, etc).
--- a/content/blog/2015/07/nat-geo-mc5350.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/07/nat-geo-mc5350.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,16 +1,16 @@
-+++
-title = "Bag Review: National Geographic MC5350"
-snip = "Almost perfect weekend travel and DSLR kit bag."
-date = 2015-07-26T13:35:00Z
-draft = false
+(
+:title "Bag Review: National Geographic MC5350"
+:snip "Almost perfect weekend travel and DSLR kit bag."
+:date "2015-07-26T13:35:00Z"
+:draft nil
 
-+++
+)
 
 Since I've got a bit of downtime before I move, the bag reviews will continue.
 Next up is the National Geographic "Medium Backpack" from the Mediterranean line
 (model MG5350).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-01.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-01.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-01.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-01.jpg)
 
 I got this backpack a few months ago from [the Geographic Bags site][natgeo] and
 have been using it a lot.  If it's out of stock there you can find it [on
@@ -27,32 +27,32 @@
 [natgeo]: http://www.geographicbags.us/product/85657.1115885.0.0.0/NG%2BMC%2B5350/_/Medium_Backpack_fo_Personal_gear%2C_Laptop%2C_DSLR%2C_acc.%2C
 [amazon]: http://www.amazon.com/dp/B00VQT8FYM/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-02.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-02.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-02.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-02.jpg)
 
 This line (the Mediterranean series) has a much different look than their
 others.  The branding is straightforward but not over the top.  Once again, I'm
 pretty sure Nat Geo is licensing the name to Manfrotto to actually make the
 bags.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-03.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-03.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-03.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-03.jpg)
 
 The stripes are a nice touch that give it some visual interest without being
 obnoxious.  They remind me of piano keys a bit.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-04.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-04.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-04.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-04.jpg)
 
 The front flap has a pocket for small stuff.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-05.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-05.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-05.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-05.jpg)
 
 The metal zipper pulls are hefty, and have the logo nicely embossed.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-06.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-06.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-06.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-06.jpg)
 
 Some of the zipper pulls are chunky leather.  I'm not sure why some are metal
 and some are leather, but it works.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-07.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-07.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-07.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-07.jpg)
 
 The straps are medium-width, very padded, and not detachable.  There's plenty of
 room for length adjustments if you're a tall person.  Unfortunately there are no
@@ -65,32 +65,32 @@
 
 [lx]: http://www.amazon.com/dp/B00GORMJTI/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-08.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-08.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-08.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-08.jpg)
 
 There's a top handle for yanking it of overhead bins.  Also the thin strip on
 the back can be pulled out a bit to slip over the handle of some roller luggage,
 if you like.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-09.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-09.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-09.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-09.jpg)
 
 Handle stitching is nice and sturdy.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-10.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-10.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-10.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-10.jpg)
 
 There are a couple of rings on the front of the straps for you to clip things
 to.  I like using a small carabiner to clip my [Panasonic LX100][lx] to the
 right one so I can easily take photos when hiking.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-11.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-11.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-11.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-11.jpg)
 
 There's a loop on one of the sides with a small lashing strap.  We'll see it in
 action later (though I don't tend to use it much).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-12.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-12.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-12.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-12.jpg)
 
 The sternum strap is a simple strap with two D-rings as a buckle.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-13.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-13.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-13.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-13.jpg)
 
 It's simple and will never break, but it's a little bit annoying to have to
 thread the strap through instead of just using a plastic clip like many other
@@ -100,71 +100,71 @@
 would bear load, but it would have been nice to have an optional one to just
 secure things a bit better.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-14.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-14.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-14.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-14.jpg)
 
 The buckles on the straps bite nicely into the fabric and don't slip.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-15.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-15.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-15.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-15.jpg)
 
 Once you open it up, you can see the opening cinches closed with a simple cord.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-16.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-16.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-16.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-16.jpg)
 
 Leather bit to keep it closed(ish).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-17.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-17.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-17.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-17.jpg)
 
 Metal to reinforce where the strap holds the fabric.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-18.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-18.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-18.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-18.jpg)
 
 The underside of the flap has the same striped pattern.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-19.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-19.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-19.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-19.jpg)
 
 The bag is divided into two sections of roughly equal size.  The top section has
 a few flaps and pockets for minor organization.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-20.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-20.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-20.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-20.jpg)
 
 Zipper pouch.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-21.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-21.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-21.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-21.jpg)
 
 The flaps don't open very much.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-22.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-22.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-22.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-22.jpg)
 
 Anything you put in the would need to be pretty flat (e.g.: a Kindle).
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-23.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-23.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-23.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-23.jpg)
 
 The side pockets stick out from the body of the bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-24.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-24.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-24.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-24.jpg)
 
 A few example objects for scale.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-25.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-25.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-25.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-25.jpg)
 
 They're about a big as a standard-sized coffee mug.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-26.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-26.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-26.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-26.jpg)
 
 They'll just barely hold a folding set of [Marshall Monitor
 headphones][monitor].
 
 [monitor]: http://www.amazon.com/dp/B00D3ITOHG/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-27.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-27.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-27.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-27.jpg)
 
 They'll hold a water bottle, though if it's tall it can be a bit precarious.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-28.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-28.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-28.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-28.jpg)
 
 They do work well for holding a monopod, in conjunction with the lashing strap.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-29.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-29.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-29.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-29.jpg)
 
 Unfortunately this backpack really can't handle a decent tripod.  It's too tall
 for the side, and there's no attachment rings you could use to lash it to the
@@ -173,43 +173,43 @@
 This is one thing that does bother me about the bag.  A couple of extra D rings
 on the side and bottom would solve the tripod carrying problem.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-30.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-30.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-30.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-30.jpg)
 
 On to the bottom compartment.  This is designed as a DSLR bag, so the bottom is
 padded and has dividers like any typical camera backpack.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-31.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-31.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-31.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-31.jpg)
 
 It comes with two big, fluffy, padded inserts that are velcroed in.
 
 It may have come with a third divider that I removed, but if so it's mixed in
 with all my other spare dividers and I can't remember.  Sorry.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-32.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-32.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-32.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-32.jpg)
 
 The camera dividers are actually Manfrotto-braded.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-33.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-33.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-33.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-33.jpg)
 
 If you're not a photographer (or just aren't bringing a DSLR), the entire camera
 padding bit can come out of the bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-34.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-34.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-34.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-34.jpg)
 
 It's just held in by a few strips of velcro at the bottom (and a lot of
 squishing).  So you can have two separate sections for all your stuff.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-35.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-35.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-35.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-35.jpg)
 
 But wait: once you take out the camera divider there seems to be a zipper...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-36.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-36.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-36.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-36.jpg)
 
 You can unzip the middle divider and turn the bag into one big space, like
 a normal backpack, if you need to carry something big and bulky.  I don't do
 this much, but it's great to have the option!
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-37.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-37.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-37.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-37.jpg)
 
 That's about it for the bag itself.  Let's pack it!
 
@@ -217,38 +217,38 @@
 maximum the bag will hold.  I wouldn't normally take all this on a weekend trip,
 but if you're a packrat this bag will let you cram a surprising amount into it.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-38.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-38.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-38.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-38.jpg)
 
 We'll start with a laptop.  There's a separate section for a laptop right
 against your back.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-39.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-39.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-39.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-39.jpg)
 
 15" Retina Macbook Pro.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-40.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-40.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-40.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-40.jpg)
 
 Fits in the laptop pocket with plenty of room to spare.  Nat Geo says this bag
 will hold a 17" laptop and I believe it.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-41.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-41.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-41.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-41.jpg)
 
 The laptop pocket is nicely padded, but if you want even more protection you
 could use a laptop sleeve as well.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-42.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-42.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-42.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-42.jpg)
 
 Sleeved Macbook will fit.  I generally don't bother — the pocket has enough
 padding for me.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-43.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-43.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-43.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-43.jpg)
 
 Let's load the DSLR.  My full kit is usually a gripped, L-plated Pentax K5 II
 and three lenses: 16-50mm, 50-135mm, and 200mm, all f/2.8 and weather-sealed.
 
 I often leave the 200mm at home to save weight and space.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-44.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-44.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-44.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-44.jpg)
 
 It all fits snugly, with one lens attached to the camera.  I'm really happy with
 this bag because most camera backpacks are either:
@@ -261,13 +261,13 @@
 I really like that this bag lets me carry enough camera for my amateur self, and
 then lets me carry other stuff (clothes, rain gear, etc) in the rest of the bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-45.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-45.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-45.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-45.jpg)
 
 Zips closed nicely.  The top prism of the camera produces a bit of a bump (can't
 really see it in the photos) but it's not a big deal.  If I'm not going to be
 using a tripod or monopod I'll remove the L-plate and the bump goes away.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-46.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-46.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-46.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-46.jpg)
 
 Time for the rest of the bag!  I'll show an example of stuff I'd take on
 a weekend trip (though again: I'll lean towards packing too much to show you the
@@ -276,7 +276,7 @@
 First off: two shirts, two pairs of socks, two pairs of underwear, and hiking
 pants.  Together with the stuff I wear, that's enough for a weekend.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-47.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-47.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-47.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-47.jpg)
 
 I've drank the packing cube Kool-Aid.  I use the [Eagle Creek packing
 cubes][eagle] and they work pretty well.  The smaller two of the set fit well
@@ -284,15 +284,15 @@
 
 [eagle]: http://www.amazon.com/dp/B00F9S85CS/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-48.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-48.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-48.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-48.jpg)
 
 Small cube packed with socks and underwear.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-49.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-49.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-49.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-49.jpg)
 
 Large cube packed with shirts and pants, with a bit of room left over.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-50.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-50.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-50.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-50.jpg)
 
 Add a towel if you're staying in a hostel.  This is the [Extra Large Packtowl
 Original][towel] which has served me well.  I may replace it with their
@@ -300,43 +300,43 @@
 
 [towel]: http://www.amazon.com/dp/B0075JJ29E/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-51.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-51.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-51.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-51.jpg)
 
 Large cube all packed.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-52.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-52.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-52.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-52.jpg)
 
 Large cube in the top section of the bag.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-53.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-53.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-53.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-53.jpg)
 
 Small cube fits to the side nicely.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-54.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-54.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-54.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-54.jpg)
 
 I can't fly without headphones, so they get their own side pocket.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-55.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-55.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-55.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-55.jpg)
 
 Easy access once on the plane.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-56.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-56.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-56.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-56.jpg)
 
 One thing to watch out for: the side pocket zippers have large, sharp metal
 teeth.  I could see them ripping fabric if you're not careful.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-57.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-57.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-57.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-57.jpg)
 
 On a whim I grabbed this [Utility Kit][kit] when I got the bag and it's proved
 to be a handy little organizer.
 
 [kit]: http://www.geographicbags.us/utility-kit-for-media-accessories-or-travel-items
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-58.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-58.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-58.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-58.jpg)
 
 The fabric is thin, but water-resistant.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-59.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-59.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-59.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-59.jpg)
 
 It will accommodate quite a bit.  For this demo:
 
@@ -348,32 +348,32 @@
 * 77mm polarizer
 * Lens cleaning supplies
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-60.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-60.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-60.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-60.jpg)
 
 All packed in.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-61.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-61.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-61.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-61.jpg)
 
 The center section holds a lot.  My friend has fit a travel hair dryer in it.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-62.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-62.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-62.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-62.jpg)
 
 The mesh bags are good for small stuff.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-63.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-63.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-63.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-63.jpg)
 
 Bottom mesh bit.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-64.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-64.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-64.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-64.jpg)
 
 It has a hanger to hang once you're in a hotel room, and also helps hold it
 shut.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-65.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-65.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-65.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-65.jpg)
 
 Fits snugly on top of the large packing cube.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-66.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-66.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-66.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-66.jpg)
 
 Since we've got a rain cover for the backpack, let's add one for ourselves.
 I use a [Marmot PreCip][jacket] for hiking (it will also add some warmth in
@@ -381,53 +381,53 @@
 
 [jacket]: http://www.amazon.com/dp/B00I2ZCXQO/?tag=stelos-20
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-67.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-67.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-67.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-67.jpg)
 
 Rolls up nice and small.  Apparently I'm out of rubber bands in my house, so
 I used the end of an old guitar strap here.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-68.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-68.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-68.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-68.jpg)
 
 It will fit (barely) in the other side pocket.  Again, mind the zipper teeth as
 they feel like they would tear through the thin fabric if you're not careful.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-69.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-69.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-69.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-69.jpg)
 
 Just about fully loaded!
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-70.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-70.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-70.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-70.jpg)
 
 The cord cinches the top of the bag loosely.  It can't close completely though,
 so if you're worried about pickpockets...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-71.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-71.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-71.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-71.jpg)
 
 You can loop the strap up...
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-72.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-72.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-72.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-72.jpg)
 
 And around, to provide a bit of extra protection.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-73.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-73.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-73.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-73.jpg)
 
 Front view.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-74.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-74.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-74.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-74.jpg)
 
 The snap on the front is also one of the things I don't like about the bag.
 It's magnetic so it snaps itself into place (which is nice), but it's very small
 and shallow so it doesn't have a lot of strength.  If you pack the bag really
 full like this you'll find it coming unsnapped from the strain as you walk.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-75.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-75.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-75.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-75.jpg)
 
 A couple of odds and ends for the front pocket.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-76.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-76.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-76.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-76.jpg)
 
 Easy access.  Don't keep anything important in here.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-77.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-77.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-77.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-77.jpg)
 
 Time for the final measurements!  This is definitely too big to quality as
 a "personal item" but will easy make it as a carry on.  United's website says
@@ -436,15 +436,15 @@
 We're at 17" wide, which is a bit over 14".  You probably won't get called on
 it, but if you remove the stuff from the side pockets it collapses down to 13".
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-78.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-78.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-78.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-78.jpg)
 
 Thickness-wise we're at 9.5".  You can save an inch by taking the laptop out.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-79.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-79.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-79.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-79.jpg)
 
 And we're well under the long dimension.
 
-[![Photo](/media/images/blog/2015/07/nat-geo-mc5350-80.jpg)](/media/images/blog/2015/07/full/nat-geo-mc5350-80.jpg)
+[![Photo](/static/images/blog/2015/07/nat-geo-mc5350-80.jpg)](/static/images/blog/2015/07/full/nat-geo-mc5350-80.jpg)
 
 That's it!
 
--- a/content/blog/2015/11/beat-the-data.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/11/beat-the-data.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,11 +1,11 @@
-+++
-title = "Just Beat the Data Out of It"
-snip = "Round two of the Bob Ross Twitch chat analysis."
-date = 2015-11-30T16:10:00Z
-mathjax = true
-draft = false
+(
+:title "Just Beat the Data Out of It"
+:snip "Round two of the Bob Ross Twitch chat analysis."
+:date "2015-11-30T16:10:00Z"
+:mathjax t
+:draft nil
 
-+++
+)
 
 [Last week][last-week] we played around with a transcript of the Bob Ross Twitch
 chat during the Season 2 marathon.  I scraped the chat again last Monday to get
@@ -19,7 +19,7 @@
 
 Was this week busier or quieter than last week?
 
-[![Season 2 and 3 chat volume comparison](/media/images/blog/2015/11/btd-volume-comparison.png)](/media/images/blog/2015/11/btd-volume-comparison-large.png)
+[![Season 2 and 3 chat volume comparison](/static/images/blog/2015/11/btd-volume-comparison.png)](/static/images/blog/2015/11/btd-volume-comparison-large.png)
 
 Note the separate x axes to line up the start and end times of the logs.  Also
 two-minute buckets were used to make things a bit cleaner to look at on this
@@ -35,11 +35,11 @@
 pretty clear patterns.  The end of each episode brings a flood of `gg`, and when
 Bob's son Steve comes on the show we get a big spike in `steve`:
 
-[![Plot of "gg" and "steve" unigrams in Season 2](/media/images/blog/2015/11/btd-s2-ggsteve.png)](/media/images/blog/2015/11/btd-s2-ggsteve-large.png)
+[![Plot of "gg" and "steve" unigrams in Season 2](/static/images/blog/2015/11/btd-s2-ggsteve.png)](/static/images/blog/2015/11/btd-s2-ggsteve-large.png)
 
 It's reasonable to expect the same behavior this week.  What did we get?
 
-[![Plot of "gg" and "steve" unigrams in Season 3](/media/images/blog/2015/11/btd-s3-ggsteve.png)](/media/images/blog/2015/11/btd-s3-ggsteve-large.png)
+[![Plot of "gg" and "steve" unigrams in Season 3](/static/images/blog/2015/11/btd-s3-ggsteve.png)](/static/images/blog/2015/11/btd-s3-ggsteve-large.png)
 
 Looks pretty similar!  In fact the `steve` plot is even more obvious this week.
 And in both cases the second streaming of the season repeats the pattern seen
@@ -55,7 +55,7 @@
 
 The chat was not pleased:
 
-[![The Douche-o-Meter™](/media/images/blog/2015/11/btd-s3-douche.png)](/media/images/blog/2015/11/btd-s3-douche-large.png)
+[![The Douche-o-Meter™](/static/images/blog/2015/11/btd-s3-douche.png)](/static/images/blog/2015/11/btd-s3-douche-large.png)
 
 Thankfully whoever manages Bob's channel mercy-killed the hosting after 10
 minutes or so, and we enjoyed the blissful silence.
@@ -71,7 +71,7 @@
 take a look at them here.  We'll start with a relatively common n-gram like
 "the":
 
-[![Percentile graph of "the" in Season 3](/media/images/blog/2015/11/btd-s3-percentile-the.png)](/media/images/blog/2015/11/btd-s3-percentile-the-large.png)
+[![Percentile graph of "the" in Season 3](/static/images/blog/2015/11/btd-s3-percentile-the.png)](/static/images/blog/2015/11/btd-s3-percentile-the-large.png)
 
 Here we've got a pretty smooth gradation from the lower percentiles up to the
 higher ones.  Note that these are rates of `the` per minute, so the value `11`
@@ -82,24 +82,24 @@
 If we go back to the normal n-gram plot of `the` we can see that it's not a very
 "spiky" word:
 
-[![Plot of "the" unigram in Season 3](/media/images/blog/2015/11/btd-s3-the.png)](/media/images/blog/2015/11/btd-s3-the-large.png)
+[![Plot of "the" unigram in Season 3](/static/images/blog/2015/11/btd-s3-the.png)](/static/images/blog/2015/11/btd-s3-the-large.png)
 
 Let's look at another common word, `bob`:
 
-[![Percentile graph of "bob"](/media/images/blog/2015/11/btd-s3-percentile-bob.png)](/media/images/blog/2015/11/btd-s3-percentile-bob-large.png)
+[![Percentile graph of "bob"](/static/images/blog/2015/11/btd-s3-percentile-bob.png)](/static/images/blog/2015/11/btd-s3-percentile-bob-large.png)
 
 Pretty smooth, though it's a little bit steeper at the end (probably because of
 the deluge of `hi bob` when an episode starts).  N-gram plot for comparison:
 
-[![Plot of "bob" unigram in Season 3](/media/images/blog/2015/11/btd-s3-bob.png)](/media/images/blog/2015/11/btd-s3-bob-large.png)
+[![Plot of "bob" unigram in Season 3](/static/images/blog/2015/11/btd-s3-bob.png)](/static/images/blog/2015/11/btd-s3-bob-large.png)
 
 What about an n-gram we *know* represents a mostly-unique event, like `steve`?
 We would expect the graph of percentiles to look steeper, because the lower and
 middle percentiles would be very low and the highest few would skyrocket.
 
-[![Percentile graph of "steve" in Season 3](/media/images/blog/2015/11/btd-s3-percentile-steve.png)](/media/images/blog/2015/11/btd-s3-percentile-steve-large.png)
+[![Percentile graph of "steve" in Season 3](/static/images/blog/2015/11/btd-s3-percentile-steve.png)](/static/images/blog/2015/11/btd-s3-percentile-steve-large.png)
 
-[![Plot of "steve" unigram in Season 3](/media/images/blog/2015/11/btd-s3-steve.png)](/media/images/blog/2015/11/btd-s3-steve-large.png)
+[![Plot of "steve" unigram in Season 3](/static/images/blog/2015/11/btd-s3-steve.png)](/static/images/blog/2015/11/btd-s3-steve-large.png)
 
 We've tentatively identified another pattern in the data, but how can it help us
 find new interesting terms?
@@ -110,11 +110,11 @@
 
 If we look at the percentiles for a few known-spiky terms we can see a pattern:
 
-[![Percentile graph of "steve" in Season 3](/media/images/blog/2015/11/btd-s3-percentile-steve.png)](/media/images/blog/2015/11/btd-s3-percentile-steve-large.png)
+[![Percentile graph of "steve" in Season 3](/static/images/blog/2015/11/btd-s3-percentile-steve.png)](/static/images/blog/2015/11/btd-s3-percentile-steve-large.png)
 
-[![Percentile graph of "drugs" in Season 3](/media/images/blog/2015/11/btd-s3-percentile-drugs.png)](/media/images/blog/2015/11/btd-s3-percentile-drugs-large.png)
+[![Percentile graph of "drugs" in Season 3](/static/images/blog/2015/11/btd-s3-percentile-drugs.png)](/static/images/blog/2015/11/btd-s3-percentile-drugs-large.png)
 
-[![Percentile graph of "cringe" in Season 3](/media/images/blog/2015/11/btd-s3-percentile-cringe.png)](/media/images/blog/2015/11/btd-s3-percentile-cringe-large.png)
+[![Percentile graph of "cringe" in Season 3](/static/images/blog/2015/11/btd-s3-percentile-cringe.png)](/static/images/blog/2015/11/btd-s3-percentile-cringe-large.png)
 
 The top percentile or two have some volume, but it quickly drops away to
 nothingness within five or ten percent.  So let's try to define a really basic
@@ -161,13 +161,13 @@
 And graph it for all the combinations of percentiles for a couple of words we
 know:
 
-[![Spikiness percentile sensitivity plot for "the"](/media/images/blog/2015/11/btd-ssp-the.png)](/media/images/blog/2015/11/btd-ssp-the-large.png)
+[![Spikiness percentile sensitivity plot for "the"](/static/images/blog/2015/11/btd-ssp-the.png)](/static/images/blog/2015/11/btd-ssp-the-large.png)
 
-[![Spikiness percentile sensitivity plot for "bob"](/media/images/blog/2015/11/btd-ssp-bob.png)](/media/images/blog/2015/11/btd-ssp-bob-large.png)
+[![Spikiness percentile sensitivity plot for "bob"](/static/images/blog/2015/11/btd-ssp-bob.png)](/static/images/blog/2015/11/btd-ssp-bob-large.png)
 
-[![Spikiness percentile sensitivity plot for "steve"](/media/images/blog/2015/11/btd-ssp-steve.png)](/media/images/blog/2015/11/btd-ssp-steve-large.png)
+[![Spikiness percentile sensitivity plot for "steve"](/static/images/blog/2015/11/btd-ssp-steve.png)](/static/images/blog/2015/11/btd-ssp-steve-large.png)
 
-[![Spikiness percentile sensitivity plot for "rip devil"](/media/images/blog/2015/11/btd-ssp-rip__devil.png)](/media/images/blog/2015/11/btd-ssp-rip__devil-large.png)
+[![Spikiness percentile sensitivity plot for "rip devil"](/static/images/blog/2015/11/btd-ssp-rip__devil.png)](/static/images/blog/2015/11/btd-ssp-rip__devil-large.png)
 
 These graphs are approaching the point of being impossible to read, but we can
 definitely see a pattern.  In the first two graphs (common words) the only way
@@ -181,7 +181,7 @@
 Now that we have a hypothesis let's try a couple more plots to see if it still
 holds:
 
-[![Spikiness percentile sensitivity plot for "gg"](/media/images/blog/2015/11/btd-ssp-gg.png)](/media/images/blog/2015/11/btd-ssp-gg-large.png)
+[![Spikiness percentile sensitivity plot for "gg"](/static/images/blog/2015/11/btd-ssp-gg.png)](/static/images/blog/2015/11/btd-ssp-gg-large.png)
 
 `gg` does come in spikes, but it happens so often that we need to select
 a smaller lower percentile if we want it to be considered spiky.  Whether we
@@ -191,9 +191,9 @@
 `ruined` get spammed so much that it's certainly not rare, and isn't even
 particularly spiky in any way:
 
-[![Spikiness percentile sensitivity plot for "ruined"](/media/images/blog/2015/11/btd-ssp-ruined.png)](/media/images/blog/2015/11/btd-ssp-ruined-large.png)
+[![Spikiness percentile sensitivity plot for "ruined"](/static/images/blog/2015/11/btd-ssp-ruined.png)](/static/images/blog/2015/11/btd-ssp-ruined-large.png)
 
-[![Plot of "ruined" unigram in Season 3](/media/images/blog/2015/11/btd-s3-ruined.png)](/media/images/blog/2015/11/btd-s3-ruined-large.png)
+[![Plot of "ruined" unigram in Season 3](/static/images/blog/2015/11/btd-s3-ruined.png)](/static/images/blog/2015/11/btd-s3-ruined-large.png)
 
 So it looks like we're at least on a reasonable track here.  Let's settle the
 100th and 90th for now and see where they lead.
@@ -246,17 +246,17 @@
 We can get similar results for unigrams, trigrams, etc.  Let's graph a couple of
 these highly-spiky terms.  Twitch chat definitely loves innuendo:
 
-[![Plot of vaguely sexual n-grams in Season 3](/media/images/blog/2015/11/btd-s3-innuendo.png)](/media/images/blog/2015/11/btd-s3-innuendo-large.png)
+[![Plot of vaguely sexual n-grams in Season 3](/static/images/blog/2015/11/btd-s3-innuendo.png)](/static/images/blog/2015/11/btd-s3-innuendo-large.png)
 
 Something new this week was the addition of captions, which sometimes included
 things like `(soft music)` and `(mouth noises)`.  The chat liked to poke fun at
 those:
 
-[![Plot of "soft music" and "mouth noises" bigrams in Season 3](/media/images/blog/2015/11/btd-s3-mouthnoises.png)](/media/images/blog/2015/11/btd-s3-mouthnoises-large.png)
+[![Plot of "soft music" and "mouth noises" bigrams in Season 3](/static/images/blog/2015/11/btd-s3-mouthnoises.png)](/static/images/blog/2015/11/btd-s3-mouthnoises-large.png)
 
 We can also see some particular elements of paintings:
 
-[![Plot of subject n-grams in Season 3](/media/images/blog/2015/11/btd-s3-subjects.png)](/media/images/blog/2015/11/btd-s3-subjects-large.png)
+[![Plot of subject n-grams in Season 3](/static/images/blog/2015/11/btd-s3-subjects.png)](/static/images/blog/2015/11/btd-s3-subjects-large.png)
 
 The lists aren't perfect.  They contain a lot of redundant stuff (e.g. `(soft
 music)` produces 3 separate bigrams that are all equally spiky), and there's
--- a/content/blog/2015/11/happy-little-words.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/11/happy-little-words.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Happy Little Words"
-snip = "Analyzing the Bob Ross Twitch chat."
-date = 2015-11-20T18:43:00Z
-draft = false
+(
+:title "Happy Little Words"
+:snip "Analyzing the Bob Ross Twitch chat."
+:date "2015-11-20T18:43:00Z"
+:draft nil
 
-+++
+)
 
 In late October the video game streaming site Twitch.tv [launched "Twitch
 Creative"][twitch-creative], essentially giving people permission to stream
@@ -256,7 +256,7 @@
 What does the overall volume look like?  We'll use minute-wide buckets in the
 x axis to make the graph a bit easier to read.
 
-[![Photo](/media/images/blog/2015/11/hlw-total.png)](/media/images/blog/2015/11/hlw-total-large.png)
+[![Photo](/static/images/blog/2015/11/hlw-total.png)](/static/images/blog/2015/11/hlw-total-large.png)
 
 Can you tell where the two marathons start and end?
 
@@ -266,7 +266,7 @@
 resolution for the events we're looking for.  To make it easier to read we'll
 just look at the first half of the first marathon.
 
-[![Photo](/media/images/blog/2015/11/hlw-higg.png)](/media/images/blog/2015/11/hlw-higg-large.png)
+[![Photo](/static/images/blog/2015/11/hlw-higg.png)](/static/images/blog/2015/11/hlw-higg-large.png)
 
 This works pretty well!  The graph starts with a big spike of "hi bob", then as
 each episode finishes we see a (huge) spike of "gg", followed immediately by
@@ -274,7 +274,7 @@
 
 Can we find all the times Bob cleaned his brush?
 
-[![Photo](/media/images/blog/2015/11/hlw-ripdevil.png)](/media/images/blog/2015/11/hlw-ripdevil-large.png)
+[![Photo](/static/images/blog/2015/11/hlw-ripdevil.png)](/static/images/blog/2015/11/hlw-ripdevil-large.png)
 
 Looks like the devil isn't having a very good time.  It's encouraging that the
 two seasons have roughly the same structure (three main clusters of peaks).
@@ -287,7 +287,7 @@
 When did Bob get the most love?  We'll use 5-minute x bins here because we just
 want a general idea.
 
-[![Photo](/media/images/blog/2015/11/hlw-love.png)](/media/images/blog/2015/11/hlw-love-large.png)
+[![Photo](/static/images/blog/2015/11/hlw-love.png)](/static/images/blog/2015/11/hlw-love-large.png)
 
 Lots of love all around, but especially as he signed off at the end.
 
@@ -295,7 +295,7 @@
 in mid **stream**" and the chat started spamming conspiracy theories about how
 he somehow knew about the stream 30 years in the past:
 
-[![Photo](/media/images/blog/2015/11/hlw-heknew.png)](/media/images/blog/2015/11/hlw-heknew-large.png)
+[![Photo](/static/images/blog/2015/11/hlw-heknew.png)](/static/images/blog/2015/11/hlw-heknew-large.png)
 
 [aq]: https://en.wikipedia.org/wiki/Anscombe%27s_quartet
 [gnuplot]: http://www.gnuplot.info/
--- a/content/blog/2015/12/ludum-dare-34.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/12/ludum-dare-34.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Ludum Dare 34 Postmortem"
-snip = 'I made a "game"!'
-date = 2015-12-15T16:30:00Z
-draft = false
+(
+:title "Ludum Dare 34 Postmortem"
+:snip "I made a \"game\"!"
+:date "2015-12-15T16:30:00Z"
+:draft nil
 
-+++
+)
 
 This past weekend was [Ludum Dare 34][].  Ludum Dare is a thrice-a-year event
 where a theme is chosen and people have 48 hours (for the competition) or 72
@@ -60,7 +60,7 @@
 population of four hundred and one creatures.  Time ticks by at a few ticks per
 second.
 
-[![Silt Initial World](/media/images/blog/2015/12/silt-initial.gif)](/media/images/blog/2015/12/silt-initial.gif)
+[![Silt Initial World](/static/images/blog/2015/12/silt-initial.gif)](/static/images/blog/2015/12/silt-initial.gif)
 
 The creatures need energy to survive.  They can get energy by eating fruit from
 shrubs or being near water.
@@ -98,7 +98,7 @@
 "gangs" of creatures with similar characteristics, all descended from a single
 parent.
 
-[![Silt Later World](/media/images/blog/2015/12/silt-later.gif)](/media/images/blog/2015/12/silt-later.gif)
+[![Silt Later World](/static/images/blog/2015/12/silt-later.gif)](/static/images/blog/2015/12/silt-later.gif)
 
 Finally, there are eight mysterious objects scattered throughout the landscape.
 Each one does something, but discovering exactly *what* will be difficult
--- a/content/blog/2015/12/permutation-patterns.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2015/12/permutation-patterns.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,11 +1,11 @@
-+++
-title = "What the Hell are Permutation Patterns?"
-snip = "A short introduction."
-date = 2015-12-10T19:55:00Z
-draft = false
-mathjax = true
+(
+:title "What the Hell are Permutation Patterns?"
+:snip "A short introduction."
+:date "2015-12-10T19:55:00Z"
+:draft nil
+:mathjax t
 
-+++
+)
 
 I'm currently in the Mathematical Programming class at Reykjavík University and
 we're working with permutations and patterns.  They're really simple to
--- a/content/blog/2016/02/midpoint-displacement.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/02/midpoint-displacement.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,16 +1,16 @@
-+++
-title = "Terrain Generation with Midpoint Displacement"
-snip = "A first step toward growing worlds with computers."
-date = 2016-02-19T19:45:00Z
-mathjax = true
-draft = false
+(
+:title "Terrain Generation with Midpoint Displacement"
+:snip "A first step toward growing worlds with computers."
+:date "2016-02-19T19:45:00Z"
+:mathjax t
+:draft nil
 
-+++
+)
 
-<script defer src="/media/js/jquery.js" type="text/javascript"></script>
-<script defer src="/media/js/three.min.js"></script>
-<script defer src="/media/js/TrackballControls.js"></script>
-<script defer src="/media/js/terrain1.js"></script>
+<script defer src="/static/js/terrain/jquery.js" type="text/javascript"></script>
+<script defer src="/static/js/terrain/three.min.js"></script>
+<script defer src="/static/js/terrain/TrackballControls.js"></script>
+<script defer src="/static/js/terrain/terrain1.js"></script>
 
 I'm taking the Game Engine Architecture class at Reykjavík University.  My group
 just finished our midterm [project][] where we played around with procedural
@@ -79,7 +79,7 @@
 [pcgw-midpoint]: http://pcg.wikidot.com/pcg-algorithm:midpoint-displacement-algorithm
 [paper]: http://micsymposium.org/mics_2011_proceedings/mics2011_submission_30.pdf
 [owl]: https://i.imgur.com/RadSf.jpg
-[code]: https://bitbucket.org/sjl/stevelosh/src/default/media/js/terrain1.wisp
+[code]: https://bitbucket.org/sjl/stevelosh/src/default/static/js/terrain1.wisp
 
 ### Wisp
 
--- a/content/blog/2016/03/recursive-midpoint-displacement.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/03/recursive-midpoint-displacement.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,16 +1,15 @@
-+++
-title = "Recursive Midpoint Displacement"
-snip = "A cleaner version."
-date = 2016-03-07T13:45:00Z
-draft = false
+(
+:title "Recursive Midpoint Displacement"
+:snip "A cleaner version."
+:date "2016-03-07T13:45:00Z"
+:draft nil
 
-+++
+)
 
-<script defer src="/media/js/jquery.js" type="text/javascript"></script>
-<script defer src="/media/js/three.min.js"></script>
-<script defer src="/media/js/TrackballControls.js"></script>
-
-<script defer src="/media/js/terrain2.js"></script>
+<script defer src="/static/js/terrain/jquery.js" type="text/javascript"></script>
+<script defer src="/static/js/terrain/three.min.js"></script>
+<script defer src="/static/js/terrain/TrackballControls.js"></script>
+<script defer src="/static/js/terrain/terrain2.js"></script>
 
 In the [last post][mpd] we looked at implementing the Midpoint Displacement
 algorithm.  I ended up doing the last step iteratively, which works, but isn't
--- a/content/blog/2016/06/diamond-square.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/06/diamond-square.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,15 +1,15 @@
-+++
-title = "Terrain Generation with Diamond Square"
-snip = "Improving on Midpoint Displacement."
-date = 2016-06-27T13:35:00Z
-draft = false
+(
+:title "Terrain Generation with Diamond Square"
+:snip "Improving on Midpoint Displacement."
+:date "2016-06-27T13:35:00Z"
+:draft nil
 
-+++
+)
 
-<script defer src="/media/js/jquery.js" type="text/javascript"></script>
-<script defer src="/media/js/three.min.js"></script>
-<script defer src="/media/js/TrackballControls.js"></script>
-<script defer src="/media/js/terrain3.js"></script>
+<script defer src="/static/js/terrain/jquery.js" type="text/javascript"></script>
+<script defer src="/static/js/terrain/three.min.js"></script>
+<script defer src="/static/js/terrain/TrackballControls.js"></script>
+<script defer src="/static/js/terrain/terrain3.js"></script>
 
 In the last two posts we looked at implementing the Midpoint Displacement
 algorithm for procedurally generating terrain.  Today we're going to look at
--- a/content/blog/2016/06/symbolic-computation.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/06/symbolic-computation.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "What the Hell is Symbolic Computation?"
-snip = "Symbols, REPLs, and Quoting — Oh My!"
-date = 2016-06-29T13:30:00Z
-draft = false
+(
+:title "What the Hell is Symbolic Computation?"
+:snip "Symbols, REPLs, and Quoting — Oh My!"
+:date "2016-06-29T13:30:00Z"
+:draft nil
 
-+++
+)
 
 I've been reading a lot of Lisp books lately, some more advanced than others.
 All of the introductory books I've seen cover the idea of symbolic computation,
--- a/content/blog/2016/08/lisp-jam-postmortem.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/08/lisp-jam-postmortem.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,11 +1,11 @@
-+++
-title = "August 2016 Lisp Game Jam Postmortem"
-snip = "Porting a game from Clojure to Common Lisp."
-date = 2016-08-15T13:45:00Z
-mathjax = true
-draft = false
+(
+:title "August 2016 Lisp Game Jam Postmortem"
+:snip "Porting a game from Clojure to Common Lisp."
+:date "2016-08-15T13:45:00Z"
+:mathjax t
+:draft nil
 
-+++
+)
 
 The [August 2016 Lisp Game Jam][] just wrapped up at the end of last week.
 I had some free time so I decided to take part, but I did something a bit
@@ -203,13 +203,13 @@
 much time on terrain.  I just created an empty world and scattered some lakes
 around it, which looked like this:
 
-[![Screenshot of terrain in the original game](/media/images/blog/2016/08/silt1-terrain.png)](/media/images/blog/2016/08/silt1-terrain.png)
+[![Screenshot of terrain in the original game](/static/images/blog/2016/08/silt1-terrain.png)](/static/images/blog/2016/08/silt1-terrain.png)
 
 This worked and was quick, but is pretty boring and ugly.  In the past few
 months I've learned a lot more about terrain generation, so I fleshed things out
 a bit more for the new port:
 
-[![Screenshot of terrain in the new version](/media/images/blog/2016/08/silt2-terrain.png)](/media/images/blog/2016/08/silt2-terrain.png)
+[![Screenshot of terrain in the new version](/static/images/blog/2016/08/silt2-terrain.png)](/static/images/blog/2016/08/silt2-terrain.png)
 
 Now I've got oceans and mountains for the creatures to explore.
 
@@ -270,7 +270,7 @@
 happens to be large and positive and the jitter on the other side happens to be
 large and negative, you'll get a jarring "cliff" when you try to tile them:
 
-[![Example of poorly-tiling diamond square](/media/images/blog/2016/08/bad-tiling-ds.png)](/media/images/blog/2016/08/bad-tiling-ds.png)
+[![Example of poorly-tiling diamond square](/static/images/blog/2016/08/bad-tiling-ds.png)](/static/images/blog/2016/08/bad-tiling-ds.png)
 
 The solution I came up with is to reduce the size of the heightmap by 1.
 Instead of the heightmap being \\(2^n + 1\\) in each dimension we can make it
@@ -297,7 +297,7 @@
 
 It's a simple change, but the result is *much* nicer:
 
-[![Example of nicely-tiling diamond square](/media/images/blog/2016/08/good-tiling-ds.png)](/media/images/blog/2016/08/good-tiling-ds.png)
+[![Example of nicely-tiling diamond square](/static/images/blog/2016/08/good-tiling-ds.png)](/static/images/blog/2016/08/good-tiling-ds.png)
 
 [Perlin Noise]: https://en.wikipedia.org/wiki/Perlin_noise
 [Simplex Noise]: https://en.wikipedia.org/wiki/Simplex_noise
@@ -479,7 +479,7 @@
 using `(find-if #'visible? (coords-lookup wx wy))` to find the first visible
 thing and then drawing it:
 
-[![Screenshot of entities with the visible aspect](/media/images/blog/2016/08/aspect-visible.png)](/media/images/blog/2016/08/aspect-visible.png)
+[![Screenshot of entities with the visible aspect](/static/images/blog/2016/08/aspect-visible.png)](/static/images/blog/2016/08/aspect-visible.png)
 
 I used `find-if` instead of `remove-if-not` because we can only draw one
 character to a given position in the terminal anyway, so I just pick the first
@@ -528,7 +528,7 @@
 
 Which looks like this:
 
-[![Screenshot of flavor text](/media/images/blog/2016/08/aspect-flavor.png)](/media/images/blog/2016/08/aspect-flavor.png)
+[![Screenshot of flavor text](/static/images/blog/2016/08/aspect-flavor.png)](/static/images/blog/2016/08/aspect-flavor.png)
 
 Of course the flavor text doesn't have to be a constant:
 
@@ -556,7 +556,7 @@
 main game UI.  The original Clojure game just dumped the entire object to the
 screen:
 
-[![Screenshot of creature inspection in the original game](/media/images/blog/2016/08/silt1-inspect.png)](/media/images/blog/2016/08/silt1-inspect.png)
+[![Screenshot of creature inspection in the original game](/static/images/blog/2016/08/silt1-inspect.png)](/static/images/blog/2016/08/silt1-inspect.png)
 
 But this time I wanted a bit more control.  The `inspectable` aspect has a list
 of things that should be displayed.  These can be symbols (which denote CLOS
@@ -629,7 +629,7 @@
 This is pretty ugly because I wanted to justify and indent things nicely, but
 the result looks much nicer than the original game:
 
-[![Screenshot of creature inspection in the new version](/media/images/blog/2016/08/silt2-inspect.png)](/media/images/blog/2016/08/silt2-inspect.png)
+[![Screenshot of creature inspection in the new version](/static/images/blog/2016/08/silt2-inspect.png)](/static/images/blog/2016/08/silt2-inspect.png)
 
 ### Food
 
@@ -815,7 +815,7 @@
 They're not *really* syllables but they're okay for just a couple of lines of
 code and a few minutes work:
 
-[![Screenshot of creature names](/media/images/blog/2016/08/silt-names.png)](/media/images/blog/2016/08/silt-names.png)
+[![Screenshot of creature names](/static/images/blog/2016/08/silt-names.png)](/static/images/blog/2016/08/silt-names.png)
 
 [namegen]: http://www.roguebasin.com/index.php?title=Syllable-based_name_generation
 
--- a/content/blog/2016/08/playing-with-syntax.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/08/playing-with-syntax.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Playing With Syntax"
-snip = "Lisp lets you evolve your language."
-date = 2016-08-19T13:15:00Z
-draft = false
+(
+:title "Playing With Syntax"
+:snip "Lisp lets you evolve your language."
+:date "2016-08-19T13:15:00Z"
+:draft nil
 
-+++
+)
 
 One of the things I love about Lisp is that it gives you the ability to change
 and mold the syntax of the language to what you need.  In this post I want to
--- a/content/blog/2016/09/iterate-averaging.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/09/iterate-averaging.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Customizing Common Lisp's Iterate: Averaging"
-snip = "Don't loop, iterate!"
-date = 2016-09-20T13:45:00Z
-draft = false
+(
+:title "Customizing Common Lisp's Iterate: Averaging"
+:snip "Don't loop, iterate!"
+:date "2016-09-20T13:45:00Z"
+:draft nil
 
-+++
+)
 
 When I first started learning Common Lisp, one of the things I learned was the
 [loop macro][loop].  `loop` is powerful, but it's not extensible and [some
@@ -30,7 +30,7 @@
 
 [loop]: http://www.gigamonkeys.com/book/loop-for-black-belts.html
 [iterate]: https://common-lisp.net/project/iterate/
-[lol]: /media/images/blog/2016/09/loop-macro.jpg
+[lol]: /static/images/blog/2016/09/loop-macro.jpg
 
 <div id="toc"></div>
 
--- a/content/blog/2016/10/iterate-timing.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/10/iterate-timing.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Customizing Common Lisp's Iterate: Timing"
-snip = "How long is this loop?"
-date = 2016-10-10T14:50:00Z
-draft = false
+(
+:title "Customizing Common Lisp's Iterate: Timing"
+:snip "How long is this loop?"
+:date "2016-10-10T14:50:00Z"
+:draft nil
 
-+++
+)
 
 This entry is the second in a series about customizing Common Lisp's [iterate][]
 library.  The full series:
--- a/content/blog/2016/12/chip8-cpu.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/12/chip8-cpu.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: The CPU"
-snip = "Let's write an emulator."
-date = 2016-12-19T17:45:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: The CPU"
+:snip "Let's write an emulator."
+:date "2016-12-19T17:45:00Z"
+:draft nil
 
-+++
+)
 
 A while back I decided to try to write a Game Boy emulator in Common Lisp based
 on [this series of articles][imran].  I made some good progress but eventually
--- a/content/blog/2016/12/chip8-graphics.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/12/chip8-graphics.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Graphics"
-snip = "Let's draw some pixels."
-date = 2016-12-21T16:55:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Graphics"
+:snip "Let's draw some pixels."
+:date "2016-12-21T16:55:00Z"
+:draft nil
 
-+++
+)
 
 In the previous post we looked at how to emulate a [CHIP-8][] CPU with Common
 Lisp.  But a CPU alone isn't much fun to play, so in this post we'll add
@@ -629,7 +629,7 @@
 
 And with all that done we've *finally* got a screen to play games on!
 
-[![Screenshot of CHIP-8 screen running UFO.rom](/media/images/blog/2016/12/chip8-screen.png)](/media/images/blog/2016/12/chip8-screen.png)
+[![Screenshot of CHIP-8 screen running UFO.rom](/static/images/blog/2016/12/chip8-screen.png)](/static/images/blog/2016/12/chip8-screen.png)
 
 ## Future
 
--- a/content/blog/2016/12/chip8-input.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/12/chip8-input.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Input"
-snip = "Let's add a keypad."
-date = 2016-12-23T16:00:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Input"
+:snip "Let's add a keypad."
+:date "2016-12-23T16:00:00Z"
+:draft nil
 
-+++
+)
 
 In the previous posts we looked at how to emulate a [CHIP-8][] CPU with Common
 Lisp, and added a screen to see the results.  This is enough for graphical demos
--- a/content/blog/2016/12/chip8-sound.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2016/12/chip8-sound.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Sound"
-snip = "Let's add a buzzer."
-date = 2016-12-26T17:30:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Sound"
+:snip "Let's add a buzzer."
+:date "2016-12-26T17:30:00Z"
+:draft nil
 
-+++
+)
 
 In the previous posts we looked at how to emulate a [CHIP-8][] CPU with Common
 Lisp, added a screen to see the results, and added user input so we could play
@@ -177,7 +177,7 @@
 For our purposes we'll think of "sound" as a pressure value over time.  For
 example, a simple sound wave might look something like this:
 
-[![Graph of a basic sound wave](/media/images/blog/2016/12/chip8-sound-basic.png)](/media/images/blog/2016/12/chip8-sound-basic.png)
+[![Graph of a basic sound wave](/static/images/blog/2016/12/chip8-sound-basic.png)](/static/images/blog/2016/12/chip8-sound-basic.png)
 
 The pressure starts at 0, gradually climbs until it hits 1, then falls and
 gradually hits -1, then returns to 0 and starts the process over again.
@@ -203,7 +203,7 @@
 can convert time to an appropriate angle value later, so let's not get hung up
 on that.  Sine performs one complete "wave" in exactly [τ][tau] radians:
 
-[![Graph of a basic sine wave](/media/images/blog/2016/12/chip8-sound-sine.png)](/media/images/blog/2016/12/chip8-sound-sine.png)
+[![Graph of a basic sine wave](/static/images/blog/2016/12/chip8-sound-sine.png)](/static/images/blog/2016/12/chip8-sound-sine.png)
 
 Common Lisp has this built in as the `sin` function, so we don't have any work
 to do for this one.
@@ -218,7 +218,7 @@
 between -1 and 1 over time like sine, it stays at 1 for half its wave then
 immediately jumps straight to -1:
 
-[![Graph of a basic square wave](/media/images/blog/2016/12/chip8-sound-square.png)](/media/images/blog/2016/12/chip8-sound-square.png)
+[![Graph of a basic square wave](/static/images/blog/2016/12/chip8-sound-square.png)](/static/images/blog/2016/12/chip8-sound-square.png)
 
 This "jump" gives the square wave kind of a "buzzy" character that you may have
 heard before if you've played many old computer games (or like to listen to
@@ -254,7 +254,7 @@
 The implementation is pretty simple.  We just have to make sure to `mod` the
 angle by τ to make the results repeat properly, like this:
 
-[![Graph of several square waves](/media/images/blog/2016/12/chip8-sound-square-repeat.png)](/media/images/blog/2016/12/chip8-sound-square-repeat.png)
+[![Graph of several square waves](/static/images/blog/2016/12/chip8-sound-square-repeat.png)](/static/images/blog/2016/12/chip8-sound-square-repeat.png)
 
 [square wave]: https://en.wikipedia.org/wiki/Square_wave
 
@@ -263,11 +263,11 @@
 The [sawtooth wave][] is next up in our little menagerie of waveforms.  The name
 comes from what it looks like when you have a few in a row:
 
-[![Graph of several sawtooth waves](/media/images/blog/2016/12/chip8-sound-saw-repeat.png)](/media/images/blog/2016/12/chip8-sound-saw-repeat.png)
+[![Graph of several sawtooth waves](/static/images/blog/2016/12/chip8-sound-saw-repeat.png)](/static/images/blog/2016/12/chip8-sound-saw-repeat.png)
 
 A single wave of it looks like this:
 
-[![Graph of a basic sawtooth wave](/media/images/blog/2016/12/chip8-sound-saw.png)](/media/images/blog/2016/12/chip8-sound-saw.png)
+[![Graph of a basic sawtooth wave](/static/images/blog/2016/12/chip8-sound-saw.png)](/static/images/blog/2016/12/chip8-sound-saw.png)
 
 Sawtooth waves still have a bit of a "buzzy" feel to them because of the jump
 halfway through their period, but unlike square waves they have *some* gradual
@@ -325,7 +325,7 @@
 Let's look at one more kind of wave before moving on: the [triangle wave][].  As
 you might expect, this wave looks like a big triangle:
 
-[![Graph of a basic triangle wave](/media/images/blog/2016/12/chip8-sound-tri.png)](/media/images/blog/2016/12/chip8-sound-tri.png)
+[![Graph of a basic triangle wave](/static/images/blog/2016/12/chip8-sound-tri.png)](/static/images/blog/2016/12/chip8-sound-tri.png)
 
 Triangle waves are closer to sine waves than square or sawtooth waves were, but
 they've still got a bit of "sharpness" to them because they don't have that
@@ -377,11 +377,11 @@
 rate][]".  If the sampling rate is too low, we won't be able to tell much about
 the original wave, and playing it would sound like noise:
 
-[![Graph of a sparse sampling](/media/images/blog/2016/12/chip8-sound-sample-sparse.png)](/media/images/blog/2016/12/chip8-sound-sample-sparse.png)
+[![Graph of a sparse sampling](/static/images/blog/2016/12/chip8-sound-sample-sparse.png)](/static/images/blog/2016/12/chip8-sound-sample-sparse.png)
 
 But a higher sample rate can get us nice and close to the original wave:
 
-[![Graph of a dense sampling](/media/images/blog/2016/12/chip8-sound-sample-dense.png)](/media/images/blog/2016/12/chip8-sound-sample-dense.png)
+[![Graph of a dense sampling](/static/images/blog/2016/12/chip8-sound-sample-dense.png)](/static/images/blog/2016/12/chip8-sound-sample-dense.png)
 
 We'll stick with the most common sample rate, 44.1khz, because it's the most
 widely supported (even though it's overkill for our simple waves):
@@ -442,7 +442,7 @@
 wave).  If we *did* we'd only ever be sending the first chunk of our wave, and
 we'd end up with something like:
 
-[![Graph of a shitty buffer filling strategy](/media/images/blog/2016/12/chip8-sound-borked.png)](/media/images/blog/2016/12/chip8-sound-borked.png)
+[![Graph of a shitty buffer filling strategy](/static/images/blog/2016/12/chip8-sound-borked.png)](/static/images/blog/2016/12/chip8-sound-borked.png)
 
 This is obviously not what we want.  The solution is to return the angle we
 ended at from `fill-buffer`, and then pass it in as `start` on the next round so
--- a/content/blog/2017/01/chip8-debugging-infrastructure.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2017/01/chip8-debugging-infrastructure.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Debugging Infrastructure"
-snip = "What's happening inside this computer?"
-date = 2017-01-05T16:40:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Debugging Infrastructure"
+:snip "What's happening inside this computer?"
+:date "2017-01-05T16:40:00Z"
+:draft nil
 
-+++
+)
 
 Our [CHIP-8][] emulator in Common Lisp is coming along nicely.  It can play
 games, and in the last post we added a disassembler so we can dump the code of
@@ -374,7 +374,7 @@
 instruction (the one about to be executed) dumped to the console.  We can press
 `F7` to step one instruction at a time and they'll each be dumped in turn:
 
-[![Screenshot of CHIP-8 stepping](/media/images/blog/2017/01/chip8-step.png)](/media/images/blog/2017/01/chip8-step.png)
+[![Screenshot of CHIP-8 stepping](/static/images/blog/2017/01/chip8-step.png)](/static/images/blog/2017/01/chip8-step.png)
 
 ## Breakpoints
 
--- a/content/blog/2017/01/chip8-disassembly.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2017/01/chip8-disassembly.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Disassembly"
-snip = "What's in a ROM?"
-date = 2017-01-02T17:15:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Disassembly"
+:snip "What's in a ROM?"
+:date "2017-01-02T17:15:00Z"
+:draft nil
 
-+++
+)
 
 In the previous posts we looked at how to emulate a [CHIP-8][] CPU with Common
 Lisp.  After adding a screen, input, and sound the core of the emulator is
--- a/content/blog/2017/01/chip8-menus.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2017/01/chip8-menus.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "CHIP-8 in Common Lisp: Menus"
-snip = "Let's add some polish."
-date = 2017-01-10T16:20:00Z
-draft = false
+(
+:title "CHIP-8 in Common Lisp: Menus"
+:snip "Let's add some polish."
+:date "2017-01-10T16:20:00Z"
+:draft nil
 
-+++
+)
 
 Our [CHIP-8][] emulator in Common Lisp is almost complete.  It can play
 games, and we've got a rudimentary debugging system in place so we can figure
@@ -238,7 +238,7 @@
 file, in case they have a ROM with a filename we haven't anticipated.  The
 result looks like this:
 
-[![Screenshot of the file selection dialog](/media/images/blog/2017/01/chip8-file-select.png)](/media/images/blog/2017/01/chip8-file-select.png)
+[![Screenshot of the file selection dialog](/static/images/blog/2017/01/chip8-file-select.png)](/static/images/blog/2017/01/chip8-file-select.png)
 
 Note that if the user cancels out of the file selection dialog Qt will return an
 empty string.  We'll check for that and return a more Lispy `nil` from the
@@ -270,7 +270,7 @@
 ```
 Now we've got a simple little menu for turning screen wrapping off and on:
 
-[![Screenshot of the display menu](/media/images/blog/2017/01/chip8-display.png)](/media/images/blog/2017/01/chip8-display.png)
+[![Screenshot of the display menu](/static/images/blog/2017/01/chip8-display.png)](/static/images/blog/2017/01/chip8-display.png)
 
 You might also want to reset the emulator automatically whenever this option is
 changed, because toggle screen wrapping as the emulator is running can
@@ -312,7 +312,7 @@
 
 And with that we've got a basic menu system for the emulator:
 
-[![Screenshot of the full menu](/media/images/blog/2017/01/chip8-menu.png)](/media/images/blog/2017/01/chip8-menu.png)
+[![Screenshot of the full menu](/static/images/blog/2017/01/chip8-menu.png)](/static/images/blog/2017/01/chip8-menu.png)
 
 ## Future
 
--- a/content/blog/2018/05/fun-with-macros-gathering.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2018/05/fun-with-macros-gathering.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,10 @@
-+++
-title = "Fun with Macros: Gathering"
-snip = "Part 1 in a series of short posts about fun Common Lisp Macros."
-date = 2018-05-21T16:05:00Z
-draft = false
+(
+:title "Fun with Macros: Gathering"
+:snip "Part 1 in a series of short posts about fun Common Lisp Macros."
+:date "2018-05-21T16:05:00Z"
+:draft nil
 
-+++
+)
 
 I haven't written anything in a while.  But after seeing the [metaprogramming
 video on Computerphile](https://www.youtube.com/watch?v=dw-y3vNDRWk) the other
@@ -461,7 +461,7 @@
 
 This is used to generate the triangles for images like this:
 
-[![Recursive triangles](/media/images/blog/2018/05/triangles.jpeg)](/media/images/blog/2018/05/triangles.jpeg)
+[![Recursive triangles](/static/images/blog/2018/05/triangles.jpeg)](/static/images/blog/2018/05/triangles.jpeg)
 
 Using `gathering` lets me write the recursive generation algorithm in a natural
 way, and just plug in a simple `(gather triangle)` when we finally bottom out at
--- a/content/blog/2018/07/fun-with-macros-if-let.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2018/07/fun-with-macros-if-let.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,7 @@
-+++
-title = "Fun with Macros: If-Let and When-Let"
-snip = "Part 2 in a series of short posts about fun Common Lisp Macros."
-date = 2018-07-09T16:00:00Z
-draft = false
-
-+++
+(:title "Fun with Macros: If-Let and When-Let"
+ :snip "Part 2 in a series of short posts about fun Common Lisp Macros."
+ :date "2018-07-09T16:00:00Z"
+ :draft nil)
 
 I haven't been writing much lately because I've been in the process of switching
 my life over to Linux from OS X.  I finally managed to get my blog
--- a/content/blog/2018/08/a-road-to-common-lisp.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/blog/2018/08/a-road-to-common-lisp.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -1,10 +1,7 @@
-+++
-title = "A Road to Common Lisp"
-snip = "How and why you can and should learn this old language."
-date = 2018-08-27T15:50:00Z
-draft = false
-
-+++
+(:title "A Road to Common Lisp"
+ :snip "How and why you can and should learn this old language."
+ :date "2018-08-27T15:50:00Z"
+ :draft nil)
 
 I've gotten a bunch of emails asking for advice on how to learn Common Lisp in
 the present day.  I decided to write down all the advice I've been giving
@@ -269,7 +266,7 @@
 of ugly parts.  If you buy a paper copy of the second edition of Common Lisp:
 the Language and look up "kludges" in the index you'll find this:
 
-[![Photo of a page of CLtL2's Index, listing "kludges" as pages 1 to 971](/media/images/blog/2018/07/lisp-kludge.jpeg)](/media/images/blog/2018/07/lisp-kludge.jpeg)
+[![Photo of a page of CLtL2's Index, listing "kludges" as pages 1 to 971](/static/images/blog/2018/07/lisp-kludge.jpeg)](/static/images/blog/2018/07/lisp-kludge.jpeg)
 
 Common Lisp is not a beautiful crystal of programming language design.  It's
 a scruffy workshop with a big pegboard wall of tools, a thin layer of sawdust on
--- a/content/photography.markdown	Sat Jan 04 23:35:16 2020 -0500
+++ b/content/photography.markdown	Sat Jan 04 23:36:37 2020 -0500
@@ -7,19 +7,19 @@
 
 <a href="/photography/plants/">
     <div class="photo-gallery-link">
-        <img src="/media/images/photography/thumbnails/plants/stevelosh.com-_1070511.jpg" />
+        <img src="/static/images/photography/thumbnails/plants/stevelosh.com-_1070511.jpg" />
         <div class="caption">Plants</div>
     </div>
 </a>
 <a href="/photography/iceland/">
     <div class="photo-gallery-link">
-        <img src="/media/images/photography/thumbnails/iceland/stevelosh.com-_SJL1199.jpg" />
+        <img src="/static/images/photography/thumbnails/iceland/stevelosh.com-_SJL1199.jpg" />
         <div class="caption">Iceland</div>
     </div>
 </a>
 <a href="/photography/scotland/">
     <div class="photo-gallery-link">
-        <img src="/media/images/photography/thumbnails/scotland/stevelosh.com-SJL_6903.jpg" />
+        <img src="/static/images/photography/thumbnails/scotland/stevelosh.com-SJL_6903.jpg" />
         <div class="caption">Scotland</div>
     </div>
 </a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/generate.lisp	Sat Jan 04 23:36:37 2020 -0500
@@ -0,0 +1,174 @@
+(ql:quickload (list :alexandria :iterate :losh :local-time
+                    :cl-who :3bmd :3bmd-ext-code-blocks))
+
+(defpackage :stevelosh.com
+  (:use :cl :iterate :losh)
+  (:import-from :cl-who
+    :with-html-output :htm :str)
+  (:export :toplevel))
+
+(in-package :stevelosh.com)
+
+;;;; State and Configuration --------------------------------------------------
+(setf (cl-who:html-mode) :html5
+      3bmd-code-blocks:*code-blocks* t)
+
+
+;;;; Utilities ----------------------------------------------------------------
+(defun human-date (timestamp)
+  (check-type timestamp local-time:timestamp)
+  (local-time:format-timestring
+    nil timestamp
+    :format `(:long-month " " :ordinal-day ", " :year)))
+
+(defmacro who (&body body)
+  `(with-html-output (*standard-output*) ,@body))
+
+
+;;;; Base Templates -----------------------------------------------------------
+(defun t/header ()
+  (who
+    (:header
+     (:a :id "logo" :href "/" "Steve Losh")
+     (:nav
+      (:a :href "/blog/" "Blog")
+      " - " (:a :href "/projects/" "Projects")
+      " - " (:a :href "/photography/" "Photography")
+      " - " (:a :href "/links/" "Links")
+      " - " (:a :href "/feed/" "Feed")))))
+
+(defun t/footer ()
+  (who
+    (:footer
+     (:nav
+      (:a :href "https://meta.sr.ht/~sjl/" "Source Hut")
+      " ・ " (:a :href "https://github.com/sjl/" "GitHub")
+      " ・ " (:a :href "https://twitter.com/stevelosh/" "Twitter")
+      " ・ " (:a :href "https://instagram.com/thirtytwobirds/" "Instagram")
+      " ・ " (:a :href "https://hg.sr.ht/~sjl/.plan/" ".plan")))))
+
+(defun t/base (title page-id body)
+  (who
+    (:html :lang "en"
+     (:head
+      (:meta :charset "utf-8")
+      (:link :href "/static/style.css" :rel "stylesheet")
+      (:title (str (if title
+                     (format nil "~A / Steve Losh" title)
+                     "Steve Losh"))))
+     (:body
+      (t/header)
+      (:hr :class "main-separator")
+      (:main :id (format nil "page-~A" page-id)
+       (funcall body))
+      (:hr :class "main-separator")
+      (t/footer)))))
+
+(defmacro with-base ((page-class &optional title) &body body)
+  `(t/base ,title ,page-class (lambda () ,@body)))
+
+
+;;;; Page Templates -----------------------------------------------------------
+(defun t/mathjax ()
+  (who (str "<script type=\"text/javascript\" async
+                     src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>")))
+
+(defun t/blog/index/item (entry)
+  (who
+    (:li
+     (:a :href (getf entry :url) (str (getf entry :title)))
+     (:p :class "entry-date" (str (human-date (getf entry :date))))
+     (:p :class "snippet" (str (getf entry :snip))))))
+
+(defun t/blog/index (entries)
+  (with-base ("blog-index" "Blog")
+    (who
+      (:ul (map nil #'t/blog/index/item entries)))))
+
+(defun t/blog/entry (entry)
+  (with-base ("blog-entry" (getf entry :title))
+    (who
+      (:article
+       (when (getf entry :mathjax) (t/mathjax))
+       (:h1 (:a :href (str (getf entry :url))
+             (str (getf entry :title))))
+       (:p :class "entry-date"
+        "Posted on " (str (human-date (getf entry :date))) ".")
+       (str (getf entry :body))))))
+
+(defun t/home ()
+  (with-base ("home")
+    (who
+      (:p "Hello, I'm Steve.")
+      (:p "I'm a photographer, programmer, dancer, and bassist currently living in "
+       (:a :href "https://rochestermade.com/" "Rochester, New York")
+       ".")
+      (:p "If you want to get in touch with me, "
+       (:a :href "mailto:steve@stevelosh.com" "email")
+       " is best."))))
+
+
+;;;; Markdown -----------------------------------------------------------------
+(defun parse-markdown-stream (stream)
+  (with-output-to-string (s)
+    (3bmd:parse-string-and-print-to-stream
+     (alexandria:read-stream-content-into-string stream)
+     s)))
+
+(defun read-markdown-file (path)
+  (with-open-file (s path :direction :input)
+    (let ((metadata (if (string= #\left_parenthesis (peek-char nil s))
+                      (read s)
+                      (return-from read-markdown-file nil)))
+          (body (parse-markdown-stream s)))
+      (append
+        (list :body body
+              :input-path path
+              :date (when-let ((d (getf metadata :date)))
+                      (local-time:parse-rfc3339-timestring d))
+              :output-path (ppcre:regex-replace "content/(.*)\\.markdown" path "build/\\1/index.html")
+              :url (ppcre:regex-replace "content/(.*)\\.markdown" path "/\\1/"))
+        metadata))))
+
+
+;;;; Data ---------------------------------------------------------------------
+(defun walk (path)
+  (-<> (sh (list "find" path "-name" "*.markdown") :result-type 'list)
+    (sort <> #'string>)
+    (mapcar #'read-markdown-file <>)
+    (remove nil <>)))
+
+
+;;;; Generation ---------------------------------------------------------------
+(defmacro render (path &body body)
+  `(progn
+     (ensure-directories-exist ,path)
+     (with-open-file (*standard-output* ,path
+                                        :direction :output
+                                        :if-exists :supersede)
+       (with-html-output (*standard-output* nil :prologue t)
+         ,@body))))
+
+(defun page/home ()
+  (render "build/index.html" (t/home)))
+
+(defparameter *blog-entries*
+  (walk "content/blog"))
+
+(defun page/blog/index ()
+  (render "build/blog/index.html" (t/blog/index *blog-entries*)))
+
+(defun page/blog/entries ()
+  (dolist (entry *blog-entries*)
+    (render (getf entry :output-path) (t/blog/entry entry))))
+
+
+;;;; Toplevel -----------------------------------------------------------------
+(defun toplevel ()
+  (page/home)
+  (page/blog/index)
+  (page/blog/entries)
+  )
+
+
+#; Scratch --------------------------------------------------------------------