a50d85df9ddc245bc8f2a7a629f31e7a0da9bb70
commit a50d85df9ddc245bc8f2a7a629f31e7a0da9bb70
Author: Simon Watson <spw01@protonmail.com>
Date: Tue Feb 15 19:45:06 2022 -0500

Cleaned this repo up a bit

diff --git a/2021-02-6-in-defense-of-perl.org b/2021-02-6-in-defense-of-perl.org
deleted file mode 100644
index 5e7d8bc..0000000
--- a/2021-02-6-in-defense-of-perl.org
+++ /dev/null
@@ -1,338 +0,0 @@
-https://
-gopher://
-#+AUTHOR: Simon Watson
-#+TITLE: In Defense of Perl
-
-* Preamble
-
- I've wanted to blog about Perl for a while now. I've had this conversation
- with quite a few friends, peers, and co-workers over the years and I can never
- seem to fully get to the bottom of it.
-
- Perl has obviously lost a lot of ground in recent decades, and is not really
- what I would consider a popular language anymore. I think there are a few
- reasons for this, and they're not unfair reasons.
-
- With that said, in my experience Perl seems to have a very bad reputation. Not
- only is it not popular, people are often offended by it. It seems to provoke
- strong reactions.
-
- Languages like Ruby and PHP are often called "dead" and "not modern", and seem
- to have many people calling out their usage. With that said both of these langs
- seem to be thriving with strong communities, and for every person that nay-says
- their use, there is another in the discussion celebrating them.
-
- This doesn't seem to be the case with Perl in my experience.
-
- Below I'd like to "defend" Perl a bit, and show why it still has a place in the
- modern computing landscape. In doing so I will try to be clear about my own biases
- and forthcoming about Perl's many issues.
-
-** My History and biases
-
-Skip this section if you're more interested in the arguments I present on Perl's
-behalf. This section is to give a litte background and to try and enumerate my
-biases in favor of Perl.
-______________________________________________________________________________
-
-*** Bias #1
-
- Perl was the first language I felt I had learned to a pretty complete level. I'm
- always hesisitant to say I'm an expert in anything, but if I was ever an expert (or
- close to it) in one area, it's probably Perl programming and syntax.
-
- I think this immediately creates a bias in my head that Perl is a good language. I
- think this kind of bias is pretty common when trying to talk about programming languages
- objectively.
-
- - I'm very familiar with it so it /feels/ easy
- - I know all the standard patterns so I reach for it a lot, and
- it's /very/ quick for me to write relative to other languages;
- I often use it for prototyping even if I end up rewriting in
- another lang later
-
-*** Bias #2
-
- I'm a sysadmin by trade, not a software engineer. Despite that, I've had to write
- and maintain software (especially things like tooling) many times in my career.
-
- I mention this because I think Perl favors this profession more so than strict
- software engineering jobs. I'll touch more on this later, but wanted to mention
- this here.
-
-*** Bias #3
-
- I very rarely need to deploy or write software for anything other than a Unix
- environment, and even then 95% of the time, it's for a Linux environment. Again,
- I'll cover this more later, but my experience and arguments are heavily biased
- towards the /Unix/ Perl programming experience. Not only is this a bias, it's
- a disclaimer of sorts, as I won't really be covering the non-Unix system Perl
- programming experience.
-
-** Why Perl is "bad"
-
-Before I get into my arguments for using Perl today, it's important to cover some
-of it's downsides and talk a bit about why I believe it's been relatively abandoned
-by the modern software development community.
-
-I think one of the biggest reasons right off the bat that Perl has fallen by the wayside is
-the Perl5/Perl6 debacle. Others have covered this pretty extensively, so I won't
-belabor the point, but in essence I think the effort to "modernize" Perl, and
-try and make it into a language that non-Perl users could love, while still keeping
-Perl5 users happy, was too tall of an order. The spiral that came out of it fragmented
-the community and userbase, and gave the inititive to Python.
-
-The Perl wikipedia page has some decent coverage of the various Perl5/6/7 lineages:
-https://en.wikipedia.org/wiki/Perl#Raku_(Perl_6)
-
-( For some more interesting reading/background, see:
-https://en.wikipedia.org/wiki/Outline_of_Perl )
-
-Secondly, the syntax. I will make some arguments for Perl's syntax later, but I'll take a
-brief moment here to acknowledge that it can look esoteric on a good day, and down right
-illegiable on a bad one. The heavy use of sigils is something I will aim to cast as a
-positive later on, but I will admit that needing to memorize and have an awareness of
-different context sensative sigils can make code look "messy" or hard to deciper. More
-on this later.
-
-Lastly, and by and large the argument I'm most likely to hear against using Perl:
-
-"No one uses it."
-
-In this blog post I hope to address these arguments and others, with
-concrete and constructive counter points.
-
-My aim in writing this is not to convince people to program in Perl. It's to convince
-people that Perl is not only a perfectly fine language to use for many different problem
-areas -- it's to show that it may in fact be the /better/ choice for some problem areas.
-
-I hope the distinction is clear and that I can convince you!
-
-* Addressing Arguments
-
-Preamble out of the way, I'll get right down to brass tacks.
-
-** Perl Syntax
-
-People often talk about how Perl is completely unreadable and "write only". This can
-be true, but I think it can be true for /any/ language, and as such doesn't really feel
-like a valid criticism.
-
-With that said, lets explore it a bit.
-
-Let's start with something basic like making a hash using two arrays:
-
-#+BEGIN_SRC perl
- #!/usr/bin/perl
-
- my @keys = ("a", "b", "c");
- my @vals = (1, 2, 3);
- my %hash;
- @hash{@keys} = @vals;
-
- # Output:
- # perl ar2h.pl
- # a : 1
- # b : 2
- # c : 3
-#+END_SRC perl
-
-#+BEGIN_SRC python
- keys = ['a', 'b', 'c']
- values = [1, 2, 3]
- hash = {key: value for key, value in zip(keys, values)}
- print(hash)
-
- # Output:
- # python3 ar2h.py
- # {'a': 1, 'b': 2, 'c': 3}
-#+END_SRC python
-
-For those unfamiliar with Perl's syntax, I'll break down briefly what's happening here:
-
-We have two arrays with data in them, and an empty hash. Hashes in Perl are denoted by the '%'
-symbol, arrays the '@' symbol.
-
-By addressing the hash '%hash' with the '@' symbol, we are essentially addressing one dimention of
-the hash. This 'syntax sugar' gives us an extremely ergonomic way to reason about how data assignment
-is working in the assignment line.
-
-We're taking the hash 'hash' and assigning the array 'keys' to it's first dimenstion, and the array
-'vals' and assigning it to it's second dimenstion. Because arrays are ordered, this mapping is
-intuituve and predictable.
-
-There's nothing terrible about the example Python code to me, but the idea that it's intrinsically
-more readable doesn't ring true for me, it's just different, and presupposes that you understand
-it's assignment syntax in the way Perl presupposes you understand it's sigils and tokens. To reiterate,
-Python's syntax is no better or worse than Perl's in this case -- it's just different. The programmer
-may have preferences for one or the other, but I don't think an argument can be made that one or the
-other is objectively better.
-
-OK, so you're probably thinking, this is such a ridiculous and contrived example, and that's true to
-an extent. Let's take a look at something a little bit more involved.
-
-Writing a program to emulate 'tail'.
-
-I saw what I think is an extremely elegant way to do this in Python, see:
-http://www.dabeaz.com/coroutines/follow.py
-http://www.dabeaz.com/coroutines/
-
-For the sake of ease the code above has been copied below. I've changed it slightly
-to work for my version of Python.
-
-#+BEGIN_SRC python
-import time
-def follow(thefile):
-thefile.seek(0,2) # Go to the end of the file
-while True:
- line = thefile.readline()
- if not line:
- time.sleep(0.1) # Sleep briefly
- continue
- yield line
-
- # Example use
- if __name__ == '__main__':
- logfile = open("log_file")
- for line in follow(logfile):
- print(line)
-#+END_SRC python
-
-The above Python code snippet features some cool async features, but I'm not aiming to talk about that here. I provided
-above simply because I think it show cases some of Python's more elegant syntax and expressive qualities.
-
-Below is a code snippet in Perl that performs roughly the same thing (from a user point of view):
-
-#+BEGIN_SRC perl
- #!/usr/bin/perl
-
- use strict;
- use warnings;
-
- open(my $fh, '<', "log_file");
-
- while () {
- seek($fh, 0, 1);
- print(readline($fh));
- sleep 1;
- }
-
- close($fh);
-#+END_SRC perl
-
-Again, echoing the sentiments from above. I think both of these implementations are perfectly readable and expressive, and
-don't ask /too/ much of the user unfamiliar with the language:
- - open a file handle
- - seek to end of it
- - read the line
- - print the line
-
-With some contrived examples out of the way, I'm going to provide a code example from some code I wrote in
-the past week:
-
-#+BEGIN_SRC perl
- if ( $log_file_path =~ m/(\d{4}-\d{2}-\d{2}).log/ ) {
- my $log_date = $1;
- $log_date =~ tr/-//d;
- if ( $log_date < $LATEST_DATE ) {
- next;
- } else {
- my ($serial, $parsed_log_ref) = parse_log($log_file_path, \&json_line_parser);
- my $output_file_path = $PROCESSED_LOG_DIR_PATH . "/" . $serial;
- write_parsed_log_array($output_file_path, $parsed_log_ref);
-
- }
- } else {
- die "Couldn't match log date in &process_seat_dir, exiting...\n";
- }
-#+END_SRC perl
-
-This is a code path taken frequently in a log parser I wrote from something at my job.
-
-Let's walk through the code and break it down in plain English. Feel free to skip if it's self evident:
-
-Enter the =if= block if the variable =$log_file_path= matches a regex that looks something like =$YEAR-$MONTH-$DAY.log=.
-
-Upon entering the block, capture the first regex capture group (enclosed in =()= in the regex) into a variable,
-=$log_date=.
-
-Use the Perl built in =tr()= to remove any =-= chars from the string.
-
-Compare the resulting string (something that looks like =$YEAR$MONTH$DAY=) to a variable we set elsewhere in
-the function scope, skipping the next code block if it's lower than =$LATEST_DATE=
-
-Assign the return of =parse_log=
-
-=parse_log()= expects to be passed two arguments: a string, and a function reference,
-it returns two variables: a string, and a reference to an array, which represents an ordered list of
-the lines in a file.
-
-We assign these two returns into variables called =$serial= and =$parsed_log_ref=.
-
-Construct a path name via the Perl built in string concat ( =.= ) and assign it to =$output_file_path=.
-
-Finally, call a function that will flatten and write out the array of log lines to a file.
-
-End syntax explanation.
-____________________________________________________________
-
-I think there are two potentially tricky Perl syntax-isms in the above snippet.
-
-Firstly, the data type of =$parsed_log_ref= is completely opaque. If you don't have insight into what =parse_log=
-is returning, you have no idea that =$parsed_log_ref= is an array reference. Strongly typed languages obviously
-solve this kind of problem for you, but I think in the domain of dynamic languages, this is a common problem
-that comes with the territory. To my knowledge Python or Ruby doesn't have great answers for this (please feel
-free to correct me on this).
-
-Secondly, unless you're familiar with perls tokens, it's unclear what =\&json_line_parser= is. I think this kind of
-notation can actually be a /plus/ for Perl.
-
-If I am passing some data to a function by reference, it's pretty clear what that data is (assuming it's not
-encapsulated in a scalar like the aforementioned =$parsed_log_ref= example):
-
-\@array
-\%hash
-\&function
-\$scalar
-
-For me personally, being able to denote type at a glance can be useful, as opposed to bare words in languages like python,
-where lots of the time it's up to me as the reader to understand all the surrounding context in order to know what type
-a variable is.
-
-As mentioned above, Perl has this issue as well to an extent, but I think to a lesser extent than dynamically typed
-languages that don't denote type with any kind of special syntax.
-
-I acknowledge however it's difficult to make an _objective_ argument in this regard, so...moving on.
-
-
-
-* Perl is /fast/
-
-
-
-* There is no better glue
-
-- Here talk about Perl's "best" use case, as a glue language
- for processing text streams and/or unstructured text data
-
-* Lesser known Perl features
-
-- Perl magic goes here
-
-* Feedback/Topics/Notes To cover
-
-- People prefer python as more people know it
-- Perception python stdlib is more complete
-- People like Perl for it's portability
-- People like Perl for text generation/report generation
-- People like perl for it's use of one liners
-- Cover "higher order perl"
-- Perl's history as a "sysadmin lang" re: Larry Wall/Randal Schwartz
-- Perl is more like Lisp and it is like C, and this is an important
- distinction
-- Talk about higher order functions
-- Talk about string function references
-- Talk about how Perl is /faster/ than Python in most text stream
- processing cases (prove this!)
-- Not welcoming to new comers
--
diff --git a/2021-emacs-windows.html b/2021-emacs-windows.html
deleted file mode 100644
index ef704ce..0000000
--- a/2021-emacs-windows.html
+++ /dev/null
@@ -1,404 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2021-10-27 Wed 21:02 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<meta name="author" content="Simon Watson" />
-<style type="text/css">
- <!--/*--><![CDATA[/*><!--*/
- .title { text-align: center;
- margin-bottom: .2em; }
- .subtitle { text-align: center;
- font-size: medium;
- font-weight: bold;
- margin-top:0; }
- .todo { font-family: monospace; color: red; }
- .done { font-family: monospace; color: green; }
- .priority { font-family: monospace; color: orange; }
- .tag { background-color: #eee; font-family: monospace;
- padding: 2px; font-size: 80%; font-weight: normal; }
- .timestamp { color: #bebebe; }
- .timestamp-kwd { color: #5f9ea0; }
- .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
- .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
- .org-center { margin-left: auto; margin-right: auto; text-align: center; }
- .underline { text-decoration: underline; }
- #postamble p, #preamble p { font-size: 90%; margin: .2em; }
- p.verse { margin-left: 3%; }
- pre {
- border: 1px solid #ccc;
- box-shadow: 3px 3px 3px #eee;
- padding: 8pt;
- font-family: monospace;
- overflow: auto;
- margin: 1.2em;
- }
- pre.src {
- position: relative;
- overflow: auto;
- padding-top: 1.2em;
- }
- pre.src:before {
- display: none;
- position: absolute;
- background-color: white;
- top: -10px;
- right: 10px;
- padding: 3px;
- border: 1px solid black;
- }
- pre.src:hover:before { display: inline; margin-top: 14px;}
- /* Languages per Org manual */
- pre.src-asymptote:before { content: 'Asymptote'; }
- pre.src-awk:before { content: 'Awk'; }
- pre.src-C:before { content: 'C'; }
- /* pre.src-C++ doesn't work in CSS */
- pre.src-clojure:before { content: 'Clojure'; }
- pre.src-css:before { content: 'CSS'; }
- pre.src-D:before { content: 'D'; }
- pre.src-ditaa:before { content: 'ditaa'; }
- pre.src-dot:before { content: 'Graphviz'; }
- pre.src-calc:before { content: 'Emacs Calc'; }
- pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
- pre.src-fortran:before { content: 'Fortran'; }
- pre.src-gnuplot:before { content: 'gnuplot'; }
- pre.src-haskell:before { content: 'Haskell'; }
- pre.src-hledger:before { content: 'hledger'; }
- pre.src-java:before { content: 'Java'; }
- pre.src-js:before { content: 'Javascript'; }
- pre.src-latex:before { content: 'LaTeX'; }
- pre.src-ledger:before { content: 'Ledger'; }
- pre.src-lisp:before { content: 'Lisp'; }
- pre.src-lilypond:before { content: 'Lilypond'; }
- pre.src-lua:before { content: 'Lua'; }
- pre.src-matlab:before { content: 'MATLAB'; }
- pre.src-mscgen:before { content: 'Mscgen'; }
- pre.src-ocaml:before { content: 'Objective Caml'; }
- pre.src-octave:before { content: 'Octave'; }
- pre.src-org:before { content: 'Org mode'; }
- pre.src-oz:before { content: 'OZ'; }
- pre.src-plantuml:before { content: 'Plantuml'; }
- pre.src-processing:before { content: 'Processing.js'; }
- pre.src-python:before { content: 'Python'; }
- pre.src-R:before { content: 'R'; }
- pre.src-ruby:before { content: 'Ruby'; }
- pre.src-sass:before { content: 'Sass'; }
- pre.src-scheme:before { content: 'Scheme'; }
- pre.src-screen:before { content: 'Gnu Screen'; }
- pre.src-sed:before { content: 'Sed'; }
- pre.src-sh:before { content: 'shell'; }
- pre.src-sql:before { content: 'SQL'; }
- pre.src-sqlite:before { content: 'SQLite'; }
- /* additional languages in org.el's org-babel-load-languages alist */
- pre.src-forth:before { content: 'Forth'; }
- pre.src-io:before { content: 'IO'; }
- pre.src-J:before { content: 'J'; }
- pre.src-makefile:before { content: 'Makefile'; }
- pre.src-maxima:before { content: 'Maxima'; }
- pre.src-perl:before { content: 'Perl'; }
- pre.src-picolisp:before { content: 'Pico Lisp'; }
- pre.src-scala:before { content: 'Scala'; }
- pre.src-shell:before { content: 'Shell Script'; }
- pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
- /* additional language identifiers per "defun org-babel-execute"
- in ob-*.el */
- pre.src-cpp:before { content: 'C++'; }
- pre.src-abc:before { content: 'ABC'; }
- pre.src-coq:before { content: 'Coq'; }
- pre.src-groovy:before { content: 'Groovy'; }
- /* additional language identifiers from org-babel-shell-names in
- ob-shell.el: ob-shell is the only babel language using a lambda to put
- the execution function name together. */
- pre.src-bash:before { content: 'bash'; }
- pre.src-csh:before { content: 'csh'; }
- pre.src-ash:before { content: 'ash'; }
- pre.src-dash:before { content: 'dash'; }
- pre.src-ksh:before { content: 'ksh'; }
- pre.src-mksh:before { content: 'mksh'; }
- pre.src-posh:before { content: 'posh'; }
- /* Additional Emacs modes also supported by the LaTeX listings package */
- pre.src-ada:before { content: 'Ada'; }
- pre.src-asm:before { content: 'Assembler'; }
- pre.src-caml:before { content: 'Caml'; }
- pre.src-delphi:before { content: 'Delphi'; }
- pre.src-html:before { content: 'HTML'; }
- pre.src-idl:before { content: 'IDL'; }
- pre.src-mercury:before { content: 'Mercury'; }
- pre.src-metapost:before { content: 'MetaPost'; }
- pre.src-modula-2:before { content: 'Modula-2'; }
- pre.src-pascal:before { content: 'Pascal'; }
- pre.src-ps:before { content: 'PostScript'; }
- pre.src-prolog:before { content: 'Prolog'; }
- pre.src-simula:before { content: 'Simula'; }
- pre.src-tcl:before { content: 'tcl'; }
- pre.src-tex:before { content: 'TeX'; }
- pre.src-plain-tex:before { content: 'Plain TeX'; }
- pre.src-verilog:before { content: 'Verilog'; }
- pre.src-vhdl:before { content: 'VHDL'; }
- pre.src-xml:before { content: 'XML'; }
- pre.src-nxml:before { content: 'XML'; }
- /* add a generic configuration mode; LaTeX export needs an additional
- (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
- pre.src-conf:before { content: 'Configuration File'; }
-
- table { border-collapse:collapse; }
- caption.t-above { caption-side: top; }
- caption.t-bottom { caption-side: bottom; }
- td, th { vertical-align:top; }
- th.org-right { text-align: center; }
- th.org-left { text-align: center; }
- th.org-center { text-align: center; }
- td.org-right { text-align: right; }
- td.org-left { text-align: left; }
- td.org-center { text-align: center; }
- dt { font-weight: bold; }
- .footpara { display: inline; }
- .footdef { margin-bottom: 1em; }
- .figure { padding: 1em; }
- .figure p { text-align: center; }
- .equation-container {
- display: table;
- text-align: center;
- width: 100%;
- }
- .equation {
- vertical-align: middle;
- }
- .equation-label {
- display: table-cell;
- text-align: right;
- vertical-align: middle;
- }
- .inlinetask {
- padding: 10px;
- border: 2px solid gray;
- margin: 10px;
- background: #ffffcc;
- }
- #org-div-home-and-up
- { text-align: right; font-size: 70%; white-space: nowrap; }
- textarea { overflow-x: auto; }
- .linenr { font-size: smaller }
- .code-highlighted { background-color: #ffff00; }
- .org-info-js_info-navigation { border-style: none; }
- #org-info-js_console-label
- { font-size: 10px; font-weight: bold; white-space: nowrap; }
- .org-info-js_search-highlight
- { background-color: #ffff00; color: #000000; font-weight: bold; }
- .org-svg { width: 90%; }
- /*]]>*/-->
-</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#orgd4831a0">1. Emacs and Learning to Live with Windows</a>
-<ul>
-<li><a href="#orgb4039ce">1.1. Background/Preamble</a></li>
-<li><a href="#orge44de3f">1.2. Enter Emacs</a></li>
-<li><a href="#org1ec967f">1.3. The Beginning</a></li>
-<li><a href="#org2f6f828">1.4. Emacs Server Mode</a></li>
-<li><a href="#orgf45ed4d">1.5. Compromises and Other Thoughts</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<p>
-</p>
-
-<div id="outline-container-orgd4831a0" class="outline-2">
-<h2 id="orgd4831a0"><span class="section-number-2">1</span> Emacs and Learning to Live with Windows</h2>
-<div class="outline-text-2" id="text-1">
-</div>
-<div id="outline-container-orgb4039ce" class="outline-3">
-<h3 id="orgb4039ce"><span class="section-number-3">1.1</span> Background/Preamble</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-In May of 2021 I started a new job. On my first day of work I imaged my workstation with Fedora; I was coming into a
-sysadmin job in a primarily RHEL shop so this seemed appropriate. Upon getting my laptop I was informed that I could
-not install Linux on it – VPN access was Windows only.
-</p>
-
-<p>
- "OK, no problem", I thought to myself. I'm not a huge Windows fan, and I hadn't interacted with it meaningfully since
-probably the early 00's, but I figured how bad could it be?
-</p>
-
-<p>
-As it turns out – not too bad. I was surprised to find there was some basic native window tiling behavior in the
-window manager, and with the release of the WSL and some flashy new windows terminal apps, I was pretty excited
-about how familiar it would feel.
-</p>
-
-<p>
-Unfortunately, I ran into a number of issues as I was exploring trying to get Windows to feel more Unix-y. I won't go into
-detail in this post (maybe another time), but I quickly discovered that there was a lot of muscle memory and UI workflows
-that just seemed unavailable to me in Windows (despite heroic community efforts to improve a lot of the Windows experience).
-</p>
-</div>
-</div>
-
-<div id="outline-container-orge44de3f" class="outline-3">
-<h3 id="orge44de3f"><span class="section-number-3">1.2</span> Enter Emacs</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-Before starting this new job, I'd been a long time Vim user, but unrelated to this new job I'd started exploring Common Lisp
-programming, and as such had setup Emacs/SLIME. As part of that foray into Emacs/SLIME I'd discovered <code>eshell</code>, and as I was
-struggling to get Windows to conform to my preferred workflows I started to explore how I could use Emacs, elisp, and it's
-packages ecosystem to make my Windows experience more Unix-y.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org1ec967f" class="outline-3">
-<h3 id="org1ec967f"><span class="section-number-3">1.3</span> The Beginning</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-Initially I downloaded the Windows Emacs build and was pretty happy with the experience. I could use <code>eshell</code> to navigate
-the Windows file system in a familiar way, and had set up an <a href="https://orgmode.org/">Emacs Org mode file</a> in my company OneDrive
-that I could easily update and track my work/notes in. When I was in the office on my Fedora workstation, I could easily update
-and keep notes in my Org file and then seamlessly access them on my laptop from home.
-</p>
-
-<p>
-The problems started arising when I wanted to do development for Linux systems on my Windows laptop, and easily be able
-to edit and quickly iterate.
-</p>
-
-<p>
-First, I tried setting up the WSL so that I could have a local Linux environment to do low stakes logic tests in. Unfortunately,
-the presence of a VPN tunnel seemed to cause a lot of problems for WSL and I couldn't get networking to work correctly
-in the WSL environment. This was kind of a non starter. I spent a decent amount of time trying to unravel it, but it quickly
-became a time sink that wasn't producing anything so I gave up.
-</p>
-
-<p>
-See here for more details on this problem: <a href="https://github.com/microsoft/WSL/issues/5068">https://github.com/microsoft/WSL/issues/5068</a>
-</p>
-
-<p>
-WSL not working, I tried using <a href="https://www.emacswiki.org/emacs/TrampMode">TRAMP</a>. The idea was to just open files on my Linux workstation over
-SSH and then manage everything natively there using an SSH session. I had a number of issues that I couldn't trace down,
-but the biggest was that using the <code>plink</code> TRAMP method would indefinitely hang emacs on windows, forcing me to close it with the
-Windows task manager. As with above, had I spent a reasonable amount of time trying to debug this, I probably would've
-been able to figure out the error (which was probably a misconfiguration on my part), but as with above, it started to
-become a real time sink and I just wanted to get to work.
-</p>
-
-<p>
-Eventually, I seemed to figure out something that worked <i>beautifully</i> for all of my expected cases.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org2f6f828" class="outline-3">
-<h3 id="org2f6f828"><span class="section-number-3">1.4</span> Emacs Server Mode</h3>
-<div class="outline-text-3" id="text-1-4">
-<p>
-Emacs has a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html">server mode</a> that covered all my bases and allowed for all the flexibility I ended up needing.
-</p>
-
-<p>
-What I do is start a terminal emacs session in tmux with <code>emacs -nw</code> on my Linux workstation at the office.
-I can then do <code>M-x server-start</code> which will start the Emacs server. When I'm at home and working from my windows laptop,
-I have to use Emacs exclusively in terminal mode. This of course has some tradeoffs, but it surprisingly works very well,
-and even has great terminal mouse support (<code>M-x xterm-mouse-mode</code>). I can run any number of <code>emacsclient</code>'s in tmux windows to easily manage and organize
-all my different development projects <i>AND</i> I can access the state of any of the other sessions from whatever session I'm in, just
-using the native Emacs buffer functionality.
-</p>
-
-<p>
-Additionally, when I head into the office, I can seamlessly attach to the running Emacs server from GUI Emacs and pick up
-right where I left off.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgf45ed4d" class="outline-3">
-<h3 id="orgf45ed4d"><span class="section-number-3">1.5</span> Compromises and Other Thoughts</h3>
-<div class="outline-text-3" id="text-1-5">
-<p>
-There are a few obvious compromises with this setup.
-</p>
-
-<p>
-Firstly, I can't natively address the windows environment from my terminal, as Emacs is actually running on my Linux server. This however kind of
-turned out to be a non issue, because I'm never actually writing any software for Windows, or doing any work with it. I'm just forced to have it
-installed on my laptop.
-</p>
-
-<p>
-My sysadmin environment, for lack of a better term, has always been a large number of tmux sessions managing different
-aspects of the job. For example a tmux session for "$web Team Systems", a tmux session for "$app Team Systems", etc etc. By integrating my development environment
-into a similar tmux session, it allowed me easily hop in and out of different development contexts, regardless of which system I was using; just like
-with my "sysadmin environment".
-</p>
-
-<p>
-The immediate question that arises from this conclusion is: "Well, if you're just doing all your development in the terminal, why not just use Vim?"
-</p>
-
-<p>
-This question is not posed to restart the age old flame war, but considering that is exactly what I used to use, I should address it. The main reason is that,
-to my knowledge, I cannot run a Vim session in the terminal, and then "attach" to it with gvim (having all my tabs/files/etc open and available)
-when I come into the office and use the workstation locally.
-</p>
-
-<p>
-There are many Emacs features I've come to love, which I might cover another time, but this one feature has really got me stuck in Emacs (plus there is the
-famous <a href="https://github.com/emacs-evil/evil">EVIL mode</a>, which smooths over that transition quite a bit).
-</p>
-
-<p>
-To come back to the original point, the reason I no longer worry too much about the Windows experience is that through emacs+tmux+ssh, I don't really
-ever have to interact with Windows. It provides a basic interface to the web browser and to team communication, and virtually every other part of my
-job can be done over SSH in cygwin. In this way, I've kind of side stepped the purpose of this blog post – I've just described how to use skirt
-actually using Windows as much as possible, as opposed to addressing solving these problems in a more Windows-centric way.
-</p>
-
-<p>
-The second major compromise here (I touched on it above) is that I end up using emacs as a terminal IDE far more often than I'd like. But given the choice between
-a very robust and functional development environment available over SSH and having to go into the office every day, it's a pretty easy trade for me.
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="author">Author: Simon Watson</p>
-<p class="date">Created: 2021-10-27 Wed 21:02</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2021-emacs-windows.pretty.html b/2021-emacs-windows.pretty.html
deleted file mode 100644
index eeb48c0..0000000
--- a/2021-emacs-windows.pretty.html
+++ /dev/null
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2021-10-27 Wed 21:02 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<meta name="author" content="Simon Watson" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#orgd4831a0">1. Emacs and Learning to Live with Windows</a>
-<ul>
-<li><a href="#orgb4039ce">1.1. Background/Preamble</a></li>
-<li><a href="#orge44de3f">1.2. Enter Emacs</a></li>
-<li><a href="#org1ec967f">1.3. The Beginning</a></li>
-<li><a href="#org2f6f828">1.4. Emacs Server Mode</a></li>
-<li><a href="#orgf45ed4d">1.5. Compromises and Other Thoughts</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<p>
-</p>
-
-<div id="outline-container-orgd4831a0" class="outline-2">
-<h2 id="orgd4831a0"><span class="section-number-2">1</span> Emacs and Learning to Live with Windows</h2>
-<div class="outline-text-2" id="text-1">
-</div>
-<div id="outline-container-orgb4039ce" class="outline-3">
-<h3 id="orgb4039ce"><span class="section-number-3">1.1</span> Background/Preamble</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-In May of 2021 I started a new job. On my first day of work I imaged my workstation with Fedora; I was coming into a
-sysadmin job in a primarily RHEL shop so this seemed appropriate. Upon getting my laptop I was informed that I could
-not install Linux on it – VPN access was Windows only.
-</p>
-
-<p>
- "OK, no problem", I thought to myself. I'm not a huge Windows fan, and I hadn't interacted with it meaningfully since
-probably the early 00's, but I figured how bad could it be?
-</p>
-
-<p>
-As it turns out – not too bad. I was surprised to find there was some basic native window tiling behavior in the
-window manager, and with the release of the WSL and some flashy new windows terminal apps, I was pretty excited
-about how familiar it would feel.
-</p>
-
-<p>
-Unfortunately, I ran into a number of issues as I was exploring trying to get Windows to feel more Unix-y. I won't go into
-detail in this post (maybe another time), but I quickly discovered that there was a lot of muscle memory and UI workflows
-that just seemed unavailable to me in Windows (despite heroic community efforts to improve a lot of the Windows experience).
-</p>
-</div>
-</div>
-
-<div id="outline-container-orge44de3f" class="outline-3">
-<h3 id="orge44de3f"><span class="section-number-3">1.2</span> Enter Emacs</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-Before starting this new job, I'd been a long time Vim user, but unrelated to this new job I'd started exploring Common Lisp
-programming, and as such had setup Emacs/SLIME. As part of that foray into Emacs/SLIME I'd discovered <code>eshell</code>, and as I was
-struggling to get Windows to conform to my preferred workflows I started to explore how I could use Emacs, elisp, and it's
-packages ecosystem to make my Windows experience more Unix-y.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org1ec967f" class="outline-3">
-<h3 id="org1ec967f"><span class="section-number-3">1.3</span> The Beginning</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-Initially I downloaded the Windows Emacs build and was pretty happy with the experience. I could use <code>eshell</code> to navigate
-the Windows file system in a familiar way, and had set up an <a href="https://orgmode.org/">Emacs Org mode file</a> in my company OneDrive
-that I could easily update and track my work/notes in. When I was in the office on my Fedora workstation, I could easily update
-and keep notes in my Org file and then seamlessly access them on my laptop from home.
-</p>
-
-<p>
-The problems started arising when I wanted to do development for Linux systems on my Windows laptop, and easily be able
-to edit and quickly iterate.
-</p>
-
-<p>
-First, I tried setting up the WSL so that I could have a local Linux environment to do low stakes logic tests in. Unfortunately,
-the presence of a VPN tunnel seemed to cause a lot of problems for WSL and I couldn't get networking to work correctly
-in the WSL environment. This was kind of a non starter. I spent a decent amount of time trying to unravel it, but it quickly
-became a time sink that wasn't producing anything so I gave up.
-</p>
-
-<p>
-See here for more details on this problem: <a href="https://github.com/microsoft/WSL/issues/5068">https://github.com/microsoft/WSL/issues/5068</a>
-</p>
-
-<p>
-WSL not working, I tried using <a href="https://www.emacswiki.org/emacs/TrampMode">TRAMP</a>. The idea was to just open files on my Linux workstation over
-SSH and then manage everything natively there using an SSH session. I had a number of issues that I couldn't trace down,
-but the biggest was that using the <code>plink</code> TRAMP method would indefinitely hang emacs on windows, forcing me to close it with the
-Windows task manager. As with above, had I spent a reasonable amount of time trying to debug this, I probably would've
-been able to figure out the error (which was probably a misconfiguration on my part), but as with above, it started to
-become a real time sink and I just wanted to get to work.
-</p>
-
-<p>
-Eventually, I seemed to figure out something that worked <i>beautifully</i> for all of my expected cases.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org2f6f828" class="outline-3">
-<h3 id="org2f6f828"><span class="section-number-3">1.4</span> Emacs Server Mode</h3>
-<div class="outline-text-3" id="text-1-4">
-<p>
-Emacs has a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html">server mode</a> that covered all my bases and allowed for all the flexibility I ended up needing.
-</p>
-
-<p>
-What I do is start a terminal emacs session in tmux with <code>emacs -nw</code> on my Linux workstation at the office.
-I can then do <code>M-x server-start</code> which will start the Emacs server. When I'm at home and working from my windows laptop,
-I have to use Emacs exclusively in terminal mode. This of course has some tradeoffs, but it surprisingly works very well,
-and even has great terminal mouse support (<code>M-x xterm-mouse-mode</code>). I can run any number of <code>emacsclient</code>'s in tmux windows to easily manage and organize
-all my different development projects <i>AND</i> I can access the state of any of the other sessions from whatever session I'm in, just
-using the native Emacs buffer functionality.
-</p>
-
-<p>
-Additionally, when I head into the office, I can seamlessly attach to the running Emacs server from GUI Emacs and pick up
-right where I left off.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgf45ed4d" class="outline-3">
-<h3 id="orgf45ed4d"><span class="section-number-3">1.5</span> Compromises and Other Thoughts</h3>
-<div class="outline-text-3" id="text-1-5">
-<p>
-There are a few obvious compromises with this setup.
-</p>
-
-<p>
-Firstly, I can't natively address the windows environment from my terminal, as Emacs is actually running on my Linux server. This however kind of
-turned out to be a non issue, because I'm never actually writing any software for Windows, or doing any work with it. I'm just forced to have it
-installed on my laptop.
-</p>
-
-<p>
-My sysadmin environment, for lack of a better term, has always been a large number of tmux sessions managing different
-aspects of the job. For example a tmux session for "$web Team Systems", a tmux session for "$app Team Systems", etc etc. By integrating my development environment
-into a similar tmux session, it allowed me easily hop in and out of different development contexts, regardless of which system I was using; just like
-with my "sysadmin environment".
-</p>
-
-<p>
-The immediate question that arises from this conclusion is: "Well, if you're just doing all your development in the terminal, why not just use Vim?"
-</p>
-
-<p>
-This question is not posed to restart the age old flame war, but considering that is exactly what I used to use, I should address it. The main reason is that,
-to my knowledge, I cannot run a Vim session in the terminal, and then "attach" to it with gvim (having all my tabs/files/etc open and available)
-when I come into the office and use the workstation locally.
-</p>
-
-<p>
-There are many Emacs features I've come to love, which I might cover another time, but this one feature has really got me stuck in Emacs (plus there is the
-famous <a href="https://github.com/emacs-evil/evil">EVIL mode</a>, which smooths over that transition quite a bit).
-</p>
-
-<p>
-To come back to the original point, the reason I no longer worry too much about the Windows experience is that through emacs+tmux+ssh, I don't really
-ever have to interact with Windows. It provides a basic interface to the web browser and to team communication, and virtually every other part of my
-job can be done over SSH in cygwin. In this way, I've kind of side stepped the purpose of this blog post – I've just described how to use skirt
-actually using Windows as much as possible, as opposed to addressing solving these problems in a more Windows-centric way.
-</p>
-
-<p>
-The second major compromise here (I touched on it above) is that I end up using emacs as a terminal IDE far more often than I'd like. But given the choice between
-a very robust and functional development environment available over SSH and having to go into the office every day, it's a pretty easy trade for me.
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="author">Author: Simon Watson</p>
-<p class="date">Created: 2021-10-27 Wed 21:02</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-13-es-json.html b/2022-01-13-es-json.html
deleted file mode 100644
index 7ee03fd..0000000
--- a/2022-01-13-es-json.html
+++ /dev/null
@@ -1,317 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-14 Fri 10:55 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">
- <!--/*--><![CDATA[/*><!--*/
- .title { text-align: center;
- margin-bottom: .2em; }
- .subtitle { text-align: center;
- font-size: medium;
- font-weight: bold;
- margin-top:0; }
- .todo { font-family: monospace; color: red; }
- .done { font-family: monospace; color: green; }
- .priority { font-family: monospace; color: orange; }
- .tag { background-color: #eee; font-family: monospace;
- padding: 2px; font-size: 80%; font-weight: normal; }
- .timestamp { color: #bebebe; }
- .timestamp-kwd { color: #5f9ea0; }
- .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
- .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
- .org-center { margin-left: auto; margin-right: auto; text-align: center; }
- .underline { text-decoration: underline; }
- #postamble p, #preamble p { font-size: 90%; margin: .2em; }
- p.verse { margin-left: 3%; }
- pre {
- border: 1px solid #ccc;
- box-shadow: 3px 3px 3px #eee;
- padding: 8pt;
- font-family: monospace;
- overflow: auto;
- margin: 1.2em;
- }
- pre.src {
- position: relative;
- overflow: auto;
- padding-top: 1.2em;
- }
- pre.src:before {
- display: none;
- position: absolute;
- background-color: white;
- top: -10px;
- right: 10px;
- padding: 3px;
- border: 1px solid black;
- }
- pre.src:hover:before { display: inline; margin-top: 14px;}
- /* Languages per Org manual */
- pre.src-asymptote:before { content: 'Asymptote'; }
- pre.src-awk:before { content: 'Awk'; }
- pre.src-C:before { content: 'C'; }
- /* pre.src-C++ doesn't work in CSS */
- pre.src-clojure:before { content: 'Clojure'; }
- pre.src-css:before { content: 'CSS'; }
- pre.src-D:before { content: 'D'; }
- pre.src-ditaa:before { content: 'ditaa'; }
- pre.src-dot:before { content: 'Graphviz'; }
- pre.src-calc:before { content: 'Emacs Calc'; }
- pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
- pre.src-fortran:before { content: 'Fortran'; }
- pre.src-gnuplot:before { content: 'gnuplot'; }
- pre.src-haskell:before { content: 'Haskell'; }
- pre.src-hledger:before { content: 'hledger'; }
- pre.src-java:before { content: 'Java'; }
- pre.src-js:before { content: 'Javascript'; }
- pre.src-latex:before { content: 'LaTeX'; }
- pre.src-ledger:before { content: 'Ledger'; }
- pre.src-lisp:before { content: 'Lisp'; }
- pre.src-lilypond:before { content: 'Lilypond'; }
- pre.src-lua:before { content: 'Lua'; }
- pre.src-matlab:before { content: 'MATLAB'; }
- pre.src-mscgen:before { content: 'Mscgen'; }
- pre.src-ocaml:before { content: 'Objective Caml'; }
- pre.src-octave:before { content: 'Octave'; }
- pre.src-org:before { content: 'Org mode'; }
- pre.src-oz:before { content: 'OZ'; }
- pre.src-plantuml:before { content: 'Plantuml'; }
- pre.src-processing:before { content: 'Processing.js'; }
- pre.src-python:before { content: 'Python'; }
- pre.src-R:before { content: 'R'; }
- pre.src-ruby:before { content: 'Ruby'; }
- pre.src-sass:before { content: 'Sass'; }
- pre.src-scheme:before { content: 'Scheme'; }
- pre.src-screen:before { content: 'Gnu Screen'; }
- pre.src-sed:before { content: 'Sed'; }
- pre.src-sh:before { content: 'shell'; }
- pre.src-sql:before { content: 'SQL'; }
- pre.src-sqlite:before { content: 'SQLite'; }
- /* additional languages in org.el's org-babel-load-languages alist */
- pre.src-forth:before { content: 'Forth'; }
- pre.src-io:before { content: 'IO'; }
- pre.src-J:before { content: 'J'; }
- pre.src-makefile:before { content: 'Makefile'; }
- pre.src-maxima:before { content: 'Maxima'; }
- pre.src-perl:before { content: 'Perl'; }
- pre.src-picolisp:before { content: 'Pico Lisp'; }
- pre.src-scala:before { content: 'Scala'; }
- pre.src-shell:before { content: 'Shell Script'; }
- pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
- /* additional language identifiers per "defun org-babel-execute"
- in ob-*.el */
- pre.src-cpp:before { content: 'C++'; }
- pre.src-abc:before { content: 'ABC'; }
- pre.src-coq:before { content: 'Coq'; }
- pre.src-groovy:before { content: 'Groovy'; }
- /* additional language identifiers from org-babel-shell-names in
- ob-shell.el: ob-shell is the only babel language using a lambda to put
- the execution function name together. */
- pre.src-bash:before { content: 'bash'; }
- pre.src-csh:before { content: 'csh'; }
- pre.src-ash:before { content: 'ash'; }
- pre.src-dash:before { content: 'dash'; }
- pre.src-ksh:before { content: 'ksh'; }
- pre.src-mksh:before { content: 'mksh'; }
- pre.src-posh:before { content: 'posh'; }
- /* Additional Emacs modes also supported by the LaTeX listings package */
- pre.src-ada:before { content: 'Ada'; }
- pre.src-asm:before { content: 'Assembler'; }
- pre.src-caml:before { content: 'Caml'; }
- pre.src-delphi:before { content: 'Delphi'; }
- pre.src-html:before { content: 'HTML'; }
- pre.src-idl:before { content: 'IDL'; }
- pre.src-mercury:before { content: 'Mercury'; }
- pre.src-metapost:before { content: 'MetaPost'; }
- pre.src-modula-2:before { content: 'Modula-2'; }
- pre.src-pascal:before { content: 'Pascal'; }
- pre.src-ps:before { content: 'PostScript'; }
- pre.src-prolog:before { content: 'Prolog'; }
- pre.src-simula:before { content: 'Simula'; }
- pre.src-tcl:before { content: 'tcl'; }
- pre.src-tex:before { content: 'TeX'; }
- pre.src-plain-tex:before { content: 'Plain TeX'; }
- pre.src-verilog:before { content: 'Verilog'; }
- pre.src-vhdl:before { content: 'VHDL'; }
- pre.src-xml:before { content: 'XML'; }
- pre.src-nxml:before { content: 'XML'; }
- /* add a generic configuration mode; LaTeX export needs an additional
- (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
- pre.src-conf:before { content: 'Configuration File'; }
-
- table { border-collapse:collapse; }
- caption.t-above { caption-side: top; }
- caption.t-bottom { caption-side: bottom; }
- td, th { vertical-align:top; }
- th.org-right { text-align: center; }
- th.org-left { text-align: center; }
- th.org-center { text-align: center; }
- td.org-right { text-align: right; }
- td.org-left { text-align: left; }
- td.org-center { text-align: center; }
- dt { font-weight: bold; }
- .footpara { display: inline; }
- .footdef { margin-bottom: 1em; }
- .figure { padding: 1em; }
- .figure p { text-align: center; }
- .equation-container {
- display: table;
- text-align: center;
- width: 100%;
- }
- .equation {
- vertical-align: middle;
- }
- .equation-label {
- display: table-cell;
- text-align: right;
- vertical-align: middle;
- }
- .inlinetask {
- padding: 10px;
- border: 2px solid gray;
- margin: 10px;
- background: #ffffcc;
- }
- #org-div-home-and-up
- { text-align: right; font-size: 70%; white-space: nowrap; }
- textarea { overflow-x: auto; }
- .linenr { font-size: smaller }
- .code-highlighted { background-color: #ffff00; }
- .org-info-js_info-navigation { border-style: none; }
- #org-info-js_console-label
- { font-size: 10px; font-weight: bold; white-space: nowrap; }
- .org-info-js_search-highlight
- { background-color: #ffff00; color: #000000; font-weight: bold; }
- .org-svg { width: 90%; }
- /*]]>*/-->
-</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org4003f02">1. How to parse single line JSON logs for ElasticSearch Cloud</a>
-<ul>
-<li><a href="#org60dc23d">1.1. The Problem</a></li>
-<li><a href="#orgdfc5189">1.2. The Solution</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<p>
--<b>- org-mode -</b>-
-</p>
-
-<div id="outline-container-org4003f02" class="outline-2">
-<h2 id="org4003f02"><span class="section-number-2">1</span> How to parse single line JSON logs for ElasticSearch Cloud</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-This is going to be a brief blog post, but wanted to jot down a few things as solving this "easy" issue has taken me the better part of 4 hours.
-</p>
-</div>
-<div id="outline-container-org60dc23d" class="outline-3">
-<h3 id="org60dc23d"><span class="section-number-3">1.1</span> The Problem</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-I have a number of weirdly formatted logs that developers would like to be able to easily search through and get insights from. The developers control this log format,
-but its an embedded environment and it's "non-trivial" to modify the format. I wrote a Perl script that will read in these developer logs and regex out
-key fields I'm interested in, transforming them like so (fake data):
-</p>
-
-<div class="org-src-container">
-<pre class="src src-shell"># Original log line
-# LOG LEVEL # DATE & TIME # FUNCTION NAME/LINE NUMBER # LOG MESSAGE
-[DEBUG] 2020/9/10 - 13:59:23 | some_function_name 166: some log message
-
-# PARSED LOG LINE
-{"log_level":"Debug","timestamp":"2020-09-10T13:59:23","function_name":"some_function_name","line_number":"166","message":"some log message"}
-</pre>
-</div>
-
-<p>
-After setting up this log parser and filebeat, I started processing these logs into a hosted ElasticSearch cloud instance. To my surprised, the JSON fields were
-not indexed, meaning I couldn't perform KQL searches like <code>timestamp:2020-09*</code> to get all log lines from that month.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgdfc5189" class="outline-3">
-<h3 id="orgdfc5189"><span class="section-number-3">1.2</span> The Solution</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-To Elastic's credit, it's actually incredibly simple to get this behavior with filebeat, all I needed to do was add the following to the <code>/etc/filebeat/filebeat.yml</code>
-file under the <code>processors</code> field (This is on filebeat versions 7.x):
-</p>
-
-<div class="org-src-container">
-<pre class="src src-yaml">processors:
- - decode_json_fields:
- fields: ["line_number","message","timestamp","function_name","log_level"]
- process_array: false
- max_depth: 1
- target: ""
- overwrite_keys: false
- add_error_key: true
-</pre>
-</div>
-
-<p>
-The relevant documentation can be found here: <a href="https://www.elastic.co/guide/en/beats/filebeat/current/decode-json-fields.html">https://www.elastic.co/guide/en/beats/filebeat/current/decode-json-fields.html</a>
-</p>
-
-<p>
-After creating a new index in ElasticSearch and ingesting logs to this new index, the expected KQL behavior worked.
-</p>
-
-<p>
-The reason why I'm making this blog post is that it took me hours to find this documentation, as there seems to be about 1000 different ways to get this
-functionality, with a number of different caveats or options depending on your use case. I may just be showing my inexperience with ElasticSearch here,
-but decided to write something brief about this because it took me a while to track down.
-</p>
-
-<p>
-Note: This post isn't a knock against Elastic and their products. They solve a complex issue and give users a lot of options for how to manage, index, and
-search their data. I think given those options though, groking documentation can become time consuming and I wanted to try and offer a shortcut.
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-14 Fri 10:55</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2022-01-13-es-json.pretty.html b/2022-01-13-es-json.pretty.html
deleted file mode 100644
index 8accb3d..0000000
--- a/2022-01-13-es-json.pretty.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-14 Fri 10:55 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org4003f02">1. How to parse single line JSON logs for ElasticSearch Cloud</a>
-<ul>
-<li><a href="#org60dc23d">1.1. The Problem</a></li>
-<li><a href="#orgdfc5189">1.2. The Solution</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<p>
-</p>
-
-<div id="outline-container-org4003f02" class="outline-2">
-<h2 id="org4003f02"><span class="section-number-2">1</span> How to parse single line JSON logs for ElasticSearch Cloud</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-This is going to be a brief blog post, but wanted to jot down a few things as solving this "easy" issue has taken me the better part of 4 hours.
-</p>
-</div>
-<div id="outline-container-org60dc23d" class="outline-3">
-<h3 id="org60dc23d"><span class="section-number-3">1.1</span> The Problem</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-I have a number of weirdly formatted logs that developers would like to be able to easily search through and get insights from. The developers control this log format,
-but its an embedded environment and it's "non-trivial" to modify the format. I wrote a Perl script that will read in these developer logs and regex out
-key fields I'm interested in, transforming them like so (fake data):
-</p>
-
-<div class="org-src-container">
-<pre class="src src-shell"># Original log line
-# LOG LEVEL # DATE & TIME # FUNCTION NAME/LINE NUMBER # LOG MESSAGE
-[DEBUG] 2020/9/10 - 13:59:23 | some_function_name 166: some log message
-
-# PARSED LOG LINE
-{"log_level":"Debug","timestamp":"2020-09-10T13:59:23","function_name":"some_function_name","line_number":"166","message":"some log message"}
-</pre>
-</div>
-
-<p>
-After setting up this log parser and filebeat, I started processing these logs into a hosted ElasticSearch cloud instance. To my surprised, the JSON fields were
-not indexed, meaning I couldn't perform KQL searches like <code>timestamp:2020-09*</code> to get all log lines from that month.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgdfc5189" class="outline-3">
-<h3 id="orgdfc5189"><span class="section-number-3">1.2</span> The Solution</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-To Elastic's credit, it's actually incredibly simple to get this behavior with filebeat, all I needed to do was add the following to the <code>/etc/filebeat/filebeat.yml</code>
-file under the <code>processors</code> field (This is on filebeat versions 7.x):
-</p>
-
-<div class="org-src-container">
-<pre class="src src-yaml">processors:
- - decode_json_fields:
- fields: ["line_number","message","timestamp","function_name","log_level"]
- process_array: false
- max_depth: 1
- target: ""
- overwrite_keys: false
- add_error_key: true
-</pre>
-</div>
-
-<p>
-The relevant documentation can be found here: <a href="https://www.elastic.co/guide/en/beats/filebeat/current/decode-json-fields.html">https://www.elastic.co/guide/en/beats/filebeat/current/decode-json-fields.html</a>
-</p>
-
-<p>
-After creating a new index in ElasticSearch and ingesting logs to this new index, the expected KQL behavior worked.
-</p>
-
-<p>
-The reason why I'm making this blog post is that it took me hours to find this documentation, as there seems to be about 1000 different ways to get this
-functionality, with a number of different caveats or options depending on your use case. I may just be showing my inexperience with ElasticSearch here,
-but decided to write something brief about this because it took me a while to track down.
-</p>
-
-<p>
-Note: This post isn't a knock against Elastic and their products. They solve a complex issue and give users a lot of options for how to manage, index, and
-search their data. I think given those options though, groking documentation can become time consuming and I wanted to try and offer a shortcut.
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="author">Author: Simon Watson</p>
-<p class="date">Created: 2022-01-14 Fri 10:55</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-20-gopher-setup.html b/2022-01-20-gopher-setup.html
deleted file mode 100644
index 6602c47..0000000
--- a/2022-01-20-gopher-setup.html
+++ /dev/null
@@ -1,434 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-21 Fri 15:42 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">
- <!--/*--><![CDATA[/*><!--*/
- .title { text-align: center;
- margin-bottom: .2em; }
- .subtitle { text-align: center;
- font-size: medium;
- font-weight: bold;
- margin-top:0; }
- .todo { font-family: monospace; color: red; }
- .done { font-family: monospace; color: green; }
- .priority { font-family: monospace; color: orange; }
- .tag { background-color: #eee; font-family: monospace;
- padding: 2px; font-size: 80%; font-weight: normal; }
- .timestamp { color: #bebebe; }
- .timestamp-kwd { color: #5f9ea0; }
- .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
- .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
- .org-center { margin-left: auto; margin-right: auto; text-align: center; }
- .underline { text-decoration: underline; }
- #postamble p, #preamble p { font-size: 90%; margin: .2em; }
- p.verse { margin-left: 3%; }
- pre {
- border: 1px solid #ccc;
- box-shadow: 3px 3px 3px #eee;
- padding: 8pt;
- font-family: monospace;
- overflow: auto;
- margin: 1.2em;
- }
- pre.src {
- position: relative;
- overflow: auto;
- padding-top: 1.2em;
- }
- pre.src:before {
- display: none;
- position: absolute;
- background-color: white;
- top: -10px;
- right: 10px;
- padding: 3px;
- border: 1px solid black;
- }
- pre.src:hover:before { display: inline; margin-top: 14px;}
- /* Languages per Org manual */
- pre.src-asymptote:before { content: 'Asymptote'; }
- pre.src-awk:before { content: 'Awk'; }
- pre.src-C:before { content: 'C'; }
- /* pre.src-C++ doesn't work in CSS */
- pre.src-clojure:before { content: 'Clojure'; }
- pre.src-css:before { content: 'CSS'; }
- pre.src-D:before { content: 'D'; }
- pre.src-ditaa:before { content: 'ditaa'; }
- pre.src-dot:before { content: 'Graphviz'; }
- pre.src-calc:before { content: 'Emacs Calc'; }
- pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
- pre.src-fortran:before { content: 'Fortran'; }
- pre.src-gnuplot:before { content: 'gnuplot'; }
- pre.src-haskell:before { content: 'Haskell'; }
- pre.src-hledger:before { content: 'hledger'; }
- pre.src-java:before { content: 'Java'; }
- pre.src-js:before { content: 'Javascript'; }
- pre.src-latex:before { content: 'LaTeX'; }
- pre.src-ledger:before { content: 'Ledger'; }
- pre.src-lisp:before { content: 'Lisp'; }
- pre.src-lilypond:before { content: 'Lilypond'; }
- pre.src-lua:before { content: 'Lua'; }
- pre.src-matlab:before { content: 'MATLAB'; }
- pre.src-mscgen:before { content: 'Mscgen'; }
- pre.src-ocaml:before { content: 'Objective Caml'; }
- pre.src-octave:before { content: 'Octave'; }
- pre.src-org:before { content: 'Org mode'; }
- pre.src-oz:before { content: 'OZ'; }
- pre.src-plantuml:before { content: 'Plantuml'; }
- pre.src-processing:before { content: 'Processing.js'; }
- pre.src-python:before { content: 'Python'; }
- pre.src-R:before { content: 'R'; }
- pre.src-ruby:before { content: 'Ruby'; }
- pre.src-sass:before { content: 'Sass'; }
- pre.src-scheme:before { content: 'Scheme'; }
- pre.src-screen:before { content: 'Gnu Screen'; }
- pre.src-sed:before { content: 'Sed'; }
- pre.src-sh:before { content: 'shell'; }
- pre.src-sql:before { content: 'SQL'; }
- pre.src-sqlite:before { content: 'SQLite'; }
- /* additional languages in org.el's org-babel-load-languages alist */
- pre.src-forth:before { content: 'Forth'; }
- pre.src-io:before { content: 'IO'; }
- pre.src-J:before { content: 'J'; }
- pre.src-makefile:before { content: 'Makefile'; }
- pre.src-maxima:before { content: 'Maxima'; }
- pre.src-perl:before { content: 'Perl'; }
- pre.src-picolisp:before { content: 'Pico Lisp'; }
- pre.src-scala:before { content: 'Scala'; }
- pre.src-shell:before { content: 'Shell Script'; }
- pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
- /* additional language identifiers per "defun org-babel-execute"
- in ob-*.el */
- pre.src-cpp:before { content: 'C++'; }
- pre.src-abc:before { content: 'ABC'; }
- pre.src-coq:before { content: 'Coq'; }
- pre.src-groovy:before { content: 'Groovy'; }
- /* additional language identifiers from org-babel-shell-names in
- ob-shell.el: ob-shell is the only babel language using a lambda to put
- the execution function name together. */
- pre.src-bash:before { content: 'bash'; }
- pre.src-csh:before { content: 'csh'; }
- pre.src-ash:before { content: 'ash'; }
- pre.src-dash:before { content: 'dash'; }
- pre.src-ksh:before { content: 'ksh'; }
- pre.src-mksh:before { content: 'mksh'; }
- pre.src-posh:before { content: 'posh'; }
- /* Additional Emacs modes also supported by the LaTeX listings package */
- pre.src-ada:before { content: 'Ada'; }
- pre.src-asm:before { content: 'Assembler'; }
- pre.src-caml:before { content: 'Caml'; }
- pre.src-delphi:before { content: 'Delphi'; }
- pre.src-html:before { content: 'HTML'; }
- pre.src-idl:before { content: 'IDL'; }
- pre.src-mercury:before { content: 'Mercury'; }
- pre.src-metapost:before { content: 'MetaPost'; }
- pre.src-modula-2:before { content: 'Modula-2'; }
- pre.src-pascal:before { content: 'Pascal'; }
- pre.src-ps:before { content: 'PostScript'; }
- pre.src-prolog:before { content: 'Prolog'; }
- pre.src-simula:before { content: 'Simula'; }
- pre.src-tcl:before { content: 'tcl'; }
- pre.src-tex:before { content: 'TeX'; }
- pre.src-plain-tex:before { content: 'Plain TeX'; }
- pre.src-verilog:before { content: 'Verilog'; }
- pre.src-vhdl:before { content: 'VHDL'; }
- pre.src-xml:before { content: 'XML'; }
- pre.src-nxml:before { content: 'XML'; }
- /* add a generic configuration mode; LaTeX export needs an additional
- (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
- pre.src-conf:before { content: 'Configuration File'; }
-
- table { border-collapse:collapse; }
- caption.t-above { caption-side: top; }
- caption.t-bottom { caption-side: bottom; }
- td, th { vertical-align:top; }
- th.org-right { text-align: center; }
- th.org-left { text-align: center; }
- th.org-center { text-align: center; }
- td.org-right { text-align: right; }
- td.org-left { text-align: left; }
- td.org-center { text-align: center; }
- dt { font-weight: bold; }
- .footpara { display: inline; }
- .footdef { margin-bottom: 1em; }
- .figure { padding: 1em; }
- .figure p { text-align: center; }
- .equation-container {
- display: table;
- text-align: center;
- width: 100%;
- }
- .equation {
- vertical-align: middle;
- }
- .equation-label {
- display: table-cell;
- text-align: right;
- vertical-align: middle;
- }
- .inlinetask {
- padding: 10px;
- border: 2px solid gray;
- margin: 10px;
- background: #ffffcc;
- }
- #org-div-home-and-up
- { text-align: right; font-size: 70%; white-space: nowrap; }
- textarea { overflow-x: auto; }
- .linenr { font-size: smaller }
- .code-highlighted { background-color: #ffff00; }
- .org-info-js_info-navigation { border-style: none; }
- #org-info-js_console-label
- { font-size: 10px; font-weight: bold; white-space: nowrap; }
- .org-info-js_search-highlight
- { background-color: #ffff00; color: #000000; font-weight: bold; }
- .org-svg { width: 90%; }
- /*]]>*/-->
-</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-<script type="text/x-mathjax-config">
- MathJax.Hub.Config({
- displayAlign: "center",
- displayIndent: "0em",
-
- "HTML-CSS": { scale: 100,
- linebreaks: { automatic: "false" },
- webFont: "TeX"
- },
- SVG: {scale: 100,
- linebreaks: { automatic: "false" },
- font: "TeX"},
- NativeMML: {scale: 100},
- TeX: { equationNumbers: {autoNumber: "AMS"},
- MultLineWidth: "85%",
- TagSide: "right",
- TagIndent: ".8em"
- }
-});
-</script>
-<script type="text/javascript"
- src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org38b106d">1. Setting up a Gopher Server</a></li>
-<li><a href="#org883f119">2. Basics</a></li>
-<li><a href="#org6abbb92">3. CGI</a>
-<ul>
-<li><a href="#org56a7a28">3.1. Footguns and Hangups</a></li>
-<li><a href="#org86dfa63">3.2. Helpful Patterns</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org38b106d" class="outline-2">
-<h2 id="org38b106d"><span class="section-number-2">1</span> Setting up a Gopher Server</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-Hey folks! In this post I'm going to talk a bit about setting
-up my Gopher server and some of the choices I made in doing so.
-</p>
-
-<p>
-I hope this is helpful to anyone who stumbles onto this article!
-</p>
-
-<p>
-Disclaimer: I'm only a few weeks into learning about Gopher
-and the so-called "indie-net", so this article may not
-represent the better part of community knowledge, or
-"best practices".
-</p>
-</div>
-</div>
-
-<div id="outline-container-org883f119" class="outline-2">
-<h2 id="org883f119"><span class="section-number-2">2</span> Basics</h2>
-<div class="outline-text-2" id="text-2">
-<p>
-I'll just rattle these off quickly so that we don't need to spend
-too much time on them:
-</p>
-
-<ul class="org-ul">
-<li>Server: Ubuntu VPS</li>
-<li>Gopher Server: Motsognir</li>
-</ul>
-
-<p>
-I won't cover the basics of setting up Motsognir or a basic Gopher
-map, as others have already done a great job covering these topics.
-</p>
-
-<p>
-Checkout the following WWW links on the topic:
-<a href="https://gopher.zone/">https://gopher.zone/</a>
-<a href="https://usermanual.wiki/Document/manual.488145643/help">https://usermanual.wiki/Document/manual.488145643/help</a>
-</p>
-</div>
-</div>
-
-<div id="outline-container-org6abbb92" class="outline-2">
-<h2 id="org6abbb92"><span class="section-number-2">3</span> CGI</h2>
-<div class="outline-text-2" id="text-3">
-<p>
-Because Gopher is a pretty simple protocol spec, I wanted to
-not serve static gopher maps and instead implement everything
-as a CGI script. This allows me to be pretty flexible with
-the formatting and configuration of the site:
-</p>
-
-<ul class="org-ul">
-<li>Can provide a 'plain' non ANSI escape sequence cluttered
-version of the site for users who prefer the minimalism
-of uniform text/chars</li>
-<li>Can provide interesting tidbits like Last Modification
-date of the site and # of uniq visitors</li>
-<li>Silly stuff like intermediate http requests (server side)
-to my git server so that I can serve all of my git website
-natively in Gopher</li>
-</ul>
-
-<p>
-The CGI source is actually available to view live, see:
-<a href="gopher://chate.io/0/foobar.txt">gopher://chate.io/0/foobar.txt</a>
-</p>
-
-<p>
-Note: The Gopher server Gophernicus actually offers what I
-think is an even cooler way of doing this, with what it calls
-moles. Check it out: <a href="https://github.com/gophernicus/gophernicus">https://github.com/gophernicus/gophernicus</a>
-</p>
-
-<p>
-I may move over to gophernicus at some point, but for now
-I'm enjoying the ease of use of Motsognir.
-</p>
-
-<p>
-On that topic, to get all the CGI stuff working correctly
-I had to set the following values in the Motsognir config
-file. The config file is awesome, and well documented, but
-as a newcomer to the protocol it was somewhat confusing
-to get it configured right, so I've provided the following:
-</p>
-
-<p>
-GopherCgiSupport=1
-SubGophermaps=1
-DefaultGophermap=
-</p>
-
-<p>
-I'd encourage reading the comments for each of these settings
-for a clearer understanding of what they're doing, but I leave
-this exercise to the reader.
-</p>
-</div>
-
-<div id="outline-container-org56a7a28" class="outline-3">
-<h3 id="org56a7a28"><span class="section-number-3">3.1</span> Footguns and Hangups</h3>
-<div class="outline-text-3" id="text-3-1">
-<p>
-A few things I learned trying to always dynamically
-generate my gophermap:
-</p>
-
-<ul class="org-ul">
-<li>Clients can be finnicky and the protocl spec seems
-to be not super well agreed upon by client
-implimenters
-– Some clients will not correctly parse info
- lines if there is a " " after the i
-– Some clients will seemingly ignore info lines
-– Some clients don't mind if you don't have a "."
- char at the EOF, others seem to really care
- — Apparently the "." at EOF is part of the spec,
- so it really should be there
-– Some clients will automagically parse out any ANSI
- escape sequnces, others will interpret them correctly,
- and others will barf them to the screen literally
- — To my knowledge there is nothing in the spec for
- handling this, so client implementers can't be blamed
-– Some gopher servers will helpfully auto fill lines in a
- map that don't contain <TAB>$host<$TAB>$port. I learned
- that motsognir will do this on a statically served map,
- but (in hindsight, obviously), not a dynamically
- generated one, so make sure you're filling that out</li>
-</ul>
-</div>
-</div>
-
-<div id="outline-container-org86dfa63" class="outline-3">
-<h3 id="org86dfa63"><span class="section-number-3">3.2</span> Helpful Patterns</h3>
-<div class="outline-text-3" id="text-3-2">
-<p>
-A few helpful patterns I've employed while writing my CGI
-scripts:
-</p>
-
-<ul class="org-ul">
-<li><p>
-Establish an interface for printing your gopher map. I use
-a function that takes 3 args: $gopher<sub>menu</sub><sub>type</sub>, $string,
-$rest.
-</p>
-
-<p>
-The idea being that you call the function this way:
-g<sub>print</sub>("1","Some Dir","\t$path\t$hostname\t$port");
-</p>
-
-<p>
-This function will then, depending on what/if it gets
-a CGI query parameter, will either randomly colorize
-the output or not, allowing the site to be easily rendered
-one way or another.
-</p></li>
-
-<li>As with stuff on WWW, make sure your CGI scripts are
-executing quickly, otherwise the client will be left waiting</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-21 Fri 15:42</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2022-01-20-gopher-setup.pretty.html b/2022-01-20-gopher-setup.pretty.html
deleted file mode 100644
index 799468b..0000000
--- a/2022-01-20-gopher-setup.pretty.html
+++ /dev/null
@@ -1,257 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-21 Fri 15:49 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-<script type="text/x-mathjax-config">
- MathJax.Hub.Config({
- displayAlign: "center",
- displayIndent: "0em",
-
- "HTML-CSS": { scale: 100,
- linebreaks: { automatic: "false" },
- webFont: "TeX"
- },
- SVG: {scale: 100,
- linebreaks: { automatic: "false" },
- font: "TeX"},
- NativeMML: {scale: 100},
- TeX: { equationNumbers: {autoNumber: "AMS"},
- MultLineWidth: "85%",
- TagSide: "right",
- TagIndent: ".8em"
- }
-});
-</script>
-<script type="text/javascript"
- src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org983ba01">1. Setting up a Gopher Server</a></li>
-<li><a href="#orgbb3aeb4">2. Basics</a></li>
-<li><a href="#org01c0017">3. CGI</a>
-<ul>
-<li><a href="#org9ca7470">3.1. Footguns and Hangups</a></li>
-<li><a href="#orgdec9391">3.2. Helpful Patterns</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org983ba01" class="outline-2">
-<h2 id="org983ba01"><span class="section-number-2">1</span> Setting up a Gopher Server</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-Hey folks! In this post I'm going to talk a bit about setting
-up my Gopher server and some of the choices I made in doing so.
-</p>
-
-<p>
-I hope this is helpful to anyone who stumbles onto this article!
-</p>
-
-<p>
-Disclaimer: I'm only a few weeks into learning about Gopher
-and the so-called "indie-net", so this article may not
-represent the better part of community knowledge, or
-"best practices".
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgbb3aeb4" class="outline-2">
-<h2 id="orgbb3aeb4"><span class="section-number-2">2</span> Basics</h2>
-<div class="outline-text-2" id="text-2">
-<p>
-I'll just rattle these off quickly so that we don't need to spend
-too much time on them:
-</p>
-
-<ul class="org-ul">
-<li>Server: Ubuntu VPS</li>
-<li>Gopher Server: Motsognir</li>
-</ul>
-
-<p>
-I won't cover the basics of setting up Motsognir or a basic Gopher
-map, as others have already done a great job covering these topics.
-</p>
-
-<p>
-Checkout the following WWW links on the topic:
-<a href="https://gopher.zone/">https://gopher.zone/</a>
-<a href="https://usermanual.wiki/Document/manual.488145643/help">https://usermanual.wiki/Document/manual.488145643/help</a>
-</p>
-</div>
-</div>
-
-<div id="outline-container-org01c0017" class="outline-2">
-<h2 id="org01c0017"><span class="section-number-2">3</span> CGI</h2>
-<div class="outline-text-2" id="text-3">
-<p>
-Because Gopher is a pretty simple protocol spec, I wanted to
-not serve static gopher maps and instead implement everything
-as a CGI script. This allows me to be pretty flexible with
-the formatting and configuration of the site:
-</p>
-
-<ul class="org-ul">
-<li>Can provide a 'plain' non ANSI escape sequence cluttered
-version of the site for users who prefer the minimalism
-of uniform text/chars</li>
-<li>Can provide interesting tidbits like Last Modification
-date of the site and # of uniq visitors</li>
-<li>Silly stuff like intermediate http requests (server side)
-to my git server so that I can serve all of my git website
-natively in Gopher</li>
-</ul>
-
-<p>
-The CGI source is actually available to view live, see:
-<a href="gopher://chate.io/0/foobar.txt">gopher://chate.io/0/foobar.txt</a>
-</p>
-
-<p>
-Note: The Gopher server Gophernicus actually offers what I
-think is an even cooler way of doing this, with what it calls
-moles. Check it out: <a href="https://github.com/gophernicus/gophernicus">https://github.com/gophernicus/gophernicus</a>
-</p>
-
-<p>
-I may move over to gophernicus at some point, but for now
-I'm enjoying the ease of use of Motsognir.
-</p>
-
-<p>
-On that topic, to get all the CGI stuff working correctly
-I had to set the following values in the Motsognir config
-file. The config file is awesome, and well documented, but
-as a newcomer to the protocol it was somewhat confusing
-to get it configured right, so I've provided the following:
-</p>
-
-<p>
-GopherCgiSupport=1
-SubGophermaps=1
-DefaultGophermap=
-</p>
-
-<p>
-I'd encourage reading the comments for each of these settings
-for a clearer understanding of what they're doing, but I leave
-this exercise to the reader.
-</p>
-</div>
-
-<div id="outline-container-org9ca7470" class="outline-3">
-<h3 id="org9ca7470"><span class="section-number-3">3.1</span> Footguns and Hangups</h3>
-<div class="outline-text-3" id="text-3-1">
-<p>
-A few things I learned trying to always dynamically
-generate my gophermap:
-</p>
-
-<ul class="org-ul">
-<li>Clients can be finnicky and the protocl spec seems
-to be not super well agreed upon by client
-implimenters
-<ul class="org-ul">
-<li>Some clients will not correctly parse info
-lines if there is a " " after the i</li>
-<li>Some clients will seemingly ignore info lines</li>
-<li>Some clients don't mind if you don't have a "."
-char at the EOF, others seem to really care
-<ul class="org-ul">
-<li>Apparently the "." at EOF is part of the spec,
-so it really should be there</li>
-</ul></li>
-<li>Some clients will automagically parse out any ANSI
-escape sequnces, others will interpret them correctly,
-and others will barf them to the screen literally
-<ul class="org-ul">
-<li>To my knowledge there is nothing in the spec for
-handling this, so client implementers can't be blamed</li>
-</ul></li>
-<li>Some gopher servers will helpfully auto fill lines in a
-map that don't contain <TAB>$host<$TAB>$port. I learned
-that motsognir will do this on a statically served map,
-but (in hindsight, obviously), not a dynamically
-generated one, so make sure you're filling that out</li>
-</ul></li>
-</ul>
-</div>
-</div>
-
-<div id="outline-container-orgdec9391" class="outline-3">
-<h3 id="orgdec9391"><span class="section-number-3">3.2</span> Helpful Patterns</h3>
-<div class="outline-text-3" id="text-3-2">
-<p>
-A few helpful patterns I've employed while writing my CGI
-scripts:
-</p>
-
-<ul class="org-ul">
-<li><p>
-Establish an interface for printing your gopher map. I use
-a function that takes 3 args: $gopher<sub>menu</sub><sub>type</sub>, $string,
-$rest.
-</p>
-
-<p>
-The idea being that you call the function this way:
-g<sub>print</sub>("1","Some Dir","\t$path\t$hostname\t$port");
-</p>
-
-<p>
-This function will then, depending on what/if it gets
-a CGI query parameter, will either randomly colorize
-the output or not, allowing the site to be easily rendered
-one way or another.
-</p></li>
-
-<li>As with stuff on WWW, make sure your CGI scripts are
-executing quickly, otherwise the client will be left waiting</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-21 Fri 15:49</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-20-keypro-fk-9000-docs.html b/2022-01-20-keypro-fk-9000-docs.html
deleted file mode 100644
index b5977d8..0000000
--- a/2022-01-20-keypro-fk-9000-docs.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-20 Thu 13:06 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org348f716">1. Keypro FK-9000</a>
-<ul>
-<li><a href="#org42ef4d6">1.1. Backstory/Info</a></li>
-<li><a href="#org23dab99">1.2. Docs (Useful Info)</a></li>
-<li><a href="#orgb5939bc">1.3. Examples (Less Useful Info)</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org348f716" class="outline-2">
-<h2 id="org348f716"><span class="section-number-2">1</span> Keypro FK-9000</h2>
-<div class="outline-text-2" id="text-1">
-</div>
-<div id="outline-container-org42ef4d6" class="outline-3">
-<h3 id="org42ef4d6"><span class="section-number-3">1.1</span> Backstory/Info</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-This is a pretty interesting keyboard. At the end of the post
-I'll render an UNICODE ascii picture of it for those interested.
-</p>
-
-<p>
-I wanted to write something quickly as a documentation exercise
-and as something perhaps useful to others.
-</p>
-
-<p>
-I've had this old Keypro FK-9000 and Soarer Converter lying
-around for a couple of years now and I had yet to play with it.
-</p>
-
-<p>
-So, last night, I finally decided to check it out.
-</p>
-
-<p>
-Basically it's an old 5 PIN keyboard that has a few cool tricks:
-</p>
-<ul class="org-ul">
-<li>built in calculator and lcd
-<ul class="org-ul">
-<li>You can hit a latching key on the keyboard and
-the numpad input will then be sent to the little
-on board LCD screen</li>
-</ul></li>
-<li>12 on board programmable macro keys</li>
-</ul>
-
-<p>
-The Soarer Converter cable I have, which as I understand is basically
-an atmega chip shoved into a cable, also allows me to remap keys as the
-scan codes come into the converter, before they get to the computer.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org23dab99" class="outline-3">
-<h3 id="org23dab99"><span class="section-number-3">1.2</span> Docs (Useful Info)</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-It took me a while to figure out how to program the keys
-so for any future readers hopefully this will help:
-</p>
-
-<ol class="org-ol">
-<li>Open a text editor</li>
-<li>Hold the `Prog` key and hit the key you want to
-program (PF1-12)</li>
-<li>Enter the key sequence you'd like to program</li>
-<li>Hit the key you want to program again</li>
-</ol>
-
-<p>
-Example:
-</p>
-
-<p>
-Prog->PF1sometringPF1
-</p>
-
-<p>
-This will also work with CTRL,RETURN,ALT,etc, however
-the macros all have a 14 char limit, with control chars
-taking up 2 chars.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgb5939bc" class="outline-3">
-<h3 id="orgb5939bc"><span class="section-number-3">1.3</span> Examples (Less Useful Info)</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-Here I'm going to document my own macros:
-</p>
-
-<ul class="org-ul">
-<li>PF11: Ctrl-G – Emacs escape hatch/escape/stop</li>
-<li>PF1: Ctrl-x-b – Emacs switch buffer menu</li>
-<li>PF2: Ctrl-x-b-RETURN – Based on Ido menu ordering
-behaves as switch to last
-buffer</li>
-<li>PF3: Ctrl-x-Ctrl-f – Open file</li>
-<li>PF4: Ctrl-c-Ctrl-f – Open file at point</li>
-<li>PF5: M-xeshell-RETURN – Open eshell</li>
-<li>PF7: Ctrl-x-5-2 – Open new emacs frame (window for non emacsers)</li>
-<li>PF8: Ctrl-x-5-0 – Close emacs frame</li>
-<li>PF9: gT – literally gT, AKA previous tab in vim/evil mode</li>
-<li>PF10: gt – literally gt, next tab in vim/evil mode</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-20 Thu 13:06</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2022-01-20-keypro-fk-9000.pretty.html b/2022-01-20-keypro-fk-9000.pretty.html
deleted file mode 100644
index b5977d8..0000000
--- a/2022-01-20-keypro-fk-9000.pretty.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-20 Thu 13:06 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org348f716">1. Keypro FK-9000</a>
-<ul>
-<li><a href="#org42ef4d6">1.1. Backstory/Info</a></li>
-<li><a href="#org23dab99">1.2. Docs (Useful Info)</a></li>
-<li><a href="#orgb5939bc">1.3. Examples (Less Useful Info)</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org348f716" class="outline-2">
-<h2 id="org348f716"><span class="section-number-2">1</span> Keypro FK-9000</h2>
-<div class="outline-text-2" id="text-1">
-</div>
-<div id="outline-container-org42ef4d6" class="outline-3">
-<h3 id="org42ef4d6"><span class="section-number-3">1.1</span> Backstory/Info</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-This is a pretty interesting keyboard. At the end of the post
-I'll render an UNICODE ascii picture of it for those interested.
-</p>
-
-<p>
-I wanted to write something quickly as a documentation exercise
-and as something perhaps useful to others.
-</p>
-
-<p>
-I've had this old Keypro FK-9000 and Soarer Converter lying
-around for a couple of years now and I had yet to play with it.
-</p>
-
-<p>
-So, last night, I finally decided to check it out.
-</p>
-
-<p>
-Basically it's an old 5 PIN keyboard that has a few cool tricks:
-</p>
-<ul class="org-ul">
-<li>built in calculator and lcd
-<ul class="org-ul">
-<li>You can hit a latching key on the keyboard and
-the numpad input will then be sent to the little
-on board LCD screen</li>
-</ul></li>
-<li>12 on board programmable macro keys</li>
-</ul>
-
-<p>
-The Soarer Converter cable I have, which as I understand is basically
-an atmega chip shoved into a cable, also allows me to remap keys as the
-scan codes come into the converter, before they get to the computer.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org23dab99" class="outline-3">
-<h3 id="org23dab99"><span class="section-number-3">1.2</span> Docs (Useful Info)</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-It took me a while to figure out how to program the keys
-so for any future readers hopefully this will help:
-</p>
-
-<ol class="org-ol">
-<li>Open a text editor</li>
-<li>Hold the `Prog` key and hit the key you want to
-program (PF1-12)</li>
-<li>Enter the key sequence you'd like to program</li>
-<li>Hit the key you want to program again</li>
-</ol>
-
-<p>
-Example:
-</p>
-
-<p>
-Prog->PF1sometringPF1
-</p>
-
-<p>
-This will also work with CTRL,RETURN,ALT,etc, however
-the macros all have a 14 char limit, with control chars
-taking up 2 chars.
-</p>
-</div>
-</div>
-
-<div id="outline-container-orgb5939bc" class="outline-3">
-<h3 id="orgb5939bc"><span class="section-number-3">1.3</span> Examples (Less Useful Info)</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-Here I'm going to document my own macros:
-</p>
-
-<ul class="org-ul">
-<li>PF11: Ctrl-G – Emacs escape hatch/escape/stop</li>
-<li>PF1: Ctrl-x-b – Emacs switch buffer menu</li>
-<li>PF2: Ctrl-x-b-RETURN – Based on Ido menu ordering
-behaves as switch to last
-buffer</li>
-<li>PF3: Ctrl-x-Ctrl-f – Open file</li>
-<li>PF4: Ctrl-c-Ctrl-f – Open file at point</li>
-<li>PF5: M-xeshell-RETURN – Open eshell</li>
-<li>PF7: Ctrl-x-5-2 – Open new emacs frame (window for non emacsers)</li>
-<li>PF8: Ctrl-x-5-0 – Close emacs frame</li>
-<li>PF9: gT – literally gT, AKA previous tab in vim/evil mode</li>
-<li>PF10: gt – literally gt, next tab in vim/evil mode</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-20 Thu 13:06</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2022-01-21-blog-workflow.html b/2022-01-21-blog-workflow.html
deleted file mode 100644
index 1137519..0000000
--- a/2022-01-21-blog-workflow.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-21 Fri 16:24 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">
- <!--/*--><![CDATA[/*><!--*/
- .title { text-align: center;
- margin-bottom: .2em; }
- .subtitle { text-align: center;
- font-size: medium;
- font-weight: bold;
- margin-top:0; }
- .todo { font-family: monospace; color: red; }
- .done { font-family: monospace; color: green; }
- .priority { font-family: monospace; color: orange; }
- .tag { background-color: #eee; font-family: monospace;
- padding: 2px; font-size: 80%; font-weight: normal; }
- .timestamp { color: #bebebe; }
- .timestamp-kwd { color: #5f9ea0; }
- .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
- .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
- .org-center { margin-left: auto; margin-right: auto; text-align: center; }
- .underline { text-decoration: underline; }
- #postamble p, #preamble p { font-size: 90%; margin: .2em; }
- p.verse { margin-left: 3%; }
- pre {
- border: 1px solid #ccc;
- box-shadow: 3px 3px 3px #eee;
- padding: 8pt;
- font-family: monospace;
- overflow: auto;
- margin: 1.2em;
- }
- pre.src {
- position: relative;
- overflow: auto;
- padding-top: 1.2em;
- }
- pre.src:before {
- display: none;
- position: absolute;
- background-color: white;
- top: -10px;
- right: 10px;
- padding: 3px;
- border: 1px solid black;
- }
- pre.src:hover:before { display: inline; margin-top: 14px;}
- /* Languages per Org manual */
- pre.src-asymptote:before { content: 'Asymptote'; }
- pre.src-awk:before { content: 'Awk'; }
- pre.src-C:before { content: 'C'; }
- /* pre.src-C++ doesn't work in CSS */
- pre.src-clojure:before { content: 'Clojure'; }
- pre.src-css:before { content: 'CSS'; }
- pre.src-D:before { content: 'D'; }
- pre.src-ditaa:before { content: 'ditaa'; }
- pre.src-dot:before { content: 'Graphviz'; }
- pre.src-calc:before { content: 'Emacs Calc'; }
- pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
- pre.src-fortran:before { content: 'Fortran'; }
- pre.src-gnuplot:before { content: 'gnuplot'; }
- pre.src-haskell:before { content: 'Haskell'; }
- pre.src-hledger:before { content: 'hledger'; }
- pre.src-java:before { content: 'Java'; }
- pre.src-js:before { content: 'Javascript'; }
- pre.src-latex:before { content: 'LaTeX'; }
- pre.src-ledger:before { content: 'Ledger'; }
- pre.src-lisp:before { content: 'Lisp'; }
- pre.src-lilypond:before { content: 'Lilypond'; }
- pre.src-lua:before { content: 'Lua'; }
- pre.src-matlab:before { content: 'MATLAB'; }
- pre.src-mscgen:before { content: 'Mscgen'; }
- pre.src-ocaml:before { content: 'Objective Caml'; }
- pre.src-octave:before { content: 'Octave'; }
- pre.src-org:before { content: 'Org mode'; }
- pre.src-oz:before { content: 'OZ'; }
- pre.src-plantuml:before { content: 'Plantuml'; }
- pre.src-processing:before { content: 'Processing.js'; }
- pre.src-python:before { content: 'Python'; }
- pre.src-R:before { content: 'R'; }
- pre.src-ruby:before { content: 'Ruby'; }
- pre.src-sass:before { content: 'Sass'; }
- pre.src-scheme:before { content: 'Scheme'; }
- pre.src-screen:before { content: 'Gnu Screen'; }
- pre.src-sed:before { content: 'Sed'; }
- pre.src-sh:before { content: 'shell'; }
- pre.src-sql:before { content: 'SQL'; }
- pre.src-sqlite:before { content: 'SQLite'; }
- /* additional languages in org.el's org-babel-load-languages alist */
- pre.src-forth:before { content: 'Forth'; }
- pre.src-io:before { content: 'IO'; }
- pre.src-J:before { content: 'J'; }
- pre.src-makefile:before { content: 'Makefile'; }
- pre.src-maxima:before { content: 'Maxima'; }
- pre.src-perl:before { content: 'Perl'; }
- pre.src-picolisp:before { content: 'Pico Lisp'; }
- pre.src-scala:before { content: 'Scala'; }
- pre.src-shell:before { content: 'Shell Script'; }
- pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
- /* additional language identifiers per "defun org-babel-execute"
- in ob-*.el */
- pre.src-cpp:before { content: 'C++'; }
- pre.src-abc:before { content: 'ABC'; }
- pre.src-coq:before { content: 'Coq'; }
- pre.src-groovy:before { content: 'Groovy'; }
- /* additional language identifiers from org-babel-shell-names in
- ob-shell.el: ob-shell is the only babel language using a lambda to put
- the execution function name together. */
- pre.src-bash:before { content: 'bash'; }
- pre.src-csh:before { content: 'csh'; }
- pre.src-ash:before { content: 'ash'; }
- pre.src-dash:before { content: 'dash'; }
- pre.src-ksh:before { content: 'ksh'; }
- pre.src-mksh:before { content: 'mksh'; }
- pre.src-posh:before { content: 'posh'; }
- /* Additional Emacs modes also supported by the LaTeX listings package */
- pre.src-ada:before { content: 'Ada'; }
- pre.src-asm:before { content: 'Assembler'; }
- pre.src-caml:before { content: 'Caml'; }
- pre.src-delphi:before { content: 'Delphi'; }
- pre.src-html:before { content: 'HTML'; }
- pre.src-idl:before { content: 'IDL'; }
- pre.src-mercury:before { content: 'Mercury'; }
- pre.src-metapost:before { content: 'MetaPost'; }
- pre.src-modula-2:before { content: 'Modula-2'; }
- pre.src-pascal:before { content: 'Pascal'; }
- pre.src-ps:before { content: 'PostScript'; }
- pre.src-prolog:before { content: 'Prolog'; }
- pre.src-simula:before { content: 'Simula'; }
- pre.src-tcl:before { content: 'tcl'; }
- pre.src-tex:before { content: 'TeX'; }
- pre.src-plain-tex:before { content: 'Plain TeX'; }
- pre.src-verilog:before { content: 'Verilog'; }
- pre.src-vhdl:before { content: 'VHDL'; }
- pre.src-xml:before { content: 'XML'; }
- pre.src-nxml:before { content: 'XML'; }
- /* add a generic configuration mode; LaTeX export needs an additional
- (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
- pre.src-conf:before { content: 'Configuration File'; }
-
- table { border-collapse:collapse; }
- caption.t-above { caption-side: top; }
- caption.t-bottom { caption-side: bottom; }
- td, th { vertical-align:top; }
- th.org-right { text-align: center; }
- th.org-left { text-align: center; }
- th.org-center { text-align: center; }
- td.org-right { text-align: right; }
- td.org-left { text-align: left; }
- td.org-center { text-align: center; }
- dt { font-weight: bold; }
- .footpara { display: inline; }
- .footdef { margin-bottom: 1em; }
- .figure { padding: 1em; }
- .figure p { text-align: center; }
- .equation-container {
- display: table;
- text-align: center;
- width: 100%;
- }
- .equation {
- vertical-align: middle;
- }
- .equation-label {
- display: table-cell;
- text-align: right;
- vertical-align: middle;
- }
- .inlinetask {
- padding: 10px;
- border: 2px solid gray;
- margin: 10px;
- background: #ffffcc;
- }
- #org-div-home-and-up
- { text-align: right; font-size: 70%; white-space: nowrap; }
- textarea { overflow-x: auto; }
- .linenr { font-size: smaller }
- .code-highlighted { background-color: #ffff00; }
- .org-info-js_info-navigation { border-style: none; }
- #org-info-js_console-label
- { font-size: 10px; font-weight: bold; white-space: nowrap; }
- .org-info-js_search-highlight
- { background-color: #ffff00; color: #000000; font-weight: bold; }
- .org-svg { width: 90%; }
- /*]]>*/-->
-</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org48501fe">1. My Blog/Phlog Workflow</a></li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org48501fe" class="outline-2">
-<h2 id="org48501fe"><span class="section-number-2">1</span> My Blog/Phlog Workflow</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-I only started really writing anything down with intention for myself
-in the past few months. I'm slowly trying to ramp up and write a bit more.
-</p>
-
-<p>
-I'm a very talking oriented person if that makes sense, and I find it
-difficult to write things that I think are coherent. I also tend to be
-a rambler in person who constantly over-explains. This also doesn't
-translate well to writing.
-</p>
-
-<p>
-To that point, I think part of why I talk so much is because it helps
-me organize my thoughts. They rattle around in my head in an incoherent
-jumbled mess and spewing them out helps me to hear what they actually are.
-</p>
-
-<p>
-However, it's not always easy to talk to people. Maybe people aren't around,
-maybe they don't want to talk, maybe they do but not about what you want
-to talk about, etc etc.
-</p>
-
-<p>
-To that end I figured I should try and write more things, even if no one
-ever reads them, just so I can practice that act of thoughtfulness and
-trying to codify my thoughts.
-</p>
-
-<p>
-Preamble aside, I figured I'd write something about my blog posting
-infrastructure which may be of some interest. I have two places I
-post my blogs:
-</p>
-
-<ul class="org-ul">
-<li><a href="https://spwbk.site">https://spwbk.site</a></li>
-<li><a href="gopher://chate.io">gopher://chate.io</a></li>
-</ul>
-
-<p>
-Because the files that represent the blog posts for these platforms
-are pretty different, I needed a way to be able to write a post in a
-comfortable, ergonomic way and then "deploy" it to the various places
-I want it to be visible from. Here's what I came up with:
-</p>
-
-<p>
-I write my blog posts in Emacs, in org-mode. I like org-mode and use it
-for other stuff, and it's an environment I'm comfortable with. Additionally,
-I can export org mode documents as HTML, which helps a lot.
-</p>
-
-<p>
-So after I'm done writing my post, I save my .org file, and then export it
-to HTML.
-</p>
-
-<p>
-From there I do some minor edits on the HTML manually. This is just to update
-some <style> tags for the HTML version so that it's not so utiltarian. If
-I understand correctly, there should be a way to configure org so that it
-puts my <style> values in, but I'm not sure how to do that yet. Something
-to look into later.
-</p>
-
-<p>
-After I tweak the HTML file, I now have 2 files:
-</p>
-<ul class="org-ul">
-<li>blog<sub>post.org</sub></li>
-<li>blog<sub>post.pretty.html</sub></li>
-</ul>
-
-<p>
-Typically I still have both of these open in buffers in Emacs, so I
-wrote a little elisp shell wrapper to shell out to rclone, which posts
-the file in the buffer to a bucket in BackBlaze B2.
-</p>
-
-<p>
-Every few minutes on my respective servers, a little script runs that
-gets any new blog posts.
-</p>
-
-<p>
-On the HTTP server it grabs the .pretty.html file, and on the gopher
-server it grabs the .org file, and places them in their respective places.
-</p>
-
-<p>
-Once this is done, the script uses <a href="https://ntfy.sh">https://ntfy.sh</a> to send me a notification
-that the files have been deployed.
-</p>
-
-<p>
-To review, the process essentially looks like this:
-</p>
-
-<p>
-Write in emacs -> save as .org file -> export .org as .html -> modify
-html <style> -> upload to B2 -> wait a few minutes.
-</p>
-
-<p>
-I can do all of my blogging from Emacs without ever having to touch anything
-else, and I get a notification on my phone to confirm that the blogs have
-been uploaded successfully!
-</p>
-
-<p>
-I really like this system, and because it feels easy to use for myself,
-I find myself blogging more and more!
-</p>
-
-<p>
-Thanks for reading!
-</p>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-21 Fri 16:24</p>
-<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
-</div>
-</body>
-</html>
diff --git a/2022-01-21-blog-workflow.pretty.html b/2022-01-21-blog-workflow.pretty.html
deleted file mode 100644
index 392f9fa..0000000
--- a/2022-01-21-blog-workflow.pretty.html
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-21 Fri 16:24 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#org48501fe">1. My Blog/Phlog Workflow</a></li>
-</ul>
-</div>
-</div>
-<div id="outline-container-org48501fe" class="outline-2">
-<h2 id="org48501fe"><span class="section-number-2">1</span> My Blog/Phlog Workflow</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-I only started really writing anything down with intention for myself
-in the past few months. I'm slowly trying to ramp up and write a bit more.
-</p>
-
-<p>
-I'm a very talking oriented person if that makes sense, and I find it
-difficult to write things that I think are coherent. I also tend to be
-a rambler in person who constantly over-explains. This also doesn't
-translate well to writing.
-</p>
-
-<p>
-To that point, I think part of why I talk so much is because it helps
-me organize my thoughts. They rattle around in my head in an incoherent
-jumbled mess and spewing them out helps me to hear what they actually are.
-</p>
-
-<p>
-However, it's not always easy to talk to people. Maybe people aren't around,
-maybe they don't want to talk, maybe they do but not about what you want
-to talk about, etc etc.
-</p>
-
-<p>
-To that end I figured I should try and write more things, even if no one
-ever reads them, just so I can practice that act of thoughtfulness and
-trying to codify my thoughts.
-</p>
-
-<p>
-Preamble aside, I figured I'd write something about my blog posting
-infrastructure which may be of some interest. I have two places I
-post my blogs:
-</p>
-
-<ul class="org-ul">
-<li><a href="https://spwbk.site">https://spwbk.site</a></li>
-<li><a href="gopher://chate.io">gopher://chate.io</a></li>
-</ul>
-
-<p>
-Because the files that represent the blog posts for these platforms
-are pretty different, I needed a way to be able to write a post in a
-comfortable, ergonomic way and then "deploy" it to the various places
-I want it to be visible from. Here's what I came up with:
-</p>
-
-<p>
-I write my blog posts in Emacs, in org-mode. I like org-mode and use it
-for other stuff, and it's an environment I'm comfortable with. Additionally,
-I can export org mode documents as HTML, which helps a lot.
-</p>
-
-<p>
-So after I'm done writing my post, I save my .org file, and then export it
-to HTML.
-</p>
-
-<p>
-From there I do some minor edits on the HTML manually. This is just to update
-some <style> tags for the HTML version so that it's not so utiltarian. If
-I understand correctly, there should be a way to configure org so that it
-puts my <style> values in, but I'm not sure how to do that yet. Something
-to look into later.
-</p>
-
-<p>
-After I tweak the HTML file, I now have 2 files:
-</p>
-<ul class="org-ul">
-<li>blog<sub>post.org</sub></li>
-<li>blog<sub>post.pretty.html</sub></li>
-</ul>
-
-<p>
-Typically I still have both of these open in buffers in Emacs, so I
-wrote a little elisp shell wrapper to shell out to rclone, which posts
-the file in the buffer to a bucket in BackBlaze B2.
-</p>
-
-<p>
-Every few minutes on my respective servers, a little script runs that
-gets any new blog posts.
-</p>
-
-<p>
-On the HTTP server it grabs the .pretty.html file, and on the gopher
-server it grabs the .org file, and places them in their respective places.
-</p>
-
-<p>
-Once this is done, the script uses <a href="https://ntfy.sh">https://ntfy.sh</a> to send me a notification
-that the files have been deployed.
-</p>
-
-<p>
-To review, the process essentially looks like this:
-</p>
-
-<p>
-Write in emacs -> save as .org file -> export .org as .html -> modify
-html <style> -> upload to B2 -> wait a few minutes.
-</p>
-
-<p>
-I can do all of my blogging from Emacs without ever having to touch anything
-else, and I get a notification on my phone to confirm that the blogs have
-been uploaded successfully!
-</p>
-
-<p>
-I really like this system, and because it feels easy to use for myself,
-I find myself blogging more and more!
-</p>
-
-<p>
-Thanks for reading!
-</p>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-21 Fri 16:24</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-26-rogue-like-design.html b/2022-01-26-rogue-like-design.html
deleted file mode 100644
index d62b03a..0000000
--- a/2022-01-26-rogue-like-design.html
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-26 Wed 15:19 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#orgbdbcc61">1. Repetition and Death - The Fun of Roguelike Game Design</a>
-<ul>
-<li><a href="#org5a55300">1.1. Preamble and Rogue Primer</a></li>
-<li><a href="#orgbf270c5">1.2. What Makes Roguelikes/Roguelites So Fun</a></li>
-<li><a href="#org88b7813">1.3. Closing Thoughts</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-orgbdbcc61" class="outline-2">
-<h2 id="orgbdbcc61"><span class="section-number-2">1</span> Repetition and Death - The Fun of Roguelike Game Design</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-I love Roguelikes. It's my absolute favorite genre of video
-games. I'd like to talk a bit about them in this blog post;
-specifically what I believe makes them so compelling, and what keeps
-me spending my scarce video game time in this genre.
-</p>
-</div>
-
-<div id="outline-container-org5a55300" class="outline-3">
-<h3 id="org5a55300"><span class="section-number-3">1.1</span> Preamble and Rogue Primer</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-There seem to be several competing definitions of what
-a 'roguelike' is. It's a topic that is frequently
-debated by lovers of the genre and it's associtated
-offshoots.
-</p>
-
-<p>
-Skip this section if you're familiar/uninterested in the
-Roguelike definition argument and are more interested in
-my thoughts on what makes these games fun/interesting.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-I tend to like the following break downs:
-</p>
-
-<p>
-Rogue/like/: A genre characterized by its similarity to the
-game Rogue (1980). Rogue was originally released for Unix
-mainframe systems.
-</p>
-
-<p>
-Additionally: See the following HTTP website for
-the "Berlin Interpretation" of what a roguelike is:
--> <a href="http://www.roguebasin.com/index.php/Berlin_Interpretation">http://www.roguebasin.com/index.php/Berlin_Interpretation</a>
-</p>
-
-<p>
-The above is widely used as a yard stick to determine if
-something is a roguelike or not, though not everyone
-agrees on this definition.
-</p>
-
-<p>
-What <i>I</i> typically think of as a Roguelike
-is a game with the following characteristics:
-</p>
-
-<p>
--> ASCII and/or tile based graphics
--> Turn based game play
--> Permadeath
--> Procedural generation of game objects (levels, items, etc)
-</p>
-
-<p>
-Examples of classic Roguelikes (excluding Rogue):
-</p>
-
-<ul class="org-ul">
-<li>Moria</li>
-<li>Angbad</li>
-<li>Hack/NetHack</li>
-<li>Dwarf Fortress (Adventure Mode)</li>
-</ul>
-
-<p>
-Some modern games that I think encapsulate the spirit
-of these classic games, while modernizing their interfaces
-and ergonomics are games such as:
-</p>
-
-<ul class="org-ul">
-<li>Caves of Qud</li>
-<li>Cogmind</li>
-<li>Riftwizard</li>
-<li>Many others, see "Traditional Roguelike" tag on Steam
-for more examples</li>
-</ul>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-So now that we've covered the definition of a Roguelike,
-lets look at a slightly different definition that's
-emergered in the last two decades or so. What many people
-call a 'Roguelite'.
-</p>
-
-<p>
-Rogue/lite/: A genre that borrows many gameplay and
-game design elements from classic Roguelikes, but
-abandons others in service to a different game design or
-direction. This is a very diverse genre, that mashes Roguelike
-mechanics with a diverse set of other genres like first person
-shooters, action RPGs, strategy games, and more.
-</p>
-
-<p>
-Modern examples of what I'd call roguelites:
-</p>
-
-<ul class="org-ul">
-<li>Dead Cells</li>
-<li>Hades</li>
-<li>Ziggurat</li>
-<li>FTL</li>
-<li>Risk of Rain / Risk of Rain 2</li>
-<li>Slay The Spire</li>
-<li>Enter The Gungeon</li>
-<li>Many many more, see the "Roguelike" tag on Steam</li>
-</ul>
-
-<p>
-Many roguelites typically include what I call a
-"inverse difficulty curve" mechanic, which I'll touch more on
-in the next section.
-</p>
-</div>
-</div>
-
-
-<div id="outline-container-orgbf270c5" class="outline-3">
-<h3 id="orgbf270c5"><span class="section-number-3">1.2</span> What Makes Roguelikes/Roguelites So Fun</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-Note: Henceforth when I say <b>RLs</b> I mean the broader
-genre of roguelike and roguelites, unless otherwise specified.
-</p>
-
-<p>
-At a high level, I think the answer to this question (for me)
-is pretty simple. The best RLs keep one design choice at their
-center IMHO:
-</p>
-
-<p>
-–> Sufficient mastery of the games systems allows you to trivialize
-the games difficulty.
-</p>
-
-<p>
-Put another way, once you know the game well enough and have
-traversed it's skill curve, inventive and exicting synergies
-should start to emerge that you can capitalize on to absolutely
-"break" the game. The euphoria of completely dominating a game,
-by having mastered a set of "hard skills" and "abstract skills"
-is (for me) unparalleled in comparison to other video game genres.
-</p>
-
-<p>
-–> "Hard skills" can be defined as skill that's related to direct
-player input and control mastery. This is for stuff like
-dodging attacks, managing inventory, memorizing enemy moves,
-etc. Typically these are less prevalent in "classic" roguelikes
-</p>
-
-<p>
-–> "Soft skills" can be defined as mastery over the games
-systems. Things like core mechanic functionality, understanding
-how gameplay elements/effects synergize and reinforce emergent
-properties.
- —> Eg. Your character has spell that sets themselves
- on fire, but you have a fire resistance amulet and the floor
- is covered in flammable oil
-</p>
-
-<p>
-We'll come back to this idea, but lets take a step back for a moment.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-Most RLs typically contain the following ingrediants at the core of
-their design:
-</p>
-
-<p>
-–> A repetative core gameplay loop, structured upon a base set of
- design choices
-</p>
-
-<p>
-–> Some kind of core hook(s), designed to keep you engaged with
- the repetative game loop
-</p>
-
-<p>
-This classification might on it's face seem to exclude a favorite
-RL of yours, but allow me to explain with some examples.
-</p>
-
-<p>
-The (roguelite) game Hades has a tight core gameplay loop. You
-have movement, a dash, and 3 different attacks. Enemies spawn,
-and you fight them. Layered on top, you have a number of different
-systems that start to ramp up the depth of the games systems.
-</p>
-
-<p>
-As you progress through the game, these systems start to get
-more complex and offer more choices. These systems (in Hades'
-case, the excellent story as well), define the "hooks" that
-take what is at it's core a relatively simple game, and turn
-it into something remarkable.
-</p>
-
-<p>
-To look at a more "classic" roguelike like Caves of Qud,
-the core hook is the vast set of emergent gameplay possibilties
-offered by the games core systems. Because the ingame world
-is vast and uses meticulously curated procedural generation,
-the oppertunities for making exciting game play choices are
-extremely vast, which creates a desire to continue playing
-and experimenting.
-</p>
-
-<p>
-As you spend more time in the game, you start to
-understand how your interactions with these gameplay systems
-inform other system interactions you'll have later on. After a
-sufficient amount of time engaging with these systems, you start
-to see clear (or sometimes unclear) patterns of how to maximize
-your effectiveness.
-</p>
-
-<p>
-At it's best, your time spend mastering the "hard skills" and
-"abstract skills" is rewarded by gameplay events where
-you make a fool of the games difficulty.
-</p>
-
-<p>
-Because you've developed such a deep understanding of the
-systems, you can now absolutely crush the game as a satisfying
-reward for your skill and ingenuity.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-In RLs I see two kind of distinct patterns for leading
-the player to this game breaking power fantasy.
-</p>
-
-<p>
-In modern roguelites, I typically see this being
-introduced as what I called earlier an "inverse
-difficulty curve".
-</p>
-
-<p>
-Games that implement this system will typically
-have some kind of character state that is tracked
-across runs of the core gameplay loop. Advancing
-this state makes every subsequent run easier,
-or at least presents more choices.
-</p>
-
-<p>
-An example of this is something like Enter The
-Gungeon. When you start the game, you have very
-few items unlocked, and you also don't have a
-good grasp on the "hard skills", as you just
-started playing. As you play (and fail), you
-might unlock a new gun or item every other run.
-</p>
-
-<p>
-Over time, this effect snowballs. As you get
-better at the "hard skills", so does your
-understanding of the "abstract skills",
-and you have more choices (items/spells/powerups)
-at your disposal.
-</p>
-
-<p>
-This actually has the effect of making the game
-<i>easier</i> over time, but very cleverly, and
-without changing the feel of the game that
-much. Good roguelites pace the challenge
-of the game to match this easier-over-time
-feeling.
-</p>
-
-<p>
-The culmination of this is typically "clearing"
-the dungeon/story/etc of the game for the first
-time, usually on what I'd call a "broken" run.
-</p>
-
-<p>
-A run of the core game where you've finally
-internalized the hard skills and systems
-well enough to complete a run of the game, and
-managed to do so with a spectacular set of
-gameplay decisions.
-</p>
-
-<p>
-Capitalizing on this understanding can lead you to keep
-running the game, ever searching for an even more broken run,
-where you've capitalized even further on your knowledge of
-the games systems.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-In more classic Roguelike's, that don't offer this so called
-"inverse difficulty curve", typically the carrot on the stick
-is the implicit desire to clear the game. For example in NetHack,
-to reach the lowest floor of the dungeon. But more than that,
-it's the fun of dynamically adapting to the choices the games
-systems present you.
-</p>
-
-<p>
-RLs typically use procedural generation to create what can sometimes
-feel like a slot machine. There's this intoxicating brew when starting
-a run of what kind of luck you'll have, what kind of items you'll discover,
-what kind of build will emerge based on the choices the game presents you.
-</p>
-
-<p>
-In games like Caves of Qud, I've had runs end minutes into them, due to poor
-luck, poor gameplay decisions made on my part, etc. I've also had runs where
-all of my choices happened to make sense and perfect synergies revealed themselves
-and I absolutely mopped up.
-</p>
-
-<p>
-But these are typically outliers, and not where the real joy lies IMHO.
-</p>
-
-<p>
-The best runs are those that keep you constantly guessing, on the edge
-of your seat. Forcing you to constantly reevaluate your build, the
-choices you've made so far. They force you to make difficult compromises
-between what's fun, interesting, and viable.
-</p>
-
-<p>
-They push your understanding and intuition about the games systems to
-the absolute limit, and when you overcome these challeneges, it is
-the absolute pinnacle of what video games can offer as a form of
-entertainment.
-</p>
-
-<p>
-In my opinion at least.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org88b7813" class="outline-3">
-<h3 id="org88b7813"><span class="section-number-3">1.3</span> Closing Thoughts</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-If you made it all the way here, thanks for reading, I
-know this was a longer one. I surprisingly have quite a
-bit more to say on this topic, but figured I'd maybe leave
-it for another time, as I've already coverted a lot here.
-</p>
-
-<p>
-If you already love and play lots of RLs, right on.
-</p>
-
-<p>
-If you're someone who hasn't checked them out yet, I'd
-encourage you to give them a try, there's nothing quite
-like them :)
-</p>
-
-<p>
-Thanks for reading
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-26 Wed 15:19</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-26-rogue-like-design.pretty.html b/2022-01-26-rogue-like-design.pretty.html
deleted file mode 100644
index 8562cfc..0000000
--- a/2022-01-26-rogue-like-design.pretty.html
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<!-- 2022-01-26 Wed 15:19 -->
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>‎</title>
-<meta name="generator" content="Org mode" />
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>
-<script type="text/javascript">
-// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.add("code-highlighted");
- target.classList.add("code-highlighted");
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.classList.remove("code-highlighted");
- target.classList.remove("code-highlighted");
- }
- }
- /*]]>*///-->
-// @license-end
-</script>
-</head>
-<body>
-<div id="content">
-<div id="table-of-contents">
-<h2>Table of Contents</h2>
-<div id="text-table-of-contents">
-<ul>
-<li><a href="#orgbdbcc61">1. Repetition and Death - The Fun of Roguelike Game Design</a>
-<ul>
-<li><a href="#org5a55300">1.1. Preamble and Rogue Primer</a></li>
-<li><a href="#orgbf270c5">1.2. What Makes Roguelikes/Roguelites So Fun</a></li>
-<li><a href="#org88b7813">1.3. Closing Thoughts</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div id="outline-container-orgbdbcc61" class="outline-2">
-<h2 id="orgbdbcc61"><span class="section-number-2">1</span> Repetition and Death - The Fun of Roguelike Game Design</h2>
-<div class="outline-text-2" id="text-1">
-<p>
-I love Roguelikes. It's my absolute favorite genre of video
-games. I'd like to talk a bit about them in this blog post;
-specifically what I believe makes them so compelling, and what keeps
-me spending my scarce video game time in this genre.
-</p>
-</div>
-
-<div id="outline-container-org5a55300" class="outline-3">
-<h3 id="org5a55300"><span class="section-number-3">1.1</span> Preamble and Rogue Primer</h3>
-<div class="outline-text-3" id="text-1-1">
-<p>
-There seem to be several competing definitions of what
-a 'roguelike' is. It's a topic that is frequently
-debated by lovers of the genre and it's associtated
-offshoots.
-</p>
-
-<p>
-Skip this section if you're familiar/uninterested in the
-Roguelike definition argument and are more interested in
-my thoughts on what makes these games fun/interesting.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-I tend to like the following break downs:
-</p>
-
-<p>
-Rogue/like/: A genre characterized by its similarity to the
-game Rogue (1980). Rogue was originally released for Unix
-mainframe systems.
-</p>
-
-<p>
-Additionally: See the following HTTP website for
-the "Berlin Interpretation" of what a roguelike is:
--> <a href="http://www.roguebasin.com/index.php/Berlin_Interpretation">http://www.roguebasin.com/index.php/Berlin_Interpretation</a>
-</p>
-
-<p>
-The above is widely used as a yard stick to determine if
-something is a roguelike or not, though not everyone
-agrees on this definition.
-</p>
-
-<p>
-What <i>I</i> typically think of as a Roguelike
-is a game with the following characteristics:
-</p>
-
-<p>
--> ASCII and/or tile based graphics</br>
--> Turn based game play</br>
--> Permadeath</br>
--> Procedural generation of game objects (levels, items, etc)</br>
-</p>
-
-<p>
-Examples of classic Roguelikes (excluding Rogue):
-</p>
-
-<ul class="org-ul">
-<li>Moria</li>
-<li>Angbad</li>
-<li>Hack/NetHack</li>
-<li>Dwarf Fortress (Adventure Mode)</li>
-</ul>
-
-<p>
-Some modern games that I think encapsulate the spirit
-of these classic games, while modernizing their interfaces
-and ergonomics are games such as:
-</p>
-
-<ul class="org-ul">
-<li>Caves of Qud</li>
-<li>Cogmind</li>
-<li>Riftwizard</li>
-<li>Many others, see "Traditional Roguelike" tag on Steam
-for more examples</li>
-</ul>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-So now that we've covered the definition of a Roguelike,
-lets look at a slightly different definition that's
-emergered in the last two decades or so. What many people
-call a 'Roguelite'.
-</p>
-
-<p>
-Rogue/lite/: A genre that borrows many gameplay and
-game design elements from classic Roguelikes, but
-abandons others in service to a different game design or
-direction. This is a very diverse genre, that mashes Roguelike
-mechanics with a diverse set of other genres like first person
-shooters, action RPGs, strategy games, and more.
-</p>
-
-<p>
-Modern examples of what I'd call roguelites:
-</p>
-
-<ul class="org-ul">
-<li>Dead Cells</li>
-<li>Hades</li>
-<li>Ziggurat</li>
-<li>FTL</li>
-<li>Risk of Rain / Risk of Rain 2</li>
-<li>Slay The Spire</li>
-<li>Enter The Gungeon</li>
-<li>Many many more, see the "Roguelike" tag on Steam</li>
-</ul>
-
-<p>
-Many roguelites typically include what I call a
-"inverse difficulty curve" mechanic, which I'll touch more on
-in the next section.
-</p>
-</div>
-</div>
-
-
-<div id="outline-container-orgbf270c5" class="outline-3">
-<h3 id="orgbf270c5"><span class="section-number-3">1.2</span> What Makes Roguelikes/Roguelites So Fun</h3>
-<div class="outline-text-3" id="text-1-2">
-<p>
-Note: Henceforth when I say <b>RLs</b> I mean the broader
-genre of roguelike and roguelites, unless otherwise specified.
-</p>
-
-<p>
-At a high level, I think the answer to this question (for me)
-is pretty simple. The best RLs keep one design choice at their
-center IMHO:
-</p>
-
-<p>
-–> Sufficient mastery of the games systems allows you to trivialize
-the games difficulty.
-</p>
-
-<p>
-Put another way, once you know the game well enough and have
-traversed it's skill curve, inventive and exicting synergies
-should start to emerge that you can capitalize on to absolutely
-"break" the game. The euphoria of completely dominating a game,
-by having mastered a set of "hard skills" and "abstract skills"
-is (for me) unparalleled in comparison to other video game genres.
-</p>
-
-<p>
-–> "Hard skills" can be defined as skill that's related to direct
-player input and control mastery. This is for stuff like
-dodging attacks, managing inventory, memorizing enemy moves,
-etc. Typically these are less prevalent in "classic" roguelikes
-</p>
-
-<p>
-–> "Soft skills" can be defined as mastery over the games
-systems. Things like core mechanic functionality, understanding
-how gameplay elements/effects synergize and reinforce emergent
-properties.</br>
- —> Eg. Your character has spell that sets themselves
- on fire, but you have a fire resistance amulet and the floor
- is covered in flammable oil
-</p>
-
-<p>
-We'll come back to this idea, but lets take a step back for a moment.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-Most RLs typically contain the following ingrediants at the core of
-their design:
-</p>
-
-<p>
-–> A repetative core gameplay loop, structured upon a base set of
- design choices
-</p>
-
-<p>
-–> Some kind of core hook(s), designed to keep you engaged with
- the repetative game loop
-</p>
-
-<p>
-This classification might on it's face seem to exclude a favorite
-RL of yours, but allow me to explain with some examples.
-</p>
-
-<p>
-The (roguelite) game Hades has a tight core gameplay loop. You
-have movement, a dash, and 3 different attacks. Enemies spawn,
-and you fight them. Layered on top, you have a number of different
-systems that start to ramp up the depth of the games systems.
-</p>
-
-<p>
-As you progress through the game, these systems start to get
-more complex and offer more choices. These systems (in Hades'
-case, the excellent story as well), define the "hooks" that
-take what is at it's core a relatively simple game, and turn
-it into something remarkable.
-</p>
-
-<p>
-To look at a more "classic" roguelike like Caves of Qud,
-the core hook is the vast set of emergent gameplay possibilties
-offered by the games core systems. Because the ingame world
-is vast and uses meticulously curated procedural generation,
-the oppertunities for making exciting game play choices are
-extremely vast, which creates a desire to continue playing
-and experimenting.
-</p>
-
-<p>
-As you spend more time in the game, you start to
-understand how your interactions with these gameplay systems
-inform other system interactions you'll have later on. After a
-sufficient amount of time engaging with these systems, you start
-to see clear (or sometimes unclear) patterns of how to maximize
-your effectiveness.
-</p>
-
-<p>
-At it's best, your time spend mastering the "hard skills" and
-"abstract skills" is rewarded by gameplay events where
-you make a fool of the games difficulty.
-</p>
-
-<p>
-Because you've developed such a deep understanding of the
-systems, you can now absolutely crush the game as a satisfying
-reward for your skill and ingenuity.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-In RLs I see two kind of distinct patterns for leading
-the player to this game breaking power fantasy.
-</p>
-
-<p>
-In modern roguelites, I typically see this being
-introduced as what I called earlier an "inverse
-difficulty curve".
-</p>
-
-<p>
-Games that implement this system will typically
-have some kind of character state that is tracked
-across runs of the core gameplay loop. Advancing
-this state makes every subsequent run easier,
-or at least presents more choices.
-</p>
-
-<p>
-An example of this is something like Enter The
-Gungeon. When you start the game, you have very
-few items unlocked, and you also don't have a
-good grasp on the "hard skills", as you just
-started playing. As you play (and fail), you
-might unlock a new gun or item every other run.
-</p>
-
-<p>
-Over time, this effect snowballs. As you get
-better at the "hard skills", so does your
-understanding of the "abstract skills",
-and you have more choices (items/spells/powerups)
-at your disposal.
-</p>
-
-<p>
-This actually has the effect of making the game
-<i>easier</i> over time, but very cleverly, and
-without changing the feel of the game that
-much. Good roguelites pace the challenge
-of the game to match this easier-over-time
-feeling.
-</p>
-
-<p>
-The culmination of this is typically "clearing"
-the dungeon/story/etc of the game for the first
-time, usually on what I'd call a "broken" run.
-</p>
-
-<p>
-A run of the core game where you've finally
-internalized the hard skills and systems
-well enough to complete a run of the game, and
-managed to do so with a spectacular set of
-gameplay decisions.
-</p>
-
-<p>
-Capitalizing on this understanding can lead you to keep
-running the game, ever searching for an even more broken run,
-where you've capitalized even further on your knowledge of
-the games systems.
-</p>
-
-<p>
-<span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline"><span class="underline">_</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
-</p>
-
-<p>
-In more classic Roguelike's, that don't offer this so called
-"inverse difficulty curve", typically the carrot on the stick
-is the implicit desire to clear the game. For example in NetHack,
-to reach the lowest floor of the dungeon. But more than that,
-it's the fun of dynamically adapting to the choices the games
-systems present you.
-</p>
-
-<p>
-RLs typically use procedural generation to create what can sometimes
-feel like a slot machine. There's this intoxicating brew when starting
-a run of what kind of luck you'll have, what kind of items you'll discover,
-what kind of build will emerge based on the choices the game presents you.
-</p>
-
-<p>
-In games like Caves of Qud, I've had runs end minutes into them, due to poor
-luck, poor gameplay decisions made on my part, etc. I've also had runs where
-all of my choices happened to make sense and perfect synergies revealed themselves
-and I absolutely mopped up.
-</p>
-
-<p>
-But these are typically outliers, and not where the real joy lies IMHO.
-</p>
-
-<p>
-The best runs are those that keep you constantly guessing, on the edge
-of your seat. Forcing you to constantly reevaluate your build, the
-choices you've made so far. They force you to make difficult compromises
-between what's fun, interesting, and viable.
-</p>
-
-<p>
-They push your understanding and intuition about the games systems to
-the absolute limit, and when you overcome these challeneges, it is
-the absolute pinnacle of what video games can offer as a form of
-entertainment.
-</p>
-
-<p>
-In my opinion at least.
-</p>
-</div>
-</div>
-
-<div id="outline-container-org88b7813" class="outline-3">
-<h3 id="org88b7813"><span class="section-number-3">1.3</span> Closing Thoughts</h3>
-<div class="outline-text-3" id="text-1-3">
-<p>
-If you made it all the way here, thanks for reading, I
-know this was a longer one. I surprisingly have quite a
-bit more to say on this topic, but figured I'd maybe leave
-it for another time, as I've already coverted a lot here.
-</p>
-
-<p>
-If you already love and play lots of RLs, right on.
-</p>
-
-<p>
-If you're someone who hasn't checked them out yet, I'd
-encourage you to give them a try, there's nothing quite
-like them :)
-</p>
-
-<p>
-Thanks for reading
-</p>
-</div>
-</div>
-</div>
-</div>
-<div id="postamble" class="status">
-<p class="date">Created: 2022-01-26 Wed 15:19</p>
-</div>
-</body>
-</html>
diff --git a/2022-01-21-blog-workflow.org b/blog-workflow.org
similarity index 100%
rename from 2022-01-21-blog-workflow.org
rename to blog-workflow.org
diff --git a/2021-emacs-windows.org b/emacs-windows.org
similarity index 100%
rename from 2021-emacs-windows.org
rename to emacs-windows.org
diff --git a/2022-01-13-es-json.org b/es-json.org
similarity index 100%
rename from 2022-01-13-es-json.org
rename to es-json.org
diff --git a/2022-01-20-gopher-setup.org b/gopher-setup.org
similarity index 100%
rename from 2022-01-20-gopher-setup.org
rename to gopher-setup.org
diff --git a/in-defense-of-perl.org b/in-defense-of-perl.org
new file mode 100644
index 0000000..e31ccf2
--- /dev/null
+++ b/in-defense-of-perl.org
@@ -0,0 +1,351 @@
+https://
+gopher://
+#+AUTHOR: Simon Watson
+#+TITLE: In Defense of Perl
+
+* Preamble
+
+ I've wanted to blog about Perl for a while now. I've had this conversation
+ with quite a few friends, peers, and co-workers over the years and I can never
+ seem to fully get to the bottom of it.
+
+ Perl has obviously lost a lot of ground in recent decades, and is not really
+ what I would consider a popular language anymore. I think there are a few
+ reasons for this, and they're not unfair reasons.
+
+ With that said, in my experience Perl seems to have a very bad reputation. Not
+ only is it not popular, people are often offended by it. It seems to provoke
+ strong reactions.
+
+ Languages like Ruby and PHP are often called "dead" and "not modern", and seem
+ to have many people calling out their usage. With that said both of these langs
+ seem to be thriving with strong communities, and for every person that nay-says
+ their use, there is another in the discussion celebrating them.
+
+ This doesn't seem to be the case with Perl in my experience.
+
+ Below I'd like to "defend" Perl a bit, and show why it still has a place in the
+ modern computing landscape. In doing so I will try to be clear about my own biases
+ and forthcoming about Perl's many issues.
+
+ Disclaimer/Note: Most of the comparisons I make in this article are between Perl
+ and Python. Not because Python is a bad language, but because Python is commonly
+ the language that's suggested as the "better" alternative to writing
+ something in Perl.
+
+** My History and biases
+
+ Skip this section if you're more interested in the arguments I present on Perl's
+ behalf. This section is to give a litte background and to try and enumerate my
+ biases in favor of Perl.
+ ______________________________________________________________________________
+
+*** Bias #1
+
+ Perl was the first language I felt I had learned to a pretty complete level. I'm
+ always hesisitant to say I'm an expert in anything, but if I was ever an expert (or
+ close to it) in one area, it's probably Perl programming and syntax.
+
+ I think this immediately creates a bias in my head that Perl is a good language. I
+ think this kind of bias is pretty common when trying to talk about programming languages
+ objectively.
+
+ - I'm very familiar with it so it /feels/ easy
+ - I know all the standard patterns so I reach for it a lot, and
+ it's /very/ quick for me to write relative to other languages;
+ I often use it for prototyping even if I end up rewriting in
+ another lang later
+
+*** Bias #2
+
+ I'm a sysadmin by trade, not a software engineer. Despite that, I've had to write
+ and maintain software (especially things like tooling) many times in my career.
+
+ I mention this because I think Perl favors this profession more so than strict
+ software engineering jobs. I'll touch more on this later, but wanted to mention
+ this here.
+
+*** Bias #3
+
+ I very rarely need to deploy or write software for anything other than a Unix
+ environment, and even then 95% of the time, it's for a Linux environment. Again,
+ I'll cover this more later, but my experience and arguments are heavily biased
+ towards the /Unix/ Perl programming experience. Not only is this a bias, it's
+ a disclaimer of sorts, as I won't really be covering the non-Unix system Perl
+ programming experience.
+
+** Why Perl is "bad"
+
+ Before I get into my arguments for using Perl today, it's important to cover some
+ of it's downsides and talk a bit about why I believe it's been relatively abandoned
+ by the modern software development community.
+
+ I think one of the biggest reasons right off the bat that Perl has fallen by the wayside is
+ the Perl5/Perl6 debacle. Others have covered this pretty extensively, so I won't
+ belabor the point, but in essence I think the effort to "modernize" Perl, and
+ try and make it into a language that non-Perl users could love, while still keeping
+ Perl5 users happy, was too tall of an order. The spiral that came out of it fragmented
+ the community and userbase, and gave the inititive to Python.
+
+ The Perl wikipedia page has some decent coverage of the various Perl5/6/7 lineages:
+ https://en.wikipedia.org/wiki/Perl#Raku_(Perl_6)
+
+ ( For some more interesting reading/background, see:
+ https://en.wikipedia.org/wiki/Outline_of_Perl )
+
+ Secondly, the syntax. I will make some arguments for Perl's syntax later, but I'll take a
+ brief moment here to acknowledge that it can look esoteric on a good day, and down right
+ illegiable on a bad one. The heavy use of sigils is something I will aim to cast as a
+ positive later on, but I will admit that needing to memorize and have an awareness of
+ different context sensative sigils can make code look "messy" or hard to deciper. More
+ on this later.
+
+ Lastly, and by and large the argument I'm most likely to hear against using Perl:
+
+ "No one uses it."
+
+ In this blog post I hope to address these arguments and others, with
+ concrete and constructive counter points.
+
+ My aim in writing this is not to convince people to program in Perl. It's to convince
+ people that Perl is not only a perfectly fine language to use for many different problem
+ areas -- it's to show that it may in fact be the /better/ choice for some problem areas.
+
+ I hope the distinction is clear and that I can convince you!
+
+* Addressing Arguments
+
+ Preamble out of the way, I'll get right down to brass tacks.
+
+** Perl Syntax
+
+ People often talk about how Perl is completely unreadable and "write only". This can
+ be true, but I think it can be true for /any/ language, and as such doesn't really feel
+ like a valid criticism.
+
+ With that said, lets explore it a bit.
+
+ Let's start with something basic like making a hash using two arrays:
+
+ #+BEGIN_SRC perl
+ #!/usr/bin/perl
+
+ my @keys = ("a", "b", "c");
+ my @vals = (1, 2, 3);
+ my %hash;
+ @hash{@keys} = @vals;
+
+ # Output:
+ # perl ar2h.pl
+ # a : 1
+ # b : 2
+ # c : 3
+ #+END_SRC
+
+ #+BEGIN_SRC python
+ keys = ['a', 'b', 'c']
+ values = [1, 2, 3]
+ hash = {key: value for key, value in zip(keys, values)}
+ print(hash)
+
+ # Output:
+ # python3 ar2h.py
+ # {'a': 1, 'b': 2, 'c': 3}
+ #+END_SRC
+
+ For those unfamiliar with Perl's syntax, I'll break down briefly what's happening here:
+
+ We have two arrays with data in them, and an empty hash. Hashes in Perl are denoted by the '%'
+ symbol, arrays the '@' symbol.
+
+ By addressing the hash '%hash' with the '@' symbol, we are essentially addressing one dimention of
+ the hash. This 'syntax sugar' gives us an extremely ergonomic way to reason about how data assignment
+ is working in the assignment line.
+
+ We're taking the hash 'hash' and assigning the array 'keys' to it's first dimenstion, and the array
+ 'vals' and assigning it to it's second dimenstion. Because arrays are ordered, this mapping is
+ intuituve and predictable.
+
+ There's nothing terrible about the example Python code to me, but the idea that it's intrinsically
+ more readable doesn't ring true for me, it's just different, and presupposes that you understand
+ it's assignment syntax in the way Perl presupposes you understand it's sigils and tokens. To reiterate,
+ Python's syntax is no better or worse than Perl's in this case -- it's just different. The programmer
+ may have preferences for one or the other, but I don't think an argument can be made that one or the
+ other is objectively better.
+
+ OK, so you're probably thinking, this is such a ridiculous and contrived example, and that's true to
+ an extent. Let's take a look at something a little bit more involved.
+
+ Writing a program to emulate 'tail'.
+
+ I saw what I think is an extremely elegant way to do this in Python, see:
+ http://www.dabeaz.com/coroutines/follow.py
+ http://www.dabeaz.com/coroutines/
+
+ For the sake of ease the code above has been copied below. I've changed it slightly
+ to work for my version of Python.
+
+ #+BEGIN_SRC python
+ import time
+ def follow(thefile):
+ thefile.seek(0,2) # Go to the end of the file
+
+ while True:
+ line = thefile.readline()
+ if not line:
+ time.sleep(0.1) # Sleep briefly
+ continue
+ yield line
+
+ # Example use
+ if __name__ == '__main__':
+ logfile = open("log_file")
+ for line in follow(logfile):
+ print(line)
+ #+END_SRC
+
+ The above Python code snippet features some cool async features, but I'm not aiming to talk about that here. I provided
+ above simply because I think it show cases some of Python's more elegant syntax and expressive qualities.
+
+ Below is a code snippet in Perl that performs roughly the same thing (from a user point of view):
+
+ #+BEGIN_SRC perl
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ open(my $fh, '<', "log_file");
+
+ while () {
+ seek($fh, 0, 1);
+ print(readline($fh));
+ sleep 1;
+ }
+
+ close($fh);
+ #+END_SRC
+
+ Again, echoing the sentiments from above. I think both of these implementations are perfectly readable and expressive, and
+ don't ask /too/ much of the user unfamiliar with the language:
+ - open a file handle
+ - seek to end of it
+ - read the line
+ - print the line
+
+ With some contrived examples out of the way, I'm going to provide a code example from some code I wrote in
+ the past week:
+
+ #+BEGIN_SRC perl
+ if ( $log_file_path =~ m/(\d{4}-\d{2}-\d{2}).log/ ) {
+ my $log_date = $1;
+ $log_date =~ tr/-//d;
+ if ( $log_date < $LATEST_DATE ) {
+ next;
+ } else {
+ my ($serial, $parsed_log_ref) = parse_log($log_file_path, \&json_line_parser);
+ my $output_file_path = $PROCESSED_LOG_DIR_PATH . "/" . $serial;
+ write_parsed_log_array($output_file_path, $parsed_log_ref);
+ }
+ } else {
+ die "Couldn't match log date in &process_seat_dir, exiting...\n";
+ }
+ #+END_SRC
+
+ This is a code path taken frequently in a log parser I wrote from something at my job.
+
+ Let's walk through the code and break it down in plain English. Feel free to skip if it's self evident:
+
+ Enter the =if= block if the variable =$log_file_path= matches a regex that looks something like =$YEAR-$MONTH-$DAY.log=.
+
+ Upon entering the block, capture the first regex capture group (enclosed in =()= in the regex) into a variable,
+ =$log_date=.
+
+ Use the Perl built in =tr()= to remove any =-= chars from the string.
+
+ Compare the resulting string (something that looks like =$YEAR$MONTH$DAY=) to a variable we set elsewhere in
+ the function scope, skipping the next code block if it's lower than =$LATEST_DATE=
+
+ Assign the return of =parse_log=
+
+ =parse_log()= expects to be passed two arguments: a string, and a function reference,
+ it returns two variables: a string, and a reference to an array, which represents an ordered list of
+ the lines in a file.
+
+ We assign these two returns into variables called =$serial= and =$parsed_log_ref=.
+
+ Construct a path name via the Perl built in string concat ( =.= ) and assign it to =$output_file_path=.
+
+ Finally, call a function that will flatten and write out the array of log lines to a file.
+
+ End syntax explanation.
+ ____________________________________________________________
+
+ I think there are two potentially tricky Perl syntax-isms in the above snippet.
+
+ Firstly, the data type of =$parsed_log_ref= is completely opaque. If you don't have insight into what =parse_log=
+ is returning, you have no idea that =$parsed_log_ref= is an array reference. Strongly typed languages obviously
+ solve this kind of problem for you, but I think in the domain of dynamic languages, this is a common problem
+ that comes with the territory. To my knowledge Python or Ruby doesn't have great answers for this (please feel
+ free to correct me on this).
+
+ Secondly, unless you're familiar with perls tokens, it's unclear what =\&json_line_parser= is. I think this kind of
+ notation can actually be a /plus/ for Perl.
+
+ If I am passing some data to a function by reference, it's pretty clear what that data is (assuming it's not
+ encapsulated in a scalar like the aforementioned =$parsed_log_ref= example):
+
+ \@array
+ \%hash
+ \&function
+ \$scalar
+
+ For me personally, being able to denote type at a glance can be useful, as opposed to bare words in languages like python,
+ where lots of the time it's up to me as the reader to understand all the surrounding context in order to know what type
+ a variable is. I realize that in Python you can sometimes use ={}= or =[]= for type hints
+
+ As mentioned above, Perl has this issue as well to an extent, but I think to a lesser extent than dynamically typed
+ languages that don't denote type with any kind of special syntax.
+
+ I acknowledge however it's difficult to make an _objective_ argument in this regard, so...moving on.
+
+ I don't want to spend too much time on Perl syntax. I've tried to cover a few small things here, but obviously
+ this is pretty shallow and that's kind of intentional. I can spend all day trying to lay out a case on why
+ Perl syntax isn't ugly or unreadable, but again I think this is ultimately a subjective point.
+
+ It's possible that when looking at programming languages, there is an objective lens with which to view syntax.
+ Perhaps that lens is the problem domain and the language features that cater to that problem domain. I think
+ at the highest level though, it's ultimately a preference. I'd love to hear your thoughts if you disagree in
+ this regard.
+
+* Perl is /fast/
+
+ You're right. It's not as fast as C, but below I will try and show that for a lot of cases, Perl is
+ much faster than it's main competition, Python. Particularly in heavy regex/text streaming applications.
+
+* There is no better Unix glue
+
+ - Here talk about Perl's "best" use case, as a glue language
+ for processing text streams and/or unstructured text data
+
+* Lesser known Perl features
+
+ - Perl magic goes here
+
+* Feedback/Topics/Notes To cover
+
+ - People prefer python as more people know it
+ - Perception python stdlib is more complete
+ - People like Perl for it's portability
+ - People like Perl for text generation/report generation
+ - People like perl for it's use of one liners
+ - Cover "higher order perl"
+ - Perl's history as a "sysadmin lang" re: Larry Wall/Randal Schwartz
+ - Perl is more like Lisp and it is like C, and this is an important
+ distinction
+ - Talk about higher order functions
+ - Talk about string function references
+ - Talk about how Perl is /faster/ than Python in most text stream
+ processing cases (prove this!)
+ - Not welcoming to new comers
+ -
diff --git a/2022-01-20-keypro-fk-9000-docs.org b/keypro-fk-9000.org
similarity index 100%
rename from 2022-01-20-keypro-fk-9000-docs.org
rename to keypro-fk-9000.org
diff --git a/2022-01-26-rogue-like-design.org b/rogue-like-design.org
similarity index 100%
rename from 2022-01-26-rogue-like-design.org
rename to rogue-like-design.org
diff --git a/style_hint.html b/style_hint.html
deleted file mode 100644
index 5974e63..0000000
--- a/style_hint.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<style type="text/css">body{margin:40px
-auto;max-width:900px;line-height:1.6;font-size:18px;color:#444;padding:0
-10px}h1,h2,h3{line-height:1.2}</style>