<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Welcome on Steve Wattam</title><link>https://stephenwattam.com/</link><description>Recent content in Welcome on Steve Wattam</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Thu, 20 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://stephenwattam.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Policy on AI Use</title><link>https://stephenwattam.com/articles/ai-policy/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/ai-policy/</guid><description>&lt;p&gt;This document outlines my policies on AI use for my personal work. In a world where LLMs are frequently better than myself at certain things, this document is an attempt to balance the utility they offer with the integrity of &lt;em&gt;my&lt;/em&gt; work.&lt;/p&gt;&#10;&lt;p&gt;Finding the balance between these two requires an understanding of the audience&amp;rsquo;s expectations. This can be clear, set by the medium or the task, or more ambiguously set by my intent. For example, I am writing this document with human colleagues in mind, to inform them of what to expect when they encounter my writing.&lt;/p&gt;</description></item><item><title>Four Rules for Effective Data Science</title><link>https://stephenwattam.com/articles/four-rules/</link><pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/four-rules/</guid><description>&lt;p&gt;Search Google and you&amp;rsquo;ll find millions of articles devoted to data science as a mathematical pursuit—some data goes in, you do terribly clever maths things, and truths come out.&lt;/p&gt;&#10;&lt;p&gt;This appeals to those practitioners who wish to believe they&amp;rsquo;re very clever, and those people who love a box full of blinking lights and tensor cores, but it&amp;rsquo;s only half the story. If someone asks my team to look at some data, they want us to turn information into insight, contextualised and applied. They want their problem to go away.&lt;/p&gt;</description></item><item><title>Money Can't Buy Friends</title><link>https://stephenwattam.com/articles/money-friends/</link><pubDate>Sat, 16 Jul 2016 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/money-friends/</guid><description>&lt;p&gt;But it can buy Twitter followers, and that&amp;rsquo;s good enough, right?&lt;/p&gt;&#10;&lt;p&gt;A friend of mine was wondering recently how many people on Twitter get thousands of followers, despite apparently never tweeting anything profound. One answer to this is that Twitter doesn&amp;rsquo;t favour profundity, but another is that people simply buy them.&lt;/p&gt;&#10;&lt;p&gt;I’ve done a fair amount of sampling from Twitter, using its APIs as well as services such as &lt;a href="http://datasift.com/"&gt;DataSift&lt;/a&gt; and &lt;a href="https://gnip.com/"&gt;Gnip&lt;/a&gt;. There are some estimates that estimate that most people on there are bots, interacting with other bots in a big human-like graph of plausible deniability. On various projects we’ve glimpsed these, or have got caught in their subgraphs when traversing, but largely they remain hidden from normal users.&lt;/p&gt;</description></item><item><title>No Compass</title><link>https://stephenwattam.com/articles/no-compass/</link><pubDate>Sun, 08 May 2016 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/no-compass/</guid><description>&lt;figure&gt;&#10;&lt;img src="https://stephenwattam.com/articles/no-compass/sun.jpg" alt="A nice picture of the sun on a map" loading="lazy"&gt;&lt;figcaption&gt;A nice picture of the sun on a map&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;I love my Garmin: when walking or cycling it&amp;rsquo;s by far the easiest mode of navigation, and the way it reduces navigation to &amp;ldquo;following a line&amp;rdquo; is a great thing for safety and ease-of-use. But, no matter how usable, the majority of my navigation is still done with a map and compass. The next rung down on the sophistication ladder, however, still has some worth. A few times I&amp;rsquo;ve set off mapless on the bike, and had to navigate my way home using the sun, or the lie of the land. These techniques are often mentioned on survival websites, or in literature for mountain skills training.&lt;/p&gt;</description></item><item><title>Meet The Linkatron</title><link>https://stephenwattam.com/articles/meet-the-linkatron/</link><pubDate>Tue, 22 Mar 2016 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/meet-the-linkatron/</guid><description>&lt;p&gt;Meet The Linkatron. The linkatron is a friendly robot who&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; speaks twenty-seven different languages. For years it&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; has roamed across the land, answering such important questions as “How do I hail a cab in Spanish?” Or “How much surstromming can I take on a plane?”.&lt;/p&gt;&#10;&lt;p&gt;When we arrived at &lt;a href="http://bbcnewslabs.co.uk/2016/03/17/newsHACK-language-hack/"&gt;BBC NewsHack&lt;/a&gt;, we saw The Linkatron, and thought back to Lancaster University. We were inspired by Lancaster’s brutalist 1960’s architecture to build a prison.&lt;/p&gt;</description></item><item><title>Summer Tour Log</title><link>https://stephenwattam.com/articles/tour-log/</link><pubDate>Fri, 18 Sep 2015 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/tour-log/</guid><description>&lt;p&gt;I&amp;rsquo;ve submitted my PhD thesis, and it&amp;rsquo;s about time for a holiday. This article is a bit of a log/journal, covering a week&amp;rsquo;s tour of the highlands and islands of Scotland. You&amp;rsquo;ll laugh, you&amp;rsquo;ll cry, or maybe neither. Whatever, here it is. This is the first time I&amp;rsquo;ve written a tour log, so don&amp;rsquo;t expect it to be amazing.&lt;/p&gt;&#10;&lt;h2 id="the-route"&gt;The Route&lt;/h2&gt;&#10;&lt;p&gt;Since I had a couple of weeks, the plan was just to set off and see what looked fun. The main plan, however, was not to plan: I brought along a camera and was intending to use it as an excuse to explore a little.&lt;/p&gt;</description></item><item><title>OverlayFS Net Booting</title><link>https://stephenwattam.com/articles/overlay-net-boot/</link><pubDate>Mon, 26 Jan 2015 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/overlay-net-boot/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent today configuring a cluster, and part of that involved setting up net booting with support for local changes. Since this isn&amp;rsquo;t very coherently covered by existing blogs, here&amp;rsquo;s a vague attempt to cover the basics.&lt;/p&gt;&#10;&lt;p&gt;Originally, this design was for a hadoop cluster, but I&amp;rsquo;m not going to dwell on that, instead focusing on the network and disk setup.&lt;/p&gt;&#10;&lt;h2 id="the-goal"&gt;The Goal&lt;/h2&gt;&#10;&lt;p&gt;So, the overall aim is to have a simple way of maintaining updates across a number of machines, whilst allowing them all to retain data between reboots. The setup we&amp;rsquo;re after is simple:&lt;/p&gt;</description></item><item><title>Observations of a Utility Cyclist</title><link>https://stephenwattam.com/articles/cycling-retrospective/</link><pubDate>Fri, 14 Nov 2014 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/cycling-retrospective/</guid><description>&lt;p&gt;A year ago, I became a cyclist. This label tends to conjure one of two images: either I&amp;rsquo;m a lycra-clad weight-obsessed weirdo with shaved legs and a £2500 carbon thing, or I&amp;rsquo;m poor. The latter is more true: the initial reason for &lt;a href="https://www.gov.uk/sorn-statutory-off-road-notification"&gt;SORN&lt;/a&gt;ing my car was monetary, but I&amp;rsquo;ve also done a fair amount of leisure cycling, and have covered about 3500 miles this last year. I say &lt;em&gt;leisure&lt;/em&gt; and not &lt;em&gt;sport&lt;/em&gt; &amp;lsquo;cause I haven&amp;rsquo;t quite got the lycra yet, but I&amp;rsquo;m no stranger to spending all day on a bike, having ridden in all weathers, carrying all kinds of weird loads over most terrains.&lt;/p&gt;</description></item><item><title>A First Glance at the IRC Logs</title><link>https://stephenwattam.com/articles/irc-logs/</link><pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/irc-logs/</guid><description>&lt;p&gt;Way back in the days of my undergrad, &lt;a href="http://carlellis.co.uk/"&gt;Carl Ellis&lt;/a&gt; started an IRC channel for the good folks of Lancaster Uni&amp;rsquo;s computing society. As we&amp;rsquo;ve all moved on and got various jobs (and moved to other countries), IRC&amp;rsquo;s been one method of staying in touch. We now have members in Europe, Japan, America and even Coventry.&lt;/p&gt;&#10;&lt;p&gt;Since about 2010 we&amp;rsquo;ve kept logs, originally using eggdrop. These were converted to the new format when &lt;a href="http://stephenwattam.com/git/cgit.cgi/LUGod/"&gt;LUGod&lt;/a&gt; was developed. Time for some analysis.&lt;/p&gt;</description></item><item><title>An Introduction to Character Sets</title><link>https://stephenwattam.com/articles/charset-introduction/</link><pubDate>Thu, 25 Sep 2014 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/articles/charset-introduction/</guid><description>&lt;p&gt;If you&amp;rsquo;ve worked with text data long enough, you&amp;rsquo;ve probably come across issues with garbled characters and character set incompatibilities. As someone who writes software that often complains at linguists about this kind of thing, I thought it would be useful to outline the issues, and explain what causes the problems, why they&amp;rsquo;re still problems after decades of computing, and why there are no easy solutions.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Caveat emptor&lt;/em&gt;: This is my first attempt at a long-form article, so it might suck.&lt;/p&gt;</description></item><item><title>Anamnesis &amp; A2</title><link>https://stephenwattam.com/projects/anamnesis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/anamnesis/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/anamnesis/a2.png" alt="Anamnesis 2 repo readout" loading="lazy"&gt;&lt;figcaption&gt;Anamnesis 2 repo readout&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Anamnesis was originally written to manage memory within a piece of C coursework — it packages pointers and allocation sizes into a struct that can be passed about in order to free or re-use memory throughout a program, so that leaks can be tracked and eradicated. Though not very good as a general purpose memory manager, it&amp;rsquo;s very useful to ensure that modular programs can retain a certain level of separation between their components at the memory level&lt;/p&gt;</description></item><item><title>ASM brainfuck Interpreter</title><link>https://stephenwattam.com/projects/bfasm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/bfasm/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a fairly basic &lt;a href="https://stephenwattam.com/brainfuck"&gt;brainfuck interpreter&lt;/a&gt; written in 64-bit ASM (GAS syntax). It&amp;rsquo;s designed to be simple, and was written primarily as a way of becoming more familiar with ASM &amp;mdash; it&amp;rsquo;s therefore quite well documented. Currently it hard-limits tape position (30,000 slots) and rolls values 0-256 around in both directions.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s mostly missing regular calling conventions and code structure, which is sacrificed to run the interpreter in two or three otherwise spare registers. I like to think this keeps it quick, but the difference is probably negligible.&lt;/p&gt;</description></item><item><title>Asteroids</title><link>https://stephenwattam.com/projects/asteroids/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/asteroids/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/asteroids/asteroidsfull.png" alt="" loading="lazy"&gt;&lt;/figure&gt;&lt;p&gt;This is a simple enough clone of asteroids, written in C. As games go, it&amp;rsquo;s one of the funner ones I&amp;rsquo;ve written, and the code isnt (too) ugly. It contains all the features you&amp;rsquo;d associate with asteroids, such as invulnerability, momentum/physics, damage, lives, warping etc.&lt;/p&gt;&#10;&lt;p&gt;This was originally written as an implementation of one of Lancaster Uni&amp;rsquo;s first year assignments, largely in their labs.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://github.com/StephenWattam/asteroids"&gt;from the git page&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="use"&gt;Use&lt;/h2&gt;&#10;&lt;p&gt;There is a makefile for compilation. Once compiled, simply run &lt;code&gt;as&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>averAge</title><link>https://stephenwattam.com/projects/average/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/average/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This script calculates the min, max and mean age of files within a folder. Might come in handy for some stuff, though of course probably won&amp;rsquo;t.&lt;/p&gt;&#10;&lt;p&gt;The actual script is possibly the stupidest bit of coding I&amp;rsquo;ve ever done. Abandon all hope ye who open a text editor.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/average/averAge-py3.tar.gz"&gt;averAge-py3.tar.gz&lt;/a&gt; for python 3.x.&lt;/p&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/average/averAge-py2.tar.gz"&gt;averAge-py2.tar.gz&lt;/a&gt; for python 2.x.&lt;/p&gt;&#10;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;&#10;&lt;p&gt;Simples! pick a directory, then run it thus:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-text"&gt;$ python averAge.py /home/extremetomato/working/et/Uni/Y2/&#10;&#9;Completed: 1600 Errors: 0&#10;&#10;mtime&#10;Mean: &#9; 2010-10-28 18:39:13.256441 &#9; age: &#9; 290 days, 19:58:01.339866&#10;Min: &#9; 2011-01-10 17:09:15 &#9; age: &#9; 216 days, 21:27:59.596424 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/.svn/entries&#10;Max: &#9; 2010-10-25 16:23:40 &#9; age: &#9; 293 days, 22:13:34.596543 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/Innovations/Project/LineGraph.java &#10;&#10;atime&#10;Mean: &#9; 2010-12-28 08:04:43.750150 &#9; age: &#9; 230 days, 6:32:30.846509&#10;Min: &#9; 2011-04-08 13:09:46 &#9; age: &#9; 129 days, 1:27:28.596704 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/HCI/as1/Game.class&#10;Max: &#9; 2010-10-31 23:23:36 &#9; age: &#9; 287 days, 15:13:38.596765 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/Innovations/Project/LineGraph.java &#10;&#10;ctime&#10;Mean: &#9; 2010-10-28 18:39:13.303175 &#9; age: &#9; 290 days, 19:58:01.293667&#10;Min: &#9; 2011-01-10 17:09:15 &#9; age: &#9; 216 days, 21:27:59.596887 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/.svn/entries&#10;Max: &#9; 2010-10-25 16:23:40 &#9; age: &#9; 293 days, 22:13:34.596961 &#10; file: &#9; /home/extremetomato/working/et/Uni/Y2/Innovations/Project/LineGraph.java &#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>BibGrep</title><link>https://stephenwattam.com/projects/bibgrep/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/bibgrep/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;BibGrep is designed to filter BibTeX files, performing filtering on entries in the same manner grep filters lines. It was designed to identify items in large bibliographies that are missing fields, or have certain spelling variations, but is also useful to list output and produce summaries.&lt;/p&gt;&#10;&lt;p&gt;BibGrep is written in ruby, and relies on the &lt;code&gt;bibtex-ruby&lt;/code&gt; gem. Notably, it&amp;rsquo;s unaffiliated with &lt;a href="http://bibgrep.sourceforge.net"&gt;this offering&lt;/a&gt; (apologies for using the same name, guys).&lt;/p&gt;</description></item><item><title>Bigram Markov Model</title><link>https://stephenwattam.com/projects/bigrammm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/bigrammm/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This loose collection of scripts is a bigram transition probability model and markov chain library. It&amp;rsquo;s rather low-quality, and was originally designed to load a subsample of the brown corpus as its training data. If you&amp;rsquo;re unable to get that corpus you should be able to adapt it to load others.&lt;/p&gt;&#10;&lt;p&gt;Currently the script loads POS tagged words into the transition matrix, and then uses the matrix to:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;POS tag text&lt;/li&gt;&#10;&lt;li&gt;Predict funny sentences&lt;/li&gt;&#10;&lt;li&gt;Predict the next word in a sentence (given a bit more training it can do this per-person)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;It was used as the basis for &amp;lsquo;CorpusBot&amp;rsquo;, an IRC bot that could POS-tag and analyse sentences.&lt;/p&gt;</description></item><item><title>Blat</title><link>https://stephenwattam.com/projects/blat/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/blat/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;Blat is a ruby library that wraps cURL and offers high-speed, sustained downloads of unlimited numbers of web resources in a highly parallel fashion. It was originally designed as part of &lt;a href="https://stephenwattam.com/projects/lwac/"&gt;LWAC&lt;/a&gt;, but is entirely general and may be used to make any curl request.&lt;/p&gt;&#10;&lt;p&gt;Blat works by providing an easy interface to Curl::Multi, offering an easy way to download lists or maintain a worker that consumes links from a producer class. This allows it to make requests indefinitely, and sustain massive throughputs to external servers.&lt;/p&gt;</description></item><item><title>Brainfuck Compiler</title><link>https://stephenwattam.com/projects/bfcompile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/bfcompile/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is my brainfuck compiler, written in ruby. It has been written to create blisteringly fast code, at the expense of compile times.&lt;/p&gt;&#10;&lt;p&gt;As a result, it produces inlined brainfuck in pure ASM, and uses a few limited static analysis techniques to speed things up, including detection of deterministic elements and pre-execution of certain algorithms. Currently, I&amp;rsquo;m working on advancing the static analysis it does in order to produce cleaner and faster output.&lt;/p&gt;</description></item><item><title>CaeserFile</title><link>https://stephenwattam.com/projects/caeserfile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/caeserfile/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;Writing a caeser cipher is fairly trivial, but fun to do if you&amp;rsquo;re learning the language. I wrote this to get to grips with Haskell&amp;rsquo;s GetOpt, as well as to see how nice I could make the stream processing. You might find it handy if you&amp;rsquo;re just starting haskell, and the code is fairly clean (though quite simple).&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/caeserfile/CaeserFile.tar.gz"&gt;CaeserFile.tar.gz&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;&#10;&lt;p&gt;Once compiled (use &lt;code&gt;make&lt;/code&gt; &amp;amp; &lt;code&gt;ghc&lt;/code&gt;), run the binary with &lt;code&gt;--help&lt;/code&gt; as the argument to get help from the helpful help:&lt;/p&gt;</description></item><item><title>CheerPaper</title><link>https://stephenwattam.com/projects/cheerpaper/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/cheerpaper/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.cheerlights.com"&gt;Cheerlights&lt;/a&gt; is a system to synchronise lighting colours across the globe&amp;mdash;this simple tool changes the wallpaper image according to the current cheerlights colour, from a directory you specify.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s written in pure ruby, requires nothing other than the standard library, and comes bundled with some simple coloured wallpapers in the appropriate colours.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://github.com/StephenWattam/CheerPaper"&gt;from the CheerPaper git page&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;&#10;&lt;p&gt;To use cheerpaper, simply call it with a directory full of images:&lt;/p&gt;</description></item><item><title>CSV Merge</title><link>https://stephenwattam.com/projects/csvmerge/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/csvmerge/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This tool was designed to merge datafiles with only one or two columns, but millions of lines. It uses ruby&amp;rsquo;s CSV parsing, so is compatible with most CSV intricacies.&lt;/p&gt;&#10;&lt;h3 id="how-it-merges"&gt;How it Merges&lt;/h3&gt;&#10;&lt;p&gt;The algorithm used to merge files is quite naive, but works quickly so long as the source file fits in RAM.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Load file 1 into RAM, indexed by key&lt;/li&gt;&#10;&lt;li&gt;For every entry in file 2, merge the line and output to the output file&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;This means that it&amp;rsquo;ll only output a file as long as the second input file, and it&amp;rsquo;ll use as much RAM as the size of the first file. Both of these suited my original purpose just fine, but are not necessarily desirable. It also merges based on a single key only, and doesn&amp;rsquo;t support compound keys.&lt;/p&gt;</description></item><item><title>Curriculum Vitae</title><link>https://stephenwattam.com/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/cv/</guid><description>&lt;blockquote class="alert alert-note"&gt;&#10; &lt;p class="alert-title"&gt;Note&lt;/p&gt;&#10; &lt;p&gt;This is also available as a &lt;a href="https://stephenwattam.com/cv/stephen-wattam-cv.pdf"&gt;PDF&lt;/a&gt;, or on&#10;&lt;a href="https://www.linkedin.com/in/stephen-wattam/"&gt;LinkedIn&lt;/a&gt;. My public work is available on &lt;a href="https://github.com/StephenWattam"&gt;GitHub&lt;/a&gt; or in the &lt;a href="https://stephenwattam.com/projects/"&gt;Projects&lt;/a&gt; section of this site.&lt;/p&gt;&#10; &lt;/blockquote&gt;&lt;h2 id="professional-summary"&gt;Professional Summary&lt;/h2&gt;&#10;&lt;p&gt;Passionate and curious interdisciplinary AI researcher and technical leader motivated by delivering real things out of impossible ideas. Drawing on a Ph.D. in research methods and approximately 35 publications across six fields.&lt;/p&gt;&#10;&lt;p&gt;My employment history has exposed me to a broad range of industries and academic fields, and a variety of statistical, numeric, and machine learning approaches.  I have experience leading interdisciplinary teams in creating novel software solutions to problems in business and research, have academic publications and patents in a variety of fields.  I have worked in various environments from small startups to large foreign enterprises.&lt;/p&gt;</description></item><item><title>DBHash</title><link>https://stephenwattam.com/projects/dbhash/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/dbhash/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a disk-backed key-value store for ruby. It was developed to hold reverse index data for a corpus database project of mine, and is loosely based on levelDB&amp;rsquo;s system of tree-structured linked lists.&lt;/p&gt;&#10;&lt;p&gt;The data structure acts as an ordinary key-value store but is &lt;strong&gt;append only&lt;/strong&gt;: items that collide are added to the end of an ordered list. Retrieving the first entry allows for fast traversal over all entries in the list by iterating a file pointer. Retrieving the last entry results in the same behaviour as any other key-value store.&lt;/p&gt;</description></item><item><title>Dix or Cox?</title><link>https://stephenwattam.com/projects/dix-or-cox/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/dix-or-cox/</guid><description>&lt;p&gt;Are these images of the bearded didactic programmer Alan Dix, or — er — the&#10;bearded didactic programmer Alan Cox? Test your abilities as a binary classifier&#10;and win exciting prizes.&lt;/p&gt;&#10;&lt;iframe src="https://stephenwattam.com/static/tools/dix-or-cox/index.html" style="width:100%;height:760px;border:solid 1px #ccc;border-radius:4px;" title="Dix or Cox? quiz"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;&lt;a href="https://stephenwattam.com/static/tools/dix-or-cox/index.html"&gt;Open the quiz in its own page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Environment2D</title><link>https://stephenwattam.com/projects/environment2d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/environment2d/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/environment2d/demo.png" alt="The demo program that comes bundled" loading="lazy"&gt;&lt;figcaption&gt;The demo program that comes bundled&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Java, when rendering, does everything relative to pixels. This library solves that problem by wrapping &lt;code&gt;Graphics&lt;/code&gt;, allowing one to seamlessly render to a virtual infinite plane, then providing &lt;code&gt;Viewport&lt;/code&gt; objects that are capable of displaying arbitrary parts of the plane.&lt;/p&gt;&#10;&lt;p&gt;This allows one to render things that resize with windows, or even create a &amp;ldquo;portal&amp;rdquo; window that shows part of the viewport based on where it is moved. It&amp;rsquo;s also been used for rendering a game, and is a drop-in replacement for Graphics in any AWT rendering systems.&lt;/p&gt;</description></item><item><title>GaTSP</title><link>https://stephenwattam.com/projects/gatsp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/gatsp/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/gatsp/gatsppic.png" alt="A possible solution." loading="lazy"&gt;&lt;figcaption&gt;A possible solution.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;I know it&amp;rsquo;s cliche, but here&amp;rsquo;s a genetic algorithm that solves the travelling salesman problem. It&amp;rsquo;s written in Java and contains a gazillion different ways of fitting, evaluating, selecting etc. Some settings work very well, whilst others, er, don&amp;rsquo;t — it&amp;rsquo;s designed to play around with a get a feel for GAs.&lt;/p&gt;&#10;&lt;p&gt;Incidentally, I apparently didn&amp;rsquo;t know how to spell when I wrote this, so apologies for some of the class names :-)&lt;/p&gt;</description></item><item><title>GraphColl</title><link>https://stephenwattam.com/projects/graphcoll/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/graphcoll/</guid><description>&lt;blockquote class="alert alert-note"&gt;&#10; &lt;p class="alert-title"&gt;Now LancsBox&lt;/p&gt;&#10; &lt;p&gt;GraphColl is now known as &lt;strong&gt;LancsBox&lt;/strong&gt;, and includes many new tools and&#10;features. This page is here for reference only — head to&#10;&lt;a href="http://corpora.lancs.ac.uk/lancsbox"&gt;the new version&lt;/a&gt;.&lt;/p&gt;&#10; &lt;/blockquote&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/graphcoll/graphcoll-logo.png" alt="GraphColl logo" loading="lazy"&gt;&lt;figcaption&gt;GraphColl logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;GraphColl is a tool for building and exploring networks of linguistic&#10;collocations. It was developed at CASS at Lancaster University in 2014–15.&lt;/p&gt;&#10;&lt;p&gt;The concept and design of GraphColl is covered in&#10;&lt;a href="https://benjamins.com/#catalog/journals/ijcl.20.2.01bre/details"&gt;Brezina et. al. (2015)&lt;/a&gt;,&#10;published at IJCL.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://stephenwattam.com/projects/graphcoll/GraphColl-1.0.0.zip"&gt;Version 1.0.0&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://stephenwattam.com/projects/graphcoll/graphcoll-manual.pdf"&gt;Download the user guide&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="reporting-bugs"&gt;Reporting bugs&lt;/h2&gt;&#10;&lt;p&gt;I really value your feedback. If you spot anything that&amp;rsquo;s broken or could be&#10;improved, please email bugs to &lt;code&gt;graphcoll [at] stephenwattam [dot] com&lt;/code&gt;. Please&#10;give as much information as you can on what you were doing at the time, and what&#10;the fault is.&lt;/p&gt;</description></item><item><title>HallSense</title><link>https://stephenwattam.com/projects/hallsense/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/hallsense/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/hallsense/arm.jpg" alt="The whole thing, on my arm." loading="lazy"&gt;&lt;figcaption&gt;The whole thing, on my arm.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This contraption is a first experiment in providing myself with a 6th sense. After much thought and discussion (some of which will hopefully appear on the blog), it was decided to add a magnetometer, similar to that in a smartphone.&lt;/p&gt;&#10;&lt;p&gt;The whole point of adding a sense is that, through neuroplasticity, it becomes an automatic and subconscious thing: this requires the user to wear the device for prolonged periods of time, and practice with known inputs to build up an association between the environment and the feedback. This design goal also imposes certain requirements on the device itself, which must be durable and comfortable, as well as providing useful information.&lt;/p&gt;</description></item><item><title>HaskeyLogger</title><link>https://stephenwattam.com/projects/haskeylogger/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/haskeylogger/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a linux keylogger written in Haskell to practise bitwise IO. Simply sits reading an event file and outputting to stdout, according to a config file that converts from scancodes to output strings.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/haskeylogger/Haskeylogger.tar.gz"&gt;Haskeylogger.tar.gz&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;&#10;&lt;p&gt;This is staggeringly simple. Once compiled, run the binary with both a pattern file (one for my keyboard included) and a source of event data (either the &lt;code&gt;/dev/input&lt;/code&gt; file or a binary dump thereof):&lt;/p&gt;</description></item><item><title>InfoLab21 Beamer Theme</title><link>https://stephenwattam.com/projects/lubeamer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/lubeamer/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/lubeamer/sample.png" alt="SCC beamer theme sample pic" loading="lazy"&gt;&lt;figcaption&gt;SCC beamer theme sample pic&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This is a beamer version of the SCC presentation template, which is normally PPT only.&lt;/p&gt;&#10;&lt;p&gt;If you wish to sample the wonder, &lt;a href="https://stephenwattam.com/projects/lubeamer/sample.pdf"&gt;download the sample to sample the sample&lt;/a&gt;!&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;If you have &lt;strong&gt;a unix variant&lt;/strong&gt;, download and install using &lt;a href="https://stephenwattam.com/projects/lubeamer/infolab21beamer-1.0.tar.gz"&gt;this tar&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;If you have &lt;strong&gt;any other platform&lt;/strong&gt;, download &lt;a href="https://stephenwattam.com/projects/lubeamer/infolab21beamer-1.0.zip"&gt;this zip&lt;/a&gt; and manually install using the instructions below.&lt;/p&gt;&#10;&lt;h2 id="installation--use"&gt;Installation &amp;amp; Use&lt;/h2&gt;&#10;&lt;p&gt;Using the theme once installed is easy. Right now there are basically no options, so just include the following in your document prelude:&lt;/p&gt;</description></item><item><title>Java Manifolds</title><link>https://stephenwattam.com/projects/manifold/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/manifold/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/manifold/sphere.png" alt="A sphere rendering on an (ln(), ln()) grid." loading="lazy"&gt;&lt;figcaption&gt;A sphere rendering on an (ln(), ln()) grid.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Java&amp;rsquo;s transformation library is capable of only affine transformations. This put an end to my curiosity when it came to distorting existing java games and toys, though I always wanted to create something that could render on an arbitrary surface. This library is a proof-of-concept rendering library that can render to a plane, translate all the points through a function, then plot them to the screen.&lt;/p&gt;</description></item><item><title>Java Quine</title><link>https://stephenwattam.com/projects/quine/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/quine/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a fairly bog-standard &lt;a href="http://en.wikipedia.org/wiki/Quine_%28computing%29"&gt;Quine&lt;/a&gt;, written when I had some spare time back in first year. A few other versions were produced that would also compile and run themselves, but these seem to have been lost since I didn&amp;rsquo;t use an &lt;acronym&gt;RCS&lt;/acronym&gt; back then. C&amp;rsquo;est la vie.&lt;/p&gt;&#10;&lt;p&gt;For those of you who prefer shell commands to english:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-text"&gt;$ ls&#10;Quine.class Quine.java README&#10;$ mv Quine.java Quine-original.java&#10;$ java Quine&#10;$ diff Quine.java Quine-original.java&#10;$&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Since this program generates its own source, you don&amp;rsquo;t need both the bytecode and the source. They&amp;rsquo;re both listed if you wish to check the output. It was written for java 1.5, but should run &amp;amp; compile on anything over 1.4.&lt;/p&gt;</description></item><item><title>JavaScript brainfuck Interpreter</title><link>https://stephenwattam.com/projects/brainfuck/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/brainfuck/</guid><description>&lt;p&gt;A portable, self-contained &lt;a href="https://en.wikipedia.org/wiki/Brainfuck"&gt;brainfuck&lt;/a&gt;&#10;interpreter written in JavaScript, so you can run brainfuck — slowly — in your&#10;browser. The interpreter core is a single portable class; the page around it just&#10;wires up a source editor, a console, and a few knobs.&lt;/p&gt;&#10;&lt;p&gt;You can tweak the cell size and count, toggle overflow and tape wraparound&#10;behaviour, set a per-step delay, and echo or prompt for input. Hit &lt;strong&gt;Run&lt;/strong&gt; and&#10;watch it go.&lt;/p&gt;</description></item><item><title>JSTOC</title><link>https://stephenwattam.com/projects/jstoc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/jstoc/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;JSTOC is a javascript table of contents generator that uses DOM manipulation to read the page and built a hierachical, linked list in the page. It&amp;rsquo;s capable of inserting section numbers into the heading elements themselves, and also dynamically inserts hyperlinks to each one.&lt;/p&gt;&#10;&lt;p&gt;The algorithm is based on one by &lt;a href="http://www.whitsoftdev.com/"&gt;Matt Whitlock&lt;/a&gt;, who has produced some fairly awesome little tools—Thanks Matt.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;The tool can be downloaded from its &lt;a href="https://github.com/StephenWattam/jstoc"&gt;git summary page&lt;/a&gt;, or simply copy-paste it from the &lt;a href="https://stephenwattam.com/projects/jstoc/jstoc-src.js"&gt;source of this page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Lancs wifi auto-auth</title><link>https://stephenwattam.com/projects/lancswifi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/lancswifi/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/lancswifi/wifisrcpic.png" alt="Some source, ah fun." loading="lazy"&gt;&lt;figcaption&gt;Some source, ah fun.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Like many institutions, lancs has an open wifi system that requires a login to access the &amp;rsquo;net. The auth process is a simple enough HTTP request, and these bash scripts automate it. They should also work for other institutions, with a few tweaks.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/lancswifi/WifiAuth.tar.gz"&gt;WifiAuth.tar.gz&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;&#10;&lt;p&gt;First up, create/copy a &lt;code&gt;lancswifirc&lt;/code&gt; file in your home directory. Whack your login settings in there.&lt;/p&gt;&#10;&lt;p&gt;Secondly, place the two bash scripts somewhere in your &lt;code&gt;$PATH&lt;/code&gt;. I would recommend scripting them into whatever connection manager you use too.&lt;/p&gt;</description></item><item><title>Lego Turing Machine</title><link>https://stephenwattam.com/projects/legoturing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/legoturing/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/legoturing/images/overview.jpg" alt="The whole machine" loading="lazy"&gt;&lt;figcaption&gt;The whole machine&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/legoturing/images/rcx.jpg" alt="The RCX-2 I was using." loading="lazy"&gt;&lt;figcaption&gt;The RCX-2 I was using.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;For the Languages and Compilation course at Lancaster we have students create a variety of automata on &lt;a href="http://www.jflap.org"&gt;JFLAP&lt;/a&gt;. The idea of this project was to construct a turing machine that could interpret and run the turing machines they build, and due to a complete lack of mechanical skill my medium was lego.&lt;/p&gt;&#10;&lt;p&gt;There&amp;rsquo;s &lt;a href="http://legoofdoom.blogspot.com/"&gt;already someone out there&lt;/a&gt; who&amp;rsquo;s made one of these, and I set out in part to best them. I soon realised, however, that even the mindstorms lego sets aren&amp;rsquo;t designed to make anything with much finesse, so a number of my original plans had to go out the window.&lt;/p&gt;</description></item><item><title>LifeImg</title><link>https://stephenwattam.com/projects/conway/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/conway/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/conway/glidergunmontage.png" alt="A glider gun, with cell decay rendered linearly (50 iterations)." loading="lazy"&gt;&lt;figcaption&gt;A glider gun, with cell decay rendered linearly (50 iterations).&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/conway/businesscards.jpg" alt="Business cards" loading="lazy"&gt;&lt;figcaption&gt;Business cards&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This was written to produce images for the reverse of my business cards — each one has a single image representing one iteration of a the &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;game of life&lt;/a&gt;. Most tools to run the cellular automata seem to make exporting images tricky, so I wrote this.&lt;/p&gt;&#10;&lt;p&gt;Computation of the automata is very naïve, simply iterating through cells and computing the rules one by one. This system was never designed to be quick, nor to compute huge patterns, but it is quite suited to producing a series of images, so might still be handy. The code is also pretty simple, if anyone wants to learn Ruby&lt;/p&gt;</description></item><item><title>LWAC</title><link>https://stephenwattam.com/projects/lwac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/lwac/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/lwac/logo.png" alt="LWAC logo" class="noborder" loading="lazy"&gt;&lt;figcaption&gt;LWAC logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;LWAC is a tool for constructing corpora from web data. Simply, it is a system for retrieving many URLs in as short a time as possible, and storing the results in a useful way.&lt;/p&gt;&#10;&lt;p&gt;The main focus is on longitudinal sampling (though single samples are possible), thus LWAC is capable of running uninterrupted for many months or years. It supports theoretically infinite corpus sizes (with static memory usage), and is designed to be particularly aggressive at link retrieval in order to minimise time differences in samples. The main features run to:&lt;/p&gt;</description></item><item><title>Maize</title><link>https://stephenwattam.com/projects/maize/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/maize/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/maize/maizessbig.png" alt="A screenshot of a right follower on a DFS maze." loading="lazy"&gt;&lt;figcaption&gt;A screenshot of a right follower on a DFS maze.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Maize is a maze generation and simulation program designed with &lt;a href="http://carlellis.co.uk"&gt;Carl Ellis&lt;/a&gt; to illustrate concepts surrounding agent and model based AI to computer science undergrads. The basic premise is that one generates or loads a maze, and some custom bots, and then runs them against the clock (or against one other) to see which is best across various types of maze.&lt;/p&gt;</description></item><item><title>Mandelbrot.hs</title><link>https://stephenwattam.com/projects/mandelbroths/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/mandelbroths/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/mandelbroths/julia1.png" alt="Julia set" loading="lazy"&gt;&lt;figcaption&gt;Julia set&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This was one of the projects developed whilst learning Haskell. It uses SDL to plot a &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set"&gt;Mandelbrot set&lt;/a&gt;, which can be changed to a &lt;a href="http://en.wikipedia.org/wiki/Julia_set"&gt;Julia set&lt;/a&gt; (with c at the centre of the window) at the press of a key.&lt;/p&gt;&#10;&lt;p&gt;This is probably handy if you wish to learn how to use SDL with Haskell, or poke about in a fractal. The code has been heavily refactored as I learned, so is probably not the best quality, but it seems to work OK.&lt;/p&gt;</description></item><item><title>MandelNet</title><link>https://stephenwattam.com/projects/mandelnet/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/mandelnet/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/mandelnet/mandelnetpic.png" alt="Another mandelbrot pic." loading="lazy"&gt;&lt;figcaption&gt;Another mandelbrot pic.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Another Haskell project, this returns samples from the mandelbrot set via TCP.&lt;/p&gt;&#10;&lt;p&gt;This is a server that returns the iteration count until escape for both mandelbrot and julia fractals. It doesn&amp;rsquo;t do anything without a client, but a hacky ruby client is included in the download, so you can try it out immediately. The most notable aspect of this code is that it can do mandelbrot calculations to &lt;strong&gt;arbitrary precisions and iteration counts&lt;/strong&gt; (at least until you run out of RAM). Clearly this causes it to slow down a bit, but it&amp;rsquo;s nice as proof-of-concept.&lt;/p&gt;</description></item><item><title>NearNeural</title><link>https://stephenwattam.com/projects/nearneural/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/nearneural/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/nearneural/net1.png" alt="A neural net as output by the NetPanel" loading="lazy"&gt;&lt;figcaption&gt;A neural net as output by the NetPanel&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;NearNeural is a neural net library written in purest Java. It&amp;rsquo;s logically very clean, retaining the component based distinctions made in the theory (nodes, edges etc. are all objects). Though it has been optimised through the use of some caching methods, and is easily fast enough for simple tasks, it is best suited to educational or experimental use.&lt;/p&gt;</description></item><item><title>NearOCR</title><link>https://stephenwattam.com/projects/nearocr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/nearocr/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/nearocr/splash.png" alt="NearOCR splash image." class="noborder" loading="lazy"&gt;&lt;figcaption&gt;NearOCR splash image.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/nearocr/ss1.png" alt="A screenshot of NearOCR." loading="lazy"&gt;&lt;figcaption&gt;A screenshot of NearOCR.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;NearOCR is an OCR program based on &lt;a href="https://stephenwattam.com/projects/nearneural/"&gt;NearNeural&lt;/a&gt;, and was written as a first-year project in Java. It uses a series of sensor vectors to learn the ideal shape of letters from a training corpus before comparing those identified in a document against this gold standard using the neural net (and a covariance measure).&lt;/p&gt;&#10;&lt;p&gt;The code is relatively clean, but since I was only young and impulsive it might not be the highest quality work ever. The fact that it&amp;rsquo;s a pure-Java open source OCR tool and library probably makes it best suited to use as an educational tool.&lt;/p&gt;</description></item><item><title>NFreq</title><link>https://stephenwattam.com/projects/nfreq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/nfreq/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/nfreq/nfreqpic.png" alt="A screenshot of very little" loading="lazy"&gt;&lt;figcaption&gt;A screenshot of very little&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;NFreq is a character-ngram generator, designed to classify language based on frequencies thereof. It it written in Haskell using SQLite3 as a storage medium, which means that it can boast static memory usage (and thus the ability to process corpora of indeterminate length) and reasonable speed. Because of the architecture it also comes with some handy Ngram generation and processing libraries, which have proven to be very fast when used alone.&lt;/p&gt;</description></item><item><title>PHP File Listing</title><link>https://stephenwattam.com/projects/filelisting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/filelisting/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;Most PHP listing scripts are hideous monsters, producing overwrought HTML listings full of styles and preview systems. This script aims to keep things simple, providing a single table with only the information that would be included on a normal directory listing — name, filesize, mime type and mtime.&lt;/p&gt;&#10;&lt;p&gt;This script does provide some preview features, but they are all client-side, and implemented in JavaScript. This means they disable themselves gracefully where a client does not have JavaScript support. Previews also provide full back/forward ability using the history API in modern browsers.&lt;/p&gt;</description></item><item><title>Responsive Text</title><link>https://stephenwattam.com/projects/responsivetext/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/responsivetext/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/responsivetext/shortalice.png" alt="A screenshot of a slightly-resized Alice" loading="lazy"&gt;&lt;figcaption&gt;A screenshot of a slightly-resized Alice&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Responsive images are images that, through progressive retargeting (manually or otherwise) respond to their context by resizing in a vaguely intelligent manner. This script reads a CSV file with salience measures for passages of text, and outputs a HTML file that hides or shows various parts of the text according to browser width.&lt;/p&gt;&#10;&lt;p&gt;For example, &lt;a href="https://stephenwattam.com/projects/responsivetext/sample.html"&gt;this sample&lt;/a&gt; was built using a log-likelihood annotated excerpt from alice in wonderland (every word was tagged). A more conventional summary system will use sentence-level tagging, but I had this input already done from another project, so in it went. Note that because the input was tagged to avoid structural elements (non-word tokens), it still outputs punctuation and newlines even if the associated word is removed. Tagging by sentence would clearly fix this.&lt;/p&gt;</description></item><item><title>Ruby IRC</title><link>https://stephenwattam.com/projects/rubyirc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/rubyirc/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is an almost total rewrite and rework of the &lt;code&gt;rirc&lt;/code&gt; gem. Enclosed in the download is a &lt;code&gt;lib&lt;/code&gt; folder, which should contain the IRC library itself, and a &lt;code&gt;bots&lt;/code&gt; folder, which contains some examples (and some old broken examples — consider it an exercise to fix these).&lt;/p&gt;&#10;&lt;p&gt;This library is capable of saving/loading scripts and any state. It abstracts concurrency, auth, data storage and some minor IRC systems from the user, whilst still allowing them to be hooked at the socket level if necessary. It has the ability to connect to multiple servers and channels and supports secure connections.&lt;/p&gt;</description></item><item><title>Ruby Omegle Gem</title><link>https://stephenwattam.com/projects/romegle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/romegle/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a pure ruby implementation of the Omegle API. It is an update of the ruby-omegle gem that works and supports all omegle features (as of Feb 2013), except for webcam support. Currently, the gem supports:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ordinary &amp;rsquo;text&amp;rsquo; mode, where you chat with a single stranger.&lt;/li&gt;&#10;&lt;li&gt;Topic-based text mode, where Omegle tries to match your various interests with other people.&lt;/li&gt;&#10;&lt;li&gt;Ask mode, where strangers will ask you a question, and get to see you talk about it with someone else&lt;/li&gt;&#10;&lt;li&gt;Spy mode, where you get to ask two people a question, and watch them talk.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;To download, simply use &lt;code&gt;gem install -r romegle&lt;/code&gt;, or you can get the source over at &lt;a href="https://github.com/StephenWattam/ROmegle"&gt;the git page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>SCC Beamer Theme</title><link>https://stephenwattam.com/projects/scc-beamer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/scc-beamer/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/scc-beamer/sample.png" alt="SCC beamer theme sample slide" loading="lazy"&gt;&lt;figcaption&gt;SCC beamer theme sample slide&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This is a beamer version of the SCC presentation template, which is normally&#10;PowerPoint only.&lt;/p&gt;&#10;&lt;p&gt;If you wish to sample the wonder, &lt;a href="https://stephenwattam.com/projects/scc-beamer/sample.pdf"&gt;download the sample to sample the sample&lt;/a&gt;!&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;If you have &lt;strong&gt;a unix variant&lt;/strong&gt;, download and install using &lt;a href="https://stephenwattam.com/projects/scc-beamer/infolab21beamer-1.0.tar.gz"&gt;this tar&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;If you have &lt;strong&gt;any other platform&lt;/strong&gt;, download &lt;a href="https://stephenwattam.com/projects/scc-beamer/infolab21beamer-1.0.zip"&gt;this zip&lt;/a&gt; and manually install using the instructions below.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="installation--use"&gt;Installation &amp;amp; use&lt;/h2&gt;&#10;&lt;p&gt;Using the theme once installed is easy. Right now there are basically no options,&#10;so just include the following in your document prelude:&lt;/p&gt;</description></item><item><title>SimpleRPC</title><link>https://stephenwattam.com/projects/simplerpc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/simplerpc/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;SimpleRPC is a very simple (and rather fast) RPC library for ruby. It works by wrapping an object on the server side, and exposing those methods to clients. In the interests of simplicity and speed it notably doesn&amp;rsquo;t handle exposure over many interfaces, eventmachine integration, versioning, service naming/description or anything beyond basic security. If you want those things, go elsewhere.&lt;/p&gt;&#10;&lt;p&gt;SimpleRPC works either with ruby&amp;rsquo;s built in &lt;code&gt;Marshal&lt;/code&gt; serialisation system or &lt;a href="http://msgpack.org/"&gt;&lt;code&gt;MessagePack&lt;/code&gt;&lt;/a&gt;, both of which offer good performance for most tasks. Using &lt;code&gt;Marshal&lt;/code&gt; it is capable of making several thousand requests per second, something slightly improved upon by &lt;code&gt;MessagePack&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>SmartSerif Beamer Theme</title><link>https://stephenwattam.com/projects/smartserif/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/smartserif/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/smartserif/sample.png" alt="SmartSerif beamer theme sample pic" loading="lazy"&gt;&lt;figcaption&gt;SmartSerif beamer theme sample pic&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This is a smart, serif, and notably quite pretty beamer theme. It&amp;rsquo;s designed to be fairly customisable and dignified, but generally exists simply to offset the internet full of hideous ones. It&amp;rsquo;s based on an offering from &lt;a href="http://cameron.bracken.bz/"&gt;Cameron Bracken&lt;/a&gt;, and I offer it with the same permissive license he did.&lt;/p&gt;&#10;&lt;p&gt;For a sample, &lt;a href="https://stephenwattam.com/projects/smartserif/sample.pdf"&gt;download the sample&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;You may either download &lt;a href="https://stephenwattam.com/projects/smartserif/SmartSerif.tar.gz"&gt;SmartSerif.tar.gz&lt;/a&gt;, which contains a Makefile, the style itself, and a quick sample, or &lt;a href="https://github.com/StephenWattam/SmartSerif"&gt;browse the git repository&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Solar Death Ray</title><link>https://stephenwattam.com/projects/solardeath/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/solardeath/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/solardeath/boring1.jpg" alt="The death ray in its natural habitat" loading="lazy"&gt;&lt;figcaption&gt;The death ray in its natural habitat&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="so-why-did-you-build-that-thing"&gt;So&amp;hellip; why did you build that thing?&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/solardeath/carl1.jpg" alt="Carl poisoning himself." loading="lazy"&gt;&lt;figcaption&gt;Carl poisoning himself.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/solardeath/can.jpg" alt="What it does to coke cans." loading="lazy"&gt;&lt;figcaption&gt;What it does to coke cans.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;I&amp;rsquo;d been wanting to build a big array of mirrors (a la Archimedes) for some time, when I read that Fresnel lenses could be found in rear-projection TVs. Some crafty ebaying later (and some health-endangering demolition), and I was the proud owner of lots of bits of TV, amongst them this fine specimen.&lt;/p&gt;</description></item><item><title>SylWord</title><link>https://stephenwattam.com/projects/sylword/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/sylword/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/sylword/sylwordpic.png" alt="Sample use and output." loading="lazy"&gt;&lt;figcaption&gt;Sample use and output.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;SylWord counts syllables in words, outputting a tab-separated list of words and their classifications. It does this by counting tokens according to a language-specific rule file, which consist of regex rules for identification of vowels, dipthongs, tripthongs etc.&lt;/p&gt;&#10;&lt;p&gt;SylWord is written in Java, and is compatible with JVM 1.4.2 and up. To make it useful you&amp;rsquo;ll need to write your own syllable rules, though this isn&amp;rsquo;t too difficult in practice.&lt;/p&gt;</description></item><item><title>The Deletinator</title><link>https://stephenwattam.com/projects/deletinator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/deletinator/</guid><description>&lt;h2 id="aboutdear-god-why"&gt;About/Dear God Why!?&lt;/h2&gt;&#10;&lt;p&gt;Once upon a time I was curious to see if anyone listened to arbitrary &lt;code&gt;HTTP DELETE&lt;/code&gt; requests, so I wrote this. It spiders websites (a little too aggressively), sending DELETE to every single link it sees.&lt;/p&gt;&#10;&lt;p&gt;Obviously no-one supports that without some kind of auth, so the tool was given a new purpose: to download the links it sees, rather than just trying to delete them. It does this by making a list of links, then (using a hacky bash script) trying to download them all using wget.&lt;/p&gt;</description></item><item><title>The Vitriol Generator</title><link>https://stephenwattam.com/projects/vitriol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/vitriol/</guid><description>&lt;p&gt;The Vitriol Generator was a small web app that let you see what the&#10;&lt;a href="https://www.dailymail.co.uk"&gt;Daily Mail&lt;/a&gt; thinks of you — or of any topic you&#10;cared to name.&lt;/p&gt;&#10;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;p class="alert-title"&gt;Retired&lt;/p&gt;&#10; &lt;p&gt;This one used to run live: it scraped the Daily Mail on demand, so it stopped&#10;working once the site changed underneath it. What follows is a write-up of what&#10;it did, rather than a working tool.&lt;/p&gt;&#10; &lt;/blockquote&gt;&lt;h2 id="what-it-did"&gt;What it did&lt;/h2&gt;&#10;&lt;p&gt;You typed a topic into a box — &lt;code&gt;immigrants&lt;/code&gt;, &lt;code&gt;europe&lt;/code&gt;, &lt;code&gt;health and safety&lt;/code&gt;, that&#10;sort of thing — and the app went off, searched the Daily Mail, found articles on&#10;that subject, and pulled back a random selection of reader comments so you could&#10;learn from the wisdom of the commentariat. By default it served up the &lt;em&gt;worst&lt;/em&gt;-rated&#10;comments, though you could ask for the best instead (it made surprisingly little&#10;difference).&lt;/p&gt;</description></item><item><title>Van de Graaff Generator</title><link>https://stephenwattam.com/projects/vdg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/vdg/</guid><description>&lt;figure class="center"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/vdg/topload.jpg" alt="Two salad bowls." loading="lazy"&gt;&lt;figcaption&gt;Two salad bowls.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/vdg/topoff.jpg" alt="The top comb, and a glimpse of the base.." loading="lazy"&gt;&lt;figcaption&gt;The top comb, and a glimpse of the base..&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Do you ever get pissed off at the fact you don&amp;rsquo;t own a particle accelerator? I did.&lt;/p&gt;&#10;&lt;p&gt;This contraption took a week or so of on/off building, and is constructed of a soilpipe, an old tumble-drier motor, some conveyer offcuts, two salad bowls and a load of other random stuff. Total cost, about £20, if that.&lt;/p&gt;</description></item><item><title>Vowel Tree</title><link>https://stephenwattam.com/projects/obfutree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/obfutree/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;p&gt;This is a simple bit of code to count vowels in a string. It reads the string as an argument, and simply loops using pointer arithmetic. Originally it was a task set for first-years, though my version uses no memory beyond that handed to it in &lt;code&gt;argc&lt;/code&gt; and &lt;code&gt;argv&lt;/code&gt;, which it reuses, and is obfuscated &amp;amp; shaped like a christmas tree.&lt;/p&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Download &lt;a href="https://stephenwattam.com/projects/obfutree/voweltree.c"&gt;voweltree.c&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="look-its-tree-shaped"&gt;Look, it&amp;rsquo;s Tree Shaped!&lt;/h2&gt;&#10;&lt;pre&gt;&lt;code class="language-text"&gt; X&#10; (I,&#10; t(f(&#10; p(i,A(&#10; F(b),(t(&#10; a,2,-=))))&#10; ,r z),h(p(o,&#10; c(M,a))),f(f(d&#10; ,(A(g(B,q(A)),A(&#10; l(B,&#10; q(u)),&#10; A(t(B,1,&#10; &amp;amp;),A((O(E(&#10; q(e)),O(E(q(&#10; a)),O(E(q(o)),&#10; O(E(q(i)),O(E(q(&#10; u)),O(E(q(E)),O(E(&#10; q(A)),O(E(q(O)),O(E(&#10; q(I)),E(q(U)))))))))))&#10; ),F(a))))))),p(w,F(C((C(&#10; b)))))&#10; )),n(k&#10; (I,a),&#10; k(char,B)))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="original-code"&gt;Original Code&lt;/h2&gt;&#10;&lt;p&gt;The original code is also slightly snazzy:&lt;/p&gt;</description></item><item><title>Wik</title><link>https://stephenwattam.com/projects/wik/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/wik/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/wik/wikfull.png" alt="Wik&amp;rsquo;s sample content" loading="lazy"&gt;&lt;figcaption&gt;Wik&amp;rsquo;s sample content&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Wik is almost, but not quite, a wiki. It&amp;rsquo;s a front-end for reading collections of text files and other documents as notes in a browser, and was designed as a workbench so that I could easily and quickly view documentation in projects. It&amp;rsquo;s a single file, and can quickly be run in a given folder to give an overview of its contents in a readable and easily-accessible way.&lt;/p&gt;</description></item><item><title>Wiχi</title><link>https://stephenwattam.com/projects/wixi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://stephenwattam.com/projects/wixi/</guid><description>&lt;h2 id="about"&gt;About&lt;/h2&gt;&#10;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/wixi/ss1.png" alt="A screenshot of typical WiXi usage" loading="lazy"&gt;&lt;figcaption&gt;A screenshot of typical WiXi usage&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/wixi/ss2.png" alt="BiBTeX support." loading="lazy"&gt;&lt;figcaption&gt;BiBTeX support.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class="right"&gt;&#10;&lt;img src="https://stephenwattam.com/projects/wixi/ss3.png" alt="My current WiXi home." loading="lazy"&gt;&lt;figcaption&gt;My current WiXi home.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Wiχi is a LaTeX-based document workbench and Wiki designed to keep collections of documents that do &lt;strong&gt;not&lt;/strong&gt; constitute a website and stand alone on their own merits. Consider a file browser with the ability to edit information inline through a nice, versioned interface.&lt;/p&gt;&#10;&lt;p&gt;Wiχi is both a web service and a library:&lt;/p&gt;</description></item></channel></rss>