<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Articles tagged meatspace at null program</title>
  <link rel="alternate" type="text/html"
        href="https://nullprogram.com/tags/meatspace/"/>
  <link rel="self" type="application/atom+xml"
        href="https://nullprogram.com/tags/meatspace/feed/"/>
  <updated>2026-04-09T13:25:45Z</updated>
  <id>urn:uuid:22d16006-121f-438a-be7a-f0619eca48b9</id>

  <author>
    <name>Christopher Wellons</name>
    <uri>https://nullprogram.com</uri>
    <email>wellons@nullprogram.com</email>
  </author>

  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>My ranking of every Shakespeare play</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2023/06/22/"/>
    <id>urn:uuid:98eae9a1-cd7f-4d1c-be53-85058f1b2649</id>
    <updated>2023-06-22T19:10:25Z</updated>
    <category term="rant"/><category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><em>This article was discussed <a href="https://news.ycombinator.com/item?id=36438620">on Hacker News</a>.</em></p>

<p>A few years ago I set out on a personal journey to study and watch a
performance of each of Shakespeare’s 37 plays. I’ve reached my goal and,
though it’s not a usual topic around here, I wanted to get my thoughts
down while fresh. I absolutely loved some of these plays and performances,
and so I’d like to highlight them, especially because my favorites are,
with one exception, not “popular” plays. Per tradition, I begin with my
least enjoyed plays and work my way up. All performances were either a
recording of a live stage or an adaptation, so they’re also available to
you if you’re interested, though in most cases not for free. I’ll mention
notable performances when applicable. The availability of a great
performance certainly influenced my play rankings.</p>

<!--more-->

<p>Like many of you, I had assigned reading for several Shakespeare plays in
high school. I loathed these assignments. I wasn’t interested at the time,
nor was I mature enough to appreciate the writing. Even revisiting as an
adult, the conventional selection — <em>Romeo and Juliet</em>, <em>Julius Caesar</em>,
etc. — are not highly ranked on my list. For the next couple of decades I
thought that Shakespeare just wasn’t for me.</p>

<p>Then I watched <a href="https://www.youtube.com/watch?v=rbSN4Lv_N4g">the 1993 adaption of <em>Much Ado About Nothing</em></a> and it
instantly became one of my favorite films. Why didn’t we read <em>this</em> in
high school?! Reading <a href="https://shakespeare-navigators.ewu.edu/ado/index.html">the play with footnotes</a> helped to follow the
humor and allusions. Even with the film’s abridging, some of it still went
over my head. I soon discovered <em>Asimov’s Guide to Shakespeare</em> — yes,
<em>that</em> Asimov — which was exactly what I needed, and a perfect companion
while reading and watching the plays. If stumbling upon this turned out so
well, then I’d better keep going.</p>

<p>Wanting a solid set of the plays with good footnotes and editing — there
is no canonical version of the plays — I picked up a copy of <em>The Norton
Shakespeare</em>. Unfortunately it’s part of the college textbook racket, and
it shows. The collection is designed to be sold to students who will lug
them in bookbags, will typically open them face-up on a desk, and are
uninterested in their contents beyond class. It includes a short-term,
digital-only, DRMed component to prevent resale. After all, their target
audience will not read it again anyway. Though at least it’s complete and
compact, better for reference than reading.</p>

<p>In contrast, the Folger Shakespeare Library mass market paperbacks are
better for enthusiasts, both in form and format. They’re clearly built for
casual, comfortable reading. However, they’re not sold as a complete set,
and gathering used copies takes some work.</p>

<p>Also essential was <a href="https://en.wikipedia.org/wiki/BBC_Television_Shakespeare"><em>BBC Television Shakespeare</em></a>, produced between
1978 and 1985. Finding productions of the more obscure plays is tricky,
but it always provided a fallback. In some cases these were the best
performances anyway! When I mention “the BBC production” I mean this
series. Like many collections, they omit <em>The Two Noble Kinsmen</em> due to
unclear authorship, and for this reason I’m omitting it from my list as
well. As with any faithful production, I suggest subtitles on the first
viewing, as it aids with understanding. Shakespeare’s sentence structure
is sometimes difficult to parse by moderns, and on-screen text helps. (By
the way, a couple of handy SHA-1 sums for those who know how to use them:)</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0ae909e5444c17183570407bd09a622d2827751e
55c77ed7afb8d377c9626527cc762bda7f3e1d83
</code></pre></div></div>

<p>As my list will show, my favorites are comedic comedies and histories,
particularly the two <a href="https://en.wikipedia.org/wiki/Henriad">Henriads</a>, each a group of four plays. The first —
<em>Richard II</em>, <em>1 Henry IV</em>, <em>2 Henry IV</em>, and <em>Henry V</em> — concerns events
around Henry V, in the late 14th and early 15th century. Those number
prefixes are <em>parts</em>, as in <em>Henry IV</em> has two parts. In my list I combine
parts as though a single play. The second — <em>1 Henry VI</em>, <em>2 Henry VI</em>, <em>3
Henry VI</em>, <em>Richard III</em> — is about the Wars of the Roses, spanning the
15th century. Asimov’s book was essential for filling in the substantial
historical background for these plays, and my journey was also in part a
history study.</p>

<p>I especially enjoy villain monologues, and plays with them rank higher as
a result. It’s said that everyone is the hero of their own story, but
Shakespeare’s villains may know that they’re villains and revel it in it,
bragging directly to the audience about all the trouble they’re going to
cause. In some cases they mock the audience’s sacred values, which in a
way, is like the stand up comedy of Shakespeare’s time. Notable examples
are Edmund (<em>King Lear</em>), Aaron (<em>Titus Andronicus</em>), Richard III, Iago
(<em>Othello</em>), and Shylock (<em>The Merchant of Venice</em>).</p>

<p>As with literature even today, authors are not experts in moral reasoning
and protagonists are often, on reflection, incredibly evil. Shakespeare is
no different, especially for historical events and people, praising those
who create mass misery (e.g. tyrants waging wars) and vilifying those who
improve everyone’s lives (e.g. anyone who deals with money). Up to and
including Shakespeare’s time, <a href="https://acoup.blog/2022/07/29/collections-logistics-how-did-they-do-it-part-ii-foraging/">a pre-industrial army on the march was a
rolling humanitarian crisis</a>, even in “friendly” territory,
slaughtering and stealing its way through the country in order to keep
going. So, much like <em>suspension of belief</em>, there’s a <em>suspension of
morality</em> where I engage with the material on its own moral terms, however
illogical it may be.</p>

<p>Now finally my list. The beginning will be short and negative because, to
be frank, I disliked some of the plays. Even Shakespeare had to work under
constraints. In his time none were regarded as great works. They weren’t
even viewed as literature, but similarly to how we consider television
scripts today. Also, around 20% of plays credited to Shakespeare were
collaborations of some degree, though the collaboration details have been
long lost. For simplicity, I will just refer to the author as Shakespeare.</p>

<h3 id="37-timon-of-athens">(37) Timon of Athens</h3>

<p>I have nothing positive to say about this play. It’s about a man who
borrows and spends recklessly, then learns all the wrong lessons from the
predictable results.</p>

<h3 id="36-the-two-gentlemen-of-verona">(36) The Two Gentlemen of Verona</h3>

<p>Involves a couple of love triangles, a woman disguised as a man — a common
Shakespeare trope — and perhaps the worst ending to a play ever written.
The two “gentlemen” are terrible people and undeserving of their happy
ending. Though I enjoyed the scenes with Proteus and Crab, the play’s fool
and his dog.</p>

<h3 id="35-troilus-and-cressida">(35) Troilus and Cressida</h3>

<p>Interesting that it’s set during the <em>Iliad</em> and features legendary
characters such as Achilles, Ajax, and Hector. I have no other positives
to note. Cressida’s abrupt change of character in the Greek camp later in
the play is baffling, as though part of the play has been lost, and ruins
an already dull play for me.</p>

<h3 id="34-the-winters-tale">(34) The Winter’s Tale</h3>

<p>A baby princess is lost, presumed dead, and raised by shepherds. She is
later rediscovered by her father as a young adult. It has a promising
start, but in the final act the main plot is hastily resolved off-stage
and seemingly replaced with a hastily rewritten ending that nonsensically
resolves a secondary story line.</p>

<h3 id="33-cymbeline">(33) Cymbeline</h3>

<p>The title refers to a legendary early King of Britain and is set in the
first century, but it is primarily about his daughter. The plot is
complicated so I won’t summarize it here. It’s long and I just didn’t
enjoy it. This is the second play in the list to feature a woman disguised
as a man.</p>

<h3 id="32-the-tempest">(32) The Tempest</h3>

<p>A political exile stranded on an island in the Mediterranean gains magical
powers through study, with the help of a spirit creates a tempest that
strands his enemies on his island, then gently torments them until he’s
satisfied that he’s had his revenge. It’s an okay play.</p>

<p>More interesting is the historical context behind the play. It’s based
loosely on events around the founding of Jamestown, Virginia. Until this
play, Shakespeare and Jamestown were, in my mind, unrelated historical
events. In fact, Pocahontas very nearly met Shakespeare, missing him by
just a couple of years, but she did meet his rival, Ben Jonson. I spent
far more time catching up on real history, including reading the
fascinating <a href="https://en.wikipedia.org/wiki/True_Reportory"><em>True Reportory</em></a>, than I did on the play.</p>

<h3 id="31-the-taming-of-the-shrew">(31) The Taming of the Shrew</h3>

<p>About a man courting and “taming” an ill-tempered woman, the shrew. The
seeming moral of the play was outdated even in Shakespeare’s time, and
it’s unclear what was intended. Technically it’s a play within a play, and
an outer frame presents the play as part of an elaborate prank. However,
the outer frame is dropped and never revisited, indicating that perhaps
this part of the play was lost. The BBC production skips this framing
entirely and plays it straight.</p>

<h3 id="30-alls-well-that-ends-well">(30) All’s Well That Ends Well</h3>

<p>Helena, a low-born enterprising young woman, saves a king’s life. She’s in
love with a nobleman, Bertram, and the king orders him to marry her as
repayment. He spurns her solely due to her low upbringing and flees the
country. She gives chase, and eventually wins him over. Helena is a great
character, and Bertram is utterly undeserving of her, which ruins the play
for me in an unearned ending.</p>

<h3 id="29-antony-and-cleopatra">(29) Antony and Cleopatra</h3>

<p>A tragedy about people who we know for sure existed, the first such on the
list so far. The sequel to <em>Julius Caesar</em>, completing the story of the
Second Triumvirate. Historically interesting, but the title characters
were terrible, selfish people, including in the play, and they aren’t
interesting enough to make up for it.</p>

<p>I enjoyed the portrayal of Octavian as a shrewd politician.</p>

<h3 id="28-julius-caesar">(28) Julius Caesar</h3>

<p>A classic school reading assignment. Caesar’s death in front of the Statue
of Pompey is obviously poetic, and so every performance loves playing it
up. Antony’s speech is my favorite part of the play. I didn’t dislike this
play, but nor did I find it interesting revisiting it as an adult.</p>

<h3 id="27-coriolanus">(27) Coriolanus</h3>

<p>About the career of a legendary Roman general and war hero who attempts to
enter politics. He despises the plebeians, which gets him into trouble,
but all he really wants is to please is mother. Stratford Festival has <a href="https://www.youtube.com/watch?v=06tR1wMWV_o">a
worthy adaption in a contemporary setting</a>.</p>

<h3 id="26-henry-viii">(26) Henry VIII</h3>

<p>He reigned from 1509 to 1547, but the play only covers Henry VIII’s first
divorce. It paved the way for the English Reformation, though the play has
surprisingly little to say it, or his murder spree. It’s set a few decades
after the events of <em>Richard III</em> — too distant to truly connect with the
second Henriad.</p>

<p>While I appreciate its historical context — with liberal dramatic license
— it’s my least favorite of the English histories. It’s not part of an
epic tetralogy, and the subject matter is mundane. My favorite scene is
Katherine (Catherine in the history books) firmly rejecting the court’s
jurisdiction and walking out. My favorite line: “No man’s pie is freed
from his ambitious finger.”</p>

<h3 id="25-romeo-and-juliet">(25) Romeo and Juliet</h3>

<p>Another classic reading assignment that requires no description. A
beautiful play, but I just don’t connect with its romantic core.</p>

<h3 id="24-the-merchant-of-venice">(24) The Merchant of Venice</h3>

<p>An infamously antisemitic play where a Jewish moneylender, Shylock, loans
to the titular merchant of Venice where the collateral is the original
“pound of flesh,” providing the source for that cliche. Though even in his
prejudice, Shakespeare can’t help but write multifaceted characters,
particularly with Shylock’s famous “If you prick us, do we not bleed?”
speech.</p>

<h3 id="23-twelfth-night">(23) Twelfth Night</h3>

<p>Twins, a young man and a woman, are separated by a shipwreck. The woman
disguises herself as a man and takes employment with a local duke and
falls in love with him, but her employment requires her to carry love
letters to the duke’s love interest. In the meantime the brother arrives,
unaware his sister is in town in disguise, and everyone gets the twins
mixed up leading to comedy. It’s a fun play. The title has nothing to do
with the play, but refers to the holiday when the play was first
performed.</p>

<p>The play is the source of the famous quote, “Some are born great, some
achieve greatness, and some have greatness thrust upon them.” It’s used as
part of a joke, and when I heard it, I had thought the play was mocking
some original source.</p>

<h3 id="22-pericles">(22) Pericles</h3>

<p>A Greek play about a royal family — father, mother, daughter — separated
by unfortunate — if contrived — circumstances, each thinking the others
dead, but all tearfully reunited in a happy ending. My favorite part is
the daughter, Marina, talking her way out of trouble: “She’s able to
freeze the god Priapus and undo a whole generation.”</p>

<p>The BBC production stirred me, particularly the scene where Pericles and
Marina are reunited.</p>

<h3 id="21-richard-ii">(21) Richard II</h3>

<p>Richard II, grandson of the famed Edward III, was a young King of England
from 1367 to 1400. At least in the play, he carelessly makes dangerous
enemies of his friends, and so is deposed by Henry Bolingbroke, who goes
on to become Henry IV. The play is primarily about this abrupt transition
of power, and it is the first play of the first Henriad. The conflict in
this play creates tensions that will not be resolved until 1485, the end
of the Wars of the Roses. Shakespeare spends <em>seven</em> additional plays on
this a huge, interesting subject.</p>

<p>For me, Richard II is the most dull of the Henriad plays. It’s a slow
start, but establishes the groundwork for the greater plays that follow.
The BBC production of the first Henriad has “linked” casting where the
same actors play the same roles through the four plays, which makes this
an even more important watch.</p>

<h3 id="20-othello">(20) Othello</h3>

<p>Another of the famous tragedy. Othello, an important Venetian general, and
“the Moore of Venice” is dispatched to Venice-controlled Cyprus to defend
against an attack by the Ottoman Turks. Iago, who has been overlooked for
promotion by Othello, treacherously seeks revenge, secretly sabotaging all
involved while they call him “honest Iago.” Though his schemes quickly go
well beyond revenge, and continues sowing chaos just for his own fun.</p>

<p>I watched a few adaptions, and I most enjoyed the <a href="https://www.youtube.com/watch?v=4dcwVLGyTkk">2015 Royal Shakespeare
Company <em>Othello</em></a>, which
places it in a modern setting and requires few changes to do so.</p>

<h3 id="19-the-comedy-of-errors">(19) The Comedy of Errors</h3>

<p>A fun, short play about a highly contrived situation: Two pairs of twins,
where each pair of brothers has been given the same name, is separated at
birth. As adults they all end up in the same town, and everyone mixes them
up leading to comedy. It’s the lightest of Shakespeare’s plays, but also
lacks depth.</p>

<h3 id="18-hamlet">(18) Hamlet</h3>

<p>Another common, more senior, high school reading assignment. Shakespeare’s
longest play, and probably the most subtle. In everything spoken between
Hamlet and his murderous uncle, Claudius, one must read between the lines.
Their real meanings are obscured by courtly language — familiar to
Shakespeare’s audience, but not moderns. Asimov is great for understanding
the political maneuvering, which is a lot like a game of chess. It made me
appreciate the play more than I would have otherwise.</p>

<p>You’d be hard-pressed to find something that beats the faithful,
star-studded <a href="https://www.youtube.com/watch?v=Tt_QkXy3uuQ">1996 major film adaption</a>.</p>

<h3 id="17-richard-iii">(17) Richard III</h3>

<p>The final play of the second Henriad. Much of the play is Richard III
winking at the audience, monologuing about his villainous plans, then
executing those plans without remorse. Makes cheering for the bad guy fun.
If you want to see an evil schemer get away with it, at least right up
until the end when he gets his comeuppance, this is the play for you. This
play is the source of the famous “My kingdom for a horse.”</p>

<p>I liked two different performances for different reasons. The <a href="https://www.youtube.com/watch?v=k20svFhRI44">1995 major
film</a> puts the play in the World Word II era. It’s solid and does
well standing alone. The BBC production has linked casting with the three
parts of Henry VI, which allows one to enjoy it in full in its broader
context. It’s also well-performed, but obviously has less spectacle and a
lower budget.</p>

<h3 id="16-the-merry-wives-of-windsor">(16) The Merry Wives of Windsor</h3>

<p>The comedy spin-off of Henry IV. Allegedly, Elizabeth I liked the
character of John Falstaff from Henry IV so much — I can’t blame her! —
that she demanded another play with the character, and so Shakespeare
wrote this play. The play brings over several characters from Henry IV.
Unfortunately it’s in name only and they hardly behave like the same
characters. Despite this, it’s still fun and does not require knowledge of
Henry IV.</p>

<p>Falstaff ineptly attempts to seduce two married women, the titular wives,
who play along in order to get revenge on him. However, their husbands are
not in on the prank. One suspects infidelity and hatches his own plans.
The confusion leads to the comedy.</p>

<p>The <a href="https://www.youtube.com/watch?v=RA7j9XDu8F8">2018 Royal Shakespeare Company production</a> aptly puts it in
a modern suburban setting.</p>

<h3 id="15-titus-andronicus">(15) Titus Andronicus</h3>

<p>A play about a legendary Roman general committed to duty above all else,
even the lives of his own sons. He and his family become brutal victims of
political rivals, and in return gets his own brutal revenge. It’s by far
Shakespeare’s most violent and disturbing play. It’s a bit too violent
even for me, but it ranks this highly because Aaron the Moore is such a
fantastic character, another villain that loves winking at the audience.
His lines throughout the play make me smile: “If one good deed in all my
life I did, I do repent it from my very soul.”</p>

<p>I enjoyed the <a href="https://www.youtube.com/watch?v=OvZRvKf78yY">1999 major film</a>, which puts it in a contemporary
setting.</p>

<h3 id="14-king-lear">(14) King Lear</h3>

<p>The titular, mythological king of pre-Roman Britain wants to retire, and
so he divides his kingdom between his three daughters. However, after
petty selfishness on Lear’s part, he disowns the most deserving daughter,
while the other two scheme against one another.</p>

<p>Some of the scenes in this play are my favorite among Shakespeare, such as
Edmund’s monologue on bastards where he criticizes the status quo and
mocks the audience’s beliefs. It also has one of the best fools, who while
playing dumb, is both observant and wise. That’s most of Shakespeare’s
fools, but it’s especially true in <em>King Lear</em> (“This is not altogether
fool, my lord.”). This fool uses this “tenure” to openly mock the king to
his face, the only character that can do so without repercussions.</p>

<p>My favorite performance was <a href="https://www.youtube.com/watch?v=1PkmXMHHOxQ">the 2015 Stratford Festival stage
production</a>, especially for its Edmund, Lear, and Fool.</p>

<h3 id="13-macbeth">(13) Macbeth</h3>

<p>The shortest tragedy, a common reading assignment, and a perfect example
of literature I could not appreciate without more maturity. Even the plays
I dislike have beautiful poetry, but I especially love it in <em>Macbeth</em>.</p>

<p>The history behind <em>Macbeth</em> is itself fascinating. The play was written
custom for the newly-crowned King James I — of <em>King James Version</em> fame —
and even calls him out in the audience. James I was obsessed with witch
hunts, so the play includes witchcraft. The character Banquo was by
tradition considered to be his ancestor.</p>

<p>My favorite production by far — I watched a number of them! — was <a href="https://www.youtube.com/watch?v=HM3hsVrBMA4">the
2021 film</a>. It should be an approachable introduction for Shakespeare
newcomers more interested in drama than comedy. Notably for me, it departs
from typical productions in that Macbeth and Lady Macbeth do not scream at
each other — perhaps normally a side effect of speaking loudly for stage
performance. Particularly in Act 1, Scene 7 (“screw your courage to the
sticking place”). In the film they argue calmly, like a couple in a
genuine, healthy relationship, making the tragedy that much more tragic.</p>

<p>That being said, it drops the ball with the porter scene — a bit of comic
relief just after Macbeth murders Duncan. There’s knocking at the gate,
and the porter, charged with attending it, is hungover and takes his time.
In a monologue he imagines himself porter to Hell, and on each impatient
knock considers the different souls he would be greeting. Of all the
porter scenes I watched, the best porter as the <a href="https://www.youtube.com/watch?v=oGZV-KwW4ZE">2017 Stratford Festival
production</a>, where he is both charismatic and hilarious. I wish I
could share a clip.</p>

<h3 id="12-king-john">(12) King John</h3>

<p>King John, brother of “<em>Coeur de Lion</em>” Richard I, ruled in early 13th
century. His reign led to the Magna Carta, and he’s also the Prince John
of the Robin Hood legend, though because it’s a history, and paints John
in a positive light, that legend isn’t included. It depicts fascinating,
real historical events and people, including <a href="https://en.wikipedia.org/wiki/Eleanor_of_Aquitaine">Eleanor of Aquitaine</a>.
It also has one of my favorite Shakespeare characters, Phillip the
Bastard, who gets all the coolest lines. I especially love his
introductory scene where his lineage is disputed by his half-bother and
Eleanor, impressed, essentially adopts him on the spot.</p>

<p><a href="https://www.youtube.com/watch?v=YkRBRoh_0QQ">The 2015 Stratford Festival stage performance</a> is wonderful, and
I’ve re-watched it a few times. The performances are all great.</p>

<h3 id="119-henry-vi">(11–9) Henry VI</h3>

<p>As previously noted, this is actually three plays. At 3–4 hours apiece,
it’s about the length of a modern television season. I thought it might
take awhile to consume, but I was completely sucked in, watching and
studying the whole trilogy in a single weekend.</p>

<p>Henry V died young in 1422, and his infant son became Henry VI, leaving
England ruled by his uncles. As an adult he was a weak king, which allowed
the conflicts of the previously-mentioned <em>Richard II</em> to bubble up into
the Wars of the Roses, a bloody power conflict between the Lancasters and
Yorks. The play features historical people including Joan la Pucelle
(“Joan of Arc”), English war hero John Talbot, and <a href="https://en.wikipedia.org/wiki/Jack_Cade%27s_Rebellion">Jack Cade</a>.
<em>Richard III</em> wraps up the conflicts of <em>Henry VI</em>, forming the second
Henriad. When watching/reading the play, keep in mind that the play is
anti-French, anti-York, and (implicitly) pro-Tudor.</p>

<p>Most of the first part was probably not written by Shakespeare, but rather
adapted from an existing play to fill out the backstory. I think I can see
the “seams” between the original and the edits that introduce the roses.</p>

<p>I <em>loved</em> the BBC production of the second Henriad. Producing such an epic
story must be daunting, and it’s amazing what they could convey with such
limited budget and means. It has hilarious and clever cinematography for
the scene where the Countess of Auvergne attempts to trap Talbot (Part 1,
Act 2, Scene 3). Again, I wish I could share a clip!</p>

<h3 id="8-henry-v">(8) Henry V</h3>

<p>Due to his amazing victories, most notably <a href="https://en.wikipedia.org/wiki/Battle_of_Agincourt">at Agincourt</a> where, for
once, Shakespeare isn’t exaggerating the odds, Henry V is one of the great
kings of English history. This play is a followup to <em>Richard II</em> and
<em>Henry IV</em>, completing the first Henriad, and depicts Henry V’s war with
France. Outside of the classroom, this is one of Shakespeare’s most
popular plays.</p>

<p>The obvious choice for viewing is <a href="https://www.youtube.com/watch?v=okxEzUlnn_0">the 1989 major film</a>, which, by
borrowing a few scenes from <em>Henry IV</em>, attempts a standalone experience,
though with limited success. I watched it before <em>Henry IV</em>, and I could
not understand why the film was so sentimental about a character that
hadn’t even appeared yet. It probably has <a href="https://www.youtube.com/watch?v=A-yZNMWFqvM">the best Saint Crispin’s Day
Speech ever performed</a>, in part because it’s placed in a broader
context than originally intended. The <a href="https://www.youtube.com/watch?v=HS7OG9zcV-M">introduction is bold</a> as is
<a href="https://www.youtube.com/watch?v=mKHihAPr2Rc">Exeter’s ultimatum delivery</a>. It cleverly, and without changing his
lines, also depicts Montjoy, the French messenger, as sympathetic to the
English, also not originally intended. I didn’t realize this until I
watched other productions.</p>

<p>The BBC production is also worthy, in large part because of its linked
casting with <em>Richard II</em> and <em>Henry IV</em>. It’s also unabridged, including
the whole glove thing, for better or worse.</p>

<h3 id="76-henry-iv">(7–6) Henry IV</h3>

<p>People will think I’m crazy, but yes, I’m placing <em>Henry IV</em> above <em>Henry
V</em>. My reason is just two words: John Falstaff. This character is one of
Shakespeare’s greatest creations, and really makes these plays for me. As
previously noted, this is two plays mainly because John Falstaff was such
a huge hit. The sequel mostly retreads the same ground, but that’s fine!
I’ve read and re-read all the Falstaff scenes because they’re so fun. I
now have a habit of quoting Falstaff, and it drives my wife nuts.</p>

<p>The Falstaff role makes or breaks a <em>Henry IV</em> production, and my love for
this play is in large part thanks to the phenomenal BBC production. It has
a warm, charismatic Falstaff that <a href="https://www.youtube.com/watch?v=ImVoqdZPPak">perfectly nails the role</a>. It’s
great even beyond Falstaff, of course. At the end of part 2, I tear up
seeing Henry V test the chief justice. I adore this production. What a
masterpiece.</p>

<h3 id="5-a-midsummer-nights-dream">(5) A Midsummer Night’s Dream</h3>

<p>A popular, fun, frivolous play that I enjoyed even more than I expected,
where faeries interfere with Athenians who wander into their forest. The
“rude mechanicals” are charming, especially the naive earnestness of Nick
Bottom, making them my favorite part of the play.</p>

<p>My enjoyment is largely thanks to <a href="https://www.youtube.com/watch?v=v9GhqXz7EVw">a 2014 stage production</a> with
great performances all around, great cinematography, and incredible
effects. Highly recommended. Honorable mention goes to the great Nick
Bottom performances of the BBC production and the 1999 major film.</p>

<h3 id="4-as-you-like-it">(4) As You Like It</h3>

<p>A pastoral comedy about idyllic rural life, and the source of the famous
quote “All the world’s a stage.” A duke has deposed his duke brother,
exiling him and his followers to the forest where the rest of the play
takes place. The main character, Rosalind, is one of the exiles, and,
disguised as a man named Ganymede, flees into the forest with her cousin.
There she runs into her also-exiled love interest, Orlando. While still
disguised as Ganymede, she roleplays as Rosalind — that is, <em>herself</em> — to
help him practice wooing herself. Crazy and fun.</p>

<p>A couple of my favorite lines are “There’s no clock in the forest” and
“falser than vows made in wine.” It’s an unusually musical play, and has a
big, happy ending. The fool, Touchstone, is one of my favorite fools,
named such because he tests the character of everyone with whom he comes
in contact.</p>

<p>It ranks so highly because of <a href="https://www.pbs.org/video/as-you-like-it-8yykc1/">an endearing 2019 production by Kentucky
Shakespeare</a>, which sets the story in a 19th century Kentucky. This is
the most amateur production I’ve shared so far — literally Shakespeare in
the park — but it’s just so enjoyable. Their Rosalind is fantastic and
really makes the play work. I’ve listened to just the audio of the play,
like a podcast, many times now.</p>

<h3 id="3-measure-for-measure">(3) Measure for Measure</h3>

<p>A comedy about justice and mercy. The duke of Vienna announces he will be
away on a trip to Poland, but secretly poses as a monk in order to get his
thumb on the pulse of his city. Unfortunately the man running the city in
his stead is corrupt, and the softhearted duke can’t help but pull strings
behind the scenes to undo the damage, and more. He sets up a scheme such
that, after his dramatic return as duke, the plot is unraveled while
simultaneously testing the character of all involved.</p>

<p>I love so many of the characters and elements of this play. I smile when
the duke jumps into action, my heart wrenches at <a href="https://www.youtube.com/watch?v=paAYJUx9MfQ">Isabella’s impassioned
speech for mercy</a> (“it is excellent to have a giant’s strength,
but it is tyrannous to use it like a giant”), I admire the provost’s
selfless loyalty to the duke, I laugh when Lucio the “fantastic” keeps
putting his foot in his mouth, and I cry when Mariana begs Isabella to
forgive. All around a wonderful play.</p>

<p>Like so many already, a big part of my love for the play is <a href="https://www.crackle.com/watch/f70e0859-c7fa-4dae-961f-130bed2980eb/bbc-television-shakespeare:-measure-for-measure">the BBC
production</a>, which is full of great performances, particularly
the duke, Isabella, and Lucio.</p>

<h3 id="2-much-ado-about-nothing">(2) Much Ado About Nothing</h3>

<p>As the play that finally got me interested in Shakespeare, of course it’s
near the top of the list. Forget Romeo and Juliet: Benedick and Beatrice
are Shakespeare’s greatest romantic pairing!</p>

<p>Don Pedro, Prince of Aragon, stops in Messina with his soldiers while
returning from a military action. While in town there’s a matchmaking plot
and lots of eavesdropping, and then chaos created by the wicked Don John,
brother to Don Pedro. It’s a fun, light, hilarious play. It also features
another of Shakespeare’s great comic characters, Dogberry, famous for his
malapropisms.</p>

<p>This is a very popular play with tons of productions, though I only
watched a few of them. The previously-mentioned 1993 adaption remains my
favorite. It does some abridging, but honestly, it makes the play better
and improves the comedic beats.</p>

<h3 id="1-loves-labours-lost">(1) Love’s Labour’s Lost</h3>

<p>Finally, my favorite play of all, and an unusual one to be at the top of
the list. Much of the play is subtle parody and so makes for a poor first
play for newcomers, who would not be familiar enough with Shakespeare’s
language to distinguish parody from genuine.</p>

<p>The King of Navarre and three lords swear an oath to seclude themselves
in study, swearing off the company of women. Then the French princess and
her court arrives, the four men secretly write love letters in violation
of their oaths, and comedy ensues. There are also various eccentric side
characters mixed into the plot to spice it up. It’s all a ton of fun and
ends with an inept play within a play about the “nine worthies.”</p>

<p>The major reason I love this play so much is <a href="https://www.youtube.com/watch?v=VAotbh5CVqM">a <em>literally perfect</em> 2017
production by Stratford Festival</a>. I love every aspect of this
production such that I can’t even pick a favorite element. I was hooked
within the first minute.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>The Missing Computer Skills of High School Students</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2018/10/31/"/>
    <id>urn:uuid:96cc0dde-1524-3030-8bfc-016439796c16</id>
    <updated>2018-10-31T22:02:36Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><em>This article was <a href="https://news.ycombinator.com/item?id=18349847">discussed on Hacker News</a> and <a href="https://redd.it/9td4qx">discussed on
Reddit</a>.</em></p>

<p>It’s been just over fours years since I started <a href="/blog/2016/09/02/">mentoring high school
students at work</a>, and I recently began mentoring my fourth such
student. That’s enough students for me to start observing patterns. Of
course, each arrives with different computer knowledge and experience,
but there have been two consistent and alarming gaps. One is a concept
and the other is a skill, both of which I expect an advanced high
schooler, <em>especially</em> one interested in computers, to have before
they arrive. This gap persists despite students taking computer
classes at school.</p>

<!--more-->

<h3 id="file-directories-and-paths">File, Directories, and Paths</h3>

<p>The vital gap in concepts is files, directories, or, broadly speaking,
<em>paths</em>. Students do initially arrive with a basic notion of files and
directories (i.e. “folders”) and maybe some rough idea that there’s a
hierarchy to it all. But they’ve never learned the notation: a location
to a file specified by a sequence of directory components which may be
either <em>relative</em> or <em>absolute</em>. More specifically, they’ve never been
exposed to the concepts of <code class="language-plaintext highlighter-rouge">.</code> (current directory) nor <code class="language-plaintext highlighter-rouge">..</code> (parent
directory).</p>

<p>The first thing I do with my students is walk them though a Linux
installation process and then sit them in front of a terminal. Since
most non-option arguments are file paths, shell commands are rather
limited if you don’t know anything about paths. You can’t navigate
between directories or talk about files outside of your home
directory. So one of the first things I have to teach is how paths
work. We go through exercises constructing and reasoning about paths,
and it takes some time and practice for students to really “get” them.</p>

<p>And this takes longer than you might think! Even once the student has
learned the basic concepts, it still takes practice to internalize and
reason about them. It’s been a consistent enough issue that I really
should assemble a booklet to cover it, and perhaps some sort of
interactive practice. I could just hand this to the student so they
can learn on their own as they do with other materials.</p>

<p>Paths aren’t just imporant for command line use. They come up in every
day programming when programs need to access files. In some contexts it
even has security implications regardless of the programming language.
For example, care must be taken handling and validating paths supplied
from an untrusted source. A web application may need to translate a
path-like string in a query into a file path, and not understanding how
<code class="language-plaintext highlighter-rouge">..</code> works can make this dangerous. Or not understanding how paths need
to be normalized before being compared.</p>

<p>I consider paths as falling under file and directory basics, and it’s
part of the baseline for a person to be considered computer literate.</p>

<h3 id="touch-typing">Touch Typing</h3>

<p>The other major gap is touch typing. None of my students have been
touch typists, and it slows them all down far more than they realize.
I spend a lot of time next to them at the keyboard as they drive, so
I’ve seen the costs myself. In a couple of cases, the students have to
finger peck while looking at the keyboard.</p>

<p>An important step in mastering the use of computers is quickly
iterating on new ideas and concepts — trying out and playing with
things as they are learned. Being a slow typist not only retards this
process, the tedium of poor, plodding keyboarding actively discourages
experimentation, becoming a barrier. Advanced computer use isn’t much
fun if you can’t type well.</p>

<p>To be fair, I’ve only been a proper touch typist <a href="/blog/2017/04/01/">for under two
years</a>. I wish I had learned it much earlier in life, and I really
only have myself to blame that it took so long. Fortunately I <em>had</em>
developed my own pseudo touch touching style that required neither
finger pecking nor looking at the keyboard. My main issue was accuracy,
not that typing was tedious or slow.</p>

<p>The bad news is that, unlike paths, this is completely outside my
control. First, one of the major guidelines of the mentoring program
is that we’re not supposed to spend a lot of time on basic skills.
Learning to touch type takes several weeks of daily effort. That’s
just too much time that we don’t have. Second, this won’t work anyway
unless the student is motivated to learn it. I have no idea how to
provide that sort of motivation. (And if the student <em>is</em> motivated,
they’ll do it on their own time anyway.) I think that’s where schools
get stuck.</p>

<p>The really bad news is that this problem is going to get worse. The
mobile revolution happened, and, for most people, mobile devices are
gradually replacing the home computer, even laptops. I already know
one student who doesn’t have access to a general purpose computer at
home. The big difference between a tablet and a laptop is that a
tablet is purely for consumption.</p>

<p>In the future, kids will be less and less exposed to keyboards, and
productive computing in general. Keyboards are, and will continue to be
for the foreseeable future, a vital tool for professionals. I wonder if
the future will be a bit like, say, the 1980s again, where only a small
fraction of kids will be exposed to a proper computer. Only instead of a
PC clone, Commodore, or Apple II, it’s a Raspberry Pi.</p>

<h3 id="conclusions">Conclusions</h3>

<p>I want to make something really clear: I’m not blaming the students for
these gaps. It’s not in any way their fault. What they’re taught and
exposed to is, at this point in life, largely outside of their control.</p>

<p>I lay most of the blame on the schools. My mentees have all taken high
school programming classes of some sort, but these classes somehow
manage to skip over the fundamentals. Instead it’s rote learning some
particular IDE without real understanding. Finally I can relate to all
those mathematicians’ complaining about how math class is taught!</p>

<p>What can be done? If you’re a parent, make sure your kid has access to a
general purpose computer, even if it’s only a Raspberry Pi or one of its
clones, along with a keyboard and mouse. (Of course, if you’re reading
this article you’re not one of the parents that needs this advice.) It’s
good exposure all around.</p>

<p>After reflecting on this recently, I think one of the shortcomings of
my mentoring is that I don’t spend enough time — generally none at all
— at the keyboard driving with my mentee as the passenger, where they
can really observe me in action. Usually it’s me approaching them to
check on their progress, and the opportunity just isn’t there. Perhaps
it would be motivating to see how efficient and fun computing can be
at higher levels of proficiency — to show them how touch typing and a
powerful text editor can lead to such a dramatic difference in
experience. It would be the answer to that question of, “Why should I
learn this?”</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Introducing the Pokerware Secure Passphrase Generator</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2017/07/27/"/>
    <id>urn:uuid:c2d33d1a-d2a2-3863-04ae-68d2b48eecd5</id>
    <updated>2017-07-27T17:49:10Z</updated>
    <category term="crypto"/><category term="meatspace"/><category term="netsec"/>
    <content type="html">
      <![CDATA[<p>I recently developed <a href="https://github.com/skeeto/pokerware"><strong>Pokerware</strong></a>, an offline passphrase
generator that operates in the same spirit as <a href="http://world.std.com/~reinhold/diceware.html">Diceware</a>.
The primary difference is that it uses a shuffled deck of playing
cards as its entropy source rather than dice. Draw some cards and use
them to select a uniformly random word from a list. Unless you’re some
sort of <a href="/blog/2011/01/10/">tabletop gaming nerd</a>, a deck of cards is more readily
available than five 6-sided dice, which would typically need to be
borrowed from the Monopoly board collecting dust on the shelf, then
rolled two at a time.</p>

<p>There are various flavors of two different word lists here:</p>

<ul>
  <li><a href="https://github.com/skeeto/pokerware/releases/tag/1.0">https://github.com/skeeto/pokerware/releases/tag/1.0</a></li>
</ul>

<p>Hardware random number generators are <a href="https://lwn.net/Articles/629714/">difficult to verify</a>
and may not actually be as random as they promise, either
intentionally or unintentionally. For the particularly paranoid,
Diceware and Pokerware are an easily verifiable alternative for
generating secure passphrases for <a href="/blog/2017/03/12/">cryptographic purposes</a>.
At any time, a deck of 52 playing cards is in one of 52! possible
arrangements. That’s more than 225 bits of entropy. If you give your
deck <a href="https://possiblywrong.wordpress.com/2011/03/27/card-shuffling-youre-not-done-yet/">a thorough shuffle</a>, it will be in an arrangement that
has never been seen before and will never be seen again. Pokerware
draws on some of these bits to generate passphrases.</p>

<p>The Pokerware list has 5,304 words (12.4 bits per word), compared to
Diceware’s 7,776 words (12.9 bits per word). My goal was to invent a
card-drawing scheme that would uniformly select from a list in the same
sized ballpark as Diceware. Much smaller and you’d have to memorize more
words for the same passphrase strength. Much larger and the words on the
list would be more difficult to memorize, since the list would contain
longer and less frequently used words. Diceware strikes a nice balance
at five dice.</p>

<!-- Photo credit: Kelsey Wellons -->
<p><img src="/img/pokerware/deck.jpg" alt="" /></p>

<p>One important difference for me is that <em>I like my Pokerware word
lists a lot more</em> than the two official Diceware lists. My lists only
have simple, easy-to-remember words (for American English speakers, at
least), without any numbers or other short non-words. Pokerware has
two official lists, “formal” and “slang,” since my early testers
couldn’t agree on which was better. Rather than make a difficult
decision, I took the usual route of making no decision at all.</p>

<p>The “formal” list is derived in part from <a href="https://books.google.com/ngrams">Google’s Ngram
Viewer</a>, with my own additional filters and tweaking. It’s called
“formal” because the ngrams come from formal publications and represent
more formal kinds of speech.</p>

<p>The “slang” list is derived from <a href="http://files.pushshift.io/reddit/"><em>every</em> reddit comment</a> between
December 2005 and May 2017, tamed by the same additional filters. I
<a href="/blog/2016/12/01/">have this data on hand</a>, so I may as well put it to use. I
figured more casually-used words would be easier to remember. Due to
my extra filtering, there’s actually a lot of overlap between these
lists, so the differences aren’t too significant.</p>

<p>If you have your own word list, perhaps in a different language, you
can use the Makefile in the repository to build your own Pokerware
lookup table, both plain text and PDF. The PDF is generated using
Groff macros.</p>

<h3 id="passphrase-generation-instructions">Passphrase generation instructions</h3>

<ol>
  <li>
    <p>Thoroughly shuffle the deck.</p>
  </li>
  <li>
    <p>Draw two cards. Sort them by value, then suit. Suits are in
alphabetical order: Clubs, Diamonds, Hearts, Spades.</p>
  </li>
  <li>
    <p>Draw additional cards until you get a card that doesn’t match the
face value of either of your initial two cards. Observe its suit.</p>
  </li>
  <li>
    <p>Using your two cards and observed suit, look up a word in the table.</p>
  </li>
  <li>
    <p>Place all cards back in the deck, shuffle, and repeat from step 2
until you have the desired number of words. Each word is worth 12.4
bits of entropy.</p>
  </li>
</ol>

<p>A word of warning about step 4: If you use software to do the word list
lookup, beware that it might save your search/command history — and
therefore your passphrase — to a file. For example, the <code class="language-plaintext highlighter-rouge">less</code> pager
will store search history in <code class="language-plaintext highlighter-rouge">~/.lesshst</code>. It’s easy to prevent that
one:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ LESSHISTFILE=- less pokerware-slang.txt
</code></pre></div></div>

<h4 id="example-word-generation">Example word generation</h4>

<p>Suppose in step 2 you draw King of Hearts (KH/K♥) and Queen of Clubs
(QC/Q♣).</p>

<p class="grid"><img src="/img/pokerware/kh.png" alt="" class="card" />
<img src="/img/pokerware/qc.png" alt="" class="card" /></p>

<p>In step 3 you first draw King of Diamonds (KD/K♦), discarding it because
it matches the face value of one of your cards from step 2.</p>

<p class="grid"><img src="/img/pokerware/kd.png" alt="" class="card" /></p>

<p>Next you draw Four of Spades (4S/4♠), taking spades as your extra suit.</p>

<p class="grid"><img src="/img/pokerware/4s.png" alt="" class="card" /></p>

<p>In order, this gives you Queen of Clubs, King of Hearts, and Spades:
QCKHS or Q♣K♥♠. This corresponds to “wizard” in the formal word list and
would be the first word in your passphrase.</p>

<h4 id="a-deck-of-cards-as-an-office-tool">A deck of cards as an office tool</h4>

<p>I now have an excuse to keep a deck of cards out on my desk at work.
I’ve been using Diceware — or something approximating it since I’m not
so paranoid about hardware RNGs. From now I’ll deal new passwords from an
in-reach deck of cards. Though typically I need to tweak the results to
meet <a href="https://www.troyhunt.com/passwords-evolved-authentication-guidance-for-the-modern-era/">outdated character-composition requirements</a>.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>My Journey with Touch Typing and Vim</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2017/04/01/"/>
    <id>urn:uuid:985ef250-4b1f-3ec0-76a4-79406f3e993e</id>
    <updated>2017-04-01T04:02:08Z</updated>
    <category term="vim"/><category term="emacs"/><category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><em>Given the title, the publication date of this article is probably
really confusing. This was deliberate.</em></p>

<p>Three weeks ago I made a conscious decision to improve my typing
habits. You see, I had <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html">a dirty habit</a>. Despite spending literally
decades typing on a daily basis, I’ve been a weak typist. It wasn’t
exactly finger pecking, nor did it require looking down at the
keyboard as I typed, but rather a six-finger dance I developed
organically over the years. My technique was optimized towards Emacs’
frequent use of CTRL and ALT combinations, avoiding most of the hand
scrunching. It was fast enough to keep up with my thinking most of the
time, but was ultimately limiting due to its poor accuracy. I was
hitting the wrong keys far too often.</p>

<p>My prime motivation was to learn Vim — or, more specifically, to learn
modal editing. Lots of people swear by it, including people whose
opinions I hold in high regard. The modal editing community is without
a doubt larger than the Emacs community, especially since, thanks to
Viper and <a href="https://github.com/emacs-evil/evil">Evil</a>, a subset of the Emacs community is also part
of the modal editing community. There’s obviously <em>something</em>
significantly valuable about it, and I wanted to understand what that
was.</p>

<p>But I was a lousy typist who couldn’t hit the right keys often enough to
make effective use of modal editing. I would need to learn touch typing
first.</p>

<h3 id="touch-typing">Touch typing</h3>

<p>How would I learn? Well, the first search result for “online touch
typing course” was <a href="https://www.typingclub.com/">Typing Club</a>, so that’s what I went with. By
the way, here’s my official review: “Good enough not to bother
checking out the competition.” For a website it’s pretty much the
ultimate compliment, but it’s not exactly the sort of thing you’d want
to hear from your long-term partner.</p>

<p>My hard rule was that I would immediately abandon my old habits cold
turkey. Poor typing is a bad habit just like smoking, minus the cancer
and weakened sense of smell. It was vital that I unlearn all that old
muscle memory. That included not just my six-finger dance, but also my
<a href="http://www.nethack.org/">NetHack</a> muscle memory. NetHack uses “hjkl” for navigation just
like Vim. The problem was that I’d spent a couple hundred hours in
NetHack over the past decade with my index finger on “h”, not the
proper home row location. It was disorienting to navigate around Vim
initally, like <a href="https://www.youtube.com/watch?v=MFzDaBzBlL0">riding a bicycle with inverted controls</a>.</p>

<p>Based on reading other people’s accounts, I determined I’d need
several days of introductory practice where I’d be utterly
unproductive. I took a three-day weekend, starting my touch typing
lessons on a Thursday evening. Boy, they weren’t kidding about it
being slow going. It was a rough weekend. When checking in on my
practice, my wife literally said she pitied me. Ouch.</p>

<p>By Monday I was at a level resembling a very slow touch typist. For
the rest of the first week I followed all the lessons up through the
number keys, never progressing past an exercise until I had exceeded
the target speed with at least 90% accuracy. This was now enough to
get me back on my feet for programming at a glacial, frustrating pace.
Programming involves a lot more numbers and symbols than other kinds
of typing, making that top row so important. For a programmer, it
would probably be better for these lessons to be earlier in the
series.</p>

<h3 id="modal-editing">Modal editing</h3>

<p>For that first week I mostly used Emacs while I was finding my feet
(or finding my fingers?). That’s when I experienced first hand what
all these non-Emacs people — people who I, until recently, considered
to be unenlightened simpletons — had been complaining about all these
years: <strong>Pressing CTRL and ALT key combinations from the home row is a
real pain in in the ass!</strong> These complaints were suddenly making
sense. I was already seeing the value of modal editing before I even
started really learning Vim. It made me look forward to it even more.</p>

<p>During the second week of touch typing I went though <a href="http://derekwyatt.org/vim/tutorials/">Derek Wyatt’s
Vim videos</a> and learned my way around the :help system enough
to bootstrap my Vim education. I then read through the user manual,
practicing along the way. I’ll definitely have to pass through it a
few more times to pick up all sorts of things that didn’t stick. This
is one way that Emacs and Vim are a lot alike.</p>

<p>Update: <a href="https://pragprog.com/book/dnvim2/practical-vim-second-edition"><em>Practical Vim: Edit Text at the Speed of Thought</em></a> was
recommended in the comments, and it’s certainly a better place to
start than the Vim user manual. Unlike the manual, it’s opinionated
and focuses on good habits, which is exactly what a newbie needs.</p>

<p>One of my rules when learning Vim was to resist the urge to remap
keys. I’ve done it a lot with Emacs: “Hmm, that’s not very convenient.
I’ll change it.” It means <a href="https://github.com/skeeto/.emacs.d">my Emacs configuration</a> is fairly
non-standard, and using Emacs without my configuration is like using
an unfamiliar editor. This is both good and bad. The good is that I’ve
truly changed Emacs to be <em>my</em> editor, suited just for me. The bad is
that I’m extremely dependent on my configuration. What if there was a
text editing emergency?</p>

<p>With Vim as a sort of secondary editor, I want to be able to fire it
up unconfigured and continue to be nearly as productive. A pile of
remappings would prohibit this. In my mind this is like a form of
emergency preparedness. Other people stock up food and supplies. I’m
preparing myself to sit at a strange machine without any of my
configuration so that I can start the rewrite of the <a href="/blog/2016/11/17/">software lost in
the disaster</a>, so long as that machine has <a href="/blog/2017/03/30/">vi, cc, and
make</a>. If I can’t code in C, then what’s the point in surviving
anyway?</p>

<p>The other reason is that I’m just learning. A different mapping might
<em>seem</em> more appropriate, but what do I know at this point? It’s better
to follow the beaten path at first, lest I form a bunch of bad habits
again. Trust in the knowledge of the ancients.</p>

<h3 id="future-directions">Future directions</h3>

<p><strong>I am absolutely sticking with modal editing for the long term.</strong> I’m
<em>really</em> enjoying it so far. At three weeks of touch typing and two
weeks of modal editing, I’m around 80% caught back up with my old
productivity speed, but this time I’ve got a lot more potential for
improvement.</p>

<p>For now, Vim will continue taking over more and more of my text
editing work. My last three articles were written in Vim. It’s really
important to keep building proficiency. I still <a href="/blog/2013/09/03/">rely on Emacs for
email</a> and for <a href="https://github.com/skeeto/elfeed">syndication feeds</a>, and that’s not
changing any time soon. I also <a href="https://github.com/magit/magit">really like Magit</a> as a Git
interface. Plus I don’t want to <a href="/tags/emacs/">abandon years of accumulated
knowledge</a> and leave the users of my various Emacs packages out
to dry. Ultimately I believe will end up using Evil, to get what seems
to be the best of both worlds: modal editing and Emacs’ rich
extensibility.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Two Years as a High School Mentor</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2016/09/02/"/>
    <id>urn:uuid:5cc4c7ae-840c-3b55-cf64-63eb3d4b5da7</id>
    <updated>2016-09-02T21:37:51Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><em>Update June 2019: Dan graduated from college and is now my full-time
colleague.</em></p>

<p>Over the past two years I’ve been mentoring a high school student, Dan
Kelly, in software development though <a href="https://secwww.jhuapl.edu/stem/aspire/">my workplace mentoring
program</a>. It’s been one of the most rewarding experiences in
my life, far beyond my initial expectations. It didn’t just go well,
it went extraordinarily well. One of my co-workers described the
results as, “the single most successful technical investment I’ve ever
seen made in a person.” Last week the mentorship effectively ended as
he became a college freshman. While it’s fresh in my mind, I’d like to
reflect on how it went and why this arrangement worked so particularly
well for both of us.</p>

<p><img src="/img/netray/fair.jpg" alt="" /></p>

<p>Students come into work for a few hours at a time a few days each week
throughout the school year, typically after school. They’re supplied
with their own computer in a mentor-arranged work space. In my case,
Dan sat at a smaller makeshift desk in my office. The schedule is
informal and we were frequently making adjustments as needed.</p>

<p>An indispensable feature is that the <strong>students are unpaid</strong>. Based on
my observations, the primary reason many other mentorships aren’t
nearly as effective is a failure to correctly leverage this. Some
mentors put students directly to work on an existing, funded project.
This is a mistake. Real world, practical projects are poor learning
environments for beginners. The complexity inhibits <a href="http://www.skorks.com/2010/04/on-the-value-of-fundamentals-in-software-development/">development of
the fundamentals</a>, and, from a position of no experience, the
student will have little ability to influence the project, stifling
their motivation.</p>

<p>If being unpaid sounds unfair, remember that these students are coming
in with essentially no programming experience. For several months,
students are time sink. Maybe they fiddled around with Python on their
own, but it probably doesn’t really amount to anything meaningful
(yet).</p>

<p>Being unpaid means students can be put to work on anything, even if
unfunded — even if it’s only for the student’s own benefit. The very
first thing I did with Dan was to walk him through an install of
Debian (wiping the near-useless, corporate Windows image). I wanted
him fully in control of, and responsible for, his own development
environment. I never sat at his keyboard, and all exercises took place
at his computer.</p>

<p>From here I took a bit of an unconventional approach: I decided he was
going to learn from the bottom up, starting with C. There would be no
Fisher-Price-esque graphical programming language (yes, some mentors
actually do this), not even an easier, education-friendly, but
production-ready language like Python. I wanted him to internalize
pointers before trusting him with real work. I showed him how to
invoke gcc, the various types of files involved, how to invoke the
linker, and lent him my hard copy of <a href="https://en.wikipedia.org/wiki/The_C_Programming_Language">first edition K&amp;R</a>.</p>

<p>Similarly, I wasn’t going to start him off with some toy text editor.
Like with C, he was going to <strong>learn real production tools from the
start</strong>. I gave the Emacs run-down and started him on the tutorial
(C-h t). If he changed his mind later after getting more experience,
wanting to use something different, that would be fine.</p>

<p>Once he got the hang of everything so far, I taught him Git and
<a href="https://magit.vc/">Magit</a>. Finally we could collaborate.</p>

<p>The first three months were spent on small exercises. He’d learn a
little bit from K&amp;R, describe to me what he learned, and I’d come up
with related exercises, <a href="https://old.reddit.com/r/dailyprogrammer">not unlike those on DailyProgrammer</a>, to
cement the concepts. I’d also translate concepts into modern C (e.g.
C99).</p>

<p>With K&amp;R complete, he was ready to go beyond simple exercises.
Unfortunately, I wasn’t able to involve him in my own work at the
time. His primary interests included graphics, so we decided on a
<strong>multi-threaded, networked multi-processor raytracer</strong>.</p>

<p><img src="/img/netray/netray.png" alt="" /></p>

<p>It was a lot more educational for us both than I expected. I spent a
significant amount of personal time learning graphics well enough to
keep ahead: color spaces, blending, anti-aliasing, brushing up on
linear algebra, optics, lighting models, modeling formats, Blender,
etc. In a few cases I simply learned it from him. It reminds me of a
passage from <em>The Moon is a Harsh Mistress</em> (the namesake of this
blog):</p>

<blockquote>
  <p>I liked Prof. He would teach anything. Wouldn’t matter that he knew
nothing about it; if pupil wanted it, he would smile and set a
price, locate materials, stay a few lessons ahead. Or barely even if
he found it tough—never pretended to know more than he did. Took
algebra from him and by time we reached cubics I corrected his probs
as often as he did mine—but he charged into each lesson gaily.</p>

  <p>I started electronics under him, soon was teaching him. So he
stopped charging and we went along together until he dug up an
engineer willing to daylight for extra money—whereupon we both paid
new teacher and Prof tried to stick with me, thumb-fingered and
slow, but happy to be stretching his mind.</p>
</blockquote>

<video width="600" controls="controls">
  <source type="video/webm" src="https://skeeto.s3.amazonaws.com/netray/bigdemo_full.webm" />
</video>

<p>Since this was first and foremost an educational project, I decided we
would use no libraries other than the (POSIX) C standard library. He
would know how nearly every aspect of the program worked. The input
(textures) and output formats were <a href="https://en.wikipedia.org/wiki/Netpbm_format">Netpbm PPMs</a>, BMP files, and
<a href="https://wiki.multimedia.cx/index.php?title=YUV4MPEG2">YUV4MPEG2</a> (video), each of which is very easy to read and
write. It loaded 3D models in the easy-to-parse <a href="http://www.martinreddy.net/gfx/3d/OBJ.spec">Wavefront .obj
format</a>. It also supported a text rendered overlay, initially
using our own font format and later with fonts in the <a href="https://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5005.BDF_Spec.pdf">Glyph Bitmap
Distribution Format</a> — again, easy to parse and use. The text
made it possible to produce demo videos without any additional editing
(see the above video).</p>

<p>After a year on the raytracer, he had implemented most of what he
wanted and I had an opportunity to involve him in my funded research.
By this point he was very capable, quickly paying back his entire
education.</p>

<p>
<video width="600" controls="controls">
  <source type="video/webm" src="https://skeeto.s3.amazonaws.com/netray/bounce720.webm" />
</video>
</p>

<p>Together we made rapid progress — much more than I could alone. I
can’t go into the specifics, but much of his work was built on lessons
learned from the raytracer, including an OpenGL display and
<a href="/blog/2015/07/10/">SIMD-optimized</a> physics engine. I also taught him x86 assembly,
which he applied to co-author a paper, <a href="https://skeeto.s3.amazonaws.com/share/p15-coffman.pdf"><em>ROP Gadget Prevalence and
Survival under Compiler-based Binary Diversification Schemes</em></a>
(<a href="https://skeeto.s3.amazonaws.com/share/p15-coffman-slides.pdf">slides</a>).</p>

<p>To reiterate, an important part of this entire journey was the
influence he had over his own work. He had say on the direction of
each project. Until he started earning a college intern pay
(post-graduation), I had no ability to make him do anything he didn’t
want to do. I could only rely on his motivation. Fortunately what
motivates him is what also motivates me, so to find the framing for
that motivation I only had to imagine myself in his shoes.</p>

<h3 id="a-comment-on-respect">A Comment on Respect</h3>

<p>An important aspect I hadn’t noticed until the second year was
respect. Most of Dan’s interactions with other co-workers was very
respectful. They listened to what he had to say and treated it with
the <strong>same respect as they would a regular, full-time co-worker</strong>. I
can’t emphasize how invaluable this is for a student.</p>

<p>I bring this up because there were a handful of interactions that
weren’t so respectful. A few individuals, when discovering his status,
made a jokes (“Hey, where’s my coffee?”) or wouldn’t take his comments
seriously. Please don’t be one of these people.</p>

<h3 id="whats-comes-next">What’s comes next?</h3>

<p>In many ways, Dan is starting college in a stronger position than I
was <em>finishing</em> college. The mentorship was a ton of vocational,
practical experience that doesn’t normally happen in a college course.
However, there’s plenty of computer science theory that I’m not so
great at teaching. For example, he got hands on experience with
practical data structures, but only picked up a shallow understanding
of their analysis (Big O, etc.). College courses will fill those gaps,
and they will be learned more easily with a thorough intuition of
their context.</p>

<p>As he moves on, I’ll be starting all over again with a new student.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Digispark and Debian</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2014/05/14/"/>
    <id>urn:uuid:154af36e-272c-3e4d-d1f9-91341ec65b5a</id>
    <updated>2014-05-14T17:57:31Z</updated>
    <category term="meatspace"/><category term="tutorial"/>
    <content type="html">
      <![CDATA[<p>Following <a href="http://www.50ply.com/">Brian’s</a> lead, I recently picked up a couple of
<a href="http://digistump.com/products/1">Digispark USB development boards</a>. It’s a cheap, tiny,
Arduino-like microcontroller. There are a couple of interesting
project ideas that I have in mind for these. It’s <a href="/blog/2008/02/04/">been over 6
years</a> since I last hacked on a microcontroller.</p>

<p><img src="/img/misc/digispark-small.jpg" alt="" /></p>

<p>Unfortunately, support for the Digispark on Linux is spotty. Just as
with any hardware project, the details are irreversibly messy. It
can’t make use of the standard Arduino software for programming the
board, so you have to download a customized toolchain. This download
includes files that have the incorrect vendor ID, requiring a manual
fix. Worse, <a href="http://digistump.com/wiki/digispark/tutorials/linuxtroubleshooting">the fix listed in their documentation</a> is incomplete,
at least for Debian and Debian-derived systems.</p>

<p>The main problem is that Linux will <em>not</em> automatically create a
<code class="language-plaintext highlighter-rouge">/dev/ttyACM0</code> device like it normally does for Arduino devices.
Instead it gets a long, hidden, unpredictable device name. The fix is
to ask udev to give it a predictable name by appending the following
to the first line in the provided udev rules file (<code class="language-plaintext highlighter-rouge">49-micronucleus.rules</code>),</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SYMLINK+="ttyACM%n"
</code></pre></div></div>

<p>The whole uncommented portion of the rules file should look like this:</p>

<ul>
  <li><a href="http://pastebin.com/2XxmvEaS">49-micronucleus.rules</a> (pastebin since it’s a long line)</li>
</ul>

<p>The <code class="language-plaintext highlighter-rouge">==</code> is a conditional operator, indicating that the rule only
applies when the condition is met. The <code class="language-plaintext highlighter-rouge">:=</code> and <code class="language-plaintext highlighter-rouge">+=</code> are assignment
operators, evaluated when all of the conditions are met. The <code class="language-plaintext highlighter-rouge">SYMLINK</code>
part tells udev put a softlink to the device in <code class="language-plaintext highlighter-rouge">/dev</code> under a
predictable name.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Emacs, Thanksgiving, and Hanukkah</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/11/28/"/>
    <id>urn:uuid:cd66c73c-cb8c-3e12-9c16-396a36266f8b</id>
    <updated>2013-11-28T22:25:36Z</updated>
    <category term="emacs"/><category term="elisp"/><category term="meatspace"/>
    <content type="html">
      <![CDATA[<p>Today is Thanksgiving in the United States. It also happens to be
Hanukkah. There’s been news going around that Thanksgiving and
Hanukkah <a href="http://www.leancrew.com/all-this/2013/01/hanukkah-and-thanksgiving/">will not coincide again for about 80,000 years</a>. This
sounded somewhat unbelievable to me because
<a href="http://blog.plover.com/calendar/july-weekends.html">the Gregorian repeats every 400 years</a>. I decided to
compute it for myself to double-check this figure.</p>

<p>I’m not Jewish and I know very little about Hanukkah, so I had to look
it up. After learning that Hanukkah is based on the Hebrew calendar,
the rumors were sounding more believable. The Hebrew calendar repeats
every 689,472 Hebrew years. This means the correspondence between
Gregorian and Hebrew calendars <a href="http://hebrewcalendar.tripod.com/">is about 14 billion years</a>.
That 80,000 seems lowball.</p>

<p>Since I decided to use Emacs Lisp for the computation, I fortunately
was able to ignore all the unfamiliar, complicated rules for the
Hebrew calendar: Emacs knows how to compute Hebrew dates. It can be
accessed through the function <code class="language-plaintext highlighter-rouge">calendar-hebrew-date-string</code>.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;; Thanksgiving 2013</span>
<span class="p">(</span><span class="nv">calendar-hebrew-date-string</span> <span class="o">'</span><span class="p">(</span><span class="mi">11</span> <span class="mi">28</span> <span class="mi">2013</span><span class="p">))</span>
<span class="c1">;; =&gt; "Kislev 25, 5774"</span>
</code></pre></div></div>

<p>Hanukkah begins on the 25th of Kislev, so I can write a
quick-and-dirty function to detect if a date is the first day of
Hanukkah.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">hanukkah-p</span> <span class="p">(</span><span class="nv">date</span><span class="p">)</span>
  <span class="s">"Return non-nil if DATE is Hanukkah."</span>
  <span class="p">(</span><span class="nv">string-match-p</span> <span class="s">"^Kislev 25"</span> <span class="p">(</span><span class="nv">calendar-hebrew-date-string</span> <span class="nv">date</span><span class="p">)))</span>
</code></pre></div></div>

<p>Next I need a function to compute Thanksgiving, which is really
simple. Thanksgiving falls on the fourth Thursday of November.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">thanksgiving</span> <span class="p">(</span><span class="nv">year</span><span class="p">)</span>
  <span class="s">"Return the date of Thanksgiving for YEAR."</span>
  <span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="nv">day</span> <span class="nv">from</span> <span class="mi">1</span> <span class="nv">upto</span> <span class="mi">7</span>
        <span class="nb">when</span> <span class="p">(</span><span class="nb">=</span> <span class="mi">4</span> <span class="p">(</span><span class="nv">calendar-day-of-week</span> <span class="o">`</span><span class="p">(</span><span class="mi">11</span> <span class="o">,</span><span class="nv">day</span> <span class="o">,</span><span class="nv">year</span><span class="p">)))</span>
        <span class="nb">return</span> <span class="o">`</span><span class="p">(</span><span class="mi">11</span> <span class="o">,</span><span class="p">(</span><span class="nb">+</span> <span class="nv">day</span> <span class="mi">21</span><span class="p">)</span> <span class="o">,</span><span class="nv">year</span><span class="p">)))</span>
</code></pre></div></div>

<p>If there was no <code class="language-plaintext highlighter-rouge">calendar-day-of-week</code> I could compute it using
<a href="http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Gauss.27s_algorithm">Zeller’s algorithm</a>, which I already happen to have
implemented,</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">cal/day-of-week</span> <span class="p">(</span><span class="nv">year</span> <span class="nv">month</span> <span class="nv">day</span><span class="p">)</span>
  <span class="s">"Return day of week number (0-7)."</span>
  <span class="p">(</span><span class="k">let*</span> <span class="p">((</span><span class="nv">Y</span> <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">&lt;</span> <span class="nv">month</span> <span class="mi">3</span><span class="p">)</span> <span class="p">(</span><span class="nb">1-</span> <span class="nv">year</span><span class="p">)</span> <span class="nv">year</span><span class="p">))</span>
         <span class="p">(</span><span class="nv">m</span> <span class="p">(</span><span class="nb">1+</span> <span class="p">(</span><span class="nb">mod</span> <span class="p">(</span><span class="nb">+</span> <span class="nv">month</span> <span class="mi">9</span><span class="p">)</span> <span class="mi">12</span><span class="p">)))</span>
         <span class="p">(</span><span class="nv">y</span> <span class="p">(</span><span class="nb">mod</span> <span class="nv">Y</span> <span class="mi">100</span><span class="p">))</span>
         <span class="p">(</span><span class="nv">c</span> <span class="p">(</span><span class="nb">/</span> <span class="nv">Y</span> <span class="mi">100</span><span class="p">)))</span>
    <span class="p">(</span><span class="nb">mod</span> <span class="p">(</span><span class="nb">+</span> <span class="nv">day</span> <span class="p">(</span><span class="nb">floor</span> <span class="p">(</span><span class="nb">-</span> <span class="p">(</span><span class="nb">*</span> <span class="mi">26</span> <span class="nv">m</span><span class="p">)</span> <span class="mi">2</span><span class="p">)</span> <span class="mi">10</span><span class="p">)</span> <span class="nv">y</span> <span class="p">(</span><span class="nb">/</span> <span class="nv">y</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">/</span> <span class="nv">c</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">*</span> <span class="mi">-2</span> <span class="nv">c</span><span class="p">))</span> <span class="mi">7</span><span class="p">)))</span>
</code></pre></div></div>

<p>Now for each year find Thanksgiving and test it for Hanukkah. I
started with 1942 because that’s when the fourth-Thursday-of-November
rule was established. Presumably due to the regexp part, this
expression takes a moment to compute.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="nv">year</span> <span class="nv">from</span> <span class="mi">1942</span> <span class="nv">to</span> <span class="mi">80000</span>
      <span class="nb">when</span> <span class="p">(</span><span class="nv">hanukkah-p</span> <span class="p">(</span><span class="nv">thanksgiving</span> <span class="nv">year</span><span class="p">))</span>
      <span class="nv">collect</span> <span class="nv">year</span><span class="p">)</span>
<span class="c1">;; =&gt; (2013 79043 79290 79537 79564 79635 79784 79811 79882)</span>
</code></pre></div></div>

<p>My result exactly matches what I’m seeing elsewhere. The rumors are
correct! The next coincidence occurs on November 23rd, 79043. Thanks,
Emacs!</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Coining Autoism</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/08/16/"/>
    <id>urn:uuid:a0933ec5-3f04-3819-3c5a-ffd9ffb2a11c</id>
    <updated>2013-08-16T00:00:00Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><img src="/img/misc/smartphone.jpg" class="right" /></p>

<p>I mentioned a thought to a co-worker about taking a smart phone back
in time 50 years to the 1960’s, the very early days of computing. A
consumer smart phone, a ubiquitous battery-powered device today, has
many orders of magnitude more computing power than was available to
all humankind at this time. Not to mention the amount of digital
storage would be unimaginably huge. It would likely be the single most
valuable device on Earth. If it goes back just a couple more decades
it would <em>significantly</em> impact the events of World War II. What would
the engineers of a half-century ago do with it?</p>

<p>I like to assume that it had no useful software installed, so it’s
<em>just</em> the advanced hardware. I guess time-traveling erases digital
storage in this scenario. Suppose the engineers of the day could work
out a way to interface with it electronically using the technology of
the time — something that I believe would be very difficult
considering the bandwidth and speed of the interfaces — and use that
interface to program it. Outside of study, some of the hardware would
be pretty useless, such as the H.264 decoder/encoder, wireless radios
(what would it talk to?), and probably the graphics chip, but the CPU
would definitely be useful.</p>

<p>This was a time before mice, monitors, conventional operating systems,
and all the modern computing paradigms. Not only was the computer
hardware primitive but so were the concepts about computing. I imagine
they would build and run the same sort of
<a href="http://youtu.be/Q07PhW5sCEk">timesharing operating system</a> that existed at the time.
They would probably attach thousands of typewriter-based consoles to
this one smart phone so that several buildings worth of people could
make use of this one smart phone. Picturing in my head all these
old-timey typewriters attached to a cell phone is amusing.</p>

<p><img src="/img/misc/teletype.jpg" alt="" /></p>

<p>My co-worker said that there needs to be a word for this.
Specifically, if you use time-travel to benefit yourself in some other
time period. For example, something like the word “nepotism”: favoring
relatives because of their relationship rather than their ability. I
came up with the word <em>autoism</em> for this.</p>

<ul>
  <li>
    <p><em>Crony</em> - <em>ism</em>: The word “crony” means “friend.” Favoring friends
regardless of their ability.</p>
  </li>
  <li>
    <p><em>Nepot</em> - <em>ism</em>: The Latin “nephos” means “nephew,” which was
also a euphemism for “natural son.” Favoring family regardless of
their ability.</p>
  </li>
  <li>
    <p><em>Auto</em> - <em>ism</em>: “Auto” comes from ancient Greek for “self.” <strong>Favoring
yourself regardless of your own ability</strong>.</p>
  </li>
</ul>

<p>Fortunately or unfortunately, the technology needed in order to
actually practice autoism, time travel, doesn’t currently exist, so
the word will only be useful in science fiction for the time being.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Clay Klein Bottle</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2009/04/28/"/>
    <id>urn:uuid:aa10784e-a4ec-3e0b-b3e3-cbaad9f943e5</id>
    <updated>2009-04-28T00:00:00Z</updated>
    <category term="media"/><category term="meatspace"/>
    <content type="html">
      <![CDATA[<!-- 28 April 2009 -->
<p>
A few years ago I made my wife — girlfriend at the time —
a <a href="http://en.wikipedia.org/wiki/Klein_bottle"> Klein
bottle</a> (well, the three-dimensional projection of one) out of
clay. Since I hadn't used clay before I used some assistance from my
dad. Here's how it was done,
</p>
<p class="center">
<img src="/img/klein/diagram.png" alt=""/>
<img src="/img/klein/diagram-real.jpg" alt=""/>
</p>
<p>
As you can see, it's not quite the same as the generally depicted
Klein bottle. The form you see here was easier to make with
clay. After it was done, we baked it in a <a
href="http://en.wikipedia.org/wiki/Kiln"> kiln</a>. It's a bad idea to
put sealed items in a kiln because they will burst as they heat. It
took some time to convince the staff that our Klein bottle was
actually unsealed.
</p>
<p>
Here are some pictures,
</p>
<p>
<a href="/img/klein/front.jpg">
  <img src="/img/klein/front-thumb.jpg"
       alt="Front" title="Front view" />
</a>
<a href="/img/klein/side.jpg">
  <img src="/img/klein/side-thumb.jpg"
       alt="Side" title="Side view" />
</a>
<a href="/img/klein/bottom.jpg">
  <img src="/img/klein/bottom-thumb.jpg"
       alt="Bottom" title="Bottom view" />
</a>
<a href="/img/klein/top.jpg">
  <img src="/img/klein/top-thumb.jpg"
       alt="Top" title="Top view" />
</a>
</p>
]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Apartment Balcony Gardening</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2009/04/08/"/>
    <id>urn:uuid:be2e4bcd-2563-31ea-da05-f1748ffe84d0</id>
    <updated>2009-04-08T00:00:00Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<!-- 8 April 2009 -->
<p>
My wife was interested in growing a garden this summer. She has never
done it before and wanted to learn. However, we live in an apartment
so we don't exactly have a yard. Instead, we got some pots and started
growing a balcony garden.
</p>
<p>
I thought we were being clever, but it turns out this is a common
practice called <a
href="http://en.wikipedia.org/wiki/Container_garden">container
gardening</a>. Searches online for "balcony gardening", "apartment
gardening", and "container gardening" will bring up lots of useful
information.
</p>
<p>
I think it's more convenient than regular gardening, as the plants are
practically in the apartment. In fact, it's about 4 feet from our bed,
through the balcony door. We can move the plants around to the other
balcony, or even inside, if needed.
</p>
<p>
Gardening is a lot of fun, really.
</p>
<p>
This year, we are growing (or trying to grow) carrots, peppers,
strawberries, catnip, and dactylis (cat grass). We'll see how things
turn out in a couple months. Here's how it looks right now,
</p>
<p class="center">
<a href="/img/garden/garden-2.jpg">
  <img src="/img/garden/garden-2-thumb.jpg"
       alt="Balcony garden" title="Our balcony garden" />
</a>
<a href="/img/garden/garden-3.jpg">
  <img src="/img/garden/garden-3-thumb.jpg"
       alt="Top balcony garden" title="Bird's eye view" />
</a>
<a href="/img/garden/garden-4.jpg">
  <img src="/img/garden/garden-4-thumb.jpg"
       alt="Calvin inspection" title="Calvin tending to the garden" />
</a>
</p>
]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Two-Man Double Blind Coke vs. Pepsi Taste Test</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2008/07/25/"/>
    <id>urn:uuid:314f66bd-42b3-36d1-8429-ad2ae674b323</id>
    <updated>2008-07-25T00:00:00Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<!-- 25 July 2008 -->
<p>
  <img src="/img/double-blind/setup-thumb.jpg" alt="" class="right"/>
</a>
My fiancee, Kelsey, claimed that she could tell the difference between
Coke and Pepsi. I wanted to put this to the test. Since there were
only two of us, arranging the test wasn't a simple matter of asking
someone else to pour some cups. I also wanted to do this right:
testing must
be <a href="http://en.wikipedia.org/wiki/Blind_experiment#Double-blind_trials">
double-blind</a>. I devised a little scheme that allowed us to perform
two different tests.
</p>
<p>
The first test was seeing if Kelsey or I could determine which
beverage was Pepsi and which was Coke. The second was determining if
there was any distinction in taste between the two drinks at all,
which consisted matching two different samples together. The second
test also acts as a check on the first test.
</p>
<p>
We bought one bottle of each at CVS. Next, we labeled six different
cups with the numbers one though six. Each odd number is paired with
the following even number. Kelsey, who was alone, used a die with an
even number of sides (this includes a something as simple as a coin
toss) to put one beverage in cup #1 and the other in cup #2. In this
case, we used my 20-sided die I use for Dungeons and Dragons, because
using it for this purpose was just full of <i>win</i>.
</p>
<p>
The die is important here as a random number generator. If it is left
up to a human to decide what drinks go where, we may bias the
setup. For example, I may be more likely to put Pepsi in an
odd-numbered cup than an even-numbered one.
</p>
<p>
It is difficult for human beings to behave randomly. Try generating a
list of 50 coin tosses yourself. I mean, without a coin. Just type a
series of 50 H's and T's. If you examine your list of flips, you will
find that you often generate very improbable series of flips
(excessive heads or tails) and exhibit patterns. We need dice or
coins to make decisions for us in this experiment.
</p>
<p>
To do it right, the beverage must be chosen before the roll: "I will
be pouring Pepsi now.". Roll the die. If it rolls an odd number, pour
the drink into the odd cup (#1). Write this information down and keep
it secret.
</p>
<p>
  <img src="/img/double-blind/final4-thumb.jpg" alt="" class="left"/>

Next, after allowing the foam to calm down (which might accidentally
reveal information to me), Kelsey leaves the room and I enter. I
perform a similar procedure to distribute the drinks into cups #3 and
#4, then #5 and #6. I keep track of what drink, #1 or #2, goes into
what cup. I keep it secret. These last two cups are for the purpose of
the second experiment.
</p>
<p>
At this point Kelsey knows what was in cups #1 and #2, but not where
they went. I know where they went, but not what was in the
cups. <b>Together we know everything, but individually we know
nothing.</b>
</p>
<p>
In order to make the second test double-blind, and allow me to
participate, I leave the room. Kelsey rolls the die. If it rolls odd
she switches the label on cups #5 and #6. It is important that these
cups are identical. One flaw potential, however, is that the liquid in
each cup may look unique. One may be more fizzy or one cup a little
more full. Noticing this may happen subconsciously, which is the whole
point of doing double-blind tests.
</p>
<p>
Ok, we didn't actually do this last part because I didn't think of it
till later.
</p>
<p>
We sample all four cups (#3 - #6) in pairs, alone, making notes on
what beverage we think is in what cup. Once we are both done we share
our secrets and see how well we did.
</p>
<p>
Our results? Neither of us could tell the difference between Coke and
Pepsi.
</p>
]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  <entry>
    <title>Up is Down</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2008/06/26/"/>
    <id>urn:uuid:c4c73c3e-07ac-3a52-3358-bf69df5a2be7</id>
    <updated>2008-06-26T00:00:00Z</updated>
    <category term="meatspace"/><category term="video"/>
    <content type="html">
      <![CDATA[<!-- 26 June 2008 -->
<p>
I was in an elevator the other day and I noticed something about the
digital numbers. I was on the 7th floor going down. Inside the
elevator was the standard 7-bar number display indicating the current floor,
</p>
<p>
  <img src="/img/elevator/digit8.png"
       alt="Digital number 8" />
</p>
<p>
However, from the angle I was standing, the top right bar was not
visible. Like this,
</p>
<p>
  <img src="/img/elevator/digit8c.png"
       alt="Digital number 8 covered" />
</p>
<p>
The arrow was indicating that the elevator was traveling downward, but
with that bar in the way the numbers can appear to be going upwards,
not downwards. It is an ambiguity, as without that bar, 6 is
equivalent to 8 and 5 is equivalent to 9. One version is covered, the
other is not.
</p>
<p>
  <img src="/img/elevator/digitc.gif"
       alt="Counting up/down" />
  <img src="/img/elevator/digit.gif"
       alt="Counting down" />
</p>
<p>
At first I thought this was simply some kind of quirky behavior of the
elevator. "Why is it going up when the arrow points down? Seems like
bad design to me!", I thought — until we got to floor 4, where it was
obvious what was going on.
</p>
<p>
"Oh... now I feel foolish."
</p>
]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  <entry>
    <title>My Team Won the Robot Competition</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2008/02/04/"/>
    <id>urn:uuid:72b4c849-e007-3de2-d4d8-e8dcf3b52ba1</id>
    <updated>2008-02-04T00:00:00Z</updated>
    <category term="meatspace"/><category term="media"/>
    <content type="html">
      <![CDATA[<!-- 04 February 2008 -->
<p class="abstract">
Introduction:<br/> This "news" is over two months old, simply because
I had other more interesting things to write about first. Not that I
am out of ideas: I have at least three more ideas lined up at the
moment on top of several half-written entries that may never see the
light of day. I just want to get it out of the way.
</p>
<table style="width:194px; margin:auto;"><tr><td align="center" style="height:194px;background:url(https://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="https://picasaweb.google.com/mosquitopsu/RobotCompetition2007?authuser=0&feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-Ek74yLVpDWg/TuvwLwbriGE/AAAAAAAAALk/TkbU4f9KYlI/s160-c/RobotCompetition2007.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="https://picasaweb.google.com/mosquitopsu/RobotCompetition2007?authuser=0&feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Robot Competition 2007</a></td></tr></table>
<p>
In December we held the robot competition, pitting against each other
the robots that <a href="/blog/2007/10/16"> we spent the semester
building</a>. It was a double-elimination bracket with five
teams. Teams competed by arranging the maze (within the rules) and
deciding the initial position for their opponents. The robots do not
get to know about the maze or where they are starting; they must
figure this out on their own by exploring the maze.
</p>
<p>
To recap, there was an 8'x8' game area containing a 4'x8' maze of
1-square-foot cells. On the floor of the game area was a grid of white
lines on black, where the white lines were about 7-inches apart. The
robot started at an unknown position and orientation in the maze,
which was also set up with a configuration unknown to the robot. In
the non-maze open area, three small wooden blocks were placed at the
intersection of white lines, with a steel washer attached to the top
of each block.
</p>
<p>
In short, the robot had to move all three blocks to the repository, a
pre-programmed position in the maze.
</p>
<p>
At the end of the semester, our team's robot was the only one that
could successfully complete this task. The other teams needed to play
in a degraded mode: known maze configuration, known starting position,
known block positions. The loser bracket played this degraded version
of the game. Because of this, our team was able to sweep the
tournament with a perfect run. All the robot had to do was
successfully run the full game. The competition, not being able to do
this, automatically lost.
</p>
<p>
The robots were mostly the same, except for one team who had a robot
with 4 multi-direction wheels. Every other team made a "scooter bot"
type of robot: two powered wheels (with casters for balance) and
chassis with three levels. The first real separation of design was
when it came to picking up blocks. Each team initially had a different
idea. One team was going to build a pulley system to lift the
blocks. Another was going to use sweeping arms to sweep in the
block. Another was going to used a stationary magnet.
</p>
<p>
Our team went with a rotating wheel in front with magnets along the
outside (see images below). Once a block was found, the robot would
rotate a magnet over the block, then rotate the attached block out of
the way. In the end, four of the five teams ended up using this design
for their own robots (the last team stuck with the stationary magnet).
</p>
<p>
These pictures were taken about a month before the competition. The
wiring job was still a bit sloppy and the front magnet wheel lacks
tiny magnets attached to the outside. Other than that, this is what
our final robot looked like. In that last month, we attached the
magnets, cleaned up the wiring, and made a whole bunch of code
improvements making the robot more robust.
</p>
<p>
I will now attempt to describe some of the things you see in these
images.
</p>
<p>
On the bottom of the robot you can see two casters for balancing the
robot (big clunky things). You can see an IR sensor, which is pointing
at the blue surface attached to the other side of the robot. This was
the block detection sensor, a home-made break-beam sensor. And
finally, you can see three LED lights on top of a long circuit
board. This is a line tracker, with three sensors that can see the
white grid on the bottom of the game board. The line tracker is how
the robot navigated the open area of the board. It went back-and-forth
looking for blocks, using the line tracker to stay on the line.
</p>
<p>
Also attached to this bottom layer are the powered wheels, with blue
rubbers for traction, and their wheel encoders. There are spokes on
the inside of the wheels (encoder disks), and the wheel encoders send
a signal to the micro-controller each time it sees a spoke. The
software counts the number of spokes that passed, allowing the robot
to keep track of how far that wheel has turned. This information is
combined with IR distance sensors to give it a very accurate idea of
its position.
</p>
<p>
On top of the bottom black layer, you can see four distance IR sensors
for tracking walls in the maze. They checked to make sure the robot
was going straight (that's why there are two on each side), as well as
map out the maze as it travels long. Hanging down from the bottom of
the red layer is another IR sensor facing forward, looking at walls in
front of the robot. Mounted on the front is the block retrieval device
(lacking magnets at this point).
</p>
<p>
On top of the red layer are two (empty) battery packs, which holds 9
AA rechargeable NiMH batteries. This actually makes two separate power
systems: a 4-pack for motors and a 5-pack for logic (micro-controller
et al). In the circuit, the motors, containing coils of wire, behave
like inductors, which could cause harmful voltage spikes to the
logic. Separate power systems help prevent damage.
</p>
<p>
On top is the micro-controller and all of the important
connections. The vertical board contains the voltage regulator and
"power strip" where all of the sensors are attached. It also contains
the start button, which was connected to an interrupt in the
micro-controller. The micro-controller had its own restart button, but
once the system started up, initialized, and self-calibrated, it waited
for a signal from the start button to get things going.
</p>
<p>
I was about to post this when I was reminded by my fiancee that she
took pictures at the end-of-semester presentation, after the
competition. Included are some images of the robot after it was
completely finished. Yes, that is a little face fastened to the front.
</p>
<p>
If you are ever at Penn State and are visiting the IST building, you
can see the robot. Because the robot won the competition, it is on
display and will be for years to come. You can recognize it by its
face.
</p>
<p>
I have made the final robot code available
here: <a href="/download/final-robot-code.zip">
final-robot-code.zip</a>. I was the software guy, handling pretty much
all the code, so everything here,
except <code>interupt_document.c</code> was written by me. It's
probably not very useful as code, except for reading and learning how
our robot worked. There are a few neat hacks in there, though, which I
may discuss as posts here. It's not noted in the code itself, nor in
the zip file, but I'll make this available under my
favorite <a href="/bsd.txt"> 2-clause BSD
license</a>.
</p>
]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  <entry>
    <title>Movie Montage Poster</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2007/12/30/"/>
    <id>urn:uuid:ff6143e3-0521-3016-422c-9fc8c04cbcef</id>
    <updated>2007-12-30T00:00:00Z</updated>
    <category term="meatspace"/>
    <content type="html">
      <![CDATA[<p>I wanted to try making one of those movie montage things I
<a href="/blog/2007/12/11">wrote about earlier</a> into a nice poster that could be hung on a
wall. Now, I prefer a Spartan environment whenever possible, so <em>I</em>
really did not want to have my own poster. No decorations for me,
please. I just wanted to make one. My solution? Make one for my
sister, who has lots of junk and would enjoy having one. Her favorite
movie is <em>Pirates of the Caribbean</em>, so I used this movie, which she
conveniently already had on DVD.</p>

<p>As before, I used mplayer to rip all of the frames I needed. To get a
poster-quality version I would need better resolution. To do this, I
changed the frame output image size to 160x90 (100 times bigger than
before).</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>framestep=30,scale=160:90
</code></pre></div></div>

<p>Next, I used my <a href="/blog/2007/12/26">own montage script</a> to put these frames
together. My script took about 2 minutes to put together one of these
larger montages. Finally, I used the Gimp to add a black border and
simple title at the top. Since I don’t have any more than 512MB of
memory on my computers, I actually had to scale the image down to 1/4
of its original size to do this. Before scaling, the GIMP was spending
hours just adding the border because it was thrashing the hard drive.
It needed about 2G of memory and it was using the hard drive to get
it.</p>

<p>I took my giant image to FedEx Kinko’s where they printed it to a
2’x2’ poster for 30 bucks. Here are the results, taken using my
sister’s crappy Kodak camera (never buy Kodak digital cameras, as they
all suck!). To help see what is going on, I provided a glare version
and a non-glare version. Each shows different details.</p>

<p><a href="/img/cinrdx/poster-glare.jpg"><img src="/img/cinrdx/poster-glare-thumb.jpg" alt="" /></a></p>

<p><a href="/img/cinrdx/poster-noglare.jpg"><img src="/img/cinrdx/poster-noglare-thumb.jpg" alt="" /></a></p>

<p>Here is the normal version from before for comparison.</p>

<p><a href="/img/cinrdx/pirates.jpg"><img src="/img/cinrdx/pirates-thumb.jpg" alt="" /></a></p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Robot Version 1</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2007/10/16/"/>
    <id>urn:uuid:6bd3b7a0-782e-3047-7f9b-8b5c6a46cdc4</id>
    <updated>2007-10-16T00:00:00Z</updated>
    <category term="media"/><category term="meatspace"/>
    <content type="html">
      <![CDATA[<p><em>Update: There is a <a href="/blog/2008/02/04/">followup</a> post to this post.</em></p>

<ul>
  <li><a href="https://picasaweb.google.com/106608599943434002866/RobotCompetition2007">Full Album</a></li>
</ul>

<p>Here is what my team has been working on for the last couple weeks.
The end goal for this robot is to escape a maze, collect blocks, and
find a repository in which to drop those blocks. Someone suggested we
call it Pac-man.</p>

<p>We added a third level to make more room for the batteries and extra
sensors. The game board is 8x8 feet with a 4x8 foot maze.</p>

<p>Building a robot is an interesting experience, but a stressful one.
Especially when you are doing it for a class. So many things could go
wrong and you can spend hours tracking down a bad soldering job, which
we once found inside an IR sensor. It was a poor manufacturing
soldering job.</p>

<p>So, as of this writing, the robot uses 3 infrared (IR) sensors to look
at walls and two wheel encoders for tracking the distance traveled by
each wheel. You can see the disk encoder on the inside of the wheel in
the second robot image. The robot uses 9 rechargeable nickel-metal
hydride (NiMH) AA batteries: 5 for the Freescale 68HC12
micro-controller and sensors, and 4 for the continuous rotation servo
motors. It is a competition, so I don’t want to give too many details
at the moment in case another team is reading.</p>

<p>Right now it limps along in the maze and gets around for awhile before
drifting into a wall. This will get fixed this weekend, as our grade
depends on it. We just need to make better use of our sensors. I.e.,
it is a software issue now.</p>

<p>Eventually, I will put some code up here we used in the robot. It is
all done in C, of course.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  

</feed>
